diff --git a/src/media/video/sinkclient.cpp b/src/media/video/sinkclient.cpp
index 22b39207feb71646eed86543a0cc233e92aa3a7c..84d13c78a7f4f4d686ac5cfa0ec51573ecd08f63 100644
--- a/src/media/video/sinkclient.cpp
+++ b/src/media/video/sinkclient.cpp
@@ -353,10 +353,12 @@ SinkClient::setFrameSize(int width, int height)
         RING_WARN("Start sink <%s / %s>, size=%dx%d, mixer=%u",
                  getId().c_str(), openedName().c_str(), width, height, mixer_);
         emitSignal<DRing::VideoSignal::DecodingStarted>(getId(), openedName(), width, height, mixer_);
-    } else {
+        started_ = true;
+    } else if (started_) {
         RING_ERR("Stop sink <%s / %s>, mixer=%u",
                  getId().c_str(), openedName().c_str(), mixer_);
         emitSignal<DRing::VideoSignal::DecodingStopped>(getId(), openedName(), mixer_);
+        started_ = false;
     }
 }
 
diff --git a/src/media/video/sinkclient.h b/src/media/video/sinkclient.h
index 53577d644370df1b47899791edda67471f432006..b446422fa9900c6d0cfddc1907df9f8c6abafddb 100644
--- a/src/media/video/sinkclient.h
+++ b/src/media/video/sinkclient.h
@@ -65,6 +65,7 @@ class SinkClient : public VideoFramePassiveReader
     private:
         const std::string id_;
         const bool mixer_;
+        bool started_ {false}; // used to arbitrate client's stop signal.
         std::function<void(int, int)> target_;
         std::vector<unsigned char>* targetData_ {nullptr}; // filled by registerTarget, user owned