Go to the documentation of this file.
42 #define BITSTREAM_WRITER_LE
144 #define MAX_CHANNELS 2
145 #define MAX_CODEBOOK_DIM 8
147 #define MAX_FLOOR_CLASS_DIM 4
148 #define NUM_FLOOR_PARTITIONS 8
149 #define MAX_FLOOR_VALUES (MAX_FLOOR_CLASS_DIM*NUM_FLOOR_PARTITIONS+2)
151 #define RESIDUE_SIZE 1600
152 #define RESIDUE_PART_SIZE 32
153 #define NUM_RESIDUE_PARTITIONS (RESIDUE_SIZE/RESIDUE_PART_SIZE)
172 return dimensions *entries;
188 if (!
cb->dimensions || !
cb->pow2)
190 for (
i = 0;
i <
cb->nentries;
i++) {
194 for (j = 0; j <
cb->ndimensions; j++) {
197 off = (
i / div) % vals;
199 off =
i *
cb->ndimensions + j;
201 cb->dimensions[
i *
cb->ndimensions + j] = last +
cb->min +
cb->quantlist[off] *
cb->delta;
203 last =
cb->dimensions[
i *
cb->ndimensions + j];
204 cb->pow2[
i] +=
cb->dimensions[
i *
cb->ndimensions + j] *
cb->dimensions[
i *
cb->ndimensions + j];
223 for (j = 0; j < 8; j++)
224 if (rc->
books[
i][j] != -1)
229 assert(
cb->ndimensions >= 2);
232 for (j = 0; j <
cb->nentries; j++) {
236 a =
fabs(
cb->dimensions[j *
cb->ndimensions]);
239 a =
fabs(
cb->dimensions[j *
cb->ndimensions + 1]);
281 const uint8_t *clens, *
quant;
298 for (book = 0; book < venc->
ncodebooks; book++) {
310 if (!
cb->lens || !
cb->codewords)
321 for (
i = 0;
i < vals;
i++)
338 fc->partition_to_class =
av_malloc(
sizeof(
int) *
fc->partitions);
339 if (!
fc->partition_to_class)
342 for (
i = 0;
i <
fc->partitions;
i++) {
343 static const int a[] = {0, 1, 2, 2, 3, 3, 4, 4};
344 fc->partition_to_class[
i] =
a[
i];
345 fc->nclasses =
FFMAX(
fc->nclasses,
fc->partition_to_class[
i]);
351 for (
i = 0;
i <
fc->nclasses;
i++) {
357 books = (1 <<
c->subclass);
361 for (j = 0; j < books; j++)
368 for (
i = 0;
i <
fc->partitions;
i++)
369 fc->values +=
fc->classes[
fc->partition_to_class[
i]].dim;
375 fc->list[1].x = 1 <<
fc->rangebits;
376 for (
i = 2;
i <
fc->values;
i++) {
377 static const int a[] = {
378 93, 23,372, 6, 46,186,750, 14, 33, 65,
379 130,260,556, 3, 10, 18, 28, 39, 55, 79,
380 111,158,220,312,464,650,850
382 fc->list[
i].x =
a[
i - 2];
404 static const int8_t
a[10][8] = {
405 { -1, -1, -1, -1, -1, -1, -1, -1, },
406 { -1, -1, 16, -1, -1, -1, -1, -1, },
407 { -1, -1, 17, -1, -1, -1, -1, -1, },
408 { -1, -1, 18, -1, -1, -1, -1, -1, },
409 { -1, -1, 19, -1, -1, -1, -1, -1, },
410 { -1, -1, 20, -1, -1, -1, -1, -1, },
411 { -1, -1, 21, -1, -1, -1, -1, -1, },
412 { 22, 23, -1, -1, -1, -1, -1, -1, },
413 { 24, 25, -1, -1, -1, -1, -1, -1, },
414 { 26, 27, 28, -1, -1, -1, -1, -1, },
416 memcpy(rc->
books,
a,
sizeof a);
436 if (!
mc->floor || !
mc->residue)
438 for (
i = 0;
i <
mc->submaps;
i++) {
442 mc->coupling_steps = venc->
channels == 2 ? 1 : 0;
445 if (!
mc->magnitude || !
mc->angle)
447 if (
mc->coupling_steps) {
448 mc->magnitude[0] = 0;
484 mant = (
int)ldexp(frexp(
f, &
exp), 20);
490 res |= mant | (
exp << 21);
503 for (
i = 1;
i <
cb->nentries;
i++)
504 if (
cb->lens[
i] <
cb->lens[
i-1])
506 if (
i ==
cb->nentries)
511 int len =
cb->lens[0];
514 while (i < cb->nentries) {
516 for (j = 0; j+
i <
cb->nentries; j++)
525 for (
i = 0;
i <
cb->nentries;
i++)
528 if (
i !=
cb->nentries)
532 for (
i = 0;
i <
cb->nentries;
i++) {
567 for (
i = 0;
i <
fc->partitions;
i++)
570 for (
i = 0;
i <
fc->nclasses;
i++) {
576 if (
fc->classes[
i].subclass)
579 books = (1 <<
fc->classes[
i].subclass);
581 for (j = 0; j < books; j++)
588 for (
i = 2;
i <
fc->values;
i++)
606 for (j = 0; j < 8; j++)
618 for (j = 0; j < 8; j++)
619 if (rc->
books[
i][j] != -1)
629 int buffer_len = 50000;
637 for (
i = 0;
"vorbis"[
i];
i++)
651 buffer_len -= hlens[0];
657 for (
i = 0;
"vorbis"[
i];
i++)
665 buffer_len -= hlens[1];
671 for (
i = 0;
"vorbis"[
i];
i++)
705 if (
mc->coupling_steps) {
707 for (j = 0; j <
mc->coupling_steps; j++) {
716 for (j = 0; j < venc->
channels; j++)
719 for (j = 0; j <
mc->submaps; j++) {
740 len = hlens[0] + hlens[1] + hlens[2];
749 for (
i = 0;
i < 3;
i++) {
750 memcpy(p,
buffer + buffer_len, hlens[
i]);
752 buffer_len += hlens[
i];
761 int begin =
fc->list[
fc->list[
FFMAX(
i-1, 0)].sort].x;
762 int end =
fc->list[
fc->list[
FFMIN(
i+1,
fc->values - 1)].sort].x;
766 for (j = begin; j < end; j++)
767 average +=
fabs(coeffs[j]);
768 return average / (end - begin);
772 float *coeffs, uint16_t *posts,
int samples)
774 int range = 255 /
fc->multiplier + 1;
776 float tot_average = 0.0;
778 for (
i = 0;
i <
fc->values;
i++) {
780 tot_average += averages[
i];
782 tot_average /=
fc->values;
785 for (
i = 0;
i <
fc->values;
i++) {
786 int position =
fc->list[
fc->list[
i].sort].x;
787 float average = averages[
i];
790 average = sqrt(tot_average * average) * pow(1.25
f, position*0.005
f);
791 for (j = 0; j <
range - 1; j++)
794 posts[
fc->list[
i].sort] = j;
800 return y0 + (x - x0) * (y1 - y0) / (x1 - x0);
807 int range = 255 /
fc->multiplier + 1;
816 coded[0] = coded[1] = 1;
818 for (
i = 2;
i <
fc->values;
i++) {
820 posts[
fc->list[
i].low],
821 fc->list[
fc->list[
i].high].x,
822 posts[
fc->list[
i].high],
824 int highroom =
range - predicted;
825 int lowroom = predicted;
826 int room =
FFMIN(highroom, lowroom);
827 if (predicted == posts[
i]) {
831 if (!coded[
fc->list[
i].low ])
832 coded[
fc->list[
i].low ] = -1;
833 if (!coded[
fc->list[
i].high])
834 coded[
fc->list[
i].high] = -1;
836 if (posts[
i] > predicted) {
837 if (posts[
i] - predicted > room)
838 coded[
i] = posts[
i] - predicted + lowroom;
840 coded[
i] = (posts[
i] - predicted) << 1;
842 if (predicted - posts[
i] > room)
843 coded[
i] = predicted - posts[
i] + highroom - 1;
845 coded[
i] = ((predicted - posts[
i]) << 1) - 1;
850 for (
i = 0;
i <
fc->partitions;
i++) {
852 int k, cval = 0, csub = 1<<
c->subclass;
856 for (k = 0; k <
c->dim; k++) {
858 for (l = 0; l < csub; l++) {
860 if (
c->books[l] != -1)
863 if (coded[counter + k] < maxval)
868 cshift +=
c->subclass;
873 for (k = 0; k <
c->dim; k++) {
874 int book =
c->books[cval & (csub-1)];
875 int entry = coded[counter++];
876 cval >>=
c->subclass;
904 d -= vec[j] * num[j];
919 int pass,
i, j, p, k;
921 int partitions = (rc->
end - rc->
begin) / psize;
928 for (p = 0; p < partitions; p++) {
929 float max1 = 0.0, max2 = 0.0;
930 int s = rc->
begin + p * psize;
931 for (k =
s; k <
s + psize; k += 2) {
932 max1 =
FFMAX(max1,
fabs(coeffs[ k / real_ch]));
937 if (max1 < rc->maxes[
i][0] && max2 < rc->maxes[
i][1])
942 for (pass = 0; pass < 8; pass++) {
944 while (p < partitions) {
949 for (
i = 0;
i < classwords;
i++) {
951 entry += classes[j][p +
i];
956 for (
i = 0;
i < classwords && p < partitions;
i++, p++) {
958 int nbook = rc->
books[classes[j][p]][pass];
964 assert(rc->
type == 0 || rc->
type == 2);
1013 const float *
win = venc->
win[1];
1054 for (ch = 0; ch <
channels; ch++) {
1056 memset(
f->extended_data[ch], 0,
bps *
f->nb_samples);
1071 for (ch = 0; ch < venc->
channels; ch++)
1075 for (ch = 0; ch < venc->
channels; ch++)
1078 for (sf = 0; sf < subframes; sf++) {
1081 for (ch = 0; ch < venc->
channels; ch++) {
1088 memcpy(save + sf*sf_size,
input,
len);
1100 int i,
ret, need_more;
1119 need_more =
frame && need_more;
1129 for (
i = 0;
i < frames_needed;
i++) {
1155 if (
mode->blockflag) {
1205 *got_packet_ptr = 1;
1277 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)
int ff_vorbis_ready_floor1_list(void *logctx, vorbis_floor1_entry *list, int values)
#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.
This structure describes decoded (raw) audio or video data.
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
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)
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
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_*.
static const struct @195 cvectors[]
#define FF_CODEC_ENCODE_CB(func)
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static const uint8_t quant[64]
const float ff_vorbis_floor1_inverse_db_table[256]
#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)
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respecively.
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.
#define CODEC_LONG_NAME(str)
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(* init)(AVBSFContext *ctx)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
static void scale(int *out, const int *in, const int w, const int h, const int shift)
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
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
#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.
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.
void * av_calloc(size_t nmemb, size_t size)
const FFCodec ff_vorbis_encoder
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
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
#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 const struct @196 floor_classes[]
static float distance(float x, float y, int band)
const float *const ff_vorbis_vwin[8]
#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)