summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-11-20 22:41:50 +0100
committerwm4 <wm4@nowhere>2014-11-20 22:41:50 +0100
commit2d039e691f4f8f7b340a113fc9f69fa5bfa6193a (patch)
treec576d7153b2dda918ed25cdf7c129a321e67de10
parent7df909e9fcc897083d4af53939ab392ca708f808 (diff)
downloadmpv-2d039e691f4f8f7b340a113fc9f69fa5bfa6193a.tar.bz2
mpv-2d039e691f4f8f7b340a113fc9f69fa5bfa6193a.tar.xz
command: add drop_buffers
This command was actually requested on IRC ages ago, but I forgot about it. The main purpose is that the decoding state can be reset without issuing a seek, in particular in situations where you can't seek. This restarts decoding from the middle of the packet stream; since it discards the packet buffer intentionally, and the decoder will typically not output "incomplete" frames until it has recovered, it can skip a large amount of data. It doesn't clear the byte stream cache - I'm not sure if it should.
-rw-r--r--DOCS/man/input.rst4
-rw-r--r--input/cmd_list.c2
-rw-r--r--input/cmd_list.h2
-rw-r--r--player/command.c10
4 files changed, 18 insertions, 0 deletions
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst
index ea408d00ed..9df19b7ba3 100644
--- a/DOCS/man/input.rst
+++ b/DOCS/man/input.rst
@@ -556,6 +556,10 @@ Input Commands that are Possibly Subject to Change
those which can will be reset even if they don't appear in the argument.
This command might be changed or removed in the future.
+``drop_buffers``
+ Drop audio/video/demuxer buffers, and restart from fresh. Might help with
+ unseekable streams that are going out of sync.
+ This command might be changed or removed in the future.
Undocumented commands: ``tv_last_channel`` (TV/DVB only), ``get_property`` (?),
``ao_reload`` (experimental/internal).
diff --git a/input/cmd_list.c b/input/cmd_list.c
index b513ff48ab..c1413f7dd9 100644
--- a/input/cmd_list.c
+++ b/input/cmd_list.c
@@ -157,6 +157,8 @@ const struct mp_cmd_def mp_cmds[] = {
{ MP_CMD_AB_LOOP, "ab_loop", },
+ { MP_CMD_DROP_BUFFERS, "drop_buffers", },
+
{ MP_CMD_AF, "af", { ARG_STRING, ARG_STRING } },
{ MP_CMD_AO_RELOAD, "ao_reload", },
diff --git a/input/cmd_list.h b/input/cmd_list.h
index 8dc754c774..638fc5bb68 100644
--- a/input/cmd_list.h
+++ b/input/cmd_list.h
@@ -80,6 +80,8 @@ enum mp_command_type {
MP_CMD_AB_LOOP,
+ MP_CMD_DROP_BUFFERS,
+
/// Audio Filter commands
MP_CMD_AF,
MP_CMD_AO_RELOAD,
diff --git a/player/command.c b/player/command.c
index 0559221322..d9a0d99745 100644
--- a/player/command.c
+++ b/player/command.c
@@ -4440,6 +4440,16 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
return r > 0;
}
+ case MP_CMD_DROP_BUFFERS: {
+ reset_audio_state(mpctx);
+ reset_video_state(mpctx);
+
+ if (mpctx->demuxer)
+ demux_flush(mpctx->demuxer);
+
+ break;
+ }
+
case MP_CMD_VO_CMDLINE:
if (mpctx->video_out) {
char *s = cmd->args[0].v.s;