split out coupling coefficient reconstruction into a separate function
Originally committed as revision 9882 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
7cacf1e86a
commit
d7dc7ad05c
@ -148,6 +148,7 @@ typedef struct {
|
|||||||
uint8_t bap[5][256]; //fbw channel bit allocation pointers
|
uint8_t bap[5][256]; //fbw channel bit allocation pointers
|
||||||
uint8_t lfebap[256]; //lfe channel bit allocation pointers
|
uint8_t lfebap[256]; //lfe channel bit allocation pointers
|
||||||
|
|
||||||
|
float transform_coeffs_cpl[256];
|
||||||
DECLARE_ALIGNED_16(float, transform_coeffs[AC3_MAX_CHANNELS][256]); //transform coefficients
|
DECLARE_ALIGNED_16(float, transform_coeffs[AC3_MAX_CHANNELS][256]); //transform coefficients
|
||||||
|
|
||||||
/* For IMDCT. */
|
/* For IMDCT. */
|
||||||
@ -421,6 +422,31 @@ static void decode_exponents(GetBitContext *gb, int expstr, int ngrps,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates transform coefficients for each coupled channel in the coupling
|
||||||
|
* range using the coupling coefficients and coupling coordinates.
|
||||||
|
* reference: Section 7.4.3 Coupling Coordinate Format
|
||||||
|
*/
|
||||||
|
static void uncouple_channels(AC3DecodeContext *ctx)
|
||||||
|
{
|
||||||
|
int i, j, ch, bnd, subbnd;
|
||||||
|
|
||||||
|
subbnd = -1;
|
||||||
|
i = ctx->cplstrtmant;
|
||||||
|
for(bnd=0; bnd<ctx->ncplbnd; bnd++) {
|
||||||
|
do {
|
||||||
|
subbnd++;
|
||||||
|
for(j=0; j<12; j++) {
|
||||||
|
for(ch=1; ch<=ctx->nfchans; ch++) {
|
||||||
|
if(ctx->chincpl[ch-1])
|
||||||
|
ctx->transform_coeffs[ch][i] = ctx->transform_coeffs_cpl[i] * ctx->cplco[ch-1][bnd];
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
} while((ctx->cplbndstrc >> subbnd) & 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */
|
typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */
|
||||||
int16_t l3_quantizers[3];
|
int16_t l3_quantizers[3];
|
||||||
int16_t l5_quantizers[3];
|
int16_t l5_quantizers[3];
|
||||||
@ -438,40 +464,18 @@ typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantizati
|
|||||||
static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m)
|
static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m)
|
||||||
{
|
{
|
||||||
GetBitContext *gb = &ctx->gb;
|
GetBitContext *gb = &ctx->gb;
|
||||||
int ch, start, end, cplbndstrc, bnd, gcode, tbap;
|
int start, gcode, tbap;
|
||||||
float cplcos[5], cplcoeff;
|
float cplcoeff;
|
||||||
uint8_t *exps = ctx->dcplexps;
|
uint8_t *exps = ctx->dcplexps;
|
||||||
uint8_t *bap = ctx->cplbap;
|
uint8_t *bap = ctx->cplbap;
|
||||||
|
|
||||||
cplbndstrc = ctx->cplbndstrc;
|
|
||||||
start = ctx->cplstrtmant;
|
start = ctx->cplstrtmant;
|
||||||
bnd = 0;
|
|
||||||
|
|
||||||
while (start < ctx->cplendmant) {
|
while (start < ctx->cplendmant) {
|
||||||
end = start + 12;
|
|
||||||
while (cplbndstrc & 1) {
|
|
||||||
end += 12;
|
|
||||||
cplbndstrc >>= 1;
|
|
||||||
}
|
|
||||||
cplbndstrc >>= 1;
|
|
||||||
for (ch = 0; ch < ctx->nfchans; ch++)
|
|
||||||
cplcos[ch] = ctx->cplco[ch][bnd];
|
|
||||||
bnd++;
|
|
||||||
|
|
||||||
while (start < end) {
|
|
||||||
tbap = bap[start];
|
tbap = bap[start];
|
||||||
switch(tbap) {
|
switch(tbap) {
|
||||||
case 0:
|
case 0:
|
||||||
for (ch = 0; ch < ctx->nfchans; ch++)
|
cplcoeff = (av_random(&ctx->dith_state) & 0xFFFF);
|
||||||
if (ctx->chincpl[ch]) {
|
break;
|
||||||
if (ctx->dithflag[ch]) {
|
|
||||||
cplcoeff = (av_random(&ctx->dith_state) & 0xFFFF) * scale_factors[exps[start]];
|
|
||||||
ctx->transform_coeffs[ch + 1][start] = cplcoeff * cplcos[ch] * LEVEL_MINUS_3DB;
|
|
||||||
} else
|
|
||||||
ctx->transform_coeffs[ch + 1][start] = 0;
|
|
||||||
}
|
|
||||||
start++;
|
|
||||||
continue;
|
|
||||||
case 1:
|
case 1:
|
||||||
if (m->l3ptr > 2) {
|
if (m->l3ptr > 2) {
|
||||||
gcode = get_bits(gb, 5);
|
gcode = get_bits(gb, 5);
|
||||||
@ -480,7 +484,7 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m)
|
|||||||
m->l3_quantizers[2] = l3_quantizers_3[gcode];
|
m->l3_quantizers[2] = l3_quantizers_3[gcode];
|
||||||
m->l3ptr = 0;
|
m->l3ptr = 0;
|
||||||
}
|
}
|
||||||
cplcoeff = m->l3_quantizers[m->l3ptr++] * scale_factors[exps[start]];
|
cplcoeff = m->l3_quantizers[m->l3ptr++];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
@ -491,11 +495,11 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m)
|
|||||||
m->l5_quantizers[2] = l5_quantizers_3[gcode];
|
m->l5_quantizers[2] = l5_quantizers_3[gcode];
|
||||||
m->l5ptr = 0;
|
m->l5ptr = 0;
|
||||||
}
|
}
|
||||||
cplcoeff = m->l5_quantizers[m->l5ptr++] * scale_factors[exps[start]];
|
cplcoeff = m->l5_quantizers[m->l5ptr++];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
cplcoeff = l7_quantizers[get_bits(gb, 3)] * scale_factors[exps[start]];
|
cplcoeff = l7_quantizers[get_bits(gb, 3)];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
@ -505,21 +509,18 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m)
|
|||||||
m->l11_quantizers[1] = l11_quantizers_2[gcode];
|
m->l11_quantizers[1] = l11_quantizers_2[gcode];
|
||||||
m->l11ptr = 0;
|
m->l11ptr = 0;
|
||||||
}
|
}
|
||||||
cplcoeff = m->l11_quantizers[m->l11ptr++] * scale_factors[exps[start]];
|
cplcoeff = m->l11_quantizers[m->l11ptr++];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
cplcoeff = l15_quantizers[get_bits(gb, 4)] * scale_factors[exps[start]];
|
cplcoeff = l15_quantizers[get_bits(gb, 4)];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
cplcoeff = (get_sbits(gb, qntztab[tbap]) << (16 - qntztab[tbap])) * scale_factors[exps[start]];
|
cplcoeff = get_sbits(gb, qntztab[tbap]) << (16 - qntztab[tbap]);
|
||||||
}
|
}
|
||||||
for (ch = 0; ch < ctx->nfchans; ch++)
|
ctx->transform_coeffs_cpl[start] = cplcoeff * scale_factors[exps[start]];
|
||||||
if (ctx->chincpl[ch])
|
|
||||||
ctx->transform_coeffs[ch + 1][start] = cplcoeff * cplcos[ch];
|
|
||||||
start++;
|
start++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -635,6 +636,7 @@ static int get_transform_coeffs(AC3DecodeContext * ctx)
|
|||||||
av_log(NULL, AV_LOG_ERROR, "error in decoupling channels\n");
|
av_log(NULL, AV_LOG_ERROR, "error in decoupling channels\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
uncouple_channels(ctx);
|
||||||
got_cplchan = 1;
|
got_cplchan = 1;
|
||||||
}
|
}
|
||||||
end = ctx->cplendmant;
|
end = ctx->cplendmant;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user