On 1/26/19 2:47 PM, Dafna Hirschfeld wrote:
> Add structs and definitions needed to implement stateless
> decoder for fwht.
> 
> Signed-off-by: Dafna Hirschfeld <daf...@gmail.com>
> ---
>  drivers/media/platform/vicodec/vicodec-core.c | 12 ++++++++++++
>  drivers/media/v4l2-core/v4l2-ctrls.c          |  6 ++++++
>  include/uapi/linux/v4l2-controls.h            | 10 ++++++++++
>  include/uapi/linux/videodev2.h                |  1 +
>  4 files changed, 29 insertions(+)
> 
> diff --git a/drivers/media/platform/vicodec/vicodec-core.c 
> b/drivers/media/platform/vicodec/vicodec-core.c
> index 370517707324..25831d992681 100644
> --- a/drivers/media/platform/vicodec/vicodec-core.c
> +++ b/drivers/media/platform/vicodec/vicodec-core.c
> @@ -64,6 +64,10 @@ static const struct v4l2_fwht_pixfmt_info pixfmt_fwht = {
>       V4L2_PIX_FMT_FWHT, 0, 3, 1, 1, 1, 1, 1, 0, 1
>  };
>  
> +static const struct v4l2_fwht_pixfmt_info pixfmt_stateless_fwht = {
> +     V4L2_PIX_FMT_FWHT_STATELESS, 0, 3, 1, 1, 1, 1, 1, 0, 1
> +};
> +
>  static void vicodec_dev_release(struct device *dev)
>  {
>  }
> @@ -1463,6 +1467,7 @@ static int queue_init(void *priv, struct vb2_queue 
> *src_vq,
>  #define VICODEC_CID_CUSTOM_BASE              (V4L2_CID_MPEG_BASE | 0xf000)
>  #define VICODEC_CID_I_FRAME_QP               (VICODEC_CID_CUSTOM_BASE + 0)
>  #define VICODEC_CID_P_FRAME_QP               (VICODEC_CID_CUSTOM_BASE + 1)
> +#define VICODEC_CID_STATELESS_FWHT   (VICODEC_CID_CUSTOM_BASE + 2)
>  
>  static int vicodec_s_ctrl(struct v4l2_ctrl *ctrl)
>  {
> @@ -1509,6 +1514,13 @@ static const struct v4l2_ctrl_config 
> vicodec_ctrl_p_frame = {
>       .step = 1,
>  };
>  
> +static const struct v4l2_ctrl_config vicodec_ctrl_stateless_state = {
> +     .id             = VICODEC_CID_STATELESS_FWHT,
> +     .elem_size      = sizeof(struct v4l2_ctrl_fwht_params),
> +     .name           = "FWHT-Stateless State Params",
> +     .type           = V4L2_CTRL_TYPE_FWHT_PARAMS,
> +};
> +
>  /*
>   * File operations
>   */
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c 
> b/drivers/media/v4l2-core/v4l2-ctrls.c
> index 99308dac2daa..b05e51312430 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -1669,6 +1669,9 @@ static int std_validate(const struct v4l2_ctrl *ctrl, 
> u32 idx,
>       case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
>               return 0;
>  
> +     case V4L2_CTRL_TYPE_FWHT_PARAMS:
> +             return 0;
> +
>       default:
>               return -EINVAL;
>       }
> @@ -2249,6 +2252,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct 
> v4l2_ctrl_handler *hdl,
>       case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
>               elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantization);
>               break;
> +     case V4L2_CTRL_TYPE_FWHT_PARAMS:
> +             elem_size = sizeof(struct v4l2_ctrl_fwht_params);
> +             break;
>       default:
>               if (type < V4L2_CTRL_COMPOUND_TYPES)
>                       elem_size = sizeof(s32);
> diff --git a/include/uapi/linux/v4l2-controls.h 
> b/include/uapi/linux/v4l2-controls.h
> index 06479f2fb3ae..2d6e91cb615a 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -52,6 +52,7 @@
>  
>  #include <linux/types.h>
>  
> +#define V4L2_CTRL_TYPE_FWHT_PARAMS 0x0105
>  /* Control classes */
>  #define V4L2_CTRL_CLASS_USER         0x00980000      /* Old-style 'user' 
> controls */
>  #define V4L2_CTRL_CLASS_MPEG         0x00990000      /* MPEG-compression 
> controls */
> @@ -1096,4 +1097,13 @@ enum v4l2_detect_md_mode {
>  #define V4L2_CID_DETECT_MD_THRESHOLD_GRID    (V4L2_CID_DETECT_CLASS_BASE + 3)
>  #define V4L2_CID_DETECT_MD_REGION_GRID               
> (V4L2_CID_DETECT_CLASS_BASE + 4)
>  
> +struct v4l2_ctrl_fwht_params {
> +     __u32 flags;
> +     __u32 colorspace;
> +     __u32 xfer_func;
> +     __u32 ycbcr_enc;
> +     __u32 quantization;
> +     __u64 backward_ref_ts;

It is best if backward_ref_ts is moved to the beginning of the struct.

The problem here is that 64 bit fields are aligned to an 8 byte
boundary and so a 4 byte hole is inserted before backward_ref_ts. Also,
the i686 architecture is different from most other 32 bit architectures
in that it aligns 64 bit values to a 4 byte boundary. As a result using
this structure will require a 32 bit to 64 bit conversion since the
layout is different.

To avoid all this mess it is best to always place 64 bit values at a
proper 8 byte alignment.

> +};
> +
>  #endif
> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
> index 9a920f071ff9..37ac240eba01 100644
> --- a/include/uapi/linux/videodev2.h
> +++ b/include/uapi/linux/videodev2.h
> @@ -665,6 +665,7 @@ struct v4l2_pix_format {
>  #define V4L2_PIX_FMT_VP9      v4l2_fourcc('V', 'P', '9', '0') /* VP9 */
>  #define V4L2_PIX_FMT_HEVC     v4l2_fourcc('H', 'E', 'V', 'C') /* HEVC aka 
> H.265 */
>  #define V4L2_PIX_FMT_FWHT     v4l2_fourcc('F', 'W', 'H', 'T') /* Fast Walsh 
> Hadamard Transform (vicodec) */
> +#define V4L2_PIX_FMT_FWHT_STATELESS     v4l2_fourcc('S', 'F', 'W', 'H') /* 
> Stateless FWHT (vicodec) */
>  
>  /*  Vendor-specific formats   */
>  #define V4L2_PIX_FMT_CPIA1    v4l2_fourcc('C', 'P', 'I', 'A') /* cpia1 YUV */
> 

Regards,

        Hans

Reply via email to