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_utils.c 25 * 26 * @brief 27 * Contains miscellaneous utility functions used by the encoder 28 * 29 * @author 30 * ittiam 31 * 32 * @par List of Functions: 33 * - ih264e_get_min_level() 34 * - ih264e_get_lvl_idx() 35 * - ih264e_get_dpb_size() 36 * - ih264e_get_total_pic_buf_size() 37 * - ih264e_get_pic_mv_bank_size() 38 * - ih264e_pic_buf_mgr_add_bufs() 39 * - ih264e_mv_buf_mgr_add_bufs() 40 * - ih264e_init_quant_params() 41 * - ih264e_init_air_map() 42 * - ih264e_codec_init() 43 * - ih264e_pic_init() 44 * 45 * @remarks 46 * None 47 * 48 ******************************************************************************* 49 */ 50 51 /*****************************************************************************/ 52 /* File Includes */ 53 /*****************************************************************************/ 54 55 /* system include files */ 56 #include <stdio.h> 57 #include <stddef.h> 58 #include <stdlib.h> 59 #include <string.h> 60 #include <assert.h> 61 62 /* user include files */ 63 #include "ih264_typedefs.h" 64 #include "iv2.h" 65 #include "ive2.h" 66 #include "ih264e.h" 67 #include "ithread.h" 68 #include "ih264_defs.h" 69 #include "ih264_size_defs.h" 70 #include "ime_distortion_metrics.h" 71 #include "ime_defs.h" 72 #include "ime_structs.h" 73 #include "ih264_error.h" 74 #include "ih264_structs.h" 75 #include "ih264_trans_quant_itrans_iquant.h" 76 #include "ih264_inter_pred_filters.h" 77 #include "ih264_mem_fns.h" 78 #include "ih264_padding.h" 79 #include "ih264_intra_pred_filters.h" 80 #include "ih264_deblk_edge_filters.h" 81 #include "ih264_cabac_tables.h" 82 #include "ih264_macros.h" 83 #include "ih264_common_tables.h" 84 #include "ih264_debug.h" 85 #include "ih264_trans_data.h" 86 #include "ih264e_defs.h" 87 #include "ih264e_globals.h" 88 #include "ih264_buf_mgr.h" 89 #include "ih264_dpb_mgr.h" 90 #include "ih264e_error.h" 91 #include "ih264e_bitstream.h" 92 #include "irc_cntrl_param.h" 93 #include "irc_frame_info_collector.h" 94 #include "ih264e_rate_control.h" 95 #include "ih264e_cabac_structs.h" 96 #include "ih264e_structs.h" 97 #include "ih264e_cabac.h" 98 #include "ih264e_utils.h" 99 #include "ih264e_config.h" 100 #include "ih264e_statistics.h" 101 #include "ih264e_trace.h" 102 #include "ih264_list.h" 103 #include "ih264e_encode_header.h" 104 #include "ih264e_me.h" 105 #include "ime.h" 106 #include "ih264e_core_coding.h" 107 #include "ih264e_rc_mem_interface.h" 108 #include "ih264e_time_stamp.h" 109 #include "ih264e_debug.h" 110 #include "ih264e_process.h" 111 #include "ih264e_master.h" 112 #include "irc_rate_control_api.h" 113 #include "ime_statistics.h" 114 115 /*****************************************************************************/ 116 /* Function Definitions */ 117 /*****************************************************************************/ 118 119 /** 120 ******************************************************************************* 121 * 122 * @brief 123 * Queues the current buffer, gets back a another buffer for encoding with corrent 124 * picture type 125 * 126 * @par Description: 127 * This function performs 3 distinct but related functions. 128 * 1) Maintains an input queue [Note the the term queue donot imply a 129 * first-in first-out logic here] that queues input and dequeues them so 130 * that input frames can be encoded at any predetermined encoding order 131 * 2) Uses RC library to decide which frame must be encoded in current pass 132 * and which picture type it must be encoded to. 133 * 3) Uses RC library to decide the QP at which current frame has to be 134 * encoded 135 * 4) Determines if the current picture must be encoded or not based on 136 * PRE-ENC skip 137 * 138 * Input queue is used for storing input buffers till they are used for 139 * encoding. This queue is maintained at ps_codec->as_inp_list. Whenever a 140 * valid input comes, it is added to the end of queue. This same input is 141 * added to RC queue using the identifier as ps_codec->i4_pic_cnt. Hence any 142 * pic from RC can be located in the input queue easily. 143 * 144 * The dequeue operation does not start till we have ps_codec->s_cfg.u4_max_num_bframes 145 * frames in the queue. THis is done in order to ensure that once output starts 146 * we will have a constant stream of output with no gaps. 147 * 148 * THe output frame order is governed by RC library. When ever we dequeue a 149 * buffer from RC library, it ensures that we will get them in encoding order 150 * With the output of RC library, we can use the picture id to dequeue the 151 * corresponding buffer from input queue and encode it. 152 * 153 * Condition at the end of stream. 154 * ------------------------------- 155 * At the last valid buffer from the app, we will get ps_ive_ip->u4_is_last 156 * to be set. This will the given to lib when appropriate input buffer is 157 * given to encoding. 158 * 159 * Since we have to output is not in sync with input, we will have frames to 160 * encode even after we recive the last vaild input buffer. Hence we have to 161 * make sure that we donot queue any new buffers once we get the flag [It may 162 * mess up GOP ?]. This is acheived by setting ps_codec->i4_last_inp_buff_received 163 * to act as a permenent marker for last frame recived [This may not be needed, 164 * because in our current app, all buffers after the last are marked as last. 165 * But can we rely on that?] . Hence after this flgag is set no new buffers are 166 * queued. 167 * 168 * @param[in] ps_codec 169 * Pointer to codec descriptor 170 * 171 * @param[in] ps_ive_ip 172 * Current input buffer to the encoder 173 * 174 * @param[out] ps_inp 175 * Buffer to be encoded in the current pass 176 * 177 * @returns 178 * Flag indicating if we have a pre-enc skip or not 179 * 180 * @remarks 181 * TODO (bpic) 182 * The check for null ans is last is redudent. 183 * Need to see if we can remove it 184 * 185 ******************************************************************************* 186 */ 187 WORD32 ih264e_input_queue_update(codec_t *ps_codec, 188 ive_video_encode_ip_t *ps_ive_ip, 189 inp_buf_t *ps_enc_buff) 190 { 191 192 inp_buf_t *ps_inp_buf; 193 picture_type_e e_pictype; 194 WORD32 i4_skip; 195 UWORD32 ctxt_sel, u4_pic_id, u4_pic_disp_id; 196 UWORD8 u1_frame_qp, i; 197 UWORD32 max_frame_bits = 0x7FFFFFFF; 198 199 /* Mark that the last input frame has been received */ 200 if (ps_ive_ip->u4_is_last == 1) 201 { 202 ps_codec->i4_last_inp_buff_received = 1; 203 } 204 205 if (ps_ive_ip->s_inp_buf.apv_bufs[0] == NULL 206 && !ps_codec->i4_last_inp_buff_received) 207 { 208 ps_enc_buff->s_raw_buf.apv_bufs[0] = NULL; 209 ps_enc_buff->u4_is_last = ps_ive_ip->u4_is_last; 210 return 0; 211 } 212 213 /*************************************************************************** 214 * Check for pre enc skip 215 * When src and target frame rates donot match, we skip some frames to 216 * maintain the relation ship between them 217 **************************************************************************/ 218 { 219 WORD32 skip_src; 220 221 skip_src = ih264e_update_rc_framerates( 222 ps_codec->s_rate_control.pps_rate_control_api, 223 ps_codec->s_rate_control.pps_pd_frm_rate, 224 ps_codec->s_rate_control.pps_time_stamp, 225 ps_codec->s_rate_control.pps_frame_time); 226 227 if (skip_src) 228 { 229 ps_enc_buff->u4_is_last = ps_ive_ip->u4_is_last; 230 return 1; 231 } 232 } 233 234 /*************************************************************************** 235 *Queue the input to the queue 236 **************************************************************************/ 237 ps_inp_buf = &(ps_codec->as_inp_list[ps_codec->i4_pic_cnt 238 % MAX_NUM_INP_FRAMES]); 239 240 /* copy input info. to internal structure */ 241 ps_inp_buf->s_raw_buf = ps_ive_ip->s_inp_buf; 242 ps_inp_buf->u4_timestamp_low = ps_ive_ip->u4_timestamp_low; 243 ps_inp_buf->u4_timestamp_high = ps_ive_ip->u4_timestamp_high; 244 ps_inp_buf->u4_is_last = ps_ive_ip->u4_is_last; 245 ps_inp_buf->pv_mb_info = ps_ive_ip->pv_mb_info; 246 ps_inp_buf->u4_mb_info_type = ps_ive_ip->u4_mb_info_type; 247 ps_inp_buf->pv_pic_info = ps_ive_ip->pv_pic_info; 248 ps_inp_buf->u4_pic_info_type = ps_ive_ip->u4_pic_info_type; 249 250 /*************************************************************************** 251 * Now we should add the picture to RC stack here 252 **************************************************************************/ 253 /* 254 * If an I frame has been requested, ask RC to force it 255 * For IDR requests, we have to ask RC to force I and set IDR by our selves 256 * since RC Donot know about IDR. For forcing an IDR at dequeue stage we 257 * should record that an IDR has been requested some where. Hence we will 258 * store it in the u4_idr_inp_list at a position same as that of input frame 259 */ 260 { 261 WORD32 i4_force_idr, i4_force_i; 262 263 i4_force_idr = (ps_codec->force_curr_frame_type == IV_IDR_FRAME); 264 i4_force_idr |= !(ps_codec->i4_pic_cnt % ps_codec->s_cfg.u4_idr_frm_interval); 265 266 i4_force_i = (ps_codec->force_curr_frame_type == IV_I_FRAME); 267 268 ps_codec->i4_pending_idr_flag |= i4_force_idr; 269 270 if ((ps_codec->i4_pic_cnt > 0) && (i4_force_idr || i4_force_i)) 271 { 272 irc_force_I_frame(ps_codec->s_rate_control.pps_rate_control_api); 273 } 274 ps_codec->force_curr_frame_type = IV_NA_FRAME; 275 } 276 277 irc_add_picture_to_stack(ps_codec->s_rate_control.pps_rate_control_api, 278 ps_codec->i4_pic_cnt); 279 280 281 /* Delay */ 282 if (ps_codec->i4_encode_api_call_cnt 283 < (WORD32)(ps_codec->s_cfg.u4_num_bframes)) 284 { 285 ps_enc_buff->s_raw_buf.apv_bufs[0] = NULL; 286 ps_enc_buff->u4_is_last = 0; 287 return 0; 288 } 289 290 /*************************************************************************** 291 * Get a new pic to encode 292 **************************************************************************/ 293 /* Query the picture_type */ 294 e_pictype = ih264e_rc_get_picture_details( 295 ps_codec->s_rate_control.pps_rate_control_api, (WORD32 *)(&u4_pic_id), 296 (WORD32 *)(&u4_pic_disp_id)); 297 298 switch (e_pictype) 299 { 300 case I_PIC: 301 ps_codec->pic_type = PIC_I; 302 break; 303 case P_PIC: 304 ps_codec->pic_type = PIC_P; 305 break; 306 case B_PIC: 307 ps_codec->pic_type = PIC_B; 308 break; 309 default: 310 ps_codec->pic_type = PIC_NA; 311 ps_enc_buff->s_raw_buf.apv_bufs[0] = NULL; 312 return 0; 313 } 314 315 /* Set IDR if it has been requested */ 316 if (ps_codec->pic_type == PIC_I) 317 { 318 ps_codec->pic_type = ps_codec->i4_pending_idr_flag ? 319 PIC_IDR : ps_codec->pic_type; 320 ps_codec->i4_pending_idr_flag = 0; 321 } 322 323 /* Get current frame Qp */ 324 u1_frame_qp = (UWORD8)irc_get_frame_level_qp( 325 ps_codec->s_rate_control.pps_rate_control_api, e_pictype, 326 max_frame_bits); 327 ps_codec->u4_frame_qp = gau1_mpeg2_to_h264_qmap[u1_frame_qp]; 328 329 /* 330 * copy the pic id to poc because the display order is assumed to be same 331 * as input order 332 */ 333 ps_codec->i4_poc = u4_pic_id; 334 335 /*************************************************************************** 336 * Now retrieve the correct picture from the queue 337 **************************************************************************/ 338 339 /* Mark the skip flag */ 340 i4_skip = 0; 341 ctxt_sel = ps_codec->i4_encode_api_call_cnt % MAX_CTXT_SETS; 342 ps_codec->s_rate_control.pre_encode_skip[ctxt_sel] = i4_skip; 343 344 /* Get a buffer to encode */ 345 ps_inp_buf = &(ps_codec->as_inp_list[u4_pic_id % MAX_NUM_INP_FRAMES]); 346 347 /* copy dequeued input to output */ 348 ps_enc_buff->s_raw_buf = ps_inp_buf->s_raw_buf; 349 ps_enc_buff->u4_timestamp_low = ps_inp_buf->u4_timestamp_low; 350 ps_enc_buff->u4_timestamp_high = ps_inp_buf->u4_timestamp_high; 351 ps_enc_buff->u4_is_last = ps_inp_buf->u4_is_last; 352 ps_enc_buff->pv_mb_info = ps_inp_buf->pv_mb_info; 353 ps_enc_buff->u4_mb_info_type = ps_inp_buf->u4_mb_info_type; 354 ps_enc_buff->pv_pic_info = ps_inp_buf->pv_pic_info; 355 ps_enc_buff->u4_pic_info_type = ps_inp_buf->u4_pic_info_type; 356 357 /* Special case for encoding trailing B frames 358 * 359 * In encoding streams with B frames it may happen that we have a B frame 360 * at the end without a P/I frame after it. Hence when we are dequeing from 361 * the RC, it will return the P frame [next in display order but before in 362 * encoding order] first. Since the dequeue happens for an invalid frame we 363 * will get a frame with null buff and set u4_is_last. Hence lib with return 364 * last frame flag at this point and will stop encoding. 365 * 366 * Since for the last B frame, we does not have the forward ref frame 367 * it makes sense to force it into P. 368 * 369 * To solve this, in case the current frame is P and if the last frame flag 370 * is set, we need to see if there is and pending B frames. If there are any, 371 * we should just encode that picture as the current P frame and set 372 * that B frame as the last frame. Hence the encoder will terminate naturally 373 * once that B-frame is encoded after all the in between frames. 374 * 375 * Since we cannot touch RC stack directly, the option of actually swapping 376 * frames in RC is ruled out. We have to modify the as_inp_list to simulate 377 * such a behavior by RC. We can do that by 378 * 1) Search through as_inp_list to locate the largest u4_timestamp_low less 379 * than current u4_timestamp_low. This will give us the last B frame before 380 * the current P frame. Note that this will handle pre encode skip too since 381 * queue happens after pre enc skip. 382 * 2) Swap the position in as_inp_list. Hence now the last B frame is 383 * encoded as P frame. And the new last B frame will have u4_is_last 384 * set so that encoder will end naturally once we reached that B frame 385 * or any subsequent frame. Also the current GOP will have 1 less B frame 386 * Since we are swapping, the poc will also be in-order. 387 * 3) In case we have an IPP stream, the result of our search will be an 388 * I/P frame which is already encoded. Thus swap and encode will result 389 * in encoding of duplicate frames. Hence to avoid this we will only 390 * have this work around in case of u4_num_bframes > 0. 391 * 392 * In case we have forced an I/IDR frame In between this P frame and 393 * the last B frame -> This cannot happen as the current P frame is 394 * supposed to have u4_is_last set. Thus forcing an I/ IDR after this 395 * is illogical. 396 * 397 * In cae if we have forced an I such that the frame just before last frame 398 * in is I/P -> This case will never arise. Since we have a closed GOP now, 399 * once we force an I, the gop gets reset, hence there will be a B between 400 * I/P and I/P. 401 */ 402 if (ps_enc_buff->u4_is_last && (ps_codec->pic_type == PIC_P) 403 && ps_codec->s_cfg.u4_num_bframes) 404 { 405 WORD32 cntr; 406 WORD32 lst_bframe = -1; 407 UWORD32 u4_timestamp_low = 0; 408 UWORD32 u4_timestamp_high = 0; 409 inp_buf_t *ps_swap_buff, *ps_inp_list; 410 411 ps_inp_list = &ps_codec->as_inp_list[0]; 412 413 /* Now search the inp list for highest timestamp */ 414 for(cntr = 0; cntr < MAX_NUM_INP_FRAMES; cntr++) 415 { 416 if(ps_inp_list[cntr].s_raw_buf.apv_bufs[0] != NULL) 417 { 418 if ((ps_inp_list[cntr].u4_timestamp_high > u4_timestamp_high) || 419 (ps_inp_list[cntr].u4_timestamp_high == u4_timestamp_high && 420 ps_inp_list[cntr].u4_timestamp_low > u4_timestamp_low)) 421 { 422 u4_timestamp_low = ps_inp_list[cntr].u4_timestamp_low; 423 u4_timestamp_high = ps_inp_list[cntr].u4_timestamp_high; 424 lst_bframe = cntr; 425 } 426 } 427 } 428 429 if(lst_bframe != -1) 430 { 431 ps_swap_buff = &(ps_codec->as_inp_list[lst_bframe]); 432 433 /* copy the last B buffer to output */ 434 *ps_enc_buff = *ps_swap_buff; 435 436 /* Store the current buf into the queue in place of last B buf */ 437 *ps_swap_buff = *ps_inp_buf; 438 } 439 } 440 441 if (ps_enc_buff->u4_is_last) 442 { 443 ps_codec->pic_type = PIC_NA; 444 } 445 446 /* The buffer in the queue is set to NULL to specify that encoding is done for that frame */ 447 for(i = 0; i < 3; i++) 448 { 449 ps_inp_buf->s_raw_buf.apv_bufs[i] = NULL; 450 } 451 452 /* Return the buffer status */ 453 return (0); 454 } 455 456 /** 457 ******************************************************************************* 458 * 459 * @brief 460 * Used to get minimum level index for a given picture size 461 * 462 * @par Description: 463 * Gets the minimum level index and then gets corresponding level. 464 * Also used to ignore invalid levels like 2.3, 3.3 etc 465 * 466 * @param[in] level 467 * Level of the stream 468 * 469 * @returns Level index for a given level 470 * 471 * @remarks 472 * 473 ******************************************************************************* 474 */ 475 WORD32 ih264e_get_min_level(WORD32 wd, WORD32 ht) 476 { 477 WORD32 lvl_idx = MAX_LEVEL, i; 478 WORD32 pic_size = wd * ht; 479 WORD32 max = MAX(wd, ht); 480 for (i = 0; i < MAX_LEVEL; i++) 481 { 482 if ((pic_size <= gai4_ih264_max_luma_pic_size[i]) && 483 (max <= gai4_ih264_max_wd_ht[i])) 484 { 485 lvl_idx = i; 486 break; 487 } 488 } 489 490 return gai4_ih264_levels[lvl_idx]; 491 } 492 493 /** 494 ******************************************************************************* 495 * 496 * @brief 497 * Used to get level index for a given level 498 * 499 * @par Description: 500 * Converts from level_idc (which is multiplied by 30) to an index that can be 501 * used as a lookup. Also used to ignore invalid levels like 2.2 , 3.2 etc 502 * 503 * @param[in] level 504 * Level of the stream 505 * 506 * @returns Level index for a given level 507 * 508 * @remarks 509 * 510 ******************************************************************************* 511 */ 512 WORD32 ih264e_get_lvl_idx(WORD32 level) 513 { 514 WORD32 lvl_idx = 0; 515 516 if (level < IH264_LEVEL_11) 517 { 518 lvl_idx = 0; 519 } 520 else if (level < IH264_LEVEL_12) 521 { 522 lvl_idx = 1; 523 } 524 else if (level < IH264_LEVEL_13) 525 { 526 lvl_idx = 2; 527 } 528 else if (level < IH264_LEVEL_20) 529 { 530 lvl_idx = 3; 531 } 532 else if (level < IH264_LEVEL_21) 533 { 534 lvl_idx = 4; 535 } 536 else if (level < IH264_LEVEL_22) 537 { 538 lvl_idx = 5; 539 } 540 else if (level < IH264_LEVEL_30) 541 { 542 lvl_idx = 6; 543 } 544 else if (level < IH264_LEVEL_31) 545 { 546 lvl_idx = 7; 547 } 548 else if (level < IH264_LEVEL_32) 549 { 550 lvl_idx = 8; 551 } 552 else if (level < IH264_LEVEL_40) 553 { 554 lvl_idx = 9; 555 } 556 else if (level < IH264_LEVEL_41) 557 { 558 lvl_idx = 10; 559 } 560 else if (level < IH264_LEVEL_42) 561 { 562 lvl_idx = 11; 563 } 564 else if (level < IH264_LEVEL_50) 565 { 566 lvl_idx = 12; 567 } 568 else if (level < IH264_LEVEL_51) 569 { 570 lvl_idx = 13; 571 } 572 else 573 { 574 lvl_idx = 14; 575 } 576 577 return (lvl_idx); 578 } 579 580 /** 581 ******************************************************************************* 582 * 583 * @brief returns maximum number of pictures allowed in dpb for a given level 584 * 585 * @par Description: 586 * For given width, height and level, number of pictures allowed in decoder 587 * picture buffer is computed as per Annex A.3.1 588 * 589 * @param[in] level 590 * level of the bit-stream 591 * 592 * @param[in] pic_size 593 * width * height 594 * 595 * @returns Number of buffers in DPB 596 * 597 * @remarks 598 * From annexure A.3.1 of H264 specification, 599 * max_dec_frame_buffering <= MaxDpbSize, where MaxDpbSize is equal to 600 * Min( 1024 * MaxDPB / ( PicWidthInMbs * FrameHeightInMbs * 384 ), 16 ) and 601 * MaxDPB is given in Table A-1 in units of 1024 bytes. However the MaxDPB size 602 * presented in the look up table gas_ih264_lvl_tbl is in units of 512 603 * bytes. Hence the expression is modified accordingly. 604 * 605 ******************************************************************************* 606 */ 607 WORD32 ih264e_get_dpb_size(WORD32 level, WORD32 pic_size) 608 { 609 /* dpb size */ 610 WORD32 max_dpb_size_bytes = 0; 611 612 /* dec frame buffering */ 613 WORD32 max_dpb_size_frames = 0; 614 615 /* temp var */ 616 WORD32 i; 617 618 /* determine max luma samples */ 619 for (i = 0; i < 16; i++) 620 if (level == (WORD32)gas_ih264_lvl_tbl[i].u4_level_idc) 621 max_dpb_size_bytes = gas_ih264_lvl_tbl[i].u4_max_dpb_size; 622 623 /* from Annexure A.3.1 h264 specification */ 624 max_dpb_size_frames = 625 MIN( 1024 * max_dpb_size_bytes / ( pic_size * 3 ), MAX_DPB_SIZE ); 626 627 return max_dpb_size_frames; 628 } 629 630 /** 631 ******************************************************************************* 632 * 633 * @brief 634 * Used to get reference picture buffer size for a given level and 635 * and padding used 636 * 637 * @par Description: 638 * Used to get reference picture buffer size for a given level and padding used 639 * Each picture is padded on all four sides 640 * 641 * @param[in] pic_size 642 * Number of luma samples (Width * Height) 643 * 644 * @param[in] level 645 * Level 646 * 647 * @param[in] horz_pad 648 * Total padding used in horizontal direction 649 * 650 * @param[in] vert_pad 651 * Total padding used in vertical direction 652 * 653 * @returns Total picture buffer size 654 * 655 * @remarks 656 * 657 * 658 ******************************************************************************* 659 */ 660 WORD32 ih264e_get_total_pic_buf_size(WORD32 pic_size, 661 WORD32 level, 662 WORD32 horz_pad, 663 WORD32 vert_pad, 664 WORD32 num_ref_frames, 665 WORD32 num_reorder_frames) 666 { 667 WORD32 size; 668 WORD32 num_luma_samples; 669 WORD32 lvl_idx; 670 WORD32 max_wd, min_ht; 671 WORD32 num_samples; 672 WORD32 max_num_bufs; 673 WORD32 pad = MAX(horz_pad, vert_pad); 674 675 /* 676 * If num_ref_frames and num_reorder_frmaes is specified 677 * Use minimum value 678 */ 679 max_num_bufs = (num_ref_frames + num_reorder_frames + MAX_CTXT_SETS); 680 681 /* Get level index */ 682 lvl_idx = ih264e_get_lvl_idx(level); 683 684 /* Maximum number of luma samples in a picture at given level */ 685 num_luma_samples = gai4_ih264_max_luma_pic_size[lvl_idx]; 686 num_luma_samples = MAX(num_luma_samples, pic_size); 687 688 /* Account for chroma */ 689 num_samples = num_luma_samples * 3 / 2; 690 691 /* Maximum width of luma samples in a picture at given level */ 692 max_wd = gai4_ih264_max_wd_ht[lvl_idx]; 693 694 /* Minimum height of luma samples in a picture at given level */ 695 min_ht = gai4_ih264_min_wd_ht[lvl_idx]; 696 697 /* Allocation is required for 698 * (Wd + horz_pad) * (Ht + vert_pad) * (2 * max_dpb_size + 1) 699 * 700 * Above expanded as 701 * ((Wd * Ht) + (horz_pad * vert_pad) + Wd * vert_pad + Ht * horz_pad) * (2 * max_dpb_size + 1) 702 * (Wd * Ht) * (2 * max_dpb_size + 1) + ((horz_pad * vert_pad) + Wd * vert_pad + Ht * horz_pad) * (2 * max_dpb_size + 1) 703 * Now max_dpb_size increases with smaller Wd and Ht, but Wd * ht * max_dpb_size will still be lesser or equal to max_wd * max_ht * dpb_size 704 * 705 * In the above equation (Wd * Ht) * (2 * max_dpb_size + 1) is accounted by using num_samples * (2 * max_dpb_size + 1) below 706 * 707 * For the padded area use MAX(horz_pad, vert_pad) as pad 708 * ((pad * pad) + pad * (Wd + Ht)) * (2 * max_dpb_size + 1) has to accounted from the above for padding 709 * 710 * Since Width and Height can change worst Wd + Ht is when One of the dimensions is max and other is min 711 * So use max_wd and min_ht 712 */ 713 714 /* Number of bytes in reference pictures */ 715 size = num_samples * max_num_bufs; 716 717 /* Account for padding area */ 718 size += ((pad * pad) + pad * (max_wd + min_ht)) * 3 / 2 * max_num_bufs; 719 720 return size; 721 } 722 723 /** 724 ******************************************************************************* 725 * 726 * @brief Returns MV bank buffer size for a given number of luma samples 727 * 728 * @par Description: 729 * For given number of luma samples one MV bank size is computed. 730 * Each MV bank includes pu_map and enc_pu_t for all the min PUs(4x4) in a picture 731 * 732 * @param[in] num_luma_samples 733 * Max number of luma pixels in the frame 734 * 735 * @returns Total MV Bank size 736 * 737 * @remarks 738 * 739 ******************************************************************************* 740 */ 741 WORD32 ih264e_get_pic_mv_bank_size(WORD32 num_luma_samples) 742 { 743 /* mv bank buffer size */ 744 WORD32 mv_bank_size = 0; 745 746 /* number of sub mb partitions possible */ 747 WORD32 num_pu = num_luma_samples / (ENC_MIN_PU_SIZE * ENC_MIN_PU_SIZE); 748 749 /* number of mbs */ 750 WORD32 num_mb = num_luma_samples / (MB_SIZE * MB_SIZE); 751 752 /* Size for storing enc_pu_t start index each MB */ 753 /* One extra entry is needed to compute number of PUs in the last MB */ 754 mv_bank_size += num_mb * sizeof(WORD32); 755 756 /* Size for pu_map */ 757 mv_bank_size += ALIGN4(num_pu); 758 759 /* Size for storing enc_pu_t for each PU */ 760 mv_bank_size += ALIGN4(num_pu * sizeof(enc_pu_t)); 761 762 return mv_bank_size; 763 } 764 765 /** 766 ******************************************************************************* 767 * 768 * @brief 769 * Function to initialize ps_pic_buf structs add pic buffers to 770 * buffer manager in case of non-shared mode 771 * 772 * @par Description: 773 * Function to initialize ps_pic_buf structs add pic buffers to 774 * buffer manager in case of non-shared mode 775 * To be called once per stream or for every reset 776 * 777 * @param[in] ps_codec 778 * Pointer to codec context 779 * 780 * @returns error status 781 * 782 * @remarks 783 * 784 ******************************************************************************* 785 */ 786 IH264E_ERROR_T ih264e_pic_buf_mgr_add_bufs(codec_t *ps_codec) 787 { 788 /* error status */ 789 IH264E_ERROR_T ret = IH264E_SUCCESS; 790 791 /* max ref buffer cnt */ 792 WORD32 max_num_bufs = ps_codec->i4_ref_buf_cnt; 793 794 /* total size for pic buffers */ 795 WORD32 pic_buf_size_allocated = ps_codec->i4_total_pic_buf_size 796 - BUF_MGR_MAX_CNT * sizeof(pic_buf_t); 797 798 /* temp var */ 799 UWORD8 *pu1_buf = (UWORD8 *) ps_codec->ps_pic_buf; 800 pic_buf_t *ps_pic_buf = (pic_buf_t *) ps_codec->ps_pic_buf; 801 WORD32 i; 802 803 pu1_buf += BUF_MGR_MAX_CNT * sizeof(pic_buf_t); 804 805 /* In case of non-shared mode, add picture buffers to buffer manager 806 * In case of shared mode, buffers are added in the run-time 807 */ 808 { 809 WORD32 buf_ret; 810 811 WORD32 luma_samples = (ps_codec->i4_rec_strd) 812 * (ps_codec->s_cfg.u4_ht + PAD_HT); 813 814 WORD32 chroma_samples = luma_samples >> 1; 815 816 /* Try and add as many buffers as possible for the memory that is allocated */ 817 /* If the number of buffers that can be added is less than max_num_bufs 818 * return with an error */ 819 for (i = 0; i < max_num_bufs; i++) 820 { 821 pic_buf_size_allocated -= (luma_samples + chroma_samples); 822 823 if (pic_buf_size_allocated < 0) 824 { 825 ps_codec->i4_error_code = IH264E_INSUFFICIENT_MEM_PICBUF; 826 return IH264E_INSUFFICIENT_MEM_PICBUF; 827 } 828 829 ps_pic_buf->pu1_luma = pu1_buf + ps_codec->i4_rec_strd * PAD_TOP 830 + PAD_LEFT; 831 pu1_buf += luma_samples; 832 833 ps_pic_buf->pu1_chroma = pu1_buf 834 + ps_codec->i4_rec_strd * (PAD_TOP / 2)+ PAD_LEFT; 835 pu1_buf += chroma_samples; 836 837 buf_ret = ih264_buf_mgr_add((buf_mgr_t *) ps_codec->pv_ref_buf_mgr, 838 ps_pic_buf, i); 839 840 if (0 != buf_ret) 841 { 842 ps_codec->i4_error_code = IH264E_BUF_MGR_ERROR; 843 return IH264E_BUF_MGR_ERROR; 844 } 845 pu1_buf += (HPEL_PLANES_CNT - 1) * (chroma_samples + luma_samples); 846 ps_pic_buf++; 847 } 848 } 849 850 return ret; 851 } 852 853 /** 854 ******************************************************************************* 855 * 856 * @brief Function to add buffers to MV Bank buffer manager 857 * 858 * @par Description: 859 * Function to add buffers to MV Bank buffer manager. To be called once per 860 * stream or for every reset 861 * 862 * @param[in] ps_codec 863 * Pointer to codec context 864 * 865 * @returns error status 866 * 867 * @remarks 868 * 869 ******************************************************************************* 870 */ 871 IH264E_ERROR_T ih264e_mv_buf_mgr_add_bufs(codec_t *ps_codec) 872 { 873 /* error status */ 874 IH264E_ERROR_T error_status = IH264E_SUCCESS; 875 IH264_ERROR_T ret; 876 877 /* max dpb size in frames */ 878 WORD32 max_dpb_size = 0; 879 880 /* mv bank size for the entire dpb */ 881 WORD32 mv_bank_size_allocated = 0; 882 883 /* mv bank size per pic */ 884 WORD32 pic_mv_bank_size = 0; 885 886 /* mv buffer ptr */ 887 mv_buf_t *ps_mv_buf = NULL; 888 889 /* num of luma samples */ 890 WORD32 num_luma_samples = ALIGN16(ps_codec->s_cfg.u4_wd) 891 * ALIGN16(ps_codec->s_cfg.u4_ht); 892 893 /* number of mb's & frame partitions */ 894 WORD32 num_pu, num_mb; 895 896 /* temp var */ 897 UWORD8 *pu1_buf = NULL; 898 WORD32 i; 899 900 /* Compute the number of MB Bank buffers needed */ 901 max_dpb_size = ps_codec->i4_ref_buf_cnt; 902 903 /* allocate memory for mv buffer array */ 904 ps_codec->ps_mv_buf = ps_codec->pv_mv_bank_buf_base; 905 pu1_buf = ps_codec->pv_mv_bank_buf_base; 906 pu1_buf += BUF_MGR_MAX_CNT * sizeof(mv_buf_t); 907 908 /********************************************************************/ 909 /* allocate memory for individual elements of mv buffer ptr */ 910 /********************************************************************/ 911 mv_bank_size_allocated = ps_codec->i4_total_mv_bank_size 912 - (BUF_MGR_MAX_CNT * sizeof(mv_buf_t)); 913 914 /* compute MV bank size per picture */ 915 pic_mv_bank_size = ih264e_get_pic_mv_bank_size(num_luma_samples); 916 917 num_pu = num_luma_samples / (ENC_MIN_PU_SIZE * ENC_MIN_PU_SIZE); 918 num_mb = num_luma_samples / (MB_SIZE * MB_SIZE); 919 i = 0; 920 ps_mv_buf = ps_codec->pv_mv_bank_buf_base; 921 922 while (i < max_dpb_size) 923 { 924 mv_bank_size_allocated -= pic_mv_bank_size; 925 926 if (mv_bank_size_allocated < 0) 927 { 928 ps_codec->i4_error_code = IH264E_INSUFFICIENT_MEM_MVBANK; 929 930 error_status = IH264E_INSUFFICIENT_MEM_MVBANK; 931 932 return error_status; 933 } 934 935 ps_mv_buf->pu4_mb_pu_cnt = (UWORD32 *) pu1_buf; 936 pu1_buf += num_mb * sizeof(WORD32); 937 938 ps_mv_buf->pu1_pic_pu_map = pu1_buf; 939 pu1_buf += ALIGN4(num_pu); 940 941 ps_mv_buf->ps_pic_pu = (enc_pu_t *) (pu1_buf); 942 pu1_buf += ALIGN4(num_pu * sizeof(enc_pu_t)); 943 944 ret = ih264_buf_mgr_add((buf_mgr_t *) ps_codec->pv_mv_buf_mgr, 945 ps_mv_buf, i); 946 947 if (IH264_SUCCESS != ret) 948 { 949 ps_codec->i4_error_code = IH264E_BUF_MGR_ERROR; 950 error_status = IH264E_BUF_MGR_ERROR; 951 return error_status; 952 } 953 954 ps_mv_buf++; 955 i++; 956 } 957 958 return error_status; 959 } 960 961 /** 962 ******************************************************************************* 963 * 964 * @brief Function to initialize quant params structure 965 * 966 * @par Description: 967 * The forward quantization modules depends on qp/6, qp mod 6, forward scale 968 * matrix, forward threshold matrix, weight list. The inverse quantization 969 * modules depends on qp/6, qp mod 6, inverse scale matrix, weight list. 970 * These params are initialized in this function. 971 * 972 * @param[in] ps_proc 973 * pointer to process context 974 * 975 * @param[in] qp 976 * quantization parameter 977 * 978 * @returns none 979 * 980 * @remarks 981 * 982 ******************************************************************************* 983 */ 984 void ih264e_init_quant_params(process_ctxt_t *ps_proc, int qp) 985 { 986 /* quant params */ 987 quant_params_t *ps_qp_params; 988 989 /* ptr to forward quant threshold matrix */ 990 const UWORD16 *pu2_thres_mat = NULL; 991 992 /* ptr to forward scale matrix */ 993 const UWORD16 *pu2_scale_mat = gu2_quant_scale_matrix_4x4; 994 995 /* ptr to inverse scale matrix */ 996 const UWORD16 *pu2_iscale_mat = gau2_ih264_iquant_scale_matrix_4x4; 997 998 /* temp var */ 999 UWORD32 u4_qp[3], u4_qp_div6, u4_qp_mod6; 1000 COMPONENT_TYPE plane; 1001 WORD32 i; 1002 UWORD32 u4_satdq_t; 1003 const UWORD16 *pu2_smat; 1004 1005 /********************************************************************/ 1006 /* init quant params for all planes Y, U and V */ 1007 /********************************************************************/ 1008 /* luma qp */ 1009 u4_qp[Y] = qp; 1010 1011 /* chroma qp 1012 * TODO_LATER : just in case if the chroma planes use different qp's this 1013 * needs to be corrected accordingly. 1014 */ 1015 u4_qp[U] = gu1_qpc_fqpi[qp]; 1016 u4_qp[V] = gu1_qpc_fqpi[qp]; 1017 1018 plane = Y; 1019 while (plane <= V) 1020 { 1021 u4_qp_div6 = (u4_qp[plane] / 6); 1022 u4_qp_mod6 = (u4_qp[plane] % 6); 1023 1024 ps_qp_params = ps_proc->ps_qp_params[plane]; 1025 1026 /* mb qp */ 1027 ps_qp_params->u1_mb_qp = u4_qp[plane]; 1028 1029 /* mb qp / 6 */ 1030 ps_qp_params->u1_qp_div = u4_qp_div6; 1031 1032 /* mb qp % 6 */ 1033 ps_qp_params->u1_qp_rem = u4_qp_mod6; 1034 1035 /* QP bits */ 1036 ps_qp_params->u1_qbits = QP_BITS_h264_4x4 + u4_qp_div6; 1037 1038 /* forward scale matrix */ 1039 ps_qp_params->pu2_scale_mat = pu2_scale_mat + (u4_qp_mod6 * 16); 1040 1041 /* threshold matrix & weight for quantization */ 1042 pu2_thres_mat = gu2_forward_quant_threshold_4x4 + (u4_qp_mod6 * 16); 1043 for (i = 0; i < 16; i++) 1044 { 1045 ps_qp_params->pu2_thres_mat[i] = pu2_thres_mat[i] 1046 >> (8 - u4_qp_div6); 1047 ps_qp_params->pu2_weigh_mat[i] = 16; 1048 } 1049 1050 /* qp dependent rounding constant */ 1051 ps_qp_params->u4_dead_zone = 1052 gu4_forward_quant_round_factor_4x4[u4_qp_div6]; 1053 1054 /* slice dependent rounding constant */ 1055 if (ps_proc->i4_slice_type != ISLICE 1056 && ps_proc->i4_slice_type != SISLICE) 1057 { 1058 ps_qp_params->u4_dead_zone >>= 1; 1059 } 1060 1061 /* SATQD threshold for zero block prediction */ 1062 if (ps_proc->ps_codec->s_cfg.u4_enable_satqd) 1063 { 1064 pu2_smat = ps_qp_params->pu2_scale_mat; 1065 1066 u4_satdq_t = ((1 << (ps_qp_params->u1_qbits)) - ps_qp_params->u4_dead_zone); 1067 1068 ps_qp_params->pu2_sad_thrsh[0] = u4_satdq_t / MAX(pu2_smat[3], pu2_smat[11]); 1069 ps_qp_params->pu2_sad_thrsh[1] = u4_satdq_t / MAX(pu2_smat[1], pu2_smat[9]); 1070 ps_qp_params->pu2_sad_thrsh[2] = u4_satdq_t / pu2_smat[15]; 1071 ps_qp_params->pu2_sad_thrsh[3] = u4_satdq_t / pu2_smat[7]; 1072 ps_qp_params->pu2_sad_thrsh[4] = u4_satdq_t / MAX(pu2_smat[12], pu2_smat[14]); 1073 ps_qp_params->pu2_sad_thrsh[5] = u4_satdq_t / MAX(pu2_smat[4], pu2_smat[6]); 1074 ps_qp_params->pu2_sad_thrsh[6] = u4_satdq_t / pu2_smat[13]; 1075 ps_qp_params->pu2_sad_thrsh[7] = u4_satdq_t / pu2_smat[5]; 1076 ps_qp_params->pu2_sad_thrsh[8] = u4_satdq_t / MAX(MAX3(pu2_smat[0], pu2_smat[2], pu2_smat[8]), pu2_smat[10]); 1077 } 1078 1079 /* inverse scale matrix */ 1080 ps_qp_params->pu2_iscale_mat = pu2_iscale_mat + (u4_qp_mod6 * 16); 1081 1082 plane += 1; 1083 } 1084 return ; 1085 } 1086 1087 /** 1088 ******************************************************************************* 1089 * 1090 * @brief 1091 * Initialize AIR mb frame Map 1092 * 1093 * @par Description: 1094 * Initialize AIR mb frame map 1095 * MB frame map indicates which frame an Mb should be coded as intra according to AIR 1096 * 1097 * @param[in] ps_codec 1098 * Pointer to codec context 1099 * 1100 * @returns error_status 1101 * 1102 * @remarks 1103 * 1104 * 1105 ******************************************************************************* 1106 */ 1107 IH264E_ERROR_T ih264e_init_air_map(codec_t *ps_codec) 1108 { 1109 /* intra refresh map */ 1110 UWORD16 *pu2_intr_rfrsh_map = ps_codec->pu2_intr_rfrsh_map; 1111 1112 /* air mode */ 1113 IVE_AIR_MODE_T air_mode = ps_codec->s_cfg.e_air_mode; 1114 1115 /* refresh period */ 1116 UWORD32 air_period = ps_codec->s_cfg.u4_air_refresh_period; 1117 1118 /* mb cnt */ 1119 UWORD32 u4_mb_cnt = ps_codec->s_cfg.i4_wd_mbs * ps_codec->s_cfg.i4_ht_mbs; 1120 1121 /* temp var */ 1122 UWORD32 curr_mb, seed_rand = 1; 1123 1124 switch (air_mode) 1125 { 1126 case IVE_AIR_MODE_CYCLIC: 1127 1128 for (curr_mb = 0; curr_mb < u4_mb_cnt; curr_mb++) 1129 { 1130 pu2_intr_rfrsh_map[curr_mb] = curr_mb % air_period; 1131 } 1132 break; 1133 1134 case IVE_AIR_MODE_RANDOM: 1135 1136 for (curr_mb = 0; curr_mb < u4_mb_cnt; curr_mb++) 1137 { 1138 seed_rand = (seed_rand * 32719 + 3) % 32749; 1139 pu2_intr_rfrsh_map[curr_mb] = seed_rand % air_period; 1140 } 1141 break; 1142 1143 default: 1144 1145 break; 1146 } 1147 1148 return IH264E_SUCCESS; 1149 } 1150 1151 /** 1152 ******************************************************************************* 1153 * 1154 * @brief 1155 * Codec level initializations 1156 * 1157 * @par Description: 1158 * Initializes the codec with parameters that needs to be set before encoding 1159 * first frame 1160 * 1161 * @param[in] ps_codec 1162 * Pointer to codec context 1163 * 1164 * @param[in] ps_inp_buf 1165 * Pointer to input buffer context 1166 * 1167 * @returns error_status 1168 * 1169 * @remarks 1170 * 1171 * 1172 ******************************************************************************* 1173 */ 1174 IH264E_ERROR_T ih264e_codec_init(codec_t *ps_codec) 1175 { 1176 /******************************************************************** 1177 * INITIALIZE CODEC CONTEXT * 1178 ********************************************************************/ 1179 /* encoder presets */ 1180 if (ps_codec->s_cfg.u4_enc_speed_preset != IVE_CONFIG) 1181 { 1182 if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_SLOWEST) 1183 {/* high quality */ 1184 /* enable diamond search */ 1185 ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH; 1186 ps_codec->s_cfg.u4_enable_fast_sad = 0; 1187 1188 /* disable intra 4x4 */ 1189 ps_codec->s_cfg.u4_enable_intra_4x4 = 1; 1190 ps_codec->luma_energy_compaction[1] = 1191 ih264e_code_luma_intra_macroblock_4x4_rdopt_on; 1192 1193 /* sub pel off */ 1194 ps_codec->s_cfg.u4_enable_hpel = 1; 1195 1196 /* deblocking off */ 1197 ps_codec->s_cfg.u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0; 1198 1199 /* disabled intra inter gating in Inter slices */ 1200 ps_codec->u4_inter_gate = 0; 1201 } 1202 else if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_NORMAL) 1203 {/* normal */ 1204 /* enable diamond search */ 1205 ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH; 1206 ps_codec->s_cfg.u4_enable_fast_sad = 0; 1207 1208 /* disable intra 4x4 */ 1209 ps_codec->s_cfg.u4_enable_intra_4x4 = 1; 1210 1211 /* sub pel off */ 1212 ps_codec->s_cfg.u4_enable_hpel = 1; 1213 1214 /* deblocking off */ 1215 ps_codec->s_cfg.u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0; 1216 1217 /* disabled intra inter gating in Inter slices */ 1218 ps_codec->u4_inter_gate = 0; 1219 } 1220 else if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_FAST) 1221 {/* normal */ 1222 /* enable diamond search */ 1223 ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH; 1224 ps_codec->s_cfg.u4_enable_fast_sad = 0; 1225 1226 /* disable intra 4x4 */ 1227 ps_codec->s_cfg.u4_enable_intra_4x4 = 0; 1228 1229 /* sub pel off */ 1230 ps_codec->s_cfg.u4_enable_hpel = 1; 1231 1232 /* deblocking off */ 1233 ps_codec->s_cfg.u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0; 1234 1235 /* disabled intra inter gating in Inter slices */ 1236 ps_codec->u4_inter_gate = 1; 1237 } 1238 else if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_HIGH_SPEED) 1239 {/* fast */ 1240 /* enable diamond search */ 1241 ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH; 1242 ps_codec->s_cfg.u4_enable_fast_sad = 0; 1243 1244 /* disable intra 4x4 */ 1245 ps_codec->s_cfg.u4_enable_intra_4x4 = 0; 1246 1247 /* sub pel off */ 1248 ps_codec->s_cfg.u4_enable_hpel = 0; 1249 1250 /* deblocking off */ 1251 ps_codec->s_cfg.u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_4; 1252 1253 /* disabled intra inter gating in Inter slices */ 1254 ps_codec->u4_inter_gate = 0; 1255 } 1256 else if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_FASTEST) 1257 {/* fastest */ 1258 /* enable diamond search */ 1259 ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH; 1260 1261 /* disable intra 4x4 */ 1262 ps_codec->s_cfg.u4_enable_intra_4x4 = 0; 1263 1264 /* sub pel off */ 1265 ps_codec->s_cfg.u4_enable_hpel = 0; 1266 1267 /* deblocking off */ 1268 ps_codec->s_cfg.u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_4; 1269 1270 /* disabled intra inter gating in Inter slices */ 1271 ps_codec->u4_inter_gate = 1; 1272 } 1273 } 1274 1275 /***************************************************************** 1276 * Initialize AIR inside codec 1277 *****************************************************************/ 1278 if (IVE_AIR_MODE_NONE != ps_codec->s_cfg.e_air_mode) 1279 { 1280 ih264e_init_air_map(ps_codec); 1281 1282 ps_codec->i4_air_pic_cnt = -1; 1283 } 1284 1285 /****************************************************/ 1286 /* INITIALIZE RATE CONTROL */ 1287 /****************************************************/ 1288 { 1289 /* init qp */ 1290 UWORD8 au1_init_qp[MAX_PIC_TYPE]; 1291 1292 /* min max qp */ 1293 UWORD8 au1_min_max_qp[2 * MAX_PIC_TYPE]; 1294 1295 /* init i,p,b qp */ 1296 au1_init_qp[0] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp]; 1297 au1_init_qp[1] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp]; 1298 au1_init_qp[2] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp]; 1299 1300 /* init min max qp */ 1301 au1_min_max_qp[2 * I_PIC] = 1302 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp_min]; 1303 au1_min_max_qp[2 * I_PIC + 1] = 1304 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp_max]; 1305 1306 au1_min_max_qp[2 * P_PIC] = 1307 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp_min]; 1308 au1_min_max_qp[2 * P_PIC + 1] = 1309 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp_max]; 1310 1311 au1_min_max_qp[2 * B_PIC] = 1312 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp_min]; 1313 au1_min_max_qp[2 * B_PIC + 1] = 1314 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp_max]; 1315 1316 /* get rc mode */ 1317 switch (ps_codec->s_cfg.e_rc_mode) 1318 { 1319 case IVE_RC_STORAGE: 1320 ps_codec->s_rate_control.e_rc_type = VBR_STORAGE; 1321 break; 1322 case IVE_RC_CBR_NON_LOW_DELAY: 1323 ps_codec->s_rate_control.e_rc_type = CBR_NLDRC; 1324 break; 1325 case IVE_RC_CBR_LOW_DELAY: 1326 ps_codec->s_rate_control.e_rc_type = CBR_LDRC; 1327 break; 1328 case IVE_RC_NONE: 1329 ps_codec->s_rate_control.e_rc_type = CONST_QP; 1330 break; 1331 default: 1332 break; 1333 } 1334 1335 /* init rate control */ 1336 ih264e_rc_init(ps_codec->s_rate_control.pps_rate_control_api, 1337 ps_codec->s_rate_control.pps_frame_time, 1338 ps_codec->s_rate_control.pps_time_stamp, 1339 ps_codec->s_rate_control.pps_pd_frm_rate, 1340 ps_codec->s_cfg.u4_max_framerate, 1341 ps_codec->s_cfg.u4_src_frame_rate, 1342 ps_codec->s_cfg.u4_tgt_frame_rate, 1343 ps_codec->s_rate_control.e_rc_type, 1344 ps_codec->s_cfg.u4_target_bitrate, 1345 ps_codec->s_cfg.u4_max_bitrate, 1346 ps_codec->s_cfg.u4_vbv_buffer_delay, 1347 ps_codec->s_cfg.u4_i_frm_interval, 1348 ps_codec->s_cfg.u4_num_bframes + 1, au1_init_qp, 1349 ps_codec->s_cfg.u4_num_bframes + 2 , au1_min_max_qp, 1350 MAX(ps_codec->s_cfg.u4_max_level, 1351 (UWORD32)ih264e_get_min_level(ps_codec->s_cfg.u4_max_wd, ps_codec->s_cfg.u4_max_ht))); 1352 } 1353 1354 /* recon stride */ 1355 ps_codec->i4_rec_strd = ALIGN16(ps_codec->s_cfg.u4_max_wd) + PAD_WD; 1356 1357 /* max ref and reorder cnt */ 1358 ps_codec->i4_ref_buf_cnt = ps_codec->s_cfg.u4_max_ref_cnt 1359 + ps_codec->s_cfg.u4_max_reorder_cnt; 1360 ps_codec->i4_ref_buf_cnt += MAX_CTXT_SETS; 1361 1362 DEBUG_HISTOGRAM_INIT(); 1363 1364 1365 /* Init dependecy vars */ 1366 ps_codec->i4_last_inp_buff_received = 0; 1367 1368 /* At codec start no IDR is pending */ 1369 ps_codec->i4_pending_idr_flag = 0; 1370 1371 return IH264E_SUCCESS; 1372 } 1373 1374 /** 1375 ******************************************************************************* 1376 * 1377 * @brief 1378 * Picture level initializations 1379 * 1380 * @par Description: 1381 * Before beginning to encode the frame, the current function initializes all 1382 * the ctxts (proc, entropy, me, ...) basing on the input configured params. 1383 * It locates space for storing recon in the encoder picture buffer set, fetches 1384 * reference frame from encoder picture buffer set. Calls RC pre-enc to get 1385 * qp and pic type for the current frame. Queues proc jobs so that 1386 * the other threads can begin encoding. In brief, this function sets up the 1387 * tone for the entire encoder. 1388 * 1389 * @param[in] ps_codec 1390 * Pointer to codec context 1391 * 1392 * @param[in] ps_inp_buf 1393 * Pointer to input buffer context 1394 * 1395 * @returns error_status 1396 * 1397 * @remarks 1398 * 1399 * 1400 ******************************************************************************* 1401 */ 1402 IH264E_ERROR_T ih264e_pic_init(codec_t *ps_codec, inp_buf_t *ps_inp_buf) 1403 { 1404 /* error status */ 1405 IH264E_ERROR_T error_status = IH264E_SUCCESS; 1406 IH264_ERROR_T ret = IH264_SUCCESS; 1407 1408 /* mv buff bank */ 1409 mv_buf_t *ps_mv_buf = NULL; 1410 WORD32 cur_mv_bank_buf_id; 1411 1412 /* recon buffer set */ 1413 pic_buf_t *ps_cur_pic; 1414 WORD32 cur_pic_buf_id; 1415 UWORD8 *pu1_cur_pic_luma, *pu1_cur_pic_chroma; 1416 1417 /* ref buffer set */ 1418 pic_buf_t *aps_ref_pic[MAX_REF_PIC_CNT] = {NULL, NULL}; 1419 mv_buf_t *aps_mv_buf[MAX_REF_PIC_CNT] = {NULL, NULL}; 1420 WORD32 ref_set_id; 1421 1422 /* pic time stamp */ 1423 UWORD32 u4_timestamp_high = ps_inp_buf->u4_timestamp_high; 1424 UWORD32 u4_timestamp_low = ps_inp_buf->u4_timestamp_low; 1425 1426 /* indices to access curr/prev frame info */ 1427 WORD32 ctxt_sel = ps_codec->i4_encode_api_call_cnt % MAX_CTXT_SETS; 1428 1429 /* curr pic type */ 1430 PIC_TYPE_T *pic_type = &ps_codec->pic_type; 1431 1432 /* Diamond search Iteration Max Cnt */ 1433 UWORD32 u4_num_layers = 1434 (ps_codec->s_cfg.u4_enc_speed_preset == IVE_FASTEST) ? 1435 (NUM_LAYERS >> 2) : NUM_LAYERS; 1436 1437 /* enable fast sad */ 1438 UWORD32 u4_enable_fast_sad = ps_codec->s_cfg.u4_enable_fast_sad; 1439 1440 /********************************************************************/ 1441 /* INITIALIZE CODEC CONTEXT */ 1442 /********************************************************************/ 1443 /* slice_type */ 1444 if ((PIC_I == *pic_type) || (PIC_IDR == *pic_type)) 1445 { 1446 ps_codec->i4_slice_type = ISLICE; 1447 } 1448 else if (PIC_P == *pic_type) 1449 { 1450 ps_codec->i4_slice_type = PSLICE; 1451 } 1452 else if(PIC_B == *pic_type) 1453 { 1454 ps_codec->i4_slice_type = BSLICE; 1455 } 1456 1457 1458 /*************************************************************************** 1459 * Set up variables for sending frame number, poc and reference 1460 * a) Set up alt ref too 1461 **************************************************************************/ 1462 1463 /* Check and set if the current frame is reference or not */ 1464 ps_codec->u4_is_curr_frm_ref = 0; 1465 1466 /* This frame is reference if its not a B pic, pending approval from alt ref */ 1467 ps_codec->u4_is_curr_frm_ref = (*pic_type != PIC_B); 1468 1469 /* In case if its a P pic, we will decide according to alt ref also */ 1470 if (ps_codec->s_cfg.u4_enable_alt_ref && (*pic_type == PIC_P) 1471 && (ps_codec->i4_pic_cnt 1472 % (ps_codec->s_cfg.u4_enable_alt_ref + 1))) 1473 { 1474 ps_codec->u4_is_curr_frm_ref = 0; 1475 } 1476 1477 /* 1478 * Override everything in case of IDR 1479 * Note that in case of IDR, at this point ps_codec->u4_is_curr_frm_ref must 1480 * be 1 1481 */ 1482 1483 /* is this an IDR pic */ 1484 ps_codec->u4_is_idr = 0; 1485 1486 if (PIC_IDR == *pic_type) 1487 { 1488 /* set idr flag */ 1489 ps_codec->u4_is_idr = 1; 1490 1491 /* reset frame num */ 1492 ps_codec->i4_frame_num = 0; 1493 1494 /* idr_pic_id */ 1495 ps_codec->i4_idr_pic_id++; 1496 } 1497 1498 /*************************************************************************** 1499 * Set up Deblock 1500 **************************************************************************/ 1501 1502 /* set deblock disable flags based on disable deblock level */ 1503 ps_codec->i4_disable_deblk_pic = 1; 1504 1505 if (ps_codec->s_cfg.u4_disable_deblock_level == DISABLE_DEBLK_LEVEL_0) 1506 { 1507 /* enable deblocking */ 1508 ps_codec->i4_disable_deblk_pic = 0; 1509 } 1510 else if (ps_codec->s_cfg.u4_disable_deblock_level == DISABLE_DEBLK_LEVEL_2) 1511 { 1512 /* enable deblocking after a period of frames */ 1513 if (ps_codec->i4_disable_deblk_pic_cnt == DISABLE_DEBLOCK_INTERVAL 1514 || ps_codec->i4_slice_type == ISLICE) 1515 { 1516 ps_codec->i4_disable_deblk_pic = 0; 1517 } 1518 } 1519 else if (ps_codec->s_cfg.u4_disable_deblock_level == DISABLE_DEBLK_LEVEL_3) 1520 { 1521 if (ps_codec->i4_slice_type == ISLICE) 1522 { 1523 ps_codec->i4_disable_deblk_pic = 0; 1524 } 1525 } 1526 1527 if (ps_codec->i4_disable_deblk_pic) 1528 { 1529 ps_codec->i4_disable_deblk_pic_cnt++; 1530 } 1531 else 1532 { 1533 ps_codec->i4_disable_deblk_pic_cnt = 0; 1534 } 1535 1536 /* In slice mode - lets not deblk mb edges that lie along slice boundaries */ 1537 if (ps_codec->i4_disable_deblk_pic == 0) 1538 { 1539 if (ps_codec->s_cfg.e_slice_mode != IVE_SLICE_MODE_NONE) 1540 { 1541 ps_codec->i4_disable_deblk_pic = 2; 1542 } 1543 } 1544 1545 /* error status */ 1546 ps_codec->i4_error_code = IH264E_SUCCESS; 1547 1548 /* populate header */ 1549 if (ps_codec->i4_gen_header) 1550 { 1551 /* sps */ 1552 sps_t *ps_sps = NULL; 1553 1554 /* pps */ 1555 pps_t *ps_pps = NULL; 1556 1557 /*ps_codec->i4_pps_id ++;*/ 1558 ps_codec->i4_pps_id %= MAX_PPS_CNT; 1559 1560 /*ps_codec->i4_sps_id ++;*/ 1561 ps_codec->i4_sps_id %= MAX_SPS_CNT; 1562 1563 /* populate sps header */ 1564 ps_sps = ps_codec->ps_sps_base + ps_codec->i4_sps_id; 1565 ih264e_populate_sps(ps_codec, ps_sps); 1566 1567 /* populate pps header */ 1568 ps_pps = ps_codec->ps_pps_base + ps_codec->i4_pps_id; 1569 ih264e_populate_pps(ps_codec, ps_pps); 1570 } 1571 1572 /*************************************************************************** 1573 * Reference and MV bank Buffer Manager 1574 * Here we will 1575 * 1) Find the correct ref pics for the current frame 1576 * 2) Free the ref pic that is not going to be used anywhere 1577 * 3) Find a free buff from the list and assign it as the recon of 1578 * current frame 1579 * 1580 * 1) Finding correct ref pic 1581 * All pics needed for future are arranged in a picture list called 1582 * ps_codec->as_ref_set. Each picture in this will have a pic buffer and 1583 * MV buffer that is marked appropriately as BUF_MGR_REF, BUF_MGR_IO or 1584 * BUF_MGR_CODEC. Also the pic_cnt and poc will also be present. 1585 * Hence to find the ref pic we will loop through the list and find 1586 * 2 pictures with maximum i4_pic_cnt . 1587 * 1588 * note that i4_pic_cnt == -1 is used to filter uninit ref pics. 1589 * Now since we only have max two ref pics, we will always find max 2 1590 * ref pics. 1591 1592 * 1593 * 2) 3) Self explanatory 1594 ***************************************************************************/ 1595 { 1596 /* Search for buffs with maximum pic cnt */ 1597 1598 WORD32 max_pic_cnt[] = { -1, -1 }; 1599 1600 mv_buf_t *ps_mv_buf_to_free[] = { NULL, NULL }; 1601 1602 /* temp var */ 1603 WORD32 i, buf_status; 1604 1605 for (i = 0; i < ps_codec->i4_ref_buf_cnt; i++) 1606 { 1607 if (ps_codec->as_ref_set[i].i4_pic_cnt == -1) 1608 continue; 1609 1610 buf_status = ih264_buf_mgr_get_status( 1611 ps_codec->pv_ref_buf_mgr, 1612 ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id); 1613 1614 /* Ideally we should look for buffer status of MV BUFF also. But since 1615 * the correponding MV buffs also will be at the same state. It dosent 1616 * matter as of now. But the check will make the logic better */ 1617 if ((max_pic_cnt[0] < ps_codec->as_ref_set[i].i4_pic_cnt) 1618 && (buf_status & BUF_MGR_REF)) 1619 { 1620 if (max_pic_cnt[1] < ps_codec->as_ref_set[i].i4_pic_cnt) 1621 { 1622 max_pic_cnt[0] = max_pic_cnt[1]; 1623 aps_ref_pic[0] = aps_ref_pic[1]; 1624 aps_mv_buf[0] = aps_mv_buf[1]; 1625 1626 ps_mv_buf_to_free[0] = ps_mv_buf_to_free[1]; 1627 1628 max_pic_cnt[1] = ps_codec->as_ref_set[i].i4_pic_cnt; 1629 aps_ref_pic[1] = ps_codec->as_ref_set[i].ps_pic_buf; 1630 aps_mv_buf[1] = ps_codec->as_ref_set[i].ps_mv_buf; 1631 ps_mv_buf_to_free[1] = ps_codec->as_ref_set[i].ps_mv_buf; 1632 1633 } 1634 else 1635 { 1636 max_pic_cnt[0] = ps_codec->as_ref_set[i].i4_pic_cnt; 1637 aps_ref_pic[0] = ps_codec->as_ref_set[i].ps_pic_buf; 1638 aps_mv_buf[0] = ps_codec->as_ref_set[i].ps_mv_buf; 1639 ps_mv_buf_to_free[0] = ps_codec->as_ref_set[i].ps_mv_buf; 1640 } 1641 } 1642 } 1643 1644 /* 1645 * Now if the current picture is I or P, we discard the back ref pic and 1646 * assign forward ref as backward ref 1647 */ 1648 if (*pic_type != PIC_B) 1649 { 1650 if (ps_mv_buf_to_free[0]) 1651 { 1652 /* release this frame from reference list */ 1653 ih264_buf_mgr_release(ps_codec->pv_mv_buf_mgr, 1654 ps_mv_buf_to_free[0]->i4_buf_id, 1655 BUF_MGR_REF); 1656 1657 ih264_buf_mgr_release(ps_codec->pv_ref_buf_mgr, 1658 aps_ref_pic[0]->i4_buf_id, BUF_MGR_REF); 1659 } 1660 1661 max_pic_cnt[0] = max_pic_cnt[1]; 1662 aps_ref_pic[0] = aps_ref_pic[1]; 1663 aps_mv_buf[0] = aps_mv_buf[1]; 1664 1665 /* Dummy */ 1666 max_pic_cnt[1] = -1; 1667 } 1668 1669 /* 1670 * Mark all reference pic with unused buffers to be free 1671 * We need this step since each one, ie ref, recon io etc only unset their 1672 * respective flags. Hence we need to combine togather and mark the ref set 1673 * accordingly 1674 */ 1675 ref_set_id = -1; 1676 for (i = 0; i < ps_codec->i4_ref_buf_cnt; i++) 1677 { 1678 if (ps_codec->as_ref_set[i].i4_pic_cnt == -1) 1679 { 1680 ref_set_id = i; 1681 continue; 1682 } 1683 1684 buf_status = ih264_buf_mgr_get_status( 1685 ps_codec->pv_ref_buf_mgr, 1686 ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id); 1687 1688 if ((buf_status & (BUF_MGR_REF | BUF_MGR_CODEC | BUF_MGR_IO)) == 0) 1689 { 1690 ps_codec->as_ref_set[i].i4_pic_cnt = -1; 1691 ps_codec->as_ref_set[i].i4_poc = 32768; 1692 1693 ref_set_id = i; 1694 } 1695 } 1696 /* An asssert failure here means we donot have any free buffs */ 1697 ASSERT(ref_set_id >= 0); 1698 } 1699 1700 { 1701 /*****************************************************************/ 1702 /* Get free MV Bank to hold current picture's motion vector data */ 1703 /* If there are no free buffers then return with an error code. */ 1704 /* If the buffer is to be freed by another thread, change the */ 1705 /* following to call thread yield and wait for buffer to be freed*/ 1706 /*****************************************************************/ 1707 ps_mv_buf = (mv_buf_t *) ih264_buf_mgr_get_next_free( 1708 (buf_mgr_t *) ps_codec->pv_mv_buf_mgr, 1709 &cur_mv_bank_buf_id); 1710 1711 if (NULL == ps_mv_buf) 1712 { 1713 ps_codec->i4_error_code = IH264E_NO_FREE_MVBANK; 1714 return IH264E_NO_FREE_MVBANK; 1715 } 1716 1717 /* mark the buffer as needed for reference if the curr pic is available for ref */ 1718 if (ps_codec->u4_is_curr_frm_ref) 1719 { 1720 ih264_buf_mgr_set_status(ps_codec->pv_mv_buf_mgr, 1721 cur_mv_bank_buf_id, BUF_MGR_REF); 1722 } 1723 1724 /* Set current ABS poc to ps_mv_buf, so that while freeing a reference buffer 1725 * corresponding mv buffer can be found by looping through ps_codec->ps_mv_buf array 1726 * and getting a buffer id to free 1727 */ 1728 ps_mv_buf->i4_abs_poc = ps_codec->i4_abs_pic_order_cnt; 1729 ps_mv_buf->i4_buf_id = cur_mv_bank_buf_id; 1730 } 1731 1732 { 1733 /*****************************************************************/ 1734 /* Get free pic buf to hold current picture's recon data */ 1735 /* If there are no free buffers then return with an error code. */ 1736 /* If the buffer is to be freed by another thread, change the */ 1737 /* following to call thread yield and wait for buffer to be freed*/ 1738 /*****************************************************************/ 1739 ps_cur_pic = (pic_buf_t *) ih264_buf_mgr_get_next_free( 1740 (buf_mgr_t *) ps_codec->pv_ref_buf_mgr, 1741 &cur_pic_buf_id); 1742 1743 if (NULL == ps_cur_pic) 1744 { 1745 ps_codec->i4_error_code = IH264E_NO_FREE_PICBUF; 1746 return IH264E_NO_FREE_PICBUF; 1747 } 1748 1749 /* mark the buffer as needed for reference if the curr pic is available for ref */ 1750 if (ps_codec->u4_is_curr_frm_ref) 1751 { 1752 ih264_buf_mgr_set_status(ps_codec->pv_ref_buf_mgr, cur_pic_buf_id, 1753 BUF_MGR_REF); 1754 } 1755 1756 /* Mark the current buffer as needed for IO if recon is enabled */ 1757 if (1 == ps_codec->s_cfg.u4_enable_recon) 1758 { 1759 ih264_buf_mgr_set_status(ps_codec->pv_ref_buf_mgr, cur_pic_buf_id, 1760 BUF_MGR_IO); 1761 } 1762 1763 /* Associate input timestamp with current buffer */ 1764 ps_cur_pic->u4_timestamp_high = ps_inp_buf->u4_timestamp_high; 1765 ps_cur_pic->u4_timestamp_low = ps_inp_buf->u4_timestamp_low; 1766 1767 ps_cur_pic->i4_abs_poc = ps_codec->i4_poc; 1768 ps_cur_pic->i4_poc_lsb = ps_codec->i4_pic_order_cnt_lsb; 1769 1770 ps_cur_pic->i4_buf_id = cur_pic_buf_id; 1771 1772 pu1_cur_pic_luma = ps_cur_pic->pu1_luma; 1773 pu1_cur_pic_chroma = ps_cur_pic->pu1_chroma; 1774 } 1775 1776 /* 1777 * Add the current picture to ref list independent of the fact that it is used 1778 * as reference or not. This is because, now recon is not in sync with output 1779 * hence we may need the current recon after some delay. By adding it to ref list 1780 * we can retrieve the recon any time we want. The information that it is used 1781 * for ref can still be found by checking the buffer status of pic buf. 1782 */ 1783 { 1784 ps_codec->as_ref_set[ref_set_id].i4_pic_cnt = ps_codec->i4_pic_cnt; 1785 ps_codec->as_ref_set[ref_set_id].i4_poc = ps_codec->i4_poc; 1786 ps_codec->as_ref_set[ref_set_id].ps_mv_buf = ps_mv_buf; 1787 ps_codec->as_ref_set[ref_set_id].ps_pic_buf = ps_cur_pic; 1788 } 1789 1790 /********************************************************************/ 1791 /* INITIALIZE PROCESS CONTEXT */ 1792 /********************************************************************/ 1793 { 1794 /* temp var */ 1795 WORD32 i, j = 0; 1796 1797 /* curr proc ctxt */ 1798 process_ctxt_t *ps_proc = NULL; 1799 1800 j = ctxt_sel * MAX_PROCESS_THREADS; 1801 1802 /* begin init */ 1803 for (i = j; i < (j + MAX_PROCESS_THREADS); i++) 1804 { 1805 ps_proc = &ps_codec->as_process[i]; 1806 1807 /* luma src buffer */ 1808 if (ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_422ILE) 1809 { 1810 ps_proc->pu1_src_buf_luma_base = ps_codec->pu1_y_csc_buf_base; 1811 } 1812 else 1813 { 1814 ps_proc->pu1_src_buf_luma_base = 1815 ps_inp_buf->s_raw_buf.apv_bufs[0]; 1816 } 1817 1818 /* chroma src buffer */ 1819 if (ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_422ILE 1820 || ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_420P) 1821 { 1822 ps_proc->pu1_src_buf_chroma_base = 1823 ps_codec->pu1_uv_csc_buf_base; 1824 } 1825 else 1826 { 1827 ps_proc->pu1_src_buf_chroma_base = 1828 ps_inp_buf->s_raw_buf.apv_bufs[1]; 1829 } 1830 1831 /* luma rec buffer */ 1832 ps_proc->pu1_rec_buf_luma_base = pu1_cur_pic_luma; 1833 1834 /* chroma rec buffer */ 1835 ps_proc->pu1_rec_buf_chroma_base = pu1_cur_pic_chroma; 1836 1837 /* rec stride */ 1838 ps_proc->i4_rec_strd = ps_codec->i4_rec_strd; 1839 1840 /* frame num */ 1841 ps_proc->i4_frame_num = ps_codec->i4_frame_num; 1842 1843 /* is idr */ 1844 ps_proc->u4_is_idr = ps_codec->u4_is_idr; 1845 1846 /* idr pic id */ 1847 ps_proc->u4_idr_pic_id = ps_codec->i4_idr_pic_id; 1848 1849 /* slice_type */ 1850 ps_proc->i4_slice_type = ps_codec->i4_slice_type; 1851 1852 /* Input width in mbs */ 1853 ps_proc->i4_wd_mbs = ps_codec->s_cfg.i4_wd_mbs; 1854 1855 /* Input height in mbs */ 1856 ps_proc->i4_ht_mbs = ps_codec->s_cfg.i4_ht_mbs; 1857 1858 /* Half x plane offset from pic buf */ 1859 ps_proc->u4_half_x_offset = 0; 1860 1861 /* Half y plane offset from half x plane */ 1862 ps_proc->u4_half_y_offset = 0; 1863 1864 /* Half x plane offset from half y plane */ 1865 ps_proc->u4_half_xy_offset = 0; 1866 1867 /* top row syntax elements */ 1868 ps_proc->ps_top_row_mb_syntax_ele = 1869 ps_proc->ps_top_row_mb_syntax_ele_base; 1870 1871 ps_proc->pu1_top_mb_intra_modes = 1872 ps_proc->pu1_top_mb_intra_modes_base; 1873 1874 ps_proc->ps_top_row_pu = ps_proc->ps_top_row_pu_base; 1875 1876 /* initialize quant params */ 1877 ps_proc->u4_frame_qp = ps_codec->u4_frame_qp; 1878 ps_proc->u4_mb_qp = ps_codec->u4_frame_qp; 1879 ih264e_init_quant_params(ps_proc, ps_proc->u4_frame_qp); 1880 1881 /* previous mb qp*/ 1882 ps_proc->u4_mb_qp_prev = ps_proc->u4_frame_qp; 1883 1884 /* Reset frame info */ 1885 memset(&ps_proc->s_frame_info, 0, sizeof(frame_info_t)); 1886 1887 /* initialize proc, deblk and ME map */ 1888 if (i == j) 1889 { 1890 /* row '-1' */ 1891 memset(ps_proc->pu1_proc_map - ps_proc->i4_wd_mbs, 1, ps_proc->i4_wd_mbs); 1892 /* row 0 to ht in mbs */ 1893 memset(ps_proc->pu1_proc_map, 0, ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs); 1894 1895 /* row '-1' */ 1896 memset(ps_proc->pu1_deblk_map - ps_proc->i4_wd_mbs, 1, ps_proc->i4_wd_mbs); 1897 /* row 0 to ht in mbs */ 1898 memset(ps_proc->pu1_deblk_map, 0, ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs); 1899 1900 /* row '-1' */ 1901 memset(ps_proc->pu1_me_map - ps_proc->i4_wd_mbs, 1, ps_proc->i4_wd_mbs); 1902 /* row 0 to ht in mbs */ 1903 memset(ps_proc->pu1_me_map, 0, ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs); 1904 1905 /* at the start of air refresh period, reset intra coded map */ 1906 if (IVE_AIR_MODE_NONE != ps_codec->s_cfg.e_air_mode) 1907 { 1908 ps_codec->i4_air_pic_cnt = (ps_codec->i4_air_pic_cnt + 1) 1909 % ps_codec->s_cfg.u4_air_refresh_period; 1910 1911 if (!ps_codec->i4_air_pic_cnt) 1912 { 1913 memset(ps_proc->pu1_is_intra_coded, 0, ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs); 1914 } 1915 } 1916 } 1917 1918 /* deblock level */ 1919 ps_proc->u4_disable_deblock_level = ps_codec->i4_disable_deblk_pic; 1920 1921 /* slice index map */ 1922 /* no slice */ 1923 if (ps_codec->s_cfg.e_slice_mode == IVE_SLICE_MODE_NONE) 1924 { 1925 memset(ps_proc->pu1_slice_idx, 0, ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs); 1926 } 1927 /* generate slices for every 'n' rows, 'n' is given through slice param */ 1928 else if (ps_codec->s_cfg.e_slice_mode == IVE_SLICE_MODE_BLOCKS) 1929 { 1930 /* slice idx map */ 1931 UWORD8 *pu1_slice_idx = ps_proc->pu1_slice_idx; 1932 1933 /* temp var */ 1934 WORD32 i4_mb_y = 0, slice_idx = 0, cnt; 1935 1936 while (i4_mb_y < ps_proc->i4_ht_mbs) 1937 { 1938 if (i4_mb_y +(WORD32)ps_codec->s_cfg.u4_slice_param < ps_proc->i4_ht_mbs) 1939 { 1940 cnt = ps_codec->s_cfg.u4_slice_param * ps_proc->i4_wd_mbs; 1941 i4_mb_y += ps_codec->s_cfg.u4_slice_param; 1942 } 1943 else 1944 { 1945 cnt = (ps_proc->i4_ht_mbs - i4_mb_y) * ps_proc->i4_wd_mbs; 1946 i4_mb_y += (ps_proc->i4_ht_mbs - i4_mb_y); 1947 } 1948 memset(pu1_slice_idx, slice_idx, cnt); 1949 slice_idx++; 1950 pu1_slice_idx += cnt; 1951 } 1952 } 1953 1954 /* Current MV Bank's buffer ID */ 1955 ps_proc->i4_cur_mv_bank_buf_id = cur_mv_bank_buf_id; 1956 1957 /* Pointer to current picture buffer structure */ 1958 ps_proc->ps_cur_pic = ps_cur_pic; 1959 1960 /* Pointer to current pictures mv buffers */ 1961 ps_proc->ps_cur_mv_buf = ps_mv_buf; 1962 1963 /* 1964 * pointer to ref picture 1965 * 0 : Temporal back reference 1966 * 1 : Temporal forward reference 1967 */ 1968 ps_proc->aps_ref_pic[PRED_L0] = aps_ref_pic[PRED_L0]; 1969 ps_proc->aps_ref_pic[PRED_L1] = aps_ref_pic[PRED_L1]; 1970 if (ps_codec->pic_type == PIC_B) 1971 { 1972 ps_proc->aps_mv_buf[PRED_L0] = aps_mv_buf[PRED_L0]; 1973 ps_proc->aps_mv_buf[PRED_L1] = aps_mv_buf[PRED_L1]; 1974 } 1975 else 1976 { 1977 /* 1978 * Else is dummy since for non B pic we does not need this 1979 * But an assignment here will help in not having a segfault 1980 * when we calcualte colpic in P slices 1981 */ 1982 ps_proc->aps_mv_buf[PRED_L0] = ps_mv_buf; 1983 ps_proc->aps_mv_buf[PRED_L1] = ps_mv_buf; 1984 } 1985 1986 if ((*pic_type != PIC_IDR) && (*pic_type != PIC_I)) 1987 { 1988 /* temporal back an forward ref pointer luma and chroma */ 1989 ps_proc->apu1_ref_buf_luma_base[PRED_L0] = aps_ref_pic[PRED_L0]->pu1_luma; 1990 ps_proc->apu1_ref_buf_chroma_base[PRED_L0] = aps_ref_pic[PRED_L0]->pu1_chroma; 1991 1992 ps_proc->apu1_ref_buf_luma_base[PRED_L1] = aps_ref_pic[PRED_L1]->pu1_luma; 1993 ps_proc->apu1_ref_buf_chroma_base[PRED_L1] = aps_ref_pic[PRED_L1]->pu1_chroma; 1994 } 1995 1996 /* Structure for current input buffer */ 1997 ps_proc->s_inp_buf = *ps_inp_buf; 1998 1999 /* Number of encode frame API calls made */ 2000 ps_proc->i4_encode_api_call_cnt = ps_codec->i4_encode_api_call_cnt; 2001 2002 /* Current Picture count */ 2003 ps_proc->i4_pic_cnt = ps_codec->i4_pic_cnt; 2004 2005 /* error status */ 2006 ps_proc->i4_error_code = 0; 2007 2008 /********************************************************************/ 2009 /* INITIALIZE ENTROPY CONTEXT */ 2010 /********************************************************************/ 2011 { 2012 entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy; 2013 2014 /* start of frame */ 2015 ps_entropy->i4_sof = 0; 2016 2017 /* end of frame */ 2018 ps_entropy->i4_eof = 0; 2019 2020 /* generate header */ 2021 ps_entropy->i4_gen_header = ps_codec->i4_gen_header; 2022 2023 /* sps ref_set_id */ 2024 ps_entropy->u4_sps_id = ps_codec->i4_sps_id; 2025 2026 /* sps base */ 2027 ps_entropy->ps_sps_base = ps_codec->ps_sps_base; 2028 2029 /* sps id */ 2030 ps_entropy->u4_pps_id = ps_codec->i4_pps_id; 2031 2032 /* sps base */ 2033 ps_entropy->ps_pps_base = ps_codec->ps_pps_base; 2034 2035 /* slice map */ 2036 ps_entropy->pu1_slice_idx = ps_proc->pu1_slice_idx; 2037 2038 /* slice hdr base */ 2039 ps_entropy->ps_slice_hdr_base = ps_proc->ps_slice_hdr_base; 2040 2041 /* Abs poc */ 2042 ps_entropy->i4_abs_pic_order_cnt = ps_proc->ps_codec->i4_poc; 2043 2044 /* initialize entropy map */ 2045 if (i == j) 2046 { 2047 /* row '-1' */ 2048 memset(ps_entropy->pu1_entropy_map - ps_proc->i4_wd_mbs, 1, ps_proc->i4_wd_mbs); 2049 /* row 0 to ht in mbs */ 2050 memset(ps_entropy->pu1_entropy_map, 0, ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs); 2051 2052 /* intialize cabac tables */ 2053 ih264e_init_cabac_table(ps_entropy); 2054 } 2055 2056 /* wd in mbs */ 2057 ps_entropy->i4_wd_mbs = ps_proc->i4_wd_mbs; 2058 2059 /* ht in mbs */ 2060 ps_entropy->i4_ht_mbs = ps_proc->i4_ht_mbs; 2061 2062 /* transform_8x8_mode_flag */ 2063 ps_entropy->i1_transform_8x8_mode_flag = 0; 2064 2065 /* entropy_coding_mode_flag */ 2066 ps_entropy->u1_entropy_coding_mode_flag = 2067 ps_codec->s_cfg.u4_entropy_coding_mode; 2068 2069 /* error code */ 2070 ps_entropy->i4_error_code = IH264E_SUCCESS; 2071 2072 /* mb skip run */ 2073 *(ps_proc->s_entropy.pi4_mb_skip_run) = 0; 2074 2075 /* last frame to encode */ 2076 ps_proc->s_entropy.u4_is_last = ps_inp_buf->u4_is_last; 2077 2078 /* Current Picture count */ 2079 ps_proc->s_entropy.i4_pic_cnt = ps_codec->i4_pic_cnt; 2080 2081 /* time stamps */ 2082 ps_entropy->u4_timestamp_low = u4_timestamp_low; 2083 ps_entropy->u4_timestamp_high = u4_timestamp_high; 2084 2085 /* init frame statistics */ 2086 ps_entropy->u4_header_bits[MB_TYPE_INTRA] = 0; 2087 ps_entropy->u4_header_bits[MB_TYPE_INTER] = 0; 2088 ps_entropy->u4_residue_bits[MB_TYPE_INTRA] = 0; 2089 ps_entropy->u4_residue_bits[MB_TYPE_INTER] = 0; 2090 } 2091 2092 /********************************************************************/ 2093 /* INITIALIZE DEBLOCK CONTEXT */ 2094 /********************************************************************/ 2095 { 2096 /* deblk ctxt */ 2097 deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt; 2098 2099 /* slice idx map */ 2100 ps_deblk->pu1_slice_idx = ps_proc->pu1_slice_idx; 2101 } 2102 2103 /********************************************************************/ 2104 /* INITIALIZE ME CONTEXT */ 2105 /********************************************************************/ 2106 { 2107 /* me ctxt */ 2108 me_ctxt_t *ps_me_ctxt = &ps_proc->s_me_ctxt; 2109 2110 /* srch range x */ 2111 ps_me_ctxt->ai2_srch_boundaries[0] = 2112 ps_codec->s_cfg.u4_srch_rng_x; 2113 2114 /* srch range y */ 2115 ps_me_ctxt->ai2_srch_boundaries[1] = 2116 ps_codec->s_cfg.u4_srch_rng_y; 2117 2118 /* rec stride */ 2119 ps_me_ctxt->i4_rec_strd = ps_codec->i4_rec_strd; 2120 2121 /* Half x plane offset from pic buf */ 2122 ps_me_ctxt->u4_half_x_offset = ps_proc->u4_half_x_offset; 2123 2124 /* Half y plane offset from half x plane */ 2125 ps_me_ctxt->u4_half_y_offset = ps_proc->u4_half_y_offset; 2126 2127 /* Half x plane offset from half y plane */ 2128 ps_me_ctxt->u4_half_xy_offset = ps_proc->u4_half_xy_offset; 2129 2130 /* enable fast sad */ 2131 ps_me_ctxt->u4_enable_fast_sad = u4_enable_fast_sad; 2132 2133 /* half pel */ 2134 ps_me_ctxt->u4_enable_hpel = ps_codec->s_cfg.u4_enable_hpel; 2135 2136 /* Diamond search Iteration Max Cnt */ 2137 ps_me_ctxt->u4_num_layers = u4_num_layers; 2138 2139 /* me speed preset */ 2140 ps_me_ctxt->u4_me_speed_preset = 2141 ps_codec->s_cfg.u4_me_speed_preset; 2142 2143 /* qp */ 2144 ps_me_ctxt->u1_mb_qp = ps_codec->u4_frame_qp; 2145 2146 if ((i == j) && (0 == ps_codec->i4_poc)) 2147 { 2148 /* init mv bits tables */ 2149 ih264e_init_mv_bits(ps_me_ctxt); 2150 } 2151 } 2152 2153 ps_proc->ps_ngbr_avbl = &(ps_proc->s_ngbr_avbl); 2154 2155 } 2156 2157 /* reset encoder header */ 2158 ps_codec->i4_gen_header = 0; 2159 } 2160 2161 /********************************************************************/ 2162 /* ADD JOBS TO THE QUEUE */ 2163 /********************************************************************/ 2164 { 2165 /* job structures */ 2166 job_t s_job; 2167 2168 /* temp var */ 2169 WORD32 i; 2170 2171 /* job class */ 2172 s_job.i4_cmd = CMD_PROCESS; 2173 2174 /* number of mbs to be processed in the current job */ 2175 s_job.i2_mb_cnt = ps_codec->s_cfg.i4_wd_mbs; 2176 2177 /* job start index x */ 2178 s_job.i2_mb_x = 0; 2179 2180 /* proc base idx */ 2181 s_job.i2_proc_base_idx = ctxt_sel ? (MAX_PROCESS_CTXT / 2) : 0; 2182 2183 for (i = 0; i < (WORD32)ps_codec->s_cfg.i4_ht_mbs; i++) 2184 { 2185 /* job start index y */ 2186 s_job.i2_mb_y = i; 2187 2188 /* queue the job */ 2189 ret = ih264_list_queue(ps_codec->pv_proc_jobq, &s_job, 1); 2190 if (ret != IH264_SUCCESS) 2191 { 2192 ps_codec->i4_error_code = ret; 2193 return IH264E_FAIL; 2194 } 2195 } 2196 2197 /* Once all the jobs are queued, terminate the queue */ 2198 /* Since the threads are created and deleted in each call, terminating 2199 here is not an issue */ 2200 ih264_list_terminate(ps_codec->pv_proc_jobq); 2201 } 2202 2203 return error_status; 2204 } 2205