summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-01-11 20:36:23 +0100
committerwm4 <wm4@nowhere>2016-01-11 20:36:23 +0100
commit8135838018e0f0822dbec540c427508c44f92fc1 (patch)
treeb32f42ef855a7daf75b70bb24c6822386f9bf14a
parentf54ae2031e8d914783c023dc0491c0a5c62a622d (diff)
downloadmpv-8135838018e0f0822dbec540c427508c44f92fc1.tar.bz2
mpv-8135838018e0f0822dbec540c427508c44f92fc1.tar.xz
player: eliminate demux_get_next_pts()
This slightly changes behavior when seeking with external audio/subtitle tracks if transport streams and mpeg files are played, as well as behavior when seeking with such external tracks. get_main_demux_pts() is evil because it always blocks on the demuxer (if there isn't already a packet queued). Thus it could lock up the player, which is a shame because all other possible causes have been removed. The reduced "precision" when seeking in the ts/mpeg cases (where SEEK_FACTOR is used, resulting in byte seeks instead of timestamp seeks) might lead to issues. We should probably drop this heuristic. (It was introduced because there is no other way to seek in files with PTS resets with libavformat, but its value is still questionable.)
-rw-r--r--demux/demux.c16
-rw-r--r--demux/demux.h1
-rw-r--r--player/core.h1
-rw-r--r--player/loadfile.c7
-rw-r--r--player/misc.c14
-rw-r--r--player/playloop.c4
6 files changed, 6 insertions, 37 deletions
diff --git a/demux/demux.c b/demux/demux.c
index bf8f236f27..d8a3030d33 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -738,22 +738,6 @@ int demux_read_packet_async(struct sh_stream *sh, struct demux_packet **out_pkt)
return r;
}
-// Return the pts of the next packet that demux_read_packet() would return.
-// Might block. Sometimes used to force a packet read, without removing any
-// packets from the queue.
-double demux_get_next_pts(struct sh_stream *sh)
-{
- double res = MP_NOPTS_VALUE;
- if (sh) {
- pthread_mutex_lock(&sh->ds->in->lock);
- ds_get_packets(sh->ds);
- if (sh->ds->head)
- res = MP_ADD_PTS(sh->ds->head->pts, sh->ds->in->ts_offset);
- pthread_mutex_unlock(&sh->ds->in->lock);
- }
- return res;
-}
-
// Return whether a packet is queued. Never blocks, never forces any reads.
bool demux_has_packet(struct sh_stream *sh)
{
diff --git a/demux/demux.h b/demux/demux.h
index db3b504c39..d274be5ae7 100644
--- a/demux/demux.h
+++ b/demux/demux.h
@@ -242,7 +242,6 @@ void demux_add_packet(struct sh_stream *stream, demux_packet_t *dp);
struct demux_packet *demux_read_packet(struct sh_stream *sh);
int demux_read_packet_async(struct sh_stream *sh, struct demux_packet **out_pkt);
bool demux_stream_is_selected(struct sh_stream *stream);
-double demux_get_next_pts(struct sh_stream *sh);
bool demux_has_packet(struct sh_stream *sh);
struct demux_packet *demux_read_any_packet(struct demuxer *demuxer);
diff --git a/player/core.h b/player/core.h
index fe87658d81..7098b3bd46 100644
--- a/player/core.h
+++ b/player/core.h
@@ -449,7 +449,6 @@ void mp_print_version(struct mp_log *log, int always);
void wakeup_playloop(void *ctx);
// misc.c
-double get_main_demux_pts(struct MPContext *mpctx);
double rel_time_to_abs(struct MPContext *mpctx, struct m_rel_time t);
double get_play_end_pts(struct MPContext *mpctx);
double get_relative_time(struct MPContext *mpctx);
diff --git a/player/loadfile.c b/player/loadfile.c
index e177df67d3..0fa4234ca6 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -235,9 +235,10 @@ void reselect_demux_streams(struct MPContext *mpctx)
need_init_seek(track->demuxer);
demuxer_select_track(track->demuxer, track->stream, track->selected);
if (need_init) {
- double pts = get_main_demux_pts(mpctx);
- if (pts != MP_NOPTS_VALUE)
- demux_seek(track->demuxer, pts, SEEK_ABSOLUTE);
+ double pts = get_current_time(mpctx);
+ if (pts == MP_NOPTS_VALUE)
+ pts = 0;
+ demux_seek(track->demuxer, pts, SEEK_ABSOLUTE);
}
}
}
diff --git a/player/misc.c b/player/misc.c
index fc98136e5c..d60f25f05b 100644
--- a/player/misc.c
+++ b/player/misc.c
@@ -101,20 +101,6 @@ double get_play_end_pts(struct MPContext *mpctx)
return end;
}
-// Time used to seek external tracks to.
-double get_main_demux_pts(struct MPContext *mpctx)
-{
- double main_new_pos = MP_NOPTS_VALUE;
- if (mpctx->demuxer) {
- for (int n = 0; n < demux_get_num_stream(mpctx->demuxer); n++) {
- struct sh_stream *stream = demux_get_stream(mpctx->demuxer, n);
- if (main_new_pos == MP_NOPTS_VALUE && stream->type != STREAM_SUB)
- main_new_pos = demux_get_next_pts(stream);
- }
- }
- return main_new_pos;
-}
-
float mp_get_cache_percent(struct MPContext *mpctx)
{
if (mpctx->demuxer) {
diff --git a/player/playloop.c b/player/playloop.c
index c81f720122..b672c24483 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -260,9 +260,9 @@ static int mp_seek(MPContext *mpctx, struct seek_params seek,
for (int t = 0; t < mpctx->num_tracks; t++) {
struct track *track = mpctx->tracks[t];
if (track->selected && track->is_external && track->demuxer) {
- double main_new_pos = seek.amount;
+ double main_new_pos = demuxer_amount;
if (seek.type != MPSEEK_ABSOLUTE)
- main_new_pos = get_main_demux_pts(mpctx);
+ main_new_pos = target_time;
demux_seek(track->demuxer, main_new_pos, SEEK_ABSOLUTE | SEEK_BACKWARD);
}
}