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