Go to the documentation of this file.
43 #define MUL(a,b) (((int64_t)(a) * (int64_t)(b)) >> FRAC_BITS)
45 #define SAMPLES_BUF_SIZE 4096
68 float scale_factor_inv_table[64];
124 s->bitrate_index =
i;
129 s->frame_size = ((
int)
a) * 8;
133 s->frame_frac_incr = (
int)((
a - floor(
a)) * 65536.0);
142 ff_dlog(avctx,
"%d kb/s, %d Hz, frame_size=%d bits, table=%d, padincr=%x\n",
145 for(
i=0;
i<
s->nb_channels;
i++)
146 s->samples_offset[
i] = 0;
154 s->filter_bank[
i] = v;
158 s->filter_bank[512 -
i] = v;
162 v = (
int)(
exp2((3 -
i) / 3.0) * (1 << 20));
165 s->scale_factor_table[
i] = v;
167 s->scale_factor_inv_table[
i] =
exp2(-(3 -
i) / 3.0) / (float)(1 << 20);
170 s->scale_factor_shift[
i] = 21 -
P - (
i / 3);
171 s->scale_factor_mult[
i] = (1 <<
P) *
exp2((
i % 3) / 3.0);
186 s->scale_diff_table[
i] = v;
195 s->total_quant_bits[
i] = 12 * v;
208 for(j=31;j>=3;j-=2)
tab[j] +=
tab[j - 2];
252 x1 =
MUL((t[8] - x2), xp[0]);
253 x2 =
MUL((t[8] + x2), xp[1]);
266 xr =
MUL(t[28],xp[0]);
270 xr =
MUL(t[4],xp[1]);
271 t[ 4] = (t[24] - xr);
272 t[24] = (t[24] + xr);
274 xr =
MUL(t[20],xp[2]);
278 xr =
MUL(t[12],xp[3]);
279 t[12] = (t[16] - xr);
280 t[16] = (t[16] + xr);
285 for (
i = 0;
i < 4;
i++) {
308 xr =
MUL(
t1[0], *xp);
321 #define WSHIFT (WFRAC_BITS + 15 - FRAC_BITS)
331 offset =
s->samples_offset[ch];
332 out = &
s->sb_samples[ch][0][0][0];
341 p =
s->samples_buf[ch] +
offset;
345 sum = p[0*64] * q[0*64];
346 sum += p[1*64] * q[1*64];
347 sum += p[2*64] * q[2*64];
348 sum += p[3*64] * q[3*64];
349 sum += p[4*64] * q[4*64];
350 sum += p[5*64] * q[5*64];
351 sum += p[6*64] * q[6*64];
352 sum += p[7*64] * q[7*64];
369 s->samples_buf[ch], (512 - 32) * 2);
373 s->samples_offset[ch] =
offset;
377 unsigned char scale_code[
SBLIMIT],
378 unsigned char scale_factors[
SBLIMIT][3],
379 int sb_samples[3][12][
SBLIMIT],
382 int *p, vmax, v, n,
i, j, k,
code;
384 unsigned char *sf = &scale_factors[0][0];
386 for(j=0;j<sblimit;j++) {
389 p = &sb_samples[
i][0][j];
402 index = (21 - n) * 3 - 3;
404 while (vmax <= s->scale_factor_table[
index+1])
422 d1 =
s->scale_diff_table[sf[0] - sf[1] + 64];
423 d2 =
s->scale_diff_table[sf[1] - sf[2] + 64];
426 switch(d1 * 5 + d2) {
458 sf[1] = sf[2] = sf[0];
463 sf[0] = sf[1] = sf[2];
469 sf[0] = sf[2] = sf[1];
475 sf[1] = sf[2] = sf[0];
483 sf[0], sf[1], sf[2], d1, d2,
code);
484 scale_code[j] =
code;
496 for(
i=0;
i<
s->sblimit;
i++) {
502 #define SB_NOTALLOCATED 0
503 #define SB_ALLOCATED 1
514 int i, ch,
b, max_smr, max_ch, max_sb, current_frame_size, max_frame_size;
518 const unsigned char *alloc;
520 memcpy(smr, smr1,
s->nb_channels *
sizeof(
short) *
SBLIMIT);
525 max_frame_size =
s->frame_size;
526 s->frame_frac +=
s->frame_frac_incr;
527 if (
s->frame_frac >= 65536) {
528 s->frame_frac -= 65536;
536 current_frame_size = 32;
537 alloc =
s->alloc_table;
538 for(
i=0;
i<
s->sblimit;
i++) {
540 current_frame_size += incr *
s->nb_channels;
548 for(ch=0;ch<
s->nb_channels;ch++) {
549 for(
i=0;
i<
s->sblimit;
i++) {
550 if (smr[ch][
i] > max_smr && subband_status[ch][
i] !=
SB_NOMORE) {
551 max_smr = smr[ch][
i];
559 ff_dlog(
NULL,
"current=%d max=%d max_sb=%d max_ch=%d alloc=%d\n",
560 current_frame_size, max_frame_size, max_sb, max_ch,
565 alloc =
s->alloc_table;
566 for(
i=0;
i<max_sb;
i++) {
567 alloc += 1 << alloc[0];
573 incr +=
s->total_quant_bits[alloc[1]];
577 incr =
s->total_quant_bits[alloc[
b + 1]] -
578 s->total_quant_bits[alloc[
b]];
581 if (current_frame_size + incr <= max_frame_size) {
584 current_frame_size += incr;
586 smr[max_ch][max_sb] = smr1[max_ch][max_sb] -
quant_snr[alloc[
b]];
588 if (
b == ((1 << alloc[0]) - 1))
589 subband_status[max_ch][max_sb] =
SB_NOMORE;
594 subband_status[max_ch][max_sb] =
SB_NOMORE;
597 *padding = max_frame_size - current_frame_size;
609 int i, j, k, l, bit_alloc_bits,
b, ch;
632 for(
i=0;
i<
s->sblimit;
i++) {
633 bit_alloc_bits =
s->alloc_table[j];
634 for(ch=0;ch<
s->nb_channels;ch++) {
637 j += 1 << bit_alloc_bits;
641 for(
i=0;
i<
s->sblimit;
i++) {
642 for(ch=0;ch<
s->nb_channels;ch++) {
649 for(
i=0;
i<
s->sblimit;
i++) {
650 for(ch=0;ch<
s->nb_channels;ch++) {
652 sf = &
s->scale_factors[ch][
i][0];
653 switch(
s->scale_code[ch][
i]) {
677 for(
i=0;
i<
s->sblimit;
i++) {
678 bit_alloc_bits =
s->alloc_table[j];
679 for(ch=0;ch<
s->nb_channels;ch++) {
684 qindex =
s->alloc_table[j+
b];
687 sample =
s->sb_samples[ch][k][l + m][
i];
692 a = (float)
sample *
s->scale_factor_inv_table[
s->scale_factors[ch][
i][k]];
693 q[m] = (
int)((
a + 1.0) * steps * 0.5);
698 e =
s->scale_factors[ch][
i][k];
699 shift =
s->scale_factor_shift[e];
700 mult =
s->scale_factor_mult[e];
711 q[m] = (
q1 * (unsigned)steps) >> (
P + 1);
722 q[0] + steps * (q[1] + steps * q[2]));
731 j += 1 << bit_alloc_bits;
737 for(
i=0;
i<padding;
i++)
748 const int16_t *
samples = (
const int16_t *)
frame->data[0];
757 for(
i=0;
i<
s->nb_channels;
i++) {
759 s->sb_samples[
i],
s->sblimit);
761 for(
i=0;
i<
s->nb_channels;
i++) {
static void idct32(int *out, int *tab)
int frame_size
Number of samples per channel in an audio frame.
static const uint8_t q1[256]
int sb_samples[MPA_MAX_CHANNELS][3][12][SBLIMIT]
int ff_mpa_l2_select_table(int bitrate, int nb_channels, int freq, int lsf)
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
int sample_rate
samples per second
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static void compute_scale_factors(MpegAudioContext *s, unsigned char scale_code[SBLIMIT], unsigned char scale_factors[SBLIMIT][3], int sb_samples[3][12][SBLIMIT], int sblimit)
const uint16_t avpriv_mpa_freq_tab[3]
const uint16_t avpriv_mpa_bitrate_tab[2][3][15]
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 uint16_t table[]
const int ff_mpa_quant_bits[17]
unsigned char scale_diff_table[128]
static void filter(MpegAudioContext *s, int ch, const short *samples, int incr)
unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT]
unsigned short scale_factor_mult[64]
static const AVCodecDefault mp2_defaults[]
unsigned short total_quant_bits[17]
static const unsigned char nb_scale_factors[4]
int initial_padding
Audio only.
static const struct twinvq_data tab
static int bit_alloc(AC3EncodeContext *s, int snr_offset)
Run the bit allocation with a given SNR offset.
static int16_t mult(Float11 *f1, Float11 *f2)
static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const int ff_mpa_quant_steps[17]
int scale_factor_table[64]
unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3]
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static int MPA_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
static const int costab32[30]
const unsigned char *const ff_mpa_alloc_tables[5]
int64_t bit_rate
the average bitrate
static const float fixed_smr[SBLIMIT]
static const int bitinv32[32]
static const unsigned short quant_snr[17]
const int32_t ff_mpa_enwindow[257]
static void encode_frame(MpegAudioContext *s, unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT], int padding)
const unsigned char * alloc_table
#define AV_NOPTS_VALUE
Undefined timestamp value.
static void psycho_acoustic_model(MpegAudioContext *s, short smr[SBLIMIT])
short samples_buf[MPA_MAX_CHANNELS][SAMPLES_BUF_SIZE]
static void compute_bit_allocation(MpegAudioContext *s, short smr1[MPA_MAX_CHANNELS][SBLIMIT], unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT], int *padding)
int8_t scale_factor_shift[64]
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
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
int channels
number of audio channels
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#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...
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 it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
static int put_bits_count(PutBitContext *s)
const int ff_mpa_sblimit_table[5]
static av_cold int MPA_encode_init(AVCodecContext *avctx)
int samples_offset[MPA_MAX_CHANNELS]
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
main external API structure.
Filter the word “frame” indicates either a video frame or a group of audio samples
static int shift(int a, int b)
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
This structure stores compressed data.
#define MPA_MAX_CODED_FRAME_SIZE
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.