]>
Commit | Line | Data |
---|---|---|
f183ec61 MR |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* | |
3 | * These are the H.264 state controls for use with stateless H.264 | |
4 | * codec drivers. | |
5 | * | |
6 | * It turns out that these structs are not stable yet and will undergo | |
7 | * more changes. So keep them private until they are stable and ready to | |
8 | * become part of the official public API. | |
9 | */ | |
10 | ||
11 | #ifndef _H264_CTRLS_H_ | |
12 | #define _H264_CTRLS_H_ | |
13 | ||
14 | #include <linux/videodev2.h> | |
15 | ||
16 | /* Our pixel format isn't stable at the moment */ | |
17 | #define V4L2_PIX_FMT_H264_SLICE_RAW v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */ | |
18 | ||
19 | /* | |
20 | * This is put insanely high to avoid conflicting with controls that | |
21 | * would be added during the phase where those controls are not | |
22 | * stable. It should be fixed eventually. | |
23 | */ | |
24 | #define V4L2_CID_MPEG_VIDEO_H264_SPS (V4L2_CID_MPEG_BASE+1000) | |
25 | #define V4L2_CID_MPEG_VIDEO_H264_PPS (V4L2_CID_MPEG_BASE+1001) | |
26 | #define V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX (V4L2_CID_MPEG_BASE+1002) | |
27 | #define V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS (V4L2_CID_MPEG_BASE+1003) | |
28 | #define V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS (V4L2_CID_MPEG_BASE+1004) | |
29 | ||
30 | /* enum v4l2_ctrl_type type values */ | |
31 | #define V4L2_CTRL_TYPE_H264_SPS 0x0110 | |
32 | #define V4L2_CTRL_TYPE_H264_PPS 0x0111 | |
33 | #define V4L2_CTRL_TYPE_H264_SCALING_MATRIX 0x0112 | |
34 | #define V4L2_CTRL_TYPE_H264_SLICE_PARAMS 0x0113 | |
35 | #define V4L2_CTRL_TYPE_H264_DECODE_PARAMS 0x0114 | |
36 | ||
37 | #define V4L2_H264_SPS_CONSTRAINT_SET0_FLAG 0x01 | |
38 | #define V4L2_H264_SPS_CONSTRAINT_SET1_FLAG 0x02 | |
39 | #define V4L2_H264_SPS_CONSTRAINT_SET2_FLAG 0x04 | |
40 | #define V4L2_H264_SPS_CONSTRAINT_SET3_FLAG 0x08 | |
41 | #define V4L2_H264_SPS_CONSTRAINT_SET4_FLAG 0x10 | |
42 | #define V4L2_H264_SPS_CONSTRAINT_SET5_FLAG 0x20 | |
43 | ||
44 | #define V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE 0x01 | |
45 | #define V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS 0x02 | |
46 | #define V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO 0x04 | |
47 | #define V4L2_H264_SPS_FLAG_GAPS_IN_FRAME_NUM_VALUE_ALLOWED 0x08 | |
48 | #define V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY 0x10 | |
49 | #define V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD 0x20 | |
50 | #define V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE 0x40 | |
51 | ||
52 | struct v4l2_ctrl_h264_sps { | |
53 | __u8 profile_idc; | |
54 | __u8 constraint_set_flags; | |
55 | __u8 level_idc; | |
56 | __u8 seq_parameter_set_id; | |
57 | __u8 chroma_format_idc; | |
58 | __u8 bit_depth_luma_minus8; | |
59 | __u8 bit_depth_chroma_minus8; | |
60 | __u8 log2_max_frame_num_minus4; | |
61 | __u8 pic_order_cnt_type; | |
62 | __u8 log2_max_pic_order_cnt_lsb_minus4; | |
63 | __u8 max_num_ref_frames; | |
64 | __u8 num_ref_frames_in_pic_order_cnt_cycle; | |
65 | __s32 offset_for_ref_frame[255]; | |
66 | __s32 offset_for_non_ref_pic; | |
67 | __s32 offset_for_top_to_bottom_field; | |
68 | __u16 pic_width_in_mbs_minus1; | |
69 | __u16 pic_height_in_map_units_minus1; | |
70 | __u32 flags; | |
71 | }; | |
72 | ||
73 | #define V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE 0x0001 | |
74 | #define V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT 0x0002 | |
75 | #define V4L2_H264_PPS_FLAG_WEIGHTED_PRED 0x0004 | |
76 | #define V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT 0x0008 | |
77 | #define V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED 0x0010 | |
78 | #define V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT 0x0020 | |
79 | #define V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE 0x0040 | |
80 | #define V4L2_H264_PPS_FLAG_PIC_SCALING_MATRIX_PRESENT 0x0080 | |
81 | ||
82 | struct v4l2_ctrl_h264_pps { | |
83 | __u8 pic_parameter_set_id; | |
84 | __u8 seq_parameter_set_id; | |
85 | __u8 num_slice_groups_minus1; | |
86 | __u8 num_ref_idx_l0_default_active_minus1; | |
87 | __u8 num_ref_idx_l1_default_active_minus1; | |
88 | __u8 weighted_bipred_idc; | |
89 | __s8 pic_init_qp_minus26; | |
90 | __s8 pic_init_qs_minus26; | |
91 | __s8 chroma_qp_index_offset; | |
92 | __s8 second_chroma_qp_index_offset; | |
93 | __u16 flags; | |
94 | }; | |
95 | ||
96 | struct v4l2_ctrl_h264_scaling_matrix { | |
97 | __u8 scaling_list_4x4[6][16]; | |
98 | __u8 scaling_list_8x8[6][64]; | |
99 | }; | |
100 | ||
101 | struct v4l2_h264_weight_factors { | |
102 | __s16 luma_weight[32]; | |
103 | __s16 luma_offset[32]; | |
104 | __s16 chroma_weight[32][2]; | |
105 | __s16 chroma_offset[32][2]; | |
106 | }; | |
107 | ||
108 | struct v4l2_h264_pred_weight_table { | |
109 | __u16 luma_log2_weight_denom; | |
110 | __u16 chroma_log2_weight_denom; | |
111 | struct v4l2_h264_weight_factors weight_factors[2]; | |
112 | }; | |
113 | ||
114 | #define V4L2_H264_SLICE_TYPE_P 0 | |
115 | #define V4L2_H264_SLICE_TYPE_B 1 | |
116 | #define V4L2_H264_SLICE_TYPE_I 2 | |
117 | #define V4L2_H264_SLICE_TYPE_SP 3 | |
118 | #define V4L2_H264_SLICE_TYPE_SI 4 | |
119 | ||
120 | #define V4L2_H264_SLICE_FLAG_FIELD_PIC 0x01 | |
121 | #define V4L2_H264_SLICE_FLAG_BOTTOM_FIELD 0x02 | |
122 | #define V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED 0x04 | |
123 | #define V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH 0x08 | |
124 | ||
125 | struct v4l2_ctrl_h264_slice_params { | |
126 | /* Size in bytes, including header */ | |
127 | __u32 size; | |
128 | /* Offset in bits to slice_data() from the beginning of this slice. */ | |
129 | __u32 header_bit_size; | |
130 | ||
131 | __u16 first_mb_in_slice; | |
132 | __u8 slice_type; | |
133 | __u8 pic_parameter_set_id; | |
134 | __u8 colour_plane_id; | |
135 | __u8 redundant_pic_cnt; | |
136 | __u16 frame_num; | |
137 | __u16 idr_pic_id; | |
138 | __u16 pic_order_cnt_lsb; | |
139 | __s32 delta_pic_order_cnt_bottom; | |
140 | __s32 delta_pic_order_cnt0; | |
141 | __s32 delta_pic_order_cnt1; | |
142 | ||
143 | struct v4l2_h264_pred_weight_table pred_weight_table; | |
144 | /* Size in bits of dec_ref_pic_marking() syntax element. */ | |
145 | __u32 dec_ref_pic_marking_bit_size; | |
146 | /* Size in bits of pic order count syntax. */ | |
147 | __u32 pic_order_cnt_bit_size; | |
148 | ||
149 | __u8 cabac_init_idc; | |
150 | __s8 slice_qp_delta; | |
151 | __s8 slice_qs_delta; | |
152 | __u8 disable_deblocking_filter_idc; | |
153 | __s8 slice_alpha_c0_offset_div2; | |
154 | __s8 slice_beta_offset_div2; | |
155 | __u8 num_ref_idx_l0_active_minus1; | |
156 | __u8 num_ref_idx_l1_active_minus1; | |
157 | __u32 slice_group_change_cycle; | |
158 | ||
159 | /* | |
160 | * Entries on each list are indices into | |
161 | * v4l2_ctrl_h264_decode_params.dpb[]. | |
162 | */ | |
163 | __u8 ref_pic_list0[32]; | |
164 | __u8 ref_pic_list1[32]; | |
165 | ||
166 | __u32 flags; | |
167 | }; | |
168 | ||
169 | #define V4L2_H264_DPB_ENTRY_FLAG_VALID 0x01 | |
170 | #define V4L2_H264_DPB_ENTRY_FLAG_ACTIVE 0x02 | |
171 | #define V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM 0x04 | |
172 | ||
173 | struct v4l2_h264_dpb_entry { | |
174 | __u64 reference_ts; | |
175 | __u16 frame_num; | |
176 | __u16 pic_num; | |
177 | /* Note that field is indicated by v4l2_buffer.field */ | |
178 | __s32 top_field_order_cnt; | |
179 | __s32 bottom_field_order_cnt; | |
180 | __u32 flags; /* V4L2_H264_DPB_ENTRY_FLAG_* */ | |
181 | }; | |
182 | ||
183 | #define V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC 0x01 | |
184 | ||
185 | struct v4l2_ctrl_h264_decode_params { | |
186 | struct v4l2_h264_dpb_entry dpb[16]; | |
187 | __u16 num_slices; | |
188 | __u16 nal_ref_idc; | |
189 | __u8 ref_pic_list_p0[32]; | |
190 | __u8 ref_pic_list_b0[32]; | |
191 | __u8 ref_pic_list_b1[32]; | |
192 | __s32 top_field_order_cnt; | |
193 | __s32 bottom_field_order_cnt; | |
194 | __u32 flags; /* V4L2_H264_DECODE_PARAM_FLAG_* */ | |
195 | }; | |
196 | ||
197 | #endif |