[FFmpeg-devel] [PATCH] 1bpp and 2bpp support in QTRLE

Stefan Gehrer stefan.gehrer
Fri Sep 5 09:57:19 CEST 2008


Michael Niedermayer wrote:
> On Wed, Sep 03, 2008 at 05:48:25PM +0200, Stefan Gehrer wrote:
>> Michael Niedermayer wrote:
>>> On Sun, Aug 31, 2008 at 12:13:13PM +0200, Stefan Gehrer wrote:
>>>> Hi,
>>>>
>>>> patch is based on Roberto's patch here
>>>> (http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2007-January/022046.html)
>>>> and adds support for 1bpp and 2bpp decoding in qtrle.c.
>>>> The samples from http://samples.mplayerhq.hu/V-codecs/QTRLE/
>>>> play visually ok, but the 1bpp decoding produces warnings
>>>> about trying to write pixels past the end of the image.
>>>>
>>>> Stefan
>>>> Index: qtrle.c
>>>> ===================================================================
>>>> --- qtrle.c	(revision 15121)
>>>> +++ qtrle.c	(working copy)
>>> [...]
>>>>  static void qtrle_decode_2bpp(QtrleContext *s, int stream_ptr, int 
>>>> row_ptr, int lines_to_change)
>>>>  {
>> [snip]
>>
>>>>  }
>>> this looks like it can be in a common function handling 4bpp as well.
>>> it that is marked as inline gcc should optimize the bpp out.
>> Done, new patch attached.
>>
>>>> @@ -387,6 +485,7 @@
>>>>      QtrleContext *s = avctx->priv_data;
>>>>      int header, start_line;
>>>>      int stream_ptr, height, row_ptr;
>>>> +    int has_palette = 0;
>>>>       s->buf = buf;
>>>>      s->size = buf_size;
>>>> @@ -433,28 +532,19 @@
>>>>      case 2:
>>>>      case 34:
>>>>          qtrle_decode_2bpp(s, stream_ptr, row_ptr, height);
>>>> +        has_palette = 1;
>>>>          break;
>>>>       case 4:
>>>>      case 36:
>>>>          qtrle_decode_4bpp(s, stream_ptr, row_ptr, height);
>>>> -        /* make the palette available on the way out */
>>>> -        memcpy(s->frame.data[1], s->avctx->palctrl->palette, 
>>>> AVPALETTE_SIZE);
>>>> -        if (s->avctx->palctrl->palette_changed) {
>>>> -            s->frame.palette_has_changed = 1;
>>>> -            s->avctx->palctrl->palette_changed = 0;
>>>> -        }
>>>> +        has_palette = 1;
>>>>          break;
>>>>       case 8:
>>>>      case 40:
>>>>          qtrle_decode_8bpp(s, stream_ptr, row_ptr, height);
>>>> -        /* make the palette available on the way out */
>>>> -        memcpy(s->frame.data[1], s->avctx->palctrl->palette, 
>>>> AVPALETTE_SIZE);
>>>> -        if (s->avctx->palctrl->palette_changed) {
>>>> -            s->frame.palette_has_changed = 1;
>>>> -            s->avctx->palctrl->palette_changed = 0;
>>>> -        }
>>>> +        has_palette = 1;
>>>>          break;
>>>>       case 16:
>>>> @@ -474,6 +564,16 @@
>>>>              avctx->bits_per_sample);
>>>>          break;
>>>>      }
>>>> +
>>>> +    if(has_palette) {
>>>> +        /* make the palette available on the way out */
>>>> +        memcpy(s->frame.data[1], s->avctx->palctrl->palette, 
>>>> AVPALETTE_SIZE);
>>>> +        if (s->avctx->palctrl->palette_changed) {
>>>> +            s->frame.palette_has_changed = 1;
>>>> +            s->avctx->palctrl->palette_changed = 0;
>>>> +        }
>>>> +    }
>>>> +
>>>>  done:
>>>>      *data_size = sizeof(AVFrame);
>>>>      *(AVFrame*)data = s->frame;
>>> The avctx->palctrl->palette_changed stuff is deprecated due to race
>>> conditions caused by the design.
>> I see, though I consider this patch independent of the issue as it only
>> moves the code to a common place.
>> As far as I can see the deprecated way of handling palettes must be
>> fixed in the MOV demuxer first.
> 
> fine
> 
> but maybe the 1bpp case can also be merged into the 2+4 code?
> It is a little more different so iam not sure ...
> 

A fair part of the 1bpp-code is about line skipping which does not
exist in the 2/4bpp code. Of the remaining 16 lines of code only
four are an exact match with the 2/4bpp code, the rest would be
special-cased. I tried merging but did not like it.
Can I apply as is then?

Stefan




More information about the ffmpeg-devel mailing list