@ -32,24 +32,26 @@
# define HNODE -1
static void get_tree_codes ( uint32_t * bits , int16_t * lens , uint8_t * xlat , Node * nodes , int node , uint32_t pfx , int pl , int * pos , int no_zero_count )
static void get_tree_codes ( uint32_t * bits , int16_t * lens , uint8_t * xlat ,
Node * nodes , int node ,
uint32_t pfx , int pl , int * pos , int no_zero_count )
{
int s ;
s = nodes [ node ] . sym ;
if ( s ! = HNODE | | ( no_zero_count & & ! nodes [ node ] . count ) ) {
if ( s ! = HNODE | | ( no_zero_count & & ! nodes [ node ] . count ) ) {
bits [ * pos ] = pfx ;
lens [ * pos ] = pl ;
xlat [ * pos ] = s ;
( * pos ) + + ;
} else {
} else {
pfx < < = 1 ;
pl + + ;
get_tree_codes ( bits , lens , xlat , nodes , nodes [ node ] . n0 , pfx , pl , pos ,
no_zero_count ) ;
get_tree_codes ( bits , lens , xlat , nodes , nodes [ node ] . n0 , pfx , pl ,
pos , no_zero_count ) ;
pfx | = 1 ;
get_tree_codes ( bits , lens , xlat , nodes , nodes [ node ] . n0 + 1 , pfx , pl , pos ,
no_zero_count ) ;
get_tree_codes ( bits , lens , xlat , nodes , nodes [ node ] . n0 + 1 , pfx , pl ,
pos , no_zero_count ) ;
}
}
@ -61,7 +63,8 @@ static int build_huff_tree(VLC *vlc, Node *nodes, int head, int flags)
uint8_t xlat [ 256 ] ;
int pos = 0 ;
get_tree_codes ( bits , lens , xlat , nodes , head , 0 , 0 , & pos , no_zero_count ) ;
get_tree_codes ( bits , lens , xlat , nodes , head , 0 , 0 ,
& pos , no_zero_count ) ;
return ff_init_vlc_sparse ( vlc , 9 , pos , lens , 2 , 2 , bits , 4 , 4 , xlat , 1 , 1 , 0 ) ;
}
@ -77,20 +80,22 @@ int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes,
int cur_node ;
int64_t sum = 0 ;
for ( i = 0 ; i < nb_codes ; i + + ) {
for ( i = 0 ; i < nb_codes ; i + + ) {
nodes [ i ] . sym = i ;
nodes [ i ] . n0 = - 2 ;
sum + = nodes [ i ] . count ;
}
if ( sum > > 31 ) {
av_log ( avctx , AV_LOG_ERROR , " Too high symbol frequencies. Tree construction is not possible \n " ) ;
if ( sum > > 31 ) {
av_log ( avctx , AV_LOG_ERROR ,
" Too high symbol frequencies. "
" Tree construction is not possible \n " ) ;
return - 1 ;
}
qsort ( nodes , nb_codes , sizeof ( Node ) , cmp ) ;
cur_node = nb_codes ;
nodes [ nb_codes * 2 - 1 ] . count = 0 ;
for ( i = 0 ; i < nb_codes * 2 - 1 ; i + = 2 ) {
for ( i = 0 ; i < nb_codes * 2 - 1 ; i + = 2 ) {
uint32_t cur_count = nodes [ i ] . count + nodes [ i + 1 ] . count ;
// find correct place to insert new node, and
// make space for the new node while at it
@ -106,7 +111,7 @@ int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes,
nodes [ j ] . n0 = i ;
cur_node + + ;
}
if ( build_huff_tree ( vlc , nodes , nb_codes * 2 - 2 , flags ) < 0 ) {
if ( build_huff_tree ( vlc , nodes , nb_codes * 2 - 2 , flags ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " Error building tree \n " ) ;
return - 1 ;
}