Merge "CCodec: skip first N longest work inside total delay"
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index 7a10e4c..ff2419d 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -1587,6 +1587,7 @@
mCCodecCallback(callback),
mNumInputSlots(kSmoothnessFactor),
mNumOutputSlots(kSmoothnessFactor),
+ mDelay(0),
mFrameIndex(0u),
mFirstValidFrameIndex(0u),
mMetaMode(MODE_NONE),
@@ -2134,11 +2135,13 @@
}
}
- mNumInputSlots =
- (inputDelay ? inputDelay.value : 0) +
- (pipelineDelay ? pipelineDelay.value : 0) +
- kSmoothnessFactor;
- mNumOutputSlots = (outputDelay ? outputDelay.value : 0) + kSmoothnessFactor;
+ uint32_t inputDelayValue = inputDelay ? inputDelay.value : 0;
+ uint32_t pipelineDelayValue = pipelineDelay ? pipelineDelay.value : 0;
+ uint32_t outputDelayValue = outputDelay ? outputDelay.value : 0;
+
+ mNumInputSlots = inputDelayValue + pipelineDelayValue + kSmoothnessFactor;
+ mNumOutputSlots = outputDelayValue + kSmoothnessFactor;
+ mDelay = inputDelayValue + pipelineDelayValue + outputDelayValue;
// TODO: get this from input format
bool secure = mComponent->getName().find(".secure") != std::string::npos;
@@ -2427,9 +2430,9 @@
{
Mutexed<PipelineWatcher>::Locked watcher(mPipelineWatcher);
- watcher->inputDelay(inputDelay ? inputDelay.value : 0)
- .pipelineDelay(pipelineDelay ? pipelineDelay.value : 0)
- .outputDelay(outputDelay ? outputDelay.value : 0)
+ watcher->inputDelay(inputDelayValue)
+ .pipelineDelay(pipelineDelayValue)
+ .outputDelay(outputDelayValue)
.smoothnessFactor(kSmoothnessFactor);
watcher->flush();
}
@@ -2846,7 +2849,11 @@
}
PipelineWatcher::Clock::duration CCodecBufferChannel::elapsed() {
- return mPipelineWatcher.lock()->elapsed(PipelineWatcher::Clock::now());
+ // When client pushed EOS, we want all the work to be done quickly.
+ // Otherwise, component may have stalled work due to input starvation up to
+ // the sum of the delay in the pipeline.
+ size_t n = mInputMetEos ? 0 : mDelay;
+ return mPipelineWatcher.lock()->elapsed(PipelineWatcher::Clock::now(), n);
}
void CCodecBufferChannel::setMetaMode(MetaMode mode) {
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.h b/media/codec2/sfplugin/CCodecBufferChannel.h
index 9dccab8..9ce886a 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.h
+++ b/media/codec2/sfplugin/CCodecBufferChannel.h
@@ -236,6 +236,7 @@
size_t mNumInputSlots;
size_t mNumOutputSlots;
+ size_t mDelay;
Mutexed<std::unique_ptr<InputBuffers>> mInputBuffers;
Mutexed<std::list<sp<ABuffer>>> mFlushedConfigs;
diff --git a/media/codec2/sfplugin/PipelineWatcher.cpp b/media/codec2/sfplugin/PipelineWatcher.cpp
index fe0a2c8..cdcc41b 100644
--- a/media/codec2/sfplugin/PipelineWatcher.cpp
+++ b/media/codec2/sfplugin/PipelineWatcher.cpp
@@ -127,19 +127,21 @@
}
PipelineWatcher::Clock::duration PipelineWatcher::elapsed(
- const PipelineWatcher::Clock::time_point &now) const {
- return std::accumulate(
- mFramesInPipeline.begin(),
- mFramesInPipeline.end(),
- Clock::duration::zero(),
- [&now](const Clock::duration ¤t,
- const decltype(mFramesInPipeline)::value_type &value) {
- Clock::duration elapsed = now - value.second.queuedAt;
- ALOGV("elapsed: frameIndex = %llu elapsed = %lldms",
- (unsigned long long)value.first,
- std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count());
- return current > elapsed ? current : elapsed;
- });
+ const PipelineWatcher::Clock::time_point &now, size_t n) const {
+ if (mFramesInPipeline.size() <= n) {
+ return Clock::duration::zero();
+ }
+ std::vector<Clock::duration> durations;
+ for (const decltype(mFramesInPipeline)::value_type &value : mFramesInPipeline) {
+ Clock::duration elapsed = now - value.second.queuedAt;
+ ALOGV("elapsed: frameIndex = %llu elapsed = %lldms",
+ (unsigned long long)value.first,
+ std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count());
+ durations.push_back(elapsed);
+ }
+ nth_element(durations.begin(), durations.end(), durations.begin() + n,
+ std::greater<Clock::duration>());
+ return durations[n];
}
} // namespace android
diff --git a/media/codec2/sfplugin/PipelineWatcher.h b/media/codec2/sfplugin/PipelineWatcher.h
index ce82298..1c127e4 100644
--- a/media/codec2/sfplugin/PipelineWatcher.h
+++ b/media/codec2/sfplugin/PipelineWatcher.h
@@ -54,7 +54,7 @@
void flush();
bool pipelineFull() const;
- Clock::duration elapsed(const Clock::time_point &now) const;
+ Clock::duration elapsed(const Clock::time_point &now, size_t n) const;
private:
uint32_t mInputDelay;