[FFmpeg-devel] [PATCH v2] 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
Fri Jun 7 13:20:25 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, 29 insertions(+), 11 deletions(-)
diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c
index d7e6579..8c6e928 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
@@ -244,6 +245,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 +258,38 @@ 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);
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]);
+ if (foc->obj_frame)
+ av_freep(&foc->obj_frame->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