summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apex/ld.config.txt13
-rw-r--r--media/extractors/mp4/ItemTable.cpp3
-rw-r--r--media/extractors/wav/WAVExtractor.cpp2
-rw-r--r--media/libstagefright/Utils.cpp1
-rw-r--r--media/ndk/NdkImageReader.cpp3
-rw-r--r--media/ndk/NdkMediaFormat.cpp1
-rw-r--r--media/ndk/include/media/NdkMediaFormat.h1
-rw-r--r--media/ndk/include/private/media/NdkImage.h30
-rw-r--r--media/ndk/libmediandk.map.txt1
-rw-r--r--media/ndk/tests/AImageReaderWindowHandleTest.cpp22
-rw-r--r--services/audioflinger/AudioFlinger.cpp8
-rw-r--r--services/audioflinger/Threads.cpp76
-rw-r--r--services/audioflinger/Threads.h34
-rw-r--r--services/audioflinger/TrackBase.h11
-rw-r--r--services/mediaanalytics/MediaAnalyticsService.cpp6
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;