[vlc-devel] [PATCH 12/17] dash: added isoffmainparser
Christopher at mailsrv.uni-klu.ac.at
Christopher at mailsrv.uni-klu.ac.at
Mon Jan 30 14:48:30 CET 2012
From: Christopher Mueller <christopher.mueller at itec.aau.at>
---
modules/stream_filter/dash/mpd/IsoffMainParser.cpp | 222 ++++++++++++++++++++
modules/stream_filter/dash/mpd/IsoffMainParser.h | 79 +++++++
2 files changed, 301 insertions(+), 0 deletions(-)
create mode 100644 modules/stream_filter/dash/mpd/IsoffMainParser.cpp
create mode 100644 modules/stream_filter/dash/mpd/IsoffMainParser.h
diff --git a/modules/stream_filter/dash/mpd/IsoffMainParser.cpp b/modules/stream_filter/dash/mpd/IsoffMainParser.cpp
new file mode 100644
index 0000000..4662a15
--- /dev/null
+++ b/modules/stream_filter/dash/mpd/IsoffMainParser.cpp
@@ -0,0 +1,222 @@
+/*
+ * IsoffMainParser.cpp
+ *****************************************************************************
+ * Copyright (C) 2010 - 2012 Klagenfurt University
+ *
+ * Created on: Jan 27, 2012
+ * Authors: Christopher Mueller <christopher.mueller at itec.uni-klu.ac.at>
+ * Christian Timmerer <christian.timmerer at itec.uni-klu.ac.at>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#include "IsoffMainParser.h"
+
+using namespace dash::mpd;
+using namespace dash::xml;
+
+IsoffMainParser::IsoffMainParser (Node *root, stream_t *p_stream) :
+ root (root),
+ p_stream (p_stream),
+ mpd (NULL)
+{
+}
+IsoffMainParser::~IsoffMainParser ()
+{
+}
+
+bool IsoffMainParser::parse ()
+{
+ this->mpd = new MPD();
+
+ this->setMPDAttributes();
+ this->setMPDBaseUrl();
+ this->setPeriods();
+
+ return true;
+}
+MPD* IsoffMainParser::getMPD ()
+{
+ return this->mpd;
+}
+void IsoffMainParser::setMPDAttributes ()
+{
+ const std::map<std::string, std::string> attr = this->root->getAttributes();
+
+ std::map<std::string, std::string>::const_iterator it;
+
+ it = attr.find("profiles");
+ if(it != attr.end())
+ this->mpd->setProfile(it->second);
+
+ it = attr.find("mediaPresentationDuration");
+ if(it != attr.end())
+ this->mpd->setDuration(str_duration(it->second.c_str()));
+
+ it = attr.find("minBufferTime");
+ if(it != attr.end())
+ this->mpd->setMinBufferTime(str_duration( it->second.c_str()));
+
+}
+void IsoffMainParser::setMPDBaseUrl ()
+{
+ std::vector<Node *> baseUrls = DOMHelper::getChildElementByTagName(this->root, "BaseURL");
+
+ for(size_t i = 0; i < baseUrls.size(); i++)
+ {
+ BaseUrl *url = new BaseUrl(baseUrls.at(i)->getText());
+ this->mpd->addBaseUrl(url);
+ }
+}
+void IsoffMainParser::setPeriods ()
+{
+ std::vector<Node *> periods = DOMHelper::getElementByTagName(this->root, "Period", false);
+
+ for(size_t i = 0; i < periods.size(); i++)
+ {
+ Period *period = new Period();
+ this->setAdaptationSets(periods.at(i), period);
+ this->mpd->addPeriod(period);
+ }
+}
+void IsoffMainParser::setAdaptationSets (Node *periodNode, Period *period)
+{
+ std::vector<Node *> adaptationSets = DOMHelper::getElementByTagName(periodNode, "AdaptationSet", false);
+
+ for(size_t i = 0; i < adaptationSets.size(); i++)
+ {
+ AdaptationSet *adaptationSet = new AdaptationSet();
+ this->setRepresentations(adaptationSets.at(i), adaptationSet);
+ period->addAdaptationSet(adaptationSet);
+ }
+}
+void IsoffMainParser::setRepresentations (Node *adaptationSetNode, AdaptationSet *adaptationSet)
+{
+ std::vector<Node *> representations = DOMHelper::getElementByTagName(adaptationSetNode, "Representation", false);
+
+ for(size_t i = 0; i < representations.size(); i++)
+ {
+ Representation *rep = new Representation;
+ this->setSegmentBase(representations.at(i), rep);
+ this->setSegmentList(representations.at(i), rep);
+ rep->setBandwidth(atoi(representations.at(i)->getAttributeValue("bandwidth").c_str()));
+ adaptationSet->addRepresentation(rep);
+ }
+}
+void IsoffMainParser::setSegmentBase (dash::xml::Node *repNode, Representation *rep)
+{
+ std::vector<Node *> segmentBase = DOMHelper::getElementByTagName(repNode, "SegmentBase", false);
+
+ if(segmentBase.size() > 0)
+ {
+ SegmentBase *base = new SegmentBase();
+ this->setInitSegment(segmentBase.at(0), base);
+ rep->setSegmentBase(base);
+ }
+}
+void IsoffMainParser::setSegmentList (dash::xml::Node *repNode, Representation *rep)
+{
+ std::vector<Node *> segmentList = DOMHelper::getElementByTagName(repNode, "SegmentList", false);
+
+ if(segmentList.size() > 0)
+ {
+ SegmentList *list = new SegmentList();
+ this->setSegments(segmentList.at(0), list);
+ rep->setSegmentList(list);
+ }
+
+}
+void IsoffMainParser::setInitSegment (dash::xml::Node *segBaseNode, SegmentBase *base)
+{
+ std::vector<Node *> initSeg = DOMHelper::getElementByTagName(segBaseNode, "Initialisation", false);
+
+ if(initSeg.size() > 0)
+ {
+ Segment *seg = new Segment();
+ seg->setSourceUrl(initSeg.at(0)->getAttributeValue("sourceURL"));
+
+ if(initSeg.at(0)->hasAttribute("range"))
+ {
+ std::string range = initSeg.at(0)->getAttributeValue("range");
+ size_t pos = range.find("-");
+ seg->setByteRange(atoi(range.substr(0, pos).c_str()), atoi(range.substr(pos, range.size()).c_str()));
+ }
+
+ for(size_t i = 0; i < this->mpd->getBaseUrls().size(); i++)
+ seg->addBaseUrl(this->mpd->getBaseUrls().at(i));
+
+ base->addInitSegment(seg);
+ }
+}
+void IsoffMainParser::setSegments (dash::xml::Node *segListNode, SegmentList *list)
+{
+ std::vector<Node *> segments = DOMHelper::getElementByTagName(segListNode, "SegmentURL", false);
+
+ for(size_t i = 0; i < segments.size(); i++)
+ {
+ Segment *seg = new Segment();
+ seg->setSourceUrl(segments.at(i)->getAttributeValue("media"));
+
+ if(segments.at(0)->hasAttribute("mediaRange"))
+ {
+ std::string range = segments.at(0)->getAttributeValue("mediaRange");
+ size_t pos = range.find("-");
+ seg->setByteRange(atoi(range.substr(0, pos).c_str()), atoi(range.substr(pos, range.size()).c_str()));
+ }
+
+ for(size_t i = 0; i < this->mpd->getBaseUrls().size(); i++)
+ seg->addBaseUrl(this->mpd->getBaseUrls().at(i));
+
+ list->addSegment(seg);
+ }
+}
+void IsoffMainParser::print ()
+{
+ if(this->mpd)
+ {
+ msg_Dbg(this->p_stream, "MPD profile=%d mediaPresentationDuration=%ld minBufferTime=%ld", this->mpd->getProfile(),
+ this->mpd->getDuration(),
+ this->mpd->getMinBufferTime());
+ const std::vector<BaseUrl *> baseurls = this->mpd->getBaseUrls();
+
+ for(size_t i = 0; i < baseurls.size(); i++)
+ msg_Dbg(this->p_stream, "BaseUrl=%s", baseurls.at(i)->getUrl().c_str());
+
+ const std::vector<Period *> periods = this->mpd->getPeriods();
+
+ for(size_t i = 0; i < periods.size(); i++)
+ {
+ Period *period = periods.at(i);
+ msg_Dbg(this->p_stream, " Period");
+ for(size_t j = 0; j < period->getAdaptationSets().size(); j++)
+ {
+ AdaptationSet *aset = period->getAdaptationSets().at(j);
+ msg_Dbg(this->p_stream, " AdaptationSet");
+ for(size_t k = 0; k < aset->getRepresentations().size(); k++)
+ {
+ Representation *rep = aset->getRepresentations().at(k);
+ msg_Dbg(this->p_stream, " Representation");
+ Segment *initSeg = rep->getSegmentBase()->getInitSegment();
+ msg_Dbg(this->p_stream, " InitSeg url=%s", initSeg->getSourceUrl().c_str());
+ for(size_t l = 0; l < rep->getSegmentList()->getSegments().size(); l++)
+ {
+ Segment *seg = rep->getSegmentList()->getSegments().at(l);
+ msg_Dbg(this->p_stream, " Segment url=%s", seg->getSourceUrl().c_str());
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/modules/stream_filter/dash/mpd/IsoffMainParser.h b/modules/stream_filter/dash/mpd/IsoffMainParser.h
new file mode 100644
index 0000000..069ddaa
--- /dev/null
+++ b/modules/stream_filter/dash/mpd/IsoffMainParser.h
@@ -0,0 +1,79 @@
+/*
+ * IsoffMainParser.h
+ *****************************************************************************
+ * Copyright (C) 2010 - 2012 Klagenfurt University
+ *
+ * Created on: Jan 27, 2012
+ * Authors: Christopher Mueller <christopher.mueller at itec.uni-klu.ac.at>
+ * Christian Timmerer <christian.timmerer at itec.uni-klu.ac.at>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef ISOFFMAINPARSER_H_
+#define ISOFFMAINPARSER_H_
+
+#include "xml/Node.h"
+#include "xml/DOMHelper.h"
+#include "mpd/IMPDParser.h"
+#include "mpd/MPD.h"
+#include "mpd/Period.h"
+#include "mpd/AdaptationSet.h"
+#include "mpd/Representation.h"
+#include "mpd/BaseUrl.h"
+#include "mpd/SegmentBase.h"
+#include "mpd/SegmentList.h"
+#include "mpd/Segment.h"
+
+#include <cstdlib>
+#include <sstream>
+
+#include <vlc_common.h>
+#include <vlc_stream.h>
+#include <vlc_strings.h>
+
+namespace dash
+{
+ namespace mpd
+ {
+ class IsoffMainParser : public IMPDParser
+ {
+ public:
+ IsoffMainParser (dash::xml::Node *root, stream_t *p_stream);
+ virtual ~IsoffMainParser ();
+
+ bool parse ();
+ MPD* getMPD ();
+ void print ();
+
+ private:
+ dash::xml::Node *root;
+ stream_t *p_stream;
+ MPD *mpd;
+
+ void setMPDAttributes ();
+ void setMPDBaseUrl ();
+ void setPeriods ();
+ void setAdaptationSets (dash::xml::Node *periodNode, Period *period);
+ void setRepresentations (dash::xml::Node *adaptationSetNode, AdaptationSet *adaptationSet);
+ void setSegmentBase (dash::xml::Node *repNode, Representation *rep);
+ void setSegmentList (dash::xml::Node *repNode, Representation *rep);
+ void setInitSegment (dash::xml::Node *segBaseNode, SegmentBase *base);
+ void setSegments (dash::xml::Node *segListNode, SegmentList *list);
+ };
+ }
+}
+
+#endif /* ISOFFMAINPARSER_H_ */
--
1.7.0.4
More information about the vlc-devel
mailing list