From d651d8c725ef59e8cede1d02e02db84bb46240bf Mon Sep 17 00:00:00 2001 From: rigaya Date: Tue, 19 Nov 2024 19:14:31 +0900 Subject: [PATCH] =?UTF-8?q?--dolby-vision-rpu=E4=BD=BF=E7=94=A8=E6=99=82?= =?UTF-8?q?=E3=81=AB=E3=83=AC=E3=82=BF=E3=83=BC=E3=83=9C=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=82=B9=E9=83=A8=E5=88=86=E3=82=92crop=E3=82=92=E3=81=97?= =?UTF-8?q?=E3=81=9F=E5=A0=B4=E5=90=88=E3=81=AB=E3=81=9D=E3=82=8C=E3=82=92?= =?UTF-8?q?=E5=8F=8D=E6=98=A0=E3=81=95=E3=81=9B=E3=82=8B=E3=82=AA=E3=83=97?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= =?UTF-8?q?=20(=20#222,=20--dolby-vision-rpu-prm=20crop=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QSVEnc/QSVEnc_readme.txt | 5 +++ QSVEncC_Options.en.md | 16 +++++++++ QSVEncC_Options.ja.md | 16 +++++++++ QSVPipeline/rgy_cmd.cpp | 51 +++++++++++++++++++++++++- QSVPipeline/rgy_def.h | 5 +++ QSVPipeline/rgy_frame.cpp | 57 +++++++++++++++++------------- QSVPipeline/rgy_frame.h | 15 ++++++-- QSVPipeline/rgy_output.cpp | 6 +++- QSVPipeline/rgy_output.h | 2 ++ QSVPipeline/rgy_output_avcodec.cpp | 4 ++- QSVPipeline/rgy_output_avcodec.h | 3 ++ QSVPipeline/rgy_prm.cpp | 1 + QSVPipeline/rgy_prm.h | 1 + QSVPipeline/rgy_version.h | 6 ++-- 14 files changed, 154 insertions(+), 34 deletions(-) diff --git a/QSVEnc/QSVEnc_readme.txt b/QSVEnc/QSVEnc_readme.txt index f2b0f2de..1d5608eb 100644 --- a/QSVEnc/QSVEnc_readme.txt +++ b/QSVEnc/QSVEnc_readme.txt @@ -313,6 +313,11 @@ API v1.1 … Intel Media SDK v2.0 【どうでもいいメモ】 +2024.11.xx (7.74) +- --dolby-vision-profileで対象外のプロファイルも読み込めていた問題を修正。 +- --dolby-vision-rpu使用時にレターボックス部分をcropをした場合にそれを反映させるオプションを追加。 ( --dolby-vision-rpu-prm crop ) +- --dolby-visionに関するモード制限を解除。 + 2024.11.12 (7.73) - --dolby-vision-rpu copyを使用して長時間のエンコードを行うと、エンコード速度が著しく低下していくのを改善し、速度を維持し続けられるように。 - AV1出力時に--dhdr10-infoを使用した時の出力を改善。 diff --git a/QSVEncC_Options.en.md b/QSVEncC_Options.en.md index bb27e3a1..19d90048 100644 --- a/QSVEncC_Options.en.md +++ b/QSVEncC_Options.en.md @@ -130,6 +130,7 @@ - [--dolby-vision-profile \ \[HEVC, AV1\]](#--dolby-vision-profile-string-hevc-av1) - [--dolby-vision-rpu \ \[HEVC, AV1\]](#--dolby-vision-rpu-string-hevc-av1) - [--dolby-vision-rpu copy \[HEVC, AV1\]](#--dolby-vision-rpu-copy-hevc-av1) + - [--dolby-vision-rpu-prm \=\\[,\=\\]...](#--dolby-vision-rpu-prm-param1value1param2value2) - [--aud](#--aud) - [--pic-struct](#--pic-struct) - [--buf-period](#--buf-period) @@ -952,6 +953,21 @@ Interleave Dolby Vision RPU metadata copied from HEVC input file. Recommended to Limitations for avhw reader: this option uses timestamps to reorder frames to decoded order to presentation order. Therefore, input files without timestamps (such as raw ES), are not supported. Please try for avsw reader for that case. +### --dolby-vision-rpu-prm <param1>=<value1>[,<param2>=<value2>]... + +Set parameters for ```--dolby-vision-rpu```. + +- **parameters** + + - crop=<bool> + + Set active area offsets to 0 (no letterbox bars). + +- Examples + ``` + Example: --dolby-vision-rpu-prm crop=true + ``` + ### --aud Insert Access Unit Delimiter NAL. diff --git a/QSVEncC_Options.ja.md b/QSVEncC_Options.ja.md index 46c29508..29c23f7f 100644 --- a/QSVEncC_Options.ja.md +++ b/QSVEncC_Options.ja.md @@ -130,6 +130,7 @@ - [--dolby-vision-profile \ \[HEVC, AV1\]](#--dolby-vision-profile-string-hevc-av1) - [--dolby-vision-rpu \ \[HEVC, AV1\]](#--dolby-vision-rpu-string-hevc-av1) - [--dolby-vision-rpu copy \[HEVC, AV1\]](#--dolby-vision-rpu-copy-hevc-av1) + - [--dolby-vision-rpu-prm \=\\[,\=\\]...](#--dolby-vision-rpu-prm-param1value1param2value2) - [--aud](#--aud) - [--pic-struct](#--pic-struct) - [--buf-period](#--buf-period) @@ -976,6 +977,21 @@ HEVCの入力ファイルから読み取ったdolby visionのmetadataを出力 avhw読み込みでは、フレームの並び替えにタイムスタンプを使用するため、タイムスタンプの取得できないraw ESのような入力ファイルでは使用できません。 こうした場合には、avsw読み込みを使用してください。 +### --dolby-vision-rpu-prm <param1>=<value1>[,<param2>=<value2>]... + +```--dolby-vision-rpu```用のパラメータを指定する。 + +- **パラメータ** + + - crop=<bool> + + RPUのactive area offsetsを0に設定する (レターボックスなしの意味)。 + +- 使用例 + ``` + 例: --dolby-vision-rpu-prm crop=true + ``` + ### --aud Access Unit Delimiter NALを挿入する。 diff --git a/QSVPipeline/rgy_cmd.cpp b/QSVPipeline/rgy_cmd.cpp index ed6d919a..920a761a 100644 --- a/QSVPipeline/rgy_cmd.cpp +++ b/QSVPipeline/rgy_cmd.cpp @@ -6155,6 +6155,40 @@ int parse_one_common_option(const TCHAR *option_name, const TCHAR *strInput[], i } return 0; } + if (IS_OPTION("dolby-vision-rpu-prm")) { + i++; + const auto paramList = std::vector{ "crop" }; + for (const auto ¶m : split(strInput[i], _T(","))) { + auto pos = param.find_first_of(_T("=")); + if (pos != std::string::npos) { + auto param_arg = tolowercase(param.substr(0, pos)); + auto param_val = param.substr(pos + 1); + if (param_arg == _T("crop")) { + bool b = false; + if (!cmd_string_to_bool(&b, param_val)) { + common->doviRpuActiveAreaOffsets.reset((b) ? new RGYDOVIRpuActiveAreaOffsets() : nullptr); + if (b) { + + } + } else { + print_cmd_error_invalid_value(tstring(option_name) + _T(" ") + param_arg + _T("="), param_val); + return 1; + } + continue; + } + print_cmd_error_unknown_opt_param(option_name, param_arg, paramList); + return 1; + } else { + if (param == _T("crop")) { + common->doviRpuActiveAreaOffsets.reset(new RGYDOVIRpuActiveAreaOffsets()); + continue; + } + print_cmd_error_unknown_opt_param(option_name, param, paramList); + return 1; + } + } + return 0; + } #endif //#if ENABLE_DOVI_METADATA_OPTIONS if (IS_OPTION("timecode")) { common->timecode = true; @@ -8200,6 +8234,16 @@ tstring gen_cmd(const RGYParamCommon *param, const RGYParamCommon *defaultPrm, b } else { OPT_STR_PATH(_T("--dolby-vision-rpu"), doviRpuFile); } + + if (param->doviRpuActiveAreaOffsets != defaultPrm->doviRpuActiveAreaOffsets) { + tmp.str(tstring()); + if (param->doviRpuActiveAreaOffsets) { + tmp << ",crop=on"; + } + if (!tmp.str().empty()) { + cmd << _T(" --dolby-vision-rpu-prm ") << tmp.str().substr(1); + } + } if (param->timecode || param->timecodeFile.length() > 0) { cmd << (param->timecode ? _T("--timecode ") : _T("--no-timecode ")); if (param->timecodeFile.length() > 0) { @@ -8451,7 +8495,12 @@ tstring gen_cmd_help_common() { str += print_list_options(_T("--dolby-vision-profile "), list_dovi_profile, 0); str += strsprintf( _T(" --dolby-vision-rpu Copy dolby vision metadata from input rpu file.\n") - _T(" --dolby-vision-rpu copy Copy dolby vision metadata from input file.\n")); + _T(" --dolby-vision-rpu copy Copy dolby vision metadata from input file.\n") + _T(" --dolby-vision-rpu-prm =[,=][...]\n") + _T(" parameters for --dolby-vision-rpu.\n") + _T(" params\n") + _T(" crop= Set active area offsets to 0 (no letterbox bars).\n") + ); #endif //#if ENABLE_DOVI_METADATA_OPTIONS str += strsprintf( _T(" --input-analyze set time (sec) which reader analyze input file.\n") diff --git a/QSVPipeline/rgy_def.h b/QSVPipeline/rgy_def.h index 3b8c4ced..4204357a 100644 --- a/QSVPipeline/rgy_def.h +++ b/QSVPipeline/rgy_def.h @@ -509,6 +509,11 @@ const CX_DESC list_dovi_profile_parse[] = { { NULL, 0 } }; +struct RGYDOVIRpuActiveAreaOffsets { + uint16_t left, top, right, bottom; + + RGYDOVIRpuActiveAreaOffsets() : left(0), top(0), right(0), bottom(0) {}; +}; // 1st luma line > |X X ... |3 4 X ... X が輝度ピクセル位置 // | |1 2 1-6 are possible chroma positions diff --git a/QSVPipeline/rgy_frame.cpp b/QSVPipeline/rgy_frame.cpp index 3b2a35dd..b5c163a9 100644 --- a/QSVPipeline/rgy_frame.cpp +++ b/QSVPipeline/rgy_frame.cpp @@ -190,37 +190,44 @@ RGYFrameDataDOVIRpu::~RGYFrameDataDOVIRpu() { } RGY_ERR RGYFrameDataDOVIRpu::convert(const RGYFrameDataMetadataConvertParam *metadataprm) { #if ENABLE_LIBDOVI auto prm = dynamic_cast(metadataprm); - if (!prm || !prm->enable) { - return RGY_ERR_NONE; - } - if (prm->doviProfileDst != RGY_DOVI_PROFILE_81 && prm->doviProfileDst != RGY_DOVI_PROFILE_COPY) { + if (!prm) { return RGY_ERR_NONE; } if (m_data.size() == 0) { return RGY_ERR_NONE; } - std::unique_ptr rpu(dovi_parse_rpu(m_data.data(), m_data.size()), dovi_rpu_free); - if (!rpu) { - return RGY_ERR_INVALID_BINARY; - } - std::unique_ptr header(dovi_rpu_get_header(rpu.get()), dovi_rpu_free_header); - if (!header) { - return RGY_ERR_UNKNOWN; - } - const auto dovi_profile = header->guessed_profile; - if (dovi_profile != 7) { - return RGY_ERR_NONE; - } - const int ret = dovi_convert_rpu_with_mode(rpu.get(), 2); - if (ret != 0) { - return RGY_ERR_INVALID_OPERATION; - } - std::unique_ptr rpu_data(dovi_write_rpu(rpu.get()), dovi_data_free); - if (!rpu_data) { - return RGY_ERR_NULL_PTR; + if (prm->convertProfile || prm->activeAreaOffsets || prm->removeMapping) { + std::unique_ptr rpu(dovi_parse_rpu(m_data.data(), m_data.size()), dovi_rpu_free); + if (!rpu) { + return RGY_ERR_INVALID_BINARY; + } + std::unique_ptr header(dovi_rpu_get_header(rpu.get()), dovi_rpu_free_header); + if (!header) { + return RGY_ERR_UNKNOWN; + } + const auto dovi_profile = header->guessed_profile; + if (prm->convertProfile + && dovi_profile == 7 + && (prm->doviProfileDst == RGY_DOVI_PROFILE_81 || prm->doviProfileDst == RGY_DOVI_PROFILE_COPY)) { + const int ret = dovi_convert_rpu_with_mode(rpu.get(), 2); + if (ret != 0) { + return RGY_ERR_INVALID_OPERATION; + } + } + if (prm->activeAreaOffsets) { + dovi_rpu_set_active_area_offsets(rpu.get(), + prm->activeAreaOffsets->left, prm->activeAreaOffsets->right, prm->activeAreaOffsets->top, prm->activeAreaOffsets->bottom); + } + if (prm->removeMapping) { + dovi_rpu_remove_mapping(rpu.get()); + } + std::unique_ptr rpu_data(dovi_write_rpu(rpu.get()), dovi_data_free); + if (!rpu_data) { + return RGY_ERR_NULL_PTR; + } + m_data.resize(rpu_data->len); + memcpy(m_data.data(), rpu_data->data, rpu_data->len); } - m_data.resize(rpu_data->len); - memcpy(m_data.data(), rpu_data->data, rpu_data->len); #endif // ENABLE_LIBDOVI return RGY_ERR_NONE; } diff --git a/QSVPipeline/rgy_frame.h b/QSVPipeline/rgy_frame.h index 72597c8f..29619e63 100644 --- a/QSVPipeline/rgy_frame.h +++ b/QSVPipeline/rgy_frame.h @@ -89,9 +89,11 @@ class RGYFrameDataQP : public RGYFrameData { class RGYFrameDataMetadataConvertParam { public: - bool enable; + bool convertProfile; + bool removeMapping; + std::unique_ptr activeAreaOffsets; - RGYFrameDataMetadataConvertParam() : enable(false) {} + RGYFrameDataMetadataConvertParam() : convertProfile(false), removeMapping(false), activeAreaOffsets() {}; virtual ~RGYFrameDataMetadataConvertParam() {}; }; @@ -125,7 +127,14 @@ class RGYFrameDataDOVIRpuConvertParam : public RGYFrameDataMetadataConvertParam RGYDOVIProfile doviProfileDst; RGYFrameDataDOVIRpuConvertParam() : RGYFrameDataMetadataConvertParam(), doviProfileDst(RGY_DOVI_PROFILE_UNSET) {} - RGYFrameDataDOVIRpuConvertParam(RGYDOVIProfile profile) : RGYFrameDataMetadataConvertParam(), doviProfileDst(profile) { enable = true; } + RGYFrameDataDOVIRpuConvertParam(RGYDOVIProfile profile, const RGYDOVIRpuActiveAreaOffsets *activeAreaOffsets_) : + RGYFrameDataMetadataConvertParam(), doviProfileDst(profile) { + convertProfile = true; + removeMapping = false; + if (activeAreaOffsets_) { + activeAreaOffsets = std::make_unique(*activeAreaOffsets_); + } + } virtual ~RGYFrameDataDOVIRpuConvertParam() {}; }; diff --git a/QSVPipeline/rgy_output.cpp b/QSVPipeline/rgy_output.cpp index 924e9d94..0f2c9acd 100644 --- a/QSVPipeline/rgy_output.cpp +++ b/QSVPipeline/rgy_output.cpp @@ -641,6 +641,7 @@ RGYOutputRaw::RGYOutputRaw() : m_doviProfileDst(RGY_DOVI_PROFILE_UNSET), m_doviRpu(nullptr), m_doviRpuMetadataCopy(false), + m_doviRpuActiveAreaOffsets(nullptr), m_timestamp(nullptr), m_prevInputFrameId(-1), m_prevEncodeFrameId(-1), @@ -715,6 +716,7 @@ RGY_ERR RGYOutputRaw::Init(const TCHAR *strFileName, const VideoInfo *pVideoOutp m_doviProfileDst = rawPrm->doviProfile; m_doviRpu = rawPrm->doviRpu; m_doviRpuMetadataCopy = rawPrm->doviRpuMetadataCopy; + m_doviRpuActiveAreaOffsets = (rawPrm->doviRpuActiveAreaOffsets) ? std::make_unique(*rawPrm->doviRpuActiveAreaOffsets) : nullptr; m_timestamp = rawPrm->vidTimestamp; m_debugDirectAV1Out = rawPrm->debugDirectAV1Out; m_HEVCAlphaChannelMode = rawPrm->HEVCAlphaChannelMode; @@ -837,7 +839,7 @@ RGY_ERR RGYOutputRaw::WriteNextOneFrame(RGYBitstream *pBitstream) { metadataList.push_back(std::make_unique(dovi_nal, false, m_VideoOutputInfo.codec == RGY_CODEC_HEVC ? true : false)); } } else if (m_doviRpuMetadataCopy) { - auto doviRpuConvPrm = (m_doviProfileDst == RGY_DOVI_PROFILE_COPY) ? std::make_unique(m_doviProfileDst) : nullptr; + auto doviRpuConvPrm = (m_doviProfileDst == RGY_DOVI_PROFILE_COPY) ? std::make_unique(m_doviProfileDst, m_doviRpuActiveAreaOffsets.get()) : nullptr; auto [err_dovirpu, metadata_dovi_rpu] = getMetadata(RGY_FRAME_DATA_DOVIRPU, bs_framedata, doviRpuConvPrm.get()); if (err_dovirpu != RGY_ERR_NONE) { return err_dovirpu; @@ -1228,6 +1230,7 @@ RGY_ERR initWriters( writerPrm.doviRpu = doviRpu; writerPrm.doviRpuMetadataCopy = common->doviRpuMetadataCopy; writerPrm.doviProfile = common->doviProfile; + writerPrm.doviRpuActiveAreaOffsets = common->doviRpuActiveAreaOffsets.get(); writerPrm.vidTimestamp = vidTimestamp; writerPrm.videoCodecTag = common->videoCodecTag; writerPrm.videoMetadata = common->videoMetadata; @@ -1542,6 +1545,7 @@ RGY_ERR initWriters( rawPrm.doviProfile = common->doviProfile; rawPrm.doviRpu = doviRpu; rawPrm.doviRpuMetadataCopy = common->doviRpuMetadataCopy; + rawPrm.doviRpuActiveAreaOffsets = common->doviRpuActiveAreaOffsets.get(); rawPrm.vidTimestamp = vidTimestamp; rawPrm.debugDirectAV1Out = common->debugDirectAV1Out; rawPrm.HEVCAlphaChannel = HEVCAlphaChannel; diff --git a/QSVPipeline/rgy_output.h b/QSVPipeline/rgy_output.h index ece6a430..83f57fbd 100644 --- a/QSVPipeline/rgy_output.h +++ b/QSVPipeline/rgy_output.h @@ -325,6 +325,7 @@ struct RGYOutputRawPrm { RGYDOVIProfile doviProfile; DOVIRpu *doviRpu; bool doviRpuMetadataCopy; //doviのmetadataのコピー + const RGYDOVIRpuActiveAreaOffsets *doviRpuActiveAreaOffsets; RGYTimestamp *vidTimestamp; }; @@ -346,6 +347,7 @@ class RGYOutputRaw : public RGYOutput { RGYDOVIProfile m_doviProfileDst; DOVIRpu *m_doviRpu; bool m_doviRpuMetadataCopy; + std::unique_ptr m_doviRpuActiveAreaOffsets; RGYTimestamp *m_timestamp; int64_t m_prevInputFrameId; int64_t m_prevEncodeFrameId; diff --git a/QSVPipeline/rgy_output_avcodec.cpp b/QSVPipeline/rgy_output_avcodec.cpp index f2e54b3e..ed3a464d 100644 --- a/QSVPipeline/rgy_output_avcodec.cpp +++ b/QSVPipeline/rgy_output_avcodec.cpp @@ -139,6 +139,7 @@ AVMuxVideo::AVMuxVideo() : doviProfileDst(RGY_DOVI_PROFILE_UNSET), doviRpu(nullptr), doviRpuMetadataCopy(false), + doviRpuActiveAreaOffsets(nullptr), bsfc(nullptr), bsfcBuffer(nullptr), bsfcBufferLength(0), @@ -897,6 +898,7 @@ RGY_ERR RGYOutputAvcodec::InitVideo(const VideoInfo *videoOutputInfo, const Avco m_Mux.video.bsfcBufferLength = 0; m_Mux.video.hdr10plusMetadataCopy = prm->hdr10plusMetadataCopy; m_Mux.video.doviRpuMetadataCopy = prm->doviRpuMetadataCopy; + m_Mux.video.doviRpuActiveAreaOffsets = (prm->doviRpuActiveAreaOffsets) ? std::make_unique(*prm->doviRpuActiveAreaOffsets) : nullptr; auto retm = SetMetadata(&m_Mux.video.streamOut->metadata, (prm->videoInputStream) ? prm->videoInputStream->metadata : nullptr, prm->videoMetadata, RGY_METADATA_DEFAULT_COPY_LANG_ONLY, _T("Video")); if (retm != RGY_ERR_NONE) { @@ -2826,7 +2828,7 @@ RGY_ERR RGYOutputAvcodec::WriteNextFrameInternalOneFrame(RGYBitstream *bitstream metadataList.push_back(std::make_unique(dovi_nal, false, m_VideoOutputInfo.codec == RGY_CODEC_HEVC ? true : false)); } } else if (m_Mux.video.doviRpuMetadataCopy) { - auto doviRpuConvPrm = (m_Mux.video.doviProfileSrc != m_Mux.video.doviProfileDst) ? std::make_unique(m_Mux.video.doviProfileDst) : nullptr; + auto doviRpuConvPrm = (m_Mux.video.doviProfileSrc != m_Mux.video.doviProfileDst) ? std::make_unique(m_Mux.video.doviProfileDst, m_Mux.video.doviRpuActiveAreaOffsets.get()) : nullptr; auto [err_dovirpu, metadata_dovi_rpu] = getMetadata(RGY_FRAME_DATA_DOVIRPU, bs_framedata, doviRpuConvPrm.get()); if (err_dovirpu != RGY_ERR_NONE) { return err_dovirpu; diff --git a/QSVPipeline/rgy_output_avcodec.h b/QSVPipeline/rgy_output_avcodec.h index 33e8ac21..5efc9776 100644 --- a/QSVPipeline/rgy_output_avcodec.h +++ b/QSVPipeline/rgy_output_avcodec.h @@ -149,6 +149,7 @@ struct AVMuxVideo { RGYDOVIProfile doviProfileDst; //dovi profile output DOVIRpu *doviRpu; //dovi rpu 追加用 bool doviRpuMetadataCopy; //dovi rpuをコピー + std::unique_ptr doviRpuActiveAreaOffsets; //doviのactive_area_offsets AVBSFContext *bsfc; //必要なら使用するbitstreamfilter uint8_t *bsfcBuffer; //bitstreamfilter用のバッファ size_t bsfcBufferLength; //bitstreamfilter用のバッファの長さ @@ -401,6 +402,7 @@ struct AvcodecWriterPrm { DOVIRpu *doviRpu; //DOVIRpu bool doviRpuMetadataCopy; //doviのmetadataのコピー RGYDOVIProfile doviProfile; //doviのprofile + const RGYDOVIRpuActiveAreaOffsets *doviRpuActiveAreaOffsets; //doviのactive_area_offsets RGYTimestamp *vidTimestamp; //動画のtimestampの情報 std::string videoCodecTag; //動画タグ std::vector videoMetadata; //動画のmetadata @@ -443,6 +445,7 @@ struct AvcodecWriterPrm { doviRpu(nullptr), doviRpuMetadataCopy(false), doviProfile(RGY_DOVI_PROFILE_UNSET), + doviRpuActiveAreaOffsets(nullptr), vidTimestamp(nullptr), videoCodecTag(), videoMetadata(), diff --git a/QSVPipeline/rgy_prm.cpp b/QSVPipeline/rgy_prm.cpp index 9875a083..e369eed7 100644 --- a/QSVPipeline/rgy_prm.cpp +++ b/QSVPipeline/rgy_prm.cpp @@ -2270,6 +2270,7 @@ RGYParamCommon::RGYParamCommon() : doviRpuMetadataCopy(false), doviRpuFile(), doviProfile(RGY_DOVI_PROFILE_UNSET), + doviRpuActiveAreaOffsets(), videoCodecTag(), videoMetadata(), formatMetadata(), diff --git a/QSVPipeline/rgy_prm.h b/QSVPipeline/rgy_prm.h index d94e7e7a..6af6f8ee 100644 --- a/QSVPipeline/rgy_prm.h +++ b/QSVPipeline/rgy_prm.h @@ -2417,6 +2417,7 @@ struct RGYParamCommon { bool doviRpuMetadataCopy; tstring doviRpuFile; RGYDOVIProfile doviProfile; + std::unique_ptr doviRpuActiveAreaOffsets; std::string videoCodecTag; std::vector videoMetadata; std::vector formatMetadata; diff --git a/QSVPipeline/rgy_version.h b/QSVPipeline/rgy_version.h index 12a89e3a..cb0e11a1 100644 --- a/QSVPipeline/rgy_version.h +++ b/QSVPipeline/rgy_version.h @@ -31,9 +31,9 @@ #include "rgy_rev.h" -#define VER_FILEVERSION 0,7,73,0 -#define VER_STR_FILEVERSION "7.73" -#define VER_STR_FILEVERSION_TCHAR _T("7.73") +#define VER_FILEVERSION 0,7,74,0 +#define VER_STR_FILEVERSION "7.74" +#define VER_STR_FILEVERSION_TCHAR _T("7.74") #ifdef _M_IX86 #define BUILD_ARCH_STR _T("x86")