/*
 * Copyright (c) 2016-2023, NVIDIA CORPORATION.  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *  1. Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *  3. The names of its contributors may not be used to endorse or promote
 *     products derived from this software without specific prior written
 *     permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/* This file contains amendments to the V4L2 headers made after the
 * supported kernel version and NVIDIA extensions.
 */

#ifndef __V4L2_NV_EXTENSIONS_H__
#define __V4L2_NV_EXTENSIONS_H__

/**
 * @file
 * <b>NVIDIA V4L2 API Extensions</b>
 *
 * @b Description: This file declares NVIDIA V4L2 extensions,
 * controls and structures.
 */

/**
 *
 * @defgroup ee_extensions_group V4L2 NV Extensions API
 *
 * This file declares NVIDIA V4L2 extensions, controls, and structures.
 *
 */
/**
 * Defines V4L2 pixel format for DIVX.
 */
#define V4L2_PIX_FMT_DIVX4     v4l2_fourcc('D', 'V', 'X', '4')

#define V4L2_PIX_FMT_DIVX5     v4l2_fourcc('D', 'V', 'X', '5')
/**
 * Defines V4L2 pixel format for H.265.
 */
#define V4L2_PIX_FMT_H265     v4l2_fourcc('H', '2', '6', '5')

/**
 * Defines the V4L2 pixel format for VP9.
 */
#define V4L2_PIX_FMT_VP9      v4l2_fourcc('V', 'P', '9', '0')

/**
 * Defines the V4L2 pixel format for AV1.
 */
#define V4L2_PIX_FMT_AV1      v4l2_fourcc('A', 'V', '1', '0')

/**
 * Defines the V4L2 pixel format for representing single plane 10-bit Y/CbCr 4:2:0 decoder data.
 */
#define V4L2_PIX_FMT_P010    v4l2_fourcc('P', '0', '1', '0') /* Y/CbCr 4:2:0, 10 bits per channel */

/**
 * Defines the V4L2 pixel format for representing semi-planar 10-bit Y/CbCr 4:2:0 decoder data.
 */
#define V4L2_PIX_FMT_P010M   v4l2_fourcc('P', 'M', '1', '0') /* Y/CbCr 4:2:0, 10 bits per channel */

/**
 * Defines the V4L2 pixel format for representing single plane 12-bit Y/CbCr 4:2:0 decoder data.
 */
#define V4L2_PIX_FMT_P012    v4l2_fourcc('P', '0', '1', '2') /* Y/CbCr 4:2:0, 12 bits per channel */

/**
 * Defines the V4L2 pixel format for representing semi-planar 12-bit Y/CbCr 4:2:0 decoder data.
 */
#define V4L2_PIX_FMT_P012M   v4l2_fourcc('P', 'M', '1', '2') /* Y/CbCr 4:2:0, 12 bits per channel */

/**
 * Defines the V4L2 pixel format for representing semi-planar 8-bit Y/CbCr 4:4:4 decoder data.
 */
#define V4L2_PIX_FMT_NV24M   v4l2_fourcc('N', 'M', '2', '4') /* Y/CbCr 4:4:4, 8 bits per channel */

/**
 * Defines the V4L2 pixel format for representing semi-planar 10-bit Y/CbCr 4:4:4 decoder data.
 */
#define V4L2_PIX_FMT_NV24_10LE   v4l2_fourcc('N', 'V', '1', '0') /* Y/CbCr 4:4:4, 10 bits per channel */

/**
 * Defines the V4L2 pixel format for representing planar 10-bit Y/CbCr 4:4:4 decoder data.
 */
#define V4L2_PIX_FMT_YUV444_10LE   v4l2_fourcc('P', '4', '1', '0') /* Y/Cb/Cr 4:4:4, 10 bits per channel */

/**
 * Defines the V4L2 pixel format for representing planar 12-bit Y/CbCr 4:4:4 decoder data.
 */
#define V4L2_PIX_FMT_YUV444_12LE   v4l2_fourcc('P', '4', '1', '2') /* Y/Cb/Cr 4:4:4, 12 bits per channel */

/** @cond UNUSED */
/* >> The declarations from here to the next endcond statement are not
 * >> currently implemented. DO NOT USE. */

#define V4L2_PIX_FMT_YUV422RM v4l2_fourcc('4', '2', 'R', 'M')


#define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4') /** H264 parsed slices. */
#define V4L2_PIX_FMT_VP8_FRAME v4l2_fourcc('V', 'P', '8', 'F') /** VP8 parsed frames. */

#define V4L2_CTRL_FLAG_CAN_STORE    0x0200

/** @endcond */

/**
 * Defines the V4L2 event type for decoder resolution event change.
 */
#define V4L2_EVENT_RESOLUTION_CHANGE        5

/** @cond UNUSED */
/* >> The declarations from here to the next endcond statement are not
 * >> currently implemented. DO NOT USE. */

/*---------------Below are changes from the v4l2-controls.h----------------------*/

#define V4L2_CID_MPEG_VIDEO_H264_SPS        (V4L2_CID_MPEG_BASE+383)
#define V4L2_CID_MPEG_VIDEO_H264_PPS        (V4L2_CID_MPEG_BASE+384)
#define V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX (V4L2_CID_MPEG_BASE+385)
#define V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAM    (V4L2_CID_MPEG_BASE+386)
#define V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAM   (V4L2_CID_MPEG_BASE+387)

#define V4L2_CID_MPEG_VIDEO_VP8_FRAME_HDR       (V4L2_CID_MPEG_BASE+512)

/** @endcond */

/**
 * Defines the control ID to set the H.265 encoder profile.
 *
 * A v4l2_mpeg_video_h265_profile must be passed.
 */
#define V4L2_CID_MPEG_VIDEO_H265_PROFILE        (V4L2_CID_MPEG_BASE+513)

/**
 * Defines the possible profiles for H.265 encoder.
 */
enum v4l2_mpeg_video_h265_profile {
    /** H.265 Main profile. */
    V4L2_MPEG_VIDEO_H265_PROFILE_MAIN = 0,
    /** H.265 Main10 profile. */
    V4L2_MPEG_VIDEO_H265_PROFILE_MAIN10 = 1,
    /** H.265 MainStillPicture profile. */
    V4L2_MPEG_VIDEO_H265_PROFILE_MAINSTILLPICTURE = 2,
    /** H.265 FREXT profile. */
    V4L2_MPEG_VIDEO_H265_PROFILE_FREXT = 3,
};

/**
 * Defines the control ID to set the encoder IDR frame interval.
 * Must be used with \c VIDIOC_S_EXT_CTRLS IOCTL.
 */
#define V4L2_CID_MPEG_VIDEO_IDR_INTERVAL        (V4L2_CID_MPEG_BASE+514)

/** @cond UNUSED */
/* >> The declarations from here to the next endcond statement are not
 * >> currently implemented. DO NOT USE. */

/* Complex controls */

#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;
    __s32 offset_for_non_ref_pic;
    __s32 offset_for_top_to_bottom_field;
    __u8 num_ref_frames_in_pic_order_cnt_cycle;
    __s32 offset_for_ref_frame[255];
    __u8 max_num_ref_frames;
    __u16 pic_width_in_mbs_minus1;
    __u16 pic_height_in_map_units_minus1;
    __u8 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;
    __u8 flags;
};

struct v4l2_ctrl_h264_scaling_matrix {
    __u8 scaling_list_4x4[6][16];
    __u8 scaling_list_8x8[6][64];
};

struct v4l2_h264_weight_factors {
    __s8 luma_weight[32];
    __s8 luma_offset[32];
    __s8 chroma_weight[32][2];
    __s8 chroma_offset[32][2];
};

struct v4l2_h264_pred_weight_table {
    __u8 luma_log2_weight_denom;
    __u8 chroma_log2_weight_denom;
    struct v4l2_h264_weight_factors weight_factors[2];
};

#define V4L2_SLICE_FLAG_FIELD_PIC       0x01
#define V4L2_SLICE_FLAG_BOTTOM_FIELD        0x02
#define V4L2_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED  0x04
#define V4L2_SLICE_FLAG_SP_FOR_SWITCH       0x08
struct v4l2_ctrl_h264_slice_param {
    /** Holds the size in bytes, including the header. */
    __u32 size;
    /** Holds the 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;
    __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;
    __u8 redundant_pic_cnt;

    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;
    __u32 slice_group_change_cycle;

    __u8 num_ref_idx_l0_active_minus1;
    __u8 num_ref_idx_l1_active_minus1;
    /*  Entries on each list are indices
     *  into v4l2_ctrl_h264_decode_param.dpb[]. */
    __u8 ref_pic_list0[32];
    __u8 ref_pic_list1[32];

    __u8 flags;
};

/** Defines whether the v4l2_h264_dpb_entry structure is used.
If not set, this entry is unused for reference. */
#define V4L2_H264_DPB_ENTRY_FLAG_ACTIVE     0x01
#define V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM  0x02
struct v4l2_h264_dpb_entry {
    __u32 buf_index; /**< v4l2_buffer index. */
    __u16 frame_num;
    __u16 pic_num;
    /** @note `v4l2_buffer.field` specifies this field. */
    __s32 top_field_order_cnt;
    __s32 bottom_field_order_cnt;
    __u8 flags; /* V4L2_H264_DPB_ENTRY_FLAG_* */
};

struct v4l2_ctrl_h264_decode_param {
    __u32 num_slices;
    __u8 idr_pic_flag;
    __u8 nal_ref_idc;
    __s32 top_field_order_cnt;
    __s32 bottom_field_order_cnt;
    __u8 ref_pic_list_p0[32];
    __u8 ref_pic_list_b0[32];
    __u8 ref_pic_list_b1[32];
    struct v4l2_h264_dpb_entry dpb[16];
};

#define V4L2_VP8_SEGMNT_HDR_FLAG_ENABLED              0x01
#define V4L2_VP8_SEGMNT_HDR_FLAG_UPDATE_MAP           0x02
#define V4L2_VP8_SEGMNT_HDR_FLAG_UPDATE_FEATURE_DATA  0x04
struct v4l2_vp8_sgmnt_hdr {
    __u8 segment_feature_mode;

    __s8 quant_update[4];
    __s8 lf_update[4];
    __u8 segment_probs[3];

    __u8 flags;
};

#define V4L2_VP8_LF_HDR_ADJ_ENABLE  0x01
#define V4L2_VP8_LF_HDR_DELTA_UPDATE    0x02
struct v4l2_vp8_loopfilter_hdr {
    __u8 type;
    __u8 level;
    __u8 sharpness_level;
    __s8 ref_frm_delta_magnitude[4];
    __s8 mb_mode_delta_magnitude[4];

    __u8 flags;
};

struct v4l2_vp8_quantization_hdr {
    __u8 y_ac_qi;
    __s8 y_dc_delta;
    __s8 y2_dc_delta;
    __s8 y2_ac_delta;
    __s8 uv_dc_delta;
    __s8 uv_ac_delta;
    __u16 dequant_factors[4][3][2];
};

struct v4l2_vp8_entropy_hdr {
    __u8 coeff_probs[4][8][3][11];
    __u8 y_mode_probs[4];
    __u8 uv_mode_probs[3];
    __u8 mv_probs[2][19];
};

#define V4L2_VP8_FRAME_HDR_FLAG_EXPERIMENTAL        0x01
#define V4L2_VP8_FRAME_HDR_FLAG_SHOW_FRAME      0x02
#define V4L2_VP8_FRAME_HDR_FLAG_MB_NO_SKIP_COEFF    0x04
struct v4l2_ctrl_vp8_frame_hdr {
    /** 0: keyframe, 1: not a keyframe. */
    __u8 key_frame;
    __u8 version;

    /** Populated also if not a key frame. */
    __u16 width;
    __u8 horizontal_scale;
    __u16 height;
    __u8 vertical_scale;

    struct v4l2_vp8_sgmnt_hdr sgmnt_hdr;
    struct v4l2_vp8_loopfilter_hdr lf_hdr;
    struct v4l2_vp8_quantization_hdr quant_hdr;
    struct v4l2_vp8_entropy_hdr entropy_hdr;

    __u8 sign_bias_golden;
    __u8 sign_bias_alternate;

    __u8 prob_skip_false;
    __u8 prob_intra;
    __u8 prob_last;
    __u8 prob_gf;

    __u32 first_part_size;
    /**
     * Holds the offset in bits of the MB data in the first partition,
     * i.e. bit offset starting from first_part_offset.
     */
    __u32 first_part_offset;
    __u32 macroblock_bit_offset;

    __u8 num_dct_parts;
    __u32 dct_part_sizes[8];

    __u8 bool_dec_range;
    __u8 bool_dec_value;
    __u8 bool_dec_count;

    /** Holds the v4l2_buffer index of the last reference frame. */
    __u32 last_frame;
     /** Holds the v4l2_buffer index of the golden reference frame. */
   __u32 golden_frame;
    /** Holds the v4l2_buffer index of the alt reference frame. */
    __u32 alt_frame;

