History

lavc/qsvenc: update the selection of bitrate control method

The default method is changed to CQP

Haihao Xiang committed 2 years ago

Commit d263fce1 parent 57fbe928 files · +54 −25Browse files

Unified · Split

8 files
  1. Changelog +1 −0
  2. doc/encoders.texi +5 −2
  3. libavcodec/qsvenc.c +43 −18
  4. libavcodec/qsvenc_av1.c +1 −1
  5. libavcodec/qsvenc_h264.c +1 −1
  6. libavcodec/qsvenc_hevc.c +1 −1
  7. libavcodec/qsvenc_mpeg2.c +1 −1
  8. libavcodec/qsvenc_vp9.c +1 −1
Changelog+1−0
@@ -27,6 +27,7 @@ version <next>: · 26 unmodified lines
2727 - a C11-compliant compiler is now required; note that this requirement
2828 will be bumped to C17 in the near future, so consider updating your
2929 build environment if it lacks C17 support
30+- Change the default bitrate control method from VBR to CQP for QSV encoders.
3031
3132 version 6.1:
3233 - libaribcaption decoder
doc/encoders.texi+5−2
@@ -3338,8 +3338,8 @@ quality range is 1 to 51, with 1 being the best quality. · 3337 unmodified lines
33383338 @end itemize
33393339
33403340 @item
3341−Otherwise, a bitrate-based mode is used. For all of those, you should specify at
3342−least the desired average bitrate with the @option{b} option.
3341+Otherwise when the desired average bitrate is specified with the @option{b}
3342+option, a bitrate-based mode is used.
33433343 @itemize @minus
33443344 @item
33453345 @var{LA} - VBR with lookahead, when the @option{look_ahead} option is specified.
@@ -3360,6 +3360,9 @@ than the average bitrate. · 14 unmodified lines
33603360 @option{avbr_accuracy} and @option{avbr_convergence} are set to non-zero. This
33613361 mode is available for H264 and HEVC on Windows.
33623362 @end itemize
3363+
3364+@item
3365+Otherwise the default ratecontrol method @var{CQP} is used.
33633366 @end itemize
33643367
33653368 Note that depending on your system, a different mode than the one you specified
libavcodec/qsvenc.c+43−18
@@ -597,6 +597,13 @@ static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q) · 596 unmodified lines
597597 else if (want_vcm) {
598598 rc_mode = MFX_RATECONTROL_VCM;
599599 rc_desc = "video conferencing mode (VCM)";
600+
601+ if (!avctx->bit_rate) {
602+ av_log(avctx, AV_LOG_ERROR, "Using the %s ratecontrol method without "
603+ "setting bitrate. Please use the b option to set the desired "
604+ "bitrate.\n", rc_desc);
605+ return AVERROR(EINVAL);
606+ }
600607 }
601608 #endif
602609 else if (want_la) {
@@ -606,32 +613,50 @@ static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q) · 3 unmodified lines
606613 if (avctx->global_quality > 0) {
607614 rc_mode = MFX_RATECONTROL_LA_ICQ;
608615 rc_desc = "intelligent constant quality with lookahead (LA_ICQ)";
616+ } else if (!avctx->bit_rate) {
617+ av_log(avctx, AV_LOG_ERROR, "Using the %s ratecontrol method without "
618+ "setting bitrate. Please use the b option to set the desired "
619+ "bitrate.\n", rc_desc);
620+ return AVERROR(EINVAL);
609621 }
610622 }
611623 else if (avctx->global_quality > 0 && !avctx->rc_max_rate) {
612624 rc_mode = MFX_RATECONTROL_ICQ;
613625 rc_desc = "intelligent constant quality (ICQ)";
614626 }
615− else if (avctx->rc_max_rate == avctx->bit_rate) {
616− rc_mode = MFX_RATECONTROL_CBR;
617− rc_desc = "constant bitrate (CBR)";
618− }
627+ else if (avctx->bit_rate) {
628+ if (avctx->rc_max_rate == avctx->bit_rate) {
629+ rc_mode = MFX_RATECONTROL_CBR;
630+ rc_desc = "constant bitrate (CBR)";
631+ }
619632 #if QSV_HAVE_AVBR
620− else if (!avctx->rc_max_rate &&
621− (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_HEVC) &&
622− q->avbr_accuracy &&
623− q->avbr_convergence) {
624− rc_mode = MFX_RATECONTROL_AVBR;
625− rc_desc = "average variable bitrate (AVBR)";
626− }
633+ else if (!avctx->rc_max_rate &&
634+ (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_HEVC) &&
635+ q->avbr_accuracy &&
636+ q->avbr_convergence) {
637+ rc_mode = MFX_RATECONTROL_AVBR;
638+ rc_desc = "average variable bitrate (AVBR)";
639+ }
627640 #endif
628− else if (avctx->global_quality > 0) {
629− rc_mode = MFX_RATECONTROL_QVBR;
630− rc_desc = "constant quality with VBR algorithm (QVBR)";
631− }
632− else {
633− rc_mode = MFX_RATECONTROL_VBR;
634− rc_desc = "variable bitrate (VBR)";
641+ else if (avctx->global_quality > 0) {
642+ rc_mode = MFX_RATECONTROL_QVBR;
643+ rc_desc = "constant quality with VBR algorithm (QVBR)";
644+ } else {
645+ rc_mode = MFX_RATECONTROL_VBR;
646+ rc_desc = "variable bitrate (VBR)";
647+ }
648+ } else {
649+ rc_mode = MFX_RATECONTROL_CQP;
650+ rc_desc = "constant quantization parameter (CQP)";
651+ if (avctx->codec_id == AV_CODEC_ID_AV1)
652+ avctx->global_quality = FF_QP2LAMBDA * 128;
653+ else
654+ avctx->global_quality = FF_QP2LAMBDA * 26;
655+ av_log(avctx, AV_LOG_WARNING, "Using the constant quantization "
656+ "parameter (CQP) by default. Please use the global_quality "
657+ "option and other options for a quality-based mode or the b "
658+ "option and other options for a bitrate-based mode if the "
659+ "default is not the desired choice.\n");
635660 }
636661
637662 q->param.mfx.RateControlMethod = rc_mode;
libavcodec/qsvenc_av1.c+1−1
@@ -129,7 +129,7 @@ static const AVClass class = { · 128 unmodified lines
129129 };
130130
131131 static const FFCodecDefault qsv_enc_defaults[] = {
132− { "b", "1M" },
132+ { "b", "0" },
133133 { "g", "-1" },
134134 { "bf", "-1" },
135135 { "refs", "0" },
libavcodec/qsvenc_h264.c+1−1
@@ -178,7 +178,7 @@ static const AVClass class = { · 177 unmodified lines
178178 };
179179
180180 static const FFCodecDefault qsv_enc_defaults[] = {
181− { "b", "1M" },
181+ { "b", "0" },
182182 { "refs", "0" },
183183 { "g", "-1" },
184184 { "bf", "-1" },
libavcodec/qsvenc_hevc.c+1−1
@@ -374,7 +374,7 @@ static const AVClass class = { · 373 unmodified lines
374374 };
375375
376376 static const FFCodecDefault qsv_enc_defaults[] = {
377− { "b", "1M" },
377+ { "b", "0" },
378378 { "refs", "0" },
379379 { "g", "248" },
380380 { "bf", "-1" },
libavcodec/qsvenc_mpeg2.c+1−1
@@ -82,7 +82,7 @@ static const AVClass class = { · 81 unmodified lines
8282 };
8383
8484 static const FFCodecDefault qsv_enc_defaults[] = {
85− { "b", "1M" },
85+ { "b", "0" },
8686 { "refs", "0" },
8787 // same as the x264 default
8888 { "g", "250" },
libavcodec/qsvenc_vp9.c+1−1
@@ -93,7 +93,7 @@ static const AVClass class = { · 92 unmodified lines
9393 };
9494
9595 static const FFCodecDefault qsv_enc_defaults[] = {
96− { "b", "1M" },
96+ { "b", "0" },
9797 { "refs", "0" },
9898 { "g", "250" },
9999 { "trellis", "-1" },

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t