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

Commit 730af228 authored by Robert Shih's avatar Robert Shih
Browse files

Refactor code to create MediaHttpService

Bug: 109928575
Change-Id: I63989b4da38bb46d96d86f35c6e62be53afad43e
parent fd1da15b
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);
}
}