    __u8 flags;
};

/** @endcond */

/*---------------Add below NVIDIA specific extensions ----------------------*/

/**
 * @defgroup V4L2Dec V4L2 Video Decoder
 *
 * @brief NVIDIA V4L2 Video Decoder Description and Extensions
 *
 * The video decoder device node is
 *
 *     /dev/nvhost-nvdec
 *
 * ### Supported Pixel Formats
 * OUTPUT PLANE       | CAPTURE PLANE        |        PLATFORM
 * :----------------: | :----------------:   | :--------------------:
 * V4L2_PIX_FMT_H264  | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_H265  | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_VP8   | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_VP9   | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_MPEG1 | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_MPEG2 | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_MPEG4 | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_DIVX4 | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_DIVX5 | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_JPEG  | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_MJPEG | V4L2_PIX_FMT_NV12M   | T210, T186, T194, T234
 * V4L2_PIX_FMT_AV1   | V4L2_PIX_FMT_NV12M   | T234
 *
 * ### Supported Memory Types
 * MEMORY               | OUTPUT PLANE | CAPTURE PLANE
 * :------------------: | :----------: | :-----------:
 * V4L2_MEMORY_MMAP     | Y            | Y
 * V4L2_MEMORY_DMABUF   | N            | Y
 * V4L2_MEMORY_USERPTR  | Y            | N
 *
 * ### Supported Controls
 * - #V4L2_CID_MPEG_VIDEO_DISABLE_COMPLETE_FRAME_INPUT
 * - #V4L2_CID_MPEG_VIDEO_DISABLE_DPB
 * - #V4L2_CID_MPEG_VIDEO_ERROR_REPORTING
 * - #V4L2_CID_MPEG_VIDEO_SKIP_FRAMES
 * - V4L2_CID_MIN_BUFFERS_FOR_CAPTURE (Get the minimum buffers to be allocated on capture plane.
 * Read only. Valid after #V4L2_EVENT_RESOLUTION_CHANGE)
 * - #V4L2_CID_MPEG_VIDEODEC_INPUT_METADATA
 * - #V4L2_CID_MPEG_VIDEODEC_METADATA
 * - #V4L2_CID_MPEG_VIDEO_CUDA_MEM_TYPE
 * - #V4L2_CID_MPEG_VIDEO_CUDA_GPU_ID
 * - #V4L2_CID_MPEG_VIDEODEC_DROP_FRAME_INTERVAL
 *
 * ### Supported Events
 * Event                         | Purpose
 * ----------------------------- | :----------------------------:
 * #V4L2_EVENT_RESOLUTION_CHANGE | Resolution of the stream has changed.
 *
 * ### Handling Resolution Change Events
 * When the decoder generates a \c V4L2_EVENT_RESOLUTION_CHANGE event, the
 * application calls \c STREAMOFF on the capture plane to tell the decoder to
 * deallocate the current buffers by calling REQBUF with count zero, get
 * the new capture plane format, and then proceed with setting up the buffers
 * for the capture plane.
 *
 * In case of decoder, the buffer format might differ from the display resolution.
 * The application must use \c VIDIOC_G_CROP to get the display resolution.
 *
 * ### EOS Handling
 * The following sequence must be followed for sending EOS and recieving EOS
 * from the decoder.
 * -# Send EOS to decoder by queueing on the output plane a buffer with
 * bytesused = 0 for the 0th plane (`v4l2_buffer.m.planes[0].bytesused = 0`).
 * -# Dequeues buffers on the output plane until it gets a buffer with bytesused = 0
 * for the 0th plane (`v4l2_buffer.m.planes[0].bytesused == 0`)
 * -# Dequeues buffers on the capture plane until it gets a buffer with bytesused = 0
 * for the 0th plane.
 *
 * ### Decoder Input Frame Metadata
 * Decoder supports reporting stream header parsing error info as input frame metadata.
 * See \c V4L2_CID_MPEG_VIDEO_ERROR_REPORTING, \c V4L2_CID_MPEG_VIDEODEC_INPUT_METADATA
 * and \c v4l2_ctrl_video_metadata for more information.
 *
 * ### Decoder Output Frame Metadata
 * Decoder supports reporting frame related metadata, including error reports and
 * DPB info. See \c V4L2_CID_MPEG_VIDEO_ERROR_REPORTING, \c V4L2_CID_MPEG_VIDEODEC_METADATA
 * and \c v4l2_ctrl_video_metadata for more information.
 *
 * @note Currently, V4L2 plugins do not support odd resolution.
 * @{
 * @ingroup ee_extensions_group
 */

/**
 * Defines the Control ID to indicate to the decoder that the input
 * buffers do not contain complete buffers.
 *
 * @note This control must be set in case of frames containing multiple slices
 * when the input buffers do not contain all the slices of the frame.
 *
 * A boolean value must be supplied with this control.
 *
 */
#define V4L2_CID_MPEG_VIDEO_DISABLE_COMPLETE_FRAME_INPUT (V4L2_CID_MPEG_BASE+515)

/**
 * Defines the Control ID to disable decoder DPB management.
 *
 * @note This only works for streams having a single reference frame.
 *
 * A boolean value must be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEO_DISABLE_DPB (V4L2_CID_MPEG_BASE+516)

/**
 * Defines the Control ID to enable decoder error and metadata reporting.
 *
 * A boolean value must be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEO_ERROR_REPORTING (V4L2_CID_MPEG_BASE+517)

/**
 * Defines the Control ID to set the skip frames property of the decoder.
 *
 * Decoder must be configured to skip certain types of frames. One
 * \c v4l2_skip_frames_type must be passed.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 * This control ID is supported only for H264.
 */
#define V4L2_CID_MPEG_VIDEO_SKIP_FRAMES (V4L2_CID_MPEG_BASE+518)

/**
 * Defines the Control ID to get the decoder output metadata.
 *
 * @note Metadata reporting must be enabled using
 * #V4L2_CID_MPEG_VIDEO_ERROR_REPORTING IOCTL for this.
 *
 * A pointer to a valid \c v4l2_ctrl_video_metadata structure must be supplied
 * with this control.
 *
 * @attention This control must be read after dequeueing a buffer successfully from
 * the capture plane. The values in the structure are valid until the buffer is queued
 * again.
 */
#define V4L2_CID_MPEG_VIDEODEC_METADATA (V4L2_CID_MPEG_BASE+519)

/**
 * Defines the Control ID to get the decoder input header error metadata.
 *
 * @note Metadata reporting must be enabled using
 * #V4L2_CID_MPEG_VIDEO_ERROR_REPORTING IOCTL for this.
 *
 * A pointer to a valid \c v4l2_ctrl_video_metadata structure must be supplied
 * with this control.
 *
 * @attention This control must be read after dequeueing a buffer successfully from
 * the output plane. The values in the structure are valid until the buffer is queued
 * again.
 */
#define V4L2_CID_MPEG_VIDEODEC_INPUT_METADATA (V4L2_CID_MPEG_BASE+520)

/**
 * Defines the Control ID to check if display data is present.
 *
 * This control returns true if HDR metadata is present in the stream.
 *
 */
#define V4L2_CID_VIDEODEC_DISPLAYDATA_PRESENT (V4L2_CID_MPEG_BASE+521)

/**
 * Defines the Control ID to get display data if V4L2_CID_VIDEODEC_DISPLAYDATA_PRESENT returns true.
 *
 * This control returns display data such as display_primaries, white_point and
 * display_parameter_luminance required for display module.
 *
 */
#define V4L2_CID_VIDEODEC_HDR_MASTERING_DISPLAY_DATA (V4L2_CID_MPEG_BASE+522)

/**
 * Defines the Control ID to get Sample Aspect Ratio width for decoding.
 *
 * This control returns unsigned integer of Sample Aspect Ratio width.
 *
 * @attention This control must be set after receiving V4L2_EVENT_RESOLUTION_CHANGE.
 *
 */
#define V4L2_CID_MPEG_VIDEODEC_SAR_WIDTH (V4L2_CID_MPEG_BASE+569)

/**
 * Defines the Control ID to get Sample Aspect Ratio height for decoding.
 *
 * This control returns unsigned integer of Sample Aspect Ratio height.
 *
 * @attention This control must be set after receiving V4L2_EVENT_RESOLUTION_CHANGE.
 *
 */
#define V4L2_CID_MPEG_VIDEODEC_SAR_HEIGHT (V4L2_CID_MPEG_BASE+570)

 /**
 * Defines the Control ID to embed the SEI data coming from upstream plugins.
 *
 * This control sets the SEI payload size and SEI data pointer for encoder.
 *
 * @attention This control must be set after receiving V4L2_EVENT_RESOLUTION_CHANGE.
 *
 */
 #define V4L2_CID_MPEG_VIDEOENC_DS_SEI_DATA (V4L2_CID_MPEG_BASE+571)

/** @} */

/**
 * @defgroup V4L2Conv V4L2 Video Converter
 *
 * @brief NVIDIA V4L2 Video Converter Description and Extensions
 *
 * Use the video converter for color space conversion, scaling, and
 * conversion between hardware buffer memory (\c V4L2_MEMORY_MMAP/\c
 * V4L2_MEMORY_DMABUF), software buffer memory (\c V4L2_MEMORY_USERPTR), and
 * other operations such as cropping, flipping/rotating, and
 * temporal noise reduction (TNR).
 * The video converter device node is \c "/dev/nvhost-vic".
 *
 * ### Supported Pixelformats
 *  PIXEL FORMAT           | PIXEL FORMAT
 * :---------------------: | :--------------:
 * V4L2_PIX_FMT_YUV444M    | V4L2_PIX_FMT_YVU422M
 * V4L2_PIX_FMT_YUV420M    | V4L2_PIX_FMT_YVU420M
 * V4L2_PIX_FMT_NV12M      | V4L2_PIX_FMT_GREY
 * V4L2_PIX_FMT_YUYV       | V4L2_PIX_FMT_YVYU
 * V4L2_PIX_FMT_UYVY       | V4L2_PIX_FMT_VYUY
 * V4L2_PIX_FMT_ABGR32     | V4L2_PIX_FMT_XBGR32
 *
 * ### Supported Pixel Formats for TNR
 *  PIXEL FORMAT           | PIXEL FORMAT
 * :---------------------: | :--------------:
 * V4L2_PIX_FMT_YUV420M    | V4L2_PIX_FMT_NV12M
 * V4L2_PIX_FMT_UYVY       | V4L2_PIX_FMT_YUYV
 *
 * ### Supported Memory Types
 * MEMORY               | OUTPUT PLANE | CAPTURE PLANE
 * :------------------: | :----------: | :-----------:
 * V4L2_MEMORY_MMAP     | Y            | Y
 * V4L2_MEMORY_DMABUF   | Y            | Y
 * V4L2_MEMORY_USERPTR  | Y            | Y
 *
 * ### Supported Controls
 * - #V4L2_CID_VIDEO_CONVERT_OUTPUT_PLANE_LAYOUT
 * - #V4L2_CID_VIDEO_CONVERT_CAPTURE_PLANE_LAYOUT
 * - #V4L2_CID_VIDEO_CONVERT_FLIP_METHOD
 * - #V4L2_CID_VIDEO_CONVERT_INTERPOLATION_METHOD
 * - #V4L2_CID_VIDEO_CONVERT_TNR_ALGORITHM
 * - #V4L2_CID_VIDEO_CONVERT_YUV_RESCALE_METHOD
 *
 * ### Cropping
 * Video converter supports cropping using \c VIDIOC_S_SELECTION IOCTL with type
 * \c V4L2_BUF_TYPE_VIDEO_CAPTURE and target \c V4L2_SEL_TGT_CROP. This must
 * be set before requesting buffers on either plane.
 *
 * ### EOS Handling
 * The following sequence must be followed for sending EOS and recieving EOS
 * from the converter.
 * -# Send EOS to converter by queueing on the output plane a buffer with
 * bytesused = 0 for the 0th plane (`v4l2_buffer.m.planes[0].bytesused = 0`).
 * -# Dequeues buffers on the capture plane until it gets a buffer with bytesused = 0
 * for the 0th plane.
 *
 * @note Currently, V4L2 plugins do not support odd resolution.
 * @{
 * @ingroup ee_extensions_group
 */

/**
 * Defines the Control ID to set converter output plane buffer layout.
 *
 * A value of type \c v4l2_nv_buffer_layout must be supplied with this control.
 *
 * @attention This control must be set before requesting buffers on the output plane.
 */
#define V4L2_CID_VIDEO_CONVERT_OUTPUT_PLANE_LAYOUT   (V4L2_CID_MPEG_BASE+523)

/**
 * Defines the Control ID to set converter capture plane buffer layout.
 *
 * A value of type \c v4l2_nv_buffer_layout must be supplied with this control.
 *
 * @attention This control must be set before requesting buffers on the capture plane.
 */
