1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-25 04:02:42 +01:00

Update ffmpeg

This commit is contained in:
Megamouse 2023-05-16 20:24:55 +02:00
parent 70e127b219
commit bb2d7063c4
8 changed files with 64 additions and 48 deletions

View File

@ -40,6 +40,7 @@ cmake .. \
-DCMAKE_RANLIB="$RANLIB" \ -DCMAKE_RANLIB="$RANLIB" \
-DUSE_SYSTEM_CURL=ON \ -DUSE_SYSTEM_CURL=ON \
-DUSE_SDL=ON \ -DUSE_SDL=ON \
-DUSE_SYSTEM_FFMPEG=OFF \
-DOpenGL_GL_PREFERENCE=LEGACY \ -DOpenGL_GL_PREFERENCE=LEGACY \
-DLLVM_DIR=/opt/llvm/lib/cmake/llvm \ -DLLVM_DIR=/opt/llvm/lib/cmake/llvm \
-DSTATIC_LINK_LLVM=ON \ -DSTATIC_LINK_LLVM=ON \

View File

@ -6,7 +6,7 @@ brew install -f --overwrite nasm ninja git p7zip create-dmg ccache pipenv
#/usr/sbin/softwareupdate --install-rosetta --agree-to-license #/usr/sbin/softwareupdate --install-rosetta --agree-to-license
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
arch -x86_64 /usr/local/bin/brew update arch -x86_64 /usr/local/bin/brew update
arch -x86_64 /usr/local/bin/brew install -f --overwrite llvm@16 sdl2 glew cmake faudio vulkan-headers arch -x86_64 /usr/local/bin/brew install -f --overwrite llvm@16 sdl2 glew cmake faudio vulkan-headers ffmpeg
arch -x86_64 /usr/local/bin/brew link -f llvm@16 arch -x86_64 /usr/local/bin/brew link -f llvm@16
# moltenvk based on commit for 1.2.4 release # moltenvk based on commit for 1.2.4 release
@ -74,6 +74,7 @@ mkdir build && cd build || exit 1
-DUSE_ALSA=OFF \ -DUSE_ALSA=OFF \
-DUSE_PULSE=OFF \ -DUSE_PULSE=OFF \
-DUSE_AUDIOUNIT=ON \ -DUSE_AUDIOUNIT=ON \
-DUSE_SYSTEM_FFMPEG=ON \
-DLLVM_CCACHE_BUILD=OFF \ -DLLVM_CCACHE_BUILD=OFF \
-DLLVM_BUILD_RUNTIME=OFF \ -DLLVM_BUILD_RUNTIME=OFF \
-DLLVM_BUILD_TOOLS=OFF \ -DLLVM_BUILD_TOOLS=OFF \

View File

