This avoids an AVFrame allocation per decoded frame.

Signed-off-by: James Almer <jamr...@gmail.com>
---
ist->filter_frame is safe to use here since send_frame_to_filters() also unrefs
it immediately after using it. But if this is deemed ugly/evil, I'll just add a
new AVFrame to InputStream.

 fftools/ffmpeg_hw.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/fftools/ffmpeg_hw.c b/fftools/ffmpeg_hw.c
index 14e702bd92..4201e44c43 100644
--- a/fftools/ffmpeg_hw.c
+++ b/fftools/ffmpeg_hw.c
@@ -500,7 +500,7 @@ int hw_device_setup_for_encode(OutputStream *ost)
 static int hwaccel_retrieve_data(AVCodecContext *avctx, AVFrame *input)
 {
     InputStream *ist = avctx->opaque;
-    AVFrame *output = NULL;
+    AVFrame *output = ist->filter_frame;
     enum AVPixelFormat output_format = ist->hwaccel_output_format;
     int err;
 
@@ -509,10 +509,6 @@ static int hwaccel_retrieve_data(AVCodecContext *avctx, 
AVFrame *input)
         return 0;
     }
 
-    output = av_frame_alloc();
-    if (!output)
-        return AVERROR(ENOMEM);
-
     output->format = output_format;
 
     err = av_hwframe_transfer_data(output, input, 0);
@@ -524,18 +520,16 @@ static int hwaccel_retrieve_data(AVCodecContext *avctx, 
AVFrame *input)
 
     err = av_frame_copy_props(output, input);
     if (err < 0) {
-        av_frame_unref(output);
         goto fail;
     }
 
     av_frame_unref(input);
     av_frame_move_ref(input, output);
-    av_frame_free(&output);
 
     return 0;
 
 fail:
-    av_frame_free(&output);
+    av_frame_unref(output);
     return err;
 }
 
-- 
2.33.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to