|
|
|
@ -91,16 +91,18 @@ int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes, |
|
|
|
|
nodes[nb_codes*2-1].count = 0; |
|
|
|
|
for(i = 0; i < nb_codes*2-1; i += 2){ |
|
|
|
|
uint32_t cur_count = nodes[i].count + nodes[i+1].count; |
|
|
|
|
nodes[cur_node].sym = HNODE; |
|
|
|
|
nodes[cur_node].count = cur_count; |
|
|
|
|
nodes[cur_node].n0 = i; |
|
|
|
|
// find correct place to insert new node, and
|
|
|
|
|
// make space for the new node while at it
|
|
|
|
|
for(j = cur_node; j > i + 2; j--){ |
|
|
|
|
if(cur_count > nodes[j-1].count || |
|
|
|
|
(cur_count == nodes[j-1].count && |
|
|
|
|
!(flags & FF_HUFFMAN_FLAG_HNODE_FIRST))) |
|
|
|
|
break; |
|
|
|
|
FFSWAP(Node, nodes[j], nodes[j-1]); |
|
|
|
|
nodes[j] = nodes[j - 1]; |
|
|
|
|
} |
|
|
|
|
nodes[j].sym = HNODE; |
|
|
|
|
nodes[j].count = cur_count; |
|
|
|
|
nodes[j].n0 = i; |
|
|
|
|
cur_node++; |
|
|
|
|
} |
|
|
|
|
if(build_huff_tree(vlc, nodes, nb_codes*2-2, flags) < 0){ |
|
|
|
|