@ -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 code ;
return 0 ;
}
else {
av_log ( NULL , AV_LOG_ERROR , " ERROR: block code look-up failed \n " ) ;
static int decode_blockcodes ( int code1 , int code2 , int levels , int * values )
return AVERROR_INVALIDDATA ;
{
}
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 + + )