Hi,

----- Mail original -----
> On Mon, Sep 22, 2014 at 09:57:37AM +0200, Benoit Fouet wrote:
> > Considering the palette is located at the end of extradata may be
> > flawed
> > when the extradata contains the palette followed by the BottomUp
> > field.
> > When the BottomUp field is present, exclude it from the palette.
> > Fixes ticket #1304
> > ---
> >  libavformat/avidec.c | 4 ++++
> >  1 file changed, 4 insertions(+)
> > 
> > diff --git a/libavformat/avidec.c b/libavformat/avidec.c
> > index 5b260e2..f7b15b7 100644
> > --- a/libavformat/avidec.c
> > +++ b/libavformat/avidec.c
> > @@ -756,6 +756,10 @@ static int avi_read_header(AVFormatContext *s)
> >                          pal_size = FFMIN(pal_size,
> >                          st->codec->extradata_size);
> >                          pal_src  = st->codec->extradata +
> >                                     st->codec->extradata_size -
> >                                     pal_size;
> > +                        /* Exclude the "BottomUp" field from the
> > palette */
> > +                        if (pal_src - st->codec->extradata >= 9 &&
> > +                            !memcmp(st->codec->extradata +
> > st->codec->extradata_size - 9, "BottomUp", 9))
> > +                            pal_src -= 9;
> >                          for (i = 0; i < pal_size / 4; i++)
> >                              ast->pal[i] = 0xFFU<<24 |
> >                              AV_RL32(pal_src+4*i);
> >                          ast->has_pal = 1;
> 
> applied
> 
> though i suspect this only fixes demuxing/decoding of remuxed files
> with ffmpeg/ffplay.
> I suspect the remuxed files still wont play with the official
> avi/rawvideo code from MS or whatever the "reference" code would be
> 

I also have a "fix" for the muxer, though I'm still trying to see what the 
consequences of such a patch could be...
See attached.

-- 
Ben

diff --git a/libavformat/avienc.c b/libavformat/avienc.c
index c9d8b7f..2855293 100644
--- a/libavformat/avienc.c
+++ b/libavformat/avienc.c
@@ -299,6 +299,13 @@ static int avi_write_header(AVFormatContext *s)
         avio_wl32(pb, au_ssize); /* sample size */
         avio_wl32(pb, 0);
         avio_wl16(pb, enc->width);
+        if (   enc->extradata_size >= 9
+            && !memcmp(enc->extradata + enc->extradata_size - 9, "BottomUp", 9)) {
+            enc->height = -enc->height;
+            enc->extradata_size -= 9;
+            if (!enc->extradata_size)
+                av_freep(&enc->extradata);
+        }
         avio_wl16(pb, enc->height);
         ff_end_tag(pb, strh);
 
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to