1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include "detection_bbox.h" 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ciAVDetectionBBoxHeader *av_detection_bbox_alloc(uint32_t nb_bboxes, size_t *out_size) 22cabdff1aSopenharmony_ci{ 23cabdff1aSopenharmony_ci size_t size; 24cabdff1aSopenharmony_ci struct BBoxContext { 25cabdff1aSopenharmony_ci AVDetectionBBoxHeader header; 26cabdff1aSopenharmony_ci AVDetectionBBox boxes; 27cabdff1aSopenharmony_ci }; 28cabdff1aSopenharmony_ci const size_t bboxes_offset = offsetof(struct BBoxContext, boxes); 29cabdff1aSopenharmony_ci const size_t bbox_size = sizeof(AVDetectionBBox); 30cabdff1aSopenharmony_ci AVDetectionBBoxHeader *header; 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci size = bboxes_offset; 33cabdff1aSopenharmony_ci if (nb_bboxes > (SIZE_MAX - size) / bbox_size) 34cabdff1aSopenharmony_ci return NULL; 35cabdff1aSopenharmony_ci size += bbox_size * nb_bboxes; 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci header = av_mallocz(size); 38cabdff1aSopenharmony_ci if (!header) 39cabdff1aSopenharmony_ci return NULL; 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci header->nb_bboxes = nb_bboxes; 42cabdff1aSopenharmony_ci header->bbox_size = bbox_size; 43cabdff1aSopenharmony_ci header->bboxes_offset = bboxes_offset; 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci if (out_size) 46cabdff1aSopenharmony_ci *out_size = size; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci return header; 49cabdff1aSopenharmony_ci} 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ciAVDetectionBBoxHeader *av_detection_bbox_create_side_data(AVFrame *frame, uint32_t nb_bboxes) 52cabdff1aSopenharmony_ci{ 53cabdff1aSopenharmony_ci AVBufferRef *buf; 54cabdff1aSopenharmony_ci AVDetectionBBoxHeader *header; 55cabdff1aSopenharmony_ci size_t size; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci header = av_detection_bbox_alloc(nb_bboxes, &size); 58cabdff1aSopenharmony_ci if (!header) 59cabdff1aSopenharmony_ci return NULL; 60cabdff1aSopenharmony_ci buf = av_buffer_create((uint8_t *)header, size, NULL, NULL, 0); 61cabdff1aSopenharmony_ci if (!buf) { 62cabdff1aSopenharmony_ci av_freep(&header); 63cabdff1aSopenharmony_ci return NULL; 64cabdff1aSopenharmony_ci } 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci if (!av_frame_new_side_data_from_buf(frame, AV_FRAME_DATA_DETECTION_BBOXES, buf)) { 67cabdff1aSopenharmony_ci av_buffer_unref(&buf); 68cabdff1aSopenharmony_ci return NULL; 69cabdff1aSopenharmony_ci } 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci return header; 72cabdff1aSopenharmony_ci} 73