New upstream version 20.3.2+ds
Vasyl Gello
1 year, 3 months ago
55 | 55 | #if defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM) || defined(_M_ARM64) |
56 | 56 | #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN |
57 | 57 | #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__) | |
59 | 59 | #define AP4_PLATFORM_BYTE_ORDER AP4_PLATFORM_BYTE_ORDER_LITTLE_ENDIAN |
60 | 60 | #endif |
61 | 61 | #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 |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | <addon |
2 | 2 | id="inputstream.adaptive" |
3 | version="20.3.1" | |
3 | version="20.3.2" | |
4 | 4 | name="InputStream Adaptive" |
5 | 5 | provider-name="peak3d"> |
6 | 6 | <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 | ||
0 | 9 | v20.3.1 (2022-10-07) |
1 | 10 | - Print stream ids in log when seeking |
2 | 11 | - [DASH] Fix possible crash for live streams |
383 | 383 | |
384 | 384 | (*(ba + 1))->representations_.insert((*(ba + 1))->representations_.end(), (*ba)->representations_.begin(), (*ba)->representations_.end()); |
385 | 385 | (*ba)->representations_.clear(); |
386 | delete *ba; | |
386 | 387 | ba = (*bp)->adaptationSets_.erase(ba); |
387 | 388 | ea = (*bp)->adaptationSets_.end(); |
388 | 389 | } |
624 | 624 | continue; |
625 | 625 | } |
626 | 626 | period->sequence_ = m_discontSeq + discont_count; |
627 | period->duration_ = newSegments.size() ? pts - newSegments.Get(0)->startPTS_ : 0; | |
628 | 627 | if (!byteRange) |
629 | 628 | 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_; | |
630 | 633 | |
631 | 634 | FreeSegments(period, rep); |
632 | 635 | rep->segments_.swap(newSegments); |
633 | 636 | rep->startNumber_ = newStartNumber; |
634 | rep->duration_ = period->duration_; | |
635 | 637 | |
636 | 638 | if (segmentInitialization) |
637 | 639 | { |
756 | 758 | rep->duration_ = rep->segments_.Get(0) ? (pts - rep->segments_.Get(0)->startPTS_) : 0; |
757 | 759 | |
758 | 760 | period->sequence_ = m_discontSeq + discont_count; |
761 | uint64_t overallSeconds = 0; | |
759 | 762 | if (discont_count || m_hasDiscontSeq) |
760 | 763 | { |
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_; | |
764 | 767 | for (auto p : periods_) |
765 | 768 | { |
766 | overallSeconds_ += p->duration_ / p->timescale_; | |
769 | overallSeconds += p->duration_ / p->timescale_; | |
767 | 770 | if (!has_timeshift_buffer_ && !m_refreshPlayList) |
768 | 771 | p->adaptationSets_[adp_pos]->representations_[rep_pos]->flags_ |= |
769 | 772 | Representation::DOWNLOADED; |
771 | 774 | } |
772 | 775 | else |
773 | 776 | { |
774 | overallSeconds_ = rep->duration_ / rep->timescale_; | |
777 | overallSeconds = rep->duration_ / rep->timescale_; | |
775 | 778 | if (!has_timeshift_buffer_ && !m_refreshPlayList) |
776 | 779 | rep->flags_ |= Representation::DOWNLOADED; |
777 | 780 | } |
781 | if (adp->type_ != SUBTITLE) | |
782 | overallSeconds_ = overallSeconds; | |
778 | 783 | } |
779 | 784 | |
780 | 785 | if (update) |
78 | 78 | } |
79 | 79 | |
80 | 80 | std::string xmlData{ BASE64::Decode(wwrmheader) }; |
81 | m_strPSSH = xmlData; | |
81 | 82 | |
82 | 83 | size_t dataStartPoint = xmlData.find('<', 0); |
83 | 84 | if (dataStartPoint == std::string::npos) |
13 | 13 | #include "../utils/log.h" |
14 | 14 | #include "PRProtectionParser.h" |
15 | 15 | |
16 | #include "kodi/tools/StringUtils.h" | |
17 | ||
16 | 18 | #include <algorithm> |
17 | 19 | #include <cstring> |
18 | 20 | #include <float.h> |
20 | 22 | #include <string> |
21 | 23 | |
22 | 24 | using namespace adaptive; |
25 | using namespace kodi::tools; | |
23 | 26 | using namespace UTILS; |
24 | 27 | |
25 | 28 | SmoothTree::SmoothTree(const UTILS::PROPERTIES::KodiProperties& kodiProps, |
267 | 270 | duration = atoll((const char*)*(attr + 1)); |
268 | 271 | else if (strcmp((const char*)*attr, "IsLive") == 0) |
269 | 272 | { |
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; | |
271 | 274 | if (dash->has_timeshift_buffer_) |
272 | 275 | { |
273 | 276 | dash->stream_start_ = time(0); |
322 | 322 | // proper track id, let's find it now |
323 | 323 | if (m_track->GetId() == TRACKID_UNKNOWN) |
324 | 324 | { |
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())); | |
327 | 327 | AP4_Array<AP4_UI32> ids; |
328 | fragment->GetTrackIds(ids); | |
329 | ||
328 | fragment.GetTrackIds(ids); | |
330 | 329 | if (ids.ItemCount() == 1) |
331 | 330 | m_track->SetId(ids[0]); |
332 | 331 | else |
7 | 7 | TestMain.cpp |
8 | 8 | TestDASHTree.cpp |
9 | 9 | TestHLSTree.cpp |
10 | TestSmoothTree.cpp | |
10 | 11 | TestHelper.cpp |
11 | 12 | ../parser/DASHTree.cpp |
12 | 13 | ../parser/HLSTree.cpp |
14 | ../parser/SmoothTree.cpp | |
13 | 15 | ../parser/PRProtectionParser.cpp |
14 | 16 | ../common/AdaptiveStream.cpp |
15 | 17 | ../common/AdaptiveTree.cpp |
155 | 155 | } |
156 | 156 | return false; |
157 | 157 | } |
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 | } |
13 | 13 | #include "../common/ChooserDefault.h" |
14 | 14 | #include "../parser/DASHTree.h" |
15 | 15 | #include "../parser/HLSTree.h" |
16 | #include "../parser/SmoothTree.h" | |
16 | 17 | #include "../utils/PropertiesUtils.h" |
17 | 18 | |
18 | 19 | std::string GetEnv(const std::string& var); |
123 | 124 | std::stringstream& data, |
124 | 125 | adaptive::HTTPRespHeaders& respHeaders) override; |
125 | 126 | }; |
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>⏎ |
125 | 125 | { |
126 | 126 | size_t slashPos = url.find_last_of('/'); |
127 | 127 | 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); | |
132 | 129 | } |
133 | 130 | return url; |
134 | 131 | } |