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;
 };
 
 /**