CCodec: declare queue stuck only at eos
Fix potential deadlock as well.
Bug: 111228351
Bug: 111139921
Test: Pause YouTube
Change-Id: Ied419955fa92de6a82aec79cc23ecf7f39fdcbe0
diff --git a/media/sfplugin/CCodec.cpp b/media/sfplugin/CCodec.cpp
index b7797dd..321bc21 100644
--- a/media/sfplugin/CCodec.cpp
+++ b/media/sfplugin/CCodec.cpp
@@ -487,8 +487,8 @@
{RenderedFrameInfo(mediaTimeUs, renderTimeNs)});
}
- void onWorkQueued() override {
- mCodec->onWorkQueued();
+ void onWorkQueued(bool eos) override {
+ mCodec->onWorkQueued(eos);
}
private:
@@ -1553,20 +1553,19 @@
mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
}
-void CCodec::onWorkQueued() {
+void CCodec::onWorkQueued(bool eos) {
ALOGV("queued work count +1 from %d", mQueuedWorkCount.load());
++mQueuedWorkCount;
- Mutexed<NamedTimePoint>::Locked deadline(mQueueDeadline);
- deadline->set(std::chrono::steady_clock::now() + 3s, "queue");
- CCodecWatchdog::getInstance()->watch(this);
+ if (eos) {
+ CCodecWatchdog::getInstance()->watch(this);
+ Mutexed<NamedTimePoint>::Locked deadline(mQueueDeadline);
+ deadline->set(std::chrono::steady_clock::now() + 3s, "queue");
+ }
}
void CCodec::subQueuedWorkCount(uint32_t count) {
ALOGV("queued work count -%u from %d", count, mQueuedWorkCount.load());
- if ((mQueuedWorkCount -= count) > 0) {
- Mutexed<NamedTimePoint>::Locked deadline(mQueueDeadline);
- deadline->set(std::chrono::steady_clock::now() + 3s, "queue");
- } else {
+ if ((mQueuedWorkCount -= count) == 0) {
Mutexed<NamedTimePoint>::Locked deadline(mQueueDeadline);
deadline->set(TimePoint::max(), "none");
}
diff --git a/media/sfplugin/CCodec.h b/media/sfplugin/CCodec.h
index 4d075ec..a63cf58 100644
--- a/media/sfplugin/CCodec.h
+++ b/media/sfplugin/CCodec.h
@@ -95,7 +95,7 @@
void setDeadline(const TimePoint &deadline, const char *name);
- void onWorkQueued();
+ void onWorkQueued(bool eos);
void subQueuedWorkCount(uint32_t count);
enum {
diff --git a/media/sfplugin/CCodecBufferChannel.cpp b/media/sfplugin/CCodecBufferChannel.cpp
index 6b83978..fd3e87d 100644
--- a/media/sfplugin/CCodecBufferChannel.cpp
+++ b/media/sfplugin/CCodecBufferChannel.cpp
@@ -1322,7 +1322,7 @@
c2_status_t err = mComponent->queue(&items);
if (err == C2_OK && eos && buffer->size() > 0u) {
- mCCodecCallback->onWorkQueued();
+ mCCodecCallback->onWorkQueued(false);
work.reset(new C2Work);
work->input.ordinal.timestamp = timeUs;
work->input.ordinal.frameIndex = mFrameIndex++;
@@ -1334,7 +1334,7 @@
err = mComponent->queue(&items);
}
if (err == C2_OK) {
- mCCodecCallback->onWorkQueued();
+ mCCodecCallback->onWorkQueued(eos);
}
feedInputBufferIfAvailableInternal();
diff --git a/media/sfplugin/CCodecBufferChannel.h b/media/sfplugin/CCodecBufferChannel.h
index 952f3fc..92150f8 100644
--- a/media/sfplugin/CCodecBufferChannel.h
+++ b/media/sfplugin/CCodecBufferChannel.h
@@ -42,7 +42,7 @@
virtual ~CCodecCallback() = default;
virtual void onError(status_t err, enum ActionCode actionCode) = 0;
virtual void onOutputFramesRendered(int64_t mediaTimeUs, nsecs_t renderTimeNs) = 0;
- virtual void onWorkQueued() = 0;
+ virtual void onWorkQueued(bool eos) = 0;
};
/**