diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-03-04 22:21:31 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-03-04 22:21:31 +0000 |
commit | e0d9211119c2275914de64ef9232ef8951a65d8f (patch) | |
tree | 40c6cab59a9367e491922de46a2aea74f44ddbcf | |
parent | f93bcee838bd2b41fb3d78a005f62d1bbe900bc1 (diff) | |
parent | c21a61ba5908182deac96e7b4aafeb087f2841df (diff) | |
download | av-simpleperf-release.tar.gz |
Merge "Snap for 11526323 from 3a89c66e066a04e9d4d46189c5bea8091e0f4f76 to simpleperf-release" into simpleperf-releasesimpleperf-release
27 files changed, 329 insertions, 167 deletions
diff --git a/media/Android.mk b/media/Android.mk deleted file mode 100644 index 220a35888b..0000000000 --- a/media/Android.mk +++ /dev/null @@ -1,5 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -$(eval $(call declare-1p-copy-files,frameworks/av/media/libeffects,audio_effects.conf)) -$(eval $(call declare-1p-copy-files,frameworks/av/media/libeffects,audio_effects.xml)) -$(eval $(call declare-1p-copy-files,frameworks/av/media/libstagefright,)) diff --git a/media/aconfig/Android.bp b/media/aconfig/Android.bp index e0d1fa9436..16beb285c1 100644 --- a/media/aconfig/Android.bp +++ b/media/aconfig/Android.bp @@ -43,6 +43,7 @@ cc_aconfig_library { name: "android.media.codec-aconfig-cc", min_sdk_version: "30", vendor_available: true, + double_loadable: true, apex_available: [ "//apex_available:platform", "com.android.media.swcodec", diff --git a/media/audio/aconfig/Android.bp b/media/audio/aconfig/Android.bp new file mode 100644 index 0000000000..82f3d85d24 --- /dev/null +++ b/media/audio/aconfig/Android.bp @@ -0,0 +1,37 @@ +// media_audio namespace flags + +cc_defaults { + name: "audio-aconfig-cc-defaults", + host_supported: true, +} + +// Framework available flags to follow +// Care must be taken to avoid namespace conflicts. +// These flags are accessible outside of the platform! Limit usage to @FlaggedApi wherever possible + +aconfig_declarations { + name: "android.media.audio-aconfig", + package: "android.media.audio", + container: "system", + srcs: ["audio_framework.aconfig"], + visibility: ["//frameworks/base/api"], +} + +java_aconfig_library { + name: "android.media.audio-aconfig-java", + aconfig_declarations: "android.media.audio-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +cc_aconfig_library { + name: "android.media.audio-aconfig-cc", + aconfig_declarations: "android.media.audio-aconfig", + defaults: ["audio-aconfig-cc-defaults"], +} + +aconfig_declarations_group { + name: "audio-framework-aconfig", + java_aconfig_libraries: [ + "android.media.audio-aconfig-java", + ], +} diff --git a/media/audio/aconfig/audio_framework.aconfig b/media/audio/aconfig/audio_framework.aconfig new file mode 100644 index 0000000000..2cafe58a72 --- /dev/null +++ b/media/audio/aconfig/audio_framework.aconfig @@ -0,0 +1,15 @@ +# Top level framework (android.media) flags +# Only add flags here which must be included in framework.jar +# +# Please add flags in alphabetical order. + +package: "android.media.audio" + +flag { + name: "sco_managed_by_audio" + namespace: "media_audio" + description: "\ +Enable new implementation of headset profile device connection and\ +SCO audio activation." + bug: "265057196" +} diff --git a/media/codec2/hal/aidl/Component.cpp b/media/codec2/hal/aidl/Component.cpp index ba5f8d4191..eb64a4a526 100644 --- a/media/codec2/hal/aidl/Component.cpp +++ b/media/codec2/hal/aidl/Component.cpp @@ -205,30 +205,7 @@ Component::Component( mDeathContext(nullptr) { // Retrieve supported parameters from store // TODO: We could cache this per component/interface type - if (MultiAccessUnitHelper::isEnabledOnPlatform()) { - c2_status_t err = C2_OK; - C2ComponentDomainSetting domain; - std::vector<std::unique_ptr<C2Param>> heapParams; - err = component->intf()->query_vb({&domain}, {}, C2_MAY_BLOCK, &heapParams); - if (err == C2_OK && (domain.value == C2Component::DOMAIN_AUDIO)) { - std::vector<std::shared_ptr<C2ParamDescriptor>> params; - bool isComponentSupportsLargeAudioFrame = false; - component->intf()->querySupportedParams_nb(¶ms); - for (const auto ¶mDesc : params) { - if (paramDesc->name().compare(C2_PARAMKEY_OUTPUT_LARGE_FRAME) == 0) { - isComponentSupportsLargeAudioFrame = true; - LOG(VERBOSE) << "Underlying component supports large frame audio"; - break; - } - } - if (!isComponentSupportsLargeAudioFrame) { - mMultiAccessUnitIntf = std::make_shared<MultiAccessUnitInterface>( - component->intf(), - std::static_pointer_cast<C2ReflectorHelper>( - ::android::GetCodec2PlatformComponentStore()->getParamReflector())); - } - } - } + mMultiAccessUnitIntf = store->tryCreateMultiAccessUnitInterface(component->intf()); mInterface = SharedRefBase::make<ComponentInterface>( component->intf(), mMultiAccessUnitIntf, store->getParameterCache()); mInit = mInterface->status(); diff --git a/media/codec2/hal/aidl/ComponentInterface.cpp b/media/codec2/hal/aidl/ComponentInterface.cpp index 1f0534dfcd..8ae9fa8959 100644 --- a/media/codec2/hal/aidl/ComponentInterface.cpp +++ b/media/codec2/hal/aidl/ComponentInterface.cpp @@ -131,9 +131,35 @@ struct CompIntf : public ConfigurableC2Intf { virtual c2_status_t querySupportedValues( std::vector<C2FieldSupportedValuesQuery>& fields, c2_blocking_t mayBlock) const override { - c2_status_t err = mIntf->querySupportedValues_vb(fields, mayBlock); - if (mMultiAccessUnitIntf != nullptr) { - err = mMultiAccessUnitIntf->querySupportedValues(fields, mayBlock); + if (mMultiAccessUnitIntf == nullptr) { + return mIntf->querySupportedValues_vb(fields, mayBlock); + } + std::vector<C2FieldSupportedValuesQuery> dup = fields; + std::vector<C2FieldSupportedValuesQuery> queryArray[2]; + std::map<C2ParamField, std::pair<uint32_t, size_t>> queryMap; + c2_status_t err = C2_OK; + for (int i = 0 ; i < fields.size(); i++) { + const C2ParamField &field = fields[i].field(); + uint32_t queryArrayIdx = 1; + if (mMultiAccessUnitIntf->isValidField(fields[i].field())) { + queryArrayIdx = 0; + } + queryMap[field] = std::make_pair( + queryArrayIdx, queryArray[queryArrayIdx].size()); + queryArray[queryArrayIdx].push_back(fields[i]); + } + if (queryArray[0].size() > 0) { + err = mMultiAccessUnitIntf->querySupportedValues(queryArray[0], mayBlock); + } + if (queryArray[1].size() > 0) { + err = mIntf->querySupportedValues_vb(queryArray[1], mayBlock); + } + for (int i = 0 ; i < dup.size(); i++) { + auto it = queryMap.find(dup[i].field()); + if (it != queryMap.end()) { + std::pair<uint32_t, size_t> queryid = it->second; + fields[i] = queryArray[queryid.first][queryid.second]; + } } return err; } diff --git a/media/codec2/hal/aidl/ComponentStore.cpp b/media/codec2/hal/aidl/ComponentStore.cpp index ef4930842c..b95c09efd6 100644 --- a/media/codec2/hal/aidl/ComponentStore.cpp +++ b/media/codec2/hal/aidl/ComponentStore.cpp @@ -199,6 +199,36 @@ std::shared_ptr<FilterWrapper> ComponentStore::GetFilterWrapper() { } #endif +std::shared_ptr<MultiAccessUnitInterface> ComponentStore::tryCreateMultiAccessUnitInterface( + const std::shared_ptr<C2ComponentInterface> &c2interface) { + std::shared_ptr<MultiAccessUnitInterface> multiAccessUnitIntf = nullptr; + if (c2interface == nullptr) { + return nullptr; + } + if (MultiAccessUnitHelper::isEnabledOnPlatform()) { + c2_status_t err = C2_OK; + C2ComponentDomainSetting domain; + std::vector<std::unique_ptr<C2Param>> heapParams; + err = c2interface->query_vb({&domain}, {}, C2_MAY_BLOCK, &heapParams); + if (err == C2_OK && (domain.value == C2Component::DOMAIN_AUDIO)) { + std::vector<std::shared_ptr<C2ParamDescriptor>> params; + bool isComponentSupportsLargeAudioFrame = false; + c2interface->querySupportedParams_nb(¶ms); + for (const auto ¶mDesc : params) { + if (paramDesc->name().compare(C2_PARAMKEY_OUTPUT_LARGE_FRAME) == 0) { + isComponentSupportsLargeAudioFrame = true; + break; + } + } + if (!isComponentSupportsLargeAudioFrame) { + multiAccessUnitIntf = std::make_shared<MultiAccessUnitInterface>( + c2interface, std::static_pointer_cast<C2ReflectorHelper>(mParamReflector)); + } + } + } + return multiAccessUnitIntf; +} + // Methods from ::aidl::android::hardware::media::c2::IComponentStore ScopedAStatus ComponentStore::createComponent( const std::string& name, @@ -258,7 +288,10 @@ ScopedAStatus ComponentStore::createInterface( c2interface = GetFilterWrapper()->maybeWrapInterface(c2interface); #endif onInterfaceLoaded(c2interface); - *intf = SharedRefBase::make<ComponentInterface>(c2interface, mParameterCache); + std::shared_ptr<MultiAccessUnitInterface> multiAccessUnitIntf = + tryCreateMultiAccessUnitInterface(c2interface); + *intf = SharedRefBase::make<ComponentInterface>( + c2interface, multiAccessUnitIntf, mParameterCache); return ScopedAStatus::ok(); } return ScopedAStatus::fromServiceSpecificError(res); diff --git a/media/codec2/hal/aidl/include/codec2/aidl/ComponentStore.h b/media/codec2/hal/aidl/include/codec2/aidl/ComponentStore.h index 0698b0f85c..746e1bfc5c 100644 --- a/media/codec2/hal/aidl/include/codec2/aidl/ComponentStore.h +++ b/media/codec2/hal/aidl/include/codec2/aidl/ComponentStore.h @@ -75,6 +75,9 @@ struct ComponentStore : public BnComponentStore { static std::shared_ptr<::android::FilterWrapper> GetFilterWrapper(); + std::shared_ptr<MultiAccessUnitInterface> tryCreateMultiAccessUnitInterface( + const std::shared_ptr<C2ComponentInterface> &c2interface); + // Methods from ::aidl::android::hardware::media::c2::IComponentStore. virtual ::ndk::ScopedAStatus createComponent( const std::string& name, diff --git a/media/codec2/hal/common/MultiAccessUnitHelper.cpp b/media/codec2/hal/common/MultiAccessUnitHelper.cpp index 9221a24cbd..03a76e901f 100644 --- a/media/codec2/hal/common/MultiAccessUnitHelper.cpp +++ b/media/codec2/hal/common/MultiAccessUnitHelper.cpp @@ -73,12 +73,17 @@ MultiAccessUnitInterface::MultiAccessUnitInterface( for (std::shared_ptr<C2ParamDescriptor> &desc : supportedParams) { mSupportedParamIndexSet.insert(desc->index()); } + mParamFields.emplace_back(mLargeFrameParams.get(), &(mLargeFrameParams.get()->maxSize)); + mParamFields.emplace_back(mLargeFrameParams.get(), &(mLargeFrameParams.get()->thresholdSize)); if (mC2ComponentIntf) { c2_status_t err = mC2ComponentIntf->query_vb({&mKind}, {}, C2_MAY_BLOCK, nullptr); } } +bool MultiAccessUnitInterface::isValidField(const C2ParamField &field) const { + return (std::find(mParamFields.begin(), mParamFields.end(), field) != mParamFields.end()); +} bool MultiAccessUnitInterface::isParamSupported(C2Param::Index index) { return (mSupportedParamIndexSet.count(index) != 0); } @@ -91,18 +96,23 @@ C2Component::kind_t MultiAccessUnitInterface::kind() const { return (C2Component::kind_t)(mKind.value); } -void MultiAccessUnitInterface::getDecoderSampleRateAndChannelCount( - uint32_t &sampleRate_, uint32_t &channelCount_) const { +bool MultiAccessUnitInterface::getDecoderSampleRateAndChannelCount( + uint32_t * const sampleRate_, uint32_t * const channelCount_) const { + if (sampleRate_ == nullptr || sampleRate_ == nullptr) { + return false; + } if (mC2ComponentIntf) { C2StreamSampleRateInfo::output sampleRate; C2StreamChannelCountInfo::output channelCount; c2_status_t res = mC2ComponentIntf->query_vb( {&sampleRate, &channelCount}, {}, C2_MAY_BLOCK, nullptr); - if (res == C2_OK) { - sampleRate_ = sampleRate.value; - channelCount_ = channelCount.value; + if (res == C2_OK && sampleRate.value > 0 && channelCount.value > 0) { + *sampleRate_ = sampleRate.value; + *channelCount_ = channelCount.value; + return true; } } + return false; } //C2MultiAccessUnitBuffer @@ -315,26 +325,10 @@ c2_status_t MultiAccessUnitHelper::scatter( } } if (!processedWork->empty()) { - { - C2LargeFrame::output multiAccessParams = mInterface->getLargeFrameParam(); - if (mInterface->kind() == C2Component::KIND_DECODER) { - uint32_t sampleRate = 0; - uint32_t channelCount = 0; - uint32_t frameSize = 0; - mInterface->getDecoderSampleRateAndChannelCount( - sampleRate, channelCount); - if (sampleRate > 0 && channelCount > 0) { - frameSize = channelCount * 2; - multiAccessParams.maxSize = - (multiAccessParams.maxSize / frameSize) * frameSize; - multiAccessParams.thresholdSize = - (multiAccessParams.thresholdSize / frameSize) * frameSize; - } - } - frameInfo.mLargeFrameTuning = multiAccessParams; - std::lock_guard<std::mutex> l(mLock); - mFrameHolder.push_back(std::move(frameInfo)); - } + C2LargeFrame::output multiAccessParams = mInterface->getLargeFrameParam(); + frameInfo.mLargeFrameTuning = multiAccessParams; + std::lock_guard<std::mutex> l(mLock); + mFrameHolder.push_back(std::move(frameInfo)); } } return C2_OK; @@ -501,6 +495,20 @@ c2_status_t MultiAccessUnitHelper::processWorklets(MultiAccessUnitInfo &frame, frame.reset(); return C2_OK; } + int64_t sampleTimeUs = 0; + uint32_t frameSize = 0; + uint32_t sampleRate = 0; + uint32_t channelCount = 0; + if (mInterface->getDecoderSampleRateAndChannelCount(&sampleRate, &channelCount)) { + sampleTimeUs = (1000000u) / (sampleRate * channelCount * 2); + frameSize = channelCount * 2; + if (mInterface->kind() == C2Component::KIND_DECODER) { + frame.mLargeFrameTuning.maxSize = + (frame.mLargeFrameTuning.maxSize / frameSize) * frameSize; + frame.mLargeFrameTuning.thresholdSize = + (frame.mLargeFrameTuning.thresholdSize / frameSize) * frameSize; + } + } c2_status_t c2ret = allocateWork(frame, true); if (c2ret != C2_OK) { return c2ret; @@ -515,15 +523,7 @@ c2_status_t MultiAccessUnitHelper::processWorklets(MultiAccessUnitInfo &frame, outputFramedata.infoBuffers.insert(outputFramedata.infoBuffers.begin(), (*worklet)->output.infoBuffers.begin(), (*worklet)->output.infoBuffers.end()); - int64_t sampleTimeUs = 0; - uint32_t frameSize = 0; - uint32_t sampleRate = 0; - uint32_t channelCount = 0; - mInterface->getDecoderSampleRateAndChannelCount(sampleRate, channelCount); - if (sampleRate > 0 && channelCount > 0) { - sampleTimeUs = (1000000u) / (sampleRate * channelCount * 2); - frameSize = channelCount * 2; - } + LOG(DEBUG) << "maxOutSize " << frame.mLargeFrameTuning.maxSize << " threshold " << frame.mLargeFrameTuning.thresholdSize; if ((*worklet)->output.buffers.size() > 0) { diff --git a/media/codec2/hal/common/include/codec2/common/MultiAccessUnitHelper.h b/media/codec2/hal/common/include/codec2/common/MultiAccessUnitHelper.h index ef5cff99e6..a6d938eea2 100644 --- a/media/codec2/hal/common/include/codec2/common/MultiAccessUnitHelper.h +++ b/media/codec2/hal/common/include/codec2/common/MultiAccessUnitHelper.h @@ -41,14 +41,16 @@ struct MultiAccessUnitInterface : public C2InterfaceHelper { bool isParamSupported(C2Param::Index index); C2LargeFrame::output getLargeFrameParam() const; C2Component::kind_t kind() const; + bool isValidField(const C2ParamField &field) const; protected: - void getDecoderSampleRateAndChannelCount( - uint32_t &sampleRate_, uint32_t &channelCount_) const; + bool getDecoderSampleRateAndChannelCount( + uint32_t * const sampleRate_, uint32_t * const channelCount_) const; const std::shared_ptr<C2ComponentInterface> mC2ComponentIntf; std::shared_ptr<C2LargeFrame::output> mLargeFrameParams; C2ComponentKindSetting mKind; std::set<C2Param::Index> mSupportedParamIndexSet; + std::vector<C2ParamField> mParamFields; friend struct MultiAccessUnitHelper; }; diff --git a/media/codec2/hal/hidl/1.0/utils/Component.cpp b/media/codec2/hal/hidl/1.0/utils/Component.cpp index ebbaafce4c..e32e6ae5d2 100644 --- a/media/codec2/hal/hidl/1.0/utils/Component.cpp +++ b/media/codec2/hal/hidl/1.0/utils/Component.cpp @@ -259,30 +259,7 @@ Component::Component( mBufferPoolSender{clientPoolManager} { // Retrieve supported parameters from store // TODO: We could cache this per component/interface type - if (MultiAccessUnitHelper::isEnabledOnPlatform()) { - c2_status_t err = C2_OK; - C2ComponentDomainSetting domain; - std::vector<std::unique_ptr<C2Param>> heapParams; - err = component->intf()->query_vb({&domain}, {}, C2_MAY_BLOCK, &heapParams); - if (err == C2_OK && (domain.value == C2Component::DOMAIN_AUDIO)) { - std::vector<std::shared_ptr<C2ParamDescriptor>> params; - bool isComponentSupportsLargeAudioFrame = false; - component->intf()->querySupportedParams_nb(¶ms); - for (const auto ¶mDesc : params) { - if (paramDesc->name().compare(C2_PARAMKEY_OUTPUT_LARGE_FRAME) == 0) { - isComponentSupportsLargeAudioFrame = true; - LOG(VERBOSE) << "Underlying component supports large frame audio"; - break; - } - } - if (!isComponentSupportsLargeAudioFrame) { - mMultiAccessUnitIntf = std::make_shared<MultiAccessUnitInterface>( - component->intf(), - std::static_pointer_cast<C2ReflectorHelper>( - GetCodec2PlatformComponentStore()->getParamReflector())); - } - } - } + mMultiAccessUnitIntf = store->tryCreateMultiAccessUnitInterface(component->intf()); mInterface = new ComponentInterface( component->intf(), mMultiAccessUnitIntf, store->getParameterCache()); mInit = mInterface->status(); diff --git a/media/codec2/hal/hidl/1.0/utils/ComponentInterface.cpp b/media/codec2/hal/hidl/1.0/utils/ComponentInterface.cpp index 5a5e7805d8..41a8904070 100644 --- a/media/codec2/hal/hidl/1.0/utils/ComponentInterface.cpp +++ b/media/codec2/hal/hidl/1.0/utils/ComponentInterface.cpp @@ -130,9 +130,35 @@ struct CompIntf : public ConfigurableC2Intf { virtual c2_status_t querySupportedValues( std::vector<C2FieldSupportedValuesQuery>& fields, c2_blocking_t mayBlock) const override { - c2_status_t err = mIntf->querySupportedValues_vb(fields, mayBlock); - if (mMultiAccessUnitIntf != nullptr) { - err = mMultiAccessUnitIntf->querySupportedValues(fields, mayBlock); + if (mMultiAccessUnitIntf == nullptr) { + return mIntf->querySupportedValues_vb(fields, mayBlock); + } + std::vector<C2FieldSupportedValuesQuery> dup = fields; + std::vector<C2FieldSupportedValuesQuery> queryArray[2]; + std::map<C2ParamField, std::pair<uint32_t, size_t>> queryMap; + c2_status_t err = C2_OK; + for (int i = 0 ; i < fields.size(); i++) { + const C2ParamField &field = fields[i].field(); + uint32_t queryArrayIdx = 1; + if (mMultiAccessUnitIntf->isValidField(field)) { + queryArrayIdx = 0; + } + queryMap[field] = std::make_pair( + queryArrayIdx, queryArray[queryArrayIdx].size()); + queryArray[queryArrayIdx].push_back(fields[i]); + } + if (queryArray[0].size() > 0) { + err = mMultiAccessUnitIntf->querySupportedValues(queryArray[0], mayBlock); + } + if (queryArray[1].size() > 0) { + err = mIntf->querySupportedValues_vb(queryArray[1], mayBlock); + } + for (int i = 0 ; i < dup.size(); i++) { + auto it = queryMap.find(dup[i].field()); + if (it != queryMap.end()) { + std::pair<uint32_t, size_t> queryid = it->second; + fields[i] = queryArray[queryid.first][queryid.second]; + } } return err; } diff --git a/media/codec2/hal/hidl/1.0/utils/ComponentStore.cpp b/media/codec2/hal/hidl/1.0/utils/ComponentStore.cpp index 1c0d5b0b98..988ab6f9eb 100644 --- a/media/codec2/hal/hidl/1.0/utils/ComponentStore.cpp +++ b/media/codec2/hal/hidl/1.0/utils/ComponentStore.cpp @@ -194,6 +194,36 @@ std::shared_ptr<FilterWrapper> ComponentStore::GetFilterWrapper() { } #endif +std::shared_ptr<MultiAccessUnitInterface> ComponentStore::tryCreateMultiAccessUnitInterface( + const std::shared_ptr<C2ComponentInterface> &c2interface) { + std::shared_ptr<MultiAccessUnitInterface> multiAccessUnitIntf = nullptr; + if (c2interface == nullptr) { + return nullptr; + } + if (MultiAccessUnitHelper::isEnabledOnPlatform()) { + c2_status_t err = C2_OK; + C2ComponentDomainSetting domain; + std::vector<std::unique_ptr<C2Param>> heapParams; + err = c2interface->query_vb({&domain}, {}, C2_MAY_BLOCK, &heapParams); + if (err == C2_OK && (domain.value == C2Component::DOMAIN_AUDIO)) { + std::vector<std::shared_ptr<C2ParamDescriptor>> params; + bool isComponentSupportsLargeAudioFrame = false; + c2interface->querySupportedParams_nb(¶ms); + for (const auto ¶mDesc : params) { + if (paramDesc->name().compare(C2_PARAMKEY_OUTPUT_LARGE_FRAME) == 0) { + isComponentSupportsLargeAudioFrame = true; + break; + } + } + if (!isComponentSupportsLargeAudioFrame) { + multiAccessUnitIntf = std::make_shared<MultiAccessUnitInterface>( + c2interface, std::static_pointer_cast<C2ReflectorHelper>(mParamReflector)); + } + } + } + return multiAccessUnitIntf; +} + // Methods from ::android::hardware::media::c2::V1_0::IComponentStore Return<void> ComponentStore::createComponent( const hidl_string& name, @@ -242,7 +272,9 @@ Return<void> ComponentStore::createInterface( c2interface = GetFilterWrapper()->maybeWrapInterface(c2interface); #endif onInterfaceLoaded(c2interface); - interface = new ComponentInterface(c2interface, mParameterCache); + std::shared_ptr<MultiAccessUnitInterface> multiAccessUnitIntf = + tryCreateMultiAccessUnitInterface(c2interface); + interface = new ComponentInterface(c2interface, multiAccessUnitIntf, mParameterCache); } _hidl_cb(static_cast<Status>(res), interface); return Void(); diff --git a/media/codec2/hal/hidl/1.0/utils/include/codec2/hidl/1.0/ComponentStore.h b/media/codec2/hal/hidl/1.0/utils/include/codec2/hidl/1.0/ComponentStore.h index 27e2a05f3a..b5d85da239 100644 --- a/media/codec2/hal/hidl/1.0/utils/include/codec2/hidl/1.0/ComponentStore.h +++ b/media/codec2/hal/hidl/1.0/utils/include/codec2/hidl/1.0/ComponentStore.h @@ -78,6 +78,9 @@ struct ComponentStore : public IComponentStore { static std::shared_ptr<FilterWrapper> GetFilterWrapper(); + std::shared_ptr<MultiAccessUnitInterface> tryCreateMultiAccessUnitInterface( + const std::shared_ptr<C2ComponentInterface> &c2interface); + // Methods from ::android::hardware::media::c2::V1_0::IComponentStore. virtual Return<void> createComponent( const hidl_string& name, diff --git a/media/codec2/hal/hidl/1.1/utils/Component.cpp b/media/codec2/hal/hidl/1.1/utils/Component.cpp index 5073983982..09e5709012 100644 --- a/media/codec2/hal/hidl/1.1/utils/Component.cpp +++ b/media/codec2/hal/hidl/1.1/utils/Component.cpp @@ -263,30 +263,7 @@ Component::Component( mBufferPoolSender{clientPoolManager} { // Retrieve supported parameters from store // TODO: We could cache this per component/interface type - if (MultiAccessUnitHelper::isEnabledOnPlatform()) { - c2_status_t err = C2_OK; - C2ComponentDomainSetting domain; - std::vector<std::unique_ptr<C2Param>> heapParams; - err = component->intf()->query_vb({&domain}, {}, C2_MAY_BLOCK, &heapParams); - if (err == C2_OK && (domain.value == C2Component::DOMAIN_AUDIO)) { - std::vector<std::shared_ptr<C2ParamDescriptor>> params; - bool isComponentSupportsLargeAudioFrame = false; - component->intf()->querySupportedParams_nb(¶ms); - for (const auto ¶mDesc : params) { - if (paramDesc->name().compare(C2_PARAMKEY_OUTPUT_LARGE_FRAME) == 0) { - isComponentSupportsLargeAudioFrame = true; - LOG(VERBOSE) << "Underlying component supports large frame audio"; - break; - } - } - if (!isComponentSupportsLargeAudioFrame) { - mMultiAccessUnitIntf = std::make_shared<MultiAccessUnitInterface>( - component->intf(), - std::static_pointer_cast<C2ReflectorHelper>( - GetCodec2PlatformComponentStore()->getParamReflector())); - } - } - } + mMultiAccessUnitIntf = store->tryCreateMultiAccessUnitInterface(component->intf()); mInterface = new ComponentInterface( component->intf(), mMultiAccessUnitIntf, store->getParameterCache()); mInit = mInterface->status(); diff --git a/media/codec2/hal/hidl/1.1/utils/ComponentStore.cpp b/media/codec2/hal/hidl/1.1/utils/ComponentStore.cpp index d47abdd040..46af809831 100644 --- a/media/codec2/hal/hidl/1.1/utils/ComponentStore.cpp +++ b/media/codec2/hal/hidl/1.1/utils/ComponentStore.cpp @@ -194,6 +194,37 @@ std::shared_ptr<FilterWrapper> ComponentStore::GetFilterWrapper() { } #endif +std::shared_ptr<MultiAccessUnitInterface> ComponentStore::tryCreateMultiAccessUnitInterface( + const std::shared_ptr<C2ComponentInterface> &c2interface) { + std::shared_ptr<MultiAccessUnitInterface> multiAccessUnitIntf = nullptr; + if (c2interface == nullptr) { + return nullptr; + } + if (MultiAccessUnitHelper::isEnabledOnPlatform()) { + c2_status_t err = C2_OK; + C2ComponentDomainSetting domain; + std::vector<std::unique_ptr<C2Param>> heapParams; + err = c2interface->query_vb({&domain}, {}, C2_MAY_BLOCK, &heapParams); + if (err == C2_OK && (domain.value == C2Component::DOMAIN_AUDIO)) { + std::vector<std::shared_ptr<C2ParamDescriptor>> params; + bool isComponentSupportsLargeAudioFrame = false; + c2interface->querySupportedParams_nb(¶ms); + for (const auto ¶mDesc : params) { + if (paramDesc->name().compare(C2_PARAMKEY_OUTPUT_LARGE_FRAME) == 0) { + isComponentSupportsLargeAudioFrame = true; + break; + } + } + + if (!isComponentSupportsLargeAudioFrame) { + multiAccessUnitIntf = std::make_shared<MultiAccessUnitInterface>( + c2interface, std::static_pointer_cast<C2ReflectorHelper>(mParamReflector)); + } + } + } + return multiAccessUnitIntf; +} + // Methods from ::android::hardware::media::c2::V1_0::IComponentStore Return<void> ComponentStore::createComponent( const hidl_string& name, @@ -241,7 +272,10 @@ Return<void> ComponentStore::createInterface( c2interface = GetFilterWrapper()->maybeWrapInterface(c2interface); #endif onInterfaceLoaded(c2interface); - interface = new ComponentInterface(c2interface, mParameterCache); + std::shared_ptr<MultiAccessUnitInterface> multiAccessUnitIntf = + tryCreateMultiAccessUnitInterface(c2interface); + interface = new ComponentInterface( + c2interface, multiAccessUnitIntf, mParameterCache); } _hidl_cb(static_cast<Status>(res), interface); return Void(); diff --git a/media/codec2/hal/hidl/1.1/utils/include/codec2/hidl/1.1/ComponentStore.h b/media/codec2/hal/hidl/1.1/utils/include/codec2/hidl/1.1/ComponentStore.h index f6daee74b5..85862a9f61 100644 --- a/media/codec2/hal/hidl/1.1/utils/include/codec2/hidl/1.1/ComponentStore.h +++ b/media/codec2/hal/hidl/1.1/utils/include/codec2/hidl/1.1/ComponentStore.h @@ -79,6 +79,9 @@ struct ComponentStore : public IComponentStore { static std::shared_ptr<FilterWrapper> GetFilterWrapper(); + std::shared_ptr<MultiAccessUnitInterface> tryCreateMultiAccessUnitInterface( + const std::shared_ptr<C2ComponentInterface> &c2interface); + // Methods from ::android::hardware::media::c2::V1_0::IComponentStore. virtual Return<void> createComponent( const hidl_string& name, diff --git a/media/codec2/hal/hidl/1.2/utils/Component.cpp b/media/codec2/hal/hidl/1.2/utils/Component.cpp index bbdbef5832..0fe16e3fc8 100644 --- a/media/codec2/hal/hidl/1.2/utils/Component.cpp +++ b/media/codec2/hal/hidl/1.2/utils/Component.cpp @@ -261,30 +261,7 @@ Component::Component( mBufferPoolSender{clientPoolManager} { // Retrieve supported parameters from store // TODO: We could cache this per component/interface type - if (MultiAccessUnitHelper::isEnabledOnPlatform()) { - c2_status_t err = C2_OK; - C2ComponentDomainSetting domain; - std::vector<std::unique_ptr<C2Param>> heapParams; - err = component->intf()->query_vb({&domain}, {}, C2_MAY_BLOCK, &heapParams); - if (err == C2_OK && (domain.value == C2Component::DOMAIN_AUDIO)) { - std::vector<std::shared_ptr<C2ParamDescriptor>> params; - bool isComponentSupportsLargeAudioFrame = false; - component->intf()->querySupportedParams_nb(¶ms); - for (const auto ¶mDesc : params) { - if (paramDesc->name().compare(C2_PARAMKEY_OUTPUT_LARGE_FRAME) == 0) { - isComponentSupportsLargeAudioFrame = true; - LOG(VERBOSE) << "Underlying component supports large frame audio"; - break; - } - } - if (!isComponentSupportsLargeAudioFrame) { - mMultiAccessUnitIntf = std::make_shared<MultiAccessUnitInterface>( - component->intf(), - std::static_pointer_cast<C2ReflectorHelper>( - GetCodec2PlatformComponentStore()->getParamReflector())); - } - } - } + mMultiAccessUnitIntf = store->tryCreateMultiAccessUnitInterface(component->intf()); mInterface = new ComponentInterface( component->intf(), mMultiAccessUnitIntf, store->getParameterCache()); mInit = mInterface->status(); diff --git a/media/codec2/hal/hidl/1.2/utils/ComponentStore.cpp b/media/codec2/hal/hidl/1.2/utils/ComponentStore.cpp index 9fac5d5268..f89c83586f 100644 --- a/media/codec2/hal/hidl/1.2/utils/ComponentStore.cpp +++ b/media/codec2/hal/hidl/1.2/utils/ComponentStore.cpp @@ -194,6 +194,36 @@ std::shared_ptr<FilterWrapper> ComponentStore::GetFilterWrapper() { } #endif +std::shared_ptr<MultiAccessUnitInterface> ComponentStore::tryCreateMultiAccessUnitInterface( + const std::shared_ptr<C2ComponentInterface> &c2interface) { + std::shared_ptr<MultiAccessUnitInterface> multiAccessUnitIntf = nullptr; + if (c2interface == nullptr) { + return nullptr; + } + if (MultiAccessUnitHelper::isEnabledOnPlatform()) { + c2_status_t err = C2_OK; + C2ComponentDomainSetting domain; + std::vector<std::unique_ptr<C2Param>> heapParams; + err = c2interface->query_vb({&domain}, {}, C2_MAY_BLOCK, &heapParams); + if (err == C2_OK && (domain.value == C2Component::DOMAIN_AUDIO)) { + std::vector<std::shared_ptr<C2ParamDescriptor>> params; + bool isComponentSupportsLargeAudioFrame = false; + c2interface->querySupportedParams_nb(¶ms); + for (const auto ¶mDesc : params) { + if (paramDesc->name().compare(C2_PARAMKEY_OUTPUT_LARGE_FRAME) == 0) { + isComponentSupportsLargeAudioFrame = true; + break; + } + } + if (!isComponentSupportsLargeAudioFrame) { + multiAccessUnitIntf = std::make_shared<MultiAccessUnitInterface>( + c2interface, std::static_pointer_cast<C2ReflectorHelper>(mParamReflector)); + } + } + } + return multiAccessUnitIntf; +} + // Methods from ::android::hardware::media::c2::V1_0::IComponentStore Return<void> ComponentStore::createComponent( const hidl_string& name, @@ -241,7 +271,9 @@ Return<void> ComponentStore::createInterface( c2interface = GetFilterWrapper()->maybeWrapInterface(c2interface); #endif onInterfaceLoaded(c2interface); - interface = new ComponentInterface(c2interface, mParameterCache); + std::shared_ptr<MultiAccessUnitInterface> multiAccessUnitIntf = + tryCreateMultiAccessUnitInterface(c2interface); + interface = new ComponentInterface(c2interface, multiAccessUnitIntf, mParameterCache); } _hidl_cb(static_cast<Status>(res), interface); return Void(); diff --git a/media/codec2/hal/hidl/1.2/utils/include/codec2/hidl/1.2/ComponentStore.h b/media/codec2/hal/hidl/1.2/utils/include/codec2/hidl/1.2/ComponentStore.h index e95a651756..c08fce4c67 100644 --- a/media/codec2/hal/hidl/1.2/utils/include/codec2/hidl/1.2/ComponentStore.h +++ b/media/codec2/hal/hidl/1.2/utils/include/codec2/hidl/1.2/ComponentStore.h @@ -79,6 +79,9 @@ struct ComponentStore : public IComponentStore { static std::shared_ptr<FilterWrapper> GetFilterWrapper(); + std::shared_ptr<MultiAccessUnitInterface> tryCreateMultiAccessUnitInterface( + const std::shared_ptr<C2ComponentInterface> &c2interface); + // Methods from ::android::hardware::media::c2::V1_0::IComponentStore. virtual Return<void> createComponent( const hidl_string& name, diff --git a/media/codec2/sfplugin/Android.bp b/media/codec2/sfplugin/Android.bp index d867eb1539..18c2468c26 100644 --- a/media/codec2/sfplugin/Android.bp +++ b/media/codec2/sfplugin/Android.bp @@ -45,6 +45,7 @@ cc_library_shared { static_libs: [ "libSurfaceFlingerProperties", + "android.media.codec-aconfig-cc", ], shared_libs: [ diff --git a/media/codec2/sfplugin/Codec2InfoBuilder.cpp b/media/codec2/sfplugin/Codec2InfoBuilder.cpp index 453a0d2f59..8dce7892de 100644 --- a/media/codec2/sfplugin/Codec2InfoBuilder.cpp +++ b/media/codec2/sfplugin/Codec2InfoBuilder.cpp @@ -20,6 +20,8 @@ #include <strings.h> +#include <android_media_codec.h> + #include <C2Component.h> #include <C2Config.h> #include <C2Debug.h> @@ -752,6 +754,24 @@ status_t Codec2InfoBuilder::buildMediaCodecList(MediaCodecListWriter* writer) { } addSupportedColorFormats( intf, caps.get(), trait, mediaType, it->second); + + if (android::media::codec::provider_->large_audio_frame_finish()) { + // Adding feature-multiple-frames when C2LargeFrame param is present + if (trait.domain == C2Component::DOMAIN_AUDIO) { + std::vector<std::shared_ptr<C2ParamDescriptor>> params; + c2_status_t err = intf->querySupportedParams(¶ms); + if (err == C2_OK) { + for (const auto ¶mDesc : params) { + if (C2LargeFrame::output::PARAM_TYPE == paramDesc->index()) { + std::string featureMultipleFrames = + std::string(KEY_FEATURE_) + FEATURE_MultipleFrames; + caps->addDetail(featureMultipleFrames.c_str(), 0); + break; + } + } + } + } + } } } } diff --git a/media/libaudiohal/impl/EffectBufferHalAidl.cpp b/media/libaudiohal/impl/EffectBufferHalAidl.cpp index a701852d46..33fe3ed7dd 100644 --- a/media/libaudiohal/impl/EffectBufferHalAidl.cpp +++ b/media/libaudiohal/impl/EffectBufferHalAidl.cpp @@ -58,25 +58,14 @@ EffectBufferHalAidl::EffectBufferHalAidl(size_t size) } EffectBufferHalAidl::~EffectBufferHalAidl() { + if (mAudioBuffer.raw) free(mAudioBuffer.raw); } status_t EffectBufferHalAidl::init() { - int fd = ashmem_create_region("audioEffectAidl", mBufferSize); - if (fd < 0) { - ALOGE("%s create ashmem failed %d", __func__, fd); - return fd; + if (0 != posix_memalign(&mAudioBuffer.raw, 32, mBufferSize)) { + return NO_MEMORY; } - ScopedFileDescriptor tempFd(fd); - mAudioBuffer.raw = mmap(nullptr /* address */, mBufferSize /* length */, PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0 /* offset */); - if (mAudioBuffer.raw == MAP_FAILED) { - ALOGE("mmap failed for fd %d", fd); - mAudioBuffer.raw = nullptr; - return INVALID_OPERATION; - } - - mMemory = {std::move(tempFd), static_cast<int64_t>(mBufferSize)}; return OK; } diff --git a/media/libaudiohal/impl/EffectBufferHalAidl.h b/media/libaudiohal/impl/EffectBufferHalAidl.h index 035314b6e8..cf6031fcba 100644 --- a/media/libaudiohal/impl/EffectBufferHalAidl.h +++ b/media/libaudiohal/impl/EffectBufferHalAidl.h @@ -50,7 +50,6 @@ class EffectBufferHalAidl : public EffectBufferHalInterface { const size_t mBufferSize; bool mFrameCountChanged; void* mExternalData; - aidl::android::hardware::common::Ashmem mMemory; audio_buffer_t mAudioBuffer; // Can not be constructed directly by clients. diff --git a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h index f4c40e1667..24ac2e8824 100644 --- a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h +++ b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h @@ -697,6 +697,7 @@ inline static const char *asString_ColorFormat(int32_t i, const char *def = "??" inline constexpr char FEATURE_AdaptivePlayback[] = "adaptive-playback"; inline constexpr char FEATURE_EncodingStatistics[] = "encoding-statistics"; inline constexpr char FEATURE_IntraRefresh[] = "intra-refresh"; +inline constexpr char FEATURE_MultipleFrames[] = "multiple-frames"; inline constexpr char FEATURE_PartialFrame[] = "partial-frame"; inline constexpr char FEATURE_QpBounds[] = "qp-bounds"; inline constexpr char FEATURE_SecurePlayback[] = "secure-playback"; diff --git a/services/Android.mk b/services/Android.mk deleted file mode 100644 index c86a226ec1..0000000000 --- a/services/Android.mk +++ /dev/null @@ -1 +0,0 @@ -$(eval $(call declare-1p-copy-files,frameworks/av/services/audiopolicy,)) diff --git a/services/audioflinger/datapath/AudioStreamOut.cpp b/services/audioflinger/datapath/AudioStreamOut.cpp index 1830d15cc5..9851f3a00d 100644 --- a/services/audioflinger/datapath/AudioStreamOut.cpp +++ b/services/audioflinger/datapath/AudioStreamOut.cpp @@ -99,15 +99,15 @@ status_t AudioStreamOut::getPresentationPosition(uint64_t *frames, struct timesp return status; } - // Adjust for standby using HAL rate frames. - // Only apply this correction if the HAL is getting PCM frames. - if (mHalFormatHasProportionalFrames) { + if (mHalFormatHasProportionalFrames && + (flags & AUDIO_OUTPUT_FLAG_DIRECT) == AUDIO_OUTPUT_FLAG_DIRECT) { + // For DirectTrack reset timestamp to 0 on standby. const uint64_t adjustedPosition = (halPosition <= mFramesWrittenAtStandby) ? 0 : (halPosition - mFramesWrittenAtStandby); // Scale from HAL sample rate to application rate. *frames = adjustedPosition / mRateMultiplier; } else { - // For offloaded MP3 and other compressed formats. + // For offloaded MP3 and other compressed formats, and linear PCM. *frames = halPosition; } |