21 #include <vorbis/vorbisenc.h>
38 #define LIBVORBIS_FRAME_SIZE 64
40 #define BUFFER_SIZE (1024 * 64)
80 { 0, 2, 1, 5, 6, 4, 3 },
81 { 0, 2, 1, 6, 7, 4, 5, 3 },
88 case OV_EINVAL:
return AVERROR(EINVAL);
89 case OV_EIMPL:
return AVERROR(EINVAL);
109 if ((ret = vorbis_encode_setup_vbr(vi, avctx->
channels,
118 if ((ret = vorbis_encode_setup_managed(vi, avctx->
channels,
124 if (minrate == -1 && maxrate == -1)
125 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET,
NULL)))
131 cfreq = avctx->
cutoff / 1000.0;
132 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)))
138 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &
s->iblock)))
162 "output stream will have incorrect "
163 "channel layout.\n",
name);
166 "will use Vorbis channel layout for "
171 if ((ret = vorbis_encode_setup_init(vi)))
182 return 1 + l / 255 + l;
190 if (
s->dsp_initialized)
191 vorbis_analysis_wrote(&
s->vd, 0);
193 vorbis_block_clear(&
s->vb);
194 vorbis_dsp_clear(&
s->vd);
195 vorbis_info_clear(&
s->vi);
214 vorbis_info_init(&
s->vi);
219 if ((ret = vorbis_analysis_init(&
s->vd, &
s->vi))) {
224 s->dsp_initialized = 1;
225 if ((ret = vorbis_block_init(&
s->vd, &
s->vb))) {
231 vorbis_comment_init(&
s->vc);
235 if ((ret = vorbis_analysis_headerout(&
s->vd, &
s->vc, &
header, &header_comm,
256 memcpy(&p[
offset], header_comm.packet, header_comm.bytes);
257 offset += header_comm.bytes;
258 memcpy(&p[
offset], header_code.packet, header_code.bytes);
259 offset += header_code.bytes;
268 vorbis_comment_clear(&
s->vc);
298 buffer = vorbis_analysis_buffer(&
s->vd, samples);
305 if ((ret = vorbis_analysis_wrote(&
s->vd, samples)) < 0) {
312 if (!
s->eof &&
s->afq.frame_alloc)
313 if ((ret = vorbis_analysis_wrote(&
s->vd, 0)) < 0) {
321 while ((ret = vorbis_analysis_blockout(&
s->vd, &
s->vb)) == 1) {
322 if ((ret = vorbis_analysis(&
s->vb,
NULL)) < 0)
324 if ((ret = vorbis_bitrate_addblock(&
s->vb)) < 0)
328 while ((ret = vorbis_bitrate_flushpacket(&
s->vd, &
op)) == 1) {
391 .wrapper_name =
"libvorbis",
static enum AVSampleFormat sample_fmts[]
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
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.
Libavcodec external API header.
static av_cold int init(AVCodecContext *avctx)
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
a very simple circular buffer FIFO implementation
#define AV_CH_LAYOUT_QUAD
#define AV_CH_LAYOUT_5POINT0
#define AV_CH_LAYOUT_7POINT1
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.
#define AV_CH_LAYOUT_5POINT0_BACK
#define AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_5POINT1
#define AV_CH_LAYOUT_5POINT1_BACK
#define AV_CH_BACK_CENTER
#define AV_CH_FRONT_CENTER
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#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_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_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
Encode extradata length to a buffer.
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
AVSampleFormat
Audio sample formats.
@ AV_SAMPLE_FMT_FLTP
float, planar
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define LIBAVUTIL_VERSION_INT
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 av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
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 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 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...
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
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.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static av_cold int libvorbis_encode_close(AVCodecContext *avctx)
static const AVCodecDefault defaults[]
static int libvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
static const AVOption options[]
static int vorbis_error_to_averror(int ov_err)
static const AVClass vorbis_class
static av_cold int libvorbis_encode_init(AVCodecContext *avctx)
AVCodec ff_libvorbis_encoder
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)
static int ogg_packet(AVFormatContext *s, int *sid, int *dstart, int *dsize, int64_t *fpos)
find the next Ogg packet
#define AV_OPT_FLAG_AUDIO_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
static const uint8_t header[24]
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.
int global_quality
Global quality for codecs which cannot change it per frame.
int64_t bit_rate
the average bitrate
int initial_padding
Audio only.
int sample_rate
samples per second
int64_t rc_max_rate
maximum bitrate
int flags
AV_CODEC_FLAG_*.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int channels
number of audio channels
int64_t rc_min_rate
minimum bitrate
int cutoff
Audio cutoff bandwidth (0 means "automatic")
uint64_t channel_layout
Audio channel layout.
int frame_size
Number of samples per channel in an audio frame.
const char * name
Name of the codec implementation.
This structure describes decoded (raw) audio or video data.
int nb_samples
number of audio samples (per channel) described by this frame
uint8_t ** extended_data
pointers to the data planes/channels.
This structure stores compressed data.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
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
AVClass * av_class
class for AVOptions
AVFifoBuffer * pkt_fifo
output packet buffer
vorbis_info vi
vorbis_info used during init
AVVorbisParseContext * vp
parse context to get durations
vorbis_block vb
vorbis_block used for analysis
static void error(const char *err)
static const uint8_t offset[127][2]
void av_vorbis_parse_free(AVVorbisParseContext **s)
Free the parser and everything associated with it.
int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, int buf_size)
Get the duration for a Vorbis packet.
AVVorbisParseContext * av_vorbis_parse_init(const uint8_t *extradata, int extradata_size)
Allocate and initialize the Vorbis parser using headers in the extradata.
A public API for Vorbis parsing.