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;
            
}
Beispiel #3
0
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;
}