aboutsummaryrefslogtreecommitdiffstats
path: root/libavfilter/bbox.c
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/bbox.c
parent294854bd0a4ec92431b96906cf47a3b02f6c3af4 (diff)
downloadffmpeg-9b44f99329927b4ddbb4f8215c1d39562797df8e.tar.gz
avfilter/bbox: add support for >8 depth
Diffstat (limited to 'libavfilter/bbox.c')
-rw-r--r--libavfilter/bbox.c115
1 files changed, 65 insertions, 50 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);
}