From 6675bba6ab7d5cee50fa4d8c892af69d054c6804 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 24 Jun 2024 23:01:13 +0200 Subject: [PATCH] Add ProRes LT export option (#2834). --- src/lib/export_config.cc | 6 +++++- src/lib/ffmpeg_file_encoder.cc | 8 ++++++++ src/lib/ffmpeg_file_encoder.h | 1 + src/wx/export_video_file_dialog.cc | 7 ++++++- test/ffmpeg_encoder_test.cc | 4 ++++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/lib/export_config.cc b/src/lib/export_config.cc index 4dfbb9027..79042e59c 100644 --- a/src/lib/export_config.cc +++ b/src/lib/export_config.cc @@ -65,6 +65,8 @@ ExportConfig::read(cxml::ConstNodePtr node) _format = ExportFormat::H264_AAC; } else if (format == "prores-4444") { _format = ExportFormat::PRORES_4444; + } else if (format == "prores-lt") { + _format = ExportFormat::PRORES_LT; } else { _format = ExportFormat::PRORES_HQ; } @@ -89,6 +91,9 @@ ExportConfig::write(xmlpp::Element* element) const /* Write this but we also accept 'prores' for backwards compatibility */ name = "prores-hq"; break; + case ExportFormat::PRORES_LT: + name = "prores-lt"; + break; case ExportFormat::H264_AAC: name = "h264-aac"; break; @@ -138,4 +143,3 @@ ExportConfig::set_x264_crf(int crf) { _config->maybe_set(_x264_crf, crf); } - diff --git a/src/lib/ffmpeg_file_encoder.cc b/src/lib/ffmpeg_file_encoder.cc index 4547a8e8e..dfc0205ac 100644 --- a/src/lib/ffmpeg_file_encoder.cc +++ b/src/lib/ffmpeg_file_encoder.cc @@ -241,6 +241,13 @@ FFmpegFileEncoder::FFmpegFileEncoder ( av_dict_set (&_video_options, "profile", "3", 0); av_dict_set (&_video_options, "threads", "auto", 0); break; + case ExportFormat::PRORES_LT: + _sample_format = AV_SAMPLE_FMT_S32; + _video_codec_name = "prores_ks"; + _audio_codec_name = "pcm_s24le"; + av_dict_set(&_video_options, "profile", "1", 0); + av_dict_set(&_video_options, "threads", "auto", 0); + break; case ExportFormat::H264_AAC: _sample_format = AV_SAMPLE_FMT_FLTP; _video_codec_name = "libx264"; @@ -292,6 +299,7 @@ FFmpegFileEncoder::pixel_format (ExportFormat format) case ExportFormat::PRORES_4444: return AV_PIX_FMT_YUV444P10; case ExportFormat::PRORES_HQ: + case ExportFormat::PRORES_LT: return AV_PIX_FMT_YUV422P10; case ExportFormat::H264_AAC: return AV_PIX_FMT_YUV420P; diff --git a/src/lib/ffmpeg_file_encoder.h b/src/lib/ffmpeg_file_encoder.h index 907eca53d..a365f463a 100644 --- a/src/lib/ffmpeg_file_encoder.h +++ b/src/lib/ffmpeg_file_encoder.h @@ -48,6 +48,7 @@ enum class ExportFormat { PRORES_4444, PRORES_HQ, + PRORES_LT, H264_AAC, SUBTITLES_DCP }; diff --git a/src/wx/export_video_file_dialog.cc b/src/wx/export_video_file_dialog.cc index 611985602..6e32a8514 100644 --- a/src/wx/export_video_file_dialog.cc +++ b/src/wx/export_video_file_dialog.cc @@ -22,6 +22,7 @@ #include "check_box.h" #include "export_video_file_dialog.h" #include "file_picker_ctrl.h" +#include "lib/ffmpeg_file_encoder.h" #include "wx_util.h" #include "lib/config.h" #include @@ -35,22 +36,25 @@ using std::string; using boost::bind; -int constexpr FORMATS = 3; +int constexpr FORMATS = 4; wxString format_names[] = { _("MOV / ProRes 4444"), _("MOV / ProRes HQ"), + _("MOV / ProRes LT"), _("MP4 / H.264"), }; wxString format_filters[] = { + _("MOV files (*.mov)|*.mov"), _("MOV files (*.mov)|*.mov"), _("MOV files (*.mov)|*.mov"), _("MP4 files (*.mp4)|*.mp4"), }; wxString format_extensions[] = { + "mov", "mov", "mov", "mp4", @@ -59,6 +63,7 @@ wxString format_extensions[] = { ExportFormat formats[] = { ExportFormat::PRORES_4444, ExportFormat::PRORES_HQ, + ExportFormat::PRORES_LT, ExportFormat::H264_AAC, }; diff --git a/test/ffmpeg_encoder_test.cc b/test/ffmpeg_encoder_test.cc index b42ff92d8..0a48cd745 100644 --- a/test/ffmpeg_encoder_test.cc +++ b/test/ffmpeg_encoder_test.cc @@ -69,6 +69,10 @@ ffmpeg_content_test (int number, boost::filesystem::path content, ExportFormat f name += "prores-hq"; extension = "mov"; break; + case ExportFormat::PRORES_LT: + name += "prores-lt"; + extension = "mov"; + break; case ExportFormat::SUBTITLES_DCP: BOOST_REQUIRE (false); } -- 2.30.2