@ -89,7 +89,7 @@ typedef struct {
DSPContext dsp ;
FFTContext fft ;
DECLARE_ALIGNED ( 32 , FFTComplex , samples ) [ COEFFS / 2 ] ;
DECLARE_ALIGNED ( 32 , FFTComplex , samples ) [ COEFFS / 2 ] ;
float * out_samples ;
} IMCContext ;
@ -99,11 +99,12 @@ static VLC huffman_vlc[4][4];
static const int vlc_offsets [ 17 ] = {
0 , 640 , 1156 , 1732 , 2308 , 2852 , 3396 , 3924 ,
4452 , 5220 , 5860 , 6628 , 7268 , 7908 , 8424 , 8936 , VLC_TABLES_SIZE } ;
4452 , 5220 , 5860 , 6628 , 7268 , 7908 , 8424 , 8936 , VLC_TABLES_SIZE
} ;
static VLC_TYPE vlc_tables [ VLC_TABLES_SIZE ] [ 2 ] ;
static av_cold int imc_decode_init ( AVCodecContext * avctx )
static av_cold int imc_decode_init ( AVCodecContext * avctx )
{
int i , j , ret ;
IMCContext * q = avctx - > priv_data ;
@ -116,27 +117,24 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
q - > decoder_reset = 1 ;
for ( i = 0 ; i < BANDS ; i + + )
for ( i = 0 ; i < BANDS ; i + + )
q - > old_floor [ i ] = 1.0 ;
/* Build mdct window, a simple sine window normalized with sqrt(2) */
ff_sine_window_init ( q - > mdct_sine_window , COEFFS ) ;
for ( i = 0 ; i < COEFFS ; i + + )
for ( i = 0 ; i < COEFFS ; i + + )
q - > mdct_sine_window [ i ] * = sqrt ( 2.0 ) ;
for ( i = 0 ; i < COEFFS / 2 ; i + + ) {
for ( i = 0 ; i < COEFFS / 2 ; i + + ) {
q - > post_cos [ i ] = ( 1.0f / 32768 ) * cos ( i / 256.0 * M_PI ) ;
q - > post_sin [ i ] = ( 1.0f / 32768 ) * sin ( i / 256.0 * M_PI ) ;
r1 = sin ( ( i * 4.0 + 1.0 ) / 1024.0 * M_PI ) ;
r2 = cos ( ( i * 4.0 + 1.0 ) / 1024.0 * M_PI ) ;
if ( i & 0x1 )
{
if ( i & 0x1 ) {
q - > pre_coef1 [ i ] = ( r1 + r2 ) * sqrt ( 2.0 ) ;
q - > pre_coef2 [ i ] = - ( r1 - r2 ) * sqrt ( 2.0 ) ;
}
else
{
} else {
q - > pre_coef1 [ i ] = - ( r1 + r2 ) * sqrt ( 2.0 ) ;
q - > pre_coef2 [ i ] = ( r1 - r2 ) * sqrt ( 2.0 ) ;
}
@ -146,13 +144,12 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
/* Generate a square root table */
for ( i = 0 ; i < 30 ; i + + ) {
for ( i = 0 ; i < 30 ; i + + )
q - > sqrt_tab [ i ] = sqrt ( i ) ;
}
/* initialize the VLC tables */
for ( i = 0 ; i < 4 ; i + + ) {
for ( j = 0 ; j < 4 ; j + + ) {
for ( i = 0 ; i < 4 ; i + + ) {
for ( j = 0 ; j < 4 ; j + + ) {
huffman_vlc [ i ] [ j ] . table = & vlc_tables [ vlc_offsets [ i * 4 + j ] ] ;
huffman_vlc [ i ] [ j ] . table_allocated = vlc_offsets [ i * 4 + j + 1 ] - vlc_offsets [ i * 4 + j ] ;
init_vlc ( & huffman_vlc [ i ] [ j ] , 9 , imc_huffman_sizes [ i ] ,
@ -160,7 +157,7 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
imc_huffman_bits [ i ] [ j ] , 2 , 2 , INIT_VLC_USE_NEW_STATIC ) ;
}
}
q - > one_div_log2 = 1 / log ( 2 ) ;
q - > one_div_log2 = 1 / log ( 2 ) ;
if ( ( ret = ff_fft_init ( & q - > fft , 7 , 1 ) ) ) {
av_log ( avctx , AV_LOG_INFO , " FFT init failed \n " ) ;
@ -176,8 +173,9 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
return 0 ;
}
static void imc_calculate_coeffs ( IMCContext * q , float * flcoeffs1 , float * flcoeffs2 , int * bandWidthT ,
float * flcoeffs3 , float * flcoeffs5 )
static void imc_calculate_coeffs ( IMCContext * q , float * flcoeffs1 ,
float * flcoeffs2 , int * bandWidthT ,
float * flcoeffs3 , float * flcoeffs5 )
{
float workT1 [ BANDS ] ;
float workT2 [ BANDS ] ;
@ -186,13 +184,13 @@ static void imc_calculate_coeffs(IMCContext* q, float* flcoeffs1, float* flcoeff
float accum = 0.0 ;
int i , cnt2 ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
flcoeffs5 [ i ] = workT2 [ i ] = 0.0 ;
if ( bandWidthT [ i ] ) {
if ( bandWidthT [ i ] ) {
workT1 [ i ] = flcoeffs1 [ i ] * flcoeffs1 [ i ] ;
flcoeffs3 [ i ] = 2.0 * flcoeffs2 [ i ] ;
} else {
workT1 [ i ] = 0.0 ;
workT1 [ i ] = 0.0 ;
flcoeffs3 [ i ] = - 30000.0 ;
}
workT3 [ i ] = bandWidthT [ i ] * workT1 [ i ] * 0.01 ;
@ -200,37 +198,38 @@ static void imc_calculate_coeffs(IMCContext* q, float* flcoeffs1, float* flcoeff
workT3 [ i ] = 0.0 ;
}
for ( i = 0 ; i < BANDS ; i + + ) {
for ( cnt2 = i ; cnt2 < cyclTab [ i ] ; cnt2 + + )
for ( i = 0 ; i < BANDS ; i + + ) {
for ( cnt2 = i ; cnt2 < cyclTab [ i ] ; cnt2 + + )
flcoeffs5 [ cnt2 ] = flcoeffs5 [ cnt2 ] + workT3 [ i ] ;
workT2 [ cnt2 - 1 ] = workT2 [ cnt2 - 1 ] + workT3 [ i ] ;
workT2 [ cnt2 - 1 ] = workT2 [ cnt2 - 1 ] + workT3 [ i ] ;
}
for ( i = 1 ; i < BANDS ; i + + ) {
accum = ( workT2 [ i - 1 ] + accum ) * imc_weights1 [ i - 1 ] ;
for ( i = 1 ; i < BANDS ; i + + ) {
accum = ( workT2 [ i - 1 ] + accum ) * imc_weights1 [ i - 1 ] ;
flcoeffs5 [ i ] + = accum ;
}
for ( i = 0 ; i < BANDS ; i + + )
for ( i = 0 ; i < BANDS ; i + + )
workT2 [ i ] = 0.0 ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( cnt2 = i - 1 ; cnt2 > cyclTab2 [ i ] ; cnt2 - - )
for ( i = 0 ; i < BANDS ; i + + ) {
for ( cnt2 = i - 1 ; cnt2 > cyclTab2 [ i ] ; cnt2 - - )
flcoeffs5 [ cnt2 ] + = workT3 [ i ] ;
workT2 [ cnt2 + 1 ] + = workT3 [ i ] ;
}
accum = 0.0 ;
for ( i = BANDS - 2 ; i > = 0 ; i - - ) {
for ( i = BANDS - 2 ; i > = 0 ; i - - ) {
accum = ( workT2 [ i + 1 ] + accum ) * imc_weights2 [ i ] ;
flcoeffs5 [ i ] + = accum ;
//there is missing code here, but it seems to never be triggered
// there is missing code here, but it seems to never be triggered
}
}
static void imc_read_level_coeffs ( IMCContext * q , int stream_format_code , int * levlCoeffs )
static void imc_read_level_coeffs ( IMCContext * q , int stream_format_code ,
int * levlCoeffs )
{
int i ;
VLC * hufftab [ 4 ] ;
@ -245,41 +244,42 @@ static void imc_read_level_coeffs(IMCContext* q, int stream_format_code, int* le
hufftab [ 3 ] = & huffman_vlc [ s ] [ 3 ] ;
cb_sel = imc_cb_select [ s ] ;
if ( stream_format_code & 4 )
if ( stream_format_code & 4 )
start = 1 ;
if ( start )
if ( start )
levlCoeffs [ 0 ] = get_bits ( & q - > gb , 7 ) ;
for ( i = start ; i < BANDS ; i + + ) {
levlCoeffs [ i ] = get_vlc2 ( & q - > gb , hufftab [ cb_sel [ i ] ] - > table , hufftab [ cb_sel [ i ] ] - > bits , 2 ) ;
if ( levlCoeffs [ i ] = = 17 )
for ( i = start ; i < BANDS ; i + + ) {
levlCoeffs [ i ] = get_vlc2 ( & q - > gb , hufftab [ cb_sel [ i ] ] - > table ,
hufftab [ cb_sel [ i ] ] - > bits , 2 ) ;
if ( levlCoeffs [ i ] = = 17 )
levlCoeffs [ i ] + = get_bits ( & q - > gb , 4 ) ;
}
}
static void imc_decode_level_coefficients ( IMCContext * q , int * levlCoeffBuf , float * flcoeffs1 ,
float * flcoeffs2 )
static void imc_decode_level_coefficients ( IMCContext * q , int * levlCoeffBuf ,
float * flcoeffs1 , float * flcoeffs2 )
{
int i , level ;
float tmp , tmp2 ;
//maybe some frequency division thingy
// maybe some frequency division thingy
flcoeffs1 [ 0 ] = 20000.0 / pow ( 2 , levlCoeffBuf [ 0 ] * 0.18945 ) ; // 0.18945 = log2(10) * 0.05703125
flcoeffs2 [ 0 ] = log ( flcoeffs1 [ 0 ] ) / log ( 2 ) ;
tmp = flcoeffs1 [ 0 ] ;
flcoeffs2 [ 0 ] = log ( flcoeffs1 [ 0 ] ) / log ( 2 ) ;
tmp = flcoeffs1 [ 0 ] ;
tmp2 = flcoeffs2 [ 0 ] ;
for ( i = 1 ; i < BANDS ; i + + ) {
for ( i = 1 ; i < BANDS ; i + + ) {
level = levlCoeffBuf [ i ] ;
if ( level = = 16 ) {
flcoeffs1 [ i ] = 1.0 ;
flcoeffs2 [ i ] = 0.0 ;
} else {
if ( level < 17 )
level - = 7 ;
level - = 7 ;
else if ( level < = 24 )
level - = 32 ;
level - = 32 ;
else
level - = 16 ;
level - = 16 ;
tmp * = imc_exp_tab [ 15 + level ] ;
tmp2 + = 0.83048 * level ; // 0.83048 = log2(10) * 0.25
@ -290,17 +290,20 @@ static void imc_decode_level_coefficients(IMCContext* q, int* levlCoeffBuf, floa
}
static void imc_decode_level_coefficients2 ( IMCContext * q , int * levlCoeffBuf , float * old_floor , float * flcoeffs1 ,
float * flcoeffs2 ) {
static void imc_decode_level_coefficients2 ( IMCContext * q , int * levlCoeffBuf ,
float * old_floor , float * flcoeffs1 ,
float * flcoeffs2 )
{
int i ;
//FIXME maybe flag_buf = noise coding and flcoeffs1 = new scale factors
// and flcoeffs2 old scale factors
// might be incomplete due to a missing table that is in the binary code
for ( i = 0 ; i < BANDS ; i + + ) {
/* FIXME maybe flag_buf = noise coding and flcoeffs1 = new scale factors
* and flcoeffs2 old scale factors
* might be incomplete due to a missing table that is in the binary code
*/
for ( i = 0 ; i < BANDS ; i + + ) {
flcoeffs1 [ i ] = 0 ;
if ( levlCoeffBuf [ i ] < 16 ) {
if ( levlCoeffBuf [ i ] < 16 ) {
flcoeffs1 [ i ] = imc_exp_tab2 [ levlCoeffBuf [ i ] ] * old_floor [ i ] ;
flcoeffs2 [ i ] = ( levlCoeffBuf [ i ] - 7 ) * 0.83048 + flcoeffs2 [ i ] ; // 0.83048 = log2(10) * 0.25
flcoeffs2 [ i ] = ( levlCoeffBuf [ i ] - 7 ) * 0.83048 + flcoeffs2 [ i ] ; // 0.83048 = log2(10) * 0.25
} else {
flcoeffs1 [ i ] = old_floor [ i ] ;
}
@ -310,7 +313,9 @@ static void imc_decode_level_coefficients2(IMCContext* q, int* levlCoeffBuf, flo
/**
* Perform bit allocation depending on bits available
*/
static int bit_allocation ( IMCContext * q , int stream_format_code , int freebits , int flag ) {
static int bit_allocation ( IMCContext * q , int stream_format_code , int freebits ,
int flag )
{
int i , j ;
const float limit = - 1.e20 ;
float highest = 0.0 ;
@ -327,31 +332,30 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
int flg ;
int found_indx = 0 ;
for ( i = 0 ; i < BANDS ; i + + )
for ( i = 0 ; i < BANDS ; i + + )
highest = FFMAX ( highest , q - > flcoeffs1 [ i ] ) ;
for ( i = 0 ; i < BANDS - 1 ; i + + ) {
q - > flcoeffs4 [ i ] = q - > flcoeffs3 [ i ] - log ( q - > flcoeffs5 [ i ] ) / log ( 2 ) ;
}
for ( i = 0 ; i < BANDS - 1 ; i + + )
q - > flcoeffs4 [ i ] = q - > flcoeffs3 [ i ] - log ( q - > flcoeffs5 [ i ] ) / log ( 2 ) ;
q - > flcoeffs4 [ BANDS - 1 ] = limit ;
highest = highest * 0.25 ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
indx = - 1 ;
if ( ( band_tab [ i + 1 ] - band_tab [ i ] ) = = q - > bandWidthT [ i ] )
if ( ( band_tab [ i + 1 ] - band_tab [ i ] ) = = q - > bandWidthT [ i ] )
indx = 0 ;
if ( ( band_tab [ i + 1 ] - band_tab [ i ] ) > q - > bandWidthT [ i ] )
if ( ( band_tab [ i + 1 ] - band_tab [ i ] ) > q - > bandWidthT [ i ] )
indx = 1 ;
if ( ( ( band_tab [ i + 1 ] - band_tab [ i ] ) / 2 ) > = q - > bandWidthT [ i ] )
if ( ( ( band_tab [ i + 1 ] - band_tab [ i ] ) / 2 ) > = q - > bandWidthT [ i ] )
indx = 2 ;
if ( indx = = - 1 )
return AVERROR_INVALIDDATA ;
q - > flcoeffs4 [ i ] = q - > flcoeffs4 [ i ] + xTab [ ( indx * 2 + ( q - > flcoeffs1 [ i ] < highest ) ) * 2 + flag ] ;
q - > flcoeffs4 [ i ] + = xTab [ ( indx * 2 + ( q - > flcoeffs1 [ i ] < highest ) ) * 2 + flag ] ;
}
if ( stream_format_code & 0x2 ) {
@ -361,22 +365,23 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
q - > flcoeffs4 [ 3 ] = limit ;
}
for ( i = ( stream_format_code & 0x2 ) ? 4 : 0 ; i < BANDS - 1 ; i + + ) {
iacc + = q - > bandWidthT [ i ] ;
for ( i = ( stream_format_code & 0x2 ) ? 4 : 0 ; i < BANDS - 1 ; i + + ) {
iacc + = q - > bandWidthT [ i ] ;
summa + = q - > bandWidthT [ i ] * q - > flcoeffs4 [ i ] ;
}
q - > bandWidthT [ BANDS - 1 ] = 0 ;
q - > bandWidthT [ BANDS - 1 ] = 0 ;
summa = ( summa * 0.5 - freebits ) / iacc ;
for ( i = 0 ; i < BANDS / 2 ; i + + ) {
for ( i = 0 ; i < BANDS / 2 ; i + + ) {
rres = summer - freebits ;
if ( ( rres > = - 8 ) & & ( rres < = 8 ) ) break ;
if ( ( rres > = - 8 ) & & ( rres < = 8 ) )
break ;
summer = 0 ;
iacc = 0 ;
iacc = 0 ;
for ( j = ( stream_format_code & 0x2 ) ? 4 : 0 ; j < BANDS ; j + + ) {
for ( j = ( stream_format_code & 0x2 ) ? 4 : 0 ; j < BANDS ; j + + ) {
cwlen = av_clipf ( ( ( q - > flcoeffs4 [ j ] * 0.5 ) - summa + 0.5 ) , 0 , 6 ) ;
q - > bitsBandT [ j ] = cwlen ;
@ -392,32 +397,33 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
t2 = - 1 ;
if ( i = = 0 )
flg = t2 ;
if ( flg ! = t2 )
if ( flg ! = t2 )
t1 + + ;
summa = ( float ) ( summer - freebits ) / ( ( t1 + 1 ) * iacc ) + summa ;
}
for ( i = ( stream_format_code & 0x2 ) ? 4 : 0 ; i < BANDS ; i + + ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + )
for ( i = ( stream_format_code & 0x2 ) ? 4 : 0 ; i < BANDS ; i + + ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + )
q - > CWlengthT [ j ] = q - > bitsBandT [ i ] ;
}
if ( freebits > summer ) {
for ( i = 0 ; i < BANDS ; i + + ) {
workT [ i ] = ( q - > bitsBandT [ i ] = = 6 ) ? - 1.e20 : ( q - > bitsBandT [ i ] * - 2 + q - > flcoeffs4 [ i ] - 0.415 ) ;
for ( i = 0 ; i < BANDS ; i + + ) {
workT [ i ] = ( q - > bitsBandT [ i ] = = 6 ) ? - 1.e20
: ( q - > bitsBandT [ i ] * - 2 + q - > flcoeffs4 [ i ] - 0.415 ) ;
}
highest = 0.0 ;
do {
do {
if ( highest < = - 1.e20 )
break ;
found_indx = 0 ;
highest = - 1.e20 ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
if ( workT [ i ] > highest ) {
highest = workT [ i ] ;
found_indx = i ;
@ -426,19 +432,20 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
if ( highest > - 1.e20 ) {
workT [ found_indx ] - = 2.0 ;
if ( + + ( q - > bitsBandT [ found_indx ] ) = = 6 )
if ( + + q - > bitsBandT [ found_indx ] = = 6 )
workT [ found_indx ] = - 1.e20 ;
for ( j = band_tab [ found_indx ] ; j < band_tab [ found_indx + 1 ] & & ( freebits > summer ) ; j + + ) {
for ( j = band_tab [ found_indx ] ; j < band_tab [ found_indx + 1 ] & & ( freebits > summer ) ; j + + ) {
q - > CWlengthT [ j ] + + ;
summer + + ;
}
}
} while ( freebits > summer ) ;
} while ( freebits > summer ) ;
}
if ( freebits < summer ) {
for ( i = 0 ; i < BANDS ; i + + ) {
workT [ i ] = q - > bitsBandT [ i ] ? ( q - > bitsBandT [ i ] * - 2 + q - > flcoeffs4 [ i ] + 1.585 ) : 1.e20 ;
for ( i = 0 ; i < BANDS ; i + + ) {
workT [ i ] = q - > bitsBandT [ i ] ? ( q - > bitsBandT [ i ] * - 2 + q - > flcoeffs4 [ i ] + 1.585 )
: 1.e20 ;
}
if ( stream_format_code & 0x2 ) {
workT [ 0 ] = 1.e20 ;
@ -446,23 +453,24 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
workT [ 2 ] = 1.e20 ;
workT [ 3 ] = 1.e20 ;
}
while ( freebits < summer ) {
lowest = 1.e10 ;
while ( freebits < summer ) {
lowest = 1.e10 ;
low_indx = 0 ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
if ( workT [ i ] < lowest ) {
lowest = workT [ i ] ;
lowest = workT [ i ] ;
low_indx = i ;
}
}
//if(lowest >= 1.e10) break;
// if (lowest >= 1.e10)
// break;
workT [ low_indx ] = lowest + 2.0 ;
if ( ! ( - - q - > bitsBandT [ low_indx ] ) )
if ( ! - - q - > bitsBandT [ low_indx ] )
workT [ low_indx ] = 1.e20 ;
for ( j = band_tab [ low_indx ] ; j < band_tab [ low_indx + 1 ] & & ( freebits < summer ) ; j + + ) {
if ( q - > CWlengthT [ j ] > 0 ) {
for ( j = band_tab [ low_indx ] ; j < band_tab [ low_indx + 1 ] & & ( freebits < summer ) ; j + + ) {
if ( q - > CWlengthT [ j ] > 0 ) {
q - > CWlengthT [ j ] - - ;
summer - - ;
}
@ -472,49 +480,51 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
return 0 ;
}
static void imc_get_skip_coeff ( IMCContext * q ) {
static void imc_get_skip_coeff ( IMCContext * q )
{
int i , j ;
memset ( q - > skipFlagBits , 0 , sizeof ( q - > skipFlagBits ) ) ;
memset ( q - > skipFlagBits , 0 , sizeof ( q - > skipFlagBits ) ) ;
memset ( q - > skipFlagCount , 0 , sizeof ( q - > skipFlagCount ) ) ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
if ( ! q - > bandFlagsBuf [ i ] | | ! q - > bandWidthT [ i ] )
continue ;
if ( ! q - > skipFlagRaw [ i ] ) {
q - > skipFlagBits [ i ] = band_tab [ i + 1 ] - band_tab [ i ] ;
q - > skipFlagBits [ i ] = band_tab [ i + 1 ] - band_tab [ i ] ;
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
if ( ( q - > skipFlags [ j ] = get_bits1 ( & q - > gb ) ) )
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
q - > skipFlags [ j ] = get_bits1 ( & q - > gb ) ;
if ( q - > skipFlags [ j ] )
q - > skipFlagCount [ i ] + + ;
}
} else {
for ( j = band_tab [ i ] ; j < ( band_tab [ i + 1 ] - 1 ) ; j + = 2 ) {
if ( ! get_bits1 ( & q - > gb ) ) { //0
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] - 1 ; j + = 2 ) {
if ( ! get_bits1 ( & q - > gb ) ) { // 0
q - > skipFlagBits [ i ] + + ;
q - > skipFlags [ j ] = 1 ;
q - > skipFlags [ j + 1 ] = 1 ;
q - > skipFlags [ j ] = 1 ;
q - > skipFlags [ j + 1 ] = 1 ;
q - > skipFlagCount [ i ] + = 2 ;
} else {
if ( get_bits1 ( & q - > gb ) ) { //11
q - > skipFlagBits [ i ] + = 2 ;
q - > skipFlags [ j ] = 0 ;
q - > skipFlags [ j + 1 ] = 1 ;
} else {
if ( get_bits1 ( & q - > gb ) ) { // 11
q - > skipFlagBits [ i ] + = 2 ;
q - > skipFlags [ j ] = 0 ;
q - > skipFlags [ j + 1 ] = 1 ;
q - > skipFlagCount [ i ] + + ;
} else {
q - > skipFlagBits [ i ] + = 3 ;
q - > skipFlags [ j + 1 ] = 0 ;
if ( ! get_bits1 ( & q - > gb ) ) { //100
q - > skipFlags [ j ] = 1 ;
} else {
q - > skipFlagBits [ i ] + = 3 ;
q - > skipFlags [ j + 1 ] = 0 ;
if ( ! get_bits1 ( & q - > gb ) ) { // 100
q - > skipFlags [ j ] = 1 ;
q - > skipFlagCount [ i ] + + ;
} else { //101
q - > skipFlags [ j ] = 0 ;
} else { // 101
q - > skipFlags [ j ] = 0 ;
}
}
}
}
if ( j < band_tab [ i + 1 ] ) {
if ( j < band_tab [ i + 1 ] ) {
q - > skipFlagBits [ i ] + + ;
if ( ( q - > skipFlags [ j ] = get_bits1 ( & q - > gb ) ) )
q - > skipFlagCount [ i ] + + ;
@ -526,24 +536,26 @@ static void imc_get_skip_coeff(IMCContext* q) {
/**
* Increase highest ' band coefficient sizes as some bits won ' t be used
*/
static void imc_adjust_bit_allocation ( IMCContext * q , int summer ) {
static void imc_adjust_bit_allocation ( IMCContext * q , int summer )
{
float workT [ 32 ] ;
int corrected = 0 ;
int i , j ;
float highest = 0 ;
int found_indx = 0 ;
float highest = 0 ;
int found_indx = 0 ;
for ( i = 0 ; i < BANDS ; i + + ) {
workT [ i ] = ( q - > bitsBandT [ i ] = = 6 ) ? - 1.e20 : ( q - > bitsBandT [ i ] * - 2 + q - > flcoeffs4 [ i ] - 0.415 ) ;
for ( i = 0 ; i < BANDS ; i + + ) {
workT [ i ] = ( q - > bitsBandT [ i ] = = 6 ) ? - 1.e20
: ( q - > bitsBandT [ i ] * - 2 + q - > flcoeffs4 [ i ] - 0.415 ) ;
}
while ( corrected < summer ) {
if ( highest < = - 1.e20 )
if ( highest < = - 1.e20 )
break ;
highest = - 1.e20 ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
if ( workT [ i ] > highest ) {
highest = workT [ i ] ;
found_indx = i ;
@ -555,7 +567,7 @@ static void imc_adjust_bit_allocation (IMCContext* q, int summer) {
if ( + + ( q - > bitsBandT [ found_indx ] ) = = 6 )
workT [ found_indx ] = - 1.e20 ;
for ( j = band_tab [ found_indx ] ; j < band_tab [ found_indx + 1 ] & & ( corrected < summer ) ; j + + ) {
for ( j = band_tab [ found_indx ] ; j < band_tab [ found_indx + 1 ] & & ( corrected < summer ) ; j + + ) {
if ( ! q - > skipFlags [ j ] & & ( q - > CWlengthT [ j ] < 6 ) ) {
q - > CWlengthT [ j ] + + ;
corrected + + ;
@ -565,61 +577,65 @@ static void imc_adjust_bit_allocation (IMCContext* q, int summer) {
}
}
static void imc_imdct256 ( IMCContext * q ) {
static void imc_imdct256 ( IMCContext * q )
{
int i ;
float re , im ;
/* prerotation */
for ( i = 0 ; i < COEFFS / 2 ; i + + ) {
q - > samples [ i ] . re = - ( q - > pre_coef1 [ i ] * q - > CWdecoded [ COEFFS - 1 - i * 2 ] ) -
( q - > pre_coef2 [ i ] * q - > CWdecoded [ i * 2 ] ) ;
q - > samples [ i ] . im = ( q - > pre_coef2 [ i ] * q - > CWdecoded [ COEFFS - 1 - i * 2 ] ) -
( q - > pre_coef1 [ i ] * q - > CWdecoded [ i * 2 ] ) ;
for ( i = 0 ; i < COEFFS / 2 ; i + + ) {
q - > samples [ i ] . re = - ( q - > pre_coef1 [ i ] * q - > CWdecoded [ COEFFS - 1 - i * 2 ] ) -
( q - > pre_coef2 [ i ] * q - > CWdecoded [ i * 2 ] ) ;
q - > samples [ i ] . im = ( q - > pre_coef2 [ i ] * q - > CWdecoded [ COEFFS - 1 - i * 2 ] ) -
( q - > pre_coef1 [ i ] * q - > CWdecoded [ i * 2 ] ) ;
}
/* FFT */
q - > fft . fft_permute ( & q - > fft , q - > samples ) ;
q - > fft . fft_calc ( & q - > fft , q - > samples ) ;
q - > fft . fft_calc ( & q - > fft , q - > samples ) ;
/* postrotation, window and reorder */
for ( i = 0 ; i < COEFFS / 2 ; i + + ) {
re = ( q - > samples [ i ] . re * q - > post_cos [ i ] ) + ( - q - > samples [ i ] . im * q - > post_sin [ i ] ) ;
im = ( - q - > samples [ i ] . im * q - > post_cos [ i ] ) - ( q - > samples [ i ] . re * q - > post_sin [ i ] ) ;
q - > out_samples [ i * 2 ] = ( q - > mdct_sine_window [ COEFFS - 1 - i * 2 ] * q - > last_fft_im [ i ] ) + ( q - > mdct_sine_window [ i * 2 ] * re ) ;
q - > out_samples [ COEFFS - 1 - i * 2 ] = ( q - > mdct_sine_window [ i * 2 ] * q - > last_fft_im [ i ] ) - ( q - > mdct_sine_window [ COEFFS - 1 - i * 2 ] * re ) ;
for ( i = 0 ; i < COEFFS / 2 ; i + + ) {
re = ( q - > samples [ i ] . re * q - > post_cos [ i ] ) + ( - q - > samples [ i ] . im * q - > post_sin [ i ] ) ;
im = ( - q - > samples [ i ] . im * q - > post_cos [ i ] ) - ( q - > samples [ i ] . re * q - > post_sin [ i ] ) ;
q - > out_samples [ i * 2 ] = ( q - > mdct_sine_window [ COEFFS - 1 - i * 2 ] * q - > last_fft_im [ i ] )
+ ( q - > mdct_sine_window [ i * 2 ] * re ) ;
q - > out_samples [ COEFFS - 1 - i * 2 ] = ( q - > mdct_sine_window [ i * 2 ] * q - > last_fft_im [ i ] )
- ( q - > mdct_sine_window [ COEFFS - 1 - i * 2 ] * re ) ;
q - > last_fft_im [ i ] = im ;
}
}
static int inverse_quant_coeff ( IMCContext * q , int stream_format_code ) {
static int inverse_quant_coeff ( IMCContext * q , int stream_format_code )
{
int i , j ;
int middle_value , cw_len , max_size ;
const float * quantizer ;
const float * quantizer ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
q - > CWdecoded [ j ] = 0 ;
cw_len = q - > CWlengthT [ j ] ;
if ( cw_len < = 0 | | q - > skipFlags [ j ] )
continue ;
max_size = 1 < < cw_len ;
max_size = 1 < < cw_len ;
middle_value = max_size > > 1 ;
if ( q - > codewords [ j ] > = max_size | | q - > codewords [ j ] < 0 )
return AVERROR_INVALIDDATA ;
if ( cw_len > = 4 ) {
if ( cw_len > = 4 ) {
quantizer = imc_quantizer2 [ ( stream_format_code & 2 ) > > 1 ] ;
if ( q - > codewords [ j ] > = middle_value )
q - > CWdecoded [ j ] = quantizer [ q - > codewords [ j ] - 8 ] * q - > flcoeffs6 [ i ] ;
q - > CWdecoded [ j ] = quantizer [ q - > codewords [ j ] - 8 ] * q - > flcoeffs6 [ i ] ;
else
q - > CWdecoded [ j ] = - quantizer [ max_size - q - > codewords [ j ] - 8 - 1 ] * q - > flcoeffs6 [ i ] ;
} else {
quantizer = imc_quantizer1 [ ( ( stream_format_code & 2 ) > > 1 ) | ( q - > bandFlagsBuf [ i ] < < 1 ) ] ;
if ( q - > codewords [ j ] > = middle_value )
q - > CWdecoded [ j ] = quantizer [ q - > codewords [ j ] - 1 ] * q - > flcoeffs6 [ i ] ;
q - > CWdecoded [ j ] = quantizer [ q - > codewords [ j ] - 1 ] * q - > flcoeffs6 [ i ] ;
else
q - > CWdecoded [ j ] = - quantizer [ max_size - 2 - q - > codewords [ j ] ] * q - > flcoeffs6 [ i ] ;
}
@ -629,22 +645,24 @@ static int inverse_quant_coeff (IMCContext* q, int stream_format_code) {
}
static int imc_get_coeffs ( IMCContext * q ) {
static int imc_get_coeffs ( IMCContext * q )
{
int i , j , cw_len , cw ;
for ( i = 0 ; i < BANDS ; i + + ) {
if ( ! q - > sumLenArr [ i ] ) continue ;
for ( i = 0 ; i < BANDS ; i + + ) {
if ( ! q - > sumLenArr [ i ] )
continue ;
if ( q - > bandFlagsBuf [ i ] | | q - > bandWidthT [ i ] ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
cw_len = q - > CWlengthT [ j ] ;
cw = 0 ;
if ( get_bits_count ( & q - > gb ) + cw_len > 512 ) {
//av_log(NULL,0,"Band %i coeff %i cw_len %i\n",i,j,cw_len);
if ( get_bits_count ( & q - > gb ) + cw_len > 512 ) {
// av_log(NULL, 0, "Band %i coeff %i cw_len %i\n", i, j, cw_len);
return AVERROR_INVALIDDATA ;
}
if ( cw_len & & ( ! q - > bandFlagsBuf [ i ] | | ! q - > skipFlags [ j ] ) )
if ( cw_len & & ( ! q - > bandFlagsBuf [ i ] | | ! q - > skipFlags [ j ] ) )
cw = get_bits ( & q - > gb , cw_len ) ;
q - > codewords [ j ] = cw ;
@ -654,7 +672,7 @@ static int imc_get_coeffs (IMCContext* q) {
return 0 ;
}
static int imc_decode_frame ( AVCodecContext * avctx , void * data ,
static int imc_decode_frame ( AVCodecContext * avctx , void * data ,
int * got_frame_ptr , AVPacket * avpkt )
{
const uint8_t * buf = avpkt - > data ;
@ -680,7 +698,7 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
av_log ( avctx , AV_LOG_ERROR , " get_buffer() failed \n " ) ;
return ret ;
}
q - > out_samples = ( float * ) q - > frame . data [ 0 ] ;
q - > out_samples = ( float * ) q - > frame . data [ 0 ] ;
q - > dsp . bswap16_buf ( buf16 , ( const uint16_t * ) buf , IMC_BLOCK_SIZE / 2 ) ;
@ -695,7 +713,7 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
}
stream_format_code = get_bits ( & q - > gb , 3 ) ;
if ( stream_format_code & 1 ) {
if ( stream_format_code & 1 ) {
av_log ( avctx , AV_LOG_ERROR , " Stream code format %X is not supported \n " , stream_format_code ) ;
return AVERROR_INVALIDDATA ;
}
@ -705,10 +723,12 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
if ( stream_format_code & 0x04 )
q - > decoder_reset = 1 ;
if ( q - > decoder_reset ) {
if ( q - > decoder_reset ) {
memset ( q - > out_samples , 0 , sizeof ( q - > out_samples ) ) ;
for ( i = 0 ; i < BANDS ; i + + ) q - > old_floor [ i ] = 1.0 ;
for ( i = 0 ; i < COEFFS ; i + + ) q - > CWdecoded [ i ] = 0 ;
for ( i = 0 ; i < BANDS ; i + + )
q - > old_floor [ i ] = 1.0 ;
for ( i = 0 ; i < COEFFS ; i + + )
q - > CWdecoded [ i ] = 0 ;
q - > decoder_reset = 0 ;
}
@ -716,22 +736,24 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
imc_read_level_coeffs ( q , stream_format_code , q - > levlCoeffBuf ) ;
if ( stream_format_code & 0x4 )
imc_decode_level_coefficients ( q , q - > levlCoeffBuf , q - > flcoeffs1 , q - > flcoeffs2 ) ;
imc_decode_level_coefficients ( q , q - > levlCoeffBuf ,
q - > flcoeffs1 , q - > flcoeffs2 ) ;
else
imc_decode_level_coefficients2 ( q , q - > levlCoeffBuf , q - > old_floor , q - > flcoeffs1 , q - > flcoeffs2 ) ;
imc_decode_level_coefficients2 ( q , q - > levlCoeffBuf , q - > old_floor ,
q - > flcoeffs1 , q - > flcoeffs2 ) ;
memcpy ( q - > old_floor , q - > flcoeffs1 , 32 * sizeof ( float ) ) ;
counter = 0 ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
if ( q - > levlCoeffBuf [ i ] = = 16 ) {
q - > bandWidthT [ i ] = 0 ;
counter + + ;
} else
q - > bandWidthT [ i ] = band_tab [ i + 1 ] - band_tab [ i ] ;
q - > bandWidthT [ i ] = band_tab [ i + 1 ] - band_tab [ i ] ;
}
memset ( q - > bandFlagsBuf , 0 , BANDS * sizeof ( int ) ) ;
for ( i = 0 ; i < BANDS - 1 ; i + + ) {
for ( i = 0 ; i < BANDS - 1 ; i + + ) {
if ( q - > bandWidthT [ i ] )
q - > bandFlagsBuf [ i ] = get_bits1 ( & q - > gb ) ;
}
@ -747,78 +769,79 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
q - > CWlengthT [ 0 ] = 5 ;
q - > CWlengthT [ 1 ] = 5 ;
q - > CWlengthT [ 2 ] = 5 ;
for ( i = 1 ; i < 4 ; i + + ) {
for ( i = 1 ; i < 4 ; i + + ) {
bits = ( q - > levlCoeffBuf [ i ] = = 16 ) ? 0 : 5 ;
q - > bitsBandT [ i ] = bits ;
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
q - > CWlengthT [ j ] = bits ;
bitscount + = bits ;
bitscount + = bits ;
}
}
}
if ( ( ret = bit_allocation ( q , stream_format_code ,
512 - bitscount - get_bits_count ( & q - > gb ) , flag ) ) < 0 ) {
if ( ( ret = bit_allocation ( q , stream_format_code ,
512 - bitscount - get_bits_count ( & q - > gb ) ,
flag ) ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " Bit allocations failed \n " ) ;
q - > decoder_reset = 1 ;
return ret ;
}
for ( i = 0 ; i < BANDS ; i + + ) {
q - > sumLenArr [ i ] = 0 ;
for ( i = 0 ; i < BANDS ; i + + ) {
q - > sumLenArr [ i ] = 0 ;
q - > skipFlagRaw [ i ] = 0 ;
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + )
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + )
q - > sumLenArr [ i ] + = q - > CWlengthT [ j ] ;
if ( q - > bandFlagsBuf [ i ] )
if ( ( ( ( band_tab [ i + 1 ] - band_tab [ i ] ) * 1.5 ) > q - > sumLenArr [ i ] ) & & ( q - > sumLenArr [ i ] > 0 ) )
if ( ( ( ( band_tab [ i + 1 ] - band_tab [ i ] ) * 1.5 ) > q - > sumLenArr [ i ] ) & & ( q - > sumLenArr [ i ] > 0 ) )
q - > skipFlagRaw [ i ] = 1 ;
}
imc_get_skip_coeff ( q ) ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
q - > flcoeffs6 [ i ] = q - > flcoeffs1 [ i ] ;
/* band has flag set and at least one coded coefficient */
if ( q - > bandFlagsBuf [ i ] & & ( band_tab [ i + 1 ] - band_tab [ i ] ) ! = q - > skipFlagCount [ i ] ) {
q - > flcoeffs6 [ i ] * = q - > sqrt_tab [ band_tab [ i + 1 ] - band_tab [ i ] ] /
q - > sqrt_tab [ ( band_tab [ i + 1 ] - band_tab [ i ] - q - > skipFlagCount [ i ] ) ] ;
if ( q - > bandFlagsBuf [ i ] & & ( band_tab [ i + 1 ] - band_tab [ i ] ) ! = q - > skipFlagCount [ i ] ) {
q - > flcoeffs6 [ i ] * = q - > sqrt_tab [ band_tab [ i + 1 ] - band_tab [ i ] ] /
q - > sqrt_tab [ ( band_tab [ i + 1 ] - band_tab [ i ] - q - > skipFlagCount [ i ] ) ] ;
}
}
/* calculate bits left, bits needed and adjust bit allocation */
bits = summer = 0 ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
if ( q - > bandFlagsBuf [ i ] ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
if ( q - > skipFlags [ j ] ) {
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + ) {
if ( q - > skipFlags [ j ] ) {
summer + = q - > CWlengthT [ j ] ;
q - > CWlengthT [ j ] = 0 ;
}
}
bits + = q - > skipFlagBits [ i ] ;
bits + = q - > skipFlagBits [ i ] ;
summer - = q - > skipFlagBits [ i ] ;
}
}
imc_adjust_bit_allocation ( q , summer ) ;
for ( i = 0 ; i < BANDS ; i + + ) {
for ( i = 0 ; i < BANDS ; i + + ) {
q - > sumLenArr [ i ] = 0 ;
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + )
for ( j = band_tab [ i ] ; j < band_tab [ i + 1 ] ; j + + )
if ( ! q - > skipFlags [ j ] )
q - > sumLenArr [ i ] + = q - > CWlengthT [ j ] ;
}
memset ( q - > codewords , 0 , sizeof ( q - > codewords ) ) ;
if ( imc_get_coeffs ( q ) < 0 ) {
if ( imc_get_coeffs ( q ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " Read coefficients failed \n " ) ;
q - > decoder_reset = 1 ;
return AVERROR_INVALIDDATA ;
}
if ( inverse_quant_coeff ( q , stream_format_code ) < 0 ) {
if ( inverse_quant_coeff ( q , stream_format_code ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " Inverse quantization of coefficients failed \n " ) ;
q - > decoder_reset = 1 ;
return AVERROR_INVALIDDATA ;