#define V4L2_CID_VIDEO_CONVERT_CAPTURE_PLANE_LAYOUT  (V4L2_CID_MPEG_BASE+524)

/**
 * Defines the Control ID to set the converter flip/rotation method.
 *
 * A value of type \c v4l2_flip_method must be supplied with this control.
 *
 * @attention This control must be set before requesting buffers on either plane.
 */
#define V4L2_CID_VIDEO_CONVERT_FLIP_METHOD           (V4L2_CID_MPEG_BASE+525)

/**
 * Defines the Control ID to set the converter interpolation method.
 *
 * A value of type \c v4l2_interpolation_method must be supplied with this control.
 *
 * @attention This control must be set before requesting buffers on either plane.
 */
#define V4L2_CID_VIDEO_CONVERT_INTERPOLATION_METHOD  (V4L2_CID_MPEG_BASE+526)

/**
 * Defines the Control ID to set the converter Temporal Noise Reduction (TNR) algorithm.
 *
 * A value of type \c v4l2_tnr_algorithm must be supplied with this control.
 *
 * @attention This control must be set before requesting buffers on either plane.
 * @attention TNR algorithms are not supported with YUV422 and YUV444 capture
 *            plane formats.
 */
#define V4L2_CID_VIDEO_CONVERT_TNR_ALGORITHM         (V4L2_CID_MPEG_BASE+527)
/** @} */

/**
 * @defgroup V4L2Enc V4L2 Video Encoder
 *
 * @brief NVIDIA V4L2 Video Encoder Description and Extensions
 *
 * The video encoder device node is \c "/dev/nvhost-msenc".
 *
 * ### Supported Pixelformats
 * OUTPUT PLANE            | CAPTURE PLANE       |       PLATFORM
 * :---------------------: | :-----------------: | :--------------------:
 * V4L2_PIX_FMT_YUV420M    | V4L2_PIX_FMT_H264   | T210, T186, T194, T234
 * V4L2_PIX_FMT_NV12M      |                     |
 * V4L2_PIX_FMT_YUV444M    |                     |
 * V4L2_PIX_FMT_NV24M      |                     |
 *                         |                     |
 * V4L2_PIX_FMT_YUV420M    | V4L2_PIX_FMT_H265   | T210, T186, T194, T234
 * V4L2_PIX_FMT_NV12M      |                     |
 * V4L2_PIX_FMT_YUV444M    |                     |
 * V4L2_PIX_FMT_NV24M      |                     |
 * V4L2_PIX_FMT_P010M      |                     |
 * V4L2_PIX_FMT_NV24_10LE  |                     |
 *                         |                     |
 * V4L2_PIX_FMT_YUV420M    | V4L2_PIX_FMT_VP8    | T210, T186
 * V4L2_PIX_FMT_NV12M      |                     |
 *                         |                     |
 * V4L2_PIX_FMT_YUV420M    | V4L2_PIX_FMT_VP9    | T186, T194
 * V4L2_PIX_FMT_NV12M      |                     |
 *                         |                     |
 * V4L2_PIX_FMT_YUV420M    | V4L2_PIX_FMT_AV1    | T234
 * V4L2_PIX_FMT_NV12M      |                     |
 *
 * ### Supported Memory Types
 * MEMORY               | OUTPUT PLANE | CAPTURE PLANE
 * :------------------: | :----------: | :-----------:
 * V4L2_MEMORY_MMAP     | Y            | Y
 * V4L2_MEMORY_DMABUF   | Y            | N
 * V4L2_MEMORY_USERPTR  | N            | N
 * \attention For the video encoder, it is necessary that the capture plane
 *  format be set before the output plane format and only then request buffers on
 *  any of the planes.
 *
 * ### Supported Controls
 * The following sections describe the supported controls.
 *
 * #### Controls From the Open Source V4L2-Controls Header
 * Control ID                       | Purpose              | Runtime Configurable
 * -------------------------------- | -------------------- | :------------------:
 * V4L2_CID_MPEG_VIDEO_BITRATE      | Bitrate              | Y
 * V4L2_CID_MPEG_VIDEO_H264_PROFILE | H.264 Encode Profile | N
 * V4L2_CID_MPEG_VIDEO_BITRATE_MODE | Rate Control Mode    | N
 * V4L2_CID_MPEG_VIDEO_GOP_SIZE     | I-frame Interval     | N
 * V4L2_CID_MPEG_VIDEO_H264_LEVEL   | Encode Level         | N
 * V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE | Force I-frame on one of queued output plane buffer | Y
 *
 * All non-runtime configurable options must be set after setting formats on
 * both the planes and before requesting buffers on either plane.
 *
 * The runtime configurable parameters can be called anytime after setting
 * formats on both the planes.
 *
 * #### NVIDIA-Specific Controls
 * - #V4L2_CID_MPEG_VIDEO_H265_PROFILE
 * - #V4L2_CID_MPEG_VIDEO_IDR_INTERVAL
 * - #V4L2_CID_MPEG_VIDEOENC_TEMPORAL_TRADEOFF_LEVEL
 * - #V4L2_CID_MPEG_VIDEOENC_SLICE_LENGTH_PARAM
 * - #V4L2_CID_MPEG_VIDEOENC_ROI_PARAMS
 * - #V4L2_CID_MPEG_VIDEOENC_VIRTUALBUFFER_SIZE
 * - #V4L2_CID_MPEG_VIDEOENC_NUM_REFERENCE_FRAMES
 * - #V4L2_CID_MPEG_VIDEOENC_SLICE_INTRAREFRESH_PARAM
 * - #V4L2_CID_MPEG_VIDEOENC_NUM_BFRAMES
 * - #V4L2_CID_MPEG_VIDEOENC_INSERT_SPS_PPS_AT_IDR
 * - #V4L2_CID_MPEG_VIDEOENC_METADATA
 * - #V4L2_CID_MPEG_VIDEOENC_METADATA_MV
 * - #V4L2_CID_MPEG_VIDEOENC_ENABLE_METADATA_MV
 * - #V4L2_CID_MPEG_VIDEOENC_QP_RANGE
 * - #V4L2_CID_MPEG_VIDEOENC_HW_PRESET_TYPE_PARAM
 * - #V4L2_CID_MPEG_VIDEOENC_INPUT_METADATA
 * - #V4L2_CID_MPEG_VIDEOENC_ENABLE_EXTERNAL_RPS_CONTROL
 * - #V4L2_CID_MPEG_VIDEOENC_ENABLE_EXTERNAL_RATE_CONTROL
 * - #V4L2_CID_MPEG_VIDEOENC_ENABLE_ROI_PARAM
 * - #V4L2_CID_MPEG_VIDEOENC_ENABLE_RECONCRC_PARAM
 * - #V4L2_CID_MPEG_VIDEOENC_INSERT_VUI
 * - #V4L2_CID_MPEG_VIDEOENC_INSERT_AUD
 * - #V4L2_CID_MPEG_VIDEOENC_EXTEDED_COLORFORMAT
 * - #V4L2_CID_MPEG_VIDEOENC_ENABLE_ALLIFRAME_ENCODE
 * - #V4L2_CID_MPEG_VIDEOENC_H265_LEVEL
 * - #V4L2_CID_MPEG_VIDEOENC_ENABLE_SLICE_LEVEL_ENCODE
 * - #V4L2_CID_MPEG_VIDEOENC_POC_TYPE
 * - #V4L2_CID_MPEG_VIDEOENC_H265_VUI_EXT_SAR_WIDTH
 * - #V4L2_CID_MPEG_VIDEOENC_H265_VUI_EXT_SAR_HEIGHT
 * - #V4L2_CID_MPEG_VIDEOENC_FORCE_INTRA_FRAME
 * - #V4L2_CID_MPEG_VIDEOENC_FORCE_IDR_FRAME
 * - #V4L2_CID_MPEG_VIDEOENC_AV1_HEADERS_WITH_FRAME
 * - #V4L2_CID_MPEG_VIDEOENC_AV1_TILE_CONFIGURATION
 * - #V4L2_CID_MPEG_VIDEOENC_AV1_ENABLE_SSIMRDO
 * - #V4L2_CID_MPEG_VIDEOENC_AV1_DISABLE_CDF_UPDATE
 * - #V4L2_CID_MPEG_VIDEOENC_PPE_INIT_PARAMS
 *
 * #### Setting Framerate
 * The encoder framerate can be set with \c VIDIOC_S_PARM IOCTL by setting the numerator
 * and denominator in `v4l2_streamparm.parm.output.timeperframe`.
 *
 * ### Supported Encoder Profiles
 * #### H.264
 * - V4L2_MPEG_VIDEO_H264_PROFILE_MAIN
 * - V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE
 * - V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
 *
 * #### H.265
 * - V4L2_MPEG_VIDEO_H265_PROFILE_MAIN
 * - V4L2_MPEG_VIDEO_H265_PROFILE_MAIN10
 *
 * ### Encoder Output Metadata
 * The encoder supports reporting frame related metadata, including motion vectors
 * for that frame. See \c V4L2_CID_MPEG_VIDEOENC_METADATA,
 * \c V4L2_CID_MPEG_VIDEOENC_METADATA_MV and \c V4L2_CID_MPEG_VIDEOENC_ENABLE_METADATA_MV
 * for more information.
 *
 * ### EOS Handling
 * The following sequence must be followed for sending EOS and recieving EOS
 * from the encoder.
 * -# Send EOS to encoder by queueing on the output plane a buffer with
 * bytesused = 0 for the 0th plane (`v4l2_buffer.m.planes[0].bytesused = 0`).
 * -# Dequeues buffers on the capture plane until it gets a buffer with bytesused = 0
 * for the 0th plane.
 *
 * @note Currently, V4L2 plugins do not support odd resolution.
 * @{
 * @ingroup ee_extensions_group
 */


/**
 * Defines the Control ID to configure encoder to drop frames while encoding.
 *
 * A value of type \c v4l2_enc_temporal_tradeoff_level_type must be supplied
 * with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_TEMPORAL_TRADEOFF_LEVEL (V4L2_CID_MPEG_BASE+528)

/**
 * Defines the Control ID to configure encoder slice length either in terms of MBs or bits.
 *
 * A pointer to a valid \c v4l2_enc_slice_length_param structure must be supplied
 * with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_SLICE_LENGTH_PARAM (V4L2_CID_MPEG_BASE+529)

/**
 * Defines the Control ID to configure encoder to encode particular region of frame in high
 * quality.
 *
 * A pointer to a valid \c v4l2_enc_frame_ROI_params structure must be supplied
 * with this control.
 *
 * @attention This control must be set after requesting buffers on both the
 * planes.
 */
#define V4L2_CID_MPEG_VIDEOENC_ROI_PARAMS (V4L2_CID_MPEG_BASE+530)

/**
 * Defines the Control ID to specify virtual buffer size in bits for encoder.
 *
 * A pointer to a valid \c v4l2_enc_virtual_buffer_size structure must be
 * supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_VIRTUALBUFFER_SIZE (V4L2_CID_MPEG_BASE+531)

/**
 * Defines the Control ID to specify maximum number of reference frames that can be used.
 *
 * An integer value must be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_NUM_REFERENCE_FRAMES (V4L2_CID_MPEG_BASE+532)

/**
 * Defines the Control ID to specify the encoder slice intra refresh interval.
 *
 * A pointer to a valid \c v4l2_enc_slice_intrarefresh_param structure must be
 * supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_SLICE_INTRAREFRESH_PARAM (V4L2_CID_MPEG_BASE+533)

/**
 * Defines the Control ID to set number of B frames to be encoded between two P frames.
 *
 * This works with H.264 encoder. This also works with H.265 encoder for Jetson Xavier and
 * Jetson Xavier NX platforms. An integer value must be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_NUM_BFRAMES (V4L2_CID_MPEG_BASE+534)

/**
 * Defines the Control ID to enable/disable inserting SPS and PPS explicitly at IDR interval.
 *
 * A boolean value must be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_INSERT_SPS_PPS_AT_IDR (V4L2_CID_MPEG_BASE+535)

/**
 * Defines the Control ID to get encoder output metadata.
 *
 * A pointer to valid #v4l2_ctrl_video_metadata structure must be supplied with
 * this control.
 *
 * @attention This control must be read after dequeueing a buffer successfully from
 * the capture plane. The values in the structure are valid until the buffer is queued
 * again.
 */
#define V4L2_CID_MPEG_VIDEOENC_METADATA               (V4L2_CID_MPEG_BASE+536)

/**
 * Defines the Control ID to enable/disable encoder motion vector reporting.
 *
 * A boolean value must be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_ENABLE_METADATA_MV     (V4L2_CID_MPEG_BASE+537)

/**
 * Defines the Control ID to get encoder output motion vector metadata.
 *
 * A pointer to valid \c v4l2_ctrl_videoenc_outputbuf_metadata_MV structure must
 * be supplied with this control.
 *
 * @attention This control must be read after dequeueing a buffer successfully from
 * the capture plane. The values in the structure are valid until the buffer is queued
 * again.
 */
