[FFmpeg-devel] [PATCH] gifdec: resync support

Michael Niedermayer michaelni at gmx.at
Fri Jan 25 17:28:43 CET 2013


On Fri, Jan 25, 2013 at 03:32:58PM +0000, Paul B Mahol wrote:
> On 1/21/13, Michael Niedermayer <michaelni at gmx.at> wrote:
> > This allows decoding gifs that have junk at the begin
> > and also allows byte wise seeking
> >
> > Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> > ---
> >  libavformat/gifdec.c |   32 ++++++++++++++++++++++++++------
> >  1 file changed, 26 insertions(+), 6 deletions(-)
> >
> > diff --git a/libavformat/gifdec.c b/libavformat/gifdec.c
> > index 4f4ce2c..357d698 100644
> > --- a/libavformat/gifdec.c
> > +++ b/libavformat/gifdec.c
> > @@ -70,6 +70,19 @@ static int gif_probe(AVProbeData *p)
> >      return AVPROBE_SCORE_MAX;
> >  }
> >
> > +static int resync(AVIOContext *pb)
> > +{
> > +    int i;
> > +    for (i=0; i<6; i++) {
> 
> for (i = 0; i < 6; i++) {
> 
> > +        int b = avio_r8(pb);
> > +        if(b != gif87a_sig[i] && b != gif89a_sig[i])
> 
> ' ' after if
> 
> > +            i = -(b != 'G');
> > +        if(url_feof(pb))
> 
> ditto
> 
> > +            return AVERROR_EOF;
> > +    }
> > +    return 0;
> > +}
> > +
> >  static int gif_read_header(AVFormatContext *s)
> >  {
> >      GIFDemuxContext *gdc = s->priv_data;
> > @@ -77,8 +90,7 @@ static int gif_read_header(AVFormatContext *s)
> >      AVStream        *st;
> >      int width, height, ret;
> >
> > -    /* skip 6-byte magick */
> > -    if ((ret = avio_skip(pb, 6)) < 0)
> > +    if ((ret = resync(pb)) < 0)
> >          return ret;
> >
> >      gdc->delay  = gdc->default_delay;
> > @@ -171,6 +183,7 @@ static int gif_read_packet(AVFormatContext *s, AVPacket
> > *pkt)
> >      }
> >
> >      if (keyframe) {
> > +parse_keyframe:
> >          /* skip 2 bytes of width and 2 of height */
> >          if ((ret = avio_skip(pb, 4)) < 0)
> >              return ret;
> > @@ -196,7 +209,7 @@ static int gif_read_packet(AVFormatContext *s, AVPacket
> > *pkt)
> >      while (GIF_TRAILER != (block_label = avio_r8(pb)) && !url_feof(pb)) {
> >          if (block_label == GIF_EXTENSION_INTRODUCER) {
> >              if ((ret = gif_read_ext (s)) < 0 )
> > -                return ret;
> > +                goto resync;
> >          } else if (block_label == GIF_IMAGE_SEPARATOR) {
> >              /* skip to last byte of Image Descriptor header */
> >              if ((ret = avio_skip(pb, 8)) < 0)
> > @@ -215,11 +228,11 @@ static int gif_read_packet(AVFormatContext *s,
> > AVPacket *pkt)
> >              /* read LZW Minimum Code Size */
> >              if (avio_r8(pb) < 1) {
> >                  av_log(s, AV_LOG_ERROR, "lzw minimum code size must be >=
> > 1\n");
> > -                return AVERROR_INVALIDDATA;
> > +                goto resync;
> >              }
> >
> >              if ((ret = gif_skip_subblocks(pb)) < 0)
> > -                return ret;
> > +                goto resync;
> >
> >              frame_end = avio_tell(pb);
> >
> > @@ -244,7 +257,14 @@ static int gif_read_packet(AVFormatContext *s, AVPacket
> > *pkt)
> >              break;
> >          } else {
> >              av_log(s, AV_LOG_ERROR, "invalid block label\n");
> > -            return AVERROR_INVALIDDATA;
> > +resync:
> > +            if (!keyframe)
> > +                avio_seek(pb, frame_start, SEEK_SET);
> > +            if((ret = resync(pb)) < 0)
> 
> ' ' after if.
> 
> > +                return ret;
> > +            frame_start = avio_tell(pb) - 6;
> > +            keyframe = 1;
> > +            goto parse_keyframe;
> >          }
> >      }
> >
> > --
> > 1.7.9.5
> 
> lgtm, but please follow current style.

fixed, applied

thanks

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Awnsering whenever a program halts or runs forever is
On a turing machine, in general impossible (turings halting problem).
On any real computer, always possible as a real computer has a finite number
of states N, and will either halt in less than N cycles or never halt.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130125/c852c713/attachment.asc>


More information about the ffmpeg-devel mailing list