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