OSDN Git Service

FEI: Add basic infrastructure for FEI enablement
authorSreerenj Balachandran <sreerenj.balachandran@intel.com>
Fri, 18 Aug 2017 18:16:36 +0000 (11:16 -0700)
committerXiang, Haihao <haihao.xiang@intel.com>
Wed, 23 Aug 2017 07:44:15 +0000 (15:44 +0800)
Add necessary changes in common structures and apis
to support FEI (Flexible Encoder Infrastructure).

* add support for the new entrypoing VAEntrypointFEI
* fixes in vaQueryConfigEntrypoints(), vaGetConfigAttributes(),
vaCreateContext(), vaCreateBuffer(), vaRenderPicture() and vaEndPicture()

Fixes #228

Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
src/i965_device_info.c
src/i965_drv_video.c
src/i965_drv_video.h
src/i965_encoder.c
src/i965_encoder.h

index 629b1f2..cd736ac 100644 (file)
@@ -373,6 +373,7 @@ static struct hw_codec_info skl_hw_codec_info = {
     .has_hevc_decoding = 1,
     .has_hevc_encoding = 1,
     .has_lp_h264_encoding = 1,
+    .has_fei_h264_encoding = 1,
 
     .lp_h264_brc_mode = VA_RC_CQP,
     .h264_brc_mode = VA_RC_CQP | VA_RC_CBR | VA_RC_VBR | VA_RC_MB,
index 2cb99ff..122586f 100644 (file)
@@ -537,7 +537,8 @@ i965_QueryConfigProfiles(VADriverContextP ctx,
 
     if (HAS_H264_DECODING(i965) ||
         HAS_H264_ENCODING(i965) ||
-        HAS_LP_H264_ENCODING(i965)) {
+        HAS_LP_H264_ENCODING(i965) ||
+        HAS_FEI_H264_ENCODING(i965)) {
         profile_list[i++] = VAProfileH264ConstrainedBaseline;
         profile_list[i++] = VAProfileH264Main;
         profile_list[i++] = VAProfileH264High;
@@ -646,6 +647,9 @@ i965_QueryConfigEntrypoints(VADriverContextP ctx,
         if (HAS_LP_H264_ENCODING(i965))
             entrypoint_list[n++] = VAEntrypointEncSliceLP;
 
+        if (HAS_FEI_H264_ENCODING(i965))
+            entrypoint_list[n++] = VAEntrypointFEI;
+
         break;
     case VAProfileH264MultiviewHigh:
     case VAProfileH264StereoHigh:
@@ -762,10 +766,11 @@ i965_validate_config(VADriverContextP ctx, VAProfile profile,
     case VAProfileH264High:
         if ((HAS_H264_DECODING(i965) && entrypoint == VAEntrypointVLD) ||
             (HAS_H264_ENCODING(i965) && entrypoint == VAEntrypointEncSlice) ||
-            (HAS_LP_H264_ENCODING(i965) && entrypoint == VAEntrypointEncSliceLP)) {
+            (HAS_LP_H264_ENCODING(i965) && entrypoint == VAEntrypointEncSliceLP) ||
+            (HAS_FEI_H264_ENCODING(i965) && entrypoint == VAEntrypointFEI)) {
             va_status = VA_STATUS_SUCCESS;
         } else if (!HAS_H264_DECODING(i965) && !HAS_H264_ENCODING(i965) &&
-                   !HAS_LP_H264_ENCODING(i965)) {
+                   !HAS_LP_H264_ENCODING(i965) && !HAS_FEI_H264_ENCODING(i965)) {
             va_status = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
         } else {
             va_status = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
@@ -994,6 +999,14 @@ i965_GetConfigAttributes(VADriverContextP ctx,
                     attrib_list[i].value = i965->codec_info->lp_h264_brc_mode;
                 else
                     attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
+            } else if (entrypoint == VAEntrypointFEI) {
+                /* Only CQP is supported in FEI Entrypoint */
+                if (profile == VAProfileH264ConstrainedBaseline ||
+                    profile == VAProfileH264Main ||
+                    profile == VAProfileH264High)
+                    attrib_list[i].value = VA_RC_CQP;
+                else
+                    attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
             } else
                 attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
 
@@ -1001,7 +1014,8 @@ i965_GetConfigAttributes(VADriverContextP ctx,
 
         case VAConfigAttribEncPackedHeaders:
             if (entrypoint == VAEntrypointEncSlice ||
-                entrypoint == VAEntrypointEncSliceLP) {
+                entrypoint == VAEntrypointEncSliceLP ||
+                entrypoint == VAEntrypointFEI) {
                 attrib_list[i].value = VA_ENC_PACKED_HEADER_SEQUENCE | VA_ENC_PACKED_HEADER_PICTURE | VA_ENC_PACKED_HEADER_MISC;
                 if (profile == VAProfileH264ConstrainedBaseline ||
                     profile == VAProfileH264Main ||
@@ -1022,7 +1036,7 @@ i965_GetConfigAttributes(VADriverContextP ctx,
             break;
 
         case VAConfigAttribEncMaxRefFrames:
-            if (entrypoint == VAEntrypointEncSlice) {
+            if (entrypoint == VAEntrypointEncSlice || entrypoint == VAEntrypointFEI) {
                 attrib_list[i].value = (1 << 16) | (1 << 0);
                 if (profile == VAProfileH264ConstrainedBaseline ||
                     profile == VAProfileH264Main ||
@@ -1050,7 +1064,8 @@ i965_GetConfigAttributes(VADriverContextP ctx,
 
         case VAConfigAttribEncQualityRange:
             if (entrypoint == VAEntrypointEncSlice ||
-                entrypoint == VAEntrypointEncSliceLP) {
+                entrypoint == VAEntrypointEncSliceLP ||
+                entrypoint == VAEntrypointFEI) {
                 attrib_list[i].value = 1;
                 if (profile == VAProfileH264ConstrainedBaseline ||
                     profile == VAProfileH264Main ||
@@ -1087,7 +1102,8 @@ i965_GetConfigAttributes(VADriverContextP ctx,
 
         case VAConfigAttribEncROI:
             if (entrypoint == VAEntrypointEncSlice ||
-                entrypoint == VAEntrypointEncSliceLP) {
+                entrypoint == VAEntrypointEncSliceLP ||
+                entrypoint == VAEntrypointFEI) {
                 VAConfigAttribValEncROI *roi_config =
                     (VAConfigAttribValEncROI *) & (attrib_list[i].value);
 
@@ -1096,7 +1112,7 @@ i965_GetConfigAttributes(VADriverContextP ctx,
                     profile == VAProfileH264High) {
 
                     if (IS_GEN9(i965->intel.device_info) &&
-                        entrypoint == VAEntrypointEncSlice)
+                        (entrypoint == VAEntrypointEncSlice || entrypoint == VAEntrypointFEI))
                         attrib_list[i].value = 0;
                     else {
                         if (entrypoint == VAEntrypointEncSliceLP) {
@@ -1155,7 +1171,7 @@ i965_GetConfigAttributes(VADriverContextP ctx,
                            profile == VAProfileHEVCMain10) {
                     attrib_list[i].value = I965_MAX_NUM_SLICE;
                 }
-            } else if (entrypoint == VAEntrypointEncSliceLP) {
+            } else if (entrypoint == VAEntrypointEncSliceLP || entrypoint == VAEntrypointFEI) {
                 if ((profile == VAProfileH264ConstrainedBaseline ||
                      profile == VAProfileH264Main ||
                      profile == VAProfileH264High) ||
@@ -1181,6 +1197,17 @@ i965_GetConfigAttributes(VADriverContextP ctx,
             }
 
             break;
+
+        case VAConfigAttribFEIFunctionType:
+            /* Supporing all possible modes of FEI */
+            attrib_list[i].value = VA_FEI_FUNCTION_ENC |
+                                   VA_FEI_FUNCTION_PAK | VA_FEI_FUNCTION_ENC_PAK;
+            break;
+
+        case VAConfigAttribFEIMVPredictors:
+            attrib_list[i].value = 4;
+            break;
+
         default:
             /* Do nothing */
             attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
@@ -1331,7 +1358,7 @@ i965_CreateConfig(VADriverContextP ctx,
             } else if (profile == VAProfileHEVCMain ||
                        profile == VAProfileHEVCMain10)
                 attrib.value = I965_MAX_NUM_SLICE;
-        } else if (entrypoint == VAEntrypointEncSliceLP) {
+        } else if (entrypoint == VAEntrypointEncSliceLP || entrypoint == VAEntrypointFEI) {
             if ((profile == VAProfileH264ConstrainedBaseline ||
                  profile == VAProfileH264Main ||
                  profile == VAProfileH264High) ||
@@ -2466,7 +2493,8 @@ i965_CreateContext(VADriverContextP ctx,
             obj_context->hw_context = i965->codec_info->proc_hw_context_init(ctx, obj_config);
         } else if ((VAEntrypointEncSlice == obj_config->entrypoint) ||
                    (VAEntrypointEncPicture == obj_config->entrypoint) ||
-                   (VAEntrypointEncSliceLP == obj_config->entrypoint)) {
+                   (VAEntrypointEncSliceLP == obj_config->entrypoint) ||
+                   (VAEntrypointFEI == obj_config->entrypoint)) {
             VAConfigAttrib *packed_attrib;
             obj_context->codec_type = CODEC_ENC;
             memset(&obj_context->codec_state.encode, 0, sizeof(obj_context->codec_state.encode));
@@ -2648,6 +2676,12 @@ i965_create_buffer_internal(VADriverContextP ctx,
     case VAHuffmanTableBufferType:
     case VAProbabilityBufferType:
     case VAEncMacroblockMapBufferType:
+    case VAEncQPBufferType:
+    case VAEncFEIMVBufferType:
+    case VAEncFEIMBCodeBufferType:
+    case VAEncFEIDistortionBufferType:
+    case VAEncFEIMBControlBufferType:
+    case VAEncFEIMVPredictorBufferType:
         /* Ok */
         break;
 
@@ -2709,7 +2743,13 @@ i965_create_buffer_internal(VADriverContextP ctx,
                type == VAImageBufferType ||
                type == VAEncCodedBufferType ||
                type == VAEncMacroblockMapBufferType ||
-               type == VAProbabilityBufferType) {
+               type == VAProbabilityBufferType ||
+               type == VAEncQPBufferType ||
+               type == VAEncFEIMVBufferType ||
+               type == VAEncFEIMBCodeBufferType ||
+               type == VAEncFEIDistortionBufferType ||
+               type == VAEncFEIMBControlBufferType ||
+               type == VAEncFEIMVPredictorBufferType) {
 
         /* If the buffer is wrapped, the bo/buffer of buffer_store is bogus.
          * So it is enough to allocate one 64 byte bo
@@ -3737,7 +3777,8 @@ i965_RenderPicture(VADriverContextP ctx,
         vaStatus = i965_proc_render_picture(ctx, context, buffers, num_buffers);
     } else if ((VAEntrypointEncSlice == obj_config->entrypoint) ||
                (VAEntrypointEncPicture == obj_config->entrypoint) ||
-               (VAEntrypointEncSliceLP == obj_config->entrypoint)) {
+               (VAEntrypointEncSliceLP == obj_config->entrypoint) ||
+               (VAEntrypointFEI == obj_config->entrypoint)) {
         vaStatus = i965_encoder_render_picture(ctx, context, buffers, num_buffers);
     } else {
         vaStatus = i965_decoder_render_picture(ctx, context, buffers, num_buffers);
@@ -3762,7 +3803,8 @@ i965_EndPicture(VADriverContextP ctx, VAContextID context)
     } else if (obj_context->codec_type == CODEC_ENC) {
         ASSERT_RET(((VAEntrypointEncSlice == obj_config->entrypoint) ||
                     (VAEntrypointEncPicture == obj_config->entrypoint) ||
-                    (VAEntrypointEncSliceLP == obj_config->entrypoint)),
+                    (VAEntrypointEncSliceLP == obj_config->entrypoint) ||
+                    (VAEntrypointFEI == obj_config->entrypoint)),
                    VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT);
 
         if (obj_context->codec_state.encode.num_packed_header_params_ext !=
@@ -5721,7 +5763,8 @@ i965_GetSurfaceAttributes(
                            IS_GEN9(i965->intel.device_info)) {
                     if (obj_config->entrypoint == VAEntrypointEncSlice ||
                         obj_config->entrypoint == VAEntrypointVideoProc ||
-                        obj_config->entrypoint == VAEntrypointEncSliceLP) {
+                        obj_config->entrypoint == VAEntrypointEncSliceLP ||
+                        obj_config->entrypoint == VAEntrypointFEI) {
                         switch (attrib_list[i].value.value.i) {
                         case VA_FOURCC_NV12:
                         case VA_FOURCC_I420:
@@ -6090,7 +6133,8 @@ i965_QuerySurfaceAttributes(VADriverContextP ctx,
         } else if (obj_config->entrypoint == VAEntrypointEncSlice ||  /* encode */
                    obj_config->entrypoint == VAEntrypointVideoProc ||
                    obj_config->entrypoint == VAEntrypointEncSliceLP ||
-                   obj_config->entrypoint == VAEntrypointEncPicture) {
+                   obj_config->entrypoint == VAEntrypointEncPicture ||
+                   obj_config->entrypoint == VAEntrypointFEI) {
 
             if (obj_config->profile == VAProfileHEVCMain10) {
                 attribs[i].type = VASurfaceAttribPixelFormat;
index 19493a5..17ddb50 100644 (file)
@@ -39,6 +39,8 @@
 #include <va/va_vpp.h>
 #include <va/va_backend.h>
 #include <va/va_backend_vpp.h>
+#include <va/va_fei.h>
+#include <va/va_fei_h264.h>
 
 #include "i965_mutext.h"
 #include "object_heap.h"
@@ -46,7 +48,7 @@
 #include "i965_fourcc.h"
 
 #define I965_MAX_PROFILES                       20
-#define I965_MAX_ENTRYPOINTS                    5
+#define I965_MAX_ENTRYPOINTS                    6
 #define I965_MAX_CONFIG_ATTRIBUTES              32
 #define I965_MAX_IMAGE_FORMATS                  10
 #define I965_MAX_SUBPIC_FORMATS                 6
@@ -97,6 +99,9 @@
 #define HAS_LP_H264_ENCODING(ctx)  ((ctx)->codec_info->has_lp_h264_encoding && \
                                     (ctx)->intel.has_bsd)
 
+#define HAS_FEI_H264_ENCODING(ctx)  ((ctx)->codec_info->has_fei_h264_encoding && \
+                                     (ctx)->intel.has_bsd)
+
 #define HAS_VC1_DECODING(ctx)   ((ctx)->codec_info->has_vc1_decoding && \
                                  (ctx)->intel.has_bsd)
 
@@ -271,7 +276,7 @@ struct encode_state {
 
     int has_layers;
 
-    struct buffer_store *misc_param[16][8];
+    struct buffer_store *misc_param[19][8];
 
     VASurfaceID current_render_target;
     struct object_surface *input_yuv_object;
@@ -478,6 +483,7 @@ struct hw_codec_info {
     unsigned int has_vpp_p010: 1;
     unsigned int has_lp_h264_encoding: 1;
     unsigned int has_vp9_encoding: 1;
+    unsigned int has_fei_h264_encoding: 1;
 
     unsigned int lp_h264_brc_mode;
     unsigned int h264_brc_mode;
index 3610411..398e734 100644 (file)
@@ -1464,6 +1464,16 @@ intel_enc_hw_context_init(VADriverContextP ctx,
             encoder_context->quality_range = ENCODER_QUALITY_RANGE_AVC;
         } else
             encoder_context->quality_range = ENCODER_QUALITY_RANGE;
+
+        if (obj_config->entrypoint == VAEntrypointFEI) {
+            encoder_context->fei_enabled = 1;
+            /* check which attribute has been configured for FEI, this is
+             * required for VME/PAK disable or enable as per user request */
+            for (i = 0; i < obj_config->num_attribs; i++) {
+                if (obj_config->attrib_list[i].type == VAConfigAttribFEIFunctionType)
+                    encoder_context->fei_function_mode = obj_config->attrib_list[i].value;
+            }
+        }
         break;
 
     case VAProfileH264StereoHigh:
index 09c4db7..23a0b10 100644 (file)
@@ -112,6 +112,9 @@ struct intel_encoder_context {
     unsigned int context_roi: 1;
     unsigned int is_new_sequence: 1; /* Currently only valid for H.264, TODO for other codecs */
 
+    unsigned int fei_enabled: 1;
+    unsigned int fei_function_mode; /* configured VA_FEI_FUNCTION_XXX */
+
     void (*vme_context_destroy)(void *vme_context);
     VAStatus(*vme_pipeline)(VADriverContextP ctx,
                             VAProfile profile,