Merge "Fix potential NULL pointer crash"
diff --git a/media/libaudioclient/ToneGenerator.cpp b/media/libaudioclient/ToneGenerator.cpp
index c9263f4..5c5dbd6 100644
--- a/media/libaudioclient/ToneGenerator.cpp
+++ b/media/libaudioclient/ToneGenerator.cpp
@@ -826,6 +826,34 @@
{ .duration = 0 , .waveFreq = { 0 }, 0, 0}},
.repeatCnt = ToneGenerator::TONEGEN_INF,
.repeatSegment = 0 }, // TONE_IE_CALL_WAITING
+ { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 375, 400, 425, 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_INDIA_DIAL
+ { .segments = { { .duration = 750, .waveFreq = { 400, 0 }, 0, 0 },
+ { .duration = 750, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_INDIA_BUSY
+ { .segments = { { .duration = 250, .waveFreq = { 400, 0 }, 0, 0 },
+ { .duration = 250, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_INDIA_CONGESTION
+ { .segments = { { .duration = 200, .waveFreq = { 400, 0 }, 0, 0 },
+ { .duration = 100, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 200, .waveFreq = { 400, 0 }, 0, 0 },
+ { .duration = 7500, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_INDIA_CALL_WAITING
+ { .segments = { { .duration = 400, .waveFreq = { 375, 400, 425, 0 }, 0, 0 },
+ { .duration = 200, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 400, .waveFreq = { 375, 400, 425, 0 }, 0, 0 },
+ { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_INDIA_RINGTONE
};
// Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type
@@ -900,6 +928,16 @@
TONE_SUP_ERROR, // TONE_SUP_ERROR
TONE_IE_CALL_WAITING, // TONE_SUP_CALL_WAITING
TONE_IE_RINGTONE // TONE_SUP_RINGTONE
+ },
+ { // INDIA
+ TONE_INDIA_DIAL, // TONE_SUP_DIAL
+ TONE_INDIA_BUSY, // TONE_SUP_BUSY
+ TONE_INDIA_CONGESTION, // TONE_SUP_CONGESTION
+ TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK
+ TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL
+ TONE_SUP_ERROR, // TONE_SUP_ERROR
+ TONE_INDIA_CALL_WAITING, // TONE_SUP_CALL_WAITING
+ TONE_INDIA_RINGTONE // TONE_SUP_RINGTONE
}
};
@@ -971,6 +1009,8 @@
mRegion = HONGKONG;
} else if (strstr(value, "ie") != NULL) {
mRegion = IRELAND;
+ } else if (strstr(value, "in") != NULL) {
+ mRegion = INDIA;
} else {
mRegion = CEPT;
}
diff --git a/media/libaudioclient/include/media/ToneGenerator.h b/media/libaudioclient/include/media/ToneGenerator.h
index e0e3bb1..5b0689a 100644
--- a/media/libaudioclient/include/media/ToneGenerator.h
+++ b/media/libaudioclient/include/media/ToneGenerator.h
@@ -212,6 +212,12 @@
// IRELAND Supervisory tones
TONE_IE_RINGTONE, // Ring Tone: A 400Hz + 450Hz tone repeated in a 0.4s on, 0.2s off, 0.4s on, 2.0s off pattern.
TONE_IE_CALL_WAITING, // Call waiting tone: 425Hz tone repeated in a 0.18s on, 0.2s off, 0.2s on, 4.5s off pattern.
+ // INDIA supervisory tones
+ TONE_INDIA_DIAL, // Dial tone: 400 Hz tone modulated with 25Hz, continuous
+ TONE_INDIA_BUSY, // Busy tone: 400 Hz, 750ms ON, 750ms OFF...
+ TONE_INDIA_CONGESTION, // Congestion tone: 400 Hz, 250ms ON, 250ms OFF...
+ TONE_INDIA_CALL_WAITING, // Call waiting tone: 400 Hz, tone repeated in a 0.2s on, 0.1s off, 0.2s on, 7.5s off pattern.
+ TONE_INDIA_RINGTONE, // Ring tone: 400 Hz tone modulated with 25Hz, 0.4 on 0.2 off 0.4 on 2..0 off
NUM_ALTERNATE_TONES
};
@@ -223,6 +229,7 @@
SINGAPORE,
HONGKONG,
IRELAND,
+ INDIA,
CEPT,
NUM_REGIONS
};
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index cff2803..ca8cb78 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -448,6 +448,9 @@
break;
}
+ if (response != MTP_RESPONSE_OK)
+ ALOGW("[MTP] got response 0x%X in command %s (%x)", response,
+ MtpDebug::getOperationCodeName(operation), operation);
if (response == MTP_RESPONSE_TRANSACTION_CANCELLED)
return false;
mResponse.setResponseCode(response);
@@ -658,8 +661,8 @@
return MTP_RESPONSE_INVALID_PARAMETER;
MtpObjectHandle handle = mRequest.getParameter(1);
MtpObjectProperty property = mRequest.getParameter(2);
- ALOGV("GetObjectPropValue %d %s\n", handle,
- MtpDebug::getObjectPropCodeName(property));
+ ALOGV("GetObjectPropValue %d %s (0x%04X)\n", handle,
+ MtpDebug::getObjectPropCodeName(property), property);
return mDatabase->getObjectPropertyValue(handle, property, mData);
}
@@ -952,7 +955,8 @@
if (!mData.getString(modified)) return MTP_RESPONSE_INVALID_PARAMETER; // date modified
// keywords follow
- ALOGV("name: %s format: %04X\n", (const char *)name, format);
+ ALOGV("name: %s format: 0x%04X (%s)\n", (const char*)name, format,
+ MtpDebug::getFormatCodeName(format));
time_t modifiedTime;
if (!parseDateTime(modified, modifiedTime))
modifiedTime = 0;
@@ -973,9 +977,10 @@
return MTP_RESPONSE_OBJECT_TOO_LARGE;
}
- ALOGD("path: %s parent: %d storageID: %08X", (const char*)path, parent, storageID);
+ ALOGV("path: %s parent: %d storageID: %08X", (const char*)path, parent, storageID);
MtpObjectHandle handle = mDatabase->beginSendObject((const char*)path, format,
parent, storageID);
+ ALOGD("handle: %d, parent: %d, storageID: %08X", handle, parent, storageID);
if (handle == kInvalidObjectHandle) {
return MTP_RESPONSE_GENERAL_ERROR;
}
diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioPolicyConfig.h b/services/audiopolicy/common/managerdefinitions/include/AudioPolicyConfig.h
index 78e7ec9..d1a0f9b 100644
--- a/services/audiopolicy/common/managerdefinitions/include/AudioPolicyConfig.h
+++ b/services/audiopolicy/common/managerdefinitions/include/AudioPolicyConfig.h
@@ -16,6 +16,9 @@
#pragma once
+#include <unordered_map>
+#include <unordered_set>
+
#include <AudioGain.h>
#include <VolumeCurve.h>
#include <AudioPort.h>
@@ -145,6 +148,35 @@
inProfile->addAudioProfile(micProfile);
inProfile->addSupportedDevice(defaultInputDevice);
module->addInputProfile(inProfile);
+
+ setDefaultSurroundFormats();
+ }
+
+ // Surround formats, with an optional list of subformats that are equivalent from users' POV.
+ using SurroundFormats = std::unordered_map<audio_format_t, std::unordered_set<audio_format_t>>;
+
+ const SurroundFormats &getSurroundFormats() const
+ {
+ return mSurroundFormats;
+ }
+
+ void setSurroundFormats(const SurroundFormats &surroundFormats)
+ {
+ mSurroundFormats = surroundFormats;
+ }
+
+ void setDefaultSurroundFormats()
+ {
+ mSurroundFormats = {
+ {AUDIO_FORMAT_AC3, {}},
+ {AUDIO_FORMAT_E_AC3, {}},
+ {AUDIO_FORMAT_DTS, {}},
+ {AUDIO_FORMAT_DTS_HD, {}},
+ {AUDIO_FORMAT_AAC_LC, {
+ AUDIO_FORMAT_AAC_HE_V1, AUDIO_FORMAT_AAC_HE_V2, AUDIO_FORMAT_AAC_ELD,
+ AUDIO_FORMAT_AAC_XHE}},
+ {AUDIO_FORMAT_DOLBY_TRUEHD, {}},
+ {AUDIO_FORMAT_E_AC3_JOC, {}}};
}
private:
@@ -158,6 +190,7 @@
// DEVICE_CATEGORY_SPEAKER path to boost soft sounds, used to adjust volume curves accordingly.
// Note: remove also speaker_drc_enabled from global configuration of XML config file.
bool mIsSpeakerDrcEnabled;
+ SurroundFormats mSurroundFormats;
};
} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp b/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp
index 19eac26..59db81c 100644
--- a/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp
@@ -407,6 +407,8 @@
config.setHwModules(hwModules);
+ config.setDefaultSurroundFormats();
+
config_free(root);
free(root);
free(data);
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index d5a09fe..179a678 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -19,6 +19,7 @@
#include <memory>
#include <string>
+#include <utility>
#include <hidl/Status.h>
#include <libxml/parser.h>
@@ -41,7 +42,7 @@
using utilities::convertTo;
template<typename E, typename C>
-struct BaseSerializerTraits {
+struct AndroidCollectionTraits {
typedef sp<E> Element;
typedef C Collection;
typedef void* PtrSerializingCtx;
@@ -51,7 +52,19 @@
}
};
-struct AudioGainTraits : public BaseSerializerTraits<AudioGain, AudioGainCollection>
+template<typename C>
+struct StdCollectionTraits {
+ typedef C Collection;
+ typedef typename C::value_type Element;
+ typedef void* PtrSerializingCtx;
+
+ static status_t addElementToCollection(const Element &element, Collection *collection) {
+ auto pair = collection->insert(element);
+ return pair.second ? NO_ERROR : BAD_VALUE;
+ }
+};
+
+struct AudioGainTraits : public AndroidCollectionTraits<AudioGain, AudioGainCollection>
{
static constexpr const char *tag = "gain";
static constexpr const char *collectionTag = "gains";
@@ -79,7 +92,7 @@
// A profile section contains a name, one audio format and the list of supported sampling rates
// and channel masks for this format
-struct AudioProfileTraits : public BaseSerializerTraits<AudioProfile, AudioProfileVector>
+struct AudioProfileTraits : public AndroidCollectionTraits<AudioProfile, AudioProfileVector>
{
static constexpr const char *tag = "profile";
static constexpr const char *collectionTag = "profiles";
@@ -94,7 +107,7 @@
static Return<Element> deserialize(const xmlNode *cur, PtrSerializingCtx serializingContext);
};
-struct MixPortTraits : public BaseSerializerTraits<IOProfile, IOProfileCollection>
+struct MixPortTraits : public AndroidCollectionTraits<IOProfile, IOProfileCollection>
{
static constexpr const char *tag = "mixPort";
static constexpr const char *collectionTag = "mixPorts";
@@ -113,7 +126,7 @@
// Children: GainTraits
};
-struct DevicePortTraits : public BaseSerializerTraits<DeviceDescriptor, DeviceVector>
+struct DevicePortTraits : public AndroidCollectionTraits<DeviceDescriptor, DeviceVector>
{
static constexpr const char *tag = "devicePort";
static constexpr const char *collectionTag = "devicePorts";
@@ -133,7 +146,7 @@
// Children: GainTraits (optional)
};
-struct RouteTraits : public BaseSerializerTraits<AudioRoute, AudioRouteVector>
+struct RouteTraits : public AndroidCollectionTraits<AudioRoute, AudioRouteVector>
{
static constexpr const char *tag = "route";
static constexpr const char *collectionTag = "routes";
@@ -152,7 +165,7 @@
static Return<Element> deserialize(const xmlNode *cur, PtrSerializingCtx serializingContext);
};
-struct ModuleTraits : public BaseSerializerTraits<HwModule, HwModuleCollection>
+struct ModuleTraits : public AndroidCollectionTraits<HwModule, HwModuleCollection>
{
static constexpr const char *tag = "module";
static constexpr const char *collectionTag = "modules";
@@ -186,7 +199,7 @@
static status_t deserialize(const xmlNode *root, AudioPolicyConfig *config);
};
-struct VolumeTraits : public BaseSerializerTraits<VolumeCurve, VolumeCurvesCollection>
+struct VolumeTraits : public AndroidCollectionTraits<VolumeCurve, VolumeCurvesCollection>
{
static constexpr const char *tag = "volume";
static constexpr const char *collectionTag = "volumes";
@@ -205,6 +218,28 @@
// No Children
};
+struct SurroundSoundTraits
+{
+ static constexpr const char *tag = "surroundSound";
+
+ static status_t deserialize(const xmlNode *root, AudioPolicyConfig *config);
+ // Children: SurroundSoundFormatTraits
+};
+
+struct SurroundSoundFormatTraits : public StdCollectionTraits<AudioPolicyConfig::SurroundFormats>
+{
+ static constexpr const char *tag = "format";
+ static constexpr const char *collectionTag = "formats";
+
+ struct Attributes
+ {
+ static constexpr const char *name = "name";
+ static constexpr const char *subformats = "subformats";
+ };
+
+ static Return<Element> deserialize(const xmlNode *cur, PtrSerializingCtx serializingContext);
+};
+
class PolicySerializer
{
public:
@@ -224,7 +259,7 @@
const std::string mVersion;
- // Children: ModulesTraits, VolumeTraits
+ // Children: ModulesTraits, VolumeTraits, SurroundSoundTraits (optional)
};
template <class T>
@@ -721,6 +756,52 @@
return volCurve;
}
+status_t SurroundSoundTraits::deserialize(const xmlNode *root, AudioPolicyConfig *config)
+{
+ config->setDefaultSurroundFormats();
+
+ for (const xmlNode *cur = root->xmlChildrenNode; cur != NULL; cur = cur->next) {
+ if (!xmlStrcmp(cur->name, reinterpret_cast<const xmlChar*>(tag))) {
+ AudioPolicyConfig::SurroundFormats formats;
+ status_t status = deserializeCollection<SurroundSoundFormatTraits>(
+ cur, &formats, nullptr);
+ if (status == NO_ERROR) {
+ config->setSurroundFormats(formats);
+ }
+ return NO_ERROR;
+ }
+ }
+ return NO_ERROR;
+}
+
+Return<SurroundSoundFormatTraits::Element> SurroundSoundFormatTraits::deserialize(
+ const xmlNode *cur, PtrSerializingCtx /*serializingContext*/)
+{
+ std::string formatLiteral = getXmlAttribute(cur, Attributes::name);
+ if (formatLiteral.empty()) {
+ ALOGE("%s: No %s found for a surround format", __func__, Attributes::name);
+ return Status::fromStatusT(BAD_VALUE);
+ }
+ audio_format_t format = formatFromString(formatLiteral);
+ if (format == AUDIO_FORMAT_DEFAULT) {
+ ALOGE("%s: Unrecognized format %s", __func__, formatLiteral.c_str());
+ return Status::fromStatusT(BAD_VALUE);
+ }
+ Element pair = std::make_pair(format, Collection::mapped_type{});
+
+ std::string subformatsLiteral = getXmlAttribute(cur, Attributes::subformats);
+ if (subformatsLiteral.empty()) return pair;
+ FormatVector subformats = formatsFromString(subformatsLiteral, " ");
+ for (const auto& subformat : subformats) {
+ auto result = pair.second.insert(subformat);
+ if (!result.second) {
+ ALOGE("%s: could not add subformat %x to collection", __func__, subformat);
+ return Status::fromStatusT(BAD_VALUE);
+ }
+ }
+ return pair;
+}
+
status_t PolicySerializer::deserialize(const char *configFile, AudioPolicyConfig *config)
{
auto doc = make_xmlUnique(xmlParseFile(configFile));
@@ -773,6 +854,9 @@
// Global Configuration
GlobalConfigTraits::deserialize(root, config);
+ // Surround configuration
+ SurroundSoundTraits::deserialize(root, config);
+
return android::OK;
}
diff --git a/services/audiopolicy/config/audio_policy_configuration.xml b/services/audiopolicy/config/audio_policy_configuration.xml
index 9381f1f..1d037c3 100644
--- a/services/audiopolicy/config/audio_policy_configuration.xml
+++ b/services/audiopolicy/config/audio_policy_configuration.xml
@@ -198,4 +198,26 @@
<!-- End of Volume section -->
+ <?disabledUntilHalV4_1
+ <!-- Surround configuration -->
+
+ <surroundSound>
+ <!-- Each of the listed formats gets an entry in Surround Settings dialog.
+ There must be a corresponding Java ENCODING_... contant defined in AudioFormat.java,
+ and a display name defined in AudioFormat.toDisplayName. For the formats that don't
+ need a dedicated Surrond Settings dialog entry, a subformats list should be used. -->
+ <formats>
+ <format name="AUDIO_FORMAT_AC3" />
+ <format name="AUDIO_FORMAT_E_AC3" />
+ <format name="AUDIO_FORMAT_E_AC3_JOC" />
+ <format name="AUDIO_FORMAT_DOLBY_TRUEHD" />
+ <format name="AUDIO_FORMAT_DTS" />
+ <format name="AUDIO_FORMAT_DTS_HD" />
+ <format name="AUDIO_FORMAT_AAC_LC" subformats="AUDIO_FORMAT_AAC_HE_V1 AUDIO_FORMAT_AAC_HE_V2 AUDIO_FORMAT_AAC_ELD AUDIO_FORMAT_AAC_XHE" />
+ </formats>
+ </surroundSound>
+
+ <!-- End of Surround configuration -->
+ ?>
+
</audioPolicyConfiguration>
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 42777f6..e28ab68 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -62,26 +62,6 @@
// media / notification / system volume.
constexpr float IN_CALL_EARPIECE_HEADROOM_DB = 3.f;
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-// Array of all surround formats.
-static const audio_format_t SURROUND_FORMATS[] = {
- AUDIO_FORMAT_AC3,
- AUDIO_FORMAT_E_AC3,
- AUDIO_FORMAT_DTS,
- AUDIO_FORMAT_DTS_HD,
- AUDIO_FORMAT_AAC_LC,
- AUDIO_FORMAT_DOLBY_TRUEHD,
- AUDIO_FORMAT_E_AC3_JOC,
-};
-// Array of all AAC formats. When AAC is enabled by users, all AAC formats should be enabled.
-static const audio_format_t AAC_FORMATS[] = {
- AUDIO_FORMAT_AAC_LC,
- AUDIO_FORMAT_AAC_HE_V1,
- AUDIO_FORMAT_AAC_HE_V2,
- AUDIO_FORMAT_AAC_ELD,
- AUDIO_FORMAT_AAC_XHE,
-};
-
// Compressed formats for MSD module, ordered from most preferred to least preferred.
static const std::vector<audio_format_t> compressedFormatsOrder = {{
AUDIO_FORMAT_MAT_2_1, AUDIO_FORMAT_MAT_2_0, AUDIO_FORMAT_E_AC3,
@@ -3606,35 +3586,38 @@
FormatVector supportedFormats =
hdmiOutputDevs[i]->getAudioPort()->getAudioProfiles().getSupportedFormats();
for (size_t j = 0; j < supportedFormats.size(); j++) {
- if (std::find(std::begin(SURROUND_FORMATS),
- std::end(SURROUND_FORMATS),
- supportedFormats[j]) != std::end(SURROUND_FORMATS)) {
+ if (mConfig.getSurroundFormats().count(supportedFormats[j]) != 0) {
formats.insert(supportedFormats[j]);
- } else if (std::find(std::begin(AAC_FORMATS),
- std::end(AAC_FORMATS),
- supportedFormats[j]) != std::end(AAC_FORMATS)) {
- // if any format in AAC_FORMATS is reported, insert AUDIO_FORMAT_AAC_LC as this
- // is the only AAC format used in the TvSettings UI for all AAC formats.
- formats.insert(AUDIO_FORMAT_AAC_LC);
+ } else {
+ for (const auto& pair : mConfig.getSurroundFormats()) {
+ if (pair.second.count(supportedFormats[j]) != 0) {
+ formats.insert(pair.first);
+ break;
+ }
+ }
}
}
}
} else {
- for (size_t i = 0; i < ARRAY_SIZE(SURROUND_FORMATS); i++) {
- formats.insert(SURROUND_FORMATS[i]);
+ for (const auto& pair : mConfig.getSurroundFormats()) {
+ formats.insert(pair.first);
}
}
for (const auto& format: formats) {
if (formatsWritten < formatsMax) {
surroundFormats[formatsWritten] = format;
bool formatEnabled = false;
- if (format == AUDIO_FORMAT_AAC_LC) {
- for (size_t j = 0; j < ARRAY_SIZE(AAC_FORMATS) && !formatEnabled; j++) {
- formatEnabled =
- mSurroundFormats.find(AAC_FORMATS[j]) != mSurroundFormats.end();
+ if (mConfig.getSurroundFormats().count(format) == 0) {
+ // Check sub-formats
+ for (const auto& pair : mConfig.getSurroundFormats()) {
+ for (const auto& subformat : pair.second) {
+ formatEnabled = mSurroundFormats.count(subformat) != 0;
+ if (formatEnabled) break;
+ }
+ if (formatEnabled) break;
}
} else {
- formatEnabled = mSurroundFormats.find(format) != mSurroundFormats.end();
+ formatEnabled = mSurroundFormats.count(format) != 0;
}
surroundFormatsEnabled[formatsWritten++] = formatEnabled;
}
@@ -3647,14 +3630,8 @@
{
ALOGV("%s() format 0x%X enabled %d", __func__, audioFormat, enabled);
// Check if audio format is a surround formats.
- bool isSurroundFormat = false;
- for (size_t i = 0; i < ARRAY_SIZE(SURROUND_FORMATS); i++) {
- if (audioFormat == SURROUND_FORMATS[i]) {
- isSurroundFormat = true;
- break;
- }
- }
- if (!isSurroundFormat) {
+ const auto& formatIter = mConfig.getSurroundFormats().find(audioFormat);
+ if (formatIter == mConfig.getSurroundFormats().end()) {
ALOGW("%s() format 0x%X is not a known surround format", __func__, audioFormat);
return BAD_VALUE;
}
@@ -3667,8 +3644,7 @@
return INVALID_OPERATION;
}
- if ((mSurroundFormats.find(audioFormat) != mSurroundFormats.end() && enabled)
- || (mSurroundFormats.find(audioFormat) == mSurroundFormats.end() && !enabled)) {
+ if ((mSurroundFormats.count(audioFormat) != 0) == enabled) {
return NO_ERROR;
}
@@ -3680,20 +3656,14 @@
std::unordered_set<audio_format_t> surroundFormatsBackup(mSurroundFormats);
if (enabled) {
- if (audioFormat == AUDIO_FORMAT_AAC_LC) {
- for (size_t i = 0; i < ARRAY_SIZE(AAC_FORMATS); i++) {
- mSurroundFormats.insert(AAC_FORMATS[i]);
- }
- } else {
- mSurroundFormats.insert(audioFormat);
+ mSurroundFormats.insert(audioFormat);
+ for (const auto& subFormat : formatIter->second) {
+ mSurroundFormats.insert(subFormat);
}
} else {
- if (audioFormat == AUDIO_FORMAT_AAC_LC) {
- for (size_t i = 0; i < ARRAY_SIZE(AAC_FORMATS); i++) {
- mSurroundFormats.erase(AAC_FORMATS[i]);
- }
- } else {
- mSurroundFormats.erase(audioFormat);
+ mSurroundFormats.erase(audioFormat);
+ for (const auto& subFormat : formatIter->second) {
+ mSurroundFormats.erase(subFormat);
}
}
@@ -3738,7 +3708,6 @@
profileUpdated |= (status == NO_ERROR);
}
- // Undo the surround formats change due to no audio profiles updated.
if (!profileUpdated) {
ALOGW("%s() no audio profiles updated, undoing surround formats change", __func__);
mSurroundFormats = std::move(surroundFormatsBackup);
diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index 706ce3a..a1163ed 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -52,6 +52,7 @@
"device3/Camera3StreamSplitter.cpp",
"device3/DistortionMapper.cpp",
"gui/RingBufferConsumer.cpp",
+ "utils/CameraThreadState.cpp",
"utils/CameraTraces.cpp",
"utils/AutoConditionLock.cpp",
"utils/TagMonitor.cpp",
@@ -72,6 +73,7 @@
"libfmq",
"libgui",
"libhardware",
+ "libhwbinder",
"libhidlbase",
"libhidltransport",
"libjpeg",
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index fbd80e6..e69ce1f 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -69,6 +69,7 @@
#include "api2/CameraDeviceClient.h"
#include "utils/CameraTraces.h"
#include "utils/TagMonitor.h"
+#include "utils/CameraThreadState.h"
namespace {
const char* kPermissionServiceName = "permission";
@@ -325,7 +326,7 @@
hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED,
CaptureResultExtras{});
// Ensure not in binder RPC so client disconnect PID checks work correctly
- LOG_ALWAYS_FATAL_IF(getCallingPid() != getpid(),
+ LOG_ALWAYS_FATAL_IF(CameraThreadState::getCallingPid() != getpid(),
"onDeviceStatusChanged must be called from the camera service process!");
clientToDisconnect->disconnect();
}
@@ -491,8 +492,8 @@
strerror(-res), res);
}
- int callingPid = getCallingPid();
- int callingUid = getCallingUid();
+ int callingPid = CameraThreadState::getCallingPid();
+ int callingUid = CameraThreadState::getCallingUid();
std::vector<int32_t> tagsRemoved;
// If it's not calling from cameraserver, check the permission.
if ((callingPid != getpid()) &&
@@ -522,14 +523,6 @@
return ret;
}
-int CameraService::getCallingPid() {
- return IPCThreadState::self()->getCallingPid();
-}
-
-int CameraService::getCallingUid() {
- return IPCThreadState::self()->getCallingUid();
-}
-
String8 CameraService::getFormattedCurrentTime() {
time_t now = time(nullptr);
char formattedTime[64];
@@ -754,7 +747,7 @@
}
Status CameraService::initializeShimMetadata(int cameraId) {
- int uid = getCallingUid();
+ int uid = CameraThreadState::getCallingUid();
String16 internalPackageName("cameraserver");
String8 id = String8::format("%d", cameraId);
@@ -803,9 +796,9 @@
}
}
- int64_t token = IPCThreadState::self()->clearCallingIdentity();
+ int64_t token = CameraThreadState::clearCallingIdentity();
ret = initializeShimMetadata(cameraId);
- IPCThreadState::self()->restoreCallingIdentity(token);
+ CameraThreadState::restoreCallingIdentity(token);
if (!ret.isOk()) {
// Error already logged by callee
return ret;
@@ -862,7 +855,7 @@
}
#endif // __BRILLO__
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (!mInitialized) {
ALOGE("CameraService::connect X (PID %d) rejected (camera HAL module not loaded)",
@@ -896,8 +889,8 @@
Status CameraService::validateClientPermissionsLocked(const String8& cameraId,
const String8& clientName8, int& clientUid, int& clientPid,
/*out*/int& originalClientPid) const {
- int callingPid = getCallingPid();
- int callingUid = getCallingUid();
+ int callingPid = CameraThreadState::getCallingPid();
+ int callingUid = CameraThreadState::getCallingUid();
// Check if we can trust clientUid
if (clientUid == USE_CALLING_UID) {
@@ -966,7 +959,7 @@
status_t CameraService::checkIfDeviceIsUsable(const String8& cameraId) const {
auto cameraState = getCameraState(cameraId);
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (cameraState == nullptr) {
ALOGE("CameraService::connect X (PID %d) rejected (invalid camera ID %s)", callingPid,
cameraId.string());
@@ -1170,7 +1163,7 @@
mServiceLock.unlock();
// Clear caller identity temporarily so client disconnect PID checks work correctly
- int64_t token = IPCThreadState::self()->clearCallingIdentity();
+ int64_t token = CameraThreadState::clearCallingIdentity();
// Destroy evicted clients
for (auto& i : evictedClients) {
@@ -1178,7 +1171,7 @@
i->getValue()->disconnect(); // Clients will remove themselves from the active client list
}
- IPCThreadState::self()->restoreCallingIdentity(token);
+ CameraThreadState::restoreCallingIdentity(token);
for (const auto& i : evictedClients) {
ALOGV("%s: Waiting for disconnect to complete for client for device %s (PID %" PRId32 ")",
@@ -1231,7 +1224,7 @@
/*shimUpdateOnly*/ false, /*out*/client);
if(!ret.isOk()) {
- logRejected(id, getCallingPid(), String8(clientPackageName),
+ logRejected(id, CameraThreadState::getCallingPid(), String8(clientPackageName),
ret.toString8());
return ret;
}
@@ -1258,7 +1251,7 @@
/*out*/client);
if(!ret.isOk()) {
- logRejected(id, getCallingPid(), String8(clientPackageName),
+ logRejected(id, CameraThreadState::getCallingPid(), String8(clientPackageName),
ret.toString8());
return ret;
}
@@ -1285,7 +1278,7 @@
clientUid, USE_CALLING_PID, API_2, /*shimUpdateOnly*/ false, /*out*/client);
if(!ret.isOk()) {
- logRejected(id, getCallingPid(), String8(clientPackageName),
+ logRejected(id, CameraThreadState::getCallingPid(), String8(clientPackageName),
ret.toString8());
return ret;
}
@@ -1466,7 +1459,7 @@
}
String8 id = String8(cameraId.string());
- int uid = getCallingUid();
+ int uid = CameraThreadState::getCallingUid();
// verify id is valid.
auto state = getCameraState(id);
@@ -1913,13 +1906,13 @@
mServiceLock.unlock();
// Clear caller identity temporarily so client disconnect PID checks work correctly
- int64_t token = IPCThreadState::self()->clearCallingIdentity();
+ int64_t token = CameraThreadState::clearCallingIdentity();
for (auto& i : evicted) {
i->disconnect();
}
- IPCThreadState::self()->restoreCallingIdentity(token);
+ CameraThreadState::restoreCallingIdentity(token);
// Reacquire mServiceLock
mServiceLock.lock();
@@ -1987,7 +1980,7 @@
status_t CameraService::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
uint32_t flags) {
- const int pid = getCallingPid();
+ const int pid = CameraThreadState::getCallingPid();
const int selfPid = getpid();
// Permission checks
@@ -2022,7 +2015,7 @@
// permissions to notify the camera service about system events
if (!checkCallingPermission(
String16("android.permission.CAMERA_SEND_SYSTEM_EVENTS"))) {
- const int uid = getCallingUid();
+ const int uid = CameraThreadState::getCallingUid();
ALOGE("Permission Denial: cannot send updates to camera service about system"
" events from pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
@@ -2119,7 +2112,7 @@
servicePid),
mCameraId(api1CameraId)
{
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("Client::Client E (pid %d, id %d)", callingPid, mCameraId);
mRemoteCallback = cameraClient;
@@ -2228,7 +2221,7 @@
// No dumping of clients directly over Binder,
// must go through CameraService::dump
android_errorWriteWithInfoLog(SN_EVENT_LOG_ID, "26265403",
- IPCThreadState::self()->getCallingUid(), NULL, 0);
+ CameraThreadState::getCallingUid(), NULL, 0);
return OK;
}
@@ -2365,7 +2358,7 @@
// Reset the client PID to allow server-initiated disconnect,
// and to prevent further calls by client.
- mClientPid = getCallingPid();
+ mClientPid = CameraThreadState::getCallingPid();
CaptureResultExtras resultExtras; // a dummy result (invalid)
notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISABLED, resultExtras);
disconnect();
@@ -2726,8 +2719,8 @@
if (checkCallingPermission(String16("android.permission.DUMP")) == false) {
dprintf(fd, "Permission Denial: can't dump CameraService from pid=%d, uid=%d\n",
- getCallingPid(),
- getCallingUid());
+ CameraThreadState::getCallingPid(),
+ CameraThreadState::getCallingUid());
return NO_ERROR;
}
bool locked = tryLock(mServiceLock);
@@ -2900,7 +2893,7 @@
* binder driver
*/
// PID here is approximate and can be wrong.
- logClientDied(getCallingPid(), String8("Binder died unexpectedly"));
+ logClientDied(CameraThreadState::getCallingPid(), String8("Binder died unexpectedly"));
// check torch client
handleTorchClientBinderDied(who);
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 47ad8af..80d9ef4 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -836,10 +836,6 @@
// Prints the shell command help
status_t printHelp(int out);
- static int getCallingPid();
-
- static int getCallingUid();
-
/**
* Get the current system time as a formatted string.
*/
diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp
index bf18c48..c250628 100644
--- a/services/camera/libcameraservice/api1/Camera2Client.cpp
+++ b/services/camera/libcameraservice/api1/Camera2Client.cpp
@@ -33,6 +33,7 @@
#include "api1/client2/CaptureSequencer.h"
#include "api1/client2/CallbackProcessor.h"
#include "api1/client2/ZslProcessor.h"
+#include "utils/CameraThreadState.h"
#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
@@ -40,10 +41,6 @@
namespace android {
using namespace camera2;
-static int getCallingPid() {
- return IPCThreadState::self()->getCallingPid();
-}
-
// Interface used by CameraService
Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
@@ -398,7 +395,7 @@
binder::Status res = binder::Status::ok();
// Allow both client and the cameraserver to disconnect at all times
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (callingPid != mClientPid && callingPid != mServicePid) return res;
if (mDevice == 0) return res;
@@ -463,14 +460,14 @@
ALOGV("%s: E", __FUNCTION__);
Mutex::Autolock icl(mBinderSerializationLock);
- if (mClientPid != 0 && getCallingPid() != mClientPid) {
+ if (mClientPid != 0 && CameraThreadState::getCallingPid() != mClientPid) {
ALOGE("%s: Camera %d: Connection attempt from pid %d; "
"current locked to pid %d", __FUNCTION__,
- mCameraId, getCallingPid(), mClientPid);
+ mCameraId, CameraThreadState::getCallingPid(), mClientPid);
return BAD_VALUE;
}
- mClientPid = getCallingPid();
+ mClientPid = CameraThreadState::getCallingPid();
mRemoteCallback = client;
mSharedCameraCallbacks = client;
@@ -483,16 +480,16 @@
ALOGV("%s: E", __FUNCTION__);
Mutex::Autolock icl(mBinderSerializationLock);
ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
- __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
+ __FUNCTION__, mCameraId, CameraThreadState::getCallingPid(), mClientPid);
if (mClientPid == 0) {
- mClientPid = getCallingPid();
+ mClientPid = CameraThreadState::getCallingPid();
return OK;
}
- if (mClientPid != getCallingPid()) {
+ if (mClientPid != CameraThreadState::getCallingPid()) {
ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
- __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
+ __FUNCTION__, mCameraId, CameraThreadState::getCallingPid(), mClientPid);
return EBUSY;
}
@@ -504,9 +501,9 @@
ALOGV("%s: E", __FUNCTION__);
Mutex::Autolock icl(mBinderSerializationLock);
ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
- __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
+ __FUNCTION__, mCameraId, CameraThreadState::getCallingPid(), mClientPid);
- if (mClientPid == getCallingPid()) {
+ if (mClientPid == CameraThreadState::getCallingPid()) {
SharedParameters::Lock l(mParameters);
if (l.mParameters.state == Parameters::RECORD ||
l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
@@ -520,7 +517,7 @@
}
ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
- __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
+ __FUNCTION__, mCameraId, CameraThreadState::getCallingPid(), mClientPid);
return EBUSY;
}
@@ -1574,7 +1571,7 @@
ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Mutex::Autolock icl(mBinderSerializationLock);
// The camera service can unconditionally get the parameters at all times
- if (getCallingPid() != mServicePid && checkPid(__FUNCTION__) != OK) return String8();
+ if (CameraThreadState::getCallingPid() != mServicePid && checkPid(__FUNCTION__) != OK) return String8();
SharedParameters::ReadLock l(mParameters);
diff --git a/services/camera/libcameraservice/api1/CameraClient.cpp b/services/camera/libcameraservice/api1/CameraClient.cpp
index ce44efe..d65ac7b 100644
--- a/services/camera/libcameraservice/api1/CameraClient.cpp
+++ b/services/camera/libcameraservice/api1/CameraClient.cpp
@@ -25,16 +25,13 @@
#include "api1/CameraClient.h"
#include "device1/CameraHardwareInterface.h"
#include "CameraService.h"
+#include "utils/CameraThreadState.h"
namespace android {
#define LOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
#define LOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
-static int getCallingPid() {
- return IPCThreadState::self()->getCallingPid();
-}
-
CameraClient::CameraClient(const sp<CameraService>& cameraService,
const sp<hardware::ICameraClient>& cameraClient,
const String16& clientPackageName,
@@ -45,7 +42,7 @@
String8::format("%d", cameraId), cameraId, cameraFacing, clientPid,
clientUid, servicePid)
{
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("CameraClient::CameraClient E (pid %d, id %d)", callingPid, cameraId);
mHardware = NULL;
@@ -63,7 +60,7 @@
status_t CameraClient::initialize(sp<CameraProviderManager> manager,
const String8& /*monitorTags*/) {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
status_t res;
LOG1("CameraClient::initialize E (pid %d, id %d)", callingPid, mCameraId);
@@ -104,7 +101,7 @@
// tear down the client
CameraClient::~CameraClient() {
mDestructionStarted = true;
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("CameraClient::~CameraClient E (pid %d, this %p)", callingPid, this);
disconnect();
@@ -147,7 +144,7 @@
// ----------------------------------------------------------------------------
status_t CameraClient::checkPid() const {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (callingPid == mClientPid) return NO_ERROR;
ALOGW("attempt to use a locked camera from a different process"
@@ -157,7 +154,8 @@
status_t CameraClient::checkPidAndHardware() const {
if (mHardware == 0) {
- ALOGE("attempt to use a camera after disconnect() (pid %d)", getCallingPid());
+ ALOGE("attempt to use a camera after disconnect() (pid %d)",
+ CameraThreadState::getCallingPid());
return INVALID_OPERATION;
}
status_t result = checkPid();
@@ -166,7 +164,7 @@
}
status_t CameraClient::lock() {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("lock (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
@@ -181,7 +179,7 @@
}
status_t CameraClient::unlock() {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("unlock (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
@@ -203,7 +201,7 @@
// connect a new client to the camera
status_t CameraClient::connect(const sp<hardware::ICameraClient>& client) {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("connect E (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
@@ -239,7 +237,7 @@
}
binder::Status CameraClient::disconnect() {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("disconnect E (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
@@ -333,7 +331,7 @@
status_t CameraClient::setPreviewTarget(
const sp<IGraphicBufferProducer>& bufferProducer) {
LOG1("setPreviewTarget(%p) (pid %d)", bufferProducer.get(),
- getCallingPid());
+ CameraThreadState::getCallingPid());
sp<IBinder> binder;
sp<ANativeWindow> window;
@@ -350,7 +348,7 @@
// set the preview callback flag to affect how the received frames from
// preview are handled.
void CameraClient::setPreviewCallbackFlag(int callback_flag) {
- LOG1("setPreviewCallbackFlag(%d) (pid %d)", callback_flag, getCallingPid());
+ LOG1("setPreviewCallbackFlag(%d) (pid %d)", callback_flag, CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return;
@@ -371,13 +369,13 @@
// start preview mode
status_t CameraClient::startPreview() {
- LOG1("startPreview (pid %d)", getCallingPid());
+ LOG1("startPreview (pid %d)", CameraThreadState::getCallingPid());
return startCameraMode(CAMERA_PREVIEW_MODE);
}
// start recording mode
status_t CameraClient::startRecording() {
- LOG1("startRecording (pid %d)", getCallingPid());
+ LOG1("startRecording (pid %d)", CameraThreadState::getCallingPid());
return startCameraMode(CAMERA_RECORDING_MODE);
}
@@ -460,7 +458,7 @@
// stop preview mode
void CameraClient::stopPreview() {
- LOG1("stopPreview (pid %d)", getCallingPid());
+ LOG1("stopPreview (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return;
@@ -476,7 +474,7 @@
// stop recording mode
void CameraClient::stopRecording() {
- LOG1("stopRecording (pid %d)", getCallingPid());
+ LOG1("stopRecording (pid %d)", CameraThreadState::getCallingPid());
{
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return;
@@ -502,7 +500,7 @@
if (checkPidAndHardware() != NO_ERROR) return;
if (mem == nullptr) {
android_errorWriteWithInfoLog(CameraService::SN_EVENT_LOG_ID, "26164272",
- IPCThreadState::self()->getCallingUid(), nullptr, 0);
+ CameraThreadState::getCallingUid(), nullptr, 0);
return;
}
@@ -614,7 +612,7 @@
}
bool CameraClient::previewEnabled() {
- LOG1("previewEnabled (pid %d)", getCallingPid());
+ LOG1("previewEnabled (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return false;
@@ -622,7 +620,7 @@
}
bool CameraClient::recordingEnabled() {
- LOG1("recordingEnabled (pid %d)", getCallingPid());
+ LOG1("recordingEnabled (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return false;
@@ -630,7 +628,7 @@
}
status_t CameraClient::autoFocus() {
- LOG1("autoFocus (pid %d)", getCallingPid());
+ LOG1("autoFocus (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
@@ -640,7 +638,7 @@
}
status_t CameraClient::cancelAutoFocus() {
- LOG1("cancelAutoFocus (pid %d)", getCallingPid());
+ LOG1("cancelAutoFocus (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
@@ -651,7 +649,7 @@
// take a picture - image is returned in callback
status_t CameraClient::takePicture(int msgType) {
- LOG1("takePicture (pid %d): 0x%x", getCallingPid(), msgType);
+ LOG1("takePicture (pid %d): 0x%x", CameraThreadState::getCallingPid(), msgType);
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
@@ -680,7 +678,7 @@
// set preview/capture parameters - key/value pairs
status_t CameraClient::setParameters(const String8& params) {
- LOG1("setParameters (pid %d) (%s)", getCallingPid(), params.string());
+ LOG1("setParameters (pid %d) (%s)", CameraThreadState::getCallingPid(), params.string());
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
@@ -695,16 +693,18 @@
String8 CameraClient::getParameters() const {
Mutex::Autolock lock(mLock);
// The camera service can unconditionally get the parameters at all times
- if (getCallingPid() != mServicePid && checkPidAndHardware() != NO_ERROR) return String8();
+ if (CameraThreadState::getCallingPid() != mServicePid && checkPidAndHardware() != NO_ERROR) {
+ return String8();
+ }
String8 params(mHardware->getParameters().flatten());
- LOG1("getParameters (pid %d) (%s)", getCallingPid(), params.string());
+ LOG1("getParameters (pid %d) (%s)", CameraThreadState::getCallingPid(), params.string());
return params;
}
// enable shutter sound
status_t CameraClient::enableShutterSound(bool enable) {
- LOG1("enableShutterSound (pid %d)", getCallingPid());
+ LOG1("enableShutterSound (pid %d)", CameraThreadState::getCallingPid());
status_t result = checkPidAndHardware();
if (result != NO_ERROR) return result;
@@ -719,7 +719,7 @@
}
status_t CameraClient::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
- LOG1("sendCommand (pid %d)", getCallingPid());
+ LOG1("sendCommand (pid %d)", CameraThreadState::getCallingPid());
int orientation;
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
index 84428c2..dd2ef99 100644
--- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
+++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
@@ -19,6 +19,7 @@
//#define LOG_NDEBUG 0
#include <cutils/properties.h>
+#include <utils/CameraThreadState.h>
#include <utils/Log.h>
#include <utils/Trace.h>
#include <gui/Surface.h>
@@ -1724,7 +1725,7 @@
// TODO: move to Camera2ClientBase
bool CameraDeviceClient::enforceRequestPermissions(CameraMetadata& metadata) {
- const int pid = IPCThreadState::self()->getCallingPid();
+ const int pid = CameraThreadState::getCallingPid();
const int selfPid = getpid();
camera_metadata_entry_t entry;
@@ -1763,7 +1764,7 @@
String16 permissionString =
String16("android.permission.CAMERA_DISABLE_TRANSMIT_LED");
if (!checkCallingPermission(permissionString)) {
- const int uid = IPCThreadState::self()->getCallingUid();
+ const int uid = CameraThreadState::getCallingUid();
ALOGE("Permission Denial: "
"can't disable transmit LED pid=%d, uid=%d", pid, uid);
return false;
diff --git a/services/camera/libcameraservice/common/Camera2ClientBase.cpp b/services/camera/libcameraservice/common/Camera2ClientBase.cpp
index aeea473..78feb3e 100644
--- a/services/camera/libcameraservice/common/Camera2ClientBase.cpp
+++ b/services/camera/libcameraservice/common/Camera2ClientBase.cpp
@@ -32,14 +32,11 @@
#include "api2/CameraDeviceClient.h"
#include "device3/Camera3Device.h"
+#include "utils/CameraThreadState.h"
namespace android {
using namespace camera2;
-static int getCallingPid() {
- return IPCThreadState::self()->getCallingPid();
-}
-
// Interface used by CameraService
template <typename TClientBase>
@@ -71,7 +68,7 @@
status_t Camera2ClientBase<TClientBase>::checkPid(const char* checkLocation)
const {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (callingPid == TClientBase::mClientPid) return NO_ERROR;
ALOGE("%s: attempt to use a locked camera from a different process"
@@ -186,7 +183,7 @@
binder::Status res = binder::Status::ok();
// Allow both client and the media server to disconnect at all times
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (callingPid != TClientBase::mClientPid &&
callingPid != TClientBase::mServicePid) return res;
@@ -217,18 +214,18 @@
Mutex::Autolock icl(mBinderSerializationLock);
if (TClientBase::mClientPid != 0 &&
- getCallingPid() != TClientBase::mClientPid) {
+ CameraThreadState::getCallingPid() != TClientBase::mClientPid) {
ALOGE("%s: Camera %s: Connection attempt from pid %d; "
"current locked to pid %d",
__FUNCTION__,
TClientBase::mCameraIdStr.string(),
- getCallingPid(),
+ CameraThreadState::getCallingPid(),
TClientBase::mClientPid);
return BAD_VALUE;
}
- TClientBase::mClientPid = getCallingPid();
+ TClientBase::mClientPid = CameraThreadState::getCallingPid();
TClientBase::mRemoteCallback = client;
mSharedCameraCallbacks = client;
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 48e38bb..6e61be2 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -56,6 +56,7 @@
#include "device3/Camera3DummyStream.h"
#include "device3/Camera3SharedOutputStream.h"
#include "CameraService.h"
+#include "utils/CameraThreadState.h"
using namespace android::camera3;
using namespace android::hardware::camera;
@@ -1701,7 +1702,7 @@
if (templateId <= 0 || templateId >= CAMERA3_TEMPLATE_COUNT) {
android_errorWriteWithInfoLog(CameraService::SN_EVENT_LOG_ID, "26866110",
- IPCThreadState::self()->getCallingUid(), nullptr, 0);
+ CameraThreadState::getCallingUid(), nullptr, 0);
return BAD_VALUE;
}
diff --git a/services/camera/libcameraservice/utils/CameraThreadState.cpp b/services/camera/libcameraservice/utils/CameraThreadState.cpp
new file mode 100644
index 0000000..b9e344b
--- /dev/null
+++ b/services/camera/libcameraservice/utils/CameraThreadState.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "CameraThreadState.h"
+#include <binder/IPCThreadState.h>
+#include <hwbinder/IPCThreadState.h>
+#include <unistd.h>
+
+namespace android {
+
+int CameraThreadState::getCallingUid() {
+ if (hardware::IPCThreadState::self()->isServingCall()) {
+ return hardware::IPCThreadState::self()->getCallingUid();
+ }
+ return IPCThreadState::self()->getCallingUid();
+}
+
+int CameraThreadState::getCallingPid() {
+ if (hardware::IPCThreadState::self()->isServingCall()) {
+ return hardware::IPCThreadState::self()->getCallingPid();
+ }
+ return IPCThreadState::self()->getCallingPid();
+}
+
+int64_t CameraThreadState::clearCallingIdentity() {
+ if (hardware::IPCThreadState::self()->isServingCall()) {
+ return hardware::IPCThreadState::self()->clearCallingIdentity();
+ }
+ return IPCThreadState::self()->clearCallingIdentity();
+}
+
+void CameraThreadState::restoreCallingIdentity(int64_t token) {
+ if (hardware::IPCThreadState::self()->isServingCall()) {
+ hardware::IPCThreadState::self()->restoreCallingIdentity(token);
+ } else {
+ IPCThreadState::self()->restoreCallingIdentity(token);
+ }
+ return;
+}
+
+} // android
diff --git a/services/camera/libcameraservice/utils/CameraThreadState.h b/services/camera/libcameraservice/utils/CameraThreadState.h
new file mode 100644
index 0000000..e1a70de
--- /dev/null
+++ b/services/camera/libcameraservice/utils/CameraThreadState.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdint.h>
+
+namespace android {
+class CameraThreadState {
+public:
+ static int64_t clearCallingIdentity();
+
+ static void restoreCallingIdentity(int64_t token);
+
+ static int getCallingUid();
+
+ static int getCallingPid();
+};
+
+} // android