Skip to content

Commit 9b44f99

Browse files
committed
avfilter/bbox: add support for >8 depth
1 parent 294854b commit 9b44f99

File tree

4 files changed

+69
-54
lines changed

4 files changed

+69
-54
lines changed

libavfilter/bbox.c

Lines changed: 65 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -20,56 +20,71 @@
2020

2121
#include "bbox.h"
2222

23-
int ff_calculate_bounding_box(FFBoundingBox *bbox,
24-
const uint8_t *data, int linesize, int w, int h,
25-
int min_val)
26-
{
27-
int x, y;
28-
int start_x;
29-
int start_y;
30-
int end_x;
31-
int end_y;
32-
const uint8_t *line;
33-
34-
/* left bound */
35-
for (start_x = 0; start_x < w; start_x++)
36-
for (y = 0; y < h; y++)
37-
if ((data[y * linesize + start_x] > min_val))
38-
goto outl;
39-
outl:
40-
if (start_x == w) /* no points found */
41-
return 0;
42-
43-
/* right bound */
44-
for (end_x = w - 1; end_x >= start_x; end_x--)
45-
for (y = 0; y < h; y++)
46-
if ((data[y * linesize + end_x] > min_val))
47-
goto outr;
48-
outr:
49-
50-
/* top bound */
51-
line = data;
52-
for (start_y = 0; start_y < h; start_y++) {
53-
for (x = 0; x < w; x++)
54-
if (line[x] > min_val)
55-
goto outt;
56-
line += linesize;
57-
}
58-
outt:
23+
#define BBOX(type, name) \
24+
static int bbox_##name(FFBoundingBox *bbox, \
25+
const type *data, int linesize, int w, int h, \
26+
int min_val) \
27+
{ \
28+
int x, y; \
29+
int start_x; \
30+
int start_y; \
31+
int end_x; \
32+
int end_y; \
33+
const type *line; \
34+
\
35+
/* left bound */ \
36+
for (start_x = 0; start_x < w; start_x++) \
37+
for (y = 0; y < h; y++) \
38+
if ((data[y * linesize + start_x] > min_val)) \
39+
goto outl; \
40+
outl: \
41+
if (start_x == w) /* no points found */ \
42+
return 0; \
43+
\
44+
/* right bound */ \
45+
for (end_x = w - 1; end_x >= start_x; end_x--) \
46+
for (y = 0; y < h; y++) \
47+
if ((data[y * linesize + end_x] > min_val)) \
48+
goto outr; \
49+
outr: \
50+
\
51+
/* top bound */ \
52+
line = data; \
53+
for (start_y = 0; start_y < h; start_y++) { \
54+
for (x = 0; x < w; x++) \
55+
if (line[x] > min_val) \
56+
goto outt; \
57+
line += linesize; \
58+
} \
59+
outt: \
60+
\
61+
/* bottom bound */ \
62+
line = data + (h-1)*linesize; \
63+
for (end_y = h - 1; end_y >= start_y; end_y--) { \
64+
for (x = 0; x < w; x++) \
65+
if (line[x] > min_val) \
66+
goto outb; \
67+
line -= linesize; \
68+
} \
69+
outb: \
70+
\
71+
bbox->x1 = start_x; \
72+
bbox->y1 = start_y; \
73+
bbox->x2 = end_x; \
74+
bbox->y2 = end_y; \
75+
return 1; \
76+
}
5977

60-
/* bottom bound */
61-
line = data + (h-1)*linesize;
62-
for (end_y = h - 1; end_y >= start_y; end_y--) {
63-
for (x = 0; x < w; x++)
64-
if (line[x] > min_val)
65-
goto outb;
66-
line -= linesize;
67-
}
68-
outb:
78+
BBOX(uint8_t, 8)
79+
BBOX(uint16_t, 16)
6980

70-
bbox->x1 = start_x;
71-
bbox->y1 = start_y;
72-
bbox->x2 = end_x;
73-
bbox->y2 = end_y;
74-
return 1;
81+
int ff_calculate_bounding_box(FFBoundingBox *bbox,
82+
const uint8_t *data, int linesize,
83+
int w, int h,
84+
int min_val, int depth)
85+
{
86+
if (depth <= 8)
87+
return bbox_8(bbox, data, linesize, w, h, min_val);
88+
else
89+
return bbox_16(bbox, (const uint16_t *)data, linesize / 2, w, h, min_val);
7590
}

libavfilter/bbox.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@ typedef struct FFBoundingBox {
3939
*/
4040
int ff_calculate_bounding_box(FFBoundingBox *bbox,
4141
const uint8_t *data, int linesize,
42-
int w, int h, int min_val);
42+
int w, int h, int min_val, int depth);
4343

4444
#endif /* AVFILTER_BBOX_H */

libavfilter/vf_bbox.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
7575
has_bbox =
7676
ff_calculate_bounding_box(&box,
7777
frame->data[0], frame->linesize[0],
78-
inlink->w, inlink->h, bbox->min_val);
78+
inlink->w, inlink->h, bbox->min_val, 8);
7979
w = box.x2 - box.x1 + 1;
8080
h = box.y2 - box.y1 + 1;
8181

libavfilter/vf_removelogo.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,8 +342,8 @@ static av_cold int init(AVFilterContext *ctx)
342342

343343
/* Calculate our bounding rectangles, which determine in what
344344
* region the logo resides for faster processing. */
345-
ff_calculate_bounding_box(&s->full_mask_bbox, s->full_mask_data, w, w, h, 0);
346-
ff_calculate_bounding_box(&s->half_mask_bbox, s->half_mask_data, w/2, w/2, h/2, 0);
345+
ff_calculate_bounding_box(&s->full_mask_bbox, s->full_mask_data, w, w, h, 0, 8);
346+
ff_calculate_bounding_box(&s->half_mask_bbox, s->half_mask_data, w/2, w/2, h/2, 0, 8);
347347

348348
#define SHOW_LOGO_INFO(mask_type) \
349349
av_log(ctx, AV_LOG_VERBOSE, #mask_type " x1:%d x2:%d y1:%d y2:%d max_mask_size:%d\n", \

0 commit comments

Comments
 (0)