[FFmpeg-devel] [PATCH v5 1/3] 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
Wed Jun 12 13:57:29 EEST 2019
From: Limin Wang <lance.lmwang at gmail.com>
Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
---
doc/filters.texi | 2 +-
libavfilter/vf_find_rect.c | 39 +++++++++++++++++++++++++++-----------
2 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/doc/filters.texi b/doc/filters.texi
index ec1c7c7591..90c57430a6 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -10150,7 +10150,7 @@ It accepts the following options:
@table @option
@item object
-Filepath of the object image, needs to be in gray8.
+Filepath of the object image.
@item threshold
Detection threshold, default is 0.5.
diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c
index d7e6579af7..ee6c3f4b45 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] = { NULL };
+ 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,37 @@ 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:
+ 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.21.0
More information about the ffmpeg-devel
mailing list