• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2009 Younes Manton.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  **************************************************************************/
27 
28 #ifndef PIPE_VIDEO_STATE_H
29 #define PIPE_VIDEO_STATE_H
30 
31 #include "pipe/p_defines.h"
32 #include "pipe/p_format.h"
33 #include "pipe/p_state.h"
34 #include "pipe/p_screen.h"
35 #include "util/u_hash_table.h"
36 #include "util/u_inlines.h"
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 /*
43  * see table 6-12 in the spec
44  */
45 enum pipe_mpeg12_picture_coding_type
46 {
47    PIPE_MPEG12_PICTURE_CODING_TYPE_I = 0x01,
48    PIPE_MPEG12_PICTURE_CODING_TYPE_P = 0x02,
49    PIPE_MPEG12_PICTURE_CODING_TYPE_B = 0x03,
50    PIPE_MPEG12_PICTURE_CODING_TYPE_D = 0x04
51 };
52 
53 /*
54  * see table 6-14 in the spec
55  */
56 enum pipe_mpeg12_picture_structure
57 {
58    PIPE_MPEG12_PICTURE_STRUCTURE_RESERVED = 0x00,
59    PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_TOP = 0x01,
60    PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_BOTTOM = 0x02,
61    PIPE_MPEG12_PICTURE_STRUCTURE_FRAME = 0x03
62 };
63 
64 /*
65  * flags for macroblock_type, see section 6.3.17.1 in the spec
66  */
67 enum pipe_mpeg12_macroblock_type
68 {
69    PIPE_MPEG12_MB_TYPE_QUANT = 0x01,
70    PIPE_MPEG12_MB_TYPE_MOTION_FORWARD = 0x02,
71    PIPE_MPEG12_MB_TYPE_MOTION_BACKWARD = 0x04,
72    PIPE_MPEG12_MB_TYPE_PATTERN = 0x08,
73    PIPE_MPEG12_MB_TYPE_INTRA = 0x10
74 };
75 
76 /*
77  * flags for motion_type, see table 6-17 and 6-18 in the spec
78  */
79 enum pipe_mpeg12_motion_type
80 {
81    PIPE_MPEG12_MO_TYPE_RESERVED = 0x00,
82    PIPE_MPEG12_MO_TYPE_FIELD = 0x01,
83    PIPE_MPEG12_MO_TYPE_FRAME = 0x02,
84    PIPE_MPEG12_MO_TYPE_16x8 = 0x02,
85    PIPE_MPEG12_MO_TYPE_DUAL_PRIME = 0x03
86 };
87 
88 /*
89  * see section 6.3.17.1 and table 6-19 in the spec
90  */
91 enum pipe_mpeg12_dct_type
92 {
93    PIPE_MPEG12_DCT_TYPE_FRAME = 0,
94    PIPE_MPEG12_DCT_TYPE_FIELD = 1
95 };
96 
97 enum pipe_mpeg12_field_select
98 {
99    PIPE_MPEG12_FS_FIRST_FORWARD = 0x01,
100    PIPE_MPEG12_FS_FIRST_BACKWARD = 0x02,
101    PIPE_MPEG12_FS_SECOND_FORWARD = 0x04,
102    PIPE_MPEG12_FS_SECOND_BACKWARD = 0x08
103 };
104 
105 enum pipe_h264_slice_type
106 {
107    PIPE_H264_SLICE_TYPE_P = 0x0,
108    PIPE_H264_SLICE_TYPE_B = 0x1,
109    PIPE_H264_SLICE_TYPE_I = 0x2,
110    PIPE_H264_SLICE_TYPE_SP = 0x3,
111    PIPE_H264_SLICE_TYPE_SI = 0x4
112 };
113 
114 enum pipe_h264_enc_picture_type
115 {
116    PIPE_H264_ENC_PICTURE_TYPE_P = 0x00,
117    PIPE_H264_ENC_PICTURE_TYPE_B = 0x01,
118    PIPE_H264_ENC_PICTURE_TYPE_I = 0x02,
119    PIPE_H264_ENC_PICTURE_TYPE_IDR = 0x03,
120    PIPE_H264_ENC_PICTURE_TYPE_SKIP = 0x04
121 };
122 
123 enum pipe_h264_enc_rate_control_method
124 {
125    PIPE_H264_ENC_RATE_CONTROL_METHOD_DISABLE = 0x00,
126    PIPE_H264_ENC_RATE_CONTROL_METHOD_CONSTANT_SKIP = 0x01,
127    PIPE_H264_ENC_RATE_CONTROL_METHOD_VARIABLE_SKIP = 0x02,
128    PIPE_H264_ENC_RATE_CONTROL_METHOD_CONSTANT = 0x03,
129    PIPE_H264_ENC_RATE_CONTROL_METHOD_VARIABLE = 0x04
130 };
131 
132 struct pipe_picture_desc
133 {
134    enum pipe_video_profile profile;
135    enum pipe_video_entrypoint entry_point;
136 };
137 
138 struct pipe_quant_matrix
139 {
140    enum pipe_video_format codec;
141 };
142 
143 struct pipe_macroblock
144 {
145    enum pipe_video_format codec;
146 };
147 
148 struct pipe_mpeg12_picture_desc
149 {
150    struct pipe_picture_desc base;
151 
152    unsigned picture_coding_type;
153    unsigned picture_structure;
154    unsigned frame_pred_frame_dct;
155    unsigned q_scale_type;
156    unsigned alternate_scan;
157    unsigned intra_vlc_format;
158    unsigned concealment_motion_vectors;
159    unsigned intra_dc_precision;
160    unsigned f_code[2][2];
161    unsigned top_field_first;
162    unsigned full_pel_forward_vector;
163    unsigned full_pel_backward_vector;
164    unsigned num_slices;
165 
166    const uint8_t *intra_matrix;
167    const uint8_t *non_intra_matrix;
168 
169    struct pipe_video_buffer *ref[2];
170 };
171 
172 struct pipe_mpeg12_macroblock
173 {
174    struct pipe_macroblock base;
175 
176    /* see section 6.3.17 in the spec */
177    unsigned short x, y;
178 
179    /* see section 6.3.17.1 in the spec */
180    unsigned char macroblock_type;
181 
182    union {
183       struct {
184          /* see table 6-17 in the spec */
185          unsigned int frame_motion_type:2;
186 
187          /* see table 6-18 in the spec */
188          unsigned int field_motion_type:2;
189 
190          /* see table 6-19 in the spec */
191          unsigned int dct_type:1;
192       } bits;
193       unsigned int value;
194    } macroblock_modes;
195 
196     /* see section 6.3.17.2 in the spec */
197    unsigned char motion_vertical_field_select;
198 
199    /* see Table 7-7 in the spec */
200    short PMV[2][2][2];
201 
202    /* see figure 6.10-12 in the spec */
203    unsigned short coded_block_pattern;
204 
205    /* see figure 6.10-12 in the spec */
206    short *blocks;
207 
208    /* Number of skipped macroblocks after this macroblock */
209    unsigned short num_skipped_macroblocks;
210 };
211 
212 struct pipe_mpeg4_picture_desc
213 {
214    struct pipe_picture_desc base;
215 
216    int32_t trd[2];
217    int32_t trb[2];
218    uint16_t vop_time_increment_resolution;
219    uint8_t vop_coding_type;
220    uint8_t vop_fcode_forward;
221    uint8_t vop_fcode_backward;
222    uint8_t resync_marker_disable;
223    uint8_t interlaced;
224    uint8_t quant_type;
225    uint8_t quarter_sample;
226    uint8_t short_video_header;
227    uint8_t rounding_control;
228    uint8_t alternate_vertical_scan_flag;
229    uint8_t top_field_first;
230 
231    const uint8_t *intra_matrix;
232    const uint8_t *non_intra_matrix;
233 
234    struct pipe_video_buffer *ref[2];
235 };
236 
237 struct pipe_vc1_picture_desc
238 {
239    struct pipe_picture_desc base;
240 
241    uint32_t slice_count;
242    uint8_t picture_type;
243    uint8_t frame_coding_mode;
244    uint8_t postprocflag;
245    uint8_t pulldown;
246    uint8_t interlace;
247    uint8_t tfcntrflag;
248    uint8_t finterpflag;
249    uint8_t psf;
250    uint8_t dquant;
251    uint8_t panscan_flag;
252    uint8_t refdist_flag;
253    uint8_t quantizer;
254    uint8_t extended_mv;
255    uint8_t extended_dmv;
256    uint8_t overlap;
257    uint8_t vstransform;
258    uint8_t loopfilter;
259    uint8_t fastuvmc;
260    uint8_t range_mapy_flag;
261    uint8_t range_mapy;
262    uint8_t range_mapuv_flag;
263    uint8_t range_mapuv;
264    uint8_t multires;
265    uint8_t syncmarker;
266    uint8_t rangered;
267    uint8_t maxbframes;
268    uint8_t deblockEnable;
269    uint8_t pquant;
270 
271    struct pipe_video_buffer *ref[2];
272 };
273 
274 struct pipe_h264_sps
275 {
276    uint8_t  level_idc;
277    uint8_t  chroma_format_idc;
278    uint8_t  separate_colour_plane_flag;
279    uint8_t  bit_depth_luma_minus8;
280    uint8_t  bit_depth_chroma_minus8;
281    uint8_t  seq_scaling_matrix_present_flag;
282    uint8_t  ScalingList4x4[6][16];
283    uint8_t  ScalingList8x8[6][64];
284    uint8_t  log2_max_frame_num_minus4;
285    uint8_t  pic_order_cnt_type;
286    uint8_t  log2_max_pic_order_cnt_lsb_minus4;
287    uint8_t  delta_pic_order_always_zero_flag;
288    int32_t  offset_for_non_ref_pic;
289    int32_t  offset_for_top_to_bottom_field;
290    uint8_t  num_ref_frames_in_pic_order_cnt_cycle;
291    int32_t  offset_for_ref_frame[256];
292    uint8_t  max_num_ref_frames;
293    uint8_t  frame_mbs_only_flag;
294    uint8_t  mb_adaptive_frame_field_flag;
295    uint8_t  direct_8x8_inference_flag;
296 };
297 
298 struct pipe_h264_pps
299 {
300    struct pipe_h264_sps *sps;
301 
302    uint8_t  entropy_coding_mode_flag;
303    uint8_t  bottom_field_pic_order_in_frame_present_flag;
304    uint8_t  num_slice_groups_minus1;
305    uint8_t  slice_group_map_type;
306    uint8_t  slice_group_change_rate_minus1;
307    uint8_t  num_ref_idx_l0_default_active_minus1;
308    uint8_t  num_ref_idx_l1_default_active_minus1;
309    uint8_t  weighted_pred_flag;
310    uint8_t  weighted_bipred_idc;
311    int8_t   pic_init_qp_minus26;
312    int8_t   chroma_qp_index_offset;
313    uint8_t  deblocking_filter_control_present_flag;
314    uint8_t  constrained_intra_pred_flag;
315    uint8_t  redundant_pic_cnt_present_flag;
316    uint8_t  ScalingList4x4[6][16];
317    uint8_t  ScalingList8x8[6][64];
318    uint8_t  transform_8x8_mode_flag;
319    int8_t   second_chroma_qp_index_offset;
320 };
321 
322 struct pipe_h264_picture_desc
323 {
324    struct pipe_picture_desc base;
325 
326    struct pipe_h264_pps *pps;
327 
328    /* slice header */
329    uint32_t frame_num;
330    uint8_t  field_pic_flag;
331    uint8_t  bottom_field_flag;
332    uint8_t  num_ref_idx_l0_active_minus1;
333    uint8_t  num_ref_idx_l1_active_minus1;
334 
335    uint32_t slice_count;
336    int32_t  field_order_cnt[2];
337    bool     is_reference;
338    uint8_t  num_ref_frames;
339 
340    bool     is_long_term[16];
341    bool     top_is_reference[16];
342    bool     bottom_is_reference[16];
343    uint32_t field_order_cnt_list[16][2];
344    uint32_t frame_num_list[16];
345 
346    struct pipe_video_buffer *ref[16];
347 };
348 
349 struct pipe_h264_enc_rate_control
350 {
351    enum pipe_h264_enc_rate_control_method rate_ctrl_method;
352    unsigned target_bitrate;
353    unsigned peak_bitrate;
354    unsigned frame_rate_num;
355    unsigned frame_rate_den;
356    unsigned vbv_buffer_size;
357    unsigned vbv_buf_lv;
358    unsigned target_bits_picture;
359    unsigned peak_bits_picture_integer;
360    unsigned peak_bits_picture_fraction;
361    unsigned fill_data_enable;
362    unsigned enforce_hrd;
363 };
364 
365 struct pipe_h264_enc_motion_estimation
366 {
367    unsigned motion_est_quarter_pixel;
368    unsigned enc_disable_sub_mode;
369    unsigned lsmvert;
370    unsigned enc_en_ime_overw_dis_subm;
371    unsigned enc_ime_overw_dis_subm_no;
372    unsigned enc_ime2_search_range_x;
373    unsigned enc_ime2_search_range_y;
374 };
375 
376 struct pipe_h264_enc_pic_control
377 {
378    unsigned enc_cabac_enable;
379    unsigned enc_constraint_set_flags;
380 };
381 
382 struct pipe_h264_enc_picture_desc
383 {
384    struct pipe_picture_desc base;
385 
386    struct pipe_h264_enc_rate_control rate_ctrl;
387 
388    struct pipe_h264_enc_motion_estimation motion_est;
389    struct pipe_h264_enc_pic_control pic_ctrl;
390 
391    unsigned quant_i_frames;
392    unsigned quant_p_frames;
393    unsigned quant_b_frames;
394 
395    enum pipe_h264_enc_picture_type picture_type;
396    unsigned frame_num;
397    unsigned frame_num_cnt;
398    unsigned p_remain;
399    unsigned i_remain;
400    unsigned idr_pic_id;
401    unsigned gop_cnt;
402    unsigned pic_order_cnt;
403    unsigned pic_order_cnt_type;
404    unsigned ref_idx_l0;
405    unsigned ref_idx_l1;
406    unsigned gop_size;
407    unsigned ref_pic_mode;
408 
409    bool not_referenced;
410    bool enable_vui;
411    struct util_hash_table *frame_idx;
412 
413 };
414 
415 struct pipe_h265_sps
416 {
417    uint8_t chroma_format_idc;
418    uint8_t separate_colour_plane_flag;
419    uint32_t pic_width_in_luma_samples;
420    uint32_t pic_height_in_luma_samples;
421    uint8_t bit_depth_luma_minus8;
422    uint8_t bit_depth_chroma_minus8;
423    uint8_t log2_max_pic_order_cnt_lsb_minus4;
424    uint8_t sps_max_dec_pic_buffering_minus1;
425    uint8_t log2_min_luma_coding_block_size_minus3;
426    uint8_t log2_diff_max_min_luma_coding_block_size;
427    uint8_t log2_min_transform_block_size_minus2;
428    uint8_t log2_diff_max_min_transform_block_size;
429    uint8_t max_transform_hierarchy_depth_inter;
430    uint8_t max_transform_hierarchy_depth_intra;
431    uint8_t scaling_list_enabled_flag;
432    uint8_t ScalingList4x4[6][16];
433    uint8_t ScalingList8x8[6][64];
434    uint8_t ScalingList16x16[6][64];
435    uint8_t ScalingList32x32[2][64];
436    uint8_t ScalingListDCCoeff16x16[6];
437    uint8_t ScalingListDCCoeff32x32[2];
438    uint8_t amp_enabled_flag;
439    uint8_t sample_adaptive_offset_enabled_flag;
440    uint8_t pcm_enabled_flag;
441    uint8_t pcm_sample_bit_depth_luma_minus1;
442    uint8_t pcm_sample_bit_depth_chroma_minus1;
443    uint8_t log2_min_pcm_luma_coding_block_size_minus3;
444    uint8_t log2_diff_max_min_pcm_luma_coding_block_size;
445    uint8_t pcm_loop_filter_disabled_flag;
446    uint8_t num_short_term_ref_pic_sets;
447    uint8_t long_term_ref_pics_present_flag;
448    uint8_t num_long_term_ref_pics_sps;
449    uint8_t sps_temporal_mvp_enabled_flag;
450    uint8_t strong_intra_smoothing_enabled_flag;
451 };
452 
453 struct pipe_h265_pps
454 {
455    struct pipe_h265_sps *sps;
456 
457    uint8_t dependent_slice_segments_enabled_flag;
458    uint8_t output_flag_present_flag;
459    uint8_t num_extra_slice_header_bits;
460    uint8_t sign_data_hiding_enabled_flag;
461    uint8_t cabac_init_present_flag;
462    uint8_t num_ref_idx_l0_default_active_minus1;
463    uint8_t num_ref_idx_l1_default_active_minus1;
464    int8_t init_qp_minus26;
465    uint8_t constrained_intra_pred_flag;
466    uint8_t transform_skip_enabled_flag;
467    uint8_t cu_qp_delta_enabled_flag;
468    uint8_t diff_cu_qp_delta_depth;
469    int8_t pps_cb_qp_offset;
470    int8_t pps_cr_qp_offset;
471    uint8_t pps_slice_chroma_qp_offsets_present_flag;
472    uint8_t weighted_pred_flag;
473    uint8_t weighted_bipred_flag;
474    uint8_t transquant_bypass_enabled_flag;
475    uint8_t tiles_enabled_flag;
476    uint8_t entropy_coding_sync_enabled_flag;
477    uint8_t num_tile_columns_minus1;
478    uint8_t num_tile_rows_minus1;
479    uint8_t uniform_spacing_flag;
480    uint16_t column_width_minus1[20];
481    uint16_t row_height_minus1[22];
482    uint8_t loop_filter_across_tiles_enabled_flag;
483    uint8_t pps_loop_filter_across_slices_enabled_flag;
484    uint8_t deblocking_filter_control_present_flag;
485    uint8_t deblocking_filter_override_enabled_flag;
486    uint8_t pps_deblocking_filter_disabled_flag;
487    int8_t pps_beta_offset_div2;
488    int8_t pps_tc_offset_div2;
489    uint8_t lists_modification_present_flag;
490    uint8_t log2_parallel_merge_level_minus2;
491    uint8_t slice_segment_header_extension_present_flag;
492 };
493 
494 struct pipe_h265_picture_desc
495 {
496    struct pipe_picture_desc base;
497 
498    struct pipe_h265_pps *pps;
499 
500    uint8_t IDRPicFlag;
501    uint8_t RAPPicFlag;
502    uint8_t CurrRpsIdx;
503    uint32_t NumPocTotalCurr;
504    uint32_t NumDeltaPocsOfRefRpsIdx;
505    uint32_t NumShortTermPictureSliceHeaderBits;
506    uint32_t NumLongTermPictureSliceHeaderBits;
507 
508    int32_t CurrPicOrderCntVal;
509    struct pipe_video_buffer *ref[16];
510    int32_t PicOrderCntVal[16];
511    uint8_t IsLongTerm[16];
512    uint8_t NumPocStCurrBefore;
513    uint8_t NumPocStCurrAfter;
514    uint8_t NumPocLtCurr;
515    uint8_t RefPicSetStCurrBefore[8];
516    uint8_t RefPicSetStCurrAfter[8];
517    uint8_t RefPicSetLtCurr[8];
518    uint8_t RefPicList[2][15];
519    bool UseRefPicList;
520 };
521 
522 struct pipe_mjpeg_picture_desc
523 {
524    struct pipe_picture_desc base;
525 
526    struct
527    {
528       uint16_t picture_width;
529       uint16_t picture_height;
530 
531       struct {
532          uint8_t component_id;
533          uint8_t h_sampling_factor;
534          uint8_t v_sampling_factor;
535          uint8_t quantiser_table_selector;
536       } components[255];
537 
538       uint8_t num_components;
539    } picture_parameter;
540 
541    struct
542    {
543       uint8_t load_quantiser_table[4];
544       uint8_t quantiser_table[4][64];
545    } quantization_table;
546 
547    struct
548    {
549       uint8_t load_huffman_table[2];
550 
551       struct {
552          uint8_t   num_dc_codes[16];
553          uint8_t   dc_values[12];
554          uint8_t   num_ac_codes[16];
555          uint8_t   ac_values[162];
556          uint8_t   pad[2];
557       } table[2];
558    } huffman_table;
559 
560    struct
561    {
562       unsigned slice_data_size;
563       unsigned slice_data_offset;
564       unsigned slice_data_flag;
565       unsigned slice_horizontal_position;
566       unsigned slice_vertical_position;
567 
568       struct {
569          uint8_t component_selector;
570          uint8_t dc_table_selector;
571          uint8_t ac_table_selector;
572       } components[4];
573 
574       uint8_t num_components;
575 
576       uint16_t restart_interval;
577       unsigned num_mcus;
578    } slice_parameter;
579 };
580 
581 #ifdef __cplusplus
582 }
583 #endif
584 
585 #endif /* PIPE_VIDEO_STATE_H */
586