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