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

Commit aefeb2ab authored by Dichen Zhang's avatar Dichen Zhang Committed by android-build-merger
Browse files

Merge "Fix android.media.cts.MediaPlayerFlakyNetworkTest failure" into qt-dev

am: e0092766

Change-Id: I71c6e8d5658ac9bf4a05d8882dad40ba232cd0d4
parents c7c45c60 e0092766
Loading
Loading
Loading
Loading
+37 −10
Original line number Original line Diff line number Diff line
@@ -90,8 +90,11 @@ void NuPlayer::GenericSource::resetDataSource() {
    ALOGV("resetDataSource");
    ALOGV("resetDataSource");


    mHTTPService.clear();
    mHTTPService.clear();
    {
        Mutex::Autolock _l_d(mDisconnectLock);
        mHttpSource.clear();
        mHttpSource.clear();
        mDisconnected = false;
        mDisconnected = false;
    }
    mUri.clear();
    mUri.clear();
    mUriHeaders.clear();
    mUriHeaders.clear();
    mSources.clear();
    mSources.clear();
@@ -152,7 +155,10 @@ status_t NuPlayer::GenericSource::setDataSource(const sp<DataSource>& source) {
    ALOGV("setDataSource (source: %p)", source.get());
    ALOGV("setDataSource (source: %p)", source.get());


    resetDataSource();
    resetDataSource();
    {
        Mutex::Autolock _l_d(mDisconnectLock);
        mDataSource = source;
        mDataSource = source;
    }
    return OK;
    return OK;
}
}


@@ -163,8 +169,12 @@ sp<MetaData> NuPlayer::GenericSource::getFileFormatMeta() const {


status_t NuPlayer::GenericSource::initFromDataSource() {
status_t NuPlayer::GenericSource::initFromDataSource() {
    sp<IMediaExtractor> extractor;
    sp<IMediaExtractor> extractor;
    CHECK(mDataSource != NULL);
    sp<DataSource> dataSource;
    sp<DataSource> dataSource = mDataSource;
    {
        Mutex::Autolock _l_d(mDisconnectLock);
        dataSource = mDataSource;
    }
    CHECK(dataSource != NULL);


    mLock.unlock();
    mLock.unlock();
    // This might take long time if data source is not reliable.
    // This might take long time if data source is not reliable.
@@ -359,6 +369,7 @@ void NuPlayer::GenericSource::prepareAsync() {
}
}


void NuPlayer::GenericSource::onPrepareAsync() {
void NuPlayer::GenericSource::onPrepareAsync() {
    mDisconnectLock.lock();
    ALOGV("onPrepareAsync: mDataSource: %d", (mDataSource != NULL));
    ALOGV("onPrepareAsync: mDataSource: %d", (mDataSource != NULL));


    // delayed data source creation
    // delayed data source creation
@@ -372,20 +383,30 @@ void NuPlayer::GenericSource::onPrepareAsync() {
            String8 contentType;
            String8 contentType;


            if (!strncasecmp("http://", uri, 7) || !strncasecmp("https://", uri, 8)) {
            if (!strncasecmp("http://", uri, 7) || !strncasecmp("https://", uri, 8)) {
                mHttpSource = DataSourceFactory::CreateMediaHTTP(mHTTPService);
                sp<DataSource> httpSource;
                if (mHttpSource == NULL) {
                mDisconnectLock.unlock();
                httpSource = DataSourceFactory::CreateMediaHTTP(mHTTPService);
                if (httpSource == NULL) {
                    ALOGE("Failed to create http source!");
                    ALOGE("Failed to create http source!");
                    notifyPreparedAndCleanup(UNKNOWN_ERROR);
                    notifyPreparedAndCleanup(UNKNOWN_ERROR);
                    mDisconnectLock.lock();
                    return;
                    return;
                }
                }
                mDisconnectLock.lock();

                if (!mDisconnected) {
                    mHttpSource = httpSource;
                }
            }
            }


            mLock.unlock();
            mLock.unlock();
            mDisconnectLock.unlock();
            // This might take long time if connection has some issue.
            // This might take long time if connection has some issue.
            sp<DataSource> dataSource = DataSourceFactory::CreateFromURI(
            sp<DataSource> dataSource = DataSourceFactory::CreateFromURI(
                   mHTTPService, uri, &mUriHeaders, &contentType,
                   mHTTPService, uri, &mUriHeaders, &contentType,
                   static_cast<HTTPBase *>(mHttpSource.get()));
                   static_cast<HTTPBase *>(mHttpSource.get()));
            mLock.lock();
            mLock.lock();
            mDisconnectLock.lock();
            if (!mDisconnected) {
            if (!mDisconnected) {
                mDataSource = dataSource;
                mDataSource = dataSource;
            }
            }
@@ -437,6 +458,8 @@ void NuPlayer::GenericSource::onPrepareAsync() {
        mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get());
        mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get());
    }
    }


    mDisconnectLock.unlock();

    // For cached streaming cases, we need to wait for enough
    // For cached streaming cases, we need to wait for enough
    // buffering before reporting prepared.
    // buffering before reporting prepared.
    mIsStreaming = (mCachedSource != NULL);
    mIsStreaming = (mCachedSource != NULL);
@@ -503,9 +526,13 @@ void NuPlayer::GenericSource::finishPrepareAsync() {


void NuPlayer::GenericSource::notifyPreparedAndCleanup(status_t err) {
void NuPlayer::GenericSource::notifyPreparedAndCleanup(status_t err) {
    if (err != OK) {
    if (err != OK) {
        {
            Mutex::Autolock _l_d(mDisconnectLock);
            mDataSource.clear();
            mDataSource.clear();
        mCachedSource.clear();
            mHttpSource.clear();
            mHttpSource.clear();
        }

        mCachedSource.clear();


        mBitrate = -1;
        mBitrate = -1;
        mPrevBufferPercentage = -1;
        mPrevBufferPercentage = -1;
@@ -547,7 +574,7 @@ void NuPlayer::GenericSource::resume() {
void NuPlayer::GenericSource::disconnect() {
void NuPlayer::GenericSource::disconnect() {
    sp<DataSource> dataSource, httpSource;
    sp<DataSource> dataSource, httpSource;
    {
    {
        Mutex::Autolock _l(mLock);
        Mutex::Autolock _l_d(mDisconnectLock);
        dataSource = mDataSource;
        dataSource = mDataSource;
        httpSource = mHttpSource;
        httpSource = mHttpSource;
        mDisconnected = true;
        mDisconnected = true;
+1 −0
Original line number Original line Diff line number Diff line
@@ -170,6 +170,7 @@ private:
    sp<ABuffer> mGlobalTimedText;
    sp<ABuffer> mGlobalTimedText;


    mutable Mutex mLock;
    mutable Mutex mLock;
    mutable Mutex mDisconnectLock; // Protects mDataSource, mHttpSource and mDisconnected


    sp<ALooper> mLooper;
    sp<ALooper> mLooper;