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