[FFmpeg-devel] [PATCH v3] libavfilter/vf_find_rect: convert the object image to gray8 format instead of failed directly
lance.lmwang at gmail.com
lance.lmwang at gmail.com
Sat Jun 8 01:53:58 EEST 2019
From: Limin Wang <lance.lmwang at gmail.com>
Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
---
libavfilter/vf_find_rect.c | 40 +++++++++++++++++++++++++++-------------
1 file changed, 27 insertions(+), 13 deletions(-)
diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c
index d7e6579..6fe12fe 100644
--- a/libavfilter/vf_find_rect.c
+++ b/libavfilter/vf_find_rect.c
@@ -28,6 +28,7 @@
#include "internal.h"
#include "lavfutils.h"
+#include "lswsutils.h"
#define MAX_MIPMAPS 5
@@ -235,8 +236,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);
}
@@ -244,6 +243,9 @@ static av_cold int init(AVFilterContext *ctx)
{
FOCContext *foc = ctx->priv;
int ret, i;
+ uint8_t *tmp_data[4];
+ int tmp_linesize[4], width, height;
+ enum AVPixelFormat pix_fmt;
if (!foc->obj_filename) {
av_log(ctx, AV_LOG_ERROR, "object filename not set\n");
@@ -254,24 +256,36 @@ static av_cold int init(AVFilterContext *ctx)
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)
- return ret;
-
- if (foc->obj_frame->format != AV_PIX_FMT_GRAY8) {
- av_log(ctx, AV_LOG_ERROR, "object image is not a grayscale image\n");
- return AVERROR(EINVAL);
- }
+ if ((ret = ff_load_image(&tmp_data, tmp_linesize,
+ &width, &height,
+ &pix_fmt, foc->obj_filename, ctx)) < 0)
+ goto error;
+
+ /* convert object image to gray8 format with same width and height */
+ foc->obj_frame->format = AV_PIX_FMT_GRAY8;
+ foc->obj_frame->width = width;
+ foc->obj_frame->height = height;
+ if ((ret = ff_scale_image(foc->obj_frame->data, foc->obj_frame->linesize,
+ foc->obj_frame->width, foc->obj_frame->height, foc->obj_frame->format,
+ tmp_data, tmp_linesize, width, height, pix_fmt, ctx)) < 0)
+ goto error;
+ av_freep(&tmp_data[0]);
foc->needle_frame[0] = av_frame_clone(foc->obj_frame);
for (i = 1; i < foc->mipmaps; i++) {
foc->needle_frame[i] = downscale(foc->needle_frame[i-1]);
- if (!foc->needle_frame[i])
- return AVERROR(ENOMEM);
+ if (!foc->needle_frame[i]) {
+ ret = AVERROR(ENOMEM);
+ goto error;
+ }
}
return 0;
+error:
+ if (tmp_data)
+ av_freep(&tmp_data[0]);
+ av_frame_free(&foc->obj_frame);
+ return ret;
}
static const AVFilterPad foc_inputs[] = {
--
2.6.4
More information about the ffmpeg-devel
mailing list