1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * These are the HEVC state controls for use with stateless HEVC 4*4882a593Smuzhiyun * codec drivers. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * It turns out that these structs are not stable yet and will undergo 7*4882a593Smuzhiyun * more changes. So keep them private until they are stable and ready to 8*4882a593Smuzhiyun * become part of the official public API. 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef _HEVC_CTRLS_H_ 12*4882a593Smuzhiyun #define _HEVC_CTRLS_H_ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/videodev2.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* The pixel format isn't stable at the moment and will likely be renamed. */ 17*4882a593Smuzhiyun #define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 1008) 20*4882a593Smuzhiyun #define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 1009) 21*4882a593Smuzhiyun #define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 1010) 22*4882a593Smuzhiyun #define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_MPEG_BASE + 1015) 23*4882a593Smuzhiyun #define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_MPEG_BASE + 1016) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* enum v4l2_ctrl_type type values */ 26*4882a593Smuzhiyun #define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 27*4882a593Smuzhiyun #define V4L2_CTRL_TYPE_HEVC_PPS 0x0121 28*4882a593Smuzhiyun #define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun enum v4l2_mpeg_video_hevc_decode_mode { 31*4882a593Smuzhiyun V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED, 32*4882a593Smuzhiyun V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED, 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun enum v4l2_mpeg_video_hevc_start_code { 36*4882a593Smuzhiyun V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE, 37*4882a593Smuzhiyun V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B, 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_TYPE_B 0 41*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_TYPE_P 1 42*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_TYPE_I 2 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) 45*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) 46*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) 47*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) 48*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) 49*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) 50*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) 51*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) 52*4882a593Smuzhiyun #define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* The controls are not stable at the moment and will likely be reworked. */ 55*4882a593Smuzhiyun struct v4l2_ctrl_hevc_sps { 56*4882a593Smuzhiyun /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ 57*4882a593Smuzhiyun __u16 pic_width_in_luma_samples; 58*4882a593Smuzhiyun __u16 pic_height_in_luma_samples; 59*4882a593Smuzhiyun __u8 bit_depth_luma_minus8; 60*4882a593Smuzhiyun __u8 bit_depth_chroma_minus8; 61*4882a593Smuzhiyun __u8 log2_max_pic_order_cnt_lsb_minus4; 62*4882a593Smuzhiyun __u8 sps_max_dec_pic_buffering_minus1; 63*4882a593Smuzhiyun __u8 sps_max_num_reorder_pics; 64*4882a593Smuzhiyun __u8 sps_max_latency_increase_plus1; 65*4882a593Smuzhiyun __u8 log2_min_luma_coding_block_size_minus3; 66*4882a593Smuzhiyun __u8 log2_diff_max_min_luma_coding_block_size; 67*4882a593Smuzhiyun __u8 log2_min_luma_transform_block_size_minus2; 68*4882a593Smuzhiyun __u8 log2_diff_max_min_luma_transform_block_size; 69*4882a593Smuzhiyun __u8 max_transform_hierarchy_depth_inter; 70*4882a593Smuzhiyun __u8 max_transform_hierarchy_depth_intra; 71*4882a593Smuzhiyun __u8 pcm_sample_bit_depth_luma_minus1; 72*4882a593Smuzhiyun __u8 pcm_sample_bit_depth_chroma_minus1; 73*4882a593Smuzhiyun __u8 log2_min_pcm_luma_coding_block_size_minus3; 74*4882a593Smuzhiyun __u8 log2_diff_max_min_pcm_luma_coding_block_size; 75*4882a593Smuzhiyun __u8 num_short_term_ref_pic_sets; 76*4882a593Smuzhiyun __u8 num_long_term_ref_pics_sps; 77*4882a593Smuzhiyun __u8 chroma_format_idc; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun __u8 padding; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun __u64 flags; 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0) 85*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) 86*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) 87*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) 88*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) 89*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) 90*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) 91*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) 92*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) 93*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) 94*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) 95*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) 96*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) 97*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) 98*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) 99*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) 100*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) 101*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) 102*4882a593Smuzhiyun #define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct v4l2_ctrl_hevc_pps { 105*4882a593Smuzhiyun /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ 106*4882a593Smuzhiyun __u8 num_extra_slice_header_bits; 107*4882a593Smuzhiyun __s8 init_qp_minus26; 108*4882a593Smuzhiyun __u8 diff_cu_qp_delta_depth; 109*4882a593Smuzhiyun __s8 pps_cb_qp_offset; 110*4882a593Smuzhiyun __s8 pps_cr_qp_offset; 111*4882a593Smuzhiyun __u8 num_tile_columns_minus1; 112*4882a593Smuzhiyun __u8 num_tile_rows_minus1; 113*4882a593Smuzhiyun __u8 column_width_minus1[20]; 114*4882a593Smuzhiyun __u8 row_height_minus1[22]; 115*4882a593Smuzhiyun __s8 pps_beta_offset_div2; 116*4882a593Smuzhiyun __s8 pps_tc_offset_div2; 117*4882a593Smuzhiyun __u8 log2_parallel_merge_level_minus2; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun __u8 padding[4]; 120*4882a593Smuzhiyun __u64 flags; 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE 0x01 124*4882a593Smuzhiyun #define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER 0x02 125*4882a593Smuzhiyun #define V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR 0x03 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun struct v4l2_hevc_dpb_entry { 130*4882a593Smuzhiyun __u64 timestamp; 131*4882a593Smuzhiyun __u8 rps; 132*4882a593Smuzhiyun __u8 field_pic; 133*4882a593Smuzhiyun __u16 pic_order_cnt[2]; 134*4882a593Smuzhiyun __u8 padding[2]; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun struct v4l2_hevc_pred_weight_table { 138*4882a593Smuzhiyun __s8 delta_luma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; 139*4882a593Smuzhiyun __s8 luma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; 140*4882a593Smuzhiyun __s8 delta_chroma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; 141*4882a593Smuzhiyun __s8 chroma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun __s8 delta_luma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; 144*4882a593Smuzhiyun __s8 luma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; 145*4882a593Smuzhiyun __s8 delta_chroma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; 146*4882a593Smuzhiyun __s8 chroma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun __u8 padding[6]; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun __u8 luma_log2_weight_denom; 151*4882a593Smuzhiyun __s8 delta_chroma_log2_weight_denom; 152*4882a593Smuzhiyun }; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) 155*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) 156*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) 157*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) 158*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) 159*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) 160*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6) 161*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7) 162*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8) 163*4882a593Smuzhiyun #define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9) 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun struct v4l2_ctrl_hevc_slice_params { 166*4882a593Smuzhiyun __u32 bit_size; 167*4882a593Smuzhiyun __u32 data_bit_offset; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ 170*4882a593Smuzhiyun __u8 nal_unit_type; 171*4882a593Smuzhiyun __u8 nuh_temporal_id_plus1; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ 174*4882a593Smuzhiyun __u8 slice_type; 175*4882a593Smuzhiyun __u8 colour_plane_id; 176*4882a593Smuzhiyun __u16 slice_pic_order_cnt; 177*4882a593Smuzhiyun __u8 num_ref_idx_l0_active_minus1; 178*4882a593Smuzhiyun __u8 num_ref_idx_l1_active_minus1; 179*4882a593Smuzhiyun __u8 collocated_ref_idx; 180*4882a593Smuzhiyun __u8 five_minus_max_num_merge_cand; 181*4882a593Smuzhiyun __s8 slice_qp_delta; 182*4882a593Smuzhiyun __s8 slice_cb_qp_offset; 183*4882a593Smuzhiyun __s8 slice_cr_qp_offset; 184*4882a593Smuzhiyun __s8 slice_act_y_qp_offset; 185*4882a593Smuzhiyun __s8 slice_act_cb_qp_offset; 186*4882a593Smuzhiyun __s8 slice_act_cr_qp_offset; 187*4882a593Smuzhiyun __s8 slice_beta_offset_div2; 188*4882a593Smuzhiyun __s8 slice_tc_offset_div2; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ 191*4882a593Smuzhiyun __u8 pic_struct; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ 194*4882a593Smuzhiyun __u8 num_active_dpb_entries; 195*4882a593Smuzhiyun __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; 196*4882a593Smuzhiyun __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun __u8 num_rps_poc_st_curr_before; 199*4882a593Smuzhiyun __u8 num_rps_poc_st_curr_after; 200*4882a593Smuzhiyun __u8 num_rps_poc_lt_curr; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun __u8 padding; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ 205*4882a593Smuzhiyun struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ 208*4882a593Smuzhiyun struct v4l2_hevc_pred_weight_table pred_weight_table; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun __u64 flags; 211*4882a593Smuzhiyun }; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun #endif 214