vlc | branch: master | Thomas Guillem <[email protected]> | Fri Jan 20 14:29:47 2017 +0100| [29b10f0b9e0f35046240db7dbffb4460b59a73f7] | committer: Thomas Guillem
videotoolbox: fallback to other decoders in case of critical failure Fix #16048 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=29b10f0b9e0f35046240db7dbffb4460b59a73f7 --- modules/codec/videotoolbox.m | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m index bf65c59..d52cc9e 100644 --- a/modules/codec/videotoolbox.m +++ b/modules/codec/videotoolbox.m @@ -706,6 +706,10 @@ static int OpenDecoder(vlc_object_t *p_this) if (p_dec->fmt_in.i_cat != VIDEO_ES) return VLC_EGENERIC; + /* Fail if this module already failed to decode this ES */ + if (var_Type(p_dec, "videotoolbox-failed") != 0) + return VLC_EGENERIC; + /* check quickly if we can digest the offered data */ CMVideoCodecType codec; codec = CodecPrecheck(p_dec); @@ -1102,7 +1106,7 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block) msg_Err(p_dec, "decoder failure: invalid SPS/PPS"); else if (status == -6661) { msg_Err(p_dec, "decoder failure: invalid argument"); - p_dec->b_error = true; + goto reload; } else if (status == -8969 || status == -12909) { msg_Err(p_dec, "decoder failure: bad data (%i)", status); StopVideoToolbox(p_dec); @@ -1119,6 +1123,16 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block) skip: block_Release(p_block); return NULL; + +reload: + /* Add an empty variable so that videotoolbox won't be loaded again for + * this ES */ + if (var_Create(p_dec, "videotoolbox-failed", VLC_VAR_VOID) == VLC_SUCCESS) + decoder_RequestReload(p_dec); + else + p_dec->b_error = true; + block_Release(p_block); + return NULL; } static void UpdateVideoFormat(decoder_t *p_dec, NSDictionary *attachmentDict) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
