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
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index 5a58aa0..5c77e41 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -90,8 +90,11 @@
ALOGV("resetDataSource");
mHTTPService.clear();
- mHttpSource.clear();
- mDisconnected = false;
+ {
+ Mutex::Autolock _l_d(mDisconnectLock);
+ mHttpSource.clear();
+ mDisconnected = false;
+ }
mUri.clear();
mUriHeaders.clear();
mSources.clear();
@@ -152,7 +155,10 @@
ALOGV("setDataSource (source: %p)", source.get());
resetDataSource();
- mDataSource = source;
+ {
+ Mutex::Autolock _l_d(mDisconnectLock);
+ mDataSource = source;
+ }
return OK;
}
@@ -163,8 +169,12 @@
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::onPrepareAsync() {
+ mDisconnectLock.lock();
ALOGV("onPrepareAsync: mDataSource: %d", (mDataSource != NULL));
// delayed data source creation
@@ -372,20 +383,30 @@
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 @@
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::notifyPreparedAndCleanup(status_t err) {
if (err != OK) {
- mDataSource.clear();
+ {
+ Mutex::Autolock _l_d(mDisconnectLock);
+ mDataSource.clear();
+ mHttpSource.clear();
+ }
+
mCachedSource.clear();
- mHttpSource.clear();
mBitrate = -1;
mPrevBufferPercentage = -1;
@@ -547,7 +574,7 @@
void NuPlayer::GenericSource::disconnect() {
sp<DataSource> dataSource, httpSource;
{
- Mutex::Autolock _l(mLock);
+ Mutex::Autolock _l_d(mDisconnectLock);
dataSource = mDataSource;
httpSource = mHttpSource;
mDisconnected = true;
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h
index 065cac1..4d1905d 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.h
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.h
@@ -170,6 +170,7 @@
sp<ABuffer> mGlobalTimedText;
mutable Mutex mLock;
+ mutable Mutex mDisconnectLock; // Protects mDataSource, mHttpSource and mDisconnected
sp<ALooper> mLooper;