diff options
-rw-r--r-- | apex/ld.config.txt | 13 | ||||
-rw-r--r-- | media/extractors/mp4/ItemTable.cpp | 3 | ||||
-rw-r--r-- | media/extractors/wav/WAVExtractor.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/Utils.cpp | 1 | ||||
-rw-r--r-- | media/ndk/NdkImageReader.cpp | 3 | ||||
-rw-r--r-- | media/ndk/NdkMediaFormat.cpp | 1 | ||||
-rw-r--r-- | media/ndk/include/media/NdkMediaFormat.h | 1 | ||||
-rw-r--r-- | media/ndk/include/private/media/NdkImage.h | 30 | ||||
-rw-r--r-- | media/ndk/libmediandk.map.txt | 1 | ||||
-rw-r--r-- | media/ndk/tests/AImageReaderWindowHandleTest.cpp | 22 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 8 | ||||
-rw-r--r-- | services/audioflinger/Threads.cpp | 76 | ||||
-rw-r--r-- | services/audioflinger/Threads.h | 34 | ||||
-rw-r--r-- | services/audioflinger/TrackBase.h | 11 | ||||
-rw-r--r-- | services/mediaanalytics/MediaAnalyticsService.cpp | 6 |
15 files changed, 121 insertions, 91 deletions
diff --git a/apex/ld.config.txt b/apex/ld.config.txt index a3e96c4d6c..7f9aad2fcf 100644 --- a/apex/ld.config.txt +++ b/apex/ld.config.txt @@ -61,14 +61,15 @@ namespace.platform.isolated = true namespace.platform.search.paths = /system/${LIB} namespace.platform.asan.search.paths = /data/asan/system/${LIB} -# /system/lib/libc.so, etc are symlinks to /bionic/lib/libc.so, etc. -# Add /bionic/lib to the permitted paths because linker uses realpath(3) +# /system/lib/libc.so, etc are symlinks to +/apex/com.android.lib/lib/bionic/libc.so, etc. +# Add /apex/... pat to the permitted paths because linker uses realpath(3) # to check the accessibility of the lib. We could add this to search.paths # instead but that makes the resolution of bionic libs be dependent on -# the order of /system/lib and /bionic/lib in search.paths. If /bionic/lib -# is after /system/lib, then /bionic/lib is never tried because libc.so +# the order of /system/lib and /apex/... in search.paths. If /apex/... +# is after /system/lib, then /apex/... is never tried because libc.so # is always found in /system/lib but fails to pass the accessibility test # because of its realpath. It's better to not depend on the ordering if # possible. -namespace.platform.permitted.paths = /bionic/${LIB} -namespace.platform.asan.permitted.paths = /bionic/${LIB} +namespace.platform.permitted.paths = /apex/com.android.runtime/${LIB}/bionic +namespace.platform.asan.permitted.paths = /apex/com.android.runtime/${LIB}/bionic diff --git a/media/extractors/mp4/ItemTable.cpp b/media/extractors/mp4/ItemTable.cpp index a72e589b59..d56abaa274 100644 --- a/media/extractors/mp4/ItemTable.cpp +++ b/media/extractors/mp4/ItemTable.cpp @@ -1540,7 +1540,8 @@ AMediaFormat *ItemTable::getImageMeta(const uint32_t imageIndex) { AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT, thumbnail.height); AMediaFormat_setBuffer(meta, - AMEDIAFORMAT_KEY_CSD_HEVC, thumbnail.hvcc->data(), thumbnail.hvcc->size()); + AMEDIAFORMAT_KEY_THUMBNAIL_CSD_HEVC, + thumbnail.hvcc->data(), thumbnail.hvcc->size()); ALOGV("image[%u]: thumbnail: size %dx%d, item index %zd", imageIndex, thumbnail.width, thumbnail.height, thumbItemIndex); } else { diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp index 5679de8dad..020951bcdf 100644 --- a/media/extractors/wav/WAVExtractor.cpp +++ b/media/extractors/wav/WAVExtractor.cpp @@ -81,7 +81,7 @@ struct WAVSource : public MediaTrackHelper { virtual media_status_t read( MediaBufferHelper **buffer, const ReadOptions *options = NULL); - bool supportsNonBlockingRead() override { return true; } + bool supportsNonBlockingRead() override { return false; } protected: virtual ~WAVSource(); diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp index 16b3319c21..64bbf08b8e 100644 --- a/media/libstagefright/Utils.cpp +++ b/media/libstagefright/Utils.cpp @@ -642,6 +642,7 @@ static std::vector<std::pair<const char *, uint32_t>> bufferMappings { { "icc-profile", kKeyIccProfile }, { "sei", kKeySEI }, { "text-format-data", kKeyTextFormatData }, + { "thumbnail-csd-hevc", kKeyThumbnailHVCC }, } }; diff --git a/media/ndk/NdkImageReader.cpp b/media/ndk/NdkImageReader.cpp index bcc7ff3da8..22e15d3f33 100644 --- a/media/ndk/NdkImageReader.cpp +++ b/media/ndk/NdkImageReader.cpp @@ -21,6 +21,7 @@ #include "NdkImagePriv.h" #include "NdkImageReaderPriv.h" +#include <private/media/NdkImage.h> #include <cutils/atomic.h> #include <utils/Log.h> @@ -63,6 +64,7 @@ AImageReader::isSupportedFormatAndUsage(int32_t format, uint64_t usage) { case AIMAGE_FORMAT_YUV_420_888: case AIMAGE_FORMAT_JPEG: case AIMAGE_FORMAT_RAW16: + case AIMAGE_FORMAT_RAW_DEPTH: case AIMAGE_FORMAT_RAW_PRIVATE: case AIMAGE_FORMAT_RAW10: case AIMAGE_FORMAT_RAW12: @@ -92,6 +94,7 @@ AImageReader::getNumPlanesForFormat(int32_t format) { case AIMAGE_FORMAT_RGBA_FP16: case AIMAGE_FORMAT_JPEG: case AIMAGE_FORMAT_RAW16: + case AIMAGE_FORMAT_RAW_DEPTH: case AIMAGE_FORMAT_RAW_PRIVATE: case AIMAGE_FORMAT_RAW10: case AIMAGE_FORMAT_RAW12: diff --git a/media/ndk/NdkMediaFormat.cpp b/media/ndk/NdkMediaFormat.cpp index 768a7a9adc..ed88cf349a 100644 --- a/media/ndk/NdkMediaFormat.cpp +++ b/media/ndk/NdkMediaFormat.cpp @@ -371,6 +371,7 @@ EXPORT const char* AMEDIAFORMAT_KEY_TEMPORAL_LAYER_COUNT = "temporal-layer-count EXPORT const char* AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID = "temporal-layer-id"; EXPORT const char* AMEDIAFORMAT_KEY_TEMPORAL_LAYERING = "ts-schema"; EXPORT const char* AMEDIAFORMAT_KEY_TEXT_FORMAT_DATA = "text-format-data"; +EXPORT const char* AMEDIAFORMAT_KEY_THUMBNAIL_CSD_HEVC = "thumbnail-csd-hevc"; EXPORT const char* AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT = "thumbnail-height"; EXPORT const char* AMEDIAFORMAT_KEY_THUMBNAIL_TIME = "thumbnail-time"; EXPORT const char* AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH = "thumbnail-width"; diff --git a/media/ndk/include/media/NdkMediaFormat.h b/media/ndk/include/media/NdkMediaFormat.h index 56bcaabe1a..259481dc3c 100644 --- a/media/ndk/include/media/NdkMediaFormat.h +++ b/media/ndk/include/media/NdkMediaFormat.h @@ -226,6 +226,7 @@ extern const char* AMEDIAFORMAT_KEY_SAR_WIDTH __INTRODUCED_IN(29); extern const char* AMEDIAFORMAT_KEY_TARGET_TIME __INTRODUCED_IN(29); extern const char* AMEDIAFORMAT_KEY_TEMPORAL_LAYER_COUNT __INTRODUCED_IN(29); extern const char* AMEDIAFORMAT_KEY_TEXT_FORMAT_DATA __INTRODUCED_IN(29); +extern const char* AMEDIAFORMAT_KEY_THUMBNAIL_CSD_HEVC __INTRODUCED_IN(29); extern const char* AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT __INTRODUCED_IN(29); extern const char* AMEDIAFORMAT_KEY_THUMBNAIL_TIME __INTRODUCED_IN(29); extern const char* AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH __INTRODUCED_IN(29); diff --git a/media/ndk/include/private/media/NdkImage.h b/media/ndk/include/private/media/NdkImage.h new file mode 100644 index 0000000000..4368a5663e --- /dev/null +++ b/media/ndk/include/private/media/NdkImage.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2019 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. + */ + +#ifndef _PRIVATE_MEDIA_NDKIMAGE_H_ +#define _PRIVATE_MEDIA_NDKIMAGE_H_ +// Formats not listed in the public API, but still available to AImageReader +enum AIMAGE_PRIVATE_FORMATS { + /** + * Unprocessed implementation-dependent raw + * depth measurements, opaque with 16 bit + * samples. + * + */ + + AIMAGE_FORMAT_RAW_DEPTH = 0x1002, +}; +#endif // _PRIVATE_MEDIA_NDKIMAGE diff --git a/media/ndk/libmediandk.map.txt b/media/ndk/libmediandk.map.txt index 9756926e41..4725e9ec26 100644 --- a/media/ndk/libmediandk.map.txt +++ b/media/ndk/libmediandk.map.txt @@ -135,6 +135,7 @@ LIBMEDIANDK { AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID; # var introduced=28 AMEDIAFORMAT_KEY_TEMPORAL_LAYERING; # var introduced=28 AMEDIAFORMAT_KEY_TEXT_FORMAT_DATA; # var introduced=29 + AMEDIAFORMAT_KEY_THUMBNAIL_CSD_HEVC; # var introduced=29 AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT; # var introduced=29 AMEDIAFORMAT_KEY_THUMBNAIL_TIME; # var introduced=29 AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH; # var introduced=29 diff --git a/media/ndk/tests/AImageReaderWindowHandleTest.cpp b/media/ndk/tests/AImageReaderWindowHandleTest.cpp index ef0ff675a5..5f112529f6 100644 --- a/media/ndk/tests/AImageReaderWindowHandleTest.cpp +++ b/media/ndk/tests/AImageReaderWindowHandleTest.cpp @@ -17,6 +17,7 @@ #include <gtest/gtest.h> #include <media/NdkImageReader.h> #include <media/NdkImage.h> +#include <private/media/NdkImage.h> #include <mediautils/AImageReaderUtils.h> #include <gui/IGraphicBufferProducer.h> #include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h> @@ -182,4 +183,25 @@ TEST_F(AImageReaderWindowHandleTest, CreateWindowNativeHandle) { EXPECT_TRUE(imageAvailable_) << "Timed out waiting for image data to be handled!\n"; } +class AImageReaderPrivateFormatTest : public ::testing::Test { + public: + void SetUp() override { + auto status = AImageReader_new(kImageWidth, kImageHeight, AIMAGE_FORMAT_RAW_DEPTH, + kMaxImages, &imgReader); + EXPECT_TRUE(status == AMEDIA_OK); + } + + void TearDown() override { + if (imgReader) { + AImageReader_delete(imgReader); + } + } + AImageReader *imgReader = nullptr; +}; + +TEST_F(AImageReaderPrivateFormatTest, CreateTest) { + EXPECT_TRUE(imgReader != nullptr); +} + + } // namespace android diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index f7dbbc057a..735885cc3c 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -224,6 +224,14 @@ AudioFlinger::~AudioFlinger() // closeOutput_nonvirtual() will remove specified entry from mPlaybackThreads closeOutput_nonvirtual(mPlaybackThreads.keyAt(0)); } + while (!mMmapThreads.isEmpty()) { + const audio_io_handle_t io = mMmapThreads.keyAt(0); + if (mMmapThreads.valueAt(0)->isOutput()) { + closeOutput_nonvirtual(io); // removes entry from mMmapThreads + } else { + closeInput_nonvirtual(io); // removes entry from mMmapThreads + } + } for (size_t i = 0; i < mAudioHwDevs.size(); i++) { // no mHardwareLock needed, as there are no other references to this diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 49f74a2660..3ecb37d405 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -2788,28 +2788,6 @@ status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, ui } } -// hasAudioSession_l() must be called with ThreadBase::mLock held -uint32_t AudioFlinger::PlaybackThread::hasAudioSession_l(audio_session_t sessionId) const -{ - uint32_t result = 0; - if (getEffectChain_l(sessionId) != 0) { - result = EFFECT_SESSION; - } - - for (size_t i = 0; i < mTracks.size(); ++i) { - sp<Track> track = mTracks[i]; - if (sessionId == track->sessionId() && !track->isInvalid()) { - result |= TRACK_SESSION; - if (track->isFastTrack()) { - result |= FAST_SESSION; - } - break; - } - } - - return result; -} - uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(audio_session_t sessionId) { // session AUDIO_SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that @@ -8219,27 +8197,6 @@ uint32_t AudioFlinger::RecordThread::getInputFramesLost() return 0; } -// hasAudioSession_l() must be called with ThreadBase::mLock held -uint32_t AudioFlinger::RecordThread::hasAudioSession_l(audio_session_t sessionId) const -{ - uint32_t result = 0; - if (getEffectChain_l(sessionId) != 0) { - result = EFFECT_SESSION; - } - - for (size_t i = 0; i < mTracks.size(); ++i) { - if (sessionId == mTracks[i]->sessionId()) { - result |= TRACK_SESSION; - if (mTracks[i]->isFastTrack()) { - result |= FAST_SESSION; - } - break; - } - } - - return result; -} - KeyedVector<audio_session_t, bool> AudioFlinger::RecordThread::sessionIds() const { KeyedVector<audio_session_t, bool> ids; @@ -8747,9 +8704,11 @@ bool AudioFlinger::MmapThread::threadLoop() while (!exitPending()) { - Mutex::Autolock _l(mLock); Vector< sp<EffectChain> > effectChains; + { // under Thread lock + Mutex::Autolock _l(mLock); + if (mSignalPending) { // A signal was raised while we were unlocked mSignalPending = false; @@ -8784,10 +8743,13 @@ bool AudioFlinger::MmapThread::threadLoop() updateMetadata_l(); lockEffectChains_l(effectChains); + } // release Thread lock + for (size_t i = 0; i < effectChains.size(); i ++) { - effectChains[i]->process_l(); + effectChains[i]->process_l(); // Thread is not locked, but effect chain is locked } - // enable changes in effect chain + + // enable changes in effect chain, including moving to another thread. unlockEffectChains(effectChains); // Effect chains will be actually deleted here if they were removed from // mEffectChains list during mixing or effects processing @@ -9048,28 +9010,6 @@ size_t AudioFlinger::MmapThread::removeEffectChain_l(const sp<EffectChain>& chai return mEffectChains.size(); } -// hasAudioSession_l() must be called with ThreadBase::mLock held -uint32_t AudioFlinger::MmapThread::hasAudioSession_l(audio_session_t sessionId) const -{ - uint32_t result = 0; - if (getEffectChain_l(sessionId) != 0) { - result = EFFECT_SESSION; - } - - for (size_t i = 0; i < mActiveTracks.size(); i++) { - sp<MmapTrack> track = mActiveTracks[i]; - if (sessionId == track->sessionId()) { - result |= TRACK_SESSION; - if (track->isFastTrack()) { - result |= FAST_SESSION; - } - break; - } - } - - return result; -} - void AudioFlinger::MmapThread::threadLoop_standby() { mHalStream->standby(); diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h index 97aa9f044a..47e580bf8c 100644 --- a/services/audioflinger/Threads.h +++ b/services/audioflinger/Threads.h @@ -356,6 +356,27 @@ public: return hasAudioSession_l(sessionId); } + template <typename T> + uint32_t hasAudioSession_l(audio_session_t sessionId, const T& tracks) const { + uint32_t result = 0; + if (getEffectChain_l(sessionId) != 0) { + result = EFFECT_SESSION; + } + for (size_t i = 0; i < tracks.size(); ++i) { + const sp<TrackBase>& track = tracks[i]; + if (sessionId == track->sessionId() + && !track->isInvalid() // not yet removed from tracks. + && !track->isTerminated()) { + result |= TRACK_SESSION; + if (track->isFastTrack()) { + result |= FAST_SESSION; // caution, only represents first track. + } + break; + } + } + return result; + } + // the value returned by default implementation is not important as the // strategy is only meaningful for PlaybackThread which implements this method virtual uint32_t getStrategyForSession_l(audio_session_t sessionId __unused) @@ -810,7 +831,9 @@ public: virtual status_t addEffectChain_l(const sp<EffectChain>& chain); virtual size_t removeEffectChain_l(const sp<EffectChain>& chain); - virtual uint32_t hasAudioSession_l(audio_session_t sessionId) const; + uint32_t hasAudioSession_l(audio_session_t sessionId) const override { + return ThreadBase::hasAudioSession_l(sessionId, mTracks); + } virtual uint32_t getStrategyForSession_l(audio_session_t sessionId); @@ -1550,7 +1573,9 @@ public: virtual status_t addEffectChain_l(const sp<EffectChain>& chain); virtual size_t removeEffectChain_l(const sp<EffectChain>& chain); - virtual uint32_t hasAudioSession_l(audio_session_t sessionId) const; + uint32_t hasAudioSession_l(audio_session_t sessionId) const override { + return ThreadBase::hasAudioSession_l(sessionId, mTracks); + } // Return the set of unique session IDs across all tracks. // The keys are the session IDs, and the associated values are meaningless. @@ -1725,7 +1750,10 @@ class MmapThread : public ThreadBase virtual status_t checkEffectCompatibility_l(const effect_descriptor_t *desc, audio_session_t sessionId); - virtual uint32_t hasAudioSession_l(audio_session_t sessionId) const; + uint32_t hasAudioSession_l(audio_session_t sessionId) const override { + // Note: using mActiveTracks as no mTracks here. + return ThreadBase::hasAudioSession_l(sessionId, mActiveTracks); + } virtual status_t setSyncEvent(const sp<SyncEvent>& event); virtual bool isValidSyncEvent(const sp<SyncEvent>& event) const; diff --git a/services/audioflinger/TrackBase.h b/services/audioflinger/TrackBase.h index e23173fd0a..4402d99314 100644 --- a/services/audioflinger/TrackBase.h +++ b/services/audioflinger/TrackBase.h @@ -94,6 +94,9 @@ public: virtual void invalidate() { mIsInvalid = true; } bool isInvalid() const { return mIsInvalid; } + void terminate() { mTerminated = true; } + bool isTerminated() const { return mTerminated; } + audio_attributes_t attributes() const { return mAttr; } #ifdef TEE_SINK @@ -228,14 +231,6 @@ protected: return mState == STOPPING_2; } - bool isTerminated() const { - return mTerminated; - } - - void terminate() { - mTerminated = true; - } - // Upper case characters are final states. // Lower case characters are transitory. const char *getTrackStateString() const { diff --git a/services/mediaanalytics/MediaAnalyticsService.cpp b/services/mediaanalytics/MediaAnalyticsService.cpp index 4f3ac1ba8d..06baac962d 100644 --- a/services/mediaanalytics/MediaAnalyticsService.cpp +++ b/services/mediaanalytics/MediaAnalyticsService.cpp @@ -76,9 +76,6 @@ namespace android { - using namespace android::base; - using namespace android::content::pm; - // individual records kept in memory: age or count // age: <= 28 hours (1 1/6 days) // count: hard limit of # records @@ -649,7 +646,8 @@ void MediaAnalyticsService::setPkgInfo(MediaAnalyticsItem *item, uid_t uid, bool } if (binder != NULL) { - sp<IPackageManagerNative> package_mgr = interface_cast<IPackageManagerNative>(binder); + sp<content::pm::IPackageManagerNative> package_mgr = + interface_cast<content::pm::IPackageManagerNative>(binder); binder::Status status; std::vector<int> uids; |