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];
1048 for (ch = 0; ch <
channels; ch++) {
1050 memset(
f->extended_data[ch], 0,
bps *
f->nb_samples);
1065 for (ch = 0; ch < venc->
channels; ch++)
1069 for (ch = 0; ch < venc->
channels; ch++)
1072 for (sf = 0; sf < subframes; sf++) {
1075 for (ch = 0; ch < venc->
channels; ch++) {
1082 memcpy(save + sf*sf_size,
input,
len);
1094 int i,
ret, need_more;
1113 need_more =
frame && need_more;
1123 for (
i = 0;
i < frames_needed;
i++) {
1149 if (
mode->blockflag) {
1199 *got_packet_ptr = 1;
1271 av_log(avctx,
AV_LOG_ERROR,
"Current FFmpeg Vorbis encoder only supports 2 channels.\n");
static void error(const char *err)
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_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
static const struct @162 floor_classes[]
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.
uint64_t channel_layout
Audio channel layout.
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)
static enum AVSampleFormat sample_fmts[]
#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
const AVCodec ff_vorbis_encoder
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)
static double b1(void *priv, double x, double y)
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_*.
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.
#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)
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
int channels
number of audio channels
#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.
static const struct @161 cvectors[]
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.
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)
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)