mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-04-20 03:24:49 +00:00
Initial draft for m4aac decoder
This commit is contained in:
parent
b0fe1532f7
commit
7bf060b6a3
4 changed files with 108 additions and 0 deletions
|
@ -293,6 +293,8 @@ set(AJM_LIB src/core/libraries/ajm/ajm.cpp
|
|||
src/core/libraries/ajm/ajm_instance.h
|
||||
src/core/libraries/ajm/ajm_mp3.cpp
|
||||
src/core/libraries/ajm/ajm_mp3.h
|
||||
src/core/libraries/ajm/ajm_m4aac.cpp
|
||||
src/core/libraries/ajm/ajm_m4aac.h
|
||||
)
|
||||
|
||||
set(AUDIO_LIB src/core/libraries/audio/audioin.cpp
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "core/libraries/ajm/ajm_at9.h"
|
||||
#include "core/libraries/ajm/ajm_instance.h"
|
||||
#include "core/libraries/ajm/ajm_m4aac.h"
|
||||
#include "core/libraries/ajm/ajm_mp3.h"
|
||||
|
||||
#include <magic_enum/magic_enum.hpp>
|
||||
|
@ -47,6 +48,11 @@ AjmInstance::AjmInstance(AjmCodecType codec_type, AjmInstanceFlags flags) : m_fl
|
|||
AjmMp3CodecFlags(flags.codec));
|
||||
break;
|
||||
}
|
||||
case AjmCodecType::M4aacDec: {
|
||||
m_codec = std::make_unique<AjmM4aacDecoder>(AjmFormatEncoding(flags.format),
|
||||
AjmM4aacCodecFlags(flags.codec));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
UNREACHABLE_MSG("Unimplemented codec type {}", magic_enum::enum_name(codec_type));
|
||||
}
|
||||
|
|
44
src/core/libraries/ajm/ajm_m4aac.cpp
Normal file
44
src/core/libraries/ajm/ajm_m4aac.cpp
Normal file
|
@ -0,0 +1,44 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "common/assert.h"
|
||||
#include "core/libraries/ajm/ajm_error.h"
|
||||
#include "core/libraries/ajm/ajm_m4aac.h"
|
||||
#include "core/libraries/error_codes.h"
|
||||
|
||||
extern "C" {
|
||||
#include <libavcodec/avcodec.h>
|
||||
#include <libavutil/opt.h>
|
||||
#include <libswresample/swresample.h>
|
||||
}
|
||||
|
||||
#include "common/support/avdec.h"
|
||||
|
||||
namespace Libraries::Ajm {
|
||||
AjmM4aacDecoder::AjmM4aacDecoder(AjmFormatEncoding format, AjmM4aacCodecFlags flags)
|
||||
: m_format(format), m_flags(flags), m_codec(avcodec_find_decoder(AV_CODEC_ID_AAC)),
|
||||
m_codec_context(avcodec_alloc_context3(m_codec)), m_parser(av_parser_init(m_codec->id)) {
|
||||
int ret = avcodec_open2(m_codec_context, m_codec, nullptr);
|
||||
ASSERT_MSG(ret >= 0, "Could not open m_codec");
|
||||
}
|
||||
AjmM4aacDecoder::~AjmM4aacDecoder() {
|
||||
swr_free(&m_swr_context);
|
||||
av_parser_close(m_parser);
|
||||
avcodec_free_context(&m_codec_context);
|
||||
}
|
||||
void AjmM4aacDecoder::Reset() {}
|
||||
void AjmM4aacDecoder::GetInfo(void* out_info) const {}
|
||||
AjmSidebandFormat AjmM4aacDecoder::GetFormat() const {
|
||||
return AjmSidebandFormat();
|
||||
}
|
||||
u32 AjmM4aacDecoder::GetNextFrameSize(const AjmInstanceGapless& gapless) const {
|
||||
return u32();
|
||||
}
|
||||
std::tuple<u32, u32> AjmM4aacDecoder::ProcessData(std::span<u8>& input, SparseOutputBuffer& output,
|
||||
AjmInstanceGapless& gapless) {
|
||||
return std::tuple<u32, u32>();
|
||||
}
|
||||
AVFrame* AjmM4aacDecoder::ConvertAudioFrame(AVFrame* frame) {
|
||||
return nullptr;
|
||||
}
|
||||
} // namespace Libraries::Ajm
|
56
src/core/libraries/ajm/ajm_m4aac.h
Normal file
56
src/core/libraries/ajm/ajm_m4aac.h
Normal file
|
@ -0,0 +1,56 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common/types.h"
|
||||
#include "core/libraries/ajm/ajm_instance.h"
|
||||
|
||||
extern "C" {
|
||||
#include <libavcodec/avcodec.h>
|
||||
struct SwrContext;
|
||||
}
|
||||
|
||||
namespace Libraries::Ajm {
|
||||
|
||||
enum AjmM4aacCodecFlags : u32 {
|
||||
|
||||
};
|
||||
DECLARE_ENUM_FLAG_OPERATORS(AjmM4aacCodecFlags)
|
||||
|
||||
class AjmM4aacDecoder : public AjmCodec {
|
||||
public:
|
||||
explicit AjmM4aacDecoder(AjmFormatEncoding format, AjmM4aacCodecFlags flags);
|
||||
~AjmM4aacDecoder() override;
|
||||
|
||||
void Reset() override;
|
||||
void Initialize(const void* buffer, u32 buffer_size) override {}
|
||||
void GetInfo(void* out_info) const override;
|
||||
AjmSidebandFormat GetFormat() const override;
|
||||
u32 GetNextFrameSize(const AjmInstanceGapless& gapless) const override;
|
||||
std::tuple<u32, u32> ProcessData(std::span<u8>& input, SparseOutputBuffer& output,
|
||||
AjmInstanceGapless& gapless) override;
|
||||
|
||||
private:
|
||||
template <class T>
|
||||
size_t WriteOutputPCM(AVFrame* frame, SparseOutputBuffer& output, u32 skipped_samples,
|
||||
u32 max_pcm) {
|
||||
std::span<T> pcm_data(reinterpret_cast<T*>(frame->data[0]),
|
||||
frame->nb_samples * frame->ch_layout.nb_channels);
|
||||
pcm_data = pcm_data.subspan(skipped_samples * frame->ch_layout.nb_channels);
|
||||
return output.Write(pcm_data.subspan(0, std::min(u32(pcm_data.size()), max_pcm)));
|
||||
}
|
||||
|
||||
AVFrame* ConvertAudioFrame(AVFrame* frame);
|
||||
|
||||
const AjmFormatEncoding m_format;
|
||||
const AjmM4aacCodecFlags m_flags;
|
||||
const AVCodec* m_codec = nullptr;
|
||||
AVCodecContext* m_codec_context = nullptr;
|
||||
AVCodecParserContext* m_parser = nullptr;
|
||||
SwrContext* m_swr_context = nullptr;
|
||||
std::optional<u32> m_header;
|
||||
u32 m_frame_samples = 0;
|
||||
};
|
||||
|
||||
} // namespace Libraries::Ajm
|
Loading…
Add table
Reference in a new issue