提交 a2273fc0 编写于 作者: R raymondzheng

ijkplayer: modify androidio

上级 aa925e58
......@@ -223,25 +223,18 @@ LABEL_RETURN:
}
static void
IjkMediaPlayer_setDataSourceAndroidIOCallback(JNIEnv *env, jobject thiz, jobject callback) {
IjkMediaPlayer_setAndroidIOCallback(JNIEnv *env, jobject thiz, jobject callback) {
MPTRACE("%s\n", __func__);
int retval = 0;
char uri[128];
int64_t nativeAndroidIO = 0;
IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
JNI_CHECK_GOTO(callback, env, "java/lang/IllegalArgumentException", "mpjni: setDataSourceIjkIOCallback: null fd", LABEL_RETURN);
JNI_CHECK_GOTO(mp, env, "java/lang/IllegalStateException", "mpjni: setDataSourceIjkIOCallback: null mp", LABEL_RETURN);
JNI_CHECK_GOTO(callback, env, "java/lang/IllegalArgumentException", "mpjni: setAndroidIOCallback: null fd", LABEL_RETURN);
JNI_CHECK_GOTO(mp, env, "java/lang/IllegalStateException", "mpjni: setAndroidIOCallback: null mp", LABEL_RETURN);
nativeAndroidIO = jni_set_ijkio_androidio(env, thiz, callback);
JNI_CHECK_GOTO(nativeAndroidIO, env, "java/lang/IllegalStateException", "mpjni: jni_set_ijkio_androidio: NewGlobalRef", LABEL_RETURN);
ALOGV("setDataSourceAndroidIOCallback: %"PRId64"\n", nativeAndroidIO);
snprintf(uri, sizeof(uri), "ijkio:androidio:%"PRId64, nativeAndroidIO);
retval = ijkmp_set_data_source(mp, uri);
IJK_CHECK_MPRET_GOTO(retval, env, LABEL_RETURN);
ijkmp_set_option_int(mp, FFP_OPT_CATEGORY_FORMAT, "androidio-inject-callback", nativeAndroidIO);
LABEL_RETURN:
ijkmp_dec_ref_p(&mp);
......@@ -1082,7 +1075,7 @@ static JNINativeMethod g_methods[] = {
},
{ "_setDataSourceFd", "(I)V", (void *) IjkMediaPlayer_setDataSourceFd },
{ "_setDataSource", "(Ltv/danmaku/ijk/media/player/misc/IMediaDataSource;)V", (void *)IjkMediaPlayer_setDataSourceCallback },
{ "_setDataSourceAndroidIO", "(Ltv/danmaku/ijk/media/player/misc/IAndroidIO;)V", (void *)IjkMediaPlayer_setDataSourceAndroidIOCallback },
{ "_setAndroidIOCallback", "(Ltv/danmaku/ijk/media/player/misc/IAndroidIO;)V", (void *)IjkMediaPlayer_setAndroidIOCallback },
{ "_setVideoSurface", "(Landroid/view/Surface;)V", (void *) IjkMediaPlayer_setVideoSurface },
{ "_prepareAsync", "()V", (void *) IjkMediaPlayer_prepareAsync },
......
......@@ -34,7 +34,7 @@
#include <assert.h>
typedef struct IjkIOAndroidioContext {
jobject ijkio_http;
jobject ijkio_androidio;
jbyteArray jbuffer;
int jbuffer_capacity;
URLContext *inner;
......@@ -43,7 +43,7 @@ typedef struct IjkIOAndroidioContext {
static int ijkio_androidio_open(IjkURLContext *h, const char *url, int flags, IjkAVDictionary **options) {
IjkIOAndroidioContext *c= h->priv_data;
JNIEnv *env = NULL;
jobject ijkio_http = NULL;
jobject ijkio_androidio = NULL;
char *final = NULL;
if (!c)
......@@ -51,8 +51,15 @@ static int ijkio_androidio_open(IjkURLContext *h, const char *url, int flags, Ij
av_strstart(url, "androidio:", &url);
ijkio_http = (jobject) (intptr_t) strtoll(url, &final, 10);
if (!ijkio_http)
IjkAVDictionaryEntry *t = NULL;
t = ijk_av_dict_get(*options, "androidio-inject-callback", NULL, IJK_AV_DICT_IGNORE_SUFFIX);
if (t) {
ijkio_androidio = (jobject) (intptr_t) strtoll(t->value, &final, 10);
} else {
return -1;
}
if (!ijkio_androidio)
return AVERROR(EINVAL);
if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) {
......@@ -60,15 +67,18 @@ static int ijkio_androidio_open(IjkURLContext *h, const char *url, int flags, Ij
return AVERROR(EINVAL);
}
jint ret = J4AC_IAndroidIO__open(env, ijkio_http);
jstring urlString = NULL;
urlString = (*env)->NewStringUTF(env, url);
jint ret = J4AC_IAndroidIO__open(env, ijkio_androidio, urlString);
if (J4A_ExceptionCheck__catchAll(env)) {
return AVERROR(EINVAL);
} else if (ret < 0) {
return ret;
}
c->ijkio_http = (*env)->NewGlobalRef(env, ijkio_http);
if (J4A_ExceptionCheck__catchAll(env) || !c->ijkio_http) {
c->ijkio_androidio = (*env)->NewGlobalRef(env, ijkio_androidio);
if (J4A_ExceptionCheck__catchAll(env) || !c->ijkio_androidio) {
return AVERROR(ENOMEM);
}
......@@ -104,7 +114,7 @@ static int ijkio_androidio_read(IjkURLContext *h, unsigned char *buf, int size)
jbyteArray jbuffer = NULL;
jint ret = 0;
if (!c || !c->ijkio_http)
if (!c || !c->ijkio_androidio)
return AVERROR(EINVAL);
if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) {
......@@ -116,7 +126,7 @@ static int ijkio_androidio_read(IjkURLContext *h, unsigned char *buf, int size)
if (!jbuffer)
return AVERROR(ENOMEM);
ret = J4AC_IAndroidIO__read(env, c->ijkio_http, jbuffer, size);
ret = J4AC_IAndroidIO__read(env, c->ijkio_androidio, jbuffer, size);
if (J4A_ExceptionCheck__catchAll(env))
return AVERROR(EIO);
else if (ret < 0)
......@@ -136,7 +146,7 @@ static int64_t ijkio_androidio_seek(IjkURLContext *h, int64_t offset, int whence
int64_t ret;
JNIEnv *env = NULL;
if (!c || !c->ijkio_http)
if (!c || !c->ijkio_androidio)
return AVERROR(EINVAL);
if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) {
......@@ -144,7 +154,7 @@ static int64_t ijkio_androidio_seek(IjkURLContext *h, int64_t offset, int whence
return AVERROR(EINVAL);
}
ret = J4AC_IAndroidIO__seek(env, c->ijkio_http, offset, whence);
ret = J4AC_IAndroidIO__seek(env, c->ijkio_androidio, offset, whence);
if (J4A_ExceptionCheck__catchAll(env))
return AVERROR(EIO);
......@@ -155,7 +165,7 @@ static int ijkio_androidio_close(IjkURLContext *h) {
IjkIOAndroidioContext *c = h->priv_data;
JNIEnv *env = NULL;
if (!c || !c->ijkio_http)
if (!c || !c->ijkio_androidio)
return AVERROR(EINVAL);
if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) {
......@@ -165,9 +175,9 @@ static int ijkio_androidio_close(IjkURLContext *h) {
J4A_DeleteGlobalRef__p(env, &c->jbuffer);
if (c->ijkio_http) {
J4AC_IAndroidIO__close__catchAll(env, c->ijkio_http);
J4A_DeleteGlobalRef__p(env, &c->ijkio_http);
if (c->ijkio_androidio) {
J4AC_IAndroidIO__close__catchAll(env, c->ijkio_androidio);
J4A_DeleteGlobalRef__p(env, &c->ijkio_androidio);
}
return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册