Loading media/ndk/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -82,6 +82,7 @@ cc_library_shared { "libbinder", "libbinder", "libgui", "libgui", "libui", "libui", "libmedia2_jni_core", ], ], export_include_dirs: ["include"], export_include_dirs: ["include"], Loading media/ndk/NdkMediaDataSource.cpp +83 −0 Original line number Original line Diff line number Diff line Loading @@ -23,13 +23,18 @@ #include <jni.h> #include <jni.h> #include <unistd.h> #include <unistd.h> #include <android_runtime/AndroidRuntime.h> #include <android_util_Binder.h> #include <binder/IServiceManager.h> #include <binder/IServiceManager.h> #include <cutils/properties.h> #include <cutils/properties.h> #include <utils/Log.h> #include <utils/Log.h> #include <utils/StrongPointer.h> #include <utils/StrongPointer.h> #include <media/IMediaHTTPService.h> #include <media/NdkMediaError.h> #include <media/NdkMediaError.h> #include <media/NdkMediaDataSource.h> #include <media/NdkMediaDataSource.h> #include <media/stagefright/InterfaceUtils.h> #include <media/stagefright/InterfaceUtils.h> #include <mediaplayer2/JavaVMHelper.h> #include <mediaplayer2/JMedia2HTTPService.h> #include "../../libstagefright/include/HTTPBase.h" #include "../../libstagefright/include/HTTPBase.h" #include "../../libstagefright/include/NuCachedSource2.h" #include "../../libstagefright/include/NuCachedSource2.h" Loading Loading @@ -92,6 +97,84 @@ void NdkDataSource::close() { } } } } 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" { extern "C" { EXPORT EXPORT Loading media/ndk/NdkMediaDataSourcePriv.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include <sys/types.h> #include <sys/types.h> #include <media/DataSource.h> #include <media/DataSource.h> #include <media/MediaHTTPService.h> #include <media/NdkMediaDataSource.h> #include <media/NdkMediaDataSource.h> #include <utils/Mutex.h> #include <utils/Mutex.h> #include <utils/String8.h> #include <utils/String8.h> Loading Loading @@ -59,5 +60,7 @@ private: }; }; sp<MediaHTTPService> createMediaHttpService(const char *uri, int version); #endif // _NDK_MEDIA_DATASOURCE_PRIV_H #endif // _NDK_MEDIA_DATASOURCE_PRIV_H media/ndk/NdkMediaExtractor.cpp +3 −31 Original line number Original line Diff line number Diff line Loading @@ -96,39 +96,12 @@ media_status_t AMediaExtractor_setDataSourceWithHeaders(AMediaExtractor *mData, ALOGV("setDataSource(%s)", uri); ALOGV("setDataSource(%s)", uri); JNIEnv *env = AndroidRuntime::getJNIEnv(); sp<MediaHTTPService> httpService = createMediaHttpService(uri, /* version = */ 1); jobject service = NULL; if (httpService == NULL) { if (env == NULL) { ALOGE("can't create http service"); ALOGE("setDataSource(path) must be called from Java thread"); return AMEDIA_ERROR_UNSUPPORTED; 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; KeyedVector<String8, String8> headers; for (int i = 0; i < numheaders; ++i) { for (int i = 0; i < numheaders; ++i) { String8 key8(keys[i]); String8 key8(keys[i]); Loading @@ -138,7 +111,6 @@ media_status_t AMediaExtractor_setDataSourceWithHeaders(AMediaExtractor *mData, status_t err; status_t err; err = mData->mImpl->setDataSource(httpService, uri, numheaders > 0 ? &headers : NULL); err = mData->mImpl->setDataSource(httpService, uri, numheaders > 0 ? &headers : NULL); env->ExceptionClear(); return translate_error(err); return translate_error(err); } } Loading Loading
media/ndk/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -82,6 +82,7 @@ cc_library_shared { "libbinder", "libbinder", "libgui", "libgui", "libui", "libui", "libmedia2_jni_core", ], ], export_include_dirs: ["include"], export_include_dirs: ["include"], Loading
media/ndk/NdkMediaDataSource.cpp +83 −0 Original line number Original line Diff line number Diff line Loading @@ -23,13 +23,18 @@ #include <jni.h> #include <jni.h> #include <unistd.h> #include <unistd.h> #include <android_runtime/AndroidRuntime.h> #include <android_util_Binder.h> #include <binder/IServiceManager.h> #include <binder/IServiceManager.h> #include <cutils/properties.h> #include <cutils/properties.h> #include <utils/Log.h> #include <utils/Log.h> #include <utils/StrongPointer.h> #include <utils/StrongPointer.h> #include <media/IMediaHTTPService.h> #include <media/NdkMediaError.h> #include <media/NdkMediaError.h> #include <media/NdkMediaDataSource.h> #include <media/NdkMediaDataSource.h> #include <media/stagefright/InterfaceUtils.h> #include <media/stagefright/InterfaceUtils.h> #include <mediaplayer2/JavaVMHelper.h> #include <mediaplayer2/JMedia2HTTPService.h> #include "../../libstagefright/include/HTTPBase.h" #include "../../libstagefright/include/HTTPBase.h" #include "../../libstagefright/include/NuCachedSource2.h" #include "../../libstagefright/include/NuCachedSource2.h" Loading Loading @@ -92,6 +97,84 @@ void NdkDataSource::close() { } } } } 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" { extern "C" { EXPORT EXPORT Loading
media/ndk/NdkMediaDataSourcePriv.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include <sys/types.h> #include <sys/types.h> #include <media/DataSource.h> #include <media/DataSource.h> #include <media/MediaHTTPService.h> #include <media/NdkMediaDataSource.h> #include <media/NdkMediaDataSource.h> #include <utils/Mutex.h> #include <utils/Mutex.h> #include <utils/String8.h> #include <utils/String8.h> Loading Loading @@ -59,5 +60,7 @@ private: }; }; sp<MediaHTTPService> createMediaHttpService(const char *uri, int version); #endif // _NDK_MEDIA_DATASOURCE_PRIV_H #endif // _NDK_MEDIA_DATASOURCE_PRIV_H
media/ndk/NdkMediaExtractor.cpp +3 −31 Original line number Original line Diff line number Diff line Loading @@ -96,39 +96,12 @@ media_status_t AMediaExtractor_setDataSourceWithHeaders(AMediaExtractor *mData, ALOGV("setDataSource(%s)", uri); ALOGV("setDataSource(%s)", uri); JNIEnv *env = AndroidRuntime::getJNIEnv(); sp<MediaHTTPService> httpService = createMediaHttpService(uri, /* version = */ 1); jobject service = NULL; if (httpService == NULL) { if (env == NULL) { ALOGE("can't create http service"); ALOGE("setDataSource(path) must be called from Java thread"); return AMEDIA_ERROR_UNSUPPORTED; 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; KeyedVector<String8, String8> headers; for (int i = 0; i < numheaders; ++i) { for (int i = 0; i < numheaders; ++i) { String8 key8(keys[i]); String8 key8(keys[i]); Loading @@ -138,7 +111,6 @@ media_status_t AMediaExtractor_setDataSourceWithHeaders(AMediaExtractor *mData, status_t err; status_t err; err = mData->mImpl->setDataSource(httpService, uri, numheaders > 0 ? &headers : NULL); err = mData->mImpl->setDataSource(httpService, uri, numheaders > 0 ? &headers : NULL); env->ExceptionClear(); return translate_error(err); return translate_error(err); } } Loading