[vlc-commits] demux: ogg: fix empty page bug after seek

Francois Cartegnie git at videolan.org
Thu Mar 6 23:32:37 CET 2014


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Mar  3 22:32:22 2014 +0100| [e0721e6d52cba9ac590eac79e4d04ab145e99034] | committer: Francois Cartegnie

demux: ogg: fix empty page bug after seek

pagein() can't reload the same page, and will
append its packet on next valid pagein() call.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e0721e6d52cba9ac590eac79e4d04ab145e99034
---

 modules/demux/ogg.c     |    1 -
 modules/demux/oggseek.c |   33 ++++++++++++++++-----------------
 2 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/modules/demux/ogg.c b/modules/demux/ogg.c
index 3270b48..8140186 100644
--- a/modules/demux/ogg.c
+++ b/modules/demux/ogg.c
@@ -383,7 +383,6 @@ static int Demux( demux_t * p_demux )
             {
                 continue;
             }
-
         }
 
         /* clear the finished flag if pages after eos (ex: after a seek) */
diff --git a/modules/demux/oggseek.c b/modules/demux/oggseek.c
index b44545c..a08d105 100644
--- a/modules/demux/oggseek.c
+++ b/modules/demux/oggseek.c
@@ -318,8 +318,6 @@ static int64_t get_data( demux_t *p_demux, int64_t i_bytes_to_read )
 
     i_result = stream_Read( p_demux->s, buf, i_bytes_to_read );
 
-    p_sys->b_page_waiting = false;
-
     ogg_sync_wrote( &p_sys->oy, i_result );
     return i_result;
 }
@@ -449,10 +447,7 @@ static int64_t find_first_page_granule( demux_t *p_demux,
     seek_byte( p_demux, i_pos1 );
 
     if ( i_pos1 == p_stream->i_data_start )
-    {
-        p_sys->b_page_waiting = true;
         return p_sys->i_input_position;
-    }
 
     if ( i_bytes_to_read > OGGSEEK_BYTES_TO_READ ) i_bytes_to_read = OGGSEEK_BYTES_TO_READ;
 
@@ -516,20 +511,18 @@ static int64_t find_first_page_granule( demux_t *p_demux,
         }
 
         // found a page
-        if ( p_stream->os.serialno != ogg_page_serialno( &p_sys->current_page ) )
+        if ( ogg_stream_pagein( &p_stream->os, &p_sys->current_page ) != 0 )
         {
-            /* page is not for this stream */
+            /* page is not for this stream or incomplete */
             p_sys->i_input_position += i_result;
             if ( ! i_pages_checked ) i_pos1 = p_sys->i_input_position;
             continue;
         }
 
-        ogg_stream_pagein( &p_stream->os, &p_sys->current_page );
-
         i_pages_checked++;
         i_packets_checked = 0;
 
-        if ( ogg_stream_packetout( &p_stream->os, &op ) > 0 )
+        while ( ogg_stream_packetout( &p_stream->os, &op ) > 0 )
         {
             i_packets_checked++;
         }
@@ -537,9 +530,7 @@ static int64_t find_first_page_granule( demux_t *p_demux,
         if ( i_packets_checked )
         {
             *i_granulepos = ogg_page_granulepos( &p_sys->current_page );
-            p_sys->b_page_waiting = true;
             return i_pos1;
-
         }
 
         /*  -> start of next page */
@@ -592,7 +583,9 @@ static bool OggSeekToPacket( demux_t *p_demux, logical_stream_t *p_stream,
 {
     ogg_packet op;
     demux_sys_t *p_sys  = p_demux->p_sys;
-    ogg_stream_pagein( &p_stream->os, &p_sys->current_page );
+    if ( ogg_stream_pagein( &p_stream->os, &p_sys->current_page ) != 0 )
+        return false;
+    p_sys->b_page_waiting = true;
     int i=0;
 
     int64_t itarget_frame = Ogg_GetKeyframeGranule( p_stream, i_granulepos );
@@ -609,6 +602,7 @@ static bool OggSeekToPacket( demux_t *p_demux, logical_stream_t *p_stream,
     if ( b_exact && iframe > itarget_frame )
     {
         while( ogg_stream_packetout( &p_stream->os, &op ) > 0 ) {};
+        p_sys->b_page_waiting = false;
         return false;
     }
 
@@ -704,6 +698,9 @@ static int64_t OggForwardSeekToFrame( demux_t *p_demux, int64_t i_pos1, int64_t
     seek_byte( p_demux, p_sys->i_input_position );
     ogg_stream_reset( &p_stream->os );
 
+    ogg_packet op;
+    while( ogg_stream_packetout( &p_stream->os, &op ) > 0 ) {};
+
     packetStartCoordinates lastpacket = { -1, -1, -1 };
 
     while( 1 )
@@ -735,7 +732,6 @@ static int64_t OggForwardSeekToFrame( demux_t *p_demux, int64_t i_pos1, int64_t
         {
             p_sys->i_input_position = lastpacket.i_pos;
             p_stream->i_skip_frames = 0;
-            p_sys->b_page_waiting = true;
             return p_sys->i_input_position;
         }
 
@@ -1108,7 +1104,12 @@ int Oggseek_SeektoAbsolutetime( demux_t *p_demux, logical_stream_t *p_stream,
 
     int64_t i_pagepos = OggBisectSearchByTime( p_demux, p_stream, i_time,
                                        i_offset_lower, i_offset_upper);
-
+    if ( i_pagepos >= 0 )
+    {
+        /* be sure to clear any state or read+pagein() will fail on same # */
+        ogg_stream_reset( &p_stream->os );
+        seek_byte( p_demux, p_sys->i_input_position );
+    }
     /* Insert keyframe position into index */
     OggNoDebug(
     if ( i_pagepos >= p_stream->i_data_start )
@@ -1192,8 +1193,6 @@ int64_t oggseek_read_page( demux_t *p_demux )
         return 0;
     }
 
-    p_sys->b_page_waiting = false;
-
     return i_result + PAGE_HEADER_BYTES + i_nsegs;
 }
 



More information about the vlc-commits mailing list