bool CAMLPlayer::OpenFile(const CFileItem &file, const CPlayerOptions &options) { try { CLog::Log(LOGNOTICE, "CAMLPlayer: Opening: %s", file.GetPath().c_str()); // if playing a file close it first // this has to be changed so we won't have to close it. if (ThreadHandle()) CloseFile(); m_item = file; m_options = options; m_elapsed_ms = 0; m_duration_ms = 0; m_audio_info = "none"; m_audio_delay = g_settings.m_currentVideoSettings.m_AudioDelay; m_video_info = "none"; m_video_width = 0; m_video_height = 0; m_video_fps_numerator = 25; m_video_fps_denominator = 1; m_subtitle_delay = 0; m_subtitle_thread = NULL; m_chapter_index = 0; m_chapter_count = 0; m_show_mainvideo = -1; m_dst_rect.SetRect(0, 0, 0, 0); ClearStreamInfos(); static URLProtocol vfs_protocol = { "vfs", CFileURLProtocol::Open, CFileURLProtocol::Read, CFileURLProtocol::Write, CFileURLProtocol::Seek, CFileURLProtocol::SeekEx, // url_exseek, an amlogic extension. CFileURLProtocol::Close, }; CStdString url = m_item.GetPath(); if (url.Left(strlen("smb://")).Equals("smb://")) { // the name string needs to persist static const char *smb_name = "smb"; vfs_protocol.name = smb_name; } else if (url.Left(strlen("afp://")).Equals("afp://")) { // the name string needs to persist static const char *afp_name = "afp"; vfs_protocol.name = afp_name; } else if (url.Left(strlen("nfs://")).Equals("nfs://")) { // the name string needs to persist static const char *nfs_name = "nfs"; vfs_protocol.name = nfs_name; } else if (url.Left(strlen("http://")).Equals("http://")) { // the name string needs to persist static const char *http_name = "xb-http"; vfs_protocol.name = http_name; url = "xb-" + url; } printf("CAMLPlayer::OpenFile: URL=%s\n", url.c_str()); if (player_init() != PLAYER_SUCCESS) { printf("player init failed\n"); return false; } printf("player init......\n"); // must be after player_init av_register_protocol2(&vfs_protocol, sizeof(vfs_protocol)); static play_control_t play_control; memset(&play_control, 0, sizeof(play_control_t)); // if we do not register a callback, // then the libamplayer will free run checking status. player_register_update_callback(&play_control.callback_fn, &UpdatePlayerInfo, 1000); // leak file_name for now. play_control.file_name = (char*)strdup(url.c_str()); //play_control->nosound = 1; // if disable audio...,must call this api play_control.video_index = -1; //MUST play_control.audio_index = -1; //MUST play_control.sub_index = -1; //MUST play_control.hassub = 1; play_control.t_pos = -1; play_control.need_start = 1; // if 0,you can omit player_start_play API. // just play video/audio immediately. // if 1,then need call "player_start_play" API; //play_control.auto_buffing_enable = 1; //play_control.buffing_min = 0.2; //play_control.buffing_middle = 0.5; //play_control.buffing_max = 0.8; //play_control.byteiobufsize =; // maps to av_open_input_file buffer size //play_control.loopbufsize =; //play_control.enable_rw_on_pause =; m_aml_state.clear(); m_aml_state.push_back(0); m_pid = player_start(&play_control, 0); if (m_pid < 0) { printf("player start failed! error = %d\n", m_pid); return false; } // setup to spin the busy dialog until we are playing m_ready.Reset(); g_renderManager.PreInit(); // create the playing thread m_StopPlaying = false; Create(); if (!m_ready.WaitMSec(100)) { CGUIDialogBusy *dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); dialog->Show(); while (!m_ready.WaitMSec(1)) g_windowManager.ProcessRenderLoop(false); dialog->Close(); } // Playback might have been stopped due to some error. if (m_bStop || m_StopPlaying) return false; return true; } catch (...) { CLog::Log(LOGERROR, "%s - Exception thrown on open", __FUNCTION__); return false; } }
/* * Class: com_farcore_playerservice_MediaPlayer * Method: addMediaSource * Signature: (Ljava/lang/String;III)I */ JNIEXPORT jint JNICALL Java_com_farcore_playerservice_AmPlayer_setMediaFd (JNIEnv *env, jobject obj, jobject fileDescriptor,jint isloop, jint pMode,jint st,jlong offset, jlong length){ int pid = -1; char * file=NULL; jclass clazz = (*env)->GetObjectClass(env, obj); gMplayerClazz =(*env)->NewGlobalRef(env,clazz); if(gMplayerClazz){ ALOGI("get mediaplayer class"); }else{ ALOGE("can't get mediaplayer class"); return -100; } gPostMid = (*env)->GetStaticMethodID(env, gMplayerClazz, "onUpdateState", "(IIIIIII)V"); if(gPostMid){ ALOGI("get update state object id"); }else{ ALOGE("failed to get update object id"); return -101; } URLProtocol *prot=&android_protocol; prot->name="android"; prot->url_open=(int (*)(URLContext *, const char *, int ))vp_open; prot->url_read=(int (*)(URLContext *, unsigned char *, int))vp_read; prot->url_write=(int (*)(URLContext *, unsigned char *, int))vp_write; prot->url_seek=(int64_t (*)(URLContext *, int64_t , int))vp_seek; prot->url_close=(int (*)(URLContext *))vp_close; prot->url_get_file_handle = (int (*)(URLContext *))vp_get_file_handle; av_register_protocol(prot); if (fileDescriptor == NULL) { return -1; } int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); if(fd<0 || offset<0) return -1; file=(char *)malloc(128); if(file==NULL) return -1; mAmlogicFile.oldfd=fd; mAmlogicFile.fd = dup(fd); mAmlogicFile.fd_valid=1; mAmlogicFile.mOffset=offset; mAmlogicFile.mLength=length; _plCtrl.t_pos=-1;/*don't seek to 0*/ //mPlay_ctl.t_pos=0;/*don't seek to 0*/ sprintf(file,"android:AmlogicPlayer=[%x:%x],AmlogicPlayer_fd=[%x:%x]", NULL,NULL, (unsigned int)&mAmlogicFile,(~(unsigned int)&mAmlogicFile)); if(_plCtrl.file_name != NULL){ free(_plCtrl.file_name); } memset((void*)&_plCtrl,0,sizeof(play_control_t)); player_register_update_callback(&_plCtrl.callback_fn,&update_player_info,PLAYER_INFO_POP_INTERVAL); //_plCtrl.file_name = strndup(pname,FILENAME_LENGTH_MAX); mAmlogicFile.datasource=file; _plCtrl.file_name=(char*)mAmlogicFile.datasource; _plCtrl.video_index = -1;//MUST _plCtrl.audio_index = -1;//MUST _plCtrl.hassub = 1; //enable subtitle if(pMode == 1){ _plCtrl.nosound = 1; SYS_set_tsync_enable(0);//if no sound,can set to be 0 ALOGI("disable sound"); }else if(pMode ==2){ _plCtrl.novideo = 1; ALOGI("disable video"); } if(st>0){ ALOGI("play start position:%d",st); _plCtrl.t_pos = st; } SYS_set_tsync_enable(1);//if no sound,can set to be 0 if(isloop>0){ _plCtrl.loop_mode =1; ALOGI("set loop mode"); } _plCtrl.need_start = 1; ALOGI("set a media file to play,but need start it using start interface"); pid=player_start(&_plCtrl,0); if(pid<0) { ALOGI("player start failed!error=%d\n",pid); return -1; } //(*env)->ReleaseStringUTFChars(env,url, pname); return pid; }
JNIEXPORT jint JNICALL Java_com_farcore_playerservice_AmPlayer_playMedia (JNIEnv *env, jobject obj,jstring url, jint isloop, jint pMode,jint st){ int pid = -1; jclass clazz = (*env)->GetObjectClass(env, obj); gMplayerClazz =(*env)->NewGlobalRef(env,clazz); if(gMplayerClazz){ LOGI("get mediaplayer class"); }else{ LOGE("can't get mediaplayer class"); return -100; } gPostMid = (*env)->GetStaticMethodID(env, gMplayerClazz, "onUpdateState", "(IIIIIII)V"); if(gPostMid){ LOGI("get update state object id"); }else{ LOGE("failed to get update object id"); return -101; } const char * pname = (*env)->GetStringUTFChars(env,url, NULL); if(NULL == pname) { LOGE("failed to change jstring to standard string"); return -1; } if(_plCtrl.file_name != NULL){ free(_plCtrl.file_name); } memset((void*)&_plCtrl,0,sizeof(play_control_t)); player_register_update_callback(&_plCtrl.callback_fn,&update_player_info,PLAYER_INFO_POP_INTERVAL); _plCtrl.file_name = strndup(pname,FILENAME_LENGTH_MAX); _plCtrl.video_index = -1;//MUST _plCtrl.audio_index = -1;//MUST _plCtrl.hassub = 1; if(pMode == 1){ _plCtrl.nosound = 1; SYS_set_tsync_enable(0);//if no sound,can set to be 0 LOGI("disable sound"); }else if(pMode ==2){ _plCtrl.novideo = 1; LOGI("disable video"); } SYS_set_tsync_enable(1);//if no sound,can set to be 0 if(isloop>0){ _plCtrl.loop_mode =1; LOGI("set loop mode"); } if(st>0){ LOGI("play start position:%d",st); _plCtrl.t_pos = st; } LOGI("add a media file to play"); pid=player_start(&_plCtrl,0); if(pid<0) { LOGI("player start failed!error=%d\n",pid); return -1; } (*env)->ReleaseStringUTFChars(env,url, pname); return pid; }
int main(int argc,char *argv[]) { play_control_t *pCtrl = NULL; int pid; int pos = 0; int speed = 0; int tmpneedexit = 0; int ret = -1; media_info_t minfo; char tmpcommand[TMP_COMMAND_MAX]; EMU_STEP tmpstep = EMU_STEP_MENU; pCtrl = (play_control_t*)malloc(sizeof(play_control_t)); memset(pCtrl,0,sizeof(play_control_t)); memset(&minfo,0,sizeof(media_info_t)); if(argc<2) { printf("usage:player file\n"); return -1; } player_init(); set_display_axis(0); //move osd out of screen to set video layer out player_register_update_callback(&pCtrl->callback_fn,&update_player_info,1000); printf("player callback register....\n"); pCtrl->file_name = strdup(argv[1]); //pCtrl->nosound = 1; // if disable audio...,must call this api pCtrl->video_index = -1;// MUST pCtrl->audio_index = -1;// MUST pCtrl->sub_index = -1;/// MUST pCtrl->hassub = 1; // enable subtitle //just open a buffer,just for p2p,http,etc... //pCtrl->auto_buffing_enable = 1; // pCtrl->buffing_min = 0.001; // pCtrl->buffing_middle = 0.02; // pCtrl->buffing_max = 0.9; pCtrl->t_pos = -1; // start position, if live streaming, need set to -1 pCtrl->need_start = 0; // if 0,you can omit player_start_play API.just play video/audio immediately. if 1,need call "player_start_play" API; pid=player_start(pCtrl,0); if(pid<0) { printf("player start failed!error=%d\n",pid); return -1; } signal(SIGSEGV, signal_handler); //SYS_disable_osd0(); while((!tmpneedexit)&&(!PLAYER_THREAD_IS_STOPPED(player_get_state(pid)))){ switch (tmpstep) { case EMU_STEP_PAUSE: player_pause(pid); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_RESUME: player_resume(pid); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_SEEK: printf("will seek position:100\n"); pos = 100; player_timesearch(pid,pos); tmpstep = EMU_STEP_MENU; break; break; case EMU_STEP_STOP: player_stop(pid); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_FF: printf("please input fastforward speed:\n"); speed = 1; player_forward(pid,speed); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_RR: printf("please input fastrewind speed:"); speed = 1; player_backward(pid,speed); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_SETLOOP: player_loop(pid); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_EXIT: player_exit(pid); tmpneedexit = 1; break; case EMU_STEP_START: player_start_play(pid); //SYS_set_tsync_enable(0);///< f no sound,can set to be 0 tmpstep = EMU_STEP_MENU; break; case EMU_STEP_GETAVMEDIAINFO: if(pid>=0){ if(player_get_state(pid) > PLAYER_INITOK) { ret = player_get_media_info(pid,&minfo); if(ret==0) _media_info_dump(&minfo); } } tmpstep = EMU_STEP_MENU; break; case EMU_STEP_MENU: do { printf(SCREEN_SPLITER); printf(" player benchmark tool for android v2.0\n"); printf(SCREEN_SPLITER); printf("* Please choose one option *\r\n"); printf("* 0 show main menu *\r\n"); printf("* a start play *\r\n"); printf("* s get media info *\r\n"); printf("* 1 Pause play *\r\n"); printf("* 2 Resume play *\r\n"); printf("* 3 Stop play *\r\n"); printf("* 4 Fastforward *\r\n"); printf("* 5 Fastrewind *\r\n"); printf("* 6 Seek *\r\n"); printf("* 7 Set repeat *\r\n"); printf("* 8 Quit tools *\r\n"); printf(SCREEN_SPLITER); printf("please input you choice:"); memset(tmpcommand,0,TMP_COMMAND_MAX); scanf ("%s",tmpcommand); if (strcmp(tmpcommand,"1")==0){ tmpstep = EMU_STEP_PAUSE; } if (strcmp(tmpcommand,"0")==0){ sleep(1); tmpstep = EMU_STEP_MENU; } else if (strcmp(tmpcommand,"2")==0){ tmpstep = EMU_STEP_RESUME; } else if (strcmp(tmpcommand,"3")==0){ tmpstep = EMU_STEP_STOP; } else if (strcmp(tmpcommand,"4")==0){ tmpstep = EMU_STEP_FF; } else if (strcmp(tmpcommand,"5")==0){ tmpstep = EMU_STEP_RR; } else if (strcmp(tmpcommand,"6")==0) { tmpstep = EMU_STEP_SEEK; } else if (strcmp(tmpcommand,"7")==0) { tmpstep = EMU_STEP_SETLOOP; } else if (strcmp(tmpcommand,"8")==0) { tmpstep = EMU_STEP_EXIT; } else if (strcmp(tmpcommand,"a")==0) { tmpstep = EMU_STEP_START; } else if (strcmp(tmpcommand,"s")==0){ tmpstep = EMU_STEP_GETAVMEDIAINFO; } }while (0); break; } usleep(100*1000); signal(SIGCHLD, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGHUP, signal_handler); signal(SIGTERM, signal_handler); signal(SIGSEGV, signal_handler); signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); } set_display_axis(1); //recover osd free(pCtrl->file_name); free(pCtrl); printf("...........player exit,~,byeybe...........\n"); return 0; }