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 }cfg_params_t; 567 568 569 570 /** Structure to hold format conversion context */ 571 typedef struct 572 { 573 /** Current row for which format conversion should be done */ 574 WORD32 i4_cur_row; 575 576 /** Number of rows for which format conversion should be done */ 577 WORD32 i4_num_rows; 578 579 }fmt_conv_t; 580 581 582 /** 583 * Structure to represent a processing job entry 584 */ 585 typedef struct 586 { 587 /** 588 * Command 589 */ 590 WORD32 i4_cmd; 591 592 /** 593 * MB x of the starting MB 594 */ 595 WORD16 i2_mb_x; 596 597 /** 598 * MB y of the starting MB 599 */ 600 601 WORD16 i2_mb_y; 602 603 /** 604 * Number of MBs that need to be processed in this job 605 */ 606 WORD16 i2_mb_cnt; 607 608 /** 609 * Process contexts base index 610 * Will toggle between 0 and MAX_PROCESS_THREADS 611 */ 612 WORD16 i2_proc_base_idx; 613 614 } job_t; 615 616 617 /** 618 * Structure to represent a MV Bank buffer 619 */ 620 typedef struct 621 { 622 /** 623 * Pointer to hold num PUs each MB in a picture 624 */ 625 UWORD32 *pu4_mb_pu_cnt; 626 627 /** 628 * Pointer to hold enc_pu_t for each PU in a picture 629 */ 630 enc_pu_t *ps_pic_pu; 631 632 /** 633 * Pointer to hold PU map for each MB in a picture 634 */ 635 UWORD8 *pu1_pic_pu_map; 636 637 /** 638 * Pointer to hold the Slice map 639 */ 640 UWORD16 *pu1_pic_slice_map; 641 642 /** 643 * Absolute POC for the current MV Bank 644 */ 645 WORD32 i4_abs_poc; 646 647 /** 648 * Buffer Id 649 */ 650 WORD32 i4_buf_id; 651 652 } mv_buf_t; 653 654 655 /** 656 * Reference set containing pointers to MV buf and pic buf 657 */ 658 typedef struct 659 { 660 /** Picture count */ 661 WORD32 i4_pic_cnt; 662 663 /** POC */ 664 WORD32 i4_poc; 665 666 /** picture buffer */ 667 pic_buf_t *ps_pic_buf; 668 669 /** mv buffer */ 670 mv_buf_t *ps_mv_buf; 671 672 }ref_set_t; 673 674 typedef struct 675 { 676 677 /** 678 * Pointer to current PPS 679 */ 680 pps_t *ps_pps; 681 682 /** 683 * Pointer to current SPS 684 */ 685 sps_t *ps_sps; 686 687 /** 688 * Pointer to current slice header structure 689 */ 690 slice_header_t *ps_slice_hdr; 691 692 /** 693 * MB's x position within a picture in raster scan in MB units 694 */ 695 WORD32 i4_mb_x; 696 697 /** 698 * MB's y position within a picture in raster scan in MB units 699 */ 700 701 WORD32 i4_mb_y; 702 703 /** 704 * Current PU structure - set to MB enc_pu_t pointer at the start of MB processing and incremented 705 * for every TU 706 */ 707 enc_pu_t *ps_pu; 708 709 /** 710 * Pointer to frame level enc_pu_t for the current frame being parsed 711 * where MVs and Intra pred modes will be updated 712 */ 713 enc_pu_t *ps_pic_pu; 714 715 /** 716 * Pointer to hold num PUs each MB in a picture 717 */ 718 UWORD32 *pu4_mb_pu_cnt; 719 720 /** PU Index map per MB. The indices in this map are w.r.t picture pu array and not 721 * w.r.t MB pu array. 722 * This will be used during mv prediction and since neighbors will have different MB pu map 723 * it will be easier if they all have indices w.r.t picture level PU array rather than MB level 724 * PU array. 725 * pu1_pic_pu_map is map w.r.t MB's enc_pu_t array 726 */ 727 UWORD32 *pu4_pic_pu_idx_map; 728 729 /** 730 * Pointer to pu_map for the current frame being parsed 731 * where MVs and Intra pred modes will be updated 732 */ 733 UWORD8 *pu1_pic_pu_map; 734 735 /** 736 * PU count in current MB 737 */ 738 WORD32 i4_mb_pu_cnt; 739 740 /** 741 * PU count in current MB 742 */ 743 WORD32 i4_mb_start_pu_idx; 744 745 /** 746 * Top availability for current MB level 747 */ 748 UWORD8 u1_top_mb_avail; 749 750 /** 751 * Top right availability for current MB level 752 */ 753 UWORD8 u1_top_rt_mb_avail; 754 /** 755 * Top left availability for current MB level 756 */ 757 UWORD8 u1_top_lt_mb_avail; 758 /** 759 * left availability for current MB level 760 */ 761 UWORD8 u1_left_mb_avail; 762 763 }mv_ctxt_t; 764 765 typedef struct 766 { 767 /** 768 * MB's x position within a picture in raster scan in MB units 769 */ 770 WORD32 i4_mb_x; 771 772 /** 773 * MB's y position within a picture in raster scan in MB units 774 */ 775 WORD32 i4_mb_y; 776 777 /** 778 * MB's x position within a Slice in raster scan in MB units 779 */ 780 WORD32 i4_mb_slice_x; 781 782 /** 783 * MB's y position within a Slice in raster scan in MB units 784 */ 785 WORD32 i4_mb_slice_y; 786 787 /** 788 * Vertical strength, Two bits per edge. 789 * Stored in format. BS[15] | BS[14] | .. |BS[0] 790 */ 791 UWORD32 *pu4_pic_vert_bs; 792 793 /** 794 * Boundary strength, Two bits per edge. 795 * Stored in format. BS[15] | BS[14] | .. |BS[0] 796 */ 797 UWORD32 *pu4_pic_horz_bs; 798 799 /** 800 * Qp array stored for each mb 801 */ 802 UWORD8 *pu1_pic_qp; 803 804 }bs_ctxt_t; 805 806 typedef struct 807 { 808 /** 809 * MB's x position within a picture in raster scan in MB units 810 */ 811 WORD32 i4_mb_x; 812 813 /** 814 * MB's y position within a picture in raster scan in MB units 815 */ 816 WORD32 i4_mb_y; 817 818 /** 819 * structure that contains BS and QP frame level arrays 820 */ 821 bs_ctxt_t s_bs_ctxt; 822 823 /** 824 * Pointer to 0th luma pixel in current pic 825 */ 826 UWORD8 *pu1_cur_pic_luma; 827 828 /** 829 * Pointer to 0th chroma pixel in current pic 830 */ 831 UWORD8 *pu1_cur_pic_chroma; 832 833 /** 834 * Points to the array of slice indices which is used to identify the slice 835 * to which each MB in a frame belongs. 836 */ 837 UWORD8 *pu1_slice_idx; 838 839 }deblk_ctxt_t; 840 841 842 /** 843 ****************************************************************************** 844 * @brief Structure to hold data and flags for 'n' mb processing for 845 * deblocking , padding and half pel generation. 846 ****************************************************************************** 847 */ 848 typedef struct 849 { 850 /** 851 * MB's x position last processed + 1 852 */ 853 WORD32 i4_mb_x; 854 855 /** 856 * MB's y position ,current processing. 857 */ 858 WORD32 i4_mb_y; 859 860 /** 861 * Number of MBs processed in a stretch 862 */ 863 WORD32 i4_n_mbs; 864 865 }n_mb_process_ctxt_t; 866 867 868 /** 869 ****************************************************************************** 870 * @brief Structure to hold coefficient info for a 4x4 subblock. 871 * The following can be used to type-cast coefficient data that is stored 872 * per subblock. Note that though i2_level is shown as an array that 873 * holds 16 coefficients, only the first few entries will be valid. Next 874 * subblocks data starts after the valid number of coefficients. Number 875 * of non-zero coefficients will be derived using number of non-zero bits 876 * in sig coeff map 877 ****************************************************************************** 878 */ 879 typedef struct 880 { 881 /** 882 * significant coefficient map and nnz are packed in 883 * to msb (2 bytes) and lsb (2 bytes) respectively 884 */ 885 WORD32 i4_sig_map_nnz; 886 887 /** 888 * array of non zero residue coefficients 889 */ 890 WORD16 ai2_residue[16]; 891 892 }tu_sblk_coeff_data_t; 893 894 /** 895 ****************************************************************************** 896 * @brief Structure contains few common state variables such as MB indices, 897 * current SPS, PPS etc which are to be used in the entropy thread. By keeping 898 * it a different structure it is being explicitly signaled that these 899 * variables are specific to entropy threads context and other threads should 900 * not update these elements 901 ****************************************************************************** 902 */ 903 typedef struct 904 { 905 /** 906 * Pointer to the cabac context 907 */ 908 cabac_ctxt_t *ps_cabac; 909 910 /** 911 * start of frame / start of slice flag 912 */ 913 WORD32 i4_sof; 914 915 /** 916 * end of frame / end of slice flag 917 */ 918 WORD32 i4_eof; 919 920 /** 921 * generate header upon request 922 */ 923 WORD32 i4_gen_header; 924 925 /** 926 * seq_parameter_set_id 927 */ 928 UWORD32 u4_sps_id; 929 930 /** 931 * Pointer to base of sequence parameter set structure array 932 */ 933 sps_t *ps_sps_base; 934 935 /** 936 * pic_parameter_set_id 937 */ 938 UWORD32 u4_pps_id; 939 940 /** 941 * Pointer to base of Picture parameter set structure array 942 */ 943 pps_t *ps_pps_base; 944 945 /** 946 * Current slice idx 947 */ 948 WORD32 i4_cur_slice_idx; 949 950 /** 951 * Points to the array of slice indices which is used to identify the independent slice 952 * to which each MB in a frame belongs. 953 */ 954 UWORD8 *pu1_slice_idx; 955 956 /** 957 * Pointer to base of slice header structure array 958 */ 959 slice_header_t *ps_slice_hdr_base; 960 961 /** 962 * entropy status 963 */ 964 UWORD8 *pu1_entropy_map; 965 966 /** 967 * MB's x position within a picture in raster scan in MB units 968 */ 969 WORD32 i4_mb_x; 970 971 /** 972 * MB's y position within a picture in raster scan in MB units 973 */ 974 WORD32 i4_mb_y; 975 976 /** 977 * MB start address 978 */ 979 WORD32 i4_mb_cnt; 980 981 /** 982 * MB start address 983 */ 984 WORD32 i4_mb_start_add; 985 986 /** 987 * MB end address 988 */ 989 WORD32 i4_mb_end_add; 990 991 /** 992 * Input width in mbs 993 */ 994 WORD32 i4_wd_mbs; 995 996 /** 997 * Input height in mbs 998 */ 999 WORD32 i4_ht_mbs; 1000 1001 /** 1002 * Bitstream structure 1003 */ 1004 bitstrm_t *ps_bitstrm; 1005 1006 /** 1007 * transform_8x8_mode_flag 1008 */ 1009 WORD8 i1_transform_8x8_mode_flag; 1010 1011 /** 1012 * entropy_coding_mode_flag 1013 */ 1014 WORD8 u1_entropy_coding_mode_flag; 1015 1016 /** 1017 * Pointer to the top row nnz for luma 1018 */ 1019 UWORD8 (*pu1_top_nnz_luma)[4]; 1020 1021 /** 1022 * left nnz for luma 1023 */ 1024 UWORD32 u4_left_nnz_luma; 1025 1026 /** 1027 * Pointer to zero runs before for the mb 1028 */ 1029 UWORD8 au1_zero_run[16]; 1030 1031 /** 1032 * Pointer to the top row nnz for chroma 1033 */ 1034 UWORD8 (*pu1_top_nnz_cbcr)[4]; 1035 1036 /** 1037 * left nnz for chroma 1038 */ 1039 UWORD8 u4_left_nnz_cbcr; 1040 1041 /** 1042 * Pointer frame level mb subblock coeff data 1043 */ 1044 void *pv_pic_mb_coeff_data; 1045 1046 /** 1047 * Pointer to mb subblock coeff data and number of subblocks and scan idx 1048 * Incremented each time a coded subblock is processed 1049 */ 1050 void *pv_mb_coeff_data; 1051 1052 /** 1053 * Pointer frame level mb header data 1054 */ 1055 void *pv_pic_mb_header_data; 1056 1057 /** 1058 * Pointer to mb header data and 1059 * incremented each time a coded mb is encoded 1060 */ 1061 void *pv_mb_header_data; 1062 1063 /** 1064 * Error code during parse stage 1065 */ 1066 IH264E_ERROR_T i4_error_code; 1067 1068 /** 1069 * Void pointer to job context 1070 */ 1071 void *pv_proc_jobq, *pv_entropy_jobq; 1072 1073 /** 1074 * Flag to signal end of frame 1075 */ 1076 WORD32 i4_end_of_frame; 1077 1078 /** 1079 * Abs POC count of the frame 1080 */ 1081 WORD32 i4_abs_pic_order_cnt; 1082 1083 /** 1084 * mb skip run 1085 */ 1086 WORD32 *pi4_mb_skip_run; 1087 1088 /** 1089 * Flag to signal end of sequence 1090 */ 1091 UWORD32 u4_is_last; 1092 1093 /** 1094 * Lower 32bits of time-stamp corresponding to the buffer being encoded 1095 */ 1096 UWORD32 u4_timestamp_low; 1097 1098 /** 1099 * Upper 32bits of time-stamp corresponding to the buffer being encoded 1100 */ 1101 UWORD32 u4_timestamp_high; 1102 1103 /** 1104 * Current Picture count - used for synchronization 1105 */ 1106 WORD32 i4_pic_cnt; 1107 1108 /** 1109 * Number of bits consumed by header for I and P mb types 1110 */ 1111 UWORD32 u4_header_bits[MAX_MB_TYPE]; 1112 1113 /** 1114 * Number of bits consumed by residue for I and P mb types 1115 */ 1116 UWORD32 u4_residue_bits[MAX_MB_TYPE]; 1117 1118 } entropy_ctxt_t; 1119 1120 /** 1121 ****************************************************************************** 1122 * @brief macro block info. 1123 ****************************************************************************** 1124 */ 1125 typedef struct 1126 { 1127 /** 1128 * mb type 1129 */ 1130 UWORD16 u2_is_intra; 1131 1132 /** 1133 * mb type 1134 */ 1135 UWORD16 u2_mb_type; 1136 1137 /** 1138 * csbp 1139 */ 1140 UWORD32 u4_csbp; 1141 1142 /** 1143 * mb distortion 1144 */ 1145 WORD32 i4_mb_distortion; 1146 1147 }mb_info_t; 1148 1149 /** 1150 ****************************************************************************** 1151 * @brief structure presenting the neighbor availability of a mb 1152 * or subblk or any other partition 1153 ****************************************************************************** 1154 */ 1155 typedef struct 1156 { 1157 /** 1158 * left blk/subblk/partition 1159 */ 1160 UWORD8 u1_mb_a; 1161 1162 /** 1163 * top blk/subblk/partition 1164 */ 1165 UWORD8 u1_mb_b; 1166 1167 /** 1168 * topright blk/subblk/partition 1169 */ 1170 UWORD8 u1_mb_c; 1171 1172 /** 1173 * topleft blk/subblk/partition 1174 */ 1175 UWORD8 u1_mb_d; 1176 1177 }block_neighbors_t; 1178 1179 /** 1180 ****************************************************************************** 1181 * @brief MB info related variables used during NMB processing 1182 ****************************************************************************** 1183 */ 1184 typedef struct 1185 { 1186 UWORD32 u4_mb_type; 1187 UWORD32 u4_min_sad; 1188 UWORD32 u4_min_sad_reached; 1189 WORD32 i4_mb_cost; 1190 WORD32 i4_mb_distortion; 1191 1192 enc_pu_mv_t as_skip_mv[4]; 1193 1194 enc_pu_mv_t as_pred_mv[2]; 1195 1196 block_neighbors_t s_ngbr_avbl; 1197 1198 /* 1199 * Buffer to hold best subpel buffer in each MB of NMB 1200 */ 1201 UWORD8 *pu1_best_sub_pel_buf; 1202 1203 /* 1204 * Stride for subpel buffer 1205 */ 1206 UWORD32 u4_bst_spel_buf_strd; 1207 1208 }mb_info_nmb_t; 1209 1210 /** 1211 ****************************************************************************** 1212 * @brief Pixel processing thread context 1213 ****************************************************************************** 1214 */ 1215 struct _proc_t 1216 { 1217 /** 1218 * entropy context 1219 */ 1220 entropy_ctxt_t s_entropy; 1221 1222 /** 1223 * me context 1224 */ 1225 me_ctxt_t s_me_ctxt; 1226 1227 /** 1228 * Pointer to codec context 1229 */ 1230 codec_t *ps_codec; 1231 1232 /** 1233 * N mb process contest 1234 */ 1235 n_mb_process_ctxt_t s_n_mb_ctxt; 1236 1237 /** 1238 * Source pointer to current MB luma 1239 */ 1240 UWORD8 *pu1_src_buf_luma; 1241 1242 /** 1243 * Source pointer to current MB chroma 1244 */ 1245 UWORD8 *pu1_src_buf_chroma; 1246 1247 /** 1248 * Recon pointer to current MB luma 1249 */ 1250 UWORD8 *pu1_rec_buf_luma; 1251 1252 /** 1253 * Recon pointer to current MB chroma 1254 */ 1255 UWORD8 *pu1_rec_buf_chroma; 1256 1257 /** 1258 * Ref pointer to current MB luma 1259 */ 1260 UWORD8 *apu1_ref_buf_luma[MAX_REF_PIC_CNT]; 1261 1262 /** 1263 * Ref pointer to current MB chroma 1264 */ 1265 UWORD8 *apu1_ref_buf_chroma[MAX_REF_PIC_CNT]; 1266 1267 /** 1268 * pointer to luma plane of input buffer (base :: mb (0,0)) 1269 */ 1270 UWORD8 *pu1_src_buf_luma_base; 1271 1272 /** 1273 * pointer to luma plane of reconstructed buffer (base :: mb (0,0)) 1274 */ 1275 UWORD8 *pu1_rec_buf_luma_base; 1276 1277 /** 1278 * pointer to luma plane of ref buffer (base :: mb (0,0)) 1279 */ 1280 UWORD8 *apu1_ref_buf_luma_base[MAX_REF_PIC_CNT]; 1281 1282 /** 1283 * pointer to chroma plane of input buffer (base :: mb (0,0)) 1284 */ 1285 UWORD8 *pu1_src_buf_chroma_base; 1286 1287 /* 1288 * Buffer for color space conversion of luma 1289 */ 1290 UWORD8 *pu1_y_csc_buf; 1291 1292 /* 1293 * Buffer for color space conversion of luma 1294 */ 1295 1296 UWORD8 *pu1_uv_csc_buf; 1297 1298 /** 1299 * pointer to chroma plane of reconstructed buffer (base :: mb (0,0)) 1300 */ 1301 UWORD8 *pu1_rec_buf_chroma_base; 1302 1303 /** 1304 * pointer to chroma plane of reconstructed buffer (base :: mb (0,0)) 1305 */ 1306 UWORD8 *apu1_ref_buf_chroma_base[MAX_REF_PIC_CNT]; 1307 1308 /** 1309 * Pointer to ME NMB info 1310 */ 1311 mb_info_nmb_t *ps_nmb_info; 1312 1313 mb_info_nmb_t *ps_cur_mb; 1314 1315 /** 1316 * source luma stride 1317 */ 1318 WORD32 i4_src_strd; 1319 1320 /** 1321 * source chroma stride 1322 */ 1323 WORD32 i4_src_chroma_strd; 1324 1325 /** 1326 * recon stride & ref stride 1327 * (strides for luma and chroma are the same) 1328 */ 1329 WORD32 i4_rec_strd; 1330 1331 /** 1332 * Offset for half pel x plane from the pic buf 1333 */ 1334 UWORD32 u4_half_x_offset; 1335 1336 /** 1337 * Offset for half pel y plane from half x plane 1338 */ 1339 UWORD32 u4_half_y_offset; 1340 1341 /** 1342 * Offset for half pel xy plane from half y plane 1343 */ 1344 UWORD32 u4_half_xy_offset; 1345 1346 /** 1347 * pred buffer pointer (temp buffer 1) 1348 */ 1349 UWORD8 *pu1_pred_mb; 1350 1351 /** 1352 * pred buffer pointer (prediction buffer for intra 16x16 1353 */ 1354 UWORD8 *pu1_pred_mb_intra_16x16; 1355 1356 /** 1357 * pred buffer pointer (prediction buffer for intra 16x16_plane 1358 */ 1359 UWORD8 *pu1_pred_mb_intra_16x16_plane; 1360 1361 /** 1362 * pred buffer pointer (prediction buffer for intra chroma 1363 */ 1364 UWORD8 *pu1_pred_mb_intra_chroma; 1365 1366 /** 1367 * pred buffer pointer (prediction buffer for intra chroma plane 1368 */ 1369 UWORD8 *pu1_pred_mb_intra_chroma_plane; 1370 1371 /** 1372 * temp. reference buffer ptr for intra 4x4 when rdopt is on 1373 */ 1374 UWORD8 *pu1_ref_mb_intra_4x4; 1375 1376 /** 1377 * prediction buffer stride 1378 */ 1379 WORD32 i4_pred_strd; 1380 1381 /** 1382 * transform buffer pointer (temp buffer 2) 1383 */ 1384 WORD16 *pi2_res_buf; 1385 1386 /** 1387 * temp. transform buffer ptr for intra 4x4 when rdopt is on 1388 */ 1389 WORD16 *pi2_res_buf_intra_4x4; 1390 1391 /** 1392 * transform buffer stride 1393 */ 1394 WORD32 i4_res_strd; 1395 1396 /** 1397 * scratch buffer for inverse transform (temp buffer 3) 1398 */ 1399 void *pv_scratch_buff; 1400 1401 /** 1402 * frame num 1403 */ 1404 WORD32 i4_frame_num; 1405 1406 /** 1407 * start address of frame / sub-frame 1408 */ 1409 WORD32 i4_frame_strt_add; 1410 1411 /** 1412 * IDR pic 1413 */ 1414 UWORD32 u4_is_idr; 1415 1416 /** 1417 * idr_pic_id 1418 */ 1419 UWORD32 u4_idr_pic_id; 1420 1421 /** 1422 * Input width in mbs 1423 */ 1424 WORD32 i4_wd_mbs; 1425 1426 /** 1427 * Input height in mbs 1428 */ 1429 WORD32 i4_ht_mbs; 1430 1431 /** 1432 * slice_type 1433 */ 1434 WORD32 i4_slice_type; 1435 1436 /** 1437 * Current slice idx 1438 */ 1439 WORD32 i4_cur_slice_idx; 1440 1441 /** 1442 * MB's x position within a picture in raster scan in MB units 1443 */ 1444 WORD32 i4_mb_x; 1445 1446 /** 1447 * MB's y position within a picture in raster scan in MB units 1448 */ 1449 WORD32 i4_mb_y; 1450 1451 /** 1452 * MB's x position within a Slice in raster scan in MB units 1453 */ 1454 WORD32 i4_mb_slice_x; 1455 1456 /** 1457 * MB's y position within a Slice in raster scan in MB units 1458 */ 1459 WORD32 i4_mb_slice_y; 1460 1461 /** 1462 * mb type 1463 */ 1464 UWORD32 u4_mb_type; 1465 1466 /** 1467 * is intra 1468 */ 1469 UWORD32 u4_is_intra; 1470 1471 /** 1472 * mb neighbor availability pointer 1473 */ 1474 block_neighbors_t *ps_ngbr_avbl; 1475 1476 /** 1477 * lambda (lagrange multiplier for cost computation) 1478 */ 1479 UWORD32 u4_lambda; 1480 1481 /** 1482 * mb distortion 1483 */ 1484 WORD32 i4_mb_distortion; 1485 1486 /** 1487 * mb cost 1488 */ 1489 WORD32 i4_mb_cost; 1490 1491 /********************************************************************/ 1492 /* i4_ngbr_avbl_mb_16 - ngbr avbl of curr mb */ 1493 /* i4_ngbr_avbl_sb_8 - ngbr avbl of all 8x8 sub blocks of curr mb */ 1494 /* i4_ngbr_avbl_sb_4 - ngbr avbl of all 4x4 sub blocks of curr mb */ 1495 /* i4_ngbr_avbl_mb_c - chroma ngbr avbl of curr mb */ 1496 /********************************************************************/ 1497 WORD32 i4_ngbr_avbl_16x16_mb; 1498 WORD32 ai4_neighbor_avail_8x8_subblks[4]; 1499 UWORD8 au1_ngbr_avbl_4x4_subblks[16]; 1500 WORD32 i4_chroma_neighbor_avail_8x8_mb; 1501 1502 /** 1503 * array to store the mode of mb sub blocks 1504 */ 1505 UWORD8 au1_intra_luma_mb_4x4_modes[16]; 1506 1507 /** 1508 * array to store the predicted mode of mb sub blks 1509 */ 1510 UWORD8 au1_predicted_intra_luma_mb_4x4_modes[16]; 1511 1512 /** 1513 * macro block intra 16x16 mode 1514 */ 1515 UWORD8 u1_l_i16_mode; 1516 1517 /** 1518 * array to store the mode of the macro block intra 8x8 4 modes 1519 */ 1520 UWORD8 au1_intra_luma_mb_8x8_modes[4]; 1521 1522 /** 1523 * intra chroma mb mode 1524 */ 1525 UWORD8 u1_c_i8_mode; 1526 1527 /********************************************************************/ 1528 /* array to store pixels from the neighborhood for intra prediction */ 1529 /* i16 - 16 left pels + 1 top left pel + 16 top pels = 33 pels */ 1530 /* i8 - 8 lpels + 1 tlpels + 8 tpels + 8 tr pels = 25 pels */ 1531 /* i4 - 4 lpels + 1 tlpels + 4 tpels + 4 tr pels = 13 pels */ 1532 /* ic - 8 left pels + 1 top left pel + 8 top pels )*2 */ 1533 /********************************************************************/ 1534 UWORD8 au1_ngbr_pels[34]; 1535 1536 /** 1537 * array for 8x8 intra pels filtering (temp buff 4) 1538 */ 1539 UWORD8 au1_neighbor_pels_i8x8_unfiltered[25]; 1540 1541 /** 1542 * Number of sub partitons in the inter pred MB 1543 */ 1544 UWORD32 u4_num_sub_partitions; 1545 1546 /** 1547 * Pointer to hold num PUs each MB in a picture 1548 */ 1549 UWORD32 *pu4_mb_pu_cnt; 1550 1551 /** 1552 * Pointer to the array of structures having motion vectors, size 1553 * and position of sub partitions 1554 */ 1555 enc_pu_t *ps_pu; 1556 1557 /** 1558 * Pointer to the pu of current co-located MB in list 1 1559 */ 1560 enc_pu_t *ps_colpu; 1561 1562 /** 1563 * predicted motion vector 1564 */ 1565 enc_pu_mv_t *ps_skip_mv; 1566 1567 /** 1568 * predicted motion vector 1569 */ 1570 enc_pu_mv_t *ps_pred_mv; 1571 1572 /** 1573 * top row mb syntax information base 1574 * In normal working scenarios, for a given context set, 1575 * the mb syntax info pointer is identical across all process threads. 1576 * But when the hard bound on slices are enabled, in multi core, frame 1577 * is partitioned in to sections equal to set number of cores and each 1578 * partition is run independently. In this scenario, a ctxt set will alone 1579 * appear to run multiple frames at a time. For this to occur, the common 1580 * pointers across the proc ctxt should disappear. 1581 * 1582 * This is done by allocating MAX_PROCESS_THREADS memory and distributing 1583 * across individual ctxts when byte bnd per slice is enabled. 1584 */ 1585 mb_info_t *ps_top_row_mb_syntax_ele_base; 1586 1587 /** 1588 * top row mb syntax information 1589 */ 1590 mb_info_t *ps_top_row_mb_syntax_ele; 1591 1592 /** 1593 * left mb syntax information 1594 */ 1595 mb_info_t s_left_mb_syntax_ele; 1596 1597 /** 1598 * top left mb syntax information 1599 */ 1600 mb_info_t s_top_left_mb_syntax_ele; 1601 1602 /** 1603 * top left mb syntax information 1604 */ 1605 1606 mb_info_t s_top_left_mb_syntax_ME; 1607 1608 /** 1609 * left mb motion vector 1610 */ 1611 enc_pu_t s_left_mb_pu_ME; 1612 1613 /** 1614 * top left mb motion vector 1615 */ 1616 enc_pu_t s_top_left_mb_pu_ME; 1617 1618 /** 1619 * mb neighbor availability pointer 1620 */ 1621 block_neighbors_t s_ngbr_avbl; 1622 1623 /** 1624 * In case the macroblock type is intra, the intra modes of all 1625 * partitions for the left mb are stored in the array below 1626 */ 1627 UWORD8 au1_left_mb_intra_modes[16]; 1628 1629 /** 1630 * In case the macroblock type is intra, the intra modes of all 1631 * partitions for the top mb are stored in the array below 1632 * 1633 * In normal working scenarios, for a given context set, 1634 * the mb syntax info pointer is identical across all process threads. 1635 * But when the hard bound on slices are enabled, in multi core, frame 1636 * is partitioned in to sections equal to set number of cores and each 1637 * partition is run independently. In this scenario, a ctxt set will alone 1638 * appear to run multiple frames at a time. For this to occur, the common 1639 * pointers across the proc ctxt should disappear. 1640 * 1641 * This is done by allocating MAX_PROCESS_THREADS memory and distributing 1642 * across individual ctxts when byte bnd per slice is enabled. 1643 */ 1644 UWORD8 *pu1_top_mb_intra_modes_base; 1645 1646 /** 1647 * In case the macroblock type is intra, the intra modes of all 1648 * partitions for the top mb are stored in the array below 1649 */ 1650 UWORD8 *pu1_top_mb_intra_modes; 1651 1652 /** 1653 * left mb motion vector 1654 */ 1655 enc_pu_t s_left_mb_pu; 1656 1657 /** 1658 * top left mb motion vector 1659 */ 1660 enc_pu_t s_top_left_mb_pu; 1661 1662 /** 1663 * top row motion vector info 1664 * 1665 * In normal working scenarios, for a given context set, 1666 * the top row pu pointer is identical across all process threads. 1667 * But when the hard bound on slices are enabled, in multi core, frame 1668 * is partitioned in to sections equal to set number of cores and each 1669 * partition is run independently. In this scenario, a ctxt set will alone 1670 * appear to run multiple frames at a time. For this to occur, the common 1671 * pointers across the proc ctxt should disappear. 1672 * 1673 * This is done by allocating MAX_PROCESS_THREADS memory and distributing 1674 * across individual ctxts when byte bnd per slice is enabled. 1675 */ 1676 enc_pu_t *ps_top_row_pu_base; 1677 1678 /** 1679 * top row motion vector info 1680 */ 1681 enc_pu_t *ps_top_row_pu; 1682 1683 enc_pu_t *ps_top_row_pu_ME; 1684 1685 /** 1686 * coded block pattern 1687 */ 1688 UWORD32 u4_cbp; 1689 1690 /** 1691 * csbp 1692 */ 1693 UWORD32 u4_csbp; 1694 1695 /** 1696 * number of non zero coeffs 1697 */ 1698 UWORD32 au4_nnz[5]; 1699 1700 /** 1701 * number of non zero coeffs for intra 4x4 when rdopt is on 1702 */ 1703 UWORD32 au4_nnz_intra_4x4[4]; 1704 1705 /** 1706 * frame qp & mb qp 1707 */ 1708 UWORD32 u4_frame_qp, u4_mb_qp; 1709 1710 /** 1711 * mb qp previous 1712 */ 1713 UWORD32 u4_mb_qp_prev; 1714 1715 /** 1716 * quantization parameters for luma & chroma planes 1717 */ 1718 quant_params_t *ps_qp_params[3]; 1719 1720 /** 1721 * Pointer frame level mb subblock coeff data 1722 */ 1723 void *pv_pic_mb_coeff_data; 1724 1725 /** 1726 * Pointer to mb subblock coeff data and number of subblocks and scan idx 1727 * Incremented each time a coded subblock is processed 1728 */ 1729 void *pv_mb_coeff_data; 1730 1731 /** 1732 * Pointer frame level mb header data 1733 */ 1734 void *pv_pic_mb_header_data; 1735 1736 /** 1737 * Pointer to mb header data and 1738 * incremented each time a coded mb is encoded 1739 */ 1740 void *pv_mb_header_data; 1741 1742 /** 1743 * Signal that pic_init is called first time 1744 */ 1745 WORD32 i4_first_pic_init; 1746 1747 /** 1748 * Current MV Bank's buffer ID 1749 */ 1750 WORD32 i4_cur_mv_bank_buf_id; 1751 1752 /** 1753 * Void pointer to job context 1754 */ 1755 void *pv_proc_jobq, *pv_entropy_jobq; 1756 1757 /** 1758 * Number of MBs to be processed in the current Job 1759 */ 1760 WORD32 i4_mb_cnt; 1761 1762 /** 1763 * ID for the current context - Used for debugging 1764 */ 1765 WORD32 i4_id; 1766 1767 /** 1768 * Pointer to current picture buffer structure 1769 */ 1770 pic_buf_t *ps_cur_pic; 1771 1772 /** 1773 * Pointer to current picture's mv buffer structure 1774 */ 1775 mv_buf_t *ps_cur_mv_buf; 1776 1777 /** 1778 * Flag to indicate if ps_proc was initialized at least once in a frame. 1779 * This is needed to handle cases where a core starts to handle format 1780 * conversion jobs directly 1781 */ 1782 WORD32 i4_init_done; 1783 1784 /** 1785 * Process status: one byte per MB 1786 */ 1787 UWORD8 *pu1_proc_map; 1788 1789 /** 1790 * Deblk status: one byte per MB 1791 */ 1792 UWORD8 *pu1_deblk_map; 1793 1794 /** 1795 * Process status: one byte per MB 1796 */ 1797 UWORD8 *pu1_me_map; 1798 1799 /* 1800 * Intra refresh mask. 1801 * Indicates if an Mb is coded in intra mode within the current AIR interval 1802 * NOTE Refreshes after each AIR period 1803 * NOTE The map is shared between process 1804 */ 1805 UWORD8 *pu1_is_intra_coded; 1806 1807 /** 1808 * Disable deblock level (0: Enable completely, 3: Disable completely 1809 */ 1810 UWORD32 u4_disable_deblock_level; 1811 1812 /** 1813 * Pointer to the structure that contains deblock context 1814 */ 1815 deblk_ctxt_t s_deblk_ctxt; 1816 1817 /** 1818 * Points to the array of slice indices which is used to identify the independent 1819 * slice to which each MB in a frame belongs. 1820 */ 1821 UWORD8 *pu1_slice_idx; 1822 1823 /** 1824 * Pointer to base of slice header structure array 1825 */ 1826 slice_header_t *ps_slice_hdr_base; 1827 1828 /** 1829 * Number of mb's to process in one loop 1830 */ 1831 WORD32 i4_nmb_ntrpy; 1832 1833 /** 1834 * Number of mb's to process in one loop 1835 */ 1836 UWORD32 u4_nmb_me; 1837 1838 /** 1839 * Structure for current input buffer 1840 */ 1841 inp_buf_t s_inp_buf; 1842 1843 /** 1844 * api call cnt 1845 */ 1846 WORD32 i4_encode_api_call_cnt; 1847 1848 /** 1849 * Current Picture count - used for synchronization 1850 */ 1851 WORD32 i4_pic_cnt; 1852 1853 /** 1854 * Intermediate buffer for interpred leaf level functions 1855 */ 1856 WORD32 ai16_pred1[HP_BUFF_WD * HP_BUFF_HT]; 1857 1858 /** 1859 * Reference picture for the current picture 1860 * TODO: Only 2 reference assumed currently 1861 */ 1862 pic_buf_t *aps_ref_pic[MAX_REF_PIC_CNT]; 1863 1864 /** 1865 * Reference MV buff for the current picture 1866 */ 1867 mv_buf_t *aps_mv_buf[MAX_REF_PIC_CNT]; 1868 1869 /** 1870 * frame info used by RC 1871 */ 1872 frame_info_t s_frame_info; 1873 1874 /* 1875 * NOTE NOT PERSISTANT INSIDE FUNCTIONS 1876 * Min sad for current MB 1877 * will be populated initially 1878 * Once a sad less than eq to u4_min_sad is reached, the value will be copied to the cariable 1879 */ 1880 UWORD32 u4_min_sad; 1881 1882 /* 1883 * indicates weather we have rached minimum sa or not 1884 */ 1885 UWORD32 u4_min_sad_reached; 1886 1887 /** 1888 * Current error code 1889 */ 1890 WORD32 i4_error_code; 1891 1892 /* 1893 * Enables or disables computation of recon 1894 */ 1895 UWORD32 u4_compute_recon; 1896 1897 /* 1898 * Temporary buffers to be used for subpel computation 1899 */ 1900 UWORD8 *apu1_subpel_buffs[SUBPEL_BUFF_CNT]; 1901 1902 /* 1903 * Buffer holding best sub pel values 1904 */ 1905 UWORD8 *pu1_best_subpel_buf; 1906 1907 /* 1908 * Stride for buffer holding best sub pel 1909 */ 1910 UWORD32 u4_bst_spel_buf_strd; 1911 1912 }; 1913 1914 /** 1915 ****************************************************************************** 1916 * @brief Rate control related variables 1917 ****************************************************************************** 1918 */ 1919 typedef struct 1920 { 1921 void *pps_rate_control_api; 1922 1923 void *pps_frame_time; 1924 1925 void *pps_time_stamp; 1926 1927 void *pps_pd_frm_rate; 1928 1929 /** 1930 * frame rate pull down 1931 */ 1932 WORD32 pre_encode_skip[MAX_CTXT_SETS]; 1933 1934 /** 1935 * skip frame (cbr) 1936 */ 1937 WORD32 post_encode_skip[MAX_CTXT_SETS]; 1938 1939 /** 1940 * rate control type 1941 */ 1942 rc_type_e e_rc_type; 1943 1944 /** 1945 * pic type 1946 */ 1947 picture_type_e e_pic_type; 1948 1949 /** 1950 * intra cnt in previous frame 1951 */ 1952 WORD32 num_intra_in_prev_frame; 1953 1954 /** 1955 * avg activity of prev frame 1956 */ 1957 WORD32 i4_avg_activity; 1958 1959 }rate_control_ctxt_t; 1960 1961 /** 1962 * Codec context 1963 */ 1964 struct _codec_t 1965 { 1966 /** 1967 * Id of current pic (input order) 1968 */ 1969 WORD32 i4_poc; 1970 1971 /** 1972 * Number of encode frame API calls made 1973 * This variable must only be used for context selection [Read only] 1974 */ 1975 WORD32 i4_encode_api_call_cnt; 1976 1977 /** 1978 * Number of pictures encoded 1979 */ 1980 WORD32 i4_pic_cnt; 1981 1982 /** 1983 * Number of threads created 1984 */ 1985 WORD32 i4_proc_thread_cnt; 1986 1987 /** 1988 * Mutex used to keep the control calls thread-safe 1989 */ 1990 void *pv_ctl_mutex; 1991 1992 /** 1993 * Current active config parameters 1994 */ 1995 cfg_params_t s_cfg; 1996 1997 /** 1998 * Array containing the config parameter sets 1999 */ 2000 cfg_params_t as_cfg[MAX_ACTIVE_CONFIG_PARAMS]; 2001 2002 /** 2003 * Color format used by encoder internally 2004 */ 2005 IV_COLOR_FORMAT_T e_codec_color_format; 2006 2007 /** 2008 * recon stride 2009 * (strides for luma and chroma are the same) 2010 */ 2011 WORD32 i4_rec_strd; 2012 2013 /** 2014 * Flag to enable/disable deblocking of a frame 2015 */ 2016 WORD32 i4_disable_deblk_pic; 2017 2018 /** 2019 * Number of continuous frames where deblocking was disabled 2020 */ 2021 WORD32 i4_disable_deblk_pic_cnt; 2022 2023 /** 2024 * frame type 2025 */ 2026 PIC_TYPE_T pic_type; 2027 2028 /** 2029 * frame qp 2030 */ 2031 UWORD32 u4_frame_qp; 2032 2033 /** 2034 * frame num 2035 */ 2036 WORD32 i4_frame_num; 2037 2038 /** 2039 * slice_type 2040 */ 2041 WORD32 i4_slice_type; 2042 2043 /* 2044 * Force current frame to specific type 2045 */ 2046 IV_PICTURE_CODING_TYPE_T force_curr_frame_type; 2047 2048 /** 2049 * IDR pic 2050 */ 2051 UWORD32 u4_is_idr; 2052 2053 /** 2054 * idr_pic_id 2055 */ 2056 WORD32 i4_idr_pic_id; 2057 2058 /** 2059 * Flush mode 2060 */ 2061 WORD32 i4_flush_mode; 2062 2063 /** 2064 * Encode header mode 2065 */ 2066 WORD32 i4_header_mode; 2067 2068 /** 2069 * Flag to indicate if header has already 2070 * been generated when i4_api_call_cnt 0 2071 */ 2072 UWORD32 u4_header_generated; 2073 2074 /** 2075 * Encode generate header 2076 */ 2077 WORD32 i4_gen_header; 2078 2079 /** 2080 * To signal successful completion of init 2081 */ 2082 WORD32 i4_init_done; 2083 2084 /** 2085 * To signal that at least one picture was decoded 2086 */ 2087 WORD32 i4_first_pic_done; 2088 2089 /** 2090 * Reset flag - Codec is reset if this flag is set 2091 */ 2092 WORD32 i4_reset_flag; 2093 2094 /** 2095 * Current error code 2096 */ 2097 WORD32 i4_error_code; 2098 2099 /** 2100 * threshold residue 2101 */ 2102 WORD32 u4_thres_resi; 2103 2104 /** 2105 * disable intra inter gating 2106 */ 2107 UWORD32 u4_inter_gate; 2108 2109 /** 2110 * Holds mem records passed during init. 2111 * This will be used to return the mem records during retrieve call 2112 */ 2113 iv_mem_rec_t *ps_mem_rec_backup; 2114 2115 /** 2116 * Flag to determine if the entropy thread is active 2117 */ 2118 volatile UWORD32 au4_entropy_thread_active[MAX_CTXT_SETS]; 2119 2120 /** 2121 * Mutex used to keep the entropy calls thread-safe 2122 */ 2123 void *pv_entropy_mutex; 2124 2125 /** 2126 * Job queue buffer base 2127 */ 2128 void *pv_proc_jobq_buf, *pv_entropy_jobq_buf; 2129 2130 /** 2131 * Job Queue mem tab size 2132 */ 2133 WORD32 i4_proc_jobq_buf_size, i4_entropy_jobq_buf_size; 2134 2135 /** 2136 * Memory for MV Bank buffer manager 2137 */ 2138 void *pv_mv_buf_mgr_base; 2139 2140 /** 2141 * MV Bank buffer manager 2142 */ 2143 void *pv_mv_buf_mgr; 2144 2145 /** 2146 * Pointer to MV Buf structure array 2147 */ 2148 void *ps_mv_buf; 2149 2150 /** 2151 * Base address for Motion Vector bank buffer 2152 */ 2153 void *pv_mv_bank_buf_base; 2154 2155 /** 2156 * MV Bank size allocated 2157 */ 2158 WORD32 i4_total_mv_bank_size; 2159 2160 /** 2161 * Memory for Picture buffer manager for reference pictures 2162 */ 2163 void *pv_ref_buf_mgr_base; 2164 2165 /** 2166 * Picture buffer manager for reference pictures 2167 */ 2168 void *pv_ref_buf_mgr; 2169 2170 /** 2171 * Number of reference buffers added to the buffer manager 2172 */ 2173 WORD32 i4_ref_buf_cnt; 2174 2175 /** 2176 * Pointer to Pic Buf structure array 2177 */ 2178 void *ps_pic_buf; 2179 2180 /** 2181 * Base address for Picture buffer 2182 */ 2183 void *pv_pic_buf_base; 2184 2185 /** 2186 * Total pic buffer size allocated 2187 */ 2188 WORD32 i4_total_pic_buf_size; 2189 2190 /** 2191 * Memory for Buffer manager for output buffers 2192 */ 2193 void *pv_out_buf_mgr_base; 2194 2195 /** 2196 * Buffer manager for output buffers 2197 */ 2198 void *pv_out_buf_mgr; 2199 2200 /** 2201 * Current output buffer's buffer ID 2202 */ 2203 WORD32 i4_out_buf_id; 2204 2205 /** 2206 * Number of output buffers added to the buffer manager 2207 */ 2208 WORD32 i4_out_buf_cnt; 2209 2210 /** 2211 * Memory for Picture buffer manager for input buffers 2212 */ 2213 void *pv_inp_buf_mgr_base; 2214 2215 /** 2216 * Picture buffer manager for input buffers 2217 */ 2218 void *pv_inp_buf_mgr; 2219 2220 /** 2221 * Current input buffer's buffer ID 2222 */ 2223 WORD32 i4_inp_buf_id; 2224 2225 /** 2226 * Number of input buffers added to the buffer manager 2227 */ 2228 WORD32 i4_inp_buf_cnt; 2229 2230 /** 2231 * Current input buffer 2232 */ 2233 pic_buf_t *ps_inp_buf; 2234 2235 /** 2236 * Pointer to dpb manager structure 2237 */ 2238 void *pv_dpb_mgr; 2239 2240 /** 2241 * Pointer to base of Sequence parameter set structure array 2242 */ 2243 sps_t *ps_sps_base; 2244 2245 /** 2246 * Pointer to base of Picture parameter set structure array 2247 */ 2248 pps_t *ps_pps_base; 2249 2250 /** 2251 * seq_parameter_set_id 2252 */ 2253 WORD32 i4_sps_id; 2254 2255 /** 2256 * pic_parameter_set_id 2257 */ 2258 WORD32 i4_pps_id; 2259 2260 /** 2261 * Pointer to base of slice header structure array 2262 */ 2263 slice_header_t *ps_slice_hdr_base; 2264 2265 /** 2266 * packed residue coeff data size for 1 row of mbs 2267 */ 2268 UWORD32 u4_size_coeff_data; 2269 2270 /** 2271 * packed header data size for 1 row of mbs 2272 */ 2273 UWORD32 u4_size_header_data; 2274 2275 /** 2276 * Processing context - One for each processing thread 2277 * Create two sets, each set used for alternate frames 2278 */ 2279 process_ctxt_t as_process[MAX_PROCESS_CTXT]; 2280 2281 /** 2282 * Thread handle for each of the processing threads 2283 */ 2284 void *apv_proc_thread_handle[MAX_PROCESS_THREADS]; 2285 2286 /** 2287 * Thread created flag for each of the processing threads 2288 */ 2289 WORD32 ai4_process_thread_created[MAX_PROCESS_THREADS]; 2290 2291 /** 2292 * Void pointer to process job context 2293 */ 2294 void *pv_proc_jobq, *pv_entropy_jobq; 2295 2296 /** 2297 * Number of MBs processed together for better instruction cache handling 2298 */ 2299 WORD32 i4_proc_nmb; 2300 2301 /** 2302 * Previous POC lsb 2303 */ 2304 WORD32 i4_prev_poc_lsb; 2305 2306 /** 2307 * Previous POC msb 2308 */ 2309 WORD32 i4_prev_poc_msb; 2310 2311 /** 2312 * Max POC lsb that has arrived till now 2313 */ 2314 WORD32 i4_max_prev_poc_lsb; 2315 2316 /** 2317 * Context for format conversion 2318 */ 2319 fmt_conv_t s_fmt_conv; 2320 2321 /** 2322 * Absolute pic order count 2323 */ 2324 WORD32 i4_abs_pic_order_cnt; 2325 2326 /** 2327 * Pic order count of lsb 2328 */ 2329 WORD32 i4_pic_order_cnt_lsb; 2330 2331 /** 2332 * Array giving current picture being processed in each context set 2333 */ 2334 WORD32 ai4_pic_cnt[MAX_CTXT_SETS]; 2335 2336 /* 2337 * Min sad to search for 2338 */ 2339 UWORD32 u4_min_sad; 2340 2341 /** 2342 * Reference picture set 2343 */ 2344 ref_set_t as_ref_set[MAX_DPB_SIZE + MAX_CTXT_SETS]; 2345 2346 2347 /* 2348 * Air pic cnt 2349 * Contains the number of pictures that have been encoded with air 2350 * This value is moudulo air refresh period 2351 */ 2352 WORD32 i4_air_pic_cnt; 2353 2354 /* 2355 * Intra refresh map 2356 * Stores the frames at which intra refresh should occur for a MB 2357 */ 2358 UWORD16 *pu2_intr_rfrsh_map; 2359 2360 /* 2361 * Indicates if the current frame is used as a reference frame 2362 */ 2363 UWORD32 u4_is_curr_frm_ref; 2364 2365 /* 2366 * Indicates if there can be non reference frames in the stream 2367 */ 2368 WORD32 i4_non_ref_frames_in_stream; 2369 2370 /* 2371 * Memory for color space conversion for luma plane 2372 */ 2373 UWORD8 *pu1_y_csc_buf_base; 2374 2375 /* 2376 * Memory for color space conversion foe chroma plane 2377 */ 2378 UWORD8 *pu1_uv_csc_buf_base; 2379 2380 /** 2381 * Function pointers for intra pred leaf level functions luma 2382 */ 2383 pf_intra_pred apf_intra_pred_16_l[MAX_I16x16]; 2384 pf_intra_pred apf_intra_pred_8_l[MAX_I8x8]; 2385 pf_intra_pred apf_intra_pred_4_l[MAX_I4x4]; 2386 2387 /** 2388 * Function pointers for intra pred leaf level functions chroma 2389 */ 2390 pf_intra_pred apf_intra_pred_c[MAX_CH_I8x8]; 2391 2392 /** 2393 * luma core coding function pointer 2394 */ 2395 UWORD8 (*luma_energy_compaction[4])(process_ctxt_t *ps_proc); 2396 2397 /** 2398 * chroma core coding function pointer 2399 */ 2400 UWORD8 (*chroma_energy_compaction[2])(process_ctxt_t *ps_proc); 2401 2402 /** 2403 * forward transform for intra blk of mb type 16x16 2404 */ 2405 ih264_luma_16x16_resi_trans_dctrans_quant_ft *pf_resi_trans_dctrans_quant_16x16; 2406 2407 /** 2408 * inverse transform for intra blk of mb type 16x16 2409 */ 2410 ih264_luma_16x16_idctrans_iquant_itrans_recon_ft *pf_idctrans_iquant_itrans_recon_16x16; 2411 2412 /** 2413 * forward transform for 4x4 blk luma 2414 */ 2415 ih264_resi_trans_quant_ft *pf_resi_trans_quant_4x4; 2416 2417 /** 2418 * forward transform for 4x4 blk luma 2419 */ 2420 ih264_resi_trans_quant_ft *pf_resi_trans_quant_chroma_4x4; 2421 2422 /* 2423 * hadamard transform and quant for a 4x4 block 2424 */ 2425 ih264_hadamard_quant_ft *pf_hadamard_quant_4x4; 2426 2427 /* 2428 * hadamard transform and quant for a 4x4 block 2429 */ 2430 ih264_hadamard_quant_ft *pf_hadamard_quant_2x2_uv; 2431 2432 /** 2433 * inverse transform for 4x4 blk 2434 */ 2435 ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_4x4; 2436 2437 /** 2438 * inverse transform for chroma 4x4 blk 2439 */ 2440 ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4; 2441 2442 /** 2443 * inverse transform for 4x4 blk with only single dc coeff 2444 */ 2445 ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_4x4_dc; 2446 2447 /** 2448 * inverse transform for chroma 4x4 blk with only single dc coeff 2449 */ 2450 ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4_dc; 2451 2452 /* 2453 * Inverse hadamard transform and iquant for a 4x4 block 2454 */ 2455 ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_4x4; 2456 2457 /* 2458 * Inverse hadamard transform and iquant for a 4x4 block 2459 */ 2460 ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_2x2_uv; 2461 2462 /* 2463 * Function for interleave copy* 2464 */ 2465 ih264_interleave_copy_ft *pf_interleave_copy; 2466 2467 /** 2468 * forward transform for 8x8 blk 2469 */ 2470 ih264_resi_trans_quant_ft *pf_resi_trans_quant_8x8; 2471 2472 /** 2473 * inverse transform for 8x8 blk 2474 */ 2475 /** 2476 * inverse transform for 4x4 blk 2477 */ 2478 ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_8x8; 2479 2480 /** 2481 * forward transform for chroma MB 2482 */ 2483 ih264_chroma_8x8_resi_trans_dctrans_quant_ft *pf_resi_trans_dctrans_quant_8x8_chroma; 2484 2485 /** 2486 * inverse transform for chroma MB 2487 */ 2488 ih264_idctrans_iquant_itrans_recon_ft *pf_idctrans_iquant_itrans_recon_8x8_chroma; 2489 2490 /** 2491 * deblock vertical luma edge with blocking strength 4 2492 */ 2493 ih264_deblk_edge_bs4_ft *pf_deblk_luma_vert_bs4; 2494 2495 /** 2496 * deblock vertical chroma edge with blocking strength 4 2497 */ 2498 ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_vert_bs4; 2499 2500 /** 2501 * deblock vertical luma edge with blocking strength less than 4 2502 */ 2503 ih264_deblk_edge_bslt4_ft *pf_deblk_luma_vert_bslt4; 2504 2505 /** 2506 * deblock vertical chroma edge with blocking strength less than 4 2507 */ 2508 ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_vert_bslt4; 2509 2510 /** 2511 * deblock horizontal luma edge with blocking strength 4 2512 */ 2513 ih264_deblk_edge_bs4_ft *pf_deblk_luma_horz_bs4; 2514 2515 /** 2516 * deblock horizontal chroma edge with blocking strength 4 2517 */ 2518 ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_horz_bs4; 2519 2520 /** 2521 * deblock horizontal luma edge with blocking strength less than 4 2522 */ 2523 ih264_deblk_edge_bslt4_ft *pf_deblk_luma_horz_bslt4; 2524 2525 /** 2526 * deblock horizontal chroma edge with blocking strength less than 4 2527 */ 2528 ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_horz_bslt4; 2529 2530 2531 /** 2532 * functions for padding 2533 */ 2534 pf_pad pf_pad_top; 2535 pf_pad pf_pad_bottom; 2536 pf_pad pf_pad_left_luma; 2537 pf_pad pf_pad_left_chroma; 2538 pf_pad pf_pad_right_luma; 2539 pf_pad pf_pad_right_chroma; 2540 2541 /** 2542 * Inter pred leaf level functions 2543 */ 2544 ih264_inter_pred_luma_ft *pf_inter_pred_luma_copy; 2545 ih264_inter_pred_luma_ft *pf_inter_pred_luma_horz; 2546 ih264_inter_pred_luma_ft *pf_inter_pred_luma_vert; 2547 pf_inter_pred_luma_bilinear pf_inter_pred_luma_bilinear; 2548 ih264_inter_pred_chroma_ft *pf_inter_pred_chroma; 2549 2550 /** 2551 * fn ptrs for compute sad routines 2552 */ 2553 ime_compute_sad_ft *apf_compute_sad_16x16[2]; 2554 ime_compute_sad_ft *pf_compute_sad_16x8; 2555 2556 2557 /** 2558 * Function pointer for computing ME 2559 * 1 for PSLICE and 1 for BSLICE 2560 */ 2561 ih264e_compute_me_ft *apf_compute_me[2]; 2562 2563 /** 2564 * Function pointers for computing SKIP parameters 2565 */ 2566 ih264e_skip_params_ft *apf_find_skip_params_me[2]; 2567 2568 /** 2569 * fn ptrs for memory handling operations 2570 */ 2571 pf_memcpy pf_mem_cpy; 2572 pf_memset pf_mem_set; 2573 pf_memcpy_mul8 pf_mem_cpy_mul8; 2574 pf_memset_mul8 pf_mem_set_mul8; 2575 2576 /** 2577 * intra mode eval -encoder level function 2578 */ 2579 pf_evaluate_intra_modes pf_ih264e_evaluate_intra16x16_modes; 2580 pf_evaluate_intra_modes pf_ih264e_evaluate_intra_chroma_modes; 2581 pf_evaluate_intra_4x4_modes pf_ih264e_evaluate_intra_4x4_modes; 2582 2583 /* Half pel generation function - encoder level 2584 * 2585 */ 2586 pf_sixtapfilter_horz pf_ih264e_sixtapfilter_horz; 2587 pf_sixtap_filter_2dvh_vert pf_ih264e_sixtap_filter_2dvh_vert; 2588 2589 /** 2590 * color space conversion form YUV 420P to YUV 420Sp 2591 */ 2592 pf_fmt_conv_420p_to_420sp pf_ih264e_conv_420p_to_420sp; 2593 2594 2595 /** 2596 * color space conversion form YUV 420P to YUV 420Sp 2597 */ 2598 pf_fmt_conv_422ile_to_420sp pf_ih264e_fmt_conv_422i_to_420sp; 2599 2600 /** 2601 * write mb layer for a given slice I, P, B 2602 */ 2603 IH264E_ERROR_T (*pf_write_mb_syntax_layer[2][3]) ( entropy_ctxt_t *ps_ent_ctxt ); 2604 2605 /** 2606 * Output buffer 2607 */ 2608 out_buf_t as_out_buf[MAX_CTXT_SETS]; 2609 2610 /** 2611 * recon buffer 2612 */ 2613 rec_buf_t as_rec_buf[MAX_CTXT_SETS]; 2614 2615 /** 2616 * rate control context 2617 */ 2618 rate_control_ctxt_t s_rate_control; 2619 2620 /** 2621 * VUI structure 2622 */ 2623 vui_t s_vui; 2624 2625 /** 2626 * input buffer queue 2627 */ 2628 inp_buf_t as_inp_list[MAX_NUM_BFRAMES]; 2629 2630 /** 2631 * Flag to indicate if any IDR requests are pending 2632 */ 2633 WORD32 i4_pending_idr_flag; 2634 2635 /* 2636 *Flag to indicate if we have recived the last input frame 2637 */ 2638 WORD32 i4_last_inp_buff_received; 2639 2640 }; 2641 2642 #endif /* IH264E_STRUCTS_H_ */ 2643