]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/oggdec.c
Factor tag reading code out of wav read_header()
[ffmpeg] / libavformat / oggdec.c
index 3b59e002ee5da7769f89e68215402be5eefd2c11..4fcf8ad58c83dca4c02cf6024aa485f46fd6dd06 100644 (file)
@@ -362,6 +362,9 @@ ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize, int64_t *fpo
             idx, os->psize, os->pstart);
 #endif
 
+    if (os->granule == -1)
+        av_log(s, AV_LOG_WARNING, "Page at %"PRId64" is missing granule\n", os->page_pos);
+
     ogg->curidx = idx;
     os->incomplete = 0;
 
@@ -370,9 +373,27 @@ ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize, int64_t *fpo
         if (!os->header){
             os->segp = segp;
             os->psize = psize;
-            if (!ogg->headers)
-                s->data_offset = os->sync_pos;
+
+            // We have reached the first non-header packet. All header
+            // packets must be complete before the first non-header
+            // one, so everything that follows must be non-header.
             ogg->headers = 1;
+
+            // Update the header state for all streams and
+            // compute the data_offset.
+            s->data_offset = os->sync_pos;
+            for (i = 0; i < ogg->nstreams; i++) {
+                struct ogg_stream *cur_os = ogg->streams + i;
+                // Set stream header state to 0 if its last packet
+                // was a header.
+                if (cur_os->header > 0)
+                    cur_os->header = 0;
+
+                // if we have a partial non-header packet, its start is
+                // obviously at or after the data start
+                if (cur_os->incomplete)
+                    s->data_offset = FFMIN(s->data_offset, cur_os->sync_pos);
+            }
         }else{
             os->pstart += os->psize;
             os->psize = 0;
@@ -512,8 +533,7 @@ static int64_t ogg_calc_pts(AVFormatContext *s, int idx, int64_t *dts)
             else
                 os->lastpts = ogg_gptopts(s, idx, os->granule, &os->lastdts);
             os->granule = -1LL;
-        } else
-            av_log(s, AV_LOG_WARNING, "Packet is missing granule\n");
+        }
     }
     return pts;
 }
@@ -639,5 +659,5 @@ AVInputFormat ogg_demuxer = {
     ogg_read_seek,
     ogg_read_timestamp,
     .extensions = "ogg",
-    .metadata_conv = ff_vorbiscomment_metadata_conv,
+    .flags = AVFMT_GENERIC_INDEX,
 };