2014-05-08 8:56 GMT+02:00 Zhong Li <[email protected]>:
> Support VAEntrypointEncFEIIntel and get motion vectors of gen6 h264 encoding
>
> Signed-off-by: Zhong Li <[email protected]>
> ---
>  src/gen6_mfc.c       |   61 
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/gen6_vme.h       |    2 ++
>  src/i965_drv_video.c |   37 +++++++++++++++++++-----------
>  src/i965_drv_video.h |    4 +++-
>  4 files changed, 90 insertions(+), 14 deletions(-)
>
> diff --git a/src/gen6_mfc.c b/src/gen6_mfc.c
> index 21db0a7..c099133 100644
> --- a/src/gen6_mfc.c
> +++ b/src/gen6_mfc.c
> @@ -1357,6 +1357,66 @@ gen6_mfc_avc_pipeline_programing(VADriverContextP ctx,
>      dri_bo_unreference(slice_batch_bo);
>  }
>
> +static void
> +gen6_mfc_get_slice_motion_vector(VADriverContextP ctx,
> +                struct encode_state *encode_state,
> +                struct intel_encoder_context *encoder_context,
> +                int slice_index
> +                )
> +{
> +    struct i965_driver_data *i965 = i965_driver_data(ctx);
> +    struct gen6_vme_context *vme_context = encoder_context->vme_context;
> +    VAEncMiscParameterBuffer *misc_param = (VAEncMiscParameterBuffer 
> *)encode_state->misc_param[VAEncMiscParameterTypeFEIFrameControlIntel]->buffer;
> +    VAEncMiscParameterFEIFrameControlH264Intel *pFeiFrameControlParameter = 
> (VAEncMiscParameterFEIFrameControlH264Intel *)misc_param->data;
> +    VAEncSliceParameterBufferH264 *pSliceParameter = 
> (VAEncSliceParameterBufferH264 
> *)encode_state->slice_params_ext[slice_index]->buffer;
> +    unsigned int *msg = NULL;
> +    int i;
> +    int slice_type = 
> intel_avc_enc_slice_type_fixup(pSliceParameter->slice_type);
> +    int is_intra = slice_type == SLICE_TYPE_I;
> +    struct object_buffer *mv_buf = 
> BUFFER(pFeiFrameControlParameter->mv_data);
> +
> +    if (mv_buf && mv_buf->buffer_store && mv_buf->buffer_store->buffer) {
> +        unsigned char *mv_buffer = mv_buf->buffer_store->buffer;
> +
> +        dri_bo_map(vme_context->vme_output.bo , 1);
> +        msg = (unsigned int *)vme_context->vme_output.bo->virtual;
> +
> +        if (is_intra) {
> +            memset(mv_buffer, 0, INTER_VME_OUTPUT_MV_IN_BYTES * 
> pSliceParameter->num_macroblocks);
> +        } else {
> +            msg += pSliceParameter->macroblock_address * 
> INTER_VME_OUTPUT_IN_DWS;
> +            msg += 32; /* the first 32 DWs are MVs */
> +
> +            for (i = 0; i < pSliceParameter->num_macroblocks; i++) {
> +                if (msg[0] & INTRA_MB_FLAG_MASK) {
> +                    memset(mv_buffer, 0, INTER_VME_OUTPUT_MV_IN_BYTES);
> +                } else {
> +                    memcpy(mv_buffer, (char *)(msg - 32), 
> INTER_VME_OUTPUT_MV_IN_BYTES);
> +                }
> +                mv_buffer += INTER_VME_OUTPUT_MV_IN_BYTES;
> +                msg += INTER_VME_OUTPUT_IN_DWS;
> +            }
> +        }
> +    }
> +
> +    dri_bo_unmap(vme_context->vme_output.bo);
> +}
> +
> +static void
> +gen6_mfc_get_motion_vector(VADriverContextP ctx,
> +                struct encode_state *encode_state,
> +                struct intel_encoder_context *encoder_context)
> +{
> +    int i;
> +
> +    if (encode_state->misc_param[VAEncMiscParameterTypeFEIFrameControlIntel]
> +        && 
> encode_state->misc_param[VAEncMiscParameterTypeFEIFrameControlIntel]->buffer) 
> {
> +        for (i = 0; i < encode_state->num_slice_params_ext; i++) {
> +            gen6_mfc_get_slice_motion_vector(ctx, encode_state, 
> encoder_context, i);
> +        }
> +    }
> +}
> +
>  VAStatus
>  gen6_mfc_avc_encode_picture(VADriverContextP ctx,
>                              struct encode_state *encode_state,
> @@ -1373,6 +1433,7 @@ gen6_mfc_avc_encode_picture(VADriverContextP ctx,
>          /*Programing bcs pipeline*/
>          gen6_mfc_avc_pipeline_programing(ctx, encode_state, 
> encoder_context);  //filling the pipeline
>          gen6_mfc_run(ctx, encode_state, encoder_context);
> +        gen6_mfc_get_motion_vector(ctx, encode_state, encoder_context);
>          if (rate_control_mode == VA_RC_CBR /*|| rate_control_mode == 
> VA_RC_VBR*/) {
>              gen6_mfc_stop(ctx, encode_state, encoder_context, 
> &current_frame_bits_size);
>              sts = intel_mfc_brc_postpack(encode_state, mfc_context, 
> current_frame_bits_size);
> diff --git a/src/gen6_vme.h b/src/gen6_vme.h
> index d461982..db3fb27 100644
> --- a/src/gen6_vme.h
> +++ b/src/gen6_vme.h
> @@ -40,6 +40,8 @@
>  #define INTRA_VME_OUTPUT_IN_DWS         (INTRA_VME_OUTPUT_IN_BYTES / 4)
>  #define INTER_VME_OUTPUT_IN_BYTES       160     /* the first 128 bytes for 
> MVs and the last 32 bytes for other info */
>  #define INTER_VME_OUTPUT_IN_DWS         (INTER_VME_OUTPUT_IN_BYTES / 4)
> +#define INTER_VME_OUTPUT_MV_IN_BYTES    128
> +#define INTER_VME_OUTPUT_MV_IN_DWs      (INTER_VME_OUTPUT_MV_IN_BYTES / 4)
>
>  #define MAX_INTERFACE_DESC_GEN6         MAX_GPE_KERNELS
>  #define MAX_MEDIA_SURFACES_GEN6         34
> diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
> index fa51651..9dc5463 100755
> --- a/src/i965_drv_video.c
> +++ b/src/i965_drv_video.c
> @@ -340,8 +340,10 @@ i965_QueryConfigEntrypoints(VADriverContextP ctx,
>          if (HAS_H264_DECODING(i965))
>              entrypoint_list[n++] = VAEntrypointVLD;
>
> -        if (HAS_H264_ENCODING(i965))
> +        if (HAS_H264_ENCODING(i965)) {
>              entrypoint_list[n++] = VAEntrypointEncSlice;
> +            entrypoint_list[n++] = VAEntrypointEncFEIIntel;
> +        }
>
>          break;
>     case VAProfileH264MultiviewHigh:
> @@ -405,7 +407,7 @@ i965_GetConfigAttributes(VADriverContextP ctx,
>              break;
>
>          case VAConfigAttribRateControl:
> -            if (entrypoint == VAEntrypointEncSlice) {
> +            if (entrypoint == VAEntrypointEncFEIIntel || entrypoint == 
> VAEntrypointEncSlice) {
>                  attrib_list[i].value = VA_RC_CQP;
>
>                  if (profile != VAProfileMPEG2Main &&
> @@ -415,13 +417,13 @@ i965_GetConfigAttributes(VADriverContextP ctx,
>              }
>
>          case VAConfigAttribEncPackedHeaders:
> -            if (entrypoint == VAEntrypointEncSlice) {
> +            if (entrypoint == VAEntrypointEncFEIIntel || entrypoint == 
> VAEntrypointEncSlice) {
>                  attrib_list[i].value = VA_ENC_PACKED_HEADER_SEQUENCE | 
> VA_ENC_PACKED_HEADER_PICTURE | VA_ENC_PACKED_HEADER_MISC;
>                  break;
>              }
>
>         case VAConfigAttribEncMaxRefFrames:
> -           if (entrypoint == VAEntrypointEncSlice) {
> +            if (entrypoint == VAEntrypointEncFEIIntel || entrypoint == 
> VAEntrypointEncSlice) {
>                 attrib_list[i].value = (1 << 16) | (1 << 0);
>                 break;
>             }
> @@ -497,7 +499,8 @@ i965_CreateConfig(VADriverContextP ctx,
>      case VAProfileH264Main:
>      case VAProfileH264High:
>          if ((HAS_H264_DECODING(i965) && VAEntrypointVLD == entrypoint) ||
> -            (HAS_H264_ENCODING(i965) && VAEntrypointEncSlice == entrypoint)) 
> {
> +            (HAS_H264_ENCODING(i965) &&
> +            ((VAEntrypointEncFEIIntel == entrypoint) || 
> (VAEntrypointEncSlice == entrypoint)))) {
>              vaStatus = VA_STATUS_SUCCESS;
>          } else {
>              vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
> @@ -1563,7 +1566,8 @@ i965_CreateContext(VADriverContextP ctx,
>              obj_context->codec_state.proc.current_render_target = 
> VA_INVALID_ID;
>              assert(i965->codec_info->proc_hw_context_init);
>              obj_context->hw_context = 
> i965->codec_info->proc_hw_context_init(ctx, obj_config);
> -        } else if (VAEntrypointEncSlice == obj_config->entrypoint) { 
> /*encode routin only*/
> +        } else if (VAEntrypointEncFEIIntel == obj_config->entrypoint ||
> +                   VAEntrypointEncSlice == obj_config->entrypoint) { 
> /*encode routin only*/
>              obj_context->codec_type = CODEC_ENC;
>              memset(&obj_context->codec_state.encode, 0, 
> sizeof(obj_context->codec_state.encode));
>              obj_context->codec_state.encode.current_render_target = 
> VA_INVALID_ID;
> @@ -1663,6 +1667,7 @@ i965_create_buffer_internal(VADriverContextP ctx,
>      case VAProcFilterParameterBufferType:
>      case VAHuffmanTableBufferType:
>      case VAProbabilityBufferType:
> +    case VAEncFEIMVBufferTypeIntel:
>          /* Ok */
>          break;
>
> @@ -2326,7 +2331,8 @@ i965_RenderPicture(VADriverContextP ctx,
>
>      if (VAEntrypointVideoProc == obj_config->entrypoint) {
>          vaStatus = i965_proc_render_picture(ctx, context, buffers, 
> num_buffers);
> -    } else if (VAEntrypointEncSlice == obj_config->entrypoint ) {
> +    } else if (VAEntrypointEncFEIIntel == obj_config->entrypoint ||
> +               VAEntrypointEncSlice == obj_config->entrypoint ) {
>          vaStatus = i965_encoder_render_picture(ctx, context, buffers, 
> num_buffers);
>      } else {
>          vaStatus = i965_decoder_render_picture(ctx, context, buffers, 
> num_buffers);
> @@ -2349,7 +2355,7 @@ i965_EndPicture(VADriverContextP ctx, VAContextID 
> context)
>      if (obj_context->codec_type == CODEC_PROC) {
>          ASSERT_RET(VAEntrypointVideoProc == obj_config->entrypoint, 
> VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT);
>      } else if (obj_context->codec_type == CODEC_ENC) {
> -        ASSERT_RET(VAEntrypointEncSlice == obj_config->entrypoint, 
> VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT);
> +        ASSERT_RET(VAEntrypointEncFEIIntel == obj_config->entrypoint || 
> VAEntrypointEncSlice == obj_config->entrypoint, 
> VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT);
>
>          if (!(obj_context->codec_state.encode.pic_param ||
>                  obj_context->codec_state.encode.pic_param_ext)) {
> @@ -4326,7 +4332,8 @@ i965_GetSurfaceAttributes(
>                          attrib_list[i].flags = 
> VA_SURFACE_ATTRIB_NOT_SUPPORTED;
>                      }
>                  } else if (IS_GEN6(i965->intel.device_info)) {
> -                    if (obj_config->entrypoint == VAEntrypointEncSlice ||
> +                    if (obj_config->entrypoint == VAEntrypointEncFEIIntel ||
> +                        obj_config->entrypoint == VAEntrypointEncSlice ||
>                          obj_config->entrypoint == VAEntrypointVideoProc) {
>                          switch (attrib_list[i].value.value.i) {
>                          case VA_FOURCC_NV12:
> @@ -4351,7 +4358,8 @@ i965_GetSurfaceAttributes(
>                      }
>                  } else if (IS_GEN7(i965->intel.device_info) ||
>                             IS_GEN8(i965->intel.device_info)) {
> -                    if (obj_config->entrypoint == VAEntrypointEncSlice ||
> +                    if (obj_config->entrypoint == VAEntrypointEncFEIIntel ||
> +                        obj_config->entrypoint == VAEntrypointEncSlice ||
>                          obj_config->entrypoint == VAEntrypointVideoProc) {
>                          switch (attrib_list[i].value.value.i) {
>                          case VA_FOURCC_NV12:
> @@ -4488,7 +4496,8 @@ i965_QuerySurfaceAttributes(VADriverContextP ctx,
>              attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | 
> VA_SURFACE_ATTRIB_SETTABLE;
>              attribs[i].value.value.i = VA_FOURCC_NV12;
>              i++;
> -        } else if (obj_config->entrypoint == VAEntrypointEncSlice ||  /* 
> encode */
> +        } else if (obj_config->entrypoint == VAEntrypointEncFEIIntel ||
> +                   obj_config->entrypoint == VAEntrypointEncSlice ||  /* 
> encode */
>                     obj_config->entrypoint == VAEntrypointVideoProc) { /* vpp 
> */
>              attribs[i].type = VASurfaceAttribPixelFormat;
>              attribs[i].value.type = VAGenericValueTypeInteger;
> @@ -4579,7 +4588,8 @@ i965_QuerySurfaceAttributes(VADriverContextP ctx,
>                  attribs[i].value.value.i = VA_FOURCC_NV12;
>                  i++;
>              }
> -        } else if (obj_config->entrypoint == VAEntrypointEncSlice ||  /* 
> encode */
> +        } else if (obj_config->entrypoint == VAEntrypointEncFEIIntel ||
> +                   obj_config->entrypoint == VAEntrypointEncSlice ||  /* 
> encode */
>                     obj_config->entrypoint == VAEntrypointVideoProc) { /* vpp 
> */
>              attribs[i].type = VASurfaceAttribPixelFormat;
>              attribs[i].value.type = VAGenericValueTypeInteger;
> @@ -4682,7 +4692,8 @@ i965_QuerySurfaceAttributes(VADriverContextP ctx,
>                  attribs[i].value.value.i = VA_FOURCC_NV12;
>                  i++;
>              }
> -        } else if (obj_config->entrypoint == VAEntrypointEncSlice ||  /* 
> encode */
> +        } else if (obj_config->entrypoint == VAEntrypointEncFEIIntel ||
> +                   obj_config->entrypoint == VAEntrypointEncSlice ||  /* 
> encode */
>                     obj_config->entrypoint == VAEntrypointVideoProc) { /* vpp 
> */
>
>              attribs[i].type = VASurfaceAttribPixelFormat;
> diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h
> index 0e32f7d..e2f23c6 100644
> --- a/src/i965_drv_video.h
> +++ b/src/i965_drv_video.h
> @@ -36,6 +36,7 @@
>  #include <va/va_vpp.h>
>  #include <va/va_backend.h>
>  #include <va/va_backend_vpp.h>
> +#include <va/va_intel_fei.h>
>
>  #include "i965_mutext.h"
>  #include "object_heap.h"
> @@ -141,13 +142,14 @@ struct encode_state
>      int num_slice_params_ext;
>      int last_packed_header_type;
>
> -    struct buffer_store *misc_param[16];
> +    struct buffer_store *misc_param[1010];
>
>      VASurfaceID current_render_target;
>      struct object_surface *input_yuv_object;
>      struct object_surface *reconstructed_object;
>      struct object_buffer *coded_buf_object;
>      struct object_surface *reference_objects[16]; /* Up to 2 reference 
> surfaces are valid for MPEG-2,*/
> +
>  };
>
>  struct proc_state

You are increasing the size of encode_state beyond the size of a page
for no real reason/advantage. Please use a different approach where
Misc param buffers are maintained with a minimal set of members.
Mapping from VA misc buffer types to internal VA driver defs is a more
appropriate thing, for almost free: you just need to convert the buf
type once while parsing/accumulating the misc buffers through
vaRenderPicture() implementation. Next, misc buffers are accessed by
VA intel driver buf types instead.

i.e. this means another preparatory patch before this one.

Thanks,
Gwenole.
_______________________________________________
Libva mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to