diff libmpdemux/demuxer.c @ 30378:8339bca8e4b4

Move the resync-related code into more consistent places instead of having it scattered all over the place with half of it forgotten in some places.
author reimar
date Sun, 24 Jan 2010 15:16:39 +0000
parents 4977e04f3a18
children 0140d505dd91
line wrap: on
line diff
--- a/libmpdemux/demuxer.c	Sun Jan 24 12:55:05 2010 +0000
+++ b/libmpdemux/demuxer.c	Sun Jan 24 15:16:39 2010 +0000
@@ -1183,6 +1183,20 @@
     return res;
 }
 
+static void demux_resync(demuxer_t *demuxer)
+{
+    sh_video_t *sh_video = demuxer->video->sh;
+    sh_audio_t *sh_audio = demuxer->audio->sh;
+    demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
+    if (sh_video) {
+        ds_fill_buffer(demuxer->video);
+        resync_video_stream(sh_video);
+    }
+    if (sh_audio) {
+        ds_fill_buffer(demuxer->audio);
+        resync_audio_stream(sh_audio);
+    }
+}
 
 void demux_flush(demuxer_t *demuxer)
 {
@@ -1196,8 +1210,6 @@
 {
     demux_stream_t *d_audio = demuxer->audio;
     demux_stream_t *d_video = demuxer->video;
-    sh_audio_t *sh_audio = d_audio->sh;
-    sh_video_t *sh_video = d_video->sh;
     double tmp = 0;
     double pts;
 
@@ -1214,17 +1226,11 @@
     }
 
     demux_flush(demuxer);
-    // clear demux buffers:
-    if (sh_audio)
-        sh_audio->a_buffer_len = 0;
 
     demuxer->stream->eof = 0;
     demuxer->video->eof = 0;
     demuxer->audio->eof = 0;
 
-    if (sh_video)
-        sh_video->timer = 0;    // !!!!!!
-
     if (flags & SEEK_ABSOLUTE)
         pts = 0.0f;
     else {
@@ -1243,7 +1249,7 @@
 
     if (stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) !=
         STREAM_UNSUPPORTED) {
-        demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
+        demux_resync(demuxer);
         return 1;
     }
 
@@ -1251,8 +1257,7 @@
     if (demuxer->desc->seek)
         demuxer->desc->seek(demuxer, rel_seek_secs, audio_delay, flags);
 
-    if (sh_audio)
-        resync_audio_stream(sh_audio);
+    demux_resync(demuxer);
 
     return 1;
 }
@@ -1475,8 +1480,6 @@
 {
     int ris;
     int current, total;
-    sh_video_t *sh_video = demuxer->video->sh;
-    sh_audio_t *sh_audio = demuxer->audio->sh;
 
     if (!demuxer->num_chapters || !demuxer->chapters) {
         if (!mode) {
@@ -1491,17 +1494,9 @@
 
         ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER,
                              &chapter);
-        if (ris != STREAM_UNSUPPORTED)
-            demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
-        if (sh_video) {
-            ds_fill_buffer(demuxer->video);
-            resync_video_stream(sh_video);
-        }
 
-        if (sh_audio) {
-            ds_fill_buffer(demuxer->audio);
-            resync_audio_stream(sh_audio);
-        }
+        demux_resync(demuxer);
+
         // exit status may be ok, but main() doesn't have to seek itself
         // (because e.g. dvds depend on sectors, not on pts)
         *seek_pts = -1.0;
@@ -1525,6 +1520,9 @@
 
         return ris != STREAM_UNSUPPORTED ? chapter : -1;
     } else {  // chapters structure is set in the demuxer
+        sh_video_t *sh_video = demuxer->video->sh;
+        sh_audio_t *sh_audio = demuxer->audio->sh;
+
         total = demuxer->num_chapters;
 
         if (mode == 1)  //absolute seeking
@@ -1659,8 +1657,6 @@
 int demuxer_set_angle(demuxer_t *demuxer, int angle)
 {
     int ris, angles = -1;
-    sh_video_t *sh_video = demuxer->video->sh;
-    sh_audio_t *sh_audio = demuxer->audio->sh;
 
     angles = demuxer_angles_count(demuxer);
     if ((angles < 1) || (angle > angles))
@@ -1672,16 +1668,7 @@
     if (ris == STREAM_UNSUPPORTED)
         return -1;
 
-    demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
-    if (sh_video) {
-        ds_fill_buffer(demuxer->video);
-        resync_video_stream(sh_video);
-    }
-
-    if (sh_audio) {
-        ds_fill_buffer(demuxer->audio);
-        resync_audio_stream(sh_audio);
-    }
+    demux_resync(demuxer);
 
     return angle;
 }