On Tue, May 28, 2013 at 01:22:32PM +0300, Martin Storsjö wrote: > From: Michael Niedermayer <[email protected]> > > Use the intensity-compensated reference frame for subsequent > fields/B-frames. > > Since we currently don't change the reference frame we have to > maintain lookup tables for intensity compensation in the following > dependent frames. > --- > libavcodec/vc1.c | 89 > ++++++++++++++++++++++++++++++++++++++++----------- > libavcodec/vc1.h | 8 +++-- > libavcodec/vc1dec.c | 49 +++++++++++++++++++--------- > 3 files changed, 109 insertions(+), 37 deletions(-) > > diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c > index 23012cd..168d7ab 100644 > --- a/libavcodec/vc1.c > +++ b/libavcodec/vc1.c > @@ -571,7 +571,7 @@ int ff_vc1_decode_entry_point(AVCodecContext *avctx, > VC1Context *v, GetBitContex > } > > /* fill lookup tables for intensity compensation */ > -#define INIT_LUT(lumscale, lumshift, luty, lutuv) do { > \ > +#define INIT_LUT(lumscale, lumshift, luty, lutuv, chain) do { > \ > int scale, shift, i; > \ > if (!lumscale) { > \ > scale = -64; > \ > @@ -586,11 +586,36 @@ int ff_vc1_decode_entry_point(AVCodecContext *avctx, > VC1Context *v, GetBitContex > shift = lumshift << 6; > \ > } > \ > for (i = 0; i < 256; i++) { > \ > - luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6); > \ > - lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> > 6); \ > + int iy = chain ? luty[i] : i; > \ > + int iu = chain ? lutuv[i] : i; > \ > + luty[i] = av_clip_uint8((scale * iy + shift + 32) >> 6); > \ > + lutuv[i] = av_clip_uint8((scale * (iu - 128) + 128*64 + 32) >> > 6);\ > } > \ > } while(0) > > +static void rotate_luts(VC1Context *v) > +{ > +#define ROTATE(DEF, L, N, C, A) do { \ > + if (v->s.pict_type == AV_PICTURE_TYPE_BI || v->s.pict_type == > AV_PICTURE_TYPE_B) { \ > + C = A; \ > + } else { \ > + DEF; \ > + memcpy(&tmp, &L , sizeof(tmp)); \ > + memcpy(&L , &N , sizeof(tmp)); \ > + memcpy(&N , &tmp, sizeof(tmp)); \ > + C = N; \ > + } \ > + } while(0) > + > + ROTATE(int tmp , v->last_use_ic, v->next_use_ic, > v->curr_use_ic, v->aux_use_ic); > + ROTATE(uint8_t tmp[2][256], v->last_luty, v->next_luty, > v->curr_luty, v->aux_luty); > + ROTATE(uint8_t tmp[2][256], v->last_lutuv, v->next_lutuv, > v->curr_lutuv, v->aux_lutuv); > + > + INIT_LUT(32, 0, v->curr_luty[0], v->curr_lutuv[0], 0); > + INIT_LUT(32, 0, v->curr_luty[1], v->curr_lutuv[1], 0); > + v->curr_use_ic = 0; > +} > + > int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) > { > int pqindex, lowquant, status; > @@ -677,8 +702,9 @@ int ff_vc1_parse_frame_header(VC1Context *v, > GetBitContext* gb) > (v->s.pict_type == AV_PICTURE_TYPE_P) ? 'P' : ((v->s.pict_type > == AV_PICTURE_TYPE_I) ? 'I' : 'B'), > pqindex, v->pq, v->halfpq, v->rangeredfrm); > > - if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == > AV_PICTURE_TYPE_P) > - v->use_ic = 0; > + if (v->first_pic_header_flag) { > + rotate_luts(v); > + } > > switch (v->s.pict_type) { > case AV_PICTURE_TYPE_P: > @@ -692,9 +718,10 @@ int ff_vc1_parse_frame_header(VC1Context *v, > GetBitContext* gb) > v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, > 3)]; > v->lumscale = get_bits(gb, 6); > v->lumshift = get_bits(gb, 6); > - v->use_ic = 1; > + v->last_use_ic = 1; > /* fill lookup tables for intensity compensation */ > - INIT_LUT(v->lumscale, v->lumshift, v->luty, v->lutuv); > + INIT_LUT(v->lumscale, v->lumshift, v->last_luty[0], > v->last_lutuv[0], 1); > + INIT_LUT(v->lumscale, v->lumshift, v->last_luty[1], > v->last_lutuv[1], 1); > } > v->qs_last = v->s.quarter_sample; > if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == > MV_PMODE_1MV_HPEL_BILIN) > @@ -942,12 +969,13 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, > GetBitContext* gb) > if (v->postprocflag) > v->postproc = get_bits(gb, 2); > > - if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == > AV_PICTURE_TYPE_P) > - v->use_ic = 0; > - > if (v->parse_only) > return 0; > > + if (v->first_pic_header_flag) { > + rotate_luts(v); > + } > + > switch (v->s.pict_type) { > case AV_PICTURE_TYPE_I: > case AV_PICTURE_TYPE_BI: > @@ -998,7 +1026,9 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, > GetBitContext* gb) > if (v->intcomp) { > v->lumscale = get_bits(gb, 6); > v->lumshift = get_bits(gb, 6); > - INIT_LUT(v->lumscale, v->lumshift, v->luty, v->lutuv); > + INIT_LUT(v->lumscale, v->lumshift, v->last_luty[0], > v->last_lutuv[0], 1); > + INIT_LUT(v->lumscale, v->lumshift, v->last_luty[1], > v->last_lutuv[1], 1); > + v->last_use_ic = 1; > } > status = bitplane_decoding(v->s.mbskip_table, > &v->skip_is_raw, v); > av_log(v->s.avctx, AV_LOG_DEBUG, "SKIPMB plane encoding: " > @@ -1041,17 +1071,38 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, > GetBitContext* gb) > int mvmode2; > mvmode2 = get_unary(gb, 1, 3); > v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][mvmode2]; > - if (v->field_mode) > - v->intcompfield = decode210(gb); > - v->lumscale = get_bits(gb, 6); > - v->lumshift = get_bits(gb, 6); > - INIT_LUT(v->lumscale, v->lumshift, v->luty, v->lutuv); > - if ((v->field_mode) && !v->intcompfield) { > + if (v->field_mode) { > + v->intcompfield = decode210(gb)^3;
add some spaces here please the rest looks passable (for the lack of better solution) _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
