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: - - /* 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; +#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; \ +} + +BBOX(uint8_t, 8) +BBOX(uint16_t, 16) + +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", \