summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-05-24 20:18:55 +0200
committerwm4 <wm4@nowhere>2019-09-19 20:37:04 +0200
commitf53f9b89b10bec6e6c5bcc1d8add0577698bd0e4 (patch)
treeacc2b712573f80b739e8fbe1a49fa78aeab82a4b
parent6d11668a9c448674ac04ef61bf902c867671d8db (diff)
downloadmpv-f53f9b89b10bec6e6c5bcc1d8add0577698bd0e4.tar.bz2
mpv-f53f9b89b10bec6e6c5bcc1d8add0577698bd0e4.tar.xz
demux: add a special case for backward demuxing of opus
Make --audio-backward-overlap default to 2 for Opus. I have no idea why this is needed. It seems to fix backward decoding though (going purely by listening). Normally, this should not be needed, since initial padding is completely contained within the first packet (normally, and in the case I tested). So the 2nd packet/frame should be fine, but for some unknown reason it works only with the 3rd.
-rw-r--r--DOCS/man/options.rst3
-rw-r--r--demux/demux.c5
2 files changed, 6 insertions, 2 deletions
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index 0170dc0ae0..cf8ff21f85 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -561,7 +561,8 @@ Playback Control
The solution is to feed a previous packet to the decoder each time, and then
discard the output. This option controls how many packets to feed. The
``auto`` choice is currently hardcoded to 0 for video, and uses 1 for lossy
- audio, 0 for lossless audio.
+ audio, 0 for lossless audio. As a hack, it sets it to 2 for Opus, which
+ requires this for unknown reasons.
``--video-backward-overlap`` can potentially handle intra-refresh video,
depending on the exact conditions. You may have to use the
diff --git a/demux/demux.c b/demux/demux.c
index 481b87e0c7..028f6dcef3 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -953,8 +953,11 @@ static void demux_add_sh_stream_locked(struct demux_internal *in,
switch (ds->type) {
case STREAM_AUDIO:
ds->back_preroll = in->opts->audio_back_preroll;
- if (ds->back_preroll < 0) // auto
+ if (ds->back_preroll < 0) { // auto
ds->back_preroll = mp_codec_is_lossless(sh->codec->codec) ? 0 : 1;
+ if (sh->codec->codec && strcmp(sh->codec->codec, "opus") == 0)
+ ds->back_preroll = 2;
+ }
break;
case STREAM_VIDEO:
ds->back_preroll = in->opts->video_back_preroll;