bool TrackRenderer::Stop() {
TRACKRENDERER_ENTER;
std::lock_guard<std::mutex> lk(resource_m_);
+
+ start_time_cv_.notify_one();
resource_cv_.notify_one();
+
if (state_ == State::kStopped) {
TRACKRENDERER_LEAVE;
return true;
bool TrackRenderer::Pause() {
TRACKRENDERER_ENTER;
std::lock_guard<std::mutex> lk(resource_m_);
+
if (state_ == State::kStopped) return false;
if (state_ == State::kResourceConflicted) return true;
if (!pipeline_) {
}
GstBuffer* buffer = data->Release();
- if (start_time == -1 && type != kTrackTypeSubtitle)
+ if (start_time == -1 && type != kTrackTypeSubtitle) {
start_time = GST_BUFFER_TIMESTAMP(buffer);
+ TRACKRENDERER_DEBUG("update start time [%d][%" GST_TIME_FORMAT "]", type, GST_TIME_ARGS(start_time));
+ start_time_cv_.notify_one();
+ }
pipeline_->AppSrcPushBuffer(element, buffer);
submitstate = SubmitStatus::kSuccess;
}
case GST_MESSAGE_ERROR: {
TRACKRENDERER_ERROR("GST_MESSAGE_ERROR");
+ trackrenderer->start_time_cv_.notify_one();
trackrenderer->resource_cv_.notify_one();
bool is_music_content =
trackrenderer->trackctx_[kTrackTypeVideo].index != kInvalidTrackIndex
return GST_PAD_PROBE_PASS;
}
+ if (trackrenderer->start_time == -1) {
+ TRACKRENDERER_INFO("start time is not updated yet, wait");
+ std::unique_lock<std::mutex> lock(trackrenderer->start_time_m_);
+ trackrenderer->start_time_cv_.wait(lock);
+ TRACKRENDERER_INFO("start time is updated");
+ }
+
gst_event_copy_segment(event, &segment);
if (segment.format != GST_FORMAT_TIME) {
TRACKRENDERER_WARN("segment format is not GST_FORMAT_TIME");