summaryrefslogtreecommitdiff
path: root/libavcodec/indeo5.c
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2010-02-27 12:32:31 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2010-02-27 12:32:31 +0000
commite322aacedd1e91cbd1b1463ae9b4bb59a8316b5c (patch)
treed0979e86a0cb869af2ee7a401334b630594bf719 /libavcodec/indeo5.c
parent4982a77e56bba5c21964cf55a55c40525cd0f399 (diff)
Encapsulate VLC information needed for decoding blocks and macroblocks in
Indeo 5 into single structure IVIHuffTab and factorize code using it. Based on patch by Maxim (max_pole at German GMX) Originally committed as revision 22092 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/indeo5.c')
-rw-r--r--libavcodec/indeo5.c71
1 files changed, 12 insertions, 59 deletions
diff --git a/libavcodec/indeo5.c b/libavcodec/indeo5.c
index 050ee2b1a8..fa150f20bd 100644
--- a/libavcodec/indeo5.c
+++ b/libavcodec/indeo5.c
@@ -67,10 +67,7 @@ typedef struct {
uint8_t frame_flags;
uint16_t checksum; ///< frame checksum
- int16_t mb_huff_sel; ///< MB huffman table selector
- IVIHuffDesc mb_huff_desc; ///< MB table descriptor associated with the selector above
- VLC *mb_vlc; ///< ptr to the vlc table for decoding macroblock data
- VLC mb_vlc_cust; ///< custom macroblock vlc table
+ IVIHuffTab mb_vlc; ///< vlc table for decoding macroblock data
uint16_t gop_hdr_size;
uint8_t gop_flags;
@@ -305,9 +302,6 @@ static inline void skip_hdr_extension(GetBitContext *gb)
*/
static int decode_pic_hdr(IVI5DecContext *ctx, AVCodecContext *avctx)
{
- int result;
- IVIHuffDesc new_huff;
-
if (get_bits(&ctx->gb, 5) != 0x1F) {
av_log(avctx, AV_LOG_ERROR, "Invalid picture start code!\n");
return -1;
@@ -339,28 +333,8 @@ static int decode_pic_hdr(IVI5DecContext *ctx, AVCodecContext *avctx)
skip_hdr_extension(&ctx->gb); /* XXX: untested */
/* decode macroblock huffman codebook */
- if (ctx->frame_flags & 0x40) {
- ctx->mb_huff_sel = ff_ivi_dec_huff_desc(&ctx->gb, &new_huff);
- if (ctx->mb_huff_sel != 7) {
- ctx->mb_vlc = &ff_ivi_mb_vlc_tabs[ctx->mb_huff_sel];
- } else {
- if (ff_ivi_huff_desc_cmp(&new_huff, &ctx->mb_huff_desc)) {
- ff_ivi_huff_desc_copy(&ctx->mb_huff_desc, &new_huff);
-
- if (ctx->mb_vlc_cust.table)
- free_vlc(&ctx->mb_vlc_cust);
- result = ff_ivi_create_huff_from_desc(&ctx->mb_huff_desc,
- &ctx->mb_vlc_cust, 0);
- if (result) {
- av_log(avctx, AV_LOG_ERROR, "Error while initializing custom macroblock vlc table!\n");
- return -1;
- }
- }
- ctx->mb_vlc = &ctx->mb_vlc_cust;
- }
- } else {
- ctx->mb_vlc = &ff_ivi_mb_vlc_tabs[7]; /* select the default macroblock huffman table */
- }
+ if (ff_ivi_dec_huff_desc(&ctx->gb, ctx->frame_flags & 0x40, IVI_MB_HUFF, &ctx->mb_vlc, avctx))
+ return -1;
skip_bits(&ctx->gb, 3); /* FIXME: unknown meaning! */
}
@@ -382,9 +356,8 @@ static int decode_pic_hdr(IVI5DecContext *ctx, AVCodecContext *avctx)
static int decode_band_hdr(IVI5DecContext *ctx, IVIBandDesc *band,
AVCodecContext *avctx)
{
- int i, result;
+ int i;
uint8_t band_flags;
- IVIHuffDesc new_huff;
band_flags = get_bits(&ctx->gb, 8);
@@ -419,28 +392,8 @@ static int decode_band_hdr(IVI5DecContext *ctx, IVIBandDesc *band,
band->rvmap_sel = (band_flags & 0x40) ? get_bits(&ctx->gb, 3) : 8;
/* decode block huffman codebook */
- if (band_flags & 0x80) {
- band->huff_sel = ff_ivi_dec_huff_desc(&ctx->gb, &new_huff);
- if (band->huff_sel != 7) {
- band->blk_vlc = &ff_ivi_blk_vlc_tabs[band->huff_sel];
- } else {
- if (ff_ivi_huff_desc_cmp(&new_huff, &band->huff_desc)) {
- ff_ivi_huff_desc_copy(&band->huff_desc, &new_huff);
-
- if (band->blk_vlc_cust.table)
- free_vlc(&band->blk_vlc_cust);
- result = ff_ivi_create_huff_from_desc(&band->huff_desc,
- &band->blk_vlc_cust, 0);
- if (result) {
- av_log(avctx, AV_LOG_ERROR, "Error while initializing custom block vlc table!\n");
- return -1;
- }
- }
- band->blk_vlc = &band->blk_vlc_cust;
- }
- } else {
- band->blk_vlc = &ff_ivi_blk_vlc_tabs[7]; /* select the default macroblock huffman table */
- }
+ if (ff_ivi_dec_huff_desc(&ctx->gb, band_flags & 0x80, IVI_BLK_HUFF, &band->blk_vlc, avctx))
+ return -1;
band->checksum_present = get_bits1(&ctx->gb);
if (band->checksum_present)
@@ -504,7 +457,7 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band,
mb->q_delta = 0;
if (!band->plane && !band->band_num && (ctx->frame_flags & 8)) {
- mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc->table,
+ mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
IVI_VLC_BITS, 1);
mb->q_delta = IVI_TOSIGNED(mb->q_delta);
}
@@ -538,7 +491,7 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band,
if (ref_mb) mb->q_delta = ref_mb->q_delta;
} else if (mb->cbp || (!band->plane && !band->band_num &&
(ctx->frame_flags & 8))) {
- mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc->table,
+ mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
IVI_VLC_BITS, 1);
mb->q_delta = IVI_TOSIGNED(mb->q_delta);
}
@@ -558,10 +511,10 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band,
}
} else {
/* decode motion vector deltas */
- mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc->table,
+ mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
IVI_VLC_BITS, 1);
mv_y += IVI_TOSIGNED(mv_delta);
- mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc->table,
+ mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
IVI_VLC_BITS, 1);
mv_x += IVI_TOSIGNED(mv_delta);
mb->mv_x = mv_x;
@@ -860,8 +813,8 @@ static av_cold int decode_close(AVCodecContext *avctx)
ff_ivi_free_buffers(&ctx->planes[0]);
- if (ctx->mb_vlc_cust.table)
- free_vlc(&ctx->mb_vlc_cust);
+ if (ctx->mb_vlc.cust_tab.table)
+ free_vlc(&ctx->mb_vlc.cust_tab);
if (ctx->frame.data[0])
avctx->release_buffer(avctx, &ctx->frame);