v4l2codecs: h264: Update to the new uAPI
authorEzequiel Garcia <ezequiel@collabora.com>
Wed, 30 Sep 2020 13:40:51 +0000 (10:40 -0300)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 2 Mar 2021 22:03:34 +0000 (22:03 +0000)
Starting from Linux v5.11, the V4L2 stateless H.264 uAPI
is updated and stable.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624>

sys/v4l2codecs/gstv4l2codech264dec.c
sys/v4l2codecs/linux/h264-ctrls.h [deleted file]
sys/v4l2codecs/linux/media.h
sys/v4l2codecs/linux/types-compat.h
sys/v4l2codecs/linux/v4l2-common.h
sys/v4l2codecs/linux/v4l2-controls.h
sys/v4l2codecs/linux/videodev2.h
sys/v4l2codecs/plugin.c

index 53efadd..892c8a6 100644 (file)
@@ -24,7 +24,7 @@
 #include "gstv4l2codecallocator.h"
 #include "gstv4l2codech264dec.h"
 #include "gstv4l2codecpool.h"
-#include "linux/h264-ctrls.h"
+#include "linux/v4l2-controls.h"
 
 GST_DEBUG_CATEGORY_STATIC (v4l2_h264dec_debug);
 #define GST_CAT_DEFAULT v4l2_h264dec_debug
@@ -60,6 +60,7 @@ struct _GstV4l2CodecH264Dec
   gint coded_height;
   guint bitdepth;
   guint chroma_format_idc;
+  guint num_slices;
 
   GstV4l2CodecAllocator *sink_allocator;
   GstV4l2CodecAllocator *src_allocator;
@@ -73,10 +74,11 @@ struct _GstV4l2CodecH264Dec
   struct v4l2_ctrl_h264_pps pps;
   struct v4l2_ctrl_h264_scaling_matrix scaling_matrix;
   struct v4l2_ctrl_h264_decode_params decode_params;
+  struct v4l2_ctrl_h264_pred_weights pred_weight;
   GArray *slice_params;
 
-  enum v4l2_mpeg_video_h264_decode_mode decode_mode;
-  enum v4l2_mpeg_video_h264_start_code start_code;
+  enum v4l2_stateless_h264_decode_mode decode_mode;
+  enum v4l2_stateless_h264_start_code start_code;
 
   GstMemory *bitstream;
   GstMapInfo bitstream_map;
@@ -91,19 +93,19 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstV4l2CodecH264Dec,
 static gboolean
 is_frame_based (GstV4l2CodecH264Dec * self)
 {
-  return self->decode_mode == V4L2_MPEG_VIDEO_H264_DECODE_MODE_FRAME_BASED;
+  return self->decode_mode == V4L2_STATELESS_H264_DECODE_MODE_FRAME_BASED;
 }
 
 static gboolean
 is_slice_based (GstV4l2CodecH264Dec * self)
 {
-  return self->decode_mode == V4L2_MPEG_VIDEO_H264_DECODE_MODE_SLICE_BASED;
+  return self->decode_mode == V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED;
 }
 
 static gboolean
 needs_start_codes (GstV4l2CodecH264Dec * self)
 {
-  return self->start_code == V4L2_MPEG_VIDEO_H264_START_CODE_ANNEX_B;
+  return self->start_code == V4L2_STATELESS_H264_START_CODE_ANNEX_B;
 }
 
 
@@ -114,10 +116,10 @@ gst_v4l2_codec_h264_dec_open (GstVideoDecoder * decoder)
   /* *INDENT-OFF* */
   struct v4l2_ext_control control[] = {
     {
-      .id = V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE,
+      .id = V4L2_CID_STATELESS_H264_DECODE_MODE,
     },
     {
-      .id = V4L2_CID_MPEG_VIDEO_H264_START_CODE,
+      .id = V4L2_CID_STATELESS_H264_START_CODE,
     },
   };
   /* *INDENT-ON* */
@@ -229,7 +231,7 @@ gst_v4l2_codec_h264_dec_negotiate (GstVideoDecoder * decoder)
   /* *INDENT-OFF* */
   struct v4l2_ext_control control[] = {
     {
-      .id = V4L2_CID_MPEG_VIDEO_H264_SPS,
+      .id = V4L2_CID_STATELESS_H264_SPS,
       .ptr = &self->sps,
       .size = sizeof (self->sps),
     },
@@ -416,7 +418,7 @@ gst_v4l2_codec_h264_dec_fill_pps (GstV4l2CodecH264Dec * self, GstH264PPS * pps)
         | (pps->constrained_intra_pred_flag ? V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED : 0)
         | (pps->redundant_pic_cnt_present_flag ? V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT : 0)
         | (pps->transform_8x8_mode_flag ? V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE : 0)
-        | V4L2_H264_PPS_FLAG_PIC_SCALING_MATRIX_PRESENT,
+        | V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT,
   };
   /* *INDENT-ON* */
 }
