Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3dac3fd authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refactor code to create MediaHttpService"

parents b55d217b 730af228
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -82,6 +82,7 @@ cc_library_shared {
        "libbinder",
        "libbinder",
        "libgui",
        "libgui",
        "libui",
        "libui",
        "libmedia2_jni_core",
    ],
    ],


    export_include_dirs: ["include"],
    export_include_dirs: ["include"],
+83 −0
Original line number Original line Diff line number Diff line
@@ -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"
@@ -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
+3 −0
Original line number Original line Diff line number Diff line
@@ -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>
@@ -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
+3 −31
Original line number Original line Diff line number Diff line
@@ -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]);
@@ -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);
}
}