Merge branch: resolve text sync issue 47/269547/1
authorJeongyoon Nam <just.nam@samsung.com>
Tue, 18 Jan 2022 06:13:13 +0000 (15:13 +0900)
committerJeongyoon Nam <just.nam@samsung.com>
Tue, 18 Jan 2022 06:27:39 +0000 (15:27 +0900)
Change-Id: Ic43ef5c34f472f4d5a86e23ca038336c7528c9ae

packaging/libtrackrenderer.spec
src/include_internal/trackrenderer/core/decoderinputbuffer.h
src/include_internal/trackrenderer/trackrenderer.h
src/trackrenderer.cpp

index d281f4ed25a4e203bccd29b051229bce3371b7f8..31f1d46765587b8bae8926775772ca08a9210186 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libtrackrenderer
 Summary:    new multimedia streaming player trackrenderer
-Version:    0.0.4
+Version:    0.0.5
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 879afb871c9cbfcae357b466f947f45cf8954d25..df65b82ca4999a0c6aed4df1dbd2c102c940055d 100644 (file)
@@ -78,7 +78,7 @@ class DecoderInputBuffer : private boost::noncopyable {
     if (buffer) {
       buffer_ = incref_ ? gst_buffer_ref(buffer) : buffer;
       duration_ = GST_TIME_AS_MSECONDS(GST_BUFFER_DURATION(buffer_));
-         if (caps)
+      if (caps)
         caps_ = incref_ ? gst_caps_ref(caps) : caps;
       if (type == kTrackTypeSubtitle) {
         GstMapInfo info;
index 9ab4b9e72535fe394a91d15d4ab15122e20cf0c5..a5117b24ffc6ae9cedb41f92ee6b2c7e5357c395 100644 (file)
@@ -323,6 +323,9 @@ class TrackRenderer : public ResourceConflictListener,
   std::mutex resource_m_;
   std::condition_variable resource_cv_;
 
+  std::mutex start_time_m_;
+  std::condition_variable start_time_cv_;
+
   std::unique_ptr<ResourceManager> resource_manager_;
   std::unique_ptr<Display> display_;
 
index 2958e95a98e89f8a3451f34491385a6985c53056..50ba70028be2851c38496d3ee2690fd92e0fefe9 100644 (file)
@@ -458,7 +458,10 @@ bool TrackRenderer::Start() {
 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;
@@ -586,6 +589,7 @@ bool TrackRenderer::Prepare() {
 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_) {
@@ -944,8 +948,11 @@ bool TrackRenderer::SubmitPacket(const DecoderInputBufferPtr& data,
   }
 
   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;
@@ -1641,6 +1648,7 @@ GstBusSyncReply TrackRenderer::GstBusSyncHandlerCb_(GstBus* bus,
     }
     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
@@ -1962,6 +1970,13 @@ GstPadProbeReturn TrackRenderer::GstPadProbeAppsrcEventCb_(GstPad* pad,
     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");