[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