You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
4.9KB

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