|
20 | 20 |
|
21 | 21 | #include "bbox.h"
|
22 | 22 |
|
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 | +} |
59 | 77 |
|
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) |
69 | 80 |
|
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); |
75 | 90 | }
|
0 commit comments