Merge "Ndk utilities to transate between status_t & media_status_t"
diff --git a/media/libmediaextractor/include/media/DataSourceBase.h b/media/libmediaextractor/include/media/DataSourceBase.h
index 8ce6592..af5b83d 100644
--- a/media/libmediaextractor/include/media/DataSourceBase.h
+++ b/media/libmediaextractor/include/media/DataSourceBase.h
@@ -66,7 +66,7 @@
virtual void close() {};
- virtual ssize_t getAvailableSize(status_t * /*err*/) {
+ virtual status_t getAvailableSize(off64_t /*offset*/, off64_t * /*size*/) {
return -1;
}
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.cpp
index 57d1147..f41a431 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.cpp
@@ -147,9 +147,10 @@
}
uint32_t psshSize = pssh.tellp();
- const uint8_t* psshPtr = reinterpret_cast<const uint8_t*>(pssh.str().c_str());
- const char *psshHex = DrmUUID::arrayToHex(psshPtr, psshSize).string();
- ALOGV("retrieveDrmInfo: MEDIA_DRM_INFO PSSH: size: %u %s", psshSize, psshHex);
+ std::string psshBase = pssh.str();
+ const auto* psshPtr = reinterpret_cast<const uint8_t*>(psshBase.c_str());
+ ALOGV("retrieveDrmInfo: MEDIA_DRM_INFO PSSH: size: %u %s", psshSize,
+ DrmUUID::arrayToHex(psshPtr, psshSize).string());
// 1) Write PSSH bytes
playerMsg->add_values()->set_bytes_value(
diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp
index 81ca3e7..7025af7 100644
--- a/media/libstagefright/NuCachedSource2.cpp
+++ b/media/libstagefright/NuCachedSource2.cpp
@@ -571,12 +571,19 @@
return mCacheOffset + mCache->totalSize();
}
-size_t NuCachedSource2::approxDataRemaining(status_t *finalStatus) const {
+status_t NuCachedSource2::getAvailableSize(off64_t offset, off64_t *size) {
Mutex::Autolock autoLock(mLock);
- return approxDataRemaining_l(finalStatus);
+ status_t finalStatus = UNKNOWN_ERROR;
+ *size = approxDataRemaining_l(offset, &finalStatus);
+ return finalStatus;
}
-size_t NuCachedSource2::approxDataRemaining_l(status_t *finalStatus) const {
+size_t NuCachedSource2::approxDataRemaining(status_t *finalStatus) const {
+ Mutex::Autolock autoLock(mLock);
+ return approxDataRemaining_l(mLastAccessPos, finalStatus);
+}
+
+size_t NuCachedSource2::approxDataRemaining_l(off64_t offset, status_t *finalStatus) const {
*finalStatus = mFinalStatus;
if (mFinalStatus != OK && mNumRetriesLeft > 0) {
@@ -584,9 +591,10 @@
*finalStatus = OK;
}
+ offset = offset >= 0 ? offset : mLastAccessPos;
off64_t lastBytePosCached = mCacheOffset + mCache->totalSize();
- if (mLastAccessPos < lastBytePosCached) {
- return lastBytePosCached - mLastAccessPos;
+ if (offset < lastBytePosCached) {
+ return lastBytePosCached - offset;
}
return 0;
}
diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp
index 0a4dfce..f94648c 100644
--- a/media/libstagefright/NuMediaExtractor.cpp
+++ b/media/libstagefright/NuMediaExtractor.cpp
@@ -780,9 +780,8 @@
int64_t *durationUs, bool *eos) const {
Mutex::Autolock autoLock(mLock);
- status_t finalStatus;
- ssize_t cachedDataRemaining =
- mDataSource->getAvailableSize(&finalStatus);
+ off64_t cachedDataRemaining = -1;
+ status_t finalStatus = mDataSource->getAvailableSize(-1, &cachedDataRemaining);
int64_t bitrate;
if (cachedDataRemaining >= 0
diff --git a/media/libstagefright/include/NuCachedSource2.h b/media/libstagefright/include/NuCachedSource2.h
index 5591525..596efb8 100644
--- a/media/libstagefright/include/NuCachedSource2.h
+++ b/media/libstagefright/include/NuCachedSource2.h
@@ -53,9 +53,7 @@
return mName;
}
- ssize_t getAvailableSize(status_t *finalStatus) {
- return approxDataRemaining(finalStatus);
- }
+ status_t getAvailableSize(off64_t offset, off64_t *size);
////////////////////////////////////////////////////////////////////////////
@@ -141,7 +139,7 @@
ssize_t readInternal(off64_t offset, void *data, size_t size);
status_t seekInternal_l(off64_t offset);
- size_t approxDataRemaining_l(status_t *finalStatus) const;
+ size_t approxDataRemaining_l(off64_t offset, status_t *finalStatus) const;
void restartPrefetcherIfNecessary_l(
bool ignoreLowWaterThreshold = false, bool force = false);
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 380f0fb..088bcaa 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -1013,6 +1013,23 @@
String8 address = outputDevices.size() > 0 ? outputDevices.itemAt(0)->mAddress
: String8("");
+ // MSD patch may be using the only output stream that can service this request. Release
+ // MSD patch to prioritize this request over any active output on MSD.
+ AudioPatchCollection msdPatches = getMsdPatches();
+ for (size_t i = 0; i < msdPatches.size(); i++) {
+ const auto& patch = msdPatches[i];
+ for (size_t j = 0; j < patch->mPatch.num_sinks; ++j) {
+ const struct audio_port_config *sink = &patch->mPatch.sinks[j];
+ if (sink->type == AUDIO_PORT_TYPE_DEVICE &&
+ (sink->ext.device.type & device) != AUDIO_DEVICE_NONE &&
+ (address.isEmpty() || strncmp(sink->ext.device.address, address.string(),
+ AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0)) {
+ releaseAudioPatch(patch->mHandle, mUidCached);
+ break;
+ }
+ }
+ }
+
status = outputDesc->open(config, device, address, stream, *flags, &output);
// only accept an output with the requested parameters
@@ -4561,6 +4578,22 @@
removeOutput(output);
mPreviousOutputs = mOutputs;
+
+ // MSD patches may have been released to support a non-MSD direct output. Reset MSD patch if
+ // no direct outputs are open.
+ if (getMsdAudioOutDeviceTypes() != AUDIO_DEVICE_NONE) {
+ bool directOutputOpen = false;
+ for (size_t i = 0; i < mOutputs.size(); i++) {
+ if (mOutputs[i]->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) {
+ directOutputOpen = true;
+ break;
+ }
+ }
+ if (!directOutputOpen) {
+ ALOGV("no direct outputs open, reset MSD patch");
+ setMsdPatch();
+ }
+ }
}
void AudioPolicyManager::closeInput(audio_io_handle_t input)