Merge "Fix the calculation of the number of frames" into oc-mr1-dev
diff --git a/drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp b/drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp
index ed050f7..0259a42 100644
--- a/drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp
+++ b/drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp
@@ -21,12 +21,19 @@
namespace clearkeydrm {
bool isClearKeyUUID(const uint8_t uuid[16]) {
- static const uint8_t kClearKeyUUID[16] = {
+ static const uint8_t kCommonPsshBoxUUID[16] = {
0x10,0x77,0xEF,0xEC,0xC0,0xB2,0x4D,0x02,
0xAC,0xE3,0x3C,0x1E,0x52,0xE2,0xFB,0x4B
};
- return !memcmp(uuid, kClearKeyUUID, sizeof(kClearKeyUUID));
+ // To be used in mpd to specify drm scheme for players
+ static const uint8_t kClearKeyUUID[16] = {
+ 0xE2,0x71,0x9D,0x58,0xA9,0x85,0xB3,0xC9,
+ 0x78,0x1A,0xB0,0x30,0xAF,0x78,0xD3,0x0E
+ };
+
+ return !memcmp(uuid, kCommonPsshBoxUUID, sizeof(kCommonPsshBoxUUID)) ||
+ !memcmp(uuid, kClearKeyUUID, sizeof(kClearKeyUUID));
}
} // namespace clearkeydrm
diff --git a/media/libaaudio/src/client/AudioEndpoint.cpp b/media/libaaudio/src/client/AudioEndpoint.cpp
index 3ee450a..604eed5 100644
--- a/media/libaaudio/src/client/AudioEndpoint.cpp
+++ b/media/libaaudio/src/client/AudioEndpoint.cpp
@@ -121,24 +121,28 @@
{
aaudio_result_t result = AudioEndpoint_validateDescriptor(pEndpointDescriptor);
if (result != AAUDIO_OK) {
- ALOGE("AudioEndpoint_validateQueueDescriptor returned %d %s",
- result, AAudio_convertResultToText(result));
return result;
}
// ============================ up message queue =============================
const RingBufferDescriptor *descriptor = &pEndpointDescriptor->upMessageQueueDescriptor;
if(descriptor->bytesPerFrame != sizeof(AAudioServiceMessage)) {
- ALOGE("AudioEndpoint::configure() bytesPerFrame != sizeof(AAudioServiceMessage) = %d",
+ ALOGE("AudioEndpoint.configure() bytesPerFrame != sizeof(AAudioServiceMessage) = %d",
descriptor->bytesPerFrame);
return AAUDIO_ERROR_INTERNAL;
}
if(descriptor->readCounterAddress == nullptr || descriptor->writeCounterAddress == nullptr) {
- ALOGE("AudioEndpoint_validateQueueDescriptor() NULL counter address");
+ ALOGE("AudioEndpoint.configure() NULL counter address");
return AAUDIO_ERROR_NULL;
}
+ // Prevent memory leak and reuse.
+ if(mUpCommandQueue != nullptr || mDataQueue != nullptr) {
+ ALOGE("AudioEndpoint.configure() endpoint already used");
+ return AAUDIO_ERROR_INTERNAL;
+ }
+
mUpCommandQueue = new FifoBuffer(
descriptor->bytesPerFrame,
descriptor->capacityInFrames,
@@ -149,8 +153,8 @@
// ============================ data queue =============================
descriptor = &pEndpointDescriptor->dataQueueDescriptor;
- ALOGV("AudioEndpoint::configure() data framesPerBurst = %d", descriptor->framesPerBurst);
- ALOGV("AudioEndpoint::configure() data readCounterAddress = %p",
+ ALOGV("AudioEndpoint.configure() data framesPerBurst = %d", descriptor->framesPerBurst);
+ ALOGV("AudioEndpoint.configure() data readCounterAddress = %p",
descriptor->readCounterAddress);
// An example of free running is when the other side is read or written by hardware DMA
@@ -159,7 +163,7 @@
? descriptor->readCounterAddress // read by other side
: descriptor->writeCounterAddress; // written by other side
mFreeRunning = (remoteCounter == nullptr);
- ALOGV("AudioEndpoint::configure() mFreeRunning = %d", mFreeRunning ? 1 : 0);
+ ALOGV("AudioEndpoint.configure() mFreeRunning = %d", mFreeRunning ? 1 : 0);
int64_t *readCounterAddress = (descriptor->readCounterAddress == nullptr)
? &mDataReadCounter
diff --git a/media/libaaudio/src/client/AudioStreamInternal.cpp b/media/libaaudio/src/client/AudioStreamInternal.cpp
index 41d4909..bdebf8f 100644
--- a/media/libaaudio/src/client/AudioStreamInternal.cpp
+++ b/media/libaaudio/src/client/AudioStreamInternal.cpp
@@ -80,9 +80,16 @@
aaudio_result_t AudioStreamInternal::open(const AudioStreamBuilder &builder) {
aaudio_result_t result = AAUDIO_OK;
+ int32_t capacity;
AAudioStreamRequest request;
- AAudioStreamConfiguration configuration;
+ AAudioStreamConfiguration configurationOutput;
+ if (getState() != AAUDIO_STREAM_STATE_UNINITIALIZED) {
+ ALOGE("AudioStreamInternal::open(): already open! state = %d", getState());
+ return AAUDIO_ERROR_INVALID_STATE;
+ }
+
+ // Copy requested parameters to the stream.
result = AudioStream::open(builder);
if (result < 0) {
return result;
@@ -109,87 +116,95 @@
request.getConfiguration().setBufferCapacity(builder.getBufferCapacity());
- mServiceStreamHandle = mServiceInterface.openStream(request, configuration);
+ mServiceStreamHandle = mServiceInterface.openStream(request, configurationOutput);
if (mServiceStreamHandle < 0) {
result = mServiceStreamHandle;
- ALOGE("AudioStreamInternal.open(): openStream() returned %d", result);
- } else {
- result = configuration.validate();
- if (result != AAUDIO_OK) {
- close();
- return result;
- }
- // Save results of the open.
- setSampleRate(configuration.getSampleRate());
- setSamplesPerFrame(configuration.getSamplesPerFrame());
- setDeviceId(configuration.getDeviceId());
- setSharingMode(configuration.getSharingMode());
-
- // Save device format so we can do format conversion and volume scaling together.
- mDeviceFormat = configuration.getFormat();
-
- result = mServiceInterface.getStreamDescription(mServiceStreamHandle, mEndPointParcelable);
- if (result != AAUDIO_OK) {
- mServiceInterface.closeStream(mServiceStreamHandle);
- return result;
- }
-
- // resolve parcelable into a descriptor
- result = mEndPointParcelable.resolve(&mEndpointDescriptor);
- if (result != AAUDIO_OK) {
- mServiceInterface.closeStream(mServiceStreamHandle);
- return result;
- }
-
- // Configure endpoint based on descriptor.
- mAudioEndpoint.configure(&mEndpointDescriptor, getDirection());
-
- mFramesPerBurst = mEndpointDescriptor.dataQueueDescriptor.framesPerBurst;
- int32_t capacity = mEndpointDescriptor.dataQueueDescriptor.capacityInFrames;
-
- // Validate result from server.
- if (mFramesPerBurst < 16 || mFramesPerBurst > 16 * 1024) {
- ALOGE("AudioStream::open(): framesPerBurst out of range = %d", mFramesPerBurst);
- return AAUDIO_ERROR_OUT_OF_RANGE;
- }
- if (capacity < mFramesPerBurst || capacity > 32 * 1024) {
- ALOGE("AudioStream::open(): bufferCapacity out of range = %d", capacity);
- return AAUDIO_ERROR_OUT_OF_RANGE;
- }
-
- mClockModel.setSampleRate(getSampleRate());
- mClockModel.setFramesPerBurst(mFramesPerBurst);
-
- if (getDataCallbackProc()) {
- mCallbackFrames = builder.getFramesPerDataCallback();
- if (mCallbackFrames > getBufferCapacity() / 2) {
- ALOGE("AudioStreamInternal::open(): framesPerCallback too big = %d, capacity = %d",
- mCallbackFrames, getBufferCapacity());
- mServiceInterface.closeStream(mServiceStreamHandle);
- return AAUDIO_ERROR_OUT_OF_RANGE;
-
- } else if (mCallbackFrames < 0) {
- ALOGE("AudioStreamInternal::open(): framesPerCallback negative");
- mServiceInterface.closeStream(mServiceStreamHandle);
- return AAUDIO_ERROR_OUT_OF_RANGE;
-
- }
- if (mCallbackFrames == AAUDIO_UNSPECIFIED) {
- mCallbackFrames = mFramesPerBurst;
- }
-
- int32_t bytesPerFrame = getSamplesPerFrame()
- * AAudioConvert_formatToSizeInBytes(getFormat());
- int32_t callbackBufferSize = mCallbackFrames * bytesPerFrame;
- mCallbackBuffer = new uint8_t[callbackBufferSize];
- }
-
- setState(AAUDIO_STREAM_STATE_OPEN);
- // only connect to AudioManager if this is a playback stream running in client process
- if (!mInService && getDirection() == AAUDIO_DIRECTION_OUTPUT) {
- init(android::PLAYER_TYPE_AAUDIO, AUDIO_USAGE_MEDIA);
- }
+ ALOGE("AudioStreamInternal::open(): openStream() returned %d", result);
+ return result;
}
+
+ result = configurationOutput.validate();
+ if (result != AAUDIO_OK) {
+ goto error;
+ }
+ // Save results of the open.
+ setSampleRate(configurationOutput.getSampleRate());
+ setSamplesPerFrame(configurationOutput.getSamplesPerFrame());
+ setDeviceId(configurationOutput.getDeviceId());
+ setSharingMode(configurationOutput.getSharingMode());
+
+ // Save device format so we can do format conversion and volume scaling together.
+ mDeviceFormat = configurationOutput.getFormat();
+
+ result = mServiceInterface.getStreamDescription(mServiceStreamHandle, mEndPointParcelable);
+ if (result != AAUDIO_OK) {
+ goto error;
+ }
+
+ // Resolve parcelable into a descriptor.
+ result = mEndPointParcelable.resolve(&mEndpointDescriptor);
+ if (result != AAUDIO_OK) {
+ goto error;
+ }
+
+ // Configure endpoint based on descriptor.
+ result = mAudioEndpoint.configure(&mEndpointDescriptor, getDirection());
+ if (result != AAUDIO_OK) {
+ goto error;
+ }
+
+ mFramesPerBurst = mEndpointDescriptor.dataQueueDescriptor.framesPerBurst;
+ capacity = mEndpointDescriptor.dataQueueDescriptor.capacityInFrames;
+
+ // Validate result from server.
+ if (mFramesPerBurst < 16 || mFramesPerBurst > 16 * 1024) {
+ ALOGE("AudioStreamInternal::open(): framesPerBurst out of range = %d", mFramesPerBurst);
+ result = AAUDIO_ERROR_OUT_OF_RANGE;
+ goto error;
+ }
+ if (capacity < mFramesPerBurst || capacity > 32 * 1024) {
+ ALOGE("AudioStreamInternal::open(): bufferCapacity out of range = %d", capacity);
+ result = AAUDIO_ERROR_OUT_OF_RANGE;
+ goto error;
+ }
+
+ mClockModel.setSampleRate(getSampleRate());
+ mClockModel.setFramesPerBurst(mFramesPerBurst);
+
+ if (getDataCallbackProc()) {
+ mCallbackFrames = builder.getFramesPerDataCallback();
+ if (mCallbackFrames > getBufferCapacity() / 2) {
+ ALOGE("AudioStreamInternal::open(): framesPerCallback too big = %d, capacity = %d",
+ mCallbackFrames, getBufferCapacity());
+ result = AAUDIO_ERROR_OUT_OF_RANGE;
+ goto error;
+
+ } else if (mCallbackFrames < 0) {
+ ALOGE("AudioStreamInternal::open(): framesPerCallback negative");
+ result = AAUDIO_ERROR_OUT_OF_RANGE;
+ goto error;
+
+ }
+ if (mCallbackFrames == AAUDIO_UNSPECIFIED) {
+ mCallbackFrames = mFramesPerBurst;
+ }
+
+ int32_t bytesPerFrame = getSamplesPerFrame()
+ * AAudioConvert_formatToSizeInBytes(getFormat());
+ int32_t callbackBufferSize = mCallbackFrames * bytesPerFrame;
+ mCallbackBuffer = new uint8_t[callbackBufferSize];
+ }
+
+ setState(AAUDIO_STREAM_STATE_OPEN);
+ // Only connect to AudioManager if this is a playback stream running in client process.
+ if (!mInService && getDirection() == AAUDIO_DIRECTION_OUTPUT) {
+ init(android::PLAYER_TYPE_AAUDIO, AUDIO_USAGE_MEDIA);
+ }
+
+ return result;
+
+error:
+ close();
return result;
}
@@ -224,7 +239,6 @@
}
}
-
static void *aaudio_callback_thread_proc(void *context)
{
AudioStreamInternal *stream = (AudioStreamInternal *)context;
diff --git a/media/libmedia/MediaUtils.cpp b/media/libmedia/MediaUtils.cpp
index dc2bc82..bcdc3bd 100644
--- a/media/libmedia/MediaUtils.cpp
+++ b/media/libmedia/MediaUtils.cpp
@@ -24,6 +24,8 @@
#include "MediaUtils.h"
+extern "C" size_t __cfi_shadow_size();
+
namespace android {
void limitProcessMemory(
@@ -62,6 +64,19 @@
if (propVal > 0 && uint64_t(propVal) <= SIZE_MAX) {
maxMem = propVal;
}
+
+ // Increase by the size of the CFI shadow mapping. Most of the shadow is not
+ // backed with physical pages, and it is possible for the result to be
+ // higher than total physical memory. This is fine for RLIMIT_AS.
+ size_t cfi_size = __cfi_shadow_size();
+ if (cfi_size) {
+ ALOGV("cfi shadow size: %zu", cfi_size);
+ if (maxMem <= SIZE_MAX - cfi_size) {
+ maxMem += cfi_size;
+ } else {
+ maxMem = SIZE_MAX;
+ }
+ }
ALOGV("actual limit: %zu", maxMem);
struct rlimit limit;
diff --git a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
index 09e6d75..87c2411 100644
--- a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
+++ b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
@@ -213,6 +213,13 @@
Mutex::Autolock autoLock(mLock);
CHECK_LT(portIndex, mPorts.size());
+ PortInfo *port = &mPorts.editItemAt(portIndex);
+ if (size < port->mDef.nBufferSize) {
+ ALOGE("b/63522430, Buffer size is too small.");
+ android_errorWriteLog(0x534e4554, "63522430");
+ return OMX_ErrorBadParameter;
+ }
+
*header = new OMX_BUFFERHEADERTYPE;
(*header)->nSize = sizeof(OMX_BUFFERHEADERTYPE);
(*header)->nVersion.s.nVersionMajor = 1;
@@ -235,8 +242,6 @@
(*header)->nOutputPortIndex = portIndex;
(*header)->nInputPortIndex = portIndex;
- PortInfo *port = &mPorts.editItemAt(portIndex);
-
CHECK(mState == OMX_StateLoaded || port->mDef.bEnabled == OMX_FALSE);
CHECK_LT(port->mBuffers.size(), port->mDef.nBufferCountActual);
diff --git a/services/audioflinger/ServiceUtilities.cpp b/services/audioflinger/ServiceUtilities.cpp
index 3c73543..c1044ef 100644
--- a/services/audioflinger/ServiceUtilities.cpp
+++ b/services/audioflinger/ServiceUtilities.cpp
@@ -113,10 +113,15 @@
return ok;
}
-bool captureHotwordAllowed() {
- static const String16 sCaptureHotwordAllowed("android.permission.CAPTURE_AUDIO_HOTWORD");
- // IMPORTANT: Use PermissionCache - not a runtime permission and may not change.
- bool ok = PermissionCache::checkCallingPermission(sCaptureHotwordAllowed);
+bool captureHotwordAllowed(pid_t pid, uid_t uid) {
+ // CAPTURE_AUDIO_HOTWORD permission implies RECORD_AUDIO permission
+ bool ok = recordingAllowed(String16(""), pid, uid);
+
+ if (ok) {
+ static const String16 sCaptureHotwordAllowed("android.permission.CAPTURE_AUDIO_HOTWORD");
+ // IMPORTANT: Use PermissionCache - not a runtime permission and may not change.
+ ok = PermissionCache::checkCallingPermission(sCaptureHotwordAllowed);
+ }
if (!ok) ALOGE("android.permission.CAPTURE_AUDIO_HOTWORD");
return ok;
}
diff --git a/services/audioflinger/ServiceUtilities.h b/services/audioflinger/ServiceUtilities.h
index 8b1bc00..04cb9cd 100644
--- a/services/audioflinger/ServiceUtilities.h
+++ b/services/audioflinger/ServiceUtilities.h
@@ -22,7 +22,7 @@
bool isTrustedCallingUid(uid_t uid);
bool recordingAllowed(const String16& opPackageName, pid_t pid, uid_t uid);
bool captureAudioOutputAllowed(pid_t pid, uid_t uid);
-bool captureHotwordAllowed();
+bool captureHotwordAllowed(pid_t pid, uid_t uid);
bool settingsAllowed();
bool modifyAudioRoutingAllowed();
bool dumpAllowed();
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 7d7cd93..1d4386c 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -289,13 +289,6 @@
return BAD_VALUE;
}
- if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
- return BAD_VALUE;
- }
- sp<AudioPolicyEffects>audioPolicyEffects;
- status_t status;
- AudioPolicyInterface::input_type_t inputType;
-
bool updatePid = (pid == -1);
const uid_t callingUid = IPCThreadState::self()->getCallingUid();
if (!isTrustedCallingUid(callingUid)) {
@@ -313,7 +306,15 @@
pid = callingPid;
}
+ if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed(pid, uid)) {
+ return BAD_VALUE;
+ }
+
+ sp<AudioPolicyEffects>audioPolicyEffects;
{
+ status_t status;
+ AudioPolicyInterface::input_type_t inputType;
+
Mutex::Autolock _l(mLock);
// the audio_in_acoustics_t parameter is ignored by get_input()
status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid,
diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp
index 5b8d990..8891aba 100644
--- a/services/soundtrigger/SoundTriggerHwService.cpp
+++ b/services/soundtrigger/SoundTriggerHwService.cpp
@@ -89,7 +89,8 @@
uint32_t *numModules)
{
ALOGV("listModules");
- if (!captureHotwordAllowed()) {
+ if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -110,7 +111,8 @@
sp<ISoundTrigger>& moduleInterface)
{
ALOGV("attach module %d", handle);
- if (!captureHotwordAllowed()) {
+ if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -942,7 +944,8 @@
void SoundTriggerHwService::ModuleClient::detach() {
ALOGV("detach()");
- if (!captureHotwordAllowed()) {
+ if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ IPCThreadState::self()->getCallingUid())) {
return;
}
@@ -965,7 +968,8 @@
sound_model_handle_t *handle)
{
ALOGV("loadSoundModel() handle");
- if (!captureHotwordAllowed()) {
+ if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -979,7 +983,8 @@
status_t SoundTriggerHwService::ModuleClient::unloadSoundModel(sound_model_handle_t handle)
{
ALOGV("unloadSoundModel() model handle %d", handle);
- if (!captureHotwordAllowed()) {
+ if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -994,7 +999,8 @@
const sp<IMemory>& dataMemory)
{
ALOGV("startRecognition() model handle %d", handle);
- if (!captureHotwordAllowed()) {
+ if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -1008,7 +1014,8 @@
status_t SoundTriggerHwService::ModuleClient::stopRecognition(sound_model_handle_t handle)
{
ALOGV("stopRecognition() model handle %d", handle);
- if (!captureHotwordAllowed()) {
+ if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}