From 4b65eda94af061553fad300150146a3f7ffb89bc Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 8 Jul 2025 19:44:12 -0400 Subject: [PATCH] [video_core, host1x] Revert problematic ffmpeg commits - c4a26be18025feb57139e5499c664c1d74367830. - 2fe728766e1643634e42050a04991f192219864e. --- src/video_core/host1x/ffmpeg/ffmpeg.cpp | 58 ++++++++++++++----------- src/video_core/host1x/ffmpeg/ffmpeg.h | 2 +- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/video_core/host1x/ffmpeg/ffmpeg.cpp b/src/video_core/host1x/ffmpeg/ffmpeg.cpp index 9b718f2591..ffde231aee 100644 --- a/src/video_core/host1x/ffmpeg/ffmpeg.cpp +++ b/src/video_core/host1x/ffmpeg/ffmpeg.cpp @@ -214,42 +214,48 @@ bool DecoderContext::OpenContext(const Decoder& decoder) { } bool DecoderContext::SendPacket(const Packet& packet) { - m_temp_frame = std::make_shared(); - - if (const int ret = avcodec_send_packet(m_codec_context, packet.GetPacket()); ret < 0) { + m_temp_frame = std::make_shared(); + m_got_frame = 0; + + if (const int ret = avcodec_send_packet(m_codec_context, packet.GetPacket()); ret < 0 && ret != AVERROR_EOF) { LOG_ERROR(HW_GPU, "avcodec_send_packet error: {}", AVError(ret)); return false; } - + return true; } std::shared_ptr DecoderContext::ReceiveFrame() { - auto ReceiveImpl = [&](AVFrame* frame) -> bool { - if (const int ret = avcodec_receive_frame(m_codec_context, frame); ret < 0) { - LOG_ERROR(HW_GPU, "avcodec_receive_frame error: {}", AVError(ret)); - return false; + auto receive = [&](AVFrame* dst) -> bool { + if (const int ret = avcodec_receive_frame(m_codec_context, dst); ret < 0) { + LOG_ERROR(HW_GPU, "avcodec_receive_frame error: {}", AVError(ret)); + return false; + } + return true; + }; + + if (m_codec_context->hw_device_ctx) { + // If we have a hardware context, make a separate frame here to receive the + // hardware result before sending it to the output. + Frame intermediate_frame; + + if (!receive(intermediate_frame.GetFrame())) { + return {}; } - return true; - }; - - std::shared_ptr intermediate_frame = std::make_shared(); - if (!ReceiveImpl(intermediate_frame->GetFrame())) { - return {}; - } - - const auto desc = av_pix_fmt_desc_get(intermediate_frame->GetPixelFormat()); - if (m_codec_context->hw_device_ctx && (desc && desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) { + m_temp_frame->SetFormat(PreferredGpuFormat); - if (int ret = av_hwframe_transfer_data(m_temp_frame->GetFrame(), intermediate_frame->GetFrame(), 0); ret < 0) { - LOG_ERROR(HW_GPU, "av_hwframe_transfer_data error: {}", AVError(ret)); - return {}; - } - } else { - m_temp_frame = std::move(intermediate_frame); - } + if (int ret = av_hwframe_transfer_data(m_temp_frame->GetFrame(), intermediate_frame.GetFrame(), 0); ret < 0) { + LOG_ERROR(HW_GPU, "av_hwframe_transfer_data error: {}", AVError(ret)); + return {}; + } + } else { + // Otherwise, decode the frame as normal. + if (!receive(m_temp_frame->GetFrame())) { + return {}; + } + } - return std::move(m_temp_frame); + return std::move(m_temp_frame); } void DecodeApi::Reset() { diff --git a/src/video_core/host1x/ffmpeg/ffmpeg.h b/src/video_core/host1x/ffmpeg/ffmpeg.h index 63e230f1c9..7d0dbe094f 100644 --- a/src/video_core/host1x/ffmpeg/ffmpeg.h +++ b/src/video_core/host1x/ffmpeg/ffmpeg.h @@ -24,7 +24,6 @@ extern "C" { #include #include -#include #include #if defined(__GNUC__) || defined(__clang__) @@ -194,6 +193,7 @@ public: private: const Decoder& m_decoder; AVCodecContext* m_codec_context{}; + s32 m_got_frame{}; std::shared_ptr m_temp_frame{}; bool m_decode_order{}; }; -- 2.39.5