• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright (C) 2015 The Android Open Source Project
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  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 
21 /**
22 *******************************************************************************
23 * @file
24 *  ih264e_structs.h
25 *
26 * @brief
27 *  Structure definitions used in the encoder
28 *
29 * @author
30 *  Harish
31 *
32 * @remarks
33 *  None
34 *
35 *******************************************************************************
36 */
37 
38 #ifndef IH264E_STRUCTS_H_
39 #define IH264E_STRUCTS_H_
40 
41 /*****************************************************************************/
42 /* Structure definitions                                                    */
43 /*****************************************************************************/
44 
45 /* Early declaration of structs */
46 typedef struct _codec_t codec_t;
47 typedef struct _proc_t process_ctxt_t;
48 
49 
50 /*****************************************************************************/
51 /* Extern Function type definitions                                          */
52 /*****************************************************************************/
53 
54 /**
55 ******************************************************************************
56  *  @brief      intra prediction filters leaf level
57 ******************************************************************************
58  */
59 typedef void (*pf_intra_pred)(UWORD8 *pu1_src, UWORD8 *pu1_dst,
60                               WORD32 src_strd, WORD32 dst_strd,
61                               WORD32 ui_neighboravailability);
62 
63 /**
64 ******************************************************************************
65  *  @brief      inter prediction filters leaf level
66 ******************************************************************************
67  */
68 
69 typedef void (*pf_inter_pred_luma_bilinear)(UWORD8 *pu1_src1, UWORD8 *pu1_src2, UWORD8 *pu1_dst,
70                                             WORD32 src_strd1, WORD32 src_strd2, WORD32 dst_strd,
71                                             WORD32 height, WORD32 width);
72 
73 /**
74 ******************************************************************************
75  *  @brief      fwd transform leaf level
76 ******************************************************************************
77  */
78 typedef void (*pf_trans_quant)(UWORD8*pu1_src, UWORD8 *pu1_pred, WORD16 *pi2_out,
79                                WORD32 i4_src_stride, UWORD32 u4_pred_stride, UWORD32 u4_dst_stride,
80                                const UWORD16 *pu2_scale_mat, const UWORD16 *pu2_thresh_mat,
81                                UWORD32 u4_qbit, UWORD32 u4_round_fact, UWORD8 *pu1_nnz);
82 
83 typedef void (*pf_iquant_itrans)(WORD16 *pi2_src, UWORD8 *pu1_pred, UWORD8 *pu1_out,
84                                  WORD32 i4_src_stride, UWORD32 u4_pred_stride, UWORD32 u4_out_stride,
85                                  const UWORD16 *pu2_iscale_mat, const UWORD16 *pu2_weigh_mat,
86                                  UWORD32 qp_div, WORD32 *pi4_tmp);
87 
88 /**
89 ******************************************************************************
90  *  @brief      Padding leaf level
91 ******************************************************************************
92  */
93 typedef void (*pf_pad)(UWORD8 *pu1_src, WORD32 src_strd, WORD32 wd, WORD32 pad_size);
94 
95 /**
96 ******************************************************************************
97  *  @brief      memory handling leaf level
98 ******************************************************************************
99  */
100 typedef void (*pf_memcpy)(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes);
101 
102 typedef void (*pf_memset)(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes);
103 
104 typedef void (*pf_memcpy_mul8)(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes);
105 
106 typedef void (*pf_memset_mul8)(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes);
107 
108 /**
109 ******************************************************************************
110  *  @brief      Sad computation
111 ******************************************************************************
112  */
113 typedef void (*pf_compute_sad)(UWORD8 *pu1_src, UWORD8 *pu1_est,
114                                UWORD32 src_strd, UWORD32 est_strd,
115                                WORD32 i4_max_sad, WORD32 *pi4_mb_distortion);
116 
117 /**
118 ******************************************************************************
119  *  @brief     Intra mode eval:encoder level
120 ******************************************************************************
121  */
122 typedef void (*pf_evaluate_intra_modes)(UWORD8 *pu1_src, UWORD8 *pu1_ngbr_pels_i16, UWORD8 *pu1_dst,
123                                         UWORD32 src_strd, UWORD32 dst_strd,
124                                         WORD32 u4_n_avblty, UWORD32 *u4_intra_mode,
125                                         WORD32 *pu4_sadmin,
126                                         UWORD32 u4_valid_intra_modes);
127 
128 typedef void (*pf_evaluate_intra_4x4_modes)(UWORD8 *pu1_src, UWORD8 *pu1_ngbr_pels, UWORD8 *pu1_dst,
129                                             UWORD32 src_strd, UWORD32 dst_strd,
130                                             WORD32 u4_n_avblty, UWORD32 *u4_intra_mode,
131                                             WORD32 *pu4_sadmin,
132                                             UWORD32 u4_valid_intra_modes, UWORD32 u4_lambda,
133                                             UWORD32 u4_predictd_mode);
134 
135 /**
136 ******************************************************************************
137  *  @brief     half_pel generation :encoder level
138 ******************************************************************************
139  */
140 typedef void (*pf_sixtapfilter_horz)(UWORD8 *pu1_src, UWORD8 *pu1_dst,
141                                      WORD32 src_strd, WORD32 dst_strd);
142 
143 typedef void (*pf_sixtap_filter_2dvh_vert)(UWORD8 *pu1_src, UWORD8 *pu1_dst1, UWORD8 *pu1_dst2,
144                                            WORD32 src_strd, WORD32 dst_strd,
145                                            WORD32 *pi16_pred1,
146                                            WORD32 pi16_pred1_strd);
147 /**
148 ******************************************************************************
149  *  @brief     color space conversion
150 ******************************************************************************
151  */
152 typedef void (*pf_fmt_conv_420p_to_420sp)(UWORD8 *pu1_y_src, UWORD8 *pu1_u_src, UWORD8 *pu1_v_src,
153                                           UWORD8 *pu1_y_dst, UWORD8 *pu1_uv_dst,
154                                           UWORD16 u2_height, UWORD16 u2_width,
155                                           UWORD16 src_y_strd, UWORD16 src_u_strd, UWORD16 src_v_strd,
156                                           UWORD16 dst_y_strd, UWORD16 dst_uv_strd,
157                                           UWORD32 convert_uv_only);
158 
159 typedef void (*pf_fmt_conv_422ile_to_420sp)(UWORD8 *pu1_y_buf, UWORD8 *pu1_u_buf, UWORD8 *pu1_v_buf,
160                                             UWORD8 *pu1_422i_buf,
161                                             WORD32 u4_y_width, WORD32 u4_y_height, WORD32 u4_y_stride,
162                                             WORD32 u4_u_stride, WORD32 u4_v_stride,
163                                             WORD32 u4_422i_stride);
164 
165 
166 
167 /**
168 ******************************************************************************
169  *  @brief     ME evaluation
170 ******************************************************************************
171  */
172 typedef void ih264e_compute_me_ft(process_ctxt_t *);
173 
174 /**
175 ******************************************************************************
176  *  @brief     SKIP decision
177 ******************************************************************************
178  */
179 typedef WORD32 ih264e_skip_params_ft(process_ctxt_t *, WORD32);
180 
181 
182 /*****************************************************************************/
183 /* Enums                                                                     */
184 /*****************************************************************************/
185 
186 /**
187  ******************************************************************************
188  *  @enum  CODEC_STATE_T
189  *  @brief codec state
190  ******************************************************************************
191  */
192 typedef enum
193 {
194     INIT_DONE,
195     HEADER_DONE,
196     FIRST_FRAME_DONE,
197 } CODEC_STATE_T;
198 
199 
200 /**
201  ******************************************************************************
202  *  @enum  JOBQ_CMD_T
203  *  @brief list of job commands (used during job instantiation)
204  ******************************************************************************
205  */
206 typedef enum
207 {
208     CMD_PROCESS,
209     CMD_ENTROPY,
210     CMD_FMTCONV,
211     CMD_ME,
212 }JOBQ_CMD_T;
213 
214 
215 /*****************************************************************************/
216 /* Structures                                                                */
217 /*****************************************************************************/
218 
219 /**
220  * PU information
221  */
222 typedef struct
223 {
224     /**
225      *  Motion Vector
226      */
227     mv_t s_mv;
228 
229     /**
230      *  Ref index
231      */
232     WORD8   i1_ref_idx;
233 
234 } enc_pu_mv_t;
235 
236 
237 /*
238  * Total Pu info for an MB
239  */
240 typedef struct
241 {
242 
243     /* Array with ME info for all lists */
244     enc_pu_mv_t  s_me_info[2];
245 
246     /**
247      *  PU X position in terms of min PU (4x4) units
248      */
249     UWORD32     b4_pos_x        : 4;
250 
251     /**
252      *  PU Y position in terms of min PU (4x4) units
253      */
254     UWORD32     b4_pos_y        : 4;
255 
256     /**
257      *  PU width in pixels = (b4_wd + 1) << 2
258      */
259     UWORD32     b4_wd           : 2;
260 
261     /**
262      *  PU height in pixels = (b4_ht + 1) << 2
263      */
264     UWORD32     b4_ht           : 2;
265 
266     /**
267      *  Intra or Inter flag for each partition - 0 or 1
268      */
269     UWORD32     b1_intra_flag   : 1;
270 
271     /**
272      *  PRED_L0, PRED_L1, PRED_BI
273      */
274     UWORD32     b2_pred_mode    : 2;
275 
276 
277 } enc_pu_t;
278 
279 
280 typedef struct
281 {
282     /** Descriptor of raw buffer                                     */
283     iv_raw_buf_t                            s_raw_buf;
284 
285     /** Lower 32bits of time stamp corresponding to the above buffer */
286     UWORD32                                 u4_timestamp_low;
287 
288     /** Upper 32bits of time stamp corresponding to the above buffer */
289     UWORD32                                 u4_timestamp_high;
290 
291     /** Flag to indicate if the current buffer is last buffer */
292     UWORD32                                 u4_is_last;
293 
294     /** Flag to indicate if mb info is sent along with input buffer     */
295     UWORD32                                 u4_mb_info_type;
296 
297     /** Flag to indicate the size of mb info structure                  */
298     UWORD32                                 u4_mb_info_size;
299 
300     /** Buffer containing mb info if mb_info_type is non-zero           */
301     void                                    *pv_mb_info;
302 
303     /** Flag to indicate if pic info is sent along with input buffer     */
304     UWORD32                                 u4_pic_info_type;
305 
306     /** Buffer containing pic info if mb_info_type is non-zero           */
307     void                                    *pv_pic_info;
308 
309 }inp_buf_t;
310 
311 typedef struct
312 {
313     /** Descriptor of bitstream buffer                                     */
314     iv_bits_buf_t                           s_bits_buf;
315 
316     /** Lower 32bits of time stamp corresponding to the above buffer */
317     UWORD32                                 u4_timestamp_low;
318 
319     /** Upper 32bits of time stamp corresponding to the above buffer */
320     UWORD32                                 u4_timestamp_high;
321 
322     /** Flag to indicate if the current buffer is last buffer */
323     UWORD32                                 u4_is_last;
324 
325 }out_buf_t;
326 
327 typedef struct
328 {
329     /** Descriptor of picture buffer                                     */
330     pic_buf_t                               s_pic_buf;
331 
332     /** Lower 32bits of time stamp corresponding to the above buffer */
333     UWORD32                                 u4_timestamp_low;
334 
335     /** Upper 32bits of time stamp corresponding to the above buffer */
336     UWORD32                                 u4_timestamp_high;
337 
338     /** Flag to indicate if the current buffer is last buffer */
339     UWORD32                                 u4_is_last;
340 
341     /** Picture count corresponding to current picture */
342     WORD32                                  i4_pic_cnt;
343 
344 }rec_buf_t;
345 
346 typedef struct
347 {
348     /** maximum width for which codec should request memory requirements    */
349     UWORD32                                     u4_max_wd;
350 
351     /** maximum height for which codec should request memory requirements   */
352     UWORD32                                     u4_max_ht;
353 
354     /** Maximum number of reference frames                                  */
355     UWORD32                                     u4_max_ref_cnt;
356 
357     /** Maximum number of reorder frames                                    */
358     UWORD32                                     u4_max_reorder_cnt;
359 
360     /** Maximum level supported                                             */
361     UWORD32                                     u4_max_level;
362 
363     /** Input color format                                                  */
364     IV_COLOR_FORMAT_T                           e_inp_color_fmt;
365 
366     /** Flag to enable/disable - To be used only for debugging/testing      */
367     UWORD32                                     u4_enable_recon;
368 
369     /** Recon color format                                                  */
370     IV_COLOR_FORMAT_T                           e_recon_color_fmt;
371 
372     /** Encoder Speed preset - Value between 0 (slowest) and 100 (fastest)  */
373     IVE_SPEED_CONFIG                            u4_enc_speed_preset;
374 
375     /** Rate control mode                                                   */
376     IVE_RC_MODE_T                               e_rc_mode;
377 
378     /** Maximum frame rate to be supported                                  */
379     UWORD32                                     u4_max_framerate;
380 
381     /** Maximum bitrate to be supported                                     */
382     UWORD32                                     u4_max_bitrate;
383 
384     /** Maximum number of consecutive  B frames                             */
385     UWORD32                                     u4_num_bframes;
386 
387     /** Content type Interlaced/Progressive                                 */
388     IV_CONTENT_TYPE_T                           e_content_type;
389 
390     /** Maximum search range to be used in X direction                      */
391     UWORD32                                     u4_max_srch_rng_x;
392 
393     /** Maximum search range to be used in Y direction                      */
394     UWORD32                                     u4_max_srch_rng_y;
395 
396     /** Slice Mode                                                          */
397     IVE_SLICE_MODE_T                            e_slice_mode;
398 
399     /** Slice parameter                                                     */
400     UWORD32                                     u4_slice_param;
401 
402     /** Processor architecture                                          */
403     IV_ARCH_T                                   e_arch;
404 
405     /** SOC details                                                     */
406     IV_SOC_T                                    e_soc;
407 
408     /** Input width to be sent in bitstream                                */
409     UWORD32                                     u4_disp_wd;
410 
411     /** Input height to be sent in bitstream                               */
412     UWORD32                                     u4_disp_ht;
413 
414     /** Input width                                                     */
415     UWORD32                                     u4_wd;
416 
417     /** Input height                                                    */
418     UWORD32                                     u4_ht;
419 
420     /** Input stride                                                    */
421     UWORD32                                     u4_strd;
422 
423     /** Source frame rate                                               */
424     UWORD32                                     u4_src_frame_rate;
425 
426     /** Target frame rate                                               */
427     UWORD32                                     u4_tgt_frame_rate;
428 
429     /** Target bitrate in kilobits per second                           */
430     UWORD32                                     u4_target_bitrate;
431 
432     /** Force current frame type                                        */
433     IV_PICTURE_CODING_TYPE_T                    e_frame_type;
434 
435     /** Encoder mode                                                    */
436     IVE_ENC_MODE_T                              e_enc_mode;
437 
438     /** Set initial Qp for I pictures                                   */
439     UWORD32                                     u4_i_qp;
440 
441     /** Set initial Qp for P pictures                                   */
442     UWORD32                                     u4_p_qp;
443 
444     /** Set initial Qp for B pictures                                   */
445     UWORD32                                     u4_b_qp;
446 
447     /** Set minimum Qp for I pictures                                   */
448     UWORD32                                     u4_i_qp_min;
449 
450     /** Set maximum Qp for I pictures                                   */
451     UWORD32                                     u4_i_qp_max;
452 
453     /** Set minimum Qp for P pictures                                   */
454     UWORD32                                     u4_p_qp_min;
455 
456     /** Set maximum Qp for P pictures                                   */
457     UWORD32                                     u4_p_qp_max;
458 
459     /** Set minimum Qp for B pictures                                   */
460     UWORD32                                     u4_b_qp_min;
461 
462     /** Set maximum Qp for B pictures                                   */
463     UWORD32                                     u4_b_qp_max;
464 
465     /** Adaptive intra refresh mode                                     */
466     IVE_AIR_MODE_T                              e_air_mode;
467 
468     /** Adaptive intra refresh period in frames                         */
469     UWORD32                                     u4_air_refresh_period;
470 
471     /** VBV buffer delay                                                */
472     UWORD32                                     u4_vbv_buffer_delay;
473 
474     /** VBV buffer size                                                 */
475     UWORD32                                     u4_vbv_buf_size;
476 
477     /** Number of cores to be used                                      */
478     UWORD32                                     u4_num_cores;
479 
480     /** ME speed preset - Value between 0 (slowest) and 100 (fastest)      */
481     UWORD32                                     u4_me_speed_preset;
482 
483     /** Flag to enable/disable half pel motion estimation               */
484     UWORD32                                     u4_enable_hpel;
485 
486     /** Flag to enable/disable quarter pel motion estimation            */
487     UWORD32                                     u4_enable_qpel;
488 
489     /** Flag to enable/disable intra 4x4 analysis                       */
490     UWORD32                                     u4_enable_intra_4x4;
491 
492     /** Flag to enable/disable intra 8x8 analysis                       */
493     UWORD32                                     u4_enable_intra_8x8;
494 
495     /** Flag to enable/disable intra 16x16 analysis                     */
496     UWORD32                                     u4_enable_intra_16x16;
497 
498     /** Flag to enable/disable fast SAD approximation                   */
499     UWORD32                                     u4_enable_fast_sad;
500 
501     /*flag to enable/disable alternate reference frames                 */
502     UWORD32                                     u4_enable_alt_ref;
503 
504     /*Flag to enable/disable computation of SATDQ in ME*/
505     UWORD32                                     u4_enable_satqd;
506 
507     /*Minimum SAD to search for*/
508     WORD32                                     i4_min_sad;
509 
510     /** Maximum search range in X direction for farthest reference      */
511     UWORD32                                     u4_srch_rng_x;
512 
513     /** Maximum search range in Y direction for farthest reference      */
514     UWORD32                                     u4_srch_rng_y;
515 
516     /** I frame interval                                                */
517     UWORD32                                     u4_i_frm_interval;
518 
519     /** IDR frame interval                                              */
520     UWORD32                                     u4_idr_frm_interval;
521 
522     /** Disable deblock level (0: Enable completely, 3: Disable completely */
523     UWORD32                                     u4_disable_deblock_level;
524 
525     /** Profile                                                         */
526     IV_PROFILE_T                                e_profile;
527 
528     /** Lower 32bits of time stamp corresponding to input buffer,
529      * from which this command takes effect                             */
530     UWORD32                                     u4_timestamp_low;
531 
532     /** Upper 32bits of time stamp corresponding to input buffer,
533      * from which this command takes effect                             */
534     UWORD32                                     u4_timestamp_high;
535 
536     /** Flag to say if the current config parameter set is valid
537      * Will be zero to start with and will be set to 1, when configured
538      * Once encoder uses the parameter set, this will be set to zero */
539     UWORD32                                     u4_is_valid;
540 
541     /** Command associated with this config param set */
542     IVE_CONTROL_API_COMMAND_TYPE_T              e_cmd;
543 
544     /** Input width in mbs                                                    */
545     UWORD32                                     i4_wd_mbs;
546 
547     /** Input height in mbs                                                   */
548     UWORD32                                     i4_ht_mbs;
549 
550     /** entropy coding mode flag                                              */
551     UWORD32                                     u4_entropy_coding_mode;
552 
553     /** enable weighted prediction                                            */
554     UWORD32                                     u4_weighted_prediction;
555 
556     /** enable constrained intra prediction                                   */
557     UWORD32                                     u4_constrained_intra_pred;
558 
559     /** Pic info type */
560     UWORD32                                     u4_pic_info_type;
561     /**
562      * MB info type
563      */
564     UWORD32                                     u4_mb_info_type;
565 
566     /** VUI structure                                                         */
567     vui_t                                       s_vui;
568 
569 }cfg_params_t;
570 
571 
572 
573 /** Structure to hold format conversion context */
574 typedef struct
575 {
576     /** Current row for which format conversion should be done */
577     WORD32 i4_cur_row;
578 
579     /** Number of rows for which format conversion should be done */
580     WORD32 i4_num_rows;
581 
582 }fmt_conv_t;
583 
584 
585 /**
586  * Structure to represent a processing job entry
587  */
588 typedef struct
589 {
590     /**
591      * Command
592      */
593     WORD32 i4_cmd;
594 
595     /**
596      * MB x of the starting MB
597      */
598     WORD16 i2_mb_x;
599 
600     /**
601      * MB y of the starting MB
602      */
603 
604     WORD16 i2_mb_y;
605 
606     /**
607      * Number of MBs that need to be processed in this job
608      */
609     WORD16 i2_mb_cnt;
610 
611     /**
612      * Process contexts base index
613      * Will toggle between 0 and MAX_PROCESS_THREADS
614      */
615     WORD16 i2_proc_base_idx;
616 
617 } job_t;
618 
619 
620 /**
621  * Structure to represent a MV Bank buffer
622  */
623 typedef struct
624 {
625     /**
626      *  Pointer to hold num PUs each MB in a picture
627      */
628     UWORD32 *pu4_mb_pu_cnt;
629 
630     /**
631      * Pointer to hold enc_pu_t for each PU in a picture
632      */
633     enc_pu_t *ps_pic_pu;
634 
635     /**
636      * Pointer to hold PU map for each MB in a picture
637      */
638     UWORD8 *pu1_pic_pu_map;
639 
640     /**
641      * Pointer to hold the Slice map
642      */
643     UWORD16 *pu1_pic_slice_map;
644 
645     /**
646      * Absolute POC for the current MV Bank
647      */
648     WORD32 i4_abs_poc;
649 
650     /**
651      * Buffer Id
652      */
653     WORD32     i4_buf_id;
654 
655 } mv_buf_t;
656 
657 
658 /**
659  * Reference set containing pointers to MV buf and pic buf
660  */
661 typedef struct
662 {
663     /** Picture count */
664     WORD32    i4_pic_cnt;
665 
666     /** POC */
667     WORD32    i4_poc;
668 
669     /** picture buffer */
670     pic_buf_t *ps_pic_buf;
671 
672     /** mv buffer */
673     mv_buf_t  *ps_mv_buf;
674 
675 }ref_set_t;
676 
677 typedef struct
678 {
679 
680     /**
681      * Pointer to current PPS
682      */
683     pps_t *ps_pps;
684 
685     /**
686      * Pointer to current SPS
687      */
688     sps_t *ps_sps;
689 
690     /**
691      * Pointer to current slice header structure
692      */
693     slice_header_t *ps_slice_hdr;
694 
695     /**
696      * MB's x position within a picture in raster scan in MB units
697      */
698     WORD32 i4_mb_x;
699 
700     /**
701      * MB's y position within a picture in raster scan in MB units
702      */
703 
704     WORD32 i4_mb_y;
705 
706     /**
707      * Current PU structure - set to MB enc_pu_t pointer at the start of MB processing and incremented
708      * for every TU
709      */
710     enc_pu_t *ps_pu;
711 
712     /**
713      * Pointer to frame level enc_pu_t for the current frame being parsed
714      * where MVs and Intra pred modes will be updated
715      */
716     enc_pu_t *ps_pic_pu;
717 
718     /**
719      *  Pointer to hold num PUs each MB in a picture
720      */
721     UWORD32 *pu4_mb_pu_cnt;
722 
723     /** PU Index map per MB. The indices in this map are w.r.t picture pu array and not
724      * w.r.t MB pu array.
725      * This will be used during mv prediction and since neighbors will have different MB pu map
726      * it will be easier if they all have indices w.r.t picture level PU array rather than MB level
727      * PU array.
728      * pu1_pic_pu_map is map w.r.t MB's enc_pu_t array
729      */
730     UWORD32 *pu4_pic_pu_idx_map;
731 
732     /**
733       * Pointer to pu_map for the current frame being parsed
734       * where MVs and Intra pred modes will be updated
735       */
736      UWORD8 *pu1_pic_pu_map;
737 
738      /**
739       *  PU count in current MB
740       */
741      WORD32 i4_mb_pu_cnt;
742 
743      /**
744       *  PU count in current MB
745       */
746      WORD32 i4_mb_start_pu_idx;
747 
748      /**
749       *  Top availability for current MB level
750       */
751      UWORD8 u1_top_mb_avail;
752 
753      /**
754       *  Top right availability for current MB level
755       */
756      UWORD8 u1_top_rt_mb_avail;
757      /**
758       *  Top left availability for current MB level
759       */
760      UWORD8 u1_top_lt_mb_avail;
761      /**
762       *  left availability for current MB level
763       */
764      UWORD8 u1_left_mb_avail;
765 
766 }mv_ctxt_t;
767 
768 typedef struct
769 {
770     /**
771      * MB's x position within a picture in raster scan in MB units
772      */
773     WORD32 i4_mb_x;
774 
775     /**
776      * MB's y position within a picture in raster scan in MB units
777      */
778     WORD32 i4_mb_y;
779 
780     /**
781      * MB's x position within a Slice in raster scan in MB units
782      */
783     WORD32 i4_mb_slice_x;
784 
785     /**
786      * MB's y position within a Slice in raster scan in MB units
787      */
788     WORD32 i4_mb_slice_y;
789 
790     /**
791      * Vertical strength, Two bits per edge.
792      * Stored in format. BS[15] | BS[14] | .. |BS[0]
793      */
794     UWORD32 *pu4_pic_vert_bs;
795 
796     /**
797      * Boundary strength, Two bits per edge.
798      * Stored in format. BS[15] | BS[14] | .. |BS[0]
799      */
800     UWORD32 *pu4_pic_horz_bs;
801 
802     /**
803      *  Qp array stored for each mb
804      */
805     UWORD8  *pu1_pic_qp;
806 
807 }bs_ctxt_t;
808 
809 typedef struct
810 {
811     /**
812      * MB's x position within a picture in raster scan in MB units
813      */
814     WORD32 i4_mb_x;
815 
816     /**
817      * MB's y position within a picture in raster scan in MB units
818      */
819     WORD32 i4_mb_y;
820 
821     /**
822      * structure that contains BS and QP frame level arrays
823      */
824     bs_ctxt_t s_bs_ctxt;
825 
826     /**
827      * Pointer to 0th luma pixel in current pic
828      */
829     UWORD8 *pu1_cur_pic_luma;
830 
831     /**
832      * Pointer to 0th chroma pixel in current pic
833      */
834     UWORD8 *pu1_cur_pic_chroma;
835 
836     /**
837      *  Points to the array of slice indices which is used to identify the slice
838      *  to which each MB in a frame belongs.
839      */
840     UWORD8 *pu1_slice_idx;
841 
842 }deblk_ctxt_t;
843 
844 
845 /**
846  ******************************************************************************
847  *  @brief      Structure to hold data and flags for 'n' mb processing for
848  *                deblocking , padding and half pel generation.
849  ******************************************************************************
850  */
851 typedef struct
852 {
853     /**
854      * MB's x position last processed + 1
855      */
856     WORD32 i4_mb_x;
857 
858     /**
859      * MB's y position ,current processing.
860      */
861     WORD32 i4_mb_y;
862 
863     /**
864      * Number of MBs processed in a stretch
865      */
866     WORD32 i4_n_mbs;
867 
868 }n_mb_process_ctxt_t;
869 
870 
871 /**
872 ******************************************************************************
873  *  @brief      Structure to hold coefficient info for a 4x4 subblock.
874  *  The following can be used to type-cast coefficient data that is stored
875  *  per subblock. Note that though i2_level is shown as an array that
876  *  holds 16 coefficients, only the first few entries will be valid. Next
877  *  subblocks data starts after the valid number of coefficients. Number
878  *  of non-zero coefficients will be derived using number of non-zero bits
879  *  in sig coeff map
880 ******************************************************************************
881  */
882 typedef struct
883 {
884     /**
885      * significant coefficient map and nnz are packed in
886      * to msb (2 bytes) and lsb (2 bytes) respectively
887      */
888     WORD32  i4_sig_map_nnz;
889 
890     /**
891      * array of non zero residue coefficients
892      */
893     WORD16  ai2_residue[16];
894 
895 }tu_sblk_coeff_data_t;
896 
897 /**
898 ******************************************************************************
899  *  @brief      Structure contains few common state variables such as MB indices,
900  *  current SPS, PPS etc which are to be used in the entropy thread. By keeping
901  *  it a different structure it is being explicitly signaled that these
902  * variables are specific to entropy threads context and other threads should
903  * not update these elements
904 ******************************************************************************
905  */
906 typedef struct
907 {
908     /**
909      * Pointer to the cabac context
910      */
911     cabac_ctxt_t *ps_cabac;
912 
913     /**
914      * start of frame / start of slice flag
915      */
916     WORD32 i4_sof;
917 
918     /**
919      * end of frame / end of slice flag
920      */
921     WORD32 i4_eof;
922 
923     /**
924      * generate header upon request
925      */
926     WORD32 i4_gen_header;
927 
928     /**
929      *  seq_parameter_set_id
930      */
931     UWORD32 u4_sps_id;
932 
933     /**
934      * Pointer to base of sequence parameter set structure array
935      */
936     sps_t *ps_sps_base;
937 
938     /**
939      *  pic_parameter_set_id
940      */
941     UWORD32 u4_pps_id;
942 
943     /**
944      * Pointer to base of Picture parameter set structure array
945      */
946     pps_t *ps_pps_base;
947 
948     /**
949      * Current slice idx
950      */
951     WORD32 i4_cur_slice_idx;
952 
953     /**
954      * Points to the array of slice indices which is used to identify the independent slice
955      * to which each MB in a frame belongs.
956      */
957     UWORD8 *pu1_slice_idx;
958 
959     /**
960      * Pointer to base of slice header structure array
961      */
962     slice_header_t *ps_slice_hdr_base;
963 
964     /**
965      * entropy status
966      */
967     UWORD8  *pu1_entropy_map;
968 
969     /**
970      * MB's x position within a picture in raster scan in MB units
971      */
972     WORD32 i4_mb_x;
973 
974     /**
975      * MB's y position within a picture in raster scan in MB units
976      */
977     WORD32 i4_mb_y;
978 
979     /**
980      * MB start address
981      */
982     WORD32 i4_mb_cnt;
983 
984     /**
985      * MB start address
986      */
987     WORD32 i4_mb_start_add;
988 
989     /**
990      * MB end address
991      */
992     WORD32 i4_mb_end_add;
993 
994     /**
995      * Input width in mbs
996      */
997     WORD32 i4_wd_mbs;
998 
999     /**
1000      * Input height in mbs
1001      */
1002     WORD32 i4_ht_mbs;
1003 
1004     /**
1005      * Bitstream structure
1006      */
1007     bitstrm_t *ps_bitstrm;
1008 
1009     /**
1010      *  transform_8x8_mode_flag
1011      */
1012     WORD8 i1_transform_8x8_mode_flag;
1013 
1014     /**
1015      *  entropy_coding_mode_flag
1016      */
1017     WORD8 u1_entropy_coding_mode_flag;
1018 
1019     /**
1020      * Pointer to the top row nnz for luma
1021      */
1022     UWORD8 (*pu1_top_nnz_luma)[4];
1023 
1024     /**
1025      * left nnz for luma
1026      */
1027     UWORD32 u4_left_nnz_luma;
1028 
1029     /**
1030      * Pointer to zero runs before for the mb
1031      */
1032     UWORD8  au1_zero_run[16];
1033 
1034     /**
1035      * Pointer to the top row nnz for chroma
1036      */
1037     UWORD8 (*pu1_top_nnz_cbcr)[4];
1038 
1039     /**
1040      * left nnz for chroma
1041      */
1042     UWORD8 u4_left_nnz_cbcr;
1043 
1044     /**
1045      * Pointer frame level mb subblock coeff data
1046      */
1047     void *pv_pic_mb_coeff_data;
1048 
1049     /**
1050      * Pointer to mb subblock coeff data and number of subblocks and scan idx
1051      * Incremented each time a coded subblock is processed
1052      */
1053     void *pv_mb_coeff_data;
1054 
1055     /**
1056      * Pointer frame level mb header data
1057      */
1058     void *pv_pic_mb_header_data;
1059 
1060     /**
1061      * Pointer to mb header data and
1062      * incremented each time a coded mb is encoded
1063      */
1064     void *pv_mb_header_data;
1065 
1066     /**
1067      * Error code during parse stage
1068      */
1069     IH264E_ERROR_T i4_error_code;
1070 
1071     /**
1072      * Void pointer to job context
1073      */
1074     void *pv_proc_jobq, *pv_entropy_jobq;
1075 
1076     /**
1077      * Flag to signal end of frame
1078      */
1079     WORD32 i4_end_of_frame;
1080 
1081     /**
1082      * Abs POC count of the frame
1083      */
1084      WORD32 i4_abs_pic_order_cnt;
1085 
1086      /**
1087       * mb skip run
1088       */
1089      WORD32 *pi4_mb_skip_run;
1090 
1091      /**
1092       * Flag to signal end of sequence
1093       */
1094      UWORD32 u4_is_last;
1095 
1096      /**
1097       * Lower 32bits of time-stamp corresponding to the buffer being encoded
1098       */
1099      UWORD32 u4_timestamp_low;
1100 
1101      /**
1102       * Upper 32bits of time-stamp corresponding to the buffer being encoded
1103       */
1104      UWORD32 u4_timestamp_high;
1105 
1106      /**
1107       * Current Picture count - used for synchronization
1108       */
1109      WORD32  i4_pic_cnt;
1110 
1111      /**
1112       * Number of bits consumed by header for I and P mb types
1113       */
1114      UWORD32 u4_header_bits[MAX_MB_TYPE];
1115 
1116      /**
1117       * Number of bits consumed by residue for I and P mb types
1118       */
1119      UWORD32 u4_residue_bits[MAX_MB_TYPE];
1120 
1121 } entropy_ctxt_t;
1122 
1123 /**
1124 ******************************************************************************
1125 *  @brief      macro block info.
1126 ******************************************************************************
1127 */
1128 typedef struct
1129 {
1130     /**
1131      * mb type
1132      */
1133     UWORD16 u2_is_intra;
1134 
1135     /**
1136      * mb type
1137      */
1138     UWORD16 u2_mb_type;
1139 
1140     /**
1141      * csbp
1142      */
1143     UWORD32 u4_csbp;
1144 
1145     /**
1146      * mb distortion
1147      */
1148     WORD32 i4_mb_distortion;
1149 
1150 }mb_info_t;
1151 
1152 /**
1153 ******************************************************************************
1154 *  @brief     mb_hdr structures to access first few common elements of above
1155 * structures
1156 ******************************************************************************
1157 */
1158 
1159 typedef struct
1160 {
1161     /**
1162      * mb type and mode
1163      */
1164     UWORD8 u1_mb_type_mode;
1165 
1166     /**
1167      * CBP
1168      */
1169     UWORD8 u1_cbp;
1170 
1171     /**
1172      * MB qp delta
1173      */
1174     UWORD8 u1_mb_qp_delta;
1175 
1176     /**
1177      * Element to align structure to 2 byte boundary
1178      */
1179     UWORD8 u1_pad;
1180 }mb_hdr_common_t;
1181 
1182 /**
1183 ******************************************************************************
1184 *  @brief      macro block info for I4x4 MB
1185 ******************************************************************************
1186 */
1187 typedef struct
1188 {
1189     /**
1190      * Common MB header params
1191      */
1192     mb_hdr_common_t common;
1193 
1194     /**
1195      * Sub block modes, 2 modes per byte
1196      */
1197     UWORD8 au1_sub_blk_modes[8];
1198 }mb_hdr_i4x4_t;
1199 
1200 /**
1201 ******************************************************************************
1202 *  @brief      macro block info for I8x8 MB
1203 ******************************************************************************
1204 */
1205 typedef struct
1206 {
1207     /**
1208      * Common MB header params
1209      */
1210     mb_hdr_common_t common;
1211 
1212 
1213     /**
1214      * Sub block modes, 2 modes per byte
1215      */
1216     UWORD8 au1_sub_blk_modes[2];
1217 }mb_hdr_i8x8_t;
1218 
1219 /**
1220 ******************************************************************************
1221 *  @brief      macro block info for I16x16 MB
1222 ******************************************************************************
1223 */
1224 typedef struct
1225 {
1226     /**
1227      * Common MB header params
1228      */
1229     mb_hdr_common_t common;
1230 
1231 }mb_hdr_i16x16_t;
1232 
1233 /**
1234 ******************************************************************************
1235 *  @brief      macro block info for P16x16 MB
1236 ******************************************************************************
1237 */
1238 typedef struct
1239 {
1240     /**
1241      * Common MB header params
1242      */
1243     mb_hdr_common_t common;
1244 
1245     /**
1246      * MV
1247      */
1248     WORD16 ai2_mv[2];
1249 }mb_hdr_p16x16_t;
1250 
1251 /**
1252 ******************************************************************************
1253 *  @brief      macro block info for PSKIP MB
1254 ******************************************************************************
1255 */
1256 typedef struct
1257 {
1258     /**
1259      * Common MB header params
1260      */
1261     mb_hdr_common_t common;
1262 
1263 }mb_hdr_pskip_t;
1264 
1265 /**
1266 ******************************************************************************
1267 *  @brief      macro block info for B16x16 MB
1268 ******************************************************************************
1269 */
1270 typedef struct
1271 {
1272     /**
1273      * Common MB header params
1274      */
1275     mb_hdr_common_t common;
1276 
1277 
1278     /**
1279      * MV
1280      */
1281     WORD16 ai2_mv[2][2];
1282 }mb_hdr_b16x16_t;
1283 
1284 /**
1285 ******************************************************************************
1286 *  @brief      macro block info for BDIRECT MB
1287 ******************************************************************************
1288 */
1289 typedef struct
1290 {
1291     /**
1292      * Common MB header params
1293      */
1294     mb_hdr_common_t common;
1295 
1296 }mb_hdr_bdirect_t;
1297 
1298 /**
1299 ******************************************************************************
1300 *  @brief      macro block info for PSKIP MB
1301 ******************************************************************************
1302 */
1303 typedef struct
1304 {
1305     /**
1306      * Common MB header params
1307      */
1308     mb_hdr_common_t common;
1309 
1310 }mb_hdr_bskip_t;
1311 
1312 /**
1313 ******************************************************************************
1314 *  @brief      Union of mb_hdr structures for size calculation
1315 *  and to access first few common elements
1316 ******************************************************************************
1317 */
1318 
1319 typedef union
1320 {
1321     mb_hdr_i4x4_t       mb_hdr_i4x4;
1322     mb_hdr_i8x8_t       mb_hdr_i8x8;
1323     mb_hdr_i16x16_t     mb_hdr_i16x16;
1324     mb_hdr_p16x16_t     mb_hdr_p16x16;
1325     mb_hdr_pskip_t      mb_hdr_pskip;
1326     mb_hdr_b16x16_t     mb_hdr_b16x16;
1327     mb_hdr_bdirect_t    mb_hdr_bdirect;
1328     mb_hdr_bskip_t      mb_hdr_bskip;
1329 }mb_hdr_t;
1330 /**
1331 ******************************************************************************
1332 *  @brief      structure presenting the neighbor availability of a mb
1333 *  or subblk or any other partition
1334 ******************************************************************************
1335 */
1336 typedef struct
1337 {
1338     /**
1339      * left blk/subblk/partition
1340      */
1341     UWORD8 u1_mb_a;
1342 
1343     /**
1344      * top blk/subblk/partition
1345      */
1346     UWORD8 u1_mb_b;
1347 
1348     /**
1349      * topright blk/subblk/partition
1350      */
1351     UWORD8 u1_mb_c;
1352 
1353     /**
1354      * topleft blk/subblk/partition
1355      */
1356     UWORD8 u1_mb_d;
1357 
1358 }block_neighbors_t;
1359 
1360 /**
1361  ******************************************************************************
1362  *  @brief      MB info  related variables used during NMB processing
1363  ******************************************************************************
1364  */
1365 typedef struct
1366 {
1367     UWORD32 u4_mb_type;
1368     UWORD32 u4_min_sad;
1369     UWORD32 u4_min_sad_reached;
1370     WORD32  i4_mb_cost;
1371     WORD32  i4_mb_distortion;
1372 
1373     enc_pu_mv_t as_skip_mv[4];
1374 
1375     enc_pu_mv_t as_pred_mv[2];
1376 
1377     block_neighbors_t s_ngbr_avbl;
1378 
1379     /*
1380      * Buffer to hold best subpel buffer in each MB of NMB
1381      */
1382     UWORD8 *pu1_best_sub_pel_buf;
1383 
1384     /*
1385      * Stride for subpel buffer
1386      */
1387     UWORD32 u4_bst_spel_buf_strd;
1388 
1389 }mb_info_nmb_t;
1390 
1391 /**
1392  ******************************************************************************
1393  *  @brief      Pixel processing thread context
1394  ******************************************************************************
1395  */
1396 struct _proc_t
1397 {
1398     /**
1399      * entropy context
1400      */
1401     entropy_ctxt_t s_entropy;
1402 
1403     /**
1404      * me context
1405      */
1406     me_ctxt_t s_me_ctxt;
1407 
1408     /**
1409      * Pointer to codec context
1410      */
1411     codec_t *ps_codec;
1412 
1413     /**
1414      * N mb process contest
1415      */
1416     n_mb_process_ctxt_t s_n_mb_ctxt;
1417 
1418     /**
1419      * Source pointer to current MB luma
1420      */
1421     UWORD8 *pu1_src_buf_luma;
1422 
1423     /**
1424      * Source pointer to current MB chroma
1425      */
1426     UWORD8 *pu1_src_buf_chroma;
1427 
1428     /**
1429      * Recon pointer to current MB luma
1430      */
1431     UWORD8 *pu1_rec_buf_luma;
1432 
1433     /**
1434      * Recon pointer to current MB chroma
1435      */
1436     UWORD8 *pu1_rec_buf_chroma;
1437 
1438     /**
1439      * Ref pointer to current MB luma
1440      */
1441     UWORD8 *apu1_ref_buf_luma[MAX_REF_PIC_CNT];
1442 
1443     /**
1444      * Ref pointer to current MB chroma
1445      */
1446     UWORD8 *apu1_ref_buf_chroma[MAX_REF_PIC_CNT];
1447 
1448     /**
1449      * pointer to luma plane of input buffer (base :: mb (0,0))
1450      */
1451     UWORD8 *pu1_src_buf_luma_base;
1452 
1453     /**
1454      * pointer to luma plane of reconstructed buffer (base :: mb (0,0))
1455      */
1456     UWORD8 *pu1_rec_buf_luma_base;
1457 
1458     /**
1459      * pointer to luma plane of ref buffer (base :: mb (0,0))
1460      */
1461     UWORD8 *apu1_ref_buf_luma_base[MAX_REF_PIC_CNT];
1462 
1463     /**
1464      * pointer to  chroma plane of input buffer (base :: mb (0,0))
1465      */
1466     UWORD8 *pu1_src_buf_chroma_base;
1467 
1468     /*
1469      * Buffer for color space conversion of luma
1470      */
1471     UWORD8 *pu1_y_csc_buf;
1472 
1473     /*
1474      * Buffer for color space conversion of luma
1475      */
1476 
1477     UWORD8 *pu1_uv_csc_buf;
1478 
1479     /**
1480      * pointer to  chroma plane of reconstructed buffer (base :: mb (0,0))
1481      */
1482     UWORD8 *pu1_rec_buf_chroma_base;
1483 
1484     /**
1485      * pointer to  chroma plane of reconstructed buffer (base :: mb (0,0))
1486      */
1487     UWORD8 *apu1_ref_buf_chroma_base[MAX_REF_PIC_CNT];
1488 
1489     /**
1490      * Pointer to ME NMB info
1491      */
1492     mb_info_nmb_t *ps_nmb_info;
1493 
1494     mb_info_nmb_t *ps_cur_mb;
1495 
1496     /**
1497      * source luma stride
1498      */
1499     WORD32 i4_src_strd;
1500 
1501     /**
1502      * source chroma stride
1503      */
1504     WORD32 i4_src_chroma_strd;
1505 
1506     /**
1507      * recon stride & ref stride
1508      * (strides for luma and chroma are the same)
1509      */
1510     WORD32 i4_rec_strd;
1511 
1512     /**
1513      * Offset for half pel x plane from the pic buf
1514      */
1515     UWORD32 u4_half_x_offset;
1516 
1517     /**
1518      * Offset for half pel y plane from half x plane
1519      */
1520     UWORD32 u4_half_y_offset;
1521 
1522     /**
1523      * Offset for half pel xy plane from half y plane
1524      */
1525     UWORD32 u4_half_xy_offset;
1526 
1527     /**
1528      * pred buffer pointer (temp buffer 1)
1529      */
1530     UWORD8 *pu1_pred_mb;
1531 
1532     /**
1533      * pred buffer pointer (prediction buffer for intra 16x16
1534      */
1535     UWORD8 *pu1_pred_mb_intra_16x16;
1536 
1537     /**
1538      * pred buffer pointer (prediction buffer for intra 16x16_plane
1539      */
1540     UWORD8 *pu1_pred_mb_intra_16x16_plane;
1541 
1542     /**
1543      * pred buffer pointer (prediction buffer for intra chroma
1544      */
1545     UWORD8 *pu1_pred_mb_intra_chroma;
1546 
1547     /**
1548      * pred buffer pointer (prediction buffer for intra chroma plane
1549      */
1550     UWORD8 *pu1_pred_mb_intra_chroma_plane;
1551 
1552     /**
1553      * temp. reference buffer ptr for intra 4x4 when rdopt is on
1554      */
1555     UWORD8 *pu1_ref_mb_intra_4x4;
1556 
1557     /**
1558      * prediction buffer stride
1559      */
1560     WORD32 i4_pred_strd;
1561 
1562     /**
1563      * transform buffer pointer (temp buffer 2)
1564      */
1565     WORD16 *pi2_res_buf;
1566 
1567     /**
1568      * temp. transform buffer ptr for intra 4x4 when rdopt is on
1569      */
1570     WORD16 *pi2_res_buf_intra_4x4;
1571 
1572     /**
1573      * transform buffer stride
1574      */
1575     WORD32 i4_res_strd;
1576 
1577     /**
1578      * scratch buffer for inverse transform (temp buffer 3)
1579      */
1580     void *pv_scratch_buff;
1581 
1582     /**
1583      * frame num
1584      */
1585     WORD32 i4_frame_num;
1586 
1587     /**
1588      * start address of frame / sub-frame
1589      */
1590     WORD32 i4_frame_strt_add;
1591 
1592     /**
1593      *  IDR pic
1594      */
1595     UWORD32 u4_is_idr;
1596 
1597     /**
1598      *  idr_pic_id
1599      */
1600     UWORD32 u4_idr_pic_id;
1601 
1602     /**
1603      * Input width in mbs
1604      */
1605     WORD32 i4_wd_mbs;
1606 
1607     /**
1608      * Input height in mbs
1609      */
1610     WORD32 i4_ht_mbs;
1611 
1612     /**
1613      *  slice_type
1614      */
1615     WORD32  i4_slice_type;
1616 
1617     /**
1618      * Current slice idx
1619      */
1620     WORD32 i4_cur_slice_idx;
1621 
1622     /**
1623      * MB's x position within a picture in raster scan in MB units
1624      */
1625     WORD32 i4_mb_x;
1626 
1627     /**
1628      * MB's y position within a picture in raster scan in MB units
1629      */
1630     WORD32 i4_mb_y;
1631 
1632     /**
1633      * MB's x position within a Slice in raster scan in MB units
1634      */
1635     WORD32 i4_mb_slice_x;
1636 
1637     /**
1638      * MB's y position within a Slice in raster scan in MB units
1639      */
1640     WORD32 i4_mb_slice_y;
1641 
1642     /**
1643      *  mb type
1644      */
1645     UWORD32 u4_mb_type;
1646 
1647     /**
1648      *  is intra
1649      */
1650     UWORD32 u4_is_intra;
1651 
1652     /**
1653      * mb neighbor availability pointer
1654      */
1655     block_neighbors_t *ps_ngbr_avbl;
1656 
1657     /**
1658      * lambda (lagrange multiplier for cost computation)
1659      */
1660     UWORD32 u4_lambda;
1661 
1662     /**
1663      * mb distortion
1664      */
1665     WORD32 i4_mb_distortion;
1666 
1667     /**
1668      * mb cost
1669      */
1670     WORD32 i4_mb_cost;
1671 
1672     /********************************************************************/
1673     /* i4_ngbr_avbl_mb_16 - ngbr avbl of curr mb                        */
1674     /* i4_ngbr_avbl_sb_8 - ngbr avbl of all 8x8 sub blocks of curr mb   */
1675     /* i4_ngbr_avbl_sb_4 - ngbr avbl of all 4x4 sub blocks of curr mb   */
1676     /* i4_ngbr_avbl_mb_c - chroma ngbr avbl of curr mb                  */
1677     /********************************************************************/
1678     WORD32  i4_ngbr_avbl_16x16_mb;
1679     WORD32  ai4_neighbor_avail_8x8_subblks[4];
1680     UWORD8  au1_ngbr_avbl_4x4_subblks[16];
1681     WORD32  i4_chroma_neighbor_avail_8x8_mb;
1682 
1683     /**
1684      * array to store the mode of mb sub blocks
1685      */
1686     UWORD8  au1_intra_luma_mb_4x4_modes[16];
1687 
1688     /**
1689      * array to store the predicted mode of mb sub blks
1690      */
1691     UWORD8  au1_predicted_intra_luma_mb_4x4_modes[16];
1692 
1693     /**
1694      * macro block intra 16x16 mode
1695      */
1696     UWORD8  u1_l_i16_mode;
1697 
1698     /**
1699      * array to store the mode of the macro block intra 8x8 4 modes
1700      */
1701     UWORD8  au1_intra_luma_mb_8x8_modes[4];
1702 
1703     /**
1704      * intra chroma mb mode
1705      */
1706     UWORD8  u1_c_i8_mode;
1707 
1708     /********************************************************************/
1709     /* array to store pixels from the neighborhood for intra prediction */
1710     /* i16 - 16 left pels + 1 top left pel + 16 top pels = 33 pels      */
1711     /* i8 - 8 lpels + 1 tlpels + 8 tpels + 8 tr pels = 25 pels          */
1712     /* i4 - 4 lpels + 1 tlpels + 4 tpels + 4 tr pels = 13 pels          */
1713     /* ic - 8 left pels + 1 top left pel + 8 top pels )*2               */
1714     /********************************************************************/
1715     UWORD8 au1_ngbr_pels[34];
1716 
1717     /**
1718      * array for 8x8 intra pels filtering (temp buff 4)
1719      */
1720     UWORD8 au1_neighbor_pels_i8x8_unfiltered[25];
1721 
1722     /**
1723      * Number of sub partitons in the inter pred MB
1724      */
1725     UWORD32 u4_num_sub_partitions;
1726 
1727     /**
1728      *  Pointer to hold num PUs each MB in a picture
1729      */
1730     UWORD32 *pu4_mb_pu_cnt;
1731 
1732     /**
1733      * Pointer to the array of structures having motion vectors, size
1734      *  and position of sub partitions
1735      */
1736     enc_pu_t *ps_pu;
1737 
1738     /**
1739      * Pointer to the pu of current co-located MB in list 1
1740      */
1741     enc_pu_t *ps_colpu;
1742 
1743     /**
1744      * predicted motion vector
1745      */
1746     enc_pu_mv_t *ps_skip_mv;
1747 
1748     /**
1749      * predicted motion vector
1750      */
1751     enc_pu_mv_t *ps_pred_mv;
1752 
1753     /**
1754      * top row mb syntax information base
1755      * In normal working scenarios, for a given context set,
1756      * the mb syntax info pointer is identical across all process threads.
1757      * But when the hard bound on slices are enabled, in multi core, frame
1758      * is partitioned in to sections equal to set number of cores and each
1759      * partition is run independently. In this scenario, a ctxt set will alone
1760      * appear to run multiple frames at a time. For this to occur, the common
1761      * pointers across the proc ctxt should disappear.
1762      *
1763      * This is done by allocating MAX_PROCESS_THREADS memory and distributing
1764      * across individual ctxts when byte bnd per slice is enabled.
1765      */
1766     mb_info_t *ps_top_row_mb_syntax_ele_base;
1767 
1768     /**
1769      * top row mb syntax information
1770      */
1771     mb_info_t *ps_top_row_mb_syntax_ele;
1772 
1773     /**
1774      * left mb syntax information
1775      */
1776     mb_info_t s_left_mb_syntax_ele;
1777 
1778     /**
1779      * top left mb syntax information
1780      */
1781     mb_info_t s_top_left_mb_syntax_ele;
1782 
1783     /**
1784      * top left mb syntax information
1785      */
1786 
1787     mb_info_t s_top_left_mb_syntax_ME;
1788 
1789     /**
1790      * left mb motion vector
1791      */
1792     enc_pu_t s_left_mb_pu_ME;
1793 
1794     /**
1795      * top left mb motion vector
1796      */
1797     enc_pu_t s_top_left_mb_pu_ME;
1798 
1799     /**
1800      * mb neighbor availability pointer
1801      */
1802     block_neighbors_t s_ngbr_avbl;
1803 
1804     /**
1805      * In case the macroblock type is intra, the intra modes of all
1806      * partitions for the left mb are stored in the array below
1807      */
1808     UWORD8 au1_left_mb_intra_modes[16];
1809 
1810     /**
1811      * In case the macroblock type is intra, the intra modes of all
1812      * partitions for the top mb are stored in the array below
1813      *
1814      * In normal working scenarios, for a given context set,
1815      * the mb syntax info pointer is identical across all process threads.
1816      * But when the hard bound on slices are enabled, in multi core, frame
1817      * is partitioned in to sections equal to set number of cores and each
1818      * partition is run independently. In this scenario, a ctxt set will alone
1819      * appear to run multiple frames at a time. For this to occur, the common
1820      * pointers across the proc ctxt should disappear.
1821      *
1822      * This is done by allocating MAX_PROCESS_THREADS memory and distributing
1823      * across individual ctxts when byte bnd per slice is enabled.
1824      */
1825     UWORD8 *pu1_top_mb_intra_modes_base;
1826 
1827     /**
1828      * In case the macroblock type is intra, the intra modes of all
1829      * partitions for the top mb are stored in the array below
1830      */
1831     UWORD8 *pu1_top_mb_intra_modes;
1832 
1833     /**
1834      * left mb motion vector
1835      */
1836     enc_pu_t s_left_mb_pu;
1837 
1838     /**
1839      * top left mb motion vector
1840      */
1841     enc_pu_t s_top_left_mb_pu;
1842 
1843     /**
1844      * top row motion vector info
1845      *
1846      * In normal working scenarios, for a given context set,
1847      * the top row pu pointer is identical across all process threads.
1848      * But when the hard bound on slices are enabled, in multi core, frame
1849      * is partitioned in to sections equal to set number of cores and each
1850      * partition is run independently. In this scenario, a ctxt set will alone
1851      * appear to run multiple frames at a time. For this to occur, the common
1852      * pointers across the proc ctxt should disappear.
1853      *
1854      * This is done by allocating MAX_PROCESS_THREADS memory and distributing
1855      * across individual ctxts when byte bnd per slice is enabled.
1856      */
1857     enc_pu_t *ps_top_row_pu_base;
1858 
1859     /**
1860      * top row motion vector info
1861      */
1862     enc_pu_t *ps_top_row_pu;
1863 
1864     enc_pu_t *ps_top_row_pu_ME;
1865 
1866     /**
1867      * coded block pattern
1868      */
1869     UWORD32 u4_cbp;
1870 
1871     /**
1872      * csbp
1873      */
1874     UWORD32 u4_csbp;
1875 
1876     /**
1877      *  number of non zero coeffs
1878      */
1879     UWORD32 au4_nnz[5];
1880 
1881     /**
1882      *  number of non zero coeffs for intra 4x4 when rdopt is on
1883      */
1884     UWORD32 au4_nnz_intra_4x4[4];
1885 
1886     /**
1887      * frame qp & mb qp
1888      */
1889     UWORD32 u4_frame_qp, u4_mb_qp;
1890 
1891     /**
1892      * mb qp previous
1893      */
1894     UWORD32 u4_mb_qp_prev;
1895 
1896     /**
1897      * quantization parameters for luma & chroma planes
1898      */
1899     quant_params_t *ps_qp_params[3];
1900 
1901     /**
1902      * Pointer frame level mb subblock coeff data
1903      */
1904     void *pv_pic_mb_coeff_data;
1905 
1906     /**
1907      * Pointer to mb subblock coeff data and number of subblocks and scan idx
1908      * Incremented each time a coded subblock is processed
1909      */
1910     void *pv_mb_coeff_data;
1911 
1912     /**
1913      * Pointer frame level mb header data
1914      */
1915     void *pv_pic_mb_header_data;
1916 
1917     /**
1918      * Pointer to mb header data and
1919      * incremented each time a coded mb is encoded
1920      */
1921     void *pv_mb_header_data;
1922 
1923     /**
1924      * Signal that pic_init is called first time
1925      */
1926     WORD32 i4_first_pic_init;
1927 
1928     /**
1929      * Current MV Bank's buffer ID
1930      */
1931     WORD32 i4_cur_mv_bank_buf_id;
1932 
1933     /**
1934      * Void pointer to job context
1935      */
1936     void *pv_proc_jobq, *pv_entropy_jobq;
1937 
1938     /**
1939      * Number of MBs to be processed in the current Job
1940      */
1941     WORD32 i4_mb_cnt;
1942 
1943     /**
1944      * ID for the current context - Used for debugging
1945      */
1946     WORD32 i4_id;
1947 
1948     /**
1949      * Pointer to current picture buffer structure
1950      */
1951     pic_buf_t *ps_cur_pic;
1952 
1953     /**
1954      * Pointer to current picture's mv buffer structure
1955      */
1956     mv_buf_t *ps_cur_mv_buf;
1957 
1958     /**
1959      * Flag to indicate if ps_proc was initialized at least once in a frame.
1960      * This is needed to handle cases where a core starts to handle format
1961      * conversion jobs directly
1962      */
1963     WORD32 i4_init_done;
1964 
1965     /**
1966      * Process status: one byte per MB
1967      */
1968     UWORD8 *pu1_proc_map;
1969 
1970     /**
1971      * Deblk status: one byte per MB
1972      */
1973     UWORD8 *pu1_deblk_map;
1974 
1975     /**
1976      * Process status: one byte per MB
1977      */
1978     UWORD8 *pu1_me_map;
1979 
1980     /*
1981      * Intra refresh mask.
1982      * Indicates if an Mb is coded in intra mode within the current AIR interval
1983      * NOTE Refreshes after each AIR period
1984      * NOTE The map is shared between process
1985      */
1986     UWORD8 *pu1_is_intra_coded;
1987 
1988     /**
1989      * Disable deblock level (0: Enable completely, 3: Disable completely
1990      */
1991     UWORD32 u4_disable_deblock_level;
1992 
1993     /**
1994      * Pointer to the structure that contains deblock context
1995      */
1996     deblk_ctxt_t s_deblk_ctxt;
1997 
1998     /**
1999      * Points to the array of slice indices which is used to identify the independent
2000      * slice to which each MB in a frame belongs.
2001      */
2002     UWORD8 *pu1_slice_idx;
2003 
2004     /**
2005      * Pointer to base of slice header structure array
2006      */
2007     slice_header_t *ps_slice_hdr_base;
2008 
2009     /**
2010      * Number of mb's to process in one loop
2011      */
2012     WORD32 i4_nmb_ntrpy;
2013 
2014     /**
2015      * Number of mb's to process in one loop
2016      */
2017     UWORD32 u4_nmb_me;
2018 
2019     /**
2020      * Structure for current input buffer
2021      */
2022     inp_buf_t s_inp_buf;
2023 
2024     /**
2025      * api call cnt
2026      */
2027     WORD32 i4_encode_api_call_cnt;
2028 
2029     /**
2030      * Current Picture count - used for synchronization
2031      */
2032     WORD32 i4_pic_cnt;
2033 
2034     /**
2035       * Intermediate buffer for interpred leaf level functions
2036       */
2037     WORD32 ai16_pred1[HP_BUFF_WD * HP_BUFF_HT];
2038 
2039     /**
2040      * Reference picture for the current picture
2041      * TODO: Only 2 reference assumed currently
2042      */
2043     pic_buf_t *aps_ref_pic[MAX_REF_PIC_CNT];
2044 
2045     /**
2046      * Reference MV buff for the current picture
2047      */
2048     mv_buf_t *aps_mv_buf[MAX_REF_PIC_CNT];
2049 
2050     /**
2051      * frame info used by RC
2052      */
2053     frame_info_t s_frame_info;
2054 
2055     /*
2056      * NOTE NOT PERSISTANT INSIDE FUNCTIONS
2057      * Min sad for current MB
2058      * will be populated initially
2059      * Once a sad less than eq to u4_min_sad is reached, the value will be copied to the cariable
2060      */
2061     UWORD32  u4_min_sad;
2062 
2063     /*
2064      * indicates weather we have rached minimum sa or not
2065      */
2066     UWORD32 u4_min_sad_reached;
2067 
2068     /**
2069      * Current error code
2070      */
2071     WORD32 i4_error_code;
2072 
2073     /*
2074      * Enables or disables computation of recon
2075      */
2076     UWORD32 u4_compute_recon;
2077 
2078     /*
2079      * Temporary buffers to be used for subpel computation
2080      */
2081     UWORD8 *apu1_subpel_buffs[SUBPEL_BUFF_CNT];
2082 
2083     /*
2084      * Buffer holding best sub pel values
2085      */
2086     UWORD8 *pu1_best_subpel_buf;
2087 
2088     /*
2089      * Stride for buffer holding best sub pel
2090      */
2091     UWORD32 u4_bst_spel_buf_strd;
2092 
2093 };
2094 
2095 /**
2096  ******************************************************************************
2097  *  @brief      Rate control related variables
2098  ******************************************************************************
2099  */
2100 typedef struct
2101 {
2102     void *pps_rate_control_api;
2103 
2104     void *pps_frame_time;
2105 
2106     void *pps_time_stamp;
2107 
2108     void *pps_pd_frm_rate;
2109 
2110     /**
2111      * frame rate pull down
2112      */
2113     WORD32 pre_encode_skip[MAX_CTXT_SETS];
2114 
2115     /**
2116      * skip frame (cbr)
2117      */
2118     WORD32 post_encode_skip[MAX_CTXT_SETS];
2119 
2120     /**
2121      * rate control type
2122      */
2123     rc_type_e e_rc_type;
2124 
2125     /**
2126      * pic type
2127      */
2128     picture_type_e e_pic_type;
2129 
2130     /**
2131      * intra cnt in previous frame
2132      */
2133     WORD32 num_intra_in_prev_frame;
2134 
2135     /**
2136      * avg activity of prev frame
2137      */
2138     WORD32 i4_avg_activity;
2139 
2140 }rate_control_ctxt_t;
2141 
2142 /**
2143  * Codec context
2144  */
2145 struct _codec_t
2146 {
2147     /**
2148      * Id of current pic (input order)
2149      */
2150     WORD32 i4_poc;
2151 
2152     /**
2153      * Number of encode frame API calls made
2154      * This variable must only be used for context selection [Read only]
2155      */
2156     WORD32 i4_encode_api_call_cnt;
2157 
2158     /**
2159      * Number of pictures encoded
2160      */
2161     WORD32 i4_pic_cnt;
2162 
2163     /**
2164      * Number of threads created
2165      */
2166     WORD32 i4_proc_thread_cnt;
2167 
2168     /**
2169      * Mutex used to keep the control calls thread-safe
2170      */
2171     void *pv_ctl_mutex;
2172 
2173     /**
2174      * Current active config parameters
2175      */
2176     cfg_params_t s_cfg;
2177 
2178     /**
2179      * Array containing the config parameter sets
2180      */
2181     cfg_params_t as_cfg[MAX_ACTIVE_CONFIG_PARAMS];
2182 
2183     /**
2184      * Color format used by encoder internally
2185      */
2186     IV_COLOR_FORMAT_T e_codec_color_format;
2187 
2188     /**
2189      * recon stride
2190      * (strides for luma and chroma are the same)
2191      */
2192     WORD32 i4_rec_strd;
2193 
2194     /**
2195      * Flag to enable/disable deblocking of a frame
2196      */
2197     WORD32 i4_disable_deblk_pic;
2198 
2199     /**
2200      * Number of continuous frames where deblocking was disabled
2201      */
2202     WORD32 i4_disable_deblk_pic_cnt;
2203 
2204     /**
2205      * frame type
2206      */
2207     PIC_TYPE_T pic_type;
2208 
2209     /**
2210      * frame qp
2211      */
2212     UWORD32 u4_frame_qp;
2213 
2214     /**
2215      * frame num
2216      */
2217     WORD32 i4_frame_num;
2218 
2219     /**
2220      *  slice_type
2221      */
2222     WORD32  i4_slice_type;
2223 
2224     /*
2225      * Force current frame to specific type
2226      */
2227     IV_PICTURE_CODING_TYPE_T force_curr_frame_type;
2228 
2229     /**
2230      *  IDR pic
2231      */
2232     UWORD32 u4_is_idr;
2233 
2234     /**
2235      *  idr_pic_id
2236      */
2237     WORD32 i4_idr_pic_id;
2238 
2239     /**
2240      * Flush mode
2241      */
2242     WORD32 i4_flush_mode;
2243 
2244     /**
2245      * Encode header mode
2246      */
2247     WORD32 i4_header_mode;
2248 
2249     /**
2250      * Flag to indicate if header has already
2251      * been generated when i4_api_call_cnt 0
2252      */
2253     UWORD32 u4_header_generated;
2254 
2255     /**
2256      * Encode generate header
2257      */
2258     WORD32 i4_gen_header;
2259 
2260     /**
2261      * To signal successful completion of init
2262      */
2263     WORD32 i4_init_done;
2264 
2265     /**
2266      * To signal that at least one picture was decoded
2267      */
2268     WORD32 i4_first_pic_done;
2269 
2270     /**
2271      * Reset flag - Codec is reset if this flag is set
2272      */
2273     WORD32 i4_reset_flag;
2274 
2275     /**
2276      * Current error code
2277      */
2278     WORD32 i4_error_code;
2279 
2280     /**
2281      * threshold residue
2282      */
2283     WORD32 u4_thres_resi;
2284 
2285     /**
2286      * disable intra inter gating
2287      */
2288     UWORD32 u4_inter_gate;
2289 
2290     /**
2291      * Holds mem records passed during init.
2292      * This will be used to return the mem records during retrieve call
2293      */
2294     iv_mem_rec_t *ps_mem_rec_backup;
2295 
2296     /**
2297      * Flag to determine if the entropy thread is active
2298      */
2299     volatile UWORD32 au4_entropy_thread_active[MAX_CTXT_SETS];
2300 
2301     /**
2302      * Mutex used to keep the entropy calls thread-safe
2303      */
2304     void *pv_entropy_mutex;
2305 
2306     /**
2307      * Job queue buffer base
2308      */
2309     void *pv_proc_jobq_buf, *pv_entropy_jobq_buf;
2310 
2311     /**
2312      * Job Queue mem tab size
2313      */
2314     WORD32 i4_proc_jobq_buf_size, i4_entropy_jobq_buf_size;
2315 
2316     /**
2317      * Memory for MV Bank buffer manager
2318      */
2319     void *pv_mv_buf_mgr_base;
2320 
2321     /**
2322      * MV Bank buffer manager
2323      */
2324     void *pv_mv_buf_mgr;
2325 
2326     /**
2327      * Pointer to MV Buf structure array
2328      */
2329     void *ps_mv_buf;
2330 
2331     /**
2332      * Base address for Motion Vector bank buffer
2333      */
2334     void *pv_mv_bank_buf_base;
2335 
2336     /**
2337      * MV Bank size allocated
2338      */
2339     WORD32 i4_total_mv_bank_size;
2340 
2341     /**
2342      * Memory for Picture buffer manager for reference pictures
2343      */
2344     void *pv_ref_buf_mgr_base;
2345 
2346     /**
2347      * Picture buffer manager for reference pictures
2348      */
2349     void *pv_ref_buf_mgr;
2350 
2351     /**
2352      * Number of reference buffers added to the buffer manager
2353      */
2354     WORD32 i4_ref_buf_cnt;
2355 
2356     /**
2357      * Pointer to Pic Buf structure array
2358      */
2359     void *ps_pic_buf;
2360 
2361     /**
2362      * Base address for Picture buffer
2363      */
2364     void *pv_pic_buf_base;
2365 
2366     /**
2367      * Total pic buffer size allocated
2368      */
2369     WORD32 i4_total_pic_buf_size;
2370 
2371     /**
2372      * Memory for Buffer manager for output buffers
2373      */
2374      void *pv_out_buf_mgr_base;
2375 
2376     /**
2377      * Buffer manager for output buffers
2378      */
2379      void *pv_out_buf_mgr;
2380 
2381     /**
2382      * Current output buffer's buffer ID
2383      */
2384     WORD32 i4_out_buf_id;
2385 
2386     /**
2387      * Number of output buffers added to the buffer manager
2388      */
2389     WORD32 i4_out_buf_cnt;
2390 
2391     /**
2392      * Memory for Picture buffer manager for input buffers
2393      */
2394      void *pv_inp_buf_mgr_base;
2395 
2396     /**
2397      * Picture buffer manager for input buffers
2398      */
2399      void *pv_inp_buf_mgr;
2400 
2401     /**
2402      * Current input buffer's buffer ID
2403      */
2404     WORD32 i4_inp_buf_id;
2405 
2406     /**
2407      * Number of input buffers added to the buffer manager
2408      */
2409     WORD32 i4_inp_buf_cnt;
2410 
2411     /**
2412      * Current input buffer
2413      */
2414     pic_buf_t *ps_inp_buf;
2415 
2416     /**
2417      * Pointer to dpb manager structure
2418      */
2419     void *pv_dpb_mgr;
2420 
2421     /**
2422      * Pointer to base of Sequence parameter set structure array
2423      */
2424     sps_t *ps_sps_base;
2425 
2426     /**
2427      * Pointer to base of Picture parameter set structure array
2428      */
2429     pps_t *ps_pps_base;
2430 
2431     /**
2432      *  seq_parameter_set_id
2433      */
2434     WORD32 i4_sps_id;
2435 
2436     /**
2437      *  pic_parameter_set_id
2438      */
2439     WORD32 i4_pps_id;
2440 
2441     /**
2442      * Pointer to base of slice header structure array
2443      */
2444     slice_header_t *ps_slice_hdr_base;
2445 
2446     /**
2447      * packed residue coeff data size for 1 row of mbs
2448      */
2449     UWORD32 u4_size_coeff_data;
2450 
2451     /**
2452      * packed header data size for 1 row of mbs
2453      */
2454     UWORD32 u4_size_header_data;
2455 
2456     /**
2457      * Processing context - One for each processing thread
2458      * Create two sets, each set used for alternate frames
2459      */
2460     process_ctxt_t as_process[MAX_PROCESS_CTXT];
2461 
2462     /**
2463      * Thread handle for each of the processing threads
2464      */
2465     void *apv_proc_thread_handle[MAX_PROCESS_THREADS];
2466 
2467     /**
2468      * Thread created flag for each of the processing threads
2469      */
2470     WORD32 ai4_process_thread_created[MAX_PROCESS_THREADS];
2471 
2472     /**
2473      * Void pointer to process job context
2474      */
2475     void *pv_proc_jobq, *pv_entropy_jobq;
2476 
2477     /**
2478      * Number of MBs processed together for better instruction cache handling
2479      */
2480     WORD32 i4_proc_nmb;
2481 
2482     /**
2483      * Previous POC lsb
2484      */
2485     WORD32 i4_prev_poc_lsb;
2486 
2487     /**
2488      * Previous POC msb
2489      */
2490     WORD32 i4_prev_poc_msb;
2491 
2492     /**
2493      * Max POC lsb that has arrived till now
2494      */
2495     WORD32 i4_max_prev_poc_lsb;
2496 
2497     /**
2498      * Context for format conversion
2499      */
2500     fmt_conv_t s_fmt_conv;
2501 
2502     /**
2503      * Absolute pic order count
2504      */
2505     WORD32 i4_abs_pic_order_cnt;
2506 
2507     /**
2508      *  Pic order count of lsb
2509      */
2510     WORD32 i4_pic_order_cnt_lsb;
2511 
2512     /**
2513      * Array giving current picture being processed in each context set
2514      */
2515     WORD32 ai4_pic_cnt[MAX_CTXT_SETS];
2516 
2517     /*
2518      * Min sad to search for
2519      */
2520     UWORD32 u4_min_sad;
2521 
2522     /**
2523      * Reference picture set
2524      */
2525     ref_set_t as_ref_set[MAX_DPB_SIZE + MAX_CTXT_SETS];
2526 
2527 
2528     /*
2529      * Air pic cnt
2530      * Contains the number of pictures that have been encoded with air
2531      * This value is moudulo air refresh period
2532      */
2533     WORD32 i4_air_pic_cnt;
2534 
2535     /*
2536      * Intra refresh map
2537      * Stores the frames at which intra refresh should occur for a MB
2538      */
2539     UWORD16 *pu2_intr_rfrsh_map;
2540 
2541     /*
2542      * Indicates if the current frame is used as a reference frame
2543      */
2544     UWORD32 u4_is_curr_frm_ref;
2545 
2546     /*
2547      * Indicates if there can be non reference frames in the stream
2548      */
2549     WORD32 i4_non_ref_frames_in_stream;
2550 
2551     /*
2552      * Memory for color space conversion for luma plane
2553      */
2554     UWORD8 *pu1_y_csc_buf_base;
2555 
2556     /*
2557      * Memory for color space conversion foe chroma plane
2558      */
2559     UWORD8 *pu1_uv_csc_buf_base;
2560 
2561     /**
2562      * Function pointers for intra pred leaf level functions luma
2563      */
2564     pf_intra_pred apf_intra_pred_16_l[MAX_I16x16];
2565     pf_intra_pred apf_intra_pred_8_l[MAX_I8x8];
2566     pf_intra_pred apf_intra_pred_4_l[MAX_I4x4];
2567 
2568     /**
2569      * Function pointers for intra pred leaf level functions chroma
2570      */
2571     pf_intra_pred apf_intra_pred_c[MAX_CH_I8x8];
2572 
2573     /**
2574      * luma core coding function pointer
2575      */
2576     UWORD8 (*luma_energy_compaction[4])(process_ctxt_t *ps_proc);
2577 
2578     /**
2579      * chroma core coding function pointer
2580      */
2581     UWORD8 (*chroma_energy_compaction[2])(process_ctxt_t *ps_proc);
2582 
2583     /**
2584      * forward transform for intra blk of mb type 16x16
2585      */
2586     ih264_luma_16x16_resi_trans_dctrans_quant_ft *pf_resi_trans_dctrans_quant_16x16;
2587 
2588     /**
2589      * inverse transform for intra blk of mb type 16x16
2590      */
2591     ih264_luma_16x16_idctrans_iquant_itrans_recon_ft *pf_idctrans_iquant_itrans_recon_16x16;
2592 
2593     /**
2594      * forward transform for 4x4 blk luma
2595      */
2596     ih264_resi_trans_quant_ft *pf_resi_trans_quant_4x4;
2597 
2598     /**
2599      * forward transform for 4x4 blk luma
2600      */
2601     ih264_resi_trans_quant_ft *pf_resi_trans_quant_chroma_4x4;
2602 
2603     /*
2604      * hadamard transform and quant for a 4x4 block
2605      */
2606     ih264_hadamard_quant_ft *pf_hadamard_quant_4x4;
2607 
2608     /*
2609      *  hadamard transform and quant for a 4x4 block
2610      */
2611     ih264_hadamard_quant_ft *pf_hadamard_quant_2x2_uv;
2612 
2613     /**
2614      * inverse transform for 4x4 blk
2615      */
2616     ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_4x4;
2617 
2618     /**
2619      * inverse transform for chroma 4x4 blk
2620      */
2621     ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4;
2622 
2623     /**
2624      * inverse transform for 4x4 blk with only single dc coeff
2625      */
2626     ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_4x4_dc;
2627 
2628     /**
2629      * inverse transform for chroma 4x4 blk with only single dc coeff
2630      */
2631     ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4_dc;
2632 
2633     /*
2634      * Inverse hadamard transform and iquant for a 4x4 block
2635      */
2636     ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_4x4;
2637 
2638     /*
2639      * Inverse hadamard transform and iquant for a 4x4 block
2640      */
2641     ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_2x2_uv;
2642 
2643     /*
2644      * Function for interleave copy*
2645      */
2646     ih264_interleave_copy_ft *pf_interleave_copy;
2647 
2648     /**
2649      * forward transform for 8x8 blk
2650      */
2651     ih264_resi_trans_quant_ft *pf_resi_trans_quant_8x8;
2652 
2653     /**
2654      * inverse transform for 8x8 blk
2655      */
2656     /**
2657      * inverse transform for 4x4 blk
2658      */
2659     ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_8x8;
2660 
2661     /**
2662      * forward transform for chroma MB
2663      */
2664     ih264_chroma_8x8_resi_trans_dctrans_quant_ft *pf_resi_trans_dctrans_quant_8x8_chroma;
2665 
2666     /**
2667      * inverse transform for chroma MB
2668      */
2669     ih264_idctrans_iquant_itrans_recon_ft *pf_idctrans_iquant_itrans_recon_8x8_chroma;
2670 
2671     /**
2672      * deblock vertical luma edge with blocking strength 4
2673      */
2674     ih264_deblk_edge_bs4_ft *pf_deblk_luma_vert_bs4;
2675 
2676     /**
2677      * deblock vertical chroma edge with blocking strength 4
2678      */
2679     ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_vert_bs4;
2680 
2681     /**
2682      * deblock vertical luma edge with blocking strength less than 4
2683      */
2684     ih264_deblk_edge_bslt4_ft *pf_deblk_luma_vert_bslt4;
2685 
2686     /**
2687      * deblock vertical chroma edge with blocking strength less than 4
2688      */
2689     ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_vert_bslt4;
2690 
2691     /**
2692      * deblock horizontal luma edge with blocking strength 4
2693      */
2694     ih264_deblk_edge_bs4_ft *pf_deblk_luma_horz_bs4;
2695 
2696     /**
2697      * deblock horizontal chroma edge with blocking strength 4
2698      */
2699     ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_horz_bs4;
2700 
2701     /**
2702      * deblock horizontal luma edge with blocking strength less than 4
2703      */
2704     ih264_deblk_edge_bslt4_ft *pf_deblk_luma_horz_bslt4;
2705 
2706     /**
2707      * deblock horizontal chroma edge with blocking strength less than 4
2708      */
2709     ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_horz_bslt4;
2710 
2711 
2712     /**
2713      * functions for padding
2714      */
2715     pf_pad pf_pad_top;
2716     pf_pad pf_pad_bottom;
2717     pf_pad pf_pad_left_luma;
2718     pf_pad pf_pad_left_chroma;
2719     pf_pad pf_pad_right_luma;
2720     pf_pad pf_pad_right_chroma;
2721 
2722     /**
2723      * Inter pred leaf level functions
2724      */
2725     ih264_inter_pred_luma_ft    *pf_inter_pred_luma_copy;
2726     ih264_inter_pred_luma_ft    *pf_inter_pred_luma_horz;
2727     ih264_inter_pred_luma_ft    *pf_inter_pred_luma_vert;
2728     pf_inter_pred_luma_bilinear  pf_inter_pred_luma_bilinear;
2729     ih264_inter_pred_chroma_ft  *pf_inter_pred_chroma;
2730 
2731     /**
2732      * fn ptrs for compute sad routines
2733      */
2734     ime_compute_sad_ft *apf_compute_sad_16x16[2];
2735     ime_compute_sad_ft *pf_compute_sad_16x8;
2736 
2737 
2738     /**
2739      * Function pointer for computing ME
2740      * 1 for PSLICE and 1 for BSLICE
2741      */
2742     ih264e_compute_me_ft *apf_compute_me[2];
2743 
2744     /**
2745      * Function pointers for computing SKIP parameters
2746      */
2747     ih264e_skip_params_ft *apf_find_skip_params_me[2];
2748 
2749     /**
2750      * fn ptrs for memory handling operations
2751      */
2752     pf_memcpy pf_mem_cpy;
2753     pf_memset pf_mem_set;
2754     pf_memcpy_mul8 pf_mem_cpy_mul8;
2755     pf_memset_mul8 pf_mem_set_mul8;
2756 
2757     /**
2758      * intra mode eval -encoder level function
2759      */
2760     pf_evaluate_intra_modes pf_ih264e_evaluate_intra16x16_modes;
2761     pf_evaluate_intra_modes pf_ih264e_evaluate_intra_chroma_modes;
2762     pf_evaluate_intra_4x4_modes pf_ih264e_evaluate_intra_4x4_modes;
2763 
2764     /* Half pel generation function - encoder level
2765      *
2766      */
2767     pf_sixtapfilter_horz pf_ih264e_sixtapfilter_horz;
2768     pf_sixtap_filter_2dvh_vert pf_ih264e_sixtap_filter_2dvh_vert;
2769 
2770     /**
2771      * color space conversion form YUV 420P to YUV 420Sp
2772      */
2773     pf_fmt_conv_420p_to_420sp pf_ih264e_conv_420p_to_420sp;
2774 
2775 
2776     /**
2777      * color space conversion form YUV 420P to YUV 420Sp
2778      */
2779     pf_fmt_conv_422ile_to_420sp pf_ih264e_fmt_conv_422i_to_420sp;
2780 
2781     /**
2782      * write mb layer for a given slice I, P, B
2783      */
2784     IH264E_ERROR_T (*pf_write_mb_syntax_layer[2][3]) ( entropy_ctxt_t *ps_ent_ctxt );
2785 
2786     /**
2787      * Output buffer
2788      */
2789     out_buf_t as_out_buf[MAX_CTXT_SETS];
2790 
2791     /**
2792      * recon buffer
2793      */
2794     rec_buf_t as_rec_buf[MAX_CTXT_SETS];
2795 
2796     /**
2797      * rate control context
2798      */
2799     rate_control_ctxt_t s_rate_control;
2800 
2801     /**
2802      * input buffer queue
2803      */
2804     inp_buf_t as_inp_list[MAX_NUM_BFRAMES];
2805 
2806     /**
2807      * Flag to indicate if any IDR requests are pending
2808      */
2809     WORD32 i4_pending_idr_flag;
2810 
2811     /*
2812     *Flag to indicate if we have recived the last input frame
2813     */
2814     WORD32 i4_last_inp_buff_received;
2815 
2816 };
2817 
2818 #endif /* IH264E_STRUCTS_H_ */
2819