@@ -453,21 +455,44 @@ gst_v4l2_codec_h264_dec_fill_decoder_params (GstV4l2CodecH264Dec * self,
 
   /* *INDENT-OFF* */
   self->decode_params = (struct v4l2_ctrl_h264_decode_params) {
-    .num_slices = 0,            /* will be incremented as we receive slices */
     .nal_ref_idc = picture->nal_ref_idc,
     .top_field_order_cnt = picture->top_field_order_cnt,
     .bottom_field_order_cnt = picture->bottom_field_order_cnt,
-    .flags = picture->idr ? V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC : 0,
+    .frame_num = slice_hdr->frame_num,
+    .idr_pic_id = slice_hdr->idr_pic_id,
+    .pic_order_cnt_lsb = slice_hdr->pic_order_cnt_lsb,
+    .delta_pic_order_cnt_bottom = slice_hdr->delta_pic_order_cnt_bottom,
+    .delta_pic_order_cnt0 = slice_hdr->delta_pic_order_cnt[0],
+    .delta_pic_order_cnt1 = slice_hdr->delta_pic_order_cnt[1],
+    .dec_ref_pic_marking_bit_size = slice_hdr->dec_ref_pic_marking.bit_size,
+    .pic_order_cnt_bit_size = slice_hdr->pic_order_cnt_bit_size,
+    .slice_group_change_cycle = slice_hdr->slice_group_change_cycle,
+    .flags = (picture->idr ? V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC : 0) |
+             (slice_hdr->field_pic_flag ? V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC : 0) |
+             (slice_hdr->bottom_field_flag ? V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD : 0),
   };
 
   for (i = 0; i < refs->len; i++) {
     GstH264Picture *ref_pic = g_array_index (refs, GstH264Picture *, i);
     gint pic_num = ref_pic->pic_num;
+    guchar dpb_ref = 0;
 
     /* Unwrap pic_num */
     if (pic_num < 0)
       pic_num += slice_hdr->max_pic_num;
 
+    switch (ref_pic->field) {
+    case GST_H264_PICTURE_FIELD_FRAME:
+      dpb_ref = V4L2_H264_FRAME_REF;
+      break;
+    case GST_H264_PICTURE_FIELD_TOP_FIELD:
+      dpb_ref = V4L2_H264_TOP_FIELD_REF;
+      break;
+    case GST_H264_PICTURE_FIELD_BOTTOM_FIELD:
+      dpb_ref = V4L2_H264_BOTTOM_FIELD_REF;
+      break;
+    }
+
     self->decode_params.dpb[i] = (struct v4l2_h264_dpb_entry) {
       /*
        * The reference is multiplied by 1000 because it's wassed as micro
@@ -483,6 +508,7 @@ gst_v4l2_codec_h264_dec_fill_decoder_params (GstV4l2CodecH264Dec * self,
               V4L2_H264_DPB_ENTRY_FLAG_ACTIVE : 0)
           | (GST_H264_PICTURE_IS_LONG_TERM_REF (ref_pic) ?
               V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM : 0),
+      .fields = dpb_ref,
     };
   }
   /* *INDENT-ON* */
@@ -490,6 +516,60 @@ gst_v4l2_codec_h264_dec_fill_decoder_params (GstV4l2CodecH264Dec * self,
   g_array_unref (refs);
 }
 
+static void
+gst_v4l2_codec_h264_dec_fill_pred_weight (GstV4l2CodecH264Dec * self,
+    GstH264SliceHdr * slice_hdr)
+{
+  gint i, j;
+
+  /* *INDENT-OFF* */
+  self->pred_weight = (struct v4l2_ctrl_h264_pred_weights) {
+    .luma_log2_weight_denom = slice_hdr->pred_weight_table.luma_log2_weight_denom,
+    .chroma_log2_weight_denom = slice_hdr->pred_weight_table.chroma_log2_weight_denom,
+  };
+  /* *INDENT-ON* */
+
+  for (i = 0; i <= slice_hdr->num_ref_idx_l0_active_minus1; i++) {
+    self->pred_weight.weight_factors[0].luma_weight[i] =
+        slice_hdr->pred_weight_table.luma_weight_l0[i];
+    self->pred_weight.weight_factors[0].luma_offset[i] =
+        slice_hdr->pred_weight_table.luma_offset_l0[i];
+  }
+
+  if (slice_hdr->pps->sequence->chroma_array_type != 0) {
+    for (i = 0; i <= slice_hdr->num_ref_idx_l0_active_minus1; i++) {
+      for (j = 0; j < 2; j++) {
+        self->pred_weight.weight_factors[0].chroma_weight[i][j] =
+            slice_hdr->pred_weight_table.chroma_weight_l0[i][j];
+        self->pred_weight.weight_factors[0].chroma_offset[i][j] =
+            slice_hdr->pred_weight_table.chroma_offset_l0[i][j];
+      }
+    }
+  }
+
+  /* Skip l1 if this is not a B-Frames. */
+  if (slice_hdr->type % 5 != GST_H264_B_SLICE)
+    return;
+
+  for (i = 0; i <= slice_hdr->num_ref_idx_l1_active_minus1; i++) {
+    self->pred_weight.weight_factors[0].luma_weight[i] =
+        slice_hdr->pred_weight_table.luma_weight_l1[i];
+    self->pred_weight.weight_factors[0].luma_offset[i] =
+        slice_hdr->pred_weight_table.luma_offset_l1[i];
+  }
+
+  if (slice_hdr->pps->sequence->chroma_array_type != 0) {
+    for (i = 0; i <= slice_hdr->num_ref_idx_l1_active_minus1; i++) {
+      for (j = 0; j < 2; j++) {
+        self->pred_weight.weight_factors[1].chroma_weight[i][j] =
+            slice_hdr->pred_weight_table.chroma_weight_l1[i][j];
+        self->pred_weight.weight_factors[1].chroma_offset[i][j] =
+            slice_hdr->pred_weight_table.chroma_offset_l1[i][j];
+      }
+    }
+  }
+}
+
 static guint
 get_slice_header_bit_size (GstH264Slice * slice)
 {
@@ -501,13 +581,12 @@ static void
 gst_v4l2_codec_h264_dec_fill_slice_params (GstV4l2CodecH264Dec * self,
     GstH264Slice * slice)
 {
-  gint n = self->decode_params.num_slices++;
+  gint n = self->num_slices++;
   gsize slice_size = slice->nalu.size;
   struct v4l2_ctrl_h264_slice_params *params;
-  gint i, j;
 
   /* Ensure array is large enough */
-  if (self->slice_params->len < self->decode_params.num_slices)
+  if (self->slice_params->len < self->num_slices)
     g_array_set_size (self->slice_params, self->slice_params->len * 2);
 
   if (needs_start_codes (self))
@@ -516,26 +595,11 @@ gst_v4l2_codec_h264_dec_fill_slice_params (GstV4l2CodecH264Dec * self,
   /* *INDENT-OFF* */
   params = &g_array_index (self->slice_params, struct v4l2_ctrl_h264_slice_params, n);
   *params = (struct v4l2_ctrl_h264_slice_params) {
-    .size = slice_size,
-    .start_byte_offset = self->bitstream_map.size,
     .header_bit_size = get_slice_header_bit_size (slice),
     .first_mb_in_slice = slice->header.first_mb_in_slice,
     .slice_type = slice->header.type % 5,
-    .pic_parameter_set_id = slice->header.pps->id,
     .colour_plane_id = slice->header.colour_plane_id,
     .redundant_pic_cnt = slice->header.redundant_pic_cnt,
-    .frame_num = slice->header.frame_num,
-    .idr_pic_id = slice->header.idr_pic_id,
-    .pic_order_cnt_lsb = slice->header.pic_order_cnt_lsb,
-    .delta_pic_order_cnt_bottom = slice->header.delta_pic_order_cnt_bottom,
-    .delta_pic_order_cnt0 = slice->header.delta_pic_order_cnt[0],
-    .delta_pic_order_cnt1 = slice->header.delta_pic_order_cnt[1],
-    .pred_weight_table = (struct v4l2_h264_pred_weight_table) {
-      .luma_log2_weight_denom = slice->header.pred_weight_table.luma_log2_weight_denom,
-      .chroma_log2_weight_denom = slice->header.pred_weight_table.chroma_log2_weight_denom,
-    },
-    .dec_ref_pic_marking_bit_size = slice->header.dec_ref_pic_marking.bit_size,
-    .pic_order_cnt_bit_size = slice->header.pic_order_cnt_bit_size,
     .cabac_init_idc = slice->header.cabac_init_idc,
     .slice_qp_delta = slice->header.slice_qp_delta,
     .slice_qs_delta = slice->header.slice_qs_delta,
@@ -544,54 +608,10 @@ gst_v4l2_codec_h264_dec_fill_slice_params (GstV4l2CodecH264Dec * self,
     .slice_beta_offset_div2 = slice->header.slice_beta_offset_div2,
     .num_ref_idx_l0_active_minus1 = slice->header.num_ref_idx_l0_active_minus1,
     .num_ref_idx_l1_active_minus1 = slice->header.num_ref_idx_l1_active_minus1,
-    .slice_group_change_cycle = slice->header.slice_group_change_cycle,
-
-    .flags = (slice->header.field_pic_flag ? V4L2_H264_SLICE_FLAG_FIELD_PIC : 0) |
-             (slice->header.bottom_field_flag ? V4L2_H264_SLICE_FLAG_BOTTOM_FIELD : 0) |
-             (slice->header.direct_spatial_mv_pred_flag ? V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED : 0) |
+    .flags = (slice->header.direct_spatial_mv_pred_flag ? V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED : 0) |
              (slice->header.sp_for_switch_flag ? V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH : 0),
   };
   /* *INDENT-ON* */
-
-  for (i = 0; i <= slice->header.num_ref_idx_l0_active_minus1; i++) {
-    params->pred_weight_table.weight_factors[0].luma_weight[i] =
-        slice->header.pred_weight_table.luma_weight_l0[i];
-    params->pred_weight_table.weight_factors[0].luma_offset[i] =
-        slice->header.pred_weight_table.luma_offset_l0[i];
-  }
-
-  if (slice->header.pps->sequence->chroma_array_type != 0) {
-    for (i = 0; i <= slice->header.num_ref_idx_l0_active_minus1; i++) {
-      for (j = 0; j < 2; j++) {
-        params->pred_weight_table.weight_factors[0].chroma_weight[i][j] =
-            slice->header.pred_weight_table.chroma_weight_l0[i][j];
-        params->pred_weight_table.weight_factors[0].chroma_offset[i][j] =
-            slice->header.pred_weight_table.chroma_offset_l0[i][j];
-      }
-    }
-  }
-
-  /* Skip l1 if this is not a B-Frame. */
-  if (slice->header.type % 5 != GST_H264_B_SLICE)
-    return;
-
-  for (i = 0; i <= slice->header.num_ref_idx_l1_active_minus1; i++) {
-    params->pred_weight_table.weight_factors[1].luma_weight[i] =
-        slice->header.pred_weight_table.luma_weight_l1[i];
-    params->pred_weight_table.weight_factors[1].luma_offset[i] =
-        slice->header.pred_weight_table.luma_offset_l1[i];
-  }
-
-  if (slice->header.pps->sequence->chroma_array_type != 0) {
-    for (i = 0; i <= slice->header.num_ref_idx_l1_active_minus1; i++) {
-      for (j = 0; j < 2; j++) {
-        params->pred_weight_table.weight_factors[1].chroma_weight[i][j] =
-            slice->header.pred_weight_table.chroma_weight_l1[i][j];
-        params->pred_weight_table.weight_factors[1].chroma_offset[i][j] =
-            slice->header.pred_weight_table.chroma_offset_l1[i][j];
-      }
-    }
-  }
 }
 
 static guint8
@@ -633,15 +653,17 @@ gst_v4l2_codec_h264_dec_fill_references (GstV4l2CodecH264Dec * self,
   for (i = 0; i < ref_pic_list0->len; i++) {
     GstH264Picture *ref_pic =
         g_array_index (ref_pic_list0, GstH264Picture *, i);
-    slice_params->ref_pic_list0[i] =
+    slice_params->ref_pic_list0[i].index =
         lookup_dpb_index (self->decode_params.dpb, ref_pic);
+    slice_params->ref_pic_list0[i].fields = 0;
   }
 
   for (i = 0; i < ref_pic_list1->len; i++) {
     GstH264Picture *ref_pic =
         g_array_index (ref_pic_list1, GstH264Picture *, i);
-    slice_params->ref_pic_list1[i] =
+    slice_params->ref_pic_list1[i].index =
         lookup_dpb_index (self->decode_params.dpb, ref_pic);
+    slice_params->ref_pic_list1[i].fields = 0;
   }
 }
 
@@ -774,9 +796,6 @@ gst_v4l2_codec_h264_dec_start_picture (GstH264Decoder * decoder,
   gst_v4l2_codec_h264_dec_fill_decoder_params (self, &slice->header, picture,
       dpb);
 
-  if (is_frame_based (self))
-    gst_v4l2_codec_h264_dec_fill_slice_params (self, slice);
-
   return TRUE;
 }
 
@@ -886,7 +905,7 @@ gst_v4l2_codec_h264_dec_reset_picture (GstV4l2CodecH264Dec * self)
     self->bitstream_map = (GstMapInfo) GST_MAP_INFO_INIT;
   }
 
-  self->decode_params.num_slices = 0;
+  self->num_slices = 0;
 }
 
 static gboolean
@@ -925,28 +944,33 @@ gst_v4l2_codec_h264_dec_submit_bitstream (GstV4l2CodecH264Dec * self,
   /* *INDENT-OFF* */
   struct v4l2_ext_control control[] = {
     {
-      .id = V4L2_CID_MPEG_VIDEO_H264_SPS,
+      .id = V4L2_CID_STATELESS_H264_SPS,
       .ptr = &self->sps,
       .size = sizeof (self->sps),
     },
     {
-      .id = V4L2_CID_MPEG_VIDEO_H264_PPS,
+      .id = V4L2_CID_STATELESS_H264_PPS,
       .ptr = &self->pps,
       .size = sizeof (self->pps),
     },
     {
-      .id = V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX,
+      .id = V4L2_CID_STATELESS_H264_SCALING_MATRIX,
       .ptr = &self->scaling_matrix,
       .size = sizeof (self->scaling_matrix),
     },
     {
-      .id = V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS,
+      .id = V4L2_CID_STATELESS_H264_SLICE_PARAMS,
       .ptr = self->slice_params->data,
       .size = g_array_get_element_size (self->slice_params)
-              * self->decode_params.num_slices,
+              * self->num_slices,
+    },
+    {
+      .id = V4L2_CID_STATELESS_H264_PRED_WEIGHTS,
+      .ptr = &self->pred_weight,
+      .size = sizeof (self->pred_weight),
     },
     {
-      .id = V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS,
+      .id = V4L2_CID_STATELESS_H264_DECODE_PARAMS,
       .ptr = &self->decode_params,
       .size = sizeof (self->decode_params),
     },
@@ -1032,6 +1056,7 @@ gst_v4l2_codec_h264_dec_decode_slice (GstH264Decoder * decoder,
     }
 
     gst_v4l2_codec_h264_dec_fill_slice_params (self, slice);
+    gst_v4l2_codec_h264_dec_fill_pred_weight (self, &slice->header);
     gst_v4l2_codec_h264_dec_fill_references (self, ref_pic_list0,
         ref_pic_list1);
   }
diff --git a/sys/v4l2codecs/linux/h264-ctrls.h b/sys/v4l2codecs/linux/h264-ctrls.h
deleted file mode 100644 (file)
index 58aac28..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * These are the H.264 state controls for use with stateless H.264
- * 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 _H264_CTRLS_H_
-#define _H264_CTRLS_H_
-
-#include "linux/videodev2.h"
-
-/* Our pixel format isn't stable at the moment */
-#define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */
-
-/*
- * This is put insanely high to avoid conflicting with controls that
- * would be added during the phase where those controls are not
- * stable. It should be fixed eventually.
- */
-#define V4L2_CID_MPEG_VIDEO_H264_SPS           (V4L2_CID_MPEG_BASE+1000)
-#define V4L2_CID_MPEG_VIDEO_H264_PPS           (V4L2_CID_MPEG_BASE+1001)
-#define V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX        (V4L2_CID_MPEG_BASE+1002)
-#define V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS  (V4L2_CID_MPEG_BASE+1003)
-#define V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS (V4L2_CID_MPEG_BASE+1004)
-#define V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE   (V4L2_CID_MPEG_BASE+1005)
-#define V4L2_CID_MPEG_VIDEO_H264_START_CODE    (V4L2_CID_MPEG_BASE+1006)
-
-/* enum v4l2_ctrl_type type values */
-#define V4L2_CTRL_TYPE_H264_SPS                        0x0110
-#define V4L2_CTRL_TYPE_H264_PPS                        0x0111
-#define V4L2_CTRL_TYPE_H264_SCALING_MATRIX     0x0112
-#define V4L2_CTRL_TYPE_H264_SLICE_PARAMS       0x0113
-#define V4L2_CTRL_TYPE_H264_DECODE_PARAMS      0x0114
-
-enum v4l2_mpeg_video_h264_decode_mode {
-       V4L2_MPEG_VIDEO_H264_DECODE_MODE_SLICE_BASED,
-       V4L2_MPEG_VIDEO_H264_DECODE_MODE_FRAME_BASED,
-};
-
-enum v4l2_mpeg_video_h264_start_code {
-       V4L2_MPEG_VIDEO_H264_START_CODE_NONE,
-       V4L2_MPEG_VIDEO_H264_START_CODE_ANNEX_B,
-};
-
-#define V4L2_H264_SPS_CONSTRAINT_SET0_FLAG                     0x01
-#define V4L2_H264_SPS_CONSTRAINT_SET1_FLAG                     0x02
-#define V4L2_H264_SPS_CONSTRAINT_SET2_FLAG                     0x04
-#define V4L2_H264_SPS_CONSTRAINT_SET3_FLAG                     0x08
-#define V4L2_H264_SPS_CONSTRAINT_SET4_FLAG                     0x10
-#define V4L2_H264_SPS_CONSTRAINT_SET5_FLAG                     0x20
-
-#define V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE               0x01
-#define V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS     0x02
-#define V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO         0x04
-#define V4L2_H264_SPS_FLAG_GAPS_IN_FRAME_NUM_VALUE_ALLOWED     0x08
-#define V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY                      0x10
-#define V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD             0x20
-#define V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE                        0x40
-
-struct v4l2_ctrl_h264_sps {
-       __u8 profile_idc;
-       __u8 constraint_set_flags;
-       __u8 level_idc;
-       __u8 seq_parameter_set_id;
-       __u8 chroma_format_idc;
-       __u8 bit_depth_luma_minus8;
-       __u8 bit_depth_chroma_minus8;
-       __u8 log2_max_frame_num_minus4;
-       __u8 pic_order_cnt_type;
-       __u8 log2_max_pic_order_cnt_lsb_minus4;
-       __u8 max_num_ref_frames;
-       __u8 num_ref_frames_in_pic_order_cnt_cycle;
-       __s32 offset_for_ref_frame[255];
-       __s32 offset_for_non_ref_pic;
-       __s32 offset_for_top_to_bottom_field;
-       __u16 pic_width_in_mbs_minus1;
-       __u16 pic_height_in_map_units_minus1;
-       __u32 flags;
-};
-
-#define V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE                         0x0001
-#define V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT     0x0002
-#define V4L2_H264_PPS_FLAG_WEIGHTED_PRED                               0x0004
-#define V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT           0x0008
-#define V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED                      0x0010
-#define V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT                   0x0020
-#define V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE                          0x0040
-#define V4L2_H264_PPS_FLAG_PIC_SCALING_MATRIX_PRESENT                  0x0080
-
-struct v4l2_ctrl_h264_pps {
-       __u8 pic_parameter_set_id;
-       __u8 seq_parameter_set_id;
-       __u8 num_slice_groups_minus1;
-       __u8 num_ref_idx_l0_default_active_minus1;
-       __u8 num_ref_idx_l1_default_active_minus1;
-       __u8 weighted_bipred_idc;
-       __s8 pic_init_qp_minus26;
-       __s8 pic_init_qs_minus26;
-       __s8 chroma_qp_index_offset;
-       __s8 second_chroma_qp_index_offset;
-       __u16 flags;
-};
-
-struct v4l2_ctrl_h264_scaling_matrix {
-       __u8 scaling_list_4x4[6][16];
-       __u8 scaling_list_8x8[6][64];
-};
-
-struct v4l2_h264_weight_factors {
-       __s16 luma_weight[32];
-       __s16 luma_offset[32];
-       __s16 chroma_weight[32][2];
-       __s16 chroma_offset[32][2];
-};
-
-struct v4l2_h264_pred_weight_table {
-       __u16 luma_log2_weight_denom;
-       __u16 chroma_log2_weight_denom;
-       struct v4l2_h264_weight_factors weight_factors[2];
-};
-
-#define V4L2_H264_SLICE_TYPE_P                         0
-#define V4L2_H264_SLICE_TYPE_B                         1
-#define V4L2_H264_SLICE_TYPE_I                         2
-#define V4L2_H264_SLICE_TYPE_SP                                3
-#define V4L2_H264_SLICE_TYPE_SI                                4
-
-#define V4L2_H264_SLICE_FLAG_FIELD_PIC                 0x01
-#define V4L2_H264_SLICE_FLAG_BOTTOM_FIELD              0x02
-#define V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED    0x04
-#define V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH             0x08
-
-struct v4l2_ctrl_h264_slice_params {
-       /* Size in bytes, including header */
-       __u32 size;
-
-       /* Offset in bytes to the start of slice in the OUTPUT buffer. */
-       __u32 start_byte_offset;
-
-       /* Offset in bits to slice_data() from the beginning of this slice. */
-       __u32 header_bit_size;
-
-       __u16 first_mb_in_slice;
-       __u8 slice_type;
-       __u8 pic_parameter_set_id;
-       __u8 colour_plane_id;
-       __u8 redundant_pic_cnt;
-       __u16 frame_num;
-       __u16 idr_pic_id;
-       __u16 pic_order_cnt_lsb;
-       __s32 delta_pic_order_cnt_bottom;
-       __s32 delta_pic_order_cnt0;
-       __s32 delta_pic_order_cnt1;
-
-       struct v4l2_h264_pred_weight_table pred_weight_table;
-       /* Size in bits of dec_ref_pic_marking() syntax element. */
-       __u32 dec_ref_pic_marking_bit_size;
-       /* Size in bits of pic order count syntax. */
-       __u32 pic_order_cnt_bit_size;
-
-       __u8 cabac_init_idc;
-       __s8 slice_qp_delta;
-       __s8 slice_qs_delta;
-       __u8 disable_deblocking_filter_idc;
-       __s8 slice_alpha_c0_offset_div2;
-       __s8 slice_beta_offset_div2;
-       __u8 num_ref_idx_l0_active_minus1;
-       __u8 num_ref_idx_l1_active_minus1;
-       __u32 slice_group_change_cycle;
-
-       /*
-        * Entries on each list are indices into
-        * v4l2_ctrl_h264_decode_params.dpb[].
-        */
-       __u8 ref_pic_list0[32];
-       __u8 ref_pic_list1[32];
-
-       __u32 flags;
-};
-
-#define V4L2_H264_DPB_ENTRY_FLAG_VALID         0x01
-#define V4L2_H264_DPB_ENTRY_FLAG_ACTIVE                0x02
-#define V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM     0x04
-#define V4L2_H264_DPB_ENTRY_FLAG_FIELD         0x08
-#define V4L2_H264_DPB_ENTRY_FLAG_BOTTOM_FIELD  0x10
-
-struct v4l2_h264_dpb_entry {
-       __u64 reference_ts;
-       __u16 frame_num;
-       __u16 pic_num;
-       /* Note that field is indicated by v4l2_buffer.field */
-       __s32 top_field_order_cnt;
-       __s32 bottom_field_order_cnt;
-       __u32 flags; /* V4L2_H264_DPB_ENTRY_FLAG_* */
-};
-
-#define V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC    0x01
-
-struct v4l2_ctrl_h264_decode_params {
-       struct v4l2_h264_dpb_entry dpb[16];
-       __u16 num_slices;
-       __u16 nal_ref_idc;
-       __s32 top_field_order_cnt;
-       __s32 bottom_field_order_cnt;
-       __u32 flags; /* V4L2_H264_DECODE_PARAM_FLAG_* */
-};
-
-#endif
index 42ca51f..6873592 100644 (file)
 #ifndef __LINUX_MEDIA_H
 #define __LINUX_MEDIA_H
 
-#ifndef __KERNEL__
 #include <stdint.h>
-#define __user
-#endif
 #include "linux/types-compat.h"
 
 struct media_device_info {
@@ -127,6 +124,7 @@ struct media_device_info {
 #define MEDIA_ENT_F_PROC_VIDEO_STATISTICS      (MEDIA_ENT_F_BASE + 0x4006)
 #define MEDIA_ENT_F_PROC_VIDEO_ENCODER         (MEDIA_ENT_F_BASE + 0x4007)
 #define MEDIA_ENT_F_PROC_VIDEO_DECODER         (MEDIA_ENT_F_BASE + 0x4008)
+#define MEDIA_ENT_F_PROC_VIDEO_ISP             (MEDIA_ENT_F_BASE + 0x4009)
 
 /*
  * Switch and bridge entity functions
@@ -167,7 +165,6 @@ struct media_entity_desc {
                        __u32 minor;
                } dev;
 
-#if !defined(__KERNEL__)
                /*
                 * TODO: this shouldn't have been added without
                 * actual drivers that use this. When the first real driver
@@ -199,7 +196,6 @@ struct media_entity_desc {
                        __u32 minor;
                } fb;
                int dvb;
-#endif
 
                /* Sub-device specifications */
                /* Nothing needed yet */
@@ -236,9 +232,9 @@ struct media_link_desc {
 struct media_links_enum {
        __u32 entity;
        /* Should have enough room for pads elements */
-       struct media_pad_desc __user *pads;
+       struct media_pad_desc *pads;
        /* Should have enough room for links elements */
-       struct media_link_desc __user *links;
+       struct media_link_desc *links;
        __u32 reserved[4];
 };
 
@@ -267,21 +263,6 @@ struct media_links_enum {
 #define MEDIA_INTF_T_ALSA_PCM_PLAYBACK         (MEDIA_INTF_T_ALSA_BASE + 1)
 #define MEDIA_INTF_T_ALSA_CONTROL              (MEDIA_INTF_T_ALSA_BASE + 2)
 
-#if defined(__KERNEL__)
-
-/*
- * Connector functions
- *
- * For now these should not be used in userspace, as some definitions may
- * change.
- *
- * It is the responsibility of the entity drivers to add connectors and links.
- */
-#define MEDIA_ENT_F_CONN_RF                    (MEDIA_ENT_F_BASE + 0x30001)
-#define MEDIA_ENT_F_CONN_SVIDEO                        (MEDIA_ENT_F_BASE + 0x30002)
-#define MEDIA_ENT_F_CONN_COMPOSITE             (MEDIA_ENT_F_BASE + 0x30003)
-
-#endif
 
 /*
  * MC next gen API definitions
@@ -383,7 +364,6 @@ struct media_v2_topology {
 #define MEDIA_REQUEST_IOC_QUEUE                _IO('|',  0x80)
 #define MEDIA_REQUEST_IOC_REINIT       _IO('|',  0x81)
 
-#ifndef __KERNEL__
 
 /*
  * Legacy symbols used to avoid userspace compilation breakages.
@@ -435,6 +415,5 @@ struct media_v2_topology {
 /* Obsolete symbol for media_version, no longer used in the kernel */
 #define MEDIA_API_VERSION                      ((0 << 16) | (1 << 8) | 0)
 
-#endif
 
 #endif /* __LINUX_MEDIA_H */
index 10d8c30..e2502f3 100644 (file)
@@ -24,7 +24,7 @@
 #ifndef __TYPES_COMPAT_H__
 #define __TYPES_COMPAT_H__
 
-#define __user
+#define __inline__ inline
 
 #ifdef   __linux__
 #include <linux/types.h>
index 408f631..c06c315 100644 (file)
@@ -92,7 +92,6 @@ struct v4l2_edid {
        __u8  *edid;
 };
 
-#ifndef __KERNEL__
 /* Backward compatibility target definitions --- to be removed. */
 #define V4L2_SEL_TGT_CROP_ACTIVE       V4L2_SEL_TGT_CROP
 #define V4L2_SEL_TGT_COMPOSE_ACTIVE    V4L2_SEL_TGT_COMPOSE
@@ -105,6 +104,5 @@ struct v4l2_edid {
 #define V4L2_SUBDEV_SEL_FLAG_SIZE_GE   V4L2_SEL_FLAG_GE
 #define V4L2_SUBDEV_SEL_FLAG_SIZE_LE   V4L2_SEL_FLAG_LE
 #define V4L2_SUBDEV_SEL_FLAG_KEEP_CONFIG V4L2_SEL_FLAG_KEEP_CONFIG
-#endif
 
 #endif /* __V4L2_COMMON__ */
index 0983def..8b2e0f4 100644 (file)
@@ -54,7 +54,7 @@
 
 /* Control classes */
 #define V4L2_CTRL_CLASS_USER           0x00980000      /* Old-style 'user' controls */
-#define V4L2_CTRL_CLASS_MPEG           0x00990000      /* MPEG-compression controls */
+#define V4L2_CTRL_CLASS_CODEC          0x00990000      /* Stateful codec controls */
 #define V4L2_CTRL_CLASS_CAMERA         0x009a0000      /* Camera class controls */
 #define V4L2_CTRL_CLASS_FM_TX          0x009b0000      /* FM Modulator controls */
 #define V4L2_CTRL_CLASS_FLASH          0x009c0000      /* Camera flash controls */
@@ -65,6 +65,7 @@
 #define V4L2_CTRL_CLASS_FM_RX          0x00a10000      /* FM Receiver controls */
 #define V4L2_CTRL_CLASS_RF_TUNER       0x00a20000      /* RF tuner controls */
 #define V4L2_CTRL_CLASS_DETECT         0x00a30000      /* Detection controls */
+#define V4L2_CTRL_CLASS_CODEC_STATELESS 0x00a40000     /* Stateless codecs controls */
 
 /* User-class control IDs */
 
@@ -198,15 +199,26 @@ enum v4l2_colorfx {
  */
 #define V4L2_CID_USER_ATMEL_ISC_BASE           (V4L2_CID_USER_BASE + 0x10c0)
 
+/*
+ * The base for the CODA driver controls.
+ * We reserve 16 controls for this driver.
+ */
+#define V4L2_CID_USER_CODA_BASE                        (V4L2_CID_USER_BASE + 0x10e0)
+/*
+ * The base for MIPI CCS driver controls.
+ * We reserve 128 controls for this driver.
+ */
+#define V4L2_CID_USER_CCS_BASE                 (V4L2_CID_USER_BASE + 0x10f0)
+
 /* MPEG-class control IDs */
 /* The MPEG controls are applicable to all codec controls
  * and the 'MPEG' part of the define is historical */
 
-#define V4L2_CID_MPEG_BASE                     (V4L2_CTRL_CLASS_MPEG | 0x900)
-#define V4L2_CID_MPEG_CLASS                    (V4L2_CTRL_CLASS_MPEG | 1)
+#define V4L2_CID_CODEC_BASE                    (V4L2_CTRL_CLASS_CODEC | 0x900)
+#define V4L2_CID_CODEC_CLASS                   (V4L2_CTRL_CLASS_CODEC | 1)
 
 /*  MPEG streams, specific to multiplexed streams */
-#define V4L2_CID_MPEG_STREAM_TYPE              (V4L2_CID_MPEG_BASE+0)
+#define V4L2_CID_MPEG_STREAM_TYPE              (V4L2_CID_CODEC_BASE+0)
 enum v4l2_mpeg_stream_type {
        V4L2_MPEG_STREAM_TYPE_MPEG2_PS   = 0, /* MPEG-2 program stream */
        V4L2_MPEG_STREAM_TYPE_MPEG2_TS   = 1, /* MPEG-2 transport stream */
@@ -215,26 +227,26 @@ enum v4l2_mpeg_stream_type {
        V4L2_MPEG_STREAM_TYPE_MPEG1_VCD  = 4, /* MPEG-1 VCD-compatible stream */
        V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD = 5, /* MPEG-2 SVCD-compatible stream */
 };
-#define V4L2_CID_MPEG_STREAM_PID_PMT           (V4L2_CID_MPEG_BASE+1)
-#define V4L2_CID_MPEG_STREAM_PID_AUDIO         (V4L2_CID_MPEG_BASE+2)
-#define V4L2_CID_MPEG_STREAM_PID_VIDEO         (V4L2_CID_MPEG_BASE+3)
-#define V4L2_CID_MPEG_STREAM_PID_PCR           (V4L2_CID_MPEG_BASE+4)
-#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO      (V4L2_CID_MPEG_BASE+5)
-#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO      (V4L2_CID_MPEG_BASE+6)
-#define V4L2_CID_MPEG_STREAM_VBI_FMT           (V4L2_CID_MPEG_BASE+7)
+#define V4L2_CID_MPEG_STREAM_PID_PMT           (V4L2_CID_CODEC_BASE+1)
+#define V4L2_CID_MPEG_STREAM_PID_AUDIO         (V4L2_CID_CODEC_BASE+2)
+#define V4L2_CID_MPEG_STREAM_PID_VIDEO         (V4L2_CID_CODEC_BASE+3)
+#define V4L2_CID_MPEG_STREAM_PID_PCR           (V4L2_CID_CODEC_BASE+4)
+#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO      (V4L2_CID_CODEC_BASE+5)
+#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO      (V4L2_CID_CODEC_BASE+6)
+#define V4L2_CID_MPEG_STREAM_VBI_FMT           (V4L2_CID_CODEC_BASE+7)
 enum v4l2_mpeg_stream_vbi_fmt {
        V4L2_MPEG_STREAM_VBI_FMT_NONE = 0,  /* No VBI in the MPEG stream */
        V4L2_MPEG_STREAM_VBI_FMT_IVTV = 1,  /* VBI in private packets, IVTV format */
 };
 
 /*  MPEG audio controls specific to multiplexed streams  */
-#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ      (V4L2_CID_MPEG_BASE+100)
+#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ      (V4L2_CID_CODEC_BASE+100)
 enum v4l2_mpeg_audio_sampling_freq {
        V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100 = 0,
        V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000 = 1,
        V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000 = 2,
 };
-#define V4L2_CID_MPEG_AUDIO_ENCODING           (V4L2_CID_MPEG_BASE+101)
+#define V4L2_CID_MPEG_AUDIO_ENCODING           (V4L2_CID_CODEC_BASE+101)
 enum v4l2_mpeg_audio_encoding {
        V4L2_MPEG_AUDIO_ENCODING_LAYER_1 = 0,
        V4L2_MPEG_AUDIO_ENCODING_LAYER_2 = 1,
@@ -242,7 +254,7 @@ enum v4l2_mpeg_audio_encoding {
        V4L2_MPEG_AUDIO_ENCODING_AAC     = 3,
        V4L2_MPEG_AUDIO_ENCODING_AC3     = 4,
 };
-#define V4L2_CID_MPEG_AUDIO_L1_BITRATE         (V4L2_CID_MPEG_BASE+102)
+#define V4L2_CID_MPEG_AUDIO_L1_BITRATE         (V4L2_CID_CODEC_BASE+102)
 enum v4l2_mpeg_audio_l1_bitrate {
        V4L2_MPEG_AUDIO_L1_BITRATE_32K  = 0,
        V4L2_MPEG_AUDIO_L1_BITRATE_64K  = 1,
@@ -259,7 +271,7 @@ enum v4l2_mpeg_audio_l1_bitrate {
        V4L2_MPEG_AUDIO_L1_BITRATE_416K = 12,
        V4L2_MPEG_AUDIO_L1_BITRATE_448K = 13,
 };
-#define V4L2_CID_MPEG_AUDIO_L2_BITRATE         (V4L2_CID_MPEG_BASE+103)
+#define V4L2_CID_MPEG_AUDIO_L2_BITRATE         (V4L2_CID_CODEC_BASE+103)
 enum v4l2_mpeg_audio_l2_bitrate {
        V4L2_MPEG_AUDIO_L2_BITRATE_32K  = 0,
        V4L2_MPEG_AUDIO_L2_BITRATE_48K  = 1,
@@ -276,7 +288,7 @@ enum v4l2_mpeg_audio_l2_bitrate {
        V4L2_MPEG_AUDIO_L2_BITRATE_320K = 12,
        V4L2_MPEG_AUDIO_L2_BITRATE_384K = 13,
 };
-#define V4L2_CID_MPEG_AUDIO_L3_BITRATE         (V4L2_CID_MPEG_BASE+104)
+#define V4L2_CID_MPEG_AUDIO_L3_BITRATE         (V4L2_CID_CODEC_BASE+104)
 enum v4l2_mpeg_audio_l3_bitrate {
        V4L2_MPEG_AUDIO_L3_BITRATE_32K  = 0,
        V4L2_MPEG_AUDIO_L3_BITRATE_40K  = 1,
@@ -293,34 +305,34 @@ enum v4l2_mpeg_audio_l3_bitrate {
        V4L2_MPEG_AUDIO_L3_BITRATE_256K = 12,
        V4L2_MPEG_AUDIO_L3_BITRATE_320K = 13,
 };
-#define V4L2_CID_MPEG_AUDIO_MODE               (V4L2_CID_MPEG_BASE+105)
+#define V4L2_CID_MPEG_AUDIO_MODE               (V4L2_CID_CODEC_BASE+105)
 enum v4l2_mpeg_audio_mode {
        V4L2_MPEG_AUDIO_MODE_STEREO       = 0,
        V4L2_MPEG_AUDIO_MODE_JOINT_STEREO = 1,
        V4L2_MPEG_AUDIO_MODE_DUAL         = 2,
        V4L2_MPEG_AUDIO_MODE_MONO         = 3,
 };
-#define V4L2_CID_MPEG_AUDIO_MODE_EXTENSION     (V4L2_CID_MPEG_BASE+106)
+#define V4L2_CID_MPEG_AUDIO_MODE_EXTENSION     (V4L2_CID_CODEC_BASE+106)
 enum v4l2_mpeg_audio_mode_extension {
        V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4  = 0,
        V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8  = 1,
        V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12 = 2,
        V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16 = 3,
 };
-#define V4L2_CID_MPEG_AUDIO_EMPHASIS           (V4L2_CID_MPEG_BASE+107)
+#define V4L2_CID_MPEG_AUDIO_EMPHASIS           (V4L2_CID_CODEC_BASE+107)
 enum v4l2_mpeg_audio_emphasis {
        V4L2_MPEG_AUDIO_EMPHASIS_NONE         = 0,
        V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS = 1,
        V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17    = 2,
 };
-#define V4L2_CID_MPEG_AUDIO_CRC                        (V4L2_CID_MPEG_BASE+108)
+#define V4L2_CID_MPEG_AUDIO_CRC                        (V4L2_CID_CODEC_BASE+108)
 enum v4l2_mpeg_audio_crc {
        V4L2_MPEG_AUDIO_CRC_NONE  = 0,
        V4L2_MPEG_AUDIO_CRC_CRC16 = 1,
 };
-#define V4L2_CID_MPEG_AUDIO_MUTE               (V4L2_CID_MPEG_BASE+109)
-#define V4L2_CID_MPEG_AUDIO_AAC_BITRATE                (V4L2_CID_MPEG_BASE+110)
-#define V4L2_CID_MPEG_AUDIO_AC3_BITRATE                (V4L2_CID_MPEG_BASE+111)
+#define V4L2_CID_MPEG_AUDIO_MUTE               (V4L2_CID_CODEC_BASE+109)
+#define V4L2_CID_MPEG_AUDIO_AAC_BITRATE                (V4L2_CID_CODEC_BASE+110)
+#define V4L2_CID_MPEG_AUDIO_AC3_BITRATE                (V4L2_CID_CODEC_BASE+111)
 enum v4l2_mpeg_audio_ac3_bitrate {
        V4L2_MPEG_AUDIO_AC3_BITRATE_32K  = 0,
        V4L2_MPEG_AUDIO_AC3_BITRATE_40K  = 1,
@@ -342,7 +354,7 @@ enum v4l2_mpeg_audio_ac3_bitrate {
        V4L2_MPEG_AUDIO_AC3_BITRATE_576K = 17,
        V4L2_MPEG_AUDIO_AC3_BITRATE_640K = 18,
 };
-#define V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK       (V4L2_CID_MPEG_BASE+112)
+#define V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK       (V4L2_CID_CODEC_BASE+112)
 enum v4l2_mpeg_audio_dec_playback {
        V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO           = 0,
        V4L2_MPEG_AUDIO_DEC_PLAYBACK_STEREO         = 1,
@@ -351,79 +363,79 @@ enum v4l2_mpeg_audio_dec_playback {
        V4L2_MPEG_AUDIO_DEC_PLAYBACK_MONO           = 4,
        V4L2_MPEG_AUDIO_DEC_PLAYBACK_SWAPPED_STEREO = 5,
 };
-#define V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK (V4L2_CID_MPEG_BASE+113)
+#define V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK (V4L2_CID_CODEC_BASE+113)
 
 /*  MPEG video controls specific to multiplexed streams */
-#define V4L2_CID_MPEG_VIDEO_ENCODING           (V4L2_CID_MPEG_BASE+200)
+#define V4L2_CID_MPEG_VIDEO_ENCODING           (V4L2_CID_CODEC_BASE+200)
 enum v4l2_mpeg_video_encoding {
        V4L2_MPEG_VIDEO_ENCODING_MPEG_1     = 0,
        V4L2_MPEG_VIDEO_ENCODING_MPEG_2     = 1,
        V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC = 2,
 };
-#define V4L2_CID_MPEG_VIDEO_ASPECT             (V4L2_CID_MPEG_BASE+201)
+#define V4L2_CID_MPEG_VIDEO_ASPECT             (V4L2_CID_CODEC_BASE+201)
 enum v4l2_mpeg_video_aspect {
        V4L2_MPEG_VIDEO_ASPECT_1x1     = 0,
        V4L2_MPEG_VIDEO_ASPECT_4x3     = 1,
        V4L2_MPEG_VIDEO_ASPECT_16x9    = 2,
        V4L2_MPEG_VIDEO_ASPECT_221x100 = 3,
 };
-#define V4L2_CID_MPEG_VIDEO_B_FRAMES           (V4L2_CID_MPEG_BASE+202)
-#define V4L2_CID_MPEG_VIDEO_GOP_SIZE           (V4L2_CID_MPEG_BASE+203)
-#define V4L2_CID_MPEG_VIDEO_GOP_CLOSURE                (V4L2_CID_MPEG_BASE+204)
-#define V4L2_CID_MPEG_VIDEO_PULLDOWN           (V4L2_CID_MPEG_BASE+205)
-#define V4L2_CID_MPEG_VIDEO_BITRATE_MODE       (V4L2_CID_MPEG_BASE+206)
+#define V4L2_CID_MPEG_VIDEO_B_FRAMES           (V4L2_CID_CODEC_BASE+202)
+#define V4L2_CID_MPEG_VIDEO_GOP_SIZE           (V4L2_CID_CODEC_BASE+203)
+#define V4L2_CID_MPEG_VIDEO_GOP_CLOSURE                (V4L2_CID_CODEC_BASE+204)
+#define V4L2_CID_MPEG_VIDEO_PULLDOWN           (V4L2_CID_CODEC_BASE+205)
+#define V4L2_CID_MPEG_VIDEO_BITRATE_MODE       (V4L2_CID_CODEC_BASE+206)
 enum v4l2_mpeg_video_bitrate_mode {
        V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0,
        V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1,
-};
-#define V4L2_CID_MPEG_VIDEO_BITRATE            (V4L2_CID_MPEG_BASE+207)
-#define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK       (V4L2_CID_MPEG_BASE+208)
-#define V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (V4L2_CID_MPEG_BASE+209)
-#define V4L2_CID_MPEG_VIDEO_MUTE               (V4L2_CID_MPEG_BASE+210)
-#define V4L2_CID_MPEG_VIDEO_MUTE_YUV           (V4L2_CID_MPEG_BASE+211)
-#define V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE            (V4L2_CID_MPEG_BASE+212)
-#define V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER       (V4L2_CID_MPEG_BASE+213)
-#define V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB            (V4L2_CID_MPEG_BASE+214)
-#define V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE                    (V4L2_CID_MPEG_BASE+215)
-#define V4L2_CID_MPEG_VIDEO_HEADER_MODE                                (V4L2_CID_MPEG_BASE+216)
+       V4L2_MPEG_VIDEO_BITRATE_MODE_CQ  = 2,
+};
+#define V4L2_CID_MPEG_VIDEO_BITRATE            (V4L2_CID_CODEC_BASE+207)
+#define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK       (V4L2_CID_CODEC_BASE+208)
+#define V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (V4L2_CID_CODEC_BASE+209)
+#define V4L2_CID_MPEG_VIDEO_MUTE               (V4L2_CID_CODEC_BASE+210)
+#define V4L2_CID_MPEG_VIDEO_MUTE_YUV           (V4L2_CID_CODEC_BASE+211)
+#define V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE            (V4L2_CID_CODEC_BASE+212)
+#define V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER       (V4L2_CID_CODEC_BASE+213)
+#define V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB            (V4L2_CID_CODEC_BASE+214)
+#define V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE                    (V4L2_CID_CODEC_BASE+215)
+#define V4L2_CID_MPEG_VIDEO_HEADER_MODE                                (V4L2_CID_CODEC_BASE+216)
 enum v4l2_mpeg_video_header_mode {
        V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE                    = 0,
        V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME       = 1,
 
 };
-#define V4L2_CID_MPEG_VIDEO_MAX_REF_PIC                        (V4L2_CID_MPEG_BASE+217)
-#define V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE               (V4L2_CID_MPEG_BASE+218)
-#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES      (V4L2_CID_MPEG_BASE+219)
-#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB         (V4L2_CID_MPEG_BASE+220)
-#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE           (V4L2_CID_MPEG_BASE+221)
+#define V4L2_CID_MPEG_VIDEO_MAX_REF_PIC                        (V4L2_CID_CODEC_BASE+217)
+#define V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE               (V4L2_CID_CODEC_BASE+218)
+#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES      (V4L2_CID_CODEC_BASE+219)
+#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB         (V4L2_CID_CODEC_BASE+220)
+#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE           (V4L2_CID_CODEC_BASE+221)
 enum v4l2_mpeg_video_multi_slice_mode {
        V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE         = 0,
        V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB         = 1,
        V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES      = 2,
-#ifndef __KERNEL__
        /* Kept for backwards compatibility reasons. Stupid typo... */
        V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB          = 1,
        V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES       = 2,
-#endif
 };
-#define V4L2_CID_MPEG_VIDEO_VBV_SIZE                   (V4L2_CID_MPEG_BASE+222)
-#define V4L2_CID_MPEG_VIDEO_DEC_PTS                    (V4L2_CID_MPEG_BASE+223)
-#define V4L2_CID_MPEG_VIDEO_DEC_FRAME                  (V4L2_CID_MPEG_BASE+224)
-#define V4L2_CID_MPEG_VIDEO_VBV_DELAY                  (V4L2_CID_MPEG_BASE+225)
-#define V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER          (V4L2_CID_MPEG_BASE+226)
-#define V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE          (V4L2_CID_MPEG_BASE+227)
-#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)
+#define V4L2_CID_MPEG_VIDEO_VBV_SIZE                   (V4L2_CID_CODEC_BASE+222)
+#define V4L2_CID_MPEG_VIDEO_DEC_PTS                    (V4L2_CID_CODEC_BASE+223)
+#define V4L2_CID_MPEG_VIDEO_DEC_FRAME                  (V4L2_CID_CODEC_BASE+224)
+#define V4L2_CID_MPEG_VIDEO_VBV_DELAY                  (V4L2_CID_CODEC_BASE+225)
+#define V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER          (V4L2_CID_CODEC_BASE+226)
+#define V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE          (V4L2_CID_CODEC_BASE+227)
+#define V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE          (V4L2_CID_CODEC_BASE+228)
+#define V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME            (V4L2_CID_CODEC_BASE+229)
+#define V4L2_CID_MPEG_VIDEO_BASELAYER_PRIORITY_ID      (V4L2_CID_CODEC_BASE+230)
 
 /* CIDs for the MPEG-2 Part 2 (H.262) codec */
-#define V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL                        (V4L2_CID_MPEG_BASE+270)
+#define V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL                        (V4L2_CID_CODEC_BASE+270)
 enum v4l2_mpeg_video_mpeg2_level {
        V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW         = 0,
        V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN        = 1,
        V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH_1440   = 2,
        V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH        = 3,
 };
-#define V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE              (V4L2_CID_MPEG_BASE+271)
+#define V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE              (V4L2_CID_CODEC_BASE+271)
 enum v4l2_mpeg_video_mpeg2_profile {
        V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE                            = 0,
        V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN                              = 1,
@@ -434,28 +446,28 @@ enum v4l2_mpeg_video_mpeg2_profile {
 };
 
 /* 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)
-#define V4L2_CID_MPEG_VIDEO_H263_MIN_QP                        (V4L2_CID_MPEG_BASE+303)
-#define V4L2_CID_MPEG_VIDEO_H263_MAX_QP                        (V4L2_CID_MPEG_BASE+304)
-#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP            (V4L2_CID_MPEG_BASE+350)
-#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP            (V4L2_CID_MPEG_BASE+351)
-#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP            (V4L2_CID_MPEG_BASE+352)
-#define V4L2_CID_MPEG_VIDEO_H264_MIN_QP                        (V4L2_CID_MPEG_BASE+353)
-#define V4L2_CID_MPEG_VIDEO_H264_MAX_QP                        (V4L2_CID_MPEG_BASE+354)
-#define V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM         (V4L2_CID_MPEG_BASE+355)
-#define V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE              (V4L2_CID_MPEG_BASE+356)
-#define V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE          (V4L2_CID_MPEG_BASE+357)
+#define V4L2_CID_FWHT_I_FRAME_QP             (V4L2_CID_CODEC_BASE + 290)
+#define V4L2_CID_FWHT_P_FRAME_QP             (V4L2_CID_CODEC_BASE + 291)
+
+#define V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP            (V4L2_CID_CODEC_BASE+300)
+#define V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP            (V4L2_CID_CODEC_BASE+301)
+#define V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP            (V4L2_CID_CODEC_BASE+302)
+#define V4L2_CID_MPEG_VIDEO_H263_MIN_QP                        (V4L2_CID_CODEC_BASE+303)
+#define V4L2_CID_MPEG_VIDEO_H263_MAX_QP                        (V4L2_CID_CODEC_BASE+304)
+#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP            (V4L2_CID_CODEC_BASE+350)
+#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP            (V4L2_CID_CODEC_BASE+351)
+#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP            (V4L2_CID_CODEC_BASE+352)
+#define V4L2_CID_MPEG_VIDEO_H264_MIN_QP                        (V4L2_CID_CODEC_BASE+353)
+#define V4L2_CID_MPEG_VIDEO_H264_MAX_QP                        (V4L2_CID_CODEC_BASE+354)
+#define V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM         (V4L2_CID_CODEC_BASE+355)
+#define V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE              (V4L2_CID_CODEC_BASE+356)
+#define V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE          (V4L2_CID_CODEC_BASE+357)
 enum v4l2_mpeg_video_h264_entropy_mode {
        V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC = 0,
        V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC = 1,
 };
-#define V4L2_CID_MPEG_VIDEO_H264_I_PERIOD              (V4L2_CID_MPEG_BASE+358)
-#define V4L2_CID_MPEG_VIDEO_H264_LEVEL                 (V4L2_CID_MPEG_BASE+359)
+#define V4L2_CID_MPEG_VIDEO_H264_I_PERIOD              (V4L2_CID_CODEC_BASE+358)
+#define V4L2_CID_MPEG_VIDEO_H264_LEVEL                 (V4L2_CID_CODEC_BASE+359)
 enum v4l2_mpeg_video_h264_level {
        V4L2_MPEG_VIDEO_H264_LEVEL_1_0  = 0,
        V4L2_MPEG_VIDEO_H264_LEVEL_1B   = 1,
@@ -473,16 +485,20 @@ enum v4l2_mpeg_video_h264_level {
        V4L2_MPEG_VIDEO_H264_LEVEL_4_2  = 13,
        V4L2_MPEG_VIDEO_H264_LEVEL_5_0  = 14,
        V4L2_MPEG_VIDEO_H264_LEVEL_5_1  = 15,
-};
-#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA     (V4L2_CID_MPEG_BASE+360)
-#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA      (V4L2_CID_MPEG_BASE+361)
-#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE      (V4L2_CID_MPEG_BASE+362)
+       V4L2_MPEG_VIDEO_H264_LEVEL_5_2  = 16,
+       V4L2_MPEG_VIDEO_H264_LEVEL_6_0  = 17,
+       V4L2_MPEG_VIDEO_H264_LEVEL_6_1  = 18,
+       V4L2_MPEG_VIDEO_H264_LEVEL_6_2  = 19,
+};
+#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA     (V4L2_CID_CODEC_BASE+360)
+#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA      (V4L2_CID_CODEC_BASE+361)
+#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE      (V4L2_CID_CODEC_BASE+362)
 enum v4l2_mpeg_video_h264_loop_filter_mode {
        V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED                           = 0,
        V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED                          = 1,
        V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY        = 2,
 };
-#define V4L2_CID_MPEG_VIDEO_H264_PROFILE               (V4L2_CID_MPEG_BASE+363)
+#define V4L2_CID_MPEG_VIDEO_H264_PROFILE               (V4L2_CID_CODEC_BASE+363)
 enum v4l2_mpeg_video_h264_profile {
        V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE                   = 0,
        V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE       = 1,
@@ -501,11 +517,12 @@ enum v4l2_mpeg_video_h264_profile {
        V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA        = 14,
        V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH                = 15,
        V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH             = 16,
+       V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH           = 17,
 };
-#define V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT    (V4L2_CID_MPEG_BASE+364)
-#define V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH     (V4L2_CID_MPEG_BASE+365)
-#define V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE                (V4L2_CID_MPEG_BASE+366)
-#define V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC           (V4L2_CID_MPEG_BASE+367)
+#define V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT    (V4L2_CID_CODEC_BASE+364)
+#define V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH     (V4L2_CID_CODEC_BASE+365)
+#define V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE                (V4L2_CID_CODEC_BASE+366)
+#define V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC           (V4L2_CID_CODEC_BASE+367)
 enum v4l2_mpeg_video_h264_vui_sar_idc {
        V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_UNSPECIFIED    = 0,
        V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1            = 1,
@@ -526,9 +543,9 @@ enum v4l2_mpeg_video_h264_vui_sar_idc {
        V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_2x1            = 16,
        V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_EXTENDED       = 17,
 };
-#define V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING             (V4L2_CID_MPEG_BASE+368)
-#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0                (V4L2_CID_MPEG_BASE+369)
-#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE       (V4L2_CID_MPEG_BASE+370)
+#define V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING             (V4L2_CID_CODEC_BASE+368)
+#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0                (V4L2_CID_CODEC_BASE+369)
+#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE       (V4L2_CID_CODEC_BASE+370)
 enum v4l2_mpeg_video_h264_sei_fp_arrangement_type {
        V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_CHECKERBOARD       = 0,
        V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_COLUMN             = 1,
@@ -537,8 +554,8 @@ enum v4l2_mpeg_video_h264_sei_fp_arrangement_type {
        V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TOP_BOTTOM         = 4,
        V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TEMPORAL           = 5,
 };
-#define V4L2_CID_MPEG_VIDEO_H264_FMO                   (V4L2_CID_MPEG_BASE+371)
-#define V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE          (V4L2_CID_MPEG_BASE+372)
+#define V4L2_CID_MPEG_VIDEO_H264_FMO                   (V4L2_CID_CODEC_BASE+371)
+#define V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE          (V4L2_CID_CODEC_BASE+372)
 enum v4l2_mpeg_video_h264_fmo_map_type {
        V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_INTERLEAVED_SLICES            = 0,
        V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_SCATTERED_SLICES              = 1,
@@ -548,36 +565,45 @@ enum v4l2_mpeg_video_h264_fmo_map_type {
        V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_WIPE_SCAN                     = 5,
        V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_EXPLICIT                      = 6,
 };
-#define V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP       (V4L2_CID_MPEG_BASE+373)
-#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION  (V4L2_CID_MPEG_BASE+374)
+#define V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP       (V4L2_CID_CODEC_BASE+373)
+#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION  (V4L2_CID_CODEC_BASE+374)
 enum v4l2_mpeg_video_h264_fmo_change_dir {
        V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_RIGHT       = 0,
        V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_LEFT        = 1,
 };
-#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE       (V4L2_CID_MPEG_BASE+375)
-#define V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH                (V4L2_CID_MPEG_BASE+376)
-#define V4L2_CID_MPEG_VIDEO_H264_ASO                   (V4L2_CID_MPEG_BASE+377)
-#define V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER       (V4L2_CID_MPEG_BASE+378)
-#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING           (V4L2_CID_MPEG_BASE+379)
-#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE      (V4L2_CID_MPEG_BASE+380)
+#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE       (V4L2_CID_CODEC_BASE+375)
+#define V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH                (V4L2_CID_CODEC_BASE+376)
+#define V4L2_CID_MPEG_VIDEO_H264_ASO                   (V4L2_CID_CODEC_BASE+377)
+#define V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER       (V4L2_CID_CODEC_BASE+378)
+#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING           (V4L2_CID_CODEC_BASE+379)
+#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE      (V4L2_CID_CODEC_BASE+380)
 enum v4l2_mpeg_video_h264_hierarchical_coding_type {
        V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B      = 0,
        V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P      = 1,
 };
-#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER     (V4L2_CID_MPEG_BASE+381)
-#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP  (V4L2_CID_MPEG_BASE+382)
-#define V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION  (V4L2_CID_MPEG_BASE+383)
-#define V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET                (V4L2_CID_MPEG_BASE+384)
-#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP        (V4L2_CID_MPEG_BASE+385)
-#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP        (V4L2_CID_MPEG_BASE+386)
-#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP        (V4L2_CID_MPEG_BASE+387)
-#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP        (V4L2_CID_MPEG_BASE+388)
-#define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP   (V4L2_CID_MPEG_BASE+400)
-#define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP   (V4L2_CID_MPEG_BASE+401)
-#define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP   (V4L2_CID_MPEG_BASE+402)
-#define V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP       (V4L2_CID_MPEG_BASE+403)
-#define V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP       (V4L2_CID_MPEG_BASE+404)
-#define V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL                (V4L2_CID_MPEG_BASE+405)
+#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER     (V4L2_CID_CODEC_BASE+381)
+#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP  (V4L2_CID_CODEC_BASE+382)
+#define V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION  (V4L2_CID_CODEC_BASE+383)
+#define V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET                (V4L2_CID_CODEC_BASE+384)
+#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP        (V4L2_CID_CODEC_BASE+385)
+#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP        (V4L2_CID_CODEC_BASE+386)
+#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP        (V4L2_CID_CODEC_BASE+387)
+#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP        (V4L2_CID_CODEC_BASE+388)
+#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP        (V4L2_CID_CODEC_BASE+389)
+#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP        (V4L2_CID_CODEC_BASE+390)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR     (V4L2_CID_CODEC_BASE+391)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR     (V4L2_CID_CODEC_BASE+392)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR     (V4L2_CID_CODEC_BASE+393)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR     (V4L2_CID_CODEC_BASE+394)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR     (V4L2_CID_CODEC_BASE+395)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR     (V4L2_CID_CODEC_BASE+396)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L6_BR     (V4L2_CID_CODEC_BASE+397)
+#define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP   (V4L2_CID_CODEC_BASE+400)
+#define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP   (V4L2_CID_CODEC_BASE+401)
+#define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP   (V4L2_CID_CODEC_BASE+402)
+#define V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP       (V4L2_CID_CODEC_BASE+403)
+#define V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP       (V4L2_CID_CODEC_BASE+404)
+#define V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL                (V4L2_CID_CODEC_BASE+405)
 enum v4l2_mpeg_video_mpeg4_level {
        V4L2_MPEG_VIDEO_MPEG4_LEVEL_0   = 0,
        V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B  = 1,
@@ -588,7 +614,7 @@ enum v4l2_mpeg_video_mpeg4_level {
        V4L2_MPEG_VIDEO_MPEG4_LEVEL_4   = 6,
        V4L2_MPEG_VIDEO_MPEG4_LEVEL_5   = 7,
 };
-#define V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE      (V4L2_CID_MPEG_BASE+406)
+#define V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE      (V4L2_CID_CODEC_BASE+406)
 enum v4l2_mpeg_video_mpeg4_profile {
        V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE                            = 0,
        V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE                   = 1,
@@ -596,40 +622,40 @@ enum v4l2_mpeg_video_mpeg4_profile {
        V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE_SCALABLE                   = 3,
        V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY        = 4,
 };
-#define V4L2_CID_MPEG_VIDEO_MPEG4_QPEL         (V4L2_CID_MPEG_BASE+407)
+#define V4L2_CID_MPEG_VIDEO_MPEG4_QPEL         (V4L2_CID_CODEC_BASE+407)
 
 /*  Control IDs for VP8 streams
  *  Although VP8 is not part of MPEG we add these controls to the MPEG class
  *  as that class is already handling other video compression standards
  */
-#define V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS         (V4L2_CID_MPEG_BASE+500)
+#define V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS         (V4L2_CID_CODEC_BASE+500)
 enum v4l2_vp8_num_partitions {
        V4L2_CID_MPEG_VIDEO_VPX_1_PARTITION     = 0,
        V4L2_CID_MPEG_VIDEO_VPX_2_PARTITIONS    = 1,
        V4L2_CID_MPEG_VIDEO_VPX_4_PARTITIONS    = 2,
        V4L2_CID_MPEG_VIDEO_VPX_8_PARTITIONS    = 3,
 };
-#define V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4                (V4L2_CID_MPEG_BASE+501)
-#define V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES         (V4L2_CID_MPEG_BASE+502)
+#define V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4                (V4L2_CID_CODEC_BASE+501)
+#define V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES         (V4L2_CID_CODEC_BASE+502)
 enum v4l2_vp8_num_ref_frames {
        V4L2_CID_MPEG_VIDEO_VPX_1_REF_FRAME     = 0,
        V4L2_CID_MPEG_VIDEO_VPX_2_REF_FRAME     = 1,
        V4L2_CID_MPEG_VIDEO_VPX_3_REF_FRAME     = 2,
 };
-#define V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL           (V4L2_CID_MPEG_BASE+503)
-#define V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS       (V4L2_CID_MPEG_BASE+504)
-#define V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD        (V4L2_CID_MPEG_BASE+505)
-#define V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL       (V4L2_CID_MPEG_BASE+506)
+#define V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL           (V4L2_CID_CODEC_BASE+503)
+#define V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS       (V4L2_CID_CODEC_BASE+504)
+#define V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD        (V4L2_CID_CODEC_BASE+505)
+#define V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL       (V4L2_CID_CODEC_BASE+506)
 enum v4l2_vp8_golden_frame_sel {
        V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV           = 0,
        V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_REF_PERIOD     = 1,
 };
-#define V4L2_CID_MPEG_VIDEO_VPX_MIN_QP                 (V4L2_CID_MPEG_BASE+507)
-#define V4L2_CID_MPEG_VIDEO_VPX_MAX_QP                 (V4L2_CID_MPEG_BASE+508)
-#define V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP             (V4L2_CID_MPEG_BASE+509)
-#define V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP             (V4L2_CID_MPEG_BASE+510)
+#define V4L2_CID_MPEG_VIDEO_VPX_MIN_QP                 (V4L2_CID_CODEC_BASE+507)
+#define V4L2_CID_MPEG_VIDEO_VPX_MAX_QP                 (V4L2_CID_CODEC_BASE+508)
+#define V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP             (V4L2_CID_CODEC_BASE+509)
+#define V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP             (V4L2_CID_CODEC_BASE+510)
 
-#define V4L2_CID_MPEG_VIDEO_VP8_PROFILE                        (V4L2_CID_MPEG_BASE+511)
+#define V4L2_CID_MPEG_VIDEO_VP8_PROFILE                        (V4L2_CID_CODEC_BASE+511)
 enum v4l2_mpeg_video_vp8_profile {
        V4L2_MPEG_VIDEO_VP8_PROFILE_0                           = 0,
        V4L2_MPEG_VIDEO_VP8_PROFILE_1                           = 1,
@@ -638,42 +664,59 @@ enum v4l2_mpeg_video_vp8_profile {
 };
 /* Deprecated alias for compatibility reasons. */
 #define V4L2_CID_MPEG_VIDEO_VPX_PROFILE        V4L2_CID_MPEG_VIDEO_VP8_PROFILE
-#define V4L2_CID_MPEG_VIDEO_VP9_PROFILE                        (V4L2_CID_MPEG_BASE+512)
+#define V4L2_CID_MPEG_VIDEO_VP9_PROFILE                        (V4L2_CID_CODEC_BASE+512)
 enum v4l2_mpeg_video_vp9_profile {
        V4L2_MPEG_VIDEO_VP9_PROFILE_0                           = 0,
        V4L2_MPEG_VIDEO_VP9_PROFILE_1                           = 1,
        V4L2_MPEG_VIDEO_VP9_PROFILE_2                           = 2,
        V4L2_MPEG_VIDEO_VP9_PROFILE_3                           = 3,
 };
+#define V4L2_CID_MPEG_VIDEO_VP9_LEVEL                  (V4L2_CID_CODEC_BASE+513)
+enum v4l2_mpeg_video_vp9_level {
+       V4L2_MPEG_VIDEO_VP9_LEVEL_1_0   = 0,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_1_1   = 1,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_2_0   = 2,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_2_1   = 3,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_3_0   = 4,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_3_1   = 5,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_4_0   = 6,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_4_1   = 7,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_5_0   = 8,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_5_1   = 9,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_5_2   = 10,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_6_0   = 11,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_6_1   = 12,
+       V4L2_MPEG_VIDEO_VP9_LEVEL_6_2   = 13,
+};
 
 /* CIDs for HEVC encoding. */
 
-#define V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP                (V4L2_CID_MPEG_BASE + 600)
-#define V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP                (V4L2_CID_MPEG_BASE + 601)
-#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP    (V4L2_CID_MPEG_BASE + 602)
-#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP    (V4L2_CID_MPEG_BASE + 603)
-#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP    (V4L2_CID_MPEG_BASE + 604)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP       (V4L2_CID_MPEG_BASE + 605)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE (V4L2_CID_MPEG_BASE + 606)
+#define V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP                (V4L2_CID_CODEC_BASE + 600)
+#define V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP                (V4L2_CID_CODEC_BASE + 601)
+#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP    (V4L2_CID_CODEC_BASE + 602)
+#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP    (V4L2_CID_CODEC_BASE + 603)
+#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP    (V4L2_CID_CODEC_BASE + 604)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP       (V4L2_CID_CODEC_BASE + 605)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE (V4L2_CID_CODEC_BASE + 606)
 enum v4l2_mpeg_video_hevc_hier_coding_type {
        V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B      = 0,
        V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P      = 1,
 };
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER     (V4L2_CID_MPEG_BASE + 607)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP     (V4L2_CID_MPEG_BASE + 608)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP     (V4L2_CID_MPEG_BASE + 609)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP     (V4L2_CID_MPEG_BASE + 610)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP     (V4L2_CID_MPEG_BASE + 611)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP     (V4L2_CID_MPEG_BASE + 612)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP     (V4L2_CID_MPEG_BASE + 613)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_QP     (V4L2_CID_MPEG_BASE + 614)
-#define V4L2_CID_MPEG_VIDEO_HEVC_PROFILE       (V4L2_CID_MPEG_BASE + 615)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER     (V4L2_CID_CODEC_BASE + 607)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP     (V4L2_CID_CODEC_BASE + 608)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP     (V4L2_CID_CODEC_BASE + 609)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP     (V4L2_CID_CODEC_BASE + 610)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP     (V4L2_CID_CODEC_BASE + 611)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP     (V4L2_CID_CODEC_BASE + 612)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP     (V4L2_CID_CODEC_BASE + 613)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_QP     (V4L2_CID_CODEC_BASE + 614)
+#define V4L2_CID_MPEG_VIDEO_HEVC_PROFILE       (V4L2_CID_CODEC_BASE + 615)
 enum v4l2_mpeg_video_hevc_profile {
        V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN = 0,
        V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE = 1,
        V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10 = 2,
 };
-#define V4L2_CID_MPEG_VIDEO_HEVC_LEVEL         (V4L2_CID_MPEG_BASE + 616)
+#define V4L2_CID_MPEG_VIDEO_HEVC_LEVEL         (V4L2_CID_CODEC_BASE + 616)
 enum v4l2_mpeg_video_hevc_level {
        V4L2_MPEG_VIDEO_HEVC_LEVEL_1    = 0,
        V4L2_MPEG_VIDEO_HEVC_LEVEL_2    = 1,
@@ -689,64 +732,78 @@ enum v4l2_mpeg_video_hevc_level {
        V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1  = 11,
        V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2  = 12,
 };
-#define V4L2_CID_MPEG_VIDEO_HEVC_FRAME_RATE_RESOLUTION (V4L2_CID_MPEG_BASE + 617)
-#define V4L2_CID_MPEG_VIDEO_HEVC_TIER                  (V4L2_CID_MPEG_BASE + 618)
+#define V4L2_CID_MPEG_VIDEO_HEVC_FRAME_RATE_RESOLUTION (V4L2_CID_CODEC_BASE + 617)
+#define V4L2_CID_MPEG_VIDEO_HEVC_TIER                  (V4L2_CID_CODEC_BASE + 618)
 enum v4l2_mpeg_video_hevc_tier {
        V4L2_MPEG_VIDEO_HEVC_TIER_MAIN = 0,
        V4L2_MPEG_VIDEO_HEVC_TIER_HIGH = 1,
 };
-#define V4L2_CID_MPEG_VIDEO_HEVC_MAX_PARTITION_DEPTH   (V4L2_CID_MPEG_BASE + 619)
-#define V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE      (V4L2_CID_MPEG_BASE + 620)
+#define V4L2_CID_MPEG_VIDEO_HEVC_MAX_PARTITION_DEPTH   (V4L2_CID_CODEC_BASE + 619)
+#define V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE      (V4L2_CID_CODEC_BASE + 620)
 enum v4l2_cid_mpeg_video_hevc_loop_filter_mode {
        V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_DISABLED                   = 0,
        V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED                    = 1,
        V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY = 2,
 };
-#define V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2   (V4L2_CID_MPEG_BASE + 621)
-#define V4L2_CID_MPEG_VIDEO_HEVC_LF_TC_OFFSET_DIV2     (V4L2_CID_MPEG_BASE + 622)
-#define V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_TYPE          (V4L2_CID_MPEG_BASE + 623)
+#define V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2   (V4L2_CID_CODEC_BASE + 621)
+#define V4L2_CID_MPEG_VIDEO_HEVC_LF_TC_OFFSET_DIV2     (V4L2_CID_CODEC_BASE + 622)
+#define V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_TYPE          (V4L2_CID_CODEC_BASE + 623)
 enum v4l2_cid_mpeg_video_hevc_refresh_type {
        V4L2_MPEG_VIDEO_HEVC_REFRESH_NONE               = 0,
        V4L2_MPEG_VIDEO_HEVC_REFRESH_CRA                = 1,
        V4L2_MPEG_VIDEO_HEVC_REFRESH_IDR                = 2,
 };
-#define V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_PERIOD                (V4L2_CID_MPEG_BASE + 624)
-#define V4L2_CID_MPEG_VIDEO_HEVC_LOSSLESS_CU           (V4L2_CID_MPEG_BASE + 625)
-#define V4L2_CID_MPEG_VIDEO_HEVC_CONST_INTRA_PRED      (V4L2_CID_MPEG_BASE + 626)
-#define V4L2_CID_MPEG_VIDEO_HEVC_WAVEFRONT             (V4L2_CID_MPEG_BASE + 627)
-#define V4L2_CID_MPEG_VIDEO_HEVC_GENERAL_PB            (V4L2_CID_MPEG_BASE + 628)
-#define V4L2_CID_MPEG_VIDEO_HEVC_TEMPORAL_ID           (V4L2_CID_MPEG_BASE + 629)
-#define V4L2_CID_MPEG_VIDEO_HEVC_STRONG_SMOOTHING      (V4L2_CID_MPEG_BASE + 630)
-#define V4L2_CID_MPEG_VIDEO_HEVC_MAX_NUM_MERGE_MV_MINUS1       (V4L2_CID_MPEG_BASE + 631)
-#define V4L2_CID_MPEG_VIDEO_HEVC_INTRA_PU_SPLIT                (V4L2_CID_MPEG_BASE + 632)
-#define V4L2_CID_MPEG_VIDEO_HEVC_TMV_PREDICTION                (V4L2_CID_MPEG_BASE + 633)
-#define V4L2_CID_MPEG_VIDEO_HEVC_WITHOUT_STARTCODE     (V4L2_CID_MPEG_BASE + 634)
-#define V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD  (V4L2_CID_MPEG_BASE + 635)
+#define V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_PERIOD                (V4L2_CID_CODEC_BASE + 624)
+#define V4L2_CID_MPEG_VIDEO_HEVC_LOSSLESS_CU           (V4L2_CID_CODEC_BASE + 625)
+#define V4L2_CID_MPEG_VIDEO_HEVC_CONST_INTRA_PRED      (V4L2_CID_CODEC_BASE + 626)
+#define V4L2_CID_MPEG_VIDEO_HEVC_WAVEFRONT             (V4L2_CID_CODEC_BASE + 627)
+#define V4L2_CID_MPEG_VIDEO_HEVC_GENERAL_PB            (V4L2_CID_CODEC_BASE + 628)
+#define V4L2_CID_MPEG_VIDEO_HEVC_TEMPORAL_ID           (V4L2_CID_CODEC_BASE + 629)
+#define V4L2_CID_MPEG_VIDEO_HEVC_STRONG_SMOOTHING      (V4L2_CID_CODEC_BASE + 630)
+#define V4L2_CID_MPEG_VIDEO_HEVC_MAX_NUM_MERGE_MV_MINUS1       (V4L2_CID_CODEC_BASE + 631)
+#define V4L2_CID_MPEG_VIDEO_HEVC_INTRA_PU_SPLIT                (V4L2_CID_CODEC_BASE + 632)
+#define V4L2_CID_MPEG_VIDEO_HEVC_TMV_PREDICTION                (V4L2_CID_CODEC_BASE + 633)
+#define V4L2_CID_MPEG_VIDEO_HEVC_WITHOUT_STARTCODE     (V4L2_CID_CODEC_BASE + 634)
+#define V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD  (V4L2_CID_CODEC_BASE + 635)
 enum v4l2_cid_mpeg_video_hevc_size_of_length_field {
        V4L2_MPEG_VIDEO_HEVC_SIZE_0             = 0,
        V4L2_MPEG_VIDEO_HEVC_SIZE_1             = 1,
        V4L2_MPEG_VIDEO_HEVC_SIZE_2             = 2,
        V4L2_MPEG_VIDEO_HEVC_SIZE_4             = 3,
 };
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR     (V4L2_CID_MPEG_BASE + 636)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR     (V4L2_CID_MPEG_BASE + 637)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR     (V4L2_CID_MPEG_BASE + 638)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR     (V4L2_CID_MPEG_BASE + 639)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR     (V4L2_CID_MPEG_BASE + 640)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR     (V4L2_CID_MPEG_BASE + 641)
-#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR     (V4L2_CID_MPEG_BASE + 642)
-#define V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES     (V4L2_CID_MPEG_BASE + 643)
-#define V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR      (V4L2_CID_MPEG_BASE + 644)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR     (V4L2_CID_CODEC_BASE + 636)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR     (V4L2_CID_CODEC_BASE + 637)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR     (V4L2_CID_CODEC_BASE + 638)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR     (V4L2_CID_CODEC_BASE + 639)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR     (V4L2_CID_CODEC_BASE + 640)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR     (V4L2_CID_CODEC_BASE + 641)
+#define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR     (V4L2_CID_CODEC_BASE + 642)
+#define V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES     (V4L2_CID_CODEC_BASE + 643)
+#define V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR      (V4L2_CID_CODEC_BASE + 644)
+#define V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY           (V4L2_CID_CODEC_BASE + 645)
+#define V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE            (V4L2_CID_CODEC_BASE + 646)
+enum v4l2_mpeg_video_frame_skip_mode {
+       V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED        = 0,
+       V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT     = 1,
+       V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT       = 2,
+};
+
+#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP        (V4L2_CID_CODEC_BASE + 647)
+#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP        (V4L2_CID_CODEC_BASE + 648)
+#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP        (V4L2_CID_CODEC_BASE + 649)
+#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP        (V4L2_CID_CODEC_BASE + 650)
+#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP        (V4L2_CID_CODEC_BASE + 651)
+#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP        (V4L2_CID_CODEC_BASE + 652)
 
 /*  MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
-#define V4L2_CID_MPEG_CX2341X_BASE                             (V4L2_CTRL_CLASS_MPEG | 0x1000)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE                (V4L2_CID_MPEG_CX2341X_BASE+0)
+#define V4L2_CID_CODEC_CX2341X_BASE                            (V4L2_CTRL_CLASS_CODEC | 0x1000)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE                (V4L2_CID_CODEC_CX2341X_BASE+0)
 enum v4l2_mpeg_cx2341x_video_spatial_filter_mode {
        V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL = 0,
        V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO   = 1,
 };
-#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER             (V4L2_CID_MPEG_CX2341X_BASE+1)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE   (V4L2_CID_MPEG_CX2341X_BASE+2)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER             (V4L2_CID_CODEC_CX2341X_BASE+1)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE   (V4L2_CID_CODEC_CX2341X_BASE+2)
 enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type {
        V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF                  = 0,
        V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR               = 1,
@@ -754,18 +811,18 @@ enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type {
        V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE      = 3,
        V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE = 4,
 };
-#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+3)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE (V4L2_CID_CODEC_CX2341X_BASE+3)
 enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type {
        V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF    = 0,
        V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
 };
-#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE       (V4L2_CID_MPEG_CX2341X_BASE+4)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE       (V4L2_CID_CODEC_CX2341X_BASE+4)
 enum v4l2_mpeg_cx2341x_video_temporal_filter_mode {
        V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL = 0,
        V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO   = 1,
 };
-#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER            (V4L2_CID_MPEG_CX2341X_BASE+5)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE         (V4L2_CID_MPEG_CX2341X_BASE+6)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER            (V4L2_CID_CODEC_CX2341X_BASE+5)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE         (V4L2_CID_CODEC_CX2341X_BASE+6)
 enum v4l2_mpeg_cx2341x_video_median_filter_type {
        V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF      = 0,
        V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR      = 1,
@@ -773,38 +830,38 @@ enum v4l2_mpeg_cx2341x_video_median_filter_type {
        V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT = 3,
        V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG     = 4,
 };
-#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM  (V4L2_CID_MPEG_CX2341X_BASE+7)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP     (V4L2_CID_MPEG_CX2341X_BASE+8)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM        (V4L2_CID_MPEG_CX2341X_BASE+9)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP   (V4L2_CID_MPEG_CX2341X_BASE+10)
-#define V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS                (V4L2_CID_MPEG_CX2341X_BASE+11)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM  (V4L2_CID_CODEC_CX2341X_BASE+7)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP     (V4L2_CID_CODEC_CX2341X_BASE+8)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM        (V4L2_CID_CODEC_CX2341X_BASE+9)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP   (V4L2_CID_CODEC_CX2341X_BASE+10)
+#define V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS                (V4L2_CID_CODEC_CX2341X_BASE+11)
 
 /*  MPEG-class control IDs specific to the Samsung MFC 5.1 driver as defined by V4L2 */
-#define V4L2_CID_MPEG_MFC51_BASE                               (V4L2_CTRL_CLASS_MPEG | 0x1100)
+#define V4L2_CID_CODEC_MFC51_BASE                              (V4L2_CTRL_CLASS_CODEC | 0x1100)
 
-#define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY           (V4L2_CID_MPEG_MFC51_BASE+0)
-#define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE    (V4L2_CID_MPEG_MFC51_BASE+1)
-#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE                      (V4L2_CID_MPEG_MFC51_BASE+2)
+#define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY           (V4L2_CID_CODEC_MFC51_BASE+0)
+#define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE    (V4L2_CID_CODEC_MFC51_BASE+1)
+#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE                      (V4L2_CID_CODEC_MFC51_BASE+2)
 enum v4l2_mpeg_mfc51_video_frame_skip_mode {
        V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_DISABLED          = 0,
        V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT       = 1,
        V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT         = 2,
 };
-#define V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE                     (V4L2_CID_MPEG_MFC51_BASE+3)
+#define V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE                     (V4L2_CID_CODEC_MFC51_BASE+3)
 enum v4l2_mpeg_mfc51_video_force_frame_type {
        V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_DISABLED         = 0,
        V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_I_FRAME          = 1,
        V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_NOT_CODED        = 2,
 };
-#define V4L2_CID_MPEG_MFC51_VIDEO_PADDING                              (V4L2_CID_MPEG_MFC51_BASE+4)
-#define V4L2_CID_MPEG_MFC51_VIDEO_PADDING_YUV                          (V4L2_CID_MPEG_MFC51_BASE+5)
-#define V4L2_CID_MPEG_MFC51_VIDEO_RC_FIXED_TARGET_BIT                  (V4L2_CID_MPEG_MFC51_BASE+6)
-#define V4L2_CID_MPEG_MFC51_VIDEO_RC_REACTION_COEFF                    (V4L2_CID_MPEG_MFC51_BASE+7)
-#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_ACTIVITY            (V4L2_CID_MPEG_MFC51_BASE+50)
-#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_DARK                        (V4L2_CID_MPEG_MFC51_BASE+51)
-#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_SMOOTH              (V4L2_CID_MPEG_MFC51_BASE+52)
-#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC              (V4L2_CID_MPEG_MFC51_BASE+53)
-#define V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P               (V4L2_CID_MPEG_MFC51_BASE+54)
+#define V4L2_CID_MPEG_MFC51_VIDEO_PADDING                              (V4L2_CID_CODEC_MFC51_BASE+4)
+#define V4L2_CID_MPEG_MFC51_VIDEO_PADDING_YUV                          (V4L2_CID_CODEC_MFC51_BASE+5)
+#define V4L2_CID_MPEG_MFC51_VIDEO_RC_FIXED_TARGET_BIT                  (V4L2_CID_CODEC_MFC51_BASE+6)
+#define V4L2_CID_MPEG_MFC51_VIDEO_RC_REACTION_COEFF                    (V4L2_CID_CODEC_MFC51_BASE+7)
+#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_ACTIVITY            (V4L2_CID_CODEC_MFC51_BASE+50)
+#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_DARK                        (V4L2_CID_CODEC_MFC51_BASE+51)
+#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_SMOOTH              (V4L2_CID_CODEC_MFC51_BASE+52)
+#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC              (V4L2_CID_CODEC_MFC51_BASE+53)
+#define V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P               (V4L2_CID_CODEC_MFC51_BASE+54)
 
 /*  Camera class control IDs */
 
@@ -918,6 +975,13 @@ enum v4l2_auto_focus_range {
 #define V4L2_CID_PAN_SPEED                     (V4L2_CID_CAMERA_CLASS_BASE+32)
 #define V4L2_CID_TILT_SPEED                    (V4L2_CID_CAMERA_CLASS_BASE+33)
 
+#define V4L2_CID_CAMERA_ORIENTATION            (V4L2_CID_CAMERA_CLASS_BASE+34)
+#define V4L2_CAMERA_ORIENTATION_FRONT          0
+#define V4L2_CAMERA_ORIENTATION_BACK           1
+#define V4L2_CAMERA_ORIENTATION_EXTERNAL       2
+
+#define V4L2_CID_CAMERA_SENSOR_ROTATION                (V4L2_CID_CAMERA_CLASS_BASE+35)
+
 /* FM Modulator class control IDs */
 
 #define V4L2_CID_FM_TX_CLASS_BASE              (V4L2_CTRL_CLASS_FM_TX | 0x900)
@@ -1134,4 +1198,468 @@ 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)
 
+
+/*  Stateless CODECs controls */
+#define V4L2_CID_CODEC_STATELESS_BASE          (V4L2_CTRL_CLASS_CODEC_STATELESS | 0x900)
+#define V4L2_CID_CODEC_STATELESS_CLASS         (V4L2_CTRL_CLASS_CODEC_STATELESS | 1)
+
+#define V4L2_CID_STATELESS_H264_DECODE_MODE    (V4L2_CID_CODEC_STATELESS_BASE + 0)
+/**
+ * enum v4l2_stateless_h264_decode_mode - Decoding mode
+ *
+ * @V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED: indicates that decoding
+ * is performed one slice at a time. In this mode,
+ * V4L2_CID_STATELESS_H264_SLICE_PARAMS must contain the parsed slice
+ * parameters and the OUTPUT buffer must contain a single slice.
+ * V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF feature is used
+ * in order to support multislice frames.
+ * @V4L2_STATELESS_H264_DECODE_MODE_FRAME_BASED: indicates that
+ * decoding is performed per frame. The OUTPUT buffer must contain
+ * all slices and also both fields. This mode is typically supported
+ * by device drivers that are able to parse the slice(s) header(s)
+ * in hardware. When this mode is selected,
+ * V4L2_CID_STATELESS_H264_SLICE_PARAMS is not used.
+ */
+enum v4l2_stateless_h264_decode_mode {
+       V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED,
+       V4L2_STATELESS_H264_DECODE_MODE_FRAME_BASED,
+};
+
+#define V4L2_CID_STATELESS_H264_START_CODE     (V4L2_CID_CODEC_STATELESS_BASE + 1)
+/**
+ * enum v4l2_stateless_h264_start_code - Start code
+ *
+ * @V4L2_STATELESS_H264_START_CODE_NONE: slices are passed
+ * to the driver without any start code.
+ * @V4L2_STATELESS_H264_START_CODE_ANNEX_B: slices are passed
+ * to the driver with an Annex B start code prefix
+ * (legal start codes can be 3-bytes 0x000001 or 4-bytes 0x00000001).
+ * This mode is typically supported by device drivers that parse
+ * the start code in hardware.
+ */
+enum v4l2_stateless_h264_start_code {
+       V4L2_STATELESS_H264_START_CODE_NONE,
+       V4L2_STATELESS_H264_START_CODE_ANNEX_B,
+};
+
+#define V4L2_H264_SPS_CONSTRAINT_SET0_FLAG                     0x01
+#define V4L2_H264_SPS_CONSTRAINT_SET1_FLAG                     0x02
+#define V4L2_H264_SPS_CONSTRAINT_SET2_FLAG                     0x04
+#define V4L2_H264_SPS_CONSTRAINT_SET3_FLAG                     0x08
+#define V4L2_H264_SPS_CONSTRAINT_SET4_FLAG                     0x10
+#define V4L2_H264_SPS_CONSTRAINT_SET5_FLAG                     0x20
+
+#define V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE               0x01
+#define V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS     0x02
+#define V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO         0x04
+#define V4L2_H264_SPS_FLAG_GAPS_IN_FRAME_NUM_VALUE_ALLOWED     0x08
+#define V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY                      0x10
+#define V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD             0x20
+#define V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE                        0x40
+
+#define V4L2_H264_SPS_HAS_CHROMA_FORMAT(sps) \
+       ((sps)->profile_idc == 100 || (sps)->profile_idc == 110 || \
+        (sps)->profile_idc == 122 || (sps)->profile_idc == 244 || \
+        (sps)->profile_idc == 44  || (sps)->profile_idc == 83  || \
+        (sps)->profile_idc == 86  || (sps)->profile_idc == 118 || \
+        (sps)->profile_idc == 128 || (sps)->profile_idc == 138 || \
+        (sps)->profile_idc == 139 || (sps)->profile_idc == 134 || \
+        (sps)->profile_idc == 135)
+
+#define V4L2_CID_STATELESS_H264_SPS            (V4L2_CID_CODEC_STATELESS_BASE + 2)
+/**
+ * struct v4l2_ctrl_h264_sps - H264 sequence parameter set
+ *
+ * All the members on this sequence parameter set structure match the
+ * sequence parameter set syntax as specified by the H264 specification.
+ *
+ * @profile_idc: see H264 specification.
+ * @constraint_set_flags: see H264 specification.
+ * @level_idc: see H264 specification.
+ * @seq_parameter_set_id: see H264 specification.
+ * @chroma_format_idc: see H264 specification.
+ * @bit_depth_luma_minus8: see H264 specification.
+ * @bit_depth_chroma_minus8: see H264 specification.
+ * @log2_max_frame_num_minus4: see H264 specification.
+ * @pic_order_cnt_type: see H264 specification.
+ * @log2_max_pic_order_cnt_lsb_minus4: see H264 specification.
+ * @max_num_ref_frames: see H264 specification.
+ * @num_ref_frames_in_pic_order_cnt_cycle: see H264 specification.
+ * @offset_for_ref_frame: see H264 specification.
+ * @offset_for_non_ref_pic: see H264 specification.
+ * @offset_for_top_to_bottom_field: see H264 specification.
+ * @pic_width_in_mbs_minus1: see H264 specification.
+ * @pic_height_in_map_units_minus1: see H264 specification.
+ * @flags: see V4L2_H264_SPS_FLAG_{}.
+ */
+struct v4l2_ctrl_h264_sps {
+       __u8 profile_idc;
+       __u8 constraint_set_flags;
+       __u8 level_idc;
+       __u8 seq_parameter_set_id;
+       __u8 chroma_format_idc;
+       __u8 bit_depth_luma_minus8;
+       __u8 bit_depth_chroma_minus8;
+       __u8 log2_max_frame_num_minus4;
+       __u8 pic_order_cnt_type;
+       __u8 log2_max_pic_order_cnt_lsb_minus4;
+       __u8 max_num_ref_frames;
+       __u8 num_ref_frames_in_pic_order_cnt_cycle;
+       __s32 offset_for_ref_frame[255];
+       __s32 offset_for_non_ref_pic;
+       __s32 offset_for_top_to_bottom_field;
+       __u16 pic_width_in_mbs_minus1;
+       __u16 pic_height_in_map_units_minus1;
+       __u32 flags;
+};
+
+#define V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE                         0x0001
+#define V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT     0x0002
+#define V4L2_H264_PPS_FLAG_WEIGHTED_PRED                               0x0004
+#define V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT           0x0008
+#define V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED                      0x0010
+#define V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT                   0x0020
+#define V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE                          0x0040
+#define V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT                      0x0080
+
+#define V4L2_CID_STATELESS_H264_PPS            (V4L2_CID_CODEC_STATELESS_BASE + 3)
+/**
+ * struct v4l2_ctrl_h264_pps - H264 picture parameter set
+ *
+ * Except where noted, all the members on this picture parameter set
+ * structure match the sequence parameter set syntax as specified
+ * by the H264 specification.
+ *
+ * In particular, V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT flag
+ * has a specific meaning. This flag should be set if a non-flat
+ * scaling matrix applies to the picture. In this case, applications
+ * are expected to use V4L2_CID_STATELESS_H264_SCALING_MATRIX,
+ * to pass the values of the non-flat matrices.
+ *
+ * @pic_parameter_set_id: see H264 specification.
+ * @seq_parameter_set_id: see H264 specification.
+ * @num_slice_groups_minus1: see H264 specification.
+ * @num_ref_idx_l0_default_active_minus1: see H264 specification.
+ * @num_ref_idx_l1_default_active_minus1: see H264 specification.
+ * @weighted_bipred_idc: see H264 specification.
+ * @pic_init_qp_minus26: see H264 specification.
+ * @pic_init_qs_minus26: see H264 specification.
+ * @chroma_qp_index_offset: see H264 specification.
+ * @second_chroma_qp_index_offset: see H264 specification.
+ * @flags: see V4L2_H264_PPS_FLAG_{}.
+ */
+struct v4l2_ctrl_h264_pps {
+       __u8 pic_parameter_set_id;
+       __u8 seq_parameter_set_id;
+       __u8 num_slice_groups_minus1;
+       __u8 num_ref_idx_l0_default_active_minus1;
+       __u8 num_ref_idx_l1_default_active_minus1;
+       __u8 weighted_bipred_idc;
+       __s8 pic_init_qp_minus26;
+       __s8 pic_init_qs_minus26;
+       __s8 chroma_qp_index_offset;
+       __s8 second_chroma_qp_index_offset;
+       __u16 flags;
+};
+
+#define V4L2_CID_STATELESS_H264_SCALING_MATRIX (V4L2_CID_CODEC_STATELESS_BASE + 4)
+/**
+ * struct v4l2_ctrl_h264_scaling_matrix - H264 scaling matrices
+ *
+ * @scaling_list_4x4: scaling matrix after applying the inverse
+ * scanning process. Expected list order is Intra Y, Intra Cb,
+ * Intra Cr, Inter Y, Inter Cb, Inter Cr. The values on each
+ * scaling list are expected in raster scan order.
+ * @scaling_list_8x8: scaling matrix after applying the inverse
+ * scanning process. Expected list order is Intra Y, Inter Y,
+ * Intra Cb, Inter Cb, Intra Cr, Inter Cr. The values on each
+ * scaling list are expected in raster scan order.
+ *
+ * Note that the list order is different for the 4x4 and 8x8
+ * matrices as per the H264 specification, see table 7-2 "Assignment
+ * of mnemonic names to scaling list indices and specification of
+ * fall-back rule".
+ */
+struct v4l2_ctrl_h264_scaling_matrix {
+       __u8 scaling_list_4x4[6][16];
+       __u8 scaling_list_8x8[6][64];
+};
+
+struct v4l2_h264_weight_factors {
+       __s16 luma_weight[32];
+       __s16 luma_offset[32];
+       __s16 chroma_weight[32][2];
+       __s16 chroma_offset[32][2];
+};
+
+#define V4L2_H264_CTRL_PRED_WEIGHTS_REQUIRED(pps, slice) \
+       ((((pps)->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED) && \
+        ((slice)->slice_type == V4L2_H264_SLICE_TYPE_P || \
+         (slice)->slice_type == V4L2_H264_SLICE_TYPE_SP)) || \
+        ((pps)->weighted_bipred_idc == 1 && \
+         (slice)->slice_type == V4L2_H264_SLICE_TYPE_B))
+
+#define V4L2_CID_STATELESS_H264_PRED_WEIGHTS   (V4L2_CID_CODEC_STATELESS_BASE + 5)
+/**
+ * struct v4l2_ctrl_h264_pred_weights - Prediction weight table
+ *
+ * Prediction weight table, which matches the syntax specified
+ * by the H264 specification.
+ *
+ * @luma_log2_weight_denom: see H264 specification.
+ * @chroma_log2_weight_denom: see H264 specification.
+ * @weight_factors: luma and chroma weight factors.
+ */
+struct v4l2_ctrl_h264_pred_weights {
+       __u16 luma_log2_weight_denom;
+       __u16 chroma_log2_weight_denom;
+       struct v4l2_h264_weight_factors weight_factors[2];
+};
+
+#define V4L2_H264_SLICE_TYPE_P                         0
+#define V4L2_H264_SLICE_TYPE_B                         1
+#define V4L2_H264_SLICE_TYPE_I                         2
+#define V4L2_H264_SLICE_TYPE_SP                                3
+#define V4L2_H264_SLICE_TYPE_SI                                4
+
+#define V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED    0x01
+#define V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH             0x02
+
+#define V4L2_H264_TOP_FIELD_REF                                0x1
+#define V4L2_H264_BOTTOM_FIELD_REF                     0x2
+#define V4L2_H264_FRAME_REF                            0x3
+
+/**
+ * struct v4l2_h264_reference - H264 picture reference
+ *
+ * @fields: indicates how the picture is referenced.
+ * Valid values are V4L2_H264_{}_REF.
+ * @index: index into v4l2_ctrl_h264_decode_params.dpb[].
+ */
+struct v4l2_h264_reference {
+       __u8 fields;
+       __u8 index;
+};
+
+/*
+ * Maximum DPB size, as specified by section 'A.3.1 Level limits
+ * common to the Baseline, Main, and Extended profiles'.
+ */
+#define V4L2_H264_NUM_DPB_ENTRIES 16
+#define V4L2_H264_REF_LIST_LEN (2 * V4L2_H264_NUM_DPB_ENTRIES)
+
+#define V4L2_CID_STATELESS_H264_SLICE_PARAMS   (V4L2_CID_CODEC_STATELESS_BASE + 6)
+/**
+ * struct v4l2_ctrl_h264_slice_params - H264 slice parameters
+ *
+ * This structure holds the H264 syntax elements that are specified
+ * as non-invariant for the slices in a given frame.
+ *
+ * Slice invariant syntax elements are contained in struct
+ * v4l2_ctrl_h264_decode_params. This is done to reduce the API surface
+ * on frame-based decoders, where slice header parsing is done by the
+ * hardware.
+ *
+ * Slice invariant syntax elements are specified in specification section
+ * "7.4.3 Slice header semantics".
+ *
+ * Except where noted, the members on this struct match the slice header syntax.
+ *
+ * @header_bit_size: offset in bits to slice_data() from the beginning of this slice.
+ * @first_mb_in_slice: see H264 specification.
+ * @slice_type: see H264 specification.
+ * @colour_plane_id: see H264 specification.
+ * @redundant_pic_cnt: see H264 specification.
+ * @cabac_init_idc: see H264 specification.
+ * @slice_qp_delta: see H264 specification.
+ * @slice_qs_delta: see H264 specification.
+ * @disable_deblocking_filter_idc: see H264 specification.
+ * @slice_alpha_c0_offset_div2: see H264 specification.
+ * @slice_beta_offset_div2: see H264 specification.
+ * @num_ref_idx_l0_active_minus1: see H264 specification.
+ * @num_ref_idx_l1_active_minus1: see H264 specification.
+ * @reserved: padding field. Should be zeroed by applications.
+ * @ref_pic_list0: reference picture list 0 after applying the per-slice modifications.
+ * @ref_pic_list1: reference picture list 1 after applying the per-slice modifications.
+ * @flags: see V4L2_H264_SLICE_FLAG_{}.
+ */
+struct v4l2_ctrl_h264_slice_params {
+       __u32 header_bit_size;
+       __u32 first_mb_in_slice;
+       __u8 slice_type;
+       __u8 colour_plane_id;
+       __u8 redundant_pic_cnt;
+       __u8 cabac_init_idc;
+       __s8 slice_qp_delta;
+       __s8 slice_qs_delta;
+       __u8 disable_deblocking_filter_idc;
+       __s8 slice_alpha_c0_offset_div2;
+       __s8 slice_beta_offset_div2;
+       __u8 num_ref_idx_l0_active_minus1;
+       __u8 num_ref_idx_l1_active_minus1;
+
+       __u8 reserved;
+
+       struct v4l2_h264_reference ref_pic_list0[V4L2_H264_REF_LIST_LEN];
+       struct v4l2_h264_reference ref_pic_list1[V4L2_H264_REF_LIST_LEN];
+
+       __u32 flags;
+};
+
+#define V4L2_H264_DPB_ENTRY_FLAG_VALID         0x01
+#define V4L2_H264_DPB_ENTRY_FLAG_ACTIVE                0x02
+#define V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM     0x04
+#define V4L2_H264_DPB_ENTRY_FLAG_FIELD         0x08
+
+/**
+ * struct v4l2_h264_dpb_entry - H264 decoded picture buffer entry
+ *
+ * @reference_ts: timestamp of the V4L2 capture buffer to use as reference.
+ * The timestamp refers to the timestamp field in struct v4l2_buffer.
+ * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64.
+ * @pic_num: matches PicNum variable assigned during the reference
+ * picture lists construction process.
+ * @frame_num: frame identifier which matches frame_num syntax element.
+ * @fields: indicates how the DPB entry is referenced. Valid values are
+ * V4L2_H264_{}_REF.
+ * @reserved: padding field. Should be zeroed by applications.
+ * @top_field_order_cnt: matches TopFieldOrderCnt picture value.
+ * @bottom_field_order_cnt: matches BottomFieldOrderCnt picture value.
+ * Note that picture field is indicated by v4l2_buffer.field.
+ * @flags: see V4L2_H264_DPB_ENTRY_FLAG_{}.
+ */
+struct v4l2_h264_dpb_entry {
+       __u64 reference_ts;
+       __u32 pic_num;
+       __u16 frame_num;
+       __u8 fields;
+       __u8 reserved[5];
+       __s32 top_field_order_cnt;
+       __s32 bottom_field_order_cnt;
+       __u32 flags;
+};
+
+#define V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC            0x01
+#define V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC          0x02
+#define V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD       0x04
+
+#define V4L2_CID_STATELESS_H264_DECODE_PARAMS  (V4L2_CID_CODEC_STATELESS_BASE + 7)
+/**
+ * struct v4l2_ctrl_h264_decode_params - H264 decoding parameters
+ *
+ * @dpb: decoded picture buffer.
+ * @nal_ref_idc: slice header syntax element.
+ * @frame_num: slice header syntax element.
+ * @top_field_order_cnt: matches TopFieldOrderCnt picture value.
+ * @bottom_field_order_cnt: matches BottomFieldOrderCnt picture value.
+ * Note that picture field is indicated by v4l2_buffer.field.
+ * @idr_pic_id: slice header syntax element.
+ * @pic_order_cnt_lsb: slice header syntax element.
+ * @delta_pic_order_cnt_bottom: slice header syntax element.
+ * @delta_pic_order_cnt0: slice header syntax element.
+ * @delta_pic_order_cnt1: slice header syntax element.
+ * @dec_ref_pic_marking_bit_size: size in bits of dec_ref_pic_marking()
+ * syntax element.
+ * @pic_order_cnt_bit_size: size in bits of pic order count syntax.
+ * @slice_group_change_cycle: slice header syntax element.
+ * @reserved: padding field. Should be zeroed by applications.
+ * @flags: see V4L2_H264_DECODE_PARAM_FLAG_{}.
+ */
+struct v4l2_ctrl_h264_decode_params {
+       struct v4l2_h264_dpb_entry dpb[V4L2_H264_NUM_DPB_ENTRIES];
+       __u16 nal_ref_idc;
+       __u16 frame_num;
+       __s32 top_field_order_cnt;
+       __s32 bottom_field_order_cnt;
+       __u16 idr_pic_id;
+       __u16 pic_order_cnt_lsb;
+       __s32 delta_pic_order_cnt_bottom;
+       __s32 delta_pic_order_cnt0;
+       __s32 delta_pic_order_cnt1;
+       __u32 dec_ref_pic_marking_bit_size;
+       __u32 pic_order_cnt_bit_size;
+       __u32 slice_group_change_cycle;
+
+       __u32 reserved;
+       __u32 flags;
+};
+
+
+/* Stateless FWHT control, used by the vicodec driver */
+
+/* Current FWHT version */
+#define V4L2_FWHT_VERSION                      3
+
+/* Set if this is an interlaced format */
+#define V4L2_FWHT_FL_IS_INTERLACED             BIT(0)
+/* Set if this is a bottom-first (NTSC) interlaced format */
+#define V4L2_FWHT_FL_IS_BOTTOM_FIRST           BIT(1)
+/* Set if each 'frame' contains just one field */
+#define V4L2_FWHT_FL_IS_ALTERNATE              BIT(2)
+/*
+ * If V4L2_FWHT_FL_IS_ALTERNATE was set, then this is set if this
+ * 'frame' is the bottom field, else it is the top field.
+ */
+#define V4L2_FWHT_FL_IS_BOTTOM_FIELD           BIT(3)
+/* Set if the Y' plane is uncompressed */
+#define V4L2_FWHT_FL_LUMA_IS_UNCOMPRESSED      BIT(4)
+/* Set if the Cb plane is uncompressed */
+#define V4L2_FWHT_FL_CB_IS_UNCOMPRESSED                BIT(5)
+/* Set if the Cr plane is uncompressed */
+#define V4L2_FWHT_FL_CR_IS_UNCOMPRESSED                BIT(6)
+/* Set if the chroma plane is full height, if cleared it is half height */
+#define V4L2_FWHT_FL_CHROMA_FULL_HEIGHT                BIT(7)
+/* Set if the chroma plane is full width, if cleared it is half width */
+#define V4L2_FWHT_FL_CHROMA_FULL_WIDTH         BIT(8)
+/* Set if the alpha plane is uncompressed */
+#define V4L2_FWHT_FL_ALPHA_IS_UNCOMPRESSED     BIT(9)
+/* Set if this is an I Frame */
+#define V4L2_FWHT_FL_I_FRAME                   BIT(10)
+
+/* A 4-values flag - the number of components - 1 */
+#define V4L2_FWHT_FL_COMPONENTS_NUM_MSK                GENMASK(18, 16)
+#define V4L2_FWHT_FL_COMPONENTS_NUM_OFFSET     16
+
+/* A 4-values flag - the pixel encoding type */
+#define V4L2_FWHT_FL_PIXENC_MSK                        GENMASK(20, 19)
+#define V4L2_FWHT_FL_PIXENC_OFFSET             19
+#define V4L2_FWHT_FL_PIXENC_YUV                        (1 << V4L2_FWHT_FL_PIXENC_OFFSET)
+#define V4L2_FWHT_FL_PIXENC_RGB                        (2 << V4L2_FWHT_FL_PIXENC_OFFSET)
+#define V4L2_FWHT_FL_PIXENC_HSV                        (3 << V4L2_FWHT_FL_PIXENC_OFFSET)
+
+#define V4L2_CID_STATELESS_FWHT_PARAMS         (V4L2_CID_CODEC_STATELESS_BASE + 100)
+/**
+ * struct v4l2_ctrl_fwht_params - FWHT parameters
+ *
+ * @backward_ref_ts: timestamp of the V4L2 capture buffer to use as reference.
+ * The timestamp refers to the timestamp field in struct v4l2_buffer.
+ * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64.
+ * @version: must be V4L2_FWHT_VERSION.
+ * @width: width of frame.
+ * @height: height of frame.
+ * @flags: FWHT flags (see V4L2_FWHT_FL_*).
+ * @colorspace: the colorspace (enum v4l2_colorspace).
+ * @xfer_func: the transfer function (enum v4l2_xfer_func).
+ * @ycbcr_enc: the Y'CbCr encoding (enum v4l2_ycbcr_encoding).
+ * @quantization: the quantization (enum v4l2_quantization).
+ */
+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;
+};
+
+/* MPEG-compression definitions kept for backwards compatibility */
+#define V4L2_CTRL_CLASS_MPEG            V4L2_CTRL_CLASS_CODEC
+#define V4L2_CID_MPEG_CLASS             V4L2_CID_CODEC_CLASS
+#define V4L2_CID_MPEG_BASE              V4L2_CID_CODEC_BASE
+#define V4L2_CID_MPEG_CX2341X_BASE      V4L2_CID_CODEC_CX2341X_BASE
+#define V4L2_CID_MPEG_MFC51_BASE        V4L2_CID_CODEC_MFC51_BASE
+
 #endif
index 13355e4..bb9b660 100644 (file)
@@ -169,6 +169,8 @@ enum v4l2_buf_type {
         || (type) == V4L2_BUF_TYPE_SDR_OUTPUT                  \
         || (type) == V4L2_BUF_TYPE_META_OUTPUT)
 
+#define V4L2_TYPE_IS_CAPTURE(type) (!V4L2_TYPE_IS_OUTPUT(type))
+
 enum v4l2_tuner_type {
        V4L2_TUNER_RADIO             = 1,
        V4L2_TUNER_ANALOG_TV         = 2,
@@ -217,9 +219,7 @@ enum v4l2_colorspace {
        V4L2_COLORSPACE_470_SYSTEM_M  = 5,
 
        /*
-        * EBU Tech 3213 PAL/SECAM colorspace. This only makes sense when
-        * dealing with really old PAL/SECAM recordings. Superseded by
-        * SMPTE 170M.
+        * EBU Tech 3213 PAL/SECAM colorspace.
         */
        V4L2_COLORSPACE_470_SYSTEM_BG = 6,
 
@@ -324,14 +324,12 @@ enum v4l2_ycbcr_encoding {
        /* Rec. 709/EN 61966-2-4 Extended Gamut -- HDTV */
        V4L2_YCBCR_ENC_XV709          = 4,
 
-#ifndef __KERNEL__
        /*
         * sYCC (Y'CbCr encoding of sRGB), identical to ENC_601. It was added
         * originally due to a misunderstanding of the sYCC standard. It should
         * not be used, instead use V4L2_YCBCR_ENC_601.
         */
        V4L2_YCBCR_ENC_SYCC           = 5,
-#endif
 
        /* BT.2020 Non-constant Luminance Y'CbCr */
        V4L2_YCBCR_ENC_BT2020         = 6,
@@ -369,9 +367,9 @@ enum v4l2_hsv_encoding {
 
 enum v4l2_quantization {
        /*
-        * The default for R'G'B' quantization is always full range, except
-        * for the BT2020 colorspace. For Y'CbCr the quantization is always
-        * limited range, except for COLORSPACE_JPEG: this is full range.
+        * The default for R'G'B' quantization is always full range.
+        * For Y'CbCr the quantization is always limited range, except
+        * for COLORSPACE_JPEG: this is full range.
         */
        V4L2_QUANTIZATION_DEFAULT     = 0,
        V4L2_QUANTIZATION_FULL_RANGE  = 1,
@@ -380,14 +378,13 @@ enum v4l2_quantization {
 
 /*
  * Determine how QUANTIZATION_DEFAULT should map to a proper quantization.
- * This depends on whether the image is RGB or not, the colorspace and the
- * Y'CbCr encoding.
+ * This depends on whether the image is RGB or not, the colorspace.
+ * The Y'CbCr encoding is not used anymore, but is still there for backwards
+ * compatibility.
  */
 #define V4L2_MAP_QUANTIZATION_DEFAULT(is_rgb_or_hsv, colsp, ycbcr_enc) \
-       (((is_rgb_or_hsv) && (colsp) == V4L2_COLORSPACE_BT2020) ? \
-        V4L2_QUANTIZATION_LIM_RANGE : \
-        (((is_rgb_or_hsv) || (colsp) == V4L2_COLORSPACE_JPEG) ? \
-        V4L2_QUANTIZATION_FULL_RANGE : V4L2_QUANTIZATION_LIM_RANGE))
+       (((is_rgb_or_hsv) || (colsp) == V4L2_COLORSPACE_JPEG) ? \
+        V4L2_QUANTIZATION_FULL_RANGE : V4L2_QUANTIZATION_LIM_RANGE)
 
 /*
  * Deprecated names for opRGB colorspace (IEC 61966-2-5)
@@ -395,10 +392,8 @@ enum v4l2_quantization {
  * WARNING: Please don't use these deprecated defines in your code, as
  * there is a chance we have to remove them in the future.
  */
-#ifndef __KERNEL__
 #define V4L2_COLORSPACE_ADOBERGB V4L2_COLORSPACE_OPRGB
 #define V4L2_XFER_FUNC_ADOBERGB  V4L2_XFER_FUNC_OPRGB
-#endif
 
 enum v4l2_priority {
        V4L2_PRIORITY_UNSET       = 0,  /* not initialized */
@@ -485,6 +480,8 @@ struct v4l2_capability {
 
 #define V4L2_CAP_TOUCH                  0x10000000  /* Is a touch device */
 
+#define V4L2_CAP_IO_MC                 0x20000000  /* Is input/output controlled by the media controller */
+
 #define V4L2_CAP_DEVICE_CAPS            0x80000000  /* sets device capabilities field */
 
 /*
@@ -592,8 +589,6 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_XYUV32  v4l2_fourcc('X', 'Y', 'U', 'V') /* 32  XYUV-8-8-8-8  */
 #define V4L2_PIX_FMT_VUYA32  v4l2_fourcc('V', 'U', 'Y', 'A') /* 32  VUYA-8-8-8-8  */
 #define V4L2_PIX_FMT_VUYX32  v4l2_fourcc('V', 'U', 'Y', 'X') /* 32  VUYX-8-8-8-8  */
-#define V4L2_PIX_FMT_HI240   v4l2_fourcc('H', 'I', '2', '4') /*  8  8-bit color   */
-#define V4L2_PIX_FMT_HM12    v4l2_fourcc('H', 'M', '1', '2') /*  8  YUV 4:2:0 16x16 macroblocks */
 #define V4L2_PIX_FMT_M420    v4l2_fourcc('M', '4', '2', '0') /* 12  YUV 4:2:0 2 lines y, 1 line uv interleaved */
 
 /* two planes -- one Y, one Cr + Cb interleaved  */
@@ -603,6 +598,7 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_NV61    v4l2_fourcc('N', 'V', '6', '1') /* 16  Y/CrCb 4:2:2  */
 #define V4L2_PIX_FMT_NV24    v4l2_fourcc('N', 'V', '2', '4') /* 24  Y/CbCr 4:4:4  */
 #define V4L2_PIX_FMT_NV42    v4l2_fourcc('N', 'V', '4', '2') /* 24  Y/CrCb 4:4:4  */
+#define V4L2_PIX_FMT_HM12    v4l2_fourcc('H', 'M', '1', '2') /*  8  YUV 4:2:0 16x16 macroblocks */
 
 /* two non contiguous planes - one Y, one Cr + Cb interleaved  */
 #define V4L2_PIX_FMT_NV12M   v4l2_fourcc('N', 'M', '1', '2') /* 12  Y/CbCr 4:2:0  */
@@ -700,6 +696,7 @@ struct v4l2_pix_format {
 #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) */
+#define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */
 
 /*  Vendor-specific formats   */
 #define V4L2_PIX_FMT_CPIA1    v4l2_fourcc('C', 'P', 'I', 'A') /* cpia1 YUV */
@@ -735,6 +732,7 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_INZI     v4l2_fourcc('I', 'N', 'Z', 'I') /* Intel Planar Greyscale 10-bit and Depth 16-bit */
 #define V4L2_PIX_FMT_SUNXI_TILED_NV12 v4l2_fourcc('S', 'T', '1', '2') /* Sunxi Tiled NV12 Format */
 #define V4L2_PIX_FMT_CNF4     v4l2_fourcc('C', 'N', 'F', '4') /* Intel 4-bit packed depth confidence information */
+#define V4L2_PIX_FMT_HI240    v4l2_fourcc('H', 'I', '2', '4') /* BTTV 8-bit dithered RGB */
 
 /* 10bit raw bayer packed, 32 bytes for every 25 pixels, last LSB 6 bits unused */
 #define V4L2_PIX_FMT_IPU3_SBGGR10      v4l2_fourcc('i', 'p', '3', 'b') /* IPU3 packed 10-bit BGGR bayer */
@@ -765,11 +763,16 @@ struct v4l2_pix_format {
 #define V4L2_META_FMT_D4XX        v4l2_fourcc('D', '4', 'X', 'X') /* D4XX Payload Header metadata */
 #define V4L2_META_FMT_VIVID      v4l2_fourcc('V', 'I', 'V', 'D') /* Vivid Metadata */
 
+/* Vendor specific - used for RK_ISP1 camera sub-system */
+#define V4L2_META_FMT_RK_ISP1_PARAMS   v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 3A Parameters */
+#define V4L2_META_FMT_RK_ISP1_STAT_3A  v4l2_fourcc('R', 'K', '1', 'S') /* Rockchip ISP1 3A Statistics */
+
 /* priv field value to indicates that subsequent fields are valid. */
 #define V4L2_PIX_FMT_PRIV_MAGIC                0xfeedcafe
 
 /* Flags */
 #define V4L2_PIX_FMT_FLAG_PREMUL_ALPHA 0x00000001
+#define V4L2_PIX_FMT_FLAG_SET_CSC      0x00000002
 
 /*
  *     F O R M A T   E N U M E R A T I O N
@@ -780,13 +783,20 @@ struct v4l2_fmtdesc {
        __u32               flags;
        __u8                description[32];   /* Description string */
        __u32               pixelformat;       /* Format fourcc      */
-       __u32               reserved[4];
+       __u32               mbus_code;          /* Media bus code    */
+       __u32               reserved[3];
 };
 
 #define V4L2_FMT_FLAG_COMPRESSED               0x0001
 #define V4L2_FMT_FLAG_EMULATED                 0x0002
 #define V4L2_FMT_FLAG_CONTINUOUS_BYTESTREAM    0x0004
 #define V4L2_FMT_FLAG_DYN_RESOLUTION           0x0008
+#define V4L2_FMT_FLAG_ENC_CAP_FRAME_INTERVAL   0x0010
+#define V4L2_FMT_FLAG_CSC_COLORSPACE           0x0020
+#define V4L2_FMT_FLAG_CSC_XFER_FUNC            0x0040
+#define V4L2_FMT_FLAG_CSC_YCBCR_ENC            0x0080
+#define V4L2_FMT_FLAG_CSC_HSV_ENC              V4L2_FMT_FLAG_CSC_YCBCR_ENC
+#define V4L2_FMT_FLAG_CSC_QUANTIZATION         0x0100
 
        /* Frame Size and frame rate enumeration */
 /*
@@ -916,23 +926,6 @@ struct v4l2_jpegcompression {
  *     M E M O R Y - M A P P I N G   B U F F E R S
  */
 
-#ifdef __KERNEL__
-/*
- * This corresponds to the user space version of timeval
- * for 64-bit time_t. sparc64 is different from everyone
- * else, using the microseconds in the wrong half of the
- * second 64-bit word.
- */
-struct __kernel_v4l2_timeval {
-       long long       tv_sec;
-#if defined(__sparc__) && defined(__arch64__)
-       int             tv_usec;
-       int             __pad;
-#else
-       long long       tv_usec;
-#endif
-};
-#endif
 
 struct v4l2_requestbuffers {
        __u32                   count;
@@ -943,12 +936,13 @@ struct v4l2_requestbuffers {
 };
 
 /* capabilities for struct v4l2_requestbuffers and v4l2_create_buffers */
-#define V4L2_BUF_CAP_SUPPORTS_MMAP     (1 << 0)
-#define V4L2_BUF_CAP_SUPPORTS_USERPTR  (1 << 1)
-#define V4L2_BUF_CAP_SUPPORTS_DMABUF   (1 << 2)
-#define V4L2_BUF_CAP_SUPPORTS_REQUESTS (1 << 3)
-#define V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS (1 << 4)
+#define V4L2_BUF_CAP_SUPPORTS_MMAP                     (1 << 0)
+#define V4L2_BUF_CAP_SUPPORTS_USERPTR                  (1 << 1)
+#define V4L2_BUF_CAP_SUPPORTS_DMABUF                   (1 << 2)
+#define V4L2_BUF_CAP_SUPPORTS_REQUESTS                 (1 << 3)
+#define V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS            (1 << 4)
 #define V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF     (1 << 5)
+#define V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS         (1 << 6)
 
 /**
  * struct v4l2_plane - plane info for multi-planar buffers
@@ -1019,11 +1013,7 @@ struct v4l2_buffer {
        __u32                   bytesused;
        __u32                   flags;
        __u32                   field;
-#ifdef __KERNEL__
-       struct __kernel_v4l2_timeval timestamp;
-#else
        struct timeval          timestamp;
-#endif
        struct v4l2_timecode    timecode;
        __u32                   sequence;
 
@@ -1043,7 +1033,6 @@ struct v4l2_buffer {
        };
 };
 
-#ifndef __KERNEL__
 /**
  * v4l2_timeval_to_ns - Convert timeval to nanoseconds
  * @ts:                pointer to the timeval variable to be converted
@@ -1051,11 +1040,10 @@ struct v4l2_buffer {
  * Returns the scalar nanosecond representation of the timeval
  * parameter.
  */
-static inline __u64 v4l2_timeval_to_ns(const struct timeval *tv)
+static __inline__ __u64 v4l2_timeval_to_ns(const struct timeval *tv)
 {
        return (__u64)tv->tv_sec * 1000000000ULL + tv->tv_usec * 1000;
 }
-#endif
 
 /*  Flags for 'flags' field */
 /* Buffer is mapped (flag) */
@@ -1164,16 +1152,16 @@ struct v4l2_framebuffer {
 
 struct v4l2_clip {
        struct v4l2_rect        c;
-       struct v4l2_clip        __user *next;
+       struct v4l2_clip        *next;
 };
 
 struct v4l2_window {
        struct v4l2_rect        w;
        __u32                   field;   /* enum v4l2_field */
        __u32                   chromakey;
-       struct v4l2_clip        __user *clips;
+       struct v4l2_clip        *clips;
        __u32                   clipcount;
-       void                    __user *bitmap;
+       void                    *bitmap;
        __u8                    global_alpha;
 };
 
@@ -1712,20 +1700,25 @@ struct v4l2_ext_control {
        union {
                __s32 value;
                __s64 value64;
-               char __user *string;
-               __u8 __user *p_u8;
-               __u16 __user *p_u16;
-               __u32 __user *p_u32;
-               struct v4l2_area __user *p_area;
-               void __user *ptr;
+               char *string;
+               __u8 *p_u8;
+               __u16 *p_u16;
+               __u32 *p_u32;
+               struct v4l2_area *p_area;
+               struct v4l2_ctrl_h264_sps *p_h264_sps;
+               struct v4l2_ctrl_h264_pps *p_h264_pps;
+               struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix;
+               struct v4l2_ctrl_h264_pred_weights *p_h264_pred_weights;
+               struct v4l2_ctrl_h264_slice_params *p_h264_slice_params;
+               struct v4l2_ctrl_h264_decode_params *p_h264_decode_params;
+               struct v4l2_ctrl_fwht_params *p_fwht_params;
+               void *ptr;
        };
 } __attribute__ ((packed));
 
 struct v4l2_ext_controls {
        union {
-#ifndef __KERNEL__
                __u32 ctrl_class;
-#endif
                __u32 which;
        };
        __u32 count;
@@ -1736,9 +1729,7 @@ struct v4l2_ext_controls {
 };
 
 #define V4L2_CTRL_ID_MASK        (0x0fffffff)
-#ifndef __KERNEL__
 #define V4L2_CTRL_ID2CLASS(id)    ((id) & 0x0fff0000UL)
-#endif
 #define V4L2_CTRL_ID2WHICH(id)    ((id) & 0x0fff0000UL)
 #define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000)
 #define V4L2_CTRL_MAX_DIMS       (4)
@@ -1763,6 +1754,15 @@ enum v4l2_ctrl_type {
        V4L2_CTRL_TYPE_U16           = 0x0101,
        V4L2_CTRL_TYPE_U32           = 0x0102,
        V4L2_CTRL_TYPE_AREA          = 0x0106,
+
+       V4L2_CTRL_TYPE_H264_SPS             = 0x0200,
+       V4L2_CTRL_TYPE_H264_PPS             = 0x0201,
+       V4L2_CTRL_TYPE_H264_SCALING_MATRIX  = 0x0202,
+       V4L2_CTRL_TYPE_H264_SLICE_PARAMS    = 0x0203,
+       V4L2_CTRL_TYPE_H264_DECODE_PARAMS   = 0x0204,
+       V4L2_CTRL_TYPE_H264_PRED_WEIGHTS    = 0x0205,
+
+       V4L2_CTRL_TYPE_FWHT_PARAMS          = 0x0220,
 };
 
 /*  Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
@@ -2371,11 +2371,7 @@ struct v4l2_event {
        } u;
        __u32                           pending;
        __u32                           sequence;
-#ifdef __KERNEL__
-       struct __kernel_timespec        timestamp;
-#else
        struct timespec                 timestamp;
-#endif
        __u32                           id;
        __u32                           reserved[8];
 };
index eb3afcd..91334e7 100644 (file)
@@ -26,7 +26,7 @@
 #include "gstv4l2codech264dec.h"
 #include "gstv4l2codecvp8dec.h"
 #include "gstv4l2decoder.h"
-#include "linux/h264-ctrls.h"
+#include "linux/v4l2-controls.h"
 #include "linux/vp8-ctrls.h"
 #include "linux/media.h"