c0cd4326bbb96ec0ef1519bab360dc5ef5eaa507
[vlc.git] / modules / demux / dash / mpd / MPD.cpp
1 /*
2  * MPD.cpp
3  *****************************************************************************
4  * Copyright (C) 2010 - 2011 Klagenfurt University
5  *
6  * Created on: Aug 10, 2010
7  * Authors: Christopher Mueller <christopher.mueller@itec.uni-klu.ac.at>
8  *          Christian Timmerer  <christian.timmerer@itec.uni-klu.ac.at>
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU Lesser General Public License as published
12  * by the Free Software Foundation; either version 2.1 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include "MPD.h"
29 #include "Helper.h"
30 #include "dash.hpp"
31 #include <vlc_common.h>
32 #include <vlc_stream.h>
33
34 using namespace dash::mpd;
35
36 MPD::MPD (stream_t *stream_, Profile profile_) :
37     ICanonicalUrl(),
38     stream(stream_),
39     profile( profile_ )
40 {
41     playbackStart.Set(0);
42     availabilityStartTime.Set( 0 );
43     availabilityEndTime.Set( 0 );
44     duration.Set( 0 );
45     minUpdatePeriod.Set( 0 );
46     minBufferTime.Set( 0 );
47     timeShiftBufferDepth.Set( 0 );
48     programInfo.Set( NULL );
49 }
50
51 MPD::~MPD   ()
52 {
53     for(size_t i = 0; i < this->periods.size(); i++)
54         delete(this->periods.at(i));
55
56     for(size_t i = 0; i < this->baseUrls.size(); i++)
57         delete(this->baseUrls.at(i));
58
59     delete(programInfo.Get());
60 }
61
62 const std::vector<Period*>&    MPD::getPeriods             () const
63 {
64     return this->periods;
65 }
66
67 void                    MPD::addBaseUrl             (BaseUrl *url)
68 {
69     this->baseUrls.push_back(url);
70 }
71 void                    MPD::addPeriod              (Period *period)
72 {
73     this->periods.push_back(period);
74 }
75
76 bool                    MPD::isLive() const
77 {
78     if(type.empty())
79     {
80         Profile live(Profile::ISOLive);
81         return profile == live;
82     }
83     else
84         return (type != "static");
85 }
86
87 void MPD::setType(const std::string &type_)
88 {
89     type = type_;
90 }
91
92 Profile MPD::getProfile() const
93 {
94     return profile;
95 }
96 Url MPD::getUrlSegment() const
97 {
98     if (!baseUrls.empty())
99         return Url(baseUrls.front()->getUrl());
100     else
101     {
102         std::stringstream ss;
103         ss << stream->psz_access << "://" << Helper::getDirectoryPath(stream->psz_path) << "/";
104         return Url(ss.str());
105     }
106 }
107
108 vlc_object_t * MPD::getVLCObject() const
109 {
110     return VLC_OBJECT(stream);
111 }
112
113 Period* MPD::getFirstPeriod() const
114 {
115     std::vector<Period *> periods = getPeriods();
116
117     if( !periods.empty() )
118         return periods.front();
119     else
120         return NULL;
121 }
122
123 Period* MPD::getNextPeriod(Period *period)
124 {
125     std::vector<Period *> periods = getPeriods();
126
127     for(size_t i = 0; i < periods.size(); i++)
128     {
129         if(periods.at(i) == period && (i + 1) < periods.size())
130             return periods.at(i + 1);
131     }
132
133     return NULL;
134 }