[FFmpeg-cvslog] vaapi_encode: Move quality option to common code

2017-11-10 Thread Mark Thompson
ffmpeg | branch: master | Mark Thompson  | 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
+@option{compression_level}
+
+Speed / quality tradeoff: higher values are faster / worse quality.
+@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
-@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,
+, 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] =
+>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) {

[FFmpeg-cvslog] vaapi_encode: Move quality option to common code

2017-08-20 Thread Mark Thompson
ffmpeg | branch: master | Mark Thompson  | Sun Apr 30 19:27:54 
2017 +0100| [9c878651dbc8c795894740af74670b591551f619] | 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.

(cherry picked from commit 19388a7200e5d99c703271f05dba1c806720e808)

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9c878651dbc8c795894740af74670b591551f619
---

 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 f20be54ce8..420c7969e1 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -2554,7 +2554,13 @@ The following standard libavcodec options are used:
 @item
 @option{rc_init_occupancy} / @option{rc_initial_buffer_occupancy}
 @item
+@option{compression_level}
+
+Speed / quality tradeoff: higher values are faster / worse quality.
+@item
 @option{q} / @option{global_quality}
+
+Size / quality tradeoff: higher values are smaller / worse quality.
 @item
 @option{qmin}
 (only: @option{qmax} is not supported)
@@ -2575,9 +2581,6 @@ The following standard libavcodec options are used:
 @option{level} sets the value of @emph{level_idc}.
 
 @table @option
-@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 2de5f76cab..22114bedbe 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -1429,6 +1429,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,
+, 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] =
+>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 0edf27e4cb..3bf0cc87c7 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 f9fcd805a4..0adb903285 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)