|
|
@@ -1038,6 +1038,7 @@ static void dca_downmix(float *samples, int srcfmt, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef decode_blockcodes |
|
|
/* Very compact version of the block code decoder that does not use table |
|
|
/* Very compact version of the block code decoder that does not use table |
|
|
* look-up but is slightly slower */ |
|
|
* look-up but is slightly slower */ |
|
|
static int decode_blockcode(int code, int levels, int *values) |
|
|
static int decode_blockcode(int code, int levels, int *values) |
|
|
@@ -1051,13 +1052,15 @@ static int decode_blockcode(int code, int levels, int *values) |
|
|
code = div; |
|
|
code = div; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (code == 0) |
|
|
|
|
|
return 0; |
|
|
|
|
|
else { |
|
|
|
|
|
av_log(NULL, AV_LOG_ERROR, "ERROR: block code look-up failed\n"); |
|
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return code; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int decode_blockcodes(int code1, int code2, int levels, int *values) |
|
|
|
|
|
{ |
|
|
|
|
|
return decode_blockcode(code1, levels, values) | |
|
|
|
|
|
decode_blockcode(code2, levels, values + 4); |
|
|
} |
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
static const uint8_t abits_sizes[7] = { 7, 10, 12, 13, 15, 17, 19 }; |
|
|
static const uint8_t abits_sizes[7] = { 7, 10, 12, 13, 15, 17, 19 }; |
|
|
static const uint8_t abits_levels[7] = { 3, 5, 7, 9, 13, 17, 25 }; |
|
|
static const uint8_t abits_levels[7] = { 3, 5, 7, 9, 13, 17, 25 }; |
|
|
@@ -1125,16 +1128,20 @@ static int dca_subsubframe(DCAContext * s, int base_channel, int block_index) |
|
|
if (abits >= 11 || !dca_smpl_bitalloc[abits].vlc[sel].table){ |
|
|
if (abits >= 11 || !dca_smpl_bitalloc[abits].vlc[sel].table){ |
|
|
if (abits <= 7){ |
|
|
if (abits <= 7){ |
|
|
/* Block code */ |
|
|
/* Block code */ |
|
|
int block_code1, block_code2, size, levels; |
|
|
|
|
|
|
|
|
int block_code1, block_code2, size, levels, err; |
|
|
|
|
|
|
|
|
size = abits_sizes[abits-1]; |
|
|
size = abits_sizes[abits-1]; |
|
|
levels = abits_levels[abits-1]; |
|
|
levels = abits_levels[abits-1]; |
|
|
|
|
|
|
|
|
block_code1 = get_bits(&s->gb, size); |
|
|
block_code1 = get_bits(&s->gb, size); |
|
|
/* FIXME Should test return value */ |
|
|
|
|
|
decode_blockcode(block_code1, levels, block); |
|
|
|
|
|
block_code2 = get_bits(&s->gb, size); |
|
|
block_code2 = get_bits(&s->gb, size); |
|
|
decode_blockcode(block_code2, levels, &block[4]); |
|
|
|
|
|
|
|
|
err = decode_blockcodes(block_code1, block_code2, |
|
|
|
|
|
levels, block); |
|
|
|
|
|
if (err) { |
|
|
|
|
|
av_log(s->avctx, AV_LOG_ERROR, |
|
|
|
|
|
"ERROR: block code look-up failed\n"); |
|
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
} |
|
|
}else{ |
|
|
}else{ |
|
|
/* no coding */ |
|
|
/* no coding */ |
|
|
for (m = 0; m < 8; m++) |
|
|
for (m = 0; m < 8; m++) |
|
|
|