This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 2273902be8c91fbc8697cf24b6364f9b97d114ce Author: Andreas Rheinhardt <[email protected]> AuthorDate: Fri Jan 30 18:24:05 2026 +0100 Commit: Andreas Rheinhardt <[email protected]> CommitDate: Tue Feb 10 19:44:46 2026 +0100 avfilter/lavfutils: Avoid copying frame in ff_load_image() Return the data in an AVFrame instead. This is what several users ({find,cover}_rect*) want anyway. This also avoids accessing AVFrame.format (an int) via an enum AVPixelFormat*. *: This commit actually avoids two frame copies For find_rect: av_frame_clone() contained an implicit alloc+copy. Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavfilter/avf_showcqt.c | 28 +++++++++++++--------------- libavfilter/lavfutils.c | 34 ++++++++++++---------------------- libavfilter/lavfutils.h | 13 +++++-------- libavfilter/vf_cover_rect.c | 12 ++---------- libavfilter/vf_find_rect.c | 12 ++---------- libavfilter/vf_removelogo.c | 20 ++++++++++++-------- 6 files changed, 46 insertions(+), 73 deletions(-) diff --git a/libavfilter/avf_showcqt.c b/libavfilter/avf_showcqt.c index bea311cd19..7395b0bfc2 100644 --- a/libavfilter/avf_showcqt.c +++ b/libavfilter/avf_showcqt.c @@ -404,33 +404,31 @@ static int init_axis_empty(ShowCQTContext *s) static int init_axis_from_file(ShowCQTContext *s) { - uint8_t *tmp_data[4] = { NULL }; - int tmp_linesize[4]; - enum AVPixelFormat tmp_format; - int tmp_w, tmp_h, ret; - - if ((ret = ff_load_image(tmp_data, tmp_linesize, &tmp_w, &tmp_h, &tmp_format, - s->axisfile, s->ctx)) < 0) - goto error; + AVFrame *tmp_frame; + int ret = ff_load_image(&tmp_frame, s->axisfile, s->ctx); + if (ret < 0) + return ret; ret = AVERROR(ENOMEM); if (!(s->axis_frame = av_frame_alloc())) goto error; - if ((ret = ff_scale_image(s->axis_frame->data, s->axis_frame->linesize, s->width, s->axis_h, - convert_axis_pixel_format(s->format), tmp_data, tmp_linesize, tmp_w, tmp_h, - tmp_format, s->ctx)) < 0) + ret = ff_scale_image(s->axis_frame->data, s->axis_frame->linesize, s->width, s->axis_h, + convert_axis_pixel_format(s->format), + tmp_frame->data, tmp_frame->linesize, tmp_frame->width, tmp_frame->height, + tmp_frame->format, s->ctx); + if (ret < 0) { + av_frame_free(&s->axis_frame); goto error; + } s->axis_frame->width = s->width; s->axis_frame->height = s->axis_h; s->axis_frame->format = convert_axis_pixel_format(s->format); - av_freep(tmp_data); - return 0; + ret = 0; error: - av_frame_free(&s->axis_frame); - av_freep(tmp_data); + av_frame_free(&tmp_frame); return ret; } diff --git a/libavfilter/lavfutils.c b/libavfilter/lavfutils.c index 6130f21e7f..cc1b5de722 100644 --- a/libavfilter/lavfutils.c +++ b/libavfilter/lavfutils.c @@ -21,9 +21,8 @@ #include <stdint.h> #include "libavutil/dict.h" -#include "libavutil/imgutils.h" +#include "libavutil/frame.h" #include "libavutil/log.h" -#include "libavutil/pixfmt.h" #include "libavformat/avformat.h" @@ -31,8 +30,7 @@ #include "lavfutils.h" -int ff_load_image(uint8_t *data[4], int linesize[4], - int *w, int *h, enum AVPixelFormat *pix_fmt, +int ff_load_image(struct AVFrame **outframe, const char *filename, void *log_ctx) { const AVInputFormat *iformat = NULL; @@ -45,6 +43,8 @@ int ff_load_image(uint8_t *data[4], int linesize[4], AVPacket pkt; AVDictionary *opt=NULL; + *outframe = NULL; + iformat = av_find_input_format("image2pipe"); if ((ret = avformat_open_input(&format_ctx, filename, iformat, NULL)) < 0) { av_log(log_ctx, AV_LOG_ERROR, @@ -84,12 +84,6 @@ int ff_load_image(uint8_t *data[4], int linesize[4], goto end; } - if (!(frame = av_frame_alloc()) ) { - av_log(log_ctx, AV_LOG_ERROR, "Failed to alloc frame\n"); - ret = AVERROR(ENOMEM); - goto end; - } - ret = av_read_frame(format_ctx, &pkt); if (ret < 0) { av_log(log_ctx, AV_LOG_ERROR, "Failed to read frame from file\n"); @@ -103,27 +97,23 @@ int ff_load_image(uint8_t *data[4], int linesize[4], goto end; } + if (!(frame = av_frame_alloc()) ) { + av_log(log_ctx, AV_LOG_ERROR, "Failed to alloc frame\n"); + ret = AVERROR(ENOMEM); + goto end; + } + ret = avcodec_receive_frame(codec_ctx, frame); if (ret < 0) { + av_frame_free(&frame); av_log(log_ctx, AV_LOG_ERROR, "Failed to decode image from file\n"); goto end; } - - *w = frame->width; - *h = frame->height; - *pix_fmt = frame->format; - - if ((ret = av_image_alloc(data, linesize, *w, *h, *pix_fmt, 16)) < 0) - goto end; - ret = 0; - - av_image_copy2(data, linesize, frame->data, frame->linesize, - *pix_fmt, *w, *h); + *outframe = frame; end: avcodec_free_context(&codec_ctx); avformat_close_input(&format_ctx); - av_frame_free(&frame); av_dict_free(&opt); if (ret < 0) diff --git a/libavfilter/lavfutils.h b/libavfilter/lavfutils.h index 96738cead1..3b603f3fc7 100644 --- a/libavfilter/lavfutils.h +++ b/libavfilter/lavfutils.h @@ -24,21 +24,18 @@ #ifndef AVFILTER_LAVFUTILS_H #define AVFILTER_LAVFUTILS_H -#include <stdint.h> -#include "libavutil/pixfmt.h" +struct AVFrame; /** - * Load image from filename and put the resulting image in data. + * Load image from filename and put the resulting image in an AVFrame. * - * @param w pointer to the width of the loaded image - * @param h pointer to the height of the loaded image - * @param pix_fmt pointer to the pixel format of the loaded image + * @param outframe pointer to a pointer to an AVFrame; *outframe will + * point to a new allocated AVFrame on success * @param filename the name of the image file to load * @param log_ctx log context * @return >= 0 in case of success, a negative error code otherwise. */ -int ff_load_image(uint8_t *data[4], int linesize[4], - int *w, int *h, enum AVPixelFormat *pix_fmt, +int ff_load_image(struct AVFrame **outframe, const char *filename, void *log_ctx); #endif /* AVFILTER_LAVFUTILS_H */ diff --git a/libavfilter/vf_cover_rect.c b/libavfilter/vf_cover_rect.c index 410869d9c3..de6f4b07d1 100644 --- a/libavfilter/vf_cover_rect.c +++ b/libavfilter/vf_cover_rect.c @@ -22,7 +22,6 @@ * @todo switch to dualinput */ -#include "libavutil/mem.h" #include "libavutil/opt.h" #include "filters.h" #include "video.h" @@ -189,8 +188,6 @@ static av_cold void uninit(AVFilterContext *ctx) { CoverContext *cover = ctx->priv; - if (cover->cover_frame) - av_freep(&cover->cover_frame->data[0]); av_frame_free(&cover->cover_frame); } @@ -205,13 +202,8 @@ static av_cold int init(AVFilterContext *ctx) return AVERROR(EINVAL); } - cover->cover_frame = av_frame_alloc(); - if (!cover->cover_frame) - return AVERROR(ENOMEM); - - if ((ret = ff_load_image(cover->cover_frame->data, cover->cover_frame->linesize, - &cover->cover_frame->width, &cover->cover_frame->height, - &cover->cover_frame->format, cover->cover_filename, ctx)) < 0) + ret = ff_load_image(&cover->cover_frame, cover->cover_filename, ctx); + if (ret < 0) return ret; if (cover->cover_frame->format != AV_PIX_FMT_YUV420P && cover->cover_frame->format != AV_PIX_FMT_YUVJ420P) { diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c index 8415017bbb..88dfecbe22 100644 --- a/libavfilter/vf_find_rect.c +++ b/libavfilter/vf_find_rect.c @@ -22,7 +22,6 @@ * @todo switch to dualinput */ -#include "libavutil/mem.h" #include "libavutil/opt.h" #include "filters.h" @@ -250,8 +249,6 @@ static av_cold void uninit(AVFilterContext *ctx) av_frame_free(&foc->haystack_frame[i]); } - if (foc->obj_frame) - av_freep(&foc->obj_frame->data[0]); av_frame_free(&foc->obj_frame); } @@ -265,13 +262,8 @@ static av_cold int init(AVFilterContext *ctx) return AVERROR(EINVAL); } - foc->obj_frame = av_frame_alloc(); - if (!foc->obj_frame) - return AVERROR(ENOMEM); - - if ((ret = ff_load_image(foc->obj_frame->data, foc->obj_frame->linesize, - &foc->obj_frame->width, &foc->obj_frame->height, - &foc->obj_frame->format, foc->obj_filename, ctx)) < 0) + ret = ff_load_image(&foc->obj_frame, foc->obj_filename, ctx); + if (ret < 0) return ret; if (foc->obj_frame->format != AV_PIX_FMT_GRAY8) { diff --git a/libavfilter/vf_removelogo.c b/libavfilter/vf_removelogo.c index 87cbc09233..1da5f5d0c7 100644 --- a/libavfilter/vf_removelogo.c +++ b/libavfilter/vf_removelogo.c @@ -207,18 +207,22 @@ static int load_mask(uint8_t **mask, int *w, int *h, const char *filename, void *log_ctx) { int ret; - enum AVPixelFormat pix_fmt; - uint8_t *src_data[4], *gray_data[4]; - int src_linesize[4], gray_linesize[4]; + uint8_t *gray_data[4]; + AVFrame *src_frame; + int gray_linesize[4]; /* load image from file */ - if ((ret = ff_load_image(src_data, src_linesize, w, h, &pix_fmt, filename, log_ctx)) < 0) + ret = ff_load_image(&src_frame, filename, log_ctx); + if (ret < 0) return ret; + *w = src_frame->width; + *h = src_frame->height; /* convert the image to GRAY8 */ - if ((ret = ff_scale_image(gray_data, gray_linesize, *w, *h, AV_PIX_FMT_GRAY8, - src_data, src_linesize, *w, *h, pix_fmt, - log_ctx)) < 0) + ret = ff_scale_image(gray_data, gray_linesize, *w, *h, AV_PIX_FMT_GRAY8, + src_frame->data, src_frame->linesize, *w, *h, + src_frame->format, log_ctx); + if (ret < 0) goto end; /* copy mask to a newly allocated array */ @@ -230,8 +234,8 @@ static int load_mask(uint8_t **mask, int *w, int *h, av_image_copy_plane(*mask, *w, gray_data[0], gray_linesize[0], *w, *h); end: - av_freep(&src_data[0]); av_freep(&gray_data[0]); + av_frame_free(&src_frame); return ret; } _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
