blob: c2e3b89b4080a9fcbb907f68ad4e390a1032540f [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
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/*****************************************************************************/
Harinarayanan K K134291e2015-06-18 16:03:38 +053042/* 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/*****************************************************************************/
Hamsalekha S8d3d3032015-03-13 21:24:58 +053051/* 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
Harinarayanan K K134291e2015-06-18 16:03:38 +0530166
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
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530182/*****************************************************************************/
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{
Harinarayanan K K134291e2015-06-18 16:03:38 +0530224 /**
225 * Motion Vector
226 */
227 mv_t s_mv;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530228
229 /**
Harinarayanan K K134291e2015-06-18 16:03:38 +0530230 * Ref index
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530231 */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530232 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];
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530245
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 /**
Harinarayanan K K134291e2015-06-18 16:03:38 +0530267 * Intra or Inter flag for each partition - 0 or 1
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530268 */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530269 UWORD32 b1_intra_flag : 1;
270
271 /**
272 * PRED_L0, PRED_L1, PRED_BI
273 */
274 UWORD32 b2_pred_mode : 2;
275
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530276
277} enc_pu_t;
278
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530279
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 */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530385 UWORD32 u4_num_bframes;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530386
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
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530522 /** 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
Doney Alex983e1ae2016-03-30 17:31:26 +0530566 /** VUI structure */
567 vui_t s_vui;
568
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530569}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{
Harinarayanan K K134291e2015-06-18 16:03:38 +0530908 /**
909 * Pointer to the cabac context
910 */
911 cabac_ctxt_t *ps_cabac;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530912
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******************************************************************************
Harish Mahendrakarc7d9c912016-11-23 13:30:39 +05301154* @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******************************************************************************
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301332* @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
Harinarayanan K K134291e2015-06-18 16:03:38 +05301373 enc_pu_mv_t as_skip_mv[4];
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301374
Harinarayanan K K134291e2015-06-18 16:03:38 +05301375 enc_pu_mv_t as_pred_mv[2];
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301376
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 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05301396struct _proc_t
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301397{
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 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05301441 UWORD8 *apu1_ref_buf_luma[MAX_REF_PIC_CNT];
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301442
1443 /**
1444 * Ref pointer to current MB chroma
1445 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05301446 UWORD8 *apu1_ref_buf_chroma[MAX_REF_PIC_CNT];
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301447
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 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05301461 UWORD8 *apu1_ref_buf_luma_base[MAX_REF_PIC_CNT];
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301462
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 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05301487 UWORD8 *apu1_ref_buf_chroma_base[MAX_REF_PIC_CNT];
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301488
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 /**
Martin Storsjo53c68782015-06-09 16:25:51 +03001497 * source luma stride
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301498 */
1499 WORD32 i4_src_strd;
1500
1501 /**
Martin Storsjo53c68782015-06-09 16:25:51 +03001502 * source chroma stride
1503 */
1504 WORD32 i4_src_chroma_strd;
1505
1506 /**
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301507 * 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 /**
Harinarayanan K K134291e2015-06-18 16:03:38 +05301739 * Pointer to the pu of current co-located MB in list 1
1740 */
1741 enc_pu_t *ps_colpu;
1742
1743 /**
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301744 * predicted motion vector
1745 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05301746 enc_pu_mv_t *ps_skip_mv;
1747
1748 /**
1749 * predicted motion vector
1750 */
1751 enc_pu_mv_t *ps_pred_mv;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301752
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
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301799 /**
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 /**
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301834 * 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
Harinarayanan K K134291e2015-06-18 16:03:38 +05302041 * TODO: Only 2 reference assumed currently
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302042 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05302043 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];
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302049
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
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302078 /*
Harinarayanan K K134291e2015-06-18 16:03:38 +05302079 * Temporary buffers to be used for subpel computation
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302080 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05302081 UWORD8 *apu1_subpel_buffs[SUBPEL_BUFF_CNT];
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302082
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
Harinarayanan K K134291e2015-06-18 16:03:38 +05302093};
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302094
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 /**
Harinarayanan K K134291e2015-06-18 16:03:38 +05302148 * Id of current pic (input order)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302149 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05302150 WORD32 i4_poc;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302151
2152 /**
2153 * Number of encode frame API calls made
Harinarayanan K K134291e2015-06-18 16:03:38 +05302154 * This variable must only be used for context selection [Read only]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302155 */
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 /**
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302189 * 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
Harinarayanan K K134291e2015-06-18 16:03:38 +05302527
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302528 /*
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 /*
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302542 * Indicates if the current frame is used as a reference frame
2543 */
2544 UWORD32 u4_is_curr_frm_ref;
2545
2546 /*
Harinarayanan K K134291e2015-06-18 16:03:38 +05302547 * Indicates if there can be non reference frames in the stream
2548 */
2549 WORD32 i4_non_ref_frames_in_stream;
2550
2551 /*
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302552 * 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
Harinarayanan K K134291e2015-06-18 16:03:38 +05302737
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
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302749 /**
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 */
Harinarayanan K K134291e2015-06-18 16:03:38 +05302784 IH264E_ERROR_T (*pf_write_mb_syntax_layer[2][3]) ( entropy_ctxt_t *ps_ent_ctxt );
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302785
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;
Harinarayanan K K134291e2015-06-18 16:03:38 +05302800
2801 /**
2802 * input buffer queue
2803 */
Thomala Srinivas5c3b9922019-04-17 18:20:04 +05302804 inp_buf_t as_inp_list[MAX_NUM_INP_FRAMES];
Harinarayanan K K134291e2015-06-18 16:03:38 +05302805
Harinarayanan K K63f40a82015-06-19 11:35:16 +05302806 /**
Harinarayanan K Kaad45872015-06-26 15:20:33 +05302807 * Flag to indicate if any IDR requests are pending
Harinarayanan K K63f40a82015-06-19 11:35:16 +05302808 */
Harinarayanan K Kaad45872015-06-26 15:20:33 +05302809 WORD32 i4_pending_idr_flag;
Harinarayanan K K134291e2015-06-18 16:03:38 +05302810
2811 /*
2812 *Flag to indicate if we have recived the last input frame
2813 */
2814 WORD32 i4_last_inp_buff_received;
2815
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302816};
Harinarayanan K K134291e2015-06-18 16:03:38 +05302817
Hamsalekha S8d3d3032015-03-13 21:24:58 +05302818#endif /* IH264E_STRUCTS_H_ */