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