diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index 048f98e4..9d224ac2 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -64,19 +64,31 @@ void MediaSink::resetTracks() { void MediaSink::inputFrame(const Frame::Ptr &frame) { lock_guard lck(_mtx); - auto codec_id = frame->getCodecId(); - auto it = _track_map.find(codec_id); + auto it = _track_map.find(frame->getCodecId()); if (it == _track_map.end()) { return; } it->second->inputFrame(frame); + checkTrackIfReady(it->second); +} - if(!_allTrackReady && !_trackReadyCallback.empty() && it->second->ready()){ - //Track由未就绪状态转换成就绪状态,我们就触发onTrackReady回调 - auto it_callback = _trackReadyCallback.find(codec_id); - if(it_callback != _trackReadyCallback.end()){ - it_callback->second(); - _trackReadyCallback.erase(it_callback); +void MediaSink::checkTrackIfReady_l(const Track::Ptr &track){ + //Track由未就绪状态转换成就绪状态,我们就触发onTrackReady回调 + auto it_callback = _trackReadyCallback.find(track->getCodecId()); + if (it_callback != _trackReadyCallback.end() && track->ready()) { + it_callback->second(); + _trackReadyCallback.erase(it_callback); + } +} + +void MediaSink::checkTrackIfReady(const Track::Ptr &track){ + if (!_allTrackReady && !_trackReadyCallback.empty()) { + if (track) { + checkTrackIfReady_l(track); + } else { + for (auto &pr : _track_map) { + checkTrackIfReady_l(pr.second); + } } } @@ -107,8 +119,11 @@ void MediaSink::inputFrame(const Frame::Ptr &frame) { } void MediaSink::addTrackCompleted(){ - lock_guard lck(_mtx); - _max_track_size = _track_map.size(); + { + lock_guard lck(_mtx); + _max_track_size = _track_map.size(); + } + checkTrackIfReady(nullptr); } void MediaSink::emitAllTrackReady() { diff --git a/src/Common/MediaSink.h b/src/Common/MediaSink.h index 02bf1460..c948aaa1 100644 --- a/src/Common/MediaSink.h +++ b/src/Common/MediaSink.h @@ -121,6 +121,12 @@ private: * 触发onAllTrackReady事件 */ void emitAllTrackReady(); + + /** + * 检查track是否准备完毕 + */ + void checkTrackIfReady(const Track::Ptr &track); + void checkTrackIfReady_l(const Track::Ptr &track); private: mutable recursive_mutex _mtx; map _track_map;