Merge "Camera: Add links to mandatory stream combination tables" into udc-dev
diff --git a/media/codec2/sfplugin/Codec2InfoBuilder.cpp b/media/codec2/sfplugin/Codec2InfoBuilder.cpp
index e18dd59..453a0d2 100644
--- a/media/codec2/sfplugin/Codec2InfoBuilder.cpp
+++ b/media/codec2/sfplugin/Codec2InfoBuilder.cpp
@@ -637,10 +637,6 @@
if (encoder) {
attrs |= MediaCodecInfo::kFlagIsEncoder;
}
- if (codec.quirkSet.find("attribute::enforce-xml-capabilities") !=
- codec.quirkSet.end()) {
- attrs |= MediaCodecInfo::kFlagIsEnforceXmlCapabilities;
- }
if (trait.owner == "software") {
attrs |= MediaCodecInfo::kFlagIsSoftwareOnly;
} else {
diff --git a/media/libmedia/MediaCodecInfo.cpp b/media/libmedia/MediaCodecInfo.cpp
index 3ebd13e..86ad997 100644
--- a/media/libmedia/MediaCodecInfo.cpp
+++ b/media/libmedia/MediaCodecInfo.cpp
@@ -102,111 +102,6 @@
return OK;
}
-static int32_t convertToIntNoSign(const AString &str) {
- char *end;
- unsigned long u = strtoul(str.c_str(), &end, 10);
- if (end == str.c_str() || *end != '\0') {
- // malformed integer
- return -1;
- }
- if (u > INT32_MAX) {
- // The number is too big
- return -1;
- }
- return static_cast<int32_t>(u);
-}
-
-static void parseSize(const AString &str, int32_t *width, int32_t *height) {
- ssize_t ix = str.find("x");
- if (ix == -1) {
- ix = str.find("*");
- if (ix == -1) {
- return;
- }
- }
- AString wStr(str, 0, ix);
- AString hStr(str, ix + 1, str.size() - ix - 1);
- *width = convertToIntNoSign(wStr);
- *height = convertToIntNoSign(hStr);
-}
-
-static void parseRange(const AString &str, int32_t *min, int32_t *max) {
- ssize_t ix = str.find("-");
- if (ix == -1) {
- return;
- }
- AString minStr(str, 0, ix);
- AString maxStr(str, ix + 1, str.size() - ix - 1);
- *min = convertToIntNoSign(minStr);
- *max = convertToIntNoSign(maxStr);
-}
-
-static void parseSizeRange(const AString &str, int32_t *minWidth, int32_t *minHeight,
- int32_t *maxWidth, int32_t *maxHeight) {
- ssize_t ix = str.find("-");
- if (ix == -1) {
- return;
- }
- AString minSize(str, 0, ix);
- AString maxSize(str, ix + 1, str.size() - ix - 1);
- parseSize(minSize, minWidth, minHeight);
- parseSize(maxSize, maxWidth, maxHeight);
-}
-
-
-bool MediaCodecInfo::Capabilities::isResolutionSupported(int32_t width, int32_t height) {
- AString blockSizeStr;
- AString blockCountStr;
- int32_t blockWidth = -1;
- int32_t blockHeight = -1;
- int32_t maxBlocks = -1;
- int32_t minBlocks = -1;
-
- if (mDetails->findString("block-size", &blockSizeStr)) {
- parseSize(blockSizeStr, &blockWidth, &blockHeight);
- }
- if (mDetails->findString("block-count-range", &blockCountStr)) {
- parseRange(blockCountStr, &minBlocks, &maxBlocks);
- }
- if (maxBlocks != -1 && blockWidth != -1 && blockHeight != -1) {
- if (maxBlocks < ((width + blockWidth - 1) / blockWidth) *
- ((height + blockHeight - 1) / blockHeight)) {
- return false;
- }
- }
-
- AString sizeRangeStr;
- int32_t maxWidth = -1;
- int32_t maxHeight = -1;
- int32_t minWidth = -1;
- int32_t minHeight = -1;
-
- if (mDetails->findString("size-range", &sizeRangeStr)) {
- parseSizeRange(sizeRangeStr, &minWidth, &minHeight, &maxWidth, &maxHeight);
- }
-
- if (maxWidth != -1 && maxHeight != -1) {
- // The logic is that the format is not supported if width or height is outside
- // of min-max limits, UNLESS codec allows to swap it and in this case format is
- // not supported if width is outside of min-max height or height is outside of
- // min-max width
- if (width < minWidth || height < minHeight ||
- width > maxWidth || height > maxHeight) {
- int32_t swappable = 0;
- if (!mDetails->findInt32("feature-can-swap-width-height", &swappable) ||
- swappable == 0) {
- return false;
- }
- if (width < minHeight || height < minWidth ||
- width > maxHeight || height > maxWidth) {
- return false;
- }
- }
- }
- return true;
-}
-
-
void MediaCodecInfo::CapabilitiesWriter::addDetail(
const char* key, const char* value) {
mCap->mDetails->setString(key, value);
diff --git a/media/libmedia/include/media/MediaCodecInfo.h b/media/libmedia/include/media/MediaCodecInfo.h
index 855bc28..54f565a 100644
--- a/media/libmedia/include/media/MediaCodecInfo.h
+++ b/media/libmedia/include/media/MediaCodecInfo.h
@@ -59,7 +59,6 @@
kFlagIsVendor = 1 << 1,
kFlagIsSoftwareOnly = 1 << 2,
kFlagIsHardwareAccelerated = 1 << 3,
- kFlagIsEnforceXmlCapabilities = 1 << 4,
};
struct Capabilities : public RefBase {
@@ -97,8 +96,6 @@
*/
const sp<AMessage> getDetails() const;
- bool isResolutionSupported(int32_t width, int32_t height);
-
protected:
Vector<ProfileLevel> mProfileLevels;
SortedVector<ProfileLevel> mProfileLevelsSorted;
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 54ca1ea..e0ebc11 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -2048,40 +2048,6 @@
return configure(format, nativeWindow, crypto, NULL, flags);
}
-bool MediaCodec::isResolutionSupported(const sp<AMessage>& format) {
- int32_t width = -1;
- int32_t height = -1;
- int32_t maxWidth = -1;
- int32_t maxHeight = -1;
- format->findInt32("width", &width);
- format->findInt32("height", &height);
- format->findInt32("max-width", &maxWidth);
- format->findInt32("max-height", &maxHeight);
- AString mediaType;
- if (!format->findString("mime", &mediaType)) {
- ALOGI("Can not check mediaFormat: No MIME set.");
- return true;
- }
- sp<MediaCodecInfo::Capabilities> caps = mCodecInfo->getCapabilitiesFor(mediaType.c_str());
- if (caps == NULL) {
- ALOGI("Can not get Capabilities for MIME %s.", mediaType.c_str());
- return true;
- }
- if (width != -1 && height != -1) {
- if (!caps->isResolutionSupported(width, height)) {
- ALOGD("Frame resolution (%dx%d) is beyond codec capabilities", width, height);
- return false;
- }
- }
- if (maxWidth != -1 && maxHeight != -1) {
- if (!caps->isResolutionSupported(maxWidth, maxHeight)) {
- ALOGD("Max frame resolution (%dx%d) is beyond codec capabilities", maxWidth, maxHeight);
- return false;
- }
- }
- return true;
-}
-
status_t MediaCodec::configure(
const sp<AMessage> &format,
const sp<Surface> &surface,
@@ -2169,24 +2135,7 @@
mediametrics_delete(nextMetricsHandle);
return BAD_VALUE;
}
- // For applications built with targetSdkVersion of Android U or later (or if MediaCodec's
- // caller is not an app) we enforce codec resolution capabilities if such enforcement is
- // required by 'enforce-xml-capabilities' attribute
- if (android_get_application_target_sdk_version() >= __ANDROID_API_U__) {
- if (mCodecInfo != nullptr &&
- (mCodecInfo->getAttributes() &
- MediaCodecInfo::kFlagIsEnforceXmlCapabilities)) {
- if (!isResolutionSupported(format)) {
- mErrorLog.log(LOG_TAG,
- base::StringPrintf("The input resolution of %dx%d is not "
- "supported for this codec; please query MediaCodecList "
- "for the supported formats including the resolution. See "
- "CodecCapabilities#isFormatSupported() and "
- "VideoCapabilities#isSizeSupported()", mWidth, mHeight));
- return BAD_VALUE;
- }
- }
- }
+
} else {
if (nextMetricsHandle != 0) {
int32_t channelCount;
diff --git a/media/libstagefright/include/media/stagefright/MediaCodec.h b/media/libstagefright/include/media/stagefright/MediaCodec.h
index 144ea53..52d7d3d 100644
--- a/media/libstagefright/include/media/stagefright/MediaCodec.h
+++ b/media/libstagefright/include/media/stagefright/MediaCodec.h
@@ -462,7 +462,6 @@
constexpr const char *asString(TunnelPeekState state, const char *default_string="?");
void updateTunnelPeek(const sp<AMessage> &msg);
void processRenderedFrames(const sp<AMessage> &msg);
- bool isResolutionSupported(const sp<AMessage> &format);
inline void initClientConfigParcel(ClientConfigParcel& clientConfig);
diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
index 4cfdaad..5f257f0 100644
--- a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
@@ -183,7 +183,8 @@
for (size_t i = 0; i < size(); i++) {
const sp<AudioPolicyMix>& registeredMix = itemAt(i);
if (mix.mDeviceType == registeredMix->mDeviceType
- && mix.mDeviceAddress.compare(registeredMix->mDeviceAddress) == 0) {
+ && mix.mDeviceAddress.compare(registeredMix->mDeviceAddress) == 0
+ && is_mix_loopback(mix.mRouteFlags)) {
ALOGE("registerMix(): mix already registered for dev=0x%x addr=%s",
mix.mDeviceType, mix.mDeviceAddress.string());
return BAD_VALUE;
diff --git a/services/audiopolicy/tests/audiopolicymanager_tests.cpp b/services/audiopolicy/tests/audiopolicymanager_tests.cpp
index 97a1e0d..34c3749 100644
--- a/services/audiopolicy/tests/audiopolicymanager_tests.cpp
+++ b/services/audiopolicy/tests/audiopolicymanager_tests.cpp
@@ -1337,13 +1337,14 @@
AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig);
ASSERT_EQ(INVALID_OPERATION, ret);
- // The first time to register valid policy mixes should succeed.
+ // The first time to register valid loopback policy mix should succeed.
clearPolicyMix();
- ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
- AUDIO_DEVICE_OUT_SPEAKER, "", audioConfig);
+ ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK,
+ AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "addr", audioConfig);
ASSERT_EQ(NO_ERROR, ret);
- // Registering the same policy mixes should fail.
- ret = mManager->registerPolicyMixes(mAudioMixes);
+ // Registering the render policy for the loopback address should succeed.
+ ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER,
+ AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "addr", audioConfig);
ASSERT_EQ(INVALID_OPERATION, ret);
}
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index cfe51c7..61c3298 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1645,6 +1645,10 @@
bool stateSeen = false;
nsecs_t startTime = systemTime();
do {
+ if (mStatus == STATUS_ERROR) {
+ // Device in error state. Return right away.
+ break;
+ }
if (active == (mStatus == STATUS_ACTIVE) &&
(requestThreadInvocation || !mStatusIsInternal)) {
// Desired state is current
@@ -1674,6 +1678,11 @@
// they are not paused. This avoids intermediate pause signals from reconfigureCamera as it
// changes the status to active right after.
for (size_t i = startIndex; i < mRecentStatusUpdates.size(); i++) {
+ if (mRecentStatusUpdates[i].status == STATUS_ERROR) {
+ // Device in error state. Return right away.
+ stateSeen = true;
+ break;
+ }
if (active == (mRecentStatusUpdates[i].status == STATUS_ACTIVE) &&
(requestThreadInvocation || !mRecentStatusUpdates[i].isInternal)) {
stateSeen = true;
@@ -2365,6 +2374,9 @@
//present streams end up with outstanding buffers that will
//not get drained.
internalUpdateStatusLocked(STATUS_ACTIVE);
+
+ mCameraServiceProxyWrapper->logStreamConfigured(mId, mOperatingMode,
+ true /*internalReconfig*/, ns2ms(systemTime() - startTime));
} else if (rc == DEAD_OBJECT) {
// DEAD_OBJECT can be returned if either the consumer surface is
// abandoned, or the HAL has died.
@@ -2380,9 +2392,6 @@
ALOGE("%s: Failed to pause streaming: %d", __FUNCTION__, rc);
}
- mCameraServiceProxyWrapper->logStreamConfigured(mId, mOperatingMode, true /*internalReconfig*/,
- ns2ms(systemTime() - startTime));
-
if (markClientActive) {
mStatusTracker->markComponentActive(clientStatusId);
}
diff --git a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
index 3aff2ac..b58975f 100644
--- a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
+++ b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
@@ -243,12 +243,12 @@
std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
{
Mutex::Autolock l(mLock);
- sessionStats = mSessionStatsMap[id];
- if (sessionStats == nullptr) {
+ if (mSessionStatsMap.count(id) == 0) {
ALOGE("%s: SessionStatsMap should contain camera %s",
__FUNCTION__, id.c_str());
return;
}
+ sessionStats = mSessionStatsMap[id];
}
ALOGV("%s: id %s, operatingMode %d, internalConfig %d, latencyMs %d",
@@ -260,12 +260,12 @@
std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
{
Mutex::Autolock l(mLock);
- sessionStats = mSessionStatsMap[id];
- if (sessionStats == nullptr) {
+ if (mSessionStatsMap.count(id) == 0) {
ALOGE("%s: SessionStatsMap should contain camera %s when logActive is called",
__FUNCTION__, id.c_str());
return;
}
+ sessionStats = mSessionStatsMap[id];
}
ALOGV("%s: id %s", __FUNCTION__, id.c_str());
@@ -280,13 +280,12 @@
std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
{
Mutex::Autolock l(mLock);
- sessionStats = mSessionStatsMap[id];
- }
-
- if (sessionStats == nullptr) {
- ALOGE("%s: SessionStatsMap should contain camera %s when logIdle is called",
+ if (mSessionStatsMap.count(id) == 0) {
+ ALOGE("%s: SessionStatsMap should contain camera %s when logIdle is called",
__FUNCTION__, id.c_str());
- return;
+ return;
+ }
+ sessionStats = mSessionStatsMap[id];
}
ALOGV("%s: id %s, requestCount %" PRId64 ", resultErrorCount %" PRId64 ", deviceError %d"