CCodec: read # of input/output slots from component
Bug: 112362633
Test: atest CtsMediaTestCases -- --module-arg CtsMediaTestCases:size:small
Change-Id: I019f638e897c0131788a117a2259bf664fd33a10
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index 432b8c0..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;
@@ -2135,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()) {
@@ -2148,7 +2163,7 @@
if (mDealer == nullptr) {
mDealer = new MemoryDealer(
align(capacity, MemoryDealer::getAllocationAlignment())
- * (kMinInputBufferArraySize + 1),
+ * (mNumInputSlots + 1),
"EncryptedLinearInputBuffers");
mDecryptDestination = mDealer->allocate((size_t)capacity);
}
@@ -2158,7 +2173,8 @@
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));
@@ -2173,7 +2189,7 @@
}
if (forceArrayMode) {
- *buffers = (*buffers)->toArrayMode(kMinInputBufferArraySize);
+ *buffers = (*buffers)->toArrayMode(mNumInputSlots);
}
}
@@ -2292,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));
@@ -2313,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;
@@ -2341,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();
@@ -2380,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;
{
@@ -2737,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;