Go to the documentation of this file.
   41 #define BITSTREAM_WRITER_LE 
  142 #define MAX_CHANNELS     2 
  143 #define MAX_CODEBOOK_DIM 8 
  145 #define MAX_FLOOR_CLASS_DIM  4 
  146 #define NUM_FLOOR_PARTITIONS 8 
  147 #define MAX_FLOOR_VALUES     (MAX_FLOOR_CLASS_DIM*NUM_FLOOR_PARTITIONS+2) 
  149 #define RESIDUE_SIZE           1600 
  150 #define RESIDUE_PART_SIZE      32 
  151 #define NUM_RESIDUE_PARTITIONS (RESIDUE_SIZE/RESIDUE_PART_SIZE) 
  170         return dimensions *entries;
 
  186         if (!
cb->dimensions || !
cb->pow2)
 
  188         for (
i = 0; 
i < 
cb->nentries; 
i++) {
 
  192             for (j = 0; j < 
cb->ndimensions; j++) {
 
  195                     off = (
i / div) % vals; 
 
  197                     off = 
i * 
cb->ndimensions + j; 
 
  199                 cb->dimensions[
i * 
cb->ndimensions + j] = last + 
cb->min + 
cb->quantlist[off] * 
cb->delta;
 
  201                     last = 
cb->dimensions[
i * 
cb->ndimensions + j];
 
  202                 cb->pow2[
i] += 
cb->dimensions[
i * 
cb->ndimensions + j] * 
cb->dimensions[
i * 
cb->ndimensions + j];
 
  221         for (j = 0; j < 8; j++)
 
  222             if (rc->
books[
i][j] != -1)
 
  227         assert(
cb->ndimensions >= 2);
 
  230         for (j = 0; j < 
cb->nentries; j++) {
 
  234             a = 
fabs(
cb->dimensions[j * 
cb->ndimensions]);
 
  237             a = 
fabs(
cb->dimensions[j * 
cb->ndimensions + 1]);
 
  276     const uint8_t *clens, *
quant;
 
  293     for (book = 0; book < venc->
ncodebooks; book++) {
 
  305         if (!
cb->lens || !
cb->codewords)
 
  316             for (
i = 0; 
i < vals; 
i++)
 
  333     fc->partition_to_class = 
av_malloc(
sizeof(
int) * 
fc->partitions);
 
  334     if (!
fc->partition_to_class)
 
  337     for (
i = 0; 
i < 
fc->partitions; 
i++) {
 
  338         static const int a[] = {0, 1, 2, 2, 3, 3, 4, 4};
 
  339         fc->partition_to_class[
i] = 
a[
i];
 
  340         fc->nclasses = 
FFMAX(
fc->nclasses, 
fc->partition_to_class[
i]);
 
  346     for (
i = 0; 
i < 
fc->nclasses; 
i++) {
 
  352         books         = (1 << 
c->subclass);
 
  356         for (j = 0; j < books; j++)
 
  363     for (
i = 0; 
i < 
fc->partitions; 
i++)
 
  364         fc->values += 
fc->classes[
fc->partition_to_class[
i]].dim;
 
  370     fc->list[1].x = 1 << 
fc->rangebits;
 
  371     for (
i = 2; 
i < 
fc->values; 
i++) {
 
  372         static const int a[] = {
 
  373              93, 23,372,  6, 46,186,750, 14, 33, 65,
 
  374             130,260,556,  3, 10, 18, 28, 39, 55, 79,
 
  375             111,158,220,312,464,650,850
 
  377         fc->list[
i].x = 
a[
i - 2];
 
  399         static const int8_t 
a[10][8] = {
 
  400             { -1, -1, -1, -1, -1, -1, -1, -1, },
 
  401             { -1, -1, 16, -1, -1, -1, -1, -1, },
 
  402             { -1, -1, 17, -1, -1, -1, -1, -1, },
 
  403             { -1, -1, 18, -1, -1, -1, -1, -1, },
 
  404             { -1, -1, 19, -1, -1, -1, -1, -1, },
 
  405             { -1, -1, 20, -1, -1, -1, -1, -1, },
 
  406             { -1, -1, 21, -1, -1, -1, -1, -1, },
 
  407             { 22, 23, -1, -1, -1, -1, -1, -1, },
 
  408             { 24, 25, -1, -1, -1, -1, -1, -1, },
 
  409             { 26, 27, 28, -1, -1, -1, -1, -1, },
 
  411         memcpy(rc->
books, 
a, 
sizeof a);
 
  431     if (!
mc->floor || !
mc->residue)
 
  433     for (
i = 0; 
i < 
mc->submaps; 
i++) {
 
  437     mc->coupling_steps = venc->
channels == 2 ? 1 : 0;
 
  440     if (!
mc->magnitude || !
mc->angle)
 
  442     if (
mc->coupling_steps) {
 
  443         mc->magnitude[0] = 0;
 
  479     mant = (
int)ldexp(frexp(
f, &
exp), 20);
 
  485     res |= mant | (
exp << 21);
 
  498     for (
i = 1; 
i < 
cb->nentries; 
i++)
 
  499         if (
cb->lens[
i] < 
cb->lens[
i-1])
 
  501     if (
i == 
cb->nentries)
 
  506         int len = 
cb->lens[0];
 
  509         while (i < cb->nentries) {
 
  511             for (j = 0; j+
i < 
cb->nentries; j++)
 
  520         for (
i = 0; 
i < 
cb->nentries; 
i++)
 
  523         if (
i != 
cb->nentries)
 
  527         for (
i = 0; 
i < 
cb->nentries; 
i++) {
 
  562     for (
i = 0; 
i < 
fc->partitions; 
i++)
 
  565     for (
i = 0; 
i < 
fc->nclasses; 
i++) {
 
  571         if (
fc->classes[
i].subclass)
 
  574         books = (1 << 
fc->classes[
i].subclass);
 
  576         for (j = 0; j < books; j++)
 
  583     for (
i = 2; 
i < 
fc->values; 
i++)
 
  601         for (j = 0; j < 8; j++)
 
  613         for (j = 0; j < 8; j++)
 
  614             if (rc->
books[
i][j] != -1)
 
  624     int buffer_len = 50000;
 
  632     for (
i = 0; 
"vorbis"[
i]; 
i++)
 
  646     buffer_len -= hlens[0];
 
  652     for (
i = 0; 
"vorbis"[
i]; 
i++)
 
  660     buffer_len -= hlens[1];
 
  666     for (
i = 0; 
"vorbis"[
i]; 
i++)
 
  700         if (
mc->coupling_steps) {
 
  702             for (j = 0; j < 
mc->coupling_steps; j++) {
 
  711             for (j = 0; j < venc->
channels; j++)
 
  714         for (j = 0; j < 
mc->submaps; j++) {
 
  735     len = hlens[0] + hlens[1] + hlens[2];
 
  744     for (
i = 0; 
i < 3; 
i++) {
 
  745         memcpy(p, 
buffer + buffer_len, hlens[
i]);
 
  747         buffer_len += hlens[
i];
 
  756     int begin = 
fc->list[
fc->list[
FFMAX(
i-1, 0)].sort].x;
 
  757     int end   = 
fc->list[
fc->list[
FFMIN(
i+1, 
fc->values - 1)].sort].x;
 
  761     for (j = begin; j < end; j++)
 
  762         average += 
fabs(coeffs[j]);
 
  763     return average / (end - begin);
 
  767                       float *coeffs, uint16_t *posts, 
int samples)
 
  769     int range = 255 / 
fc->multiplier + 1;
 
  771     float tot_average = 0.0;
 
  773     for (
i = 0; 
i < 
fc->values; 
i++) {
 
  775         tot_average += averages[
i];
 
  777     tot_average /= 
fc->values;
 
  780     for (
i = 0; 
i < 
fc->values; 
i++) {
 
  781         int position  = 
fc->list[
fc->list[
i].sort].x;
 
  782         float average = averages[
i];
 
  785         average = sqrt(tot_average * average) * pow(1.25
f, position*0.005
f); 
 
  786         for (j = 0; j < range - 1; j++)
 
  789         posts[
fc->list[
i].sort] = j;
 
  795     return y0 +  (x - x0) * (y1 - y0) / (x1 - x0);
 
  802     int range = 255 / 
fc->multiplier + 1;
 
  811     coded[0] = coded[1] = 1;
 
  813     for (
i = 2; 
i < 
fc->values; 
i++) {
 
  815                                      posts[
fc->list[
i].low],
 
  816                                      fc->list[
fc->list[
i].high].x,
 
  817                                      posts[
fc->list[
i].high],
 
  819         int highroom = range - predicted;
 
  820         int lowroom = predicted;
 
  821         int room = 
FFMIN(highroom, lowroom);
 
  822         if (predicted == posts[
i]) {
 
  826             if (!coded[
fc->list[
i].low ])
 
  827                 coded[
fc->list[
i].low ] = -1;
 
  828             if (!coded[
fc->list[
i].high])
 
  829                 coded[
fc->list[
i].high] = -1;
 
  831         if (posts[
i] > predicted) {
 
  832             if (posts[
i] - predicted > room)
 
  833                 coded[
i] = posts[
i] - predicted + lowroom;
 
  835                 coded[
i] = (posts[
i] - predicted) << 1;
 
  837             if (predicted - posts[
i] > room)
 
  838                 coded[
i] = predicted - posts[
i] + highroom - 1;
 
  840                 coded[
i] = ((predicted - posts[
i]) << 1) - 1;
 
  845     for (
i = 0; 
i < 
fc->partitions; 
i++) {
 
  847         int k, cval = 0, csub = 1<<
c->subclass;
 
  851             for (k = 0; k < 
c->dim; k++) {
 
  853                 for (l = 0; l < csub; l++) {
 
  855                     if (
c->books[l] != -1)
 
  858                     if (coded[counter + k] < maxval)
 
  863                 cshift += 
c->subclass;
 
  868         for (k = 0; k < 
c->dim; k++) {
 
  869             int book  = 
c->books[cval & (csub-1)];
 
  870             int entry = coded[counter++];
 
  871             cval >>= 
c->subclass;
 
  899             d -= vec[j] * num[j];
 
  914     int pass, 
i, j, p, k;
 
  916     int partitions = (rc->
end - rc->
begin) / psize;
 
  923     for (p = 0; p < partitions; p++) {
 
  924         float max1 = 0.0, max2 = 0.0;
 
  925         int s = rc->
begin + p * psize;
 
  926         for (k = 
s; k < 
s + psize; k += 2) {
 
  927             max1 = 
FFMAX(max1, 
fabs(coeffs[          k / real_ch]));
 
  932             if (max1 < rc->maxes[
i][0] && max2 < rc->maxes[
i][1])
 
  939         while (p < partitions) {
 
  944                     for (
i = 0; 
i < classwords; 
i++) {
 
  946                         entry += classes[j][p + 
i];
 
  951             for (
i = 0; 
i < classwords && p < partitions; 
i++, p++) {
 
  953                     int nbook = rc->
books[classes[j][p]][
pass];
 
  959                     assert(rc->
type == 0 || rc->
type == 2);
 
 1008     const float * 
win = venc->
win[1];
 
 1049     for (ch = 0; ch < 
channels; ch++) {
 
 1051         memset(
f->extended_data[ch], 0, 
bps * 
f->nb_samples);
 
 1066         for (ch = 0; ch < venc->
channels; ch++)
 
 1070         for (ch = 0; ch < venc->
channels; ch++)
 
 1073     for (sf = 0; sf < subframes; sf++) {
 
 1076         for (ch = 0; ch < venc->
channels; ch++) {
 
 1083             memcpy(save + sf*sf_size, 
input, 
len);   
 
 1095     int i, 
ret, need_more;
 
 1114     need_more = 
frame && need_more;
 
 1124             for (
i = 0; 
i < frames_needed; 
i++) {
 
 1150     if (
mode->blockflag) {
 
 1200     *got_packet_ptr = 1;
 
 1272         av_log(avctx, 
AV_LOG_ERROR, 
"Current FFmpeg Vorbis encoder only supports 2 channels.\n");
 
  
int frame_size
Number of samples per channel in an audio frame.
 
static void put_codebook_header(PutBitContext *pb, vorbis_enc_codebook *cb)
 
@ AV_SAMPLE_FMT_FLTP
float, planar
 
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
 
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
 
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
 
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
Remove frame(s) from the queue.
 
static void put_residue_header(PutBitContext *pb, vorbis_enc_residue *rc)
 
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
 
static int put_bytes_output(const PutBitContext *s)
 
int sample_rate
samples per second
 
static double cb(void *priv, double x, double y)
 
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
 
static av_cold int vorbis_encode_init(AVCodecContext *avctx)
 
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
 
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
 
void(* vector_fmul_reverse)(float *dst, const float *src0, const float *src1, int len)
Calculate the entry wise product of two vectors of floats, and store the result in a vector of floats...
 
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
 
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
 
void(* mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input)
 
This structure describes decoded (raw) audio or video data.
 
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
 
const float *const ff_vorbis_vwin[8]
 
static const uint8_t codebooks[]
 
#define fc(width, name, range_min, range_max)
 
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
 
#define NUM_FLOOR_PARTITIONS
 
int nb_channels
Number of channels in this layout.
 
static void put_floor_header(PutBitContext *pb, vorbis_enc_floor *fc)
 
unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n)
 
static AVFrame * ff_bufqueue_get(struct FFBufQueue *queue)
Get the first buffer from the queue and remove it.
 
static av_cold int vorbis_encode_close(AVCodecContext *avctx)
 
static float win(SuperEqualizerContext *s, float n, int N)
 
vorbis_floor1_entry * list
 
static float * put_vector(vorbis_enc_codebook *book, PutBitContext *pb, float *num)
 
AVCodec p
The public AVCodec.
 
static double b1(void *priv, double x, double y)
 
AVChannelLayout ch_layout
Audio channel layout.
 
static AVFrame * spawn_empty_frame(AVCodecContext *avctx, int channels)
 
void ff_vorbis_floor1_render_list(vorbis_floor1_entry *list, int values, uint16_t *y_list, int *flag, int multiplier, float *out, int samples)
 
int initial_padding
Audio only.
 
static int put_bits_left(PutBitContext *s)
 
int flags
AV_CODEC_FLAG_*.
 
#define FF_CODEC_ENCODE_CB(func)
 
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
 
static int quant(float coef, const float Q, const float rounding)
Quantize one coefficient.
 
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
 
static const struct @166 cvectors[]
 
static const struct @167 floor_classes[]
 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
 
static void put_float(PutBitContext *pb, float f)
 
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
 
#define FF_ARRAY_ELEMS(a)
 
int global_quality
Global quality for codecs which cannot change it per frame.
 
static int put_main_header(vorbis_enc_context *venc, uint8_t **out)
 
static __device__ float floor(float a)
 
static av_cold int dsp_init(AVCodecContext *avctx, vorbis_enc_context *venc)
 
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
 
static int vorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
 
#define av_assert0(cond)
assert() equivalent, that is always enabled.
 
int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, unsigned num)
 
vorbis_enc_residue * residues
 
vorbis_enc_floor_class * classes
 
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
 
static float get_floor_average(vorbis_enc_floor *fc, float *coeffs, int i)
 
static __device__ float fabs(float a)
 
static int residue_encode(vorbis_enc_context *venc, vorbis_enc_residue *rc, PutBitContext *pb, float *coeffs, int samples, int real_ch)
 
void(* vector_fmul_scalar)(float *dst, const float *src, float mul, int len)
Multiply a vector of floats by a scalar float.
 
int64_t bit_rate
the average bitrate
 
static void ff_bufqueue_discard_all(struct FFBufQueue *queue)
Unref and remove all buffers from the queue.
 
static void floor_fit(vorbis_enc_context *venc, vorbis_enc_floor *fc, float *coeffs, uint16_t *posts, int samples)
 
static int floor_encode(vorbis_enc_context *venc, vorbis_enc_floor *fc, PutBitContext *pb, uint16_t *posts, float *floor, int samples)
 
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
 
static int put_codeword(PutBitContext *pb, vorbis_enc_codebook *cb, int entry)
 
int ff_vorbis_ready_floor1_list(AVCodecContext *avctx, vorbis_floor1_entry *list, int values)
 
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
 
void(* vector_fmul)(float *dst, const float *src0, const float *src1, int len)
Calculate the entry wise product of two vectors of floats and store the result in a vector of floats.
 
static int render_point(int x0, int y0, int x1, int y1, int x)
 
enum AVSampleFormat sample_fmt
audio sample format
 
static int apply_window_and_mdct(vorbis_enc_context *venc)
 
static void move_audio(vorbis_enc_context *venc, int sf_size)
 
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
Encode extradata length to a buffer.
 
static double b2(void *priv, double x, double y)
 
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
 
static int ready_residue(vorbis_enc_residue *rc, vorbis_enc_context *venc)
 
vorbis_enc_floor * floors
 
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
 
static void ff_bufqueue_add(void *log, struct FFBufQueue *queue, AVFrame *buf)
Add a buffer to the queue.
 
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some input
 
vorbis_enc_mapping * mappings
 
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
 
int nb_samples
number of audio samples (per channel) described by this frame
 
static int ready_codebook(vorbis_enc_codebook *cb)
 
#define i(width, name, range_min, range_max)
 
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
 
static int create_vorbis_context(vorbis_enc_context *venc, AVCodecContext *avctx)
 
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
 
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
 
Structure holding the queue.
 
uint8_t ** extended_data
pointers to the data planes/channels.
 
#define av_malloc_array(a, b)
 
unsigned short available
number of available buffers
 
AVSampleFormat
Audio sample formats.
 
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
 
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
 
const char * name
Name of the codec implementation.
 
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
 
void * av_calloc(size_t nmemb, size_t size)
 
const FFCodec ff_vorbis_encoder
 
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
 
const float ff_vorbis_floor1_inverse_db_table[256]
 
main external API structure.
 
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
 
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
 
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
 
Filter the word “frame” indicates either a video frame or a group of audio samples
 
struct FFBufQueue bufqueue
 
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
 
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
 
This structure stores compressed data.
 
vorbis_enc_codebook * codebooks
 
#define NUM_RESIDUE_PARTITIONS
 
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
 
static const uint8_t quant_tables[]
 
static float distance(float x, float y, int band)
 
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
 
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
 
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
 
static int cb_lookup_vals(int lookup, int dimensions, int entries)