1 /* 2 * AbstractAbstractPlaylist.cpp 3 ***************************************************************************** 4 * Copyright (C) 2010 - 2011 Klagenfurt University 5 * Copyright (C) 2015 VideoLAN and VLC authors 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU Lesser General Public License as published 9 * by the Free Software Foundation; either version 2.1 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public License 18 * along with this program; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. 20 *****************************************************************************/ 21 #ifdef HAVE_CONFIG_H 22 # include "config.h" 23 #endif 24 25 #include "AbstractPlaylist.hpp" 26 #include "../tools/Helper.h" 27 #include "BasePeriod.h" 28 #include "SegmentTimeline.h" 29 #include <vlc_common.h> 30 #include <vlc_stream.h> 31 32 #include <algorithm> 33 34 using namespace adaptive::playlist; 35 AbstractPlaylist(vlc_object_t * p_object_)36AbstractPlaylist::AbstractPlaylist (vlc_object_t *p_object_) : 37 ICanonicalUrl(), 38 p_object(p_object_) 39 { 40 playbackStart.Set(0); 41 availabilityStartTime.Set( 0 ); 42 availabilityEndTime.Set( 0 ); 43 duration.Set( 0 ); 44 minUpdatePeriod.Set( 2 * CLOCK_FREQ ); 45 maxSegmentDuration.Set( 0 ); 46 minBufferTime = 0; 47 maxBufferTime = 0; 48 timeShiftBufferDepth.Set( 0 ); 49 suggestedPresentationDelay.Set( 0 ); 50 b_needsUpdates = true; 51 } 52 ~AbstractPlaylist()53AbstractPlaylist::~AbstractPlaylist() 54 { 55 for(size_t i = 0; i < this->periods.size(); i++) 56 delete(this->periods.at(i)); 57 } 58 getPeriods()59const std::vector<BasePeriod *>& AbstractPlaylist::getPeriods() 60 { 61 return periods; 62 } 63 addBaseUrl(const std::string & url)64void AbstractPlaylist::addBaseUrl(const std::string &url) 65 { 66 baseUrls.push_back(url); 67 } 68 setPlaylistUrl(const std::string & url)69void AbstractPlaylist::setPlaylistUrl(const std::string &url) 70 { 71 playlistUrl = url; 72 } 73 setAvailabilityTimeOffset(mtime_t t)74void AbstractPlaylist::setAvailabilityTimeOffset(mtime_t t) 75 { 76 availabilityTimeOffset = t; 77 } 78 setAvailabilityTimeComplete(bool b)79void AbstractPlaylist::setAvailabilityTimeComplete(bool b) 80 { 81 availabilityTimeComplete = b; 82 } 83 getAvailabilityTimeOffset() const84mtime_t AbstractPlaylist::getAvailabilityTimeOffset() const 85 { 86 return availabilityTimeOffset.isSet() ? availabilityTimeOffset.value() : 0; 87 } 88 getAvailabilityTimeComplete() const89bool AbstractPlaylist::getAvailabilityTimeComplete() const 90 { 91 return !availabilityTimeComplete.isSet() || availabilityTimeComplete.value(); 92 } 93 addPeriod(BasePeriod * period)94void AbstractPlaylist::addPeriod(BasePeriod *period) 95 { 96 periods.push_back(period); 97 } 98 isLowLatency() const99bool AbstractPlaylist::isLowLatency() const 100 { 101 return false; 102 } 103 setType(const std::string & type_)104void AbstractPlaylist::setType(const std::string &type_) 105 { 106 type = type_; 107 } 108 setMinBuffering(mtime_t min)109void AbstractPlaylist::setMinBuffering( mtime_t min ) 110 { 111 minBufferTime = min; 112 } 113 setMaxBuffering(mtime_t max)114void AbstractPlaylist::setMaxBuffering( mtime_t max ) 115 { 116 maxBufferTime = max; 117 } 118 getMinBuffering() const119mtime_t AbstractPlaylist::getMinBuffering() const 120 { 121 return minBufferTime; 122 } 123 getMaxBuffering() const124mtime_t AbstractPlaylist::getMaxBuffering() const 125 { 126 return maxBufferTime; 127 } 128 getUrlSegment() const129Url AbstractPlaylist::getUrlSegment() const 130 { 131 Url ret; 132 133 if (!baseUrls.empty()) 134 ret = Url(baseUrls.front()); 135 136 if( !ret.hasScheme() && !playlistUrl.empty() ) 137 ret.prepend( Url(playlistUrl) ); 138 139 return ret; 140 } 141 getVLCObject() const142vlc_object_t * AbstractPlaylist::getVLCObject() const 143 { 144 return p_object; 145 } 146 getFirstPeriod()147BasePeriod* AbstractPlaylist::getFirstPeriod() 148 { 149 std::vector<BasePeriod *> periods = getPeriods(); 150 151 if( !periods.empty() ) 152 return periods.front(); 153 else 154 return NULL; 155 } 156 getNextPeriod(BasePeriod * period)157BasePeriod* AbstractPlaylist::getNextPeriod(BasePeriod *period) 158 { 159 std::vector<BasePeriod *> periods = getPeriods(); 160 161 for(size_t i = 0; i < periods.size(); i++) 162 { 163 if(periods.at(i) == period && (i + 1) < periods.size()) 164 return periods.at(i + 1); 165 } 166 167 return NULL; 168 } 169 needsUpdates() const170bool AbstractPlaylist::needsUpdates() const 171 { 172 return b_needsUpdates; 173 } 174 updateWith(AbstractPlaylist * updatedAbstractPlaylist)175void AbstractPlaylist::updateWith(AbstractPlaylist *updatedAbstractPlaylist) 176 { 177 availabilityEndTime.Set(updatedAbstractPlaylist->availabilityEndTime.Get()); 178 179 for(size_t i = 0; i < periods.size() && i < updatedAbstractPlaylist->periods.size(); i++) 180 periods.at(i)->updateWith(updatedAbstractPlaylist->periods.at(i)); 181 } 182 183