Refactor code to create MediaHttpService
Bug: 109928575
Change-Id: I63989b4da38bb46d96d86f35c6e62be53afad43e
diff --git a/media/ndk/Android.bp b/media/ndk/Android.bp
index 4a36681..2f298cf 100644
--- a/media/ndk/Android.bp
+++ b/media/ndk/Android.bp
@@ -82,6 +82,7 @@
"libbinder",
"libgui",
"libui",
+ "libmedia2_jni_core",
],
export_include_dirs: ["include"],
diff --git a/media/ndk/NdkMediaDataSource.cpp b/media/ndk/NdkMediaDataSource.cpp
index 9d00e5e..ec2aed6 100644
--- a/media/ndk/NdkMediaDataSource.cpp
+++ b/media/ndk/NdkMediaDataSource.cpp
@@ -23,13 +23,18 @@
#include <jni.h>
#include <unistd.h>
+#include <android_runtime/AndroidRuntime.h>
+#include <android_util_Binder.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <utils/Log.h>
#include <utils/StrongPointer.h>
+#include <media/IMediaHTTPService.h>
#include <media/NdkMediaError.h>
#include <media/NdkMediaDataSource.h>
#include <media/stagefright/InterfaceUtils.h>
+#include <mediaplayer2/JavaVMHelper.h>
+#include <mediaplayer2/JMedia2HTTPService.h>
#include "../../libstagefright/include/HTTPBase.h"
#include "../../libstagefright/include/NuCachedSource2.h"
@@ -92,6 +97,84 @@
}
}
+static sp<MediaHTTPService> createMediaHttpServiceFromJavaObj(JNIEnv *env, jobject obj, int version) {
+ if (obj == NULL) {
+ return NULL;
+ }
+ switch (version) {
+ case 1:
+ return interface_cast<IMediaHTTPService>(ibinderForJavaObject(env, obj));
+ case 2:
+ return new JMedia2HTTPService(env, obj);
+ default:
+ return NULL;
+ }
+}
+
+static sp<MediaHTTPService> createMediaHttpServiceTemplate(
+ JNIEnv *env,
+ const char *uri,
+ const char *clazz,
+ const char *method,
+ const char *signature,
+ int version) {
+ jobject service = NULL;
+ if (env == NULL) {
+ ALOGE("http service must be created from Java thread");
+ return NULL;
+ }
+
+ jclass mediahttpclass = env->FindClass(clazz);
+ if (mediahttpclass == NULL) {
+ ALOGE("can't find Media(2)HttpService");
+ env->ExceptionClear();
+ return NULL;
+ }
+
+ jmethodID mediaHttpCreateMethod = env->GetStaticMethodID(mediahttpclass, method, signature);
+ if (mediaHttpCreateMethod == NULL) {
+ ALOGE("can't find method");
+ env->ExceptionClear();
+ return NULL;
+ }
+
+ jstring juri = env->NewStringUTF(uri);
+
+ service = env->CallStaticObjectMethod(mediahttpclass, mediaHttpCreateMethod, juri);
+ env->DeleteLocalRef(juri);
+
+ env->ExceptionClear();
+ sp<MediaHTTPService> httpService = createMediaHttpServiceFromJavaObj(env, service, version);
+ return httpService;
+
+}
+
+sp<MediaHTTPService> createMediaHttpService(const char *uri, int version) {
+
+ JNIEnv *env;
+ const char *clazz, *method, *signature;
+
+ switch (version) {
+ case 1:
+ env = AndroidRuntime::getJNIEnv();
+ clazz = "android/media/MediaHTTPService";
+ method = "createHttpServiceBinderIfNecessary";
+ signature = "(Ljava/lang/String;)Landroid/os/IBinder;";
+ break;
+ case 2:
+ env = JavaVMHelper::getJNIEnv();
+ clazz = "android/media/Media2HTTPService";
+ method = "createHTTPService";
+ signature = "(Ljava/lang/String;)Landroid/media/Media2HTTPService;";
+ break;
+ default:
+ return NULL;
+ }
+
+ return createMediaHttpServiceTemplate(env, uri, clazz, method, signature, version);
+
+}
+
extern "C" {
EXPORT
diff --git a/media/ndk/NdkMediaDataSourcePriv.h b/media/ndk/NdkMediaDataSourcePriv.h
index ea9c865..3b0aa59 100644
--- a/media/ndk/NdkMediaDataSourcePriv.h
+++ b/media/ndk/NdkMediaDataSourcePriv.h
@@ -32,6 +32,7 @@
#include <sys/types.h>
#include <media/DataSource.h>
+#include <media/MediaHTTPService.h>
#include <media/NdkMediaDataSource.h>
#include <utils/Mutex.h>
#include <utils/String8.h>
@@ -59,5 +60,7 @@
};
+sp<MediaHTTPService> createMediaHttpService(const char *uri, int version);
+
#endif // _NDK_MEDIA_DATASOURCE_PRIV_H
diff --git a/media/ndk/NdkMediaExtractor.cpp b/media/ndk/NdkMediaExtractor.cpp
index c66cd50..f00a19c 100644
--- a/media/ndk/NdkMediaExtractor.cpp
+++ b/media/ndk/NdkMediaExtractor.cpp
@@ -96,39 +96,12 @@
ALOGV("setDataSource(%s)", uri);
- JNIEnv *env = AndroidRuntime::getJNIEnv();
- jobject service = NULL;
- if (env == NULL) {
- ALOGE("setDataSource(path) must be called from Java thread");
+ sp<MediaHTTPService> httpService = createMediaHttpService(uri, /* version = */ 1);
+ if (httpService == NULL) {
+ ALOGE("can't create http service");
return AMEDIA_ERROR_UNSUPPORTED;
}
- jclass mediahttpclass = env->FindClass("android/media/MediaHTTPService");
- if (mediahttpclass == NULL) {
- ALOGE("can't find MediaHttpService");
- env->ExceptionClear();
- return AMEDIA_ERROR_UNSUPPORTED;
- }
-
- jmethodID mediaHttpCreateMethod = env->GetStaticMethodID(mediahttpclass,
- "createHttpServiceBinderIfNecessary", "(Ljava/lang/String;)Landroid/os/IBinder;");
- if (mediaHttpCreateMethod == NULL) {
- ALOGE("can't find method");
- env->ExceptionClear();
- return AMEDIA_ERROR_UNSUPPORTED;
- }
-
- jstring jloc = env->NewStringUTF(uri);
-
- service = env->CallStaticObjectMethod(mediahttpclass, mediaHttpCreateMethod, jloc);
- env->DeleteLocalRef(jloc);
-
- sp<IMediaHTTPService> httpService;
- if (service != NULL) {
- sp<IBinder> binder = ibinderForJavaObject(env, service);
- httpService = interface_cast<IMediaHTTPService>(binder);
- }
-
KeyedVector<String8, String8> headers;
for (int i = 0; i < numheaders; ++i) {
String8 key8(keys[i]);
@@ -138,7 +111,6 @@
status_t err;
err = mData->mImpl->setDataSource(httpService, uri, numheaders > 0 ? &headers : NULL);
- env->ExceptionClear();
return translate_error(err);
}