From f4b40a4e7749f0d45ff850928ca935d9e6c99682 Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Thu, 4 Jun 2020 08:28:33 -0700 Subject: [PATCH 1/8] Improvements to handling of new codecs --- src/FFmpegWriter.cpp | 61 +++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index e6a7e5ef..9b348aed 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -479,15 +479,6 @@ void FFmpegWriter::SetOption(StreamType stream, std::string name, std::string va case AV_CODEC_ID_AV1 : c->bit_rate = 0; av_opt_set_int(c->priv_data, "crf", std::min(std::stoi(value),63), 0); - if (strstr(info.vcodec.c_str(), "svt_av1") != NULL) { - av_opt_set_int(c->priv_data, "preset", 6, 0); - av_opt_set_int(c->priv_data, "forced-idr",1,0); - } - if (strstr(info.vcodec.c_str(), "rav1e") != NULL) { - av_opt_set_int(c->priv_data, "speed", 7, 0); - av_opt_set_int(c->priv_data, "tile-rows", 2, 0); - av_opt_set_int(c->priv_data, "tile-columns", 4, 0); - } break; #endif case AV_CODEC_ID_VP8 : @@ -547,24 +538,17 @@ void FFmpegWriter::SetOption(StreamType stream, std::string name, std::string va c->bit_rate = 0; if (strstr(info.vcodec.c_str(), "svt_av1") != NULL) { av_opt_set_int(c->priv_data, "qp", std::min(std::stoi(value),63), 0); - av_opt_set_int(c->priv_data, "preset", 6, 0); - av_opt_set_int(c->priv_data, "forced-idr",1,0); } else if (strstr(info.vcodec.c_str(), "rav1e") != NULL) { // Set number of tiles to a fixed value // TODO Let user choose number of tiles av_opt_set_int(c->priv_data, "qp", std::min(std::stoi(value),255), 0); - av_opt_set_int(c->priv_data, "speed", 7, 0); - av_opt_set_int(c->priv_data, "tile-rows", 2, 0); // number of rows - av_opt_set_int(c->priv_data, "tile-columns", 4, 0); // number of columns } else if (strstr(info.vcodec.c_str(), "aom") != NULL) { // Set number of tiles to a fixed value // TODO Let user choose number of tiles // libaom doesn't have qp only crf av_opt_set_int(c->priv_data, "crf", std::min(std::stoi(value),63), 0); - av_opt_set_int(c->priv_data, "tile-rows", 1, 0); // log2 of number of rows - av_opt_set_int(c->priv_data, "tile-columns", 2, 0); // log2 of number of columns } else { av_opt_set_int(c->priv_data, "crf", std::min(std::stoi(value),63), 0); @@ -1222,7 +1206,11 @@ AVStream *FFmpegWriter::add_video_stream() { #endif /* Init video encoder options */ - if (info.video_bit_rate >= 1000) { + if (info.video_bit_rate >= 1000 +#if (LIBAVCODEC_VERSION_MAJOR >= 58) + && c->codec_id != AV_CODEC_ID_AV1 +#endif + ) { c->bit_rate = info.video_bit_rate; if (info.video_bit_rate >= 1500000) { c->qmin = 2; @@ -1231,11 +1219,48 @@ AVStream *FFmpegWriter::add_video_stream() { // Here should be the setting for low fixed bitrate // Defaults are used because mpeg2 otherwise had problems } else { - // Check if codec supports crf + // Check if codec supports crf or qp switch (c->codec_id) { #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(55, 39, 101) #if (LIBAVCODEC_VERSION_MAJOR >= 58) case AV_CODEC_ID_AV1 : + // TODO: + // set crf or qp according to bitrate as bitrate is not supported by + // these encoders (yet) + if (info.video_bit_rate >= 1000) { + c->bit_rate = 0; + if (strstr(info.vcodec.c_str(), "aom") != NULL) { + int calculated_quality = 35; + if (info.video_bit_rate < 500000) calculated_quality = 50; + if (info.video_bit_rate > 5000000) calculated_quality = 10; + av_opt_set_int(c->priv_data, "crf", calculated_quality, 0); + info.video_bit_rate = calculated_quality; + } else { + int calculated_quality = 50; + if (info.video_bit_rate < 500000) calculated_quality = 60; + if (info.video_bit_rate > 5000000) calculated_quality = 15; + av_opt_set_int(c->priv_data, "qp", calculated_quality, 0); + info.video_bit_rate = calculated_quality; + } // medium + } + if (strstr(info.vcodec.c_str(), "svt_av1") != NULL) { + av_opt_set_int(c->priv_data, "preset", 6, 0); + av_opt_set_int(c->priv_data, "forced-idr",1,0); + } + else if (strstr(info.vcodec.c_str(), "rav1e") != NULL) { + av_opt_set_int(c->priv_data, "speed", 7, 0); + av_opt_set_int(c->priv_data, "tile-rows", 2, 0); + av_opt_set_int(c->priv_data, "tile-columns", 4, 0); + } + else if (strstr(info.vcodec.c_str(), "aom") != NULL) { + // Set number of tiles to a fixed value + // TODO Let user choose number of tiles + av_opt_set_int(c->priv_data, "tile-rows", 1, 0); // log2 of number of rows + av_opt_set_int(c->priv_data, "tile-columns", 2, 0); // log2 of number of columns + av_opt_set_int(c->priv_data, "row-mt", 1, 0); // use multiple cores + av_opt_set_int(c->priv_data, "cpu-used", 3, 0); // default is 1, usable is 4 + } + //break; #endif case AV_CODEC_ID_VP9 : case AV_CODEC_ID_HEVC : From 4e2c08db88f30a195836998aa62f05b7713c819f Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Mon, 15 Jun 2020 14:02:26 -0700 Subject: [PATCH 2/8] Update src/FFmpegWriter.cpp Thanks for fixing that Co-authored-by: Jonathan Thomas --- src/FFmpegWriter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index 9b348aed..058b7490 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -1254,7 +1254,7 @@ AVStream *FFmpegWriter::add_video_stream() { } else if (strstr(info.vcodec.c_str(), "aom") != NULL) { // Set number of tiles to a fixed value - // TODO Let user choose number of tiles + // TODO: Allow user to chose their own number of tiles av_opt_set_int(c->priv_data, "tile-rows", 1, 0); // log2 of number of rows av_opt_set_int(c->priv_data, "tile-columns", 2, 0); // log2 of number of columns av_opt_set_int(c->priv_data, "row-mt", 1, 0); // use multiple cores From 91647e6d0b702fecec9e653ef342a220aa6d9935 Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Mon, 15 Jun 2020 14:03:29 -0700 Subject: [PATCH 3/8] Update src/FFmpegWriter.cpp Perfect. I forgot that comment. Co-authored-by: Jonathan Thomas --- src/FFmpegWriter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index 058b7490..831db284 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -478,6 +478,7 @@ void FFmpegWriter::SetOption(StreamType stream, std::string name, std::string va #if (LIBAVCODEC_VERSION_MAJOR >= 58) case AV_CODEC_ID_AV1 : c->bit_rate = 0; + // AV1 only supports "crf" quality values av_opt_set_int(c->priv_data, "crf", std::min(std::stoi(value),63), 0); break; #endif From 2491d402df29ab7a91820acc6239f5477346b12a Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Mon, 15 Jun 2020 14:04:49 -0700 Subject: [PATCH 4/8] Update src/FFmpegWriter.cpp I should take more care of the comments. Co-authored-by: Jonathan Thomas --- src/FFmpegWriter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index 831db284..7ad2eb17 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -1225,7 +1225,7 @@ AVStream *FFmpegWriter::add_video_stream() { #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(55, 39, 101) #if (LIBAVCODEC_VERSION_MAJOR >= 58) case AV_CODEC_ID_AV1 : - // TODO: + // TODO: Set `crf` or `qp` according to bitrate, as bitrate is not supported by these encoders yet. // set crf or qp according to bitrate as bitrate is not supported by // these encoders (yet) if (info.video_bit_rate >= 1000) { From bf0e700ae7ffb0370cc3f7721cb2e9a18c36c5b6 Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Mon, 15 Jun 2020 14:05:43 -0700 Subject: [PATCH 5/8] Update src/FFmpegWriter.cpp Co-authored-by: Jonathan Thomas --- src/FFmpegWriter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index 7ad2eb17..c35edcb4 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -1226,7 +1226,6 @@ AVStream *FFmpegWriter::add_video_stream() { #if (LIBAVCODEC_VERSION_MAJOR >= 58) case AV_CODEC_ID_AV1 : // TODO: Set `crf` or `qp` according to bitrate, as bitrate is not supported by these encoders yet. - // set crf or qp according to bitrate as bitrate is not supported by // these encoders (yet) if (info.video_bit_rate >= 1000) { c->bit_rate = 0; From c037d5c01df664bb41e22a00571a900c1512fa76 Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Mon, 15 Jun 2020 14:07:09 -0700 Subject: [PATCH 6/8] Update src/FFmpegWriter.cpp We might want to leave some kind of comment though. The encoders will (probably) get these options (soon). Co-authored-by: Jonathan Thomas --- src/FFmpegWriter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index c35edcb4..291ba848 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -1226,7 +1226,6 @@ AVStream *FFmpegWriter::add_video_stream() { #if (LIBAVCODEC_VERSION_MAJOR >= 58) case AV_CODEC_ID_AV1 : // TODO: Set `crf` or `qp` according to bitrate, as bitrate is not supported by these encoders yet. - // these encoders (yet) if (info.video_bit_rate >= 1000) { c->bit_rate = 0; if (strstr(info.vcodec.c_str(), "aom") != NULL) { From 3dfcea1dd527d63b1c93dd0251a0723f4f88e4b5 Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Mon, 15 Jun 2020 14:33:14 -0700 Subject: [PATCH 7/8] Fix indentation --- src/FFmpegWriter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index 291ba848..cb1c326d 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -1225,7 +1225,7 @@ AVStream *FFmpegWriter::add_video_stream() { #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(55, 39, 101) #if (LIBAVCODEC_VERSION_MAJOR >= 58) case AV_CODEC_ID_AV1 : - // TODO: Set `crf` or `qp` according to bitrate, as bitrate is not supported by these encoders yet. + // TODO: Set `crf` or `qp` according to bitrate, as bitrate is not supported by these encoders yet. if (info.video_bit_rate >= 1000) { c->bit_rate = 0; if (strstr(info.vcodec.c_str(), "aom") != NULL) { From 056a72fa17fadaa7a263ffbfa0100b02dc210de8 Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Mon, 15 Jun 2020 14:41:38 -0700 Subject: [PATCH 8/8] Fix indentation (2) --- src/FFmpegWriter.cpp | 76 ++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index cb1c326d..741f2f26 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -542,12 +542,12 @@ void FFmpegWriter::SetOption(StreamType stream, std::string name, std::string va } else if (strstr(info.vcodec.c_str(), "rav1e") != NULL) { // Set number of tiles to a fixed value - // TODO Let user choose number of tiles + // TODO Let user choose number of tiles av_opt_set_int(c->priv_data, "qp", std::min(std::stoi(value),255), 0); } else if (strstr(info.vcodec.c_str(), "aom") != NULL) { // Set number of tiles to a fixed value - // TODO Let user choose number of tiles + // TODO Let user choose number of tiles // libaom doesn't have qp only crf av_opt_set_int(c->priv_data, "crf", std::min(std::stoi(value),63), 0); } @@ -1207,10 +1207,10 @@ AVStream *FFmpegWriter::add_video_stream() { #endif /* Init video encoder options */ - if (info.video_bit_rate >= 1000 + if (info.video_bit_rate >= 1000 #if (LIBAVCODEC_VERSION_MAJOR >= 58) && c->codec_id != AV_CODEC_ID_AV1 -#endif +#endif ) { c->bit_rate = info.video_bit_rate; if (info.video_bit_rate >= 1500000) { @@ -1226,40 +1226,40 @@ AVStream *FFmpegWriter::add_video_stream() { #if (LIBAVCODEC_VERSION_MAJOR >= 58) case AV_CODEC_ID_AV1 : // TODO: Set `crf` or `qp` according to bitrate, as bitrate is not supported by these encoders yet. - if (info.video_bit_rate >= 1000) { - c->bit_rate = 0; - if (strstr(info.vcodec.c_str(), "aom") != NULL) { - int calculated_quality = 35; - if (info.video_bit_rate < 500000) calculated_quality = 50; - if (info.video_bit_rate > 5000000) calculated_quality = 10; - av_opt_set_int(c->priv_data, "crf", calculated_quality, 0); - info.video_bit_rate = calculated_quality; - } else { - int calculated_quality = 50; - if (info.video_bit_rate < 500000) calculated_quality = 60; - if (info.video_bit_rate > 5000000) calculated_quality = 15; - av_opt_set_int(c->priv_data, "qp", calculated_quality, 0); - info.video_bit_rate = calculated_quality; - } // medium - } - if (strstr(info.vcodec.c_str(), "svt_av1") != NULL) { - av_opt_set_int(c->priv_data, "preset", 6, 0); - av_opt_set_int(c->priv_data, "forced-idr",1,0); - } - else if (strstr(info.vcodec.c_str(), "rav1e") != NULL) { - av_opt_set_int(c->priv_data, "speed", 7, 0); - av_opt_set_int(c->priv_data, "tile-rows", 2, 0); - av_opt_set_int(c->priv_data, "tile-columns", 4, 0); - } - else if (strstr(info.vcodec.c_str(), "aom") != NULL) { - // Set number of tiles to a fixed value - // TODO: Allow user to chose their own number of tiles - av_opt_set_int(c->priv_data, "tile-rows", 1, 0); // log2 of number of rows - av_opt_set_int(c->priv_data, "tile-columns", 2, 0); // log2 of number of columns - av_opt_set_int(c->priv_data, "row-mt", 1, 0); // use multiple cores - av_opt_set_int(c->priv_data, "cpu-used", 3, 0); // default is 1, usable is 4 - } - //break; + if (info.video_bit_rate >= 1000) { + c->bit_rate = 0; + if (strstr(info.vcodec.c_str(), "aom") != NULL) { + int calculated_quality = 35; + if (info.video_bit_rate < 500000) calculated_quality = 50; + if (info.video_bit_rate > 5000000) calculated_quality = 10; + av_opt_set_int(c->priv_data, "crf", calculated_quality, 0); + info.video_bit_rate = calculated_quality; + } else { + int calculated_quality = 50; + if (info.video_bit_rate < 500000) calculated_quality = 60; + if (info.video_bit_rate > 5000000) calculated_quality = 15; + av_opt_set_int(c->priv_data, "qp", calculated_quality, 0); + info.video_bit_rate = calculated_quality; + } // medium + } + if (strstr(info.vcodec.c_str(), "svt_av1") != NULL) { + av_opt_set_int(c->priv_data, "preset", 6, 0); + av_opt_set_int(c->priv_data, "forced-idr",1,0); + } + else if (strstr(info.vcodec.c_str(), "rav1e") != NULL) { + av_opt_set_int(c->priv_data, "speed", 7, 0); + av_opt_set_int(c->priv_data, "tile-rows", 2, 0); + av_opt_set_int(c->priv_data, "tile-columns", 4, 0); + } + else if (strstr(info.vcodec.c_str(), "aom") != NULL) { + // Set number of tiles to a fixed value + // TODO: Allow user to chose their own number of tiles + av_opt_set_int(c->priv_data, "tile-rows", 1, 0); // log2 of number of rows + av_opt_set_int(c->priv_data, "tile-columns", 2, 0); // log2 of number of columns + av_opt_set_int(c->priv_data, "row-mt", 1, 0); // use multiple cores + av_opt_set_int(c->priv_data, "cpu-used", 3, 0); // default is 1, usable is 4 + } + //break; #endif case AV_CODEC_ID_VP9 : case AV_CODEC_ID_HEVC :