mirror of
https://github.com/PabloMK7/citra.git
synced 2024-11-16 12:03:25 +01:00
FFmpegDL: Added external_dlls folder to user folder
AACDecoder: addressed reviews
This commit is contained in:
parent
45b5de7a18
commit
847003cc1c
@ -9,7 +9,7 @@ namespace AudioCore::HLE {
|
|||||||
|
|
||||||
class AACDecoder::Impl {
|
class AACDecoder::Impl {
|
||||||
public:
|
public:
|
||||||
Impl(Memory::MemorySystem& memory);
|
explicit Impl(Memory::MemorySystem& memory);
|
||||||
~Impl();
|
~Impl();
|
||||||
std::optional<BinaryResponse> ProcessRequest(const BinaryRequest& request);
|
std::optional<BinaryResponse> ProcessRequest(const BinaryRequest& request);
|
||||||
|
|
||||||
@ -77,8 +77,12 @@ std::optional<BinaryResponse> AACDecoder::Impl::Initalize(const BinaryRequest& r
|
|||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BinaryResponse response;
|
||||||
|
std::memcpy(&response, &request, sizeof(response));
|
||||||
|
response.unknown1 = 0x0;
|
||||||
|
|
||||||
if (!have_ffmpeg_dl) {
|
if (!have_ffmpeg_dl) {
|
||||||
return {};
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_packet = av_packet_alloc_dl();
|
av_packet = av_packet_alloc_dl();
|
||||||
@ -86,31 +90,27 @@ std::optional<BinaryResponse> AACDecoder::Impl::Initalize(const BinaryRequest& r
|
|||||||
codec = avcodec_find_decoder_dl(AV_CODEC_ID_AAC);
|
codec = avcodec_find_decoder_dl(AV_CODEC_ID_AAC);
|
||||||
if (!codec) {
|
if (!codec) {
|
||||||
LOG_ERROR(Audio_DSP, "Codec not found\n");
|
LOG_ERROR(Audio_DSP, "Codec not found\n");
|
||||||
return {};
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
parser = av_parser_init_dl(codec->id);
|
parser = av_parser_init_dl(codec->id);
|
||||||
if (!parser) {
|
if (!parser) {
|
||||||
LOG_ERROR(Audio_DSP, "Parser not found\n");
|
LOG_ERROR(Audio_DSP, "Parser not found\n");
|
||||||
return {};
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_context = avcodec_alloc_context3_dl(codec);
|
av_context = avcodec_alloc_context3_dl(codec);
|
||||||
if (!av_context) {
|
if (!av_context) {
|
||||||
LOG_ERROR(Audio_DSP, "Could not allocate audio codec context\n");
|
LOG_ERROR(Audio_DSP, "Could not allocate audio codec context\n");
|
||||||
return {};
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avcodec_open2_dl(av_context, codec, NULL) < 0) {
|
if (avcodec_open2_dl(av_context, codec, NULL) < 0) {
|
||||||
LOG_ERROR(Audio_DSP, "Could not open codec\n");
|
LOG_ERROR(Audio_DSP, "Could not open codec\n");
|
||||||
return {};
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
initalized = true;
|
initalized = true;
|
||||||
|
|
||||||
BinaryResponse response;
|
|
||||||
std::memcpy(&response, &request, sizeof(response));
|
|
||||||
response.unknown1 = 0x0;
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,7 +139,8 @@ std::optional<BinaryResponse> AACDecoder::Impl::Decode(const BinaryRequest& requ
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.src_addr < Memory::FCRAM_PADDR) {
|
if (request.src_addr < Memory::FCRAM_PADDR ||
|
||||||
|
request.src_addr + request.size > Memory::FCRAM_PADDR + Memory::FCRAM_SIZE) {
|
||||||
LOG_ERROR(Audio_DSP, "Got out of bounds src_addr {:08x}", request.src_addr);
|
LOG_ERROR(Audio_DSP, "Got out of bounds src_addr {:08x}", request.src_addr);
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -190,7 +191,7 @@ std::optional<BinaryResponse> AACDecoder::Impl::Decode(const BinaryRequest& requ
|
|||||||
|
|
||||||
std::size_t size = bytes_per_sample * (decoded_frame->nb_samples);
|
std::size_t size = bytes_per_sample * (decoded_frame->nb_samples);
|
||||||
|
|
||||||
// FFmpeg converts to 32 signed floating point PCM, we need s32 PCM so we need to
|
// FFmpeg converts to 32 signed floating point PCM, we need s16 PCM so we need to
|
||||||
// convert it
|
// convert it
|
||||||
f32 val_float;
|
f32 val_float;
|
||||||
for (std::size_t current_pos(0); current_pos < size;) {
|
for (std::size_t current_pos(0); current_pos < size;) {
|
||||||
@ -207,14 +208,16 @@ std::optional<BinaryResponse> AACDecoder::Impl::Decode(const BinaryRequest& requ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.dst_addr_ch0 < Memory::FCRAM_PADDR) {
|
if (request.dst_addr_ch0 < Memory::FCRAM_PADDR ||
|
||||||
|
request.dst_addr_ch0 + out_streams[0].size() > Memory::FCRAM_PADDR + Memory::FCRAM_SIZE) {
|
||||||
LOG_ERROR(Audio_DSP, "Got out of bounds dst_addr_ch0 {:08x}", request.dst_addr_ch0);
|
LOG_ERROR(Audio_DSP, "Got out of bounds dst_addr_ch0 {:08x}", request.dst_addr_ch0);
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
std::memcpy(memory.GetFCRAMPointer(request.dst_addr_ch0 - Memory::FCRAM_PADDR),
|
std::memcpy(memory.GetFCRAMPointer(request.dst_addr_ch0 - Memory::FCRAM_PADDR),
|
||||||
out_streams[0].data(), out_streams[0].size());
|
out_streams[0].data(), out_streams[0].size());
|
||||||
|
|
||||||
if (request.dst_addr_ch1 < Memory::FCRAM_PADDR) {
|
if (request.dst_addr_ch1 < Memory::FCRAM_PADDR ||
|
||||||
|
request.dst_addr_ch1 + out_streams[1].size() > Memory::FCRAM_PADDR + Memory::FCRAM_SIZE) {
|
||||||
LOG_ERROR(Audio_DSP, "Got out of bounds dst_addr_ch1 {:08x}", request.dst_addr_ch1);
|
LOG_ERROR(Audio_DSP, "Got out of bounds dst_addr_ch1 {:08x}", request.dst_addr_ch1);
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,9 @@
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
||||||
|
#include "common/file_util.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -20,9 +21,8 @@ template <typename T>
|
|||||||
struct FuncDL {
|
struct FuncDL {
|
||||||
FuncDL() = default;
|
FuncDL() = default;
|
||||||
FuncDL(HMODULE dll, const char* name) {
|
FuncDL(HMODULE dll, const char* name) {
|
||||||
ptr_function = nullptr;
|
|
||||||
if (dll) {
|
if (dll) {
|
||||||
*(void**)&ptr_function = (void*)GetProcAddress(dll, name);
|
ptr_function = reinterpret_cast<T*>(GetProcAddress(dll, name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +35,6 @@ struct FuncDL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
T* ptr_function = nullptr;
|
T* ptr_function = nullptr;
|
||||||
;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FuncDL<int(AVSampleFormat)> av_get_bytes_per_sample_dl;
|
FuncDL<int(AVSampleFormat)> av_get_bytes_per_sample_dl;
|
||||||
@ -56,6 +55,10 @@ FuncDL<int(AVCodecParserContext*, AVCodecContext*, uint8_t**, int*, const uint8_
|
|||||||
FuncDL<void(AVCodecParserContext*)> av_parser_close_dl;
|
FuncDL<void(AVCodecParserContext*)> av_parser_close_dl;
|
||||||
|
|
||||||
bool InitFFmpegDL() {
|
bool InitFFmpegDL() {
|
||||||
|
|
||||||
|
FileUtil::CreateDir(FileUtil::GetUserPath(FileUtil::UserPath::DLLDir));
|
||||||
|
SetDllDirectoryA(FileUtil::GetUserPath(FileUtil::UserPath::DLLDir).c_str());
|
||||||
|
|
||||||
HMODULE dll_util = nullptr;
|
HMODULE dll_util = nullptr;
|
||||||
dll_util = LoadLibrary("avutil-56.dll");
|
dll_util = LoadLibrary("avutil-56.dll");
|
||||||
if (!dll_util) {
|
if (!dll_util) {
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#define SYSDATA_DIR "sysdata"
|
#define SYSDATA_DIR "sysdata"
|
||||||
#define LOG_DIR "log"
|
#define LOG_DIR "log"
|
||||||
#define CHEATS_DIR "cheats"
|
#define CHEATS_DIR "cheats"
|
||||||
|
#define DLL_DIR "external_dlls"
|
||||||
|
|
||||||
// Filenames
|
// Filenames
|
||||||
// Files in the directory returned by GetUserPath(UserPath::LogDir)
|
// Files in the directory returned by GetUserPath(UserPath::LogDir)
|
||||||
|
@ -711,6 +711,7 @@ const std::string& GetUserPath(UserPath path, const std::string& new_path) {
|
|||||||
// TODO: Put the logs in a better location for each OS
|
// TODO: Put the logs in a better location for each OS
|
||||||
paths.emplace(UserPath::LogDir, user_path + LOG_DIR DIR_SEP);
|
paths.emplace(UserPath::LogDir, user_path + LOG_DIR DIR_SEP);
|
||||||
paths.emplace(UserPath::CheatsDir, user_path + CHEATS_DIR DIR_SEP);
|
paths.emplace(UserPath::CheatsDir, user_path + CHEATS_DIR DIR_SEP);
|
||||||
|
paths.emplace(UserPath::DLLDir, user_path + DLL_DIR DIR_SEP);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!new_path.empty()) {
|
if (!new_path.empty()) {
|
||||||
|
@ -24,6 +24,7 @@ enum class UserPath {
|
|||||||
CacheDir,
|
CacheDir,
|
||||||
CheatsDir,
|
CheatsDir,
|
||||||
ConfigDir,
|
ConfigDir,
|
||||||
|
DLLDir,
|
||||||
LogDir,
|
LogDir,
|
||||||
NANDDir,
|
NANDDir,
|
||||||
RootDir,
|
RootDir,
|
||||||
|
Loading…
Reference in New Issue
Block a user