/*
 * 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"

#define BBOX(type, name)                                             \
static int bbox_##name(FFBoundingBox *bbox,                          \
                       const type *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;                                                       \
    const type *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;                                                        \
}

BBOX(uint8_t, 8)
BBOX(uint16_t, 16)

int ff_calculate_bounding_box(FFBoundingBox *bbox,
                              const uint8_t *data, int linesize,
                              int w, int h,
                              int min_val, int depth)
{
    if (depth <= 8)
        return bbox_8(bbox, data, linesize, w, h, min_val);
    else
        return bbox_16(bbox, (const uint16_t *)data, linesize / 2, w, h, min_val);
}
