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

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

Merge "MediaPlayer2: hook up srcId."

parents 4a0dde1f 34c5bb12
Loading
Loading
Loading
Loading
+29 −18
Original line number Diff line number Diff line
@@ -1212,6 +1212,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
        } else if (scheme != null) {
            // handle non-file sources
            nativeSetDataSource(
                srcId,
                Media2HTTPService.createHTTPService(path, cookies),
                path,
                keys,
@@ -1231,7 +1232,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
    }

    private native void nativeSetDataSource(
        Media2HTTPService httpService, String path, String[] keys, String[] values)
        long srcId, Media2HTTPService httpService, String path, String[] keys, String[] values)
        throws IOException, IllegalArgumentException, SecurityException, IllegalStateException;

    /**
@@ -1245,10 +1246,10 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
     */
    private void setDataSourcePriv(long srcId, FileDescriptor fd, long offset, long length)
            throws IOException {
        _setDataSource(fd, offset, length);
        _setDataSource(srcId, fd, offset, length);
    }

    private native void _setDataSource(FileDescriptor fd, long offset, long length)
    private native void _setDataSource(long srcId, FileDescriptor fd, long offset, long length)
            throws IOException;

    /**
@@ -1256,10 +1257,10 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
     * @throws IllegalArgumentException if dataSource is not a valid Media2DataSource
     */
    private void setDataSourcePriv(long srcId, Media2DataSource dataSource) {
        _setDataSource(dataSource);
        _setDataSource(srcId, dataSource);
    }

    private native void _setDataSource(Media2DataSource dataSource);
    private native void _setDataSource(long srcId, Media2DataSource dataSource);

    /**
     * Prepares the player for playback, synchronously.
@@ -3073,6 +3074,10 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {

        @Override
        public void handleMessage(Message msg) {
            handleMessage(msg, 0);
        }

        public void handleMessage(Message msg, long srcId) {
            if (mMediaPlayer.mNativeContext == 0) {
                Log.w(TAG, "mediaplayer2 went away with unhandled events");
                return;
@@ -3095,7 +3100,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onInfo(
                                mMediaPlayer, 0, MEDIA_INFO_PREPARED, 0));
                                mMediaPlayer, srcId, MEDIA_INFO_PREPARED, 0));
                    }
                }
                return;
@@ -3133,7 +3138,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onInfo(
                                mMediaPlayer, 0, MEDIA_INFO_PLAYBACK_COMPLETE, 0));
                                mMediaPlayer, srcId, MEDIA_INFO_PLAYBACK_COMPLETE, 0));
                    }
                }
                stayAwake(false);
@@ -3163,7 +3168,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onBufferingUpdate(
                                mMediaPlayer, 0, percent));
                                mMediaPlayer, srcId, percent));
                    }
                }
                return;
@@ -3172,7 +3177,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onInfo(
                                mMediaPlayer, 0, MEDIA_INFO_COMPLETE_CALL_SEEK, 0));
                                mMediaPlayer, srcId, MEDIA_INFO_COMPLETE_CALL_SEEK, 0));
                    }
                }
                // fall through
@@ -3192,7 +3197,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onVideoSizeChanged(
                                mMediaPlayer, 0, width, height));
                                mMediaPlayer, srcId, width, height));
                    }
                }
                return;
@@ -3202,9 +3207,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onError(
                                mMediaPlayer, 0, what, extra));
                                mMediaPlayer, srcId, what, extra));
                        cb.first.execute(() -> cb.second.onInfo(
                                mMediaPlayer, 0, MEDIA_INFO_PLAYBACK_COMPLETE, 0));
                                mMediaPlayer, srcId, MEDIA_INFO_PLAYBACK_COMPLETE, 0));
                    }
                }
                stayAwake(false);
@@ -3247,7 +3252,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onInfo(
                                mMediaPlayer, 0, what, extra));
                                mMediaPlayer, srcId, what, extra));
                    }
                }
                // No real default action so far.
@@ -3272,7 +3277,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {

                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onTimedText(mMediaPlayer, 0, text));
                        cb.first.execute(() -> cb.second.onTimedText(mMediaPlayer, srcId, text));
                    }
                }
                return;
@@ -3303,7 +3308,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
                synchronized (mEventCbLock) {
                    for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
                        cb.first.execute(() -> cb.second.onTimedMetaDataAvailable(
                                mMediaPlayer, 0, data));
                                mMediaPlayer, srcId, data));
                    }
                }
                return;
@@ -3335,7 +3340,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
     * code is safe from the object disappearing from underneath it.  (This is
     * the cookie passed to native_setup().)
     */
    private static void postEventFromNative(Object mediaplayer2_ref,
    private static void postEventFromNative(Object mediaplayer2_ref, long srcId,
                                            int what, int arg1, int arg2, Object obj)
    {
        final MediaPlayer2Impl mp = (MediaPlayer2Impl)((WeakReference)mediaplayer2_ref).get();
@@ -3388,7 +3393,13 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {

        if (mp.mEventHandler != null) {
            Message m = mp.mEventHandler.obtainMessage(what, arg1, arg2, obj);
            mp.mEventHandler.sendMessage(m);

            mp.mEventHandler.post(new Runnable() {
                @Override
                public void run() {
                    mp.mEventHandler.handleMessage(m, srcId);
                }
            });
        }
    }

@@ -4490,7 +4501,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
        // no need for log(N) search performance
        private MediaTimeProvider.OnMediaTimeListener mListeners[];
        private long mTimes[];
        private Handler mEventHandler;
        private EventHandler mEventHandler;
        private boolean mRefresh = false;
        private boolean mPausing = false;
        private boolean mSeeking = false;
+23 −15
Original line number Diff line number Diff line
@@ -154,7 +154,8 @@ class JNIMediaPlayer2Listener: public MediaPlayer2Listener
public:
    JNIMediaPlayer2Listener(JNIEnv* env, jobject thiz, jobject weak_thiz);
    ~JNIMediaPlayer2Listener();
    virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL);
    virtual void notify(int64_t srcId, int msg, int ext1, int ext2,
                        const Parcel *obj = NULL) override;
private:
    JNIMediaPlayer2Listener();
    jclass      mClass;     // Reference to MediaPlayer2 class
@@ -187,7 +188,7 @@ JNIMediaPlayer2Listener::~JNIMediaPlayer2Listener()
    env->DeleteGlobalRef(mClass);
}

