FFmpeg
Functions | Variables
cbs.c File Reference
#include <string.h>
#include "config.h"
#include "libavutil/avassert.h"
#include "libavutil/buffer.h"
#include "libavutil/common.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "cbs.h"
#include "cbs_internal.h"

Go to the source code of this file.

Functions

int ff_cbs_init (CodedBitstreamContext **ctx_ptr, enum AVCodecID codec_id, void *log_ctx)
 Create and initialise a new context for the given codec. More...
 
void ff_cbs_flush (CodedBitstreamContext *ctx)
 Reset all internal state in a context. More...
 
void ff_cbs_close (CodedBitstreamContext **ctx_ptr)
 Close a context and free all internal state. More...
 
static void cbs_unit_uninit (CodedBitstreamUnit *unit)
 
void ff_cbs_fragment_reset (CodedBitstreamFragment *frag)
 Free the units contained in a fragment as well as the fragment's own data buffer, but not the units array itself. More...
 
void ff_cbs_fragment_free (CodedBitstreamFragment *frag)
 Free the units array of a fragment in addition to what ff_cbs_fragment_reset does. More...
 
static int cbs_read_fragment_content (CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
 
static int cbs_fill_fragment_data (CodedBitstreamFragment *frag, const uint8_t *data, size_t size)
 
static int cbs_read_data (CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, AVBufferRef *buf, const uint8_t *data, size_t size, int header)
 
int ff_cbs_read_extradata (CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVCodecParameters *par)
 Read the extradata bitstream found in codec parameters into a fragment, then split into units and decompose. More...
 
int ff_cbs_read_extradata_from_codec (CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVCodecContext *avctx)
 
int ff_cbs_read_packet (CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVPacket *pkt)
 Read the data bitstream from a packet into a fragment, then split into units and decompose. More...
 
int ff_cbs_read_packet_side_data (CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVPacket *pkt)
 
int ff_cbs_read (CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const uint8_t *data, size_t size)
 Read a bitstream from a memory region into a fragment, then split into units and decompose. More...
 
static int cbs_alloc_unit_data (CodedBitstreamUnit *unit, size_t size)
 Allocate a new internal data buffer of the given size in the unit. More...
 
static int cbs_write_unit_data (CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
 
int ff_cbs_write_fragment_data (CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
 Write the content of the fragment to its own internal buffer. More...
 
int ff_cbs_write_extradata (CodedBitstreamContext *ctx, AVCodecParameters *par, CodedBitstreamFragment *frag)
 Write the bitstream of a fragment to the extradata in codec parameters. More...
 
int ff_cbs_write_packet (CodedBitstreamContext *ctx, AVPacket *pkt, CodedBitstreamFragment *frag)
 Write the bitstream of a fragment to a packet. More...
 
void ff_cbs_trace_header (CodedBitstreamContext *ctx, const char *name)
 
void ff_cbs_trace_syntax_element (CodedBitstreamContext *ctx, int position, const char *str, const int *subscripts, const char *bits, int64_t value)
 
int ff_cbs_read_unsigned (CodedBitstreamContext *ctx, GetBitContext *gbc, int width, const char *name, const int *subscripts, uint32_t *write_to, uint32_t range_min, uint32_t range_max)
 
int ff_cbs_write_unsigned (CodedBitstreamContext *ctx, PutBitContext *pbc, int width, const char *name, const int *subscripts, uint32_t value, uint32_t range_min, uint32_t range_max)
 
int ff_cbs_read_signed (CodedBitstreamContext *ctx, GetBitContext *gbc, int width, const char *name, const int *subscripts, int32_t *write_to, int32_t range_min, int32_t range_max)
 
int ff_cbs_write_signed (CodedBitstreamContext *ctx, PutBitContext *pbc, int width, const char *name, const int *subscripts, int32_t value, int32_t range_min, int32_t range_max)
 
int ff_cbs_alloc_unit_content (CodedBitstreamUnit *unit, size_t size, void(*free)(void *opaque, uint8_t *data))
 
static int cbs_insert_unit (CodedBitstreamFragment *frag, int position)
 
int ff_cbs_insert_unit_content (CodedBitstreamFragment *frag, int position, CodedBitstreamUnitType type, void *content, AVBufferRef *content_buf)
 Insert a new unit into a fragment with the given content. More...
 
int ff_cbs_insert_unit_data (CodedBitstreamFragment *frag, int position, CodedBitstreamUnitType type, uint8_t *data, size_t data_size, AVBufferRef *data_buf)
 Insert a new unit into a fragment with the given data bitstream. More...
 
void ff_cbs_delete_unit (CodedBitstreamFragment *frag, int position)
 Delete a unit from a fragment and free all memory it uses. More...
 
static void cbs_default_free_unit_content (void *opaque, uint8_t *data)
 
static const CodedBitstreamUnitTypeDescriptorcbs_find_unit_type_desc (CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
 
int ff_cbs_alloc_unit_content2 (CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
 Allocate a new internal content buffer matching the type of the unit. More...
 
static int cbs_clone_unit_content (AVBufferRef **clone_ref, CodedBitstreamUnit *unit, const CodedBitstreamUnitTypeDescriptor *desc)
 
int ff_cbs_make_unit_refcounted (CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
 Make the content of a unit refcounted. More...
 
int ff_cbs_make_unit_writable (CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
 Make the content of a unit writable so that internal fields can be modified. More...
 

Variables

static const CodedBitstreamType *const cbs_type_table []
 
enum AVCodecID ff_cbs_all_codec_ids []
 Table of all supported codec IDs. More...
 

Function Documentation

◆ ff_cbs_init()

int ff_cbs_init ( CodedBitstreamContext **  ctx_ptr,
enum AVCodecID  codec_id,
void *  log_ctx 
)

◆ ff_cbs_flush()

void ff_cbs_flush ( CodedBitstreamContext ctx)

Reset all internal state in a context.

Definition at line 121 of file cbs.c.

Referenced by av1_decode_flush().

◆ ff_cbs_close()

void ff_cbs_close ( CodedBitstreamContext **  ctx_ptr)

◆ cbs_unit_uninit()

static void cbs_unit_uninit ( CodedBitstreamUnit unit)
static

Definition at line 146 of file cbs.c.

Referenced by ff_cbs_delete_unit(), and ff_cbs_fragment_reset().

◆ ff_cbs_fragment_reset()

void ff_cbs_fragment_reset ( CodedBitstreamFragment frag)

◆ ff_cbs_fragment_free()

void ff_cbs_fragment_free ( CodedBitstreamFragment frag)

◆ cbs_read_fragment_content()

static int cbs_read_fragment_content ( CodedBitstreamContext ctx,
CodedBitstreamFragment frag 
)
static

Definition at line 179 of file cbs.c.

Referenced by cbs_read_data().

◆ cbs_fill_fragment_data()

static int cbs_fill_fragment_data ( CodedBitstreamFragment frag,
const uint8_t *  data,
size_t  size 
)
static

Definition at line 222 of file cbs.c.

Referenced by cbs_read_data().

◆ cbs_read_data()

static int cbs_read_data ( CodedBitstreamContext ctx,
CodedBitstreamFragment frag,
AVBufferRef buf,
const uint8_t *  data,
size_t  size,
int  header 
)
static

◆ ff_cbs_read_extradata()

int ff_cbs_read_extradata ( CodedBitstreamContext ctx,
CodedBitstreamFragment frag,
const AVCodecParameters par 
)

Read the extradata bitstream found in codec parameters into a fragment, then split into units and decompose.

This also updates the internal state, so will need to be called for codecs with extradata to read parameter sets necessary for further parsing even if the fragment itself is not desired.

The fragment must have been zeroed or reset via ff_cbs_fragment_reset before use.

Definition at line 271 of file cbs.c.

Referenced by av1_frame_split_init(), ff_cbs_bsf_generic_init(), filter_units_init(), and trace_headers_init().

◆ ff_cbs_read_extradata_from_codec()

int ff_cbs_read_extradata_from_codec ( CodedBitstreamContext ctx,
CodedBitstreamFragment frag,
const AVCodecContext avctx 
)

Definition at line 280 of file cbs.c.

Referenced by av1_decode_init(), and av1_parser_parse().

◆ ff_cbs_read_packet()

int ff_cbs_read_packet ( CodedBitstreamContext ctx,
CodedBitstreamFragment frag,
const AVPacket pkt 
)

Read the data bitstream from a packet into a fragment, then split into units and decompose.

This also updates the internal state of the coded bitstream context with any persistent data from the fragment which may be required to read following fragments (e.g. parameter sets).

The fragment must have been zeroed or reset via ff_cbs_fragment_reset before use.

Definition at line 289 of file cbs.c.

Referenced by av1_decode_frame(), av1_frame_merge_filter(), av1_frame_split_filter(), ff_cbs_bsf_generic_filter(), filter_units_filter(), and trace_headers().

◆ ff_cbs_read_packet_side_data()

int ff_cbs_read_packet_side_data ( CodedBitstreamContext ctx,
CodedBitstreamFragment frag,
const AVPacket pkt 
)

Definition at line 297 of file cbs.c.

Referenced by cbs_bsf_update_side_data(), and trace_headers().

◆ ff_cbs_read()

int ff_cbs_read ( CodedBitstreamContext ctx,
CodedBitstreamFragment frag,
const uint8_t *  data,
size_t  size 
)

Read a bitstream from a memory region into a fragment, then split into units and decompose.

This also updates the internal state of the coded bitstream context with any persistent data from the fragment which may be required to read following fragments (e.g. parameter sets).

The fragment must have been zeroed or reset via ff_cbs_fragment_reset before use.

Definition at line 310 of file cbs.c.

Referenced by av1_parser_parse().

◆ cbs_alloc_unit_data()

static int cbs_alloc_unit_data ( CodedBitstreamUnit unit,
size_t  size 
)
static

Allocate a new internal data buffer of the given size in the unit.

The data buffer will have input padding.

Definition at line 323 of file cbs.c.

Referenced by cbs_write_unit_data().

◆ cbs_write_unit_data()

static int cbs_write_unit_data ( CodedBitstreamContext ctx,
CodedBitstreamUnit unit 
)
static

Definition at line 340 of file cbs.c.

Referenced by ff_cbs_write_fragment_data().

◆ ff_cbs_write_fragment_data()

int ff_cbs_write_fragment_data ( CodedBitstreamContext ctx,
CodedBitstreamFragment frag 
)

Write the content of the fragment to its own internal buffer.

Writes the content of all units and then assembles them into a new data buffer. When modifying the content of decomposed units, this can be used to regenerate the bitstream form of units or the whole fragment so that it can be extracted for other use.

This also updates the internal state of the coded bitstream context with any persistent data from the fragment which may be required to write following fragments (e.g. parameter sets).

Definition at line 394 of file cbs.c.

Referenced by cbs_bsf_update_side_data(), ff_cbs_write_extradata(), ff_cbs_write_packet(), vaapi_encode_h264_write_access_unit(), vaapi_encode_h265_write_access_unit(), vaapi_encode_mjpeg_write_image_header(), and vaapi_encode_mpeg2_write_fragment().

◆ ff_cbs_write_extradata()

int ff_cbs_write_extradata ( CodedBitstreamContext ctx,
AVCodecParameters par,
CodedBitstreamFragment frag 
)

Write the bitstream of a fragment to the extradata in codec parameters.

Modifies context and fragment as ff_cbs_write_fragment_data does and replaces any existing extradata in the structure.

Definition at line 430 of file cbs.c.

Referenced by ff_cbs_bsf_generic_init(), and filter_units_init().

◆ ff_cbs_write_packet()

int ff_cbs_write_packet ( CodedBitstreamContext ctx,
AVPacket pkt,
CodedBitstreamFragment frag 
)

Write the bitstream of a fragment to a packet.

Modifies context and fragment as ff_cbs_write_fragment_data does.

On success, the packet's buf is unreferenced and its buf, data and size fields are set to the corresponding values from the newly updated fragment; other fields are not touched. On failure, the packet is not touched at all.

Definition at line 455 of file cbs.c.

Referenced by av1_frame_merge_filter(), ff_cbs_bsf_generic_filter(), and filter_units_filter().

◆ ff_cbs_trace_header()

void ff_cbs_trace_header ( CodedBitstreamContext ctx,
const char *  name 
)

Definition at line 480 of file cbs.c.

◆ ff_cbs_trace_syntax_element()

void ff_cbs_trace_syntax_element ( CodedBitstreamContext ctx,
int  position,
const char *  str,
const int subscripts,
const char *  bits,
int64_t  value 
)

◆ ff_cbs_read_unsigned()

int ff_cbs_read_unsigned ( CodedBitstreamContext ctx,
GetBitContext gbc,
int  width,
const char *  name,
const int subscripts,
uint32_t *  write_to,
uint32_t  range_min,
uint32_t  range_max 
)

Definition at line 539 of file cbs.c.

Referenced by cbs_av1_read_leb128(), and cbs_av1_read_subexp().

◆ ff_cbs_write_unsigned()

int ff_cbs_write_unsigned ( CodedBitstreamContext ctx,
PutBitContext pbc,
int  width,
const char *  name,
const int subscripts,
uint32_t  value,
uint32_t  range_min,
uint32_t  range_max 
)

Definition at line 582 of file cbs.c.

Referenced by cbs_av1_write_leb128(), and cbs_av1_write_subexp().

◆ ff_cbs_read_signed()

int ff_cbs_read_signed ( CodedBitstreamContext ctx,
GetBitContext gbc,
int  width,
const char *  name,
const int subscripts,
int32_t write_to,
int32_t  range_min,
int32_t  range_max 
)

Definition at line 618 of file cbs.c.

◆ ff_cbs_write_signed()

int ff_cbs_write_signed ( CodedBitstreamContext ctx,
PutBitContext pbc,
int  width,
const char *  name,
const int subscripts,
int32_t  value,
int32_t  range_min,
int32_t  range_max 
)

Definition at line 661 of file cbs.c.

◆ ff_cbs_alloc_unit_content()

int ff_cbs_alloc_unit_content ( CodedBitstreamUnit unit,
size_t  size,
void(*)(void *opaque, uint8_t *data free 
)

Definition at line 698 of file cbs.c.

Referenced by cbs_jpeg_read_unit().

◆ cbs_insert_unit()

static int cbs_insert_unit ( CodedBitstreamFragment frag,
int  position 
)
static

Definition at line 718 of file cbs.c.

Referenced by ff_cbs_insert_unit_content(), and ff_cbs_insert_unit_data().

◆ ff_cbs_insert_unit_content()

int ff_cbs_insert_unit_content ( CodedBitstreamFragment frag,
int  position,
CodedBitstreamUnitType  type,
void *  content,
AVBufferRef content_buf 
)

Insert a new unit into a fragment with the given content.

The content structure continues to be owned by the caller if content_buf is not supplied.

Definition at line 756 of file cbs.c.

Referenced by av1_frame_merge_filter(), av1_metadata_update_fragment(), cbs_sei_get_unit(), h264_metadata_insert_aud(), h265_metadata_update_fragment(), mpeg2_metadata_update_fragment(), vaapi_encode_h264_add_nal(), vaapi_encode_h265_add_nal(), vaapi_encode_mjpeg_write_image_header(), and vaapi_encode_mpeg2_add_header().

◆ ff_cbs_insert_unit_data()

int ff_cbs_insert_unit_data ( CodedBitstreamFragment frag,
int  position,
CodedBitstreamUnitType  type,
uint8_t *  data,
size_t  data_size,
AVBufferRef data_buf 
)

Insert a new unit into a fragment with the given data bitstream.

If data_buf is not supplied then data must have been allocated with av_malloc() and will on success become owned by the unit after this call or freed on error.

Definition at line 792 of file cbs.c.

Referenced by cbs_av1_split_fragment(), cbs_h2645_fragment_add_nals(), cbs_jpeg_split_fragment(), cbs_mpeg2_split_fragment(), and cbs_vp9_split_fragment().

◆ ff_cbs_delete_unit()

void ff_cbs_delete_unit ( CodedBitstreamFragment frag,
int  position 
)

Delete a unit from a fragment and free all memory it uses.

Requires position to be >= 0 and < frag->nb_units.

Definition at line 831 of file cbs.c.

Referenced by av1_metadata_update_fragment(), filter_units_filter(), h264_metadata_update_fragment(), h264_redundant_pps_update_fragment(), and h265_metadata_update_fragment().

◆ cbs_default_free_unit_content()

static void cbs_default_free_unit_content ( void *  opaque,
uint8_t *  data 
)
static

Definition at line 847 of file cbs.c.

Referenced by cbs_clone_unit_content(), and ff_cbs_alloc_unit_content2().

◆ cbs_find_unit_type_desc()

static const CodedBitstreamUnitTypeDescriptor* cbs_find_unit_type_desc ( CodedBitstreamContext ctx,
CodedBitstreamUnit unit 
)
static

◆ ff_cbs_alloc_unit_content2()

int ff_cbs_alloc_unit_content2 ( CodedBitstreamContext ctx,
CodedBitstreamUnit unit 
)

Allocate a new internal content buffer matching the type of the unit.

The content will be zeroed.

Definition at line 888 of file cbs.c.

Referenced by cbs_av1_read_unit(), cbs_h2645_replace_ps(), cbs_h265_read_nal_unit(), cbs_mpeg2_read_unit(), cbs_sei_get_unit(), and cbs_vp9_read_unit().

◆ cbs_clone_unit_content()

static int cbs_clone_unit_content ( AVBufferRef **  clone_ref,
CodedBitstreamUnit unit,
const CodedBitstreamUnitTypeDescriptor desc 
)
static

Definition at line 916 of file cbs.c.

Referenced by ff_cbs_make_unit_refcounted(), and ff_cbs_make_unit_writable().

◆ ff_cbs_make_unit_refcounted()

int ff_cbs_make_unit_refcounted ( CodedBitstreamContext ctx,
CodedBitstreamUnit unit 
)

Make the content of a unit refcounted.

If the unit is not refcounted, this will do a deep copy of the unit content to new refcounted buffers.

It is not valid to call this function on a unit which does not have decomposed content.

Definition at line 982 of file cbs.c.

Referenced by cbs_av1_write_obu(), and ff_cbs_make_unit_writable().

◆ ff_cbs_make_unit_writable()

int ff_cbs_make_unit_writable ( CodedBitstreamContext ctx,
CodedBitstreamUnit unit 
)

Make the content of a unit writable so that internal fields can be modified.

If it is known that there are no other references to the content of the unit, does nothing and returns success. Otherwise (including the case where the unit content is not refcounted), it does a full clone of the content (including any internal buffers) to make a new copy, and replaces the existing references inside the unit with that.

It is not valid to call this function on a unit which does not have decomposed content.

Definition at line 1030 of file cbs.c.

Referenced by h264_redundant_pps_fixup_pps().

Variable Documentation

◆ cbs_type_table

const CodedBitstreamType* const cbs_type_table[]
static
Initial value:
= {
}

Definition at line 33 of file cbs.c.

Referenced by ff_cbs_init().

◆ ff_cbs_all_codec_ids

enum AVCodecID ff_cbs_all_codec_ids[]
Initial value:

Table of all supported codec IDs.

Terminated by AV_CODEC_ID_NONE.

Definition at line 54 of file cbs.c.

AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:48