From 826ce82cad315f7a48f9c971d3a5fa005a9eab46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= Date: Fri, 1 Sep 2023 12:26:38 +0200 Subject: [PATCH] vd_lavc: disable cropping by decoder Cropping by decoder has limitations with regards to aligment and hwdec. It doesn't work to offset top left corner with hwdec and even with software decoding it don't crop fully when resulting data would not be aligned. VO cropping is way more robust. --- DOCS/man/options.rst | 8 ++++++++ video/decode/vd_lavc.c | 3 +++ 2 files changed, 11 insertions(+) diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index 3090be72f0..a545947fe9 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -1834,6 +1834,14 @@ Video this can break on streams not encoded by x264, or if a stream encoded by a newer x264 version contains no version info. +``--vd-apply-cropping`` + Certain video codecs support cropping, meaning that only a sub-rectangle of + the decoded frame is intended for display. This option controls how cropping + is handled by libavcodec. Cropping during decoding has certain limitations + with regards to alignment and hardware decoding. If this option is enabled, + decoder will apply the crop. Disabled by default, VO will apply the crop in + a more robust way. + ``--swapchain-depth=`` Allow up to N in-flight frames. This essentially controls the frame latency. Increasing the swapchain depth can improve pipelining and prevent diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 0c87005ddd..54a9975915 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -80,6 +80,7 @@ struct vd_lavc_params { int threads; bool bitexact; bool old_x264; + bool apply_cropping; bool check_hw_profile; int software_fallback; char **avopts; @@ -120,6 +121,7 @@ const struct m_sub_options vd_lavc_conf = { {"vd-lavc-o", OPT_KEYVALUELIST(avopts)}, {"vd-lavc-dr", OPT_CHOICE(dr, {"auto", -1}, {"no", 0}, {"yes", 1})}, + {"vd-apply-cropping", OPT_BOOL(apply_cropping)}, {"hwdec", OPT_STRINGLIST(hwdec_api), .help = hwdec_opt_help, .flags = M_OPT_OPTIONAL_PARAM | UPDATE_HWDEC}, @@ -772,6 +774,7 @@ static void init_avctx(struct mp_filter *vd) avctx->skip_loop_filter = lavc_param->skip_loop_filter; avctx->skip_idct = lavc_param->skip_idct; avctx->skip_frame = lavc_param->skip_frame; + avctx->apply_cropping = lavc_param->apply_cropping; if (lavc_codec->id == AV_CODEC_ID_H264 && lavc_param->old_x264) av_opt_set(avctx, "x264_build", "150", AV_OPT_SEARCH_CHILDREN);