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