#define V4L2_CID_MPEG_VIDEOENC_METADATA_MV            (V4L2_CID_MPEG_BASE+538)

/**
 * Defines the Control ID to set QP range for I/P/B frames.
 *
 * A pointer to a valid \c v4l2_ctrl_video_qp_range structure must
 * be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_QP_RANGE               (V4L2_CID_MPEG_BASE+539)

/**
 * Defines the Control ID to set encoder HW Preset type.
 *
 * A pointer to valid #v4l2_enc_hw_preset_type_param structure must
 * be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_HW_PRESET_TYPE_PARAM   (V4L2_CID_MPEG_BASE+540)

/**
 * Defines the Control ID to provide input metadata for encoder buffer.
 *
 * A pointer to valid #v4l2_ctrl_videoenc_input_metadata structure must be
 * supplied with this control.
 *
 * @attention This control must be called before queueing a buffer on the output
 * plane. Use the bitwise OR of v4l2_enc_input_metadata_param in the
 * v4l2_ctrl_videoenc_input_metadata.metadata_flag to provide different input
 * metadata parameters in one s_ctrl call.
 */
#define V4L2_CID_MPEG_VIDEOENC_INPUT_METADATA         (V4L2_CID_MPEG_BASE+541)

/**
 * Defines the Control ID to configure encoder for external RPS control.
 *
 * A pointer to a valid #v4l2_enc_enable_ext_rps_ctr structure must be supplied
 * with this control.
 *
 * @attention This control must be set after requesting buffers on both the
 * planes. The value for V4L2_CID_MPEG_VIDEOENC_NUM_REFERENCE_FRAMES, if being entered,
 * must be set after this control.
 */
#define V4L2_CID_MPEG_VIDEOENC_ENABLE_EXTERNAL_RPS_CONTROL (V4L2_CID_MPEG_BASE+542)

/**
 * Defines the Control ID to configure encoder for external rate control.
 *
 * A pointer to a valid #v4l2_enc_enable_ext_rate_ctr structure must be supplied
 * with this control.
 *
 * @attention This control must be set after requesting buffers on both the
 * planes.
 */
#define V4L2_CID_MPEG_VIDEOENC_ENABLE_EXTERNAL_RATE_CONTROL (V4L2_CID_MPEG_BASE+543)

/**
 * Defines the Control ID to configure ROI encoding for a session.
 *
 * A pointer to a valid #v4l2_enc_enable_roi_param structure must be supplied
 * with this control.
 *
 * @attention This control must be set after requesting buffers on both the
 * planes.
 */
#define V4L2_CID_MPEG_VIDEOENC_ENABLE_ROI_PARAM (V4L2_CID_MPEG_BASE+544)

/**
 * Defines the Control ID to configure Reconstructed CRC for a session.
 *
 * A pointer to a valid #v4l2_enc_enable_reconcrc_param structure must be supplied
 * with this control.
 *
 * @attention This control must be set after requesting buffers on both the
 * planes.
 */
#define V4L2_CID_MPEG_VIDEOENC_ENABLE_RECONCRC_PARAM  (V4L2_CID_MPEG_BASE+545)

/**
 * Control ID to enable/disable inserting VUI in SPS.
 *
 * A boolean value should be supplied with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_INSERT_VUI (V4L2_CID_MPEG_BASE+546)

/**
 * Control ID to enable/disable inserting AUD(Access Unit Delimiter).
 *
 * A boolean value should be supplied with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_INSERT_AUD (V4L2_CID_MPEG_BASE+547)

/**
 * Control ID to enable/disable setting extended color format.
 *
 * A boolean value should be supplied with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane. Also this control should be
 * enabled/disabled only after V4L2_CID_MPEG_VIDEOENC_INSERT_VUI is set
 */
#define V4L2_CID_MPEG_VIDEOENC_EXTEDED_COLORFORMAT (V4L2_CID_MPEG_BASE+548)

/**
 * Control ID to select which NVDEC IP to decode.
 *
 * @note This functionality is currently being deprecated and no longer
 * functional.
 *
 * A v4l2_decode_instance_type should be supplied with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEO_DECODE_INSTANCE (V4L2_CID_MPEG_BASE+549)
/**
 * Control ID to issue a pseudo POLL call on the fd opened in non blocking mode.
 *
 * A pointer to a valid #v4l2_ctrl_video_device_poll must be supplied with this control.
 *
 * @attention This should only be called when the Decoder or Encoder is opened with
 * O_NONBLOCK flag.
 */
#define V4L2_CID_MPEG_VIDEO_DEVICE_POLL (V4L2_CID_MPEG_BASE+550)

/**
 * Control ID to set/clear the polling interrupt mode. Useful when a POLL issued from the
 * application but wants the wait to be interrupted.
 *
 * A boolean value must be supplied with this control, True indicates polling interrupt shall be
 * enabled and it shall stay enabled (i.e calls to POLL will return immediately) until a call to
 * same control ID is made by passing a boolean 0 value.
 *
 * @attention This should only be called when the Decoder or Encoder is opened with
 * O_NONBLOCK flag.
 */
#define V4L2_CID_MPEG_SET_POLL_INTERRUPT (V4L2_CID_MPEG_BASE+551)

/**
 * Control ID to enable/disable setting rate control two pass CBR.
 *
 * A boolean value should be supplied with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_TWO_PASS_CBR (V4L2_CID_MPEG_BASE+552)

/**
 * Defines the Control ID to set the converter YUV Rescale method.
 *
 * A value of type \c v4l2_yuv_rescale_method must be supplied with this control.
 *
 * @attention This control must be set before requesting buffers on either plane.
 */
#define V4L2_CID_VIDEO_CONVERT_YUV_RESCALE_METHOD (V4L2_CID_MPEG_BASE+553)

/**
 * Control ID to enable maximum Performance.
 *
 * An integer value must be supplied with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEO_MAX_PERFORMANCE (V4L2_CID_MPEG_BASE+554)

/**
 * Control ID to enable/disable setting for all i-Frame encoding.
 *
 * A boolean value should be supplied with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_ENABLE_ALLIFRAME_ENCODE (V4L2_CID_MPEG_BASE+555)

/**
 * Defines the Control ID to set buf api to be used by decoder/encoder.
 *
 * Note: This Control ID is no longer supported.
 */
#define V4L2_CID_MPEG_VIDEO_BUF_API_TYPE (V4L2_CID_MPEG_BASE+556)

/**
 * Defines the Control ID to set cuda memory type to be used by decoder/encoder.
 *
 * This control can be used by the decoder to set the memory type for surfaces.
 * A value of \c v4l2_cuda_mem_type needs to be set with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEO_CUDA_MEM_TYPE (V4L2_CID_MPEG_BASE+557)

/**
 * Defines the Control ID to set GPU ID to be used by decoder/encoder.
 *
 * An integer value should be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEO_CUDA_GPU_ID (V4L2_CID_MPEG_BASE+558)

/**
 * Defines the Control ID to set drop frames interval for decoder.
 *
 * An integer value should be supplied with this control. A value of "x"
 * indicates every "x"th frame should be given out from the decoder, rest shall
 * dropped after decoding.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEODEC_DROP_FRAME_INTERVAL (V4L2_CID_MPEG_BASE+559)

/**
 * Control ID to enable/disable setting for attaching VP8/9 headers.
 * Only to be used for VP8/9 pixel format not for H264/5.
 *
 * A boolean value should be supplied with this control.
 * If value is false headers will be disabled and true will enable the headers.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
 #define V4L2_CID_MPEG_VIDEOENC_VPX_HEADERS_WITH_FRAME (V4L2_CID_MPEG_BASE+560)

/**
 * Defines the control ID to set the H.265 encoder level.
 *
 * A v4l2_mpeg_video_h265_level must be passed.
 */
#define V4L2_CID_MPEG_VIDEOENC_H265_LEVEL (V4L2_CID_MPEG_BASE+561)

/**
 * Control ID to enable/disable slice level encode output.
 *
 * A boolean value should be supplied with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_ENABLE_SLICE_LEVEL_ENCODE (V4L2_CID_MPEG_BASE+562)

/**
 * Defines the Control ID to set Picture Order Count property in frames.
 *
 * This works only with H.264 encoder. An integer value must be supplied with this
 * control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_POC_TYPE (V4L2_CID_MPEG_BASE+563)

/**
 * Defines the Control ID to set Sample Aspect Ratio width for H265 VUI encoding.
 *
 * An integer value must be supplied with this control.
 * The VUI Sample Aspect Ratio indicator for H265 follows the standard enum defined for
 * v4l2_mpeg_video_h264_vui_sar_idc.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_H265_VUI_EXT_SAR_WIDTH (V4L2_CID_MPEG_BASE+564)

/**
 * Defines the Control ID to set Sample Aspect Ratio height for H265 VUI encoding.
 *
 * An integer value must be supplied with this control.
 * The VUI Sample Aspect Ratio indicator for H265 follows the standard enum defined
 * for v4l2_mpeg_video_h264_vui_sar_idc.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_H265_VUI_EXT_SAR_HEIGHT (V4L2_CID_MPEG_BASE+565)

/**
 * Defines the Control ID to force INTRA frame.
 *
 * This control can be used by encoder to force encoding an intra frame.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_FORCE_INTRA_FRAME (V4L2_CID_MPEG_BASE+566)

/**
 * Defines the Control ID to force IDR frame.
 *
 * This control can be used by encoder to force encoding an idr frame.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_FORCE_IDR_FRAME (V4L2_CID_MPEG_BASE+567)

 /**
 * Defines the Control ID to set low latency to be used by decoder.
 *
 * This control can be used by decoder to set low latency for streams having
 * I and IPPP frames.
 *
 * @attention This control must be set before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEO_CUDA_LOW_LATENCY (V4L2_CID_MPEG_BASE+568)

/**
 * Control ID to enable/disable setting for attaching IVF headers.
 * Only to be used for AV1 codec.
 *
 * A boolean value should be supplied with this control.
 * If value is false headers will be disabled and true will enable the headers.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_AV1_HEADERS_WITH_FRAME (V4L2_CID_MPEG_BASE+569)

/**
 * Defines the Control ID to configure AV1 tile for a session.
 *
 * A pointer to a valid #v4l2_enc_av1_tile_config structure must be supplied
 * with this control.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 **/
#define V4L2_CID_MPEG_VIDEOENC_AV1_TILE_CONFIGURATION (V4L2_CID_MPEG_BASE+570)

/**
 * Defines the Control ID to enable variance based SSIM RDO for AV1.
 *
 * A boolean value should be supplied with this control.
 * If value is false SSIM RDO is disabled else true when enabled.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 **/
#define V4L2_CID_MPEG_VIDEOENC_AV1_ENABLE_SSIMRDO (V4L2_CID_MPEG_BASE+571)

/**
 * Defines the Control ID to enable CDF update for AV1.
 *
 * A boolean value should be supplied with this control.
 * If value is true the CDF update in the symbol decoding process is disabled.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 **/
#define V4L2_CID_MPEG_VIDEOENC_AV1_DISABLE_CDF_UPDATE (V4L2_CID_MPEG_BASE+572)

/**
 * Defines the Control ID to set  total frames to encode.
 *
 * An integer value should be supplied with this control. A value of "x"
 * indicates the number of frames that are given to encoder for encoding.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 **/
#define V4L2_CID_MPEG_VIDEOENC_FRAMES_TO_ENCODE (V4L2_CID_MPEG_BASE+573)

/**
 * Defines the Control ID to configure initial QP parameters for a encoder session.
 *
 * A pointer to a valid #v4l2_ctrl_video_init_qp structure must be supplied
 * with this control.
 *
 **/
#define V4L2_CID_MPEG_VIDEOENC_INIT_FRAME_QP (V4L2_CID_MPEG_BASE+574)

/**
 * Defines the Control ID to enable lossless H.264/H.265 encoding.
 *
 * An boolean value must be supplied with this control. Default is 0.
 * Lossless encoding is supported only for YUV444 8/10-bit format.
 * @note This control must be set in case of H.264 YUV444 encoding as
 * it does not support lossy encoding.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_ENABLE_LOSSLESS (V4L2_CID_MPEG_BASE+575)

/**
 * Defines the Control ID to set chroma_factor_idc for H.265 encoding.
 *
 * An integer value must be supplied with this control. Default is 1, and
 * 3 for YUV444 8/10-bit format.
 *
 * @attention This control should be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_H265_CHROMA_FACTOR_IDC (V4L2_CID_MPEG_BASE+576)

/**
 * Defines the Control ID to configure preprocessing enhancement for a session.
 *
 * A pointer to a valid #v4l2_enc_ppe_init_params structure must be supplied
 * with this control.
 *
 * @attention This control must be set after requesting buffers on both the
 * planes.
 */
