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 AVCODEC_CBS_H 20cabdff1aSopenharmony_ci#define AVCODEC_CBS_H 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include <stddef.h> 23cabdff1aSopenharmony_ci#include <stdint.h> 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "libavutil/buffer.h" 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "codec_id.h" 28cabdff1aSopenharmony_ci#include "codec_par.h" 29cabdff1aSopenharmony_ci#include "packet.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci/* 33cabdff1aSopenharmony_ci * This defines a framework for converting between a coded bitstream 34cabdff1aSopenharmony_ci * and structures defining all individual syntax elements found in 35cabdff1aSopenharmony_ci * such a stream. 36cabdff1aSopenharmony_ci * 37cabdff1aSopenharmony_ci * Conversion in both directions is possible. Given a coded bitstream 38cabdff1aSopenharmony_ci * (any meaningful fragment), it can be parsed and decomposed into 39cabdff1aSopenharmony_ci * syntax elements stored in a set of codec-specific structures. 40cabdff1aSopenharmony_ci * Similarly, given a set of those same codec-specific structures the 41cabdff1aSopenharmony_ci * syntax elements can be serialised and combined to create a coded 42cabdff1aSopenharmony_ci * bitstream. 43cabdff1aSopenharmony_ci */ 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_cistruct AVCodecContext; 46cabdff1aSopenharmony_cistruct CodedBitstreamType; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci/** 49cabdff1aSopenharmony_ci * The codec-specific type of a bitstream unit. 50cabdff1aSopenharmony_ci * 51cabdff1aSopenharmony_ci * AV1: obu_type 52cabdff1aSopenharmony_ci * H.264 / AVC: nal_unit_type 53cabdff1aSopenharmony_ci * H.265 / HEVC: nal_unit_type 54cabdff1aSopenharmony_ci * JPEG: marker value (without 0xff prefix) 55cabdff1aSopenharmony_ci * MPEG-2: start code value (without prefix) 56cabdff1aSopenharmony_ci * VP9: unused, set to zero (every unit is a frame) 57cabdff1aSopenharmony_ci */ 58cabdff1aSopenharmony_citypedef uint32_t CodedBitstreamUnitType; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci/** 61cabdff1aSopenharmony_ci * Coded bitstream unit structure. 62cabdff1aSopenharmony_ci * 63cabdff1aSopenharmony_ci * A bitstream unit the smallest element of a bitstream which 64cabdff1aSopenharmony_ci * is meaningful on its own. For example, an H.264 NAL unit. 65cabdff1aSopenharmony_ci * 66cabdff1aSopenharmony_ci * See the codec-specific header for the meaning of this for any 67cabdff1aSopenharmony_ci * particular codec. 68cabdff1aSopenharmony_ci */ 69cabdff1aSopenharmony_citypedef struct CodedBitstreamUnit { 70cabdff1aSopenharmony_ci /** 71cabdff1aSopenharmony_ci * Codec-specific type of this unit. 72cabdff1aSopenharmony_ci */ 73cabdff1aSopenharmony_ci CodedBitstreamUnitType type; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci /** 76cabdff1aSopenharmony_ci * Pointer to the directly-parsable bitstream form of this unit. 77cabdff1aSopenharmony_ci * 78cabdff1aSopenharmony_ci * May be NULL if the unit currently only exists in decomposed form. 79cabdff1aSopenharmony_ci */ 80cabdff1aSopenharmony_ci uint8_t *data; 81cabdff1aSopenharmony_ci /** 82cabdff1aSopenharmony_ci * The number of bytes in the bitstream (including any padding bits 83cabdff1aSopenharmony_ci * in the final byte). 84cabdff1aSopenharmony_ci */ 85cabdff1aSopenharmony_ci size_t data_size; 86cabdff1aSopenharmony_ci /** 87cabdff1aSopenharmony_ci * The number of bits which should be ignored in the final byte. 88cabdff1aSopenharmony_ci * 89cabdff1aSopenharmony_ci * This supports non-byte-aligned bitstreams. 90cabdff1aSopenharmony_ci */ 91cabdff1aSopenharmony_ci size_t data_bit_padding; 92cabdff1aSopenharmony_ci /** 93cabdff1aSopenharmony_ci * A reference to the buffer containing data. 94cabdff1aSopenharmony_ci * 95cabdff1aSopenharmony_ci * Must be set if data is not NULL. 96cabdff1aSopenharmony_ci */ 97cabdff1aSopenharmony_ci AVBufferRef *data_ref; 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci /** 100cabdff1aSopenharmony_ci * Pointer to the decomposed form of this unit. 101cabdff1aSopenharmony_ci * 102cabdff1aSopenharmony_ci * The type of this structure depends on both the codec and the 103cabdff1aSopenharmony_ci * type of this unit. May be NULL if the unit only exists in 104cabdff1aSopenharmony_ci * bitstream form. 105cabdff1aSopenharmony_ci */ 106cabdff1aSopenharmony_ci void *content; 107cabdff1aSopenharmony_ci /** 108cabdff1aSopenharmony_ci * If content is reference counted, a reference to the buffer containing 109cabdff1aSopenharmony_ci * content. Null if content is not reference counted. 110cabdff1aSopenharmony_ci */ 111cabdff1aSopenharmony_ci AVBufferRef *content_ref; 112cabdff1aSopenharmony_ci} CodedBitstreamUnit; 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci/** 115cabdff1aSopenharmony_ci * Coded bitstream fragment structure, combining one or more units. 116cabdff1aSopenharmony_ci * 117cabdff1aSopenharmony_ci * This is any sequence of units. It need not form some greater whole, 118cabdff1aSopenharmony_ci * though in many cases it will. For example, an H.264 access unit, 119cabdff1aSopenharmony_ci * which is composed of a sequence of H.264 NAL units. 120cabdff1aSopenharmony_ci */ 121cabdff1aSopenharmony_citypedef struct CodedBitstreamFragment { 122cabdff1aSopenharmony_ci /** 123cabdff1aSopenharmony_ci * Pointer to the bitstream form of this fragment. 124cabdff1aSopenharmony_ci * 125cabdff1aSopenharmony_ci * May be NULL if the fragment only exists as component units. 126cabdff1aSopenharmony_ci */ 127cabdff1aSopenharmony_ci uint8_t *data; 128cabdff1aSopenharmony_ci /** 129cabdff1aSopenharmony_ci * The number of bytes in the bitstream. 130cabdff1aSopenharmony_ci * 131cabdff1aSopenharmony_ci * The number of bytes in the bitstream (including any padding bits 132cabdff1aSopenharmony_ci * in the final byte). 133cabdff1aSopenharmony_ci */ 134cabdff1aSopenharmony_ci size_t data_size; 135cabdff1aSopenharmony_ci /** 136cabdff1aSopenharmony_ci * The number of bits which should be ignored in the final byte. 137cabdff1aSopenharmony_ci */ 138cabdff1aSopenharmony_ci size_t data_bit_padding; 139cabdff1aSopenharmony_ci /** 140cabdff1aSopenharmony_ci * A reference to the buffer containing data. 141cabdff1aSopenharmony_ci * 142cabdff1aSopenharmony_ci * Must be set if data is not NULL. 143cabdff1aSopenharmony_ci */ 144cabdff1aSopenharmony_ci AVBufferRef *data_ref; 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci /** 147cabdff1aSopenharmony_ci * Number of units in this fragment. 148cabdff1aSopenharmony_ci * 149cabdff1aSopenharmony_ci * This may be zero if the fragment only exists in bitstream form 150cabdff1aSopenharmony_ci * and has not been decomposed. 151cabdff1aSopenharmony_ci */ 152cabdff1aSopenharmony_ci int nb_units; 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci /** 155cabdff1aSopenharmony_ci * Number of allocated units. 156cabdff1aSopenharmony_ci * 157cabdff1aSopenharmony_ci * Must always be >= nb_units; designed for internal use by cbs. 158cabdff1aSopenharmony_ci */ 159cabdff1aSopenharmony_ci int nb_units_allocated; 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_ci /** 162cabdff1aSopenharmony_ci * Pointer to an array of units of length nb_units_allocated. 163cabdff1aSopenharmony_ci * Only the first nb_units are valid. 164cabdff1aSopenharmony_ci * 165cabdff1aSopenharmony_ci * Must be NULL if nb_units_allocated is zero. 166cabdff1aSopenharmony_ci */ 167cabdff1aSopenharmony_ci CodedBitstreamUnit *units; 168cabdff1aSopenharmony_ci} CodedBitstreamFragment; 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci/** 171cabdff1aSopenharmony_ci * Context structure for coded bitstream operations. 172cabdff1aSopenharmony_ci */ 173cabdff1aSopenharmony_citypedef struct CodedBitstreamContext { 174cabdff1aSopenharmony_ci /** 175cabdff1aSopenharmony_ci * Logging context to be passed to all av_log() calls associated 176cabdff1aSopenharmony_ci * with this context. 177cabdff1aSopenharmony_ci */ 178cabdff1aSopenharmony_ci void *log_ctx; 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ci /** 181cabdff1aSopenharmony_ci * Internal codec-specific hooks. 182cabdff1aSopenharmony_ci */ 183cabdff1aSopenharmony_ci const struct CodedBitstreamType *codec; 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_ci /** 186cabdff1aSopenharmony_ci * Internal codec-specific data. 187cabdff1aSopenharmony_ci * 188cabdff1aSopenharmony_ci * This contains any information needed when reading/writing 189cabdff1aSopenharmony_ci * bitsteams which will not necessarily be present in a fragment. 190cabdff1aSopenharmony_ci * For example, for H.264 it contains all currently visible 191cabdff1aSopenharmony_ci * parameter sets - they are required to determine the bitstream 192cabdff1aSopenharmony_ci * syntax but need not be present in every access unit. 193cabdff1aSopenharmony_ci */ 194cabdff1aSopenharmony_ci void *priv_data; 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_ci /** 197cabdff1aSopenharmony_ci * Array of unit types which should be decomposed when reading. 198cabdff1aSopenharmony_ci * 199cabdff1aSopenharmony_ci * Types not in this list will be available in bitstream form only. 200cabdff1aSopenharmony_ci * If NULL, all supported types will be decomposed. 201cabdff1aSopenharmony_ci */ 202cabdff1aSopenharmony_ci const CodedBitstreamUnitType *decompose_unit_types; 203cabdff1aSopenharmony_ci /** 204cabdff1aSopenharmony_ci * Length of the decompose_unit_types array. 205cabdff1aSopenharmony_ci */ 206cabdff1aSopenharmony_ci int nb_decompose_unit_types; 207cabdff1aSopenharmony_ci 208cabdff1aSopenharmony_ci /** 209cabdff1aSopenharmony_ci * Enable trace output during read/write operations. 210cabdff1aSopenharmony_ci */ 211cabdff1aSopenharmony_ci int trace_enable; 212cabdff1aSopenharmony_ci /** 213cabdff1aSopenharmony_ci * Log level to use for trace output. 214cabdff1aSopenharmony_ci * 215cabdff1aSopenharmony_ci * From AV_LOG_*; defaults to AV_LOG_TRACE. 216cabdff1aSopenharmony_ci */ 217cabdff1aSopenharmony_ci int trace_level; 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_ci /** 220cabdff1aSopenharmony_ci * Write buffer. Used as intermediate buffer when writing units. 221cabdff1aSopenharmony_ci * For internal use of cbs only. 222cabdff1aSopenharmony_ci */ 223cabdff1aSopenharmony_ci uint8_t *write_buffer; 224cabdff1aSopenharmony_ci size_t write_buffer_size; 225cabdff1aSopenharmony_ci} CodedBitstreamContext; 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_ci/** 229cabdff1aSopenharmony_ci * Table of all supported codec IDs. 230cabdff1aSopenharmony_ci * 231cabdff1aSopenharmony_ci * Terminated by AV_CODEC_ID_NONE. 232cabdff1aSopenharmony_ci */ 233cabdff1aSopenharmony_ciextern const enum AVCodecID ff_cbs_all_codec_ids[]; 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ci/** 237cabdff1aSopenharmony_ci * Create and initialise a new context for the given codec. 238cabdff1aSopenharmony_ci */ 239cabdff1aSopenharmony_ciint ff_cbs_init(CodedBitstreamContext **ctx, 240cabdff1aSopenharmony_ci enum AVCodecID codec_id, void *log_ctx); 241cabdff1aSopenharmony_ci 242cabdff1aSopenharmony_ci/** 243cabdff1aSopenharmony_ci * Reset all internal state in a context. 244cabdff1aSopenharmony_ci */ 245cabdff1aSopenharmony_civoid ff_cbs_flush(CodedBitstreamContext *ctx); 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci/** 248cabdff1aSopenharmony_ci * Close a context and free all internal state. 249cabdff1aSopenharmony_ci */ 250cabdff1aSopenharmony_civoid ff_cbs_close(CodedBitstreamContext **ctx); 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci 253cabdff1aSopenharmony_ci/** 254cabdff1aSopenharmony_ci * Read the extradata bitstream found in codec parameters into a 255cabdff1aSopenharmony_ci * fragment, then split into units and decompose. 256cabdff1aSopenharmony_ci * 257cabdff1aSopenharmony_ci * This also updates the internal state, so will need to be called for 258cabdff1aSopenharmony_ci * codecs with extradata to read parameter sets necessary for further 259cabdff1aSopenharmony_ci * parsing even if the fragment itself is not desired. 260cabdff1aSopenharmony_ci * 261cabdff1aSopenharmony_ci * The fragment must have been zeroed or reset via ff_cbs_fragment_reset 262cabdff1aSopenharmony_ci * before use. 263cabdff1aSopenharmony_ci */ 264cabdff1aSopenharmony_ciint ff_cbs_read_extradata(CodedBitstreamContext *ctx, 265cabdff1aSopenharmony_ci CodedBitstreamFragment *frag, 266cabdff1aSopenharmony_ci const AVCodecParameters *par); 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ci/** 269cabdff1aSopenharmony_ci * Read the extradata bitstream found in a codec context into a 270cabdff1aSopenharmony_ci * fragment, then split into units and decompose. 271cabdff1aSopenharmony_ci * 272cabdff1aSopenharmony_ci * This acts identical to ff_cbs_read_extradata() for the case where 273cabdff1aSopenharmony_ci * you already have a codec context. 274cabdff1aSopenharmony_ci */ 275cabdff1aSopenharmony_ciint ff_cbs_read_extradata_from_codec(CodedBitstreamContext *ctx, 276cabdff1aSopenharmony_ci CodedBitstreamFragment *frag, 277cabdff1aSopenharmony_ci const struct AVCodecContext *avctx); 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ciint ff_cbs_read_packet_side_data(CodedBitstreamContext *ctx, 280cabdff1aSopenharmony_ci CodedBitstreamFragment *frag, 281cabdff1aSopenharmony_ci const AVPacket *pkt); 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci/** 284cabdff1aSopenharmony_ci * Read the data bitstream from a packet into a fragment, then 285cabdff1aSopenharmony_ci * split into units and decompose. 286cabdff1aSopenharmony_ci * 287cabdff1aSopenharmony_ci * This also updates the internal state of the coded bitstream context 288cabdff1aSopenharmony_ci * with any persistent data from the fragment which may be required to 289cabdff1aSopenharmony_ci * read following fragments (e.g. parameter sets). 290cabdff1aSopenharmony_ci * 291cabdff1aSopenharmony_ci * The fragment must have been zeroed or reset via ff_cbs_fragment_reset 292cabdff1aSopenharmony_ci * before use. 293cabdff1aSopenharmony_ci */ 294cabdff1aSopenharmony_ciint ff_cbs_read_packet(CodedBitstreamContext *ctx, 295cabdff1aSopenharmony_ci CodedBitstreamFragment *frag, 296cabdff1aSopenharmony_ci const AVPacket *pkt); 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci/** 299cabdff1aSopenharmony_ci * Read a bitstream from a memory region into a fragment, then 300cabdff1aSopenharmony_ci * split into units and decompose. 301cabdff1aSopenharmony_ci * 302cabdff1aSopenharmony_ci * This also updates the internal state of the coded bitstream context 303cabdff1aSopenharmony_ci * with any persistent data from the fragment which may be required to 304cabdff1aSopenharmony_ci * read following fragments (e.g. parameter sets). 305cabdff1aSopenharmony_ci * 306cabdff1aSopenharmony_ci * The fragment must have been zeroed or reset via ff_cbs_fragment_reset 307cabdff1aSopenharmony_ci * before use. 308cabdff1aSopenharmony_ci */ 309cabdff1aSopenharmony_ciint ff_cbs_read(CodedBitstreamContext *ctx, 310cabdff1aSopenharmony_ci CodedBitstreamFragment *frag, 311cabdff1aSopenharmony_ci const uint8_t *data, size_t size); 312cabdff1aSopenharmony_ci 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci/** 315cabdff1aSopenharmony_ci * Write the content of the fragment to its own internal buffer. 316cabdff1aSopenharmony_ci * 317cabdff1aSopenharmony_ci * Writes the content of all units and then assembles them into a new 318cabdff1aSopenharmony_ci * data buffer. When modifying the content of decomposed units, this 319cabdff1aSopenharmony_ci * can be used to regenerate the bitstream form of units or the whole 320cabdff1aSopenharmony_ci * fragment so that it can be extracted for other use. 321cabdff1aSopenharmony_ci * 322cabdff1aSopenharmony_ci * This also updates the internal state of the coded bitstream context 323cabdff1aSopenharmony_ci * with any persistent data from the fragment which may be required to 324cabdff1aSopenharmony_ci * write following fragments (e.g. parameter sets). 325cabdff1aSopenharmony_ci */ 326cabdff1aSopenharmony_ciint ff_cbs_write_fragment_data(CodedBitstreamContext *ctx, 327cabdff1aSopenharmony_ci CodedBitstreamFragment *frag); 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci/** 330cabdff1aSopenharmony_ci * Write the bitstream of a fragment to the extradata in codec parameters. 331cabdff1aSopenharmony_ci * 332cabdff1aSopenharmony_ci * Modifies context and fragment as ff_cbs_write_fragment_data does and 333cabdff1aSopenharmony_ci * replaces any existing extradata in the structure. 334cabdff1aSopenharmony_ci */ 335cabdff1aSopenharmony_ciint ff_cbs_write_extradata(CodedBitstreamContext *ctx, 336cabdff1aSopenharmony_ci AVCodecParameters *par, 337cabdff1aSopenharmony_ci CodedBitstreamFragment *frag); 338cabdff1aSopenharmony_ci 339cabdff1aSopenharmony_ci/** 340cabdff1aSopenharmony_ci * Write the bitstream of a fragment to a packet. 341cabdff1aSopenharmony_ci * 342cabdff1aSopenharmony_ci * Modifies context and fragment as ff_cbs_write_fragment_data does. 343cabdff1aSopenharmony_ci * 344cabdff1aSopenharmony_ci * On success, the packet's buf is unreferenced and its buf, data and 345cabdff1aSopenharmony_ci * size fields are set to the corresponding values from the newly updated 346cabdff1aSopenharmony_ci * fragment; other fields are not touched. On failure, the packet is not 347cabdff1aSopenharmony_ci * touched at all. 348cabdff1aSopenharmony_ci */ 349cabdff1aSopenharmony_ciint ff_cbs_write_packet(CodedBitstreamContext *ctx, 350cabdff1aSopenharmony_ci AVPacket *pkt, 351cabdff1aSopenharmony_ci CodedBitstreamFragment *frag); 352cabdff1aSopenharmony_ci 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci/** 355cabdff1aSopenharmony_ci * Free the units contained in a fragment as well as the fragment's 356cabdff1aSopenharmony_ci * own data buffer, but not the units array itself. 357cabdff1aSopenharmony_ci */ 358cabdff1aSopenharmony_civoid ff_cbs_fragment_reset(CodedBitstreamFragment *frag); 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci/** 361cabdff1aSopenharmony_ci * Free the units array of a fragment in addition to what 362cabdff1aSopenharmony_ci * ff_cbs_fragment_reset does. 363cabdff1aSopenharmony_ci */ 364cabdff1aSopenharmony_civoid ff_cbs_fragment_free(CodedBitstreamFragment *frag); 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ci/** 367cabdff1aSopenharmony_ci * Allocate a new internal content buffer of the given size in the unit. 368cabdff1aSopenharmony_ci * 369cabdff1aSopenharmony_ci * The content will be zeroed. 370cabdff1aSopenharmony_ci */ 371cabdff1aSopenharmony_ciint ff_cbs_alloc_unit_content(CodedBitstreamUnit *unit, 372cabdff1aSopenharmony_ci size_t size, 373cabdff1aSopenharmony_ci void (*free)(void *opaque, uint8_t *content)); 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_ci/** 376cabdff1aSopenharmony_ci * Allocate a new internal content buffer matching the type of the unit. 377cabdff1aSopenharmony_ci * 378cabdff1aSopenharmony_ci * The content will be zeroed. 379cabdff1aSopenharmony_ci */ 380cabdff1aSopenharmony_ciint ff_cbs_alloc_unit_content2(CodedBitstreamContext *ctx, 381cabdff1aSopenharmony_ci CodedBitstreamUnit *unit); 382cabdff1aSopenharmony_ci 383cabdff1aSopenharmony_ci/** 384cabdff1aSopenharmony_ci * Insert a new unit into a fragment with the given content. 385cabdff1aSopenharmony_ci * 386cabdff1aSopenharmony_ci * The content structure continues to be owned by the caller if 387cabdff1aSopenharmony_ci * content_buf is not supplied. 388cabdff1aSopenharmony_ci */ 389cabdff1aSopenharmony_ciint ff_cbs_insert_unit_content(CodedBitstreamFragment *frag, 390cabdff1aSopenharmony_ci int position, 391cabdff1aSopenharmony_ci CodedBitstreamUnitType type, 392cabdff1aSopenharmony_ci void *content, 393cabdff1aSopenharmony_ci AVBufferRef *content_buf); 394cabdff1aSopenharmony_ci 395cabdff1aSopenharmony_ci/** 396cabdff1aSopenharmony_ci * Add a new unit to a fragment with the given data bitstream. 397cabdff1aSopenharmony_ci * 398cabdff1aSopenharmony_ci * If data_buf is not supplied then data must have been allocated with 399cabdff1aSopenharmony_ci * av_malloc() and will on success become owned by the unit after this 400cabdff1aSopenharmony_ci * call or freed on error. 401cabdff1aSopenharmony_ci */ 402cabdff1aSopenharmony_ciint ff_cbs_append_unit_data(CodedBitstreamFragment *frag, 403cabdff1aSopenharmony_ci CodedBitstreamUnitType type, 404cabdff1aSopenharmony_ci uint8_t *data, size_t data_size, 405cabdff1aSopenharmony_ci AVBufferRef *data_buf); 406cabdff1aSopenharmony_ci 407cabdff1aSopenharmony_ci/** 408cabdff1aSopenharmony_ci * Delete a unit from a fragment and free all memory it uses. 409cabdff1aSopenharmony_ci * 410cabdff1aSopenharmony_ci * Requires position to be >= 0 and < frag->nb_units. 411cabdff1aSopenharmony_ci */ 412cabdff1aSopenharmony_civoid ff_cbs_delete_unit(CodedBitstreamFragment *frag, 413cabdff1aSopenharmony_ci int position); 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci 416cabdff1aSopenharmony_ci/** 417cabdff1aSopenharmony_ci * Make the content of a unit refcounted. 418cabdff1aSopenharmony_ci * 419cabdff1aSopenharmony_ci * If the unit is not refcounted, this will do a deep copy of the unit 420cabdff1aSopenharmony_ci * content to new refcounted buffers. 421cabdff1aSopenharmony_ci * 422cabdff1aSopenharmony_ci * It is not valid to call this function on a unit which does not have 423cabdff1aSopenharmony_ci * decomposed content. 424cabdff1aSopenharmony_ci */ 425cabdff1aSopenharmony_ciint ff_cbs_make_unit_refcounted(CodedBitstreamContext *ctx, 426cabdff1aSopenharmony_ci CodedBitstreamUnit *unit); 427cabdff1aSopenharmony_ci 428cabdff1aSopenharmony_ci/** 429cabdff1aSopenharmony_ci * Make the content of a unit writable so that internal fields can be 430cabdff1aSopenharmony_ci * modified. 431cabdff1aSopenharmony_ci * 432cabdff1aSopenharmony_ci * If it is known that there are no other references to the content of 433cabdff1aSopenharmony_ci * the unit, does nothing and returns success. Otherwise (including the 434cabdff1aSopenharmony_ci * case where the unit content is not refcounted), it does a full clone 435cabdff1aSopenharmony_ci * of the content (including any internal buffers) to make a new copy, 436cabdff1aSopenharmony_ci * and replaces the existing references inside the unit with that. 437cabdff1aSopenharmony_ci * 438cabdff1aSopenharmony_ci * It is not valid to call this function on a unit which does not have 439cabdff1aSopenharmony_ci * decomposed content. 440cabdff1aSopenharmony_ci */ 441cabdff1aSopenharmony_ciint ff_cbs_make_unit_writable(CodedBitstreamContext *ctx, 442cabdff1aSopenharmony_ci CodedBitstreamUnit *unit); 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_ci#endif /* AVCODEC_CBS_H */ 446