bbox.c 2.1 KB

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