OSDN Git Service

media: vicodec: Introducing stateless fwht defs and structs
authorDafna Hirschfeld <dafna3@gmail.com>
Wed, 6 Mar 2019 21:13:40 +0000 (16:13 -0500)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 25 Mar 2019 18:02:30 +0000 (14:02 -0400)
Add structs and definitions needed to implement stateless
decoder for fwht and add I/P-frames QP controls to the
public api.

Signed-off-by: Dafna Hirschfeld <dafna3@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/vicodec/vicodec-core.c
drivers/media/v4l2-core/v4l2-ctrls.c
include/media/fwht-ctrls.h [new file with mode: 0644]
include/media/v4l2-ctrls.h
include/uapi/linux/v4l2-controls.h
include/uapi/linux/videodev2.h

index b86985b..a3a9d8a 100644 (file)
@@ -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)
 {
 }
@@ -1524,10 +1528,6 @@ static int queue_init(void *priv, struct vb2_queue *src_vq,
        return vb2_queue_init(dst_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)
-
 static int vicodec_s_ctrl(struct v4l2_ctrl *ctrl)
 {
        struct vicodec_ctx *ctx = container_of(ctrl->handler,
@@ -1537,10 +1537,10 @@ static int vicodec_s_ctrl(struct v4l2_ctrl *ctrl)
        case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
                ctx->state.gop_size = ctrl->val;
                return 0;
-       case VICODEC_CID_I_FRAME_QP:
+       case V4L2_CID_FWHT_I_FRAME_QP:
                ctx->state.i_frame_qp = ctrl->val;
                return 0;
-       case VICODEC_CID_P_FRAME_QP:
+       case V4L2_CID_FWHT_P_FRAME_QP:
                ctx->state.p_frame_qp = ctrl->val;
                return 0;
        }
@@ -1551,26 +1551,9 @@ static const struct v4l2_ctrl_ops vicodec_ctrl_ops = {
        .s_ctrl = vicodec_s_ctrl,
 };
 
-static const struct v4l2_ctrl_config vicodec_ctrl_i_frame = {
-       .ops = &vicodec_ctrl_ops,
-       .id = VICODEC_CID_I_FRAME_QP,
-       .name = "FWHT I-Frame QP Value",
-       .type = V4L2_CTRL_TYPE_INTEGER,
-       .min = 1,
-       .max = 31,
-       .def = 20,
-       .step = 1,
-};
-
-static const struct v4l2_ctrl_config vicodec_ctrl_p_frame = {
-       .ops = &vicodec_ctrl_ops,
-       .id = VICODEC_CID_P_FRAME_QP,
-       .name = "FWHT P-Frame QP Value",
-       .type = V4L2_CTRL_TYPE_INTEGER,
-       .min = 1,
-       .max = 31,
-       .def = 20,
-       .step = 1,
+static const struct v4l2_ctrl_config vicodec_ctrl_stateless_state = {
+       .id             = V4L2_CID_MPEG_VIDEO_FWHT_PARAMS,
+       .elem_size      = sizeof(struct v4l2_ctrl_fwht_params),
 };
 
 /*
@@ -1603,8 +1586,10 @@ static int vicodec_open(struct file *file)
        v4l2_ctrl_handler_init(hdl, 4);
        v4l2_ctrl_new_std(hdl, &vicodec_ctrl_ops, V4L2_CID_MPEG_VIDEO_GOP_SIZE,
                          1, 16, 1, 10);
-       v4l2_ctrl_new_custom(hdl, &vicodec_ctrl_i_frame, NULL);
-       v4l2_ctrl_new_custom(hdl, &vicodec_ctrl_p_frame, NULL);
+       v4l2_ctrl_new_std(hdl, &vicodec_ctrl_ops, V4L2_CID_FWHT_I_FRAME_QP,
+                         1, 31, 1, 20);
+       v4l2_ctrl_new_std(hdl, &vicodec_ctrl_ops, V4L2_CID_FWHT_P_FRAME_QP,
+                         1, 31, 1, 20);
        if (hdl->error) {
                rc = hdl->error;
                v4l2_ctrl_handler_free(hdl);
index 54d66db..aed1c3a 100644 (file)
@@ -849,6 +849,9 @@ const char *v4l2_ctrl_get_name(u32 id)
        case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:               return "Force Key Frame";
        case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:            return "MPEG-2 Slice Parameters";
        case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION:            return "MPEG-2 Quantization Matrices";
+       case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS:                   return "FWHT Stateless Parameters";
+       case V4L2_CID_FWHT_I_FRAME_QP:                          return "FWHT I-Frame QP Value";
+       case V4L2_CID_FWHT_P_FRAME_QP:                          return "FWHT P-Frame QP Value";
 
        /* VPX controls */
        case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:            return "VPX Number of Partitions";
@@ -1303,6 +1306,9 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
        case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION:
                *type = V4L2_CTRL_TYPE_MPEG2_QUANTIZATION;
                break;
+       case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS:
+               *type = V4L2_CTRL_TYPE_FWHT_PARAMS;
+               break;
        default:
                *type = V4L2_CTRL_TYPE_INTEGER;
                break;
@@ -1669,6 +1675,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 +2258,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/media/fwht-ctrls.h b/include/media/fwht-ctrls.h
new file mode 100644 (file)
index 0000000..6150274
--- /dev/null
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * These are the FWHT state controls for use with stateless FWHT
+ * codec drivers.
+ *
+ * It turns out that these structs are not stable yet and will undergo
+ * more changes. So keep them private until they are stable and ready to
+ * become part of the official public API.
+ */
+
+#ifndef _FWHT_CTRLS_H_
+#define _FWHT_CTRLS_H_
+
+#define V4L2_CTRL_TYPE_FWHT_PARAMS 0x0105
+
+#define V4L2_CID_MPEG_VIDEO_FWHT_PARAMS        (V4L2_CID_MPEG_BASE + 292)
+
+struct v4l2_ctrl_fwht_params {
+       __u64 backward_ref_ts;
+       __u32 version;
+       __u32 width;
+       __u32 height;
+       __u32 flags;
+       __u32 colorspace;
+       __u32 xfer_func;
+       __u32 ycbcr_enc;
+       __u32 quantization;
+};
+
+
+#endif
index 200f8a6..bd621ce 100644 (file)
 #include <media/media-request.h>
 
 /*
- * Include the mpeg2 stateless codec compound control definitions.
+ * Include the mpeg2 and fwht stateless codec compound control definitions.
  * This will move to the public headers once this API is fully stable.
  */
 #include <media/mpeg2-ctrls.h>
+#include <media/fwht-ctrls.h>
 
 /* forward references */
 struct file;
@@ -49,6 +50,7 @@ struct poll_table_struct;
  * @p_char:                    Pointer to a string.
  * @p_mpeg2_slice_params:      Pointer to a MPEG2 slice parameters structure.
  * @p_mpeg2_quantization:      Pointer to a MPEG2 quantization data structure.
+ * @p_fwht_params:             Pointer to a FWHT stateless parameters structure.
  * @p:                         Pointer to a compound value.
  */
 union v4l2_ctrl_ptr {
@@ -60,6 +62,7 @@ union v4l2_ctrl_ptr {
        char *p_char;
        struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
        struct v4l2_ctrl_mpeg2_quantization *p_mpeg2_quantization;
+       struct v4l2_ctrl_fwht_params *p_fwht_params;
        void *p;
 };
 
index 06479f2..78816ec 100644 (file)
@@ -404,6 +404,10 @@ enum v4l2_mpeg_video_multi_slice_mode {
 #define V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE          (V4L2_CID_MPEG_BASE+228)
 #define V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME            (V4L2_CID_MPEG_BASE+229)
 
+/* CIDs for the FWHT codec as used by the vicodec driver. */
+#define V4L2_CID_FWHT_I_FRAME_QP             (V4L2_CID_MPEG_BASE + 290)
+#define V4L2_CID_FWHT_P_FRAME_QP             (V4L2_CID_MPEG_BASE + 291)
+
 #define V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP            (V4L2_CID_MPEG_BASE+300)
 #define V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP            (V4L2_CID_MPEG_BASE+301)
 #define V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP            (V4L2_CID_MPEG_BASE+302)
index 1db220d..496e645 100644 (file)
@@ -669,6 +669,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 */