Hi,

On Mon, Apr 25, 2011 at 2:25 AM, Kostya <[email protected]> wrote:
> On Mon, Apr 25, 2011 at 02:20:27AM -0400, Ronald S. Bultje wrote:
>> Hi,
>>
>> On Sat, Apr 23, 2011 at 3:42 AM, Kostya Shishkov
>> <[email protected]> wrote:
>> > Official AVI specification says that stream header in case of video 
>> > contains
>> > BITMAPINFO, which is equal to BITMAPINFOHEADER and optional palette. 
>> > Currently
>> > lavf AVI demuxer thinks otherwise which produces garbage on codecs that 
>> > have
>> > both palette and extradata (luckily, there are not so many such codecs).
>> >
>> > An example of such file is:
>> > http://samples.multimedia.cx/V-codecs/KMVC/baseball1.avi
>> > (IIRC, MSS1 or MSS2 also had such situation but they are still not 
>> > supported
>> > by lavc).
>> >
>> > As a side note, passing palette in extradata as it's been done previously 
>> > is
>> > not quite correct since proper _extra_ data is surplus bytes in
>> > BITMAPINFOHEADER, not including palette.
>> >
>> > ---
>> >  libavformat/avidec.c |   12 ++++++++----
>> >  1 files changed, 8 insertions(+), 4 deletions(-)
>> >
>> > diff --git a/libavformat/avidec.c b/libavformat/avidec.c
>> > index 43d72ce..a9ff688 100644
>> > --- a/libavformat/avidec.c
>> > +++ b/libavformat/avidec.c
>> > @@ -590,12 +590,16 @@ static int avi_read_header(AVFormatContext *s, 
>> > AVFormatParameters *ap)
>> >                     /* This code assumes that extradata contains only 
>> > palette. */
>> >                     /* This is true for all paletted codecs implemented in 
>> > Libav. */
>> >                     if (st->codec->extradata_size && 
>> > (st->codec->bits_per_coded_sample <= 8)) {
>> > +                        int pal_size = (1 << 
>> > st->codec->bits_per_coded_sample) << 2;
>> > +                        const uint8_t *pal_src;
>> > +
>> > +                        pal_size = FFMIN(pal_size, 
>> > st->codec->extradata_size);
>> > +                        pal_src = st->codec->extradata + 
>> > st->codec->extradata_size - pal_size;
>> >  #if HAVE_BIGENDIAN
>> > -                        for (i = 0; i < FFMIN(st->codec->extradata_size, 
>> > AVPALETTE_SIZE)/4; i++)
>> > -                            ast->pal[i] = 
>> > av_bswap32(((uint32_t*)st->codec->extradata)[i]);
>> > +                        for (i = 0; i < pal_size/4; i++)
>> > +                            ast->pal[i] = 
>> > av_bswap32(((uint32_t*)pal_src)[i]);
>> >  #else
>> > -                        memcpy(ast->pal, st->codec->extradata,
>> > -                               FFMIN(st->codec->extradata_size, 
>> > AVPALETTE_SIZE));
>> > +                        memcpy(ast->pal, pal_src, pal_size);
>> >  #endif
>>
>> Does this fix an actual issue (would be nice to mention)? Patch OK...
>
> It does fix KMVC playback (see link above) but I don't think anybody reported
> such issue.

I was hoping for a roundup link. Without is fine also, queued locally.

Ronald
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to