summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2021-01-17 12:06:01 +0100
committerPaul B Mahol <onemda@gmail.com>2021-01-17 12:06:01 +0100
commit9b44f99329927b4ddbb4f8215c1d39562797df8e (patch)
tree3b86698d6715f1bde18d04201bf93b3dff6ba3ab /libavfilter
parent294854bd0a4ec92431b96906cf47a3b02f6c3af4 (diff)
avfilter/bbox: add support for >8 depth
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/bbox.c115
-rw-r--r--libavfilter/bbox.h2
-rw-r--r--libavfilter/vf_bbox.c2
-rw-r--r--libavfilter/vf_removelogo.c4
4 files changed, 69 insertions, 54 deletions
diff --git a/libavfilter/bbox.c b/libavfilter/bbox.c
index be9b2e6b73..3ed9045b02 100644
--- a/libavfilter/bbox.c
+++ b/libavfilter/bbox.c
@@ -20,56 +20,71 @@
#include "bbox.h"
-int ff_calculate_bounding_box(FFBoundingBox *bbox,
- const uint8_t *data, int linesize, int w, int h,
- int min_val)
-{
- int x, y;
- int start_x;
- int start_y;
- int end_x;
- int end_y;
- const uint8_t *line;
-
- /* left bound */
- for (start_x = 0; start_x < w; start_x++)
- for (y = 0; y < h; y++)
- if ((data[y * linesize + start_x] > min_val))
- goto outl;
-outl:
- if (start_x == w) /* no points found */
- return 0;
-
- /* right bound */
- for (end_x = w - 1; end_x >= start_x; end_x--)
- for (y = 0; y < h; y++)
- if ((data[y * linesize + end_x] > min_val))
- goto outr;
-outr:
-
- /* top bound */
- line = data;
- for (start_y = 0; start_y < h; start_y++) {
- for (x = 0; x < w; x++)
- if (line[x] > min_val)
- goto outt;
- line += linesize;
- }
-outt:
+#define BBOX(type, name) \
+static int bbox_##name(FFBoundingBox *bbox, \
+ const type *data, int linesize, int w, int h, \
+ int min_val) \
+{ \
+ int x, y; \
+ int start_x; \
+ int start_y; \
+ int end_x; \
+ int end_y; \
+ const type *line; \
+ \
+ /* left bound */ \
+ for (start_x = 0; start_x < w; start_x++) \
+ for (y = 0; y < h; y++) \
+ if ((data[y * linesize + start_x] > min_val)) \
+ goto outl; \
+outl: \
+ if (start_x == w) /* no points found */ \
+ return 0; \
+ \
+ /* right bound */ \
+ for (end_x = w - 1; end_x >= start_x; end_x--) \
+ for (y = 0; y < h; y++) \
+ if ((data[y * linesize + end_x] > min_val)) \
+ goto outr; \
+outr: \
+ \
+ /* top bound */ \
+ line = data; \
+ for (start_y = 0; start_y < h; start_y++) { \
+ for (x = 0; x < w; x++) \
+ if (line[x] > min_val) \
+ goto outt; \
+ line += linesize; \
+ } \
+outt: \
+ \
+ /* bottom bound */ \
+ line = data + (h-1)*linesize; \
+ for (end_y = h - 1; end_y >= start_y; end_y--) { \
+ for (x = 0; x < w; x++) \
+ if (line[x] > min_val) \
+ goto outb; \
+ line -= linesize; \
+ } \
+outb: \
+ \
+ bbox->x1 = start_x; \
+ bbox->y1 = start_y; \
+ bbox->x2 = end_x; \
+ bbox->y2 = end_y; \
+ return 1; \
+}
- /* bottom bound */
- line = data + (h-1)*linesize;
- for (end_y = h - 1; end_y >= start_y; end_y--) {
- for (x = 0; x < w; x++)
- if (line[x] > min_val)
- goto outb;
- line -= linesize;
- }
-outb:
+BBOX(uint8_t, 8)
+BBOX(uint16_t, 16)
- bbox->x1 = start_x;
- bbox->y1 = start_y;
- bbox->x2 = end_x;
- bbox->y2 = end_y;
- return 1;
+int ff_calculate_bounding_box(FFBoundingBox *bbox,
+ const uint8_t *data, int linesize,
+ int w, int h,
+ int min_val, int depth)
+{
+ if (depth <= 8)
+ return bbox_8(bbox, data, linesize, w, h, min_val);
+ else
+ return bbox_16(bbox, (const uint16_t *)data, linesize / 2, w, h, min_val);
}
diff --git a/libavfilter/bbox.h b/libavfilter/bbox.h
index cf026b81f9..116158d59e 100644
--- a/libavfilter/bbox.h
+++ b/libavfilter/bbox.h
@@ -39,6 +39,6 @@ typedef struct FFBoundingBox {
*/
int ff_calculate_bounding_box(FFBoundingBox *bbox,
const uint8_t *data, int linesize,
- int w, int h, int min_val);
+ int w, int h, int min_val, int depth);
#endif /* AVFILTER_BBOX_H */
diff --git a/libavfilter/vf_bbox.c b/libavfilter/vf_bbox.c
index 4ac2980a6c..79fa03d7f5 100644
--- a/libavfilter/vf_bbox.c
+++ b/libavfilter/vf_bbox.c
@@ -75,7 +75,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
has_bbox =
ff_calculate_bounding_box(&box,
frame->data[0], frame->linesize[0],
- inlink->w, inlink->h, bbox->min_val);
+ inlink->w, inlink->h, bbox->min_val, 8);
w = box.x2 - box.x1 + 1;
h = box.y2 - box.y1 + 1;
diff --git a/libavfilter/vf_removelogo.c b/libavfilter/vf_removelogo.c
index aff2d12a17..4026bdd09a 100644
--- a/libavfilter/vf_removelogo.c
+++ b/libavfilter/vf_removelogo.c
@@ -342,8 +342,8 @@ static av_cold int init(AVFilterContext *ctx)
/* Calculate our bounding rectangles, which determine in what
* region the logo resides for faster processing. */
- ff_calculate_bounding_box(&s->full_mask_bbox, s->full_mask_data, w, w, h, 0);
- ff_calculate_bounding_box(&s->half_mask_bbox, s->half_mask_data, w/2, w/2, h/2, 0);
+ ff_calculate_bounding_box(&s->full_mask_bbox, s->full_mask_data, w, w, h, 0, 8);
+ ff_calculate_bounding_box(&s->half_mask_bbox, s->half_mask_data, w/2, w/2, h/2, 0, 8);
#define SHOW_LOGO_INFO(mask_type) \
av_log(ctx, AV_LOG_VERBOSE, #mask_type " x1:%d x2:%d y1:%d y2:%d max_mask_size:%d\n", \