diff --git a/DOCS/man/en/options.rst b/DOCS/man/en/options.rst index b2f9d30b68..7803e98b5c 100644 --- a/DOCS/man/en/options.rst +++ b/DOCS/man/en/options.rst @@ -2631,6 +2631,11 @@ OPTIONS ``--vd--lavc-o=debug=pict`` +``--vd-lavc-show-all=`` + Show even broken/corrupt frames (default: yes). If this option is set to + no, libavcodec won't output frames that were either decoded before an + initial keyframe was decoded, or frames that are recognized as corrupted. + ``--vd-lavc-skiploopfilter= (H.264 only)`` Skips the loop filter (AKA deblocking) during H.264 decoding. Since the filtered frame is supposed to be used as reference for decoding diff --git a/options/options.c b/options/options.c index f53f33245e..a92ace3ec0 100644 --- a/options/options.c +++ b/options/options.c @@ -755,6 +755,7 @@ const struct MPOpts mp_default_opts = { .allow_mimetype = 1, }, .lavc_param = { + .show_all = 1, .check_hw_profile = 1, }, .input = { diff --git a/options/options.h b/options/options.h index 6e44dc838c..b4366a2f2e 100644 --- a/options/options.h +++ b/options/options.h @@ -228,6 +228,7 @@ typedef struct MPOpts { struct lavc_param { int fast; + int show_all; char *skip_loop_filter_str; char *skip_idct_str; char *skip_frame_str; diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 7530eb0fa5..dcd208ad10 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -73,6 +73,7 @@ static void uninit(struct dec_video *vd); const m_option_t lavc_decode_opts_conf[] = { OPT_FLAG_CONSTANTS("fast", lavc_param.fast, 0, 0, CODEC_FLAG2_FAST), + OPT_FLAG("show-all", lavc_param.show_all, 0), OPT_STRING("skiploopfilter", lavc_param.skip_loop_filter_str, 0), OPT_STRING("skipidct", lavc_param.skip_idct_str, 0), OPT_STRING("skipframe", lavc_param.skip_frame_str, 0), @@ -421,6 +422,15 @@ static void init_avctx(struct dec_video *vd, const char *decoder, avctx->flags |= lavc_param->bitexact; avctx->flags2 |= lavc_param->fast; + if (lavc_param->show_all) { +#ifdef CODEC_FLAG2_SHOW_ALL + avctx->flags2 |= CODEC_FLAG2_SHOW_ALL; // ffmpeg only? +#endif +#ifdef CODEC_FLAG_OUTPUT_CORRUPT + avctx->flags |= CODEC_FLAG_OUTPUT_CORRUPT; // added with Libav 10 +#endif + } + avctx->skip_loop_filter = str2AVDiscard(vd, lavc_param->skip_loop_filter_str); avctx->skip_idct = str2AVDiscard(vd, lavc_param->skip_idct_str); avctx->skip_frame = str2AVDiscard(vd, lavc_param->skip_frame_str);