summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2018-03-21 14:55:37 +0100
committerwm4 <wm4@nowhere>2018-03-26 19:47:08 +0200
commit0b4120919aa1e4e70b49dd3f93af0acddd7ea4d3 (patch)
tree8839d16bcc39e548eb15156211a8fc13d25314c4
parentf81ae9c3fc45886da45e6ae5fe90e5125a9e9bee (diff)
downloadmpv-0b4120919aa1e4e70b49dd3f93af0acddd7ea4d3.tar.bz2
mpv-0b4120919aa1e4e70b49dd3f93af0acddd7ea4d3.tar.xz
f_decoder_wrapper: retry decoding if libavcodec returns invalid state
At least the libavcodec MediaCodec wrapper sometimes seems to break the libavcodec API, and does the following sequence: send_packet() -> EAGAIN receive_frame() -> EAGAIN send_packet() -> OK The libavcodec API never allows returning EAGAIN from both functions, so we discarded packets in this case. Change it to retrying decoding, for the sake of MediaCodec. Note that it could also happen due to internal bugs in the vd_lavc.c hw fallback code, but if there are any remaining, they should be fixed properly instead. Requested.
-rw-r--r--filters/f_decoder_wrapper.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/filters/f_decoder_wrapper.c b/filters/f_decoder_wrapper.c
index 061f056a1e..16b9cd06df 100644
--- a/filters/f_decoder_wrapper.c
+++ b/filters/f_decoder_wrapper.c
@@ -710,8 +710,13 @@ void lavc_process(struct mp_filter *f, bool *eof_flag,
}
return;
}
- if (!send(f, pkt))
- MP_WARN(f, "could not consume packet\n"); // should never happen
+ if (!send(f, pkt)) {
+ // Should never happen, but can happen with broken decoders.
+ MP_WARN(f, "could not consume packet\n");
+ mp_pin_out_unread(f->ppins[0], frame);
+ mp_filter_wakeup(f);
+ return;
+ }
talloc_free(pkt);
mp_filter_internal_mark_progress(f);
}