From 712b3760e7a59c7c42538fcc4ca730983ec81947 Mon Sep 17 00:00:00 2001 From: Damiano Galassi Date: Mon, 13 Jan 2025 09:59:33 +0100 Subject: [PATCH] libhb: cli: add a way to disable hdr dynamic metadata passthru (#6518) --- libhb/common.c | 39 +++++++- libhb/encsvtav1.c | 6 +- libhb/encx265.c | 6 +- libhb/handbrake/common.h | 15 ++- libhb/handbrake/preset_builtin.h | 96 ++++++++++++++++++- libhb/hb_json.c | 14 ++- libhb/muxavformat.c | 2 +- libhb/platform/macosx/encvt.c | 6 +- libhb/preset.c | 38 +++++++- libhb/work.c | 33 +++---- macosx/HBJob+HBJobConversion.m | 17 ++++ macosx/HBVideo.h | 9 ++ macosx/HBVideo.m | 43 ++++++++- .../HandBrake-Debug-Sandbox.xcscheme | 17 +++- preset/preset_builtin.json | 92 ++++++++++++++++++ preset/preset_builtin.list | 2 +- preset/preset_cli_default.json | 1 + preset/preset_template.json | 1 + test/test.c | 49 +++++++++- .../HbLib/hb_hdr_dynamic_metadata_mode_t.cs | 16 ++++ .../Interfaces/Model/HDRDynamicMetadata.cs | 26 +++++ .../Interop/Json/Presets/HBPreset.cs | 5 + .../Services/Encode/Model/EncodeTask.cs | 4 +- .../Presets/Factories/JsonPresetFactory.cs | 18 ++++ .../HandBrakeWPF/ViewModels/VideoViewModel.cs | 13 +++ 25 files changed, 523 insertions(+), 45 deletions(-) create mode 100644 win/CS/HandBrake.Interop/Interop/HbLib/hb_hdr_dynamic_metadata_mode_t.cs create mode 100644 win/CS/HandBrake.Interop/Interop/Interfaces/Model/HDRDynamicMetadata.cs diff --git a/libhb/common.c b/libhb/common.c index 0cf0eec36d63..d68c2bf65424 100644 --- a/libhb/common.c +++ b/libhb/common.c @@ -1707,6 +1707,41 @@ int hb_video_multipass_is_supported(uint32_t codec, int constant_quality) } } +int hb_video_hdr_dynamic_metadata_is_supported(uint32_t codec, int hdr_dynamic_metadata, int profile) +{ + if (hdr_dynamic_metadata == HB_HDR_DYNAMIC_METADATA_HDR10PLUS) + { + switch (codec) + { + case HB_VCODEC_X265_10BIT: + case HB_VCODEC_VT_H265_10BIT: + case HB_VCODEC_SVT_AV1_10BIT: + return 1; + } + } +#if HB_PROJECT_FEATURE_LIBDOVI + else if (hdr_dynamic_metadata == HB_HDR_DYNAMIC_METADATA_DOVI) + { + if (profile != 5 && + profile != 7 && + profile != 8 && + profile != 10) + { + return 0; + } + + switch (codec) + { + case HB_VCODEC_X265_10BIT: + case HB_VCODEC_VT_H265_10BIT: + case HB_VCODEC_SVT_AV1_10BIT: + return 1; + } + } +#endif + return 0; +} + int hb_video_encoder_is_supported(int encoder) { const hb_encoder_t *video_encoder = NULL; @@ -4446,8 +4481,8 @@ static void job_setup(hb_job_t * job, hb_title_t * title) job->coll = title->coll; job->ambient = title->ambient; job->dovi = title->dovi; - job->passthru_dynamic_hdr_metadata |= title->dovi.dv_profile ? DOVI : NONE; - job->passthru_dynamic_hdr_metadata |= title->hdr_10_plus ? HDR_10_PLUS : NONE; + job->passthru_dynamic_hdr_metadata |= title->dovi.dv_profile ? HB_HDR_DYNAMIC_METADATA_DOVI : HB_HDR_DYNAMIC_METADATA_NONE; + job->passthru_dynamic_hdr_metadata |= title->hdr_10_plus ? HB_HDR_DYNAMIC_METADATA_HDR10PLUS : HB_HDR_DYNAMIC_METADATA_NONE; job->mux = HB_MUX_MP4; diff --git a/libhb/encsvtav1.c b/libhb/encsvtav1.c index a2f18034f411..45a1e3482402 100644 --- a/libhb/encsvtav1.c +++ b/libhb/encsvtav1.c @@ -329,7 +329,7 @@ int encsvtInit(hb_work_object_t *w, hb_job_t *job) } // Update and set Dolby Vision level - if (job->passthru_dynamic_hdr_metadata & DOVI) + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI) { int level_idx, high_tier; hb_parse_av1_extradata(*w->extradata, &level_idx, &high_tier); @@ -486,7 +486,7 @@ static int send(hb_work_object_t *w, hb_buffer_t *in) for (int i = 0; i < in->nb_side_data; i++) { const AVFrameSideData *side_data = in->side_data[i]; - if (job->passthru_dynamic_hdr_metadata & HDR_10_PLUS && + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_HDR10PLUS && side_data->type == AV_FRAME_DATA_DYNAMIC_HDR_PLUS) { uint8_t *payload = NULL; @@ -501,7 +501,7 @@ static int send(hb_work_object_t *w, hb_buffer_t *in) svt_add_metadata(headerPtr, EB_AV1_METADATA_TYPE_ITUT_T35, payload, playload_size); av_freep(&payload); } - else if (job->passthru_dynamic_hdr_metadata & DOVI && + else if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI && side_data->type == AV_FRAME_DATA_DOVI_RPU_BUFFER_T35) { svt_add_metadata(headerPtr, EB_AV1_METADATA_TYPE_ITUT_T35, side_data->data, side_data->size); diff --git a/libhb/encx265.c b/libhb/encx265.c index 0b15838ac6da..5a98f6eb89c3 100644 --- a/libhb/encx265.c +++ b/libhb/encx265.c @@ -493,7 +493,7 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) /* * Update and set Dolby Vision level */ - if (job->passthru_dynamic_hdr_metadata & DOVI) + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI) { char dolbyVisionProfile[256]; snprintf(dolbyVisionProfile, sizeof(dolbyVisionProfile), @@ -713,7 +713,7 @@ static hb_buffer_t* x265_encode(hb_work_object_t *w, hb_buffer_t *in) for (int i = 0; i < in->nb_side_data; i++) { const AVFrameSideData *side_data = in->side_data[i]; - if (job->passthru_dynamic_hdr_metadata & HDR_10_PLUS && + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_HDR10PLUS && side_data->type == AV_FRAME_DATA_DYNAMIC_HDR_PLUS) { uint8_t *payload = NULL; @@ -743,7 +743,7 @@ static hb_buffer_t* x265_encode(hb_work_object_t *w, hb_buffer_t *in) sei_payload->payloadType = USER_DATA_REGISTERED_ITU_T_T35; sei->numPayloads++; } - if (job->passthru_dynamic_hdr_metadata & DOVI && + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI && side_data->type == AV_FRAME_DATA_DOVI_RPU_BUFFER) { x265_dolby_vision_rpu *rpu = &pic_in.rpu; diff --git a/libhb/handbrake/common.h b/libhb/handbrake/common.h index 79a787012d83..bc380613c154 100644 --- a/libhb/handbrake/common.h +++ b/libhb/handbrake/common.h @@ -371,6 +371,14 @@ struct hb_dovi_conf_s unsigned dv_bl_signal_compatibility_id; }; +typedef enum +{ + HB_HDR_DYNAMIC_METADATA_NONE = 0, + HB_HDR_DYNAMIC_METADATA_HDR10PLUS = 1 << 1, + HB_HDR_DYNAMIC_METADATA_DOVI = 1 << 2, + HB_HDR_DYNAMIC_METADATA_ALL = HB_HDR_DYNAMIC_METADATA_HDR10PLUS | HB_HDR_DYNAMIC_METADATA_DOVI +} hb_hdr_dynamic_metadata_mode_t; + int hb_str_ends_with(const char *base, const char *str); /******************************************************************************* @@ -437,6 +445,11 @@ int hb_video_quality_is_supported(uint32_t codec); int hb_video_bitrate_is_supported(uint32_t codec); int hb_video_multipass_is_supported(uint32_t codec, int constant_quality); +int hb_video_hdr_dynamic_metadata_is_supported(uint32_t codec, int hdr_dynamic_metadata, int profile); + +int hb_hdr_dynamic_metadata_get_from_name(const char *name); +const char* hb_hdr_dynamic_metadata_get_name(int hdr_dynamic_metadata); + int hb_video_encoder_is_supported(int encoder); int hb_video_encoder_get_count_of_analysis_passes(int encoder); int hb_video_encoder_pix_fmt_is_supported(int encoder, int pix_fmt, const char *profile); @@ -750,7 +763,7 @@ struct hb_job_s hb_ambient_viewing_environment_metadata_t ambient; hb_dovi_conf_t dovi; - enum {NONE = 0x0, ALL = 0x3, DOVI = 0x1, HDR_10_PLUS = 0x2} passthru_dynamic_hdr_metadata; + hb_hdr_dynamic_metadata_mode_t passthru_dynamic_hdr_metadata; hb_list_t * list_chapter; diff --git a/libhb/handbrake/preset_builtin.h b/libhb/handbrake/preset_builtin.h index 44657a7b3015..ab74bb077669 100644 --- a/libhb/handbrake/preset_builtin.h +++ b/libhb/handbrake/preset_builtin.h @@ -99,6 +99,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"9\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -206,6 +207,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"superfast\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -312,6 +314,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"veryfast\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -418,6 +421,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"veryfast\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -524,6 +528,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"veryfast\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -630,6 +635,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"veryfast\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -737,6 +743,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"8\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -844,6 +851,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"faster\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -950,6 +958,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"fast\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -1056,6 +1065,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"fast\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -1162,6 +1172,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"fast\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -1268,6 +1279,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"fast\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -1388,6 +1400,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"7\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -1508,6 +1521,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -1628,6 +1642,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -1748,6 +1763,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -1868,6 +1884,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -1988,6 +2005,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -2109,6 +2127,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"5\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -2230,6 +2249,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -2350,6 +2370,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"ref=5:bframes=5\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"veryslow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -2470,6 +2491,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"ref=5:bframes=5\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"veryslow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -2590,6 +2612,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"ref=5:bframes=5\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"veryslow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -2710,6 +2733,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"ref=5:bframes=5\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"veryslow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -2823,6 +2847,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"5.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"keyint=30:min-keyint=15:ref=1:bframes=2:b-pyramid=none\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -2929,6 +2954,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"5.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"keyint=30:min-keyint=15:ref=1:bframes=2:b-pyramid=none\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3035,6 +3061,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"keyint=30:min-keyint=15:ref=1:bframes=2:b-pyramid=none\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3141,6 +3168,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"keyint=30:min-keyint=15:ref=1:bframes=2:b-pyramid=none\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3247,6 +3275,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"qcomp=0.5:aq-mode=2:aq-strength=0.8:bframes=2:b-adapt=2:b-pyramid=0\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3353,6 +3382,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"qcomp=0.5:aq-mode=2:aq-strength=0.8:bframes=2:b-adapt=2:b-pyramid=0\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3459,6 +3489,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"qcomp=0.5:aq-mode=2:aq-strength=0.8:bframes=2:b-adapt=2:b-pyramid=0\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3565,6 +3596,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"qcomp=0.5:aq-mode=2:aq-strength=0.8:bframes=2:b-adapt=2:b-pyramid=0\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3671,6 +3703,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"qcomp=0.5:aq-mode=2:aq-strength=0.8:bframes=2:b-adapt=2:b-pyramid=0\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3777,6 +3810,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"qcomp=0.5:aq-mode=2:aq-strength=0.8:bframes=2:b-adapt=2:b-pyramid=0\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -3883,6 +3917,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"qcomp=0.5:aq-mode=2:aq-strength=0.8:bframes=2:b-adapt=2:b-pyramid=0\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -4010,6 +4045,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -4130,6 +4166,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -4236,6 +4273,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -4342,6 +4380,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -4448,6 +4487,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -4554,6 +4594,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -4660,6 +4701,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -4780,6 +4822,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -4900,6 +4943,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -5020,6 +5064,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -5140,6 +5185,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -5260,6 +5306,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"qpmin=4:cabac=0:ref=2:b-pyramid=none:weightb=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -5380,6 +5427,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -5500,6 +5548,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -5620,6 +5669,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -5740,6 +5790,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"5.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -5860,6 +5911,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -5966,6 +6018,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -6072,6 +6125,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -6195,6 +6249,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -6315,6 +6370,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -6435,6 +6491,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -6541,6 +6598,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -6647,6 +6705,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -6767,6 +6826,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -6878,6 +6938,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"8\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -6984,6 +7045,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -7090,6 +7152,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -7196,6 +7259,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -7302,6 +7366,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -7408,6 +7473,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"slow\",\n" " \"VideoProfile\": \"main10\",\n" " \"VideoQSVDecode\": false,\n" @@ -7514,6 +7580,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"5.2\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -7620,6 +7687,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"4.0\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -7726,6 +7794,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -7832,6 +7901,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -7938,6 +8008,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"3.1\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -8042,6 +8113,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -8146,6 +8218,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -8250,6 +8323,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -8354,6 +8428,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -8458,6 +8533,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -8571,6 +8647,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"speed\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": true,\n" @@ -8677,6 +8754,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"rc-lookahead=10\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -8783,6 +8861,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"rc-lookahead=10\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -8889,6 +8968,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"speed\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": true,\n" @@ -8995,6 +9075,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"speed\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": true,\n" @@ -9101,6 +9182,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"balanced\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -9207,6 +9289,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"balanced\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -9313,6 +9396,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"balanced\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -9419,6 +9503,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"balanced\",\n" " \"VideoProfile\": \"main\",\n" " \"VideoQSVDecode\": false,\n" @@ -9525,6 +9610,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"speed\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -9631,6 +9717,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"speed\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -9744,6 +9831,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"keyint=12:min-keyint=1:ref=1:bframes=0:qcomp=0.8:aq-strength=0.5:dct-decimate=0:fast-pskip=0:deblock=-2,-2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"fast\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -9850,6 +9938,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"keyint=12:min-keyint=1:ref=1:bframes=0:qcomp=0.8:aq-strength=0.5:dct-decimate=0:fast-pskip=0:deblock=-2,-2\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"fast\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -9956,6 +10045,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"keyint=1:min-keyint=1:ref=1:bframes=0:qcomp=0.8:aq-strength=0.5\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"superfast\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -10062,6 +10152,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"keyint=1:min-keyint=1:ref=1:bframes=0:qcomp=0.8:aq-strength=0.5\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"superfast\",\n" " \"VideoProfile\": \"high\",\n" " \"VideoQSVDecode\": false,\n" @@ -10181,6 +10272,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": true,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"preservation\",\n" " \"VideoProfile\": \"\",\n" " \"VideoQSVDecode\": false,\n" @@ -10302,6 +10394,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -10435,6 +10528,7 @@ const char hb_builtin_presets_json[] = " \"VideoLevel\": \"auto\",\n" " \"VideoMultiPass\": false,\n" " \"VideoOptionExtra\": \"\",\n" +" \"VideoPasshtruHDRDynamicMetadata\": \"all\",\n" " \"VideoPreset\": \"medium\",\n" " \"VideoProfile\": \"auto\",\n" " \"VideoQSVDecode\": false,\n" @@ -10446,7 +10540,7 @@ const char hb_builtin_presets_json[] = " \"x264Option\": \"\",\n" " \"x264UseAdvancedOptions\": false\n" " },\n" -" \"VersionMajor\": 60,\n" +" \"VersionMajor\": 61,\n" " \"VersionMicro\": 0,\n" " \"VersionMinor\": 0\n" " }\n" diff --git a/libhb/hb_json.c b/libhb/hb_json.c index 80634ecbf459..489fe148b096 100644 --- a/libhb/hb_json.c +++ b/libhb/hb_json.c @@ -821,6 +821,9 @@ hb_dict_t* hb_job_to_dict( const hb_job_t * job ) hb_dict_set(video_dict, "Turbo", hb_value_bool(job->fastanalysispass)); } + hb_dict_set(video_dict, "PasshtruHDRDynamicMetadata", + hb_value_int(job->passthru_dynamic_hdr_metadata)); + if (job->encoder_preset != NULL) { hb_dict_set(video_dict, "Preset", @@ -1115,6 +1118,7 @@ hb_job_t* hb_dict_to_job( hb_handle_t * h, hb_dict_t *dict ) const char * video_preset = NULL, * video_tune = NULL; const char * video_profile = NULL, * video_level = NULL; const char * video_options = NULL; + int passthru_dynamic_hdr_metadata = 0; int subtitle_search_burn = 0; json_int_t range_start = -1, range_end = -1, range_seek_points = -1; int vbitrate = -1; @@ -1135,7 +1139,7 @@ hb_job_t* hb_dict_to_job( hb_handle_t * h, hb_dict_t *dict ) // PAR {Num, Den} "s?{s:i, s:i}," // Video {Codec, Quality, Bitrate, Preset, Tune, Profile, Level, Options - // MultiPass, Turbo, + // MultiPass, Turbo, PasshtruHDRDynamicMetadata // ColorInputFormat, ColorOutputFormat, ColorRange, // ColorPrimaries, ColorTransfer, ColorMatrix, ChromaLocation, // MasteringDisplayColorVolume, @@ -1145,7 +1149,7 @@ hb_job_t* hb_dict_to_job( hb_handle_t * h, hb_dict_t *dict ) // HardwareDecode // QSV {Decode, AsyncDepth, AdapterIndex}} "s:{s:o, s?F, s?i, s?s, s?s, s?s, s?s, s?s," - " s?b, s?b," + " s?b, s?b, s?i," " s?i, s?i, s?i," " s?i, s?i, s?i, s?i," " s?o," @@ -1196,6 +1200,7 @@ hb_job_t* hb_dict_to_job( hb_handle_t * h, hb_dict_t *dict ) "Options", unpack_s(&video_options), "MultiPass", unpack_b(&job->multipass), "Turbo", unpack_b(&job->fastanalysispass), + "PasshtruHDRDynamicMetadata", unpack_i(&passthru_dynamic_hdr_metadata), "ColorInputFormat", unpack_i(&job->input_pix_fmt), "ColorOutputFormat", unpack_i(&job->output_pix_fmt), "ColorRange", unpack_i(&job->color_range), @@ -1297,6 +1302,11 @@ hb_job_t* hb_dict_to_job( hb_handle_t * h, hb_dict_t *dict ) } } + if (passthru_dynamic_hdr_metadata) + { + job->passthru_dynamic_hdr_metadata = passthru_dynamic_hdr_metadata; + } + if (destfile != NULL && destfile[0] != 0) { hb_job_set_file(job, destfile); diff --git a/libhb/muxavformat.c b/libhb/muxavformat.c index 4f4155c4e5d0..ce8673075557 100644 --- a/libhb/muxavformat.c +++ b/libhb/muxavformat.c @@ -461,7 +461,7 @@ static int avformatInit( hb_mux_object_t * m ) sizeof(AVAmbientViewingEnvironment), 0); } - if (job->passthru_dynamic_hdr_metadata & DOVI) + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI) { if (job->dovi.dv_profile == 5 && job->mux == HB_MUX_AV_MP4) { diff --git a/libhb/platform/macosx/encvt.c b/libhb/platform/macosx/encvt.c index f057cd04c0c4..37d59302e8e9 100644 --- a/libhb/platform/macosx/encvt.c +++ b/libhb/platform/macosx/encvt.c @@ -1637,7 +1637,7 @@ int encvt_init(hb_work_object_t *w, hb_job_t *job) // Read the actual level and tier and set // the Dolby Vision level and data limits - if (job->passthru_dynamic_hdr_metadata & DOVI) + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI) { int level_idc, high_tier; hb_parse_h265_extradata(*w->extradata, &level_idc, &high_tier); @@ -1814,7 +1814,7 @@ static void insert_dynamic_metadata(hb_work_private_t *pv, CMSampleBufferRef sam } } - if (pv->job->passthru_dynamic_hdr_metadata & HDR_10_PLUS) + if (pv->job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_HDR10PLUS) { CFDataRef hdrPlus = CMGetAttachment(sampleBuffer, CFSTR("HB_HDR_PLUS"), NULL); if (hdrPlus != NULL) @@ -1833,7 +1833,7 @@ static void insert_dynamic_metadata(hb_work_private_t *pv, CMSampleBufferRef sam hb_nal_t nals[1]; size_t nals_count = 0; - if (pv->job->passthru_dynamic_hdr_metadata & DOVI) + if (pv->job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI) { CFDataRef rpu = CMGetAttachment(sampleBuffer, CFSTR("HB_DOVI_RPU"), NULL); if (rpu != NULL) diff --git a/libhb/preset.c b/libhb/preset.c index 8b5f16b1c52e..e6a5ed035393 100644 --- a/libhb/preset.c +++ b/libhb/preset.c @@ -2050,7 +2050,26 @@ int hb_preset_apply_video(const hb_dict_t *preset, hb_dict_t *job_dict) hb_value_xform(hb_dict_get(preset, "VideoTurboMultiPass"), HB_VALUE_TYPE_BOOL)); } - + + if ((value = hb_dict_get(preset, "VideoPasshtruHDRDynamicMetadata")) != NULL) + { + int hdr_dynamic_metadata = HB_HDR_DYNAMIC_METADATA_ALL; + if (!strcasecmp(hb_value_get_string(value), "off")) + { + hdr_dynamic_metadata = HB_HDR_DYNAMIC_METADATA_NONE; + } + else if (!strcasecmp(hb_value_get_string(value), "hdr10plus")) + { + hdr_dynamic_metadata = HB_HDR_DYNAMIC_METADATA_HDR10PLUS; + + } + else if (!strcasecmp(hb_value_get_string(value), "dolbyvision")) + { + hdr_dynamic_metadata = HB_HDR_DYNAMIC_METADATA_DOVI; + } + hb_dict_set(video_dict, "PasshtruHDRDynamicMetadata", hb_value_int(hdr_dynamic_metadata)); + } + if ((value = hb_dict_get(preset, "VideoHWDecode")) != NULL) { hb_dict_set(video_dict, "HardwareDecode", hb_value_xform(value, HB_VALUE_TYPE_INT)); @@ -2956,6 +2975,11 @@ static void und_to_any(hb_value_array_t * list) } } +static void import_dynamic_metadata_preset_settings_60_0_0(hb_value_t *preset) +{ + hb_dict_set_string(preset, "VideoPasshtruHDRDynamicMetadata", "all"); +} + static void import_passthru_preset_settings_57_0_0(hb_value_t *preset) { int passthru = hb_dict_get_bool(preset, "MetadataPassthrough"); @@ -3711,9 +3735,16 @@ static void import_video_0_0_0(hb_value_t *preset) } } +static void import_60_0_0(hb_value_t *preset) +{ + import_dynamic_metadata_preset_settings_60_0_0(preset); +} + static void import_57_0_0(hb_value_t *preset) { import_passthru_preset_settings_57_0_0(preset); + + import_60_0_0(preset); } static void import_55_0_0(hb_value_t *preset) @@ -3929,6 +3960,11 @@ static int preset_import(hb_value_t *preset, int major, int minor, int micro) import_57_0_0(preset); result = 1; } + else if (cmpVersion(major, minor, micro, 60, 0, 0) <= 0) + { + import_60_0_0(preset); + result = 1; + } preset_clean(preset, hb_preset_template); } diff --git a/libhb/work.c b/libhb/work.c index 064817bbf592..149e1c73a8d9 100644 --- a/libhb/work.c +++ b/libhb/work.c @@ -699,7 +699,7 @@ void hb_display_job_info(hb_job_t *job) } } - if (job->passthru_dynamic_hdr_metadata & DOVI) + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI) { hb_log(" + dolby vision configuration record: version: %d.%d, profile: %d, level: %d, rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d", job->dovi.dv_version_major, @@ -712,7 +712,7 @@ void hb_display_job_info(hb_job_t *job) job->dovi.dv_bl_signal_compatibility_id); } - if (job->passthru_dynamic_hdr_metadata & HDR_10_PLUS) + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_HDR10PLUS) { hb_log(" + hdr10+ dynamic metadata"); @@ -1510,26 +1510,17 @@ static void sanitize_dynamic_hdr_metadata_passthru(hb_job_t *job) if (hb_filter_find(list, HB_FILTER_ROTATE) != NULL || hb_filter_find(list, HB_FILTER_COLORSPACE) != NULL) { - job->passthru_dynamic_hdr_metadata = NONE; + job->passthru_dynamic_hdr_metadata = HB_HDR_DYNAMIC_METADATA_NONE; return; } - if (job->vcodec != HB_VCODEC_X265_10BIT && - job->vcodec != HB_VCODEC_VT_H265_10BIT && - job->vcodec != HB_VCODEC_SVT_AV1_10BIT) + if (hb_video_hdr_dynamic_metadata_is_supported(job->vcodec,HB_HDR_DYNAMIC_METADATA_HDR10PLUS, 0) == 0) { - job->passthru_dynamic_hdr_metadata &= ~HDR_10_PLUS; + job->passthru_dynamic_hdr_metadata &= ~HB_HDR_DYNAMIC_METADATA_HDR10PLUS; } - - if ((job->dovi.dv_profile != 5 && - job->dovi.dv_profile != 7 && - job->dovi.dv_profile != 8 && - job->dovi.dv_profile != 10) || - (job->vcodec != HB_VCODEC_X265_10BIT && - job->vcodec != HB_VCODEC_VT_H265_10BIT && - job->vcodec != HB_VCODEC_SVT_AV1_10BIT)) + if (hb_video_hdr_dynamic_metadata_is_supported(job->vcodec, HB_HDR_DYNAMIC_METADATA_DOVI, job->dovi.dv_profile) == 0) { - job->passthru_dynamic_hdr_metadata &= ~DOVI; + job->passthru_dynamic_hdr_metadata &= ~HB_HDR_DYNAMIC_METADATA_DOVI; } if ((job->dovi.dv_profile == 8 || job->dovi.dv_profile == 10) && @@ -1538,11 +1529,11 @@ static void sanitize_dynamic_hdr_metadata_passthru(hb_job_t *job) if (job->mastering.has_primaries == 0 && job->mastering.has_luminance == 0) { hb_log("work: missing mastering metadata, disabling Dolby Vision"); - job->passthru_dynamic_hdr_metadata &= ~DOVI; + job->passthru_dynamic_hdr_metadata &= ~HB_HDR_DYNAMIC_METADATA_DOVI; } } - if (job->passthru_dynamic_hdr_metadata & DOVI) + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI) { #if HB_PROJECT_FEATURE_LIBDOVI int mode = 0; @@ -1626,7 +1617,7 @@ static void sanitize_dynamic_hdr_metadata_passthru(hb_job_t *job) free(settings); #else hb_log("work: libdovi not available, disabling Dolby Vision"); - job->passthru_dynamic_hdr_metadata &= ~DOVI; + job->passthru_dynamic_hdr_metadata &= ~HB_HDR_DYNAMIC_METADATA_DOVI; #endif } } @@ -1734,7 +1725,7 @@ static void do_job(hb_job_t *job) init.color_matrix = title->color_matrix; // Dolby Vision profile 5 requires full range // TODO: find a better way to handle this - init.color_range = job->passthru_dynamic_hdr_metadata & DOVI && + init.color_range = job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI && (job->dovi.dv_profile == 5 || (job->dovi.dv_profile == 10 && job->dovi.dv_bl_signal_compatibility_id == 0)) ? title->color_range : AVCOL_RANGE_MPEG; @@ -1828,7 +1819,7 @@ static void do_job(hb_job_t *job) hb_reduce(&job->vrate.num, &job->vrate.den, job->vrate.num, job->vrate.den); - if (job->passthru_dynamic_hdr_metadata & DOVI) + if (job->passthru_dynamic_hdr_metadata & HB_HDR_DYNAMIC_METADATA_DOVI) { // Dolby Vision level needs to be updated now that // the final width, height and frame rate is known diff --git a/macosx/HBJob+HBJobConversion.m b/macosx/HBJob+HBJobConversion.m index 87f73aab7a17..7183a376f2e0 100644 --- a/macosx/HBJob+HBJobConversion.m +++ b/macosx/HBJob+HBJobConversion.m @@ -154,6 +154,23 @@ - (hb_job_t *)hb_job } job->multipass = self.video.multiPass; + switch (self.video.passthruHDRDynamicMetadata) + { + case HBVideoHDRDynamicMetadataPassthruOff: + job->passthru_dynamic_hdr_metadata = HB_HDR_DYNAMIC_METADATA_NONE; + break; + case HBVideoHDRDynamicMetadataPassthruHDR10Plus: + job->passthru_dynamic_hdr_metadata = HB_HDR_DYNAMIC_METADATA_HDR10PLUS; + break; + case HBVideoHDRDynamicMetadataPassthruDolbyVision: + job->passthru_dynamic_hdr_metadata = HB_HDR_DYNAMIC_METADATA_DOVI; + break; + case HBVideoHDRDynamicMetadataPassthruAll: + default: + job->passthru_dynamic_hdr_metadata = HB_HDR_DYNAMIC_METADATA_ALL; + break; + } + if (hb_video_encoder_get_presets(self.video.encoder) != NULL) { // advanced x264/x265 options diff --git a/macosx/HBVideo.h b/macosx/HBVideo.h index cf856e732457..1140bc5192e5 100644 --- a/macosx/HBVideo.h +++ b/macosx/HBVideo.h @@ -21,6 +21,13 @@ typedef NS_ENUM(NSUInteger, HBVideoFrameRateMode) { HBVideoFrameRateModeCFR, }; +typedef NS_ENUM(NSUInteger, HBVideoHDRDynamicMetadataPassthru) { + HBVideoHDRDynamicMetadataPassthruOff, + HBVideoHDRDynamicMetadataPassthruHDR10Plus, + HBVideoHDRDynamicMetadataPassthruDolbyVision, + HBVideoHDRDynamicMetadataPassthruAll +}; + extern NSString * const HBVideoChangedNotification; /** @@ -40,6 +47,8 @@ extern NSString * const HBVideoChangedNotification; @property (nonatomic, readwrite) BOOL multiPass; @property (nonatomic, readwrite) BOOL turboMultiPass; +@property (nonatomic, readwrite) HBVideoHDRDynamicMetadataPassthru passthruHDRDynamicMetadata; + /** * Encoder specifics options */ diff --git a/macosx/HBVideo.m b/macosx/HBVideo.m index c8be453a34fd..b151467c4f96 100644 --- a/macosx/HBVideo.m +++ b/macosx/HBVideo.m @@ -31,11 +31,13 @@ @implementation HBVideo - (instancetype)initWithJob:(HBJob *)job { self = [super init]; - if (self) { + if (self) + { _encoder = HB_VCODEC_X264; _avgBitrate = 1000; _quality = 18.0; _qualityMaxValue = 51.0f; + _passthruHDRDynamicMetadata = HBVideoHDRDynamicMetadataPassthruAll; _job = job; _preset = @"medium"; @@ -479,6 +481,8 @@ - (instancetype)copyWithZone:(NSZone *)zone copy->_multiPass = _multiPass; copy->_turboMultiPass = _turboMultiPass; + copy->_passthruHDRDynamicMetadata = _passthruHDRDynamicMetadata; + copy->_preset = [_preset copy]; copy->_tune = [_tune copy]; copy->_profile = [_profile copy]; @@ -518,6 +522,8 @@ - (void)encodeWithCoder:(NSCoder *)coder encodeBool(_multiPass); encodeBool(_turboMultiPass); + encodeInteger(_passthruHDRDynamicMetadata); + encodeObject(_preset); encodeObject(_tune); encodeObject(_profile); @@ -546,6 +552,8 @@ - (instancetype)initWithCoder:(NSCoder *)decoder decodeBool(_multiPass); decodeBool(_turboMultiPass); + decodeInteger(_frameRateMode); if (_passthruHDRDynamicMetadata < HBVideoHDRDynamicMetadataPassthruOff || _passthruHDRDynamicMetadata > HBVideoHDRDynamicMetadataPassthruAll) { goto fail; } + decodeObjectOrFail(_preset, NSString); decodeObjectOrFail(_tune, NSString); decodeObjectOrFail(_profile, NSString); @@ -707,6 +715,23 @@ - (void)applyPreset:(HBPreset *)preset jobSettings:(NSDictionary *)settings // Turbo 1st pass for 2 Pass Encoding. self.turboMultiPass = [preset[@"VideoTurboMultiPass"] boolValue]; + if ([preset[@"VideoPasshtruHDRDynamicMetadata"] isEqualToString:@"off"]) + { + self.passthruHDRDynamicMetadata = HBVideoHDRDynamicMetadataPassthruOff; + } + else if ([preset[@"VideoPasshtruHDRDynamicMetadata"] isEqualToString:@"hdr10plus"]) + { + self.passthruHDRDynamicMetadata = HBVideoHDRDynamicMetadataPassthruHDR10Plus; + } + else if ([preset[@"VideoPasshtruHDRDynamicMetadata"] isEqualToString:@"dovi"]) + { + self.passthruHDRDynamicMetadata = HBVideoHDRDynamicMetadataPassthruDolbyVision; + } + else + { + self.passthruHDRDynamicMetadata = HBVideoHDRDynamicMetadataPassthruAll; + } + self.notificationsEnabled = YES; } @@ -763,6 +788,22 @@ - (void)writeToPreset:(HBMutablePreset *)preset preset[@"VideoMultiPass"] = @(self.multiPass); preset[@"VideoTurboMultiPass"] = @(self.turboMultiPass); + + switch (self.passthruHDRDynamicMetadata) + { + case HBVideoHDRDynamicMetadataPassthruOff: + preset[@"VideoPasshtruHDRDynamicMetadata"] = @"off"; + break; + case HBVideoHDRDynamicMetadataPassthruHDR10Plus: + preset[@"VideoPasshtruHDRDynamicMetadata"] = @"hdr10plus"; + break; + case HBVideoHDRDynamicMetadataPassthruDolbyVision: + preset[@"VideoPasshtruHDRDynamicMetadata"] = @"dolbyvision"; + break; + case HBVideoHDRDynamicMetadataPassthruAll: + preset[@"VideoPasshtruHDRDynamicMetadata"] = @"all"; + break; + } } @end diff --git a/macosx/HandBrake.xcodeproj/xcshareddata/xcschemes/HandBrake-Debug-Sandbox.xcscheme b/macosx/HandBrake.xcodeproj/xcshareddata/xcschemes/HandBrake-Debug-Sandbox.xcscheme index f5205fc38a26..b15a3e5b3c0a 100644 --- a/macosx/HandBrake.xcodeproj/xcshareddata/xcschemes/HandBrake-Debug-Sandbox.xcscheme +++ b/macosx/HandBrake.xcodeproj/xcshareddata/xcschemes/HandBrake-Debug-Sandbox.xcscheme @@ -70,6 +70,15 @@ allowLocationSimulation = "YES"> + + + + - + + + + +
- + diff --git a/preset/preset_cli_default.json b/preset/preset_cli_default.json index 4fee1e198e36..815b3bd8b285 100644 --- a/preset/preset_cli_default.json +++ b/preset/preset_cli_default.json @@ -113,6 +113,7 @@ "VideoHWDecode": 0, "VideoMultiPass": false, "VideoTurboMultiPass": false, + "VideoPasshtruHDRDynamicMetadata": "all", "x264Option": "", "x264UseAdvancedOptions": false } diff --git a/preset/preset_template.json b/preset/preset_template.json index 82302a4dece6..a030ea89eea3 100644 --- a/preset/preset_template.json +++ b/preset/preset_template.json @@ -123,6 +123,7 @@ "VideoHWDecode": 0, "VideoMultiPass": false, "VideoTurboMultiPass": false, + "VideoPasshtruHDRDynamicMetadata": "all", "x264Option": "", "x264UseAdvancedOptions": false } diff --git a/test/test.c b/test/test.c index 9d54d17cbf52..6e8c37d42a26 100644 --- a/test/test.c +++ b/test/test.c @@ -59,6 +59,7 @@ #define ROTATE_DEFAULT "angle=180:hflip=0" #define DEBLOCK_DEFAULT_PRESET "medium" #define COLORSPACE_DEFAULT_PRESET "bt709" +#define HDR_DYNAMIC_METADATA_DEFAULT_PRESET "all" /* Options */ static int debug = HB_DEBUG_ALL; @@ -211,6 +212,8 @@ static int qsv_decode = -1; #endif static int hw_decode = -1; static int keep_duplicate_titles = 0; +static int hdr_dynamic_metadata_disable = 0; +static char * hdr_dynamic_metadata = NULL; /* Exit cleanly on Ctrl-C */ static volatile hb_error_code done_error = HB_ERROR_NONE; @@ -1497,6 +1500,12 @@ static void ShowHelp(void) " timing if it's below that rate.\n" " If none of these flags are given, the default\n" " is --pfr when -r is given and --vfr otherwise\n" +" --hdr-dynamic-metadata \n" +" Set the kind of HDR dynamic metadata to preserve:\n" +" hdr10plus\n" +" dolbyvision\n" +" all\n" +" --no-hdr-dynamic-metadata Disable HDR dynamic metadata passthru\n" " --enable-hw-decoding \n" #if defined( __APPLE_CC__ ) " Use 'videotoolbox' to enable VideoToolbox \n" @@ -2234,8 +2243,9 @@ static int ParseOptions( int argc, char ** argv ) #define CROP_MODE 330 #define HW_DECODE 331 #define KEEP_DUPLICATE_TITLES 332 - #define MAX_DURATION 333 - + #define MAX_DURATION 333 + #define HDR_DYNAMIC_METADATA 334 + for( ;; ) { static struct option long_options[] = @@ -2254,9 +2264,13 @@ static int ParseOptions( int argc, char ** argv ) { "enable-qsv-decoding", no_argument, &qsv_decode, 1, }, #endif { "disable-hw-decoding", no_argument, &hw_decode, 0, }, - { "enable-hw-decoding", required_argument, NULL, HW_DECODE, }, + { "enable-hw-decoding", required_argument, NULL, HW_DECODE, }, + { "keep-duplicate-titles", no_argument, NULL, KEEP_DUPLICATE_TITLES }, + { "no-hdr-dynamic-metadata", no_argument, &hdr_dynamic_metadata_disable, 1 }, + { "hdr-dynamic-metadata", required_argument, NULL, HDR_DYNAMIC_METADATA }, + { "format", required_argument, NULL, 'f' }, { "input", required_argument, NULL, 'i' }, { "output", required_argument, NULL, 'o' }, @@ -3237,6 +3251,17 @@ static int ParseOptions( int argc, char ** argv ) case KEEP_DUPLICATE_TITLES: keep_duplicate_titles = 1; break; + case HDR_DYNAMIC_METADATA: + free(hdr_dynamic_metadata); + if (optarg != NULL) + { + hdr_dynamic_metadata = strdup(optarg); + } + else + { + hdr_dynamic_metadata = strdup(HDR_DYNAMIC_METADATA_DEFAULT_PRESET); + } + break; case ':': fprintf( stderr, "missing parameter (%s)\n", argv[cur_optind] ); return -1; @@ -3574,6 +3599,16 @@ static int ParseOptions( int argc, char ** argv ) } } + if (hdr_dynamic_metadata != NULL) + { + if (hdr_dynamic_metadata_disable) + { + fprintf(stderr, + "Incompatible options --hdr-dynamic-metadata and --no-hdr-dynamic-metadata\n"); + return -1; + } + } + return 0; } @@ -4380,6 +4415,14 @@ static hb_dict_t * PreparePreset(const char *preset_name) { hb_dict_set(preset, "VideoHWDecode", hb_value_int(hw_decode)); } + if (hdr_dynamic_metadata_disable) + { + hb_dict_set(preset, "VideoPasshtruHDRDynamicMetadata", hb_value_string("off")); + } + if (hdr_dynamic_metadata != NULL) + { + hb_dict_set(preset, "VideoPasshtruHDRDynamicMetadata", hb_value_string(hdr_dynamic_metadata)); + } if (maxWidth > 0) { hb_dict_set(preset, "PictureWidth", hb_value_int(maxWidth)); diff --git a/win/CS/HandBrake.Interop/Interop/HbLib/hb_hdr_dynamic_metadata_mode_t.cs b/win/CS/HandBrake.Interop/Interop/HbLib/hb_hdr_dynamic_metadata_mode_t.cs new file mode 100644 index 000000000000..e9fd10bca23f --- /dev/null +++ b/win/CS/HandBrake.Interop/Interop/HbLib/hb_hdr_dynamic_metadata_mode_t.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HandBrake.Interop.Interop.HbLib +{ + internal enum hb_hdr_dynamic_metadata_mode_t + { + HB_HDR_DYNAMIC_METADATA_NONE = 0, + HB_HDR_DYNAMIC_METADATA_HDR10PLUS = 1 << 1, + HB_HDR_DYNAMIC_METADATA_DOVI = 1 << 2, + HB_HDR_DYNAMIC_METADATA_ALL = HB_HDR_DYNAMIC_METADATA_HDR10PLUS | HB_HDR_DYNAMIC_METADATA_DOVI + }; +} diff --git a/win/CS/HandBrake.Interop/Interop/Interfaces/Model/HDRDynamicMetadata.cs b/win/CS/HandBrake.Interop/Interop/Interfaces/Model/HDRDynamicMetadata.cs new file mode 100644 index 000000000000..b3828ead7626 --- /dev/null +++ b/win/CS/HandBrake.Interop/Interop/Interfaces/Model/HDRDynamicMetadata.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using HandBrake.Interop.Attributes; +using HandBrake.Interop.Interop.HbLib; + +namespace HandBrake.Interop.Interop.Interfaces.Model +{ + public enum HDRDynamicMetadata + { + [DisplayName("None")] + [ShortName("none")] + None = hb_hdr_dynamic_metadata_mode_t.HB_HDR_DYNAMIC_METADATA_NONE, + [DisplayName("HDR10+")] + [ShortName("hdr10plus")] + HDR10Plus = hb_hdr_dynamic_metadata_mode_t.HB_HDR_DYNAMIC_METADATA_HDR10PLUS, + [DisplayName("Dolby Vision")] + [ShortName("dolbyvision")] + DolbyVision = hb_hdr_dynamic_metadata_mode_t.HB_HDR_DYNAMIC_METADATA_DOVI, + [DisplayName("All")] + [ShortName("all")] + All = hb_hdr_dynamic_metadata_mode_t.HB_HDR_DYNAMIC_METADATA_ALL, + } +} diff --git a/win/CS/HandBrake.Interop/Interop/Json/Presets/HBPreset.cs b/win/CS/HandBrake.Interop/Interop/Json/Presets/HBPreset.cs index f36b410180e0..20e42915cc57 100644 --- a/win/CS/HandBrake.Interop/Interop/Json/Presets/HBPreset.cs +++ b/win/CS/HandBrake.Interop/Interop/Json/Presets/HBPreset.cs @@ -396,6 +396,11 @@ public class HBPreset /// public bool VideoTurboMultiPass { get; set; } + /// + /// Gets or sets a value indicating which dynamic metadata formats to preserve. + /// + public string VideoPasshtruHDRDynamicMetadata { get; set; } + /// /// Gets or sets the x 264 option. /// diff --git a/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs b/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs index 3356fa7a4367..a45f28bf0165 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs @@ -11,7 +11,7 @@ namespace HandBrakeWPF.Services.Encode.Model { using System.Collections.Generic; using System.Collections.ObjectModel; - + using HandBrake.Interop.Interop.Interfaces.Model; using HandBrake.Interop.Interop.Interfaces.Model.Encoders; using HandBrake.Interop.Interop.Interfaces.Model.Filters; using HandBrake.Interop.Interop.Interfaces.Model.Picture; @@ -295,6 +295,8 @@ public EncodeTask(EncodeTask task) public bool TurboAnalysisPass { get; set; } + public HDRDynamicMetadata PasshtruHDRDynamicMetadata { get; set; } + public double? Framerate { get; set; } diff --git a/win/CS/HandBrakeWPF/Services/Presets/Factories/JsonPresetFactory.cs b/win/CS/HandBrakeWPF/Services/Presets/Factories/JsonPresetFactory.cs index c4a25e4dd516..28b1e7a379ae 100644 --- a/win/CS/HandBrakeWPF/Services/Presets/Factories/JsonPresetFactory.cs +++ b/win/CS/HandBrakeWPF/Services/Presets/Factories/JsonPresetFactory.cs @@ -283,6 +283,23 @@ public static Preset ImportPreset(HBPreset importedPreset) preset.Task.VideoBitrate = importedPreset.VideoAvgBitrate; preset.Task.MultiPass = importedPreset.VideoMultiPass; preset.Task.TurboAnalysisPass = importedPreset.VideoTurboMultiPass; + + switch (importedPreset.VideoPasshtruHDRDynamicMetadata) + { + case "none": + preset.Task.PasshtruHDRDynamicMetadata = HDRDynamicMetadata.None; + break; + case "hdr10plus": + preset.Task.PasshtruHDRDynamicMetadata = HDRDynamicMetadata.HDR10Plus; + break; + case "dolbyvision": + preset.Task.PasshtruHDRDynamicMetadata = HDRDynamicMetadata.DolbyVision; + break; + default: + preset.Task.PasshtruHDRDynamicMetadata = HDRDynamicMetadata.All; + break; + } + preset.Task.ExtraAdvancedArguments = importedPreset.VideoOptionExtra; preset.Task.Quality = double.Parse(importedPreset.VideoQualitySlider.ToString(CultureInfo.InvariantCulture), CultureInfo.InvariantCulture); preset.Task.VideoEncodeRateType = (VideoEncodeRateType)importedPreset.VideoQualityType; @@ -628,6 +645,7 @@ public static HBPreset CreateHbPreset(Preset export) preset.VideoColorMatrixCode = 0; // TODO not supported. preset.VideoTurboMultiPass = export.Task.TurboAnalysisPass; preset.VideoMultiPass = export.Task.MultiPass; + preset.VideoPasshtruHDRDynamicMetadata = "all"; // TODO EnumHelper.GetShortName(export.Task.PasshtruHDRDynamicMetadata); // Unknown preset.ChildrenArray = new List(); diff --git a/win/CS/HandBrakeWPF/ViewModels/VideoViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/VideoViewModel.cs index 31362a7342d1..9f1cea3e4ec0 100644 --- a/win/CS/HandBrakeWPF/ViewModels/VideoViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/VideoViewModel.cs @@ -16,6 +16,7 @@ namespace HandBrakeWPF.ViewModels using System.Linq; using HandBrake.Interop.Interop; + using HandBrake.Interop.Interop.Interfaces.Model; using HandBrake.Interop.Interop.Interfaces.Model.Encoders; using HandBrakeWPF.EventArgs; @@ -259,6 +260,18 @@ public bool TurboAnalysisPass } } + public HDRDynamicMetadata PasshtruHDRDynamicMetadata + { + get => this.Task.PasshtruHDRDynamicMetadata; + + set + { + this.Task.PasshtruHDRDynamicMetadata = value; + this.NotifyOfPropertyChange(() => this.PasshtruHDRDynamicMetadata); + this.OnTabStatusChanged(null); + } + } + public string Rfqp { get => HandBrakeEncoderHelpers.GetVideoQualityRateControlName(this.SelectedVideoEncoder?.ShortName);