27 #include <vorbis/vorbisenc.h>
46 #define OGGVORBIS_FRAME_SIZE 64
48 #define BUFFER_SIZE (1024 * 64)
82 case OV_EINVAL:
return AVERROR(EINVAL);
83 case OV_EIMPL:
return AVERROR(EINVAL);
104 if ((ret = vorbis_encode_setup_vbr(vi, avctx->
channels,
113 if ((ret = vorbis_encode_setup_managed(vi, avctx->
channels,
119 if (minrate == -1 && maxrate == -1)
120 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET,
NULL)))
126 cfreq = avctx->
cutoff / 1000.0;
127 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)))
133 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &s->
iblock)))
137 if ((ret = vorbis_encode_setup_init(vi)))
148 return 1 + l / 255 + l;
157 vorbis_analysis_wrote(&s->
vd, 0);
159 vorbis_block_clear(&s->
vb);
160 vorbis_dsp_clear(&s->
vd);
161 vorbis_info_clear(&s->
vi);
165 #if FF_API_OLD_ENCODE_AUDIO
181 vorbis_info_init(&s->
vi);
186 if ((ret = vorbis_analysis_init(&s->
vd, &s->
vi))) {
192 if ((ret = vorbis_block_init(&s->
vd, &s->
vb))) {
198 vorbis_comment_init(&s->
vc);
201 if ((ret = vorbis_analysis_headerout(&s->
vd, &s->
vc, &header, &header_comm,
220 memcpy(&p[offset], header.packet, header.bytes);
221 offset += header.bytes;
222 memcpy(&p[offset], header_comm.packet, header_comm.bytes);
223 offset += header_comm.bytes;
224 memcpy(&p[offset], header_code.packet, header_code.bytes);
225 offset += header_code.bytes;
233 vorbis_comment_clear(&s->
vc);
244 #if FF_API_OLD_ENCODE_AUDIO
259 const AVFrame *frame,
int *got_packet_ptr)
269 int c, channels = s->
vi.channels;
271 buffer = vorbis_analysis_buffer(&s->
vd, samples);
272 for (c = 0; c < channels; c++) {
273 int co = (channels > 8) ? c :
276 samples *
sizeof(*buffer[c]));
278 if ((ret = vorbis_analysis_wrote(&s->
vd, samples)) < 0) {
286 if ((ret = vorbis_analysis_wrote(&s->
vd, 0)) < 0) {
294 while ((ret = vorbis_analysis_blockout(&s->
vd, &s->
vb)) == 1) {
295 if ((ret = vorbis_analysis(&s->
vb,
NULL)) < 0)
297 if ((ret = vorbis_bitrate_addblock(&s->
vb)) < 0)
301 while ((ret = vorbis_bitrate_flushpacket(&s->
vd, &op)) == 1) {
361 .priv_class = &
class,
static const AVCodecDefault defaults[]
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
#define OGGVORBIS_FRAME_SIZE
This structure describes decoded (raw) audio or video data.
static int oggvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf, int buf_size)
Get the duration for a Vorbis packet.
AVFrame * coded_frame
the picture in the bitstream
struct OggVorbisContext OggVorbisContext
#define AV_OPT_FLAG_AUDIO_PARAM
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.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
AVFifoBuffer * pkt_fifo
output packet buffer
#define CODEC_FLAG_QSCALE
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static const AVOption options[]
void av_fifo_free(AVFifoBuffer *f)
Free an AVFifoBuffer.
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
static int init(AVCodecParserContext *s)
AVCodec ff_libvorbis_encoder
int dsp_initialized
vd has been initialized
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static int vorbis_error_to_averror(int ov_err)
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 rc_max_rate
maximum bitrate
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation.
double iblock
impulse block bias option
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
vorbis_dsp_state vd
DSP state used for analysis.
AVFrame * avcodec_alloc_frame(void)
Allocate an AVFrame and set its fields to default values.
int bit_rate
the average bitrate
int ff_alloc_packet(AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
#define AV_OPT_FLAG_ENCODING_PARAM
static av_cold int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avctx)
AVClass * av_class
class for AVOptions
int frame_size
Number of samples per channel in an audio frame.
const uint8_t ff_vorbis_encoding_channel_layout_offsets[8][8]
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...
VorbisParseContext vp
parse context to get durations
int sample_rate
samples per second
main external API structure.
static void close(AVCodecParserContext *s)
a very simple circular buffer FIFO implementation
AudioFrameQueue afq
frame queue for timestamps
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
Encode extradata length to a buffer.
Describe the class of an AVClass context structure.
vorbis_block vb
vorbis_block used for analysis
vorbis_info vi
vorbis_info used during init
#define FF_INPUT_BUFFER_PADDING_SIZE
int global_quality
Global quality for codecs which cannot change it per frame.
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.
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 ...
common internal api header.
AVSampleFormat
Audio Sample Formats.
int cutoff
Audio cutoff bandwidth (0 means "automatic")
static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, int64_t *fpos)
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
static av_cold int oggvorbis_encode_close(AVCodecContext *avctx)
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
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
int avpriv_vorbis_parse_extradata(AVCodecContext *avctx, VorbisParseContext *s)
Initialize the Vorbis parser using headers in the extradata.
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
uint8_t ** extended_data
pointers to the data planes/channels.
static av_cold int oggvorbis_encode_init(AVCodecContext *avctx)
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...
static int xiph_len(int l)
vorbis_comment vc
VorbisComment info.