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 */
46typedef struct _codec_t codec_t;
47typedef 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 */
59typedef 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
69typedef 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 */
78typedef 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
83typedef 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 */
93typedef 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 */
100typedef void (*pf_memcpy)(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes);
101
102typedef void (*pf_memset)(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes);
103
104typedef void (*pf_memcpy_mul8)(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes);
105
106typedef void (*pf_memset_mul8)(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes);
107
108/**
109******************************************************************************
110 *  @brief      Sad computation
111******************************************************************************
112 */
113typedef 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 */
122typedef 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
128typedef 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 */
140typedef void (*pf_sixtapfilter_horz)(UWORD8 *pu1_src, UWORD8 *pu1_dst,
141                                     WORD32 src_strd, WORD32 dst_strd);
142
143typedef 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 */
152typedef 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
159typedef 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 */
172typedef void ih264e_compute_me_ft(process_ctxt_t *);
173
174/**
175******************************************************************************
176 *  @brief     SKIP decision
177******************************************************************************
178 */
179typedef 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 */
192typedef 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 */
206typedef 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 */
222typedef 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 */
240typedef 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
280typedef 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
311typedef 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
327typedef 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
346typedef 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 */
574typedef 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 */
588typedef 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 */
623typedef 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 */
661typedef 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
677typedef 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
768typedef 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
809typedef 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 */
851typedef 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 */
882typedef 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 */
906typedef 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*/
1128typedef 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
1159typedef 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*/
1187typedef 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*/
1205typedef 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*/
1224typedef 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*/
1238typedef 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*/
1256typedef 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*/
1270typedef 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*/
1289typedef 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*/
1303typedef 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
1319typedef 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*/
1336typedef 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 */
1365typedef 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 */
1396struct _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 */
2100typedef 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 */
2145struct _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