21 #include <vorbis/vorbisenc.h>
23 #include "libavutil/avassert.h"
24 #include "libavutil/fifo.h"
25 #include "libavutil/opt.h"
38 #define OGGVORBIS_FRAME_SIZE 64
40 #define BUFFER_SIZE (1024 * 64)
78 case OV_EINVAL:
return AVERROR(EINVAL);
79 case OV_EIMPL:
return AVERROR(EINVAL);
100 if ((ret = vorbis_encode_setup_vbr(vi, avctx->
channels,
109 if ((ret = vorbis_encode_setup_managed(vi, avctx->
channels,
115 if (minrate == -1 && maxrate == -1)
116 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET, NULL)))
122 cfreq = avctx->
cutoff / 1000.0;
123 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)))
129 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &s->
iblock)))
153 "output stream will have incorrect "
154 "channel layout.\n", name);
157 "will use Vorbis channel layout for "
162 if ((ret = vorbis_encode_setup_init(vi)))
173 return 1 + l / 255 + l;
182 vorbis_analysis_wrote(&s->
vd, 0);
184 vorbis_block_clear(&s->
vb);
185 vorbis_dsp_clear(&s->
vd);
186 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;
256 vorbis_comment_clear(&s->
vc);
284 int c, channels = s->
vi.channels;
286 buffer = vorbis_analysis_buffer(&s->
vd, samples);
287 for (c = 0; c < channels; c++) {
288 int co = (channels > 8) ? c :
291 samples *
sizeof(*buffer[c]));
293 if ((ret = vorbis_analysis_wrote(&s->
vd, samples)) < 0) {
301 if ((ret = vorbis_analysis_wrote(&s->
vd, 0)) < 0) {
309 while ((ret = vorbis_analysis_blockout(&s->
vd, &s->
vb)) == 1) {
310 if ((ret = vorbis_analysis(&s->
vb, NULL)) < 0)
312 if ((ret = vorbis_bitrate_addblock(&s->
vb)) < 0)
316 while ((ret = vorbis_bitrate_flushpacket(&s->
vd, &op)) == 1) {
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and/or allocate data.
#define AV_CH_LAYOUT_7POINT1
This structure describes decoded (raw) audio or video data.
VorbisParseContext vp
parse context to get durations
int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf, int buf_size)
Get the duration for a Vorbis packet.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
static av_cold int init(AVCodecContext *avctx)
uint8_t ** extended_data
pointers to the data planes/channels.
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
double iblock
impulse block bias option
static av_cold int oggvorbis_encode_close(AVCodecContext *avctx)
#define AV_CH_LAYOUT_STEREO
AVClass * av_class
class for AVOptions
#define AV_CH_LAYOUT_5POINT0
static int xiph_len(int l)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
void av_freep(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
int av_fifo_size(AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
const char * av_default_item_name(void *ctx)
Return the context name.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static const uint8_t offset[511][2]
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
static av_cold int oggvorbis_encode_init(AVCodecContext *avctx)
const char * name
Name of the codec implementation.
static const AVCodecDefault defaults[]
#define CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
void av_fifo_free(AVFifoBuffer *f)
Free an AVFifoBuffer.
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
const OptionDef options[]
vorbis_dsp_state vd
DSP state used for analysis.
static const AVClass vorbis_class
#define AV_CH_LAYOUT_5POINT1
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_OPT_FLAG_AUDIO_PARAM
#define CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define CODEC_FLAG_QSCALE
Use fixed qscale.
int rc_max_rate
maximum bitrate
#define AV_CH_LAYOUT_QUAD
AVCodec ff_libvorbis_encoder
int dsp_initialized
vd has been initialized
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
Libavcodec external API header.
uint64_t channel_layout
Audio channel layout.
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.
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int bit_rate
the average bitrate
vorbis_info vi
vorbis_info used during init
void * av_malloc(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
vorbis_comment vc
VorbisComment info.
#define AV_CH_FRONT_CENTER
#define AV_CH_LAYOUT_5POINT1_BACK
int frame_size
Number of samples per channel in an audio frame.
AVSampleFormat
Audio Sample Formats.
const uint8_t ff_vorbis_encoding_channel_layout_offsets[8][8]
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.
static void close(AVCodecParserContext *s)
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
Encode extradata length to a buffer.
Describe the class of an AVClass context structure.
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
#define AV_CH_LAYOUT_5POINT0_BACK
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 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 oggvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
static int vorbis_error_to_averror(int ov_err)
common internal api header.
static av_cold int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avctx)
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
int cutoff
Audio cutoff bandwidth (0 means "automatic")
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int *duration)
Remove frame(s) from the queue.
int channels
number of audio channels
AVFifoBuffer * pkt_fifo
output packet buffer
#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[]
int avpriv_vorbis_parse_extradata(AVCodecContext *avctx, VorbisParseContext *s)
Initialize the Vorbis parser using headers in the extradata.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
int rc_min_rate
minimum bitrate
int av_fifo_space(AVFifoBuffer *f)
Return the amount of space in bytes in the AVFifoBuffer, that is the amount of data you can write int...
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 OGGVORBIS_FRAME_SIZE
AudioFrameQueue afq
frame queue for timestamps
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.