]> git.sesse.net Git - vlc/blob - modules/demux/dash/adaptationlogic/AbstractAdaptationLogic.cpp
demux: dash: move everything under demux/
[vlc] / modules / demux / dash / adaptationlogic / AbstractAdaptationLogic.cpp
1 /*
2  * AbstractAdaptationLogic.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 "AbstractAdaptationLogic.h"
29
30 using namespace dash::logic;
31 using namespace dash::mpd;
32 using namespace dash::http;
33
34 AbstractAdaptationLogic::AbstractAdaptationLogic    (MPD *mpd_) :
35                          mpd                        (mpd_),
36                          currentPeriod              (mpd->getFirstPeriod())
37 {
38     reset();
39 }
40
41 AbstractAdaptationLogic::~AbstractAdaptationLogic   ()
42 {
43 }
44
45 void AbstractAdaptationLogic::reset()
46 {
47     count = 0;
48     prevRepresentation = NULL;
49 }
50
51 Chunk*  AbstractAdaptationLogic::getNextChunk(Streams::Type type)
52 {
53     if(!currentPeriod)
54         return NULL;
55
56     Representation *rep;
57
58     if(prevRepresentation && !prevRepresentation->canBitswitch())
59         rep = prevRepresentation;
60     else
61         rep = getCurrentRepresentation(type);
62
63     if ( rep == NULL )
64             return NULL;
65
66     bool reinit = count && (rep != prevRepresentation);
67     prevRepresentation = rep;
68
69     std::vector<ISegment *> segments = rep->getSegments();
70     ISegment *first = segments.empty() ? NULL : segments.front();
71
72     if (reinit && first && first->getClassId() == InitSegment::CLASSID_INITSEGMENT)
73         return first->toChunk(count, rep);
74
75     bool b_templated = (first && !first->isSingleShot());
76
77     if (count == segments.size() && !b_templated)
78     {
79         currentPeriod = mpd->getNextPeriod(currentPeriod);
80         reset();
81         return getNextChunk(type);
82     }
83
84     ISegment *seg = NULL;
85     if ( segments.size() > count )
86     {
87         seg = segments.at( count );
88     }
89     else if(b_templated)
90     {
91         seg = segments.back();
92     }
93
94     if(seg)
95     {
96         Chunk *chunk = seg->toChunk(count, rep);
97         count++;
98         seg->done();
99         return chunk;
100     }
101     return NULL;
102 }
103
104 void AbstractAdaptationLogic::updateDownloadRate    (size_t, mtime_t)
105 {
106 }