summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demuxer.c
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-01-24 15:16:39 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-01-24 15:16:39 +0000
commit71dcc053fe61841201abe1034a86eae863197c48 (patch)
tree295ae2ca646e5bfa6b4f42edc68e15645b6eb214 /libmpdemux/demuxer.c
parent213092c8dcfc925d8d54cf320b60cf298a870696 (diff)
downloadmpv-71dcc053fe61841201abe1034a86eae863197c48.tar.bz2
mpv-71dcc053fe61841201abe1034a86eae863197c48.tar.xz
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. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30420 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r--libmpdemux/demuxer.c57
1 files changed, 22 insertions, 35 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 216323a2a1..45bc418e31 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -1183,6 +1183,20 @@ demuxer_t *demux_open(stream_t *vs, int file_format, int audio_id,
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 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay,
{
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 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay,
}
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 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay,
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 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay,
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 demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode,
{
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 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode,
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 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode,
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_get_current_angle(demuxer_t *demuxer)
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 @@ int demuxer_set_angle(demuxer_t *demuxer, int angle)
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;
}