diff options
author | Paul B Mahol <onemda@gmail.com> | 2021-01-17 12:06:01 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2021-01-17 12:06:01 +0100 |
commit | 9b44f99329927b4ddbb4f8215c1d39562797df8e (patch) | |
tree | 3b86698d6715f1bde18d04201bf93b3dff6ba3ab /libavfilter/bbox.c | |
parent | 294854bd0a4ec92431b96906cf47a3b02f6c3af4 (diff) | |
download | ffmpeg-9b44f99329927b4ddbb4f8215c1d39562797df8e.tar.gz |
avfilter/bbox: add support for >8 depth
Diffstat (limited to 'libavfilter/bbox.c')
-rw-r--r-- | libavfilter/bbox.c | 115 |
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); } |