]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/huffman.c
libavcodec: be less picky on nonsense rc_max_rate / rc_buffer_size combinations.
[ffmpeg] / libavcodec / huffman.c
index 7b33bdd7f32fe104f6daf3000d4c8042cd29c4fb..cd1d0d754e68f9a899b70fe797bb2d8f29ccdd04 100644 (file)
@@ -61,7 +61,7 @@ static int build_huff_tree(VLC *vlc, Node *nodes, int head, int flags)
     int pos = 0;
 
     get_tree_codes(bits, lens, xlat, nodes, head, 0, 0, &pos, no_zero_count);
-    return init_vlc_sparse(vlc, 9, pos, lens, 2, 2, bits, 4, 4, xlat, 1, 1, 0);
+    return ff_init_vlc_sparse(vlc, 9, pos, lens, 2, 2, bits, 4, 4, xlat, 1, 1, 0);
 }
 
 
@@ -90,18 +90,19 @@ int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes,
     cur_node = nb_codes;
     nodes[nb_codes*2-1].count = 0;
     for(i = 0; i < nb_codes*2-1; i += 2){
-        nodes[cur_node].sym = HNODE;
-        nodes[cur_node].count = nodes[i].count + nodes[i+1].count;
-        nodes[cur_node].n0 = i;
-        for(j = cur_node; j > 0; j--){
-            if(nodes[j].count > nodes[j-1].count ||
-               (nodes[j].count == nodes[j-1].count &&
-                (!(flags & FF_HUFFMAN_FLAG_HNODE_FIRST) ||
-                 nodes[j].n0==j-1 || nodes[j].n0==j-2 ||
-                 (nodes[j].sym!=HNODE && nodes[j-1].sym!=HNODE))))
+        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
+        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){