27 #include <vorbis/vorbisenc.h>
29 #include "libavutil/fifo.h"
30 #include "libavutil/opt.h"
46 #define LIBVORBIS_FRAME_SIZE 64
48 #define BUFFER_SIZE (1024 * 64)
82 case OV_EINVAL:
return AVERROR(EINVAL);
83 case OV_EIMPL:
return AVERROR(EINVAL);
103 if ((ret = vorbis_encode_setup_vbr(vi, avctx->
channels,
112 if ((ret = vorbis_encode_setup_managed(vi, avctx->
channels,
118 if (minrate == -1 && maxrate == -1)
119 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET,
NULL)))
125 cfreq = avctx->
cutoff / 1000.0;
126 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)))
132 if ((ret = vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &s->
iblock)))
136 if ((ret = vorbis_encode_setup_init(vi)))
147 return 1 + l / 255 + l;
156 vorbis_analysis_wrote(&s->
vd, 0);
158 vorbis_block_clear(&s->
vb);
159 vorbis_dsp_clear(&s->
vd);
160 vorbis_info_clear(&s->
vi);
177 vorbis_info_init(&s->
vi);
182 if ((ret = vorbis_analysis_init(&s->
vd, &s->
vi))) {
188 if ((ret = vorbis_block_init(&s->
vd, &s->
vb))) {
194 vorbis_comment_init(&s->
vc);
197 if ((ret = vorbis_analysis_headerout(&s->
vd, &s->
vc, &header, &header_comm,
216 memcpy(&p[offset], header.packet, header.bytes);
217 offset += header.bytes;
218 memcpy(&p[offset], header_comm.packet, header_comm.bytes);
219 offset += header_comm.bytes;
220 memcpy(&p[offset], header_code.packet, header_code.bytes);
221 offset += header_code.bytes;
229 vorbis_comment_clear(&s->
vc);
247 const AVFrame *frame,
int *got_packet_ptr)
257 int c, channels = s->
vi.channels;
259 buffer = vorbis_analysis_buffer(&s->
vd, samples);
260 for (c = 0; c < channels; c++) {
261 int co = (channels > 8) ? c :
264 samples *
sizeof(*buffer[c]));
266 if ((ret = vorbis_analysis_wrote(&s->
vd, samples)) < 0) {
274 if ((ret = vorbis_analysis_wrote(&s->
vd, 0)) < 0) {
282 while ((ret = vorbis_analysis_blockout(&s->
vd, &s->
vb)) == 1) {
283 if ((ret = vorbis_analysis(&s->
vb,
NULL)) < 0)
285 if ((ret = vorbis_bitrate_addblock(&s->
vb)) < 0)
289 while ((ret = vorbis_bitrate_flushpacket(&s->
vd, &op)) == 1) {
349 .priv_class = &
class,
static const AVCodecDefault defaults[]
This structure describes decoded (raw) audio or video data.
int dsp_initialized
vd has been initialized
#define LIBVORBIS_FRAME_SIZE
int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf, int buf_size)
Get the duration for a Vorbis packet.
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...
AVFifoBuffer * pkt_fifo
output packet buffer
AudioFrameQueue afq
frame queue for timestamps
double iblock
impulse block bias option
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 ...
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
static av_cold int libvorbis_encode_close(AVCodecContext *avctx)
const char * name
Name of the codec implementation.
vorbis_info vi
vorbis_info used during init
static const AVOption options[]
static av_cold int libvorbis_encode_init(AVCodecContext *avctx)
void av_fifo_free(AVFifoBuffer *f)
Free an AVFifoBuffer.
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
vorbis_block vb
vorbis_block used for analysis
AVCodec ff_libvorbis_encoder
#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. ...
static int vorbis_error_to_averror(int ov_err)
#define CODEC_FLAG_QSCALE
Use fixed qscale.
int rc_max_rate
maximum bitrate
static av_cold int libvorbis_setup(vorbis_info *vi, AVCodecContext *avctx)
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
Libavcodec external API header.
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
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 ...
static int libvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
int ff_alloc_packet(AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
int frame_size
Number of samples per channel in an audio frame.
const uint8_t ff_vorbis_encoding_channel_layout_offsets[8][8]
AVSampleFormat
Audio Sample Formats.
int sample_rate
samples per second
main external API structure.
static void close(AVCodecParserContext *s)
#define AVERROR_BUG
Bug detected, please report the issue.
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
Encode extradata length to a buffer.
VorbisParseContext vp
parse context to get durations
Describe the class of an AVClass context structure.
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
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.
vorbis_dsp_state vd
DSP state used for analysis.
vorbis_comment vc
VorbisComment info.
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.
common internal api header.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
static av_cold int init(AVCodecParserContext *s)
#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")
AVClass * av_class
class for AVOptions
static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, int64_t *fpos)
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
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
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
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...
static int xiph_len(int l)