Merge tag 'v5.2-rc4' into media/master
[sfrench/cifs-2.6.git] / drivers / media / v4l2-core / v4l2-ctrls.c
index 7d3a332587483f45c7a3ab367259637f5af2ba97..f2b9bdedbf8cfc94208c25764af78867f37dd654 100644 (file)
@@ -394,6 +394,21 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
                "Explicit",
                NULL,
        };
+       static const char * const mpeg_mpeg2_level[] = {
+               "Low",
+               "Main",
+               "High 1440",
+               "High",
+               NULL,
+       };
+       static const char * const mpeg2_profile[] = {
+               "Simple",
+               "Main",
+               "SNR Scalable",
+               "Spatially Scalable",
+               "High",
+               NULL,
+       };
        static const char * const mpeg_mpeg4_level[] = {
                "0",
                "0b",
@@ -610,6 +625,10 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
                return h264_fp_arrangement_type;
        case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:
                return h264_fmo_map_type;
+       case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:
+               return mpeg_mpeg2_level;
+       case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:
+               return mpeg2_profile;
        case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
                return mpeg_mpeg4_level;
        case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
@@ -820,6 +839,13 @@ const char *v4l2_ctrl_get_name(u32 id)
        case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:           return "H264 I-Frame Maximum QP Value";
        case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:           return "H264 P-Frame Minimum QP Value";
        case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:           return "H264 P-Frame Maximum QP Value";
+       case V4L2_CID_MPEG_VIDEO_H264_SPS:                      return "H264 Sequence Parameter Set";
+       case V4L2_CID_MPEG_VIDEO_H264_PPS:                      return "H264 Picture Parameter Set";
+       case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:           return "H264 Scaling Matrix";
+       case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS:             return "H264 Slice Parameters";
+       case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS:            return "H264 Decode Parameters";
+       case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:                   return "MPEG2 Level";
+       case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:                 return "MPEG2 Profile";
        case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP:              return "MPEG4 I-Frame QP Value";
        case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP:              return "MPEG4 P-Frame QP Value";
        case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP:              return "MPEG4 B-Frame QP Value";
@@ -1145,6 +1171,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
        case V4L2_CID_FLASH_STROBE_STOP:
        case V4L2_CID_AUTO_FOCUS_START:
        case V4L2_CID_AUTO_FOCUS_STOP:
+       case V4L2_CID_DO_WHITE_BALANCE:
                *type = V4L2_CTRL_TYPE_BUTTON;
                *flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
                          V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
@@ -1184,6 +1211,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
        case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:
        case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:
+       case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:
+       case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:
        case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
        case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
        case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
@@ -1301,6 +1330,21 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
        case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS:
                *type = V4L2_CTRL_TYPE_FWHT_PARAMS;
                break;
+       case V4L2_CID_MPEG_VIDEO_H264_SPS:
+               *type = V4L2_CTRL_TYPE_H264_SPS;
+               break;
+       case V4L2_CID_MPEG_VIDEO_H264_PPS:
+               *type = V4L2_CTRL_TYPE_H264_PPS;
+               break;
+       case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:
+               *type = V4L2_CTRL_TYPE_H264_SCALING_MATRIX;
+               break;
+       case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS:
+               *type = V4L2_CTRL_TYPE_H264_SLICE_PARAMS;
+               break;
+       case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS:
+               *type = V4L2_CTRL_TYPE_H264_DECODE_PARAMS;
+               break;
        default:
                *type = V4L2_CTRL_TYPE_INTEGER;
                break;
@@ -1453,7 +1497,14 @@ static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx,
 static void std_init(const struct v4l2_ctrl *ctrl, u32 idx,
                     union v4l2_ctrl_ptr ptr)
 {
-       switch (ctrl->type) {
+       struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
+
+       /*
+        * The cast is needed to get rid of a gcc warning complaining that
+        * V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS is not part of the
+        * v4l2_ctrl_type enum.
+        */
+       switch ((u32)ctrl->type) {
        case V4L2_CTRL_TYPE_STRING:
                idx *= ctrl->elem_size;
                memset(ptr.p_char + idx, ' ', ctrl->minimum);
@@ -1478,6 +1529,17 @@ static void std_init(const struct v4l2_ctrl *ctrl, u32 idx,
        case V4L2_CTRL_TYPE_U32:
                ptr.p_u32[idx] = ctrl->default_value;
                break;
+       case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
+               p_mpeg2_slice_params = ptr.p;
+               /* 4:2:0 */
+               p_mpeg2_slice_params->sequence.chroma_format = 1;
+               /* 8 bits */
+               p_mpeg2_slice_params->picture.intra_dc_precision = 0;
+               /* interlaced top field */
+               p_mpeg2_slice_params->picture.picture_structure = 1;
+               p_mpeg2_slice_params->picture.picture_coding_type =
+                                       V4L2_MPEG2_PICTURE_CODING_TYPE_I;
+               break;
        default:
                idx *= ctrl->elem_size;
                memset(ptr.p + idx, 0, ctrl->elem_size);
@@ -1670,6 +1732,13 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
        case V4L2_CTRL_TYPE_FWHT_PARAMS:
                return 0;
 
+       case V4L2_CTRL_TYPE_H264_SPS:
+       case V4L2_CTRL_TYPE_H264_PPS:
+       case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
+       case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
+       case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
+               return 0;
+
        default:
                return -EINVAL;
        }
@@ -2149,15 +2218,6 @@ static int handler_new_ref(struct v4l2_ctrl_handler *hdl,
        if (size_extra_req)
                new_ref->p_req.p = &new_ref[1];
 
-       if (ctrl->handler == hdl) {
-               /* By default each control starts in a cluster of its own.
-                  new_ref->ctrl is basically a cluster array with one
-                  element, so that's perfect to use as the cluster pointer.
-                  But only do this for the handler that owns the control. */
-               ctrl->cluster = &new_ref->ctrl;
-               ctrl->ncontrols = 1;
-       }
-
        INIT_LIST_HEAD(&new_ref->node);
 
        mutex_lock(hdl->lock);
@@ -2190,6 +2250,15 @@ insert_in_hash:
        hdl->buckets[bucket] = new_ref;
        if (ctrl_ref)
                *ctrl_ref = new_ref;
+       if (ctrl->handler == hdl) {
+               /* By default each control starts in a cluster of its own.
+                * new_ref->ctrl is basically a cluster array with one
+                * element, so that's perfect to use as the cluster pointer.
+                * But only do this for the handler that owns the control.
+                */
+               ctrl->cluster = &new_ref->ctrl;
+               ctrl->ncontrols = 1;
+       }
 
 unlock:
        mutex_unlock(hdl->lock);
@@ -2253,6 +2322,21 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
        case V4L2_CTRL_TYPE_FWHT_PARAMS:
                elem_size = sizeof(struct v4l2_ctrl_fwht_params);
                break;
+       case V4L2_CTRL_TYPE_H264_SPS:
+               elem_size = sizeof(struct v4l2_ctrl_h264_sps);
+               break;
+       case V4L2_CTRL_TYPE_H264_PPS:
+               elem_size = sizeof(struct v4l2_ctrl_h264_pps);
+               break;
+       case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
+               elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix);
+               break;
+       case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
+               elem_size = sizeof(struct v4l2_ctrl_h264_slice_params);
+               break;
+       case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
+               elem_size = sizeof(struct v4l2_ctrl_h264_decode_params);
+               break;
        default:
                if (type < V4L2_CTRL_COMPOUND_TYPES)
                        elem_size = sizeof(s32);