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.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to