FFmpeg
Loading...
Searching...
No Matches
libvorbisenc.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2002 Mark Hills <mark@pogo.org.uk>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <vorbis/vorbisenc.h>
22
23#include "libavutil/avassert.h"
25#include "libavutil/fifo.h"
27#include "libavutil/mem.h"
28#include "libavutil/opt.h"
29#include "avcodec.h"
30#include "audio_frame_queue.h"
31#include "codec_internal.h"
32#include "encode.h"
33#include "version.h"
34#include "vorbis_parser.h"
36
37
38/* Number of samples the user should send in each call.
39 * This value is used because it is the LCD of all possible frame sizes, so
40 * an output packet will always start at the same point as one of the input
41 * packets.
42 */
43#define LIBVORBIS_FRAME_SIZE 64
44
45#define BUFFER_SIZE (1024 * 64)
46
47typedef struct LibvorbisEncContext {
48 AVClass *av_class; /**< class for AVOptions */
49 vorbis_info vi; /**< vorbis_info used during init */
50 vorbis_dsp_state vd; /**< DSP state used for analysis */
51 vorbis_block vb; /**< vorbis_block used for analysis */
52 AVFifo *pkt_fifo; /**< output packet buffer */
53 int eof; /**< end-of-file flag */
54 int dsp_initialized; /**< vd has been initialized */
55 vorbis_comment vc; /**< VorbisComment info */
56 double iblock; /**< impulse block bias option */
57 AVVorbisParseContext vp; /**< parse context to get durations */
58 AudioFrameQueue afq; /**< frame queue for timestamps */
60
61static const AVOption options[] = {
62 { "iblock", "Sets the impulse block bias", offsetof(LibvorbisEncContext, iblock), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, -15, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
63 { NULL }
64};
65
66static const FFCodecDefault defaults[] = {
67 { "b", "0" },
68 { NULL },
69};
70
71static const AVClass vorbis_class = {
72 .class_name = "libvorbis",
73 .item_name = av_default_item_name,
74 .option = options,
75 .version = LIBAVUTIL_VERSION_INT,
76};
77
78static const uint8_t vorbis_encoding_channel_layout_offsets[8][8] = {
79 { 0 },
80 { 0, 1 },
81 { 0, 2, 1 },
82 { 0, 1, 2, 3 },
83 { 0, 2, 1, 3, 4 },
84 { 0, 2, 1, 4, 5, 3 },
85 { 0, 2, 1, 5, 6, 4, 3 },
86 { 0, 2, 1, 6, 7, 4, 5, 3 },
87};
88
89static int vorbis_error_to_averror(int ov_err)
90{
91 switch (ov_err) {
92 case OV_EFAULT: return AVERROR_BUG;
93 case OV_EINVAL: return AVERROR(EINVAL);
94 case OV_EIMPL: return AVERROR(EINVAL);
95 default: return AVERROR_UNKNOWN;
96 }
97}
98
99static av_cold int libvorbis_setup(vorbis_info *vi, AVCodecContext *avctx)
100{
102 int channels = avctx->ch_layout.nb_channels;
103 double cfreq;
104 int ret;
105
106 if (avctx->flags & AV_CODEC_FLAG_QSCALE || !avctx->bit_rate) {
107 /* variable bitrate
108 * NOTE: we use the oggenc range of -1 to 10 for global_quality for
109 * user convenience, but libvorbis uses -0.1 to 1.0.
110 */
111 float q = avctx->global_quality / (float)FF_QP2LAMBDA;
112 /* default to 3 if the user did not set quality or bitrate */
113 if (!(avctx->flags & AV_CODEC_FLAG_QSCALE))
114 q = 3.0;
115 if ((ret = vorbis_encode_setup_vbr(vi, channels,
116 avctx->sample_rate,
117 q / 10.0)))
118 goto error;
119 } else {
120 int minrate = avctx->rc_min_rate > 0 ? avctx->rc_min_rate : -1;
121 int maxrate = avctx->rc_max_rate > 0 ? avctx->rc_max_rate : -1;
122
123 /* average bitrate */
124 if ((ret = vorbis_encode_setup_managed(vi, channels,
125 avctx->sample_rate, maxrate,
126 avctx->bit_rate, minrate)))
127 goto error;
128
129 /* variable bitrate by estimate, disable slow rate management */
130 if (minrate == -1 && maxrate == -1)
131 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET, NULL)))
132 goto error; /* should not happen */
133 }
134
135 /* cutoff frequency */
136 if (avctx->cutoff > 0) {
137 cfreq = avctx->cutoff / 1000.0;
138 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)))
139 goto error; /* should not happen */
140 }
141
142 /* impulse block bias */
143 if (s->iblock) {
144 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &s->iblock)))
145 goto error;
146 }
147
148 if ((channels == 3 &&
150 (channels == 4 &&
153 (channels == 5 &&
156 (channels == 6 &&
159 (channels == 7 &&
161 (channels == 8 &&
164 char name[32];
166 av_log(avctx, AV_LOG_ERROR, "%s not supported by Vorbis: "
167 "output stream will have incorrect "
168 "channel layout.\n", name);
169 } else {
170 av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The encoder "
171 "will use Vorbis channel layout for "
172 "%d channels.\n", channels);
173 }
174 }
175
176 if ((ret = vorbis_encode_setup_init(vi)))
177 goto error;
178
179 return 0;
180error:
181 return vorbis_error_to_averror(ret);
182}
183
184static av_cold int libvorbis_get_priming_samples(vorbis_info *vi, AVCodecContext *avctx)
185{
187 vorbis_dsp_state vd;
188 vorbis_block vb;
190 int ret;
191
192 if ((ret = vorbis_analysis_init(&vd, vi))) {
193 av_log(avctx, AV_LOG_ERROR, "analysis init failed\n");
194 return vorbis_error_to_averror(ret);
195 }
196 if ((ret = vorbis_block_init(&vd, &vb))) {
197 av_log(avctx, AV_LOG_ERROR, "dsp init failed\n");
198 vorbis_dsp_clear(&vd);
199 return vorbis_error_to_averror(ret);
200 }
201
202 if ((ret = vorbis_analysis_wrote(&vd, 0)) < 0) {
203 av_log(avctx, AV_LOG_ERROR, "error in vorbis_analysis_wrote() during init\n");
204 ret = vorbis_error_to_averror(ret);
205 goto error;
206 }
207
208 /* retrieve available packets from libvorbis */
209 if ((ret = vorbis_analysis_blockout(&vd, &vb)) == 1) {
210 if ((ret = vorbis_analysis(&vb, NULL)) < 0) {
211 av_log(avctx, AV_LOG_ERROR, "error in vorbis_analysis_blockout() during init\n");
212 ret = vorbis_error_to_averror(ret);
213 goto error;
214 }
215 if ((ret = vorbis_bitrate_addblock(&vb)) < 0) {
216 av_log(avctx, AV_LOG_ERROR, "error in vorbis_bitrate_addblock() during init\n");
217 ret = vorbis_error_to_averror(ret);
218 goto error;
219 }
220
221 /* add any available packets to the output packet buffer */
222 ret = vorbis_bitrate_flushpacket(&vd, &op);
223 if (ret < 0) {
224 av_log(avctx, AV_LOG_ERROR, "error in vorbis_bitrate_flushpacket() during init\n");
225 ret = vorbis_error_to_averror(ret);
226 goto error;
227 }
228 avctx->initial_padding = av_vorbis_parse_frame(&s->vp, op.packet, op.bytes);
229 }
230
231 ret = 0;
232error:
233 vorbis_block_clear(&vb);
234 vorbis_dsp_clear(&vd);
235
236 return ret;
237}
238
239/* How many bytes are needed for a buffer of length 'l' */
240static int xiph_len(int l)
241{
242 return 1 + l / 255 + l;
243}
244
246{
248
249 /* notify vorbisenc this is EOF */
250 if (s->dsp_initialized)
251 vorbis_analysis_wrote(&s->vd, 0);
252
253 vorbis_block_clear(&s->vb);
254 vorbis_dsp_clear(&s->vd);
255 vorbis_info_clear(&s->vi);
256
257 av_fifo_freep2(&s->pkt_fifo);
258 ff_af_queue_close(&s->afq);
259
260 return 0;
261}
262
264{
266 ogg_packet header, header_comm, header_code;
267 uint8_t *p;
268 unsigned int offset;
269 int ret;
270
271 vorbis_info_init(&s->vi);
272 if ((ret = libvorbis_setup(&s->vi, avctx))) {
273 av_log(avctx, AV_LOG_ERROR, "encoder setup failed\n");
274 goto error;
275 }
276 if ((ret = vorbis_analysis_init(&s->vd, &s->vi))) {
277 av_log(avctx, AV_LOG_ERROR, "analysis init failed\n");
278 ret = vorbis_error_to_averror(ret);
279 goto error;
280 }
281 s->dsp_initialized = 1;
282 if ((ret = vorbis_block_init(&s->vd, &s->vb))) {
283 av_log(avctx, AV_LOG_ERROR, "dsp init failed\n");
284 ret = vorbis_error_to_averror(ret);
285 goto error;
286 }
287
288 vorbis_comment_init(&s->vc);
289 if (!(avctx->flags & AV_CODEC_FLAG_BITEXACT))
290 vorbis_comment_add_tag(&s->vc, "encoder", LIBAVCODEC_IDENT);
291
292 ret = vorbis_analysis_headerout(&s->vd, &s->vc, &header, &header_comm,
293 &header_code);
294 vorbis_comment_clear(&s->vc);
295 if (ret) {
296 ret = vorbis_error_to_averror(ret);
297 goto error;
298 }
299
300 avctx->extradata_size = 1 + xiph_len(header.bytes) +
301 xiph_len(header_comm.bytes) +
302 header_code.bytes;
303 p = avctx->extradata = av_malloc(avctx->extradata_size +
305 if (!p) {
306 ret = AVERROR(ENOMEM);
307 goto error;
308 }
309 p[0] = 2;
310 offset = 1;
311 offset += av_xiphlacing(&p[offset], header.bytes);
312 offset += av_xiphlacing(&p[offset], header_comm.bytes);
313 memcpy(&p[offset], header.packet, header.bytes);
314 offset += header.bytes;
315 memcpy(&p[offset], header_comm.packet, header_comm.bytes);
316 offset += header_comm.bytes;
317 memcpy(&p[offset], header_code.packet, header_code.bytes);
318 offset += header_code.bytes;
320
321 ret = ff_vorbis_parse_init(&s->vp, avctx->extradata, avctx->extradata_size);
322 if (ret < 0) {
323 av_log(avctx, AV_LOG_ERROR, "invalid extradata\n");
324 goto error;
325 }
326
327 if ((ret = libvorbis_get_priming_samples(&s->vi, avctx)))
328 goto error;
329
331 ff_af_queue_init(avctx, &s->afq);
332
333 s->pkt_fifo = av_fifo_alloc2(BUFFER_SIZE, 1, 0);
334 if (!s->pkt_fifo) {
335 ret = AVERROR(ENOMEM);
336 goto error;
337 }
338
339 return 0;
340error:
342 return ret;
343}
344
346 const AVFrame *frame, int *got_packet_ptr)
347{
350 int ret, duration;
351
352 /* send samples to libvorbis */
353 if (frame) {
354 const int samples = frame->nb_samples;
355 float **buffer;
356 int c, channels = s->vi.channels;
357
358 buffer = vorbis_analysis_buffer(&s->vd, samples);
359 for (c = 0; c < channels; c++) {
360 int co = (channels > 8) ? c :
362 memcpy(buffer[c], frame->extended_data[co],
363 samples * sizeof(*buffer[c]));
364 }
365 if ((ret = vorbis_analysis_wrote(&s->vd, samples)) < 0) {
366 av_log(avctx, AV_LOG_ERROR, "error in vorbis_analysis_wrote()\n");
367 return vorbis_error_to_averror(ret);
368 }
369 if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
370 return ret;
371 } else {
372 if (!s->eof && s->afq.frame_alloc)
373 if ((ret = vorbis_analysis_wrote(&s->vd, 0)) < 0) {
374 av_log(avctx, AV_LOG_ERROR, "error in vorbis_analysis_wrote()\n");
375 return vorbis_error_to_averror(ret);
376 }
377 s->eof = 1;
378 }
379
380 /* retrieve available packets from libvorbis */
381 while ((ret = vorbis_analysis_blockout(&s->vd, &s->vb)) == 1) {
382 if ((ret = vorbis_analysis(&s->vb, NULL)) < 0)
383 break;
384 if ((ret = vorbis_bitrate_addblock(&s->vb)) < 0)
385 break;
386
387 /* add any available packets to the output packet buffer */
388 while ((ret = vorbis_bitrate_flushpacket(&s->vd, &op)) == 1) {
389 if (av_fifo_can_write(s->pkt_fifo) < sizeof(ogg_packet) + op.bytes) {
390 av_log(avctx, AV_LOG_ERROR, "packet buffer is too small\n");
391 return AVERROR_BUG;
392 }
393 av_fifo_write(s->pkt_fifo, &op, sizeof(ogg_packet));
394 av_fifo_write(s->pkt_fifo, op.packet, op.bytes);
395 }
396 if (ret < 0) {
397 av_log(avctx, AV_LOG_ERROR, "error getting available packets\n");
398 break;
399 }
400 }
401 if (ret < 0) {
402 av_log(avctx, AV_LOG_ERROR, "error getting available packets\n");
403 return vorbis_error_to_averror(ret);
404 }
405
406 /* Read an available packet if possible */
407 if (av_fifo_read(s->pkt_fifo, &op, sizeof(ogg_packet)) < 0)
408 return 0;
409
410 if ((ret = ff_get_encode_buffer(avctx, avpkt, op.bytes, 0)) < 0)
411 return ret;
412 av_fifo_read(s->pkt_fifo, avpkt->data, op.bytes);
413
414 avpkt->pts = ff_samples_to_time_base(avctx, op.granulepos);
415
416 duration = av_vorbis_parse_frame(&s->vp, avpkt->data, avpkt->size);
417 if (duration > 0) {
418 ret = ff_af_queue_remove(&s->afq, duration, avpkt);
419 if (ret < 0)
420 return ret;
421 }
422
423 *got_packet_ptr = 1;
424 return 0;
425}
426
428 .p.name = "libvorbis",
429 CODEC_LONG_NAME("libvorbis"),
430 .p.type = AVMEDIA_TYPE_AUDIO,
431 .p.id = AV_CODEC_ID_VORBIS,
432 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
434 .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE,
435 .priv_data_size = sizeof(LibvorbisEncContext),
438 .close = libvorbis_encode_close,
440 .p.priv_class = &vorbis_class,
441 .defaults = defaults,
442 .p.wrapper_name = "libvorbis",
443};
const FFCodec ff_libvorbis_encoder
static const FFCodecDefault defaults[]
Definition amfenc_av1.c:723
channels
Definition aptx.h:31
av_cold void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
int ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, AVPacket *pkt)
Remove frame(s) from the queue.
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define s(width, name)
Definition cbs_vp9.c:198
Public libavutil channel layout APIs header.
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define CODEC_SAMPLEFMTS(...)
#define NULL
Definition coverity.c:32
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
Encode extradata length to a buffer.
Definition utils.c:836
static AVFrame * frame
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
Definition encode.c:106
static av_always_inline int64_t ff_samples_to_time_base(const AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
Definition encode.h:96
static int64_t duration
Definition ffplay.c:330
A generic FIFO API.
#define BUFFER_SIZE
#define AV_OPT_FLAG_AUDIO_PARAM
Definition opt.h:356
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition opt.h:351
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
Definition opt.h:266
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition avcodec.h:322
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
Definition avcodec.h:213
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
Definition codec.h:84
@ AV_CODEC_ID_VORBIS
Definition codec_id.h:458
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
#define AV_CHANNEL_LAYOUT_5POINT1_BACK
#define AV_CHANNEL_LAYOUT_5POINT0
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
#define AV_CHANNEL_LAYOUT_2_2
#define AV_CHANNEL_LAYOUT_5POINT0_BACK
#define AV_CHANNEL_LAYOUT_5POINT1
#define AV_CHANNEL_LAYOUT_SURROUND
int av_channel_layout_describe(const AVChannelLayout *channel_layout, char *buf, size_t buf_size)
Get a human-readable string describing the channel layout properties.
#define AV_CHANNEL_LAYOUT_7POINT1
#define AV_CHANNEL_LAYOUT_QUAD
#define AV_CHANNEL_LAYOUT_6POINT1
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition avutil.h:226
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition error.h:73
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition error.h:52
#define AVERROR(e)
Definition error.h:45
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
Definition fifo.c:47
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
Definition fifo.c:286
size_t av_fifo_can_write(const AVFifo *f)
Definition fifo.c:94
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
Definition fifo.c:188
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
Definition fifo.c:240
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition samplefmt.h:66
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
unsigned offset
Definition libaomenc.c:763
static int op(uint8_t **dst, const uint8_t *dst_end, GetByteContext *gb, int pixel, int count, int *x, int width, int linesize)
Perform decode operation.
Definition anm.c:76
Libavcodec version macros.
#define LIBAVCODEC_IDENT
Definition version.h:43
#define av_cold
Definition attributes.h:117
static av_cold int libvorbis_encode_close(AVCodecContext *avctx)
static int libvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
static int vorbis_error_to_averror(int ov_err)
static const AVClass vorbis_class
static av_cold int libvorbis_get_priming_samples(vorbis_info *vi, AVCodecContext *avctx)
static av_cold int libvorbis_encode_init(AVCodecContext *avctx)
static const uint8_t vorbis_encoding_channel_layout_offsets[8][8]
#define LIBVORBIS_FRAME_SIZE
static int xiph_len(int l)
static av_cold int libvorbis_setup(vorbis_info *vi, AVCodecContext *avctx)
Memory handling functions.
static int ogg_packet(AVFormatContext *s, int *sid, int *dstart, int *dsize, int64_t *fpos)
find the next Ogg packet
Definition oggdec.c:503
#define av_malloc(s)
Definition ops_static.c:52
AVOptions.
const char * name
Definition qsvenc.c:142
static const uint8_t header[24]
Definition sdr2.c:68
An AVChannelLayout holds information about the channel layout of audio data.
enum AVChannelOrder order
Channel order used in this layout.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
AVChannelLayout ch_layout
Audio channel layout.
Definition avcodec.h:1055
int global_quality
Global quality for codecs which cannot change it per frame.
Definition avcodec.h:1235
int64_t bit_rate
the average bitrate
Definition avcodec.h:493
int initial_padding
Audio only.
Definition avcodec.h:1114
int sample_rate
samples per second
Definition avcodec.h:1040
int64_t rc_max_rate
maximum bitrate
Definition avcodec.h:1288
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
int64_t rc_min_rate
minimum bitrate
Definition avcodec.h:1295
int extradata_size
Definition avcodec.h:527
int cutoff
Audio cutoff bandwidth (0 means "automatic")
Definition avcodec.h:1082
int frame_size
Number of samples per channel in an audio frame.
Definition avcodec.h:1068
void * priv_data
Definition avcodec.h:470
Definition fifo.c:35
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition packet.h:596
uint8_t * data
Definition packet.h:603
vorbis_dsp_state vd
DSP state used for analysis.
int dsp_initialized
vd has been initialized
AudioFrameQueue afq
frame queue for timestamps
vorbis_comment vc
VorbisComment info.
double iblock
impulse block bias option
AVVorbisParseContext vp
parse context to get durations
AVFifo * pkt_fifo
output packet buffer
AVClass * av_class
class for AVOptions
vorbis_info vi
vorbis_info used during init
int eof
end-of-file flag
vorbis_block vb
vorbis_block used for analysis
#define av_log(a,...)
static void error(const char *err)
static char buffer[20]
Definition seek.c:32
int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, int buf_size)
Get the duration for a Vorbis packet.
int ff_vorbis_parse_init(AVVorbisParseContext *s, const uint8_t *extradata, int extradata_size)
A public API for Vorbis parsing.
Vorbis audio parser.
static double c[64]