#define V4L2_CID_MPEG_VIDEOENC_PPE_INIT_PARAMS (V4L2_CID_MPEG_BASE+577)

 /**
 * Defines Control ID to configure PRESET id for CUVID Encoder
 *
 * An integer value between 1 to 7 should be supplied with this control.
 *
 * Check PRESET Guide for more details at
 * https://docs.nvidia.com/video-technologies/video-codec-sdk/nvenc-preset-migration-guide/index.html
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_CUDA_PRESET_ID (V4L2_CID_MPEG_BASE+578)

 /**
 * Defines Control ID to configure TUNING INFO id for CUVID Encoder
 *
 * An integer value between 1 to 4 should be supplied with this control.
 * 
 * Check PRESET Guide for more details at
 * https://docs.nvidia.com/video-technologies/video-codec-sdk/nvenc-preset-migration-guide/index.html
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_CUDA_TUNING_INFO (V4L2_CID_MPEG_BASE+579)

/** Defines Control ID to configure CONSTQP VALUE for CUVID Encoder
 *
 * An integer value between 0 to 51 should be supplied with this control.
 *
 * @attention This control must be set after setting formats on both the planes
 * and before requesting buffers on either plane.
 */
#define V4L2_CID_MPEG_VIDEOENC_CUDA_CONSTQP (V4L2_CID_MPEG_BASE+580)

/** Defines Control ID to configure FPS VALUE for CUVID Encoder
 *
 * A positive integer value should be supplied with this control.
 *
 * @attention This control is runtime configurable and can be called anytime after setting
 * formats on both the planes.
 */
#define V4L2_CID_MPEG_VIDEOENC_RECONFIG_FPS (V4L2_CID_MPEG_BASE+581)

/** @} */

/**
 * @defgroup V4L2Argus V4L2 Video Camera
 *
 * @brief NVIDIA V4L2 Camera Description and Extensions
 *
 * The camera device node is \c "/dev/video%d".
 *
 * ### Supported Pixelformats
 * CAPTURE PLANE
 * :---------------------
 * V4L2_PIX_FMT_NV12M
 *           -
 *
 * ### Supported Memory Types
 * MEMORY               | CAPTURE PLANE
 * :------------------: | :-----------:
 * V4L2_MEMORY_MMAP     | Y
 * V4L2_MEMORY_DMABUF   | Y
 * V4L2_MEMORY_USERPTR  | N
 * \attention For the camera, it is necessary that the capture plane
 *  format be set and only then request buffers.
 *
 * ### Supported Controls
 * The following sections describe the supported controls.
 *
 * #### Controls From the Open Source V4L2-Controls Header
 * Control ID                       | Purpose              | Runtime Configurable
 * -------------------------------- | -------------------- | :------------------:
 * - #V4L2_CID_3A_LOCK              | AWB/AE Lock          | Y
 *
 * All non-runtime configurable options must be set after setting format on
 * the capture planes and before requesting buffers.
 *
 *
 * ### NVIDIA-Specific Controls
 * - #V4L2_CID_ARGUS_AUTO_WHITE_BALANCE_MODE
 * - #V4L2_CID_ARGUS_SENSOR_MODE
 * - #V4L2_CID_ARGUS_DENOISE_STRENGTH
 * - #V4L2_CID_ARGUS_DENOISE_MODE
 * - #V4L2_CID_ARGUS_EE_STRENGTH
 * - #V4L2_CID_ARGUS_EE_MODE
 * - #V4L2_CID_ARGUS_AE_ANTIBANDING_MODE
 * - #V4L2_CID_ARGUS_ISP_DIGITAL_GAIN_RANGE
 * - #V4L2_CID_ARGUS_COLOR_SATURATION
 * - #V4L2_CID_ARGUS_GAIN_RANGE
 * - #V4L2_CID_ARGUS_EXPOSURE_TIME_RANGE
 * - #V4L2_CID_ARGUS_METADATA
 *
 * ### Setting Framerate
 * The camera framerate can be set with \c VIDIOC_S_PARM IOCTL by setting the numerator
 * and denominator in `v4l2_streamparm.parm.output.timeperframe`.
 * Selection of camera mode can override this setting. If the camera mode is to be
 * selected along with the specified framerate, then camera mode must be selected before
 * setting the framerate.
 *
 * ### Camera Capture Metadata
 * The camera can be queried to report frame related metadata. See \c V4L2_CID_ARGUS_METADATA
 * for more information.
 *
 * ### EOS Handling
 * Camera outputs all the queued empty buffers with data and TIME_OUT if no more empty buffers
 * are queued. If error is encountered, am empty buffer is queued to the output with
 * V4L2_BUF_FLAG_LAST flag.
 * @{
 * @ingroup ee_extensions_group
 */
/**
 * Defines the Control ID to set auto white balance mode for camera.
 *
 * A value of type \c v4l2_argus_ac_awb_mode must be supplied
 * with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_AUTO_WHITE_BALANCE_MODE (V4L2_CID_CAMERA_CLASS_BASE+20)

/**
 * Defines the Control ID to set sensor mode for camera.
 *
 * A non-negative integer value must be supplied with this control.
 *
 * @attention This control should be set after setting format
 * and before requesting buffers on the capture plane.
 */
#define V4L2_CID_ARGUS_SENSOR_MODE (V4L2_CID_CAMERA_CLASS_BASE+32)

/**
 * Defines the Control ID to set denoise strength for camera.
 *
 * A pointer to a valid structure \c v4l2_argus_denoise_strength must be
 * supplied with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_DENOISE_STRENGTH (V4L2_CID_CAMERA_CLASS_BASE+33)

/**
 * Defines the Control ID to set denoise mode for camera.
 *
 * A value of type \c v4l2_argus_denoise_mode must be
 * supplied with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_DENOISE_MODE (V4L2_CID_CAMERA_CLASS_BASE+34)

/**
 * Defines the Control ID to set edge enhancement strength for camera.
 *
 * A pointer to a valid structure \c v4l2_argus_edge_enhance_strength
 * must be supplied with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_EE_STRENGTH (V4L2_CID_CAMERA_CLASS_BASE+35)

/**
 * Defines the Control ID to set edge enhancement mode for camera.
 *
 * A value of type \c v4l2_argus_edge_enhance_mode
 * must be supplied with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_EE_MODE (V4L2_CID_CAMERA_CLASS_BASE+36)

/**
 * Defines the Control ID to set Auto Exposure antibanding mode for camera.
 *
 * A value of type \c v4l2_argus_ac_ae_antibanding_mode must be supplied
 * with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_AE_ANTIBANDING_MODE (V4L2_CID_CAMERA_CLASS_BASE+37)

/**
 * Defines the Control ID to set edge enhancement settings for camera.
 *
 * A pointer to a valid structure \c v4l2_argus_exposure_compensation
 * must be supplied with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_EXPOSURE_COMPENSATION (V4L2_CID_CAMERA_CLASS_BASE+38)

/**
 * Defines the Control ID to set edge enhancement settings for camera.
 *
 * A pointer to a valid structure \c v4l2_argus_ispdigital_gainrange
 * must be supplied with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_ISP_DIGITAL_GAIN_RANGE (V4L2_CID_CAMERA_CLASS_BASE+39)

/**
 * Defines the Control ID to set sensor mode for camera.
 *
 * A pointer to a valid structure \c v4l2_argus_color_saturation
 * must be supplied with this control.
 * The flag `EnableSaturation` must be set to true to enable setting
 * the specified color saturation
 *
 * @attention This control should be set after setting format
 * and before requesting buffers on the capture plane.
 */
#define V4L2_CID_ARGUS_COLOR_SATURATION (V4L2_CID_CAMERA_CLASS_BASE+40)

/**
 * Defines the Control ID to set edge enhancement settings for camera.
 *
 * A pointer to a valid structure \c v4l2_argus_gainrange
 * must be supplied with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_GAIN_RANGE (V4L2_CID_CAMERA_CLASS_BASE+41)

/**
 * Defines the Control ID to set edge enhancement settings for camera.
 *
 * A pointer to a valid structure \c v4l2_argus_exposure_timerange
 * must be supplied with this control.
 *
 * @attention This control should be set after setting format
 * on the capture plane.
 */
#define V4L2_CID_ARGUS_EXPOSURE_TIME_RANGE (V4L2_CID_CAMERA_CLASS_BASE+42)

/**
 * Defines the Control ID to get the camera argus output metadata.
 *
 * A pointer to a valid structure \c v4l2_argus_ctrl_metadata must be supplied
 * with this control.
 *
 * @attention This control must be read after dequeueing a buffer successfully from
 * the capture plane. The values in the structure are valid until the buffer is queued
 * again.
 */
#define V4L2_CID_ARGUS_METADATA (V4L2_CID_CAMERA_CLASS_BASE+43)

/** @} */

/** @addtogroup V4L2Dec */
/** @{ */
/**
 * Enum v4l2_skip_frames_type, possible methods for decoder skip frames. */
enum v4l2_skip_frames_type {
    /** Do not skip any frame. */
    V4L2_SKIP_FRAMES_TYPE_NONE = 0,
    /** Skip all non-reference frames. */
    V4L2_SKIP_FRAMES_TYPE_NONREF = 1,
    /** Skip all frames except IDR */
    V4L2_SKIP_FRAMES_TYPE_DECODE_IDR_ONLY = 2,
};

/**
 * Enum v4l2_cuda_mem_type, possible methods for cuda memory tpye. */
enum v4l2_cuda_mem_type {
    /** Memory type device. */
    V4L2_CUDA_MEM_TYPE_DEVICE = 0,
    /** Memory type host. */
    V4L2_CUDA_MEM_TYPE_PINNED = 1,
    /** Memory type unified. */
    V4L2_CUDA_MEM_TYPE_UNIFIED = 2,
};

/**
 * Enum v4l2_videodec_input_error_type, possible error types for input stream. */
enum v4l2_videodec_input_error_type {
    /** no error. */
    V4L2_DEC_ERROR_NONE = 0x0,
    /** sps error. */
    V4L2_DEC_ERROR_SPS = 0x1,
    /** pps error. */
    V4L2_DEC_ERROR_PPS = 0x2,
    /** slice header error. */
    V4L2_DEC_ERROR_SLICE_HDR = 0x4,
    /** missing reference frame error. */
    V4L2_DEC_ERROR_MISSING_REF_FRAME = 0x8,
    /** VPS error. */
    V4L2_DEC_ERROR_VPS = 0x10,
};

/**
 * Holds the decoder error status metadata for the frame.
 */
typedef struct v4l2_ctrl_videodec_statusmetadata_
{
    /** Error types:
     *  bit 0: Fatal
     *  bit 1: MB level syntax
     *  bit 2: Missing Slice(s)
     *  bit 3: PrevFrameLostFlag */
    __u32  DecodeError;
    /** Number of macro blocks decoded without error. */
    __u32  DecodedMBs;
    /** Number of macro blocks where error was concealed. */
    __u32  ConcealedMBs;
    /** POC of the reference frame used for concealment. */
    __u32  nConcealedFromPOC;
    /** Time required to decode the frame, in microseconds. */
    __u32  FrameDecodeTime;
}v4l2_ctrl_videodec_statusmetadata;

/**
 * Holds the the frame specific metadata for a reference frame.
 */
typedef struct v4l2_ctrl_videodec_refframe_metadata_
{
    /** Boolean value indicating if the frame is present in DPB. */
    __u32 bPresent;
    /** Boolean value indicating if the frame is an IDR. */
    __u32 bIdrFrame;
    /** Boolean value indicating if the frame is a long term reference frame. */
    __u32 bLTRefFrame;
    /** Boolean value indicating if it is a predicted frame. */
    __u32 bPredicted;
    /** Picture order count of the frame. */
    __u32 nPictureOrderCnt;
    /** Frame number. Resets to zero for an IDR frame. */
    __u32 nFrameNum;
    /** Long Term Frame Index of the frame. */
    __u32 nLTRFrameIdx;
} v4l2_ctrl_videodec_refframe_metadata;

/**
 * Holds the the frame specific metadata for the current frame.
 */
typedef struct v4l2_ctrl_videodec_currentframe_metadata_
{
    /** Boolean value indicating if the current frame is a reference frame. */
    __u32 bRefFrame;
    /** Boolean value indicating if the current frame is an IDR. */
    __u32 bIdrFrame;
    /** Boolean value indicating if the current frame is a long term reference frame. */
    __u32 bLTRefFrame;
    /** Picture order count of the current frame. */
    __u32 nPictureOrderCnt;
    /** Frame number. Resets to zero for an IDR frame. */
    __u32 nFrameNum;
    /** Long Term Frame Index of the current frame. */
    __u32 nLTRFrameIdx;
} v4l2_ctrl_videodec_currentframe_metadata;

