| /* |

| * 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; |

| 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; |

| } |