[vlc-devel] [PATCH 1/2] demux: adaptive: add a method to check whether playlist can pause or not

Zhao Zhili quinkblack at foxmail.com
Fri Apr 13 05:30:18 CEST 2018


HLS PLAYLIST-TYPE event stream can pause, even though it's live stream.
---
 modules/demux/adaptive/PlaylistManager.cpp           | 4 +++-
 modules/demux/adaptive/PlaylistManager.h             | 1 +
 modules/demux/adaptive/playlist/AbstractPlaylist.cpp | 5 +++++
 modules/demux/adaptive/playlist/AbstractPlaylist.hpp | 1 +
 4 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/modules/demux/adaptive/PlaylistManager.cpp b/modules/demux/adaptive/PlaylistManager.cpp
index 81000a6..45d0263 100644
--- a/modules/demux/adaptive/PlaylistManager.cpp
+++ b/modules/demux/adaptive/PlaylistManager.cpp
@@ -74,6 +74,7 @@ PlaylistManager::PlaylistManager( demux_t *p_demux_,
     vlc_cond_init(&waitcond);
     vlc_mutex_init(&cached.lock);
     cached.b_live = false;
+    cached.b_canpause = true;
     cached.i_length = 0;
     cached.f_position = 0.0;
     cached.i_time = VLC_TS_INVALID;
@@ -542,7 +543,7 @@ int PlaylistManager::doControl(int i_query, va_list args)
         case DEMUX_SET_PAUSE_STATE:
         {
             vlc_mutex_locker locker(&cached.lock);
-            return cached.b_live ? VLC_EGENERIC : VLC_SUCCESS;
+            return cached.b_canpause ? VLC_SUCCESS : VLC_EGENERIC;
         }
 
         case DEMUX_GET_TIME:
@@ -730,6 +731,7 @@ void PlaylistManager::updateControlsContentType()
         cached.b_live = false;
         cached.i_length = getDuration();
     }
+    cached.b_canpause = playlist->canPause();
 }
 
 AbstractAdaptationLogic *PlaylistManager::createLogic(AbstractAdaptationLogic::LogicType type, AbstractConnectionManager *conn)
diff --git a/modules/demux/adaptive/PlaylistManager.h b/modules/demux/adaptive/PlaylistManager.h
index 27f2f57..454182d 100644
--- a/modules/demux/adaptive/PlaylistManager.h
+++ b/modules/demux/adaptive/PlaylistManager.h
@@ -121,6 +121,7 @@ namespace adaptive
             struct
             {
                 bool        b_live;
+                bool        b_canpause;
                 mtime_t     i_length;
                 mtime_t     i_time;
                 double      f_position;
diff --git a/modules/demux/adaptive/playlist/AbstractPlaylist.cpp b/modules/demux/adaptive/playlist/AbstractPlaylist.cpp
index c89527a..6dc3240 100644
--- a/modules/demux/adaptive/playlist/AbstractPlaylist.cpp
+++ b/modules/demux/adaptive/playlist/AbstractPlaylist.cpp
@@ -54,6 +54,11 @@ AbstractPlaylist::~AbstractPlaylist()
         delete(this->periods.at(i));
 }
 
+bool AbstractPlaylist::canPause() const
+{
+    return !isLive();
+}
+
 const std::vector<BasePeriod *>& AbstractPlaylist::getPeriods()
 {
     return periods;
diff --git a/modules/demux/adaptive/playlist/AbstractPlaylist.hpp b/modules/demux/adaptive/playlist/AbstractPlaylist.hpp
index 51cf19e..9a620fb 100644
--- a/modules/demux/adaptive/playlist/AbstractPlaylist.hpp
+++ b/modules/demux/adaptive/playlist/AbstractPlaylist.hpp
@@ -41,6 +41,7 @@ namespace adaptive
                 virtual ~AbstractPlaylist();
 
                 virtual bool                    isLive() const = 0;
+                virtual bool                    canPause() const;
                 void                            setType(const std::string &);
                 void                            setMinBuffering( mtime_t );
                 mtime_t                         getMinBuffering() const;
-- 
2.9.5





More information about the vlc-devel mailing list