[FFmpeg-trac] #3204(avcodec:open): VC1 Intensity Compensation is always used once encountered

FFmpeg trac at avcodec.org
Sun Dec 8 07:27:47 CET 2013


#3204: VC1 Intensity Compensation is always used once encountered
-------------------------------------+-------------------------------------
             Reporter:  mcarter      |                    Owner:
                 Type:  defect       |                   Status:  open
             Priority:  important    |                Component:  avcodec
              Version:  git-master   |               Resolution:
             Keywords:  vc1          |               Blocked By:
  regression                         |  Reproduced by developer:  1
             Blocking:               |
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------

Comment (by mcarter):

 Here is a (probably suboptimal) naive patch that might solve the issue:

 In `vc1.c`, in `rotate_luts()` after `v->curr_use_ic = 0`, apply this
 patch:

 {{{
 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;

 +if (v->curr_luty == v->next_luty) {
 +    v->next_use_ic = 0;
 +}
 }}}

 Here's why this makes sense: the previous lines call `INIT_LUT(32, 0,
 v->curr_luty...` which sets `v->curr_lut{y,uv}[0,1]` to the identity
 mapping. But note that due to the `ROTATE()` calls, `v->curr_luty` points
 to either `v->next_luty` or `v->aux_luty`. If `v->curr_luty` points to
 `v->next_luty`, then the `INIT_LUT()` calls just set `v->next_luty` to the
 identity mapping. If `v->next_luty` is set to the identity mapping, then
 `v->next_use_ic` should be set to 0, just as `v->curr_use_ic` has already
 been set to 0. (We don't need to set `v->aux_use_ic` since it is never
 read by any code.)

 An alternative patch would be to use the same test that ROTATE() uses: `if
 (!(v->s.pict_type == AV_PICTURE_TYPE_BI || v->s.pict_type ==
 AV_PICTURE_TYPE_B)) { v->next_use_ic = 0; }`

 I'm not 100% sure if either of these are a good fix, but I hope it gives
 some insight into the problem.

--
Ticket URL: <https://trac.ffmpeg.org/ticket/3204#comment:2>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list