MediaPlayer2: add native DataSourceDesc.

Test: MediaPlayer2 plays
Bug: 63934228
Change-Id: Idd5bda81c2cc26c7aac8e64a21ccc2f6b3ac8a39
diff --git a/media/libmedia/nuplayer2/NuPlayer2.cpp b/media/libmedia/nuplayer2/NuPlayer2.cpp
index 2c7f416..35e20e8 100644
--- a/media/libmedia/nuplayer2/NuPlayer2.cpp
+++ b/media/libmedia/nuplayer2/NuPlayer2.cpp
@@ -43,6 +43,7 @@
 #include <media/AudioParameter.h>
 #include <media/AudioResamplerPublic.h>
 #include <media/AVSyncSettings.h>
+#include <media/DataSourceDesc.h>
 #include <media/MediaCodecBuffer.h>
 #include <media/NdkWrapper.h>
 
@@ -258,16 +259,6 @@
     mDriver = driver;
 }
 
-void NuPlayer2::setDataSourceAsync(const sp<IStreamSource> &source) {
-    sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
-
-    sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
-
-    msg->setObject("source", new StreamingSource(notify, source));
-    msg->post();
-    mDataSourceType = DATA_SOURCE_TYPE_STREAM;
-}
-
 static bool IsHTTPLiveURL(const char *url) {
     if (!strncasecmp("http://", url, 7)
             || !strncasecmp("https://", url, 8)
@@ -285,93 +276,102 @@
     return false;
 }
 
-void NuPlayer2::setDataSourceAsync(
-        const sp<MediaHTTPService> &httpService,
-        const char *url,
-        const KeyedVector<String8, String8> *headers) {
-
+void NuPlayer2::setDataSourceAsync(const sp<DataSourceDesc> &dsd) {
     sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
-    size_t len = strlen(url);
-
     sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
-
     sp<Source> source;
-    if (IsHTTPLiveURL(url)) {
-        source = new HTTPLiveSource(notify, httpService, url, headers);
-        ALOGV("setDataSourceAsync HTTPLiveSource %s", url);
-        mDataSourceType = DATA_SOURCE_TYPE_HTTP_LIVE;
-    } else if (!strncasecmp(url, "rtsp://", 7)) {
-        source = new RTSPSource(
-                notify, httpService, url, headers, mUIDValid, mUID);
-        ALOGV("setDataSourceAsync RTSPSource %s", url);
-        mDataSourceType = DATA_SOURCE_TYPE_RTSP;
-    } else if ((!strncasecmp(url, "http://", 7)
-                || !strncasecmp(url, "https://", 8))
-                    && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4]))
-                    || strstr(url, ".sdp?"))) {
-        source = new RTSPSource(
-                notify, httpService, url, headers, mUIDValid, mUID, true);
-        ALOGV("setDataSourceAsync RTSPSource http/https/.sdp %s", url);
-        mDataSourceType = DATA_SOURCE_TYPE_RTSP;
-    } else {
-        ALOGV("setDataSourceAsync GenericSource %s", url);
 
-        sp<GenericSource> genericSource =
-                new GenericSource(notify, mUIDValid, mUID, mMediaClock);
+    switch (dsd->mType) {
+        case DataSourceDesc::TYPE_URL:
+        {
+            const char *url = dsd->mUrl.c_str();
+            size_t len = strlen(url);
 
-        status_t err = genericSource->setDataSource(httpService, url, headers);
+            const sp<MediaHTTPService> &httpService = dsd->mHttpService;
+            KeyedVector<String8, String8> *headers = &(dsd->mHeaders);
 
-        if (err == OK) {
-            source = genericSource;
-        } else {
-            ALOGE("Failed to set data source!");
+            if (IsHTTPLiveURL(url)) {
+                source = new HTTPLiveSource(notify, httpService, url, headers);
+                ALOGV("setDataSourceAsync HTTPLiveSource %s", url);
+                mDataSourceType = DATA_SOURCE_TYPE_HTTP_LIVE;
+            } else if (!strncasecmp(url, "rtsp://", 7)) {
+                source = new RTSPSource(
+                        notify, httpService, url, headers, mUIDValid, mUID);
+                ALOGV("setDataSourceAsync RTSPSource %s", url);
+                mDataSourceType = DATA_SOURCE_TYPE_RTSP;
+            } else if ((!strncasecmp(url, "http://", 7)
+                        || !strncasecmp(url, "https://", 8))
+                            && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4]))
+                            || strstr(url, ".sdp?"))) {
+                source = new RTSPSource(
+                        notify, httpService, url, headers, mUIDValid, mUID, true);
+                ALOGV("setDataSourceAsync RTSPSource http/https/.sdp %s", url);
+                mDataSourceType = DATA_SOURCE_TYPE_RTSP;
+            } else {
+                ALOGV("setDataSourceAsync GenericSource %s", url);
+
+                sp<GenericSource> genericSource =
+                        new GenericSource(notify, mUIDValid, mUID, mMediaClock);
+
+                status_t err = genericSource->setDataSource(httpService, url, headers);
+
+                if (err == OK) {
+                    source = genericSource;
+                } else {
+                    ALOGE("Failed to set data source!");
+                }
+
+                // regardless of success/failure
+                mDataSourceType = DATA_SOURCE_TYPE_GENERIC_URL;
+            }
+            break;
         }
 