void JNIMediaPlayer2Listener::notify(int msg, int ext1, int ext2, const Parcel *obj)
void JNIMediaPlayer2Listener::notify(int64_t srcId, int msg, int ext1, int ext2, const Parcel *obj)
{
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    if (obj && obj->dataSize() > 0) {
@@ -196,12 +197,12 @@ void JNIMediaPlayer2Listener::notify(int msg, int ext1, int ext2, const Parcel *
            Parcel* nativeParcel = parcelForJavaObject(env, jParcel);
            nativeParcel->setData(obj->data(), obj->dataSize());
            env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
                    msg, ext1, ext2, jParcel);
                    srcId, msg, ext1, ext2, jParcel);
            env->DeleteLocalRef(jParcel);
        }
    } else {
        env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
                msg, ext1, ext2, NULL);
                srcId, msg, ext1, ext2, NULL);
    }
    if (env->ExceptionCheck()) {
        ALOGW("An exception occurred while notifying an event.");
@@ -243,7 +244,11 @@ static void process_media_player_call(
    if (exception == NULL) {  // Don't throw exception. Instead, send an event.
        if (opStatus != (status_t) OK) {
            sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
            if (mp != 0) mp->notify(MEDIA2_ERROR, opStatus, 0);
            if (mp != 0) {
                int64_t srcId = 0;
                mp->getSrcId(&srcId);
                mp->notify(srcId, MEDIA2_ERROR, opStatus, 0);
            }
        }
    } else {  // Throw exception!
        if ( opStatus == (status_t) INVALID_OPERATION ) {
@@ -268,7 +273,7 @@ static void process_media_player_call(

static void
android_media_MediaPlayer2_setDataSourceAndHeaders(
        JNIEnv *env, jobject thiz, jobject httpServiceObj, jstring path,
        JNIEnv *env, jobject thiz, jlong srcId, jobject httpServiceObj, jstring path,
        jobjectArray keys, jobjectArray values) {

    sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
@@ -286,7 +291,7 @@ android_media_MediaPlayer2_setDataSourceAndHeaders(
    if (tmp == NULL) {  // Out of memory
        return;
    }
    ALOGV("setDataSourceAndHeaders: path %s", tmp);
    ALOGV("setDataSourceAndHeaders: path %s, srcId %lld", tmp, (long long)srcId);

    if (strncmp(tmp, "content://", 10) == 0) {
        ALOGE("setDataSourceAndHeaders: content scheme is not supported in native code");
@@ -296,6 +301,7 @@ android_media_MediaPlayer2_setDataSourceAndHeaders(
    }

    sp<DataSourceDesc> dsd = new DataSourceDesc();
    dsd->mId = srcId;
    dsd->mType = DataSourceDesc::TYPE_URL;
    dsd->mUrl = tmp;

@@ -321,7 +327,7 @@ android_media_MediaPlayer2_setDataSourceAndHeaders(

static void
android_media_MediaPlayer2_setDataSourceFD(
    JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length)
    JNIEnv *env, jobject thiz, jlong srcId, jobject fileDescriptor, jlong offset, jlong length)
{
    sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
    if (mp == NULL ) {
@@ -334,8 +340,8 @@ android_media_MediaPlayer2_setDataSourceFD(
        return;
    }
    int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
    ALOGV("setDataSourceFD: fd=%d (%s), offset=%lld, length=%lld",
          fd, nameForFd(fd).c_str(), (long long)offset, (long long)length);
    ALOGV("setDataSourceFD: srcId=%lld, fd=%d (%s), offset=%lld, length=%lld",
          (long long)srcId, fd, nameForFd(fd).c_str(), (long long)offset, (long long)length);

    struct stat sb;
    int ret = fstat(fd, &sb);
@@ -363,6 +369,7 @@ android_media_MediaPlayer2_setDataSourceFD(
    }

    sp<DataSourceDesc> dsd = new DataSourceDesc();
    dsd->mId = srcId;
    dsd->mType = DataSourceDesc::TYPE_FD;
    dsd->mFD = fd;
    dsd->mFDOffset = offset;
@@ -373,7 +380,7 @@ android_media_MediaPlayer2_setDataSourceFD(

static void
android_media_MediaPlayer2_setDataSourceCallback(
    JNIEnv *env, jobject thiz, jobject dataSource)
    JNIEnv *env, jobject thiz, jlong srcId, jobject dataSource)
{
    sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
    if (mp == NULL ) {
@@ -387,6 +394,7 @@ android_media_MediaPlayer2_setDataSourceCallback(
    }
    sp<DataSource> callbackDataSource = new JMedia2DataSource(env, dataSource);
    sp<DataSourceDesc> dsd = new DataSourceDesc();
    dsd->mId = srcId;
    dsd->mType = DataSourceDesc::TYPE_CALLBACK;
    dsd->mCallbackSource = callbackDataSource;
    process_media_player_call(env, thiz, mp->setDataSource(dsd),
@@ -1012,7 +1020,7 @@ android_media_MediaPlayer2_native_init(JNIEnv *env)
    }

    fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
                                               "(Ljava/lang/Object;IIILjava/lang/Object;)V");
                                               "(Ljava/lang/Object;JIIILjava/lang/Object;)V");
    if (fields.post_event == NULL) {
        return;
    }
@@ -1382,13 +1390,13 @@ static void android_media_MediaPlayer2_enableDeviceCallback(
static const JNINativeMethod gMethods[] = {
    {
        "nativeSetDataSource",
        "(Landroid/media/Media2HTTPService;Ljava/lang/String;[Ljava/lang/String;"
        "(JLandroid/media/Media2HTTPService;Ljava/lang/String;[Ljava/lang/String;"
        "[Ljava/lang/String;)V",
        (void *)android_media_MediaPlayer2_setDataSourceAndHeaders
    },

    {"_setDataSource",      "(Ljava/io/FileDescriptor;JJ)V",    (void *)android_media_MediaPlayer2_setDataSourceFD},
    {"_setDataSource",      "(Landroid/media/Media2DataSource;)V",(void *)android_media_MediaPlayer2_setDataSourceCallback },
    {"_setDataSource",      "(JLjava/io/FileDescriptor;JJ)V",    (void *)android_media_MediaPlayer2_setDataSourceFD},
    {"_setDataSource",      "(JLandroid/media/Media2DataSource;)V",(void *)android_media_MediaPlayer2_setDataSourceCallback },
    {"_setVideoSurface",    "(Landroid/view/Surface;)V",        (void *)android_media_MediaPlayer2_setVideoSurface},
    {"getBufferingParams", "()Landroid/media/BufferingParams;", (void *)android_media_MediaPlayer2_getBufferingParams},
    {"setBufferingParams", "(Landroid/media/BufferingParams;)V", (void *)android_media_MediaPlayer2_setBufferingParams},