Quoting Diego Biurrun (2016-06-09 17:11:57) > From: Alexandra Hájková <[email protected]> > > --- > libavcodec/webp.c | 106 > ++++++++++++++++++++++++++---------------------------- > 1 file changed, 50 insertions(+), 56 deletions(-) > > diff --git a/libavcodec/webp.c b/libavcodec/webp.c > index b26399c..a6ab52b 100644 > --- a/libavcodec/webp.c > +++ b/libavcodec/webp.c > @@ -41,8 +41,8 @@ > > #define BITSTREAM_READER_LE > #include "avcodec.h" > +#include "bitstream.h" > #include "bytestream.h" > -#include "get_bits.h" > #include "internal.h" > #include "thread.h" > #include "vp8.h" > @@ -183,7 +183,7 @@ typedef struct ImageContext { > > typedef struct WebPContext { > VP8Context v; /* VP8 Context used for lossy > decoding */ > - GetBitContext gb; /* bitstream reader for main image > chunk */ > + BitstreamContext bc; /* bitstream reader for main image > chunk */ > AVFrame *alpha_frame; /* AVFrame for alpha data > decompressed from VP8L */ > AVCodecContext *avctx; /* parent AVCodecContext */ > int initialized; /* set once the VP8 context is > initialized */ > @@ -232,47 +232,41 @@ static void image_ctx_free(ImageContext *img) > * - assumes 8-bit table to make reversal simpler > * - assumes max depth of 2 since the max code length for WebP is 15 > */ > -static av_always_inline int webp_get_vlc(GetBitContext *gb, VLC_TYPE > (*table)[2]) > +static av_always_inline int webp_get_vlc(BitstreamContext *bc, VLC_TYPE > (*table)[2]) > { > int n, nb_bits; > unsigned int index; > int code; > > - OPEN_READER(re, gb); > - UPDATE_CACHE(re, gb); > - > - index = SHOW_UBITS(re, gb, 8); > + index = bitstream_peek(bc, 8); > index = ff_reverse[index]; > code = table[index][0]; > n = table[index][1]; > > if (n < 0) { > - LAST_SKIP_BITS(re, gb, 8); > - UPDATE_CACHE(re, gb); > + bitstream_skip(bc, 8); > > nb_bits = -n; > > - index = SHOW_UBITS(re, gb, nb_bits); > + index = bitstream_peek(bc, nb_bits); > index = (ff_reverse[index] >> (8 - nb_bits)) + code; > code = table[index][0]; > n = table[index][1]; > } > - SKIP_BITS(re, gb, n); > - > - CLOSE_READER(re, gb); > + bitstream_skip(bc, n); > > return code; > } > > -static int huff_reader_get_symbol(HuffReader *r, GetBitContext *gb) > +static int huff_reader_get_symbol(HuffReader *r, BitstreamContext *bc) > { > if (r->simple) { > if (r->nb_symbols == 1) > return r->simple_symbols[0]; > else > - return r->simple_symbols[get_bits1(gb)]; > + return r->simple_symbols[bitstream_read_bit(bc)]; > } else > - return webp_get_vlc(gb, r->vlc.table); > + return webp_get_vlc(bc, r->vlc.table); > } > > static int huff_reader_build_canonical(HuffReader *r, int *code_lengths, > @@ -339,15 +333,15 @@ static int huff_reader_build_canonical(HuffReader *r, > int *code_lengths, > > static void read_huffman_code_simple(WebPContext *s, HuffReader *hc) > { > - hc->nb_symbols = get_bits1(&s->gb) + 1; > + hc->nb_symbols = bitstream_read_bit(&s->bc) + 1; > > - if (get_bits1(&s->gb)) > - hc->simple_symbols[0] = get_bits(&s->gb, 8); > + if (bitstream_read_bit(&s->bc)) > + hc->simple_symbols[0] = bitstream_read(&s->bc, 8); > else > - hc->simple_symbols[0] = get_bits1(&s->gb); > + hc->simple_symbols[0] = bitstream_read_bit(&s->bc); > > if (hc->nb_symbols == 2) > - hc->simple_symbols[1] = get_bits(&s->gb, 8); > + hc->simple_symbols[1] = bitstream_read(&s->bc, 8); > > hc->simple = 1; > } > @@ -359,13 +353,13 @@ static int read_huffman_code_normal(WebPContext *s, > HuffReader *hc, > int *code_lengths = NULL; > int code_length_code_lengths[NUM_CODE_LENGTH_CODES] = { 0 }; > int i, symbol, max_symbol, prev_code_len, ret; > - int num_codes = 4 + get_bits(&s->gb, 4); > + int num_codes = 4 + bitstream_read(&s->bc, 4); > > if (num_codes > NUM_CODE_LENGTH_CODES) > return AVERROR_INVALIDDATA; > > for (i = 0; i < num_codes; i++) > - code_length_code_lengths[code_length_code_order[i]] = > get_bits(&s->gb, 3); > + code_length_code_lengths[code_length_code_order[i]] = > bitstream_read(&s->bc, 3); > > ret = huff_reader_build_canonical(&code_len_hc, code_length_code_lengths, > NUM_CODE_LENGTH_CODES); > @@ -378,9 +372,9 @@ static int read_huffman_code_normal(WebPContext *s, > HuffReader *hc, > goto finish; > } > > - if (get_bits1(&s->gb)) { > - int bits = 2 + 2 * get_bits(&s->gb, 3); > - max_symbol = 2 + get_bits(&s->gb, bits); > + if (bitstream_read_bit(&s->bc)) { > + int bits = 2 + 2 * bitstream_read(&s->bc, 3); > + max_symbol = 2 + bitstream_read(&s->bc, bits); > if (max_symbol > alphabet_size) { > av_log(s->avctx, AV_LOG_ERROR, "max symbol %d > alphabet size > %d\n", > max_symbol, alphabet_size); > @@ -398,7 +392,7 @@ static int read_huffman_code_normal(WebPContext *s, > HuffReader *hc, > > if (!max_symbol--) > break; > - code_len = huff_reader_get_symbol(&code_len_hc, &s->gb); > + code_len = huff_reader_get_symbol(&code_len_hc, &s->bc); > if (code_len < 16) { > /* Code length code [0..15] indicates literal code lengths. */ > code_lengths[symbol++] = code_len; > @@ -411,18 +405,18 @@ static int read_huffman_code_normal(WebPContext *s, > HuffReader *hc, > /* Code 16 repeats the previous non-zero value [3..6] times, > * i.e., 3 + ReadBits(2) times. If code 16 is used before a > * non-zero value has been emitted, a value of 8 is > repeated. */ > - repeat = 3 + get_bits(&s->gb, 2); > + repeat = 3 + bitstream_read(&s->bc, 2); > length = prev_code_len; > break; > case 17: > /* Code 17 emits a streak of zeros [3..10], i.e., > * 3 + ReadBits(3) times. */ > - repeat = 3 + get_bits(&s->gb, 3); > + repeat = 3 + bitstream_read(&s->bc, 3); > break; > case 18: > /* Code 18 emits a streak of zeros of length [11..138], i.e., > * 11 + ReadBits(7) times. */ > - repeat = 11 + get_bits(&s->gb, 7); > + repeat = 11 + bitstream_read(&s->bc, 7); > break; > } > if (symbol + repeat > alphabet_size) { > @@ -449,7 +443,7 @@ static int decode_entropy_coded_image(WebPContext *s, > enum ImageRole role, > int w, int h); > > #define PARSE_BLOCK_SIZE(w, h) do { \ > - block_bits = get_bits(&s->gb, 3) + 2; \ > + block_bits = bitstream_read(&s->bc, 3) + 2; > \ > blocks_w = FFALIGN((w), 1 << block_bits) >> block_bits; \ > blocks_h = FFALIGN((h), 1 << block_bits) >> block_bits; \ > } while (0) > @@ -526,7 +520,7 @@ static int parse_transform_color_indexing(WebPContext *s) > int width_bits, index_size, ret, x; > uint8_t *ct; > > - index_size = get_bits(&s->gb, 8) + 1; > + index_size = bitstream_read(&s->bc, 8) + 1; > > if (index_size <= 2) > width_bits = 3; > @@ -606,8 +600,8 @@ static int decode_entropy_coded_image(WebPContext *s, > enum ImageRole role, > if (ret < 0) > return ret; > > - if (get_bits1(&s->gb)) { > - img->color_cache_bits = get_bits(&s->gb, 4); > + if (bitstream_read_bit(&s->bc)) { > + img->color_cache_bits = bitstream_read(&s->bc, 4); > if (img->color_cache_bits < 1 || img->color_cache_bits > 11) { > av_log(s->avctx, AV_LOG_ERROR, "invalid color cache bits: %d\n", > img->color_cache_bits); > @@ -622,7 +616,7 @@ static int decode_entropy_coded_image(WebPContext *s, > enum ImageRole role, > } > > img->nb_huffman_groups = 1; > - if (role == IMAGE_ROLE_ARGB && get_bits1(&s->gb)) { > + if (role == IMAGE_ROLE_ARGB && bitstream_read_bit(&s->bc)) { > ret = decode_entropy_image(s); > if (ret < 0) > return ret; > @@ -641,7 +635,7 @@ static int decode_entropy_coded_image(WebPContext *s, > enum ImageRole role, > if (!j && img->color_cache_bits > 0) > alphabet_size += 1 << img->color_cache_bits; > > - if (get_bits1(&s->gb)) { > + if (bitstream_read_bit(&s->bc)) { > read_huffman_code_simple(s, &hg[j]); > } else { > ret = read_huffman_code_normal(s, &hg[j], alphabet_size); > @@ -660,14 +654,14 @@ static int decode_entropy_coded_image(WebPContext *s, > enum ImageRole role, > int v; > > hg = get_huffman_group(s, img, x, y); > - v = huff_reader_get_symbol(&hg[HUFF_IDX_GREEN], &s->gb); > + v = huff_reader_get_symbol(&hg[HUFF_IDX_GREEN], &s->bc); > if (v < NUM_LITERAL_CODES) { > /* literal pixel values */ > uint8_t *p = GET_PIXEL(img->frame, x, y); > p[2] = v; > - p[1] = huff_reader_get_symbol(&hg[HUFF_IDX_RED], &s->gb); > - p[3] = huff_reader_get_symbol(&hg[HUFF_IDX_BLUE], &s->gb); > - p[0] = huff_reader_get_symbol(&hg[HUFF_IDX_ALPHA], &s->gb); > + p[1] = huff_reader_get_symbol(&hg[HUFF_IDX_RED], &s->bc); > + p[3] = huff_reader_get_symbol(&hg[HUFF_IDX_BLUE], &s->bc); > + p[0] = huff_reader_get_symbol(&hg[HUFF_IDX_ALPHA], &s->bc); > if (img->color_cache_bits) > color_cache_put(img, AV_RB32(p)); > x++; > @@ -686,9 +680,9 @@ static int decode_entropy_coded_image(WebPContext *s, > enum ImageRole role, > } else { > int extra_bits = (prefix_code - 2) >> 1; > int offset = 2 + (prefix_code & 1) << extra_bits; > - length = offset + get_bits(&s->gb, extra_bits) + 1; > + length = offset + bitstream_read(&s->bc, extra_bits) + 1; > } > - prefix_code = huff_reader_get_symbol(&hg[HUFF_IDX_DIST], &s->gb); > + prefix_code = huff_reader_get_symbol(&hg[HUFF_IDX_DIST], &s->bc); > if (prefix_code > 39) { > av_log(s->avctx, AV_LOG_ERROR, > "distance prefix code too large: %d\n", prefix_code); > @@ -699,7 +693,7 @@ static int decode_entropy_coded_image(WebPContext *s, > enum ImageRole role, > } else { > int extra_bits = prefix_code - 2 >> 1; > int offset = 2 + (prefix_code & 1) << extra_bits; > - distance = offset + get_bits(&s->gb, extra_bits) + 1; > + distance = offset + bitstream_read(&s->bc, extra_bits) + 1; > } > > /* find reference location */ > @@ -1034,7 +1028,7 @@ static int apply_color_indexing_transform(WebPContext > *s) > pal = &s->image[IMAGE_ROLE_COLOR_INDEXING]; > > if (pal->size_reduction > 0) { > - GetBitContext gb_g; > + BitstreamContext bc_g; > uint8_t *line; > int pixel_bits = 8 >> pal->size_reduction; > > @@ -1045,15 +1039,15 @@ static int apply_color_indexing_transform(WebPContext > *s) > for (y = 0; y < img->frame->height; y++) { > p = GET_PIXEL(img->frame, 0, y); > memcpy(line, p, img->frame->linesize[0]); > - init_get_bits(&gb_g, line, img->frame->linesize[0] * 8); > - skip_bits(&gb_g, 16); > + bitstream_init(&bc_g, line, img->frame->linesize[0] * 8); > + bitstream_skip(&bc_g, 16); > i = 0; > for (x = 0; x < img->frame->width; x++) { > p = GET_PIXEL(img->frame, x, y); > - p[2] = get_bits(&gb_g, pixel_bits); > + p[2] = bitstream_read(&bc_g, pixel_bits); > i++; > if (i == 1 << pal->size_reduction) { > - skip_bits(&gb_g, 24); > + bitstream_skip(&bc_g, 24); > i = 0; > } > } > @@ -1089,18 +1083,18 @@ static int vp8_lossless_decode_frame(AVCodecContext > *avctx, AVFrame *p, > avctx->pix_fmt = AV_PIX_FMT_ARGB; > } > > - ret = init_get_bits(&s->gb, data_start, data_size * 8); > + ret = bitstream_init(&s->bc, data_start, data_size * 8); > if (ret < 0) > return ret; > > if (!is_alpha_chunk) { > - if (get_bits(&s->gb, 8) != 0x2F) { > + if (bitstream_read(&s->bc, 8) != 0x2F) { > av_log(avctx, AV_LOG_ERROR, "Invalid WebP Lossless signature\n"); > return AVERROR_INVALIDDATA; > } > > - w = get_bits(&s->gb, 14) + 1; > - h = get_bits(&s->gb, 14) + 1; > + w = bitstream_read(&s->bc, 14) + 1; > + h = bitstream_read(&s->bc, 14) + 1; > if (s->width && s->width != w) { > av_log(avctx, AV_LOG_WARNING, "Width mismatch. %d != %d\n", > s->width, w); > @@ -1116,9 +1110,9 @@ static int vp8_lossless_decode_frame(AVCodecContext > *avctx, AVFrame *p, > if (ret < 0) > return ret; > > - s->has_alpha = get_bits1(&s->gb); > + s->has_alpha = bitstream_read_bit(&s->bc); > > - if (get_bits(&s->gb, 3) != 0x0) { > + if (bitstream_read(&s->bc, 3) != 0x0) { > av_log(avctx, AV_LOG_ERROR, "Invalid WebP Lossless version\n"); > return AVERROR_INVALIDDATA; > } > @@ -1133,8 +1127,8 @@ static int vp8_lossless_decode_frame(AVCodecContext > *avctx, AVFrame *p, > s->nb_transforms = 0; > s->reduced_width = 0; > used = 0; > - while (get_bits1(&s->gb)) { > - enum TransformType transform = get_bits(&s->gb, 2); > + while (bitstream_read_bit(&s->bc)) { > + enum TransformType transform = bitstream_read(&s->bc, 2); > s->transforms[s->nb_transforms++] = transform; > if (used & (1 << transform)) { > av_log(avctx, AV_LOG_ERROR, "Transform %d used more than once\n", > -- > 2.7.3
Looks fine, but note that we have no webp tests, so this is not covered by FATE. -- Anton Khirnov _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
