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#ifndef AVUTIL_DETECTION_BBOX_H 20cabdff1aSopenharmony_ci#define AVUTIL_DETECTION_BBOX_H 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "rational.h" 23cabdff1aSopenharmony_ci#include "avassert.h" 24cabdff1aSopenharmony_ci#include "frame.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_citypedef struct AVDetectionBBox { 27cabdff1aSopenharmony_ci /** 28cabdff1aSopenharmony_ci * Distance in pixels from the left/top edge of the frame, 29cabdff1aSopenharmony_ci * together with width and height, defining the bounding box. 30cabdff1aSopenharmony_ci */ 31cabdff1aSopenharmony_ci int x; 32cabdff1aSopenharmony_ci int y; 33cabdff1aSopenharmony_ci int w; 34cabdff1aSopenharmony_ci int h; 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#define AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE 64 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci /** 39cabdff1aSopenharmony_ci * Detect result with confidence 40cabdff1aSopenharmony_ci */ 41cabdff1aSopenharmony_ci char detect_label[AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE]; 42cabdff1aSopenharmony_ci AVRational detect_confidence; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci /** 45cabdff1aSopenharmony_ci * At most 4 classifications based on the detected bounding box. 46cabdff1aSopenharmony_ci * For example, we can get max 4 different attributes with 4 different 47cabdff1aSopenharmony_ci * DNN models on one bounding box. 48cabdff1aSopenharmony_ci * classify_count is zero if no classification. 49cabdff1aSopenharmony_ci */ 50cabdff1aSopenharmony_ci#define AV_NUM_DETECTION_BBOX_CLASSIFY 4 51cabdff1aSopenharmony_ci uint32_t classify_count; 52cabdff1aSopenharmony_ci char classify_labels[AV_NUM_DETECTION_BBOX_CLASSIFY][AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE]; 53cabdff1aSopenharmony_ci AVRational classify_confidences[AV_NUM_DETECTION_BBOX_CLASSIFY]; 54cabdff1aSopenharmony_ci} AVDetectionBBox; 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_citypedef struct AVDetectionBBoxHeader { 57cabdff1aSopenharmony_ci /** 58cabdff1aSopenharmony_ci * Information about how the bounding box is generated. 59cabdff1aSopenharmony_ci * for example, the DNN model name. 60cabdff1aSopenharmony_ci */ 61cabdff1aSopenharmony_ci char source[256]; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci /** 64cabdff1aSopenharmony_ci * Number of bounding boxes in the array. 65cabdff1aSopenharmony_ci */ 66cabdff1aSopenharmony_ci uint32_t nb_bboxes; 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci /** 69cabdff1aSopenharmony_ci * Offset in bytes from the beginning of this structure at which 70cabdff1aSopenharmony_ci * the array of bounding boxes starts. 71cabdff1aSopenharmony_ci */ 72cabdff1aSopenharmony_ci size_t bboxes_offset; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci /** 75cabdff1aSopenharmony_ci * Size of each bounding box in bytes. 76cabdff1aSopenharmony_ci */ 77cabdff1aSopenharmony_ci size_t bbox_size; 78cabdff1aSopenharmony_ci} AVDetectionBBoxHeader; 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci/* 81cabdff1aSopenharmony_ci * Get the bounding box at the specified {@code idx}. Must be between 0 and nb_bboxes. 82cabdff1aSopenharmony_ci */ 83cabdff1aSopenharmony_cistatic av_always_inline AVDetectionBBox * 84cabdff1aSopenharmony_ciav_get_detection_bbox(const AVDetectionBBoxHeader *header, unsigned int idx) 85cabdff1aSopenharmony_ci{ 86cabdff1aSopenharmony_ci av_assert0(idx < header->nb_bboxes); 87cabdff1aSopenharmony_ci return (AVDetectionBBox *)((uint8_t *)header + header->bboxes_offset + 88cabdff1aSopenharmony_ci idx * header->bbox_size); 89cabdff1aSopenharmony_ci} 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci/** 92cabdff1aSopenharmony_ci * Allocates memory for AVDetectionBBoxHeader, plus an array of {@code nb_bboxes} 93cabdff1aSopenharmony_ci * AVDetectionBBox, and initializes the variables. 94cabdff1aSopenharmony_ci * Can be freed with a normal av_free() call. 95cabdff1aSopenharmony_ci * 96cabdff1aSopenharmony_ci * @param out_size if non-NULL, the size in bytes of the resulting data array is 97cabdff1aSopenharmony_ci * written here. 98cabdff1aSopenharmony_ci */ 99cabdff1aSopenharmony_ciAVDetectionBBoxHeader *av_detection_bbox_alloc(uint32_t nb_bboxes, size_t *out_size); 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci/** 102cabdff1aSopenharmony_ci * Allocates memory for AVDetectionBBoxHeader, plus an array of {@code nb_bboxes} 103cabdff1aSopenharmony_ci * AVDetectionBBox, in the given AVFrame {@code frame} as AVFrameSideData of type 104cabdff1aSopenharmony_ci * AV_FRAME_DATA_DETECTION_BBOXES and initializes the variables. 105cabdff1aSopenharmony_ci */ 106cabdff1aSopenharmony_ciAVDetectionBBoxHeader *av_detection_bbox_create_side_data(AVFrame *frame, uint32_t nb_bboxes); 107cabdff1aSopenharmony_ci#endif 108