OSDN Git Service

oggdec: Determine pts and filepos on a packet basis in read_timestamp
authorDavid Conrad <lessen42@gmail.com>
Thu, 11 Mar 2010 07:17:56 +0000 (07:17 +0000)
committerDavid Conrad <lessen42@gmail.com>
Thu, 11 Mar 2010 07:17:56 +0000 (07:17 +0000)
This takes into account whether the granule defines the start or end times
of packets, and sets the correct file offset of the associated page.

Originally committed as revision 22462 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/oggdec.c
tests/ref/seek/lavf.ogg.ref

index f627c1e..ca88140 100644 (file)
@@ -581,15 +581,14 @@ ogg_read_timestamp (AVFormatContext * s, int stream_index, int64_t * pos_arg,
     int64_t pts = AV_NOPTS_VALUE;
     int i;
     url_fseek(bc, *pos_arg, SEEK_SET);
-    while (url_ftell(bc) < pos_limit && !ogg_read_page (s, &i)) {
-        if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
-            ogg->streams[i].codec && i == stream_index) {
-            pts = ogg_gptopts(s, i, ogg->streams[i].granule, NULL);
-            // FIXME: this is the position of the packet after the one with above
-            // pts.
-            *pos_arg = url_ftell(bc);
-            break;
+    ogg_reset(ogg);
+
+    while (url_ftell(bc) < pos_limit && !ogg_packet(s, &i, NULL, NULL, pos_arg)) {
+        if (i == stream_index) {
+            pts = ogg_calc_pts(s, i, NULL);
         }
+        if (pts != AV_NOPTS_VALUE)
+            break;
     }
     ogg_reset(ogg);
     return pts;
index d366a59..0c49d89 100644 (file)
@@ -1,52 +1,39 @@
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:    125 size:  1364
 ret: 0         st:-1 flags:0  ts:-1.000000
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   4353 size:  1382
-ret: 0         st:-1 flags:1  ts: 1.894167
-ret:-EIO
+ret:-1         st:-1 flags:1  ts: 1.894167
 ret: 0         st: 0 flags:0  ts: 0.788345
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:  11410 size:  1365
 ret: 0         st: 0 flags:1  ts:-0.317506
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   1522 size:  1381
-ret: 0         st:-1 flags:0  ts: 2.576668
-ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:  12808 size:  1223
-ret: 0         st:-1 flags:1  ts: 1.470835
-ret:-EIO
+ret:-1         st:-1 flags:0  ts: 2.576668
+ret:-1         st:-1 flags:1  ts: 1.470835
 ret: 0         st: 0 flags:0  ts: 0.365011
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   7191 size:  1370
 ret: 0         st: 0 flags:1  ts:-0.740839
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   1522 size:  1381
-ret: 0         st:-1 flags:0  ts: 2.153336
-ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:  12808 size:  1223
-ret: 0         st:-1 flags:1  ts: 1.047503
-ret:-EIO
+ret:-1         st:-1 flags:0  ts: 2.153336
+ret:-1         st:-1 flags:1  ts: 1.047503
 ret: 0         st: 0 flags:0  ts:-0.058322
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   4353 size:  1382
-ret: 0         st: 0 flags:1  ts: 2.835828
-ret:-EIO
-ret: 0         st:-1 flags:0  ts: 1.730004
-ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:  12808 size:  1223
+ret:-1         st: 0 flags:1  ts: 2.835828
+ret:-1         st:-1 flags:0  ts: 1.730004
 ret: 0         st:-1 flags:1  ts: 0.624171
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   5768 size:  1390
 ret: 0         st: 0 flags:0  ts:-0.481655
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   4353 size:  1382
-ret: 0         st: 0 flags:1  ts: 2.412494
-ret:-EIO
-ret: 0         st:-1 flags:0  ts: 1.306672
-ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:  12808 size:  1223
+ret:-1         st: 0 flags:1  ts: 2.412494
+ret:-1         st:-1 flags:0  ts: 1.306672
 ret: 0         st:-1 flags:1  ts: 0.200839
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   1522 size:  1381
 ret: 0         st: 0 flags:0  ts:-0.904989
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   4353 size:  1382
-ret: 0         st: 0 flags:1  ts: 1.989184
-ret:-EIO
-ret: 0         st:-1 flags:0  ts: 0.883340
-ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:  12808 size:  1223
+ret:-1         st: 0 flags:1  ts: 1.989184
+ret:-1         st:-1 flags:0  ts: 0.883340
 ret: 0         st:-1 flags:1  ts:-0.222493
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   1522 size:  1381
-ret: 0         st: 0 flags:0  ts: 2.671678
-ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:  12808 size:  1223
-ret: 0         st: 0 flags:1  ts: 1.565850
-ret:-EIO
+ret:-1         st: 0 flags:0  ts: 2.671678
+ret:-1         st: 0 flags:1  ts: 1.565850
 ret: 0         st:-1 flags:0  ts: 0.460008
 ret: 0         st: 0 flags:1 dts: NOPTS    pts: NOPTS    pos:   8594 size:  1381
 ret: 0         st:-1 flags:1  ts:-0.645825