mirror of https://github.com/FFmpeg/FFmpeg.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
7.9 KiB
274 lines
7.9 KiB
/* |
|
* This file is part of Libav. |
|
* |
|
* Libav is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU Lesser General Public |
|
* License as published by the Free Software Foundation; either |
|
* version 2.1 of the License, or (at your option) any later version. |
|
* |
|
* Libav is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
* Lesser General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU Lesser General Public |
|
* License along with Libav; if not, write to the Free Software |
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
*/ |
|
|
|
#ifndef AVCODEC_CBS_H |
|
#define AVCODEC_CBS_H |
|
|
|
#include <stddef.h> |
|
#include <stdint.h> |
|
|
|
#include "avcodec.h" |
|
|
|
|
|
struct CodedBitstreamType; |
|
|
|
/** |
|
* Coded bitstream unit structure. |
|
* |
|
* A bitstream unit the the smallest element of a bitstream which |
|
* is meaningful on its own. For example, an H.264 NAL unit. |
|
* |
|
* See the codec-specific header for the meaning of this for any |
|
* particular codec. |
|
*/ |
|
typedef struct CodedBitstreamUnit { |
|
/** |
|
* Codec-specific type of this unit. |
|
*/ |
|
uint32_t type; |
|
|
|
/** |
|
* Pointer to the bitstream form of this unit. |
|
* |
|
* May be NULL if the unit currently only exists in decomposed form. |
|
*/ |
|
uint8_t *data; |
|
/** |
|
* The number of bytes in the bitstream (including any padding bits |
|
* in the final byte). |
|
*/ |
|
size_t data_size; |
|
/** |
|
* The number of bits which should be ignored in the final byte. |
|
* |
|
* This supports non-byte-aligned bitstreams. |
|
*/ |
|
size_t data_bit_padding; |
|
|
|
/** |
|
* Pointer to the decomposed form of this unit. |
|
* |
|
* The type of this structure depends on both the codec and the |
|
* type of this unit. May be NULL if the unit only exists in |
|
* bitstream form. |
|
*/ |
|
void *content; |
|
/** |
|
* Whether the content was supplied externally. |
|
* |
|
* If so, it should not be freed when freeing the unit. |
|
*/ |
|
int content_external; |
|
} CodedBitstreamUnit; |
|
|
|
/** |
|
* Coded bitstream fragment structure, combining one or more units. |
|
* |
|
* This is any sequence of units. It need not form some greater whole, |
|
* though in many cases it will. For example, an H.264 access unit, |
|
* which is composed of a sequence of H.264 NAL units. |
|
*/ |
|
typedef struct CodedBitstreamFragment { |
|
/** |
|
* Pointer to the bitstream form of this fragment. |
|
* |
|
* May be NULL if the fragment only exists as component units. |
|
*/ |
|
uint8_t *data; |
|
/** |
|
* The number of bytes in the bitstream. |
|
* |
|
* The number of bytes in the bitstream (including any padding bits |
|
* in the final byte). |
|
*/ |
|
size_t data_size; |
|
/** |
|
* The number of bits which should be ignored in the final byte. |
|
*/ |
|
size_t data_bit_padding; |
|
|
|
/** |
|
* Number of units in this fragment. |
|
* |
|
* This may be zero if the fragment only exists in bistream form |
|
* and has not been decomposed. |
|
*/ |
|
int nb_units; |
|
/** |
|
* Pointer to an array of units of length nb_units. |
|
* |
|
* Must be NULL if nb_units is zero. |
|
*/ |
|
CodedBitstreamUnit *units; |
|
} CodedBitstreamFragment; |
|
|
|
/** |
|
* Context structure for coded bitstream operations. |
|
*/ |
|
typedef struct CodedBitstreamContext { |
|
/** |
|
* Logging context to be passed to all av_log() calls associated |
|
* with this context. |
|
*/ |
|
void *log_ctx; |
|
|
|
/** |
|
* Internal codec-specific hooks. |
|
*/ |
|
const struct CodedBitstreamType *codec; |
|
|
|
/** |
|
* Internal codec-specific data. |
|
* |
|
* This contains any information needed when reading/writing |
|
* bitsteams which will not necessarily be present in a fragment. |
|
* For example, for H.264 it contains all currently visible |
|
* parameter sets - they are required to determine the bitstream |
|
* syntax but need not be present in every access unit. |
|
*/ |
|
void *priv_data; |
|
|
|
/** |
|
* Array of unit types which should be decomposed when reading. |
|
* |
|
* Types not in this list will be available in bitstream form only. |
|
* If NULL, all supported types will be decomposed. |
|
*/ |
|
uint32_t *decompose_unit_types; |
|
/** |
|
* Length of the decompose_unit_types array. |
|
*/ |
|
int nb_decompose_unit_types; |
|
|
|
/** |
|
* Enable trace output during read/write operations. |
|
*/ |
|
int trace_enable; |
|
/** |
|
* Log level to use for trace output. |
|
* |
|
* From AV_LOG_*; defaults to AV_LOG_TRACE. |
|
*/ |
|
int trace_level; |
|
} CodedBitstreamContext; |
|
|
|
|
|
/** |
|
* Initialise a new context for the given codec. |
|
*/ |
|
int ff_cbs_init(CodedBitstreamContext *ctx, |
|
enum AVCodecID codec_id, void *log_ctx); |
|
|
|
/** |
|
* Close a context and free all internal state. |
|
*/ |
|
void ff_cbs_close(CodedBitstreamContext *ctx); |
|
|
|
|
|
/** |
|
* 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. |
|
*/ |
|
int ff_cbs_read_extradata(CodedBitstreamContext *ctx, |
|
CodedBitstreamFragment *frag, |
|
const AVCodecParameters *par); |
|
|
|
/** |
|
* Read the data bitstream from a packet into a fragment, then |
|
* split into units and decompose. |
|
*/ |
|
int ff_cbs_read_packet(CodedBitstreamContext *ctx, |
|
CodedBitstreamFragment *frag, |
|
const AVPacket *pkt); |
|
|
|
/** |
|
* Read a bitstream from a memory region into a fragment, then |
|
* split into units and decompose. |
|
*/ |
|
int ff_cbs_read(CodedBitstreamContext *ctx, |
|
CodedBitstreamFragment *frag, |
|
const uint8_t *data, size_t size); |
|
|
|
|
|
/** |
|
* 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. |
|
*/ |
|
int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx, |
|
CodedBitstreamFragment *frag); |
|
|
|
/** |
|
* Write the bitstream of a fragment to the extradata in codec parameters. |
|
*/ |
|
int ff_cbs_write_extradata(CodedBitstreamContext *ctx, |
|
AVCodecParameters *par, |
|
CodedBitstreamFragment *frag); |
|
|
|
/** |
|
* Write the bitstream of a fragment to a packet. |
|
*/ |
|
int ff_cbs_write_packet(CodedBitstreamContext *ctx, |
|
AVPacket *pkt, |
|
CodedBitstreamFragment *frag); |
|
|
|
|
|
/** |
|
* Free all allocated memory in a fragment. |
|
*/ |
|
void ff_cbs_fragment_uninit(CodedBitstreamContext *ctx, |
|
CodedBitstreamFragment *frag); |
|
|
|
|
|
/** |
|
* Insert a new unit into a fragment with the given content. |
|
* |
|
* The content structure continues to be owned by the caller, and |
|
* will not be freed when the unit is. |
|
*/ |
|
int ff_cbs_insert_unit_content(CodedBitstreamContext *ctx, |
|
CodedBitstreamFragment *frag, |
|
int position, uint32_t type, |
|
void *content); |
|
|
|
/** |
|
* Insert a new unit into a fragment with the given data bitstream. |
|
* |
|
* The data buffer will be owned by the unit after this operation. |
|
*/ |
|
int ff_cbs_insert_unit_data(CodedBitstreamContext *ctx, |
|
CodedBitstreamFragment *frag, |
|
int position, uint32_t type, |
|
uint8_t *data, size_t data_size); |
|
|
|
/** |
|
* Delete a unit from a fragment and free all memory it uses. |
|
*/ |
|
int ff_cbs_delete_unit(CodedBitstreamContext *ctx, |
|
CodedBitstreamFragment *frag, |
|
int position); |
|
|
|
|
|
#endif /* AVCODEC_CBS_H */
|
|
|