-        // regardless of success/failure
-        mDataSourceType = DATA_SOURCE_TYPE_GENERIC_URL;
-    }
-    msg->setObject("source", source);
-    msg->post();
-}
+        case DataSourceDesc::TYPE_FD:
+        {
+            sp<GenericSource> genericSource =
+                    new GenericSource(notify, mUIDValid, mUID, mMediaClock);
 
-void NuPlayer2::setDataSourceAsync(int fd, int64_t offset, int64_t length) {
-    sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
+            ALOGV("setDataSourceAsync fd %d/%lld/%lld source: %p",
+                  dsd->mFD, (long long)dsd->mFDOffset, (long long)dsd->mFDLength, source.get());
 
-    sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
+            status_t err = genericSource->setDataSource(dsd->mFD, dsd->mFDOffset, dsd->mFDLength);
 
-    sp<GenericSource> source =
-            new GenericSource(notify, mUIDValid, mUID, mMediaClock);
+            if (err != OK) {
+                ALOGE("Failed to set data source!");
+                source = NULL;
+            } else {
+                source = genericSource;
+            }
 
-    ALOGV("setDataSourceAsync fd %d/%lld/%lld source: %p",
-            fd, (long long)offset, (long long)length, source.get());
+            mDataSourceType = DATA_SOURCE_TYPE_GENERIC_FD;
+            break;
+        }
 
-    status_t err = source->setDataSource(fd, offset, length);
+        case DataSourceDesc::TYPE_CALLBACK:
+        {
+            sp<GenericSource> genericSource =
+                    new GenericSource(notify, mUIDValid, mUID, mMediaClock);
+            status_t err = genericSource->setDataSource(dsd->mCallbackSource);
 
-    if (err != OK) {
-        ALOGE("Failed to set data source!");
-        source = NULL;
+            if (err != OK) {
+                ALOGE("Failed to set data source!");
+                source = NULL;
+            } else {
+                source = genericSource;
+            }
+
+            mDataSourceType = DATA_SOURCE_TYPE_MEDIA;
+            break;
+        }
+
+        default:
+            ALOGE("invalid data source type!");
+            break;
     }
 
     msg->setObject("source", source);
     msg->post();
-    mDataSourceType = DATA_SOURCE_TYPE_GENERIC_FD;
-}
-
-void NuPlayer2::setDataSourceAsync(const sp<DataSource> &dataSource) {
-    sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
-    sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
-
-    sp<GenericSource> source = new GenericSource(notify, mUIDValid, mUID, mMediaClock);
-    status_t err = source->setDataSource(dataSource);
-
-    if (err != OK) {
-        ALOGE("Failed to set data source!");
-        source = NULL;
-    }
-
-    msg->setObject("source", source);
-    msg->post();
-    mDataSourceType = DATA_SOURCE_TYPE_MEDIA;
 }
 
 status_t NuPlayer2::getBufferingSettings(
diff --git a/media/libmedia/nuplayer2/NuPlayer2.h b/media/libmedia/nuplayer2/NuPlayer2.h
index 23c4fdf..0764ec3 100644
--- a/media/libmedia/nuplayer2/NuPlayer2.h
+++ b/media/libmedia/nuplayer2/NuPlayer2.h
@@ -30,6 +30,7 @@
 struct ANativeWindowWrapper;
 struct AudioPlaybackRate;
 struct AVSyncSettings;
+struct DataSourceDesc;
 class IDataSource;
 struct MediaClock;
 struct MediaHTTPService;
@@ -43,16 +44,7 @@
 
     void setDriver(const wp<NuPlayer2Driver> &driver);
 
-    void setDataSourceAsync(const sp<IStreamSource> &source);
-
-    void setDataSourceAsync(
-            const sp<MediaHTTPService> &httpService,
-            const char *url,
-            const KeyedVector<String8, String8> *headers);
-
-    void setDataSourceAsync(int fd, int64_t offset, int64_t length);
-
-    void setDataSourceAsync(const sp<DataSource> &source);
+    void setDataSourceAsync(const sp<DataSourceDesc> &dsd);
 
     status_t getBufferingSettings(BufferingSettings* buffering /* nonnull */);
     status_t setBufferingSettings(const BufferingSettings& buffering);
diff --git a/media/libmedia/nuplayer2/NuPlayer2DecoderBase.cpp b/media/libmedia/nuplayer2/NuPlayer2DecoderBase.cpp
index 4d80912..9c1988f 100644
--- a/media/libmedia/nuplayer2/NuPlayer2DecoderBase.cpp
+++ b/media/libmedia/nuplayer2/NuPlayer2DecoderBase.cpp
@@ -39,7 +39,9 @@
     // are blocking, but NuPlayer2 needs asynchronous operations.
     mDecoderLooper = new ALooper;
     mDecoderLooper->setName("NPDecoder");
-    mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
+    mDecoderLooper->start(false, /* runOnCallingThread */
+                          true,  /* canCallJava */
+                          ANDROID_PRIORITY_AUDIO);
 }
 
 NuPlayer2::DecoderBase::~DecoderBase() {
diff --git a/media/libmedia/nuplayer2/NuPlayer2Driver.cpp b/media/libmedia/nuplayer2/NuPlayer2Driver.cpp
index e48acea..6137fd1 100644
--- a/media/libmedia/nuplayer2/NuPlayer2Driver.cpp
+++ b/media/libmedia/nuplayer2/NuPlayer2Driver.cpp
@@ -175,67 +175,7 @@
     return OK;
 }
 
