Merge "Add securityLevel to MediaDrm isCryptoSchemeSupported API"
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index 55a97d8..b529cbc 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -271,12 +271,8 @@
namespace {
-// TODO: get this info from component
-const static size_t kMinInputBufferArraySize = 4;
-const static size_t kMaxPipelineCapacity = 18;
-const static size_t kChannelOutputDelay = 0;
-const static size_t kMinOutputBufferArraySize = kMaxPipelineCapacity +
- kChannelOutputDelay;
+const static size_t kSmoothnessFactor = 4;
+const static size_t kRenderingDepth = 3;
const static size_t kLinearBufferSize = 1048576;
// This can fit 4K RGBA frame, and most likely client won't need more than this.
const static size_t kMaxLinearBufferSize = 3840 * 2160 * 4;
@@ -829,6 +825,7 @@
const sp<ICrypto> &crypto,
int32_t heapSeqNum,
size_t capacity,
+ size_t numInputSlots,
const char *componentName, const char *name = "EncryptedInput")
: LinearInputBuffers(componentName, name),
mUsage({0, 0}),
@@ -840,7 +837,7 @@
} else {
mUsage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
}
- for (size_t i = 0; i < kMinInputBufferArraySize; ++i) {
+ for (size_t i = 0; i < numInputSlots; ++i) {
sp<IMemory> memory = mDealer->allocate(capacity);
if (memory == nullptr) {
ALOGD("[%s] Failed to allocate memory from dealer: only %zu slots allocated", mName, i);
@@ -951,11 +948,12 @@
class GraphicInputBuffers : public CCodecBufferChannel::InputBuffers {
public:
- GraphicInputBuffers(const char *componentName, const char *name = "2D-BB-Input")
+ GraphicInputBuffers(
+ size_t numInputSlots, const char *componentName, const char *name = "2D-BB-Input")
: InputBuffers(componentName, name),
mImpl(mName),
mLocalBufferPool(LocalBufferPool::Create(
- kMaxLinearBufferSize * kMinInputBufferArraySize)) { }
+ kMaxLinearBufferSize * numInputSlots)) { }
~GraphicInputBuffers() override = default;
bool requestNewBuffer(size_t *index, sp<MediaCodecBuffer> *buffer) override {
@@ -1291,10 +1289,11 @@
class RawGraphicOutputBuffers : public FlexOutputBuffers {
public:
- RawGraphicOutputBuffers(const char *componentName, const char *name = "2D-BB-Output")
+ RawGraphicOutputBuffers(
+ size_t numOutputSlots, const char *componentName, const char *name = "2D-BB-Output")
: FlexOutputBuffers(componentName, name),
mLocalBufferPool(LocalBufferPool::Create(
- kMaxLinearBufferSize * kMinOutputBufferArraySize)) { }
+ kMaxLinearBufferSize * numOutputSlots)) { }
~RawGraphicOutputBuffers() override = default;
sp<Codec2Buffer> wrap(const std::shared_ptr<C2Buffer> &buffer) override {
@@ -1545,6 +1544,8 @@
const std::shared_ptr<CCodecCallback> &callback)
: mHeapSeqNum(-1),
mCCodecCallback(callback),
+ mNumInputSlots(kSmoothnessFactor),
+ mNumOutputSlots(kSmoothnessFactor),
mFrameIndex(0u),
mFirstValidFrameIndex(0u),
mMetaMode(MODE_NONE),
@@ -2006,7 +2007,7 @@
Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
if (!(*buffers)->isArrayMode()) {
- *buffers = (*buffers)->toArrayMode(kMinInputBufferArraySize);
+ *buffers = (*buffers)->toArrayMode(mNumInputSlots);
}
(*buffers)->getArray(array);
@@ -2017,7 +2018,7 @@
Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
if (!(*buffers)->isArrayMode()) {
- *buffers = (*buffers)->toArrayMode(kMinOutputBufferArraySize);
+ *buffers = (*buffers)->toArrayMode(mNumOutputSlots);
}
(*buffers)->getArray(array);
@@ -2029,12 +2030,19 @@
C2StreamBufferTypeSetting::output oStreamFormat(0u);
C2PortReorderBufferDepthTuning::output reorderDepth;
C2PortReorderKeySetting::output reorderKey;
+ C2PortActualDelayTuning::input inputDelay(0);
+ C2PortActualDelayTuning::output outputDelay(0);
+ C2ActualPipelineDelayTuning pipelineDelay(0);
+
c2_status_t err = mComponent->query(
{
&iStreamFormat,
&oStreamFormat,
&reorderDepth,
&reorderKey,
+ &inputDelay,
+ &pipelineDelay,
+ &outputDelay,
},
{},
C2_DONT_BLOCK,
@@ -2057,6 +2065,13 @@
reorder->setKey(reorderKey.value);
}
}
+
+ mNumInputSlots =
+ (inputDelay ? inputDelay.value : 0) +
+ (pipelineDelay ? pipelineDelay.value : 0) +
+ kSmoothnessFactor;
+ mNumOutputSlots = (outputDelay ? outputDelay.value : 0) + kSmoothnessFactor;
+
// TODO: get this from input format
bool secure = mComponent->getName().find(".secure") != std::string::npos;
@@ -2127,6 +2142,7 @@
pools->inputPool = pool;
}
+ bool forceArrayMode = false;
Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
if (graphic) {
if (mInputSurface) {
@@ -2134,7 +2150,7 @@
} else if (mMetaMode == MODE_ANW) {
buffers->reset(new GraphicMetadataInputBuffers(mName));
} else {
- buffers->reset(new GraphicInputBuffers(mName));
+ buffers->reset(new GraphicInputBuffers(mNumInputSlots, mName));
}
} else {
if (hasCryptoOrDescrambler()) {
@@ -2147,7 +2163,7 @@
if (mDealer == nullptr) {
mDealer = new MemoryDealer(
align(capacity, MemoryDealer::getAllocationAlignment())
- * (kMinInputBufferArraySize + 1),
+ * (mNumInputSlots + 1),
"EncryptedLinearInputBuffers");
mDecryptDestination = mDealer->allocate((size_t)capacity);
}
@@ -2157,7 +2173,9 @@
mHeapSeqNum = -1;
}
buffers->reset(new EncryptedLinearInputBuffers(
- secure, mDealer, mCrypto, mHeapSeqNum, (size_t)capacity, mName));
+ secure, mDealer, mCrypto, mHeapSeqNum, (size_t)capacity,
+ mNumInputSlots, mName));
+ forceArrayMode = true;
} else {
buffers->reset(new LinearInputBuffers(mName));
}
@@ -2169,6 +2187,10 @@
} else {
// TODO: error
}
+
+ if (forceArrayMode) {
+ *buffers = (*buffers)->toArrayMode(mNumInputSlots);
+ }
}
if (outputFormat != nullptr) {
@@ -2286,7 +2308,7 @@
if (outputSurface) {
buffers->reset(new GraphicOutputBuffers(mName));
} else {
- buffers->reset(new RawGraphicOutputBuffers(mName));
+ buffers->reset(new RawGraphicOutputBuffers(mNumOutputSlots, mName));
}
} else {
buffers->reset(new LinearOutputBuffers(mName));
@@ -2307,7 +2329,7 @@
// WORKAROUND: if we're using early CSD workaround we convert to
// array mode, to appease apps assuming the output
// buffers to be of the same size.
- (*buffers) = (*buffers)->toArrayMode(kMinOutputBufferArraySize);
+ (*buffers) = (*buffers)->toArrayMode(mNumOutputSlots);
int32_t channelCount;
int32_t sampleRate;
@@ -2335,27 +2357,10 @@
// about buffers from the previous generation do not interfere with the
// newly initialized pipeline capacity.
- // Query delays
- C2PortRequestedDelayTuning::input inputDelay;
- C2PortRequestedDelayTuning::output outputDelay;
- C2RequestedPipelineDelayTuning pipelineDelay;
-#if 0
- err = mComponent->query(
- { &inputDelay, &pipelineDelay, &outputDelay },
- {},
- C2_DONT_BLOCK,
- nullptr);
mAvailablePipelineCapacity.initialize(
- inputDelay,
- inputDelay + pipelineDelay,
- inputDelay + pipelineDelay + outputDelay,
+ mNumInputSlots,
+ mNumInputSlots + mNumOutputSlots,
mName);
-#else
- mAvailablePipelineCapacity.initialize(
- kMinInputBufferArraySize,
- kMaxPipelineCapacity,
- mName);
-#endif
mInputMetEos = false;
mSync.start();
@@ -2374,7 +2379,7 @@
}
std::vector<sp<MediaCodecBuffer>> toBeQueued;
// TODO: use proper buffer depth instead of this random value
- for (size_t i = 0; i < kMinInputBufferArraySize; ++i) {
+ for (size_t i = 0; i < mNumInputSlots; ++i) {
size_t index;
sp<MediaCodecBuffer> buffer;
{
@@ -2731,7 +2736,7 @@
sp<IGraphicBufferProducer> producer;
if (newSurface) {
newSurface->setScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
- newSurface->setMaxDequeuedBufferCount(kMinOutputBufferArraySize);
+ newSurface->setMaxDequeuedBufferCount(mNumOutputSlots + kRenderingDepth);
producer = newSurface->getIGraphicBufferProducer();
producer->setGenerationNumber(generation);
} else {
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.h b/media/codec2/sfplugin/CCodecBufferChannel.h
index 431baaa..fd806b7 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.h
+++ b/media/codec2/sfplugin/CCodecBufferChannel.h
@@ -37,6 +37,8 @@
namespace android {
+class MemoryDealer;
+
class CCodecCallback {
public:
virtual ~CCodecCallback() = default;
@@ -233,6 +235,9 @@
QueueSync mQueueSync;
std::vector<std::unique_ptr<C2Param>> mParamsToBeSet;
+ size_t mNumInputSlots;
+ size_t mNumOutputSlots;
+
Mutexed<std::unique_ptr<InputBuffers>> mInputBuffers;
Mutexed<std::list<sp<ABuffer>>> mFlushedConfigs;
Mutexed<std::unique_ptr<OutputBuffers>> mOutputBuffers;
diff --git a/media/libaaudio/examples/loopback/src/loopback.cpp b/media/libaaudio/examples/loopback/src/loopback.cpp
index 2a02b20..3de1514 100644
--- a/media/libaaudio/examples/loopback/src/loopback.cpp
+++ b/media/libaaudio/examples/loopback/src/loopback.cpp
@@ -105,9 +105,14 @@
assert(false);
}
if (framesRead < 0) {
- myData->inputError = framesRead;
- printf("ERROR in read = %d = %s\n", framesRead,
- AAudio_convertResultToText(framesRead));
+ // Expect INVALID_STATE if STATE_STARTING
+ if (myData->framesReadTotal > 0) {
+ myData->inputError = framesRead;
+ printf("ERROR in read = %d = %s\n", framesRead,
+ AAudio_convertResultToText(framesRead));
+ } else {
+ framesRead = 0;
+ }
} else {
myData->framesReadTotal += framesRead;
}
@@ -149,8 +154,10 @@
int32_t totalFramesRead = 0;
do {
actualFramesRead = readFormattedData(myData, numFrames);
- if (actualFramesRead) {
+ if (actualFramesRead > 0) {
totalFramesRead += actualFramesRead;
+ } else if (actualFramesRead < 0) {
+ result = AAUDIO_CALLBACK_RESULT_STOP;
}
// Ignore errors because input stream may not be started yet.
} while (actualFramesRead > 0);
diff --git a/media/libstagefright/data/media_codecs_google_c2_telephony.xml b/media/libstagefright/data/media_codecs_google_c2_telephony.xml
new file mode 100644
index 0000000..d1055b3
--- /dev/null
+++ b/media/libstagefright/data/media_codecs_google_c2_telephony.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<Included>
+ <Decoders>
+ <MediaCodec name="c2.android.gsm.decoder" type="audio/gsm">
+ <Limit name="channel-count" max="1" />
+ <Limit name="sample-rate" ranges="8000" />
+ <Limit name="bitrate" range="13000" />
+ </MediaCodec>
+ </Decoders>
+</Included>
diff --git a/media/libstagefright/data/media_codecs_google_c2_tv.xml b/media/libstagefright/data/media_codecs_google_c2_tv.xml
new file mode 100644
index 0000000..fa082c7
--- /dev/null
+++ b/media/libstagefright/data/media_codecs_google_c2_tv.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<Included>
+ <Decoders>
+ <MediaCodec name="c2.android.mpeg2.decoder" type="video/mpeg2">
+ <!-- profiles and levels: ProfileMain : LevelHL -->
+ <Limit name="size" min="16x16" max="1920x1088" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="blocks-per-second" range="1-244800" />
+ <Limit name="bitrate" range="1-20000000" />
+ <Feature name="adaptive-playback" />
+ </MediaCodec>
+ </Decoders>
+</Included>
diff --git a/packages/MediaComponents/apex/java/android/media/session/MediaSession.java b/packages/MediaComponents/apex/java/android/media/session/MediaSession.java
index 73e16a6..3cbeff9 100644
--- a/packages/MediaComponents/apex/java/android/media/session/MediaSession.java
+++ b/packages/MediaComponents/apex/java/android/media/session/MediaSession.java
@@ -1077,8 +1077,7 @@
private static RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid,
ISessionControllerCallback caller) {
- return new RemoteUserInfo(packageName, pid, uid,
- caller != null ? caller.asBinder() : null);
+ return new RemoteUserInfo(packageName, pid, uid);
}
@Override
diff --git a/packages/MediaComponents/apex/java/android/service/media/MediaBrowserService.java b/packages/MediaComponents/apex/java/android/service/media/MediaBrowserService.java
index a66ec35..76c99b9 100644
--- a/packages/MediaComponents/apex/java/android/service/media/MediaBrowserService.java
+++ b/packages/MediaComponents/apex/java/android/service/media/MediaBrowserService.java
@@ -544,8 +544,7 @@
throw new IllegalStateException("This should be called inside of onGetRoot or"
+ " onLoadChildren or onLoadItem methods");
}
- return new RemoteUserInfo(mCurConnection.pkg, mCurConnection.pid, mCurConnection.uid,
- mCurConnection.callbacks.asBinder());
+ return new RemoteUserInfo(mCurConnection.pkg, mCurConnection.pid, mCurConnection.uid);
}
/**