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_)36 AbstractPlaylist::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()53 AbstractPlaylist::~AbstractPlaylist()
54 {
55     for(size_t i = 0; i < this->periods.size(); i++)
56         delete(this->periods.at(i));
57 }
58 
getPeriods()59 const std::vector<BasePeriod *>& AbstractPlaylist::getPeriods()
60 {
61     return periods;
62 }
63 
addBaseUrl(const std::string & url)64 void AbstractPlaylist::addBaseUrl(const std::string &url)
65 {
66     baseUrls.push_back(url);
67 }
68 
setPlaylistUrl(const std::string & url)69 void AbstractPlaylist::setPlaylistUrl(const std::string &url)
70 {
71     playlistUrl = url;
72 }
73 
setAvailabilityTimeOffset(mtime_t t)74 void AbstractPlaylist::setAvailabilityTimeOffset(mtime_t t)
75 {
76     availabilityTimeOffset = t;
77 }
78 
setAvailabilityTimeComplete(bool b)79 void AbstractPlaylist::setAvailabilityTimeComplete(bool b)
80 {
81     availabilityTimeComplete = b;
82 }
83 
getAvailabilityTimeOffset() const84 mtime_t AbstractPlaylist::getAvailabilityTimeOffset() const
85 {
86     return availabilityTimeOffset.isSet() ? availabilityTimeOffset.value() : 0;
87 }
88 
getAvailabilityTimeComplete() const89 bool AbstractPlaylist::getAvailabilityTimeComplete() const
90 {
91     return !availabilityTimeComplete.isSet() || availabilityTimeComplete.value();
92 }
93 
addPeriod(BasePeriod * period)94 void AbstractPlaylist::addPeriod(BasePeriod *period)
95 {
96     periods.push_back(period);
97 }
98 
isLowLatency() const99 bool AbstractPlaylist::isLowLatency() const
100 {
101     return false;
102 }
103 
setType(const std::string & type_)104 void AbstractPlaylist::setType(const std::string &type_)
105 {
106     type = type_;
107 }
108 
setMinBuffering(mtime_t min)109 void AbstractPlaylist::setMinBuffering( mtime_t min )
110 {
111     minBufferTime = min;
112 }
113 
setMaxBuffering(mtime_t max)114 void AbstractPlaylist::setMaxBuffering( mtime_t max )
115 {
116     maxBufferTime = max;
117 }
118 
getMinBuffering() const119 mtime_t AbstractPlaylist::getMinBuffering() const
120 {
121     return minBufferTime;
122 }
123 
getMaxBuffering() const124 mtime_t AbstractPlaylist::getMaxBuffering() const
125 {
126     return maxBufferTime;
127 }
128 
getUrlSegment() const129 Url 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() const142 vlc_object_t * AbstractPlaylist::getVLCObject() const
143 {
144     return p_object;
145 }
146 
getFirstPeriod()147 BasePeriod* 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)157 BasePeriod* 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() const170 bool AbstractPlaylist::needsUpdates() const
171 {
172     return b_needsUpdates;
173 }
174 
updateWith(AbstractPlaylist * updatedAbstractPlaylist)175 void 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