diff --git a/interfaces/inner_api/native/video_sink.h b/interfaces/inner_api/native/video_sink.h index 26f6b9cd5b1c135c8fb8e14e38aee12c38e6f796..0d745e20cd1f0aee6bf5c9262267a31c8d7c3a52 100644 --- a/interfaces/inner_api/native/video_sink.h +++ b/interfaces/inner_api/native/video_sink.h @@ -47,7 +47,6 @@ private: int64_t lastTimeStamp_ {HST_TIME_NONE}; int64_t lastBufferTime_ {HST_TIME_NONE}; int64_t deltaTimeAccu_ {0}; - bool forceRenderNextFrame_ {false}; VideoScaleType videoScaleType_ {VideoScaleType::VIDEO_SCALE_TYPE_FIT}; void CalcFrameRate(); @@ -58,6 +57,7 @@ private: int64_t firstPts_ {HST_TIME_NONE}; int64_t fixDelay_ {0}; bool seekFlag_{false}; + std::atomic lastFrameDropped_ {false}; }; } // namespace Pipeline } // namespace Media diff --git a/services/media_engine/modules/sink/video_sink.cpp b/services/media_engine/modules/sink/video_sink.cpp index 70b140d98bf4e3aa3ab9f005448b30ba75de3db6..c6dc5fd41802226019067e760f04b86bc4ae8c51 100644 --- a/services/media_engine/modules/sink/video_sink.cpp +++ b/services/media_engine/modules/sink/video_sink.cpp @@ -59,7 +59,6 @@ int64_t VideoSink::DoSyncWrite(const std::shared_ptr& buf { FALSE_RETURN_V(buffer != nullptr, false); int64_t waitTime = 0; - bool shouldDrop = false; bool render = true; if ((buffer->flag_ & BUFFER_FLAG_EOS) == 0) { auto syncCenter = syncCenter_.lock(); @@ -81,27 +80,19 @@ int64_t VideoSink::DoSyncWrite(const std::shared_ptr& buf render = syncCenter->UpdateTimeAnchor(nowCt + waitTime, latency, buffer->pts_ - firstPts_, buffer->pts_, buffer->duration_, this); } - if (forceRenderNextFrame_) { - shouldDrop = false; - forceRenderNextFrame_ = false; - } lastTimeStamp_ = buffer->pts_ - firstPts_; } else { MEDIA_LOG_I("Video sink EOS"); return -1; } - if (shouldDrop) { - discardFrameCnt_++; - MEDIA_LOG_DD("drop buffer with pts " PUBLIC_LOG_D64 " due to too late", buffer->pts_); - return -1; - } else if (!render) { - discardFrameCnt_++; - MEDIA_LOG_DD("drop buffer with pts " PUBLIC_LOG_D64 " due to seek not need to render", buffer->pts_); - return -1; - } else { + if ((render && waitTime >= 0) || lastFrameDropped_) { + lastFrameDropped_ = false; renderFrameCnt_++; - return waitTime; + return waitTime > 0 ? waitTime : 0; } + lastFrameDropped_ = true; + discardFrameCnt_++; + return -1; } void VideoSink::ResetSyncInfo()