42 const uint8_t *buf,
int buf_size)
57 if (memcmp(&buf[1],
"vorbis", 6)) {
62 if (!(buf[29] & 0x1)) {
67 s->blocksize[0] = 1 << (buf[28] & 0xF);
68 s->blocksize[1] = 1 << (buf[28] >> 4);
74 const uint8_t *buf,
int buf_size)
79 int got_framing_bit, mode_count, got_mode_header, last_mode_count = 0;
94 if (memcmp(&buf[1],
"vorbis", 6)) {
104 for (
i = 0;
i < buf_size;
i++)
105 rev_buf[
i] = buf[buf_size - 1 -
i];
115 if (!got_framing_bit) {
137 if (
get_bits(&gb0, 6) + 1 == mode_count) {
139 last_mode_count = mode_count;
142 if (!got_mode_header) {
151 if (last_mode_count > 2) {
153 "%d modes (either a false positive or a "
154 "sample from an unknown encoder)",
159 if (last_mode_count > 63) {
165 s->mode_count = mode_count = last_mode_count;
168 s->mode_mask = ((1 << (
av_log2(mode_count - 1) + 1)) - 1) << 1;
170 s->prev_mask = (
s->mode_mask | 0x1) + 1;
174 for (
i = mode_count - 1;
i >= 0;
i--) {
185 const uint8_t *extradata,
int extradata_size)
187 const uint8_t *header_start[3];
192 s->extradata_parsed = 1;
196 header_start, header_len)) < 0) {
207 s->valid_extradata = 1;
208 s->previous_blocksize =
s->blocksize[
s->mode_blocksize[0]];
214 int buf_size,
int *
flags)
218 if (
s->valid_extradata && buf_size > 0) {
219 int mode, current_blocksize;
220 int previous_blocksize =
s->previous_blocksize;
230 else if (buf[0] == 3)
232 else if (buf[0] == 5)
244 if (
s->mode_count == 1)
247 mode = (buf[0] &
s->mode_mask) >> 1;
248 if (
mode >=
s->mode_count) {
252 if(
s->mode_blocksize[
mode]){
253 int flag = !!(buf[0] &
s->prev_mask);
254 previous_blocksize =
s->blocksize[
flag];
256 current_blocksize =
s->blocksize[
s->mode_blocksize[
mode]];
257 duration = (previous_blocksize + current_blocksize) >> 2;
258 s->previous_blocksize = current_blocksize;
272 if (
s->valid_extradata)
273 s->previous_blocksize =
s->blocksize[0];
299 #if CONFIG_VORBIS_PARSER
301 typedef struct VorbisParseContext {
303 } VorbisParseContext;
306 const uint8_t **poutbuf,
int *poutbuf_size,
307 const uint8_t *buf,
int buf_size)
309 VorbisParseContext *
s =
s1->priv_data;
325 *poutbuf_size = buf_size;
337 .priv_data_size =
sizeof(VorbisParseContext),
338 .parser_parse = vorbis_parse,
339 .parser_close = vorbis_parser_close,
#define flags(name, subs,...)
mode
Use these values in ebur128_init (or'ed).
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits(GetBitContext *s, int n)
static int get_bits_count(const GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
#define LIBAVUTIL_VERSION_INT
AVCodecParser ff_vorbis_parser
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
main external API structure.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
void * priv_data
Format private data.
#define avpriv_request_sample(...)
void av_vorbis_parse_free(AVVorbisParseContext **s)
Free the parser and everything associated with it.
int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, int buf_size, int *flags)
Get the duration for a Vorbis packet.
static const AVClass vorbis_parser_class
int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, int buf_size)
Get the duration for a Vorbis packet.
static int parse_id_header(AVVorbisParseContext *s, const uint8_t *buf, int buf_size)
static int vorbis_parse_init(AVVorbisParseContext *s, const uint8_t *extradata, int extradata_size)
AVVorbisParseContext * av_vorbis_parse_init(const uint8_t *extradata, int extradata_size)
Allocate and initialize the Vorbis parser using headers in the extradata.
void av_vorbis_parse_reset(AVVorbisParseContext *s)
static int parse_setup_header(AVVorbisParseContext *s, const uint8_t *buf, int buf_size)
#define VORBIS_FLAG_SETUP
#define VORBIS_FLAG_COMMENT
#define VORBIS_FLAG_HEADER
int avpriv_split_xiph_headers(const uint8_t *extradata, int extradata_size, int first_header_size, const uint8_t *header_start[3], int header_len[3])
Split a single extradata buffer into the three headers that most Xiph codecs use.