vlc | branch: master | Francois Cartegnie <[email protected]> | Tue Jul 31 09:01:21 2018 +0200| [73acf3fec0bf49a11c9b0f7d912142bc91f8b02c] | committer: Francois Cartegnie
demux: dash: replace duplicate tokens refs #20868 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=73acf3fec0bf49a11c9b0f7d912142bc91f8b02c --- modules/demux/dash/mpd/Representation.cpp | 111 +++++++++++++++++------------- 1 file changed, 62 insertions(+), 49 deletions(-) diff --git a/modules/demux/dash/mpd/Representation.cpp b/modules/demux/dash/mpd/Representation.cpp index 8e5116b76a..8954d4a7c1 100644 --- a/modules/demux/dash/mpd/Representation.cpp +++ b/modules/demux/dash/mpd/Representation.cpp @@ -96,67 +96,80 @@ std::string Representation::contextualize(size_t number, const std::string &comp const MediaSegmentTemplate *templ = dynamic_cast<const MediaSegmentTemplate *>(basetempl); - if(templ) + bool replaced; + do { - pos = ret.find("$Time$"); - if(pos != std::string::npos) + replaced = false; + if(templ) { - std::stringstream ss; - ss.imbue(std::locale("C")); - ss << getScaledTimeBySegmentNumber(number, templ); - ret.replace(pos, std::string("$Time$").length(), ss.str()); + pos = ret.find("$Time$"); + if(pos != std::string::npos) + { + std::stringstream ss; + ss.imbue(std::locale("C")); + ss << getScaledTimeBySegmentNumber(number, templ); + ret.replace(pos, std::string("$Time$").length(), ss.str()); + replaced = true; + } + + pos = ret.find("$Number$"); + if(pos != std::string::npos) + { + std::stringstream ss; + ss.imbue(std::locale("C")); + ss << number; + ret.replace(pos, std::string("$Number$").length(), ss.str()); + replaced = true; + } + else + { + pos = ret.find("$Number%"); + size_t tokenlength = std::string("$Number%").length(); + size_t fmtstart = pos + tokenlength; + if(pos != std::string::npos && fmtstart < ret.length()) + { + size_t fmtend = ret.find('$', fmtstart); + if(fmtend != std::string::npos) + { + std::istringstream iss(ret.substr(fmtstart, fmtend - fmtstart + 1)); + iss.imbue(std::locale("C")); + try + { + size_t width; + iss >> width; + if (iss.peek() != '$' && iss.peek() != 'd') + throw VLC_EGENERIC; + std::stringstream oss; + oss.imbue(std::locale("C")); + oss.width(width); /* set format string length */ + oss.fill('0'); + oss << number; + ret.replace(pos, fmtend - pos + 1, oss.str()); + replaced = true; + } catch(int) {} + } + } + } } - pos = ret.find("$Number$"); + pos = ret.find("$Bandwidth$"); if(pos != std::string::npos) { std::stringstream ss; ss.imbue(std::locale("C")); - ss << number; - ret.replace(pos, std::string("$Number$").length(), ss.str()); + ss << getBandwidth(); + ret.replace(pos, std::string("$Bandwidth$").length(), ss.str()); + replaced = true; } - else + + pos = ret.find("$RepresentationID$"); + if(pos != std::string::npos) { - pos = ret.find("$Number%"); - size_t tokenlength = std::string("$Number%").length(); - size_t fmtstart = pos + tokenlength; - if(pos != std::string::npos && fmtstart < ret.length()) - { - size_t fmtend = ret.find('$', fmtstart); - if(fmtend != std::string::npos) - { - std::istringstream iss(ret.substr(fmtstart, fmtend - fmtstart + 1)); - iss.imbue(std::locale("C")); - try - { - size_t width; - iss >> width; - if (iss.peek() != '$' && iss.peek() != 'd') - throw VLC_EGENERIC; - std::stringstream oss; - oss.imbue(std::locale("C")); - oss.width(width); /* set format string length */ - oss.fill('0'); - oss << number; - ret.replace(pos, fmtend - pos + 1, oss.str()); - } catch(int) {} - } - } + ret.replace(pos, std::string("$RepresentationID$").length(), id.str()); + replaced = true; } - } - - pos = ret.find("$Bandwidth$"); - if(pos != std::string::npos) - { - std::stringstream ss; - ss.imbue(std::locale("C")); - ss << getBandwidth(); - ret.replace(pos, std::string("$Bandwidth$").length(), ss.str()); - } - pos = ret.find("$RepresentationID$"); - if(pos != std::string::npos) - ret.replace(pos, std::string("$RepresentationID$").length(), id.str()); + } while(replaced); return ret; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
