1 /******************************************************************************
2 *
3 * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18 
19 /**
20  *******************************************************************************
21  * @file
22  *  ihevc_structs.h
23  *
24  * @brief
25  *  Structure definitions used in the code
26  *
27  * @author
28  *  Ittiam
29  *
30  * @par List of Functions:
31  *
32  * @remarks
33  *  None
34  *
35  *******************************************************************************
36  */
37 
38 #ifndef _IHEVC_STRUCTS_H_
39 #define _IHEVC_STRUCTS_H_
40 
41 
42 /**
43  * Buffering Period SEI parameters Info
44  */
45 typedef struct
46 {
47     /**
48      * specifies SPS Id active for the coded picture assosiated
49      * with the bp message.
50      */
51     UWORD8  u1_bp_seq_parameter_set_id;
52 
53     /**
54      * Derived from Hrd parameters
55      */
56     UWORD8  u1_sub_pic_cpb_params_present_flag;
57 
58     /**
59      * specifies the presence of the initial_alt_cpb_removal_delay[ i ]
60      * and initial_alt_cpb_removal_offset[ i ] syntax elements
61      */
62     UWORD8  u1_rap_cpb_params_present_flag;
63 
64     /**
65      * cbp removal delay used in buffering period SEI
66      */
67     UWORD32 u4_cpb_delay_offset;
68 
69     /**
70      * dbp removal delay used in buffering period SEI
71      */
72     UWORD32 u4_dpb_delay_offset;
73 
74     /**
75      * concatanation flag
76      */
77     UWORD8 u1_concatenation_flag;
78 
79     /**
80      * delata cbp removal delay
81      */
82     UWORD32 u4_au_cpb_removal_delay_delta_minus1;
83 
84     /**
85      * specify the default initial CPB removal delays, respectively,
86      * for the CPB when the NAL HRD parameters are in use
87      */
88     UWORD32 au4_nal_initial_cpb_removal_delay[MAX_CPB_CNT];
89 
90     /**
91      * specify the alternate initial CPB removal delays, respectively,
92      * for the CPB when the NAL HRD parameters are in use
93      */
94     UWORD32 au4_nal_initial_alt_cpb_removal_delay[MAX_CPB_CNT];
95 
96     /**
97      * specify the initial CPB removal delay offset, respectively,
98      * for the CPB when the NAL HRD parameters are in use
99      */
100     UWORD32 au4_nal_initial_cpb_removal_delay_offset[MAX_CPB_CNT];
101 
102     /**
103      * specify the alternate initial CPB removal delays offsets, respectively,
104      * for the CPB when the NAL HRD parameters are in use
105      */
106     UWORD32 au4_nal_initial_alt_cpb_removal_delay_offset[MAX_CPB_CNT];
107 
108     /**
109      * specify the default initial CPB removal delays, respectively,
110      * for the CPB when the VCL HRD parameters are in use
111      */
112     UWORD32 au4_vcl_initial_cpb_removal_delay[MAX_CPB_CNT];
113 
114     /**
115      * specify the initial alt CPB removal delays , respectively,
116      * for the CPB when the VCL HRD parameters are in use
117      */
118     UWORD32 au4_vcl_initial_alt_cpb_removal_delay[MAX_CPB_CNT];
119 
120     /**
121      * specify the initial CPB removal delay offset, respectively,
122      * for the CPB when the VCL HRD parameters are in use
123      */
124     UWORD32 au4_vcl_initial_cpb_removal_delay_offset[MAX_CPB_CNT];
125 
126     /**
127      * specify the alternate initial CPB removal delays offsets, respectively,
128      * for the CPB when the VCL HRD parameters are in use
129      */
130     UWORD32 au4_vcl_initial_alt_cpb_removal_delay_offset[MAX_CPB_CNT];
131 
132     /**
133      * Inital CPB removal delay
134      */
135     UWORD32 u4_initial_cpb_removal_delay_length;
136 
137     /**
138      * CPB cnt for corr. sublayer
139      */
140     UWORD32 u4_cpb_cnt;
141 
142 
143     /**
144      * VBV buffer size used in buffering period SEI
145      */
146     UWORD32 u4_buffer_size_sei;
147 
148     /**
149      * Encoder buffer fullness  used in buffering period SEI
150      */
151     UWORD32 u4_dbf_sei;
152 
153     /**
154      * target bitrate used in buffering period SEI
155      */
156     UWORD32 u4_target_bit_rate_sei;
157 
158 }buf_period_sei_params_t;
159 
160 
161 /**
162  * Picture Timing SEI parameters Info
163  */
164 typedef struct
165 {
166     /**
167      * derived from vui parameters
168      */
169     UWORD8 u1_frame_field_info_present_flag;
170 
171     /**
172      * indicates whether a picture should be displayed as a
173      * frame or as one or more fields
174      */
175     UWORD32 u4_pic_struct;
176 
177     UWORD32 u4_source_scan_type;
178 
179     /**
180      * if 1, indicates if the current pic is a duplicte pic in output order
181      */
182     UWORD8 u1_duplicate_flag;
183 
184     /**
185      * specifies the number clock ticks between the nominal CPB removal time
186      * au associated with the pt SEI message and
187      * the preceding au in decoding order that contained a bp SEI message
188      */
189     UWORD32 u4_au_cpb_removal_delay_minus1;
190 
191     /**
192      * compute the DPB output time of the picture
193      */
194     UWORD32 u4_pic_dpb_output_delay;
195 
196     UWORD32 u4_pic_dpb_output_du_delay;
197 
198     /**
199      * specifies the number of decoding units in the access unit
200      * the picture timing SEI message is associated with
201      */
202     UWORD32 u4_num_decoding_units_minus1;
203 
204     /**
205      * if 1 specifies that the du_common_cpb_removal_delay_increment_minus1 is present
206      */
207     UWORD8 u1_du_common_cpb_removal_delay_flag;
208 
209     /**
210      * specifies the duration, in units of clock sub-ticks,
211      * between the nominal CPB removal times of any two consecutive decoding units
212      * in decoding order in the access unit associated with the pt_SEI message
213      */
214     UWORD32 u4_du_common_cpb_removal_delay_increment_minus1; //same as u4_du_cpb_removal_delay_increment_minus1
215 
216     /**
217      * specifies the number of NAL units in the decoding unit of the access unit
218      * the picture timing SEI message is associated with.
219      * range from 0 to (pic size in ctby - 1)
220      */
221     UWORD32 au4_num_nalus_in_du_minus1[4320 / MIN_CTB_SIZE];
222 
223     /**
224      * specifies the duration, in units of clock sub-ticks,
225      * between the nominal CPB removal times of the ( i + 1 )-th decoding unit and the i-th decoding unit,
226      * in decoding order, in the access unit associated with the pt_SEI message
227      */
228     UWORD32 au4_du_cpb_removal_delay_increment_minus1[4320 / MIN_CTB_SIZE];
229 
230 }pic_timing_sei_params_t;
231 
232 /**
233  * Structure to hold Recovery point SEI parameters Info
234  */
235 typedef struct
236 {
237     /**
238      * specifies the recovery point of output pictures in output order
239      */
240     WORD32 i4_recovery_poc_cnt;
241 
242     UWORD8 u1_exact_match_flag;
243 
244     /**
245      * indicates the presence or absence of a broken link in the NAL unit
246      * stream at the location of the recovery point SEI message
247      */
248 
249     UWORD8 u1_broken_link_flag;
250 
251 }recovery_point_sei_params_t;
252 
253 /**
254  * Structure to hold Mastering Display Colour Volume SEI
255  */
256 typedef struct
257 {
258     /**
259      * Array to store the display_primaries_x values
260      */
261     UWORD16 au2_display_primaries_x[3];
262 
263     /**
264      * Array to store the display_primaries_y values
265      */
266     UWORD16 au2_display_primaries_y[3];
267 
268     /**
269      * Variable to store the white point x value
270      */
271     UWORD16 u2_white_point_x;
272 
273     /**
274      * Variable to store the white point y value
275      */
276     UWORD16 u2_white_point_y;
277 
278     /**
279      * Variable to store the max display mastering luminance value
280      */
281     UWORD32 u4_max_display_mastering_luminance;
282 
283     /**
284      * Variable to store the min display mastering luminance value
285      */
286     UWORD32 u4_min_display_mastering_luminance;
287 
288 }mastering_dis_col_vol_sei_params_t;
289 
290 /**
291  * Structure to hold active parameter parameter set SEI parameters Info
292  */
293 typedef struct
294 {
295     /*
296     * active vps id
297     */
298 
299     UWORD8 u1_active_video_parameter_set_id;
300 
301     /*
302      * default set to zero.
303      */
304     UWORD8 u1_self_contained_cvs_flag;
305 
306     UWORD8 u1_no_parameter_set_update_flag;
307 
308     UWORD8 u1_num_sps_ids_minus1;
309 
310     /*
311      * active sps id
312      */
313     UWORD8 au1_active_seq_parameter_set_id[15];
314 
315     UWORD32 au4_layer_sps_idx[64];
316 
317 }active_parameter_set_sei_param_t;
318 
319 /**
320  * Structure to hold SEI Hash values
321  */
322 typedef struct
323 {
324     /*
325      * SEI Hash values for each color component
326      */
327     UWORD8 au1_sei_hash[3][16];
328 
329 }hash_sei_param_t;
330 
331 /**
332  * Structure to hold user data registered SEI param Info
333  */
334 typedef struct
335 {
336     /**
337      * Contains country code by Annex A of Recommendation ITU-T T.35
338      */
339     UWORD8 u1_itu_t_t35_country_code;
340 
341     /**
342      * Contains country code by Annex B of Recommendation ITU-T T.35
343      */
344     UWORD8 u1_itu_t_t35_country_code_extension_byte;
345 
346     /**
347      * Contains data registered as specified in Recommendation ITU-T T.35
348      */
349     UWORD8 u1_itu_t_t35_payload_byte[MAX_USERDATA_PAYLOAD];
350 
351     /**
352      * Valid payload size present in this buffer
353      */
354     WORD32 i4_valid_payload_size;
355 
356     /**
357      * Total payload size incase payloadSize > IHEVCD_MAX_USERDATA_PAYLOAD
358      */
359     WORD32 i4_payload_size;
360 }user_data_registered_itu_t_t35_t;
361 
362 /**
363  * Structure to hold time code SEI param info
364  */
365 typedef struct
366 {
367     /**
368      * Number of sets of clock timestamp syntax elements present for the current picture
369      */
370     UWORD8 u1_num_clock_ts;
371 
372     /**
373      * Indicates presenc of associated set of clock timestamps
374      */
375     UWORD8 au1_clock_timestamp_flag[MAX_NUM_CLOCK_TS];
376 
377     /**
378      * Used in calculating clockTimestamp[i]
379      */
380     UWORD8 au1_units_field_based_flag[MAX_NUM_CLOCK_TS];
381 
382     /**
383      * Specifies the method of dropping values of the n_frames[i] syntax element
384      */
385     UWORD8 au1_counting_type[MAX_NUM_CLOCK_TS];
386 
387     /**
388      * Specifies that the n_frames[i] syntax element is followed by seconds_value[i],
389      * minutes_value[i] and hours_value[i]
390      */
391     UWORD8 au1_full_timestamp_flag[MAX_NUM_CLOCK_TS];
392 
393     /**
394      * Indicates the discontinuity in clockTimestamp
395      */
396     UWORD8 au1_discontinuity_flag[MAX_NUM_CLOCK_TS];
397 
398     /**
399      * Specifies the skipping of one or more values of n_frames[i]
400      */
401     UWORD8 au1_cnt_dropped_flag[MAX_NUM_CLOCK_TS];
402 
403     /**
404      * Specifies the value of nFrames used to compute clockTimestamp[i]
405      */
406     UWORD16 au2_n_frames[MAX_NUM_CLOCK_TS];
407 
408     /**
409      * Specifies the presence of seconds_value[i] and minutes_flag[i]
410      */
411     UWORD8 au1_seconds_flag[MAX_NUM_CLOCK_TS];
412 
413     /**
414      * Specifies the presence of minutes_value[i] and hours_flag[i]
415      */
416     UWORD8 au1_minutes_flag[MAX_NUM_CLOCK_TS];
417 
418     /**
419      * Specifies the presence of hours_value[i]
420      */
421     UWORD8 au1_hours_flag[MAX_NUM_CLOCK_TS];
422 
423     /**
424      * Specifies the value of sS used to compute clockTimestamp[i]
425      */
426     UWORD8 au1_seconds_value[MAX_NUM_CLOCK_TS];
427 
428     /**
429      * Specifies the value of mM used to compute clockTimestamp[i]
430      */
431     UWORD8 au1_minutes_value[MAX_NUM_CLOCK_TS];
432 
433     /**
434      * Specifies the value of hH used to compute clockTimestamp[i]
435      */
436     UWORD8 au1_hours_value[MAX_NUM_CLOCK_TS];
437 
438     /**
439      * Specifies the length in bits of the time_offset_value[i]
440      */
441     UWORD8 au1_time_offset_length[MAX_NUM_CLOCK_TS];
442 
443     /**
444      * pecifies the value of tOffset used to compute clockTimestamp[i]
445      */
446     UWORD8 au1_time_offset_value[MAX_NUM_CLOCK_TS];
447 
448 }time_code_t;
449 
450 
451 /**
452  * Structure to hold SEI parameters Info
453  */
454 typedef struct
455 {
456 
457     WORD8 i1_sei_parameters_present_flag;
458 
459     WORD8 i1_aud_present_flag;
460 
461     WORD8 i1_buf_period_params_present_flag;
462 
463     WORD8 i1_pic_timing_params_present_flag;
464 
465     WORD8 i1_recovery_point_params_present_flag;
466 
467     WORD8 i1_active_parameter_set;
468 
469     WORD8 i4_sei_mastering_disp_colour_vol_params_present_flags;
470 
471     /* Enable/Disable SEI Hash on the Decoded picture & Hash type */
472     /* < 3 : Checksum, 2 : CRC, 1 : MD5, 0 : disable >            */
473     /* Other values are not supported                             */
474     WORD8 i1_decoded_pic_hash_sei_flag;
475 
476     /* number of user data e.g. CC data, BAR data, AFD data etc */
477     WORD32 i4_sei_user_data_cnt;
478 
479     WORD8 i1_user_data_registered_present_flag;
480 
481     WORD8 i1_time_code_present_flag;
482 
483     buf_period_sei_params_t  s_buf_period_sei_params;
484 
485     pic_timing_sei_params_t  s_pic_timing_sei_params;
486 
487     recovery_point_sei_params_t s_recovery_point_params;
488 
489     active_parameter_set_sei_param_t s_active_parameter_set_sei_params;
490 
491     hash_sei_param_t    s_hash_sei_params;
492 
493     mastering_dis_col_vol_sei_params_t s_mastering_dis_col_vol_sei_params;
494 
495     user_data_registered_itu_t_t35_t as_user_data_registered_itu_t_t35[USER_DATA_MAX];
496 
497     time_code_t s_time_code;
498 } sei_params_t;
499 
500 
501 /**
502  * Sub-layer HRD parameters Info
503  */
504 typedef struct
505 {
506     /**
507      * (together with bit_rate_scale) specifies the
508      * maximum input bit rate for the i-th CPB
509      */
510     UWORD32 au4_bit_rate_value_minus1[MAX_CPB_CNT];
511     /**
512      * together with cpb_size_scale to specify the
513      * CPB size when the CPB operates at the access unit level.
514      */
515     UWORD32 au4_cpb_size_value_minus1[MAX_CPB_CNT];
516 
517     /**
518      * together with cpb_size_du_scale to specify the CPB size
519      * when the CPB operates at sub-picture level
520      */
521     UWORD32 au4_cpb_size_du_value_minus1[MAX_CPB_CNT];
522 
523     /**
524      * specifies the maximum input bit rate for the i-th CPB when the CPB
525      * operates at the sub-picture level. bit_rate_du_value_minus1[ i ]
526      * shall be in the range of 0 to 2^32 - 2
527      */
528     UWORD32 au4_bit_rate_du_value_minus1[MAX_CPB_CNT];
529 
530     /**
531      * if 1, specifies that the HSS operates in a constant bit rate (CBR) mode
532      * if 0, specifies that the HSS operates in a intermittent bit rate (CBR) mode
533      */
534     UWORD8  au1_cbr_flag[32];
535 
536 }sub_lyr_hrd_params_t;
537 
538 /**
539  * HRD parameters Info
540  */
541 typedef struct
542 {
543     /**
544      * Indicates the presence of the
545      * num_units_in_ticks, time_scale flag
546      */
547     UWORD8 u1_timing_info_present_flag;
548 
549     /**
550      * Number of units that
551      * correspond to one increment of the
552      * clock. Indicates the  resolution
553      */
554     UWORD32 u4_num_units_in_tick;
555 
556     /**
557      * The number of time units that pass in one second
558      */
559     UWORD32 u4_time_scale;
560 
561     /**
562      * Nal- hrd parameters flag
563      */
564     UWORD8 u1_nal_hrd_parameters_present_flag;
565 
566     /**
567      * VCL- hrd parameters flag
568      */
569     UWORD8 u1_vcl_hrd_parameters_present_flag;
570 
571     /**
572      * Indicates the presence of NAL-HRD params or VCL_HRD params
573      * in the bitstream
574      */
575     UWORD8 u1_cpbdpb_delays_present_flag;
576 
577     /**
578      * specifies that sub-picture level CPB removal delay parameters are
579      * present in picture timing SEI messages
580      */
581     UWORD8 u1_sub_pic_cpb_params_present_flag;
582 
583     /**
584      * specify the clock sub-tick
585      * (the minimum interval of time that can be represented in the coded data when sub_pic_cpb_params_present_flag is equal to 1)
586      */
587     UWORD8 u1_tick_divisor_minus2;
588 
589     /**
590      * specifies the length, in bits for the du cpb delay syntax in pt_sei
591      */
592     UWORD8 u1_du_cpb_removal_delay_increment_length_minus1;
593 
594     /**
595      * Indicates presence of sub_pic_cpb_params in pic timing sei
596      */
597     UWORD8 u1_sub_pic_cpb_params_in_pic_timing_sei_flag;
598 
599     /**
600      * specifies the length, in bits, of the pic_dpb_output_du_delay syntax
601      * element in the picture timing SEI message and the
602      * pic_spt_dpb_output_du_delay syntax element in the decoding unit
603      * information SEI message
604      */
605     UWORD8 u1_dpb_output_delay_du_length_minus1;
606 
607     /**
608      * (together with bit_rate_value_minus1) specifies the
609      * maximum input bit rate of the i-th CPB
610      */
611     UWORD32 u4_bit_rate_scale;
612 
613     /**
614      * (together with cpb_size_du_value_minus1) specfies
615      * CPB size of the i-th CPB when the CPB operates
616      * at the access unit level
617      */
618     UWORD32 u4_cpb_size_scale;
619 
620     /**
621      * (together with cpb_size_du_value_minus1) specfies
622      * CPB size of the i-th CPB when the CPB operates
623      * at the sub-picture level
624      */
625     UWORD32 u4_cpb_size_du_scale;
626 
627 
628     /**
629      * specifies the length, in bits for initial cpb delay (nal/vcl)sysntax in bp sei
630      */
631     UWORD8  u1_initial_cpb_removal_delay_length_minus1;
632 
633     /**
634      * specifies the length, in bits for the au cpb delay syntax in pt_sei
635      */
636     UWORD8  u1_au_cpb_removal_delay_length_minus1;
637 
638     /**
639      * specifies the length, in bits, of the pic_dpb_output_delay syntax element in the pt SEI message
640      */
641     UWORD8  u1_dpb_output_delay_length_minus1;
642 
643     /**
644      * if 1, , for the highest temporal sub-layers, the temporal distance between the HRD output times
645      * of consecutive pictures in output order is constrained refer to Table E-6
646      */
647     UWORD8 au1_fixed_pic_rate_general_flag[6];
648 
649     UWORD8 au1_fixed_pic_rate_within_cvs_flag[6];
650 
651     /**
652      * if 1, , for the highest temporal sub-layers, the temporal distance (in clock ticks) between the
653      * element units that specify HRD output times of consecutive pictures in output order is constrained
654      * refer to Table E-6
655      */
656     UWORD8 au1_elemental_duration_in_tc_minus1[6];
657 
658     /**
659      * specifies the HRD operational mode
660      */
661     UWORD8 au1_low_delay_hrd_flag[6];
662 
663     /**
664      * 1 specifies the number of alternative CPB specifications in the
665      * bitstream of the cvs when HighestTid is equal to i
666      */
667     UWORD8 au1_cpb_cnt_minus1[6];
668 
669 
670     /**
671      * VUI level Sub-layer HRD parameters
672      */
673     sub_lyr_hrd_params_t as_sub_layer_hrd_params[6];
674 
675 }hrd_params_t;
676 
677 /**
678  * Structure to hold VUI parameters Info
679  */
680 typedef struct
681 {
682     /**
683      * indicates the presence of aspect_ratio
684      */
685     UWORD8 u1_aspect_ratio_info_present_flag;
686 
687     /**
688      * specifies the aspect ratio of the luma samples
689      */
690     UWORD8 u1_aspect_ratio_idc;
691 
692     /**
693      *  width of the luma samples. user dependent
694      */
695     UWORD16 u2_sar_width;
696 
697     /**
698      *  hieght of the luma samples. user dependent
699      */
700     UWORD16 u2_sar_height;
701 
702     /**
703      * if 1, specifies that the overscan_appropriate_flag is present
704      * if 0, the preferred display method for the video signal is unspecified
705      */
706     UWORD8 u1_overscan_info_present_flag;
707 
708     /**
709      * if 1,indicates that the cropped decoded pictures output
710      * are suitable for display using overscan
711      */
712     UWORD8 u1_overscan_appropriate_flag;
713 
714     /**
715      * if 1 specifies that video_format, video_full_range_flag and
716      * colour_description_present_flag are present
717      */
718     UWORD8 u1_video_signal_type_present_flag;
719 
720     /**
721      *
722      */
723     UWORD8 u1_video_format;
724 
725     /**
726      * indicates the black level and range of the luma and chroma signals
727      */
728     UWORD8 u1_video_full_range_flag;
729 
730     /**
731      * if 1,to 1 specifies that colour_primaries, transfer_characteristics
732      * and matrix_coefficients are present
733      */
734     UWORD8 u1_colour_description_present_flag;
735 
736     /**
737      * indicates the chromaticity coordinates of the source primaries
738      */
739     UWORD8 u1_colour_primaries;
740 
741     /**
742      * indicates the opto-electronic transfer characteristic of the source picture
743      */
744     UWORD8 u1_transfer_characteristics;
745 
746     /**
747      * the matrix coefficients used in deriving luma and chroma signals
748      * from the green, blue, and red primaries
749      */
750     UWORD8 u1_matrix_coefficients;
751 
752     /**
753      * if 1, specifies that chroma_sample_loc_type_top_field and
754      * chroma_sample_loc_type_bottom_field are present
755      */
756     UWORD8 u1_chroma_loc_info_present_flag;
757 
758     /**
759      * location of chroma samples
760      */
761     UWORD8 u1_chroma_sample_loc_type_top_field;
762 
763     UWORD8 u1_chroma_sample_loc_type_bottom_field;
764 
765     /**
766      * if 1, indicates that the value of all decoded chroma samples is
767      * equal to 1 << ( BitDepthC - 1 )
768      */
769     UWORD8 u1_neutral_chroma_indication_flag;
770 
771     /**
772      * 1 indicates that the coded video sequence conveys pictures that represent fields
773      * 0 indicates the pictures that represents field
774      */
775     UWORD8 u1_field_seq_flag;
776 
777     /**
778      * specifies that picture timing SEI messages are present for every picture
779      */
780     UWORD8 u1_frame_field_info_present_flag;
781 
782     /**
783      * 1 indicates that the default display window parameters follow next in the VUI
784      */
785     UWORD8 u1_default_display_window_flag;
786 
787     /**
788      * specify the samples of the pictures in the coded video sequence
789      * that are within the default display window,
790      * in terms of a rectangular region specified in picture coordinates for display
791      */
792     UWORD32 u4_def_disp_win_left_offset;
793 
794     UWORD32 u4_def_disp_win_right_offset;
795 
796     UWORD32 u4_def_disp_win_top_offset;
797 
798     UWORD32 u4_def_disp_win_bottom_offset;
799 
800     /**
801      * to 1 specifies that the syntax structure hrd_parameters is present in the vui_parameters syntax structue
802      */
803     UWORD8 u1_vui_hrd_parameters_present_flag;
804 
805     /**
806      * VUI level HRD parameters
807      */
808     hrd_params_t s_vui_hrd_parameters;
809 
810     /**
811      * Indicates the presence of the
812      * num_units_in_ticks, time_scale flag
813      */
814     UWORD8 u1_vui_timing_info_present_flag;
815 
816     /**
817      * Number of units that
818      * correspond to one increment of the
819      * clock. Indicates the  resolution
820      */
821     UWORD32 u4_vui_num_units_in_tick;
822 
823     /**
824      * The number of time units that pass in one second
825      */
826     UWORD32 u4_vui_time_scale;
827     /**
828      * if 1, indicates that the POC for each picture in the coded video sequence (cvs) (not the first picture), in decoding order,
829      * is proportional to the output time of the picture relative to that of the first picture in the cvs
830      */
831     UWORD8 u1_poc_proportional_to_timing_flag;
832 
833     /**
834      * num_ticks_poc_diff_one_minus1 plus 1 specifies the number of clock ticks
835      * corresponding to a difference of poc values equal to 1
836      */
837     UWORD8 u1_num_ticks_poc_diff_one_minus1;
838 
839     /**
840      * 1, specifies that the following cvs bitstream restriction parameters are present
841      */
842     UWORD8 u1_bitstream_restriction_flag;
843 
844     /**
845      *  if 1, indicates that each pps that is active in the cvs has
846      *  the same value of the tile syntax elements
847      */
848     UWORD8 u1_tiles_fixed_structure_flag;
849 
850     /**
851      * if 0, indicates that no pel outside the pic boundaries and
852      * no sub-pels derived using pels outside the pic boundaries is used for inter prediction
853      */
854     UWORD8 u1_motion_vectors_over_pic_boundaries_flag;
855 
856     /**
857      * if 1, indicates
858      * all P/B slices belonging to the same pic have an identical refpic list0,
859      * all B slices that belong to the same picture have an identical refpic list1.
860      */
861     UWORD8 u1_restricted_ref_pic_lists_flag;
862 
863     /**
864      * min_spatial_segmentation_idc, when not equal to 0, establishes a bound on the maximum possible size of distinct
865      * coded spatial segmentation regions in the pictures of the CVS. When min_spatial_segmentation_idc is not present, it is
866      * inferred to be equal to 0. The value of min_spatial_segmentation_idc shall be in the range of 0 to 4095, inclusive.
867      *
868      * can be used by a decoder to calculate the maximum number of luma samples to be processed by one processing thread
869      *
870      * If tiles=0 and entropy_sync=0 then
871      *     no slice shall exceed ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4 luma samples
872      *
873      * If tiles=1 and entropy_sync=0 then
874      *     no tile shall exceed ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4 luma samples
875      *
876      * If tiles=0 and entropy_sync=1 then
877      *     ( 2 * pic_height_in_luma_samples + pic_width_in_luma_samples ) * CtbSizeY
878      *             <= ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4
879      */
880     UWORD32 u4_min_spatial_segmentation_idc;
881     /**
882      * Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units
883      * associated with any coded picture
884      */
885     UWORD8 u1_max_bytes_per_pic_denom;
886 
887     /**
888      * Indicates an upper bound for the number of bits of coding_unit() data
889      */
890     UWORD8 u1_max_bits_per_mincu_denom;
891 
892     /**
893      * Indicate the maximum absolute value of a decoded horizontal MV component
894      * in quarter-pel luma units
895      */
896     UWORD8 u1_log2_max_mv_length_horizontal;
897 
898     /**
899      * Indicate the maximum absolute value of a decoded vertical MV component
900      * in quarter-pel luma units
901      */
902     UWORD8 u1_log2_max_mv_length_vertical;
903 }vui_t;
904 
905 /**
906  * Picture buffer
907  */
908 typedef struct
909 {
910     UWORD8 *pu1_luma;
911     UWORD8 *pu1_chroma;
912 
913     WORD32 i4_abs_poc;
914     WORD32 i4_poc_lsb;
915     /** Used to store display Timestamp for current buffer */
916     WORD32 u4_ts;
917     UWORD8 u1_used_as_ref;
918 
919     UWORD8 u1_free_delay_cnt;
920 
921     /**
922      * buffer ID from buffer manager
923      */
924     UWORD8 u1_buf_id;
925 
926 
927     // See IV_FLD_TYPE_T for all field types
928     UWORD32 e4_fld_type;
929 
930     sei_params_t s_sei_params;
931 
932     WORD32 i4_vui_present;
933 
934     vui_t s_vui;
935 
936 }pic_buf_t;
937 
938 
939 /**
940  * Reference List
941  */
942 typedef struct
943 {
944     void *pv_pic_buf;
945 
946     void *pv_mv_buf;
947 
948     UWORD8 u1_used_as_ref;
949 
950 }ref_list_t;
951 
952 
953 /**
954  * SAO
955  */
956 typedef struct
957 {
958     /**
959      * sao_type_idx_luma
960      */
961     UWORD32      b3_y_type_idx   : 3;
962 
963     /**
964      * luma SaoOffsetVal[1]
965      */
966     WORD32      b4_y_offset_1   : 4;
967 
968     /**
969      * luma SaoOffsetVal[2]
970      */
971     WORD32      b4_y_offset_2   : 4;
972 
973     /**
974      * luma SaoOffsetVal[3]
975      */
976     WORD32      b4_y_offset_3   : 4;
977 
978     /**
979      * luma SaoOffsetVal[4]
980      */
981     WORD32      b4_y_offset_4   : 4;
982 
983     /**
984      * luma sao_band_position
985      */
986     UWORD32      b5_y_band_pos   : 5;
987 
988     WORD32                      : 0;
989 
990     /**
991      * sao_type_idx_chroma
992      */
993     UWORD32      b3_cb_type_idx  : 3;
994 
995     /**
996      * chroma SaoOffsetVal[1]
997      */
998     WORD32      b4_cb_offset_1  : 4;
999 
1000     /**
1001      * chroma SaoOffsetVal[2]
1002      */
1003     WORD32      b4_cb_offset_2  : 4;
1004 
1005     /**
1006      * chroma SaoOffsetVal[3]
1007      */
1008     WORD32      b4_cb_offset_3  : 4;
1009 
1010     /**
1011      * chroma SaoOffsetVal[4]
1012      */
1013     WORD32      b4_cb_offset_4  : 4;
1014 
1015     /**
1016      * cb sao_band_position
1017      */
1018     UWORD32      b5_cb_band_pos  : 5;
1019 
1020     WORD32                      : 0;
1021 
1022     /**
1023      * sao_type_idx_chroma
1024      */
1025     UWORD32      b3_cr_type_idx  : 3;
1026 
1027     /**
1028      * chroma SaoOffsetVal[1]
1029      */
1030     WORD32      b4_cr_offset_1  : 4;
1031 
1032     /**
1033      * chroma SaoOffsetVal[2]
1034      */
1035     WORD32      b4_cr_offset_2  : 4;
1036 
1037     /**
1038      * chroma SaoOffsetVal[3]
1039      */
1040     WORD32      b4_cr_offset_3  : 4;
1041 
1042     /**
1043      * chroma SaoOffsetVal[4]
1044      */
1045     WORD32      b4_cr_offset_4  : 4;
1046 
1047     /**
1048      * cr sao_band_position
1049      */
1050     UWORD32      b5_cr_band_pos  : 5;
1051 
1052     WORD32                      : 0;
1053 
1054 }sao_t;
1055 
1056 /**
1057  * SAO
1058  */
1059 typedef struct
1060 {
1061     /**
1062      * sao_type_idx_luma
1063      */
1064     UWORD32      b3_y_type_idx   : 3;
1065 
1066     /**
1067      * luma SaoOffsetVal[1]
1068      */
1069     WORD32      b8_y_offset_1   : 8;
1070 
1071     /**
1072      * luma SaoOffsetVal[2]
1073      */
1074     WORD32      b8_y_offset_2   : 8;
1075 
1076     /**
1077      * luma SaoOffsetVal[3]
1078      */
1079     WORD32      b8_y_offset_3   : 8;
1080 
1081     /**
1082      * luma SaoOffsetVal[4]
1083      */
1084     WORD32      b8_y_offset_4   : 8;
1085 
1086     /**
1087      * luma sao_band_position
1088      */
1089     UWORD32      b5_y_band_pos   : 5;
1090 
1091     WORD32                      : 0;
1092 
1093     /**
1094      * sao_type_idx_chroma
1095      */
1096     UWORD32      b3_cb_type_idx  : 3;
1097 
1098     /**
1099      * chroma SaoOffsetVal[1]
1100      */
1101     WORD32      b8_cb_offset_1  : 8;
1102 
1103     /**
1104      * chroma SaoOffsetVal[2]
1105      */
1106     WORD32      b8_cb_offset_2  : 8;
1107 
1108     /**
1109      * chroma SaoOffsetVal[3]
1110      */
1111     WORD32      b8_cb_offset_3  : 8;
1112 
1113     /**
1114      * chroma SaoOffsetVal[4]
1115      */
1116     WORD32      b8_cb_offset_4  : 8;
1117 
1118     /**
1119      * cb sao_band_position
1120      */
1121     UWORD32      b5_cb_band_pos  : 5;
1122 
1123     WORD32                      : 0;
1124 
1125     /**
1126      * sao_type_idx_chroma
1127      */
1128     UWORD32      b3_cr_type_idx  : 3;
1129 
1130     /**
1131      * chroma SaoOffsetVal[1]
1132      */
1133     WORD32      b8_cr_offset_1  : 8;
1134 
1135     /**
1136      * chroma SaoOffsetVal[2]
1137      */
1138     WORD32      b8_cr_offset_2  : 8;
1139 
1140     /**
1141      * chroma SaoOffsetVal[3]
1142      */
1143     WORD32      b8_cr_offset_3  : 8;
1144 
1145     /**
1146      * chroma SaoOffsetVal[4]
1147      */
1148     WORD32      b8_cr_offset_4  : 8;
1149 
1150     /**
1151      * cr sao_band_position
1152      */
1153     UWORD32      b5_cr_band_pos  : 5;
1154 
1155     WORD32                      : 0;
1156 
1157 }sao_10bd_t;
1158 
1159 /**
1160  * Motion vector
1161  */
1162 typedef struct
1163 {
1164     /**
1165      * Horizontal Motion Vector
1166      */
1167     WORD16 i2_mvx;
1168 
1169     /**
1170      * Vertical Motion Vector
1171      */
1172     WORD16 i2_mvy;
1173 }mv_t;
1174 
1175 /*****************************************************************************/
1176 /* Following results in packed 48 bit structure. If mv_t included            */
1177 /*  ref_pic_buf_id, then 8 bits will be wasted for each mv for aligning.     */
1178 /*  Also using mv_t as elements directly instead of a pointer to l0 and l1   */
1179 /*  mvs. Since pointer takes 4 bytes and MV itself is 4 bytes. It does not   */
1180 /*  really help using pointers.                                              */
1181 /*****************************************************************************/
1182 
1183 /**
1184  * PU Motion Vector info
1185  */
1186 typedef struct
1187 {
1188     /**
1189      *  L0 Motion Vector
1190      */
1191     mv_t s_l0_mv;
1192 
1193     /**
1194      *  L1 Motion Vector
1195      */
1196     mv_t s_l1_mv;
1197 
1198     /**
1199      *  L0 Ref index
1200      */
1201     WORD8   i1_l0_ref_idx;
1202 
1203     /**
1204      *  L1 Ref index
1205      */
1206     WORD8   i1_l1_ref_idx;
1207 
1208     /**
1209      *  L0 Ref Pic Buf ID
1210      */
1211     WORD8 i1_l0_ref_pic_buf_id;
1212 
1213     /**
1214      *  L1 Ref Pic Buf ID
1215      */
1216     WORD8 i1_l1_ref_pic_buf_id;
1217 
1218 }pu_mv_t;
1219 
1220 /**
1221  * PU information
1222  */
1223 typedef struct
1224 {
1225 
1226     /**
1227      *  PU motion vectors
1228      */
1229     pu_mv_t     mv;
1230 
1231     /**
1232      *  PU X position in terms of min PU (4x4) units
1233      */
1234     UWORD32     b4_pos_x        : 4;
1235 
1236     /**
1237      *  PU Y position in terms of min PU (4x4) units
1238      */
1239     UWORD32     b4_pos_y        : 4;
1240 
1241     /**
1242      *  PU width in pixels = (b4_wd + 1) << 2
1243      */
1244     UWORD32     b4_wd           : 4;
1245 
1246     /**
1247      *  PU height in pixels = (b4_ht + 1) << 2
1248      */
1249     UWORD32     b4_ht           : 4;
1250 
1251     /**
1252      *  Intra or Inter flag for each partition - 0 or 1
1253      */
1254     UWORD32     b1_intra_flag   : 1;
1255 
1256 
1257     /**
1258      *  PRED_L0, PRED_L1, PRED_BI - Initialized in parsing only for MVP case
1259      */
1260     UWORD32     b2_pred_mode    : 2;
1261 
1262 
1263     /**
1264      *  Merge flag for each partition - 0 or 1
1265      */
1266     UWORD32     b1_merge_flag   : 1;
1267 
1268     /**
1269      *  Merge index for each partition - 0 to 4
1270      */
1271     UWORD32     b3_merge_idx    : 3;
1272 
1273     /*************************************************************************/
1274     /* Following two flags can be overloaded with b3_merge_idx if there      */
1275     /* is need for additional bits                                           */
1276     /*************************************************************************/
1277 
1278     /**
1279      *  If merge is zero, following gives presence of mvd for L0 MV
1280      */
1281     UWORD32     b1_l0_mvp_idx   : 1;
1282 
1283     /**
1284      *  If merge is zero, following gives presence of mvd for L1 MV
1285      */
1286     UWORD32     b1_l1_mvp_idx   : 1;
1287 
1288     /**
1289      * Partition mode - Needed during MV merge stage
1290      * Note: Part mode can be derived using pu_wd, pu_ht and minCB size
1291      * If there is a need for bits, the following can be removed at the cost
1292      * of more control code in MV Merge
1293      */
1294     UWORD32      b3_part_mode    : 3;
1295 
1296     /**
1297      * Partition index - Needed during MV merge stage
1298      */
1299     UWORD32      b2_part_idx     : 2;
1300 
1301 }pu_t;
1302 
1303 /**
1304  * TU information
1305  */
1306 typedef struct
1307 {
1308     /**
1309      *  TU X position in terms of min TU (4x4) units
1310      */
1311     UWORD32      b4_pos_x            : 4;
1312 
1313     /**
1314      *  TU Y position in terms of min TU (4x4) units
1315      */
1316     UWORD32     b4_pos_y            : 4;
1317 
1318     /*************************************************************************/
1319     /* Luma TU size (width or height) = 1 << (b3_size + 2)                   */
1320     /*   i.e. 0 : 4, 1 : 8, 2: 16, 3: 32, 4: 64                              */
1321     /* Note: Though 64 x 64 TU is not possible, this size is supported to    */
1322     /* signal SKIP CUs or PCM CUs etc where transform is not called          */
1323     /* Chroma width will be half of luma except for 4x4 luma                 */
1324     /*************************************************************************/
1325     /**
1326      * Luma TU size (width or height)
1327      */
1328     UWORD32     b3_size             : 3; //To be changed.
1329 
1330     /*************************************************************************/
1331     /* Chroma present : For 4x4 Luma TUs only the fourth one contains Cb     */
1332     /* Cr info. For the first three TUs in 8x8 (for 4x4 luma) this will      */
1333     /* be zero. For all the other cases this will be 1                       */
1334     /*************************************************************************/
1335     /**
1336      * 4x4 Luma TUs only the fourth one contains cb,cr
1337      * TODO: Check if this is really needed, cb_cbf and cr_cbf should be enough
1338      */
1339 
1340     /**
1341      *  Y CBF
1342      */
1343     UWORD32      b1_y_cbf            : 1;
1344 
1345     /**
1346      *  Cb CBF
1347      */
1348     UWORD32      b1_cb_cbf           : 1;
1349 
1350 
1351     /**
1352      *  Cr CBF
1353      */
1354     UWORD32     b1_cr_cbf           : 1;
1355 
1356 
1357     /**
1358      *  Flag to indicate if it is the first TU in a CU
1359      */
1360     UWORD32     b1_first_tu_in_cu       : 1;
1361 
1362     /**
1363      *  Transform quant bypass flag
1364      */
1365     UWORD32     b1_transquant_bypass  : 1;
1366 
1367     /**
1368      *  Y Qp
1369      */
1370     //UWORD32     b6_qp               : 6; // BUG_FIX related to nighbour QP's in case of negative QP for HBD.
1371     WORD32     b7_qp               : 7;
1372 
1373 
1374     /**
1375      *  Luma Intra Mode 0 - 34
1376      */
1377     UWORD32    b6_luma_intra_mode      : 6;
1378 
1379     /*************************************************************************/
1380     /* Chroma Intra Mode Index 0 - 4: Actual mode (0, 1, 10, 26, 34, X) to be*/
1381     /* derived using luma_intra_mode and the following                       */
1382     /*************************************************************************/
1383     /**
1384      * Chroma Intra Mode Index 0 - 4
1385      */
1386     UWORD32    b3_chroma_intra_mode_idx    : 3;
1387 
1388 }tu_t;
1389 
1390 /**
1391  * CU information
1392  */
1393 typedef struct
1394 {
1395 
1396     /**
1397      *  CU X position in terms of min CU (8x8) units
1398      */
1399     UWORD32 b3_cu_pos_x :3;
1400 
1401     /**
1402      *  CU Y position in terms of min CU (8x8) units
1403      */
1404     UWORD32 b3_cu_pos_y :3;
1405 
1406     /**
1407      *  CU size in terms of min CU (8x8) units
1408      */
1409     UWORD32 b4_cu_size :4;
1410 
1411     /**
1412      *  transquant bypass flag ; 0 for this encoder
1413      */
1414     UWORD32 b1_tq_bypass_flag :1;
1415 
1416     /**
1417      *  CU skip flag
1418      */
1419     UWORD32 b1_skip_flag :1;
1420 
1421     /**
1422      *  intra / inter CU flag
1423      */
1424     UWORD32 b1_pred_mode_flag :1;
1425 
1426     /**
1427      *  indicates partition information for CU
1428      *  For intra 0 : for 2Nx2N / 1 for NxN iff CU=minCBsize
1429      *  For inter 0 : @sa PART_SIZE_E
1430      */
1431     UWORD32 b3_part_mode :3;
1432 
1433     /**
1434      *  0 for this encoder
1435      */
1436     UWORD32 b1_pcm_flag :1;
1437 
1438     /**
1439      *  only applicable for intra cu
1440      */
1441     UWORD32 b3_chroma_intra_pred_mode :3;
1442 
1443     /**
1444      * only applicable for intra cu
1445      */
1446     UWORD32 b1_prev_intra_luma_pred_flag0 :1;
1447 
1448     /**
1449      * only applicable for intra cu and pred_mode=NxN
1450      */
1451     UWORD32 b1_prev_intra_luma_pred_flag1 :1;
1452 
1453     /**
1454      * only applicable for intra cu and pred_mode=NxN
1455      */
1456     UWORD32 b1_prev_intra_luma_pred_flag2 :1;
1457 
1458     /**
1459      * only applicable for intra cu and pred_mode=NxN
1460      */
1461     UWORD32 b1_prev_intra_luma_pred_flag3 :1;
1462 
1463     /**
1464      *  only applicable for luma intra cu
1465      */
1466     UWORD32 b2_mpm_idx0 :2;
1467 
1468     /**
1469      *  only applicable for intra cu and pred_mode=NxN
1470      */
1471     UWORD32 b2_mpm_idx1 :2;
1472 
1473     /**
1474      *  only applicable for intra cu and pred_mode=NxN
1475      */
1476     UWORD32 b2_mpm_idx2 :2;
1477 
1478     /**
1479      *  only applicable for intra cu and pred_mode=NxN
1480      */
1481     UWORD32 b2_mpm_idx3 :2;
1482 
1483     /**
1484      *  only applicable for intra cu
1485      */
1486     UWORD32 b5_rem_intra_pred_mode0 :5;
1487 
1488     /**
1489      *  only applicable for intra cu and pred_mode=NxN
1490      */
1491     UWORD32 b5_rem_intra_pred_mode1 :5;
1492 
1493     /**
1494      *  only applicable for intra cu and pred_mode=NxN
1495      */
1496     UWORD32 b5_rem_intra_pred_mode2 :5;
1497 
1498     /**
1499      *  only applicable for intra cu and pred_mode=NxN
1500      */
1501     UWORD32 b5_rem_intra_pred_mode3 :5;
1502 
1503     /**
1504      *  no residue flag for cu
1505      */
1506     UWORD32 b1_no_residual_syntax_flag :1;
1507 
1508 }cu_t;
1509 
1510 /*****************************************************************************/
1511 /* Since the following data will be accessed linearly (no random access      */
1512 /*  is needed for this) there is no need to store a frame level offset for   */
1513 /*  each CTB's TU data. Only a pointer to this is stored in CTB's structure  */
1514 /*****************************************************************************/
1515 
1516 typedef struct
1517 {
1518     /*************************************************************************/
1519     /* Number of TUs filled in as_tu                                         */
1520     /* Having the first entry as 32 bit data, helps in keeping each of       */
1521     /* the structures aligned to 32 bits at CTB level                        */
1522     /*************************************************************************/
1523     /**
1524      * Number of TUs filled in as_tu
1525      */
1526     WORD32 i4_tu_cnt;
1527 
1528     /**
1529      *  Array to map each min TU unit to a corresponding entry in as_tu
1530      */
1531     UWORD8 au1_tu_map[MAX_TU_IN_CTB];
1532 
1533     /*************************************************************************/
1534     /* TU level information                                                  */
1535     /* Though the allocation for as_pu as done to handle worst case data,    */
1536     /* only valid number of TUs will be filled in the following array.       */
1537     /* Next CTB starts after the valid as_tu entries                         */
1538     /*************************************************************************/
1539     /**
1540      *  TU level information
1541      */
1542     tu_t as_tu[MAX_TU_IN_CTB];
1543 
1544 }ctb_tu_list_t;
1545 
1546 /*****************************************************************************/
1547 /* Info from last TU row of CTB is stored in a row level neighbour buffer    */
1548 /* , which will be used for Boundary Strength computation                    */
1549 /*****************************************************************************/
1550 /**
1551  *  CTB neighbor info
1552  */
1553 typedef struct
1554 {
1555     /**
1556      *  Slice index of the ctb
1557      */
1558     UWORD16 u2_slice_idx;
1559 
1560     /*************************************************************************/
1561     /* CBF of bottom TU row (replicated in 4 pixel boundary)                 */
1562     /* MSB contains CBF of first TU in the last row and LSB contains CBF     */
1563     /* of last TU in the last row                                            */
1564     /*************************************************************************/
1565     /**
1566      * CBF of bottom TU row
1567      */
1568     UWORD16 u2_packed_cbf;
1569 
1570     /*************************************************************************/
1571     /* QP of bottom TU row (replicated at 8 pixel boundary (Since QP can     */
1572     /* not change at less than min CU granularity)                           */
1573     /*************************************************************************/
1574     /**
1575      * QP of bottom TU row
1576      */
1577     UWORD8 au1_qp[MAX_CU_IN_CTB_ROW];
1578 
1579 }ctb_top_ny_info_t;
1580 
1581 /**
1582  *  CTB level info
1583  */
1584 typedef struct _ctb_t
1585 {
1586     /*************************************************************************/
1587     /* Tile boundary can be detected by looking at tile start x and tile     */
1588     /* start y.  And based on the tile, slice and frame boundary the         */
1589     /* following will be initialized.                                        */
1590     /*************************************************************************/
1591     /**
1592      *  Pointer to left CTB
1593      */
1594     /*  If not available, this will be set to NULL   */
1595     struct _ctb_t *ps_ctb_left;
1596 
1597     /**
1598      *  Pointer to top-left CTB
1599      */
1600     /* If not available, this will be set to NULL   */
1601     ctb_top_ny_info_t *ps_ctb_ny_topleft;
1602 
1603     /**
1604      *  Pointer to top CTB
1605      */
1606     /* If not available, this will be set to NULL  */
1607     ctb_top_ny_info_t *ps_ctb_ny_top;
1608 
1609     /**
1610      *  Pointer to top-right CTB
1611      */
1612     /* If not available, this will be set to NULL */
1613     ctb_top_ny_info_t *ps_ctb_ny_topright;
1614 
1615     /*************************************************************************/
1616     /* Pointer to PU data.                                                   */
1617     /* This points to a MV Bank stored at frame level. Though this           */
1618     /* pointer can be derived by reading offset at frame level, it is        */
1619     /* stored here for faster access. Can be removed if storage of CTB       */
1620     /* structure is critical                                                 */
1621     /*************************************************************************/
1622     /**
1623      * Pointer to PU data
1624      */
1625     pu_t *ps_pu;
1626 
1627     /*************************************************************************/
1628     /* Pointer to a PU map stored at frame level,                            */
1629     /* Though this pointer can be derived by multiplying CTB adress with     */
1630     /* number of minTUs in a CTB, it is stored here for faster access.       */
1631     /* Can be removed if storage of CTB structure is critical                */
1632     /*************************************************************************/
1633     /**
1634      * Pointer to a PU map stored at frame level
1635      */
1636     UWORD8 *pu1_pu_map;
1637 
1638     /**
1639      *  Number of TUs filled in as_tu
1640      */
1641     /*************************************************************************/
1642     /* Having the first entry as 32 bit data, helps in keeping each of       */
1643     /* the structures aligned to 32 bits at CTB level                        */
1644     /*************************************************************************/
1645     WORD32 i4_tu_cnt;
1646 
1647     /**
1648      *  Array to map each min TU unit to a corresponding entry in as_tu
1649      */
1650     UWORD8 *pu1_tu_map;
1651 
1652     /**
1653      *  TU level information
1654      */
1655     /*************************************************************************/
1656     /* Though the allocation for as_pu as done to handle worst case data,    */
1657     /* only valid number of TUs will be filled in the following array.       */
1658     /* Next CTB starts after the valid as_tu entries                         */
1659     /*************************************************************************/
1660     tu_t *ps_tu;
1661 
1662     /**
1663      *  Pointer to transform coeff data
1664      */
1665     /*************************************************************************/
1666     /* Following format is repeated for every coded TU                       */
1667     /* Luma Block                                                            */
1668     /* num_coeffs      : 16 bits                                             */
1669     /* zero_cols       : 8 bits ( 1 bit per 4 columns)                       */
1670     /* sig_coeff_map   : ((TU Size * TU Size) + 31) >> 5 number of WORD32s   */
1671     /* coeff_data      : Non zero coefficients                               */
1672     /* Cb Block (only for last TU in 4x4 case else for every luma TU)        */
1673     /* num_coeffs      : 16 bits                                             */
1674     /* zero_cols       : 8 bits ( 1 bit per 4 columns)                       */
1675     /* sig_coeff_map   : ((TU Size * TU Size) + 31) >> 5 number of WORD32s   */
1676     /* coeff_data      : Non zero coefficients                               */
1677     /* Cr Block (only for last TU in 4x4 case else for every luma TU)        */
1678     /* num_coeffs      : 16 bits                                             */
1679     /* zero_cols       : 8 bits ( 1 bit per 4 columns)                       */
1680     /* sig_coeff_map   : ((TU Size * TU Size) + 31) >> 5 number of WORD32s   */
1681     /* coeff_data      : Non zero coefficients                               */
1682     /*************************************************************************/
1683     void            *pv_coeff_data;
1684 
1685     /**
1686      *  Slice to which the CTB belongs to
1687      */
1688     WORD32 i4_slice_idx;
1689 
1690     /**
1691      *  CTB column position
1692      */
1693     WORD32 i4_pos_x;
1694 
1695     /**
1696      *  CTB row position
1697      */
1698     WORD32 i4_pos_y;
1699 
1700     /**
1701      *  Number of PUs filled in ps_pu
1702      */
1703     WORD32 i4_pu_cnt;
1704 
1705     /**
1706      *  Index of current PU being processed in ps_pu
1707      */
1708     /*  Scratch variable set to 0 at the start of any PU processing function */
1709     WORD32 i4_pu_idx;
1710 
1711     /**
1712      * Vertical Boundary strength
1713      */
1714     /* Two bits per edge.
1715     Stored in format. BS[15] | BS[14] | .. |BS[0]*/
1716     UWORD32 *pu4_vert_bs;
1717 
1718     /**
1719      * Horizontal Boundary strength
1720      */
1721 
1722     /* Two bits per edge.
1723     Stored in format. BS[15] | BS[14] | .. |BS[0]*/
1724     UWORD32 *pu4_horz_bs;
1725 
1726     /**
1727      *  Qp array stored for each 8x8 pixels
1728      */
1729     UWORD8 *pu1_qp;
1730 
1731     /**
1732      *  Pointer to current frame's pu_t array
1733      */
1734     pu_t *ps_frm_pu;
1735 
1736     /**
1737      * Pointer to current frame's pu_t index array, which stores starting index
1738      * of pu_t for every CTB
1739      */
1740     UWORD32 *pu4_frm_pu_idx;
1741 
1742     /**
1743      *  Pointer to current frame's pu map array
1744      */
1745     UWORD8 *pu1_frm_pu_map;
1746 
1747     /*************************************************************************/
1748     /* Need to add encoder specific elements for identifying the order of    */
1749     /* coding for CU, TU and PU if any                                       */
1750     /*************************************************************************/
1751 }ctb_t;
1752 
1753 /*****************************************************************************/
1754 /* The following can be used to typecast coefficient data that is stored     */
1755 /*  per subblock. Note that though i2_level is shown as an array that        */
1756 /*  holds 16 coefficients, only the first few entries will be valid. Next    */
1757 /*  subblocks data starts after the valid number of coefficients. Number     */
1758 /*  of non-zero coefficients will be derived using number of non-zero bits   */
1759 /*  in sig coeff map                                                         */
1760 /*****************************************************************************/
1761 /**
1762  * Structure to hold coefficient info for a 4x4 subblock
1763  */
1764 typedef struct
1765 {
1766     /**
1767      * sub block position
1768      */
1769     UWORD16 u2_subblk_pos;
1770 
1771     /**
1772      * significant coefficient map
1773      */
1774     UWORD16 u2_sig_coeff_map;
1775 
1776     /**
1777      * holds 16 coefficients
1778      */
1779     WORD16  ai2_level[SUBBLK_COEFF_CNT];
1780 }tu_sblk_coeff_data_t;
1781 
1782 
1783 /*************************************************************************/
1784 /* The following describes how each of the CU cases are handled          */
1785 /*************************************************************************/
1786 
1787 /*************************************************************************/
1788 /* For SKIP CU                                                           */
1789 /* One Inter PU with appropriate MV                                      */
1790 /* One TU which says Y, Cb and Cr CBF is zero with size equal to CB size */
1791 /*************************************************************************/
1792 
1793 /*************************************************************************/
1794 /* For Inter CU                                                          */
1795 /* M Inter PU with appropriate MVs (M between 1 to 4)                    */
1796 /* N TU (N is number of TU in CU)                                        */
1797 /*************************************************************************/
1798 
1799 /*************************************************************************/
1800 /* For Intra CU                                                          */
1801 /* N TU (N is number of TU in CU)                                        */
1802 /* N Intra PU with appropriate pred modes for luma and chroma            */
1803 /*************************************************************************/
1804 
1805 /*************************************************************************/
1806 /* For Intra PCM CU                                                      */
1807 /* One TU which says transquant bypass is 1  with size equal to CB size  */
1808 /* 1 Intra PU with pcm flag set to 1(which ensures no intra pred is done)*/
1809 /*************************************************************************/
1810 
1811 /*************************************************************************/
1812 /* For a CU where cu_transquant_bypass_flag is 1                         */
1813 /* One TU which says transquant bypass is 1  with size equal to CB size  */
1814 /* N Intra/Inter PUs                                                     */
1815 /*************************************************************************/
1816 
1817 /*************************************************************************/
1818 /* For a CU where no_residual_syntax_flag is 1                           */
1819 /* One TU which says Y, Cb, Cr CBF is 0  with size equal to CB size      */
1820 /* N Inter PUs                                                           */
1821 /*************************************************************************/
1822 
1823 
1824 /**
1825  * Structure giving information about the tile
1826  */
1827 typedef struct
1828 {
1829     /* X position of the tile in the current frame in CTB units */
1830     UWORD8 u1_pos_x;
1831 
1832     /* Y position of the tile in the current frame in CTB units */
1833     UWORD8 u1_pos_y;
1834 
1835     /* Tile width in CTB units */
1836     UWORD16 u2_wd;
1837 
1838     /* Tile height in CTB units */
1839     UWORD16 u2_ht;
1840 
1841 }tile_t;
1842 
1843 /**
1844  * Structure to hold Profile tier level info for a given layer
1845  */
1846 
1847 typedef struct
1848 {
1849     /**
1850      *  NAL unit type
1851      */
1852     WORD8 i1_nal_unit_type;
1853 
1854     /**
1855      *  NAL temporal id
1856      */
1857     WORD8 i1_nuh_temporal_id;
1858 }nal_header_t;
1859 
1860 /**
1861  * Structure to hold Profile tier level info for a given layer
1862  */
1863 
1864 typedef struct
1865 {
1866     /**
1867      *  profile_space
1868      */
1869     WORD8 i1_profile_space;
1870 
1871     /**
1872      *  tier_flag
1873      */
1874     WORD8 i1_tier_flag;
1875 
1876     /**
1877      *  profile_idc
1878      */
1879     WORD8 i1_profile_idc;
1880 
1881     /**
1882      *  profile_compatibility_flag[]
1883      */
1884     WORD8 ai1_profile_compatibility_flag[MAX_PROFILE_COMPATBLTY];
1885 
1886     /**
1887      * progressive_source_flag
1888      */
1889     WORD8 i1_general_progressive_source_flag;
1890 
1891     /**
1892      * interlaced_source_flag
1893      */
1894     WORD8 i1_general_interlaced_source_flag;
1895 
1896     /**
1897      * non_packed_constraint_flag
1898      */
1899     WORD8 i1_general_non_packed_constraint_flag;
1900 
1901     /**
1902      * frame_only_constraint_flag
1903      */
1904     WORD8 i1_frame_only_constraint_flag;
1905 
1906     /**
1907      * general_max_12bit_constraint_flag
1908      */
1909     WORD8 i1_general_max_12bit_constraint_flag;
1910 
1911     /**
1912      * general_max_10bit_constraint_flag
1913      */
1914     WORD8 i1_general_max_10bit_constraint_flag;
1915 
1916     /**
1917      * general_max_8bit_constraint_flag
1918      */
1919     WORD8 i1_general_max_8bit_constraint_flag;
1920 
1921     /**
1922      * general_max_422chroma_constraint_flag
1923      */
1924     WORD8 i1_general_max_422chroma_constraint_flag;
1925 
1926     /**
1927      * general_max_420chroma_constraint_flag
1928      */
1929     WORD8 i1_general_max_420chroma_constraint_flag;
1930 
1931     /**
1932      * general_max_monochrome_constraint_flag
1933      */
1934     WORD8 i1_general_max_monochrome_constraint_flag;
1935 
1936     /**
1937      * general_intra_constraint_flag
1938      */
1939     WORD8 i1_general_intra_constraint_flag;
1940 
1941     /**
1942      * general_one_picture_only_constraint_flag
1943      */
1944     WORD8 i1_general_one_picture_only_constraint_flag;
1945 
1946     /**
1947      * general_lower_bit_rate_constraint_flag
1948      */
1949     WORD8 i1_general_lower_bit_rate_constraint_flag;
1950 
1951     /**
1952      *  level_idc
1953      */
1954     UWORD8 u1_level_idc;
1955 }profile_tier_lvl_t;
1956 
1957 /**
1958  * Structure to hold Profile tier level info for all layers
1959  */
1960 typedef struct
1961 {
1962     /**
1963      *  Profile and tier information for general
1964      */
1965     profile_tier_lvl_t s_ptl_gen;
1966 
1967     /**
1968      *  sub_layer_profile_present_flag[]
1969      */
1970     WORD8 ai1_sub_layer_profile_present_flag[VPS_MAX_SUB_LAYERS - 1];
1971 
1972     /**
1973      *  sub_layer_level_present_flag[]
1974      */
1975     WORD8 ai1_sub_layer_level_present_flag[VPS_MAX_SUB_LAYERS - 1];
1976 
1977     /**
1978      *  Profile and tier information for sub layers
1979      */
1980     profile_tier_lvl_t as_ptl_sub[VPS_MAX_SUB_LAYERS - 1];
1981 
1982 }profile_tier_lvl_info_t;
1983 
1984 /**
1985  * Structure to hold short term reference picture set info
1986  */
1987 typedef struct
1988 {
1989     /**
1990      *  delta_poc_s0_minus1[ i ] and delta_poc_s1_minus1[ i ]
1991      */
1992     WORD16 ai2_delta_poc[MAX_DPB_SIZE];
1993 
1994     /**
1995      *  inter_ref_pic_set_prediction_flag
1996      */
1997     WORD8 i1_inter_ref_pic_set_prediction_flag;
1998 
1999     /**
2000      *  num_negative_pics
2001      */
2002     WORD8 i1_num_neg_pics;
2003 
2004     /**
2005      *  num_positive_pics
2006      */
2007     WORD8 i1_num_pos_pics;
2008 
2009     /**
2010      *  used_by_curr_pic_s0_flag[ i ] and used_by_curr_pic_s1_flag[i]
2011      */
2012     WORD8 ai1_used[MAX_DPB_SIZE];
2013 
2014     /**
2015      *  Ref Idc
2016      */
2017     WORD8 ai1_ref_idc[MAX_DPB_SIZE];
2018 
2019     /**
2020      *  Sum of positive and negative pics for each refence
2021      */
2022     WORD8 i1_num_delta_pocs;
2023 
2024     /**
2025      *  Number of ref_idc
2026      */
2027     WORD8 i1_num_ref_idc;
2028 }stref_picset_t;
2029 
2030 /**
2031  * Structure to hold weighted prediction info such as weights and offsets
2032  */
2033 typedef struct
2034 {
2035     /** luma_log2_weight_denom */
2036     WORD8 i1_luma_log2_weight_denom;
2037 
2038     /** delta_chroma_log2_weight_denom */
2039     WORD8 i1_chroma_log2_weight_denom;
2040 
2041 
2042     /** luma_weight_l0_flag[ i ] */
2043     WORD8 i1_luma_weight_l0_flag[MAX_DPB_SIZE];
2044 
2045     /** chroma_weight_l0_flag[ i ] */
2046     WORD8 i1_chroma_weight_l0_flag[MAX_DPB_SIZE];
2047 
2048     /** delta_luma_weight_l0[ i ] */
2049     WORD16 i2_luma_weight_l0[MAX_DPB_SIZE];
2050 
2051     /** luma_offset_l0[ i ] */
2052     WORD16 i2_luma_offset_l0[MAX_DPB_SIZE];
2053 
2054     /** delta_chroma_weight_l0[ i ][ j ] */
2055     WORD16 i2_chroma_weight_l0_cb[MAX_DPB_SIZE];
2056 
2057     /** delta_chroma_offset_l0[ i ][ j ] */
2058     WORD16 i2_chroma_offset_l0_cb[MAX_DPB_SIZE];
2059 
2060     /** delta_chroma_weight_l0[ i ][ j ] */
2061     WORD16 i2_chroma_weight_l0_cr[MAX_DPB_SIZE];
2062 
2063     /** delta_chroma_offset_l0[ i ][ j ] */
2064     WORD16 i2_chroma_offset_l0_cr[MAX_DPB_SIZE];
2065 
2066     /** luma_weight_l1_flag[ i ] */
2067     WORD8 i1_luma_weight_l1_flag[MAX_DPB_SIZE];
2068 
2069     /** chroma_weight_l1_flag[ i ] */
2070     WORD8 i1_chroma_weight_l1_flag[MAX_DPB_SIZE];
2071 
2072     /** delta_luma_weight_l1[ i ] */
2073     WORD16 i2_luma_weight_l1[MAX_DPB_SIZE];
2074 
2075     /** luma_offset_l1[ i ] */
2076     WORD16 i2_luma_offset_l1[MAX_DPB_SIZE];
2077 
2078     /** delta_chroma_weight_l1[ i ][ j ] */
2079     WORD16 i2_chroma_weight_l1_cb[MAX_DPB_SIZE];
2080 
2081     /** delta_chroma_offset_l1[ i ][ j ] */
2082     WORD16 i2_chroma_offset_l1_cb[MAX_DPB_SIZE];
2083 
2084     /** delta_chroma_weight_l1[ i ][ j ] */
2085     WORD16 i2_chroma_weight_l1_cr[MAX_DPB_SIZE];
2086 
2087     /** delta_chroma_offset_l1[ i ][ j ] */
2088     WORD16 i2_chroma_offset_l1_cr[MAX_DPB_SIZE];
2089 
2090 }pred_wt_ofst_t;
2091 
2092 
2093 /**
2094  * Structure to hold Reference picture list modification info
2095  */
2096 typedef struct
2097 {
2098     /* ref_pic_list_modification_flag_l0 */
2099     WORD8 i1_ref_pic_list_modification_flag_l0;
2100 
2101     /* list_entry_l0[ i ] */
2102     WORD8 i1_list_entry_l0[16];
2103 
2104     /* ref_pic_list_modification_flag_l1 */
2105     WORD8 i1_ref_pic_list_modification_flag_l1;
2106 
2107     /* list_entry_l1[ i ] */
2108     WORD8 i1_list_entry_l1[16];
2109 
2110     /* Reference POC values for L0,L1 */
2111     WORD32 i4_ref_poc_l0[16];
2112     WORD32 i4_ref_poc_l1[16];
2113 }rplm_t;
2114 
2115 
2116 /**
2117  * Structure to hold VPS info
2118  */
2119 typedef struct
2120 {
2121     /**
2122      *  video_parameter_set_id
2123      */
2124     WORD8 i1_vps_id;
2125 
2126     /**
2127      *  vps_temporal_id_nesting_flag
2128      */
2129     WORD8 i1_vps_temporal_id_nesting_flag;
2130     /**
2131      * sub_layer_ordering_info_present_flag
2132      */
2133     WORD8 i1_sub_layer_ordering_info_present_flag;
2134     /**
2135      *  vps_max_sub_layers_minus1
2136      */
2137     WORD8 i1_vps_max_sub_layers;
2138 
2139     /**
2140      *  vps_max_dec_pic_buffering
2141      */
2142     WORD8 ai1_vps_max_dec_pic_buffering[VPS_MAX_SUB_LAYERS];
2143 
2144     /**
2145      *  vps_max_num_reorder_pics
2146      */
2147     WORD8 ai1_vps_max_num_reorder_pics[VPS_MAX_SUB_LAYERS];
2148 
2149     /**
2150      *  vps_max_latency_increase
2151      */
2152     WORD8 ai1_vps_max_latency_increase[VPS_MAX_SUB_LAYERS];
2153 
2154     /**
2155      *  vps_num_hrd_parameters
2156      */
2157     WORD8 i1_vps_num_hrd_parameters;
2158 
2159     /**
2160      * vps_max_nuh_reserved_zero_layer_id
2161      */
2162     WORD8 i1_vps_max_nuh_reserved_zero_layer_id;
2163 
2164     /**
2165      * vps_num_op_sets
2166      */
2167     WORD8 i1_vps_num_op_sets;
2168 
2169     /**
2170      * layer_id_included_flag
2171      */
2172     //WORD8 ai1_layer_id_included_flag[2][MAX_NUH_LAYERS];
2173     /**
2174      *  Profile, Tier and Level info
2175      */
2176     profile_tier_lvl_info_t s_ptl;
2177 
2178     /**
2179      * bit_rate_info_present_flag[i]
2180      */
2181     WORD8 ai1_bit_rate_info_present_flag[VPS_MAX_SUB_LAYERS];
2182 
2183     /**
2184      * pic_rate_info_present_flag[i]
2185      */
2186     WORD8 ai1_pic_rate_info_present_flag[VPS_MAX_SUB_LAYERS];
2187 
2188     /**
2189      * avg_bit_rate[i]
2190      */
2191     UWORD16 au2_avg_bit_rate[VPS_MAX_SUB_LAYERS];
2192 
2193     /**
2194      * max_bit_rate[i]
2195      */
2196     UWORD16 au2_max_bit_rate[VPS_MAX_SUB_LAYERS];
2197 
2198     /**
2199      * constant_pic_rate_idc[i]
2200      */
2201     WORD8 ai1_constant_pic_rate_idc[VPS_MAX_SUB_LAYERS];
2202 
2203     /**
2204      * avg_pic_rate[i]
2205      */
2206     UWORD16 au2_avg_pic_rate[VPS_MAX_SUB_LAYERS];
2207 }vps_t;
2208 
2209 
2210 /**
2211  * Structure to hold SPS info
2212  */
2213 typedef struct
2214 {
2215     /**
2216      * pic_width_in_luma_samples
2217      */
2218     WORD16 i2_pic_width_in_luma_samples;
2219 
2220     /**
2221      *  pic_height_in_luma_samples
2222      */
2223     WORD16 i2_pic_height_in_luma_samples;
2224 
2225     /**
2226      *  pic_crop_left_offset
2227      */
2228     WORD16 i2_pic_crop_left_offset;
2229 
2230     /**
2231      *  pic_crop_right_offset
2232      */
2233     WORD16 i2_pic_crop_right_offset;
2234 
2235     /**
2236      *  pic_crop_top_offset
2237      */
2238     WORD16 i2_pic_crop_top_offset;
2239 
2240     /**
2241      *  pic_crop_bottom_offset
2242      */
2243     WORD16 i2_pic_crop_bottom_offset;
2244 
2245     /**
2246      *  seq_parameter_set_id
2247      */
2248     WORD8 i1_sps_id;
2249 
2250     /**
2251      *  video_parameter_set_id
2252      */
2253     WORD8 i1_vps_id;
2254 
2255     /**
2256      *  sps_max_sub_layers_minus1
2257      */
2258     WORD8 i1_sps_max_sub_layers;
2259 
2260     /**
2261      *  chroma_format_idc
2262      */
2263     WORD8 i1_chroma_format_idc;
2264 
2265     /**
2266      * Bit depth of luma samples
2267      */
2268     WORD8 i1_bit_depth_luma_minus8;
2269 
2270     /**
2271      * Bit depth of chrma samples
2272      */
2273     WORD8 i1_bit_depth_chroma_minus8;
2274 
2275     /* separate_colour_plane_flag */
2276     WORD8 i1_separate_colour_plane_flag;
2277 
2278     /**
2279      *  pic_cropping_flag
2280      */
2281     WORD8 i1_pic_cropping_flag;
2282 
2283     /**
2284      *  pcm_enabled_flag
2285      */
2286     WORD8 i1_pcm_enabled_flag;
2287 
2288     /**
2289      *  pcm_sample_bit_depth_luma
2290      */
2291     WORD8 i1_pcm_sample_bit_depth_luma;
2292 
2293     /**
2294      *  pcm_sample_bit_depth_chroma
2295      */
2296     WORD8 i1_pcm_sample_bit_depth_chroma;
2297 
2298     /**
2299      *  log2_max_pic_order_cnt_lsb_minus4
2300      */
2301     WORD8 i1_log2_max_pic_order_cnt_lsb;
2302     /**
2303      * sps_sub_layer_ordering_info_present_flag
2304      */
2305     WORD8 i1_sps_sub_layer_ordering_info_present_flag;
2306     /**
2307      *  sps_max_dec_pic_buffering
2308      */
2309     WORD8 ai1_sps_max_dec_pic_buffering[SPS_MAX_SUB_LAYERS];
2310 
2311     /**
2312      *  sps_max_num_reorder_pics
2313      */
2314     WORD8 ai1_sps_max_num_reorder_pics[SPS_MAX_SUB_LAYERS];
2315 
2316     /**
2317      *  sps_max_latency_increase
2318      */
2319     WORD8 ai1_sps_max_latency_increase[SPS_MAX_SUB_LAYERS];
2320 
2321     /**
2322      *  log2_min_coding_block_size_minus3
2323      */
2324     WORD8 i1_log2_min_coding_block_size;
2325 
2326     /**
2327      *  log2_diff_max_min_coding_block_size
2328      */
2329     WORD8 i1_log2_diff_max_min_coding_block_size;
2330 
2331     /**
2332      *  log2_min_transform_block_size_minus2
2333      */
2334     WORD8 i1_log2_min_transform_block_size;
2335 
2336     /**
2337      *  log2_diff_max_min_transform_block_size
2338      */
2339     WORD8 i1_log2_diff_max_min_transform_block_size;
2340 
2341     /**
2342      *  log2_min_pcm_coding_block_size_minus3
2343      */
2344     WORD8 i1_log2_min_pcm_coding_block_size;
2345 
2346     /**
2347      *  log2_diff_max_min_pcm_coding_block_size
2348      */
2349     WORD8 i1_log2_diff_max_min_pcm_coding_block_size;
2350 
2351     /**
2352      *  max_transform_hierarchy_depth_inter
2353      */
2354     WORD8 i1_max_transform_hierarchy_depth_inter;
2355 
2356     /**
2357      *  max_transform_hierarchy_depth_intra
2358      */
2359     WORD8 i1_max_transform_hierarchy_depth_intra;
2360 
2361     /**
2362      *  scaling_list_enable_flag
2363      */
2364     WORD8 i1_scaling_list_enable_flag;
2365 
2366     /**
2367      *  sps_scaling_list_data_present_flag
2368      */
2369     WORD8 i1_sps_scaling_list_data_present_flag;
2370 
2371     /**
2372      *  amp_enabled_flag
2373      */
2374     WORD8 i1_amp_enabled_flag;
2375 
2376     /**
2377      *  sample_adaptive_offset_enabled_flag
2378      */
2379     WORD8 i1_sample_adaptive_offset_enabled_flag;
2380 
2381     /**
2382      *  pcm_loop_filter_disable_flag
2383      */
2384     WORD8 i1_pcm_loop_filter_disable_flag;
2385 
2386     /**
2387      *  sps_temporal_id_nesting_flag
2388      */
2389     WORD8 i1_sps_temporal_id_nesting_flag;
2390 
2391     /**
2392      *  num_short_term_ref_pic_sets
2393      */
2394     WORD8 i1_num_short_term_ref_pic_sets;
2395 
2396     /**
2397      *  long_term_ref_pics_present_flag
2398      */
2399     WORD8 i1_long_term_ref_pics_present_flag;
2400 
2401     /**
2402      *  num_long_term_ref_pics_sps
2403      */
2404     WORD8 i1_num_long_term_ref_pics_sps;
2405 
2406     /**
2407      *  lt_ref_pic_poc_lsb_sps[]
2408      */
2409     WORD8 ai1_lt_ref_pic_poc_lsb_sps[MAX_LTREF_PICS_SPS];
2410 
2411     /**
2412      *  used_by_curr_pic_lt_sps_flag[]
2413      */
2414     WORD8 ai1_used_by_curr_pic_lt_sps_flag[MAX_LTREF_PICS_SPS];
2415 
2416     /**
2417      *  sps_temporal_mvp_enable_flag
2418      */
2419     WORD8 i1_sps_temporal_mvp_enable_flag;
2420 
2421     /**
2422      * strong_intra_smoothing_enable_flag
2423      */
2424     WORD8 i1_strong_intra_smoothing_enable_flag;
2425 
2426     /**
2427      *  vui_parameters_present_flag
2428      */
2429     WORD8 i1_vui_parameters_present_flag;
2430 
2431     /**
2432      * vui parameters Structure info
2433      */
2434     vui_t s_vui_parameters;
2435 
2436     /**
2437      *  Log2(CTB Size) in luma units
2438      */
2439 
2440     WORD8 i1_log2_ctb_size;
2441 
2442     /**
2443      * Maximum transform block size
2444      */
2445     WORD8 i1_log2_max_transform_block_size;
2446 
2447     /**
2448      *  Picture width in CTB units
2449      */
2450 
2451     WORD16 i2_pic_wd_in_ctb;
2452 
2453     /**
2454      *  Picture height in CTB units
2455      */
2456 
2457     WORD16 i2_pic_ht_in_ctb;
2458 
2459     /**
2460      * Picture width in min CB units
2461      */
2462 
2463     WORD16 i2_pic_wd_in_min_cb;
2464 
2465     /**
2466      *  Picture height in min CB units
2467      */
2468 
2469     WORD16 i2_pic_ht_in_min_cb;
2470 
2471     /**
2472      *  Picture size in CTB units
2473      */
2474     WORD32 i4_pic_size_in_ctb;
2475 
2476     /**
2477      *  Profile, Tier and Level info
2478      */
2479 
2480     profile_tier_lvl_info_t s_ptl;
2481 
2482     /**
2483      *  Short term reference pic set
2484      */
2485     stref_picset_t as_stref_picset[MAX_STREF_PICS_SPS];
2486 
2487     /**
2488      *  Pointer to scaling matrix
2489      */
2490     /*************************************************************************/
2491     /* Contanis the matrice in the following order in a 1D buffer            */
2492     /* Intra 4 x 4 Y, 4 x 4 U, 4 x 4 V                                       */
2493     /* Inter 4 x 4 Y, 4 x 4 U, 4 x 4 V                                       */
2494     /* Intra 8 x 8 Y, 8 x 8 U, 8 x 8 V                                       */
2495     /* Inter 8 x 8 Y, 8 x 8 U, 8 x 8 V                                       */
2496     /* Intra 16x16 Y, 16x16 U, 16x16 V                                       */
2497     /* Inter 16x16 Y, 16x16 U, 16x16 V                                       */
2498     /* Intra 32x32 Y                                                         */
2499     /* Inter 32x32 Y                                                         */
2500     /*************************************************************************/
2501     WORD16 *pi2_scaling_mat;
2502 
2503 
2504     /*
2505      * Flag indicating if the SPS is parsed
2506      */
2507     WORD8 i1_sps_valid;
2508 
2509 }sps_t;
2510 
2511 /**
2512  * Structure to hold PPS info
2513  */
2514 typedef struct
2515 {
2516     /**
2517      *  Pointer to scaling matrix
2518      */
2519     /*************************************************************************/
2520     /* Contanis the matrice in the following order in a 1D buffer            */
2521     /* Intra 4 x 4 Y, 4 x 4 U, 4 x 4 V                                       */
2522     /* Inter 4 x 4 Y, 4 x 4 U, 4 x 4 V                                       */
2523     /* Intra 8 x 8 Y, 8 x 8 U, 8 x 8 V                                       */
2524     /* Inter 8 x 8 Y, 8 x 8 U, 8 x 8 V                                       */
2525     /* Intra 16x16 Y, 16x16 U, 16x16 V                                       */
2526     /* Inter 16x16 Y, 16x16 U, 16x16 V                                       */
2527     /* Intra 32x32 Y                                                         */
2528     /* Inter 32x32 Y                                                         */
2529     /*************************************************************************/
2530     WORD16 *pi2_scaling_mat;
2531 
2532     /**
2533      *  Pointer to an array containing tile info such as position, width, height
2534      *  of each tile
2535      */
2536 
2537     /* column_width_minus1[ i ] and row_height_minus1[ i ] */
2538     tile_t *ps_tile;
2539 
2540     /**
2541      *  pic_parameter_set_id
2542      */
2543     WORD8 i1_pps_id;
2544 
2545     /**
2546      *  seq_parameter_set_id
2547      */
2548     WORD8 i1_sps_id;
2549 
2550     /**
2551      *  sign_data_hiding_flag
2552      */
2553     WORD8 i1_sign_data_hiding_flag;
2554 
2555     /**
2556      *  cabac_init_present_flag
2557      */
2558     WORD8 i1_cabac_init_present_flag;
2559 
2560     /**
2561      *  num_ref_idx_l0_default_active_minus1
2562      */
2563     WORD8 i1_num_ref_idx_l0_default_active;
2564 
2565     /**
2566      * num_ref_idx_l1_default_active_minus1
2567      */
2568     WORD8 i1_num_ref_idx_l1_default_active;
2569 
2570     /**
2571      *  pic_init_qp_minus26
2572      */
2573     WORD8 i1_pic_init_qp;
2574 
2575     /**
2576      *  constrained_intra_pred_flag
2577      */
2578     WORD8 i1_constrained_intra_pred_flag;
2579 
2580     /**
2581      *  transform_skip_enabled_flag
2582      */
2583     WORD8 i1_transform_skip_enabled_flag;
2584 
2585     /**
2586      *  cu_qp_delta_enabled_flag
2587      */
2588     WORD8 i1_cu_qp_delta_enabled_flag;
2589 
2590     /**
2591      * diff_cu_qp_delta_depth
2592      */
2593     WORD8 i1_diff_cu_qp_delta_depth;
2594 
2595     /**
2596      *  pic_cb_qp_offset
2597      */
2598     WORD8 i1_pic_cb_qp_offset;
2599 
2600     /**
2601      *  pic_cr_qp_offset
2602      */
2603     WORD8 i1_pic_cr_qp_offset;
2604 
2605     /**
2606      *  pic_slice_level_chroma_qp_offsets_present_flag
2607      */
2608     WORD8 i1_pic_slice_level_chroma_qp_offsets_present_flag;
2609 
2610     /**
2611      *  weighted_pred_flag
2612      */
2613     WORD8 i1_weighted_pred_flag;
2614 
2615     /**
2616      *  weighted_bipred_flag
2617      */
2618     WORD8 i1_weighted_bipred_flag;
2619 
2620     /**
2621      *  output_flag_present_flag
2622      */
2623     WORD8 i1_output_flag_present_flag;
2624 
2625     /**
2626      *  transquant_bypass_enable_flag
2627      */
2628     WORD8 i1_transquant_bypass_enable_flag;
2629 
2630     /**
2631      *  dependent_slice_enabled_flag
2632      */
2633     WORD8 i1_dependent_slice_enabled_flag;
2634 
2635     /**
2636      *  tiles_enabled_flag
2637      */
2638     WORD8 i1_tiles_enabled_flag;
2639 
2640     /**
2641      *  entropy_coding_sync_enabled_flag
2642      */
2643     WORD8 i1_entropy_coding_sync_enabled_flag;
2644 
2645     /**
2646      * entropy_slice_enabled_flag
2647      */
2648     WORD8 i1_entropy_slice_enabled_flag;
2649 
2650     /**
2651      *  num_tile_columns_minus1
2652      */
2653     WORD8 i1_num_tile_columns;
2654 
2655     /**
2656      *  num_tile_rows_minus1
2657      */
2658     WORD8 i1_num_tile_rows;
2659 
2660     /**
2661      *  uniform_spacing_flag
2662      */
2663     WORD8 i1_uniform_spacing_flag;
2664 
2665     /**
2666      *  loop_filter_across_tiles_enabled_flag
2667      */
2668     WORD8 i1_loop_filter_across_tiles_enabled_flag;
2669 
2670     /**
2671      *  loop_filter_across_slices_enabled_flag
2672      */
2673     WORD8 i1_loop_filter_across_slices_enabled_flag;
2674 
2675     /**
2676      *  deblocking_filter_control_present_flag
2677      */
2678     WORD8 i1_deblocking_filter_control_present_flag;
2679 
2680     /**
2681      *  deblocking_filter_override_enabled_flag
2682      */
2683     WORD8 i1_deblocking_filter_override_enabled_flag;
2684 
2685     /**
2686      *  pic_disable_deblocking_filter_flag
2687      */
2688     WORD8 i1_pic_disable_deblocking_filter_flag;
2689 
2690     /**
2691      *  beta_offset_div2
2692      */
2693     WORD8 i1_beta_offset_div2;
2694 
2695     /**
2696      *  tc_offset_div2
2697      */
2698     WORD8 i1_tc_offset_div2;
2699 
2700     /**
2701      *  pps_scaling_list_data_present_flag
2702      */
2703     WORD8 i1_pps_scaling_list_data_present_flag;
2704 
2705     /**
2706      * lists_modification_present_flag
2707      */
2708     WORD8 i1_lists_modification_present_flag;
2709 
2710     /**
2711      * num_extra_slice_header_bits
2712      */
2713     WORD8 i1_num_extra_slice_header_bits;
2714 
2715     /**
2716      *  log2_parallel_merge_level_minus2
2717      */
2718     WORD8 i1_log2_parallel_merge_level;
2719 
2720     /**
2721      *  slice_header_extension_present_flag
2722      */
2723     WORD8 i1_slice_header_extension_present_flag;
2724 
2725     /**
2726      *  slice_extension_present_flag
2727      */
2728     WORD8 i1_slice_extension_present_flag;
2729 
2730     /**
2731      *  scaling_list_dc_coef_minus8
2732      */
2733     /*************************************************************************/
2734     /* DC value of the scaling list                                          */
2735     /* Only 16 x 16 and 32 x 32 scaling lists have valid entries.            */
2736     /* Entries stored for all sizes for uniformity.                          */
2737     /* Remaining will be initialized to default values if used               */
2738     /*************************************************************************/
2739     UWORD8 au1_scaling_list_dc_coef[TOTAL_SCALE_MAT_COUNT];
2740 
2741     /**
2742      * Log2MinCuQpDeltaSize
2743      */
2744     WORD8 i1_log2_min_cu_qp_delta_size;
2745 
2746 
2747     /*
2748      * Flag indicating if the PPS is parsed
2749      */
2750     WORD8 i1_pps_valid;
2751 
2752 }pps_t;
2753 
2754 
2755 /**
2756  * Structure to hold slice header info
2757  */
2758 typedef struct
2759 {
2760     /**
2761      *  entry_point_offset[ i ]
2762      */
2763     WORD32 *pi4_entry_point_offset;
2764 
2765     /**
2766      *  poc_lsb_lt[ i ]
2767      */
2768     WORD32 ai4_poc_lsb_lt[MAX_DPB_SIZE];
2769 
2770     /**
2771      *  slice_header_extension_length
2772      */
2773     WORD16 i2_slice_header_extension_length;
2774 
2775     /**
2776      *  slice_address
2777      */
2778     WORD16 i2_slice_address;
2779 
2780     /**
2781      *  first_slice_in_pic_flag
2782      */
2783     WORD8 i1_first_slice_in_pic_flag;
2784 
2785     /* PPS id */
2786     WORD8 i1_pps_id;
2787     /**
2788      *  no_output_of_prior_pics_flag
2789      */
2790     WORD8 i1_no_output_of_prior_pics_flag;
2791 
2792     /**
2793      *  dependent_slice_flag
2794      */
2795     WORD8 i1_dependent_slice_flag;
2796 
2797     /**
2798      *  slice_type
2799      */
2800     WORD8 i1_slice_type;
2801 
2802     /**
2803      *  pic_output_flag
2804      */
2805     WORD8 i1_pic_output_flag;
2806 
2807     /**
2808      *  colour_plane_id
2809      */
2810     WORD8 i1_colour_plane_id;
2811 
2812     /**
2813      *  pic_order_cnt_lsb
2814      */
2815     WORD32 i4_pic_order_cnt_lsb;
2816 
2817     /**
2818      *  absolute pic_order_cnt
2819      */
2820     WORD32 i4_abs_pic_order_cnt;
2821 
2822     /**
2823      *  short_term_ref_pic_set_sps_flag
2824      */
2825     WORD8 i1_short_term_ref_pic_set_sps_flag;
2826 
2827     /**
2828      *  short_term_ref_pic_set_idx
2829      */
2830     WORD8 i1_short_term_ref_pic_set_idx;
2831 
2832     /**
2833      *  num_long_term_sps
2834      */
2835     WORD8 i1_num_long_term_sps;
2836 
2837     /**
2838      *  num_long_term_pics
2839      */
2840     WORD8 i1_num_long_term_pics;
2841 
2842     /**
2843      *  lt_idx_sps[ i ]
2844      */
2845     WORD8 ai1_lt_idx_sps[MAX_DPB_SIZE];
2846 
2847     /**
2848      *  used_by_curr_pic_lt_flag[ i ]
2849      */
2850     WORD8 ai1_used_by_curr_pic_lt_flag[MAX_DPB_SIZE];
2851 
2852     /**
2853      *  delta_poc_msb_present_flag[ i ]
2854      */
2855     WORD8 ai1_delta_poc_msb_present_flag[MAX_DPB_SIZE];
2856 
2857     /**
2858      *  delta_poc_msb_cycle_lt[ i ]
2859      */
2860     WORD8 ai1_delta_poc_msb_cycle_lt[MAX_DPB_SIZE];
2861 
2862     /**
2863      *  slice_sao_luma_flag
2864      */
2865     WORD8 i1_slice_sao_luma_flag;
2866 
2867     /**
2868      *  slice_sao_chroma_flag
2869      */
2870     WORD8 i1_slice_sao_chroma_flag;
2871 
2872     /**
2873      *  slice_temporal_mvp_enable_flag
2874      */
2875     WORD8 i1_slice_temporal_mvp_enable_flag;
2876 
2877     /**
2878      *  num_ref_idx_active_override_flag
2879      */
2880     WORD8 i1_num_ref_idx_active_override_flag;
2881 
2882     /**
2883      *  num_ref_idx_l0_active_minus1
2884      */
2885     WORD8 i1_num_ref_idx_l0_active;
2886 
2887     /**
2888      *  num_ref_idx_l1_active_minus1
2889      */
2890     WORD8 i1_num_ref_idx_l1_active;
2891 
2892     /**
2893      *  mvd_l1_zero_flag
2894      */
2895     WORD8 i1_mvd_l1_zero_flag;
2896 
2897     /**
2898      *  cabac_init_flag
2899      */
2900     WORD8 i1_cabac_init_flag;
2901 
2902     /**
2903      *  collocated_from_l0_flag
2904      */
2905     WORD8 i1_collocated_from_l0_flag;
2906 
2907     /**
2908      *  collocated_ref_idx
2909      */
2910     WORD8 i1_collocated_ref_idx;
2911 
2912     /**
2913      * five_minus_max_num_merge_cand
2914      */
2915     WORD8 i1_max_num_merge_cand;
2916 
2917     /**
2918      *  slice_qp_delta
2919      */
2920     WORD8 i1_slice_qp_delta;
2921 
2922     /**
2923      *  slice_cb_qp_offset
2924      */
2925     WORD8 i1_slice_cb_qp_offset;
2926 
2927     /**
2928      *  slice_cr_qp_offset
2929      */
2930     WORD8 i1_slice_cr_qp_offset;
2931 
2932     /**
2933      *  deblocking_filter_override_flag
2934      */
2935     WORD8 i1_deblocking_filter_override_flag;
2936 
2937     /**
2938      *  slice_disable_deblocking_filter_flag
2939      */
2940     WORD8 i1_slice_disable_deblocking_filter_flag;
2941 
2942     /**
2943      *  beta_offset_div2
2944      */
2945     WORD8 i1_beta_offset_div2;
2946 
2947     /**
2948      *  tc_offset_div2
2949      */
2950     WORD8 i1_tc_offset_div2;
2951 
2952     /**
2953      *  slice_loop_filter_across_slices_enabled_flag
2954      */
2955     WORD8 i1_slice_loop_filter_across_slices_enabled_flag;
2956 
2957     /**
2958      *  NUmber of entry point offsets
2959      */
2960     WORD32 i4_num_entry_point_offsets;
2961 
2962     /**
2963      *  offset_len_minus1
2964      */
2965     WORD8 i1_offset_len;
2966 
2967     /**
2968      *  Entry point offsets
2969      */
2970     WORD32 *pu4_entry_point_offset;
2971 
2972     /**
2973      * Short term reference picture set
2974      */
2975     stref_picset_t s_stref_picset;
2976 
2977     /**
2978      *  Weight and offset info for Weighted prediction
2979      */
2980     pred_wt_ofst_t s_wt_ofst;
2981 
2982     /**
2983      *  Reference prediction list modification
2984      */
2985     rplm_t s_rplm;
2986 
2987     /**
2988      *  First CTB' X pos : slice_address % i2_pic_wd_in_ctb
2989      */
2990     WORD16 i2_ctb_x;
2991 
2992     /**
2993      *  First CTB' Y pos : slice_address / i2_pic_wd_in_ctb
2994      */
2995     WORD16 i2_ctb_y;
2996 
2997     /**
2998      * L0 Reference pic lists
2999      */
3000     ref_list_t as_ref_pic_list0[MAX_DPB_SIZE];
3001 
3002     /**
3003      * L1 Reference pic lists
3004      */
3005     ref_list_t as_ref_pic_list1[MAX_DPB_SIZE];
3006 
3007     /**
3008      * NAL unit type of the slice
3009      */
3010     WORD8 i1_nal_unit_type;
3011 
3012     /**
3013      * Low delay check flag
3014      */
3015     WORD8 i1_low_delay_flag;
3016 
3017     /**
3018      * The last independent slice's start ctb_x
3019      * If the current slice is independent, it is the same as the current CTBs ctb_x
3020      */
3021     WORD16 i2_independent_ctb_x;
3022 
3023     /**
3024      * The last independent slice's start ctb_y
3025      * If the current slice is independent, it is the same as the current CTBs ctb_y
3026      */
3027     WORD16 i2_independent_ctb_y;
3028 
3029 
3030     UWORD8 u1_parse_data_init_done;
3031 
3032     /**
3033      * Temporal ID in NAL header
3034      */
3035     WORD32 u4_nuh_temporal_id;
3036 }slice_header_t;
3037 
3038 
3039 
3040 
3041 
3042 
3043 
3044 
3045 #endif /* _IHEVC_STRUCTS_H_ */
3046