/**
 * Holds the decoder DPB info metadata.
 */
typedef struct v4l2_ctrl_videodec_dpbinfometadata_
{
    /** Metadata for the current decoded frame. */
    v4l2_ctrl_videodec_currentframe_metadata currentFrame;
    /** Number of active frames present in the DPB. */
    __u32 nActiveRefFrames;
    /** An array of metadatas for the active frames in the DPB. Only
     *  nActiveRefFrames elements in the array are valid. */
    v4l2_ctrl_videodec_refframe_metadata RPSList[16];
} v4l2_ctrl_videodec_dpbinfometadata;

/**
 * Holds H.264 specific decoder metadata for the frame.
 */
typedef struct v4l2_ctrl_h264dec_bufmetadata_
{
    /** Holds the number of bits in the frame. */
    __u32 nFrameNumBits;
    /** Type of frame:
     *  0 = B
     *  1 = P
     *  2 = I */
    __u32  FrameType;
    /** Holds the current DPB information of the decoder. */
    v4l2_ctrl_videodec_dpbinfometadata dpbInfo;
}v4l2_ctrl_h264dec_bufmetadata;

/**
 * Holds H.265 specific decoder metadata for the frame.
 */
typedef struct v4l2_ctrl_hevcdec_bufmetadata_
{
    /** Holds the number of bits in the frame. */
    __u32 nPocLsbBits;
    /** Type of frame:
     *  0 = B
     *  1 = P
     *  2 = I */
    __u32  FrameType;
    /** Holds the current DPB information of the decoder. */
    v4l2_ctrl_videodec_dpbinfometadata dpbInfo;
}v4l2_ctrl_hevcdec_bufmetadata;

/**
 * Holds the video decoder input header error metadata for a frame.
 */
typedef struct v4l2_ctrl_videodec_inputbuf_metadata_
{
    /** Bits represent types of error as defined
     *  with v4l2_videodec_input_error_type. */
    __u32 nBitStreamError;
} v4l2_ctrl_videodec_inputbuf_metadata;

/**
 * Holds the video decoder output metadata for a frame.
 */
typedef struct v4l2_ctrl_videodec_outputbuf_metadata_
{
    /** Color primaries. */
    __u8 ucColorPrimaries;
    /** Transfer characteristics. */
    __u8 ucTransferCharacteristics;
    /** Matrix coefficients. */
    __u8 ucMatrixCoefficients;
    /** Boolean value indicating if \c FrameDecStats has valid contents. */
    __u32 bValidFrameStatus;
    /** Frame decode statistics. */
    v4l2_ctrl_videodec_statusmetadata    FrameDecStats;
    /** Codec specific metadata for the frame. */
    union {
        /** H.264 specific metadata. */
        v4l2_ctrl_h264dec_bufmetadata H264DecParams;
        /** H.265 specific metadata. */
        v4l2_ctrl_hevcdec_bufmetadata HEVCDecParams;
    }CodecParams;
} v4l2_ctrl_videodec_outputbuf_metadata;
/** @} */

/** @addtogroup V4L2Enc */
/** @{ */

/**
 * Specifies the types of encoder temporal tradeoff levels
 */
enum v4l2_enc_temporal_tradeoff_level_type {
    /** Do not drop any buffers. */
    V4L2_ENC_TEMPORAL_TRADEOFF_LEVEL_DROPNONE = 0,
    /** Drop 1 in every 5 buffers. */
    V4L2_ENC_TEMPORAL_TRADEOFF_LEVEL_DROP1IN5,
    /** Drop 1 in every 3 buffers. */
    V4L2_ENC_TEMPORAL_TRADEOFF_LEVEL_DROP1IN3,
    /** Drop 1 in every 2 buffers. */
    V4L2_ENC_TEMPORAL_TRADEOFF_LEVEL_DROP1IN2,
    /** Drop 2 in every 3 buffers. */
    V4L2_ENC_TEMPORAL_TRADEOFF_LEVEL_DROP2IN3,
};

/**
 * Specifies the encoder HW Preset type.
 */
enum v4l2_enc_hw_preset_type {
    /** Encoder HWPreset DISABLED. */
    V4L2_ENC_HW_PRESET_DISABLE = 0,
    /** Encoder HWPreset with per frame encode time UltraFast. */
    V4L2_ENC_HW_PRESET_ULTRAFAST = 1,
    /** Encoder HWPreset with per frame encode time Fast. */
    V4L2_ENC_HW_PRESET_FAST,
    /** Encoder HWPreset with per frame encode time Medium. */
    V4L2_ENC_HW_PRESET_MEDIUM,
    /** Encoder HWPreset with per frame encode time Slow. */
    V4L2_ENC_HW_PRESET_SLOW,
};

/**
 * Specifies the encoder HW Preset type.
 */
enum v4l2_enc_hw_tuning_info_type {
    /** Encoder Tuning Info Undefined */
    V4L2_ENC_TUNING_INFO_UNDEFINED = 0,
    /** Encoder Tuning Info High Quality */
    V4L2_ENC_TUNING_INFO_HIGH_QUALITY = 1,
    /** Encoder Tuning Info Low Latency */
    V4L2_ENC_TUNING_INFO_LOW_LATENCY,
    /** Encoder Tuning Info Ultra Low Latency */
    V4L2_ENC_TUNING_INFO_ULTRA_LOW_LATENCY,
    /** Encoder Tuning Info Lossless */
    V4L2_ENC_TUNING_INFO_LOSSLESS,
};

/**
 * Holds encoder HW Preset type parameters
 * to be used with #V4L2_CID_MPEG_VIDEOENC_HW_PRESET_TYPE_PARAM IOCTL.
 */
typedef struct v4l2_enc_hw_preset_type_param_
{
    /** Type in which the encoder hw preset is specified, one of type #v4l2_enc_hw_preset_type. */
    enum v4l2_enc_hw_preset_type hw_preset_type;
    /** Boolean value indicating if encoder set to max clock. */
    __u8 set_max_enc_clock;
}v4l2_enc_hw_preset_type_param;

/**
 * Enum specifying the type of slice length.
 */
enum v4l2_enc_slice_length_type {
    /** Slice size is specified in terms of number of bytes. */
    V4L2_ENC_SLICE_LENGTH_TYPE_BITS = 0,
    /** Slice size is specified in terms of number of macroblocks. */
    V4L2_ENC_SLICE_LENGTH_TYPE_MBLK,
};

/**
 * Specifies the input buffer metadata flag.
 */
enum v4l2_enc_input_metadata_param {
    /** Input metadata structure contains ROI parameters.  */
    V4L2_ENC_INPUT_ROI_PARAM_FLAG = 1,
    /** Input metadata structure contains GDR parameters.  */
    V4L2_ENC_INPUT_GDR_PARAM_FLAG = 1 << 1,
    /** Input metadata structure contains External RPS parameters.  */
    V4L2_ENC_INPUT_RPS_PARAM_FLAG = 1 << 2,
    /** Input metadata structure contains External RC parameters.  */
    V4L2_ENC_INPUT_RC_PARAM_FLAG = 1 << 3,
    /** Input metadata structure contains ReconCRC parameters.  */
    V4L2_ENC_INPUT_RECONCRC_PARAM_FLAG = 1 << 4,
};

/**
 * Defines the possible levels for H.265 encoder.
 */
enum v4l2_mpeg_video_h265_level {

    V4L2_MPEG_VIDEO_H265_LEVEL_1_0_MAIN_TIER = 0,
    V4L2_MPEG_VIDEO_H265_LEVEL_1_0_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_2_0_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_2_0_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_2_1_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_2_1_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_3_0_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_3_0_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_3_1_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_3_1_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_4_0_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_4_0_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_4_1_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_4_1_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_5_0_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_5_0_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_5_1_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_5_1_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_5_2_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_5_2_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_6_0_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_6_0_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_6_1_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_6_1_HIGH_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_6_2_MAIN_TIER,
    V4L2_MPEG_VIDEO_H265_LEVEL_6_2_HIGH_TIER,
};

#define V4L2_MPEG_VIDEO_BITRATE_MODE_CONSTQP 0x2

/**
 * Holds encoder slice length parameters, to be used with
 * \c V4L2_CID_MPEG_VIDEOENC_SLICE_LENGTH_PARAM IOCTL.
 */
typedef struct v4l2_enc_slice_length_param_
{
    /** Type in which the slice length is specified, one of type \c v4l2_enc_slice_length_type. */
    enum v4l2_enc_slice_length_type slice_length_type;
    /** Size of the slice in either number of bytes or number of macro blocks. */
    __u32   slice_length;
}v4l2_enc_slice_length_param;

/**
 * Holds encoder virtual buffer size parameters, to be used with
 * \c V4L2_CID_MPEG_VIDEOENC_VIRTUALBUFFER_SIZE IOCTL.
 */
typedef struct v4l2_enc_virtual_buffer_size_
{
    /** Size of the virtual buffer, in bits. */
    __u32   size;
}v4l2_enc_virtual_buffer_size;

/**
 * Holds encoder number of reference frame parameters, to be used with
 * \c V4L2_CID_MPEG_VIDEOENC_NUM_REFERENCE_FRAMES IOCTL.
 *
 * This is not supported for H.265.
 */
typedef struct v4l2_enc_num_ref_frames_
{
    /** Number of reference frames. */
    __u32   frames;
}v4l2_enc_num_ref_frames;

/**
 * Holds encoder slice intrareferesh parameters, to be used with
 * \c V4L2_CID_MPEG_VIDEOENC_SLICE_INTRAREFRESH_PARAM IOCTL.
 */
typedef struct v4l2_enc_slice_intrarefresh_param_
{
    /** Slice intrarefresh interval, in number of slices. */
    __u32   interval;
}v4l2_enc_slice_intrarefresh_param;

/**
 * Defines the maximum number of ROI regions supported by the encoder.
 */
#define V4L2_MAX_ROI_REGIONS 8

/**
 * Holds the encoder quality parameters for a single ROI region.
 */
typedef struct v4l2_enc_ROI_param_
{
    /** Region of interest rectangle. */
    struct v4l2_rect  ROIRect;
    /** QP delta for the region. */
    __s32   QPdelta;
} v4l2_enc_ROI_param;

/**
 * Holds the encoder frame ROI parameters
 * to be used with #V4L2_CID_MPEG_VIDEOENC_ROI_PARAMS IOCTL.
 */
typedef struct v4l2_enc_frame_ROI_params_
{
    /** Number of regions. */
    __u32 num_ROI_regions;
    /** Array of indiviudal ROI parameters. */
    v4l2_enc_ROI_param ROI_params[V4L2_MAX_ROI_REGIONS];
    /** Config store integer to which this control is to be applied.
     *  This must be same as the value of config store of \c v4l2_buffer to which
     *  the ROI params is applied. */
    __u32   config_store;
}v4l2_enc_frame_ROI_params;

/**
 * Defines the available features for preprocessing enhancement (PPE) module
 */
enum v4l2_ppe_feature {
    /** Default value for no feature enabled */
    V4L2_PPE_FEATURE_NONE = 0,
    /** Temporal Adaptive Quantization (TAQ) */
    V4L2_PPE_FEATURE_TAQ = (1 << 0),
};

/**
 * Holds the preprocessing enhancement initialization parameters
 * to be used with #V4L2_CID_MPEG_VIDEOENC_PPE_INIT_PARAMS IOCTL.
 */
typedef struct v4l2_enc_ppe_init_params_
{
    /** Boolean value indicating if PPE module should be enabled */
    __u8 enable_ppe;
    /** Bit flags to enable/disable each individual feature */
    __u32 feature_flags;
    /** Boolean value indicating if profiler should be enabled */
    __u8 enable_profiler;
    /** The max number of milliseconds that Nvmedia should wait for each frame processing */
    __s32 wait_time_ms;
    /** Maximum strength of QP delta map for TAQ */
    __u8 taq_max_qp_delta;
    /** Boolean value indicating if TAQ should be applied for B-frames */
    __u8 taq_b_frame_mode;
}v4l2_enc_ppe_init_params;

/**
 * Holds the motion vector parameters for a single block.
 * For H.264, nvenc provides one motion vector per 16x16 block(Macroblock).
 * For H.265, nvenc provides one motion vector per 32x32 block(Coded Tree Block).
 */
typedef struct MVInfo_ {
    /** Number of pixels the macro block moved in horizontal direction. */
    __s32 mv_x   : 16;
    /** Number of pixels the macro block moved in vertical direction. */
    __s32 mv_y   : 14;
    /** Temporal hints used by hardware for Motion Estimation. */
    __u32 weight : 2;
} MVInfo;

/**
 * Holds the motion vector parameters for one complete frame.
 */
typedef struct v4l2_ctrl_videoenc_outputbuf_metadata_MV_ {
    /** Size of the pMVInfo buffer, in bytes. */
    __u32 bufSize;
    /** Pointer to the buffer containing the motion vectors. */
    MVInfo *pMVInfo;
} v4l2_ctrl_videoenc_outputbuf_metadata_MV;

