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