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; }
/* * 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; }