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

Commit 13497d02 authored by Dichen Zhang's avatar Dichen Zhang
Browse files

Fix android.media.cts.MediaPlayerFlakyNetworkTest failure

Added mDisconnectLock to seperate it from mLock, used for protecting
mDataSource, mHttpSource and mDisconnected in order that disconnect()
won't be blocked by mLock.

Bug: 133900877
Test: android.media.cts.MediaPlayerFlakyNetworkTest
Change-Id: I15693c0a61f898aad4035d0fa55c8af25de4fc96
parent ca77ca26
Loading
Loading
Loading
Loading
+37 −10
Original line number Diff line number Diff line
@@ -90,8 +90,11 @@ void NuPlayer::GenericSource::resetDataSource() {
    ALOGV("resetDataSource");

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

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

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

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

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

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

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

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

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

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

    mDisconnectLock.unlock();

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

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

        mCachedSource.clear();

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

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

    sp<ALooper> mLooper;