@ -108,15 +108,14 @@ typedef struct TM2Huff {
int num ; ///< current number filled
int max_num ; ///< total number of codes
int * nums ; ///< literals
uint32_t * bits ; ///< codes
int * lens ; ///< codelengths
uint8_t * lens ; ///< codelengths
} TM2Huff ;
/**
*
* @ returns the length of the longest code or an AVERROR code
*/
static int tm2_read_tree ( TM2Context * ctx , uint32_t prefix , int length , TM2Huff * huff )
static int tm2_read_tree ( TM2Context * ctx , int length , TM2Huff * huff )
{
int ret , ret2 ;
if ( length > huff - > max_bits ) {
@ -134,14 +133,13 @@ static int tm2_read_tree(TM2Context *ctx, uint32_t prefix, int length, TM2Huff *
return AVERROR_INVALIDDATA ;
}
huff - > nums [ huff - > num ] = get_bits_long ( & ctx - > gb , huff - > val_bits ) ;
huff - > bits [ huff - > num ] = prefix ;
huff - > lens [ huff - > num ] = length ;
huff - > num + + ;
return length ;
} else { /* non-terminal node */
if ( ( ret2 = tm2_read_tree ( ctx , prefix < < 1 , length + 1 , huff ) ) < 0 )
if ( ( ret2 = tm2_read_tree ( ctx , length + 1 , huff ) ) < 0 )
return ret2 ;
if ( ( ret = tm2_read_tree ( ctx , ( prefix < < 1 ) | 1 , length + 1 , huff ) ) < 0 )
if ( ( ret = tm2_read_tree ( ctx , length + 1 , huff ) ) < 0 )
return ret ;
}
return FFMAX ( ret , ret2 ) ;
@ -177,15 +175,14 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
/* allocate space for codes - it is exactly ceil(nodes / 2) entries */
huff . max_num = ( huff . nodes + 1 ) > > 1 ;
huff . nums = av_calloc ( huff . max_num , sizeof ( int ) ) ;
huff . bits = av_calloc ( huff . max_num , sizeof ( uint32_t ) ) ;
huff . lens = av_calloc ( huff . max_num , sizeof ( int ) ) ;
huff . lens = av_mallocz ( huff . max_num ) ;
if ( ! huff . nums | | ! huff . bits | | ! huff . lens ) {
if ( ! huff . nums | | ! huff . lens ) {
res = AVERROR ( ENOMEM ) ;
goto out ;
}
res = tm2_read_tree ( ctx , 0 , 0 , & huff ) ;
res = tm2_read_tree ( ctx , 0 , & huff ) ;
if ( res > = 0 & & res ! = huff . max_bits ) {
av_log ( ctx - > avctx , AV_LOG_ERROR , " Got less bits than expected: %i of %i \n " ,
@ -200,9 +197,9 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
/* convert codes to vlc_table */
if ( res > = 0 ) {
res = init_vlc ( & code - > vlc , huff . max_bits , huff . max_num ,
huff . lens , sizeof ( int ) , sizeof ( int ) ,
huff . bits , sizeof ( uint32_t ) , sizeof ( uint32_t ) , 0 ) ;
res = ff_ init_vlc_from_lengths ( & code - > vlc , huff . max_bits , huff . max_num ,
huff . lens , sizeof ( huff . lens [ 0 ] ) ,
NULL , 0 , 0 , 0 , 0 , ctx - > avctx ) ;
if ( res < 0 )
av_log ( ctx - > avctx , AV_LOG_ERROR , " Cannot build VLC table \n " ) ;
else {
@ -216,7 +213,6 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
out :
/* free allocated memory */
av_free ( huff . nums ) ;
av_free ( huff . bits ) ;
av_free ( huff . lens ) ;
return res ;