FFmpeg
bbox.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2005 Robert Edele <yartrebo@earthlink.net>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "bbox.h"
22 
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 }
77 
78 BBOX(uint8_t, 8)
79 BBOX(uint16_t, 16)
80 
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);
90 }
bbox.h
ff_calculate_bounding_box
int ff_calculate_bounding_box(FFBoundingBox *bbox, const uint8_t *data, int linesize, int w, int h, int min_val, int depth)
Calculate the smallest rectangle that will encompass the region with values > min_val.
Definition: bbox.c:81
w
uint8_t w
Definition: llviddspenc.c:38
data
const char data[16]
Definition: mxf.c:149
BBOX
#define BBOX(type, name)
Definition: bbox.c:23
FFBoundingBox
Definition: bbox.h:26
h
h
Definition: vp9dsp_template.c:2070