From 6f33896d8cadb81b5c9dbb01826ad1be84162942 Mon Sep 17 00:00:00 2001 From: Takoroka <137927095+Takoroka@users.noreply.github.com> Date: Sat, 31 Oct 2026 02:33:36 -0400 Subject: nx2: decode AV1 movies Fire Emblem: Fortune's Weave plays its movies as AV1 ("video/av01"). Map the codec to AV_CODEC_ID_AV1; FFmpeg decodes it with libdav1d when the FFmpeg build has it. --- src/video_core/host1x/codecs/codec.cpp | 2 ++ src/video_core/host1x/ffmpeg.cpp | 2 ++ src/video_core/host1x/nvdec_common.h | 1 + src/video_core/host1x/nx2_video_decoder.cpp | 4 ++++ 4 files changed, 9 insertions(+) diff --git a/src/video_core/host1x/codecs/codec.cpp b/src/video_core/host1x/codecs/codec.cpp index 56332866e5..3cbef1d891 100644 --- a/src/video_core/host1x/codecs/codec.cpp +++ b/src/video_core/host1x/codecs/codec.cpp @@ -104,6 +104,8 @@ std::string_view Codec::GetCurrentCodecName() const { return "H265"; case Host1x::NvdecCommon::VideoCodec::VP9: return "VP9"; + case Host1x::NvdecCommon::VideoCodec::AV1: + return "AV1"; default: return "Unknown"; } diff --git a/src/video_core/host1x/ffmpeg.cpp b/src/video_core/host1x/ffmpeg.cpp index 676e5820a5..1af8307adc 100644 --- a/src/video_core/host1x/ffmpeg.cpp +++ b/src/video_core/host1x/ffmpeg.cpp @@ -163,6 +163,8 @@ Decoder::Decoder(Tegra::Host1x::NvdecCommon::VideoCodec codec) { return AV_CODEC_ID_VP8; case Tegra::Host1x::NvdecCommon::VideoCodec::VP9: return AV_CODEC_ID_VP9; + case Tegra::Host1x::NvdecCommon::VideoCodec::AV1: + return AV_CODEC_ID_AV1; default: UNIMPLEMENTED_MSG("Unknown codec {}", codec); return AV_CODEC_ID_NONE; diff --git a/src/video_core/host1x/nvdec_common.h b/src/video_core/host1x/nvdec_common.h index 0857a9f95c..26d7c86c98 100644 --- a/src/video_core/host1x/nvdec_common.h +++ b/src/video_core/host1x/nvdec_common.h @@ -22,6 +22,7 @@ enum class VideoCodec : u64 { VP8 = 0x5, H265 = 0x7, VP9 = 0x9, + AV1 = 0xA, }; struct Offset { diff --git a/src/video_core/host1x/nx2_video_decoder.cpp b/src/video_core/host1x/nx2_video_decoder.cpp index 7d185ca573..9b34bd84af 100644 --- a/src/video_core/host1x/nx2_video_decoder.cpp +++ b/src/video_core/host1x/nx2_video_decoder.cpp @@ -35,6 +35,10 @@ std::optional CodecFromMime(std::string_view mime) { if (mime.find("vp8") != std::string_view::npos) { return NvdecCommon::VideoCodec::VP8; } + // "video/av01" or "video/av1". FFmpeg decodes AV1 with libdav1d. + if (mime.find("av01") != std::string_view::npos || mime.find("av1") != std::string_view::npos) { + return NvdecCommon::VideoCodec::AV1; + } if (mime.find("avc") != std::string_view::npos || mime.find("264") != std::string_view::npos) { return NvdecCommon::VideoCodec::H264; } -- cgit v1.2.3 From 959973a76abaa5444b4b300c37b6d8245ac89396 Mon Sep 17 00:00:00 2001 From: Takoroka <137927095+Takoroka@users.noreply.github.com> Date: Sun, 1 Nov 2026 10:29:07 -0500 Subject: externals: FFmpeg with AV1 on Windows and Linux x86_64 crueter-ci's FFmpeg packages have no AV1 decoder, so the AV1 movies of Switch 2 titles (Fire Emblem: Fortune's Weave) could not play. Windows (MSVC) and Linux x86_64 builds now use Takoroka/ffmpeg-av1 9.0.2-av1-1: the same FFmpeg commit, patch and configure flags as crueter-ci's 9.0.2-1790726865-946fcce07b, plus libdav1d 1.5.4 merged into avcodec. Other platforms keep crueter-ci's packages. --- cpmfile.json | 7 +++++++ externals/ffmpeg/CMakeLists.txt | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/cpmfile.json b/cpmfile.json index 0032734712..24ab198634 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -81,6 +81,13 @@ "repo": "crueter-ci/FFmpeg", "version": "9.0.2-1790726865-946fcce07b" }, + "ffmpeg-ci-av1": { + "ci": true, + "name": "ffmpeg", + "package": "FFmpeg", + "repo": "Takoroka/ffmpeg-av1", + "version": "9.0.2-av1-1" + }, "fmt": { "hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2", "min_version": "8", diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index f1bf099c10..890de4303c 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -179,7 +179,13 @@ elseif (MANAGARM) endif() if (YUZU_USE_BUNDLED_FFMPEG) - AddJsonPackage(ffmpeg-ci) + # Windows (MSVC) and Linux x86_64 get the same FFmpeg with libdav1d, for Switch 2 titles' AV1 + # movies; crueter-ci's packages, used elsewhere, have no AV1 decoder. + if ((MSVC OR LINUX) AND CPMUTIL_AMD64) + AddJsonPackage(ffmpeg-ci-av1) + else() + AddJsonPackage(ffmpeg-ci) + endif() set(FFmpeg_INCLUDE_DIR "${FFmpeg_SOURCE_DIR}/include;${FFmpeg_HWACCEL_INCLUDE_DIRS}" -- cgit v1.2.3