From 2bfcedbf3e21588106a52cdfbbb25c0d0c51afbd Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Fri, 26 Nov 2021 15:29:33 +0100 Subject: [PATCH] lavc: fixed subsampling selection - wrong condition in IF_NOT_NULL_ELSE - improved ordering of codecs - rename preferred_subsampling var (to comply with bits_per_comp, is_rgb) --- src/utils/misc.h | 2 +- src/video_compress/libavcodec.cpp | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/utils/misc.h b/src/utils/misc.h index 95c552d33..1d1762c11 100644 --- a/src/utils/misc.h +++ b/src/utils/misc.h @@ -47,7 +47,7 @@ #define STRINGIFY(A) #A #define TOSTRING(A) STRINGIFY(A) // https://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string -#define IF_NOT_NULL_ELSE(cond, alt_val) !(cond) ? (cond) : (alt_val) +#define IF_NOT_NULL_ELSE(cond, alt_val) (cond) ? (cond) : (alt_val) #ifdef __cplusplus extern "C" { diff --git a/src/video_compress/libavcodec.cpp b/src/video_compress/libavcodec.cpp index 38a53cefb..6985eef69 100644 --- a/src/video_compress/libavcodec.cpp +++ b/src/video_compress/libavcodec.cpp @@ -929,9 +929,9 @@ static list get_available_pix_fmts(struct video_desc in_desc int bits_per_comp = get_bits_per_component(in_desc.color_spec); bool is_rgb = codec_is_a_rgb(in_desc.color_spec); - int preferred_subsampling = IF_NOT_NULL_ELSE(requested_subsampling, get_subsampling(in_desc.color_spec) / 10); + int subsampling = IF_NOT_NULL_ELSE(requested_subsampling, get_subsampling(in_desc.color_spec) / 10); // sort - auto compare = [bits_per_comp, is_rgb, preferred_subsampling](enum AVPixelFormat a, enum AVPixelFormat b) { + auto compare = [bits_per_comp, is_rgb, subsampling](enum AVPixelFormat a, enum AVPixelFormat b) { const struct AVPixFmtDescriptor *pda = av_pix_fmt_desc_get(a); const struct AVPixFmtDescriptor *pdb = av_pix_fmt_desc_get(b); #if LIBAVUTIL_VERSION_MAJOR >= 56 @@ -966,13 +966,10 @@ static list get_available_pix_fmts(struct video_desc in_desc return deptha < depthb; } if (subsa != subsb) { - if (subsa == preferred_subsampling) { - return true; + if (subsa < subsampling || subsb < subsampling) { + return subsa > subsb; } - if (subsb == preferred_subsampling) { - return false; - } - return subsa > subsb; + return subsa < subsb; } return a < b; };