21 #include <vorbis/vorbisenc.h>
38 #define LIBVORBIS_FRAME_SIZE 64
40 #define BUFFER_SIZE (1024 * 64)
77 case OV_EINVAL:
return AVERROR(EINVAL);
78 case OV_EIMPL:
return AVERROR(EINVAL);
98 if ((ret = vorbis_encode_setup_vbr(vi, avctx->
channels,
107 if ((ret = vorbis_encode_setup_managed(vi, avctx->
channels,
113 if (minrate == -1 && maxrate == -1)
114 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET,
NULL)))
120 cfreq = avctx->
cutoff / 1000.0;
121 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)))
127 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &s->
iblock)))
151 "output stream will have incorrect "
152 "channel layout.\n", name);
155 "will use Vorbis channel layout for "
160 if ((ret = vorbis_encode_setup_init(vi)))
171 return 1 + l / 255 + l;
180 vorbis_analysis_wrote(&s->
vd, 0);
182 vorbis_block_clear(&s->
vb);
183 vorbis_dsp_clear(&s->
vd);
184 vorbis_info_clear(&s->
vi);
203 vorbis_info_init(&s->
vi);
208 if ((ret = vorbis_analysis_init(&s->
vd, &s->
vi))) {
214 if ((ret = vorbis_block_init(&s->
vd, &s->
vb))) {
220 vorbis_comment_init(&s->
vc);
224 if ((ret = vorbis_analysis_headerout(&s->
vd, &s->
vc, &header, &header_comm,
243 memcpy(&p[offset], header.packet, header.bytes);
244 offset += header.bytes;
245 memcpy(&p[offset], header_comm.packet, header_comm.bytes);
246 offset += header_comm.bytes;
247 memcpy(&p[offset], header_code.packet, header_code.bytes);
248 offset += header_code.bytes;
257 vorbis_comment_clear(&s->
vc);
285 int c, channels = s->
vi.channels;
287 buffer = vorbis_analysis_buffer(&s->
vd, samples);
288 for (c = 0; c < channels; c++) {
289 int co = (channels > 8) ? c :
292 samples *
sizeof(*buffer[c]));
294 if ((ret = vorbis_analysis_wrote(&s->
vd, samples)) < 0) {
302 if ((ret = vorbis_analysis_wrote(&s->
vd, 0)) < 0) {
310 while ((ret = vorbis_analysis_blockout(&s->
vd, &s->
vb)) == 1) {
311 if ((ret = vorbis_analysis(&s->
vb,
NULL)) < 0)
313 if ((ret = vorbis_bitrate_addblock(&s->
vb)) < 0)
317 while ((ret = vorbis_bitrate_flushpacket(&s->
vd, &op)) == 1) {
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
Remove frame(s) from the queue.
#define AV_CH_LAYOUT_7POINT1
This structure describes decoded (raw) audio or video data.
AudioFrameQueue afq
frame queue for timestamps
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
#define LIBAVUTIL_VERSION_INT
static av_cold int libvorbis_encode_close(AVCodecContext *avctx)
static av_cold int init(AVCodecContext *avctx)
static const AVOption options[]
#define AV_OPT_FLAG_AUDIO_PARAM
AVVorbisParseContext * av_vorbis_parse_init(const uint8_t *extradata, int extradata_size)
Allocate and initialize the Vorbis parser using headers in the extradata.
AVFifoBuffer * pkt_fifo
output packet buffer
#define AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_5POINT0
static int xiph_len(int l)
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
double iblock
impulse block bias option
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
int av_fifo_space(const AVFifoBuffer *f)
Return the amount of space in bytes in the AVFifoBuffer, that is the amount of data you can write int...
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
AVClass * av_class
class for AVOptions
A public API for Vorbis parsing.
static const AVCodecDefault defaults[]
static av_cold int libvorbis_encode_init(AVCodecContext *avctx)
AVVorbisParseContext * vp
parse context to get durations
static const uint8_t header[24]
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
static const AVClass vorbis_class
#define AV_CH_LAYOUT_5POINT1
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_vorbis_parse_free(AVVorbisParseContext **s)
Free the parser and everything associated with it.
vorbis_comment vc
VorbisComment info.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int initial_padding
Audio only.
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
int flags
AV_CODEC_FLAG_*.
simple assert() macros that are a bit more flexible than ISO C assert().
#define AV_CH_LAYOUT_QUAD
const char * name
Name of the codec implementation.
AVCodec ff_libvorbis_encoder
static const uint8_t offset[127][2]
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
uint64_t channel_layout
Audio channel layout.
static int libvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
int64_t rc_min_rate
minimum bitrate
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
#define AV_CH_FRONT_CENTER
#define AV_CH_LAYOUT_5POINT1_BACK
static void error(const char *err)
vorbis_info vi
vorbis_info used during init
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
int frame_size
Number of samples per channel in an audio frame.
const uint8_t ff_vorbis_encoding_channel_layout_offsets[8][8]
Libavcodec external API header.
AVSampleFormat
Audio sample formats.
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
int sample_rate
samples per second
static int ogg_packet(AVFormatContext *s, int *sid, int *dstart, int *dsize, int64_t *fpos)
find the next Ogg packet
main external API structure.
int dsp_initialized
vd has been initialized
a very simple circular buffer FIFO implementation
static av_cold int libvorbis_setup(vorbis_info *vi, AVCodecContext *avctx)
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
Encode extradata length to a buffer.
Describe the class of an AVClass context structure.
#define LIBVORBIS_FRAME_SIZE
#define AV_CH_LAYOUT_5POINT0_BACK
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
int global_quality
Global quality for codecs which cannot change it per frame.
#define AV_CH_BACK_CENTER
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.
static int vorbis_error_to_averror(int ov_err)
common internal api header.
int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, int buf_size)
Get the duration for a Vorbis packet.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int cutoff
Audio cutoff bandwidth (0 means "automatic")
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
int channels
number of audio channels
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
static enum AVSampleFormat sample_fmts[]
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
uint8_t ** extended_data
pointers to the data planes/channels.
vorbis_dsp_state vd
DSP state used for analysis.
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
vorbis_block vb
vorbis_block used for analysis
#define AV_NOPTS_VALUE
Undefined timestamp value.
int64_t rc_max_rate
maximum bitrate