-status_t NuPlayer2Driver::setDataSource(
-        const sp<MediaHTTPService> &httpService,
-        const char *url,
-        const KeyedVector<String8, String8> *headers) {
-    ALOGV("setDataSource(%p) url(%s)", this, uriDebugString(url, false).c_str());
-    Mutex::Autolock autoLock(mLock);
-
-    if (mState != STATE_IDLE) {
-        return INVALID_OPERATION;
-    }
-
-    mState = STATE_SET_DATASOURCE_PENDING;
-
-    mPlayer->setDataSourceAsync(httpService, url, headers);
-
-    while (mState == STATE_SET_DATASOURCE_PENDING) {
-        mCondition.wait(mLock);
-    }
-
-    return mAsyncResult;
-}
-
-status_t NuPlayer2Driver::setDataSource(int fd, int64_t offset, int64_t length) {
-    ALOGV("setDataSource(%p) file(%d)", this, fd);
-    Mutex::Autolock autoLock(mLock);
-
-    if (mState != STATE_IDLE) {
-        return INVALID_OPERATION;
-    }
-
-    mState = STATE_SET_DATASOURCE_PENDING;
-
-    mPlayer->setDataSourceAsync(fd, offset, length);
-
-    while (mState == STATE_SET_DATASOURCE_PENDING) {
-        mCondition.wait(mLock);
-    }
-
-    return mAsyncResult;
-}
-
-status_t NuPlayer2Driver::setDataSource(const sp<IStreamSource> &source) {
-    ALOGV("setDataSource(%p) stream source", this);
-    Mutex::Autolock autoLock(mLock);
-
-    if (mState != STATE_IDLE) {
-        return INVALID_OPERATION;
-    }
-
-    mState = STATE_SET_DATASOURCE_PENDING;
-
-    mPlayer->setDataSourceAsync(source);
-
-    while (mState == STATE_SET_DATASOURCE_PENDING) {
-        mCondition.wait(mLock);
-    }
-
-    return mAsyncResult;
-}
-
-status_t NuPlayer2Driver::setDataSource(const sp<DataSource> &source) {
+status_t NuPlayer2Driver::setDataSource(const sp<DataSourceDesc> &dsd) {
     ALOGV("setDataSource(%p) callback source", this);
     Mutex::Autolock autoLock(mLock);
 
@@ -245,7 +185,7 @@
 
     mState = STATE_SET_DATASOURCE_PENDING;
 
-    mPlayer->setDataSourceAsync(source);
+    mPlayer->setDataSourceAsync(dsd);
 
     while (mState == STATE_SET_DATASOURCE_PENDING) {
         mCondition.wait(mLock);
diff --git a/media/libmedia/nuplayer2/NuPlayer2Driver.h b/media/libmedia/nuplayer2/NuPlayer2Driver.h
index 7bbb367..55fc9ef 100644
--- a/media/libmedia/nuplayer2/NuPlayer2Driver.h
+++ b/media/libmedia/nuplayer2/NuPlayer2Driver.h
@@ -32,16 +32,7 @@
 
     virtual status_t setUID(uid_t uid);
 
-    virtual status_t setDataSource(
-            const sp<MediaHTTPService> &httpService,
-            const char *url,
-            const KeyedVector<String8, String8> *headers);
-
-    virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
-
-    virtual status_t setDataSource(const sp<IStreamSource> &source);
-
-    virtual status_t setDataSource(const sp<DataSource>& dataSource);
+    virtual status_t setDataSource(const sp<DataSourceDesc> &dsd) override;
 
     virtual status_t setVideoSurfaceTexture(const sp<ANativeWindowWrapper> &nww);