@ -267,32 +267,17 @@ if(USE_SYSTEM_FFMPEG)
target_link_libraries(3rdparty_ffmpeg INTERFACE ${FFMPEG_LIBRARIES}) target_link_libraries(3rdparty_ffmpeg INTERFACE ${FFMPEG_LIBRARIES})
else() else()
if (NOT MSVC AND WIN32) if (NOT MSVC AND WIN32)
message(STATUS "RPCS3: building ffmpeg submodule") message(FATAL_ERROR "-- RPCS3: building ffmpeg submodule is currently not supported")
include(ProcessorCount)
ProcessorCount(N)
ExternalProject_Add(ffmpeg-mingw
DOWNLOAD_COMMAND ""
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ffmpeg
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/ffmpeg
CONFIGURE_COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/ffmpeg/configure --prefix=./windows/x86_64 --arch=x86_64 --disable-avdevice --disable-programs --disable-avfilter --disable-postproc --disable-doc --disable-pthreads --enable-w32threads --disable-network --disable-everything --disable-encoders --disable-muxers --disable-hwaccels --disable-parsers --disable-protocols --enable-dxva2 --enable-static --disable-shared --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=atrac3 --enable-decoder=atrac3p --enable-decoder=mp3 --enable-decoder=pcm_s16le --enable-decoder=pcm_s8 --enable-decoder=h264 --enable-decoder=mpeg4 --enable-decoder=mpeg2video --enable-decoder=mjpeg --enable-decoder=mjpegb --enable-encoder=pcm_s16le --enable-encoder=ffv1 --enable-encoder=mpeg4 --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegaudio --enable-parser=mpegvideo --enable-parser=mjpeg --enable-parser=aac --enable-parser=aac_latm --enable-muxer=avi --enable-demuxer=h264 --enable-demuxer=m4v --enable-demuxer=mp3 --enable-demuxer=mpegvideo --enable-demuxer=mpegps --enable-demuxer=mjpeg --enable-demuxer=avi --enable-demuxer=aac --enable-demuxer=pmp --enable-demuxer=oma --enable-demuxer=pcm_s16le --enable-demuxer=pcm_s8 --enable-demuxer=wav --enable-hwaccel=h264_dxva2 --enable-indev=dshow --enable-protocol=file
BUILD_COMMAND make -j ${N}
INSTALL_COMMAND make install
)
target_link_directories(3rdparty_ffmpeg INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/ffmpeg/windows/x86_64/lib")
target_link_libraries(3rdparty_ffmpeg INTERFACE avformat avcodec avutil swscale swresample iconv)
else() else()
message(STATUS "RPCS3: using builtin ffmpeg") message(STATUS "RPCS3: using builtin ffmpeg")
if (WIN32) if (WIN32)
set(FFMPEG_LIB_DIR "ffmpeg/windows/x86_64") set(FFMPEG_LIB_DIR "ffmpeg/lib/windows/x86_64")
target_link_libraries(3rdparty_ffmpeg INTERFACE "Bcrypt.lib") target_link_libraries(3rdparty_ffmpeg INTERFACE "Bcrypt.lib")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(FFMPEG_LIB_DIR "ffmpeg/linux/x86_64") set(FFMPEG_LIB_DIR "ffmpeg/lib/linux/ubuntu-20.04/x86_64")
elseif(APPLE) elseif(APPLE)
set(FFMPEG_LIB_DIR "ffmpeg/macos/x86_64") set(FFMPEG_LIB_DIR "ffmpeg/lib/macos/x86_64")
else() else()
message(FATAL_ERROR "Prebuilt ffmpeg is not available on this platform! Try USE_SYSTEM_FFMPEG=ON.") message(FATAL_ERROR "Prebuilt ffmpeg is not available on this platform! Try USE_SYSTEM_FFMPEG=ON.")
endif() endif()

2
3rdparty/ffmpeg vendored

@ -1 +1 @@
Subproject commit bf019f8c88bc64638fccef62840e935ab2689a4a Subproject commit d9f2a87e8112d1c1217adabb0dc945d8ad2da657

View File

@ -26,6 +26,7 @@ option(USE_VULKAN "Vulkan render backend" ON)
option(USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF) option(USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF)
option(USE_SDL "Enables SDL input handler" OFF) option(USE_SDL "Enables SDL input handler" OFF)
option(USE_SYSTEM_SDL "Prefer system SDL instead of the builtin one" OFF) option(USE_SYSTEM_SDL "Prefer system SDL instead of the builtin one" OFF)
option(USE_SYSTEM_FFMPEG "Prefer system ffmpeg instead of the prebuild one" OFF)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/buildfiles/cmake") set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/buildfiles/cmake")

View File

@ -24,7 +24,7 @@
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalDependencies>xxhash.lib;ws2_32.lib;Iphlpapi.lib;Bcrypt.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib</AdditionalDependencies> <AdditionalDependencies>xxhash.lib;ws2_32.lib;Iphlpapi.lib;Bcrypt.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib</AdditionalDependencies>
<AdditionalLibraryDirectories>..\3rdparty\ffmpeg\windows\x86_64</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>..\3rdparty\ffmpeg\lib\windows\x86_64</AdditionalLibraryDirectories>
<StackReserveSize>8388608</StackReserveSize> <StackReserveSize>8388608</StackReserveSize>
<StackCommitSize>1048576</StackCommitSize> <StackCommitSize>1048576</StackCommitSize>
</Link> </Link>

View File

