[FFmpeg-cvslog] r9428 - trunk/libavformat/aiff.c

bcoudurier subversion
Mon Jun 25 23:31:33 CEST 2007


Author: bcoudurier
Date: Mon Jun 25 23:31:33 2007
New Revision: 9428

Log:
support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant

Modified:
   trunk/libavformat/aiff.c

Modified: trunk/libavformat/aiff.c
==============================================================================
--- trunk/libavformat/aiff.c	(original)
+++ trunk/libavformat/aiff.c	Mon Jun 25 23:31:33 2007
@@ -289,7 +289,8 @@ static int aiff_probe(AVProbeData *p)
 static int aiff_read_header(AVFormatContext *s,
                             AVFormatParameters *ap)
 {
-    int size, filesize, offset;
+    int size, filesize;
+    offset_t offset = 0;
     uint32_t tag;
     unsigned version = AIFF_C_VERSION1;
     ByteIOContext *pb = &s->pb;
@@ -327,6 +328,8 @@ static int aiff_read_header(AVFormatCont
                 st->nb_frames = get_aiff_header (pb, st->codec, size, version);
                 if (st->nb_frames < 0)
                         return st->nb_frames;
+                if (offset > 0) // COMM is after SSND
+                    goto got_sound;
                 break;
 
             case MKTAG('F', 'V', 'E', 'R'):     /* Version chunk */
@@ -352,7 +355,15 @@ static int aiff_read_header(AVFormatCont
             case MKTAG('S', 'S', 'N', 'D'):     /* Sampled sound chunk */
                 get_be32(pb);               /* Block align... don't care */
                 offset = get_be32(pb);      /* Offset of sound data */
-                goto got_sound;
+                offset += url_ftell(pb);    /* Compute absolute data offset */
+                if (st->codec->codec_id)    /* Assume COMM already parsed */
+                    goto got_sound;
+                if (url_is_streamed(pb)) {
+                    av_log(s, AV_LOG_ERROR, "file is not seekable\n");
+                    return -1;
+                }
+                url_fskip(pb, size - 8);
+                break;
 
             default: /* Jump */
                 if (size & 1)   /* Always even aligned */
@@ -374,7 +385,7 @@ got_sound:
     st->duration = st->nb_frames;
 
     /* Position the stream at the first block */
-    url_fskip(pb, offset);
+    url_fseek(pb, offset, SEEK_SET);
 
     return 0;
 }




More information about the ffmpeg-cvslog mailing list