From: Gilbok Lee Date: Wed, 29 Nov 2023 08:25:27 +0000 (+0900) Subject: Support time unit type (millisecond, microsecond) X-Git-Tag: accepted/tizen/unified/20231205.171421~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F04%2F302004%2F5;p=platform%2Fcore%2Fmultimedia%2Ftrackrenderer.git Support time unit type (millisecond, microsecond) Change-Id: I58ca4a3652b28d404bbfa84face146d29cd39a87 --- diff --git a/packaging/libtrackrenderer.spec b/packaging/libtrackrenderer.spec index bb64b12..38ff4e6 100644 --- a/packaging/libtrackrenderer.spec +++ b/packaging/libtrackrenderer.spec @@ -1,6 +1,6 @@ Name: libtrackrenderer Summary: new multimedia streaming player trackrenderer -Version: 0.0.50 +Version: 0.0.51 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include_internal/trackrenderer/trackrenderer.h b/src/include_internal/trackrenderer/trackrenderer.h index ba03166..8afac69 100644 --- a/src/include_internal/trackrenderer/trackrenderer.h +++ b/src/include_internal/trackrenderer/trackrenderer.h @@ -107,10 +107,10 @@ class TrackRenderer : public ResourceConflictListener, bool SetTrack(const std::vector& trackinfo); void SetIniProperty(const std::map& Properties); void SetIniElement(const std::map& elements); - bool Seek(uint64_t time_millisecond, double playback_rate); - bool Seek(uint64_t time_millisecond, double playback_rate, bool audio_mute); + bool Seek(uint64_t time, double playback_rate); + bool Seek(uint64_t time, double playback_rate, bool audio_mute); bool SetPlaybackRate(double playback_rate, bool audio_mute); - bool GetPlayingTime(uint64_t* curtime_in_msec); + bool GetPlayingTime(uint64_t* curtime); bool GetDroppedFrames(void* frame_counts); bool GetDroppedFramesForCatchup(TrackType type, void* frame_counts); bool Deactivate(TrackType type); @@ -204,6 +204,11 @@ class TrackRenderer : public ResourceConflictListener, kPlaying, }; + enum class TimeUnit { + kMs, + kUs, + }; + struct TrackContext { int index = kInvalidTrackIndex; bool is_enough_data = false; @@ -328,6 +333,7 @@ class TrackRenderer : public ResourceConflictListener, bool SetUnlimitedMaxBufferMode_(const boost::any& value); bool SetVideoPreDisplayMode_(const boost::any& value); bool SetStartRenderingTime_(const boost::any& value); + bool SetPlayerTimeUnitType_(const boost::any& value); void CompleteSeeking_(void); bool HasSubtitleOnly_() const; bool ActivateAudioPipeline(GstCaps* caps); @@ -335,6 +341,10 @@ class TrackRenderer : public ResourceConflictListener, void EnableVideoHole_(); void ApplySoundStreamInfo_(); + const char* ConvertTimeUnitToString_(); + gint64 ConvertTimeUnitToNS_(uint64_t time); + uint64_t ConvertNsToTimeUnit_(gint64 time); + private: EventListener* eventlistener_ = nullptr; // eventlistener is Defaultplayer std::mutex resource_m_; @@ -384,6 +394,8 @@ class TrackRenderer : public ResourceConflictListener, std::map config_setter_table_; int64_t start_time = -1; + TimeUnit time_unit_type_ = TimeUnit::kMs; + private: static const Attributes kAttributes_; static const AttributesByElement kAttributesByElem_; diff --git a/src/include_internal/trackrenderer/trackrenderer_attr.h b/src/include_internal/trackrenderer/trackrenderer_attr.h index 629f113..149c76c 100644 --- a/src/include_internal/trackrenderer/trackrenderer_attr.h +++ b/src/include_internal/trackrenderer/trackrenderer_attr.h @@ -62,6 +62,7 @@ constexpr char ConfigNameWindowStandAloneMode[] = "window-stand-alone-mode"; constexpr char ConfigNameUnlimitedMaxBufferMode[] = "unlimited-max-buffer-mode"; constexpr char ConfigNameVideoPreDisplayMode[] = "video-pre-display-mode"; constexpr char ConfigNameStartRenderingTime[] = "start-rendering-time"; +constexpr char ConfigNamePlayerTimeUnitType[] = "player-time-unit-type"; struct TrackRendererAttrInfo { const ValueType value_type; @@ -118,7 +119,8 @@ static const std::map kConfigInfoTable = { {ConfigNameWindowStandAloneMode, ValueType::kUInt32}, {ConfigNameUnlimitedMaxBufferMode, ValueType::kUInt32}, {ConfigNameVideoPreDisplayMode, ValueType::kUInt32}, - {ConfigNameStartRenderingTime, ValueType::kUInt64}}; + {ConfigNameStartRenderingTime, ValueType::kUInt64}, + {ConfigNamePlayerTimeUnitType, ValueType::kUInt32}}; } // namespace trackrenderer diff --git a/src/trackrenderer.cpp b/src/trackrenderer.cpp index 9c50ec6..7faa10b 100644 --- a/src/trackrenderer.cpp +++ b/src/trackrenderer.cpp @@ -89,25 +89,6 @@ namespace internal { enum class TrackEncryptionUnit { kNone, kTs, kEs }; -void TvplusPerformanceLogs() { - FILE* fp = NULL; - const char* TVPLUS_POPUP_LOG_FILE_NAME = "/tmp/play_log.txt"; - TRACKRENDERER_DEBUG("~~~~~~~~~~~~~ [PROFILING LOG ON] ~~~~~~~~~~~~~~~~"); - if ((fp = fopen(TVPLUS_POPUP_LOG_FILE_NAME, "a+")) != NULL) { - struct timespec tp; - char unmute[30]; - clock_gettime(CLOCK_MONOTONIC, &tp); - snprintf(unmute, 30, "[um:%d.%d]", (int)tp.tv_sec, - (int)tp.tv_nsec / 10000000); - fprintf(fp, "%s", unmute); - chmod(TVPLUS_POPUP_LOG_FILE_NAME, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - fclose(fp); - TRACKRENDERER_DEBUG("~~~~~~~~~~~~~ file write passed ~~~~~~~~~~~~~~~"); - } else { - TRACKRENDERER_DEBUG("~~~~~~~~~~~~~ file write failed ~~~~~~~~~~~~~~~~"); - } -} - inline bool IsPcmMimeType(const std::string& mimetype) { return (mimetype.find("audio/x-raw") != std::string::npos); } @@ -498,9 +479,7 @@ bool TrackRenderer::Start() { if (state_ < State::kWorking) return false; target_substate_ = SubState::kPlaying; pipeline_->SetState(Elements::kPipeline, GST_STATE_PLAYING); -#if 0 - internal::TvplusPerformanceLogs(); -#endif + if (internal::GetIniValue(properties_, "generate_dot")) pipeline_->GenerateDot("plusplayer_trackrenderer_start"); @@ -670,7 +649,7 @@ void TrackRenderer::SetIniElement( } } -bool TrackRenderer::Seek(uint64_t time_millisecond, +bool TrackRenderer::Seek(uint64_t time, double playback_rate) { TRACKRENDERER_ENTER; std::lock_guard lk(resource_m_); @@ -704,9 +683,10 @@ bool TrackRenderer::Seek(uint64_t time_millisecond, "async", async); } - TRACKRENDERER_INFO("target %" PRIu64 " ms rate [%lf]", time_millisecond, - playback_rate); - gint64 start = time_millisecond * GST_MSECOND, stop = GST_CLOCK_TIME_NONE; + gint64 start = ConvertTimeUnitToNS_(time), stop = GST_CLOCK_TIME_NONE; + TRACKRENDERER_INFO("[%p] > target %" PRIu64 " %s rate [%lf]", this, time, + ConvertTimeUnitToString_(), playback_rate); + if (playback_rate < 0) { stop = start; start = 0; @@ -720,7 +700,7 @@ bool TrackRenderer::Seek(uint64_t time_millisecond, if (!pipeline_->Seek(playback_rate, GST_FORMAT_TIME, (GstSeekFlags)flags, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop)) { - TRACKRENDERER_ERROR("Fail to seek to [%" PRIu64 "] ms", time_millisecond); + TRACKRENDERER_ERROR_P(this, "Fail to seek"); } is_seeking_ = true; @@ -736,7 +716,7 @@ bool TrackRenderer::Seek(uint64_t time_millisecond, return true; } -bool TrackRenderer::Seek(uint64_t time_millisecond, +bool TrackRenderer::Seek(uint64_t time, double playback_rate, bool audio_mute) { TRACKRENDERER_ENTER; std::lock_guard lk(resource_m_); @@ -757,12 +737,19 @@ bool TrackRenderer::Seek(uint64_t time_millisecond, else flags |= GST_SEEK_FLAG_KEY_UNIT; - TRACKRENDERER_INFO("target %" PRIu64 " ms rate [%lf] mute [%d]", time_millisecond, - playback_rate, audio_mute); - if (!pipeline_->Seek(playback_rate, GST_FORMAT_TIME, (GstSeekFlags)flags, GST_SEEK_TYPE_SET, - time_millisecond * GST_MSECOND, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { - TRACKRENDERER_ERROR("Fail to seek to [%" PRIu64 "] ms", time_millisecond); + auto convert_time = ConvertTimeUnitToNS_(time); + + TRACKRENDERER_INFO("[%p] > target %" PRIu64 " %s rate [%lf] mute [%d]", + this, convert_time, ConvertTimeUnitToString_(), + playback_rate, audio_mute); + if (!pipeline_->Seek(playback_rate, GST_FORMAT_TIME, + (GstSeekFlags)(GST_SEEK_FLAG_FLUSH), GST_SEEK_TYPE_SET, + convert_time, GST_SEEK_TYPE_NONE, + GST_CLOCK_TIME_NONE)) { + TRACKRENDERER_ERROR("[%p] > Fail to seek to [%" PRIu64 "] %s", + this, convert_time, ConvertTimeUnitToString_()); } + is_seeking_ = true; for (int i = 0; i < kTrackTypeMax; ++i) { @@ -1697,7 +1684,9 @@ gboolean TrackRenderer::GstSeekDataCb_(GstElement* element, guint64 offset, if (type == kTrackTypeSubtitle) return true; - trackrenderer->eventlistener_->OnSeekData(type, offset / GST_MSECOND); + trackrenderer->eventlistener_->OnSeekData(type, + trackrenderer->ConvertNsToTimeUnit_(static_cast(offset))); + TRACKRENDERER_LEAVE; return true; } @@ -2266,31 +2255,33 @@ ERROR: return false; } -bool TrackRenderer::GetPlayingTime(uint64_t* curtime_in_msec) { +bool TrackRenderer::GetPlayingTime(uint64_t* curtime) { std::lock_guard lk(resource_m_); if (state_ == State::kStopped) return false; if (state_ == State::kResourceConflicted) { - *curtime_in_msec = last_position_; + *curtime = last_position_; return true; } if (!pipeline_) return false; - GetPlayingTime_(curtime_in_msec); + GetPlayingTime_(curtime); return true; } -bool TrackRenderer::GetPlayingTime_(uint64_t* curtime_in_msec) { +bool TrackRenderer::GetPlayingTime_(uint64_t* curtime) { int64_t pos_video = 0, pos_audio = 0; bool ret_video = pipeline_->QueryPosition(Elements::kSinkVideo, GST_FORMAT_TIME, &pos_video); bool ret_audio = pipeline_->QueryPosition(Elements::kSinkAudio, GST_FORMAT_TIME, &pos_audio); - if (ret_video || ret_audio) - last_position_ = *curtime_in_msec = pos_audio > pos_video - ? (pos_audio / GST_MSECOND) - : (pos_video / GST_MSECOND); - else - *curtime_in_msec = last_position_; - // TRACKRENDERER_INFO("playing time [%" PRIu64 " ms]", *curtime_in_msec); + if (ret_video || ret_audio) { + last_position_ = *curtime = pos_audio > pos_video + ? (ConvertNsToTimeUnit_(pos_audio)) + : (ConvertNsToTimeUnit_(pos_video)); + } else { + *curtime = last_position_; + } + // TRACKRENDERER_INFO("playing time [%" PRIu64 " %s]", + // *curtime, ConvertTimeUnitToString_()); return true; } @@ -2674,6 +2665,8 @@ void TrackRenderer::InitConfigSetterTable_() { &TrackRenderer::SetVideoPreDisplayMode_, this, std::placeholders::_1); config_setter_table_[ConfigNameStartRenderingTime] = std::bind( &TrackRenderer::SetStartRenderingTime_, this, std::placeholders::_1); + config_setter_table_[ConfigNamePlayerTimeUnitType] = std::bind( + &TrackRenderer::SetPlayerTimeUnitType_, this, std::placeholders::_1); } bool TrackRenderer::SetAccurateSeekMode_(const boost::any& value) { @@ -2721,6 +2714,17 @@ bool TrackRenderer::SetStartRenderingTime_(const boost::any& value) { return true; } +bool TrackRenderer::SetPlayerTimeUnitType_(const boost::any& value) { + std::uint32_t val = boost::any_cast(value); + TRACKRENDERER_ERROR_P(this, " PlayerTimeUnitType [%s]", + (val == 0) ? "Ms" : "Us"); + if (val == 0) + time_unit_type_ = TimeUnit::kMs; + else if (val == 1) + time_unit_type_ = TimeUnit::kUs; + return true; +} + void TrackRenderer::GstElementLowLatency_(const TrackType& type) { if (low_latency_mode_ == static_cast(LowLatencyMode::kLowLatencyModeNone)) @@ -3063,6 +3067,22 @@ void TrackRenderer::EnableVideoHole_() { } } +const char* TrackRenderer::ConvertTimeUnitToString_() { + return time_unit_type_ == TimeUnit::kUs ? "us" : "ms"; +} + +gint64 TrackRenderer::ConvertTimeUnitToNS_(uint64_t time) { + return time_unit_type_ == TimeUnit::kUs ? + static_cast(time * GST_USECOND) : + static_cast(time * GST_MSECOND); +} + +uint64_t TrackRenderer::ConvertNsToTimeUnit_(gint64 time) { + return time_unit_type_ == TimeUnit::kUs ? + static_cast(time / GST_USECOND) : + static_cast(time / GST_MSECOND); +} + } // namespace trackrenderer } // namespace plusplayer diff --git a/src/trackrenderer_capi.cpp b/src/trackrenderer_capi.cpp index a3300ae..5201578 100644 --- a/src/trackrenderer_capi.cpp +++ b/src/trackrenderer_capi.cpp @@ -531,22 +531,22 @@ void trackrenderer_set_ini_element(TrackRendererHandle handle, } int trackrenderer_seek(TrackRendererHandle handle, - unsigned long long time_millisecond, + unsigned long long time, double playback_rate) { auto priv = static_cast(handle); if (!priv) return kFailed; - if (priv->renderer->Seek(time_millisecond, playback_rate) == false) { + if (priv->renderer->Seek(time, playback_rate) == false) { return kFailed; } return kSuccess; } int trackrenderer_seek2(TrackRendererHandle handle, - unsigned long long time_millisecond, + unsigned long long time, double playback_rate, bool audio_mute) { auto priv = static_cast(handle); if (!priv) return kFailed; - if (priv->renderer->Seek(time_millisecond, playback_rate, audio_mute) == + if (priv->renderer->Seek(time, playback_rate, audio_mute) == false) { return kFailed; }