[vlc-commits] demux: dash: add Token replacement helper
Francois Cartegnie
git at videolan.org
Tue Jul 31 18:26:14 CEST 2018
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Jul 31 12:42:06 2018 +0200| [61638c0ad9446a82e37c4f95afc5ae5bf9befbb5] | committer: Francois Cartegnie
demux: dash: add Token replacement helper
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=61638c0ad9446a82e37c4f95afc5ae5bf9befbb5
---
modules/demux/dash/mpd/TemplatedUri.cpp | 170 ++++++++++++++++++++++++++++++++
modules/demux/dash/mpd/TemplatedUri.hpp | 68 +++++++++++++
2 files changed, 238 insertions(+)
diff --git a/modules/demux/dash/mpd/TemplatedUri.cpp b/modules/demux/dash/mpd/TemplatedUri.cpp
new file mode 100644
index 0000000000..8cdd525d5b
--- /dev/null
+++ b/modules/demux/dash/mpd/TemplatedUri.cpp
@@ -0,0 +1,170 @@
+/*
+ * TemplatedUri.cpp
+ *****************************************************************************
+ * Copyright (C) 2010 - 2014 VideoLAN and VLC Authors
+ * 2018 VideoLabs
+ *
+ * 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 Lesser 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.
+ *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "TemplatedUri.hpp"
+
+#include <cctype>
+#include <sstream>
+
+using namespace dash::mpd;
+
+/* Checks if current char is a token end, including format string tokens */
+static std::string::size_type TokenEnd(const std::string &str,
+ std::string::size_type pos,
+ bool formatstring,
+ int &formatwidth)
+{
+ std::string::size_type remain = str.length() - pos;
+ if(remain < 1)
+ {
+ return std::string::npos;
+ }
+ else if(str[pos] == '$')
+ {
+ formatwidth = -1;
+ return pos;
+ }
+ else if(formatstring && str[pos] == '%' && remain >= 3)
+ {
+ /* parse %[n]d format string if any */
+ std::string::size_type fmtend = str.find('$', pos + 1);
+ if(fmtend != std::string::npos)
+ {
+ std::istringstream iss(str.substr(pos + 1, fmtend - pos));
+ iss.imbue(std::locale("C"));
+ formatwidth = 1; /* %d -> default width = 1 */
+ if(std::isdigit(iss.peek())) /* [n]d */
+ iss >> formatwidth;
+ if (iss.peek() != 'd') /* should be trailing d */
+ return std::string::npos;
+ /* return end of token position */
+ return fmtend;
+ }
+ }
+ return std::string::npos;
+}
+
+static int CompareToken(const std::string &str,
+ std::string::size_type pos,
+ const char *token,
+ const size_t token_len,
+ bool formatstring,
+ std::string::size_type &fulllength,
+ int &width)
+{
+ if(pos + 1 + token_len >= str.length() ||
+ str.compare(pos + 1, token_len, token, token_len))
+ return -1;
+
+ std::string::size_type end = TokenEnd(str, pos + 1 + token_len, formatstring, width);
+ if(end == std::string::npos)
+ return -1;
+
+ fulllength = 1 + end - pos;
+ return 0;
+}
+
+bool TemplatedUri::IsDASHToken(const std::string &str,
+ std::string::size_type pos,
+ TemplatedUri::Token &token)
+{
+ std::string::size_type remain = str.length() - pos;
+ if(remain < 2 || str[pos] != '$')
+ return false;
+ if(str[pos + 1] == '$') /* escaping */
+ {
+ token.type = TemplatedUri::Token::TOKEN_ESCAPE;
+ token.fulllength = 2;
+ token.width = -1;
+ return true;
+ }
+ else if(!CompareToken(str, pos, "RepresentationID", 16, false,
+ token.fulllength, token.width))
+ {
+ token.type = TemplatedUri::Token::TOKEN_REPRESENTATION;
+ return true;
+ }
+ else if(!CompareToken(str, pos, "Time", 4, true,
+ token.fulllength, token.width))
+ {
+ token.type = TemplatedUri::Token::TOKEN_TIME;
+ return true;
+ }
+ else if(!CompareToken(str, pos, "Number", 6, true,
+ token.fulllength, token.width))
+ {
+ token.type = TemplatedUri::Token::TOKEN_NUMBER;
+ return true;
+ }
+ else if(!CompareToken(str, pos, "Bandwidth", 9, true,
+ token.fulllength, token.width))
+ {
+ token.type = TemplatedUri::Token::TOKEN_BANDWIDTH;
+ return true;
+ }
+ else return false;
+}
+
+static std::string FormatValue(uint64_t value, int width)
+{
+ std::stringstream oss;
+ oss.imbue(std::locale("C"));
+ if(width > 0)
+ {
+ oss.width(width); /* set format string length */
+ oss.fill('0');
+ }
+ oss << value;
+ return oss.str();
+}
+
+std::string::size_type TemplatedUri::ReplaceDASHToken(std::string &str,
+ std::string::size_type pos,
+ const TemplatedUri::Token &token,
+ const TemplatedUri::TokenReplacement &repl)
+{
+ switch(token.type)
+ {
+ case TemplatedUri::Token::TOKEN_TIME:
+ case TemplatedUri::Token::TOKEN_BANDWIDTH:
+ case TemplatedUri::Token::TOKEN_NUMBER:
+ {
+ std::string newstr = FormatValue(repl.value, token.width);
+ str.replace(pos, token.fulllength, newstr);
+ return newstr.length();
+ }
+ case TemplatedUri::Token::TOKEN_REPRESENTATION:
+ {
+ str.replace(pos, token.fulllength, repl.str);
+ return repl.str.length();
+ }
+ case TemplatedUri::Token::TOKEN_ESCAPE:
+ {
+ str.erase(pos, 1);
+ return 1;
+ }
+ default:
+ return std::string::npos;
+ }
+}
diff --git a/modules/demux/dash/mpd/TemplatedUri.hpp b/modules/demux/dash/mpd/TemplatedUri.hpp
new file mode 100644
index 0000000000..1eeb70cbb6
--- /dev/null
+++ b/modules/demux/dash/mpd/TemplatedUri.hpp
@@ -0,0 +1,68 @@
+/*
+ * TemplatedUri.hpp
+ *****************************************************************************
+ * Copyright (C) 2010 - 2014 VideoLAN and VLC Authors
+ * 2018 VideoLabs
+ *
+ * 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 Lesser 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 TEMPLATEDURI_HPP
+#define TEMPLATEDURI_HPP
+
+#include <string>
+
+namespace dash
+{
+ namespace mpd
+ {
+ class TemplatedUri
+ {
+ public:
+ class Token
+ {
+ public:
+ enum tokentype
+ {
+ TOKEN_ESCAPE,
+ TOKEN_TIME,
+ TOKEN_BANDWIDTH,
+ TOKEN_REPRESENTATION,
+ TOKEN_NUMBER,
+ } type;
+
+ std::string::size_type fulllength;
+ int width;
+ };
+
+ static bool IsDASHToken(const std::string &str,
+ std::string::size_type pos,
+ TemplatedUri::Token &token);
+
+ class TokenReplacement
+ {
+ public:
+ uint64_t value;
+ std::string str;
+ };
+
+ static std::string::size_type
+ ReplaceDASHToken(std::string &str,
+ std::string::size_type pos,
+ const TemplatedUri::Token &token,
+ const TemplatedUri::TokenReplacement &repl);
+ };
+ }
+}
+#endif // TEMPLATEDURI_HPP
More information about the vlc-commits
mailing list