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 /* File Name : decoder_api_main.c */ 23 /* */ 24 /* Description : Functions which recieve the API call from user */ 25 /* */ 26 /* List of Functions : <List the functions defined in this file> */ 27 /* */ 28 /* Issues / Problems : None */ 29 /* */ 30 /* Revision History : */ 31 /* */ 32 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 33 /* 30 05 2007 Rajneesh Creation */ 34 /* */ 35 /*****************************************************************************/ 36 37 /*****************************************************************************/ 38 /* File Includes */ 39 /*****************************************************************************/ 40 41 /* System include files */ 42 #include <stdio.h> 43 #include <stdlib.h> 44 #include <stddef.h> 45 #include <string.h> 46 47 /* User include files */ 48 #include "iv_datatypedef.h" 49 #include "iv.h" 50 #include "ivd.h" 51 #include "ithread.h" 52 53 #include "impeg2_job_queue.h" 54 #include "impeg2_macros.h" 55 #include "impeg2_buf_mgr.h" 56 #include "impeg2_disp_mgr.h" 57 #include "impeg2_defs.h" 58 #include "impeg2_platform_macros.h" 59 #include "impeg2_inter_pred.h" 60 #include "impeg2_idct.h" 61 #include "impeg2_format_conv.h" 62 #include "impeg2_mem_func.h" 63 64 #include "impeg2d.h" 65 #include "impeg2d_api.h" 66 #include "impeg2d_bitstream.h" 67 #include "impeg2d_debug.h" 68 #include "impeg2d_structs.h" 69 #include "impeg2d_mc.h" 70 #include "impeg2d_pic_proc.h" 71 #include "impeg2d_deinterlace.h" 72 73 #define NUM_FRAMES_LIMIT_ENABLED 0 74 75 #ifdef LOGO_EN 76 #include "impeg2_ittiam_logo.h" 77 #define INSERT_LOGO(buf_y, buf_u, buf_v, stride, x_pos, y_pos, yuv_fmt,disp_wd,disp_ht) impeg2_insert_logo(buf_y, buf_u, buf_v, stride, x_pos, y_pos, yuv_fmt,disp_wd,disp_ht); 78 #else 79 #define INSERT_LOGO(buf_y, buf_u, buf_v, stride, x_pos, y_pos, yuv_fmt,disp_wd,disp_ht) 80 #endif 81 82 #if NUM_FRAMES_LIMIT_ENABLED 83 #define NUM_FRAMES_LIMIT 10000 84 #else 85 #define NUM_FRAMES_LIMIT 0x7FFFFFFF 86 #endif 87 88 #define CODEC_NAME "MPEG2VDEC" 89 #define CODEC_RELEASE_TYPE "eval" 90 #define CODEC_RELEASE_VER "01.00" 91 #define CODEC_VENDOR "ITTIAM" 92 93 #ifdef __ANDROID__ 94 #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor) \ 95 strcpy(version_string,"@(#)Id:"); \ 96 strcat(version_string,codec_name); \ 97 strcat(version_string,"_"); \ 98 strcat(version_string,codec_release_type); \ 99 strcat(version_string," Ver:"); \ 100 strcat(version_string,codec_release_ver); \ 101 strcat(version_string," Released by "); \ 102 strcat(version_string,codec_vendor); 103 #else 104 #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor) \ 105 strcpy(version_string,"@(#)Id:"); \ 106 strcat(version_string,codec_name); \ 107 strcat(version_string,"_"); \ 108 strcat(version_string,codec_release_type); \ 109 strcat(version_string," Ver:"); \ 110 strcat(version_string,codec_release_ver); \ 111 strcat(version_string," Released by "); \ 112 strcat(version_string,codec_vendor); \ 113 strcat(version_string," Build: "); \ 114 strcat(version_string,__DATE__); \ 115 strcat(version_string," @ "); \ 116 strcat(version_string,__TIME__); 117 #endif 118 119 120 #define MIN_OUT_BUFS_420 3 121 #define MIN_OUT_BUFS_422ILE 1 122 #define MIN_OUT_BUFS_RGB565 1 123 #define MIN_OUT_BUFS_420SP 2 124 125 126 void impeg2d_init_arch(void *pv_codec); 127 void impeg2d_init_function_ptr(void *pv_codec); 128 129 /*****************************************************************************/ 130 /* */ 131 /* Function Name : impeg2d_api_rel_display_frame */ 132 /* */ 133 /* Description : Release displ buffers that will be shared between decoder */ 134 /* and application */ 135 /* Inputs : Error message */ 136 /* Globals : None */ 137 /* Processing : Just prints error message to console */ 138 /* Outputs : Error mesage to the console */ 139 /* Returns : None */ 140 /* */ 141 /* Issues : <List any issues or problems with this function> */ 142 /* */ 143 /* Revision History: */ 144 /* */ 145 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 146 /* 27 05 2006 Sankar Creation */ 147 /* */ 148 /*****************************************************************************/ 149 IV_API_CALL_STATUS_T impeg2d_api_rel_display_frame(iv_obj_t *ps_dechdl, 150 void *pv_api_ip, 151 void *pv_api_op) 152 { 153 154 ivd_rel_display_frame_ip_t *dec_rel_disp_ip; 155 ivd_rel_display_frame_op_t *dec_rel_disp_op; 156 157 dec_state_t *ps_dec_state; 158 dec_state_multi_core_t *ps_dec_state_multi_core; 159 160 161 dec_rel_disp_ip = (ivd_rel_display_frame_ip_t *)pv_api_ip; 162 dec_rel_disp_op = (ivd_rel_display_frame_op_t *)pv_api_op; 163 164 dec_rel_disp_op->u4_error_code = 0; 165 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle); 166 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 167 168 169 /* If not in shared disp buf mode, return */ 170 if(0 == ps_dec_state->u4_share_disp_buf) 171 return IV_SUCCESS; 172 173 if(NULL == ps_dec_state->pv_pic_buf_mg) 174 return IV_SUCCESS; 175 176 177 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, dec_rel_disp_ip->u4_disp_buf_id, BUF_MGR_DISP); 178 179 return IV_SUCCESS; 180 } 181 182 /*****************************************************************************/ 183 /* */ 184 /* Function Name : impeg2d_api_set_display_frame */ 185 /* */ 186 /* Description : Sets display buffers that will be shared between decoder */ 187 /* and application */ 188 /* Inputs : Error message */ 189 /* Globals : None */ 190 /* Processing : Just prints error message to console */ 191 /* Outputs : Error mesage to the console */ 192 /* Returns : None */ 193 /* */ 194 /* Issues : <List any issues or problems with this function> */ 195 /* */ 196 /* Revision History: */ 197 /* */ 198 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 199 /* 27 05 2006 Sankar Creation */ 200 /* */ 201 /*****************************************************************************/ 202 IV_API_CALL_STATUS_T impeg2d_api_set_display_frame(iv_obj_t *ps_dechdl, 203 void *pv_api_ip, 204 void *pv_api_op) 205 { 206 207 ivd_set_display_frame_ip_t *dec_disp_ip; 208 ivd_set_display_frame_op_t *dec_disp_op; 209 210 UWORD32 i; 211 dec_state_t *ps_dec_state; 212 dec_state_multi_core_t *ps_dec_state_multi_core; 213 UWORD32 u4_num_disp_bufs; 214 215 216 dec_disp_ip = (ivd_set_display_frame_ip_t *)pv_api_ip; 217 dec_disp_op = (ivd_set_display_frame_op_t *)pv_api_op; 218 dec_disp_op->u4_error_code = 0; 219 220 u4_num_disp_bufs = dec_disp_ip->num_disp_bufs; 221 if(u4_num_disp_bufs > BUF_MGR_MAX_CNT) 222 u4_num_disp_bufs = BUF_MGR_MAX_CNT; 223 224 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle); 225 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 226 227 if(ps_dec_state->u4_share_disp_buf) 228 { 229 pic_buf_t *ps_pic_buf; 230 ps_pic_buf = (pic_buf_t *)ps_dec_state->pv_pic_buf_base; 231 for(i = 0; i < u4_num_disp_bufs; i++) 232 { 233 234 ps_pic_buf->pu1_y = dec_disp_ip->s_disp_buffer[i].pu1_bufs[0]; 235 if(IV_YUV_420P == ps_dec_state->i4_chromaFormat) 236 { 237 ps_pic_buf->pu1_u = dec_disp_ip->s_disp_buffer[i].pu1_bufs[1]; 238 ps_pic_buf->pu1_v = dec_disp_ip->s_disp_buffer[i].pu1_bufs[2]; 239 } 240 else 241 { 242 ps_pic_buf->pu1_u = ps_dec_state->pu1_chroma_ref_buf[i]; 243 ps_pic_buf->pu1_v = ps_dec_state->pu1_chroma_ref_buf[i] + 244 ((ps_dec_state->u2_create_max_width * ps_dec_state->u2_create_max_height) >> 2); 245 } 246 247 ps_pic_buf->i4_buf_id = i; 248 249 ps_pic_buf->u1_used_as_ref = 0; 250 251 ps_pic_buf->u4_ts = 0; 252 253 impeg2_buf_mgr_add(ps_dec_state->pv_pic_buf_mg, ps_pic_buf, i); 254 impeg2_buf_mgr_set_status(ps_dec_state->pv_pic_buf_mg, i, BUF_MGR_DISP); 255 ps_pic_buf++; 256 257 } 258 } 259 memcpy(&(ps_dec_state->as_disp_buffers[0]), 260 &(dec_disp_ip->s_disp_buffer), 261 u4_num_disp_bufs * sizeof(ivd_out_bufdesc_t)); 262 263 return IV_SUCCESS; 264 265 } 266 267 IV_API_CALL_STATUS_T impeg2d_api_set_num_cores(iv_obj_t *ps_dechdl, 268 void *pv_api_ip, 269 void *pv_api_op) 270 { 271 impeg2d_ctl_set_num_cores_ip_t *ps_ip; 272 impeg2d_ctl_set_num_cores_op_t *ps_op; 273 dec_state_t *ps_dec_state; 274 dec_state_multi_core_t *ps_dec_state_multi_core; 275 276 ps_ip = (impeg2d_ctl_set_num_cores_ip_t *)pv_api_ip; 277 ps_op = (impeg2d_ctl_set_num_cores_op_t *)pv_api_op; 278 279 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle); 280 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 281 282 if(ps_ip->u4_num_cores > 0) 283 { 284 285 286 WORD32 i; 287 for(i = 0; i < MAX_THREADS; i++) 288 ps_dec_state_multi_core->ps_dec_state[i]->i4_num_cores = ps_ip->u4_num_cores; 289 } 290 else 291 { 292 ps_dec_state->i4_num_cores = 1; 293 } 294 ps_op->u4_error_code = IV_SUCCESS; 295 296 return IV_SUCCESS; 297 } 298 299 /** 300 ******************************************************************************* 301 * 302 * @brief 303 * Sets Processor type 304 * 305 * @par Description: 306 * Sets Processor type 307 * 308 * @param[in] ps_codec_obj 309 * Pointer to codec object at API level 310 * 311 * @param[in] pv_api_ip 312 * Pointer to input argument structure 313 * 314 * @param[out] pv_api_op 315 * Pointer to output argument structure 316 * 317 * @returns Status 318 * 319 * @remarks 320 * 321 * 322 ******************************************************************************* 323 */ 324 325 IV_API_CALL_STATUS_T impeg2d_set_processor(iv_obj_t *ps_codec_obj, 326 void *pv_api_ip, 327 void *pv_api_op) 328 { 329 impeg2d_ctl_set_processor_ip_t *ps_ip; 330 impeg2d_ctl_set_processor_op_t *ps_op; 331 dec_state_t *ps_codec; 332 dec_state_multi_core_t *ps_dec_state_multi_core; 333 334 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_codec_obj->pv_codec_handle); 335 ps_codec = ps_dec_state_multi_core->ps_dec_state[0]; 336 337 ps_ip = (impeg2d_ctl_set_processor_ip_t *)pv_api_ip; 338 ps_op = (impeg2d_ctl_set_processor_op_t *)pv_api_op; 339 340 ps_codec->e_processor_arch = (IVD_ARCH_T)ps_ip->u4_arch; 341 ps_codec->e_processor_soc = (IVD_SOC_T)ps_ip->u4_soc; 342 343 impeg2d_init_function_ptr(ps_codec); 344 345 346 ps_op->u4_error_code = 0; 347 return IV_SUCCESS; 348 } 349 /*****************************************************************************/ 350 /* */ 351 /* Function Name : impeg2d_fill_mem_rec */ 352 /* */ 353 /* Description : */ 354 /* Inputs : */ 355 /* Globals : */ 356 /* Processing : */ 357 /* Outputs : */ 358 /* Returns : */ 359 /* */ 360 /* Issues : */ 361 /* */ 362 /* Revision History: */ 363 /* */ 364 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 365 /* 17 09 2007 Rajendra C Y Draft */ 366 /* */ 367 /*****************************************************************************/ 368 void impeg2d_fill_mem_rec(impeg2d_fill_mem_rec_ip_t *ps_ip, 369 impeg2d_fill_mem_rec_op_t *ps_op) 370 { 371 UWORD32 u4_i; 372 373 UWORD8 u1_no_rec = 0; 374 UWORD32 max_frm_width,max_frm_height,max_frm_size; 375 iv_mem_rec_t *ps_mem_rec = ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location; 376 WORD32 i4_num_threads; 377 WORD32 i4_share_disp_buf, i4_chroma_format; 378 WORD32 i4_chroma_size; 379 UWORD32 u4_deinterlace; 380 UNUSED(u4_deinterlace); 381 max_frm_width = ALIGN16(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd); 382 max_frm_height = ALIGN16(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht); 383 384 max_frm_size = (max_frm_width * max_frm_height * 3) >> 1;/* 420 P */ 385 386 i4_chroma_size = max_frm_width * max_frm_height / 4; 387 388 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size > offsetof(impeg2d_fill_mem_rec_ip_t, u4_share_disp_buf)) 389 { 390 #ifndef LOGO_EN 391 i4_share_disp_buf = ps_ip->u4_share_disp_buf; 392 #else 393 i4_share_disp_buf = 0; 394 #endif 395 } 396 else 397 { 398 i4_share_disp_buf = 0; 399 } 400 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size > offsetof(impeg2d_fill_mem_rec_ip_t, e_output_format)) 401 { 402 i4_chroma_format = ps_ip->e_output_format; 403 } 404 else 405 { 406 i4_chroma_format = -1; 407 } 408 409 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size > offsetof(impeg2d_fill_mem_rec_ip_t, u4_deinterlace)) 410 { 411 u4_deinterlace = ps_ip->u4_deinterlace; 412 } 413 else 414 { 415 u4_deinterlace = 0; 416 } 417 418 419 if( (i4_chroma_format != IV_YUV_420P) && 420 (i4_chroma_format != IV_YUV_420SP_UV) && 421 (i4_chroma_format != IV_YUV_420SP_VU)) 422 { 423 i4_share_disp_buf = 0; 424 } 425 426 /* Disable deinterlacer in shared mode */ 427 if(i4_share_disp_buf) 428 { 429 u4_deinterlace = 0; 430 } 431 432 /*************************************************************************/ 433 /* Fill the memory requirement XDM Handle */ 434 /*************************************************************************/ 435 /* ! */ 436 ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/; 437 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 438 ps_mem_rec->u4_mem_size = sizeof(iv_obj_t); 439 440 ps_mem_rec++; 441 u1_no_rec++; 442 443 { 444 /*************************************************************************/ 445 /* Fill the memory requirement for threads context */ 446 /*************************************************************************/ 447 /* ! */ 448 ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/; 449 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 450 ps_mem_rec->u4_mem_size = sizeof(dec_state_multi_core_t); 451 452 ps_mem_rec++; 453 u1_no_rec++; 454 } 455 456 for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++) 457 { 458 /*************************************************************************/ 459 /* Fill the memory requirement for MPEG2 Decoder Context */ 460 /*************************************************************************/ 461 /* ! */ 462 ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/; 463 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 464 ps_mem_rec->u4_mem_size = sizeof(dec_state_t); 465 466 ps_mem_rec++; 467 u1_no_rec++; 468 469 /* To store thread handle */ 470 ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/; 471 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 472 ps_mem_rec->u4_mem_size = ithread_get_handle_size(); 473 474 ps_mem_rec++; 475 u1_no_rec++; 476 477 /*************************************************************************/ 478 /* Fill the memory requirement for Motion Compensation Buffers */ 479 /*************************************************************************/ 480 ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/; 481 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_SCRATCH_MEM; 482 483 /* for mc_fw_buf.pu1_y */ 484 ps_mem_rec->u4_mem_size = MB_LUMA_MEM_SIZE; 485 486 /* for mc_fw_buf.pu1_u */ 487 ps_mem_rec->u4_mem_size += MB_CHROMA_MEM_SIZE; 488 489 /* for mc_fw_buf.pu1_v */ 490 ps_mem_rec->u4_mem_size += MB_CHROMA_MEM_SIZE; 491 492 /* for mc_bk_buf.pu1_y */ 493 ps_mem_rec->u4_mem_size += MB_LUMA_MEM_SIZE; 494 495 /* for mc_bk_buf.pu1_u */ 496 ps_mem_rec->u4_mem_size += MB_CHROMA_MEM_SIZE; 497 498 /* for mc_bk_buf.pu1_v */ 499 ps_mem_rec->u4_mem_size += MB_CHROMA_MEM_SIZE; 500 501 /* for mc_buf.pu1_y */ 502 ps_mem_rec->u4_mem_size += MB_LUMA_MEM_SIZE; 503 504 /* for mc_buf.pu1_u */ 505 ps_mem_rec->u4_mem_size += MB_CHROMA_MEM_SIZE; 506 507 /* for mc_buf.pu1_v */ 508 ps_mem_rec->u4_mem_size += MB_CHROMA_MEM_SIZE; 509 510 ps_mem_rec++; 511 u1_no_rec++; 512 513 514 /*************************************************************************/ 515 /* Fill the memory requirement Stack Context */ 516 /*************************************************************************/ 517 /* ! */ 518 ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/; 519 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 520 ps_mem_rec->u4_mem_size = 392; 521 522 ps_mem_rec++; 523 u1_no_rec++; 524 } 525 526 527 528 { 529 /*************************************************************************/ 530 /* Fill the memory requirement for Picture Buffer Manager */ 531 /*************************************************************************/ 532 /* ! */ 533 ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/; 534 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 535 ps_mem_rec->u4_mem_size = sizeof(buf_mgr_t) + sizeof(pic_buf_t) * BUF_MGR_MAX_CNT; 536 537 ps_mem_rec++; 538 u1_no_rec++; 539 } 540 /*************************************************************************/ 541 /* Internal Frame Buffers */ 542 /*************************************************************************/ 543 /* ! */ 544 545 { 546 for(u4_i = 0; u4_i < NUM_INT_FRAME_BUFFERS; u4_i++) 547 { 548 /* ! */ 549 ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/; 550 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 551 if(0 == i4_share_disp_buf) 552 ps_mem_rec->u4_mem_size = max_frm_size; 553 else if(IV_YUV_420P != i4_chroma_format) 554 { 555 /* If color format is not 420P and it is shared, then allocate for chroma */ 556 ps_mem_rec->u4_mem_size = i4_chroma_size * 2; 557 } 558 else 559 ps_mem_rec->u4_mem_size = 64; 560 ps_mem_rec++; 561 u1_no_rec++; 562 } 563 } 564 565 566 567 { 568 WORD32 i4_job_queue_size; 569 WORD32 i4_num_jobs; 570 571 /* One job per row of MBs */ 572 i4_num_jobs = max_frm_height >> 4; 573 574 /* One format convert/frame copy job per row of MBs for non-shared mode*/ 575 i4_num_jobs += max_frm_height >> 4; 576 577 578 i4_job_queue_size = impeg2_jobq_ctxt_size(); 579 i4_job_queue_size += i4_num_jobs * sizeof(job_t); 580 ps_mem_rec->u4_mem_size = i4_job_queue_size; 581 ps_mem_rec->u4_mem_alignment = 128; 582 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 583 584 ps_mem_rec++; 585 u1_no_rec++; 586 587 } 588 589 ps_mem_rec->u4_mem_alignment = 128; 590 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 591 ps_mem_rec->u4_mem_size = impeg2d_deint_ctxt_size(); 592 ps_mem_rec++; 593 u1_no_rec++; 594 595 ps_mem_rec->u4_mem_alignment = 128; 596 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 597 598 if(IV_YUV_420P != i4_chroma_format) 599 ps_mem_rec->u4_mem_size = max_frm_size; 600 else 601 ps_mem_rec->u4_mem_size = 64; 602 603 ps_mem_rec++; 604 u1_no_rec++; 605 606 ps_mem_rec->u4_mem_alignment = 128; 607 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM; 608 ps_mem_rec->u4_mem_size = sizeof(iv_mem_rec_t) * (NUM_MEM_RECORDS); 609 ps_mem_rec++; 610 u1_no_rec++; 611 ps_op->s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled = u1_no_rec; 612 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code = 0; 613 } 614 615 616 /*****************************************************************************/ 617 /* */ 618 /* Function Name : impeg2d_api_get_version */ 619 /* */ 620 /* Description : */ 621 /* */ 622 /* Inputs : */ 623 /* Globals : <Does it use any global variables?> */ 624 /* Outputs : */ 625 /* Returns : void */ 626 /* */ 627 /* Issues : none */ 628 /* */ 629 /* Revision History: */ 630 /* */ 631 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 632 /* 22 10 2008 100356 Draft */ 633 /* */ 634 /*****************************************************************************/ 635 IV_API_CALL_STATUS_T impeg2d_api_get_version(iv_obj_t *ps_dechdl, 636 void *pv_api_ip, 637 void *pv_api_op) 638 { 639 char au1_version_string[512]; 640 641 impeg2d_ctl_getversioninfo_ip_t *ps_ip; 642 impeg2d_ctl_getversioninfo_op_t *ps_op; 643 644 UNUSED(ps_dechdl); 645 646 ps_ip = (impeg2d_ctl_getversioninfo_ip_t *)pv_api_ip; 647 ps_op = (impeg2d_ctl_getversioninfo_op_t *)pv_api_op; 648 649 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = IV_SUCCESS; 650 651 VERSION(au1_version_string, CODEC_NAME, CODEC_RELEASE_TYPE, CODEC_RELEASE_VER, 652 CODEC_VENDOR); 653 654 if((WORD32)ps_ip->s_ivd_ctl_getversioninfo_ip_t.u4_version_buffer_size <= 0) 655 { 656 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = IV_FAIL; 657 return (IV_FAIL); 658 } 659 660 if(ps_ip->s_ivd_ctl_getversioninfo_ip_t.u4_version_buffer_size 661 >= (strlen(au1_version_string) + 1)) 662 { 663 memcpy(ps_ip->s_ivd_ctl_getversioninfo_ip_t.pv_version_buffer, 664 au1_version_string, (strlen(au1_version_string) + 1)); 665 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = IV_SUCCESS; 666 } 667 else 668 { 669 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = IV_FAIL; 670 } 671 672 return (IV_SUCCESS); 673 } 674 675 /*****************************************************************************/ 676 /* */ 677 /* Function Name : impeg2d_api_get_buf_info */ 678 /* */ 679 /* Description : */ 680 /* */ 681 /* Inputs : */ 682 /* Globals : <Does it use any global variables?> */ 683 /* Outputs : */ 684 /* Returns : void */ 685 /* */ 686 /* Issues : none */ 687 /* */ 688 /* Revision History: */ 689 /* */ 690 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 691 /* 22 10 2008 100356 Draft */ 692 /* */ 693 /*****************************************************************************/ 694 IV_API_CALL_STATUS_T impeg2d_api_get_buf_info(iv_obj_t *ps_dechdl, 695 void *pv_api_ip, 696 void *pv_api_op) 697 { 698 dec_state_t *ps_dec_state; 699 dec_state_multi_core_t *ps_dec_state_multi_core; 700 impeg2d_ctl_getbufinfo_ip_t *ps_ctl_bufinfo_ip = 701 (impeg2d_ctl_getbufinfo_ip_t *)pv_api_ip; 702 impeg2d_ctl_getbufinfo_op_t *ps_ctl_bufinfo_op = 703 (impeg2d_ctl_getbufinfo_op_t *)pv_api_op; 704 UWORD32 u4_i, u4_stride, u4_height; 705 UNUSED(ps_ctl_bufinfo_ip); 706 707 ps_dec_state_multi_core = 708 (dec_state_multi_core_t *)(ps_dechdl->pv_codec_handle); 709 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 710 711 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_in_bufs = 1; 712 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_out_bufs = 1; 713 714 if(ps_dec_state->i4_chromaFormat == IV_YUV_420P) 715 { 716 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_out_bufs = 717 MIN_OUT_BUFS_420; 718 } 719 else if((ps_dec_state->i4_chromaFormat == IV_YUV_420SP_UV) 720 || (ps_dec_state->i4_chromaFormat == IV_YUV_420SP_VU)) 721 { 722 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_out_bufs = 723 MIN_OUT_BUFS_420SP; 724 } 725 else if(ps_dec_state->i4_chromaFormat == IV_YUV_422ILE) 726 { 727 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_out_bufs = 728 MIN_OUT_BUFS_422ILE; 729 } 730 else if(ps_dec_state->i4_chromaFormat == IV_RGB_565) 731 { 732 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_out_bufs = 733 MIN_OUT_BUFS_RGB565; 734 } 735 else 736 { 737 //Invalid chroma format; Error code may be updated, verify in testing if needed 738 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code = 739 IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED; 740 return IV_FAIL; 741 } 742 743 for(u4_i = 0; u4_i < IVD_VIDDEC_MAX_IO_BUFFERS; u4_i++) 744 { 745 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_in_buf_size[u4_i] = 746 0; 747 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[u4_i] = 748 0; 749 } 750 751 for(u4_i = 0; 752 u4_i < ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_in_bufs; 753 u4_i++) 754 { 755 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_in_buf_size[u4_i] = 756 MAX_BITSTREAM_BUFFER_SIZE; 757 } 758 759 if (0 == ps_dec_state->u4_frm_buf_stride) 760 { 761 if (1 == ps_dec_state->u2_header_done) 762 { 763 u4_stride = ps_dec_state->u2_horizontal_size; 764 } 765 else 766 { 767 u4_stride = ps_dec_state->u2_create_max_width; 768 } 769 } 770 else 771 { 772 u4_stride = ps_dec_state->u4_frm_buf_stride; 773 } 774 u4_height = ((ps_dec_state->u2_frame_height + 15) >> 4) << 4; 775 776 if(ps_dec_state->i4_chromaFormat == IV_YUV_420P) 777 { 778 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[0] = 779 (u4_stride * u4_height); 780 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[1] = 781 (u4_stride * u4_height) >> 2; 782 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[2] = 783 (u4_stride * u4_height) >> 2; 784 } 785 else if((ps_dec_state->i4_chromaFormat == IV_YUV_420SP_UV) 786 || (ps_dec_state->i4_chromaFormat == IV_YUV_420SP_VU)) 787 { 788 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[0] = 789 (u4_stride * u4_height); 790 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[1] = 791 (u4_stride * u4_height) >> 1; 792 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[2] = 0; 793 } 794 else if(ps_dec_state->i4_chromaFormat == IV_YUV_422ILE) 795 { 796 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[0] = 797 (u4_stride * u4_height) * 2; 798 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[1] = 799 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[2] = 800 0; 801 } 802 803 /* Adding initialization for 2 uninitialized values */ 804 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_num_disp_bufs = 1; 805 if(ps_dec_state->u4_share_disp_buf) 806 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_num_disp_bufs = 807 NUM_INT_FRAME_BUFFERS; 808 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_size = MAX_FRM_SIZE; 809 810 ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code = IV_SUCCESS; 811 812 return (IV_SUCCESS); 813 } 814 815 /*****************************************************************************/ 816 /* */ 817 /* Function Name : impeg2d_api_set_flush_mode */ 818 /* */ 819 /* Description : */ 820 /* */ 821 /* Inputs : */ 822 /* Globals : <Does it use any global variables?> */ 823 /* Outputs : */ 824 /* Returns : void */ 825 /* */ 826 /* Issues : none */ 827 /* */ 828 /* Revision History: */ 829 /* */ 830 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 831 /* 08 06 2009 100356 RAVI */ 832 /* */ 833 /*****************************************************************************/ 834 IV_API_CALL_STATUS_T impeg2d_api_set_flush_mode(iv_obj_t *ps_dechdl, 835 void *pv_api_ip, 836 void *pv_api_op) 837 { 838 dec_state_t *ps_dec_state; 839 dec_state_multi_core_t *ps_dec_state_multi_core; 840 impeg2d_ctl_flush_op_t *ps_ctl_dec_op = 841 (impeg2d_ctl_flush_op_t*)pv_api_op; 842 843 UNUSED(pv_api_ip); 844 845 ps_dec_state_multi_core = 846 (dec_state_multi_core_t *)(ps_dechdl->pv_codec_handle); 847 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 848 849 ps_dec_state->u1_flushfrm = 1; 850 851 ps_ctl_dec_op->s_ivd_ctl_flush_op_t.u4_size = 852 sizeof(impeg2d_ctl_flush_op_t); 853 ps_ctl_dec_op->s_ivd_ctl_flush_op_t.u4_error_code = IV_SUCCESS; 854 855 return (IV_SUCCESS); 856 } 857 858 /*****************************************************************************/ 859 /* */ 860 /* Function Name : impeg2d_api_set_default */ 861 /* */ 862 /* Description : */ 863 /* */ 864 /* Inputs : */ 865 /* Globals : <Does it use any global variables?> */ 866 /* Outputs : */ 867 /* Returns : void */ 868 /* */ 869 /* Issues : none */ 870 /* */ 871 /* Revision History: */ 872 /* */ 873 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 874 /* 08 06 2009 100356 RAVI */ 875 /* */ 876 /*****************************************************************************/ 877 IV_API_CALL_STATUS_T impeg2d_api_set_default(iv_obj_t *ps_dechdl, 878 void *pv_api_ip, 879 void *pv_api_op) 880 { 881 dec_state_t *ps_dec_state; 882 dec_state_multi_core_t *ps_dec_state_multi_core; 883 impeg2d_ctl_set_config_op_t *ps_ctl_dec_op = 884 (impeg2d_ctl_set_config_op_t *)pv_api_op; 885 886 UNUSED(pv_api_ip); 887 888 ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_SUCCESS; 889 ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_size = 890 sizeof(impeg2d_ctl_set_config_op_t); 891 892 ps_dec_state_multi_core = 893 (dec_state_multi_core_t *)(ps_dechdl->pv_codec_handle); 894 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 895 896 ps_dec_state->u1_flushfrm = 0; 897 ps_dec_state->u2_decode_header = 1; 898 899 if (1 == ps_dec_state->u2_header_done) 900 { 901 ps_dec_state->u4_frm_buf_stride = ps_dec_state->u2_frame_width; 902 } 903 904 ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_SUCCESS; 905 906 return (IV_SUCCESS); 907 908 } 909 910 /*****************************************************************************/ 911 /* */ 912 /* Function Name : impeg2d_api_reset */ 913 /* */ 914 /* Description : */ 915 /* */ 916 /* Inputs : */ 917 /* Globals : <Does it use any global variables?> */ 918 /* Outputs : */ 919 /* Returns : void */ 920 /* */ 921 /* Issues : none */ 922 /* */ 923 /* Revision History: */ 924 /* */ 925 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 926 /* 08 06 2009 100356 RAVI */ 927 /* */ 928 /*****************************************************************************/ 929 IV_API_CALL_STATUS_T impeg2d_api_reset(iv_obj_t *ps_dechdl, 930 void *pv_api_ip, 931 void *pv_api_op) 932 { 933 dec_state_t *ps_dec_state; 934 dec_state_multi_core_t *ps_dec_state_multi_core; 935 UNUSED(pv_api_ip); 936 impeg2d_ctl_reset_op_t *s_ctl_reset_op = (impeg2d_ctl_reset_op_t *)pv_api_op; 937 938 WORD32 i4_num_threads; 939 940 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle); 941 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 942 943 if(ps_dec_state_multi_core != NULL) 944 { 945 if(ps_dec_state->aps_ref_pics[1] != NULL) 946 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[1]->i4_buf_id, BUF_MGR_REF); 947 if(ps_dec_state->aps_ref_pics[0] != NULL) 948 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF); 949 while(1) 950 { 951 pic_buf_t *ps_disp_pic = impeg2_disp_mgr_get(&ps_dec_state->s_disp_mgr, &ps_dec_state->i4_disp_buf_id); 952 if(NULL == ps_disp_pic) 953 break; 954 if(0 == ps_dec_state->u4_share_disp_buf) 955 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_disp_pic->i4_buf_id, BUF_MGR_DISP); 956 957 } 958 959 if((ps_dec_state->u4_deinterlace) && (NULL != ps_dec_state->ps_deint_pic)) 960 { 961 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, 962 ps_dec_state->ps_deint_pic->i4_buf_id, 963 MPEG2_BUF_MGR_DEINT); 964 } 965 966 for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++) 967 { 968 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[i4_num_threads]; 969 970 971 /* --------------------------------------------------------------------- */ 972 /* Initializations */ 973 974 ps_dec_state->u2_header_done = 0; /* Header decoding not done */ 975 ps_dec_state->u4_frm_buf_stride = 0; 976 ps_dec_state->u2_is_mpeg2 = 0; 977 ps_dec_state->aps_ref_pics[0] = NULL; 978 ps_dec_state->aps_ref_pics[1] = NULL; 979 ps_dec_state->ps_deint_pic = NULL; 980 } 981 } 982 else 983 { 984 s_ctl_reset_op->s_ivd_ctl_reset_op_t.u4_error_code = 985 IMPEG2D_INIT_NOT_DONE; 986 } 987 988 return(IV_SUCCESS); 989 } 990 991 /*****************************************************************************/ 992 /* */ 993 /* Function Name : impeg2d_api_set_params */ 994 /* */ 995 /* Description : */ 996 /* */ 997 /* Inputs : */ 998 /* Globals : <Does it use any global variables?> */ 999 /* Outputs : */ 1000 /* Returns : void */ 1001 /* */ 1002 /* Issues : none */ 1003 /* */ 1004 /* Revision History: */ 1005 /* */ 1006 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1007 /* 08 06 2009 100356 RAVI */ 1008 /* */ 1009 /*****************************************************************************/ 1010 IV_API_CALL_STATUS_T impeg2d_api_set_params(iv_obj_t *ps_dechdl,void *pv_api_ip,void *pv_api_op) 1011 { 1012 dec_state_t *ps_dec_state; 1013 dec_state_multi_core_t *ps_dec_state_multi_core; 1014 impeg2d_ctl_set_config_ip_t *ps_ctl_dec_ip = (impeg2d_ctl_set_config_ip_t *)pv_api_ip; 1015 impeg2d_ctl_set_config_op_t *ps_ctl_dec_op = (impeg2d_ctl_set_config_op_t *)pv_api_op; 1016 1017 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle); 1018 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 1019 1020 if((ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_vid_dec_mode != IVD_DECODE_HEADER) && (ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_vid_dec_mode != IVD_DECODE_FRAME)) 1021 { 1022 ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_FAIL; 1023 return(IV_FAIL); 1024 } 1025 1026 if((ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_frm_out_mode != IVD_DISPLAY_FRAME_OUT) && (ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_frm_out_mode != IVD_DECODE_FRAME_OUT)) 1027 { 1028 ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_FAIL; 1029 return(IV_FAIL); 1030 } 1031 1032 if( (WORD32) ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_frm_skip_mode < IVD_SKIP_NONE) 1033 { 1034 ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_FAIL; 1035 return(IV_FAIL); 1036 } 1037 1038 if(ps_dec_state->u2_header_done == 1) 1039 { 1040 if(((WORD32)ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd < 0) || 1041 ((ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd != 0) && (ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd < ps_dec_state->u2_frame_width))) 1042 { 1043 ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_FAIL; 1044 return(IV_FAIL); 1045 } 1046 1047 } 1048 1049 1050 ps_dec_state->u2_decode_header = (UWORD8)ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_vid_dec_mode; 1051 1052 if(ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd != 0) 1053 { 1054 if(ps_dec_state->u2_header_done == 1) 1055 { 1056 if (ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd > ps_dec_state->u2_frame_width) 1057 { 1058 ps_dec_state->u4_frm_buf_stride = ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd; 1059 } 1060 } 1061 else 1062 { 1063 ps_dec_state->u4_frm_buf_stride = ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd; 1064 } 1065 1066 } 1067 else 1068 { 1069 1070 if(ps_dec_state->u2_header_done == 1) 1071 { 1072 ps_dec_state->u4_frm_buf_stride = ps_dec_state->u2_frame_width; 1073 } 1074 else 1075 { 1076 ps_dec_state->u4_frm_buf_stride = 0; 1077 } 1078 } 1079 1080 1081 if(ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_vid_dec_mode == IVD_DECODE_FRAME) 1082 { 1083 ps_dec_state->u1_flushfrm = 0; 1084 } 1085 1086 1087 ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_SUCCESS; 1088 return(IV_SUCCESS); 1089 1090 } 1091 1092 /*****************************************************************************/ 1093 /* */ 1094 /* Function Name : impeg2d_api_get_status */ 1095 /* */ 1096 /* Description : */ 1097 /* */ 1098 /* Inputs : */ 1099 /* Globals : <Does it use any global variables?> */ 1100 /* Outputs : */ 1101 /* Returns : void */ 1102 /* */ 1103 /* Issues : none */ 1104 /* */ 1105 /* Revision History: */ 1106 /* */ 1107 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1108 /* 08 06 2009 100356 RAVI */ 1109 /* */ 1110 /*****************************************************************************/ 1111 IV_API_CALL_STATUS_T impeg2d_api_get_status(iv_obj_t *ps_dechdl, 1112 void *pv_api_ip, 1113 void *pv_api_op) 1114 { 1115 dec_state_t *ps_dec_state; 1116 dec_state_multi_core_t *ps_dec_state_multi_core; 1117 UWORD32 u4_i,u4_stride,u4_height; 1118 impeg2d_ctl_getstatus_ip_t *ps_ctl_dec_ip = (impeg2d_ctl_getstatus_ip_t *)pv_api_ip; 1119 impeg2d_ctl_getstatus_op_t *ps_ctl_dec_op = (impeg2d_ctl_getstatus_op_t *)pv_api_op; 1120 UNUSED(ps_ctl_dec_ip); 1121 1122 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle); 1123 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 1124 1125 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_size = sizeof(impeg2d_ctl_getstatus_op_t); 1126 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_num_disp_bufs = 1; 1127 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_pic_ht = ps_dec_state->u2_frame_height; 1128 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_pic_wd = ps_dec_state->u2_frame_width; 1129 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_frame_rate = ps_dec_state->u2_framePeriod; 1130 1131 1132 if(ps_dec_state->u2_progressive_sequence == 1) 1133 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.e_content_type = IV_PROGRESSIVE ; 1134 else 1135 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.e_content_type = IV_INTERLACED; 1136 1137 1138 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.e_output_chroma_format = (IV_COLOR_FORMAT_T)ps_dec_state->i4_chromaFormat; 1139 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_in_bufs = 1; 1140 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_out_bufs = 1; 1141 1142 1143 if(ps_dec_state->i4_chromaFormat == IV_YUV_420P) 1144 { 1145 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_out_bufs = MIN_OUT_BUFS_420; 1146 } 1147 else if(ps_dec_state->i4_chromaFormat == IV_YUV_422ILE) 1148 { 1149 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_out_bufs = MIN_OUT_BUFS_422ILE; 1150 } 1151 else if(ps_dec_state->i4_chromaFormat == IV_RGB_565) 1152 { 1153 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_out_bufs = MIN_OUT_BUFS_RGB565; 1154 } 1155 else 1156 { 1157 //Invalid chroma format; Error code may be updated, verify in testing if needed 1158 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_error_code = IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED; 1159 return IV_FAIL; 1160 } 1161 1162 memset(&ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_in_buf_size[0],0,(sizeof(UWORD32)*IVD_VIDDEC_MAX_IO_BUFFERS)); 1163 memset(&ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[0],0,(sizeof(UWORD32)*IVD_VIDDEC_MAX_IO_BUFFERS)); 1164 1165 for(u4_i = 0; u4_i < ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_in_bufs; u4_i++) 1166 { 1167 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_in_buf_size[u4_i] = MAX_BITSTREAM_BUFFER_SIZE; 1168 } 1169 1170 u4_stride = ps_dec_state->u4_frm_buf_stride; 1171 u4_height = ((ps_dec_state->u2_frame_height + 15) >> 4) << 4; 1172 1173 if(ps_dec_state->i4_chromaFormat == IV_YUV_420P) 1174 { 1175 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[0] = (u4_stride * u4_height); 1176 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[1] = (u4_stride * u4_height)>>2 ; 1177 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[2] = (u4_stride * u4_height)>>2; 1178 } 1179 else if((ps_dec_state->i4_chromaFormat == IV_YUV_420SP_UV) || (ps_dec_state->i4_chromaFormat == IV_YUV_420SP_VU)) 1180 { 1181 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[0] = (u4_stride * u4_height); 1182 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[1] = (u4_stride * u4_height)>>1 ; 1183 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[2] = 0; 1184 } 1185 else if(ps_dec_state->i4_chromaFormat == IV_YUV_422ILE) 1186 { 1187 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[0] = (u4_stride * u4_height)*2; 1188 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[1] = ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[2] = 0; 1189 } 1190 1191 ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_error_code = IV_SUCCESS; 1192 1193 return(IV_SUCCESS); 1194 1195 } 1196 1197 /** 1198 ******************************************************************************* 1199 * 1200 * @brief 1201 * Gets frame dimensions/offsets 1202 * 1203 * @par Description: 1204 * Gets frame buffer chararacteristics such a x & y offsets display and 1205 * buffer dimensions 1206 * 1207 * @param[in] ps_codec_obj 1208 * Pointer to codec object at API level 1209 * 1210 * @param[in] pv_api_ip 1211 * Pointer to input argument structure 1212 * 1213 * @param[out] pv_api_op 1214 * Pointer to output argument structure 1215 * 1216 * @returns Status 1217 * 1218 * @remarks 1219 * 1220 * 1221 ******************************************************************************* 1222 */ 1223 IV_API_CALL_STATUS_T impeg2d_get_frame_dimensions(iv_obj_t *ps_codec_obj, 1224 void *pv_api_ip, 1225 void *pv_api_op) 1226 { 1227 impeg2d_ctl_get_frame_dimensions_ip_t *ps_ip; 1228 impeg2d_ctl_get_frame_dimensions_op_t *ps_op; 1229 WORD32 disp_wd, disp_ht, buffer_wd, buffer_ht, x_offset, y_offset; 1230 dec_state_t *ps_codec; 1231 dec_state_multi_core_t *ps_dec_state_multi_core; 1232 1233 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_codec_obj->pv_codec_handle); 1234 ps_codec = ps_dec_state_multi_core->ps_dec_state[0]; 1235 1236 1237 ps_ip = (impeg2d_ctl_get_frame_dimensions_ip_t *)pv_api_ip; 1238 ps_op = (impeg2d_ctl_get_frame_dimensions_op_t *)pv_api_op; 1239 UNUSED(ps_ip); 1240 if(ps_codec->u2_header_done) 1241 { 1242 disp_wd = ps_codec->u2_horizontal_size; 1243 disp_ht = ps_codec->u2_vertical_size; 1244 1245 if(0 == ps_codec->u4_share_disp_buf) 1246 { 1247 buffer_wd = disp_wd; 1248 buffer_ht = disp_ht; 1249 } 1250 else 1251 { 1252 buffer_wd = ps_codec->u2_frame_width; 1253 buffer_ht = ps_codec->u2_frame_height; 1254 } 1255 } 1256 else 1257 { 1258 1259 disp_wd = ps_codec->u2_create_max_width; 1260 disp_ht = ps_codec->u2_create_max_height; 1261 1262 if(0 == ps_codec->u4_share_disp_buf) 1263 { 1264 buffer_wd = disp_wd; 1265 buffer_ht = disp_ht; 1266 } 1267 else 1268 { 1269 buffer_wd = ALIGN16(disp_wd); 1270 buffer_ht = ALIGN16(disp_ht); 1271 1272 } 1273 } 1274 if(ps_codec->u2_frame_width > buffer_wd) 1275 buffer_wd = ps_codec->u2_frame_width; 1276 1277 x_offset = 0; 1278 y_offset = 0; 1279 1280 1281 ps_op->u4_disp_wd[0] = disp_wd; 1282 ps_op->u4_disp_ht[0] = disp_ht; 1283 ps_op->u4_buffer_wd[0] = buffer_wd; 1284 ps_op->u4_buffer_ht[0] = buffer_ht; 1285 ps_op->u4_x_offset[0] = x_offset; 1286 ps_op->u4_y_offset[0] = y_offset; 1287 1288 ps_op->u4_disp_wd[1] = ps_op->u4_disp_wd[2] = ((ps_op->u4_disp_wd[0] + 1) 1289 >> 1); 1290 ps_op->u4_disp_ht[1] = ps_op->u4_disp_ht[2] = ((ps_op->u4_disp_ht[0] + 1) 1291 >> 1); 1292 ps_op->u4_buffer_wd[1] = ps_op->u4_buffer_wd[2] = (ps_op->u4_buffer_wd[0] 1293 >> 1); 1294 ps_op->u4_buffer_ht[1] = ps_op->u4_buffer_ht[2] = (ps_op->u4_buffer_ht[0] 1295 >> 1); 1296 ps_op->u4_x_offset[1] = ps_op->u4_x_offset[2] = (ps_op->u4_x_offset[0] 1297 >> 1); 1298 ps_op->u4_y_offset[1] = ps_op->u4_y_offset[2] = (ps_op->u4_y_offset[0] 1299 >> 1); 1300 1301 if((ps_codec->i4_chromaFormat == IV_YUV_420SP_UV) 1302 || (ps_codec->i4_chromaFormat == IV_YUV_420SP_VU)) 1303 { 1304 ps_op->u4_disp_wd[2] = 0; 1305 ps_op->u4_disp_ht[2] = 0; 1306 ps_op->u4_buffer_wd[2] = 0; 1307 ps_op->u4_buffer_ht[2] = 0; 1308 ps_op->u4_x_offset[2] = 0; 1309 ps_op->u4_y_offset[2] = 0; 1310 1311 ps_op->u4_disp_wd[1] <<= 1; 1312 ps_op->u4_buffer_wd[1] <<= 1; 1313 ps_op->u4_x_offset[1] <<= 1; 1314 } 1315 1316 return IV_SUCCESS; 1317 1318 } 1319 1320 IV_API_CALL_STATUS_T impeg2d_api_function (iv_obj_t *ps_dechdl, void *pv_api_ip,void *pv_api_op) 1321 { 1322 WORD32 i4_cmd; 1323 IV_API_CALL_STATUS_T u4_error_code; 1324 UWORD32 *pu4_api_ip; 1325 1326 u4_error_code = impeg2d_api_check_struct_sanity(ps_dechdl,pv_api_ip,pv_api_op); 1327 if(IV_SUCCESS != u4_error_code) 1328 { 1329 return u4_error_code; 1330 } 1331 1332 1333 pu4_api_ip = (UWORD32 *)pv_api_ip; 1334 i4_cmd = *(pu4_api_ip + 1); 1335 1336 switch(i4_cmd) 1337 { 1338 1339 case IV_CMD_GET_NUM_MEM_REC: 1340 u4_error_code = impeg2d_api_num_mem_rec((void *)pv_api_ip,(void *)pv_api_op); 1341 break; 1342 1343 case IV_CMD_FILL_NUM_MEM_REC: 1344 u4_error_code = impeg2d_api_fill_mem_rec((void *)pv_api_ip,(void *)pv_api_op); 1345 break; 1346 1347 case IV_CMD_INIT: 1348 u4_error_code = impeg2d_api_init(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op); 1349 break; 1350 1351 case IVD_CMD_SET_DISPLAY_FRAME: 1352 u4_error_code = impeg2d_api_set_display_frame(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op); 1353 break; 1354 1355 case IVD_CMD_REL_DISPLAY_FRAME: 1356 u4_error_code = impeg2d_api_rel_display_frame(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op); 1357 break; 1358 1359 case IVD_CMD_VIDEO_DECODE: 1360 u4_error_code = impeg2d_api_entity(ps_dechdl, (void *)pv_api_ip,(void *)pv_api_op); 1361 break; 1362 1363 case IV_CMD_RETRIEVE_MEMREC: 1364 u4_error_code = impeg2d_api_retrieve_mem_rec(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op); 1365 break; 1366 1367 case IVD_CMD_VIDEO_CTL: 1368 u4_error_code = impeg2d_api_ctl(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op); 1369 break; 1370 1371 default: 1372 break; 1373 } 1374 1375 return(u4_error_code); 1376 1377 } 1378 1379 /*****************************************************************************/ 1380 /* */ 1381 /* Function Name : impeg2d_api_num_mem_rec */ 1382 /* */ 1383 /* Description : The function get the number mem records library needs */ 1384 /* Inputs : Error message */ 1385 /* Globals : None */ 1386 /* Processing : Just prints error message to console */ 1387 /* Outputs : Error mesage to the console */ 1388 /* Returns : None */ 1389 /* */ 1390 /* Issues : <List any issues or problems with this function> */ 1391 /* */ 1392 /* Revision History: */ 1393 /* */ 1394 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1395 /* 23 09 2010 Hamsalekha Creation */ 1396 /* */ 1397 /*****************************************************************************/ 1398 1399 1400 IV_API_CALL_STATUS_T impeg2d_api_num_mem_rec(void *pv_api_ip,void *pv_api_op) 1401 { 1402 /* To Query No of Memory Records */ 1403 impeg2d_num_mem_rec_ip_t *ps_query_mem_rec_ip; 1404 impeg2d_num_mem_rec_op_t *ps_query_mem_rec_op; 1405 1406 ps_query_mem_rec_ip = (impeg2d_num_mem_rec_ip_t *)pv_api_ip; 1407 ps_query_mem_rec_op = (impeg2d_num_mem_rec_op_t *)pv_api_op; 1408 1409 UNUSED(ps_query_mem_rec_ip); 1410 ps_query_mem_rec_op->s_ivd_num_mem_rec_op_t.u4_size = sizeof(impeg2d_num_mem_rec_op_t); 1411 1412 ps_query_mem_rec_op->s_ivd_num_mem_rec_op_t.u4_num_mem_rec = (UWORD32)NUM_MEM_RECORDS; 1413 1414 ps_query_mem_rec_op->s_ivd_num_mem_rec_op_t.u4_error_code = IV_SUCCESS; 1415 1416 1417 return(IV_SUCCESS); 1418 1419 } 1420 1421 1422 /*****************************************************************************/ 1423 /* */ 1424 /* Function Name : impeg2d_api_fill_mem_rec */ 1425 /* */ 1426 /* Description : Thsi functions fills details of each mem record lib needs*/ 1427 /* Inputs : Error message */ 1428 /* Globals : None */ 1429 /* Processing : Just prints error message to console */ 1430 /* Outputs : Error mesage to the console */ 1431 /* Returns : None */ 1432 /* */ 1433 /* Issues : <List any issues or problems with this function> */ 1434 /* */ 1435 /* Revision History: */ 1436 /* */ 1437 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1438 /* 23 09 2010 Hamsalekha Creation */ 1439 /* */ 1440 /*****************************************************************************/ 1441 1442 1443 IV_API_CALL_STATUS_T impeg2d_api_fill_mem_rec(void *pv_api_ip,void *pv_api_op) 1444 { 1445 1446 impeg2d_fill_mem_rec_ip_t *ps_mem_q_ip; 1447 impeg2d_fill_mem_rec_op_t *ps_mem_q_op; 1448 1449 1450 ps_mem_q_ip = pv_api_ip; 1451 ps_mem_q_op = pv_api_op; 1452 1453 1454 impeg2d_fill_mem_rec((impeg2d_fill_mem_rec_ip_t *)ps_mem_q_ip, 1455 (impeg2d_fill_mem_rec_op_t *)ps_mem_q_op); 1456 1457 1458 return(IV_SUCCESS); 1459 1460 } 1461 1462 1463 1464 /*****************************************************************************/ 1465 /* */ 1466 /* Function Name : impeg2d_api_init */ 1467 /* */ 1468 /* Description : */ 1469 /* Inputs : */ 1470 /* Globals : */ 1471 /* Processing : */ 1472 /* Outputs : */ 1473 /* Returns : */ 1474 /* */ 1475 /* Issues : */ 1476 /* */ 1477 /* Revision History: */ 1478 /* */ 1479 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1480 /* 17 09 2007 Rajendra C Y Draft */ 1481 /* */ 1482 /*****************************************************************************/ 1483 IV_API_CALL_STATUS_T impeg2d_api_init(iv_obj_t *ps_dechdl, 1484 void *ps_ip, 1485 void *ps_op) 1486 { 1487 UWORD32 i; 1488 1489 void *pv; 1490 UWORD32 u4_size; 1491 1492 dec_state_t *ps_dec_state; 1493 dec_state_multi_core_t *ps_dec_state_multi_core; 1494 UWORD32 u4_num_mem_rec; 1495 iv_mem_rec_t *ps_mem_rec ; 1496 iv_mem_rec_t *ps_frm_buf; 1497 iv_obj_t *ps_dec_handle; 1498 WORD32 i4_max_wd, i4_max_ht; 1499 1500 impeg2d_init_ip_t *ps_dec_init_ip; 1501 impeg2d_init_op_t *ps_dec_init_op; 1502 WORD32 i4_num_threads; 1503 UWORD32 u4_share_disp_buf, u4_chroma_format; 1504 UWORD32 u4_deinterlace; 1505 1506 ps_dec_init_ip = (impeg2d_init_ip_t *)ps_ip; 1507 ps_dec_init_op = (impeg2d_init_op_t *)ps_op; 1508 1509 i4_max_wd = ALIGN16(ps_dec_init_ip->s_ivd_init_ip_t.u4_frm_max_wd); 1510 i4_max_ht = ALIGN16(ps_dec_init_ip->s_ivd_init_ip_t.u4_frm_max_ht); 1511 1512 if(ps_dec_init_ip->s_ivd_init_ip_t.u4_size > offsetof(impeg2d_init_ip_t, u4_share_disp_buf)) 1513 { 1514 #ifndef LOGO_EN 1515 u4_share_disp_buf = ps_dec_init_ip->u4_share_disp_buf; 1516 #else 1517 u4_share_disp_buf = 0; 1518 #endif 1519 } 1520 else 1521 { 1522 u4_share_disp_buf = 0; 1523 } 1524 1525 u4_chroma_format = ps_dec_init_ip->s_ivd_init_ip_t.e_output_format; 1526 1527 if(ps_dec_init_ip->s_ivd_init_ip_t.u4_size > offsetof(impeg2d_init_ip_t, u4_deinterlace)) 1528 { 1529 u4_deinterlace = ps_dec_init_ip->u4_deinterlace; 1530 } 1531 else 1532 { 1533 u4_deinterlace = 0; 1534 } 1535 1536 if( (u4_chroma_format != IV_YUV_420P) && 1537 (u4_chroma_format != IV_YUV_420SP_UV) && 1538 (u4_chroma_format != IV_YUV_420SP_VU)) 1539 { 1540 u4_share_disp_buf = 0; 1541 } 1542 1543 /* Disable deinterlacer in shared mode */ 1544 if(u4_share_disp_buf) 1545 { 1546 u4_deinterlace = 0; 1547 } 1548 1549 ps_mem_rec = ps_dec_init_ip->s_ivd_init_ip_t.pv_mem_rec_location; 1550 ps_mem_rec ++; 1551 1552 1553 ps_dec_init_op->s_ivd_init_op_t.u4_size = sizeof(impeg2d_init_op_t); 1554 1555 1556 /* Except memTab[0], all other memTabs are initialized to zero */ 1557 for(i = 1; i < ps_dec_init_ip->s_ivd_init_ip_t.u4_num_mem_rec; i++) 1558 { 1559 memset(ps_mem_rec->pv_base,0,ps_mem_rec->u4_mem_size); 1560 ps_mem_rec++; 1561 } 1562 1563 /* Reinitializing memTab[0] memory base address */ 1564 ps_mem_rec = ps_dec_init_ip->s_ivd_init_ip_t.pv_mem_rec_location; 1565 1566 1567 /* memTab[0] is for codec Handle,redundant currently not being used */ 1568 ps_dec_handle = ps_mem_rec->pv_base; 1569 u4_num_mem_rec = 1; 1570 ps_mem_rec++; 1571 1572 1573 1574 1575 1576 /* decoder handle */ 1577 ps_dec_state_multi_core = ps_mem_rec->pv_base; 1578 u4_num_mem_rec++; 1579 ps_mem_rec++; 1580 1581 1582 { 1583 ps_dec_handle->pv_codec_handle = (void *)ps_dec_state_multi_core; /* Initializing codec context */ 1584 1585 ps_dechdl->pv_codec_handle = (void *)ps_dec_state_multi_core; 1586 ps_dechdl->pv_fxns = (void *)impeg2d_api_function; 1587 } 1588 1589 1590 for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++) 1591 { 1592 /*************************************************************************/ 1593 /* For MPEG2 Decoder Context */ 1594 /*************************************************************************/ 1595 ps_dec_state = ps_mem_rec->pv_base; 1596 1597 ps_dec_state_multi_core->ps_dec_state[i4_num_threads] = ps_dec_state; 1598 1599 ps_dec_state->ps_dec_state_multi_core = ps_dec_state_multi_core; 1600 1601 ps_dec_state->i4_num_cores = 1; 1602 /* @ */ /* Used for storing MemRecords */ 1603 u4_num_mem_rec++; 1604 ps_mem_rec++; 1605 1606 /* Thread handle */ 1607 ps_dec_state->pv_codec_thread_handle = ps_mem_rec->pv_base; 1608 u4_num_mem_rec++; 1609 ps_mem_rec++; 1610 1611 /*************************************************************************/ 1612 /* For Motion Compensation Buffers */ 1613 /*************************************************************************/ 1614 pv = ps_mem_rec->pv_base; 1615 1616 /* for mc_fw_buf.pu1_y */ 1617 1618 ps_dec_state->s_mc_fw_buf.pu1_y = pv; 1619 pv = (void *)((UWORD8 *)pv + MB_LUMA_MEM_SIZE); 1620 1621 u4_size = sizeof(UWORD8) * MB_LUMA_MEM_SIZE; 1622 /* for mc_fw_buf.pu1_u */ 1623 1624 ps_dec_state->s_mc_fw_buf.pu1_u = pv; 1625 pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE); 1626 1627 u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE; 1628 1629 /* for mc_fw_buf.pu1_v */ 1630 1631 ps_dec_state->s_mc_fw_buf.pu1_v = pv; 1632 pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE); 1633 1634 u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE; 1635 1636 /* for mc_bk_buf.pu1_y */ 1637 1638 ps_dec_state->s_mc_bk_buf.pu1_y = pv; 1639 pv = (void *)((UWORD8 *)pv + MB_LUMA_MEM_SIZE); 1640 1641 u4_size += sizeof(UWORD8) * MB_LUMA_MEM_SIZE; 1642 1643 /* for mc_bk_buf.pu1_u */ 1644 1645 ps_dec_state->s_mc_bk_buf.pu1_u = pv; 1646 pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE); 1647 1648 u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE; 1649 1650 /* for mc_bk_buf.pu1_v */ 1651 1652 ps_dec_state->s_mc_bk_buf.pu1_v = pv; 1653 pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE); 1654 1655 u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE; 1656 1657 /* for mc_buf.pu1_y */ 1658 1659 ps_dec_state->s_mc_buf.pu1_y = pv; 1660 pv = (void *)((UWORD8 *)pv + MB_LUMA_MEM_SIZE); 1661 1662 u4_size += sizeof(UWORD8) * MB_LUMA_MEM_SIZE; 1663 1664 /* for mc_buf.pu1_u */ 1665 1666 ps_dec_state->s_mc_buf.pu1_u = pv; 1667 pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE); 1668 1669 u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE; 1670 1671 /* for mc_buf.pu1_v */ 1672 1673 ps_dec_state->s_mc_buf.pu1_v = pv; 1674 1675 u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE; 1676 1677 u4_num_mem_rec++; 1678 ps_mem_rec++; 1679 1680 1681 1682 ps_dec_state->pv_pic_buf_mg = 0; 1683 1684 /*************************************************************************/ 1685 /* For saving stack context to support global error handling */ 1686 /*************************************************************************/ 1687 ps_dec_state->pv_stack_cntxt = ps_mem_rec->pv_base; 1688 u4_num_mem_rec++; 1689 ps_mem_rec++; 1690 1691 } 1692 1693 1694 1695 1696 1697 /*************************************************************************/ 1698 /* For Picture Buffer Manager */ 1699 /*************************************************************************/ 1700 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 1701 1702 ps_dec_state->pv_pic_buf_mg = ps_mem_rec->pv_base; 1703 ps_dec_state->pv_pic_buf_base = (UWORD8 *)ps_mem_rec->pv_base + sizeof(buf_mgr_t); 1704 1705 u4_num_mem_rec++; 1706 ps_mem_rec++; 1707 1708 1709 1710 for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++) 1711 { 1712 1713 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[i4_num_threads]; 1714 1715 1716 /* --------------------------------------------------------------------- */ 1717 /* Initializations */ 1718 1719 ps_dec_state->u2_header_done = 0; /* Header decoding not done */ 1720 1721 1722 { 1723 UWORD32 u4_max_frm_width,u4_max_frm_height; 1724 1725 u4_max_frm_width = ALIGN16(ps_dec_init_ip->s_ivd_init_ip_t.u4_frm_max_wd); 1726 u4_max_frm_height = ALIGN16(ps_dec_init_ip->s_ivd_init_ip_t.u4_frm_max_ht); 1727 1728 ps_dec_state->u2_create_max_width = u4_max_frm_width; 1729 ps_dec_state->u2_create_max_height = u4_max_frm_height; 1730 1731 ps_dec_state->i4_chromaFormat = ps_dec_init_ip->s_ivd_init_ip_t.e_output_format; 1732 ps_dec_state->u4_frm_buf_stride = 0 ; 1733 ps_dec_state->u2_frame_width = u4_max_frm_width; 1734 ps_dec_state->u2_picture_width = u4_max_frm_width; 1735 ps_dec_state->u2_horizontal_size = u4_max_frm_width; 1736 1737 ps_dec_state->u2_frame_height = u4_max_frm_height; 1738 ps_dec_state->u2_vertical_size = u4_max_frm_height; 1739 ps_dec_state->u4_share_disp_buf = u4_share_disp_buf; 1740 ps_dec_state->u4_deinterlace = u4_deinterlace; 1741 ps_dec_state->ps_deint_pic = NULL; 1742 } 1743 } 1744 1745 1746 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 1747 1748 if((ps_dec_state->i4_chromaFormat == IV_YUV_422ILE) 1749 &&((ps_dec_state->u2_vertical_size & 0x1) != 0)) 1750 { 1751 //printf("Error! Height should be multiple of 2 if Chroma format is 422ILE\n"); 1752 ps_dec_init_op->s_ivd_init_op_t.u4_error_code = IMPEG2D_INIT_CHROMA_FORMAT_HEIGHT_ERROR; 1753 return(IV_FAIL); 1754 1755 1756 } 1757 1758 /* --------------------------------------------------------------------- */ 1759 1760 1761 /* ! */ 1762 // picture buffer manager initialization will be done only for first thread 1763 impeg2_disp_mgr_init(&ps_dec_state->s_disp_mgr); 1764 impeg2_buf_mgr_init((buf_mgr_t *)ps_dec_state->pv_pic_buf_mg); 1765 1766 /*************************************************************************/ 1767 /* Internal Frame Buffers */ 1768 /*************************************************************************/ 1769 1770 1771 /* Set first frame to grey */ 1772 { 1773 ps_frm_buf = ps_mem_rec; 1774 memset(ps_frm_buf->pv_base, 128, ps_frm_buf->u4_mem_size); 1775 ps_frm_buf++; 1776 } 1777 1778 if(0 == ps_dec_state->u4_share_disp_buf) 1779 { 1780 pic_buf_t *ps_pic_buf; 1781 ps_pic_buf = (pic_buf_t *)ps_dec_state->pv_pic_buf_base; 1782 for(i = 0; i < NUM_INT_FRAME_BUFFERS; i++) 1783 { 1784 UWORD8 *pu1_buf; 1785 pu1_buf = ps_mem_rec->pv_base; 1786 1787 ps_pic_buf->pu1_y = pu1_buf; 1788 pu1_buf += i4_max_ht * i4_max_wd; 1789 1790 ps_pic_buf->pu1_u = pu1_buf; 1791 pu1_buf += i4_max_ht * i4_max_wd >> 2; 1792 1793 ps_pic_buf->pu1_v = pu1_buf; 1794 pu1_buf += i4_max_ht * i4_max_wd >> 2; 1795 1796 ps_pic_buf->i4_buf_id = i; 1797 1798 ps_pic_buf->u1_used_as_ref = 0; 1799 1800 ps_pic_buf->u4_ts = 0; 1801 1802 impeg2_buf_mgr_add(ps_dec_state->pv_pic_buf_mg, ps_pic_buf, i); 1803 ps_mem_rec++; 1804 ps_pic_buf++; 1805 } 1806 u4_num_mem_rec += NUM_INT_FRAME_BUFFERS; 1807 } 1808 else if (ps_dec_state->i4_chromaFormat != IV_YUV_420P) 1809 { 1810 for(i = 0; i < NUM_INT_FRAME_BUFFERS; i++) 1811 { 1812 ps_dec_state->pu1_chroma_ref_buf[i] = ps_mem_rec->pv_base; 1813 ps_mem_rec++; 1814 } 1815 1816 u4_num_mem_rec += NUM_INT_FRAME_BUFFERS; 1817 } 1818 else 1819 { 1820 ps_mem_rec+=NUM_INT_FRAME_BUFFERS; 1821 u4_num_mem_rec += NUM_INT_FRAME_BUFFERS; 1822 } 1823 1824 1825 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 1826 1827 1828 ps_dec_state->pv_jobq_buf = ps_mem_rec->pv_base; 1829 ps_dec_state->i4_jobq_buf_size = ps_mem_rec->u4_mem_size; 1830 ps_mem_rec++; 1831 1832 if(u4_num_mem_rec > ps_dec_init_ip->s_ivd_init_ip_t.u4_num_mem_rec) 1833 { 1834 ps_dec_init_op->s_ivd_init_op_t.u4_error_code = IMPEG2D_INIT_NUM_MEM_REC_NOT_SUFFICIENT; 1835 return(IV_FAIL); 1836 1837 } 1838 1839 ps_dec_state->u1_flushfrm = 0; 1840 ps_dec_state->u1_flushcnt = 0; 1841 ps_dec_state->pv_jobq = impeg2_jobq_init(ps_dec_state->pv_jobq_buf, ps_dec_state->i4_jobq_buf_size); 1842 1843 1844 ps_dec_state->pv_deinterlacer_ctxt = ps_mem_rec->pv_base; 1845 ps_mem_rec++; 1846 1847 ps_dec_state->pu1_deint_fmt_buf = ps_mem_rec->pv_base; 1848 ps_mem_rec++; 1849 1850 1851 /*************************************************************************/ 1852 /* Last MemTab is used for storing TabRecords */ 1853 /*************************************************************************/ 1854 ps_dec_state->pv_memTab = (void *)ps_mem_rec->pv_base; 1855 memcpy(ps_mem_rec->pv_base,ps_dec_init_ip->s_ivd_init_ip_t.pv_mem_rec_location, ps_mem_rec->u4_mem_size); 1856 /* Updating in Decoder Context with memRecords */ 1857 u4_num_mem_rec++; 1858 ps_mem_rec++; 1859 ps_dec_state->u4_num_mem_records = u4_num_mem_rec; 1860 1861 1862 ps_dec_state->u4_num_frames_decoded = 0; 1863 ps_dec_state->aps_ref_pics[0] = NULL; 1864 ps_dec_state->aps_ref_pics[1] = NULL; 1865 1866 ps_dec_init_op->s_ivd_init_op_t.u4_error_code = IV_SUCCESS; 1867 1868 impeg2d_init_arch(ps_dec_state); 1869 1870 impeg2d_init_function_ptr(ps_dec_state); 1871 1872 return(IV_SUCCESS); 1873 } 1874 1875 /*****************************************************************************/ 1876 /* */ 1877 /* Function Name : impeg2d_api_retrieve_mem_rec */ 1878 /* */ 1879 /* Description : */ 1880 /* */ 1881 /* Inputs : */ 1882 /* Globals : <Does it use any global variables?> */ 1883 /* Outputs : */ 1884 /* Returns : void */ 1885 /* */ 1886 /* Issues : none */ 1887 /* */ 1888 /* Revision History: */ 1889 /* */ 1890 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1891 /* 22 10 2008 100356 Draft */ 1892 /* */ 1893 /*****************************************************************************/ 1894 IV_API_CALL_STATUS_T impeg2d_api_retrieve_mem_rec(iv_obj_t *ps_dechdl, 1895 void *pv_api_ip, 1896 void *pv_api_op) 1897 { 1898 UWORD32 u4_i; 1899 dec_state_t *ps_dec_state; 1900 dec_state_multi_core_t *ps_dec_state_multi_core; 1901 iv_mem_rec_t *ps_mem_rec; 1902 iv_mem_rec_t *ps_temp_rec; 1903 1904 1905 1906 impeg2d_retrieve_mem_rec_ip_t *ps_retr_mem_rec_ip; 1907 impeg2d_retrieve_mem_rec_op_t *ps_retr_mem_rec_op; 1908 1909 ps_retr_mem_rec_ip = (impeg2d_retrieve_mem_rec_ip_t *)pv_api_ip; 1910 ps_retr_mem_rec_op = (impeg2d_retrieve_mem_rec_op_t *)pv_api_op; 1911 1912 ps_mem_rec = ps_retr_mem_rec_ip->s_ivd_retrieve_mem_rec_ip_t.pv_mem_rec_location; 1913 ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle); 1914 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 1915 ps_temp_rec = ps_dec_state->pv_memTab; 1916 1917 for(u4_i = 0; u4_i < (ps_dec_state->u4_num_mem_records);u4_i++) 1918 { 1919 ps_mem_rec[u4_i].u4_mem_size = ps_temp_rec[u4_i].u4_mem_size; 1920 ps_mem_rec[u4_i].u4_mem_alignment = ps_temp_rec[u4_i].u4_mem_alignment; 1921 ps_mem_rec[u4_i].e_mem_type = ps_temp_rec[u4_i].e_mem_type; 1922 ps_mem_rec[u4_i].pv_base = ps_temp_rec[u4_i].pv_base; 1923 } 1924 1925 ps_retr_mem_rec_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code = IV_SUCCESS; 1926 ps_retr_mem_rec_op->s_ivd_retrieve_mem_rec_op_t.u4_num_mem_rec_filled = ps_dec_state->u4_num_mem_records; 1927 1928 impeg2_jobq_deinit(ps_dec_state->pv_jobq); 1929 IMPEG2D_PRINT_STATISTICS(); 1930 1931 1932 return(IV_SUCCESS); 1933 1934 } 1935 1936 /*****************************************************************************/ 1937 /* */ 1938 /* Function Name : impeg2d_api_ctl */ 1939 /* */ 1940 /* Description : */ 1941 /* */ 1942 /* Inputs : */ 1943 /* Globals : <Does it use any global variables?> */ 1944 /* Outputs : */ 1945 /* Returns : void */ 1946 /* */ 1947 /* Issues : none */ 1948 /* */ 1949 /* Revision History: */ 1950 /* */ 1951 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1952 /* 22 10 2008 100356 Draft */ 1953 /* */ 1954 /*****************************************************************************/ 1955 IV_API_CALL_STATUS_T impeg2d_api_ctl(iv_obj_t *ps_dechdl, 1956 void *pv_api_ip, 1957 void *pv_api_op) 1958 { 1959 WORD32 i4_sub_cmd; 1960 UWORD32 *pu4_api_ip; 1961 IV_API_CALL_STATUS_T u4_error_code; 1962 1963 pu4_api_ip = (UWORD32 *)pv_api_ip; 1964 i4_sub_cmd = *(pu4_api_ip + 2); 1965 1966 switch(i4_sub_cmd) 1967 { 1968 case IVD_CMD_CTL_GETPARAMS: 1969 u4_error_code = impeg2d_api_get_status(ps_dechdl, (void *)pv_api_ip, 1970 (void *)pv_api_op); 1971 break; 1972 1973 case IVD_CMD_CTL_SETPARAMS: 1974 u4_error_code = impeg2d_api_set_params(ps_dechdl, (void *)pv_api_ip, 1975 (void *)pv_api_op); 1976 break; 1977 1978 case IVD_CMD_CTL_RESET: 1979 u4_error_code = impeg2d_api_reset(ps_dechdl, (void *)pv_api_ip, 1980 (void *)pv_api_op); 1981 break; 1982 1983 case IVD_CMD_CTL_SETDEFAULT: 1984 u4_error_code = impeg2d_api_set_default(ps_dechdl, 1985 (void *)pv_api_ip, 1986 (void *)pv_api_op); 1987 break; 1988 1989 case IVD_CMD_CTL_FLUSH: 1990 u4_error_code = impeg2d_api_set_flush_mode(ps_dechdl, 1991 (void *)pv_api_ip, 1992 (void *)pv_api_op); 1993 break; 1994 1995 case IVD_CMD_CTL_GETBUFINFO: 1996 u4_error_code = impeg2d_api_get_buf_info(ps_dechdl, 1997 (void *)pv_api_ip, 1998 (void *)pv_api_op); 1999 break; 2000 2001 case IVD_CMD_CTL_GETVERSION: 2002 u4_error_code = impeg2d_api_get_version(ps_dechdl, (void *)pv_api_ip, 2003 (void *)pv_api_op); 2004 break; 2005 2006 case IMPEG2D_CMD_CTL_SET_NUM_CORES: 2007 u4_error_code = impeg2d_api_set_num_cores(ps_dechdl, 2008 (void *)pv_api_ip, 2009 (void *)pv_api_op); 2010 break; 2011 2012 case IMPEG2D_CMD_CTL_GET_BUFFER_DIMENSIONS: 2013 u4_error_code = impeg2d_get_frame_dimensions(ps_dechdl, 2014 (void *)pv_api_ip, 2015 (void *)pv_api_op); 2016 break; 2017 2018 case IMPEG2D_CMD_CTL_SET_PROCESSOR: 2019 u4_error_code = impeg2d_set_processor(ps_dechdl, (void *)pv_api_ip, 2020 (void *)pv_api_op); 2021 break; 2022 2023 default: 2024 u4_error_code = IV_FAIL; 2025 break; 2026 } 2027 2028 return (u4_error_code); 2029 2030 } 2031 2032 /*****************************************************************************/ 2033 /* */ 2034 /* Function Name : impeg2d_api_check_struct_sanity */ 2035 /* */ 2036 /* Description : */ 2037 /* */ 2038 /* Inputs : */ 2039 /* Globals : <Does it use any global variables?> */ 2040 /* Outputs : */ 2041 /* Returns : void */ 2042 /* */ 2043 /* Issues : none */ 2044 /* */ 2045 /* Revision History: */ 2046 /* */ 2047 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 2048 /* 22 10 2008 100356 Draft */ 2049 /* */ 2050 /*****************************************************************************/ 2051 IV_API_CALL_STATUS_T impeg2d_api_check_struct_sanity(iv_obj_t *ps_handle, 2052 void *pv_api_ip, 2053 void *pv_api_op) 2054 { 2055 WORD32 i4_cmd; 2056 UWORD32 *pu4_api_ip; 2057 UWORD32 *pu4_api_op; 2058 WORD32 i,j; 2059 2060 if(NULL == pv_api_op) 2061 return(IV_FAIL); 2062 2063 if(NULL == pv_api_ip) 2064 return(IV_FAIL); 2065 2066 pu4_api_ip = (UWORD32 *)pv_api_ip; 2067 pu4_api_op = (UWORD32 *)pv_api_op; 2068 i4_cmd = (IVD_API_COMMAND_TYPE_T)*(pu4_api_ip + 1); 2069 2070 /* error checks on handle */ 2071 switch(i4_cmd) 2072 { 2073 case IV_CMD_GET_NUM_MEM_REC: 2074 case IV_CMD_FILL_NUM_MEM_REC: 2075 break; 2076 case IV_CMD_INIT: 2077 if(ps_handle == NULL) 2078 { 2079 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM; 2080 *(pu4_api_op + 1) |= IVD_HANDLE_NULL; 2081 return IV_FAIL; 2082 } 2083 2084 if(ps_handle->u4_size != sizeof(iv_obj_t)) 2085 { 2086 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM; 2087 *(pu4_api_op + 1) |= IVD_HANDLE_STRUCT_SIZE_INCORRECT; 2088 return IV_FAIL; 2089 } 2090 break; 2091 case IVD_CMD_GET_DISPLAY_FRAME: 2092 case IVD_CMD_VIDEO_DECODE: 2093 case IV_CMD_RETRIEVE_MEMREC: 2094 case IVD_CMD_SET_DISPLAY_FRAME: 2095 case IVD_CMD_REL_DISPLAY_FRAME: 2096 case IVD_CMD_VIDEO_CTL: 2097 { 2098 if(ps_handle == NULL) 2099 { 2100 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM; 2101 *(pu4_api_op + 1) |= IVD_HANDLE_NULL; 2102 return IV_FAIL; 2103 } 2104 2105 if(ps_handle->u4_size != sizeof(iv_obj_t)) 2106 { 2107 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM; 2108 *(pu4_api_op + 1) |= IVD_HANDLE_STRUCT_SIZE_INCORRECT; 2109 return IV_FAIL; 2110 } 2111 if(ps_handle->pv_fxns != impeg2d_api_function) 2112 { 2113 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM; 2114 *(pu4_api_op + 1) |= IVD_INVALID_HANDLE_NULL; 2115 return IV_FAIL; 2116 } 2117 2118 if(ps_handle->pv_codec_handle == NULL) 2119 { 2120 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM; 2121 *(pu4_api_op + 1) |= IVD_INVALID_HANDLE_NULL; 2122 return IV_FAIL; 2123 } 2124 } 2125 break; 2126 default: 2127 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM; 2128 *(pu4_api_op + 1) |= IVD_INVALID_API_CMD; 2129 return IV_FAIL; 2130 } 2131 2132 switch(i4_cmd) 2133 { 2134 case IV_CMD_GET_NUM_MEM_REC: 2135 { 2136 impeg2d_num_mem_rec_ip_t *ps_ip = (impeg2d_num_mem_rec_ip_t *)pv_api_ip; 2137 impeg2d_num_mem_rec_op_t *ps_op = (impeg2d_num_mem_rec_op_t *)pv_api_op; 2138 ps_op->s_ivd_num_mem_rec_op_t.u4_error_code = 0; 2139 2140 if(ps_ip->s_ivd_num_mem_rec_ip_t.u4_size != sizeof(impeg2d_num_mem_rec_ip_t)) 2141 { 2142 ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2143 ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2144 return(IV_FAIL); 2145 } 2146 2147 if(ps_op->s_ivd_num_mem_rec_op_t.u4_size != sizeof(impeg2d_num_mem_rec_op_t)) 2148 { 2149 ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2150 ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2151 return(IV_FAIL); 2152 } 2153 } 2154 break; 2155 case IV_CMD_FILL_NUM_MEM_REC: 2156 { 2157 impeg2d_fill_mem_rec_ip_t *ps_ip = (impeg2d_fill_mem_rec_ip_t *)pv_api_ip; 2158 impeg2d_fill_mem_rec_op_t *ps_op = (impeg2d_fill_mem_rec_op_t *)pv_api_op; 2159 iv_mem_rec_t *ps_mem_rec; 2160 2161 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code = 0; 2162 2163 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size != sizeof(impeg2d_fill_mem_rec_ip_t)) 2164 { 2165 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2166 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2167 return(IV_FAIL); 2168 } 2169 2170 if(ps_op->s_ivd_fill_mem_rec_op_t.u4_size != sizeof(impeg2d_fill_mem_rec_op_t)) 2171 { 2172 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2173 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2174 return(IV_FAIL); 2175 } 2176 2177 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd < MIN_WIDTH) 2178 { 2179 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2180 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_REQUESTED_WIDTH_NOT_SUPPPORTED; 2181 return(IV_FAIL); 2182 } 2183 2184 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd > MAX_WIDTH) 2185 { 2186 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2187 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_REQUESTED_WIDTH_NOT_SUPPPORTED; 2188 return(IV_FAIL); 2189 } 2190 2191 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht < MIN_HEIGHT) 2192 { 2193 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2194 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_REQUESTED_HEIGHT_NOT_SUPPPORTED; 2195 return(IV_FAIL); 2196 } 2197 2198 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht > MAX_HEIGHT) 2199 { 2200 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2201 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_REQUESTED_HEIGHT_NOT_SUPPPORTED; 2202 return(IV_FAIL); 2203 } 2204 2205 if(NULL == ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location) 2206 { 2207 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2208 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_NUM_REC_NOT_SUFFICIENT; 2209 return(IV_FAIL); 2210 } 2211 2212 /* check memrecords sizes are correct */ 2213 ps_mem_rec = ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location; 2214 for(i=0;i<NUM_MEM_RECORDS;i++) 2215 { 2216 if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t)) 2217 { 2218 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2219 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_MEM_REC_STRUCT_SIZE_INCORRECT; 2220 return IV_FAIL; 2221 } 2222 } 2223 } 2224 break; 2225 2226 case IV_CMD_INIT: 2227 { 2228 impeg2d_init_ip_t *ps_ip = (impeg2d_init_ip_t *)pv_api_ip; 2229 impeg2d_init_op_t *ps_op = (impeg2d_init_op_t *)pv_api_op; 2230 iv_mem_rec_t *ps_mem_rec; 2231 UWORD32 u4_tot_num_mem_recs; 2232 2233 ps_op->s_ivd_init_op_t.u4_error_code = 0; 2234 2235 if(ps_ip->s_ivd_init_ip_t.u4_size != sizeof(impeg2d_init_ip_t)) 2236 { 2237 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2238 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2239 return(IV_FAIL); 2240 } 2241 2242 if(ps_op->s_ivd_init_op_t.u4_size != sizeof(impeg2d_init_op_t)) 2243 { 2244 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2245 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2246 return(IV_FAIL); 2247 } 2248 2249 u4_tot_num_mem_recs = NUM_MEM_RECORDS; 2250 2251 2252 2253 2254 if(ps_ip->s_ivd_init_ip_t.u4_num_mem_rec > u4_tot_num_mem_recs) 2255 { 2256 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2257 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_NOT_SUFFICIENT; 2258 return(IV_FAIL); 2259 } 2260 2261 if(ps_ip->s_ivd_init_ip_t.u4_frm_max_wd < MIN_WIDTH) 2262 { 2263 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2264 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_WIDTH_NOT_SUPPPORTED; 2265 return(IV_FAIL); 2266 } 2267 2268 if(ps_ip->s_ivd_init_ip_t.u4_frm_max_wd > MAX_WIDTH) 2269 { 2270 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2271 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_WIDTH_NOT_SUPPPORTED; 2272 return(IV_FAIL); 2273 } 2274 2275 if(ps_ip->s_ivd_init_ip_t.u4_frm_max_ht < MIN_HEIGHT) 2276 { 2277 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2278 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_HEIGHT_NOT_SUPPPORTED; 2279 return(IV_FAIL); 2280 } 2281 2282 if(ps_ip->s_ivd_init_ip_t.u4_frm_max_ht > MAX_HEIGHT) 2283 { 2284 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2285 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_HEIGHT_NOT_SUPPPORTED; 2286 return(IV_FAIL); 2287 } 2288 2289 if(NULL == ps_ip->s_ivd_init_ip_t.pv_mem_rec_location) 2290 { 2291 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2292 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_NUM_REC_NOT_SUFFICIENT; 2293 return(IV_FAIL); 2294 } 2295 2296 if((ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420P) && 2297 (ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_422ILE)&&(ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420SP_UV)&&(ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420SP_VU)) 2298 { 2299 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2300 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED; 2301 return(IV_FAIL); 2302 } 2303 2304 /* verify number of mem records */ 2305 if(ps_ip->s_ivd_init_ip_t.u4_num_mem_rec < NUM_MEM_RECORDS) 2306 { 2307 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2308 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_NOT_SUFFICIENT; 2309 return IV_FAIL; 2310 } 2311 2312 ps_mem_rec = ps_ip->s_ivd_init_ip_t.pv_mem_rec_location; 2313 /* verify wether first memrecord is handle or not */ 2314 /* 2315 if(ps_mem_rec->pv_base != ps_handle) 2316 { 2317 // indicate the incorrect handle error 2318 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2319 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INVALID_HANDLE; 2320 return IV_FAIL; 2321 } 2322 */ 2323 /* check memrecords sizes are correct */ 2324 for(i=0;i < (WORD32)ps_ip->s_ivd_init_ip_t.u4_num_mem_rec ; i++) 2325 { 2326 if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t)) 2327 { 2328 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2329 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_MEM_REC_STRUCT_SIZE_INCORRECT; 2330 return IV_FAIL; 2331 } 2332 } 2333 2334 /* verify memtabs for overlapping regions */ 2335 { 2336 UWORD8 *pau1_start[NUM_MEM_RECORDS]; 2337 UWORD8 *pau1_end[NUM_MEM_RECORDS]; 2338 2339 2340 pau1_start[0] = (UWORD8 *)(ps_mem_rec[0].pv_base); 2341 pau1_end[0] = (UWORD8 *)(ps_mem_rec[0].pv_base) + ps_mem_rec[0].u4_mem_size - 1; 2342 for(i = 1; i < (WORD32)ps_ip->s_ivd_init_ip_t.u4_num_mem_rec; i++) 2343 { 2344 /* This array is populated to check memtab overlapp */ 2345 pau1_start[i] = (UWORD8 *)(ps_mem_rec[i].pv_base); 2346 pau1_end[i] = (UWORD8 *)(ps_mem_rec[i].pv_base) + ps_mem_rec[i].u4_mem_size - 1; 2347 2348 for(j = 0; j < i; j++) 2349 { 2350 if((pau1_start[i] >= pau1_start[j]) && (pau1_start[i] <= pau1_end[j])) 2351 { 2352 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2353 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_OVERLAP_ERR; 2354 return IV_FAIL; 2355 } 2356 2357 if((pau1_end[i] >= pau1_start[j]) && (pau1_end[i] <= pau1_end[j])) 2358 { 2359 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2360 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_OVERLAP_ERR; 2361 return IV_FAIL; 2362 } 2363 2364 if((pau1_start[i] < pau1_start[j]) && (pau1_end[i] > pau1_end[j])) 2365 { 2366 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2367 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_OVERLAP_ERR; 2368 return IV_FAIL; 2369 } 2370 } 2371 } 2372 } 2373 2374 2375 2376 2377 { 2378 iv_mem_rec_t as_mem_rec_ittiam_api[NUM_MEM_RECORDS]; 2379 2380 impeg2d_fill_mem_rec_ip_t s_fill_mem_rec_ip; 2381 impeg2d_fill_mem_rec_op_t s_fill_mem_rec_op; 2382 IV_API_CALL_STATUS_T e_status; 2383 WORD32 i4_num_memrec; 2384 { 2385 2386 iv_num_mem_rec_ip_t s_no_of_mem_rec_query_ip; 2387 iv_num_mem_rec_op_t s_no_of_mem_rec_query_op; 2388 2389 2390 s_no_of_mem_rec_query_ip.u4_size = sizeof(iv_num_mem_rec_ip_t); 2391 s_no_of_mem_rec_query_op.u4_size = sizeof(iv_num_mem_rec_op_t); 2392 2393 s_no_of_mem_rec_query_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC; 2394 impeg2d_api_function(NULL, 2395 (void *)&s_no_of_mem_rec_query_ip, 2396 (void *)&s_no_of_mem_rec_query_op); 2397 2398 i4_num_memrec = s_no_of_mem_rec_query_op.u4_num_mem_rec; 2399 2400 2401 2402 } 2403 2404 2405 /* initialize mem records array with sizes */ 2406 for(i = 0; i < i4_num_memrec; i++) 2407 { 2408 as_mem_rec_ittiam_api[i].u4_size = sizeof(iv_mem_rec_t); 2409 } 2410 2411 s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_size = sizeof(impeg2d_fill_mem_rec_ip_t); 2412 s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.e_cmd = IV_CMD_FILL_NUM_MEM_REC; 2413 s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd = ps_ip->s_ivd_init_ip_t.u4_frm_max_wd; 2414 s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht = ps_ip->s_ivd_init_ip_t.u4_frm_max_ht; 2415 s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location = as_mem_rec_ittiam_api; 2416 s_fill_mem_rec_ip.u4_share_disp_buf = ps_ip->u4_share_disp_buf; 2417 s_fill_mem_rec_ip.e_output_format = ps_ip->s_ivd_init_ip_t.e_output_format; 2418 s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_size = sizeof(impeg2d_fill_mem_rec_op_t); 2419 2420 2421 e_status = impeg2d_api_function(NULL, 2422 (void *)&s_fill_mem_rec_ip, 2423 (void *)&s_fill_mem_rec_op); 2424 if(IV_FAIL == e_status) 2425 { 2426 ps_op->s_ivd_init_op_t.u4_error_code = s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_error_code; 2427 return(IV_FAIL); 2428 } 2429 2430 2431 2432 for(i = 0; i < i4_num_memrec; i ++) 2433 { 2434 if(ps_mem_rec[i].pv_base == NULL) 2435 { 2436 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2437 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_BASE_NULL; 2438 return IV_FAIL; 2439 } 2440 #ifdef CHECK_ALIGN 2441 2442 if((UWORD32)(ps_mem_rec[i].pv_base) & (ps_mem_rec[i].u4_mem_alignment - 1)) 2443 { 2444 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2445 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_ALIGNMENT_ERR; 2446 return IV_FAIL; 2447 } 2448 #endif //CHECK_ALIGN 2449 if(ps_mem_rec[i].u4_mem_alignment != as_mem_rec_ittiam_api[i].u4_mem_alignment) 2450 { 2451 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2452 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_ALIGNMENT_ERR; 2453 return IV_FAIL; 2454 } 2455 2456 if(ps_mem_rec[i].u4_mem_size < as_mem_rec_ittiam_api[i].u4_mem_size) 2457 { 2458 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2459 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_INSUFFICIENT_SIZE; 2460 return IV_FAIL; 2461 } 2462 2463 if(ps_mem_rec[i].e_mem_type != as_mem_rec_ittiam_api[i].e_mem_type) 2464 { 2465 if (IV_EXTERNAL_CACHEABLE_SCRATCH_MEM == as_mem_rec_ittiam_api[i].e_mem_type) 2466 { 2467 if (IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM == ps_mem_rec[i].e_mem_type) 2468 { 2469 continue; 2470 } 2471 } 2472 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2473 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_INCORRECT_TYPE; 2474 return IV_FAIL; 2475 } 2476 } 2477 } 2478 2479 2480 } 2481 break; 2482 2483 case IVD_CMD_GET_DISPLAY_FRAME: 2484 { 2485 impeg2d_get_display_frame_ip_t *ps_ip = (impeg2d_get_display_frame_ip_t *)pv_api_ip; 2486 impeg2d_get_display_frame_op_t *ps_op = (impeg2d_get_display_frame_op_t *)pv_api_op; 2487 2488 ps_op->s_ivd_get_display_frame_op_t.u4_error_code = 0; 2489 2490 if(ps_ip->s_ivd_get_display_frame_ip_t.u4_size != sizeof(impeg2d_get_display_frame_ip_t)) 2491 { 2492 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2493 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2494 return(IV_FAIL); 2495 } 2496 2497 if(ps_op->s_ivd_get_display_frame_op_t.u4_size != sizeof(impeg2d_get_display_frame_op_t)) 2498 { 2499 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2500 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2501 return(IV_FAIL); 2502 } 2503 2504 if(ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.u4_num_bufs == 0) 2505 { 2506 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2507 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS; 2508 return IV_FAIL; 2509 } 2510 2511 for(i = 0; i< (WORD32)ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.u4_num_bufs;i++) 2512 { 2513 if(ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.pu1_bufs[i] == NULL) 2514 { 2515 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2516 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_OP_BUF_NULL; 2517 return IV_FAIL; 2518 } 2519 2520 if(ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.u4_min_out_buf_size[i] == 0) 2521 { 2522 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2523 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUF_SIZE; 2524 return IV_FAIL; 2525 } 2526 /* 2527 if(ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.u4_min_out_buf_size[i] == 0) 2528 { 2529 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2530 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUF_SIZE; 2531 return IV_FAIL; 2532 } 2533 */ 2534 } 2535 } 2536 break; 2537 case IVD_CMD_REL_DISPLAY_FRAME: 2538 { 2539 impeg2d_rel_display_frame_ip_t *ps_ip = (impeg2d_rel_display_frame_ip_t *)pv_api_ip; 2540 impeg2d_rel_display_frame_op_t *ps_op = (impeg2d_rel_display_frame_op_t *)pv_api_op; 2541 2542 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code = 0; 2543 2544 if ((ps_ip->s_ivd_rel_display_frame_ip_t.u4_size != sizeof(impeg2d_rel_display_frame_ip_t)) 2545 && (ps_ip->s_ivd_rel_display_frame_ip_t.u4_size != sizeof(ivd_rel_display_frame_ip_t))) 2546 { 2547 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2548 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2549 return(IV_FAIL); 2550 } 2551 2552 if((ps_op->s_ivd_rel_display_frame_op_t.u4_size != sizeof(impeg2d_rel_display_frame_op_t)) && 2553 (ps_op->s_ivd_rel_display_frame_op_t.u4_size != sizeof(ivd_rel_display_frame_op_t))) 2554 { 2555 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2556 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2557 return(IV_FAIL); 2558 } 2559 2560 } 2561 break; 2562 2563 2564 case IVD_CMD_SET_DISPLAY_FRAME: 2565 { 2566 impeg2d_set_display_frame_ip_t *ps_ip = (impeg2d_set_display_frame_ip_t *)pv_api_ip; 2567 impeg2d_set_display_frame_op_t *ps_op = (impeg2d_set_display_frame_op_t *)pv_api_op; 2568 UWORD32 j, i; 2569 2570 ps_op->s_ivd_set_display_frame_op_t.u4_error_code = 0; 2571 2572 if ((ps_ip->s_ivd_set_display_frame_ip_t.u4_size != sizeof(impeg2d_set_display_frame_ip_t)) 2573 && (ps_ip->s_ivd_set_display_frame_ip_t.u4_size != sizeof(ivd_set_display_frame_ip_t))) 2574 { 2575 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2576 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2577 return(IV_FAIL); 2578 } 2579 2580 if((ps_op->s_ivd_set_display_frame_op_t.u4_size != sizeof(impeg2d_set_display_frame_op_t)) && 2581 (ps_op->s_ivd_set_display_frame_op_t.u4_size != sizeof(ivd_set_display_frame_op_t))) 2582 { 2583 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2584 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2585 return(IV_FAIL); 2586 } 2587 2588 if(ps_ip->s_ivd_set_display_frame_ip_t.num_disp_bufs == 0) 2589 { 2590 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2591 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS; 2592 return IV_FAIL; 2593 } 2594 2595 for(j = 0; j < ps_ip->s_ivd_set_display_frame_ip_t.num_disp_bufs; j++) 2596 { 2597 if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_num_bufs == 0) 2598 { 2599 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2600 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS; 2601 return IV_FAIL; 2602 } 2603 2604 for(i=0;i< ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_num_bufs;i++) 2605 { 2606 if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].pu1_bufs[i] == NULL) 2607 { 2608 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2609 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_OP_BUF_NULL; 2610 return IV_FAIL; 2611 } 2612 2613 if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_min_out_buf_size[i] == 0) 2614 { 2615 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2616 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUF_SIZE; 2617 return IV_FAIL; 2618 } 2619 } 2620 } 2621 } 2622 break; 2623 2624 case IVD_CMD_VIDEO_DECODE: 2625 { 2626 impeg2d_video_decode_ip_t *ps_ip = (impeg2d_video_decode_ip_t *)pv_api_ip; 2627 impeg2d_video_decode_op_t *ps_op = (impeg2d_video_decode_op_t *)pv_api_op; 2628 2629 ps_op->s_ivd_video_decode_op_t.u4_error_code = 0; 2630 2631 if(ps_ip->s_ivd_video_decode_ip_t.u4_size != sizeof(impeg2d_video_decode_ip_t)) 2632 { 2633 ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2634 ps_op->s_ivd_video_decode_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2635 return(IV_FAIL); 2636 } 2637 2638 if(ps_op->s_ivd_video_decode_op_t.u4_size != sizeof(impeg2d_video_decode_op_t)) 2639 { 2640 ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2641 ps_op->s_ivd_video_decode_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2642 return(IV_FAIL); 2643 } 2644 2645 } 2646 break; 2647 2648 case IV_CMD_RETRIEVE_MEMREC: 2649 { 2650 impeg2d_retrieve_mem_rec_ip_t *ps_ip = (impeg2d_retrieve_mem_rec_ip_t *)pv_api_ip; 2651 impeg2d_retrieve_mem_rec_op_t *ps_op = (impeg2d_retrieve_mem_rec_op_t *)pv_api_op; 2652 iv_mem_rec_t *ps_mem_rec; 2653 2654 ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code = 0; 2655 2656 if(ps_ip->s_ivd_retrieve_mem_rec_ip_t.u4_size != sizeof(impeg2d_retrieve_mem_rec_ip_t)) 2657 { 2658 ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2659 ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2660 return(IV_FAIL); 2661 } 2662 2663 if(ps_op->s_ivd_retrieve_mem_rec_op_t.u4_size != sizeof(impeg2d_retrieve_mem_rec_op_t)) 2664 { 2665 ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2666 ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2667 return(IV_FAIL); 2668 } 2669 2670 ps_mem_rec = ps_ip->s_ivd_retrieve_mem_rec_ip_t.pv_mem_rec_location; 2671 /* check memrecords sizes are correct */ 2672 for(i=0;i < NUM_MEM_RECORDS ; i++) 2673 { 2674 if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t)) 2675 { 2676 ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2677 ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= IVD_MEM_REC_STRUCT_SIZE_INCORRECT; 2678 return IV_FAIL; 2679 } 2680 } 2681 } 2682 break; 2683 2684 case IVD_CMD_VIDEO_CTL: 2685 { 2686 UWORD32 *pu4_ptr_cmd; 2687 UWORD32 u4_sub_command; 2688 2689 pu4_ptr_cmd = (UWORD32 *)pv_api_ip; 2690 pu4_ptr_cmd += 2; 2691 u4_sub_command = *pu4_ptr_cmd; 2692 2693 switch(u4_sub_command) 2694 { 2695 case IVD_CMD_CTL_SETPARAMS: 2696 { 2697 impeg2d_ctl_set_config_ip_t *ps_ip; 2698 impeg2d_ctl_set_config_op_t *ps_op; 2699 ps_ip = (impeg2d_ctl_set_config_ip_t *)pv_api_ip; 2700 ps_op = (impeg2d_ctl_set_config_op_t *)pv_api_op; 2701 2702 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code = 0; 2703 2704 if(ps_ip->s_ivd_ctl_set_config_ip_t.u4_size != sizeof(impeg2d_ctl_set_config_ip_t)) 2705 { 2706 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2707 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2708 return IV_FAIL; 2709 } 2710 } 2711 case IVD_CMD_CTL_SETDEFAULT: 2712 { 2713 impeg2d_ctl_set_config_op_t *ps_op; 2714 ps_op = (impeg2d_ctl_set_config_op_t *)pv_api_op; 2715 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code = 0; 2716 2717 if(ps_op->s_ivd_ctl_set_config_op_t.u4_size != sizeof(impeg2d_ctl_set_config_op_t)) 2718 { 2719 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2720 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2721 return IV_FAIL; 2722 } 2723 } 2724 break; 2725 2726 case IVD_CMD_CTL_GETPARAMS: 2727 { 2728 impeg2d_ctl_getstatus_ip_t *ps_ip; 2729 impeg2d_ctl_getstatus_op_t *ps_op; 2730 2731 ps_ip = (impeg2d_ctl_getstatus_ip_t *)pv_api_ip; 2732 ps_op = (impeg2d_ctl_getstatus_op_t *)pv_api_op; 2733 2734 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code = 0; 2735 2736 if(ps_ip->s_ivd_ctl_getstatus_ip_t.u4_size != sizeof(impeg2d_ctl_getstatus_ip_t)) 2737 { 2738 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2739 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2740 return IV_FAIL; 2741 } 2742 if(ps_op->s_ivd_ctl_getstatus_op_t.u4_size != sizeof(impeg2d_ctl_getstatus_op_t)) 2743 { 2744 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2745 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2746 return IV_FAIL; 2747 } 2748 } 2749 break; 2750 2751 case IVD_CMD_CTL_GETBUFINFO: 2752 { 2753 impeg2d_ctl_getbufinfo_ip_t *ps_ip; 2754 impeg2d_ctl_getbufinfo_op_t *ps_op; 2755 ps_ip = (impeg2d_ctl_getbufinfo_ip_t *)pv_api_ip; 2756 ps_op = (impeg2d_ctl_getbufinfo_op_t *)pv_api_op; 2757 2758 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code = 0; 2759 2760 if(ps_ip->s_ivd_ctl_getbufinfo_ip_t.u4_size != sizeof(impeg2d_ctl_getbufinfo_ip_t)) 2761 { 2762 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2763 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2764 return IV_FAIL; 2765 } 2766 if(ps_op->s_ivd_ctl_getbufinfo_op_t.u4_size != sizeof(impeg2d_ctl_getbufinfo_op_t)) 2767 { 2768 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2769 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2770 return IV_FAIL; 2771 } 2772 } 2773 break; 2774 2775 case IVD_CMD_CTL_GETVERSION: 2776 { 2777 impeg2d_ctl_getversioninfo_ip_t *ps_ip; 2778 impeg2d_ctl_getversioninfo_op_t *ps_op; 2779 ps_ip = (impeg2d_ctl_getversioninfo_ip_t *)pv_api_ip; 2780 ps_op = (impeg2d_ctl_getversioninfo_op_t *)pv_api_op; 2781 2782 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = 0; 2783 2784 if(ps_ip->s_ivd_ctl_getversioninfo_ip_t.u4_size != sizeof(impeg2d_ctl_getversioninfo_ip_t)) 2785 { 2786 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2787 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2788 return IV_FAIL; 2789 } 2790 if(ps_op->s_ivd_ctl_getversioninfo_op_t.u4_size != sizeof(impeg2d_ctl_getversioninfo_op_t)) 2791 { 2792 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2793 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2794 return IV_FAIL; 2795 } 2796 } 2797 break; 2798 2799 case IVD_CMD_CTL_FLUSH: 2800 { 2801 impeg2d_ctl_flush_ip_t *ps_ip; 2802 impeg2d_ctl_flush_op_t *ps_op; 2803 ps_ip = (impeg2d_ctl_flush_ip_t *)pv_api_ip; 2804 ps_op = (impeg2d_ctl_flush_op_t *)pv_api_op; 2805 2806 ps_op->s_ivd_ctl_flush_op_t.u4_error_code = 0; 2807 2808 if(ps_ip->s_ivd_ctl_flush_ip_t.u4_size != sizeof(impeg2d_ctl_flush_ip_t)) 2809 { 2810 ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2811 ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2812 return IV_FAIL; 2813 } 2814 if(ps_op->s_ivd_ctl_flush_op_t.u4_size != sizeof(impeg2d_ctl_flush_op_t)) 2815 { 2816 ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2817 ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2818 return IV_FAIL; 2819 } 2820 } 2821 break; 2822 2823 case IVD_CMD_CTL_RESET: 2824 { 2825 impeg2d_ctl_reset_ip_t *ps_ip; 2826 impeg2d_ctl_reset_op_t *ps_op; 2827 ps_ip = (impeg2d_ctl_reset_ip_t *)pv_api_ip; 2828 ps_op = (impeg2d_ctl_reset_op_t *)pv_api_op; 2829 2830 ps_op->s_ivd_ctl_reset_op_t.u4_error_code = 0; 2831 2832 if(ps_ip->s_ivd_ctl_reset_ip_t.u4_size != sizeof(impeg2d_ctl_reset_ip_t)) 2833 { 2834 ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2835 ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT; 2836 return IV_FAIL; 2837 } 2838 if(ps_op->s_ivd_ctl_reset_op_t.u4_size != sizeof(impeg2d_ctl_reset_op_t)) 2839 { 2840 ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2841 ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT; 2842 return IV_FAIL; 2843 } 2844 } 2845 break; 2846 2847 case IMPEG2D_CMD_CTL_GET_BUFFER_DIMENSIONS: 2848 { 2849 impeg2d_ctl_get_frame_dimensions_ip_t *ps_ip; 2850 impeg2d_ctl_get_frame_dimensions_op_t *ps_op; 2851 2852 ps_ip = 2853 (impeg2d_ctl_get_frame_dimensions_ip_t *)pv_api_ip; 2854 ps_op = 2855 (impeg2d_ctl_get_frame_dimensions_op_t *)pv_api_op; 2856 2857 if(ps_ip->u4_size 2858 != sizeof(impeg2d_ctl_get_frame_dimensions_ip_t)) 2859 { 2860 ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2861 ps_op->u4_error_code |= 2862 IVD_IP_API_STRUCT_SIZE_INCORRECT; 2863 return IV_FAIL; 2864 } 2865 2866 if(ps_op->u4_size 2867 != sizeof(impeg2d_ctl_get_frame_dimensions_op_t)) 2868 { 2869 ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2870 ps_op->u4_error_code |= 2871 IVD_OP_API_STRUCT_SIZE_INCORRECT; 2872 return IV_FAIL; 2873 } 2874 2875 break; 2876 } 2877 2878 case IMPEG2D_CMD_CTL_SET_NUM_CORES: 2879 { 2880 impeg2d_ctl_set_num_cores_ip_t *ps_ip; 2881 impeg2d_ctl_set_num_cores_op_t *ps_op; 2882 2883 ps_ip = (impeg2d_ctl_set_num_cores_ip_t *)pv_api_ip; 2884 ps_op = (impeg2d_ctl_set_num_cores_op_t *)pv_api_op; 2885 2886 if(ps_ip->u4_size 2887 != sizeof(impeg2d_ctl_set_num_cores_ip_t)) 2888 { 2889 ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2890 ps_op->u4_error_code |= 2891 IVD_IP_API_STRUCT_SIZE_INCORRECT; 2892 return IV_FAIL; 2893 } 2894 2895 if(ps_op->u4_size 2896 != sizeof(impeg2d_ctl_set_num_cores_op_t)) 2897 { 2898 ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2899 ps_op->u4_error_code |= 2900 IVD_OP_API_STRUCT_SIZE_INCORRECT; 2901 return IV_FAIL; 2902 } 2903 2904 #ifdef MULTICORE 2905 if((ps_ip->u4_num_cores < 1) || (ps_ip->u4_num_cores > MAX_THREADS)) 2906 #else 2907 if(ps_ip->u4_num_cores != 1) 2908 #endif 2909 { 2910 ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2911 return IV_FAIL; 2912 } 2913 break; 2914 } 2915 case IMPEG2D_CMD_CTL_SET_PROCESSOR: 2916 { 2917 impeg2d_ctl_set_processor_ip_t *ps_ip; 2918 impeg2d_ctl_set_processor_op_t *ps_op; 2919 2920 ps_ip = (impeg2d_ctl_set_processor_ip_t *)pv_api_ip; 2921 ps_op = (impeg2d_ctl_set_processor_op_t *)pv_api_op; 2922 2923 if(ps_ip->u4_size 2924 != sizeof(impeg2d_ctl_set_processor_ip_t)) 2925 { 2926 ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2927 ps_op->u4_error_code |= 2928 IVD_IP_API_STRUCT_SIZE_INCORRECT; 2929 return IV_FAIL; 2930 } 2931 2932 if(ps_op->u4_size 2933 != sizeof(impeg2d_ctl_set_processor_op_t)) 2934 { 2935 ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 2936 ps_op->u4_error_code |= 2937 IVD_OP_API_STRUCT_SIZE_INCORRECT; 2938 return IV_FAIL; 2939 } 2940 2941 break; 2942 } 2943 default: 2944 break; 2945 2946 } 2947 } 2948 break; 2949 2950 default: 2951 { *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM; 2952 *(pu4_api_op + 1) |= IVD_UNSUPPORTED_API_CMD; 2953 return IV_FAIL; 2954 } 2955 2956 2957 } 2958 2959 return IV_SUCCESS; 2960 } 2961 2962 /*****************************************************************************/ 2963 /* */ 2964 /* Function Name : impeg2d_api_entity */ 2965 /* */ 2966 /* Description : */ 2967 /* */ 2968 /* Inputs : */ 2969 /* Globals : <Does it use any global variables?> */ 2970 /* Outputs : */ 2971 /* Returns : void */ 2972 /* */ 2973 /* Issues : none */ 2974 /* */ 2975 /* Revision History: */ 2976 /* */ 2977 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 2978 /* 22 10 2008 100356 Draft */ 2979 /* */ 2980 /*****************************************************************************/ 2981 2982 2983 IV_API_CALL_STATUS_T impeg2d_api_entity(iv_obj_t *ps_dechdl, 2984 void *pv_api_ip, 2985 void *pv_api_op) 2986 { 2987 iv_obj_t *ps_dec_handle; 2988 dec_state_t *ps_dec_state; 2989 dec_state_multi_core_t *ps_dec_state_multi_core; 2990 2991 impeg2d_video_decode_ip_t *ps_dec_ip; 2992 2993 impeg2d_video_decode_op_t *ps_dec_op; 2994 WORD32 bytes_remaining; 2995 pic_buf_t *ps_disp_pic; 2996 2997 2998 2999 ps_dec_ip = (impeg2d_video_decode_ip_t *)pv_api_ip; 3000 ps_dec_op = (impeg2d_video_decode_op_t *)pv_api_op; 3001 3002 memset(ps_dec_op,0,sizeof(impeg2d_video_decode_op_t)); 3003 3004 ps_dec_op->s_ivd_video_decode_op_t.u4_size = sizeof(impeg2d_video_decode_op_t); 3005 ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0; 3006 bytes_remaining = ps_dec_ip->s_ivd_video_decode_ip_t.u4_num_Bytes; 3007 3008 ps_dec_handle = (iv_obj_t *)ps_dechdl; 3009 3010 if(ps_dechdl == NULL) 3011 { 3012 return(IV_FAIL); 3013 } 3014 3015 3016 3017 ps_dec_state_multi_core = ps_dec_handle->pv_codec_handle; 3018 ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0]; 3019 3020 ps_dec_state->ps_disp_frm_buf = &(ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf); 3021 if(0 == ps_dec_state->u4_share_disp_buf) 3022 { 3023 ps_dec_state->ps_disp_frm_buf->pv_y_buf = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[0]; 3024 ps_dec_state->ps_disp_frm_buf->pv_u_buf = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[1]; 3025 ps_dec_state->ps_disp_frm_buf->pv_v_buf = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[2]; 3026 } 3027 3028 ps_dec_state->ps_disp_pic = NULL; 3029 ps_dec_state->i4_frame_decoded = 0; 3030 /*rest bytes consumed */ 3031 ps_dec_op->s_ivd_video_decode_op_t.u4_num_bytes_consumed = 0; 3032 3033 ps_dec_op->s_ivd_video_decode_op_t.u4_error_code = IV_SUCCESS; 3034 3035 if((ps_dec_ip->s_ivd_video_decode_ip_t.pv_stream_buffer == NULL)&&(ps_dec_state->u1_flushfrm==0)) 3036 { 3037 ps_dec_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; 3038 ps_dec_op->s_ivd_video_decode_op_t.u4_error_code |= IVD_DEC_FRM_BS_BUF_NULL; 3039 return IV_FAIL; 3040 } 3041 3042 3043 if (ps_dec_state->u4_num_frames_decoded > NUM_FRAMES_LIMIT) 3044 { 3045 ps_dec_op->s_ivd_video_decode_op_t.u4_error_code = IMPEG2D_SAMPLE_VERSION_LIMIT_ERR; 3046 return(IV_FAIL); 3047 } 3048 3049 if(((0 == ps_dec_state->u2_header_done) || (ps_dec_state->u2_decode_header == 1)) && (ps_dec_state->u1_flushfrm == 0)) 3050 { 3051 impeg2d_dec_hdr(ps_dec_state,ps_dec_ip ,ps_dec_op); 3052 bytes_remaining -= ps_dec_op->s_ivd_video_decode_op_t.u4_num_bytes_consumed; 3053 } 3054 3055 if((1 != ps_dec_state->u2_decode_header) && ((bytes_remaining > 0) || ps_dec_state->u1_flushfrm)) 3056 { 3057 if(ps_dec_state->u1_flushfrm) 3058 { 3059 if(ps_dec_state->aps_ref_pics[1] != NULL) 3060 { 3061 impeg2_disp_mgr_add(&ps_dec_state->s_disp_mgr, ps_dec_state->aps_ref_pics[1], ps_dec_state->aps_ref_pics[1]->i4_buf_id); 3062 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[1]->i4_buf_id, BUF_MGR_REF); 3063 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF); 3064 3065 ps_dec_state->aps_ref_pics[1] = NULL; 3066 ps_dec_state->aps_ref_pics[0] = NULL; 3067 3068 } 3069 else if(ps_dec_state->aps_ref_pics[0] != NULL) 3070 { 3071 impeg2_disp_mgr_add(&ps_dec_state->s_disp_mgr, ps_dec_state->aps_ref_pics[0], ps_dec_state->aps_ref_pics[0]->i4_buf_id); 3072 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF); 3073 3074 ps_dec_state->aps_ref_pics[0] = NULL; 3075 } 3076 ps_dec_ip->s_ivd_video_decode_ip_t.u4_size = sizeof(impeg2d_video_decode_ip_t); 3077 ps_dec_op->s_ivd_video_decode_op_t.u4_size = sizeof(impeg2d_video_decode_op_t); 3078 3079 ps_disp_pic = impeg2_disp_mgr_get(&ps_dec_state->s_disp_mgr, &ps_dec_state->i4_disp_buf_id); 3080 3081 ps_dec_state->ps_disp_pic = ps_disp_pic; 3082 if(ps_disp_pic == NULL) 3083 { 3084 ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0; 3085 } 3086 else 3087 { 3088 WORD32 fmt_conv; 3089 if(0 == ps_dec_state->u4_share_disp_buf) 3090 { 3091 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_y_buf = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[0]; 3092 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_u_buf = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[1]; 3093 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_v_buf = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[2]; 3094 fmt_conv = 1; 3095 } 3096 else 3097 { 3098 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_y_buf = ps_disp_pic->pu1_y; 3099 if(IV_YUV_420P == ps_dec_state->i4_chromaFormat) 3100 { 3101 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_u_buf = ps_disp_pic->pu1_u; 3102 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_v_buf = ps_disp_pic->pu1_v; 3103 fmt_conv = 0; 3104 } 3105 else 3106 { 3107 UWORD8 *pu1_buf; 3108 3109 pu1_buf = ps_dec_state->as_disp_buffers[ps_disp_pic->i4_buf_id].pu1_bufs[1]; 3110 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_u_buf = pu1_buf; 3111 3112 pu1_buf = ps_dec_state->as_disp_buffers[ps_disp_pic->i4_buf_id].pu1_bufs[2]; 3113 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_v_buf = pu1_buf; 3114 fmt_conv = 1; 3115 } 3116 } 3117 3118 if(fmt_conv == 1) 3119 { 3120 iv_yuv_buf_t *ps_dst; 3121 3122 3123 ps_dst = &(ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf); 3124 if(ps_dec_state->u4_deinterlace && (0 == ps_dec_state->u2_progressive_frame)) 3125 { 3126 impeg2d_deinterlace(ps_dec_state, 3127 ps_disp_pic, 3128 ps_dst, 3129 0, 3130 ps_dec_state->u2_vertical_size); 3131 3132 } 3133 else 3134 { 3135 impeg2d_format_convert(ps_dec_state, 3136 ps_disp_pic, 3137 ps_dst, 3138 0, 3139 ps_dec_state->u2_vertical_size); 3140 } 3141 } 3142 3143 if(ps_dec_state->u4_deinterlace) 3144 { 3145 if(ps_dec_state->ps_deint_pic) 3146 { 3147 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, 3148 ps_dec_state->ps_deint_pic->i4_buf_id, 3149 MPEG2_BUF_MGR_DEINT); 3150 } 3151 ps_dec_state->ps_deint_pic = ps_disp_pic; 3152 } 3153 if(0 == ps_dec_state->u4_share_disp_buf) 3154 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_disp_pic->i4_buf_id, BUF_MGR_DISP); 3155 3156 ps_dec_op->s_ivd_video_decode_op_t.u4_pic_ht = ps_dec_state->u2_vertical_size; 3157 ps_dec_op->s_ivd_video_decode_op_t.u4_pic_wd = ps_dec_state->u2_horizontal_size; 3158 ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 1; 3159 3160 ps_dec_op->s_ivd_video_decode_op_t.u4_disp_buf_id = ps_disp_pic->i4_buf_id; 3161 ps_dec_op->s_ivd_video_decode_op_t.u4_ts = ps_disp_pic->u4_ts; 3162 3163 ps_dec_op->s_ivd_video_decode_op_t.e_output_format = (IV_COLOR_FORMAT_T)ps_dec_state->i4_chromaFormat; 3164 3165 ps_dec_op->s_ivd_video_decode_op_t.u4_is_ref_flag = (B_PIC != ps_dec_state->e_pic_type); 3166 3167 ps_dec_op->s_ivd_video_decode_op_t.u4_progressive_frame_flag = IV_PROGRESSIVE; 3168 3169 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_wd = ps_dec_state->u2_horizontal_size; 3170 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_strd = ps_dec_state->u4_frm_buf_stride; 3171 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_ht = ps_dec_state->u2_vertical_size; 3172 3173 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = ps_dec_state->u2_horizontal_size >> 1; 3174 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_strd = ps_dec_state->u4_frm_buf_stride >> 1; 3175 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_ht = ps_dec_state->u2_vertical_size >> 1; 3176 3177 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_wd = ps_dec_state->u2_horizontal_size >> 1; 3178 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_strd = ps_dec_state->u4_frm_buf_stride >> 1; 3179 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_ht = ps_dec_state->u2_vertical_size >> 1; 3180 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_size = sizeof(ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf); 3181 3182 switch(ps_dec_state->i4_chromaFormat) 3183 { 3184 case IV_YUV_420SP_UV: 3185 case IV_YUV_420SP_VU: 3186 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = ps_dec_state->u2_horizontal_size; 3187 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_strd = ps_dec_state->u4_frm_buf_stride; 3188 break; 3189 case IV_YUV_422ILE: 3190 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = 0; 3191 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_ht = 0; 3192 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_wd = 0; 3193 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_ht = 0; 3194 break; 3195 default: 3196 break; 3197 } 3198 3199 3200 } 3201 if(ps_dec_op->s_ivd_video_decode_op_t.u4_output_present) 3202 { 3203 if(1 == ps_dec_op->s_ivd_video_decode_op_t.u4_output_present) 3204 { 3205 INSERT_LOGO(ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[0], 3206 ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[1], 3207 ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[2], 3208 ps_dec_state->u4_frm_buf_stride, 3209 ps_dec_state->u2_horizontal_size, 3210 ps_dec_state->u2_vertical_size, 3211 ps_dec_state->i4_chromaFormat, 3212 ps_dec_state->u2_horizontal_size, 3213 ps_dec_state->u2_vertical_size); 3214 } 3215 return(IV_SUCCESS); 3216 } 3217 else 3218 { 3219 ps_dec_state->u1_flushfrm = 0; 3220 3221 return(IV_FAIL); 3222 } 3223 3224 } 3225 else if(ps_dec_state->u1_flushfrm==0) 3226 { 3227 ps_dec_ip->s_ivd_video_decode_ip_t.u4_size = sizeof(impeg2d_video_decode_ip_t); 3228 ps_dec_op->s_ivd_video_decode_op_t.u4_size = sizeof(impeg2d_video_decode_op_t); 3229 if(ps_dec_ip->s_ivd_video_decode_ip_t.u4_num_Bytes < 4) 3230 { 3231 ps_dec_op->s_ivd_video_decode_op_t.u4_num_bytes_consumed = ps_dec_ip->s_ivd_video_decode_ip_t.u4_num_Bytes; 3232 return(IV_FAIL); 3233 } 3234 3235 if(1 == ps_dec_state->u4_share_disp_buf) 3236 { 3237 if(0 == impeg2_buf_mgr_check_free(ps_dec_state->pv_pic_buf_mg)) 3238 { 3239 ps_dec_op->s_ivd_video_decode_op_t.u4_error_code = 3240 (IMPEG2D_ERROR_CODES_T)IVD_DEC_REF_BUF_NULL; 3241 return IV_FAIL; 3242 } 3243 } 3244 3245 3246 ps_dec_op->s_ivd_video_decode_op_t.e_output_format = (IV_COLOR_FORMAT_T)ps_dec_state->i4_chromaFormat; 3247 3248 ps_dec_op->s_ivd_video_decode_op_t.u4_is_ref_flag = (B_PIC != ps_dec_state->e_pic_type); 3249 3250 ps_dec_op->s_ivd_video_decode_op_t.u4_progressive_frame_flag = IV_PROGRESSIVE; 3251 3252 if (0 == ps_dec_state->u4_frm_buf_stride) 3253 { 3254 ps_dec_state->u4_frm_buf_stride = (ps_dec_state->u2_horizontal_size); 3255 } 3256 3257 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_wd = ps_dec_state->u2_horizontal_size; 3258 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_strd = ps_dec_state->u4_frm_buf_stride; 3259 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_ht = ps_dec_state->u2_vertical_size; 3260 3261 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = ps_dec_state->u2_horizontal_size >> 1; 3262 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_strd = ps_dec_state->u4_frm_buf_stride >> 1; 3263 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_ht = ps_dec_state->u2_vertical_size >> 1; 3264 3265 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_wd = ps_dec_state->u2_horizontal_size >> 1; 3266 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_strd = ps_dec_state->u4_frm_buf_stride >> 1; 3267 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_ht = ps_dec_state->u2_vertical_size >> 1; 3268 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_size = sizeof(ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf); 3269 3270 switch(ps_dec_state->i4_chromaFormat) 3271 { 3272 case IV_YUV_420SP_UV: 3273 case IV_YUV_420SP_VU: 3274 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = ps_dec_state->u2_horizontal_size; 3275 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_strd = ps_dec_state->u4_frm_buf_stride; 3276 break; 3277 case IV_YUV_422ILE: 3278 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = 0; 3279 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_ht = 0; 3280 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_wd = 0; 3281 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_ht = 0; 3282 break; 3283 default: 3284 break; 3285 } 3286 3287 if( ps_dec_state->u1_flushfrm == 0) 3288 { 3289 ps_dec_state->u1_flushcnt = 0; 3290 3291 /*************************************************************************/ 3292 /* Frame Decode */ 3293 /*************************************************************************/ 3294 3295 impeg2d_dec_frm(ps_dec_state,ps_dec_ip,ps_dec_op); 3296 3297 if (IVD_ERROR_NONE == 3298 ps_dec_op->s_ivd_video_decode_op_t.u4_error_code) 3299 { 3300 if(ps_dec_state->u1_first_frame_done == 0) 3301 { 3302 ps_dec_state->u1_first_frame_done = 1; 3303 } 3304 3305 if(ps_dec_state->ps_disp_pic) 3306 { 3307 ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 1; 3308 switch(ps_dec_state->ps_disp_pic->e_pic_type) 3309 { 3310 case I_PIC : 3311 ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME; 3312 break; 3313 3314 case P_PIC: 3315 ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_P_FRAME; 3316 break; 3317 3318 case B_PIC: 3319 ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_B_FRAME; 3320 break; 3321 3322 case D_PIC: 3323 ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME; 3324 break; 3325 3326 default : 3327 ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_FRAMETYPE_DEFAULT; 3328 break; 3329 } 3330 } 3331 else 3332 { 3333 ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0; 3334 ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_NA_FRAME; 3335 } 3336 3337 ps_dec_state->u4_num_frames_decoded++; 3338 } 3339 } 3340 else 3341 { 3342 ps_dec_state->u1_flushcnt++; 3343 } 3344 } 3345 if(ps_dec_state->ps_disp_pic) 3346 { 3347 ps_dec_op->s_ivd_video_decode_op_t.u4_disp_buf_id = ps_dec_state->ps_disp_pic->i4_buf_id; 3348 ps_dec_op->s_ivd_video_decode_op_t.u4_ts = ps_dec_state->ps_disp_pic->u4_ts; 3349 3350 if(0 == ps_dec_state->u4_share_disp_buf) 3351 { 3352 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->ps_disp_pic->i4_buf_id, BUF_MGR_DISP); 3353 } 3354 } 3355 3356 if(ps_dec_state->u4_deinterlace) 3357 { 3358 if(ps_dec_state->ps_deint_pic) 3359 { 3360 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, 3361 ps_dec_state->ps_deint_pic->i4_buf_id, 3362 MPEG2_BUF_MGR_DEINT); 3363 } 3364 ps_dec_state->ps_deint_pic = ps_dec_state->ps_disp_pic; 3365 } 3366 3367 if(1 == ps_dec_op->s_ivd_video_decode_op_t.u4_output_present) 3368 { 3369 INSERT_LOGO(ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[0], 3370 ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[1], 3371 ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[2], 3372 ps_dec_state->u4_frm_buf_stride, 3373 ps_dec_state->u2_horizontal_size, 3374 ps_dec_state->u2_vertical_size, 3375 ps_dec_state->i4_chromaFormat, 3376 ps_dec_state->u2_horizontal_size, 3377 ps_dec_state->u2_vertical_size); 3378 } 3379 3380 } 3381 3382 ps_dec_op->s_ivd_video_decode_op_t.u4_progressive_frame_flag = 1; 3383 ps_dec_op->s_ivd_video_decode_op_t.e4_fld_type = ps_dec_state->s_disp_op.e4_fld_type; 3384 3385 3386 if(ps_dec_op->s_ivd_video_decode_op_t.u4_error_code) 3387 return IV_FAIL; 3388 else 3389 return IV_SUCCESS; 3390 } 3391