OSDN Git Service

Set the quality range and default level for hevc encoder
authorpeng.chen <peng.c.chen@intel.com>
Thu, 13 Apr 2017 05:23:17 +0000 (13:23 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Mon, 12 Jun 2017 05:13:09 +0000 (13:13 +0800)
Signed-off-by: peng.chen <peng.c.chen@intel.com>
(cherry picked from commit bb253641eab36261add539967bedf8cbdb9dfacb)

src/i965_drv_video.c
src/i965_drv_video.h
src/i965_encoder.c

index 4d4cb16..699ebb6 100644 (file)
@@ -1045,7 +1045,9 @@ i965_GetConfigAttributes(VADriverContextP ctx,
                         if (IS_GEN9(i965->intel.device_info))
                             attrib_list[i].value = ENCODER_QUALITY_RANGE_AVC;
                     }
-                }
+                } else if (profile == VAProfileHEVCMain ||
+                           profile == VAProfileHEVCMain10)
+                    attrib_list[i].value = ENCODER_QUALITY_RANGE_HEVC;
                 break;
             }
             break;
index 362b435..b37d684 100644 (file)
 
 #define ENCODER_QUALITY_RANGE     2
 #define ENCODER_QUALITY_RANGE_AVC     8
+#define ENCODER_QUALITY_RANGE_HEVC    8
 #define ENCODER_DEFAULT_QUALITY   1
 #define ENCODER_DEFAULT_QUALITY_AVC   4
+#define ENCODER_DEFAULT_QUALITY_HEVC  4
 #define ENCODER_HIGH_QUALITY      ENCODER_DEFAULT_QUALITY
 #define ENCODER_LOW_QUALITY       2
 
index e6defca..bd6cc8a 100644 (file)
@@ -813,9 +813,11 @@ 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)
 {
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
     VAStatus ret = VA_STATUS_SUCCESS;
 
     if (encode_state->misc_param[VAEncMiscParameterTypeQualityLevel][0] &&
@@ -824,9 +826,28 @@ 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) {
+        if (encoder_context->quality_level == 0) {
+            switch (profile) {
+            case VAProfileH264ConstrainedBaseline:
+            case VAProfileH264Main:
+            case VAProfileH264High:
+            case VAProfileH264MultiviewHigh:
+            case VAProfileH264StereoHigh:
+                if (IS_SKL(i965->intel.device_info) ||
+                    IS_BXT(i965->intel.device_info))
+                    encoder_context->quality_level = ENCODER_DEFAULT_QUALITY_AVC;
+                break;
+
+            case VAProfileHEVCMain:
+            case VAProfileHEVCMain10:
+                encoder_context->quality_level = ENCODER_DEFAULT_QUALITY_HEVC;
+                break;
+
+            default:
+                encoder_context->quality_level = ENCODER_DEFAULT_QUALITY;
+                break;
+            }
+        } else if (encoder_context->quality_level > encoder_context->quality_range) {
             ret = VA_STATUS_ERROR_INVALID_PARAMETER;
             goto out;
         }
@@ -1311,7 +1332,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;
@@ -1456,6 +1477,9 @@ intel_enc_hw_context_init(VADriverContextP ctx,
     case VAProfileHEVCMain:
     case VAProfileHEVCMain10:
         encoder_context->codec = CODEC_HEVC;
+
+        encoder_context->quality_level = ENCODER_DEFAULT_QUALITY_HEVC;
+        encoder_context->quality_range = ENCODER_QUALITY_RANGE_HEVC;
         break;
 
     case VAProfileVP9Profile0: