[FFmpeg-cvslog] vaapi_encode: Move quality option to common code
Mark Thompson
git at videolan.org
Sat Nov 11 05:51:30 EET 2017
ffmpeg | branch: master | Mark Thompson <sw at jkqxz.net> | Sun Apr 30 19:27:54 2017 +0100| [19388a7200e5d99c703271f05dba1c806720e808] | committer: Mark Thompson
vaapi_encode: Move quality option to common code
Use AVCodecContext.compression_level rather than a private option,
replacing the H.264-specific quality option (which stays only for
compatibility).
This now works with the H.265 encoder in the i965 driver, as well as
the existing cases with the H.264 encoder.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=19388a7200e5d99c703271f05dba1c806720e808
---
doc/encoders.texi | 9 ++++++---
libavcodec/vaapi_encode.c | 35 +++++++++++++++++++++++++++++++++++
libavcodec/vaapi_encode.h | 6 ++++++
libavcodec/vaapi_encode_h264.c | 25 ++-----------------------
4 files changed, 49 insertions(+), 26 deletions(-)
diff --git a/doc/encoders.texi b/doc/encoders.texi
index 7cebe39c18..c369e03bfd 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -948,7 +948,13 @@ The following standard libavcodec options are used:
@item
@option{rc_init_occupancy} / @option{rc_initial_buffer_occupancy}
@item
+ at option{compression_level}
+
+Speed / quality tradeoff: higher values are faster / worse quality.
+ at item
@option{q} / @option{global_quality}
+
+Size / quality tradeoff: higher values are smaller / worse quality.
@item
@option{qmin}
(only: @option{qmax} is not supported)
@@ -969,9 +975,6 @@ The following standard libavcodec options are used:
@option{level} sets the value of @emph{level_idc}.
@table @option
- at item quality
-Set the local encoding quality/speed tradeoff (range 1-8, higher values are faster; not all
-systems implement all levels).
@item low_power
Use low-power encoding mode.
@end table
diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index 6205184190..462ec7a8e7 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -1423,6 +1423,41 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
goto fail;
}
+ if (avctx->compression_level >= 0) {
+#if VA_CHECK_VERSION(0, 36, 0)
+ VAConfigAttrib attr = { VAConfigAttribEncQualityRange };
+
+ vas = vaGetConfigAttributes(ctx->hwctx->display,
+ ctx->va_profile,
+ ctx->va_entrypoint,
+ &attr, 1);
+ if (vas != VA_STATUS_SUCCESS) {
+ av_log(avctx, AV_LOG_WARNING, "Failed to query quality "
+ "attribute: will use default compression level.\n");
+ } else {
+ if (avctx->compression_level > attr.value) {
+ av_log(avctx, AV_LOG_WARNING, "Invalid compression "
+ "level: valid range is 0-%d, using %d.\n",
+ attr.value, attr.value);
+ avctx->compression_level = attr.value;
+ }
+
+ ctx->quality_params.misc.type =
+ VAEncMiscParameterTypeQualityLevel;
+ ctx->quality_params.quality.quality_level =
+ avctx->compression_level;
+
+ ctx->global_params[ctx->nb_global_params] =
+ &ctx->quality_params.misc;
+ ctx->global_params_size[ctx->nb_global_params++] =
+ sizeof(ctx->quality_params);
+ }
+#else
+ av_log(avctx, AV_LOG_WARNING, "The encode compression level "
+ "option is not supported with this VAAPI version.\n");
+#endif
+ }
+
ctx->input_order = 0;
ctx->output_delay = avctx->max_b_frames;
ctx->decode_delay = 1;
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
index fc62365148..1b0fed80e4 100644
--- a/libavcodec/vaapi_encode.h
+++ b/libavcodec/vaapi_encode.h
@@ -159,6 +159,12 @@ typedef struct VAAPIEncodeContext {
VAEncMiscParameterBuffer misc;
VAEncMiscParameterFrameRate fr;
} fr_params;
+#if VA_CHECK_VERSION(0, 36, 0)
+ struct {
+ VAEncMiscParameterBuffer misc;
+ VAEncMiscParameterBufferQualityLevel quality;
+ } quality_params;
+#endif
// Per-sequence parameter structure (VAEncSequenceParameterBuffer*).
void *codec_sequence_params;
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 7583a20c14..e08cf61167 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -154,14 +154,6 @@ typedef struct VAAPIEncodeH264Context {
// Rate control configuration.
int send_timing_sei;
-
-#if VA_CHECK_VERSION(0, 36, 0)
- // Speed-quality tradeoff setting.
- struct {
- VAEncMiscParameterBuffer misc;
- VAEncMiscParameterBufferQualityLevel quality;
- } quality_params;
-#endif
} VAAPIEncodeH264Context;
typedef struct VAAPIEncodeH264Options {
@@ -1141,21 +1133,8 @@ static av_cold int vaapi_encode_h264_configure(AVCodecContext *avctx)
av_assert0(0 && "Invalid RC mode.");
}
- if (opt->quality > 0) {
-#if VA_CHECK_VERSION(0, 36, 0)
- priv->quality_params.misc.type =
- VAEncMiscParameterTypeQualityLevel;
- priv->quality_params.quality.quality_level = opt->quality;
-
- ctx->global_params[ctx->nb_global_params] =
- &priv->quality_params.misc;
- ctx->global_params_size[ctx->nb_global_params++] =
- sizeof(priv->quality_params);
-#else
- av_log(avctx, AV_LOG_WARNING, "The encode quality option is not "
- "supported with this VAAPI version.\n");
-#endif
- }
+ if (avctx->compression_level == FF_COMPRESSION_DEFAULT)
+ avctx->compression_level = opt->quality;
return 0;
}
More information about the ffmpeg-cvslog
mailing list