@ -588,10 +588,10 @@ public:
frame.auAddr = task.au.addr; frame.auAddr = task.au.addr;
frame.auSize = task.au.size; frame.auSize = task.au.size;
frame.userdata = task.au.userdata; frame.userdata = task.au.userdata;
frame.size = frame.data->nb_samples * frame.data->channels * nbps; frame.size = frame.data->nb_samples * frame.data->ch_layout.nb_channels * nbps;
//cellAdec.notice("got audio frame (pts=0x%llx, nb_samples=%d, ch=%d, sample_rate=%d, nbps=%d)", //cellAdec.notice("got audio frame (pts=0x%llx, nb_samples=%d, ch=%d, sample_rate=%d, nbps=%d)",
//frame.pts, frame.data->nb_samples, frame.data->channels, frame.data->sample_rate, nbps); //frame.pts, frame.data->nb_samples, frame.data->ch_layout.nb_channels, frame.data->sample_rate, nbps);
if (frames.push(frame, &is_closed)) if (frames.push(frame, &is_closed))
{ {
@ -944,7 +944,7 @@ error_code cellAdecGetPcm(u32 handle, vm::ptr<float> outBuffer)
if (outBuffer) if (outBuffer)
{ {
// reverse byte order: // reverse byte order:
if (frame->format == AV_SAMPLE_FMT_FLTP && frame->channels == 1) if (frame->format == AV_SAMPLE_FMT_FLTP && frame->ch_layout.nb_channels == 1)
{ {
float* in_f = reinterpret_cast<float*>(frame->extended_data[0]); float* in_f = reinterpret_cast<float*>(frame->extended_data[0]);
for (u32 i = 0; i < af.size / 4; i++) for (u32 i = 0; i < af.size / 4; i++)
@ -952,7 +952,7 @@ error_code cellAdecGetPcm(u32 handle, vm::ptr<float> outBuffer)
outBuffer[i] = in_f[i]; outBuffer[i] = in_f[i];
} }
} }
else if (frame->format == AV_SAMPLE_FMT_FLTP && frame->channels == 2) else if (frame->format == AV_SAMPLE_FMT_FLTP && frame->ch_layout.nb_channels == 2)
{ {
float* in_f[2]; float* in_f[2];
in_f[0] = reinterpret_cast<float*>(frame->extended_data[0]); in_f[0] = reinterpret_cast<float*>(frame->extended_data[0]);
@ -963,7 +963,7 @@ error_code cellAdecGetPcm(u32 handle, vm::ptr<float> outBuffer)
outBuffer[i * 2 + 1] = in_f[1][i]; outBuffer[i * 2 + 1] = in_f[1][i];
} }
} }
else if (frame->format == AV_SAMPLE_FMT_FLTP && frame->channels == 6) else if (frame->format == AV_SAMPLE_FMT_FLTP && frame->ch_layout.nb_channels == 6)
{ {
float* in_f[6]; float* in_f[6];
in_f[0] = reinterpret_cast<float*>(frame->extended_data[0]); in_f[0] = reinterpret_cast<float*>(frame->extended_data[0]);
@ -982,7 +982,7 @@ error_code cellAdecGetPcm(u32 handle, vm::ptr<float> outBuffer)
outBuffer[i * 6 + 5] = in_f[5][i]; outBuffer[i * 6 + 5] = in_f[5][i];
} }
} }
else if (frame->format == AV_SAMPLE_FMT_FLTP && frame->channels == 8) else if (frame->format == AV_SAMPLE_FMT_FLTP && frame->ch_layout.nb_channels == 8)
{ {
float* in_f[8]; float* in_f[8];
in_f[0] = reinterpret_cast<float*>(frame->extended_data[0]); in_f[0] = reinterpret_cast<float*>(frame->extended_data[0]);
@ -1005,7 +1005,7 @@ error_code cellAdecGetPcm(u32 handle, vm::ptr<float> outBuffer)
outBuffer[i * 8 + 7] = in_f[7][i]; outBuffer[i * 8 + 7] = in_f[7][i];
} }
} }
else if (frame->format == AV_SAMPLE_FMT_S16P && frame->channels == 1) else if (frame->format == AV_SAMPLE_FMT_S16P && frame->ch_layout.nb_channels == 1)
{ {
s16* in_i = reinterpret_cast<s16*>(frame->extended_data[0]); s16* in_i = reinterpret_cast<s16*>(frame->extended_data[0]);
for (u32 i = 0; i < af.size / 2; i++) for (u32 i = 0; i < af.size / 2; i++)
@ -1013,7 +1013,7 @@ error_code cellAdecGetPcm(u32 handle, vm::ptr<float> outBuffer)
outBuffer[i] = in_i[i] / 32768.f; outBuffer[i] = in_i[i] / 32768.f;
} }
} }
else if (frame->format == AV_SAMPLE_FMT_S16P && frame->channels == 2) else if (frame->format == AV_SAMPLE_FMT_S16P && frame->ch_layout.nb_channels == 2)
{ {
s16* in_i[2]; s16* in_i[2];
in_i[0] = reinterpret_cast<s16*>(frame->extended_data[0]); in_i[0] = reinterpret_cast<s16*>(frame->extended_data[0]);
@ -1026,7 +1026,7 @@ error_code cellAdecGetPcm(u32 handle, vm::ptr<float> outBuffer)
} }
else else
{ {
fmt::throw_exception("Unsupported frame format (channels=%d, format=%d)", frame->channels, frame->format); fmt::throw_exception("Unsupported frame format (channels=%d, format=%d)", frame->ch_layout.nb_channels, frame->format);
} }
} }
@ -1078,25 +1078,26 @@ error_code cellAdecGetPcmItem(u32 handle, vm::pptr<CellAdecPcmItem> pcmItem)
atx->samplingFreq = frame->sample_rate; atx->samplingFreq = frame->sample_rate;
atx->nbytes = frame->nb_samples * u32{sizeof(float)}; atx->nbytes = frame->nb_samples * u32{sizeof(float)};
if (frame->channels == 1)
switch (frame->ch_layout.nb_channels)
{ {
atx->channelConfigIndex = 1; case 1:
} case 2:
else if (frame->channels == 2) case 6:
{ {
atx->channelConfigIndex = 2; atx->channelConfigIndex = frame->ch_layout.nb_channels;
break;
} }
else if (frame->channels == 6) case 8:
{
atx->channelConfigIndex = 6;
}
else if (frame->channels == 8)
{ {
atx->channelConfigIndex = 7; atx->channelConfigIndex = 7;
break;
} }
else default:
{ {
cellAdec.fatal("cellAdecGetPcmItem(): unsupported channel count (%d)", frame->channels); cellAdec.fatal("cellAdecGetPcmItem(): unsupported channel count (%d)", frame->ch_layout.nb_channels);
break;
}
} }
} }
else if (adec->type == CELL_ADEC_TYPE_MP3) else if (adec->type == CELL_ADEC_TYPE_MP3)

