mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-27 18:02:11 +00:00
dcaenc: Use Huffman codes for Bit Allocation Index
Reviewed-by: Rostislav Pehlivanov <atomnuker@gmail.com>
This commit is contained in:
parent
6b0a3ee6f8
commit
9a619bef54
@ -67,6 +67,7 @@ typedef struct DCAEncContext {
|
||||
int32_t peak_cb[MAX_CHANNELS][DCAENC_SUBBANDS];
|
||||
int32_t downsampled_lfe[DCA_LFE_SAMPLES];
|
||||
int32_t masking_curve_cb[SUBSUBFRAMES][256];
|
||||
int32_t bit_allocation_sel[MAX_CHANNELS];
|
||||
int abits[MAX_CHANNELS][DCAENC_SUBBANDS];
|
||||
int scale_factor[MAX_CHANNELS][DCAENC_SUBBANDS];
|
||||
softfloat quant[MAX_CHANNELS][DCAENC_SUBBANDS];
|
||||
@ -147,6 +148,8 @@ static int encode_init(AVCodecContext *avctx)
|
||||
for (j = 0; j < DCA_CODE_BOOKS; j++) {
|
||||
c->quant_index_sel[i][j] = ff_dca_quant_index_group_size[j];
|
||||
}
|
||||
/* 6 - no Huffman */
|
||||
c->bit_allocation_sel[i] = 6;
|
||||
}
|
||||
|
||||
for (i = 0; i < 9; i++) {
|
||||
@ -672,6 +675,33 @@ static uint32_t set_best_code(uint32_t vlc_bits[DCA_CODE_BOOKS][7], uint32_t clc
|
||||
return bits;
|
||||
}
|
||||
|
||||
static uint32_t set_best_abits_code(int abits[DCAENC_SUBBANDS], int bands, int32_t *res)
|
||||
{
|
||||
uint8_t i;
|
||||
uint32_t t;
|
||||
int32_t best_sel = 6;
|
||||
int32_t best_bits = bands * 5;
|
||||
|
||||
/* Check do we have subband which cannot be encoded by Huffman tables */
|
||||
for (i = 0; i < bands; i++) {
|
||||
if (abits[i] > 12) {
|
||||
*res = best_sel;
|
||||
return best_bits;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < DCA_BITALLOC_12_COUNT; i++) {
|
||||
t = ff_dca_vlc_calc_alloc_bits(abits, bands, i);
|
||||
if (t < best_bits) {
|
||||
best_bits = t;
|
||||
best_sel = i;
|
||||
}
|
||||
}
|
||||
|
||||
*res = best_sel;
|
||||
return best_bits;
|
||||
}
|
||||
|
||||
static int init_quantization_noise(DCAEncContext *c, int noise)
|
||||
{
|
||||
int ch, band, ret = 0;
|
||||
@ -679,7 +709,7 @@ static int init_quantization_noise(DCAEncContext *c, int noise)
|
||||
uint32_t clc_bit_count_accum[MAX_CHANNELS][DCA_CODE_BOOKS];
|
||||
uint32_t bits_counter = 0;
|
||||
|
||||
c->consumed_bits = 132 + 493 * c->fullband_channels;
|
||||
c->consumed_bits = 132 + 333 * c->fullband_channels;
|
||||
if (c->lfe_channel)
|
||||
c->consumed_bits += 72;
|
||||
|
||||
@ -702,6 +732,7 @@ static int init_quantization_noise(DCAEncContext *c, int noise)
|
||||
ret |= USED_1ABITS;
|
||||
}
|
||||
}
|
||||
c->consumed_bits += set_best_abits_code(c->abits[ch], 32, &c->bit_allocation_sel[ch]);
|
||||
}
|
||||
|
||||
/* Recalc scale_factor each time to get bits consumption in case of Huffman coding.
|
||||
@ -908,7 +939,7 @@ static void put_primary_audio_header(DCAEncContext *c)
|
||||
|
||||
/* Bit allocation quantizer select: linear 5-bit */
|
||||
for (ch = 0; ch < c->fullband_channels; ch++)
|
||||
put_bits(&c->pb, 3, 6);
|
||||
put_bits(&c->pb, 3, c->bit_allocation_sel[ch]);
|
||||
|
||||
/* Quantization index codebook select */
|
||||
for (i = 0; i < DCA_CODE_BOOKS; i++)
|
||||
@ -974,9 +1005,15 @@ static void put_subframe(DCAEncContext *c, int subframe)
|
||||
|
||||
/* Prediction VQ address: not transmitted */
|
||||
/* Bit allocation index */
|
||||
for (ch = 0; ch < c->fullband_channels; ch++)
|
||||
for (band = 0; band < DCAENC_SUBBANDS; band++)
|
||||
put_bits(&c->pb, 5, c->abits[ch][band]);
|
||||
for (ch = 0; ch < c->fullband_channels; ch++) {
|
||||
if (c->bit_allocation_sel[ch] == 6) {
|
||||
for (band = 0; band < DCAENC_SUBBANDS; band++) {
|
||||
put_bits(&c->pb, 5, c->abits[ch][band]);
|
||||
}
|
||||
} else {
|
||||
ff_dca_vlc_enc_alloc(&c->pb, c->abits[ch], DCAENC_SUBBANDS, c->bit_allocation_sel[ch]);
|
||||
}
|
||||
}
|
||||
|
||||
if (SUBSUBFRAMES > 1) {
|
||||
/* Transition mode: none for each channel and subband */
|
||||
|
@ -42,13 +42,12 @@ static const uint8_t tmode_bits[TMODE_COUNT][4] = {
|
||||
{ 2, 2, 2, 2 }
|
||||
};
|
||||
|
||||
#define BITALLOC_12_COUNT 5
|
||||
#define BITALLOC_12_VLC_BITS 9
|
||||
static const uint8_t bitalloc_12_vlc_bits[BITALLOC_12_COUNT] = {
|
||||
static const uint8_t bitalloc_12_vlc_bits[DCA_BITALLOC_12_COUNT] = {
|
||||
9, 7, 7, 9, 9
|
||||
};
|
||||
|
||||
static const uint16_t bitalloc_12_codes[BITALLOC_12_COUNT][12] = {
|
||||
static const uint16_t bitalloc_12_codes[DCA_BITALLOC_12_COUNT][12] = {
|
||||
{ 0x0000, 0x0002, 0x0006, 0x000E, 0x001E, 0x003E, 0x00FF, 0x00FE,
|
||||
0x01FB, 0x01FA, 0x01F9, 0x01F8, },
|
||||
{ 0x0001, 0x0000, 0x0002, 0x000F, 0x000C, 0x001D, 0x0039, 0x0038,
|
||||
@ -61,7 +60,7 @@ static const uint16_t bitalloc_12_codes[BITALLOC_12_COUNT][12] = {
|
||||
0x0079, 0x0078, 0x00FB, 0x00FA, }
|
||||
};
|
||||
|
||||
static const uint8_t bitalloc_12_bits[BITALLOC_12_COUNT][12] = {
|
||||
static const uint8_t bitalloc_12_bits[DCA_BITALLOC_12_COUNT][12] = {
|
||||
{ 1, 2, 3, 4, 5, 6, 8, 8, 9, 9, 9, 9 },
|
||||
{ 1, 2, 3, 5, 5, 6, 7, 7, 7, 7, 7, 7 },
|
||||
{ 2, 3, 3, 3, 3, 4, 4, 4, 5, 6, 7, 7 },
|
||||
@ -1357,3 +1356,23 @@ void ff_dca_vlc_enc_quant(PutBitContext *pb, int *values, uint8_t n, uint8_t sel
|
||||
put_bits(pb, bitalloc_bits[table][sel][id], bitalloc_codes[table][sel][id]);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t ff_dca_vlc_calc_alloc_bits(int *values, uint8_t n, uint8_t sel)
|
||||
{
|
||||
uint8_t i, id;
|
||||
uint32_t sum = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
id = values[i] - 1;
|
||||
sum += bitalloc_12_bits[sel][id];
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
void ff_dca_vlc_enc_alloc(PutBitContext *pb, int *values, uint8_t n, uint8_t sel)
|
||||
{
|
||||
uint8_t i, id;
|
||||
for (i = 0; i < n; i++) {
|
||||
id = values[i] - 1;
|
||||
put_bits(pb, bitalloc_12_bits[sel][id], bitalloc_12_codes[sel][id]);
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "put_bits.h"
|
||||
|
||||
#define DCA_CODE_BOOKS 10
|
||||
#define DCA_BITALLOC_12_COUNT 5
|
||||
|
||||
typedef struct DCAVLC {
|
||||
int offset; ///< Code values offset
|
||||
@ -58,5 +59,7 @@ extern VLC ff_dca_vlc_rsd;
|
||||
av_cold void ff_dca_init_vlcs(void);
|
||||
uint32_t ff_dca_vlc_calc_quant_bits(int *values, uint8_t n, uint8_t sel, uint8_t abits);
|
||||
void ff_dca_vlc_enc_quant(PutBitContext *pb, int *values, uint8_t n, uint8_t sel, uint8_t abits);
|
||||
uint32_t ff_dca_vlc_calc_alloc_bits(int *values, uint8_t n, uint8_t sel);
|
||||
void ff_dca_vlc_enc_alloc(PutBitContext *pb, int *values, uint8_t n, uint8_t sel);
|
||||
|
||||
#endif /* AVCODEC_DCAHUFF_H */
|
||||
|
Loading…
Reference in New Issue
Block a user