libavfilter/bbox.c
3225bc37
 /*
  * Copyright (c) 2005 Robert Edele <yartrebo@earthlink.net>
  *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #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;
53c89677
     int end_x;
     int end_y;
3225bc37
     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;
 }