View File

@ -363,14 +363,14 @@ namespace utils
} }
const int dst_channels = 2; const int dst_channels = 2;
const u64 dst_channel_layout = AV_CH_LAYOUT_STEREO; const AVChannelLayout dst_channel_layout = AV_CHANNEL_LAYOUT_STEREO;
const AVSampleFormat dst_format = AV_SAMPLE_FMT_FLT; const AVSampleFormat dst_format = AV_SAMPLE_FMT_FLT;
int set_err = 0; int set_err = 0;
if ((set_err = av_opt_set_int(av.swr, "in_channel_count", stream->codecpar->channels, 0)) || if ((set_err = av_opt_set_int(av.swr, "in_channel_count", stream->codecpar->ch_layout.nb_channels, 0)) ||
(set_err = av_opt_set_int(av.swr, "out_channel_count", dst_channels, 0)) || (set_err = av_opt_set_int(av.swr, "out_channel_count", dst_channels, 0)) ||
(set_err = av_opt_set_channel_layout(av.swr, "in_channel_layout", stream->codecpar->channel_layout, 0)) || (set_err = av_opt_set_chlayout(av.swr, "in_channel_layout", &stream->codecpar->ch_layout, 0)) ||
(set_err = av_opt_set_channel_layout(av.swr, "out_channel_layout", dst_channel_layout, 0)) || (set_err = av_opt_set_chlayout(av.swr, "out_channel_layout", &dst_channel_layout, 0)) ||
(set_err = av_opt_set_int(av.swr, "in_sample_rate", stream->codecpar->sample_rate, 0)) || (set_err = av_opt_set_int(av.swr, "in_sample_rate", stream->codecpar->sample_rate, 0)) ||
(set_err = av_opt_set_int(av.swr, "out_sample_rate", sample_rate, 0)) || (set_err = av_opt_set_int(av.swr, "out_sample_rate", sample_rate, 0)) ||
(set_err = av_opt_set_sample_fmt(av.swr, "in_sample_fmt", static_cast<AVSampleFormat>(stream->codecpar->format), 0)) || (set_err = av_opt_set_sample_fmt(av.swr, "in_sample_fmt", static_cast<AVSampleFormat>(stream->codecpar->format), 0)) ||
@ -710,15 +710,42 @@ namespace utils
if (!codec) if (!codec)
return nullptr; return nullptr;
// Try to find a preferable output format
std::vector<const AVOutputFormat*> oformats;
void* opaque = nullptr; void* opaque = nullptr;
for (const AVOutputFormat* oformat = av_muxer_iterate(&opaque); !!oformat; oformat = av_muxer_iterate(&opaque)) for (const AVOutputFormat* oformat = av_muxer_iterate(&opaque); !!oformat; oformat = av_muxer_iterate(&opaque))
{ {
if (avformat_query_codec(oformat, codec->id, FF_COMPLIANCE_STRICT) == 1) if (avformat_query_codec(oformat, codec->id, FF_COMPLIANCE_STRICT) == 1)
{ {
return oformat->name; media_log.notice("video_encoder: Found output format '%s'", oformat->name);
switch (codec->id)
{
case AV_CODEC_ID_MPEG4:
if (strcmp(oformat->name, "avi") == 0)
return oformat->name;
break;
case AV_CODEC_ID_H264:
case AV_CODEC_ID_MJPEG:
// TODO
break;
default:
break;
}
oformats.push_back(oformat);
} }
} }
// Fallback to first found format
if (!oformats.empty() && oformats.front())
{
const AVOutputFormat* oformat = oformats.front();
media_log.notice("video_encoder: Falling back to output format '%s'", oformat->name);
return oformat->name;
}
return nullptr; return nullptr;
}; };