/**
 * Maximum number of reference frames supported by the encoder.
 */
#define V4L2_MAX_REF_FRAMES  8

/**
 * Holds the RPS List parameters of encoded frame.
 */
typedef struct v4l2_enc_frame_full_prop_
{
    /** Unique frame ID. */
    __u32  nFrameId;
    /** Boolean value indicating if current frame is an IDR. */
    __u8   bIdrFrame;
    /** Boolean value indicating if set Long Term Ref Flag. */
    __u8   bLTRefFrame;
    /** Picture Order Count. */
    __u32  nPictureOrderCnt;
    /** FrameNum. */
    __u32  nFrameNum;
    /** LongTermFrameIdx of a picture. */
    __u32  nLTRFrameIdx;
} v4l2_enc_frame_full_prop;

/**
 * Holds the encoder output metadata for a frame, to be used with
 * \c V4L2_CID_MPEG_VIDEOENC_METADATA IOCTL.
 */
typedef struct v4l2_ctrl_videoenc_outputbuf_metadata_
{
    /** Boolean value indicating if current frame is a key frame. */
    __u8 KeyFrame;
    /** Boolean value indicating end of frame in case of multi slice encoding. */
    __u8 EndofFrame;
    /** Average QP value of the frame. */
    __u16 AvgQP;
    /** Boolean value indicating if current frame is a golden or alternate frame. */
    __u8 bIsGoldenOrAlternateFrame;
    /** CRC for Reconstructed frame. */
    __u8 bValidReconCRC;
    /** Recon Y-frame CRC */
    __u32 ReconFrame_Y_CRC;
    /** Recon U-frame CRC */
    __u32 ReconFrame_U_CRC;
    /** Recon V-frame CRC */
    __u32 ReconFrame_V_CRC;
    /** Number of bits needed to encode the frame. */
    __u32 EncodedFrameBits;
    /** Minumum QP value in the frame. */
    __u32 FrameMinQP;
    /** Maximum QP value in the frame. */
    __u32 FrameMaxQP;
    /** RPS Feedback. */
    __u32 bRPSFeedback_status;
    /**  Reference frame ID used for Motion Estimation of current frame,
         ignored for IDR */
    __u32 nCurrentRefFrameId;
    /** Number of active reference frames. */
    __u32 nActiveRefFrames;
    /** RPS List including most recent frame if it is reference frame. */
    v4l2_enc_frame_full_prop RPSList[V4L2_MAX_REF_FRAMES];
} v4l2_ctrl_videoenc_outputbuf_metadata;

/**
 * Holds the metadata parameters for video encoder and decoder.
 *
 * The metadata is valid for the buffer with index \c buffer_index after the
 * buffer is dequeued until it is queued again.
 */
typedef struct v4l2_ctrl_video_metadata_
{
    /** A pointer to #v4l2_ctrl_videodec_inputbuf_metadata structure.
     * This must be a valid pointer when used with #V4L2_CID_MPEG_VIDEODEC_INPUT_METADATA
     * IOCTL. */
    v4l2_ctrl_videodec_inputbuf_metadata *VideoDecHeaderErrorMetadata;
    /** A pointer to #v4l2_ctrl_videodec_outputbuf_metadata structure.
     * This must be a valid pointer when used with #V4L2_CID_MPEG_VIDEODEC_METADATA
     * IOCTL. */
    v4l2_ctrl_videodec_outputbuf_metadata *VideoDecMetadata;
    /** A pointer to #v4l2_ctrl_videoenc_outputbuf_metadata structure.
     * This must be a valid pointer when used with #V4L2_CID_MPEG_VIDEOENC_METADATA
     * IOCTL. */
    v4l2_ctrl_videoenc_outputbuf_metadata *VideoEncMetadata;
    /** A pointer to #v4l2_ctrl_videoenc_outputbuf_metadata_MV structure.
     * This must be a valid pointer when used with #V4L2_CID_MPEG_VIDEOENC_METADATA_MV
     * IOCTL. */
    v4l2_ctrl_videoenc_outputbuf_metadata_MV *VideoEncMetadataMV;
    /** Index of the buffer whose metadata is required. */
    __u32 buffer_index;
} v4l2_ctrl_video_metadata;

/**
 * Holds the encoder GDR parameters
 * to be used with #V4L2_CID_MPEG_VIDEOENC_INPUT_METADATA IOCTL.
 */
typedef struct v4l2_enc_gdr_params_
{
    /** Parameter for GDR (Intra Refresh) for specified number of frames. */
    __u32 nGDRFrames;
} v4l2_enc_gdr_params;

/**
 * Holds the params to configure encoder for external rps control
 * to be used with #V4L2_CID_MPEG_VIDEOENC_ENABLE_EXTERNAL_RPS_CONTROL IOCTL.
 */
typedef struct v4l2_enc_enable_ext_rps_ctrl_
{
    /** Boolean value indicating if enabled External RPS control. */
    __u8 bEnableExternalRPS;
    /** Boolean value indicating if allowed gap in frame number. */
    __u8 bGapsInFrameNumAllowed;
    /* TODO : Check for field details. */
    __u32 nH264FrameNumBits;
    /* TODO : Check for field details. */
    __u32 nH265PocLsbBits;
}v4l2_enc_enable_ext_rps_ctr;


/**
 * Holds the encoder frame property.
 */
typedef struct _v4l2_enc_frame_prop
{
    /** unique Id. */
    __u32 nFrameId;
    /** Long Term Ref Flag. */
    __u8 bLTRefFrame;
} v4l2_enc_frame_prop;

/**
 * Holds the encoder frame external rps control parameters
 * to be used with #V4L2_CID_MPEG_VIDEOENC_INPUT_METADATA IOCTL.
 */
typedef struct v4l2_enc_frame_ext_rps_ctrl_params_
{
    /** unique Id of current frame. */
    __u32 nFrameId;
    /** Boolean value indicating if current frame referenced or non-referenced. */
    __u8 bRefFrame;
    /** Boolean value indicating if current frame long Term Ref Flag. */
    __u8 bLTRefFrame;
   /** Max Number of reference frames to use for inter-motion search. */
    __u32 nMaxRefFrames;
    /** # of valid entries in RPS, 0 means IDR. */
    __u32 nActiveRefFrames;;
    /**  frame id of reference frame to be used for motion search, ignored for IDR. */
    __u32 nCurrentRefFrameId;
    /** Array of RPS */
    v4l2_enc_frame_prop RPSList[V4L2_MAX_REF_FRAMES];
}v4l2_enc_frame_ext_rps_ctrl_params;


/**
 * Holds the params to configure encoder for external rate control mode
 * to be used with #V4L2_CID_MPEG_VIDEOENC_ENABLE_EXTERNAL_RATE_CONTROL IOCTL.
 */
typedef struct v4l2_enc_enable_ext_rate_ctrl_
{
    /** Boolean value indicating if enabled External Picture RC. */
    __u8 bEnableExternalPictureRC;
    /** Max QP per session when external picture RC enabled. */
    __u32 nsessionMaxQP;
}v4l2_enc_enable_ext_rate_ctr;

/**
 * Holds the encoder frame external rate control parameters
 * to be used with #V4L2_CID_MPEG_VIDEOENC_INPUT_METADATA ioctl.
 */
typedef struct v4l2_enc_frame_ext_rate_ctrl_params_
{
    /** Target frame bits. */
    __u32 nTargetFrameBits;
    /** Frame start QP. */
    __u32 nFrameQP;
    /** Frame min QP. */
    __u32 nFrameMinQp;
    /** Frame max QP. */
    __u32 nFrameMaxQp;
    /** Frame min QP deviation. */
    __u32 nMaxQPDeviation;
}v4l2_enc_frame_ext_rate_ctrl_params;

/**
 * Holds the params to configure encoder for ROI parameters encoding
 *
 * Must be used with #V4L2_CID_MPEG_VIDEOENC_ENABLE_ROI_PARAM IOCTL.
 */
typedef struct v4l2_enc_enable_roi_param_
{
    /** Boolean value to indicating ROI param encoding. */
    __u8 bEnableROI;
}v4l2_enc_enable_roi_param;

/**
 * Holds the params to configure encoder for Reconstructed CRC encoding
 *
 * Must be used with #V4L2_CID_MPEG_VIDEOENC_ENABLE_RECONCRC_PARAM IOCTL.
 */
typedef struct v4l2_enc_enable_reconcrc_param_
{
    /** Boolean value to indicating Reconstructed CRC encoding. */
    __u8 bEnableReconCRC;
}v4l2_enc_enable_reconcrc_param;

/**
 * Holds the encoder frame Reconstructed CRC parameters.
 *
 * Must be used with #V4L2_CID_MPEG_VIDEOENC_INPUT_METADATA IOCTL.
 */
typedef struct v4l2_enc_frame_ReconCRC_params_
{
    /** Rectangle to specify the co-ordinates of the input frame
    * used to calculate reconstructed picture CRC. */
    struct v4l2_rect  ReconCRCRect;
}v4l2_enc_frame_ReconCRC_params;

/**
 * Holds the encoder frame input metadata parameters.
 *
 * Must be used with #V4L2_CID_MPEG_VIDEOENC_INPUT_METADATA IOCTL.
 */
typedef struct v4l2_ctrl_videoenc_input_metadata_
{
    /** Flag to indicate which inputbuffer metadata is valid. */
    __u32    flag;
    /** Pointer to the ROI params structure when ROI param is in metadata_flag. */
    v4l2_enc_frame_ROI_params *VideoEncROIParams;
    /** Pointer to the Reconstructed CRC parameter structure when ReconCRC param is in
    * metadata flag. */
    v4l2_enc_frame_ReconCRC_params *VideoReconCRCParams;
    /** Pointer to the GDR params structure when GDR param is in metadata_flag. */
    v4l2_enc_gdr_params   *VideoEncGDRParams;
    /** Pointer to the External RPL control parameter structure when RPS param is in
    * metadata flag. */
    v4l2_enc_frame_ext_rps_ctrl_params *VideoEncRPSParams;
    /** Pointer to the External Rate control parameter structure when RC param is in
    * metadata flag. */
    v4l2_enc_frame_ext_rate_ctrl_params *VideoEncExtRCParams;
    /** Config store integer to which these parameters are to be applied.
     *  This must be same as the value of config store of queued v4l2_buffer
     *   for which these parameters are valid. */
    __u32    config_store;
} v4l2_ctrl_videoenc_input_metadata;

/**
 * Setting Qp values in #v4l2_ctrl_video_qp_range to QP_RETAIN_VAL
 * retains default or previously set QP values.
 */
#define QP_RETAIN_VAL -1

/**
 * Holds the encoder frame min/max QP parameters.
 *
 * Must be used with #V4L2_CID_MPEG_VIDEOENC_QP_RANGE IOCTL.
 */
typedef struct _v4l2_ctrl_video_qp_range
{
    /** Minimum QP value for I frame. */
    __u32 MinQpI;
    /** Maximum QP value for I frame. */
    __u32 MaxQpI;
    /** Minimum QP value for P frame. */
    __u32 MinQpP;
    /** Maximum QP value for P frame. */
    __u32 MaxQpP;
    /** Minimum QP value for B frame. */
    __u32 MinQpB;
    /** Maximum QP value for B frame. */
    __u32 MaxQpB;
} v4l2_ctrl_video_qp_range;

typedef struct _v4l2_ctrl_video_constqp
{
    __u32 constQpI;
    __u32 constQpP;
    __u32 constQpB;
} v4l2_ctrl_video_constqp;

typedef struct _v4l2_ctrl_video_framerate
{
    __u32 fps_n;
    __u32 fps_d;
} v4l2_ctrl_video_framerate;

/**
 * Holds the encoder init QP parameters.
 *
 * Must be used with #V4L2_CID_MPEG_VIDEOENC_INIT_FRAME_QP IOCTL.
 */
typedef struct _v4l2_ctrl_video_init_qp
{
    /** Initial QP value for I frame. */
    __u32 IInitQP;
    /** Initial QP value for P frame. */
    __u32 PInitQP;
    /** Initial QP value for B frame. */
    __u32 BInitQP;
} v4l2_ctrl_video_init_qp;

/**
 * Holds the params to configure tiles for AV1 encoding
 *
 * Must be used with #V4L2_CID_MPEG_VIDEOENC_AV1_TILE_CONFIGURATION IOCTL.
 */
typedef struct v4l2_enc_av1_tile_config_
{
    /** Boolean value to enable multi-tile */
    __u8 bEnableTile;
    /** Log2 Tile Rows */
    __u32 nLog2RowTiles;
    /** Log2 Tile Columns */
    __u32 nLog2ColTiles;
}v4l2_enc_av1_tile_config;


/** @} */

