amcodecMy Project
|
codec_ctrl.c
Go to the documentation of this file.
00001 00008 /* Copyright (C) 2007-2011, Amlogic Inc. 00009 * All right reserved 00010 * 00011 */ 00012 #include <stdio.h> 00013 #include <stdio.h> 00014 #include <string.h> 00015 #include <sys/types.h> 00016 #include <sys/stat.h> 00017 #include <sys/poll.h> 00018 #include <errno.h> 00019 #include <sys/ioctl.h> 00020 #include <fcntl.h> 00021 #include <codec_error.h> 00022 #include <codec_type.h> 00023 #include <codec.h> 00024 #include <audio_priv.h> 00025 #include "codec_h_ctrl.h" 00026 #include <adec-external-ctrl.h> 00027 00028 #define SUBTITLE_EVENT 00029 #define TS_PACKET_SIZE 188 00030 #define DEMUX_PLAYER_SOURCE 1 00031 00032 /* --------------------------------------------------------------------------*/ 00041 /* --------------------------------------------------------------------------*/ 00042 static int codec_set_demux_source(codec_para_t *pcodec, int source) 00043 { 00044 int ret = 0; 00045 00046 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_SET_DEMUX, (unsigned long)source); 00047 if (ret < 0) { 00048 return ret; 00049 } 00050 return ret; 00051 } 00052 00053 /* --------------------------------------------------------------------------*/ 00061 /* --------------------------------------------------------------------------*/ 00062 static int codec_change_buf_size(codec_para_t *pcodec) 00063 { 00064 int r; 00065 if (pcodec->abuf_size > 0) { 00066 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_AB_SIZE, pcodec->abuf_size); 00067 if (r < 0) { 00068 return system_error_to_codec_error(r); 00069 } 00070 } 00071 if (pcodec->vbuf_size > 0) { 00072 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_VB_SIZE, pcodec->vbuf_size); 00073 if (r < 0) { 00074 return system_error_to_codec_error(r); 00075 } 00076 } 00077 return CODEC_ERROR_NONE; 00078 } 00079 /* --------------------------------------------------------------------------*/ 00087 /* --------------------------------------------------------------------------*/ 00088 static int set_video_format(codec_para_t *pcodec) 00089 { 00090 int format = pcodec->video_type; 00091 int r; 00092 00093 if (format < 0 || format > VFORMAT_MAX) { 00094 return -CODEC_ERROR_VIDEO_TYPE_UNKNOW; 00095 } 00096 00097 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_VFORMAT, format); 00098 if (pcodec->video_pid >= 0) { 00099 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_VID, pcodec->video_pid); 00100 if (r < 0) { 00101 return system_error_to_codec_error(r); 00102 } 00103 } 00104 if (r < 0) { 00105 return system_error_to_codec_error(r); 00106 } 00107 return 0; 00108 } 00109 00110 /* --------------------------------------------------------------------------*/ 00118 /* --------------------------------------------------------------------------*/ 00119 static int set_video_codec_info(codec_para_t *pcodec) 00120 { 00121 dec_sysinfo_t am_sysinfo = pcodec->am_sysinfo; 00122 int r; 00123 00124 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_SYSINFO, (unsigned long)&am_sysinfo); 00125 if (r < 0) { 00126 return system_error_to_codec_error(r); 00127 } 00128 return 0; 00129 } 00130 /* --------------------------------------------------------------------------*/ 00138 /* --------------------------------------------------------------------------*/ 00139 static int set_audio_format(codec_para_t *pcodec) 00140 { 00141 int format = pcodec->audio_type; 00142 int r; 00143 int codec_r; 00144 00145 if (format < 0 || format > AFORMAT_MAX) { 00146 return -CODEC_ERROR_AUDIO_TYPE_UNKNOW; 00147 } 00148 00149 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_AFORMAT, format); 00150 if (r < 0) { 00151 codec_r = system_error_to_codec_error(r); 00152 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00153 return codec_r; 00154 } 00155 if (pcodec->audio_pid >= 0) { 00156 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_AID, pcodec->audio_pid); 00157 if (r < 0) { 00158 codec_r = system_error_to_codec_error(r); 00159 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00160 return codec_r; 00161 } 00162 } 00163 if (pcodec->audio_samplerate > 0) { 00164 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_SAMPLERATE, pcodec->audio_samplerate); 00165 if (r < 0) { 00166 codec_r = system_error_to_codec_error(r); 00167 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00168 return codec_r; 00169 } 00170 } 00171 if (pcodec->audio_channels > 0) { 00172 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_ACHANNEL, pcodec->audio_channels); 00173 if (r < 0) { 00174 codec_r = system_error_to_codec_error(r); 00175 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00176 return codec_r; 00177 } 00178 } 00179 return 0; 00180 } 00181 00182 /* --------------------------------------------------------------------------*/ 00190 /* --------------------------------------------------------------------------*/ 00191 static int set_audio_info(codec_para_t *pcodec) 00192 { 00193 int r; 00194 int codec_r; 00195 audio_info_t *audio_info = &pcodec->audio_info; 00196 CODEC_PRINT("set_audio_info\n"); 00197 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_AUDIO_INFO, (unsigned long)audio_info); 00198 if (r < 0) { 00199 codec_r = system_error_to_codec_error(r); 00200 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00201 return codec_r; 00202 } 00203 return 0; 00204 } 00205 00206 /* --------------------------------------------------------------------------*/ 00214 /* --------------------------------------------------------------------------*/ 00215 static int set_sub_format(codec_para_t *pcodec) 00216 { 00217 int r; 00218 00219 if (pcodec->sub_pid >= 0) { 00220 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_SID, pcodec->sub_pid); 00221 if (r < 0) { 00222 return system_error_to_codec_error(r); 00223 } 00224 00225 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_SUB_TYPE, pcodec->sub_type); 00226 if (r < 0) { 00227 return system_error_to_codec_error(r); 00228 } 00229 } 00230 00231 return 0; 00232 } 00233 00234 /* --------------------------------------------------------------------------*/ 00242 /* --------------------------------------------------------------------------*/ 00243 static int set_ts_skip_byte(codec_para_t *pcodec) 00244 { 00245 int r, skip_byte; 00246 00247 skip_byte = pcodec->packet_size - TS_PACKET_SIZE; 00248 00249 if (skip_byte < 0) { 00250 skip_byte = 0; 00251 } 00252 00253 r = codec_h_control(pcodec->handle, AMSTREAM_IOC_TS_SKIPBYTE, skip_byte); 00254 if (r < 0) { 00255 return system_error_to_codec_error(r); 00256 } 00257 00258 return 0; 00259 } 00260 00261 /* --------------------------------------------------------------------------*/ 00269 /* --------------------------------------------------------------------------*/ 00270 static inline int codec_video_es_init(codec_para_t *pcodec) 00271 { 00272 CODEC_HANDLE handle; 00273 int r; 00274 int codec_r; 00275 int flags = O_WRONLY; 00276 if (!pcodec->has_video) { 00277 return CODEC_ERROR_NONE; 00278 } 00279 00280 flags |= pcodec->noblock ? O_NONBLOCK : 0; 00281 00282 if (pcodec->video_type == VFORMAT_HEVC) { 00283 handle = codec_h_open(CODEC_VIDEO_HEVC_DEVICE, flags); 00284 } else { 00285 handle = codec_h_open(CODEC_VIDEO_ES_DEVICE, flags); 00286 } 00287 if (handle < 0) { 00288 codec_r = system_error_to_codec_error(handle); 00289 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00290 return CODEC_OPEN_HANDLE_FAILED; 00291 } 00292 pcodec->handle = handle; 00293 r = set_video_format(pcodec); 00294 if (r < 0) { 00295 codec_h_close(handle); 00296 codec_r = system_error_to_codec_error(r); 00297 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00298 return codec_r; 00299 } 00300 r = set_video_codec_info(pcodec); 00301 if (r < 0) { 00302 codec_h_close(handle); 00303 codec_r = system_error_to_codec_error(r); 00304 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00305 return codec_r; 00306 } 00307 return CODEC_ERROR_NONE; 00308 } 00309 00310 00311 /* --------------------------------------------------------------------------*/ 00319 /* --------------------------------------------------------------------------*/ 00320 static inline int codec_audio_es_init(codec_para_t *pcodec) 00321 { 00322 CODEC_HANDLE handle; 00323 int r; 00324 int flags = O_WRONLY; 00325 int codec_r; 00326 if (!pcodec->has_audio) { 00327 return CODEC_ERROR_NONE; 00328 } 00329 00330 flags |= pcodec->noblock ? O_NONBLOCK : 0; 00331 handle = codec_h_open(CODEC_AUDIO_ES_DEVICE, flags); 00332 if (handle < 0) { 00333 codec_r = system_error_to_codec_error(handle); 00334 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00335 return CODEC_OPEN_HANDLE_FAILED; 00336 } 00337 pcodec->handle = handle; 00338 r = set_audio_format(pcodec); 00339 if (r < 0) { 00340 codec_h_close(handle); 00341 codec_r = system_error_to_codec_error(r); 00342 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00343 return codec_r; 00344 } 00345 00346 /*if ((pcodec->audio_type == AFORMAT_ADPCM) || (pcodec->audio_type == AFORMAT_WMAPRO) || (pcodec->audio_type == AFORMAT_WMA) || (pcodec->audio_type == AFORMAT_PCM_S16BE) 00347 || (pcodec->audio_type == AFORMAT_PCM_S16LE) || (pcodec->audio_type == AFORMAT_PCM_U8)||(pcodec->audio_type == AFORMAT_AMR)) {*/ 00348 if(IS_AUIDO_NEED_EXT_INFO(pcodec->audio_type)){ 00349 r = set_audio_info(pcodec); 00350 if (r < 0) { 00351 codec_h_close(handle); 00352 codec_r = system_error_to_codec_error(r); 00353 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00354 return codec_r; 00355 } 00356 } 00357 00358 return CODEC_ERROR_NONE; 00359 } 00360 00361 /* --------------------------------------------------------------------------*/ 00369 /* --------------------------------------------------------------------------*/ 00370 static inline int codec_sub_es_init(codec_para_t *pcodec) 00371 { 00372 #ifdef SUBTITLE_EVENT 00373 int r, codec_r; 00374 00375 if (pcodec->has_sub) { 00376 r = codec_init_sub(pcodec); 00377 if (r < 0) { 00378 codec_r = system_error_to_codec_error(r); 00379 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00380 return CODEC_OPEN_HANDLE_FAILED; 00381 } 00382 pcodec->handle = pcodec->sub_handle; 00383 00384 pcodec->sub_pid = 0xffff; // for es, sub id is identified for es parser 00385 r = set_sub_format(pcodec); 00386 if (r < 0) { 00387 codec_r = system_error_to_codec_error(r); 00388 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00389 return codec_r; 00390 } 00391 00392 } 00393 00394 #endif 00395 00396 return CODEC_ERROR_NONE; 00397 } 00398 00399 /* --------------------------------------------------------------------------*/ 00407 /* --------------------------------------------------------------------------*/ 00408 static inline int codec_ps_init(codec_para_t *pcodec) 00409 { 00410 CODEC_HANDLE handle; 00411 int r; 00412 int flags = O_WRONLY; 00413 int codec_r; 00414 if (!((pcodec->has_video && IS_VALID_PID(pcodec->video_pid)) || 00415 (pcodec->has_audio && IS_VALID_PID(pcodec->audio_pid)))) { 00416 return -CODEC_ERROR_PARAMETER; 00417 } 00418 00419 flags |= pcodec->noblock ? O_NONBLOCK : 0; 00420 handle = codec_h_open(CODEC_PS_DEVICE, flags); 00421 if (handle < 0) { 00422 codec_r = system_error_to_codec_error(handle); 00423 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00424 return CODEC_OPEN_HANDLE_FAILED; 00425 } 00426 pcodec->handle = handle; 00427 if (pcodec->has_video) { 00428 r = set_video_format(pcodec); 00429 if (r < 0) { 00430 goto error1; 00431 } 00432 if ((pcodec->video_type == VFORMAT_H264) 00433 || (pcodec->video_type == VFORMAT_VC1)){ 00434 r = set_video_codec_info(pcodec); 00435 if (r < 0) { 00436 /*codec_h_close(handle); 00437 codec_r = system_error_to_codec_error(r); 00438 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00439 return codec_r; */ 00440 goto error1; 00441 } 00442 } 00443 } 00444 if (pcodec->has_audio) { 00445 r = set_audio_format(pcodec); 00446 if (r < 0) { 00447 goto error1; 00448 } 00449 00450 /*if ((pcodec->audio_type == AFORMAT_ADPCM) || (pcodec->audio_type == AFORMAT_WMA) || (pcodec->audio_type == AFORMAT_WMAPRO) || (pcodec->audio_type == AFORMAT_PCM_S16BE) 00451 || (pcodec->audio_type == AFORMAT_PCM_S16LE) || (pcodec->audio_type == AFORMAT_PCM_U8) 00452 || (pcodec->audio_type == AFORMAT_PCM_BLURAY)||(pcodec->audio_type == AFORMAT_AMR)) {*/ 00453 if(IS_AUIDO_NEED_EXT_INFO(pcodec->audio_type)){ 00454 r = set_audio_info(pcodec); 00455 if (r < 0) { 00456 goto error1; 00457 } 00458 } 00459 } 00460 #ifdef SUBTITLE_EVENT 00461 if (pcodec->has_sub) { 00462 r = set_sub_format(pcodec); 00463 if (r < 0) { 00464 goto error1; 00465 } 00466 00467 r = codec_init_sub(pcodec); 00468 if (r < 0) { 00469 goto error1; 00470 } 00471 } 00472 #endif 00473 00474 return CODEC_ERROR_NONE; 00475 error1: 00476 codec_h_close(handle); 00477 codec_r = system_error_to_codec_error(r); 00478 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00479 return codec_r; 00480 00481 } 00482 00483 00484 /* --------------------------------------------------------------------------*/ 00492 /* --------------------------------------------------------------------------*/ 00493 static inline int codec_ts_init(codec_para_t *pcodec) 00494 { 00495 CODEC_HANDLE handle; 00496 int r; 00497 int flags = O_WRONLY; 00498 int codec_r; 00499 if (!((pcodec->has_video && IS_VALID_PID(pcodec->video_pid)) || 00500 (pcodec->has_audio && IS_VALID_PID(pcodec->audio_pid)))) { 00501 return -CODEC_ERROR_PARAMETER; 00502 } 00503 00504 flags |= pcodec->noblock ? O_NONBLOCK : 0; 00505 handle = codec_h_open(CODEC_TS_DEVICE, flags); 00506 if (handle < 0) { 00507 codec_r = system_error_to_codec_error(handle); 00508 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00509 return CODEC_OPEN_HANDLE_FAILED; 00510 } 00511 pcodec->handle = handle; 00512 codec_set_demux_source(pcodec, DEMUX_PLAYER_SOURCE); 00513 if (pcodec->has_video) { 00514 r = set_video_format(pcodec); 00515 if (r < 0) { 00516 goto error1; 00517 } 00518 if ((pcodec->video_type == VFORMAT_H264) || (pcodec->video_type == VFORMAT_MPEG4)|| (pcodec->video_type == VFORMAT_VC1)|| (pcodec->video_type == VFORMAT_AVS)|| (pcodec->video_type == VFORMAT_MPEG12)) { 00519 r = set_video_codec_info(pcodec); 00520 if (r < 0) { 00521 codec_h_close(handle); 00522 codec_r = system_error_to_codec_error(r); 00523 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00524 return codec_r; 00525 } 00526 } 00527 } 00528 if (pcodec->has_audio) { 00529 r = set_audio_format(pcodec); 00530 if (r < 0) { 00531 goto error1; 00532 } 00533 00534 /*if ((pcodec->audio_type == AFORMAT_ADPCM) || (pcodec->audio_type == AFORMAT_WMA) || (pcodec->audio_type == AFORMAT_WMAPRO) || (pcodec->audio_type == AFORMAT_PCM_S16BE) 00535 || (pcodec->audio_type == AFORMAT_PCM_S16LE) || (pcodec->audio_type == AFORMAT_PCM_U8) 00536 || (pcodec->audio_type == AFORMAT_PCM_BLURAY)||(pcodec->audio_type == AFORMAT_AMR))*/ 00537 if(pcodec->audio_info.valid){ 00538 r = set_audio_info(pcodec); 00539 if (r < 0) { 00540 goto error1; 00541 } 00542 } 00543 } 00544 00545 r = set_ts_skip_byte(pcodec); 00546 if (r < 0) { 00547 goto error1; 00548 } 00549 00550 #ifdef SUBTITLE_EVENT 00551 if (pcodec->has_sub) { 00552 r = set_sub_format(pcodec); 00553 if (r < 0) { 00554 goto error1; 00555 } 00556 00557 r = codec_init_sub(pcodec); 00558 if (r < 0) { 00559 goto error1; 00560 } 00561 } 00562 #endif 00563 return CODEC_ERROR_NONE; 00564 error1: 00565 codec_h_close(handle); 00566 codec_r = system_error_to_codec_error(r); 00567 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00568 return codec_r; 00569 00570 } 00571 00572 /* --------------------------------------------------------------------------*/ 00580 /* --------------------------------------------------------------------------*/ 00581 static inline int codec_rm_init(codec_para_t *pcodec) 00582 { 00583 CODEC_HANDLE handle; 00584 int r; 00585 int flags = O_WRONLY; 00586 int codec_r; 00587 if (!((pcodec->has_video && IS_VALID_PID(pcodec->video_pid)) || 00588 (pcodec->has_audio && IS_VALID_PID(pcodec->audio_pid)))) { 00589 CODEC_PRINT("codec_rm_init failed! video=%d vpid=%d audio=%d apid=%d\n", pcodec->has_video, pcodec->video_pid, pcodec->has_audio, pcodec->audio_pid); 00590 return -CODEC_ERROR_PARAMETER; 00591 } 00592 flags |= pcodec->noblock ? O_NONBLOCK : 0; 00593 handle = codec_h_open(CODEC_RM_DEVICE, flags); 00594 if (handle < 0) { 00595 codec_r = system_error_to_codec_error(handle); 00596 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00597 return CODEC_OPEN_HANDLE_FAILED; 00598 } 00599 00600 pcodec->handle = handle; 00601 if (pcodec->has_video) { 00602 r = set_video_format(pcodec); 00603 if (r < 0) { 00604 goto error1; 00605 } 00606 00607 r = set_video_codec_info(pcodec); 00608 if (r < 0) { 00609 goto error1; 00610 } 00611 } 00612 if (pcodec->has_audio) { 00613 r = set_audio_format(pcodec); 00614 if (r < 0) { 00615 goto error1; 00616 } 00617 r = set_audio_info(pcodec); 00618 if (r < 0) { 00619 goto error1; 00620 } 00621 } 00622 return CODEC_ERROR_NONE; 00623 00624 error1: 00625 codec_h_close(handle); 00626 codec_r = system_error_to_codec_error(r); 00627 print_error_msg(codec_r, errno, __FUNCTION__, __LINE__); 00628 return codec_r; 00629 } 00630 00631 /* --------------------------------------------------------------------------*/ 00639 /* --------------------------------------------------------------------------*/ 00640 int codec_init(codec_para_t *pcodec) 00641 { 00642 int ret; 00643 //if(pcodec->has_audio) 00644 // audio_stop(); 00645 pcodec->handle = -1; 00646 pcodec->cntl_handle = -1; 00647 pcodec->sub_handle = -1; 00648 pcodec->audio_utils_handle = -1; 00649 if(pcodec->audio_type==AFORMAT_MPEG1 || pcodec->audio_type==AFORMAT_MPEG2) 00650 pcodec->audio_type=AFORMAT_MPEG; 00651 switch (pcodec->stream_type) { 00652 case STREAM_TYPE_ES_VIDEO: 00653 ret = codec_video_es_init(pcodec); 00654 break; 00655 case STREAM_TYPE_ES_AUDIO: 00656 ret = codec_audio_es_init(pcodec); 00657 break; 00658 case STREAM_TYPE_ES_SUB: 00659 ret = codec_sub_es_init(pcodec); 00660 break; 00661 case STREAM_TYPE_PS: 00662 ret = codec_ps_init(pcodec); 00663 break; 00664 case STREAM_TYPE_TS: 00665 ret = codec_ts_init(pcodec); 00666 break; 00667 case STREAM_TYPE_RM: 00668 ret = codec_rm_init(pcodec); 00669 break; 00670 case STREAM_TYPE_UNKNOW: 00671 default: 00672 return -CODEC_ERROR_STREAM_TYPE_UNKNOW; 00673 } 00674 if (ret != 0) { 00675 return ret; 00676 } 00677 ret = codec_init_cntl(pcodec); 00678 if (ret != CODEC_ERROR_NONE) { 00679 return ret; 00680 } 00681 ret = codec_change_buf_size(pcodec); 00682 if (ret != 0) { 00683 return -CODEC_ERROR_SET_BUFSIZE_FAILED; 00684 } 00685 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_PORT_INIT, 0); 00686 if (ret != 0) { 00687 00688 return -CODEC_ERROR_INIT_FAILED; 00689 } 00690 if (pcodec->has_audio) { 00691 arm_audio_info a_ainfo; 00692 memset(&a_ainfo,0,sizeof(arm_audio_info)); 00693 a_ainfo.channels=pcodec->audio_channels; 00694 a_ainfo.sample_rate=pcodec->audio_samplerate; 00695 a_ainfo.format=pcodec->audio_type; 00696 a_ainfo.handle=pcodec->handle; 00697 a_ainfo.SessionID=pcodec->SessionID; 00698 a_ainfo.dspdec_not_supported = pcodec->dspdec_not_supported; 00699 a_ainfo.droppcm_flag = 0; 00700 a_ainfo.bitrate =pcodec->audio_info.bitrate; 00701 a_ainfo.block_align=pcodec->audio_info.block_align; 00702 a_ainfo.codec_id =pcodec->audio_info.codec_id; 00703 a_ainfo.automute =pcodec->automute_flag; 00704 if(IS_AUIDO_NEED_EXT_INFO(pcodec->audio_type)) 00705 { 00706 if(pcodec->audio_type!=AFORMAT_WMA && pcodec->audio_type!=AFORMAT_WMAPRO) 00707 { 00708 a_ainfo.extradata_size=pcodec->audio_info.extradata_size; 00709 if(a_ainfo.extradata_size>0&&a_ainfo.extradata_size<=AUDIO_EXTRA_DATA_SIZE) 00710 memcpy((char*)a_ainfo.extradata,pcodec->audio_info.extradata,a_ainfo.extradata_size); 00711 else 00712 a_ainfo.extradata_size=0; 00713 }else{ 00714 Asf_audio_info_t asfinfo={0}; 00715 asfinfo.bitrate =pcodec->audio_info.bitrate; 00716 asfinfo.block_align=pcodec->audio_info.block_align; 00717 asfinfo.channels =pcodec->audio_info.channels; 00718 asfinfo.codec_id =pcodec->audio_info.codec_id; 00719 asfinfo.sample_rate=pcodec->audio_info.sample_rate; 00720 asfinfo.valid =pcodec->audio_info.valid; 00721 if(pcodec->audio_info.extradata_size<=512){ 00722 memcpy(asfinfo.extradata,pcodec->audio_info.extradata,pcodec->audio_info.extradata_size); 00723 asfinfo.extradata_size=pcodec->audio_info.extradata_size; 00724 } 00725 memcpy((char*)a_ainfo.extradata,&asfinfo,sizeof(Asf_audio_info_t)); 00726 a_ainfo.extradata_size=sizeof(Asf_audio_info_t); 00727 } 00728 } 00729 audio_start(&pcodec->adec_priv, &a_ainfo); 00730 if(pcodec->avsync_threshold > 0) 00731 audio_set_avsync_threshold(pcodec->adec_priv, pcodec->avsync_threshold); 00732 } 00733 return ret; 00734 } 00735 00736 void codec_audio_basic_init(void) 00737 { 00738 audio_basic_init(); 00739 } 00740 00741 /* --------------------------------------------------------------------------*/ 00751 /* --------------------------------------------------------------------------*/ 00752 int codec_write(codec_para_t *pcodec, void *buffer, int len) 00753 { 00754 return codec_h_write(pcodec->handle, buffer, len); 00755 } 00756 00757 /* --------------------------------------------------------------------------*/ 00767 /* --------------------------------------------------------------------------*/ 00768 int codec_read(codec_para_t *pcodec, void *buffer, int len) 00769 { 00770 return codec_h_read(pcodec->handle, buffer, len); 00771 } 00772 00773 /* --------------------------------------------------------------------------*/ 00781 /* --------------------------------------------------------------------------*/ 00782 int codec_close(codec_para_t *pcodec) 00783 { 00784 int res = 0; 00785 00786 if (pcodec->has_audio) { 00787 audio_stop(&pcodec->adec_priv); 00788 CODEC_PRINT("[%s]audio stop OK!\n", __FUNCTION__); 00789 } 00790 #ifdef SUBTITLE_EVENT 00791 if (pcodec->has_sub && pcodec->sub_handle >= 0) { 00792 res |= codec_close_sub_fd(pcodec->sub_handle); 00793 } 00794 #endif 00795 00796 res |= codec_close_cntl(pcodec); 00797 res |= codec_h_close(pcodec->handle); 00798 return res; 00799 } 00800 00801 /* --------------------------------------------------------------------------*/ 00807 /* --------------------------------------------------------------------------*/ 00808 void codec_close_audio(codec_para_t *pcodec) 00809 { 00810 if (pcodec) { 00811 pcodec->has_audio = 0; 00812 } 00813 audio_stop(&pcodec->adec_priv); 00814 return; 00815 } 00816 00817 /* --------------------------------------------------------------------------*/ 00823 /* --------------------------------------------------------------------------*/ 00824 void codec_close_audio_async(codec_para_t *pcodec) 00825 { 00826 if(pcodec) 00827 audio_stop_async(&pcodec->adec_priv); 00828 return; 00829 } 00830 00831 /* --------------------------------------------------------------------------*/ 00838 /* --------------------------------------------------------------------------*/ 00839 void codec_resume_audio(codec_para_t *pcodec, unsigned int orig) 00840 { 00841 pcodec->has_audio = orig; 00842 if (pcodec->has_audio) { 00843 arm_audio_info a_ainfo; 00844 memset(&a_ainfo,0,sizeof(arm_audio_info)); 00845 a_ainfo.channels=pcodec->audio_channels; 00846 a_ainfo.sample_rate=pcodec->audio_samplerate; 00847 a_ainfo.format=pcodec->audio_type; 00848 a_ainfo.handle=pcodec->handle; 00849 a_ainfo.dspdec_not_supported = pcodec->dspdec_not_supported; 00850 a_ainfo.bitrate =pcodec->audio_info.bitrate; 00851 a_ainfo.block_align=pcodec->audio_info.block_align; 00852 a_ainfo.codec_id =pcodec->audio_info.codec_id; 00853 a_ainfo.automute =pcodec->automute_flag; 00854 if (pcodec->switch_audio_flag) { 00855 a_ainfo.droppcm_flag = pcodec->switch_audio_flag; 00856 if(pcodec->stream_type == STREAM_TYPE_TS || pcodec->stream_type == STREAM_TYPE_PS) 00857 a_ainfo.droppcm_flag = 0; 00858 pcodec->switch_audio_flag = 0; 00859 } 00860 if(IS_AUIDO_NEED_EXT_INFO(pcodec->audio_type)) 00861 { 00862 if(pcodec->audio_type!=AFORMAT_WMA && pcodec->audio_type!=AFORMAT_WMAPRO) 00863 { 00864 a_ainfo.extradata_size=pcodec->audio_info.extradata_size; 00865 if(a_ainfo.extradata_size>0&&a_ainfo.extradata_size<=AUDIO_EXTRA_DATA_SIZE) 00866 memcpy((char*)a_ainfo.extradata,pcodec->audio_info.extradata,a_ainfo.extradata_size); 00867 else 00868 a_ainfo.extradata_size=0; 00869 }else{ 00870 Asf_audio_info_t asfinfo={0}; 00871 asfinfo.bitrate =pcodec->audio_info.bitrate; 00872 asfinfo.block_align=pcodec->audio_info.block_align; 00873 asfinfo.channels =pcodec->audio_info.channels; 00874 asfinfo.codec_id =pcodec->audio_info.codec_id; 00875 asfinfo.sample_rate=pcodec->audio_info.sample_rate; 00876 asfinfo.valid =pcodec->audio_info.valid; 00877 if(pcodec->audio_info.extradata_size<=512){ 00878 memcpy(asfinfo.extradata,pcodec->audio_info.extradata,pcodec->audio_info.extradata_size); 00879 asfinfo.extradata_size=pcodec->audio_info.extradata_size; 00880 } 00881 memcpy((char*)a_ainfo.extradata,&asfinfo,sizeof(Asf_audio_info_t)); 00882 a_ainfo.extradata_size=sizeof(Asf_audio_info_t); 00883 } 00884 } 00885 audio_start(&pcodec->adec_priv, &a_ainfo); 00886 } 00887 return; 00888 } 00889 00890 /* --------------------------------------------------------------------------*/ 00899 /* --------------------------------------------------------------------------*/ 00900 int codec_checkin_pts(codec_para_t *pcodec, unsigned long pts) 00901 { 00902 //CODEC_PRINT("[%s:%d]pts=%x(%d)\n",__FUNCTION__,__LINE__,pts,pts/90000); 00903 return codec_h_control(pcodec->handle, AMSTREAM_IOC_TSTAMP, pts); 00904 } 00905 00906 /* --------------------------------------------------------------------------*/ 00915 /* --------------------------------------------------------------------------*/ 00916 int codec_get_vbuf_state(codec_para_t *p, struct buf_status *buf) 00917 { 00918 int r; 00919 struct am_io_param am_io; 00920 r = codec_h_control(p->handle, AMSTREAM_IOC_VB_STATUS, (unsigned long)&am_io); 00921 memcpy(buf, &am_io.status, sizeof(*buf)); 00922 return system_error_to_codec_error(r); 00923 } 00924 /* --------------------------------------------------------------------------*/ 00933 /* --------------------------------------------------------------------------*/ 00934 int codec_get_abuf_state(codec_para_t *p, struct buf_status *buf) 00935 { 00936 int r; 00937 struct am_io_param am_io; 00938 r = codec_h_control(p->handle, AMSTREAM_IOC_AB_STATUS, (unsigned long)&am_io); 00939 memcpy(buf, &am_io.status, sizeof(*buf)); 00940 return system_error_to_codec_error(r); 00941 } 00942 00943 /* --------------------------------------------------------------------------*/ 00952 /* --------------------------------------------------------------------------*/ 00953 int codec_get_vdec_state(codec_para_t *p, struct vdec_status *vdec) 00954 { 00955 int r; 00956 struct am_io_param am_io; 00957 r = codec_h_control(p->handle, AMSTREAM_IOC_VDECSTAT, (unsigned long)&am_io); 00958 if (r < 0) { 00959 CODEC_PRINT("[codec_get_vdec_state]error[%d]: %s\n", r, codec_error_msg(system_error_to_codec_error(r))); 00960 } 00961 memcpy(vdec, &am_io.vstatus, sizeof(*vdec)); 00962 return system_error_to_codec_error(r); 00963 } 00964 00965 /* --------------------------------------------------------------------------*/ 00974 /* --------------------------------------------------------------------------*/ 00975 int codec_get_adec_state(codec_para_t *p, struct adec_status *adec) 00976 { 00977 if(get_audio_decoder() ==AUDIO_ARM_DECODER) 00978 return get_decoder_status(p->adec_priv,adec); 00979 int r; 00980 struct am_io_param am_io; 00981 r = codec_h_control(p->handle, AMSTREAM_IOC_ADECSTAT, (unsigned long)&am_io); 00982 if(r == 0){ 00983 memcpy(adec, &am_io.astatus, sizeof(*adec)); 00984 } 00985 return system_error_to_codec_error(r); 00986 } 00987 00988 /* --------------------------------------------------------------------------*/ 00996 /* --------------------------------------------------------------------------*/ 00997 static int video_pause(codec_para_t *p) 00998 { 00999 CODEC_PRINT("video_pause!\n"); 01000 return codec_h_control(p->cntl_handle, AMSTREAM_IOC_VPAUSE, 1); 01001 } 01002 01003 /* --------------------------------------------------------------------------*/ 01011 /* --------------------------------------------------------------------------*/ 01012 static int video_resume(codec_para_t *p) 01013 { 01014 CODEC_PRINT("video_resume!\n"); 01015 return codec_h_control(p->cntl_handle, AMSTREAM_IOC_VPAUSE, 0); 01016 } 01017 01018 /* --------------------------------------------------------------------------*/ 01026 /* --------------------------------------------------------------------------*/ 01027 int codec_pause(codec_para_t *p) 01028 { 01029 int ret = CODEC_ERROR_NONE; 01030 if (p) { 01031 CODEC_PRINT("[codec_pause]p->has_audio=%d\n", p->has_audio); 01032 if(p->has_audio) { 01033 audio_pause(p->adec_priv); 01034 } 01035 if(p->has_video){ 01036 ret = video_pause(p); 01037 } 01038 } else { 01039 ret = CODEC_ERROR_PARAMETER; 01040 } 01041 return ret; 01042 } 01043 /* --------------------------------------------------------------------------*/ 01051 /* --------------------------------------------------------------------------*/ 01052 int codec_resume(codec_para_t *p) 01053 { 01054 int ret = CODEC_ERROR_NONE; 01055 if (p) { 01056 CODEC_PRINT("[codec_resume]p->has_audio=%d\n", p->has_audio); 01057 if(p->has_audio){ 01058 audio_resume(p->adec_priv); 01059 } 01060 if(p->has_video){ 01061 ret = video_resume(p); 01062 } 01063 } else { 01064 ret = CODEC_ERROR_PARAMETER; 01065 } 01066 return ret; 01067 } 01068 01069 /* --------------------------------------------------------------------------*/ 01077 /* --------------------------------------------------------------------------*/ 01078 int codec_reset(codec_para_t *p) 01079 { 01080 int ret; 01081 ret = codec_close(p); 01082 if (ret != 0) { 01083 return ret; 01084 } 01085 ret = codec_init(p); 01086 CODEC_PRINT("[%s:%d]ret=%x\n", __FUNCTION__, __LINE__, ret); 01087 return system_error_to_codec_error(ret); 01088 } 01089 01090 /* --------------------------------------------------------------------------*/ 01098 /* --------------------------------------------------------------------------*/ 01099 int codec_init_sub(codec_para_t *pcodec) 01100 { 01101 CODEC_HANDLE sub_handle; 01102 int flags = O_WRONLY; 01103 flags |= pcodec->noblock ? O_NONBLOCK : 0; 01104 sub_handle = codec_h_open(CODEC_SUB_DEVICE, flags); 01105 if (sub_handle < 0) { 01106 CODEC_PRINT("get %s failed\n", CODEC_SUB_DEVICE); 01107 return system_error_to_codec_error(sub_handle); 01108 } 01109 01110 pcodec->sub_handle = sub_handle; 01111 return CODEC_ERROR_NONE; 01112 } 01113 01114 /* --------------------------------------------------------------------------*/ 01120 /* --------------------------------------------------------------------------*/ 01121 int codec_open_sub_read(void) 01122 { 01123 CODEC_HANDLE sub_handle; 01124 01125 sub_handle = codec_h_open_rd(CODEC_SUB_READ_DEVICE); 01126 if (sub_handle < 0) { 01127 CODEC_PRINT("get %s failed\n", CODEC_SUB_READ_DEVICE); 01128 return system_error_to_codec_error(sub_handle); 01129 } 01130 01131 return sub_handle; 01132 } 01133 01134 /* --------------------------------------------------------------------------*/ 01142 /* --------------------------------------------------------------------------*/ 01143 int codec_close_sub(codec_para_t *pcodec) 01144 { 01145 int res = CODEC_ERROR_NONE; 01146 01147 if (pcodec) { 01148 if (pcodec->sub_handle) { 01149 res = codec_h_close(pcodec->sub_handle); 01150 } 01151 } 01152 return res; 01153 } 01154 01155 /* --------------------------------------------------------------------------*/ 01163 /* --------------------------------------------------------------------------*/ 01164 int codec_close_sub_fd(CODEC_HANDLE sub_fd) 01165 { 01166 int res = CODEC_ERROR_NONE; 01167 01168 if (sub_fd) { 01169 res = codec_h_close(sub_fd); 01170 } 01171 return res; 01172 } 01173 01174 /* --------------------------------------------------------------------------*/ 01182 /* --------------------------------------------------------------------------*/ 01183 int codec_poll_sub(codec_para_t *pcodec) 01184 { 01185 struct pollfd sub_poll_fd[1]; 01186 01187 if (pcodec->sub_handle == 0) { 01188 return 0; 01189 } 01190 01191 sub_poll_fd[0].fd = pcodec->sub_handle; 01192 sub_poll_fd[0].events = POLLOUT; 01193 01194 return poll(sub_poll_fd, 1, 10); 01195 } 01196 01197 /* --------------------------------------------------------------------------*/ 01206 /* --------------------------------------------------------------------------*/ 01207 int codec_poll_sub_fd(CODEC_HANDLE sub_fd, int timeout) 01208 { 01209 struct pollfd sub_poll_fd[1]; 01210 01211 if (sub_fd <= 0) { 01212 return 0; 01213 } 01214 01215 sub_poll_fd[0].fd = sub_fd; 01216 sub_poll_fd[0].events = POLLOUT; 01217 01218 return poll(sub_poll_fd, 1, timeout); 01219 } 01220 01221 /* --------------------------------------------------------------------------*/ 01229 /* --------------------------------------------------------------------------*/ 01230 int codec_get_sub_size(codec_para_t *pcodec) 01231 { 01232 int sub_size, r; 01233 01234 if (pcodec->sub_handle == 0) { 01235 CODEC_PRINT("no control handler\n"); 01236 return 0; 01237 } 01238 01239 r = codec_h_control(pcodec->sub_handle, AMSTREAM_IOC_SUB_LENGTH, (unsigned long)&sub_size); 01240 if (r < 0) { 01241 return system_error_to_codec_error(r); 01242 } else { 01243 return sub_size; 01244 } 01245 } 01246 01247 /* --------------------------------------------------------------------------*/ 01255 /* --------------------------------------------------------------------------*/ 01256 int codec_get_sub_size_fd(CODEC_HANDLE sub_fd) 01257 { 01258 int sub_size, r; 01259 01260 if (sub_fd <= 0) { 01261 CODEC_PRINT("no sub handler\n"); 01262 return 0; 01263 } 01264 01265 r = codec_h_control(sub_fd, AMSTREAM_IOC_SUB_LENGTH, (unsigned long)&sub_size); 01266 if (r < 0) { 01267 return system_error_to_codec_error(r); 01268 } else { 01269 return sub_size; 01270 } 01271 } 01272 01273 /* --------------------------------------------------------------------------*/ 01283 /* --------------------------------------------------------------------------*/ 01284 int codec_read_sub_data(codec_para_t *pcodec, char *buf, unsigned int length) 01285 { 01286 int data_size = length, r, read_done = 0; 01287 01288 if (pcodec->sub_handle == 0) { 01289 CODEC_PRINT("no control handler\n"); 01290 return 0; 01291 } 01292 01293 while (data_size) { 01294 r = codec_h_read(pcodec->sub_handle, buf + read_done, data_size); 01295 if (r < 0) { 01296 return system_error_to_codec_error(r); 01297 } else { 01298 data_size -= r; 01299 read_done += r; 01300 } 01301 } 01302 01303 return 0; 01304 } 01305 01306 /* --------------------------------------------------------------------------*/ 01316 /* --------------------------------------------------------------------------*/ 01317 int codec_read_sub_data_fd(CODEC_HANDLE sub_fd, char *buf, unsigned int length) 01318 { 01319 int data_size = length, r, read_done = 0; 01320 01321 if (sub_fd <= 0) { 01322 CODEC_PRINT("no sub handler\n"); 01323 return 0; 01324 } 01325 01326 while (data_size) { 01327 r = codec_h_read(sub_fd, buf + read_done, data_size); 01328 if (r < 0) { 01329 return system_error_to_codec_error(r); 01330 } else { 01331 data_size -= r; 01332 read_done += r; 01333 } 01334 } 01335 01336 return 0; 01337 } 01338 01339 /* --------------------------------------------------------------------------*/ 01349 /* --------------------------------------------------------------------------*/ 01350 int codec_write_sub_data(codec_para_t *pcodec, char *buf, unsigned int length) 01351 { 01352 if (pcodec->sub_handle == 0) { 01353 CODEC_PRINT("no control handler\n"); 01354 return 0; 01355 } 01356 01357 return codec_h_write(pcodec->sub_handle, buf, length); 01358 } 01359 01360 /* --------------------------------------------------------------------------*/ 01368 /* --------------------------------------------------------------------------*/ 01369 int codec_init_cntl(codec_para_t *pcodec) 01370 { 01371 CODEC_HANDLE cntl; 01372 01373 01374 cntl = codec_h_open(CODEC_CNTL_DEVICE, O_RDWR); 01375 if (cntl < 0) { 01376 CODEC_PRINT("get %s failed\n", CODEC_CNTL_DEVICE); 01377 return system_error_to_codec_error(cntl); 01378 } 01379 01380 pcodec->cntl_handle = cntl; 01381 01382 return CODEC_ERROR_NONE; 01383 } 01384 01385 /* --------------------------------------------------------------------------*/ 01393 /* --------------------------------------------------------------------------*/ 01394 int codec_close_cntl(codec_para_t *pcodec) 01395 { 01396 int res = CODEC_ERROR_NONE; 01397 01398 if (pcodec) { 01399 if (pcodec->cntl_handle) { 01400 res = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_CLEAR_VIDEO, 0); 01401 res = codec_h_close(pcodec->cntl_handle); 01402 } 01403 } 01404 return res; 01405 } 01406 01407 /* --------------------------------------------------------------------------*/ 01415 /* --------------------------------------------------------------------------*/ 01416 int codec_poll_cntl(codec_para_t *pcodec) 01417 { 01418 struct pollfd codec_poll_fd[1]; 01419 01420 if (pcodec->cntl_handle == 0) { 01421 return 0; 01422 } 01423 01424 codec_poll_fd[0].fd = pcodec->cntl_handle; 01425 codec_poll_fd[0].events = POLLOUT; 01426 01427 return poll(codec_poll_fd, 1, 10); 01428 } 01429 01430 /* --------------------------------------------------------------------------*/ 01438 /* --------------------------------------------------------------------------*/ 01439 int codec_get_cntl_state(codec_para_t *pcodec) 01440 { 01441 int cntl_state, r; 01442 01443 if (pcodec->cntl_handle == 0) { 01444 CODEC_PRINT("no control handler\n"); 01445 return 0; 01446 } 01447 01448 r = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_TRICK_STAT, (unsigned long)&cntl_state); 01449 if (r < 0) { 01450 return system_error_to_codec_error(r); 01451 } else { 01452 return cntl_state; 01453 } 01454 } 01455 01456 /* --------------------------------------------------------------------------*/ 01465 /* --------------------------------------------------------------------------*/ 01466 int codec_set_cntl_mode(codec_para_t *pcodec, unsigned int mode) 01467 { 01468 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_TRICKMODE, (unsigned long)mode); 01469 } 01470 01471 int codec_set_mode(codec_para_t *pcodec, unsigned int mode) 01472 { 01473 return codec_h_control(pcodec->handle, AMSTREAM_IOC_TRICKMODE, (unsigned long)mode); 01474 } 01475 /* --------------------------------------------------------------------------*/ 01484 /* --------------------------------------------------------------------------*/ 01485 int codec_set_cntl_avthresh(codec_para_t *pcodec, unsigned int avthresh) 01486 { 01487 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_AVTHRESH, (unsigned long)avthresh); 01488 } 01489 01490 /* --------------------------------------------------------------------------*/ 01500 /* --------------------------------------------------------------------------*/ 01501 int codec_set_cntl_syncthresh(codec_para_t *pcodec, unsigned int syncthresh) 01502 { 01503 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_SYNCTHRESH, (unsigned long)syncthresh); 01504 } 01505 01506 /* --------------------------------------------------------------------------*/ 01514 /* --------------------------------------------------------------------------*/ 01515 int codec_reset_audio(codec_para_t *pcodec) 01516 { 01517 return codec_h_control(pcodec->handle, AMSTREAM_IOC_AUDIO_RESET, 0); 01518 } 01519 01520 /* --------------------------------------------------------------------------*/ 01528 /* --------------------------------------------------------------------------*/ 01529 int codec_reset_subtile(codec_para_t *pcodec) 01530 { 01531 return codec_h_control(pcodec->handle, AMSTREAM_IOC_SUB_RESET, 0); 01532 } 01533 01534 /* --------------------------------------------------------------------------*/ 01542 /* --------------------------------------------------------------------------*/ 01543 int codec_set_audio_pid(codec_para_t *pcodec) 01544 { 01545 return codec_h_control(pcodec->handle, AMSTREAM_IOC_AID, pcodec->audio_pid); 01546 } 01547 01548 /* --------------------------------------------------------------------------*/ 01556 /* --------------------------------------------------------------------------*/ 01557 int codec_set_sub_id(codec_para_t *pcodec) 01558 { 01559 return codec_h_control(pcodec->handle, AMSTREAM_IOC_SID, pcodec->sub_pid); 01560 } 01561 01562 /* --------------------------------------------------------------------------*/ 01570 /* --------------------------------------------------------------------------*/ 01571 int codec_set_sub_type(codec_para_t *pcodec) 01572 { 01573 return codec_h_control(pcodec->handle, AMSTREAM_IOC_SUB_TYPE, pcodec->sub_type); 01574 } 01575 01576 /* --------------------------------------------------------------------------*/ 01584 /* --------------------------------------------------------------------------*/ 01585 int codec_audio_reinit(codec_para_t *pcodec) 01586 { 01587 int ret; 01588 ret = set_audio_format(pcodec); 01589 if(!ret && pcodec->audio_info.valid){ 01590 ret = set_audio_info(pcodec); 01591 } 01592 return ret; 01593 } 01594 01595 /* --------------------------------------------------------------------------*/ 01603 /* --------------------------------------------------------------------------*/ 01604 int codec_set_dec_reset(codec_para_t *pcodec) 01605 { 01606 return codec_h_control(pcodec->handle, AMSTREAM_IOC_SET_DEC_RESET, 0); 01607 } 01608 01609 /* --------------------------------------------------------------------------*/ 01617 /* --------------------------------------------------------------------------*/ 01618 int codec_audio_isready(codec_para_t *p) 01619 { 01620 int audio_isready = 1; 01621 if (!p) { 01622 CODEC_PRINT("[%s]ERROR invalid pointer!\n", __FUNCTION__); 01623 return -1; 01624 } 01625 if (p->has_audio) { 01626 audio_isready = audio_dec_ready(p->adec_priv); 01627 } 01628 01629 return audio_isready; 01630 } 01631 01632 /* --------------------------------------------------------------------------*/ 01640 /* --------------------------------------------------------------------------*/ 01641 int codec_audio_get_nb_frames(codec_para_t *p) 01642 { 01643 int audio_nb_frames = -1; 01644 if (!p) { 01645 CODEC_PRINT("[%s]ERROR invalid pointer!\n", __FUNCTION__); 01646 return -1; 01647 } 01648 01649 if (p->has_audio) { 01650 audio_nb_frames = audio_get_decoded_nb_frames(p->adec_priv); 01651 } 01652 //CODEC_PRINT("[%s]get audio decoded frame number[%d]!\n", __FUNCTION__, audio_nb_frames); 01653 return audio_nb_frames; 01654 } 01655 01656 /* --------------------------------------------------------------------------*/ 01664 /* --------------------------------------------------------------------------*/ 01665 int codec_get_apts(codec_para_t *pcodec) 01666 { 01667 unsigned int apts; 01668 int ret; 01669 01670 if (!pcodec) { 01671 CODEC_PRINT("[%s]ERROR invalid pointer!\n", __FUNCTION__); 01672 return -1; 01673 } 01674 01675 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_APTS, (unsigned long)&apts); 01676 if (ret < 0) { 01677 CODEC_PRINT("[%s]ioctl failed %d\n", __FUNCTION__, ret); 01678 return -1; 01679 } 01680 01681 return apts; 01682 } 01683 01684 /* --------------------------------------------------------------------------*/ 01692 /* --------------------------------------------------------------------------*/ 01693 int codec_get_vpts(codec_para_t *pcodec) 01694 { 01695 unsigned int vpts; 01696 int ret; 01697 01698 if (!pcodec) { 01699 CODEC_PRINT("[%s]ERROR invalid pointer!\n", __FUNCTION__); 01700 return -1; 01701 } 01702 01703 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_VPTS, (unsigned long)&vpts); 01704 if (ret < 0) { 01705 CODEC_PRINT("[%s]ioctl failed %d\n", __FUNCTION__, ret); 01706 return -1; 01707 } 01708 01709 return vpts; 01710 } 01711 01712 /* --------------------------------------------------------------------------*/ 01720 /* --------------------------------------------------------------------------*/ 01721 int codec_get_pcrscr(codec_para_t *pcodec) 01722 { 01723 unsigned int pcrscr; 01724 int ret; 01725 01726 if (!pcodec) { 01727 CODEC_PRINT("[%s]ERROR invalid pointer!\n", __FUNCTION__); 01728 return -1; 01729 } 01730 01731 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_PCRSCR, (unsigned long)&pcrscr); 01732 if (ret < 0) { 01733 CODEC_PRINT("[%s]ioctl failed %d\n", __FUNCTION__, ret); 01734 return -1; 01735 } 01736 01737 return pcrscr; 01738 } 01739 01740 /* --------------------------------------------------------------------------*/ 01749 /* --------------------------------------------------------------------------*/ 01750 int codec_set_pcrscr(codec_para_t *pcodec, int val) 01751 { 01752 unsigned int pcrscr; 01753 int ret; 01754 01755 if (!pcodec) { 01756 CODEC_PRINT("[%s]ERROR invalid pointer!\n", __FUNCTION__); 01757 return -1; 01758 } 01759 01760 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_SET_PCRSCR, val); 01761 if (ret < 0) { 01762 CODEC_PRINT("[%s]ioctl failed %d\n", __FUNCTION__, ret); 01763 return -1; 01764 } 01765 01766 return 0; 01767 } 01768 01769 /* --------------------------------------------------------------------------*/ 01778 /* --------------------------------------------------------------------------*/ 01779 int codec_set_syncenable(codec_para_t *pcodec, int enable) 01780 { 01781 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_SYNCENABLE, (unsigned long)enable); 01782 } 01783 01784 /* --------------------------------------------------------------------------*/ 01793 /* --------------------------------------------------------------------------*/ 01794 int codec_set_sync_audio_discont(codec_para_t *pcodec, int discontinue) 01795 { 01796 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_SET_SYNC_ADISCON, (unsigned long)discontinue); 01797 } 01798 01799 /* --------------------------------------------------------------------------*/ 01808 /* --------------------------------------------------------------------------*/ 01809 int codec_set_sync_video_discont(codec_para_t *pcodec, int discontinue) 01810 { 01811 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_SET_SYNC_VDISCON, (unsigned long)discontinue); 01812 } 01813 01814 /* --------------------------------------------------------------------------*/ 01822 /* --------------------------------------------------------------------------*/ 01823 int codec_get_sync_audio_discont(codec_para_t *pcodec) 01824 { 01825 int discontinue = 0; 01826 int ret; 01827 01828 ret = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_GET_SYNC_ADISCON, (unsigned long)&discontinue); 01829 if (ret < 0) { 01830 return ret; 01831 } 01832 return discontinue; 01833 } 01834 01835 /* --------------------------------------------------------------------------*/ 01843 /* --------------------------------------------------------------------------*/ 01844 int codec_get_sync_video_discont(codec_para_t *pcodec) 01845 { 01846 int discontinue = 0; 01847 int ret; 01848 01849 ret = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_GET_SYNC_VDISCON, (unsigned long)&discontinue); 01850 if (ret < 0) { 01851 return ret; 01852 } 01853 return discontinue; 01854 } 01855 01856 /* --------------------------------------------------------------------------*/ 01864 /* --------------------------------------------------------------------------*/ 01865 unsigned long codec_get_sync_audio_discont_diff(codec_para_t *pcodec) 01866 { 01867 unsigned long discontinue_diff = 0; 01868 int ret; 01869 01870 ret = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_GET_SYNC_ADISCON_DIFF, (unsigned long)&discontinue_diff); 01871 if (ret < 0) { 01872 return ret; 01873 } 01874 return discontinue_diff; 01875 } 01876 01877 /* --------------------------------------------------------------------------*/ 01885 /* --------------------------------------------------------------------------*/ 01886 unsigned long codec_get_sync_video_discont_diff(codec_para_t *pcodec) 01887 { 01888 unsigned long discontinue_diff = 0; 01889 int ret; 01890 01891 ret = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_GET_SYNC_VDISCON_DIFF, (unsigned long)&discontinue_diff); 01892 if (ret < 0) { 01893 return ret; 01894 } 01895 return discontinue_diff; 01896 } 01897 01898 /* --------------------------------------------------------------------------*/ 01907 /* --------------------------------------------------------------------------*/ 01908 int codec_set_sync_audio_discont_diff(codec_para_t *pcodec, unsigned long discontinue_diff) 01909 { 01910 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_SET_SYNC_ADISCON_DIFF, discontinue_diff); 01911 } 01912 01913 /* --------------------------------------------------------------------------*/ 01922 /* --------------------------------------------------------------------------*/ 01923 int codec_set_sync_video_discont_diff(codec_para_t *pcodec, unsigned long discontinue_diff) 01924 { 01925 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_SET_SYNC_VDISCON_DIFF, discontinue_diff); 01926 } 01927 01928 /* --------------------------------------------------------------------------*/ 01936 /* --------------------------------------------------------------------------*/ 01937 int codec_get_sub_num(codec_para_t *pcodec) 01938 { 01939 int sub_num = 0; 01940 int ret; 01941 01942 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_SUB_NUM, (unsigned long)&sub_num); 01943 if (ret < 0) { 01944 return ret; 01945 } 01946 return sub_num; 01947 } 01948 01949 /* --------------------------------------------------------------------------*/ 01958 /* --------------------------------------------------------------------------*/ 01959 int codec_get_sub_info(codec_para_t *pcodec, subtitle_info_t *sub_info) 01960 { 01961 int ret = 0; 01962 int i; 01963 if (!sub_info) { 01964 CODEC_PRINT("[codec_get_sub_info] error, NULL pointer!\n"); 01965 ret = CODEC_ERROR_INVAL; 01966 return ret; 01967 } 01968 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_SUB_INFO, (unsigned long)sub_info); 01969 if (ret < 0) { 01970 return ret; 01971 } 01972 return ret; 01973 } 01974 01975 /******************************************************************************** 01976 * 01977 *the interface for av sync threshold setting 01978 * 01979 *********************************************************************************/ 01980 int codec_set_av_threshold(codec_para_t *pcodec, int threshold) 01981 { 01982 int ret = 0; 01983 if (pcodec->has_audio) 01984 { 01985 audio_set_av_sync_threshold(pcodec->adec_priv, threshold); 01986 } 01987 else 01988 { 01989 CODEC_PRINT("[codec_set_av_threshold] error, no audio!\n"); 01990 ret = -1; 01991 } 01992 01993 return ret; 01994 } 01995 01996 /* --------------------------------------------------------------------------*/ 02004 /* --------------------------------------------------------------------------*/ 02005 int codec_get_freerun_mode(codec_para_t *pcodec) 02006 { 02007 int freerun_mode, r; 02008 02009 if (pcodec->cntl_handle == 0) { 02010 CODEC_PRINT("no control handler\n"); 02011 return 0; 02012 } 02013 02014 r = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_GET_FREERUN_MODE, (unsigned long)&freerun_mode); 02015 if (r < 0) { 02016 return system_error_to_codec_error(r); 02017 } else { 02018 return freerun_mode; 02019 } 02020 } 02021 02022 /* --------------------------------------------------------------------------*/ 02031 /* --------------------------------------------------------------------------*/ 02032 int codec_set_freerun_mode(codec_para_t *pcodec, unsigned int mode) 02033 { 02034 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_SET_FREERUN_MODE, (unsigned long)mode); 02035 } 02036 02037 /* --------------------------------------------------------------------------*/ 02045 /* --------------------------------------------------------------------------*/ 02046 int codec_init_audio_utils(codec_para_t *pcodec) 02047 { 02048 CODEC_HANDLE audio_utils; 02049 02050 audio_utils = codec_h_open(CODEC_AUDIO_UTILS_DEVICE, O_RDONLY); 02051 if (audio_utils < 0) { 02052 CODEC_PRINT("get %s failed\n", CODEC_AUDIO_UTILS_DEVICE); 02053 return system_error_to_codec_error(audio_utils); 02054 } 02055 02056 pcodec->audio_utils_handle = audio_utils; 02057 02058 return CODEC_ERROR_NONE; 02059 } 02060 02061 /* --------------------------------------------------------------------------*/ 02069 /* --------------------------------------------------------------------------*/ 02070 int codec_release_audio_utils(codec_para_t *pcodec) 02071 { 02072 if (pcodec) { 02073 if(pcodec->audio_utils_handle>=0) 02074 codec_h_close(pcodec->audio_utils_handle); 02075 } 02076 02077 pcodec->audio_utils_handle = -1; 02078 02079 return CODEC_ERROR_NONE; 02080 } 02081 02082 /* --------------------------------------------------------------------------*/ 02090 /* --------------------------------------------------------------------------*/ 02091 int codec_set_audio_resample_ena(codec_para_t *pcodec, unsigned long mode) 02092 { 02093 return codec_h_control(pcodec->audio_utils_handle, AMAUDIO_IOC_SET_RESAMPLE_ENA, mode); 02094 } 02095 02096 /* --------------------------------------------------------------------------*/ 02104 /* --------------------------------------------------------------------------*/ 02105 int codec_get_audio_resample_ena(codec_para_t *pcodec) 02106 { 02107 unsigned long audio_resample_ena; 02108 int ret; 02109 ret = codec_h_control(pcodec->audio_utils_handle, AMAUDIO_IOC_GET_RESAMPLE_ENA, &audio_resample_ena); 02110 if (ret < 0) { 02111 return system_error_to_codec_error(ret); 02112 } else { 02113 return audio_resample_ena; 02114 } 02115 } 02116 02117 /* --------------------------------------------------------------------------*/ 02125 /* --------------------------------------------------------------------------*/ 02126 int codec_set_audio_resample_type(codec_para_t *pcodec, unsigned long type) 02127 { 02128 return codec_h_control(pcodec->audio_utils_handle, AMAUDIO_IOC_SET_RESAMPLE_TYPE, type); 02129 } 02130 02131 /* --------------------------------------------------------------------------*/ 02139 /* --------------------------------------------------------------------------*/ 02140 int codec_set_video_delay_limited_ms(codec_para_t *pcodec,int delay_ms) 02141 { 02142 return codec_h_control(pcodec->handle, AMSTREAM_IOC_SET_VIDEO_DELAY_LIMIT_MS, delay_ms); 02143 } 02144 /* --------------------------------------------------------------------------*/ 02152 /* --------------------------------------------------------------------------*/ 02153 int codec_get_video_delay_limited_ms(codec_para_t *pcodec,int *delay_ms) 02154 { 02155 return codec_h_control(pcodec->handle, AMSTREAM_IOC_GET_VIDEO_DELAY_LIMIT_MS, delay_ms); 02156 } 02157 02158 02159 /* --------------------------------------------------------------------------*/ 02167 /* --------------------------------------------------------------------------*/ 02168 int codec_set_audio_delay_limited_ms(codec_para_t *pcodec,int delay_ms) 02169 { 02170 return codec_h_control(pcodec->handle, AMSTREAM_IOC_SET_AUDIO_DELAY_LIMIT_MS, delay_ms); 02171 } 02172 02173 /* --------------------------------------------------------------------------*/ 02181 /* --------------------------------------------------------------------------*/ 02182 int codec_get_audio_delay_limited_ms(codec_para_t *pcodec,int *delay_ms) 02183 { 02184 return codec_h_control(pcodec->handle, AMSTREAM_IOC_GET_AUDIO_DELAY_LIMIT_MS, delay_ms); 02185 } 02186 02187 /* --------------------------------------------------------------------------*/ 02195 /* --------------------------------------------------------------------------*/ 02196 int codec_get_audio_cur_delay_ms(codec_para_t *pcodec,int *delay_ms) 02197 { 02198 int abuf_delay = 0; 02199 int adec_delay = 0; 02200 int ret = 0; 02201 ret = codec_h_control(pcodec->handle, AMSTREAM_IOC_GET_AUDIO_CUR_DELAY_MS, &abuf_delay); 02202 if(ret < 0){ 02203 CODEC_PRINT("[%s]ioctl failed %d\n", __FUNCTION__, ret); 02204 return -1; 02205 } 02206 if (pcodec->has_audio) { 02207 adec_delay = audio_get_decoded_pcm_delay(pcodec->adec_priv); 02208 if(adec_delay < 0) 02209 adec_delay = 0; 02210 } 02211 *delay_ms = abuf_delay+adec_delay; 02212 return ret; 02213 } 02214 02215 02216 02217 /* --------------------------------------------------------------------------*/ 02225 /* --------------------------------------------------------------------------*/ 02226 int codec_get_video_cur_delay_ms(codec_para_t *pcodec,int *delay_ms) 02227 { 02228 return codec_h_control(pcodec->handle, AMSTREAM_IOC_GET_VIDEO_CUR_DELAY_MS, delay_ms); 02229 } 02230 02231 /* --------------------------------------------------------------------------*/ 02239 /* --------------------------------------------------------------------------*/ 02240 int codec_get_video_cur_bitrate(codec_para_t *pcodec,int *bitrate) 02241 { 02242 return codec_h_control(pcodec->handle, AMSTREAM_IOC_GET_VIDEO_AVG_BITRATE_BPS, bitrate); 02243 } 02244 02245 02246 /* --------------------------------------------------------------------------*/ 02254 /* --------------------------------------------------------------------------*/ 02255 int codec_get_audio_cur_bitrate(codec_para_t *pcodec,int *bitrate) 02256 { 02257 return codec_h_control(pcodec->handle, AMSTREAM_IOC_GET_AUDIO_AVG_BITRATE_BPS, bitrate); 02258 } 02259 02260 /* --------------------------------------------------------------------------*/ 02269 /* --------------------------------------------------------------------------*/ 02270 int codec_set_vsync_upint(codec_para_t *pcodec, unsigned int mode) 02271 { 02272 return codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_SET_VSYNC_UPINT, (unsigned long)mode); 02273 } 02274 int codec_set_drmmode(codec_para_t *pcodec, unsigned int setval) 02275 { 02276 return codec_h_control(pcodec->handle, AMSTREAM_IOC_SET_DRMMODE, setval); 02277 } 02278 02283 int codec_get_last_checkout_apts(codec_para_t* pcodec, unsigned long *apts) 02284 { 02285 return codec_h_control(pcodec->handle, AMSTREAM_IOC_GET_LAST_CHECKOUT_APTS, apts); 02286 } 02287 02288 int codec_get_last_checkin_apts(codec_para_t* pcodec, unsigned long* apts) 02289 { 02290 return codec_h_control(pcodec->handle, AMSTREAM_IOC_GET_LAST_CHECKIN_APTS, apts); 02291 } 02292 02301 int codec_get_pcm_level(codec_para_t* pcodec, unsigned int* level) 02302 { 02303 return audio_get_pcm_level(pcodec->adec_priv); 02304 } 02305 02306 int codec_set_skip_bytes(codec_para_t* pcodec, unsigned int bytes) 02307 { 02308 return audio_set_skip_bytes(pcodec->adec_priv); 02309 } 02310 02311 int codec_get_dsp_apts(codec_para_t* pcodec, unsigned int * apts) 02312 { 02313 return audio_get_pts(pcodec->adec_priv, apts); 02314 } 02315 02316 /* --------------------------------------------------------------------------*/ 02324 /* --------------------------------------------------------------------------*/ 02325 int codec_get_cntl_vpts(codec_para_t *pcodec) 02326 { 02327 int cntl_vpts, r; 02328 02329 if (pcodec->cntl_handle == 0) { 02330 CODEC_PRINT("no control handler\n"); 02331 return 0; 02332 } 02333 02334 r = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_GET_TRICK_VPTS, (unsigned long)&cntl_vpts); 02335 if (r < 0) { 02336 return system_error_to_codec_error(r); 02337 } else { 02338 return cntl_vpts; 02339 } 02340 } 02341 02342 /* --------------------------------------------------------------------------*/ 02351 /* --------------------------------------------------------------------------*/ 02352 int codec_disalbe_slowsync(codec_para_t *pcodec, int disable_slowsync) 02353 { 02354 int cntl_vpts, r; 02355 02356 if (pcodec->cntl_handle == 0) { 02357 CODEC_PRINT("no control handler\n"); 02358 return 0; 02359 } 02360 02361 r = codec_h_control(pcodec->cntl_handle, AMSTREAM_IOC_DISABLE_SLOW_SYNC, (unsigned long)disable_slowsync); 02362 if (r < 0) { 02363 return system_error_to_codec_error(r); 02364 } else { 02365 return 0; 02366 } 02367 } 02368
Generated on Tue Dec 2 2014 21:58:54 for amcodecMy Project by
