From b9766bf5854c3875fbdf56384e4aac817ca66e45 Mon Sep 17 00:00:00 2001 From: Cobalt Space Date: Fri, 8 Oct 2021 19:38:02 -0700 Subject: [PATCH 1/2] add H.264 RGB export using libx264rgb --- app/codec/exportcodec.cpp | 3 +++ app/codec/exportcodec.h | 1 + app/codec/exportformat.cpp | 6 +++--- app/codec/ffmpeg/ffmpegencoder.cpp | 7 ++++++- app/dialog/export/exportvideotab.cpp | 18 ++++++++++-------- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/app/codec/exportcodec.cpp b/app/codec/exportcodec.cpp index bb2834ecb..947f9da63 100644 --- a/app/codec/exportcodec.cpp +++ b/app/codec/exportcodec.cpp @@ -34,6 +34,8 @@ QString ExportCodec::GetCodecName(ExportCodec::Codec c) return tr("DNxHD"); case kCodecH264: return tr("H.264"); + case kCodecH264rgb: + return tr("H.264 RGB"); case kCodecH265: return tr("H.265"); case kCodecOpenEXR: @@ -74,6 +76,7 @@ bool ExportCodec::IsCodecAStillImage(ExportCodec::Codec c) switch (c) { case kCodecDNxHD: case kCodecH264: + case kCodecH264rgb: case kCodecH265: case kCodecProRes: case kCodecMP2: diff --git a/app/codec/exportcodec.h b/app/codec/exportcodec.h index 1a2cb3c05..1b5d1df47 100644 --- a/app/codec/exportcodec.h +++ b/app/codec/exportcodec.h @@ -37,6 +37,7 @@ public: // Video codecs kCodecDNxHD, kCodecH264, + kCodecH264rgb, kCodecH265, kCodecOpenEXR, kCodecPNG, diff --git a/app/codec/exportformat.cpp b/app/codec/exportformat.cpp index 3b53371e0..af1b9fda8 100644 --- a/app/codec/exportformat.cpp +++ b/app/codec/exportformat.cpp @@ -107,7 +107,7 @@ QList ExportFormat::GetVideoCodecs(ExportFormat::Format f) case kFormatDNxHD: return {ExportCodec::kCodecDNxHD}; case kFormatMatroska: - return {ExportCodec::kCodecH264, ExportCodec::kCodecH265}; + return {ExportCodec::kCodecH264, ExportCodec::kCodecH264rgb, ExportCodec::kCodecH265, ExportCodec::kCodecVP9}; case kFormatMPEG4: return {ExportCodec::kCodecH264, ExportCodec::kCodecH265}; case kFormatOpenEXR: @@ -117,7 +117,7 @@ QList ExportFormat::GetVideoCodecs(ExportFormat::Format f) case kFormatTIFF: return {ExportCodec::kCodecTIFF}; case kFormatQuickTime: - return {ExportCodec::kCodecH264, ExportCodec::kCodecH265, ExportCodec::kCodecProRes}; + return {ExportCodec::kCodecH264, ExportCodec::kCodecH264rgb, ExportCodec::kCodecH265, ExportCodec::kCodecProRes}; case kFormatWebM: return {ExportCodec::kCodecVP9}; case kFormatOgg: @@ -140,7 +140,7 @@ QList ExportFormat::GetAudioCodecs(ExportFormat::Format f) case kFormatDNxHD: return {ExportCodec::kCodecPCM}; case kFormatMatroska: - return {ExportCodec::kCodecAAC, ExportCodec::kCodecMP2, ExportCodec::kCodecMP3, ExportCodec::kCodecPCM, ExportCodec::kCodecVorbis, ExportCodec::kCodecOpus}; + return {ExportCodec::kCodecAAC, ExportCodec::kCodecMP2, ExportCodec::kCodecMP3, ExportCodec::kCodecPCM, ExportCodec::kCodecVorbis, ExportCodec::kCodecOpus, ExportCodec::kCodecFLAC}; case kFormatMPEG4: return {ExportCodec::kCodecAAC, ExportCodec::kCodecMP2, ExportCodec::kCodecMP3}; case kFormatQuickTime: diff --git a/app/codec/ffmpeg/ffmpegencoder.cpp b/app/codec/ffmpeg/ffmpegencoder.cpp index 2fab82435..c4cf3c33b 100644 --- a/app/codec/ffmpeg/ffmpegencoder.cpp +++ b/app/codec/ffmpeg/ffmpegencoder.cpp @@ -56,6 +56,9 @@ QStringList FFmpegEncoder::GetPixelFormatsForCodec(ExportCodec::Codec c) const case ExportCodec::kCodecH264: codec_info = avcodec_find_encoder(AV_CODEC_ID_H264); break; + case ExportCodec::kCodecH264rgb: + codec_info = avcodec_find_decoder_by_name("libx264rgb"); + break; case ExportCodec::kCodecDNxHD: codec_info = avcodec_find_encoder(AV_CODEC_ID_DNXHD); break; @@ -624,6 +627,7 @@ bool FFmpegEncoder::InitializeStream(AVMediaType type, AVStream** stream_ptr, AV codec_id = AV_CODEC_ID_MP3; break; case ExportCodec::kCodecH264: + case ExportCodec::kCodecH264rgb: codec_id = AV_CODEC_ID_H264; break; case ExportCodec::kCodecH265: @@ -669,7 +673,8 @@ bool FFmpegEncoder::InitializeStream(AVMediaType type, AVStream** stream_ptr, AV } // Find encoder with this name - AVCodec* encoder = avcodec_find_encoder(codec_id); + AVCodec* encoder = + codec == ExportCodec::kCodecH264rgb ? avcodec_find_encoder_by_name("libx264rgb") : avcodec_find_encoder(codec_id); if (!encoder) { SetError(tr("Failed to find codec for %1").arg(codec)); diff --git a/app/dialog/export/exportvideotab.cpp b/app/dialog/export/exportvideotab.cpp index 7aa6844fe..f8908cea3 100644 --- a/app/dialog/export/exportvideotab.cpp +++ b/app/dialog/export/exportvideotab.cpp @@ -232,14 +232,16 @@ void ExportVideoTab::VideoCodecChanged() { ExportCodec::Codec codec = GetSelectedCodec(); - if (codec == ExportCodec::kCodecH264) { - SetCodecSection(h264_section_); - } else if (codec == ExportCodec::kCodecH265) { - SetCodecSection(h265_section_); - } else if (ExportCodec::IsCodecAStillImage(codec)) { - SetCodecSection(image_section_); - } else { - SetCodecSection(nullptr); + switch (codec) { + case ExportCodec::kCodecH264: + case ExportCodec::kCodecH264rgb: + SetCodecSection(h264_section_); + break; + case ExportCodec::kCodecH265: + SetCodecSection(h265_section_); + break; + default: + SetCodecSection(ExportCodec::IsCodecAStillImage(codec) ? image_section_ : nullptr); } // Set default pixel format From 8a9193288903c086417420a6f02ed42ea1f1b658 Mon Sep 17 00:00:00 2001 From: Cobalt Space Date: Fri, 22 Oct 2021 15:34:35 -0700 Subject: [PATCH 2/2] use encoder, not decoder, and add to mpeg4 --- app/codec/exportformat.cpp | 2 +- app/codec/ffmpeg/ffmpegencoder.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/codec/exportformat.cpp b/app/codec/exportformat.cpp index af1b9fda8..e89110142 100644 --- a/app/codec/exportformat.cpp +++ b/app/codec/exportformat.cpp @@ -109,7 +109,7 @@ QList ExportFormat::GetVideoCodecs(ExportFormat::Format f) case kFormatMatroska: return {ExportCodec::kCodecH264, ExportCodec::kCodecH264rgb, ExportCodec::kCodecH265, ExportCodec::kCodecVP9}; case kFormatMPEG4: - return {ExportCodec::kCodecH264, ExportCodec::kCodecH265}; + return {ExportCodec::kCodecH264, ExportCodec::kCodecH264rgb, ExportCodec::kCodecH265}; case kFormatOpenEXR: return {ExportCodec::kCodecOpenEXR}; case kFormatPNG: diff --git a/app/codec/ffmpeg/ffmpegencoder.cpp b/app/codec/ffmpeg/ffmpegencoder.cpp index c4cf3c33b..eddf9a513 100644 --- a/app/codec/ffmpeg/ffmpegencoder.cpp +++ b/app/codec/ffmpeg/ffmpegencoder.cpp @@ -57,7 +57,7 @@ QStringList FFmpegEncoder::GetPixelFormatsForCodec(ExportCodec::Codec c) const codec_info = avcodec_find_encoder(AV_CODEC_ID_H264); break; case ExportCodec::kCodecH264rgb: - codec_info = avcodec_find_decoder_by_name("libx264rgb"); + codec_info = avcodec_find_encoder_by_name("libx264rgb"); break; case ExportCodec::kCodecDNxHD: codec_info = avcodec_find_encoder(AV_CODEC_ID_DNXHD);