/** @addtogroup V4L2Argus */
/** @{ */

/**
 * Enum specifying types of denoise modes.
 */
enum v4l2_argus_denoise_mode {
    V4L2_ARGUS_DENOISE_MODE_UNKNOWN         = 0,
    V4L2_ARGUS_DENOISE_MODE_OFF             = 1,
    V4L2_ARGUS_DENOISE_MODE_FAST            = 2,
    V4L2_ARGUS_DENOISE_MODE_HIGH_QUALITY    = 3,
};

/**
 * Enum specifying types of edge enhancement modes.
 */
enum v4l2_argus_edge_enhance_mode {
    V4L2_ARGUS_EDGE_ENHANCE_MODE_UNKNOWN        = 0,
    V4L2_ARGUS_EDGE_ENHANCE_MODE_OFF            = 1,
    V4L2_ARGUS_EDGE_ENHANCE_MODE_FAST           = 2,
    V4L2_ARGUS_EDGE_ENHANCE_MODE_HIGH_QUALITY   = 3,
};

/**
 * Enum specifying types of AE antibanding modes.
 */
enum v4l2_argus_ac_ae_antibanding_mode {
    V4L2_ARGUS_AE_ANTIBANDING_MODE_UNKNOWN  = 0,
    V4L2_ARGUS_AE_ANTIBANDING_MODE_OFF      = 1,
    V4L2_ARGUS_AE_ANTIBANDING_MODE_AUTO     = 2,
    V4L2_ARGUS_AE_ANTIBANDING_MODE_50HZ     = 3,
    V4L2_ARGUS_AE_ANTIBANDING_MODE_60HZ     = 4,
};

/**
 * Enum specifying types of AC AWB modes.
 */
enum v4l2_argus_ac_awb_mode {
    V4L2_ARGUS_AWB_MODE_OFF               = 1,
    V4L2_ARGUS_AWB_MODE_AUTO              = 2,
    V4L2_ARGUS_AWB_MODE_INCANDESCENT      = 3,
    V4L2_ARGUS_AWB_MODE_FLUORESCENT       = 4,
    V4L2_ARGUS_AWB_MODE_WARM_FLUORESCENT  = 5,
    V4L2_ARGUS_AWB_MODE_DAYLIGHT          = 6,
    V4L2_ARGUS_AWB_MODE_CLOUDY_DAYLIGHT   = 7,
    V4L2_ARGUS_AWB_MODE_TWILIGHT          = 8,
    V4L2_ARGUS_AWB_MODE_SHADE             = 9,
    V4L2_ARGUS_AWB_MODE_MANUAL            = 10,
};

/**
 * Enum specifying types of AE states.
 */
enum v4l2_argus_ae_state {
    V4L2_ARGUS_AeState_Unknown            = 0,
    V4L2_ARGUS_AE_STATE_INACTIVE          = 1,
    V4L2_ARGUS_AE_STATE_SEARCHING         = 2,
    V4L2_ARGUS_AE_STATE_CONVERGED         = 3,
    V4L2_ARGUS_AE_STATE_FLASH_REQUIRED    = 4,
    V4L2_ARGUS_AE_STATE_TIMEOUT           = 5,
};

/**
 * Enum specifying types of AWB states.
 */
enum v4l2_argus_awb_state {
    V4L2_ARGUS_AwbState_Unknown           = 0,
    V4L2_ARGUS_AWB_STATE_INACTIVE         = 1,
    V4L2_ARGUS_AWB_STATE_SEARCHING        = 2,
    V4L2_ARGUS_AWB_STATE_CONVERGED        = 3,
    V4L2_ARGUS_AWB_STATE_LOCKED           = 4,
};

/**
 * Holds the strength value for denoise operation.
 *
 * Must be used with #V4L2_CID_ARGUS_DENOISE_STRENGTH ioctl.
 */
typedef struct _v4l2_argus_denoise_strength
{
    /** Denoise Strength. Range: {-1.0f, 1.0f} **/
    float DenoiseStrength;
}v4l2_argus_denoise_strength;

/**
 * Holds the strength value for edge enhancement operation.
 *
 * Must be used with #V4L2_CID_ARGUS_EE_STRENGTH ioctl.
 */
typedef struct _v4l2_argus_edge_enhance_strength
{
    /** Edge Enhance Strength. Range: {-1.0f, 1.0f} **/
    float EdgeEnhanceStrength;
}v4l2_argus_edge_enhance_strength;

/**
 * Holds the value for exposure compensation.
 *
 * Must be used with #V4L2_CID_ARGUS_EXPOSURE_COMPENSATION ioctl.
 */
typedef struct _v4l2_argus_exposure_compensation
{
    /** Exposure Compensation. Range: {-2.0f, 2.0f} **/
    float ExposureCompensation;
}v4l2_argus_exposure_compensation;

/**
 * Holds the value for Isp Digital gain range.
 *
 * Must be used with #V4L2_CID_ARGUS_ISP_DIGITAL_GAIN_RANGE ioctl.
 */
typedef struct _v4l2_argus_ispdigital_gainrange
{
    /** Range: {1, 256} **/
    /** Digital Gain Range start limit **/
    float MinISPDigitalGainRange;
    /** Digital Gain Range end limit **/
    float MaxISPDigitalGainRange;
}v4l2_argus_ispdigital_gainrange;

/**
 * Holds the value for absolute color saturation.
 *
 * Must be used with #V4L2_CID_ARGUS_COLOR_SATURATION ioctl.
 */
typedef struct _v4l2_argus_color_saturation
{
    /** Boolean value to indicate enable of user-specified absolute color saturation **/
    __u8 EnableSaturation;
    /** Specified absolute color saturation **/
    float ColorSaturation;
}v4l2_argus_color_saturation;

/**
 * Holds the value for gain range.
 *
 * Must be used with #V4L2_CID_ARGUS_GAIN_RANGE ioctl.
 */
typedef struct _v4l2_argus_gainrange
{
    /** Analog Gain Range start limit **/
    float MinGainRange;
    /** Analog Gain Range end limit **/
    float MaxGainRange;
}v4l2_argus_gainrange;

/**
 * Holds the value for exposure range.
 *
 * Must be used with #V4L2_CID_ARGUS_EXPOSURE_TIME_RANGE ioctl.
 */
typedef struct _v4l2_argus_exposure_timerange
{
    /** Exposure Time Range start limit **/
    __u64 MinExposureTimeRange;
    /** Exposure Time Range end limit **/
    __u64 MaxExposureTimeRange;
}v4l2_argus_exposure_timerange;

/**
 * Holds the value for camera output metadata.
 *
 * Must be used with #V4L2_CID_ARGUS_METADATA ioctl.
 */
typedef struct _v4l2_argus_ctrl_metadata
{
    /** Boolean value to indicate if AE was locked for this capture **/
    __u8 AeLocked;
    /** Boolean value to indicate if metadata has valid contents **/
    __u8 ValidFrameStatus;
    /** Index of the buffer captured **/
    __u32 BufferIndex;
    /** Focuser Position used for capture**/
    __u32 FocuserPosition;
    /** CCT value calculated by AWB **/
    __u32 AwbCCT;
    /** ISO value used for capture **/
    __u32 SensorSensitivity;
    /** Time (nanoseconds) taken to integrate the capture **/
    __u64 FrameDuration;
    /** Frame readout time for the capture **/
    __u64 FrameReadoutTime;
    /** Sensor Exposure time value for the capture **/
    __u64 SensorExposureTime;
    /** ISP Digital gain value for the capture **/
    float IspDigitalGain;
    /** Estimated scene brightness for the capture **/
    float SceneLux;
    /** Sensor analog gain for the capture **/
    float SensorAnalogGain;
    /** AE state ran for capture **/
    enum v4l2_argus_ae_state AEState;
    /** AWB state ran for capture **/
    enum v4l2_argus_awb_state AWBState;
}v4l2_argus_ctrl_metadata;
/** @} */

/** @addtogroup V4L2Conv */
/** @{ */

/**
 * Enum specifying types of buffer layouts.
 */
enum v4l2_nv_buffer_layout {
    V4L2_NV_BUFFER_LAYOUT_PITCH = 0,  /**< Pitch Linear Layout. */
    V4L2_NV_BUFFER_LAYOUT_BLOCKLINEAR = 1, /**< Block Linear Layout. */
};

/**
 * Specifies the types of rotation/flip algorithms.
 */
enum v4l2_flip_method {
    V4L2_FLIP_METHOD_IDENTITY = 0, /**< Identity (no rotation). */
    V4L2_FLIP_METHOD_90L = 1,      /**< Rotate counter-clockwise 90 degrees. */
    V4L2_FLIP_METHOD_180 = 2,      /**< Rotate 180 degrees. */
    V4L2_FLIP_METHOD_90R = 3,      /**< Rotate clockwise 90 degrees. */
    V4L2_FLIP_METHOD_HORIZ = 4,    /**< Flip horizontally. */
    V4L2_FLIP_METHOD_INVTRANS = 5, /**< Flip across upper right/lower left diagonal. */
    V4L2_FLIP_METHOD_VERT = 6,     /**< Flip vertically. */
    V4L2_FLIP_METHOD_TRANS = 7,    /**< Flip across upper left/lower right diagonal. */
};

/**
 * Specifies the types of interpolation methods.
 */
enum v4l2_interpolation_method {
  V4L2_INTERPOLATION_NEAREST = 1,   /**< Nearest interpolation method */
  V4L2_INTERPOLATION_BILINEAR = 2,  /**< Bi-Linear interpolation method */
  V4L2_INTERPOLATION_5_TAP = 3,     /**< 5-Tap interpolation method */
  V4L2_INTERPOLATION_10_TAP = 4,    /**< 10-Tap interpolation method */
  V4L2_INTERPOLATION_SMART = 5,     /**< Smart interpolation method */
  V4L2_INTERPOLATION_NICEST = 6,    /**< Nicest interpolation method */
};

/**
 * Specifies the types of TNR algorithms.
 */
enum v4l2_tnr_algorithm {
  V4L2_TNR_ALGO_ORIGINAL = 0,           /**< Default TNR algorithm. */
  V4L2_TNR_ALGO_OUTDOOR_LOW_LIGHT = 1,  /**< Outdoor Low Light TNR algorithm. */
  V4L2_TNR_ALGO_OUTDOOR_MEDIUM_LIGHT = 2, /**< Outdoor Medium Light TNR algorithm. */
  V4L2_TNR_ALGO_OUTDOOR_HIGH_LIGHT = 3, /**< Outdoor High Light TNR algorithm. */
  V4L2_TNR_ALGO_INDOOR_LOW_LIGHT = 4, /**< Indoor Low Light TNR algorithm. */
  V4L2_TNR_ALGO_INDOOR_MEDIUM_LIGHT = 5, /**< Indoor Medium Light TNR algorithm. */
  V4L2_TNR_ALGO_INDOOR_HIGH_LIGHT = 6, /**< Indoor High Light TNR algorithm. */
};

/**
 * Specifies the types of YUV rescale methods.
 */
enum v4l2_yuv_rescale_method {
  /**< Disable */
  V4L2_YUV_RESCALE_NONE = 0,
  /**< Standard(limited range [16 235]) to extension(full range [0 255]) */
  V4L2_YUV_RESCALE_STD_TO_EXT = 1,
  /**< Extension(full range [0 255] to standard(limited range [16 235]) */
  V4L2_YUV_RESCALE_EXT_TO_STD = 2,
};

typedef struct v4l2_ctrl_video_displaydata_
{
    __u32 masteringdisplaydatapresent;
}v4l2_ctrl_video_displaydata;

/**
 * HDR Metadata.
 */

typedef struct _v4l2_ctrl_video_hdrmasteringdisplaydata
{
    // idx 0 : G, 1 : B, 2 : R
    __u16 display_primaries_x[3];       // normalized x chromaticity cordinate. It shall be in the range of 0 to 50000
    __u16 display_primaries_y[3];       // normalized y chromaticity cordinate. It shall be in the range of 0 to 50000
    __u16 white_point_x;    // normalized x chromaticity cordinate of white point of mastering display
    __u16 white_point_y;    // normalized y chromaticity cordinate of white point of mastering display
    __u32 max_display_parameter_luminance;      // nominal maximum display luminance in units of 0.0001 candelas per square metre
    __u32 min_display_parameter_luminance;      // nominal minimum display luminance in units of 0.0001 candelas per square metre
} v4l2_ctrl_video_hdrmasteringdisplaydata;


/**
 * Poll device
 */
typedef struct _v4l2_ctrl_video_device_poll
{
    __u16 req_events;    // Requested events, a bitmask of POLLIN, POLLOUT, POLLERR, POLLPRI.
    __u16 resp_events;    // Returned events a similar bitmask of above events.
} v4l2_ctrl_video_device_poll;

/** @} */
#endif /*__V4L2_NV_EXTENSIONS_H__*/