Loading media/audioserver/Android.mk +0 −15 Original line number Diff line number Diff line Loading @@ -40,21 +40,6 @@ LOCAL_C_INCLUDES := \ frameworks/av/media/libmedia \ external/sonic \ # If AUDIOSERVER_MULTILIB in device.mk is non-empty then it is used to control # the LOCAL_MULTILIB for all audioserver exclusive libraries. # This is relevant for 64 bit architectures where either or both # 32 and 64 bit libraries may be built. # # AUDIOSERVER_MULTILIB may be set as follows: # 32 to build 32 bit audioserver libraries and 32 bit audioserver. # 64 to build 64 bit audioserver libraries and 64 bit audioserver. # both to build both 32 bit and 64 bit libraries, # and use primary target architecture (32 or 64) for audioserver. # first to build libraries and audioserver for the primary target architecture only. # <empty> to build both 32 and 64 bit libraries and primary target audioserver. LOCAL_MULTILIB := $(AUDIOSERVER_MULTILIB) LOCAL_MODULE := audioserver LOCAL_INIT_RC := audioserver.rc Loading media/extractors/mp4/ItemTable.cpp +16 −7 Original line number Diff line number Diff line Loading @@ -700,8 +700,8 @@ struct IspeBox : public FullBox, public ItemProperty { } private: uint32_t mWidth; uint32_t mHeight; int32_t mWidth; int32_t mHeight; }; status_t IspeBox::parse(off64_t offset, size_t size) { Loading @@ -715,12 +715,19 @@ status_t IspeBox::parse(off64_t offset, size_t size) { if (size < 8) { return ERROR_MALFORMED; } if (!source()->getUInt32(offset, &mWidth) || !source()->getUInt32(offset + 4, &mHeight)) { if (!source()->getUInt32(offset, (uint32_t *)&mWidth) || !source()->getUInt32(offset + 4, (uint32_t *)&mHeight)) { return ERROR_IO; } ALOGV("property ispe: %dx%d", mWidth, mHeight); // Validate that the dimension doesn't cause overflow on calculated max input size. // Max input size is width*height*1.5, restrict width*height to 1<<29 so that // we don't need to cast to int64_t when doing mults. if (mWidth <= 0 || mHeight <= 0 || mWidth > (1 << 29) / mHeight) { return ERROR_MALFORMED; } ALOGV("property ispe: %dx%d", mWidth, mHeight); return OK; } Loading Loading @@ -1524,8 +1531,9 @@ AMediaFormat *ItemTable::getImageMeta(const uint32_t imageIndex) { default: break; // don't set if invalid } } // we validated no overflow in IspeBox::parse() AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 1.5); AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 3 / 2); if (!image->thumbnails.empty()) { ssize_t thumbItemIndex = mItemIdToItemMap.indexOfKey(image->thumbnails[0]); Loading Loading @@ -1561,8 +1569,9 @@ AMediaFormat *ItemTable::getImageMeta(const uint32_t imageIndex) { AMEDIAFORMAT_KEY_TILE_WIDTH, image->width); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_TILE_HEIGHT, image->height); // we validated no overflow in IspeBox::parse() AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 1.5); AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 3 / 2); } if (image->hvcc == NULL) { Loading media/libaudioclient/AudioSystem.cpp +29 −0 Original line number Diff line number Diff line Loading @@ -1532,6 +1532,35 @@ bool AudioSystem::isCallScreenModeSupported() return aps->isCallScreenModeSupported(); } status_t AudioSystem::setPreferredDeviceForStrategy(product_strategy_t strategy, const AudioDeviceTypeAddr &device) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) { return PERMISSION_DENIED; } return aps->setPreferredDeviceForStrategy(strategy, device); } status_t AudioSystem::removePreferredDeviceForStrategy(product_strategy_t strategy) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) { return PERMISSION_DENIED; } return aps->removePreferredDeviceForStrategy(strategy); } status_t AudioSystem::getPreferredDeviceForStrategy(product_strategy_t strategy, AudioDeviceTypeAddr &device) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) { return PERMISSION_DENIED; } return aps->getPreferredDeviceForStrategy(strategy, device); } // --------------------------------------------------------------------------- int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback( Loading media/libaudioclient/IAudioPolicyService.cpp +91 −2 Original line number Diff line number Diff line Loading @@ -105,7 +105,10 @@ enum { SET_ALLOWED_CAPTURE_POLICY, MOVE_EFFECTS_TO_IO, SET_RTT_ENABLED, IS_CALL_SCREEN_MODE_SUPPORTED IS_CALL_SCREEN_MODE_SUPPORTED, SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, }; #define MAX_ITEMS_PER_LIST 1024 Loading Loading @@ -1296,6 +1299,55 @@ public: } return reply.readBool(); } virtual status_t setPreferredDeviceForStrategy(product_strategy_t strategy, const AudioDeviceTypeAddr &device) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeUint32(static_cast<uint32_t>(strategy)); status_t status = device.writeToParcel(&data); if (status != NO_ERROR) { return BAD_VALUE; } status = remote()->transact(SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, data, &reply); if (status != NO_ERROR) { return status; } return static_cast<status_t>(reply.readInt32()); } virtual status_t removePreferredDeviceForStrategy(product_strategy_t strategy) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeUint32(static_cast<uint32_t>(strategy)); status_t status = remote()->transact(REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, data, &reply); if (status != NO_ERROR) { return status; } return static_cast<status_t>(reply.readInt32()); } virtual status_t getPreferredDeviceForStrategy(product_strategy_t strategy, AudioDeviceTypeAddr &device) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeUint32(static_cast<uint32_t>(strategy)); status_t status = remote()->transact(GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, data, &reply); if (status != NO_ERROR) { return status; } status = device.readFromParcel(&reply); if (status != NO_ERROR) { return status; } return static_cast<status_t>(reply.readInt32()); } }; IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); Loading Loading @@ -1359,7 +1411,10 @@ status_t BnAudioPolicyService::onTransact( case LIST_AUDIO_VOLUME_GROUPS: case GET_VOLUME_GROUP_FOR_ATTRIBUTES: case SET_RTT_ENABLED: case IS_CALL_SCREEN_MODE_SUPPORTED: { case IS_CALL_SCREEN_MODE_SUPPORTED: case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", __func__, code, IPCThreadState::self()->getCallingPid(), Loading Loading @@ -2388,6 +2443,40 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); product_strategy_t strategy = (product_strategy_t) data.readUint32(); AudioDeviceTypeAddr device; status_t status = device.readFromParcel((Parcel*)&data); if (status != NO_ERROR) { return status; } status = setPreferredDeviceForStrategy(strategy, device); reply->writeInt32(status); return NO_ERROR; } case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); product_strategy_t strategy = (product_strategy_t) data.readUint32(); status_t status = removePreferredDeviceForStrategy(strategy); reply->writeInt32(status); return NO_ERROR; } case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); product_strategy_t strategy = (product_strategy_t) data.readUint32(); AudioDeviceTypeAddr device; status_t status = getPreferredDeviceForStrategy(strategy, device); status_t marshall_status = device.writeToParcel(reply); if (marshall_status != NO_ERROR) { return marshall_status; } reply->writeInt32(status); return NO_ERROR; } default: return BBinder::onTransact(code, data, reply, flags); } Loading media/libaudioclient/include/media/AudioSystem.h +11 −0 Original line number Diff line number Diff line Loading @@ -405,6 +405,17 @@ public: */ static status_t setAudioHalPids(const std::vector<pid_t>& pids); static status_t setPreferredDeviceForStrategy(product_strategy_t strategy, const AudioDeviceTypeAddr &device); static status_t removePreferredDeviceForStrategy(product_strategy_t strategy); static status_t getPreferredDeviceForStrategy(product_strategy_t strategy, AudioDeviceTypeAddr &device); static status_t getDeviceForStrategy(product_strategy_t strategy, AudioDeviceTypeAddr &device); // ---------------------------------------------------------------------------- class AudioVolumeGroupCallback : public RefBase Loading Loading
media/audioserver/Android.mk +0 −15 Original line number Diff line number Diff line Loading @@ -40,21 +40,6 @@ LOCAL_C_INCLUDES := \ frameworks/av/media/libmedia \ external/sonic \ # If AUDIOSERVER_MULTILIB in device.mk is non-empty then it is used to control # the LOCAL_MULTILIB for all audioserver exclusive libraries. # This is relevant for 64 bit architectures where either or both # 32 and 64 bit libraries may be built. # # AUDIOSERVER_MULTILIB may be set as follows: # 32 to build 32 bit audioserver libraries and 32 bit audioserver. # 64 to build 64 bit audioserver libraries and 64 bit audioserver. # both to build both 32 bit and 64 bit libraries, # and use primary target architecture (32 or 64) for audioserver. # first to build libraries and audioserver for the primary target architecture only. # <empty> to build both 32 and 64 bit libraries and primary target audioserver. LOCAL_MULTILIB := $(AUDIOSERVER_MULTILIB) LOCAL_MODULE := audioserver LOCAL_INIT_RC := audioserver.rc Loading
media/extractors/mp4/ItemTable.cpp +16 −7 Original line number Diff line number Diff line Loading @@ -700,8 +700,8 @@ struct IspeBox : public FullBox, public ItemProperty { } private: uint32_t mWidth; uint32_t mHeight; int32_t mWidth; int32_t mHeight; }; status_t IspeBox::parse(off64_t offset, size_t size) { Loading @@ -715,12 +715,19 @@ status_t IspeBox::parse(off64_t offset, size_t size) { if (size < 8) { return ERROR_MALFORMED; } if (!source()->getUInt32(offset, &mWidth) || !source()->getUInt32(offset + 4, &mHeight)) { if (!source()->getUInt32(offset, (uint32_t *)&mWidth) || !source()->getUInt32(offset + 4, (uint32_t *)&mHeight)) { return ERROR_IO; } ALOGV("property ispe: %dx%d", mWidth, mHeight); // Validate that the dimension doesn't cause overflow on calculated max input size. // Max input size is width*height*1.5, restrict width*height to 1<<29 so that // we don't need to cast to int64_t when doing mults. if (mWidth <= 0 || mHeight <= 0 || mWidth > (1 << 29) / mHeight) { return ERROR_MALFORMED; } ALOGV("property ispe: %dx%d", mWidth, mHeight); return OK; } Loading Loading @@ -1524,8 +1531,9 @@ AMediaFormat *ItemTable::getImageMeta(const uint32_t imageIndex) { default: break; // don't set if invalid } } // we validated no overflow in IspeBox::parse() AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 1.5); AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 3 / 2); if (!image->thumbnails.empty()) { ssize_t thumbItemIndex = mItemIdToItemMap.indexOfKey(image->thumbnails[0]); Loading Loading @@ -1561,8 +1569,9 @@ AMediaFormat *ItemTable::getImageMeta(const uint32_t imageIndex) { AMEDIAFORMAT_KEY_TILE_WIDTH, image->width); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_TILE_HEIGHT, image->height); // we validated no overflow in IspeBox::parse() AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 1.5); AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 3 / 2); } if (image->hvcc == NULL) { Loading
media/libaudioclient/AudioSystem.cpp +29 −0 Original line number Diff line number Diff line Loading @@ -1532,6 +1532,35 @@ bool AudioSystem::isCallScreenModeSupported() return aps->isCallScreenModeSupported(); } status_t AudioSystem::setPreferredDeviceForStrategy(product_strategy_t strategy, const AudioDeviceTypeAddr &device) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) { return PERMISSION_DENIED; } return aps->setPreferredDeviceForStrategy(strategy, device); } status_t AudioSystem::removePreferredDeviceForStrategy(product_strategy_t strategy) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) { return PERMISSION_DENIED; } return aps->removePreferredDeviceForStrategy(strategy); } status_t AudioSystem::getPreferredDeviceForStrategy(product_strategy_t strategy, AudioDeviceTypeAddr &device) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) { return PERMISSION_DENIED; } return aps->getPreferredDeviceForStrategy(strategy, device); } // --------------------------------------------------------------------------- int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback( Loading
media/libaudioclient/IAudioPolicyService.cpp +91 −2 Original line number Diff line number Diff line Loading @@ -105,7 +105,10 @@ enum { SET_ALLOWED_CAPTURE_POLICY, MOVE_EFFECTS_TO_IO, SET_RTT_ENABLED, IS_CALL_SCREEN_MODE_SUPPORTED IS_CALL_SCREEN_MODE_SUPPORTED, SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, }; #define MAX_ITEMS_PER_LIST 1024 Loading Loading @@ -1296,6 +1299,55 @@ public: } return reply.readBool(); } virtual status_t setPreferredDeviceForStrategy(product_strategy_t strategy, const AudioDeviceTypeAddr &device) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeUint32(static_cast<uint32_t>(strategy)); status_t status = device.writeToParcel(&data); if (status != NO_ERROR) { return BAD_VALUE; } status = remote()->transact(SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, data, &reply); if (status != NO_ERROR) { return status; } return static_cast<status_t>(reply.readInt32()); } virtual status_t removePreferredDeviceForStrategy(product_strategy_t strategy) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeUint32(static_cast<uint32_t>(strategy)); status_t status = remote()->transact(REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, data, &reply); if (status != NO_ERROR) { return status; } return static_cast<status_t>(reply.readInt32()); } virtual status_t getPreferredDeviceForStrategy(product_strategy_t strategy, AudioDeviceTypeAddr &device) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeUint32(static_cast<uint32_t>(strategy)); status_t status = remote()->transact(GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, data, &reply); if (status != NO_ERROR) { return status; } status = device.readFromParcel(&reply); if (status != NO_ERROR) { return status; } return static_cast<status_t>(reply.readInt32()); } }; IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); Loading Loading @@ -1359,7 +1411,10 @@ status_t BnAudioPolicyService::onTransact( case LIST_AUDIO_VOLUME_GROUPS: case GET_VOLUME_GROUP_FOR_ATTRIBUTES: case SET_RTT_ENABLED: case IS_CALL_SCREEN_MODE_SUPPORTED: { case IS_CALL_SCREEN_MODE_SUPPORTED: case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", __func__, code, IPCThreadState::self()->getCallingPid(), Loading Loading @@ -2388,6 +2443,40 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); product_strategy_t strategy = (product_strategy_t) data.readUint32(); AudioDeviceTypeAddr device; status_t status = device.readFromParcel((Parcel*)&data); if (status != NO_ERROR) { return status; } status = setPreferredDeviceForStrategy(strategy, device); reply->writeInt32(status); return NO_ERROR; } case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); product_strategy_t strategy = (product_strategy_t) data.readUint32(); status_t status = removePreferredDeviceForStrategy(strategy); reply->writeInt32(status); return NO_ERROR; } case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); product_strategy_t strategy = (product_strategy_t) data.readUint32(); AudioDeviceTypeAddr device; status_t status = getPreferredDeviceForStrategy(strategy, device); status_t marshall_status = device.writeToParcel(reply); if (marshall_status != NO_ERROR) { return marshall_status; } reply->writeInt32(status); return NO_ERROR; } default: return BBinder::onTransact(code, data, reply, flags); } Loading
media/libaudioclient/include/media/AudioSystem.h +11 −0 Original line number Diff line number Diff line Loading @@ -405,6 +405,17 @@ public: */ static status_t setAudioHalPids(const std::vector<pid_t>& pids); static status_t setPreferredDeviceForStrategy(product_strategy_t strategy, const AudioDeviceTypeAddr &device); static status_t removePreferredDeviceForStrategy(product_strategy_t strategy); static status_t getPreferredDeviceForStrategy(product_strategy_t strategy, AudioDeviceTypeAddr &device); static status_t getDeviceForStrategy(product_strategy_t strategy, AudioDeviceTypeAddr &device); // ---------------------------------------------------------------------------- class AudioVolumeGroupCallback : public RefBase Loading