[Libva] [PATCH 31/31] ENC:support more quality level and switch to new AVC encoder solution on SKL

Chen, Peng C peng.c.chen at intel.com
Thu Jan 12 03:22:53 UTC 2017



-----Original Message-----
From: Libva [mailto:libva-bounces at lists.freedesktop.org] On Behalf Of Sean V Kelley
Sent: Wednesday, January 11, 2017 7:38 AM
To: libva at lists.freedesktop.org
Subject: [Libva] [PATCH 31/31] ENC:support more quality level and switch to new AVC encoder solution on SKL

From: Pengfei Qu <Pengfei.Qu at intel.com>

Signed-off-by: Pengfei Qu <Pengfei.Qu at intel.com>
Signed-off-by: Sean V Kelley <seanvk at posteo.de>
---
 src/Makefile.am      | 11 +++++++++++
 src/i965_drv_video.c |  8 ++++++--
 src/i965_drv_video.h |  2 ++
 src/i965_encoder.c   | 39 +++++++++++++++++++++++++++++++--------
 4 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am index 424812b3..9a5e44bc 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -101,6 +101,11 @@ source_c = \
 	gen9_vp9_encoder_kernels.c      \
 	gen9_vp9_const_def.c      \
 	gen9_vp9_encoder.c      \
+	i965_avc_encoder_common.c      \
+	i965_encoder_common.c      \
+	gen9_avc_encoder_kernels.c      \
+	gen9_avc_const_def.c      \
+	gen9_avc_encoder.c      \
 	intel_common_vpp_internal.c           \
 	$(NULL)
 
@@ -154,6 +159,12 @@ source_h = \
 	gen9_vp9_encapi.h           \
 	gen9_vp9_const_def.h      \
 	gen9_vp9_encoder_kernels.h           \
+	i965_encoder_api.h           \
+	i965_avc_encoder_common.h           \
+	i965_encoder_common.h           \
+	gen9_avc_encoder.h           \
+	gen9_avc_const_def.h      \
+	gen9_avc_encoder_kernels.h           \
 	intel_gen_vppapi.h           \
 	intel_common_vpp_internal.h           \
 	$(NULL)
diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c index cc371905..64cc0e20 100644
--- a/src/i965_drv_video.c
+++ b/src/i965_drv_video.c
@@ -911,6 +911,7 @@ i965_GetConfigAttributes(VADriverContextP ctx,
                          VAConfigAttrib *attrib_list,  /* in/out */
                          int num_attribs)  {
+    struct i965_driver_data * const i965 = i965_driver_data(ctx);
     VAStatus va_status;
     int i;
 
@@ -1003,8 +1004,11 @@ i965_GetConfigAttributes(VADriverContextP ctx,
                 attrib_list[i].value = 1;
                 if (profile == VAProfileH264ConstrainedBaseline ||
                     profile == VAProfileH264Main ||
-                    profile == VAProfileH264High )
-                    attrib_list[i].value = ENCODER_QUALITY_RANGE;
+                    profile == VAProfileH264High ){
+                        attrib_list[i].value = ENCODER_QUALITY_RANGE;
+                        if(IS_GEN9(i965->intel.device_info))
+                            attrib_list[i].value = ENCODER_QUALITY_RANGE_AVC;
+                }
                 break;
             }
             break;
diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h index 7cba3a37..334b7882 100644
--- a/src/i965_drv_video.h
+++ b/src/i965_drv_video.h
@@ -69,7 +69,9 @@
 #define DEFAULT_SATURATION      50
 
 #define ENCODER_QUALITY_RANGE     2
+#define ENCODER_QUALITY_RANGE_AVC     8
 #define ENCODER_DEFAULT_QUALITY   1
+#define ENCODER_DEFAULT_QUALITY_AVC   4
 #define ENCODER_HIGH_QUALITY      ENCODER_DEFAULT_QUALITY
 #define ENCODER_LOW_QUALITY       2
 
diff --git a/src/i965_encoder.c b/src/i965_encoder.c index 0a648d4d..beac9115 100644
--- a/src/i965_encoder.c
+++ b/src/i965_encoder.c
@@ -41,6 +41,7 @@
 #include "gen6_mfc.h"
 
 #include "i965_post_processing.h"
