Skip to content
Snippets Groups Projects
bbox.c 2.09 KiB
Newer Older
  • Learn to ignore specific revisions
  • Stefano Sabatini's avatar
    Stefano Sabatini committed
    /*
     * 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;
    
        int end_x;
        int end_y;
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
        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;
    }