Signed-off-by: James Almer <jamr...@gmail.com> --- fftools/ffmpeg.c | 3 +++ fftools/ffmpeg.h | 1 + fftools/ffmpeg_hw.c | 17 ++++++----------- 3 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index d141f34df9..26030ed25e 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -640,6 +640,7 @@ static void ffmpeg_cleanup(int ret) av_frame_free(&ist->sub2video.frame); av_freep(&ist->filters); av_freep(&ist->hwaccel_device); + av_frame_free(&ist->hwaccel_frame); av_freep(&ist->dts_buffer); avcodec_free_context(&ist->dec_ctx); @@ -2412,6 +2413,8 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_ return AVERROR(ENOMEM); if (!ist->filter_frame && !(ist->filter_frame = av_frame_alloc())) return AVERROR(ENOMEM); + if (!ist->hwaccel_frame && !(ist->hwaccel_frame = av_frame_alloc())) + return AVERROR(ENOMEM); decoded_frame = ist->decoded_frame; if (ist->dts != AV_NOPTS_VALUE) dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base); diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 30225e9ffe..17135cb830 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -382,6 +382,7 @@ typedef struct InputStream { enum AVPixelFormat hwaccel_pix_fmt; enum AVPixelFormat hwaccel_retrieved_pix_fmt; AVBufferRef *hw_frames_ctx; + AVFrame *hwaccel_frame; /* stats */ // combined size of all the packets read diff --git a/fftools/ffmpeg_hw.c b/fftools/ffmpeg_hw.c index 14e702bd92..d5034d4f6a 100644 --- a/fftools/ffmpeg_hw.c +++ b/fftools/ffmpeg_hw.c @@ -18,6 +18,7 @@ #include <string.h> +#include "libavutil/avassert.h" #include "libavutil/avstring.h" #include "libavutil/pixdesc.h" #include "libavfilter/buffersink.h" @@ -500,7 +501,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->hwaccel_frame; enum AVPixelFormat output_format = ist->hwaccel_output_format; int err; @@ -509,9 +510,8 @@ static int hwaccel_retrieve_data(AVCodecContext *avctx, AVFrame *input) return 0; } - output = av_frame_alloc(); - if (!output) - return AVERROR(ENOMEM); + av_assert0(output); + av_frame_unref(output); output->format = output_format; @@ -519,24 +519,19 @@ static int hwaccel_retrieve_data(AVCodecContext *avctx, AVFrame *input) if (err < 0) { av_log(avctx, AV_LOG_ERROR, "Failed to transfer data to " "output frame: %d.\n", err); - goto fail; + return err; } err = av_frame_copy_props(output, input); if (err < 0) { av_frame_unref(output); - goto fail; + return err; } av_frame_unref(input); av_frame_move_ref(input, output); - av_frame_free(&output); return 0; - -fail: - av_frame_free(&output); - return err; } int hwaccel_decode_init(AVCodecContext *avctx) -- 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".