+#include "i965_encoder_api.h"
 
 static struct intel_fraction
 reduce_fraction(struct intel_fraction f) @@ -789,6 +790,7 @@ intel_encoder_check_temporal_layer_structure(VADriverContextP ctx,
 
 static VAStatus
 intel_encoder_check_misc_parameter(VADriverContextP ctx,
+                                  VAProfile profile,
                                   struct encode_state *encode_state,
                                   struct intel_encoder_context *encoder_context)  { @@ -800,12 +802,23 @@ intel_encoder_check_misc_parameter(VADriverContextP ctx,
         VAEncMiscParameterBufferQualityLevel* param_quality_level = (VAEncMiscParameterBufferQualityLevel*)pMiscParam->data;
         encoder_context->quality_level = param_quality_level->quality_level;
 
-        if (encoder_context->quality_level == 0)
-            encoder_context->quality_level = ENCODER_DEFAULT_QUALITY;
-        else if (encoder_context->quality_level > encoder_context->quality_range) {
-            ret = VA_STATUS_ERROR_INVALID_PARAMETER;
-            goto out;
+        switch (profile) {
+        case VAProfileH264ConstrainedBaseline:
+        case VAProfileH264Main:
+        case VAProfileH264High:
+            if (encoder_context->quality_level == 0)
+                encoder_context->quality_level = ENCODER_DEFAULT_QUALITY_AVC;
+            break;
+        default:
+            if (encoder_context->quality_level == 0)
+                encoder_context->quality_level = ENCODER_DEFAULT_QUALITY;
+            break;
         }

Here is the input quality range for all codecs ,not for special encoder. it will be better that It could be moved into h.264 special file 

+
+         if (encoder_context->quality_level > encoder_context->quality_range) {
+             ret = VA_STATUS_ERROR_INVALID_PARAMETER;
+             goto out;
+         }
     }
 
     ret = intel_encoder_check_temporal_layer_structure(ctx, encode_state, encoder_context); @@ -1281,7 +1294,7 @@ intel_encoder_sanity_check_input(VADriverContextP ctx,
     }
 
     if (vaStatus == VA_STATUS_SUCCESS)
-        vaStatus = intel_encoder_check_misc_parameter(ctx, encode_state, encoder_context);
+        vaStatus = intel_encoder_check_misc_parameter(ctx, profile, 
+ encode_state, encoder_context);
 
 out:    
     return vaStatus;
@@ -1362,6 +1375,7 @@ intel_enc_hw_context_init(VADriverContextP ctx,
                           hw_init_func vme_context_init,
                           hw_init_func mfc_context_init)  {
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct intel_driver_data *intel = intel_driver_data(ctx);
     struct intel_encoder_context *encoder_context = calloc(1, sizeof(struct intel_encoder_context));
     int i;
@@ -1394,7 +1408,9 @@ intel_enc_hw_context_init(VADriverContextP ctx,
         encoder_context->codec = CODEC_H264;
 
         if (obj_config->entrypoint == VAEntrypointEncSliceLP)
-            encoder_context->quality_range = ENCODER_LP_QUALITY_RANGE;
+            encoder_context->quality_range = ENCODER_QUALITY_RANGE_AVC;
+        else if(IS_GEN9(i965->intel.device_info))
+            encoder_context->quality_range = ENCODER_QUALITY_RANGE_AVC;
         else
             encoder_context->quality_range = ENCODER_QUALITY_RANGE;
         break;
@@ -1485,5 +1501,12 @@ gen8_enc_hw_context_init(VADriverContextP ctx, struct object_config *obj_config)  struct hw_context *  gen9_enc_hw_context_init(VADriverContextP ctx, struct object_config *obj_config)  {
-    return intel_enc_hw_context_init(ctx, obj_config, gen9_vme_context_init, gen9_mfc_context_init);
+    switch (obj_config->profile){
+    case VAProfileH264ConstrainedBaseline:
+    case VAProfileH264Main:
+    case VAProfileH264High:
+        return intel_enc_hw_context_init(ctx, obj_config, gen9_avc_vme_context_init, gen9_avc_pak_context_init);
+    default:
+        return intel_enc_hw_context_init(ctx, obj_config, gen9_vme_context_init, gen9_mfc_context_init);
+    }
 }
--
2.11.0

_______________________________________________
Libva mailing list
Libva at lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libva


More information about the Libva mailing list