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 <dafna3@xxxxxxxxx> > --- > 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