1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * AVPacket functions for libavcodec
3cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#include <string.h>
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
25cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h"
26cabdff1aSopenharmony_ci#include "libavutil/mathematics.h"
27cabdff1aSopenharmony_ci#include "libavutil/mem.h"
28cabdff1aSopenharmony_ci#include "libavutil/rational.h"
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ci#include "defs.h"
31cabdff1aSopenharmony_ci#include "packet.h"
32cabdff1aSopenharmony_ci#include "packet_internal.h"
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci#if FF_API_INIT_PACKET
35cabdff1aSopenharmony_civoid av_init_packet(AVPacket *pkt)
36cabdff1aSopenharmony_ci{
37cabdff1aSopenharmony_ci    pkt->pts                  = AV_NOPTS_VALUE;
38cabdff1aSopenharmony_ci    pkt->dts                  = AV_NOPTS_VALUE;
39cabdff1aSopenharmony_ci    pkt->pos                  = -1;
40cabdff1aSopenharmony_ci    pkt->duration             = 0;
41cabdff1aSopenharmony_ci    pkt->flags                = 0;
42cabdff1aSopenharmony_ci    pkt->stream_index         = 0;
43cabdff1aSopenharmony_ci    pkt->buf                  = NULL;
44cabdff1aSopenharmony_ci    pkt->side_data            = NULL;
45cabdff1aSopenharmony_ci    pkt->side_data_elems      = 0;
46cabdff1aSopenharmony_ci    pkt->opaque               = NULL;
47cabdff1aSopenharmony_ci    pkt->opaque_ref           = NULL;
48cabdff1aSopenharmony_ci    pkt->time_base            = av_make_q(0, 1);
49cabdff1aSopenharmony_ci}
50cabdff1aSopenharmony_ci#endif
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_cistatic void get_packet_defaults(AVPacket *pkt)
53cabdff1aSopenharmony_ci{
54cabdff1aSopenharmony_ci    memset(pkt, 0, sizeof(*pkt));
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_ci    pkt->pts             = AV_NOPTS_VALUE;
57cabdff1aSopenharmony_ci    pkt->dts             = AV_NOPTS_VALUE;
58cabdff1aSopenharmony_ci    pkt->pos             = -1;
59cabdff1aSopenharmony_ci    pkt->time_base       = av_make_q(0, 1);
60cabdff1aSopenharmony_ci}
61cabdff1aSopenharmony_ci
62cabdff1aSopenharmony_ciAVPacket *av_packet_alloc(void)
63cabdff1aSopenharmony_ci{
64cabdff1aSopenharmony_ci    AVPacket *pkt = av_malloc(sizeof(AVPacket));
65cabdff1aSopenharmony_ci    if (!pkt)
66cabdff1aSopenharmony_ci        return pkt;
67cabdff1aSopenharmony_ci
68cabdff1aSopenharmony_ci    get_packet_defaults(pkt);
69cabdff1aSopenharmony_ci
70cabdff1aSopenharmony_ci    return pkt;
71cabdff1aSopenharmony_ci}
72cabdff1aSopenharmony_ci
73cabdff1aSopenharmony_civoid av_packet_free(AVPacket **pkt)
74cabdff1aSopenharmony_ci{
75cabdff1aSopenharmony_ci    if (!pkt || !*pkt)
76cabdff1aSopenharmony_ci        return;
77cabdff1aSopenharmony_ci
78cabdff1aSopenharmony_ci    av_packet_unref(*pkt);
79cabdff1aSopenharmony_ci    av_freep(pkt);
80cabdff1aSopenharmony_ci}
81cabdff1aSopenharmony_ci
82cabdff1aSopenharmony_cistatic int packet_alloc(AVBufferRef **buf, int size)
83cabdff1aSopenharmony_ci{
84cabdff1aSopenharmony_ci    int ret;
85cabdff1aSopenharmony_ci    if (size < 0 || size >= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
86cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
87cabdff1aSopenharmony_ci
88cabdff1aSopenharmony_ci    ret = av_buffer_realloc(buf, size + AV_INPUT_BUFFER_PADDING_SIZE);
89cabdff1aSopenharmony_ci    if (ret < 0)
90cabdff1aSopenharmony_ci        return ret;
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_ci    memset((*buf)->data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_ci    return 0;
95cabdff1aSopenharmony_ci}
96cabdff1aSopenharmony_ci
97cabdff1aSopenharmony_ciint av_new_packet(AVPacket *pkt, int size)
98cabdff1aSopenharmony_ci{
99cabdff1aSopenharmony_ci    AVBufferRef *buf = NULL;
100cabdff1aSopenharmony_ci    int ret = packet_alloc(&buf, size);
101cabdff1aSopenharmony_ci    if (ret < 0)
102cabdff1aSopenharmony_ci        return ret;
103cabdff1aSopenharmony_ci
104cabdff1aSopenharmony_ci    get_packet_defaults(pkt);
105cabdff1aSopenharmony_ci    pkt->buf      = buf;
106cabdff1aSopenharmony_ci    pkt->data     = buf->data;
107cabdff1aSopenharmony_ci    pkt->size     = size;
108cabdff1aSopenharmony_ci
109cabdff1aSopenharmony_ci    return 0;
110cabdff1aSopenharmony_ci}
111cabdff1aSopenharmony_ci
112cabdff1aSopenharmony_civoid av_shrink_packet(AVPacket *pkt, int size)
113cabdff1aSopenharmony_ci{
114cabdff1aSopenharmony_ci    if (pkt->size <= size)
115cabdff1aSopenharmony_ci        return;
116cabdff1aSopenharmony_ci    pkt->size = size;
117cabdff1aSopenharmony_ci    memset(pkt->data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
118cabdff1aSopenharmony_ci}
119cabdff1aSopenharmony_ci
120cabdff1aSopenharmony_ciint av_grow_packet(AVPacket *pkt, int grow_by)
121cabdff1aSopenharmony_ci{
122cabdff1aSopenharmony_ci    int new_size;
123cabdff1aSopenharmony_ci    av_assert0((unsigned)pkt->size <= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE);
124cabdff1aSopenharmony_ci    if ((unsigned)grow_by >
125cabdff1aSopenharmony_ci        INT_MAX - (pkt->size + AV_INPUT_BUFFER_PADDING_SIZE))
126cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
127cabdff1aSopenharmony_ci
128cabdff1aSopenharmony_ci    new_size = pkt->size + grow_by + AV_INPUT_BUFFER_PADDING_SIZE;
129cabdff1aSopenharmony_ci    if (pkt->buf) {
130cabdff1aSopenharmony_ci        size_t data_offset;
131cabdff1aSopenharmony_ci        uint8_t *old_data = pkt->data;
132cabdff1aSopenharmony_ci        if (pkt->data == NULL) {
133cabdff1aSopenharmony_ci            data_offset = 0;
134cabdff1aSopenharmony_ci            pkt->data = pkt->buf->data;
135cabdff1aSopenharmony_ci        } else {
136cabdff1aSopenharmony_ci            data_offset = pkt->data - pkt->buf->data;
137cabdff1aSopenharmony_ci            if (data_offset > INT_MAX - new_size)
138cabdff1aSopenharmony_ci                return AVERROR(ENOMEM);
139cabdff1aSopenharmony_ci        }
140cabdff1aSopenharmony_ci
141cabdff1aSopenharmony_ci        if (new_size + data_offset > pkt->buf->size ||
142cabdff1aSopenharmony_ci            !av_buffer_is_writable(pkt->buf)) {
143cabdff1aSopenharmony_ci            int ret;
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_ci            // allocate slightly more than requested to avoid excessive
146cabdff1aSopenharmony_ci            // reallocations
147cabdff1aSopenharmony_ci            if (new_size + data_offset < INT_MAX - new_size/16)
148cabdff1aSopenharmony_ci                new_size += new_size/16;
149cabdff1aSopenharmony_ci
150cabdff1aSopenharmony_ci            ret = av_buffer_realloc(&pkt->buf, new_size + data_offset);
151cabdff1aSopenharmony_ci            if (ret < 0) {
152cabdff1aSopenharmony_ci                pkt->data = old_data;
153cabdff1aSopenharmony_ci                return ret;
154cabdff1aSopenharmony_ci            }
155cabdff1aSopenharmony_ci            pkt->data = pkt->buf->data + data_offset;
156cabdff1aSopenharmony_ci        }
157cabdff1aSopenharmony_ci    } else {
158cabdff1aSopenharmony_ci        pkt->buf = av_buffer_alloc(new_size);
159cabdff1aSopenharmony_ci        if (!pkt->buf)
160cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
161cabdff1aSopenharmony_ci        if (pkt->size > 0)
162cabdff1aSopenharmony_ci            memcpy(pkt->buf->data, pkt->data, pkt->size);
163cabdff1aSopenharmony_ci        pkt->data = pkt->buf->data;
164cabdff1aSopenharmony_ci    }
165cabdff1aSopenharmony_ci    pkt->size += grow_by;
166cabdff1aSopenharmony_ci    memset(pkt->data + pkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
167cabdff1aSopenharmony_ci
168cabdff1aSopenharmony_ci    return 0;
169cabdff1aSopenharmony_ci}
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_ciint av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
172cabdff1aSopenharmony_ci{
173cabdff1aSopenharmony_ci    if (size >= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
174cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci    pkt->buf = av_buffer_create(data, size + AV_INPUT_BUFFER_PADDING_SIZE,
177cabdff1aSopenharmony_ci                                av_buffer_default_free, NULL, 0);
178cabdff1aSopenharmony_ci    if (!pkt->buf)
179cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
180cabdff1aSopenharmony_ci
181cabdff1aSopenharmony_ci    pkt->data = data;
182cabdff1aSopenharmony_ci    pkt->size = size;
183cabdff1aSopenharmony_ci
184cabdff1aSopenharmony_ci    return 0;
185cabdff1aSopenharmony_ci}
186cabdff1aSopenharmony_ci
187cabdff1aSopenharmony_civoid av_packet_free_side_data(AVPacket *pkt)
188cabdff1aSopenharmony_ci{
189cabdff1aSopenharmony_ci    int i;
190cabdff1aSopenharmony_ci    for (i = 0; i < pkt->side_data_elems; i++)
191cabdff1aSopenharmony_ci        av_freep(&pkt->side_data[i].data);
192cabdff1aSopenharmony_ci    av_freep(&pkt->side_data);
193cabdff1aSopenharmony_ci    pkt->side_data_elems = 0;
194cabdff1aSopenharmony_ci}
195cabdff1aSopenharmony_ci
196cabdff1aSopenharmony_ciint av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
197cabdff1aSopenharmony_ci                            uint8_t *data, size_t size)
198cabdff1aSopenharmony_ci{
199cabdff1aSopenharmony_ci    AVPacketSideData *tmp;
200cabdff1aSopenharmony_ci    int i, elems = pkt->side_data_elems;
201cabdff1aSopenharmony_ci
202cabdff1aSopenharmony_ci    for (i = 0; i < elems; i++) {
203cabdff1aSopenharmony_ci        AVPacketSideData *sd = &pkt->side_data[i];
204cabdff1aSopenharmony_ci
205cabdff1aSopenharmony_ci        if (sd->type == type) {
206cabdff1aSopenharmony_ci            av_free(sd->data);
207cabdff1aSopenharmony_ci            sd->data = data;
208cabdff1aSopenharmony_ci            sd->size = size;
209cabdff1aSopenharmony_ci            return 0;
210cabdff1aSopenharmony_ci        }
211cabdff1aSopenharmony_ci    }
212cabdff1aSopenharmony_ci
213cabdff1aSopenharmony_ci    if ((unsigned)elems + 1 > AV_PKT_DATA_NB)
214cabdff1aSopenharmony_ci        return AVERROR(ERANGE);
215cabdff1aSopenharmony_ci
216cabdff1aSopenharmony_ci    tmp = av_realloc(pkt->side_data, (elems + 1) * sizeof(*tmp));
217cabdff1aSopenharmony_ci    if (!tmp)
218cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
219cabdff1aSopenharmony_ci
220cabdff1aSopenharmony_ci    pkt->side_data = tmp;
221cabdff1aSopenharmony_ci    pkt->side_data[elems].data = data;
222cabdff1aSopenharmony_ci    pkt->side_data[elems].size = size;
223cabdff1aSopenharmony_ci    pkt->side_data[elems].type = type;
224cabdff1aSopenharmony_ci    pkt->side_data_elems++;
225cabdff1aSopenharmony_ci
226cabdff1aSopenharmony_ci    return 0;
227cabdff1aSopenharmony_ci}
228cabdff1aSopenharmony_ci
229cabdff1aSopenharmony_ci
230cabdff1aSopenharmony_ciuint8_t *av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
231cabdff1aSopenharmony_ci                                 size_t size)
232cabdff1aSopenharmony_ci{
233cabdff1aSopenharmony_ci    int ret;
234cabdff1aSopenharmony_ci    uint8_t *data;
235cabdff1aSopenharmony_ci
236cabdff1aSopenharmony_ci    if (size > SIZE_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
237cabdff1aSopenharmony_ci        return NULL;
238cabdff1aSopenharmony_ci    data = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
239cabdff1aSopenharmony_ci    if (!data)
240cabdff1aSopenharmony_ci        return NULL;
241cabdff1aSopenharmony_ci
242cabdff1aSopenharmony_ci    ret = av_packet_add_side_data(pkt, type, data, size);
243cabdff1aSopenharmony_ci    if (ret < 0) {
244cabdff1aSopenharmony_ci        av_freep(&data);
245cabdff1aSopenharmony_ci        return NULL;
246cabdff1aSopenharmony_ci    }
247cabdff1aSopenharmony_ci
248cabdff1aSopenharmony_ci    return data;
249cabdff1aSopenharmony_ci}
250cabdff1aSopenharmony_ci
251cabdff1aSopenharmony_ciuint8_t *av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type,
252cabdff1aSopenharmony_ci                                 size_t *size)
253cabdff1aSopenharmony_ci{
254cabdff1aSopenharmony_ci    int i;
255cabdff1aSopenharmony_ci
256cabdff1aSopenharmony_ci    for (i = 0; i < pkt->side_data_elems; i++) {
257cabdff1aSopenharmony_ci        if (pkt->side_data[i].type == type) {
258cabdff1aSopenharmony_ci            if (size)
259cabdff1aSopenharmony_ci                *size = pkt->side_data[i].size;
260cabdff1aSopenharmony_ci            return pkt->side_data[i].data;
261cabdff1aSopenharmony_ci        }
262cabdff1aSopenharmony_ci    }
263cabdff1aSopenharmony_ci    if (size)
264cabdff1aSopenharmony_ci        *size = 0;
265cabdff1aSopenharmony_ci    return NULL;
266cabdff1aSopenharmony_ci}
267cabdff1aSopenharmony_ci
268cabdff1aSopenharmony_ciconst char *av_packet_side_data_name(enum AVPacketSideDataType type)
269cabdff1aSopenharmony_ci{
270cabdff1aSopenharmony_ci    switch(type) {
271cabdff1aSopenharmony_ci    case AV_PKT_DATA_PALETTE:                    return "Palette";
272cabdff1aSopenharmony_ci    case AV_PKT_DATA_NEW_EXTRADATA:              return "New Extradata";
273cabdff1aSopenharmony_ci    case AV_PKT_DATA_PARAM_CHANGE:               return "Param Change";
274cabdff1aSopenharmony_ci    case AV_PKT_DATA_H263_MB_INFO:               return "H263 MB Info";
275cabdff1aSopenharmony_ci    case AV_PKT_DATA_REPLAYGAIN:                 return "Replay Gain";
276cabdff1aSopenharmony_ci    case AV_PKT_DATA_DISPLAYMATRIX:              return "Display Matrix";
277cabdff1aSopenharmony_ci    case AV_PKT_DATA_STEREO3D:                   return "Stereo 3D";
278cabdff1aSopenharmony_ci    case AV_PKT_DATA_AUDIO_SERVICE_TYPE:         return "Audio Service Type";
279cabdff1aSopenharmony_ci    case AV_PKT_DATA_QUALITY_STATS:              return "Quality stats";
280cabdff1aSopenharmony_ci    case AV_PKT_DATA_FALLBACK_TRACK:             return "Fallback track";
281cabdff1aSopenharmony_ci    case AV_PKT_DATA_CPB_PROPERTIES:             return "CPB properties";
282cabdff1aSopenharmony_ci    case AV_PKT_DATA_SKIP_SAMPLES:               return "Skip Samples";
283cabdff1aSopenharmony_ci    case AV_PKT_DATA_JP_DUALMONO:                return "JP Dual Mono";
284cabdff1aSopenharmony_ci    case AV_PKT_DATA_STRINGS_METADATA:           return "Strings Metadata";
285cabdff1aSopenharmony_ci    case AV_PKT_DATA_SUBTITLE_POSITION:          return "Subtitle Position";
286cabdff1aSopenharmony_ci    case AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL:   return "Matroska BlockAdditional";
287cabdff1aSopenharmony_ci    case AV_PKT_DATA_WEBVTT_IDENTIFIER:          return "WebVTT ID";
288cabdff1aSopenharmony_ci    case AV_PKT_DATA_WEBVTT_SETTINGS:            return "WebVTT Settings";
289cabdff1aSopenharmony_ci    case AV_PKT_DATA_METADATA_UPDATE:            return "Metadata Update";
290cabdff1aSopenharmony_ci    case AV_PKT_DATA_MPEGTS_STREAM_ID:           return "MPEGTS Stream ID";
291cabdff1aSopenharmony_ci    case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display metadata";
292cabdff1aSopenharmony_ci    case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:        return "Content light level metadata";
293cabdff1aSopenharmony_ci    case AV_PKT_DATA_SPHERICAL:                  return "Spherical Mapping";
294cabdff1aSopenharmony_ci    case AV_PKT_DATA_A53_CC:                     return "A53 Closed Captions";
295cabdff1aSopenharmony_ci    case AV_PKT_DATA_ENCRYPTION_INIT_INFO:       return "Encryption initialization data";
296cabdff1aSopenharmony_ci    case AV_PKT_DATA_ENCRYPTION_INFO:            return "Encryption info";
297cabdff1aSopenharmony_ci    case AV_PKT_DATA_AFD:                        return "Active Format Description data";
298cabdff1aSopenharmony_ci    case AV_PKT_DATA_PRFT:                       return "Producer Reference Time";
299cabdff1aSopenharmony_ci    case AV_PKT_DATA_ICC_PROFILE:                return "ICC Profile";
300cabdff1aSopenharmony_ci    case AV_PKT_DATA_DOVI_CONF:                  return "DOVI configuration record";
301cabdff1aSopenharmony_ci    case AV_PKT_DATA_S12M_TIMECODE:              return "SMPTE ST 12-1:2014 timecode";
302cabdff1aSopenharmony_ci    case AV_PKT_DATA_DYNAMIC_HDR10_PLUS:         return "HDR10+ Dynamic Metadata (SMPTE 2094-40)";
303cabdff1aSopenharmony_ci    }
304cabdff1aSopenharmony_ci    return NULL;
305cabdff1aSopenharmony_ci}
306cabdff1aSopenharmony_ci
307cabdff1aSopenharmony_ciuint8_t *av_packet_pack_dictionary(AVDictionary *dict, size_t *size)
308cabdff1aSopenharmony_ci{
309cabdff1aSopenharmony_ci    uint8_t *data = NULL;
310cabdff1aSopenharmony_ci    *size = 0;
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci    if (!dict)
313cabdff1aSopenharmony_ci        return NULL;
314cabdff1aSopenharmony_ci
315cabdff1aSopenharmony_ci    for (int pass = 0; pass < 2; pass++) {
316cabdff1aSopenharmony_ci        const AVDictionaryEntry *t = NULL;
317cabdff1aSopenharmony_ci        size_t total_length = 0;
318cabdff1aSopenharmony_ci
319cabdff1aSopenharmony_ci        while ((t = av_dict_get(dict, "", t, AV_DICT_IGNORE_SUFFIX))) {
320cabdff1aSopenharmony_ci            for (int i = 0; i < 2; i++) {
321cabdff1aSopenharmony_ci                const char  *str = i ? t->value : t->key;
322cabdff1aSopenharmony_ci                const size_t len = strlen(str) + 1;
323cabdff1aSopenharmony_ci
324cabdff1aSopenharmony_ci                if (pass)
325cabdff1aSopenharmony_ci                    memcpy(data + total_length, str, len);
326cabdff1aSopenharmony_ci                else if (len > SIZE_MAX - total_length)
327cabdff1aSopenharmony_ci                    return NULL;
328cabdff1aSopenharmony_ci                total_length += len;
329cabdff1aSopenharmony_ci            }
330cabdff1aSopenharmony_ci        }
331cabdff1aSopenharmony_ci        if (pass)
332cabdff1aSopenharmony_ci            break;
333cabdff1aSopenharmony_ci        data = av_malloc(total_length);
334cabdff1aSopenharmony_ci        if (!data)
335cabdff1aSopenharmony_ci            return NULL;
336cabdff1aSopenharmony_ci        *size = total_length;
337cabdff1aSopenharmony_ci    }
338cabdff1aSopenharmony_ci
339cabdff1aSopenharmony_ci    return data;
340cabdff1aSopenharmony_ci}
341cabdff1aSopenharmony_ci
342cabdff1aSopenharmony_ciint av_packet_unpack_dictionary(const uint8_t *data, size_t size,
343cabdff1aSopenharmony_ci                                AVDictionary **dict)
344cabdff1aSopenharmony_ci{
345cabdff1aSopenharmony_ci    const uint8_t *end;
346cabdff1aSopenharmony_ci    int ret;
347cabdff1aSopenharmony_ci
348cabdff1aSopenharmony_ci    if (!dict || !data || !size)
349cabdff1aSopenharmony_ci        return 0;
350cabdff1aSopenharmony_ci    end = data + size;
351cabdff1aSopenharmony_ci    if (size && end[-1])
352cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
353cabdff1aSopenharmony_ci    while (data < end) {
354cabdff1aSopenharmony_ci        const uint8_t *key = data;
355cabdff1aSopenharmony_ci        const uint8_t *val = data + strlen(key) + 1;
356cabdff1aSopenharmony_ci
357cabdff1aSopenharmony_ci        if (val >= end || !*key)
358cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_ci        ret = av_dict_set(dict, key, val, 0);
361cabdff1aSopenharmony_ci        if (ret < 0)
362cabdff1aSopenharmony_ci            return ret;
363cabdff1aSopenharmony_ci        data = val + strlen(val) + 1;
364cabdff1aSopenharmony_ci    }
365cabdff1aSopenharmony_ci
366cabdff1aSopenharmony_ci    return 0;
367cabdff1aSopenharmony_ci}
368cabdff1aSopenharmony_ci
369cabdff1aSopenharmony_ciint av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
370cabdff1aSopenharmony_ci                               size_t size)
371cabdff1aSopenharmony_ci{
372cabdff1aSopenharmony_ci    int i;
373cabdff1aSopenharmony_ci
374cabdff1aSopenharmony_ci    for (i = 0; i < pkt->side_data_elems; i++) {
375cabdff1aSopenharmony_ci        if (pkt->side_data[i].type == type) {
376cabdff1aSopenharmony_ci            if (size > pkt->side_data[i].size)
377cabdff1aSopenharmony_ci                return AVERROR(ENOMEM);
378cabdff1aSopenharmony_ci            pkt->side_data[i].size = size;
379cabdff1aSopenharmony_ci            return 0;
380cabdff1aSopenharmony_ci        }
381cabdff1aSopenharmony_ci    }
382cabdff1aSopenharmony_ci    return AVERROR(ENOENT);
383cabdff1aSopenharmony_ci}
384cabdff1aSopenharmony_ci
385cabdff1aSopenharmony_ciint av_packet_copy_props(AVPacket *dst, const AVPacket *src)
386cabdff1aSopenharmony_ci{
387cabdff1aSopenharmony_ci    int i, ret;
388cabdff1aSopenharmony_ci
389cabdff1aSopenharmony_ci    dst->pts                  = src->pts;
390cabdff1aSopenharmony_ci    dst->dts                  = src->dts;
391cabdff1aSopenharmony_ci    dst->pos                  = src->pos;
392cabdff1aSopenharmony_ci    dst->duration             = src->duration;
393cabdff1aSopenharmony_ci    dst->flags                = src->flags;
394cabdff1aSopenharmony_ci    dst->stream_index         = src->stream_index;
395cabdff1aSopenharmony_ci    dst->opaque               = src->opaque;
396cabdff1aSopenharmony_ci    dst->time_base            = src->time_base;
397cabdff1aSopenharmony_ci    dst->opaque_ref           = NULL;
398cabdff1aSopenharmony_ci    dst->side_data            = NULL;
399cabdff1aSopenharmony_ci    dst->side_data_elems      = 0;
400cabdff1aSopenharmony_ci
401cabdff1aSopenharmony_ci    ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref);
402cabdff1aSopenharmony_ci    if (ret < 0)
403cabdff1aSopenharmony_ci        return ret;
404cabdff1aSopenharmony_ci
405cabdff1aSopenharmony_ci    for (i = 0; i < src->side_data_elems; i++) {
406cabdff1aSopenharmony_ci        enum AVPacketSideDataType type = src->side_data[i].type;
407cabdff1aSopenharmony_ci        size_t size = src->side_data[i].size;
408cabdff1aSopenharmony_ci        uint8_t *src_data = src->side_data[i].data;
409cabdff1aSopenharmony_ci        uint8_t *dst_data = av_packet_new_side_data(dst, type, size);
410cabdff1aSopenharmony_ci
411cabdff1aSopenharmony_ci        if (!dst_data) {
412cabdff1aSopenharmony_ci            av_buffer_unref(&dst->opaque_ref);
413cabdff1aSopenharmony_ci            av_packet_free_side_data(dst);
414cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
415cabdff1aSopenharmony_ci        }
416cabdff1aSopenharmony_ci        memcpy(dst_data, src_data, size);
417cabdff1aSopenharmony_ci    }
418cabdff1aSopenharmony_ci
419cabdff1aSopenharmony_ci    return 0;
420cabdff1aSopenharmony_ci}
421cabdff1aSopenharmony_ci
422cabdff1aSopenharmony_civoid av_packet_unref(AVPacket *pkt)
423cabdff1aSopenharmony_ci{
424cabdff1aSopenharmony_ci    av_packet_free_side_data(pkt);
425cabdff1aSopenharmony_ci    av_buffer_unref(&pkt->opaque_ref);
426cabdff1aSopenharmony_ci    av_buffer_unref(&pkt->buf);
427cabdff1aSopenharmony_ci    get_packet_defaults(pkt);
428cabdff1aSopenharmony_ci}
429cabdff1aSopenharmony_ci
430cabdff1aSopenharmony_ciint av_packet_ref(AVPacket *dst, const AVPacket *src)
431cabdff1aSopenharmony_ci{
432cabdff1aSopenharmony_ci    int ret;
433cabdff1aSopenharmony_ci
434cabdff1aSopenharmony_ci    dst->buf = NULL;
435cabdff1aSopenharmony_ci
436cabdff1aSopenharmony_ci    ret = av_packet_copy_props(dst, src);
437cabdff1aSopenharmony_ci    if (ret < 0)
438cabdff1aSopenharmony_ci        goto fail;
439cabdff1aSopenharmony_ci
440cabdff1aSopenharmony_ci    if (!src->buf) {
441cabdff1aSopenharmony_ci        ret = packet_alloc(&dst->buf, src->size);
442cabdff1aSopenharmony_ci        if (ret < 0)
443cabdff1aSopenharmony_ci            goto fail;
444cabdff1aSopenharmony_ci        av_assert1(!src->size || src->data);
445cabdff1aSopenharmony_ci        if (src->size)
446cabdff1aSopenharmony_ci            memcpy(dst->buf->data, src->data, src->size);
447cabdff1aSopenharmony_ci
448cabdff1aSopenharmony_ci        dst->data = dst->buf->data;
449cabdff1aSopenharmony_ci    } else {
450cabdff1aSopenharmony_ci        dst->buf = av_buffer_ref(src->buf);
451cabdff1aSopenharmony_ci        if (!dst->buf) {
452cabdff1aSopenharmony_ci            ret = AVERROR(ENOMEM);
453cabdff1aSopenharmony_ci            goto fail;
454cabdff1aSopenharmony_ci        }
455cabdff1aSopenharmony_ci        dst->data = src->data;
456cabdff1aSopenharmony_ci    }
457cabdff1aSopenharmony_ci
458cabdff1aSopenharmony_ci    dst->size = src->size;
459cabdff1aSopenharmony_ci
460cabdff1aSopenharmony_ci    return 0;
461cabdff1aSopenharmony_cifail:
462cabdff1aSopenharmony_ci    av_packet_unref(dst);
463cabdff1aSopenharmony_ci    return ret;
464cabdff1aSopenharmony_ci}
465cabdff1aSopenharmony_ci
466cabdff1aSopenharmony_ciAVPacket *av_packet_clone(const AVPacket *src)
467cabdff1aSopenharmony_ci{
468cabdff1aSopenharmony_ci    AVPacket *ret = av_packet_alloc();
469cabdff1aSopenharmony_ci
470cabdff1aSopenharmony_ci    if (!ret)
471cabdff1aSopenharmony_ci        return ret;
472cabdff1aSopenharmony_ci
473cabdff1aSopenharmony_ci    if (av_packet_ref(ret, src))
474cabdff1aSopenharmony_ci        av_packet_free(&ret);
475cabdff1aSopenharmony_ci
476cabdff1aSopenharmony_ci    return ret;
477cabdff1aSopenharmony_ci}
478cabdff1aSopenharmony_ci
479cabdff1aSopenharmony_civoid av_packet_move_ref(AVPacket *dst, AVPacket *src)
480cabdff1aSopenharmony_ci{
481cabdff1aSopenharmony_ci    *dst = *src;
482cabdff1aSopenharmony_ci    get_packet_defaults(src);
483cabdff1aSopenharmony_ci}
484cabdff1aSopenharmony_ci
485cabdff1aSopenharmony_ciint av_packet_make_refcounted(AVPacket *pkt)
486cabdff1aSopenharmony_ci{
487cabdff1aSopenharmony_ci    int ret;
488cabdff1aSopenharmony_ci
489cabdff1aSopenharmony_ci    if (pkt->buf)
490cabdff1aSopenharmony_ci        return 0;
491cabdff1aSopenharmony_ci
492cabdff1aSopenharmony_ci    ret = packet_alloc(&pkt->buf, pkt->size);
493cabdff1aSopenharmony_ci    if (ret < 0)
494cabdff1aSopenharmony_ci        return ret;
495cabdff1aSopenharmony_ci    av_assert1(!pkt->size || pkt->data);
496cabdff1aSopenharmony_ci    if (pkt->size)
497cabdff1aSopenharmony_ci        memcpy(pkt->buf->data, pkt->data, pkt->size);
498cabdff1aSopenharmony_ci
499cabdff1aSopenharmony_ci    pkt->data = pkt->buf->data;
500cabdff1aSopenharmony_ci
501cabdff1aSopenharmony_ci    return 0;
502cabdff1aSopenharmony_ci}
503cabdff1aSopenharmony_ci
504cabdff1aSopenharmony_ciint av_packet_make_writable(AVPacket *pkt)
505cabdff1aSopenharmony_ci{
506cabdff1aSopenharmony_ci    AVBufferRef *buf = NULL;
507cabdff1aSopenharmony_ci    int ret;
508cabdff1aSopenharmony_ci
509cabdff1aSopenharmony_ci    if (pkt->buf && av_buffer_is_writable(pkt->buf))
510cabdff1aSopenharmony_ci        return 0;
511cabdff1aSopenharmony_ci
512cabdff1aSopenharmony_ci    ret = packet_alloc(&buf, pkt->size);
513cabdff1aSopenharmony_ci    if (ret < 0)
514cabdff1aSopenharmony_ci        return ret;
515cabdff1aSopenharmony_ci    av_assert1(!pkt->size || pkt->data);
516cabdff1aSopenharmony_ci    if (pkt->size)
517cabdff1aSopenharmony_ci        memcpy(buf->data, pkt->data, pkt->size);
518cabdff1aSopenharmony_ci
519cabdff1aSopenharmony_ci    av_buffer_unref(&pkt->buf);
520cabdff1aSopenharmony_ci    pkt->buf  = buf;
521cabdff1aSopenharmony_ci    pkt->data = buf->data;
522cabdff1aSopenharmony_ci
523cabdff1aSopenharmony_ci    return 0;
524cabdff1aSopenharmony_ci}
525cabdff1aSopenharmony_ci
526cabdff1aSopenharmony_civoid av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb)
527cabdff1aSopenharmony_ci{
528cabdff1aSopenharmony_ci    if (pkt->pts != AV_NOPTS_VALUE)
529cabdff1aSopenharmony_ci        pkt->pts = av_rescale_q(pkt->pts, src_tb, dst_tb);
530cabdff1aSopenharmony_ci    if (pkt->dts != AV_NOPTS_VALUE)
531cabdff1aSopenharmony_ci        pkt->dts = av_rescale_q(pkt->dts, src_tb, dst_tb);
532cabdff1aSopenharmony_ci    if (pkt->duration > 0)
533cabdff1aSopenharmony_ci        pkt->duration = av_rescale_q(pkt->duration, src_tb, dst_tb);
534cabdff1aSopenharmony_ci}
535cabdff1aSopenharmony_ci
536cabdff1aSopenharmony_ciint avpriv_packet_list_put(PacketList *packet_buffer,
537cabdff1aSopenharmony_ci                           AVPacket      *pkt,
538cabdff1aSopenharmony_ci                           int (*copy)(AVPacket *dst, const AVPacket *src),
539cabdff1aSopenharmony_ci                           int flags)
540cabdff1aSopenharmony_ci{
541cabdff1aSopenharmony_ci    PacketListEntry *pktl = av_malloc(sizeof(*pktl));
542cabdff1aSopenharmony_ci    int ret;
543cabdff1aSopenharmony_ci
544cabdff1aSopenharmony_ci    if (!pktl)
545cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
546cabdff1aSopenharmony_ci
547cabdff1aSopenharmony_ci    if (copy) {
548cabdff1aSopenharmony_ci        get_packet_defaults(&pktl->pkt);
549cabdff1aSopenharmony_ci        ret = copy(&pktl->pkt, pkt);
550cabdff1aSopenharmony_ci        if (ret < 0) {
551cabdff1aSopenharmony_ci            av_free(pktl);
552cabdff1aSopenharmony_ci            return ret;
553cabdff1aSopenharmony_ci        }
554cabdff1aSopenharmony_ci    } else {
555cabdff1aSopenharmony_ci        ret = av_packet_make_refcounted(pkt);
556cabdff1aSopenharmony_ci        if (ret < 0) {
557cabdff1aSopenharmony_ci            av_free(pktl);
558cabdff1aSopenharmony_ci            return ret;
559cabdff1aSopenharmony_ci        }
560cabdff1aSopenharmony_ci        av_packet_move_ref(&pktl->pkt, pkt);
561cabdff1aSopenharmony_ci    }
562cabdff1aSopenharmony_ci
563cabdff1aSopenharmony_ci    pktl->next = NULL;
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_ci    if (packet_buffer->head)
566cabdff1aSopenharmony_ci        packet_buffer->tail->next = pktl;
567cabdff1aSopenharmony_ci    else
568cabdff1aSopenharmony_ci        packet_buffer->head = pktl;
569cabdff1aSopenharmony_ci
570cabdff1aSopenharmony_ci    /* Add the packet in the buffered packet list. */
571cabdff1aSopenharmony_ci    packet_buffer->tail = pktl;
572cabdff1aSopenharmony_ci    return 0;
573cabdff1aSopenharmony_ci}
574cabdff1aSopenharmony_ci
575cabdff1aSopenharmony_ciint avpriv_packet_list_get(PacketList *pkt_buffer,
576cabdff1aSopenharmony_ci                           AVPacket      *pkt)
577cabdff1aSopenharmony_ci{
578cabdff1aSopenharmony_ci    PacketListEntry *pktl = pkt_buffer->head;
579cabdff1aSopenharmony_ci    if (!pktl)
580cabdff1aSopenharmony_ci        return AVERROR(EAGAIN);
581cabdff1aSopenharmony_ci    *pkt        = pktl->pkt;
582cabdff1aSopenharmony_ci    pkt_buffer->head = pktl->next;
583cabdff1aSopenharmony_ci    if (!pkt_buffer->head)
584cabdff1aSopenharmony_ci        pkt_buffer->tail = NULL;
585cabdff1aSopenharmony_ci    av_freep(&pktl);
586cabdff1aSopenharmony_ci    return 0;
587cabdff1aSopenharmony_ci}
588cabdff1aSopenharmony_ci
589cabdff1aSopenharmony_civoid avpriv_packet_list_free(PacketList *pkt_buf)
590cabdff1aSopenharmony_ci{
591cabdff1aSopenharmony_ci    PacketListEntry *tmp = pkt_buf->head;
592cabdff1aSopenharmony_ci
593cabdff1aSopenharmony_ci    while (tmp) {
594cabdff1aSopenharmony_ci        PacketListEntry *pktl = tmp;
595cabdff1aSopenharmony_ci        tmp = pktl->next;
596cabdff1aSopenharmony_ci        av_packet_unref(&pktl->pkt);
597cabdff1aSopenharmony_ci        av_freep(&pktl);
598cabdff1aSopenharmony_ci    }
599cabdff1aSopenharmony_ci    pkt_buf->head = pkt_buf->tail = NULL;
600cabdff1aSopenharmony_ci}
601cabdff1aSopenharmony_ci
602cabdff1aSopenharmony_ciint ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
603cabdff1aSopenharmony_ci{
604cabdff1aSopenharmony_ci    uint8_t *side_data;
605cabdff1aSopenharmony_ci    size_t side_data_size;
606cabdff1aSopenharmony_ci    int i;
607cabdff1aSopenharmony_ci
608cabdff1aSopenharmony_ci    side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_QUALITY_STATS, &side_data_size);
609cabdff1aSopenharmony_ci    if (!side_data) {
610cabdff1aSopenharmony_ci        side_data_size = 4+4+8*error_count;
611cabdff1aSopenharmony_ci        side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_STATS,
612cabdff1aSopenharmony_ci                                            side_data_size);
613cabdff1aSopenharmony_ci    }
614cabdff1aSopenharmony_ci
615cabdff1aSopenharmony_ci    if (!side_data || side_data_size < 4+4+8*error_count)
616cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
617cabdff1aSopenharmony_ci
618cabdff1aSopenharmony_ci    AV_WL32(side_data   , quality  );
619cabdff1aSopenharmony_ci    side_data[4] = pict_type;
620cabdff1aSopenharmony_ci    side_data[5] = error_count;
621cabdff1aSopenharmony_ci    for (i = 0; i<error_count; i++)
622cabdff1aSopenharmony_ci        AV_WL64(side_data+8 + 8*i , error[i]);
623cabdff1aSopenharmony_ci
624cabdff1aSopenharmony_ci    return 0;
625cabdff1aSopenharmony_ci}
626cabdff1aSopenharmony_ci
627cabdff1aSopenharmony_ciint ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp)
628cabdff1aSopenharmony_ci{
629cabdff1aSopenharmony_ci    AVProducerReferenceTime *prft;
630cabdff1aSopenharmony_ci    uint8_t *side_data;
631cabdff1aSopenharmony_ci    size_t side_data_size;
632cabdff1aSopenharmony_ci
633cabdff1aSopenharmony_ci    side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &side_data_size);
634cabdff1aSopenharmony_ci    if (!side_data) {
635cabdff1aSopenharmony_ci        side_data_size = sizeof(AVProducerReferenceTime);
636cabdff1aSopenharmony_ci        side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_PRFT, side_data_size);
637cabdff1aSopenharmony_ci    }
638cabdff1aSopenharmony_ci
639cabdff1aSopenharmony_ci    if (!side_data || side_data_size < sizeof(AVProducerReferenceTime))
640cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
641cabdff1aSopenharmony_ci
642cabdff1aSopenharmony_ci    prft = (AVProducerReferenceTime *)side_data;
643cabdff1aSopenharmony_ci    prft->wallclock = timestamp;
644cabdff1aSopenharmony_ci    prft->flags = 0;
645cabdff1aSopenharmony_ci
646cabdff1aSopenharmony_ci    return 0;
647cabdff1aSopenharmony_ci}
648