From 74bf981f3d209a2ed2dcf70d2a6cda7fd2bd2f3a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 22 Mar 2021 23:15:14 -0500 Subject: [PATCH] Ensure hwframe read-back works in SDL renderer --- .../video/ffmpeg-renderers/sdlvid.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp index 2522407e..19c68f4a 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp @@ -351,3 +351,36 @@ Exit: av_frame_free(&swFrame); } } + +bool SdlRenderer::testRenderFrame(AVFrame* frame) +{ + // If we are acting as the frontend for a hardware + // accelerated decoder, we'll need to read the frame + // back to render it. Test that this can be done + // for the given frame successfully. + if (frame->hw_frames_ctx != nullptr) { + auto hwFrameCtx = (AVHWFramesContext*)frame->hw_frames_ctx->data; + + AVFrame* swFrame = av_frame_alloc(); + if (swFrame == nullptr) { + return false; + } + + swFrame->width = frame->width; + swFrame->height = frame->height; + swFrame->format = hwFrameCtx->sw_format; + + int err = av_hwframe_transfer_data(swFrame, frame, 0); + + av_frame_free(&swFrame); + + if (err != 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "av_hwframe_transfer_data() failed: %d", + err); + return false; + } + } + + return true; +}