Codebase list kodi-inputstream-adaptive / b74d916
New upstream version 20.3.2+ds Vasyl Gello 1 year, 3 months ago
16 changed file(s) with 138 addition(s) and 20 deletion(s). Raw diff Collapse all Expand all
5555 #if defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM) || defined(_M_ARM64)
5656 #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN
5757 #endif
58 #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__) || defined(__aarch64__)
58 #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__) || defined(__aarch64__) || (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
5959 #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN
6060 #endif
6161 #endif
0 8488d47e142c4d85a0c6aa6caefef0575fc1216a77e62db88cc48ed2c61ec06c
0 3efc43c8146d6a89c4f80208f0e24b1c26ecfc84a2887135b10891612366c373
0 bento4 https://github.com/xbmc/Bento4/archive/refs/tags/1.6.0-639-4-Nexus.tar.gz
0 bento4 https://github.com/xbmc/Bento4/archive/refs/tags/1.6.0-639-5-Nexus.tar.gz
00 <?xml version="1.0" encoding="UTF-8"?>
11 <addon
22 id="inputstream.adaptive"
3 version="20.3.1"
3 version="20.3.2"
44 name="InputStream Adaptive"
55 provider-name="peak3d">
66 <requires>@ADDON_DEPENDS@</requires>
0 v20.3.2 (2023-01-11)
1 - [HLS] fix for incomplete length sub streams
2 - Fix memory leak
3 - [ISM] allow case insensitive live flag
4 - Fix crashing when missing track ID
5 - Fix issue where manifest files without an extension would not play
6 - [ISM] fix regression preventing protection being parsed correctly
7 - Bump Bento4 to 1.6.0-639-5-Nexus
8
09 v20.3.1 (2022-10-07)
110 - Print stream ids in log when seeking
211 - [DASH] Fix possible crash for live streams
383383
384384 (*(ba + 1))->representations_.insert((*(ba + 1))->representations_.end(), (*ba)->representations_.begin(), (*ba)->representations_.end());
385385 (*ba)->representations_.clear();
386 delete *ba;
386387 ba = (*bp)->adaptationSets_.erase(ba);
387388 ea = (*bp)->adaptationSets_.end();
388389 }
624624 continue;
625625 }
626626 period->sequence_ = m_discontSeq + discont_count;
627 period->duration_ = newSegments.size() ? pts - newSegments.Get(0)->startPTS_ : 0;
628627 if (!byteRange)
629628 rep->flags_ |= Representation::URLSEGMENTS;
629
630 rep->duration_ = newSegments.size() ? pts - newSegments.Get(0)->startPTS_ : 0;
631 if (adp->type_ != SUBTITLE)
632 period->duration_ = rep->duration_;
630633
631634 FreeSegments(period, rep);
632635 rep->segments_.swap(newSegments);
633636 rep->startNumber_ = newStartNumber;
634 rep->duration_ = period->duration_;
635637
636638 if (segmentInitialization)
637639 {
756758 rep->duration_ = rep->segments_.Get(0) ? (pts - rep->segments_.Get(0)->startPTS_) : 0;
757759
758760 period->sequence_ = m_discontSeq + discont_count;
761 uint64_t overallSeconds = 0;
759762 if (discont_count || m_hasDiscontSeq)
760763 {
761 periods_[discont_count]->duration_ =
762 (rep->duration_ * periods_[discont_count]->timescale_) / rep->timescale_;
763 overallSeconds_ = 0;
764 if (adp->type_ != SUBTITLE)
765 periods_[discont_count]->duration_ =
766 (rep->duration_ * periods_[discont_count]->timescale_) / rep->timescale_;
764767 for (auto p : periods_)
765768 {
766 overallSeconds_ += p->duration_ / p->timescale_;
769 overallSeconds += p->duration_ / p->timescale_;
767770 if (!has_timeshift_buffer_ && !m_refreshPlayList)
768771 p->adaptationSets_[adp_pos]->representations_[rep_pos]->flags_ |=
769772 Representation::DOWNLOADED;
771774 }
772775 else
773776 {
774 overallSeconds_ = rep->duration_ / rep->timescale_;
777 overallSeconds = rep->duration_ / rep->timescale_;
775778 if (!has_timeshift_buffer_ && !m_refreshPlayList)
776779 rep->flags_ |= Representation::DOWNLOADED;
777780 }
781 if (adp->type_ != SUBTITLE)
782 overallSeconds_ = overallSeconds;
778783 }
779784
780785 if (update)
7878 }
7979
8080 std::string xmlData{ BASE64::Decode(wwrmheader) };
81 m_strPSSH = xmlData;
8182
8283 size_t dataStartPoint = xmlData.find('<', 0);
8384 if (dataStartPoint == std::string::npos)
1313 #include "../utils/log.h"
1414 #include "PRProtectionParser.h"
1515
16 #include "kodi/tools/StringUtils.h"
17
1618 #include <algorithm>
1719 #include <cstring>
1820 #include <float.h>
2022 #include <string>
2123
2224 using namespace adaptive;
25 using namespace kodi::tools;
2326 using namespace UTILS;
2427
2528 SmoothTree::SmoothTree(const UTILS::PROPERTIES::KodiProperties& kodiProps,
267270 duration = atoll((const char*)*(attr + 1));
268271 else if (strcmp((const char*)*attr, "IsLive") == 0)
269272 {
270 dash->has_timeshift_buffer_ = strcmp((const char*)*(attr + 1), "TRUE") == 0;
273 dash->has_timeshift_buffer_ = StringUtils::CompareNoCase((const char*)*(attr + 1), "true") == 0;
271274 if (dash->has_timeshift_buffer_)
272275 {
273276 dash->stream_start_ = time(0);
322322 // proper track id, let's find it now
323323 if (m_track->GetId() == TRACKID_UNKNOWN)
324324 {
325 auto fragment = std::make_unique<AP4_MovieFragment>(
326 AP4_MovieFragment(AP4_DYNAMIC_CAST(AP4_ContainerAtom, moof->Clone())));
325 AP4_MovieFragment fragment =
326 AP4_MovieFragment(AP4_DYNAMIC_CAST(AP4_ContainerAtom, moof->Clone()));
327327 AP4_Array<AP4_UI32> ids;
328 fragment->GetTrackIds(ids);
329
328 fragment.GetTrackIds(ids);
330329 if (ids.ItemCount() == 1)
331330 m_track->SetId(ids[0]);
332331 else
77 TestMain.cpp
88 TestDASHTree.cpp
99 TestHLSTree.cpp
10 TestSmoothTree.cpp
1011 TestHelper.cpp
1112 ../parser/DASHTree.cpp
1213 ../parser/HLSTree.cpp
14 ../parser/SmoothTree.cpp
1315 ../parser/PRProtectionParser.cpp
1416 ../common/AdaptiveStream.cpp
1517 ../common/AdaptiveTree.cpp
155155 }
156156 return false;
157157 }
158
159 bool SmoothTestTree::download(const std::string& url,
160 const std::map<std::string, std::string>& reqHeaders,
161 std::stringstream& data,
162 adaptive::HTTPRespHeaders& respHeaders)
163 {
164 if (DownloadFile(url, reqHeaders, data, respHeaders))
165 {
166 // We set the download speed to calculate the initial network bandwidth
167 m_reprChooser->SetDownloadSpeed(500000);
168
169 return true;
170 }
171 return false;
172 }
1313 #include "../common/ChooserDefault.h"
1414 #include "../parser/DASHTree.h"
1515 #include "../parser/HLSTree.h"
16 #include "../parser/SmoothTree.h"
1617 #include "../utils/PropertiesUtils.h"
1718
1819 std::string GetEnv(const std::string& var);
123124 std::stringstream& data,
124125 adaptive::HTTPRespHeaders& respHeaders) override;
125126 };
127
128 class SmoothTestTree : public adaptive::SmoothTree
129 {
130 public:
131 SmoothTestTree(UTILS::PROPERTIES::KodiProperties kodiProps,
132 CHOOSER::IRepresentationChooser* reprChooser)
133 : SmoothTree(kodiProps, reprChooser){};
134
135 private:
136 bool download(const std::string& url,
137 const std::map<std::string, std::string>& reqHeaders,
138 std::stringstream& data,
139 adaptive::HTTPRespHeaders& respHeaders) override;
140 };
0 /*
1 * Copyright (C) 2021 Team Kodi
2 * This file is part of Kodi - https://kodi.tv
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 * See LICENSES/README.md for more information.
6 */
7
8 #include "TestHelper.h"
9
10 #include "../utils/PropertiesUtils.h"
11 #include "../utils/UrlUtils.h"
12
13 #include <gtest/gtest.h>
14
15
16 class SmoothTreeTest : public ::testing::Test
17 {
18 protected:
19 void SetUp() override
20 {
21 UTILS::PROPERTIES::KodiProperties kodiProps;
22
23 m_reprChooser = new CTestRepresentationChooserDefault();
24 m_reprChooser->Initialize(kodiProps.m_chooserProps);
25
26 tree = new SmoothTestTree(kodiProps, m_reprChooser);
27
28 tree->supportedKeySystem_ = "urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED";
29 }
30
31 void TearDown() override
32 {
33 testHelper::effectiveUrl.clear();
34 delete tree;
35 tree = nullptr;
36 delete m_reprChooser;
37 m_reprChooser = nullptr;
38 }
39
40 void OpenTestFile(std::string testfilename, std::string url, std::string manifestHeaders)
41 {
42 if (url.empty())
43 url = "http://foo.bar/" + testfilename;
44
45 SetFileName(testHelper::testFile, testfilename);
46 if (!tree->open(url, manifestHeaders))
47 {
48 printf("open() failed");
49 exit(1);
50 }
51 }
52
53 SmoothTestTree* tree;
54 CHOOSER::IRepresentationChooser* m_reprChooser{ nullptr };
55 };
56
57 TEST_F(SmoothTreeTest, CalculateBaseURL)
58 {
59 // No BaseURL tags
60 OpenTestFile("ism/TearsOfSteel.ism", "http://amssamples.streaming.mediaservices.windows.net/bc57e088-27ec-44e0-ac20-a85ccbcd50da/TearsOfSteel.ism", "");
61 EXPECT_EQ(tree->base_url_, "http://amssamples.streaming.mediaservices.windows.net/bc57e088-27ec-44e0-ac20-a85ccbcd50da/");
62 }
63
64 TEST_F(SmoothTreeTest, CalculateBaseURLWithNoExtension)
65 {
66 // No BaseURL tags
67 OpenTestFile("ism/TearsOfSteel.ism", "http://amssamples.streaming.mediaservices.windows.net/bc57e088-27ec-44e0-ac20-a85ccbcd50da/TearsOfSteel.ism/manifest", "");
68 EXPECT_EQ(tree->base_url_, "http://amssamples.streaming.mediaservices.windows.net/bc57e088-27ec-44e0-ac20-a85ccbcd50da/TearsOfSteel.ism/");
69 }
0 <?xml version="1.0" encoding="UTF-8"?><SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="7341917460" TimeScale="10000000"><StreamIndex Chunks="368" Type="video" Url="QualityLevels({bitrate})/Fragments(video={start time})" QualityLevels="8"><QualityLevel Index="0" Bitrate="5991499" FourCC="H264" MaxWidth="1920" MaxHeight="800" CodecPrivateData="0000000167640028AC2CA501E0196C054808080A00000300020000030060C4C0005B8D800039387FE31C1DA14291600000000168E9093525" /><QualityLevel Index="1" Bitrate="4692289" FourCC="H264" MaxWidth="1920" MaxHeight="800" CodecPrivateData="0000000167640028AC2CA501E0196C054808080A00000300020000030060C4400047B700000B34A7FE31C1DA1429160000000168E9093525" /><QualityLevel Index="2" Bitrate="3393266" FourCC="H264" MaxWidth="1280" MaxHeight="536" CodecPrivateData="000000016764001FAC2CA50140117E5C054808080A00000300020000030060C0800067C28000103667F8C7076850A4580000000168E9093525" /><QualityLevel Index="3" Bitrate="2244045" FourCC="H264" MaxWidth="960" MaxHeight="400" CodecPrivateData="000000016764001EAC2CA503C0CEC054808080A000000300200000060C1000044AA0000ABA9FE31C1DA14291600000000168E9093525" /><QualityLevel Index="4" Bitrate="1494540" FourCC="H264" MaxWidth="960" MaxHeight="400" CodecPrivateData="000000016764001EAC2CA503C0CEC054808080A000000300200000060C04000B71A0000E4E1FF8C7076850A4580000000168E9093525" /><QualityLevel Index="5" Bitrate="994912" FourCC="H264" MaxWidth="640" MaxHeight="268" CodecPrivateData="0000000167640015AC2CA502808FEF01520C0C0C8000000300800000183020007A120001312DFE31C1DA1429160000000168E9093525" /><QualityLevel Index="6" Bitrate="645214" FourCC="H264" MaxWidth="640" MaxHeight="268" CodecPrivateData="0000000167640015AC2CA502808FEF01520C0C0C8000000300800000183020004F5800031977F8C7076850A4580000000168E9093525" /><QualityLevel Index="7" Bitrate="395587" FourCC="H264" MaxWidth="320" MaxHeight="132" CodecPrivateData="000000016764000DAC2CA50504FE7C054830303200000300020000030060C040030D40003D093F8C7076850A45800000000168E9093525" /><c t="0" d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="20000000" /><c d="1666666" /></StreamIndex><StreamIndex Chunks="364" Type="audio" Url="QualityLevels({bitrate})/Fragments(AAC_und_ch2_128kbps={start time})" QualityLevels="1" Name="AAC_und_ch2_128kbps"><QualityLevel AudioTag="255" Index="0" BitsPerSample="16" Bitrate="125655" FourCC="AACL" CodecPrivateData="1210" Channels="2" PacketSize="4" SamplingRate="44100" /><c t="0" d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="8823583" /></StreamIndex><StreamIndex Chunks="364" Type="audio" Url="QualityLevels({bitrate})/Fragments(AAC_und_ch2_56kbps={start time})" QualityLevels="1" Name="AAC_und_ch2_56kbps"><QualityLevel AudioTag="255" Index="0" BitsPerSample="16" Bitrate="53651" FourCC="AACL" CodecPrivateData="1210" Channels="2" PacketSize="4" SamplingRate="44100" /><c t="0" d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201360" /><c d="20201361" /><c d="20201361" /><c d="20201360" /><c d="8823583" /></StreamIndex></SmoothStreamingMedia>
125125 {
126126 size_t slashPos = url.find_last_of('/');
127127 if (slashPos != std::string::npos && slashPos != (url.find("://") + 2))
128 {
129 if (url.substr(slashPos).find(".") != std::string::npos)
130 url.resize(slashPos + 1);
131 }
128 url.resize(slashPos + 1);
132129 }
133130 return url;
134131 }