diff --git a/libavcodec/h261dec.c b/libavcodec/h261dec.c index 47c303274c..47fbebe973 100644 --- a/libavcodec/h261dec.c +++ b/libavcodec/h261dec.c @@ -45,8 +45,6 @@ static VLC h261_mtype_vlc; static VLC h261_mv_vlc; static VLC h261_cbp_vlc; -static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded); - static av_cold void h261_decode_init_vlc(H261Context *h) { static int done = 0; @@ -250,6 +248,94 @@ static int decode_mv_component(GetBitContext *gb, int v) return v; } +/** + * Decode a macroblock. + * @return <0 if an error occurred + */ +static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded) +{ + MpegEncContext *const s = &h->s; + int code, level, i, j, run; + RLTable *rl = &ff_h261_rl_tcoeff; + const uint8_t *scan_table; + + /* For the variable length encoding there are two code tables, one being + * used for the first transmitted LEVEL in INTER, INTER + MC and + * INTER + MC + FIL blocks, the second for all other LEVELs except the + * first one in INTRA blocks which is fixed length coded with 8 bits. + * NOTE: The two code tables only differ in one VLC so we handle that + * manually. */ + scan_table = s->intra_scantable.permutated; + if (s->mb_intra) { + /* DC coef */ + level = get_bits(&s->gb, 8); + // 0 (00000000b) and -128 (10000000b) are FORBIDDEN + if ((level & 0x7F) == 0) { + av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", + level, s->mb_x, s->mb_y); + return -1; + } + /* The code 1000 0000 is not used, the reconstruction level of 1024 + * being coded as 1111 1111. */ + if (level == 255) + level = 128; + block[0] = level; + i = 1; + } else if (coded) { + // Run Level Code + // EOB Not possible for first level when cbp is available (that's why the table is different) + // 0 1 1s + // * * 0* + int check = show_bits(&s->gb, 2); + i = 0; + if (check & 0x2) { + skip_bits(&s->gb, 2); + block[0] = (check & 0x1) ? -1 : 1; + i = 1; + } + } else { + i = 0; + } + if (!coded) { + s->block_last_index[n] = i - 1; + return 0; + } + for (;;) { + code = get_vlc2(&s->gb, rl->vlc.table, TCOEFF_VLC_BITS, 2); + if (code < 0) { + av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", + s->mb_x, s->mb_y); + return -1; + } + if (code == rl->n) { + /* escape */ + /* The remaining combinations of (run, level) are encoded with a + * 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits + * level. */ + run = get_bits(&s->gb, 6); + level = get_sbits(&s->gb, 8); + } else if (code == 0) { + break; + } else { + run = rl->table_run[code]; + level = rl->table_level[code]; + if (get_bits1(&s->gb)) + level = -level; + } + i += run; + if (i >= 64) { + av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d\n", + s->mb_x, s->mb_y); + return -1; + } + j = scan_table[i]; + block[j] = level; + i++; + } + s->block_last_index[n] = i - 1; + return 0; +} + static int h261_decode_mb(H261Context *h) { MpegEncContext *const s = &h->s; @@ -361,94 +447,6 @@ intra: return SLICE_OK; } -/** - * Decode a macroblock. - * @return <0 if an error occurred - */ -static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded) -{ - MpegEncContext *const s = &h->s; - int code, level, i, j, run; - RLTable *rl = &ff_h261_rl_tcoeff; - const uint8_t *scan_table; - - /* For the variable length encoding there are two code tables, one being - * used for the first transmitted LEVEL in INTER, INTER + MC and - * INTER + MC + FIL blocks, the second for all other LEVELs except the - * first one in INTRA blocks which is fixed length coded with 8 bits. - * NOTE: The two code tables only differ in one VLC so we handle that - * manually. */ - scan_table = s->intra_scantable.permutated; - if (s->mb_intra) { - /* DC coef */ - level = get_bits(&s->gb, 8); - // 0 (00000000b) and -128 (10000000b) are FORBIDDEN - if ((level & 0x7F) == 0) { - av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", - level, s->mb_x, s->mb_y); - return -1; - } - /* The code 1000 0000 is not used, the reconstruction level of 1024 - * being coded as 1111 1111. */ - if (level == 255) - level = 128; - block[0] = level; - i = 1; - } else if (coded) { - // Run Level Code - // EOB Not possible for first level when cbp is available (that's why the table is different) - // 0 1 1s - // * * 0* - int check = show_bits(&s->gb, 2); - i = 0; - if (check & 0x2) { - skip_bits(&s->gb, 2); - block[0] = (check & 0x1) ? -1 : 1; - i = 1; - } - } else { - i = 0; - } - if (!coded) { - s->block_last_index[n] = i - 1; - return 0; - } - for (;;) { - code = get_vlc2(&s->gb, rl->vlc.table, TCOEFF_VLC_BITS, 2); - if (code < 0) { - av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", - s->mb_x, s->mb_y); - return -1; - } - if (code == rl->n) { - /* escape */ - /* The remaining combinations of (run, level) are encoded with a - * 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits - * level. */ - run = get_bits(&s->gb, 6); - level = get_sbits(&s->gb, 8); - } else if (code == 0) { - break; - } else { - run = rl->table_run[code]; - level = rl->table_level[code]; - if (get_bits1(&s->gb)) - level = -level; - } - i += run; - if (i >= 64) { - av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d\n", - s->mb_x, s->mb_y); - return -1; - } - j = scan_table[i]; - block[j] = level; - i++; - } - s->block_last_index[n] = i - 1; - return 0; -} - /** * Decode the H.261 picture header. * @return <0 if no startcode found diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c index 386e200003..bfdb3e68b6 100644 --- a/libavcodec/h261enc.c +++ b/libavcodec/h261enc.c @@ -32,9 +32,6 @@ #include "h261.h" #include "h261data.h" -static void h261_encode_block(H261Context *h, int16_t *block, - int n); - int ff_h261_get_picture_format(int width, int height) { // QCIF @@ -156,6 +153,79 @@ static inline int get_cbp(MpegEncContext *s, int16_t block[6][64]) return cbp; } +/** + * Encode an 8x8 block. + * @param block the 8x8 block + * @param n block index (0-3 are luma, 4-5 are chroma) + */ +static void h261_encode_block(H261Context *h, int16_t *block, int n) +{ + MpegEncContext *const s = &h->s; + int level, run, i, j, last_index, last_non_zero, sign, slevel, code; + RLTable *rl; + + rl = &ff_h261_rl_tcoeff; + if (s->mb_intra) { + /* DC coef */ + level = block[0]; + /* 255 cannot be represented, so we clamp */ + if (level > 254) { + level = 254; + block[0] = 254; + } + /* 0 cannot be represented also */ + else if (level < 1) { + level = 1; + block[0] = 1; + } + if (level == 128) + put_bits(&s->pb, 8, 0xff); + else + put_bits(&s->pb, 8, level); + i = 1; + } else if ((block[0] == 1 || block[0] == -1) && + (s->block_last_index[n] > -1)) { + // special case + put_bits(&s->pb, 2, block[0] > 0 ? 2 : 3); + i = 1; + } else { + i = 0; + } + + /* AC coefs */ + last_index = s->block_last_index[n]; + last_non_zero = i - 1; + for (; i <= last_index; i++) { + j = s->intra_scantable.permutated[i]; + level = block[j]; + if (level) { + run = i - last_non_zero - 1; + sign = 0; + slevel = level; + if (level < 0) { + sign = 1; + level = -level; + } + code = get_rl_index(rl, 0 /*no last in H.261, EOB is used*/, + run, level); + if (run == 0 && level < 16) + code += 1; + put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); + if (code == rl->n) { + put_bits(&s->pb, 6, run); + av_assert1(slevel != 0); + av_assert1(level <= 127); + put_sbits(&s->pb, 8, slevel); + } else { + put_bits(&s->pb, 1, sign); + } + last_non_zero = i; + } + } + if (last_index > -1) + put_bits(&s->pb, rl->table_vlc[0][1], rl->table_vlc[0][0]); // EOB +} + void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y) { @@ -253,79 +323,6 @@ void ff_h261_encode_init(MpegEncContext *s) s->c_dc_scale_table = ff_mpeg1_dc_scale_table; } -/** - * Encode an 8x8 block. - * @param block the 8x8 block - * @param n block index (0-3 are luma, 4-5 are chroma) - */ -static void h261_encode_block(H261Context *h, int16_t *block, int n) -{ - MpegEncContext *const s = &h->s; - int level, run, i, j, last_index, last_non_zero, sign, slevel, code; - RLTable *rl; - - rl = &ff_h261_rl_tcoeff; - if (s->mb_intra) { - /* DC coef */ - level = block[0]; - /* 255 cannot be represented, so we clamp */ - if (level > 254) { - level = 254; - block[0] = 254; - } - /* 0 cannot be represented also */ - else if (level < 1) { - level = 1; - block[0] = 1; - } - if (level == 128) - put_bits(&s->pb, 8, 0xff); - else - put_bits(&s->pb, 8, level); - i = 1; - } else if ((block[0] == 1 || block[0] == -1) && - (s->block_last_index[n] > -1)) { - // special case - put_bits(&s->pb, 2, block[0] > 0 ? 2 : 3); - i = 1; - } else { - i = 0; - } - - /* AC coefs */ - last_index = s->block_last_index[n]; - last_non_zero = i - 1; - for (; i <= last_index; i++) { - j = s->intra_scantable.permutated[i]; - level = block[j]; - if (level) { - run = i - last_non_zero - 1; - sign = 0; - slevel = level; - if (level < 0) { - sign = 1; - level = -level; - } - code = get_rl_index(rl, 0 /*no last in H.261, EOB is used*/, - run, level); - if (run == 0 && level < 16) - code += 1; - put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); - if (code == rl->n) { - put_bits(&s->pb, 6, run); - av_assert1(slevel != 0); - av_assert1(level <= 127); - put_sbits(&s->pb, 8, slevel); - } else { - put_bits(&s->pb, 1, sign); - } - last_non_zero = i; - } - } - if (last_index > -1) - put_bits(&s->pb, rl->table_vlc[0][1], rl->table_vlc[0][0]); // EOB -} - FF_MPV_GENERIC_CLASS(h261) AVCodec ff_h261_encoder = {