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

Reply via email to