Signed-off-by: Anton Khirnov <anton@khirnov.net>tags/n3.0
| @@ -100,7 +100,8 @@ static int fraps2_decode_plane(FrapsContext *s, uint8_t *dst, int stride, int w, | |||||
| for (i = 0; i < 256; i++) | for (i = 0; i < 256; i++) | ||||
| nodes[i].count = bytestream_get_le32(&src); | nodes[i].count = bytestream_get_le32(&src); | ||||
| size -= 1024; | size -= 1024; | ||||
| if ((ret = ff_huff_build_tree(s->avctx, &vlc, 256, nodes, huff_cmp, | |||||
| if ((ret = ff_huff_build_tree(s->avctx, &vlc, 256, FF_HUFFMAN_BITS, | |||||
| nodes, huff_cmp, | |||||
| FF_HUFFMAN_FLAG_ZERO_COUNT)) < 0) | FF_HUFFMAN_FLAG_ZERO_COUNT)) < 0) | ||||
| return ret; | return ret; | ||||
| /* we have built Huffman table and are ready to decode plane */ | /* we have built Huffman table and are ready to decode plane */ | ||||
| @@ -114,7 +114,7 @@ static void get_tree_codes(uint32_t *bits, int16_t *lens, uint8_t *xlat, | |||||
| } | } | ||||
| } | } | ||||
| static int build_huff_tree(VLC *vlc, Node *nodes, int head, int flags) | |||||
| static int build_huff_tree(VLC *vlc, Node *nodes, int head, int flags, int nb_bits) | |||||
| { | { | ||||
| int no_zero_count = !(flags & FF_HUFFMAN_FLAG_ZERO_COUNT); | int no_zero_count = !(flags & FF_HUFFMAN_FLAG_ZERO_COUNT); | ||||
| uint32_t bits[256]; | uint32_t bits[256]; | ||||
| @@ -124,7 +124,7 @@ static int build_huff_tree(VLC *vlc, Node *nodes, int head, int flags) | |||||
| get_tree_codes(bits, lens, xlat, nodes, head, 0, 0, | get_tree_codes(bits, lens, xlat, nodes, head, 0, 0, | ||||
| &pos, no_zero_count); | &pos, no_zero_count); | ||||
| return ff_init_vlc_sparse(vlc, FF_HUFFMAN_BITS, pos, lens, 2, 2, bits, 4, 4, xlat, 1, 1, 0); | |||||
| return ff_init_vlc_sparse(vlc, nb_bits, pos, lens, 2, 2, bits, 4, 4, xlat, 1, 1, 0); | |||||
| } | } | ||||
| @@ -132,7 +132,7 @@ static int build_huff_tree(VLC *vlc, Node *nodes, int head, int flags) | |||||
| * nodes size must be 2*nb_codes | * nodes size must be 2*nb_codes | ||||
| * first nb_codes nodes.count must be set | * first nb_codes nodes.count must be set | ||||
| */ | */ | ||||
| int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes, | |||||
| int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes, int nb_bits, | |||||
| Node *nodes, HuffCmp cmp, int flags) | Node *nodes, HuffCmp cmp, int flags) | ||||
| { | { | ||||
| int i, j; | int i, j; | ||||
| @@ -169,7 +169,7 @@ int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes, | |||||
| } | } | ||||
| cur_node++; | 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, nb_bits) < 0) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error building tree\n"); | av_log(avctx, AV_LOG_ERROR, "Error building tree\n"); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -40,7 +40,7 @@ typedef struct Node { | |||||
| #define FF_HUFFMAN_BITS 10 | #define FF_HUFFMAN_BITS 10 | ||||
| typedef int (*HuffCmp)(const void *va, const void *vb); | typedef int (*HuffCmp)(const void *va, const void *vb); | ||||
| int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes, | |||||
| int ff_huff_build_tree(AVCodecContext *avctx, VLC *vlc, int nb_codes, int nb_bits, | |||||
| Node *nodes, HuffCmp cmp, int flags); | Node *nodes, HuffCmp cmp, int flags); | ||||
| void ff_huff_gen_len_table(uint8_t *dst, const uint64_t *stats); | void ff_huff_gen_len_table(uint8_t *dst, const uint64_t *stats); | ||||
| @@ -252,7 +252,8 @@ static int vp6_build_huff_tree(VP56Context *s, uint8_t coeff_model[], | |||||
| ff_free_vlc(vlc); | ff_free_vlc(vlc); | ||||
| /* then build the huffman tree according to probabilities */ | /* then build the huffman tree according to probabilities */ | ||||
| return ff_huff_build_tree(s->avctx, vlc, size, nodes, vp6_huff_cmp, | |||||
| return ff_huff_build_tree(s->avctx, vlc, size, FF_HUFFMAN_BITS, | |||||
| nodes, vp6_huff_cmp, | |||||
| FF_HUFFMAN_FLAG_HNODE_FIRST); | FF_HUFFMAN_FLAG_HNODE_FIRST); | ||||
| } | } | ||||