diff --git a/modules/cms/src/main/resources/views/modules/cmsfront/themes/default/include/footer.html b/modules/cms/src/main/resources/views/modules/cmsfront/themes/default/include/footer.html index db770ef6..159752ed 100644 --- a/modules/cms/src/main/resources/views/modules/cmsfront/themes/default/include/footer.html +++ b/modules/cms/src/main/resources/views/modules/cmsfront/themes/default/include/footer.html @@ -13,4 +13,6 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/LICENSE b/modules/core/src/main/resources/static/ckplayer/LICENSE new file mode 100644 index 00000000..7a4a3ea2 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/css/ckplayer.css b/modules/core/src/main/resources/static/ckplayer/css/ckplayer.css new file mode 100644 index 00000000..c7571cb6 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/css/ckplayer.css @@ -0,0 +1,1609 @@ +.ckplayer-error{ + position: fixed; + z-index: 9999999; + left: 10px; + bottom: 10px; + width: auto; + height: 38px; + line-height: 38px; + padding: 0 .85rem; + background: rgb(0,0,0,.9); + border-radius: .25rem; + color: #FFF; + font-size: 14px; + white-space: nowrap; +} +.ckplayer-ckplayer{ + width: 100%; + height: 100%; + float: left; + background: #000; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-nocursor{ + cursor: none; +} +.ckplayer-ckplayer-smallwindow{ + position: fixed; + z-index: 9999999; + width: 420px; + max-width: 100%; + height: 266px; + right: 10px; + bottom: 10px; +} +.ckplayer-ckplayer .ck-main{ + width: 100%; + height: 100%; + overflow: hidden; + background: #000; + position: relative; +} +.ckplayer-ckplayer .ck-main .ck-video{ + width: 100%; + height: 100%; + overflow: hidden; + position:absolute; + z-index: 1; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-video video,.ckplayer-ckplayer .ck-main .ck-video canvas{ + width: 100%; + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-error{ + width: 100%; + height: 80px; + line-height: 35px; + text-align: center; + color: #FFF; + position:absolute; + z-index: 70; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main .ck-logo{ + position:absolute; + right: 20px; + top:20px; + z-index: 400; +} +.ckplayer-ckplayer .ck-main .ck-loading{ + position:absolute; + top:0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + z-index: 80; + width: 80px; + height: 80px; + border-radius: 50%; + background: url(images/loading.png) no-repeat center center; + background-size: 100% 100%; + animation: ck-Circle 1.5s linear infinite; + -webkit-animation: ck-Circle 1.5s linear infinite +} +.ckplayer-ckplayer .ck-main .ck-center-play{ + background: url(images/play.png) no-repeat 70% center; + background-size:60% 60%; + border: 8px solid rgba(255,255,255,.3); + border-radius: 50%; + box-sizing:border-box; + -moz-box-sizing:border-box; /* Firefox */ + -webkit-box-sizing:border-box; /* Safari */ + width: 80px; + height: 80px; + position: absolute; + display: none; + z-index: 90; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + cursor: pointer; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-center-play{ + width: 100px; + height: 100px; +} +.ckplayer-ckplayer .ck-main .ck-center-play:hover{ + width: 100px; + height: 100px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-center-play:hover{ + width: 120px; + height: 120px; +} +.ckplayer-ckplayer .ck-main .ck-buffer{ + background: url(images/buffer.png) no-repeat center center; + background-size:100% 100%; + border-radius: 50%; + width: 60px; + height: 60px; + position: absolute; + z-index: 100; + top:0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + display: none; + animation: ck-Circle 1s linear infinite; + -webkit-animation: ck-Circle 1s linear infinite +} +.ckplayer-ckplayer .ck-main .ck-message{ + position: absolute; + z-index: 240; + left:5px; + bottom: 78px; + padding: 0 1rem; + line-height: 30px; + height: 30px; + width: auto; + min-width: 1px; + border-radius: .25rem; + background: rgba(0,0,0,.6); + font-size: 14px; + color: #FFF; + display: none; + white-space:nowrap; +} +.ckplayer-ckplayer .ck-main .ck-message-right{ + left:auto; + right: 5px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-message{ + font-size: 18px; + bottom: 100px; +} +.ckplayer-ckplayer .ck-main .ck-tip{ + width: auto; + height: auto; + position: absolute; + z-index: 230; + display: none; + margin-bottom: 1px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content{ + width: auto; + height: auto; + white-space: nowrap; + min-width: 1px; + background: rgba(0,0,0,.6); + font-size: 14px; + color: #FFF; + line-height: 32px; + height: 32px; + padding: 0 15px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content-float-auto{ + border-radius: 5px; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content-float-left{ + border-radius: 5px; + float: left; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-tip .ck-content{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle{ + width: 0px; + height: 0px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle-auto{ + border-left: 8px solid transparent; + border-top: 8px solid rgba(0, 0, 0,.6); + border-right: 8px solid transparent; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle-left{ + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 8px solid rgba(0, 0, 0,.6); + float: left; + margin-top: 10px; +} +.ckplayer-ckplayer .ck-main .ck-preview{ + position: absolute; + z-index: 210; + width: 100%; + left:0; + bottom: 64px; + overflow: hidden; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-preview{ + bottom: 86px; +} +.ckplayer-ckplayer .ck-main .ck-preview-load-img{ + position: absolute; + z-index: 210; + top:110%; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-bg{ + position: absolute; + z-index: 1; + top:0; + float: left; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-bg .ck-preview-img{ + background-repeat: no-repeat ; + float: left; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-frame{ + position: absolute; + z-index: 2; + top:0; + left:-1000px; + border:4px solid #0078ff; + box-sizing:content-box; + -moz-box-sizing:content-box; /* Firefox */ + -webkit-box-sizing:content-box; /* Safari */ +} +.ckplayer-ckplayer .ck-main .ck-prompt-words{ + position: absolute; + z-index: 220; + width: 213px; + line-height: 23px; + font-size: 14px; + color: #FFF; + background: rgba(0, 0, 0,.6); + overflow: hidden; + display: none; + margin-bottom: 10px; + border-radius: 3px; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +.ckplayer-ckplayer .ck-main .ck-prompt-words .ck-prompt-content{ + padding: 5px; +} +.ckplayer-ckplayer .ck-main .ck-layer{ + position: absolute; + z-index: 101; +} +.ckplayer-ckplayer .ck-main .ck-tempTime{ + position: absolute; + z-index: 20; + left:10px; + bottom: 5px; + display: none; + font-size: 14px; + line-height: 28px; + color: #FFF; +} +/*关于*/ +.ckplayer-ckplayer .ck-main .ck-about{ + position: absolute; + z-index: 200; + width: 50%; + max-width: 600px; + min-width: 400px; + left: 1rem; + top: 1rem; + background: rgba(0,0,0,.6); + padding: 1rem 0; + display: none; +} +.ckplayer-ckplayer .ck-main .ck-about ul{ + padding: 0; + margin: 0; +} +.ckplayer-ckplayer .ck-main .ck-about ul li{ + list-style:none; + color: #FFF; + font-size: 12px; + line-height: 18px; + height: 18px; + padding: 0; + margin: 0; +} +.ckplayer-ckplayer .ck-main .ck-about ul li .ck-about-title{ + width: 100px; + text-align: right; + float: left; + padding-right: .5rem; +} +.ckplayer-ckplayer .ck-main .ck-about ul li .ck-about-content{ + width: auto; + float: left; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar{ + position: absolute; + z-index: 1; + top: 0; + right: 0; + width: 96px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar{ + width: 140px; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-copy{ + background-position:-1632px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-copy:hover{ + background-position:-1680px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-copy{ + background-position:-2380px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-copy:hover{ + background-position:-2450px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-close{ + background-position:-1728px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-close:hover{ + background-position:-1776px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-close{ + background-position:-2520px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-close:hover{ + background-position:-2590px 0; +} +/*截图显示容器*/ +.ckplayer-ckplayer .ck-main .ck-screenshot{ + position: absolute; + z-index: 220; + width: auto; + height: 144px; + margin: auto !important; + top: 0; + bottom: 0; + right: 55px; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-screenshot{ + height: 210px; + right: 77px; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-img{ + position: absolute; + z-index: 1; + width: 100%; + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-img img{ + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar{ + position: absolute; + z-index: 1; + width: 100%; + height: 36px; + bottom: 5px; + text-align: center; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn{ + display: inline-block; + overflow: hidden; + border: 0px solid transparent; + border-radius: 5px; + vertical-align: middle; + text-align: center; + text-decoration: none; + white-space: nowrap; + font-size: 14px; + line-height: 30px; + padding: 0px 15px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + color: #fff; + margin: 0 5px; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn:hover{ + color: #FFFF00; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn:focus{ + outline:0; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-down{ + background-color: #007bff; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-close{ + background-color: #505050; + color: #fff; +} +/*广告*/ +.ckplayer-ckplayer .ck-main .ck-yytf{ + position: absolute; + z-index: 800; + width: 100%; + height: 100%; + left: 0px; + top: 0px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-link{ + width: 100%; + height: 100%; + display: none; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-picture{ + width: 100%; + height: 100%; + background: #000; + display: none; + text-align: center; + line-height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-picture img{ + max-width: 100%; + max-height: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top{ + position: absolute; + z-index: 3; + top: 10px; + right: 10px; +} + +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top div{ + float: right; + margin-left: 10px; + font-size: 14px; + border-radius: 15px; + background: rgba(0,0,0,.6); + padding: 0px 10px; + line-height: 30px; + height: 30px; + color: #FFF; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-top div{ + font-size: 18px; + border-radius: 20px; + line-height: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top .ck-yytf-closetime{ + display: none; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top .ck-yytf-closead{ + cursor: pointer; + display: none; +} + +/*显示广告时的底部内容*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom{ + position: absolute; + z-index: 3; + bottom: 10px; + right: 10px; +} +/*显示广告时的底部按钮-共用*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-btn{ + background-color: rgba(0,0,0,.6); + background-image: url(images/ckplayer.png); + background-size: auto 100%; + border: none; + outline: none; + width: 30px; + height: 30px; + cursor: pointer; + background-repeat: no-repeat; + border-radius: 50%; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-btn{ + width: 40px; + height: 40px; +} +/*显示广告时的静音按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit{ + float: right; + width: 30px; + height: 30px; + margin-left: 10px; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit{ + width: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted{ + background-position:-180px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted:hover{ + background-position:-210px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted:hover{ + background-position:-270px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted:hover{ + background-position:-280px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted{ + background-position:-320px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted:hover{ + background-position:-360px 0; +} +/*显示广告时的全屏按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit{ + float: right; + width: 30px; + height: 30px; + margin-left: 10px; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit{ + width: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full{ + background-position:-300px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full:hover{ + background-position:-330px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull{ + background-position:-360px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull:hover{ + background-position:-390px 0; +} + +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full{ + background-position:-400px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full:hover{ + background-position:-440px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull{ + background-position:-480px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull:hover{ + background-position:-520px 0; +} +/*广告查看详情按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-details{ + float: right; + font-size: 14px; + border-radius: 15px; + background: rgba(0,0,0,.6); + padding: 0 10px; + color: #FFF; + line-height: 30px; + height: 30px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-details{ + font-size: 18px; + border-radius: 20px; + line-height: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-details a{ + color: #FFF; + text-decoration: none; +} +/*暂停广告容器*/ +.ckplayer-ckplayer .ck-main .ck-pause-yytf{ + display: none; + position:absolute; + z-index: 800; + max-width: 100%; + max-height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-pause-yytf img{ + max-width: 100%; + max-height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-pause-close{ + position:absolute; + z-index: 1; + right: -15px; + top:-15px; + width: 30px; + height: 30px; + background-color: transparent; + background-image: url(images/adclose.png); + border: none; + outline: none; + cursor: pointer; + background-repeat: no-repeat ; +} +.ckplayer-ckplayer .ck-main .ck-pause-close:hover{ + background-position:-30px 0; +} +/*右键菜单*/ +.ckplayer-ckplayer-menu{ + width:120px; + background: rgba(50,50,50,.6); + position: absolute; + z-index: 9000; + font-size:14px ; + border: 1px #000 solid; + display: none; +} +.ckplayer-ckplayer-menu .ck-li{ + color: #adadad; + line-height: 35px; + padding: 0 0 0 5px; +} +.ckplayer-ckplayer-menu .ck-li a{ + color: #FFF; + text-decoration: none; +} +.ckplayer-ckplayer-menu .ck-underline{ + border-bottom: 1px #000 solid; +} +/*控制栏*/ +.ckplayer-ckplayer .ck-main .ck-bar{ + position:absolute; + z-index: 260; + left:0px; + bottom:0px; + width: 100%; + height: 48px; + background: rgba(0,0,0,.3); + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar{ + height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar.ck-bar-out{ + bottom: -50px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar.ck-bar-out{ + bottom: -80px; + transition: 0.2s; +} + +/*按钮公用样式*/ +.ckplayer-ckplayer .ck-main .ck-bar-btn{ + background-color: transparent; + background-image: url(images/ckplayer.48.png); + background-size: auto 100%; + border: none; + outline: none; + width: 48px; + height: 48px; + cursor: pointer; + background-repeat: no-repeat ; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar-btn{ + background-image: url(images/ckplayer.png); + width: 70px; + height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-btn:hover{ + background-size:auto 100%; +} + +/*播放暂停按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-play{ + background-position:0px top; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-play:hover{ + background-position:-48px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-play:hover{ + background-position:-70px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-pause{ + background-position:-96px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-pause{ + background-position:-140px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-pause:hover{ + background-position:-144px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-pause:hover{ + background-position:-210px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-refresh{ + background-position:-192px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-refresh{ + background-position:-280px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-refresh:hover{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-refresh:hover{ + background-position:-350px 0; +} + +/*返回播放按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive{ + float: left; + font-size: 16px; + line-height: 28px; + border-radius: 3px; + margin: 10px; + border: 0px; + background: rgba(3,60,146,.5); + color: #FFF; + cursor: pointer; + padding: 0 8px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-btn-backlive{ + font-size: 18px; + line-height: 36px; + margin: 17px 10px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive:hover{ + background: rgba(3,60,146,.9); +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive:focus{ + outline:0; + background: rgba(3,60,146,.6); +} +/*静音取消静音按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-muted{ + background-position:-288px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-muted{ + background-position:-420px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-muted:hover{ + background-position:-336px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-muted:hover{ + background-position:-490px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-exitmuted{ + background-position:-384px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-exitmuted{ + background-position:-560px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-exitmuted:hover{ + background-position:-432px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-exitmuted:hover{ + background-position:-630px 0; +} + +/*全屏按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-full{ + background-position:-480px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-full{ + background-position:-700px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-full:hover{ + background-position:-528px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-full:hover{ + background-position:-770px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-exitfull{ + background-position:-672px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-exitfull{ + background-position:-840px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-exitfull:hover{ + background-position:-720px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-exitfull:hover{ + background-position:-910px 0; +} + +/*网页全屏按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-webfull{ + background-position:-768px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-webfull{ + background-position:-1120px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-webfull:hover{ + background-position:-816px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-webfull:hover{ + background-position:-1190px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull{ + background-position:-864px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull{ + background-position:-1260px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull:hover{ + background-position:-912px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull:hover{ + background-position:-1330px 0; +} + +/*剧场模式按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-theatre{ + background-position:-960px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-theatre{ + background-position:-1400px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-theatre:hover{ + background-position:-1008px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-theatre:hover{ + background-position:-1470px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre{ + background-position:-1056px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre{ + background-position:-1540px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre:hover{ + background-position:-1104px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre:hover{ + background-position:-1610px 0; +} +/*播放速度*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playbackrate-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate:hover{ + color: #0368d0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box:hover .ck-bar-playbackrate-bg-box { + display: block; +} +/*字幕*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-track-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-track-box .ck-bar-track{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track:hover{ + color: #0368d0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box:hover .ck-bar-track-bg-box { + display: block; +} +/*清晰度*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-definition-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-definition-box .ck-bar-definition{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition:hover{ + color: #0368d0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box:hover .ck-bar-definition-bg-box { + display: block; +} +/*列表切换*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box { + background: rgba(0,0,0,.001); + position: absolute; + z-index: 1; + bottom: 46px; + display: none; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box { + bottom: 68px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg{ + background: rgba(0,0,0,.6); + float: left; + border-radius: 5px; + padding: 10px; + margin-bottom: 10px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p{ + width: 100%; + float: left; + line-height: 35px; + color: #FFF; + text-align: center; + font-size: 14px; + background-color: rgba(0,0,0,0); + border: 0px; + white-space:nowrap; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p:hover{ + color: #0368d0; + font-size: 16px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p:hover{ + font-size: 20px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p-focus{ + color: #0368d0; +} +/*下一集按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-next{ + float: left; + background-position:-672px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-next{ + background-position:-980px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-next:hover{ + background-position:-720px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-next:hover{ + background-position:-1050px 0; +} +/*进度栏*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress{ + width: 100%; + position:absolute; + z-index: 1; + height: 12px; + top:-11px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg{ + width: 100%; + background: rgba(255,255,255,.3); + margin-top: 2px; + overflow: hidden; + height: 10px; + transition: .2s; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-load{ + float: left; + width: 0px; + background: rgba(169,169,169,.7); + height: 10px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-play{ + width: 0px; + background: #0368d0; + position: absolute; + z-index: 1; + height: 10px; + transition: .2s; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-mouseline{ + width: 3px; + background: rgba(255,255,255,.6); + position: absolute; + z-index: 2; + display: none; + height: 10px; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-prompt{ + background: #FFF; + position: absolute; + z-index: 3; + border-radius: 50%; + width: 10px; + height: 10px; + top:2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-slider{ + border-radius: 50%; + overflow: hidden; + position: relative; + float: left; + z-index: 4; + left: 0px; + cursor: pointer; + width: 12px; + height: 12px; + top: -11px; + background: #FFF; + box-shadow: 0px 0px 0px 4px rgba(255,255,255,.5); +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-slider:hover{ + background: #0368d0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg:hover .ck-bar-progress-mouseline{ + display: block; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out{ + height: 2px; + top:-2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-load,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg .ck-bar-progress-play{ + height: 2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-slider{ + width: 12px; + height: 2px; + top: -2px; + box-shadow: 0px 0px 0px 0px rgba(255,255,255,0); + background: rgba(255,255,255,0); + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg .ck-bar-progress-prompt{ + height: 2px; + border-radius: 0; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-slider-move .ck-bar-progress-play,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-slider-move .ck-bar-progress-slider{ + transition: 0s; +} + +/*音量调节栏*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox{ + float: right; + width: 48px; + overflow-x: hidden; +} +/*音量调节栏*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox{ + width: 70px; +} +/*默认状态-音量调节总外框*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume{ + width: 48px; + height: 215px; + background: rgba(0,0,0,.01); + position: absolute; + z-index: 1; + bottom: 46px; + display: none; + overflow: hidden; +} +/*全屏状态-音量调节总外框*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-bar-volume{ + width: 70px; + bottom: 68px; +} +/*默认状态-音量调节总外框-鼠标经过时样式*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox:hover .ck-bar-volume{ + display: block; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .1s; + animation-duration: .1s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +/*共用状态-音量调节内部外框*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volumex{ + width: 100%; + height: 200px; + float: left; + background: rgba(0,0,0,.8); + border-radius: 5px; +} +/*共用状态-音量调节顶部文字*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-txt{ + width: 100%; + height: 40px; + line-height: 40px; + color: #FFF; + text-align: center; + font-size: 1rem; + float: left; + overflow: hidden; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*共用状态-音量调节背景色*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-bg{ + width: 8px; + height: 140px; + background: #808080; + border-radius: 3px; + overflow: hidden; + cursor: pointer; + margin: auto; +} +/*共用状态-音量调节前景色*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-bg .ck-bar-volume-pp{ + width: 8px; + height: 140px; + background: #0368d0; + margin-top: 140px; +} +/*共用状态-音量调节拖动小按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-slider{ + width: 10px; + height: 10px; + background: #FFF; + border-radius: 50%; + overflow: hidden; + box-shadow: 0px 0px 0px 8px rgba(255,255,255,.5); + position: absolute; + z-index: 1; + top: 0px; + left: 19px; + cursor: pointer; +} +/*全屏状态-音量调节拖动小按钮*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-slider{ + left: 30px; +} +/*默认状态-显示时间*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-time{ + float: left; + line-height: 48px; + font-size: 16px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*全屏状态-显示时间*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-time{ + float: left; + line-height: 70px; + font-size: 18px; + color: #FFF; +} +/*右侧控制栏*/ +.ckplayer-ckplayer .ck-main .ck-right-bar{ + position: absolute; + z-index: 260; + top: 0; + right: 2px; + bottom: 0; + margin: auto !important; + width: 48px; + height: 144px; + background: rgba(0,0,0,.3); + border-radius: 5px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-right-bar-hide{ + right: -48px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar{ + width: 70px; + height: 210px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar-hide{ + right: -70px; + transition: .2s; +} +/*截图按钮*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-btn-screenshot{ + float: left; + background-position:-1536px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-btn-screenshot{ + background-position:-2240px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-btn-screenshot:hover{ + background-position:-1584px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-btn-screenshot:hover{ + background-position:-2310px 0; +} +/*小窗口按钮组*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows button{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open{ + background-position:-1248px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open{ + background-position:-1820px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open:hover{ + background-position:-1296px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open:hover{ + background-position:-1890px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close{ + background-position:-1152px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close{ + background-position:-1680px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close:hover{ + background-position:-1200px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close:hover{ + background-position:-1750px 0; +} +/*循环按钮组*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open{ + background-position:-1440px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open{ + background-position:-2100px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open:hover{ + background-position:-1488px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open:hover{ + background-position:-2170px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close{ + background-position:-1344px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close{ + background-position:-1960px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close:hover{ + background-position:-1392px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close:hover{ + background-position:-2030px 0; +} +/*顶部显示栏*/ +.ckplayer-ckplayer .ck-main .ck-top-bar{ + position: absolute; + z-index: 260; + top: -36px; + width: 100%; + height: 36px; + background: rgba(0,0,0,.3); + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-top-bar-hide{ + top: -36px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-top-bar{ + top: 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-top-bar-hide{ + top: -36px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom{ + position: absolute; + z-index: 260; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container{ + float: left; + margin-left: 10px; + margin-top: 9px; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left{ + float: left; + width: 20px; + height: 18px; + border: 1px solid #FFF; + box-sizing:content-box; + -moz-box-sizing:content-box; /* Firefox */ + -webkit-box-sizing:content-box; /* Safari */ +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-left, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-left{ + border-color: #0368d0; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-left div, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-left div{ + background: #0368d0; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-right{ + float: left; + font-size: 14px; + color: #FFF; + padding-left: 5px; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-right, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-right{ + color: #0368d0; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-50{ + width: 50%; + height: 50%; + background: #FFF; + margin: 4.5px 25%; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-75{ + width: 75%; + height: 50%; + background: #FFF; + margin: 4.5px 12.5%; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-100{ + width: 100%; + height: 50%; + background: #FFF; + margin: 4.5px 0; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-title{ + position: absolute; + z-index: 1; + top: 0px; + width: 100%; + height: 36px; + line-height: 36px; + text-align: center; + font-size: 18px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-time{ + float: right; + height: 36px; + line-height: 36px; + font-size: 14px; + color: #FFF; + padding: 0 1rem 0; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*以下为缓动效果样式*/ +.ck-animate { + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .3s; + animation-duration: .3s; +} +.ck-animate-bouncein { + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} + +@-webkit-keyframes ck-bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5) + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes ck-bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.5); + -ms-transform: scale(.5); + transform: scale(.5); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +.ck-animate-bounceout { + -webkit-animation-name: ck-bounceOut; + animation-name: ck-bounceOut; +} + +@-webkit-keyframes ck-bounceOut { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5); + } +} + +@keyframes ck-bounceOut { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5); + } +} +.ck-animate-circle { + animation: ck-Circle 1s linear infinite; + -webkit-animation: ck-Circle 1s linear infinite +} + +@-webkit-keyframes ck-Circle { + 0% { + transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg) + } + 25% { + transform: rotate(90deg); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg) + } + 50% { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg) + } + 75% { + transform: rotate(270deg); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg) + } + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg) + } +} + +@keyframes ck-Circle { + 0% { + transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg) + } + 25% { + transform: rotate(90deg); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg) + } + 50% { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg) + } + 75% { + transform: rotate(270deg); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg) + } + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg) + } +} \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/css/ckplayer.ixigua.css b/modules/core/src/main/resources/static/ckplayer/css/ckplayer.ixigua.css new file mode 100644 index 00000000..91531e73 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/css/ckplayer.ixigua.css @@ -0,0 +1,1707 @@ +.ckplayer-error{ + position: fixed; + z-index: 9999999; + left: 10px; + bottom: 10px; + width: auto; + height: 38px; + line-height: 38px; + padding: 0 .85rem; + background: rgb(0,0,0,.9); + border-radius: .25rem; + color: #FFF; + font-size: 14px; + white-space: nowrap; +} +.ckplayer-ckplayer{ + width: 100%; + height: 100%; + float: left; + background: #000; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-nocursor{ + cursor: none; +} +.ckplayer-ckplayer-smallwindow{ + position: fixed; + z-index: 9999999; + width: 420px; + max-width: 100%; + height: 266px; + right: 10px; + bottom: 10px; +} +.ckplayer-ckplayer .ck-main{ + width: 100%; + height: 100%; + overflow: hidden; + background: #000; + position: relative; +} +.ckplayer-ckplayer .ck-main .ck-video{ + width: 100%; + height: 100%; + overflow: hidden; + position:absolute; + z-index: 1; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-video video,.ckplayer-ckplayer .ck-main .ck-video canvas{ + width: 100%; + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-error{ + width: 100%; + height: 80px; + line-height: 35px; + text-align: center; + color: #FFF; + position:absolute; + z-index: 70; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main .ck-logo{ + position:absolute; + right: 20px; + top:20px; + z-index: 400; +} +.ckplayer-ckplayer .ck-main .ck-loading{ + position:absolute; + top:0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + z-index: 80; + width: 80px; + height: 80px; + border-radius: 50%; + background: url(images/loading.png) no-repeat center center; + background-size: 100% 100%; + animation: ck-Circle 1.5s linear infinite; + -webkit-animation: ck-Circle 1.5s linear infinite +} +.ckplayer-ckplayer .ck-main .ck-center-play{ + background: url(images/play.png) no-repeat 70% center; + background-size:60% 60%; + border: 8px solid rgba(255,255,255,.3); + border-radius: 50%; + box-sizing:border-box; + -moz-box-sizing:border-box; /* Firefox */ + -webkit-box-sizing:border-box; /* Safari */ + width: 80px; + height: 80px; + position: absolute; + display: none; + z-index: 90; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + cursor: pointer; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-center-play{ + width: 100px; + height: 100px; +} +.ckplayer-ckplayer .ck-main .ck-center-play:hover{ + width: 100px; + height: 100px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-center-play:hover{ + width: 120px; + height: 120px; +} +.ckplayer-ckplayer .ck-main .ck-buffer{ + background: url(images/buffer.png) no-repeat center center; + background-size:100% 100%; + border-radius: 50%; + width: 60px; + height: 60px; + position: absolute; + z-index: 100; + top:0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + display: none; + animation: ck-Circle 1s linear infinite; + -webkit-animation: ck-Circle 1s linear infinite +} +.ckplayer-ckplayer .ck-main .ck-message{ + position: absolute; + z-index: 240; + left:5px; + bottom: 78px; + padding: 0 1rem; + line-height: 30px; + height: 30px; + width: auto; + min-width: 1px; + border-radius: .25rem; + background: rgba(0,0,0,.6); + font-size: 14px; + color: #FFF; + display: none; + white-space:nowrap; +} +.ckplayer-ckplayer .ck-main .ck-message-right{ + left:auto; + right: 5px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-message{ + font-size: 18px; + bottom: 100px; +} +.ckplayer-ckplayer .ck-main .ck-tip{ + width: auto; + height: auto; + position: absolute; + z-index: 230; + display: none; + margin-bottom: 1px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content{ + width: auto; + height: auto; + white-space: nowrap; + min-width: 1px; + background: rgba(0,0,0,.6); + font-size: 14px; + color: #FFF; + line-height: 32px; + height: 32px; + padding: 0 15px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content-float-auto{ + border-radius: 5px; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content-float-left{ + border-radius: 5px; + float: left; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-tip .ck-content{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle{ + width: 0px; + height: 0px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle-auto{ + border-left: 8px solid transparent; + border-top: 8px solid rgba(0, 0, 0,.6); + border-right: 8px solid transparent; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle-left{ + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 8px solid rgba(0, 0, 0,.6); + float: left; + margin-top: 10px; +} +.ckplayer-ckplayer .ck-main .ck-preview{ + position: absolute; + z-index: 210; + width: 100%; + left:0; + bottom: 64px; + overflow: hidden; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-preview{ + bottom: 86px; +} +.ckplayer-ckplayer .ck-main .ck-preview-load-img{ + position: absolute; + z-index: 210; + top:110%; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-bg{ + position: absolute; + z-index: 1; + top:0; + float: left; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-bg .ck-preview-img{ + background-repeat: no-repeat ; + float: left; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-frame{ + position: absolute; + z-index: 2; + top:0; + left:-1000px; + border:4px solid #0078ff; + box-sizing:content-box; + -moz-box-sizing:content-box; /* Firefox */ + -webkit-box-sizing:content-box; /* Safari */ +} +.ckplayer-ckplayer .ck-main .ck-prompt-words{ + position: absolute; + z-index: 220; + width: 213px; + line-height: 23px; + font-size: 14px; + color: #FFF; + background: rgba(0, 0, 0,.6); + overflow: hidden; + display: none; + margin-bottom: 10px; + border-radius: 3px; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +.ckplayer-ckplayer .ck-main .ck-prompt-words .ck-prompt-content{ + padding: 5px; +} +.ckplayer-ckplayer .ck-main .ck-layer{ + position: absolute; + z-index: 101; +} +.ckplayer-ckplayer .ck-main .ck-tempTime{ + position: absolute; + z-index: 20; + left:10px; + bottom: 5px; + display: none; + font-size: 14px; + line-height: 28px; + color: #FFF; +} +/*关于*/ +.ckplayer-ckplayer .ck-main .ck-about{ + position: absolute; + z-index: 200; + width: 50%; + max-width: 600px; + min-width: 400px; + left: 1rem; + top: 1rem; + background: rgba(0,0,0,.6); + padding: 1rem 0; + display: none; +} +.ckplayer-ckplayer .ck-main .ck-about ul{ + padding: 0; + margin: 0; +} +.ckplayer-ckplayer .ck-main .ck-about ul li{ + list-style:none; + color: #FFF; + font-size: 12px; + line-height: 18px; + height: 18px; + padding: 0; + margin: 0; +} +.ckplayer-ckplayer .ck-main .ck-about ul li .ck-about-title{ + width: 100px; + text-align: right; + float: left; + padding-right: .5rem; +} +.ckplayer-ckplayer .ck-main .ck-about ul li .ck-about-content{ + width: auto; + float: left; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar{ + position: absolute; + z-index: 1; + top: 0; + right: 0; + width: 96px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar{ + width: 140px; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-copy{ + background-position:-1632px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-copy:hover{ + background-position:-1680px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-copy{ + background-position:-2380px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-copy:hover{ + background-position:-2450px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-close{ + background-position:-1728px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-close:hover{ + background-position:-1776px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-close{ + background-position:-2520px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-close:hover{ + background-position:-2590px 0; +} +/*截图显示容器*/ +.ckplayer-ckplayer .ck-main .ck-screenshot{ + position: absolute; + z-index: 220; + width: auto; + height: 144px; + margin: auto !important; + top: 0; + bottom: 0; + right: 55px; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-screenshot{ + height: 210px; + right: 77px; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-img{ + position: absolute; + z-index: 1; + width: 100%; + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-img img{ + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar{ + position: absolute; + z-index: 1; + width: 100%; + height: 36px; + bottom: 5px; + text-align: center; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn{ + display: inline-block; + overflow: hidden; + border: 0px solid transparent; + border-radius: 5px; + vertical-align: middle; + text-align: center; + text-decoration: none; + white-space: nowrap; + font-size: 14px; + line-height: 30px; + padding: 0px 15px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + color: #fff; + margin: 0 5px; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn:hover{ + color: #FFFF00; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn:focus{ + outline:0; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-down{ + background-color: #007bff; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-close{ + background-color: #505050; + color: #fff; +} +/*广告*/ +.ckplayer-ckplayer .ck-main .ck-yytf{ + position: absolute; + z-index: 800; + width: 100%; + height: 100%; + left: 0px; + top: 0px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-link{ + width: 100%; + height: 100%; + display: none; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-picture{ + width: 100%; + height: 100%; + background: #000; + display: none; + text-align: center; + line-height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-picture img{ + max-width: 100%; + max-height: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top{ + position: absolute; + z-index: 3; + top: 10px; + right: 10px; +} + +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top div{ + float: right; + margin-left: 10px; + font-size: 14px; + border-radius: 15px; + background: rgba(0,0,0,.6); + padding: 0px 10px; + line-height: 30px; + height: 30px; + color: #FFF; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-top div{ + font-size: 18px; + border-radius: 20px; + line-height: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top .ck-yytf-closetime{ + display: none; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top .ck-yytf-closead{ + cursor: pointer; + display: none; +} + +/*显示广告时的底部内容*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom{ + position: absolute; + z-index: 3; + bottom: 10px; + right: 10px; +} +/*显示广告时的底部按钮-共用*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-btn{ + background-color: rgba(0,0,0,.6); + background-image: url(images/ckplayer_ixigua.png); + background-size: auto 100%; + border: none; + outline: none; + width: 30px; + height: 30px; + cursor: pointer; + background-repeat: no-repeat; + border-radius: 50%; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-btn{ + width: 40px; + height: 40px; +} +/*显示广告时的静音按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit{ + float: right; + width: 30px; + height: 30px; + margin-left: 10px; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit{ + width: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted{ + background-position:-180px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted:hover{ + background-position:-210px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted:hover{ + background-position:-270px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted:hover{ + background-position:-280px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted{ + background-position:-320px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted:hover{ + background-position:-360px 0; +} +/*显示广告时的全屏按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit{ + float: right; + width: 30px; + height: 30px; + margin-left: 10px; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit{ + width: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full{ + background-position:-300px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full:hover{ + background-position:-330px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull{ + background-position:-360px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull:hover{ + background-position:-390px 0; +} + +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full{ + background-position:-400px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full:hover{ + background-position:-440px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull{ + background-position:-480px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull:hover{ + background-position:-520px 0; +} +/*广告查看详情按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-details{ + float: right; + font-size: 14px; + border-radius: 15px; + background: rgba(0,0,0,.6); + padding: 0 10px; + color: #FFF; + line-height: 30px; + height: 30px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-details{ + font-size: 18px; + border-radius: 20px; + line-height: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-details a{ + color: #FFF; + text-decoration: none; +} +/*暂停广告容器*/ +.ckplayer-ckplayer .ck-main .ck-pause-yytf{ + display: none; + position:absolute; + z-index: 800; + max-width: 100%; + max-height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-pause-yytf img{ + max-width: 100%; + max-height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-pause-close{ + position:absolute; + z-index: 1; + right: -15px; + top:-15px; + width: 30px; + height: 30px; + background-color: transparent; + background-image: url(images/adclose.png); + border: none; + outline: none; + cursor: pointer; + background-repeat: no-repeat ; +} +.ckplayer-ckplayer .ck-main .ck-pause-close:hover{ + background-position:-30px 0; +} +/*右键菜单*/ +.ckplayer-ckplayer-menu{ + width:120px; + background: rgba(0,0,0,.8); + position: absolute; + z-index: 9000; + font-size:14px ; + border: 1px #000 solid; + display: none; + border-radius: 5px; +} +.ckplayer-ckplayer-menu .ck-li{ + color: #adadad; + line-height: 35px; + padding: 0 0 0 5px; +} +.ckplayer-ckplayer-menu .ck-li a{ + color: #FFF; + text-decoration: none; +} +.ckplayer-ckplayer-menu .ck-underline{ + border-bottom: 1px #000 solid; +} +/*控制栏*/ +.ckplayer-ckplayer .ck-main .ck-bar{ + position:absolute; + z-index: 260; + left:0px; + bottom:0px; + width: 100%; + height: 48px; + background: rgba(0,0,0,.3); + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar{ + height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar.ck-bar-out{ + bottom: -50px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar.ck-bar-out{ + bottom: -80px; + transition: 0.2s; +} + +/*按钮公用样式*/ +.ckplayer-ckplayer .ck-main .ck-bar-btn{ + background-color: transparent; + background-image: url(images/ckplayer_ixigua.48.png); + background-size: auto 100%; + border: none; + outline: none; + width: 48px; + height: 48px; + cursor: pointer; + background-repeat: no-repeat ; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar-btn{ + background-image: url(images/ckplayer_ixigua.png); + width: 70px; + height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-btn:hover{ + background-size:auto 100%; +} + +/*播放暂停按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-play{ + background-position:0px top; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-play:hover{ + background-position:-48px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-play:hover{ + background-position:-70px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-pause{ + background-position:-96px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-pause{ + background-position:-140px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-pause:hover{ + background-position:-144px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-pause:hover{ + background-position:-210px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-refresh{ + background-position:-192px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-refresh{ + background-position:-280px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-refresh:hover{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-refresh:hover{ + background-position:-350px 0; +} + +/*返回播放按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive{ + float: left; + font-size: 16px; + line-height: 28px; + border-radius: 3px; + margin: 10px; + border: 0px; + background: rgba(3,60,146,.5); + color: #FFF; + cursor: pointer; + padding: 0 8px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-btn-backlive{ + font-size: 18px; + line-height: 36px; + margin: 17px 10px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive:hover{ + background: rgba(3,60,146,.9); +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive:focus{ + outline:0; + background: rgba(3,60,146,.6); +} +/*静音取消静音按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-muted{ + background-position:-288px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-muted{ + background-position:-420px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-muted:hover{ + background-position:-336px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-muted:hover{ + background-position:-490px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-exitmuted{ + background-position:-384px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-exitmuted{ + background-position:-560px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-exitmuted:hover{ + background-position:-432px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-exitmuted:hover{ + background-position:-630px 0; +} + +/*全屏按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-full{ + background-position:-480px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-full{ + background-position:-700px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-full:hover{ + background-position:-528px 0; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .5s; + animation-duration: .5s; + -webkit-animation-name: ck-button-hover; + animation-name: ck-button-hover; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-full:hover{ + background-position:-770px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-exitfull{ + background-position:-672px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-exitfull{ + background-position:-840px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-exitfull:hover{ + background-position:-720px 0; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .5s; + animation-duration: .5s; + -webkit-animation-name: ck-button-hover; + animation-name: ck-button-hover; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-exitfull:hover{ + background-position:-910px 0; +} + +/*网页全屏按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-webfull{ + background-position:-768px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-webfull{ + background-position:-1120px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-webfull:hover{ + background-position:-816px 0; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .5s; + animation-duration: .5s; + -webkit-animation-name: ck-button-hover; + animation-name: ck-button-hover; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-webfull:hover{ + background-position:-1190px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull{ + background-position:-864px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull{ + background-position:-1260px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull:hover{ + background-position:-912px 0; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .5s; + animation-duration: .5s; + -webkit-animation-name: ck-button-hover; + animation-name: ck-button-hover; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull:hover{ + background-position:-1330px 0; +} + +/*剧场模式按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-theatre{ + background-position:-960px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-theatre{ + background-position:-1400px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-theatre:hover{ + background-position:-1008px 0; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .5s; + animation-duration: .5s; + -webkit-animation-name: ck-button-hover-x; + animation-name: ck-button-hover-x; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-theatre:hover{ + background-position:-1470px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre{ + background-position:-1056px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre{ + background-position:-1540px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre:hover{ + background-position:-1104px 0; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .5s; + animation-duration: .5s; + -webkit-animation-name: ck-button-hover-x; + animation-name: ck-button-hover-x; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre:hover{ + background-position:-1610px 0; +} +/*播放速度*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playbackrate-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #cfcccc; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate:hover{ + color: #FFF; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box:hover .ck-bar-playbackrate-bg-box { + display: block; +} +/*字幕*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-track-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #cfcccc; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-track-box .ck-bar-track{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track:hover{ + color: #FFF; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box:hover .ck-bar-track-bg-box { + display: block; +} +/*清晰度*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-definition-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #cfcccc; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-definition-box .ck-bar-definition{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition:hover{ + color: #FFF; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box:hover .ck-bar-definition-bg-box { + display: block; +} +/*列表切换*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box { + background: rgba(0,0,0,.001); + position: absolute; + z-index: 1; + bottom: 46px; + display: none; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box { + bottom: 68px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg{ + background: rgba(0,0,0,.6); + float: left; + border-radius: 5px; + padding: 10px; + margin-bottom: 10px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p{ + width: 100%; + float: left; + line-height: 35px; + color: #cfcccc; + text-align: center; + font-size: 14px; + background-color: rgba(0,0,0,0); + border: 0px; + white-space:nowrap; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p:hover{ + color: #FFF; + font-size: 16px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p:hover{ + font-size: 20px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p-focus{ + color: #FF0302; +} +/*下一集按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-next{ + float: left; + background-position:-672px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-next{ + background-position:-980px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-next:hover{ + background-position:-720px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-next:hover{ + background-position:-1050px 0; +} +/*进度栏*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress{ + width: 100%; + position:absolute; + z-index: 1; + height: 12px; + top:-11px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg{ + width: 100%; + background: rgba(255,255,255,.3); + margin-top: 2px; + overflow: hidden; + height: 10px; + transition: .2s; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-load{ + float: left; + width: 0px; + background: rgba(169,169,169,.7); + height: 10px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-play{ + width: 0px; + background: #e80101; + position: absolute; + z-index: 1; + height: 10px; + transition: .2s; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-mouseline{ + width: 3px; + background: rgba(255,255,255,.6); + position: absolute; + z-index: 2; + display: none; + height: 10px; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-prompt{ + background: #FFF; + position: absolute; + z-index: 3; + border-radius: 50%; + width: 10px; + height: 10px; + top:2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-slider{ + border-radius: 50%; + overflow: hidden; + position: relative; + float: left; + z-index: 4; + left: 0px; + cursor: pointer; + width: 12px; + height: 12px; + top: -11px; + background: #FFF; + box-shadow: 0px 0px 0px 4px rgba(255,255,255,.5); +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-slider:hover{ + background: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg:hover .ck-bar-progress-mouseline{ + display: block; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out{ + height: 2px; + top:-2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-load,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg .ck-bar-progress-play{ + height: 2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-slider{ + width: 12px; + height: 2px; + top: -2px; + box-shadow: 0px 0px 0px 0px rgba(255,255,255,0); + background: rgba(232,1,1,0); + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg .ck-bar-progress-prompt{ + height: 2px; + border-radius: 0; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-slider-move .ck-bar-progress-play,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-slider-move .ck-bar-progress-slider{ + transition: 0s; +} + +/*音量调节栏*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox{ + float: right; + width: 48px; + overflow-x: hidden; +} +/*音量调节栏*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox{ + width: 70px; +} +/*默认状态-音量调节总外框*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume{ + width: 48px; + height: 215px; + background: rgba(0,0,0,.01); + position: absolute; + z-index: 1; + bottom: 46px; + display: none; + overflow: hidden; +} +/*全屏状态-音量调节总外框*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-bar-volume{ + width: 70px; + bottom: 68px; +} +/*默认状态-音量调节总外框-鼠标经过时样式*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox:hover .ck-bar-volume{ + display: block; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .1s; + animation-duration: .1s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +/*共用状态-音量调节内部外框*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volumex{ + width: 100%; + height: 200px; + float: left; + background: rgba(0,0,0,.8); + border-radius: 5px; +} +/*共用状态-音量调节顶部文字*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-txt{ + width: 100%; + height: 40px; + line-height: 40px; + color: #FFF; + text-align: center; + font-size: 1rem; + float: left; + overflow: hidden; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*共用状态-音量调节背景色*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-bg{ + width: 8px; + height: 140px; + background: #808080; + border-radius: 3px; + overflow: hidden; + cursor: pointer; + margin: auto; +} +/*共用状态-音量调节前景色*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-bg .ck-bar-volume-pp{ + width: 8px; + height: 140px; + background: #e80101; + margin-top: 140px; +} +/*共用状态-音量调节拖动小按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-slider{ + width: 10px; + height: 10px; + background: #FFF; + border-radius: 50%; + overflow: hidden; + box-shadow: 0px 0px 0px 8px rgba(255,255,255,.5); + position: absolute; + z-index: 1; + top: 0px; + left: 19px; + cursor: pointer; +} +/*全屏状态-音量调节拖动小按钮*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-slider{ + left: 30px; +} +/*默认状态-显示时间*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-time{ + float: left; + line-height: 48px; + font-size: 16px; + color: #cfcccc; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*全屏状态-显示时间*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-time{ + float: left; + line-height: 70px; + font-size: 18px; + color: #cfcccc; +} +/*右侧控制栏*/ +.ckplayer-ckplayer .ck-main .ck-right-bar{ + position: absolute; + z-index: 260; + top: 0; + right: 2px; + bottom: 0; + margin: auto !important; + width: 48px; + height: 144px; + background: rgba(0,0,0,.3); + border-radius: 5px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-right-bar-hide{ + right: -48px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar{ + width: 70px; + height: 210px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar-hide{ + right: -70px; + transition: .2s; +} +/*截图按钮*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-btn-screenshot{ + float: left; + background-position:-1536px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-btn-screenshot{ + background-position:-2240px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-btn-screenshot:hover{ + background-position:-1584px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-btn-screenshot:hover{ + background-position:-2310px 0; +} +/*小窗口按钮组*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows button{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open{ + background-position:-1248px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open{ + background-position:-1820px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open:hover{ + background-position:-1296px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open:hover{ + background-position:-1890px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close{ + background-position:-1152px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close{ + background-position:-1680px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close:hover{ + background-position:-1200px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close:hover{ + background-position:-1750px 0; +} +/*循环按钮组*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open{ + background-position:-1440px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open{ + background-position:-2100px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open:hover{ + background-position:-1488px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open:hover{ + background-position:-2170px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close{ + background-position:-1344px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close{ + background-position:-1960px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close:hover{ + background-position:-1392px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close:hover{ + background-position:-2030px 0; +} +/*顶部显示栏*/ +.ckplayer-ckplayer .ck-main .ck-top-bar{ + position: absolute; + z-index: 260; + top: -36px; + width: 100%; + height: 36px; + background: rgba(0,0,0,.3); + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-top-bar-hide{ + top: -36px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-top-bar{ + top: 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-top-bar-hide{ + top: -36px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom{ + position: absolute; + z-index: 260; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container{ + float: left; + margin-left: 10px; + margin-top: 9px; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left{ + float: left; + width: 20px; + height: 18px; + border: 1px solid #FFF; + box-sizing:content-box; + -moz-box-sizing:content-box; /* Firefox */ + -webkit-box-sizing:content-box; /* Safari */ +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-left, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-left{ + border-color: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-left div, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-left div{ + background: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-right{ + float: left; + font-size: 14px; + color: #FFF; + padding-left: 5px; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-right, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-right{ + color: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-50{ + width: 50%; + height: 50%; + background: #FFF; + margin: 4.5px 25%; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-75{ + width: 75%; + height: 50%; + background: #FFF; + margin: 4.5px 12.5%; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-100{ + width: 100%; + height: 50%; + background: #FFF; + margin: 4.5px 0; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-title{ + position: absolute; + z-index: 1; + top: 0px; + width: 100%; + height: 36px; + line-height: 36px; + text-align: center; + font-size: 18px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-time{ + float: right; + height: 36px; + line-height: 36px; + font-size: 14px; + color: #FFF; + padding: 0 1rem 0; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*以下为缓动效果样式*/ +.ck-animate { + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .3s; + animation-duration: .3s; +} +.ck-animate-bouncein { + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} + +@-webkit-keyframes ck-bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5) + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes ck-bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.5); + -ms-transform: scale(.5); + transform: scale(.5); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +.ck-animate-bounceout { + -webkit-animation-name: ck-bounceOut; + animation-name: ck-bounceOut; +} + +@-webkit-keyframes ck-bounceOut { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5); + } +} + +@keyframes ck-bounceOut { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5); + } +} + +.ck-animate-circle { + animation: ck-Circle 1s linear infinite; + -webkit-animation: ck-Circle 1s linear infinite +} + +@-webkit-keyframes ck-Circle { + 0% { + transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg) + } + 25% { + transform: rotate(90deg); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg) + } + 50% { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg) + } + 75% { + transform: rotate(270deg); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg) + } + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg) + } +} + +@keyframes ck-Circle { + 0% { + transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg) + } + 25% { + transform: rotate(90deg); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg) + } + 50% { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg) + } + 75% { + transform: rotate(270deg); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg) + } + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg) + } +} + +@-webkit-keyframes ck-button-hover { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.2); + transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes ck-button-hover { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.2); + transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@-webkit-keyframes ck-button-hover-x { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.2,1); + transform: scale(1.2,1); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes ck-button-hover-x { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.2,1); + transform: scale(1.2,1); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/css/ckplayer.red.css b/modules/core/src/main/resources/static/ckplayer/css/ckplayer.red.css new file mode 100644 index 00000000..9359590c --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/css/ckplayer.red.css @@ -0,0 +1,1609 @@ +.ckplayer-error{ + position: fixed; + z-index: 9999999; + left: 10px; + bottom: 10px; + width: auto; + height: 38px; + line-height: 38px; + padding: 0 .85rem; + background: rgb(0,0,0,.9); + border-radius: .25rem; + color: #FFF; + font-size: 14px; + white-space: nowrap; +} +.ckplayer-ckplayer{ + width: 100%; + height: 100%; + float: left; + background: #000; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-nocursor{ + cursor: none; +} +.ckplayer-ckplayer-smallwindow{ + position: fixed; + z-index: 9999999; + width: 420px; + max-width: 100%; + height: 266px; + right: 10px; + bottom: 10px; +} +.ckplayer-ckplayer .ck-main{ + width: 100%; + height: 100%; + overflow: hidden; + background: #000; + position: relative; +} +.ckplayer-ckplayer .ck-main .ck-video{ + width: 100%; + height: 100%; + overflow: hidden; + position:absolute; + z-index: 1; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-video video,.ckplayer-ckplayer .ck-main .ck-video canvas{ + width: 100%; + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-error{ + width: 100%; + height: 80px; + line-height: 35px; + text-align: center; + color: #FFF; + position:absolute; + z-index: 70; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main .ck-logo{ + position:absolute; + right: 20px; + top:20px; + z-index: 400; +} +.ckplayer-ckplayer .ck-main .ck-loading{ + position:absolute; + top:0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + z-index: 80; + width: 80px; + height: 80px; + border-radius: 50%; + background: url(images/loading.png) no-repeat center center; + background-size: 100% 100%; + animation: ck-Circle 1.5s linear infinite; + -webkit-animation: ck-Circle 1.5s linear infinite +} +.ckplayer-ckplayer .ck-main .ck-center-play{ + background: url(images/play.png) no-repeat 70% center; + background-size:60% 60%; + border: 8px solid rgba(255,255,255,.3); + border-radius: 50%; + box-sizing:border-box; + -moz-box-sizing:border-box; /* Firefox */ + -webkit-box-sizing:border-box; /* Safari */ + width: 80px; + height: 80px; + position: absolute; + display: none; + z-index: 90; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + cursor: pointer; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-center-play{ + width: 100px; + height: 100px; +} +.ckplayer-ckplayer .ck-main .ck-center-play:hover{ + width: 100px; + height: 100px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-center-play:hover{ + width: 120px; + height: 120px; +} +.ckplayer-ckplayer .ck-main .ck-buffer{ + background: url(images/buffer.png) no-repeat center center; + background-size:100% 100%; + border-radius: 50%; + width: 60px; + height: 60px; + position: absolute; + z-index: 100; + top:0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + display: none; + animation: ck-Circle 1s linear infinite; + -webkit-animation: ck-Circle 1s linear infinite +} +.ckplayer-ckplayer .ck-main .ck-message{ + position: absolute; + z-index: 240; + left:5px; + bottom: 78px; + padding: 0 1rem; + line-height: 30px; + height: 30px; + width: auto; + min-width: 1px; + border-radius: .25rem; + background: rgba(0,0,0,.6); + font-size: 14px; + color: #FFF; + display: none; + white-space:nowrap; +} +.ckplayer-ckplayer .ck-main .ck-message-right{ + left:auto; + right: 5px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-message{ + font-size: 18px; + bottom: 100px; +} +.ckplayer-ckplayer .ck-main .ck-tip{ + width: auto; + height: auto; + position: absolute; + z-index: 230; + display: none; + margin-bottom: 1px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content{ + width: auto; + height: auto; + white-space: nowrap; + min-width: 1px; + background: rgba(0,0,0,.6); + font-size: 14px; + color: #FFF; + line-height: 32px; + height: 32px; + padding: 0 15px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content-float-auto{ + border-radius: 5px; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-content-float-left{ + border-radius: 5px; + float: left; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-tip .ck-content{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle{ + width: 0px; + height: 0px; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle-auto{ + border-left: 8px solid transparent; + border-top: 8px solid rgba(0, 0, 0,.6); + border-right: 8px solid transparent; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-tip .ck-triangle-left{ + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 8px solid rgba(0, 0, 0,.6); + float: left; + margin-top: 10px; +} +.ckplayer-ckplayer .ck-main .ck-preview{ + position: absolute; + z-index: 210; + width: 100%; + left:0; + bottom: 64px; + overflow: hidden; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-preview{ + bottom: 86px; +} +.ckplayer-ckplayer .ck-main .ck-preview-load-img{ + position: absolute; + z-index: 210; + top:110%; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-bg{ + position: absolute; + z-index: 1; + top:0; + float: left; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-bg .ck-preview-img{ + background-repeat: no-repeat ; + float: left; +} +.ckplayer-ckplayer .ck-main .ck-preview .ck-preview-frame{ + position: absolute; + z-index: 2; + top:0; + left:-1000px; + border:4px solid #0078ff; + box-sizing:content-box; + -moz-box-sizing:content-box; /* Firefox */ + -webkit-box-sizing:content-box; /* Safari */ +} +.ckplayer-ckplayer .ck-main .ck-prompt-words{ + position: absolute; + z-index: 220; + width: 213px; + line-height: 23px; + font-size: 14px; + color: #FFF; + background: rgba(0, 0, 0,.6); + overflow: hidden; + display: none; + margin-bottom: 10px; + border-radius: 3px; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +.ckplayer-ckplayer .ck-main .ck-prompt-words .ck-prompt-content{ + padding: 5px; +} +.ckplayer-ckplayer .ck-main .ck-layer{ + position: absolute; + z-index: 101; +} +.ckplayer-ckplayer .ck-main .ck-tempTime{ + position: absolute; + z-index: 20; + left:10px; + bottom: 5px; + display: none; + font-size: 14px; + line-height: 28px; + color: #FFF; +} +/*关于*/ +.ckplayer-ckplayer .ck-main .ck-about{ + position: absolute; + z-index: 200; + width: 50%; + max-width: 600px; + min-width: 400px; + left: 1rem; + top: 1rem; + background: rgba(0,0,0,.6); + padding: 1rem 0; + display: none; +} +.ckplayer-ckplayer .ck-main .ck-about ul{ + padding: 0; + margin: 0; +} +.ckplayer-ckplayer .ck-main .ck-about ul li{ + list-style:none; + color: #FFF; + font-size: 12px; + line-height: 18px; + height: 18px; + padding: 0; + margin: 0; +} +.ckplayer-ckplayer .ck-main .ck-about ul li .ck-about-title{ + width: 100px; + text-align: right; + float: left; + padding-right: .5rem; +} +.ckplayer-ckplayer .ck-main .ck-about ul li .ck-about-content{ + width: auto; + float: left; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar{ + position: absolute; + z-index: 1; + top: 0; + right: 0; + width: 96px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar{ + width: 140px; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-copy{ + background-position:-1632px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-copy:hover{ + background-position:-1680px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-copy{ + background-position:-2380px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-copy:hover{ + background-position:-2450px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-close{ + background-position:-1728px 0; +} +.ckplayer-ckplayer .ck-main .ck-about .ck-about-bar .ck-btn-about-close:hover{ + background-position:-1776px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-close{ + background-position:-2520px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-about .ck-about-bar .ck-btn-about-close:hover{ + background-position:-2590px 0; +} +/*截图显示容器*/ +.ckplayer-ckplayer .ck-main .ck-screenshot{ + position: absolute; + z-index: 220; + width: auto; + height: 144px; + margin: auto !important; + top: 0; + bottom: 0; + right: 55px; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-screenshot{ + height: 210px; + right: 77px; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-img{ + position: absolute; + z-index: 1; + width: 100%; + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-img img{ + height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar{ + position: absolute; + z-index: 1; + width: 100%; + height: 36px; + bottom: 5px; + text-align: center; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn{ + display: inline-block; + overflow: hidden; + border: 0px solid transparent; + border-radius: 5px; + vertical-align: middle; + text-align: center; + text-decoration: none; + white-space: nowrap; + font-size: 14px; + line-height: 30px; + padding: 0px 15px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + color: #fff; + margin: 0 5px; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn:hover{ + color: #FFFF00; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-btn:focus{ + outline:0; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-down{ + background-color: #007bff; +} +.ckplayer-ckplayer .ck-main .ck-screenshot .ck-screenshot-bar .ck-screenshot-close{ + background-color: #505050; + color: #fff; +} +/*广告*/ +.ckplayer-ckplayer .ck-main .ck-yytf{ + position: absolute; + z-index: 800; + width: 100%; + height: 100%; + left: 0px; + top: 0px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-link{ + width: 100%; + height: 100%; + display: none; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-picture{ + width: 100%; + height: 100%; + background: #000; + display: none; + text-align: center; + line-height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-front-picture img{ + max-width: 100%; + max-height: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top{ + position: absolute; + z-index: 3; + top: 10px; + right: 10px; +} + +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top div{ + float: right; + margin-left: 10px; + font-size: 14px; + border-radius: 15px; + background: rgba(0,0,0,.6); + padding: 0px 10px; + line-height: 30px; + height: 30px; + color: #FFF; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-top div{ + font-size: 18px; + border-radius: 20px; + line-height: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top .ck-yytf-closetime{ + display: none; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-top .ck-yytf-closead{ + cursor: pointer; + display: none; +} + +/*显示广告时的底部内容*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom{ + position: absolute; + z-index: 3; + bottom: 10px; + right: 10px; +} +/*显示广告时的底部按钮-共用*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-btn{ + background-color: rgba(0,0,0,.6); + background-image: url(images/ckplayer_red.png); + background-size: auto 100%; + border: none; + outline: none; + width: 30px; + height: 30px; + cursor: pointer; + background-repeat: no-repeat; + border-radius: 50%; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-btn{ + width: 40px; + height: 40px; +} +/*显示广告时的静音按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit{ + float: right; + width: 30px; + height: 30px; + margin-left: 10px; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit{ + width: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted{ + background-position:-180px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted:hover{ + background-position:-210px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted:hover{ + background-position:-270px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-muted:hover{ + background-position:-280px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted{ + background-position:-320px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-mutedandexit .ck-yytf-mutedandexit-exitmuted:hover{ + background-position:-360px 0; +} +/*显示广告时的全屏按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit{ + float: right; + width: 30px; + height: 30px; + margin-left: 10px; + overflow: hidden; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit{ + width: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full{ + background-position:-300px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full:hover{ + background-position:-330px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull{ + background-position:-360px 0; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull:hover{ + background-position:-390px 0; +} + +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full{ + background-position:-400px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-full:hover{ + background-position:-440px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull{ + background-position:-480px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-fullandexit .ck-yytf-fullandexit-exitfull:hover{ + background-position:-520px 0; +} +/*广告查看详情按钮*/ +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-details{ + float: right; + font-size: 14px; + border-radius: 15px; + background: rgba(0,0,0,.6); + padding: 0 10px; + color: #FFF; + line-height: 30px; + height: 30px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-yytf .ck-yytf-bottom .ck-yytf-details{ + font-size: 18px; + border-radius: 20px; + line-height: 40px; + height: 40px; +} +.ckplayer-ckplayer .ck-main .ck-yytf .ck-yytf-bottom .ck-yytf-details a{ + color: #FFF; + text-decoration: none; +} +/*暂停广告容器*/ +.ckplayer-ckplayer .ck-main .ck-pause-yytf{ + display: none; + position:absolute; + z-index: 800; + max-width: 100%; + max-height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ckplayer-ckplayer .ck-main .ck-pause-yytf img{ + max-width: 100%; + max-height: 100%; +} +.ckplayer-ckplayer .ck-main .ck-pause-close{ + position:absolute; + z-index: 1; + right: -15px; + top:-15px; + width: 30px; + height: 30px; + background-color: transparent; + background-image: url(images/adclose.png); + border: none; + outline: none; + cursor: pointer; + background-repeat: no-repeat ; +} +.ckplayer-ckplayer .ck-main .ck-pause-close:hover{ + background-position:-30px 0; +} +/*右键菜单*/ +.ckplayer-ckplayer-menu{ + width:120px; + background: rgba(50,50,50,.6); + position: absolute; + z-index: 9000; + font-size:14px ; + border: 1px #000 solid; + display: none; +} +.ckplayer-ckplayer-menu .ck-li{ + color: #adadad; + line-height: 35px; + padding: 0 0 0 5px; +} +.ckplayer-ckplayer-menu .ck-li a{ + color: #FFF; + text-decoration: none; +} +.ckplayer-ckplayer-menu .ck-underline{ + border-bottom: 1px #000 solid; +} +/*控制栏*/ +.ckplayer-ckplayer .ck-main .ck-bar{ + position:absolute; + z-index: 260; + left:0px; + bottom:0px; + width: 100%; + height: 48px; + background: rgba(0,0,0,.3); + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar{ + height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar.ck-bar-out{ + bottom: -50px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar.ck-bar-out{ + bottom: -80px; + transition: 0.2s; +} + +/*按钮公用样式*/ +.ckplayer-ckplayer .ck-main .ck-bar-btn{ + background-color: transparent; + background-image: url(images/ckplayer_red.48.png); + background-size: auto 100%; + border: none; + outline: none; + width: 48px; + height: 48px; + cursor: pointer; + background-repeat: no-repeat ; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar-btn{ + background-image: url(images/ckplayer_red.png); + width: 70px; + height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-btn:hover{ + background-size:auto 100%; +} + +/*播放暂停按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-play{ + background-position:0px top; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-play:hover{ + background-position:-48px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-play:hover{ + background-position:-70px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-pause{ + background-position:-96px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-pause{ + background-position:-140px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-pause:hover{ + background-position:-144px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-pause:hover{ + background-position:-210px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-refresh{ + background-position:-192px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-refresh{ + background-position:-280px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playandpause .ck-btn-refresh:hover{ + background-position:-240px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playandpause .ck-btn-refresh:hover{ + background-position:-350px 0; +} + +/*返回播放按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive{ + float: left; + font-size: 16px; + line-height: 28px; + border-radius: 3px; + margin: 10px; + border: 0px; + background: rgba(3,60,146,.5); + color: #FFF; + cursor: pointer; + padding: 0 8px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-btn-backlive{ + font-size: 18px; + line-height: 36px; + margin: 17px 10px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive:hover{ + background: rgba(3,60,146,.9); +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-btn-backlive:focus{ + outline:0; + background: rgba(3,60,146,.6); +} +/*静音取消静音按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-muted{ + background-position:-288px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-muted{ + background-position:-420px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-muted:hover{ + background-position:-336px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-muted:hover{ + background-position:-490px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-exitmuted{ + background-position:-384px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-exitmuted{ + background-position:-560px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-btn-exitmuted:hover{ + background-position:-432px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-btn-exitmuted:hover{ + background-position:-630px 0; +} + +/*全屏按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-full{ + background-position:-480px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-full{ + background-position:-700px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-full:hover{ + background-position:-528px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-full:hover{ + background-position:-770px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-exitfull{ + background-position:-672px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-exitfull{ + background-position:-840px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-fullandexit .ck-btn-exitfull:hover{ + background-position:-720px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-fullandexit .ck-btn-exitfull:hover{ + background-position:-910px 0; +} + +/*网页全屏按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-webfull{ + background-position:-768px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-webfull{ + background-position:-1120px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-webfull:hover{ + background-position:-816px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-webfull:hover{ + background-position:-1190px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull{ + background-position:-864px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull{ + background-position:-1260px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull:hover{ + background-position:-912px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-webfullandexit .ck-btn-exitwebfull:hover{ + background-position:-1330px 0; +} + +/*剧场模式按钮组*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit{ + float: right; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-theatre{ + background-position:-960px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-theatre{ + background-position:-1400px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-theatre:hover{ + background-position:-1008px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-theatre:hover{ + background-position:-1470px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre{ + background-position:-1056px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre{ + background-position:-1540px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre:hover{ + background-position:-1104px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-theatreandexit .ck-btn-exittheatre:hover{ + background-position:-1610px 0; +} +/*播放速度*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playbackrate-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate:hover{ + color: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box .ck-bar-playbackrate-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-playbackrate-box:hover .ck-bar-playbackrate-bg-box { + display: block; +} +/*字幕*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-track-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-track-box .ck-bar-track{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track:hover{ + color: #0368d0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box .ck-bar-track-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-track-box:hover .ck-bar-track-bg-box { + display: block; +} +/*清晰度*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box{ + float: right; + height: 48px; + line-height: 48px; + position: relative; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-definition-box{ + height: 70px; + line-height: 70px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition{ + height: 100%; + padding: 0 10px; + white-space:nowrap; + font-size: 16px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-definition-box .ck-bar-definition{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition:hover{ + color: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box .ck-bar-definition-bg-box { + width: auto; + height: auto; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-definition-box:hover .ck-bar-definition-bg-box { + display: block; +} +/*列表切换*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box { + background: rgba(0,0,0,.001); + position: absolute; + z-index: 1; + bottom: 46px; + display: none; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box { + bottom: 68px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg{ + background: rgba(0,0,0,.6); + float: left; + border-radius: 5px; + padding: 10px; + margin-bottom: 10px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p{ + width: 100%; + float: left; + line-height: 35px; + color: #FFF; + text-align: center; + font-size: 14px; + background-color: rgba(0,0,0,0); + border: 0px; + white-space:nowrap; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p:hover{ + color: #e80101; + font-size: 16px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p:hover{ + font-size: 20px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p{ + font-size: 18px; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-list-bg-box .ck-list-bg .ck-list-p-focus{ + color: #FF0302; +} +/*下一集按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-next{ + float: left; + background-position:-672px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-next{ + background-position:-980px 0; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-next:hover{ + background-position:-720px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-next:hover{ + background-position:-1050px 0; +} +/*进度栏*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress{ + width: 100%; + position:absolute; + z-index: 1; + height: 12px; + top:-11px; + transition: 0.2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg{ + width: 100%; + background: rgba(255,255,255,.3); + margin-top: 2px; + overflow: hidden; + height: 10px; + transition: .2s; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-load{ + float: left; + width: 0px; + background: rgba(169,169,169,.7); + height: 10px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-play{ + width: 0px; + background: #e80101; + position: absolute; + z-index: 1; + height: 10px; + transition: .2s; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-mouseline{ + width: 3px; + background: rgba(255,255,255,.6); + position: absolute; + z-index: 2; + display: none; + height: 10px; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg .ck-bar-progress-prompt{ + background: #FFF; + position: absolute; + z-index: 3; + border-radius: 50%; + width: 10px; + height: 10px; + top:2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-slider{ + border-radius: 50%; + overflow: hidden; + position: relative; + float: left; + z-index: 4; + left: 0px; + cursor: pointer; + width: 12px; + height: 12px; + top: -11px; + background: #FFF; + box-shadow: 0px 0px 0px 4px rgba(255,255,255,.5); +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-slider:hover{ + background: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress .ck-bar-progress-bg:hover .ck-bar-progress-mouseline{ + display: block; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out{ + height: 2px; + top:-2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-load,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg .ck-bar-progress-play{ + height: 2px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-slider{ + width: 12px; + height: 2px; + top: -2px; + box-shadow: 0px 0px 0px 0px rgba(255,255,255,0); + background: rgba(232,1,1,0); + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-out .ck-bar-progress-bg .ck-bar-progress-prompt{ + height: 2px; + border-radius: 0; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-slider-move .ck-bar-progress-play,.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-progress.ck-bar-progress-slider-move .ck-bar-progress-slider{ + transition: 0s; +} + +/*音量调节栏*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox{ + float: right; + width: 48px; + overflow-x: hidden; +} +/*音量调节栏*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox{ + width: 70px; +} +/*默认状态-音量调节总外框*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume{ + width: 48px; + height: 215px; + background: rgba(0,0,0,.01); + position: absolute; + z-index: 1; + bottom: 46px; + display: none; + overflow: hidden; +} +/*全屏状态-音量调节总外框*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-bar-volume{ + width: 70px; + bottom: 68px; +} +/*默认状态-音量调节总外框-鼠标经过时样式*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox:hover .ck-bar-volume{ + display: block; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .1s; + animation-duration: .1s; + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} +/*共用状态-音量调节内部外框*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volumex{ + width: 100%; + height: 200px; + float: left; + background: rgba(0,0,0,.8); + border-radius: 5px; +} +/*共用状态-音量调节顶部文字*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-txt{ + width: 100%; + height: 40px; + line-height: 40px; + color: #FFF; + text-align: center; + font-size: 1rem; + float: left; + overflow: hidden; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*共用状态-音量调节背景色*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-bg{ + width: 8px; + height: 140px; + background: #808080; + border-radius: 3px; + overflow: hidden; + cursor: pointer; + margin: auto; +} +/*共用状态-音量调节前景色*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-bg .ck-bar-volume-pp{ + width: 8px; + height: 140px; + background: #e80101; + margin-top: 140px; +} +/*共用状态-音量调节拖动小按钮*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-slider{ + width: 10px; + height: 10px; + background: #FFF; + border-radius: 50%; + overflow: hidden; + box-shadow: 0px 0px 0px 8px rgba(255,255,255,.5); + position: absolute; + z-index: 1; + top: 0px; + left: 19px; + cursor: pointer; +} +/*全屏状态-音量调节拖动小按钮*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-volumebox .ck-bar-volume .ck-bar-volume-slider{ + left: 30px; +} +/*默认状态-显示时间*/ +.ckplayer-ckplayer .ck-main .ck-bar .ck-bar-time{ + float: left; + line-height: 48px; + font-size: 16px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*全屏状态-显示时间*/ +.ckplayer-ckplayer .ck-main.ck-main-full .ck-bar .ck-bar-time{ + float: left; + line-height: 70px; + font-size: 18px; + color: #FFF; +} +/*右侧控制栏*/ +.ckplayer-ckplayer .ck-main .ck-right-bar{ + position: absolute; + z-index: 260; + top: 0; + right: 2px; + bottom: 0; + margin: auto !important; + width: 48px; + height: 144px; + background: rgba(0,0,0,.3); + border-radius: 5px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-right-bar-hide{ + right: -48px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar{ + width: 70px; + height: 210px; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar-hide{ + right: -70px; + transition: .2s; +} +/*截图按钮*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-btn-screenshot{ + float: left; + background-position:-1536px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-btn-screenshot{ + background-position:-2240px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-btn-screenshot:hover{ + background-position:-1584px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-btn-screenshot:hover{ + background-position:-2310px 0; +} +/*小窗口按钮组*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows button{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open{ + background-position:-1248px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open{ + background-position:-1820px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open:hover{ + background-position:-1296px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-open:hover{ + background-position:-1890px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close{ + background-position:-1152px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close{ + background-position:-1680px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close:hover{ + background-position:-1200px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-smallwindows .ck-btn-smallwindows-close:hover{ + background-position:-1750px 0; +} +/*循环按钮组*/ +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop{ + float: left; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open{ + background-position:-1440px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open{ + background-position:-2100px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open:hover{ + background-position:-1488px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-open:hover{ + background-position:-2170px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close{ + background-position:-1344px 0; + display: none; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close{ + background-position:-1960px 0; +} +.ckplayer-ckplayer .ck-main .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close:hover{ + background-position:-1392px 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-right-bar .ck-right-bar-loop .ck-btn-loop-close:hover{ + background-position:-2030px 0; +} +/*顶部显示栏*/ +.ckplayer-ckplayer .ck-main .ck-top-bar{ + position: absolute; + z-index: 260; + top: -36px; + width: 100%; + height: 36px; + background: rgba(0,0,0,.3); + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-top-bar-hide{ + top: -36px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-top-bar{ + top: 0; +} +.ckplayer-ckplayer .ck-main.ck-main-full .ck-top-bar-hide{ + top: -36px; + transition: .2s; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom{ + position: absolute; + z-index: 260; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container{ + float: left; + margin-left: 10px; + margin-top: 9px; + cursor: pointer; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left{ + float: left; + width: 20px; + height: 18px; + border: 1px solid #FFF; + box-sizing:content-box; + -moz-box-sizing:content-box; /* Firefox */ + -webkit-box-sizing:content-box; /* Safari */ +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-left, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-left{ + border-color: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-left div, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-left div{ + background: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-right{ + float: left; + font-size: 14px; + color: #FFF; + padding-left: 5px; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container:hover .ck-top-bar-zoom-right, +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container.ck-top-bar-zoom-container-focus .ck-top-bar-zoom-right{ + color: #e80101; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-50{ + width: 50%; + height: 50%; + background: #FFF; + margin: 4.5px 25%; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-75{ + width: 75%; + height: 50%; + background: #FFF; + margin: 4.5px 12.5%; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-zoom .ck-top-bar-zoom-container .ck-top-bar-zoom-left .ck-top-bar-zoom-button-100{ + width: 100%; + height: 50%; + background: #FFF; + margin: 4.5px 0; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-title{ + position: absolute; + z-index: 1; + top: 0px; + width: 100%; + height: 36px; + line-height: 36px; + text-align: center; + font-size: 18px; + color: #FFF; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +.ckplayer-ckplayer .ck-main .ck-top-bar .ck-top-bar-time{ + float: right; + height: 36px; + line-height: 36px; + font-size: 14px; + color: #FFF; + padding: 0 1rem 0; + -moz-user-select:none; /*火狐*/ + -webkit-user-select:none; /*webkit浏览器*/ + -ms-user-select:none; /*IE10*/ + -khtml-user-select:none; /*早期浏览器*/ + user-select:none; +} +/*以下为缓动效果样式*/ +.ck-animate { + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: .3s; + animation-duration: .3s; +} +.ck-animate-bouncein { + -webkit-animation-name: ck-bounceIn; + animation-name: ck-bounceIn; +} + +@-webkit-keyframes ck-bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5) + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes ck-bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.5); + -ms-transform: scale(.5); + transform: scale(.5); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +.ck-animate-bounceout { + -webkit-animation-name: ck-bounceOut; + animation-name: ck-bounceOut; +} + +@-webkit-keyframes ck-bounceOut { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5); + } +} + +@keyframes ck-bounceOut { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5); + } +} +.ck-animate-circle { + animation: ck-Circle 1s linear infinite; + -webkit-animation: ck-Circle 1s linear infinite +} + +@-webkit-keyframes ck-Circle { + 0% { + transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg) + } + 25% { + transform: rotate(90deg); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg) + } + 50% { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg) + } + 75% { + transform: rotate(270deg); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg) + } + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg) + } +} + +@keyframes ck-Circle { + 0% { + transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg) + } + 25% { + transform: rotate(90deg); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg) + } + 50% { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg) + } + 75% { + transform: rotate(270deg); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg) + } + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg) + } +} \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/adclose.png b/modules/core/src/main/resources/static/ckplayer/css/images/adclose.png new file mode 100644 index 00000000..b3c0b7b0 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/adclose.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/buffer.png b/modules/core/src/main/resources/static/ckplayer/css/images/buffer.png new file mode 100644 index 00000000..198d4a14 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/buffer.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer.48.png b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer.48.png new file mode 100644 index 00000000..650c1171 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer.48.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer.png b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer.png new file mode 100644 index 00000000..15940cf9 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_ixigua.48.png b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_ixigua.48.png new file mode 100644 index 00000000..7301e36b Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_ixigua.48.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_ixigua.png b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_ixigua.png new file mode 100644 index 00000000..818c2611 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_ixigua.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_red.48.png b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_red.48.png new file mode 100644 index 00000000..5f226ac3 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_red.48.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_red.png b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_red.png new file mode 100644 index 00000000..d872a0a4 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/ckplayer_red.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/loading.png b/modules/core/src/main/resources/static/ckplayer/css/images/loading.png new file mode 100644 index 00000000..fe16ca36 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/loading.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/logo.png b/modules/core/src/main/resources/static/ckplayer/css/images/logo.png new file mode 100644 index 00000000..4ca44d22 Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/logo.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/css/images/play.png b/modules/core/src/main/resources/static/ckplayer/css/images/play.png new file mode 100644 index 00000000..f9e111bb Binary files /dev/null and b/modules/core/src/main/resources/static/ckplayer/css/images/play.png differ diff --git a/modules/core/src/main/resources/static/ckplayer/flv.js/LICENSE b/modules/core/src/main/resources/static/ckplayer/flv.js/LICENSE new file mode 100644 index 00000000..7a4a3ea2 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/flv.js/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/flv.js/flv.js b/modules/core/src/main/resources/static/ckplayer/flv.js/flv.js new file mode 100644 index 00000000..3accf814 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/flv.js/flv.js @@ -0,0 +1,10584 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["flvjs"] = factory(); + else + root["flvjs"] = factory(); +})(self, function() { +return /******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/es6-promise/dist/es6-promise.js": +/*!******************************************************!*\ + !*** ./node_modules/es6-promise/dist/es6-promise.js ***! + \******************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.8+1e68dce6 + */ +(function (global, factory) { + true ? module.exports = factory() : + 0; +}(this, (function () { + 'use strict'; + function objectOrFunction(x) { + var type = typeof x; + return x !== null && (type === 'object' || type === 'function'); + } + function isFunction(x) { + return typeof x === 'function'; + } + var _isArray = void 0; + if (Array.isArray) { + _isArray = Array.isArray; + } + else { + _isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; + } + var isArray = _isArray; + var len = 0; + var vertxNext = void 0; + var customSchedulerFn = void 0; + var asap = function asap(callback, arg) { + queue[len] = callback; + queue[len + 1] = arg; + len += 2; + if (len === 2) { + // If len is 2, that means that we need to schedule an async flush. + // If additional callbacks are queued before the queue is flushed, they + // will be processed by this flush that we are scheduling. + if (customSchedulerFn) { + customSchedulerFn(flush); + } + else { + scheduleFlush(); + } + } + }; + function setScheduler(scheduleFn) { + customSchedulerFn = scheduleFn; + } + function setAsap(asapFn) { + asap = asapFn; + } + var browserWindow = typeof window !== 'undefined' ? window : undefined; + var browserGlobal = browserWindow || {}; + var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; + var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; + // test for web worker but not in IE10 + var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; + // node + function useNextTick() { + // node version 0.10.x displays a deprecation warning when nextTick is used recursively + // see https://github.com/cujojs/when/issues/410 for details + return function () { + return process.nextTick(flush); + }; + } + // vertx + function useVertxTimer() { + if (typeof vertxNext !== 'undefined') { + return function () { + vertxNext(flush); + }; + } + return useSetTimeout(); + } + function useMutationObserver() { + var iterations = 0; + var observer = new BrowserMutationObserver(flush); + var node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + return function () { + node.data = iterations = ++iterations % 2; + }; + } + // web worker + function useMessageChannel() { + var channel = new MessageChannel(); + channel.port1.onmessage = flush; + return function () { + return channel.port2.postMessage(0); + }; + } + function useSetTimeout() { + // Store setTimeout reference so es6-promise will be unaffected by + // other code modifying setTimeout (like sinon.useFakeTimers()) + var globalSetTimeout = setTimeout; + return function () { + return globalSetTimeout(flush, 1); + }; + } + var queue = new Array(1000); + function flush() { + for (var i = 0; i < len; i += 2) { + var callback = queue[i]; + var arg = queue[i + 1]; + callback(arg); + queue[i] = undefined; + queue[i + 1] = undefined; + } + len = 0; + } + function attemptVertx() { + try { + var vertx = Function('return this')().require('vertx'); + vertxNext = vertx.runOnLoop || vertx.runOnContext; + return useVertxTimer(); + } + catch (e) { + return useSetTimeout(); + } + } + var scheduleFlush = void 0; + // Decide what async method to use to triggering processing of queued callbacks: + if (isNode) { + scheduleFlush = useNextTick(); + } + else if (BrowserMutationObserver) { + scheduleFlush = useMutationObserver(); + } + else if (isWorker) { + scheduleFlush = useMessageChannel(); + } + else if (browserWindow === undefined && "function" === 'function') { + scheduleFlush = attemptVertx(); + } + else { + scheduleFlush = useSetTimeout(); + } + function then(onFulfillment, onRejection) { + var parent = this; + var child = new this.constructor(noop); + if (child[PROMISE_ID] === undefined) { + makePromise(child); + } + var _state = parent._state; + if (_state) { + var callback = arguments[_state - 1]; + asap(function () { + return invokeCallback(_state, child, callback, parent._result); + }); + } + else { + subscribe(parent, child, onFulfillment, onRejection); + } + return child; + } + /** + `Promise.resolve` returns a promise that will become resolved with the + passed `value`. It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + resolve(1); + }); + + promise.then(function(value){ + // value === 1 + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.resolve(1); + + promise.then(function(value){ + // value === 1 + }); + ``` + + @method resolve + @static + @param {Any} value value that the returned promise will be resolved with + Useful for tooling. + @return {Promise} a promise that will become fulfilled with the given + `value` + */ + function resolve$1(object) { + /*jshint validthis:true */ + var Constructor = this; + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + var promise = new Constructor(noop); + resolve(promise, object); + return promise; + } + var PROMISE_ID = Math.random().toString(36).substring(2); + function noop() { } + var PENDING = void 0; + var FULFILLED = 1; + var REJECTED = 2; + function selfFulfillment() { + return new TypeError("You cannot resolve a promise with itself"); + } + function cannotReturnOwn() { + return new TypeError('A promises callback cannot return that same promise.'); + } + function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) { + try { + then$$1.call(value, fulfillmentHandler, rejectionHandler); + } + catch (e) { + return e; + } + } + function handleForeignThenable(promise, thenable, then$$1) { + asap(function (promise) { + var sealed = false; + var error = tryThen(then$$1, thenable, function (value) { + if (sealed) { + return; + } + sealed = true; + if (thenable !== value) { + resolve(promise, value); + } + else { + fulfill(promise, value); + } + }, function (reason) { + if (sealed) { + return; + } + sealed = true; + reject(promise, reason); + }, 'Settle: ' + (promise._label || ' unknown promise')); + if (!sealed && error) { + sealed = true; + reject(promise, error); + } + }, promise); + } + function handleOwnThenable(promise, thenable) { + if (thenable._state === FULFILLED) { + fulfill(promise, thenable._result); + } + else if (thenable._state === REJECTED) { + reject(promise, thenable._result); + } + else { + subscribe(thenable, undefined, function (value) { + return resolve(promise, value); + }, function (reason) { + return reject(promise, reason); + }); + } + } + function handleMaybeThenable(promise, maybeThenable, then$$1) { + if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) { + handleOwnThenable(promise, maybeThenable); + } + else { + if (then$$1 === undefined) { + fulfill(promise, maybeThenable); + } + else if (isFunction(then$$1)) { + handleForeignThenable(promise, maybeThenable, then$$1); + } + else { + fulfill(promise, maybeThenable); + } + } + } + function resolve(promise, value) { + if (promise === value) { + reject(promise, selfFulfillment()); + } + else if (objectOrFunction(value)) { + var then$$1 = void 0; + try { + then$$1 = value.then; + } + catch (error) { + reject(promise, error); + return; + } + handleMaybeThenable(promise, value, then$$1); + } + else { + fulfill(promise, value); + } + } + function publishRejection(promise) { + if (promise._onerror) { + promise._onerror(promise._result); + } + publish(promise); + } + function fulfill(promise, value) { + if (promise._state !== PENDING) { + return; + } + promise._result = value; + promise._state = FULFILLED; + if (promise._subscribers.length !== 0) { + asap(publish, promise); + } + } + function reject(promise, reason) { + if (promise._state !== PENDING) { + return; + } + promise._state = REJECTED; + promise._result = reason; + asap(publishRejection, promise); + } + function subscribe(parent, child, onFulfillment, onRejection) { + var _subscribers = parent._subscribers; + var length = _subscribers.length; + parent._onerror = null; + _subscribers[length] = child; + _subscribers[length + FULFILLED] = onFulfillment; + _subscribers[length + REJECTED] = onRejection; + if (length === 0 && parent._state) { + asap(publish, parent); + } + } + function publish(promise) { + var subscribers = promise._subscribers; + var settled = promise._state; + if (subscribers.length === 0) { + return; + } + var child = void 0, callback = void 0, detail = promise._result; + for (var i = 0; i < subscribers.length; i += 3) { + child = subscribers[i]; + callback = subscribers[i + settled]; + if (child) { + invokeCallback(settled, child, callback, detail); + } + else { + callback(detail); + } + } + promise._subscribers.length = 0; + } + function invokeCallback(settled, promise, callback, detail) { + var hasCallback = isFunction(callback), value = void 0, error = void 0, succeeded = true; + if (hasCallback) { + try { + value = callback(detail); + } + catch (e) { + succeeded = false; + error = e; + } + if (promise === value) { + reject(promise, cannotReturnOwn()); + return; + } + } + else { + value = detail; + } + if (promise._state !== PENDING) { + // noop + } + else if (hasCallback && succeeded) { + resolve(promise, value); + } + else if (succeeded === false) { + reject(promise, error); + } + else if (settled === FULFILLED) { + fulfill(promise, value); + } + else if (settled === REJECTED) { + reject(promise, value); + } + } + function initializePromise(promise, resolver) { + try { + resolver(function resolvePromise(value) { + resolve(promise, value); + }, function rejectPromise(reason) { + reject(promise, reason); + }); + } + catch (e) { + reject(promise, e); + } + } + var id = 0; + function nextId() { + return id++; + } + function makePromise(promise) { + promise[PROMISE_ID] = id++; + promise._state = undefined; + promise._result = undefined; + promise._subscribers = []; + } + function validationError() { + return new Error('Array Methods must be provided an Array'); + } + var Enumerator = function () { + function Enumerator(Constructor, input) { + this._instanceConstructor = Constructor; + this.promise = new Constructor(noop); + if (!this.promise[PROMISE_ID]) { + makePromise(this.promise); + } + if (isArray(input)) { + this.length = input.length; + this._remaining = input.length; + this._result = new Array(this.length); + if (this.length === 0) { + fulfill(this.promise, this._result); + } + else { + this.length = this.length || 0; + this._enumerate(input); + if (this._remaining === 0) { + fulfill(this.promise, this._result); + } + } + } + else { + reject(this.promise, validationError()); + } + } + Enumerator.prototype._enumerate = function _enumerate(input) { + for (var i = 0; this._state === PENDING && i < input.length; i++) { + this._eachEntry(input[i], i); + } + }; + Enumerator.prototype._eachEntry = function _eachEntry(entry, i) { + var c = this._instanceConstructor; + var resolve$$1 = c.resolve; + if (resolve$$1 === resolve$1) { + var _then = void 0; + var error = void 0; + var didError = false; + try { + _then = entry.then; + } + catch (e) { + didError = true; + error = e; + } + if (_then === then && entry._state !== PENDING) { + this._settledAt(entry._state, i, entry._result); + } + else if (typeof _then !== 'function') { + this._remaining--; + this._result[i] = entry; + } + else if (c === Promise$1) { + var promise = new c(noop); + if (didError) { + reject(promise, error); + } + else { + handleMaybeThenable(promise, entry, _then); + } + this._willSettleAt(promise, i); + } + else { + this._willSettleAt(new c(function (resolve$$1) { + return resolve$$1(entry); + }), i); + } + } + else { + this._willSettleAt(resolve$$1(entry), i); + } + }; + Enumerator.prototype._settledAt = function _settledAt(state, i, value) { + var promise = this.promise; + if (promise._state === PENDING) { + this._remaining--; + if (state === REJECTED) { + reject(promise, value); + } + else { + this._result[i] = value; + } + } + if (this._remaining === 0) { + fulfill(promise, this._result); + } + }; + Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) { + var enumerator = this; + subscribe(promise, undefined, function (value) { + return enumerator._settledAt(FULFILLED, i, value); + }, function (reason) { + return enumerator._settledAt(REJECTED, i, reason); + }); + }; + return Enumerator; + }(); + /** + `Promise.all` accepts an array of promises, and returns a new promise which + is fulfilled with an array of fulfillment values for the passed promises, or + rejected with the reason of the first passed promise to be rejected. It casts all + elements of the passed iterable to promises as it runs this algorithm. + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = resolve(2); + let promise3 = resolve(3); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // The array here would be [ 1, 2, 3 ]; + }); + ``` + + If any of the `promises` given to `all` are rejected, the first promise + that is rejected will be given as an argument to the returned promises's + rejection handler. For example: + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = reject(new Error("2")); + let promise3 = reject(new Error("3")); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // Code here never runs because there are rejected promises! + }, function(error) { + // error.message === "2" + }); + ``` + + @method all + @static + @param {Array} entries array of promises + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled when all `promises` have been + fulfilled, or rejected if any of them become rejected. + @static + */ + function all(entries) { + return new Enumerator(this, entries).promise; + } + /** + `Promise.race` returns a new promise which is settled in the same way as the + first passed promise to settle. + + Example: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 2'); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // result === 'promise 2' because it was resolved before promise1 + // was resolved. + }); + ``` + + `Promise.race` is deterministic in that only the state of the first + settled promise matters. For example, even if other promises given to the + `promises` array argument are resolved, but the first settled promise has + become rejected before the other promises became fulfilled, the returned + promise will become rejected: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + reject(new Error('promise 2')); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // Code here never runs + }, function(reason){ + // reason.message === 'promise 2' because promise 2 became rejected before + // promise 1 became fulfilled + }); + ``` + + An example real-world use case is implementing timeouts: + + ```javascript + Promise.race([ajax('foo.json'), timeout(5000)]) + ``` + + @method race + @static + @param {Array} promises array of promises to observe + Useful for tooling. + @return {Promise} a promise which settles in the same way as the first passed + promise to settle. + */ + function race(entries) { + /*jshint validthis:true */ + var Constructor = this; + if (!isArray(entries)) { + return new Constructor(function (_, reject) { + return reject(new TypeError('You must pass an array to race.')); + }); + } + else { + return new Constructor(function (resolve, reject) { + var length = entries.length; + for (var i = 0; i < length; i++) { + Constructor.resolve(entries[i]).then(resolve, reject); + } + }); + } + } + /** + `Promise.reject` returns a promise rejected with the passed `reason`. + It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + reject(new Error('WHOOPS')); + }); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.reject(new Error('WHOOPS')); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + @method reject + @static + @param {Any} reason value that the returned promise will be rejected with. + Useful for tooling. + @return {Promise} a promise rejected with the given `reason`. + */ + function reject$1(reason) { + /*jshint validthis:true */ + var Constructor = this; + var promise = new Constructor(noop); + reject(promise, reason); + return promise; + } + function needsResolver() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); + } + function needsNew() { + throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); + } + /** + Promise objects represent the eventual result of an asynchronous operation. The + primary way of interacting with a promise is through its `then` method, which + registers callbacks to receive either a promise's eventual value or the reason + why the promise cannot be fulfilled. + + Terminology + ----------- + + - `promise` is an object or function with a `then` method whose behavior conforms to this specification. + - `thenable` is an object or function that defines a `then` method. + - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). + - `exception` is a value that is thrown using the throw statement. + - `reason` is a value that indicates why a promise was rejected. + - `settled` the final resting state of a promise, fulfilled or rejected. + + A promise can be in one of three states: pending, fulfilled, or rejected. + + Promises that are fulfilled have a fulfillment value and are in the fulfilled + state. Promises that are rejected have a rejection reason and are in the + rejected state. A fulfillment value is never a thenable. + + Promises can also be said to *resolve* a value. If this value is also a + promise, then the original promise's settled state will match the value's + settled state. So a promise that *resolves* a promise that rejects will + itself reject, and a promise that *resolves* a promise that fulfills will + itself fulfill. + + + Basic Usage: + ------------ + + ```js + let promise = new Promise(function(resolve, reject) { + // on success + resolve(value); + + // on failure + reject(reason); + }); + + promise.then(function(value) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Advanced Usage: + --------------- + + Promises shine when abstracting away asynchronous interactions such as + `XMLHttpRequest`s. + + ```js + function getJSON(url) { + return new Promise(function(resolve, reject){ + let xhr = new XMLHttpRequest(); + + xhr.open('GET', url); + xhr.onreadystatechange = handler; + xhr.responseType = 'json'; + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + + function handler() { + if (this.readyState === this.DONE) { + if (this.status === 200) { + resolve(this.response); + } else { + reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); + } + } + }; + }); + } + + getJSON('/posts.json').then(function(json) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Unlike callbacks, promises are great composable primitives. + + ```js + Promise.all([ + getJSON('/posts'), + getJSON('/comments') + ]).then(function(values){ + values[0] // => postsJSON + values[1] // => commentsJSON + + return values; + }); + ``` + + @class Promise + @param {Function} resolver + Useful for tooling. + @constructor + */ + var Promise$1 = function () { + function Promise(resolver) { + this[PROMISE_ID] = nextId(); + this._result = this._state = undefined; + this._subscribers = []; + if (noop !== resolver) { + typeof resolver !== 'function' && needsResolver(); + this instanceof Promise ? initializePromise(this, resolver) : needsNew(); + } + } + /** + The primary way of interacting with a promise is through its `then` method, + which registers callbacks to receive either a promise's eventual value or the + reason why the promise cannot be fulfilled. + ```js + findUser().then(function(user){ + // user is available + }, function(reason){ + // user is unavailable, and you are given the reason why + }); + ``` + Chaining + -------- + The return value of `then` is itself a promise. This second, 'downstream' + promise is resolved with the return value of the first promise's fulfillment + or rejection handler, or rejected if the handler throws an exception. + ```js + findUser().then(function (user) { + return user.name; + }, function (reason) { + return 'default name'; + }).then(function (userName) { + // If `findUser` fulfilled, `userName` will be the user's name, otherwise it + // will be `'default name'` + }); + findUser().then(function (user) { + throw new Error('Found user, but still unhappy'); + }, function (reason) { + throw new Error('`findUser` rejected and we're unhappy'); + }).then(function (value) { + // never reached + }, function (reason) { + // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. + // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. + }); + ``` + If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. + ```js + findUser().then(function (user) { + throw new PedagogicalException('Upstream error'); + }).then(function (value) { + // never reached + }).then(function (value) { + // never reached + }, function (reason) { + // The `PedgagocialException` is propagated all the way down to here + }); + ``` + Assimilation + ------------ + Sometimes the value you want to propagate to a downstream promise can only be + retrieved asynchronously. This can be achieved by returning a promise in the + fulfillment or rejection handler. The downstream promise will then be pending + until the returned promise is settled. This is called *assimilation*. + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // The user's comments are now available + }); + ``` + If the assimliated promise rejects, then the downstream promise will also reject. + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // If `findCommentsByAuthor` fulfills, we'll have the value here + }, function (reason) { + // If `findCommentsByAuthor` rejects, we'll have the reason here + }); + ``` + Simple Example + -------------- + Synchronous Example + ```javascript + let result; + try { + result = findResult(); + // success + } catch(reason) { + // failure + } + ``` + Errback Example + ```js + findResult(function(result, err){ + if (err) { + // failure + } else { + // success + } + }); + ``` + Promise Example; + ```javascript + findResult().then(function(result){ + // success + }, function(reason){ + // failure + }); + ``` + Advanced Example + -------------- + Synchronous Example + ```javascript + let author, books; + try { + author = findAuthor(); + books = findBooksByAuthor(author); + // success + } catch(reason) { + // failure + } + ``` + Errback Example + ```js + function foundBooks(books) { + } + function failure(reason) { + } + findAuthor(function(author, err){ + if (err) { + failure(err); + // failure + } else { + try { + findBoooksByAuthor(author, function(books, err) { + if (err) { + failure(err); + } else { + try { + foundBooks(books); + } catch(reason) { + failure(reason); + } + } + }); + } catch(error) { + failure(err); + } + // success + } + }); + ``` + Promise Example; + ```javascript + findAuthor(). + then(findBooksByAuthor). + then(function(books){ + // found books + }).catch(function(reason){ + // something went wrong + }); + ``` + @method then + @param {Function} onFulfilled + @param {Function} onRejected + Useful for tooling. + @return {Promise} + */ + /** + `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same + as the catch block of a try/catch statement. + ```js + function findAuthor(){ + throw new Error('couldn't find that author'); + } + // synchronous + try { + findAuthor(); + } catch(reason) { + // something went wrong + } + // async with promises + findAuthor().catch(function(reason){ + // something went wrong + }); + ``` + @method catch + @param {Function} onRejection + Useful for tooling. + @return {Promise} + */ + Promise.prototype.catch = function _catch(onRejection) { + return this.then(null, onRejection); + }; + /** + `finally` will be invoked regardless of the promise's fate just as native + try/catch/finally behaves + + Synchronous example: + + ```js + findAuthor() { + if (Math.random() > 0.5) { + throw new Error(); + } + return new Author(); + } + + try { + return findAuthor(); // succeed or fail + } catch(error) { + return findOtherAuther(); + } finally { + // always runs + // doesn't affect the return value + } + ``` + + Asynchronous example: + + ```js + findAuthor().catch(function(reason){ + return findOtherAuther(); + }).finally(function(){ + // author was either found, or not + }); + ``` + + @method finally + @param {Function} callback + @return {Promise} + */ + Promise.prototype.finally = function _finally(callback) { + var promise = this; + var constructor = promise.constructor; + if (isFunction(callback)) { + return promise.then(function (value) { + return constructor.resolve(callback()).then(function () { + return value; + }); + }, function (reason) { + return constructor.resolve(callback()).then(function () { + throw reason; + }); + }); + } + return promise.then(callback, callback); + }; + return Promise; + }(); + Promise$1.prototype.then = then; + Promise$1.all = all; + Promise$1.race = race; + Promise$1.resolve = resolve$1; + Promise$1.reject = reject$1; + Promise$1._setScheduler = setScheduler; + Promise$1._setAsap = setAsap; + Promise$1._asap = asap; + /*global self*/ + function polyfill() { + var local = void 0; + if (typeof __webpack_require__.g !== 'undefined') { + local = __webpack_require__.g; + } + else if (typeof self !== 'undefined') { + local = self; + } + else { + try { + local = Function('return this')(); + } + catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + } + var P = local.Promise; + if (P) { + var promiseToString = null; + try { + promiseToString = Object.prototype.toString.call(P.resolve()); + } + catch (e) { + // silently ignored + } + if (promiseToString === '[object Promise]' && !P.cast) { + return; + } + } + local.Promise = Promise$1; + } + // Strange compat.. + Promise$1.polyfill = polyfill; + Promise$1.Promise = Promise$1; + return Promise$1; +}))); + + +/***/ }), + +/***/ "./node_modules/events/events.js": +/*!***************************************!*\ + !*** ./node_modules/events/events.js ***! + \***************************************/ +/***/ (function(module) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var R = typeof Reflect === 'object' ? Reflect : null; +var ReflectApply = R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + }; +var ReflectOwnKeys; +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys; +} +else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target) + .concat(Object.getOwnPropertySymbols(target)); + }; +} +else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} +function ProcessEmitWarning(warning) { + if (console && console.warn) + console.warn(warning); +} +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +}; +function EventEmitter() { + EventEmitter.init.call(this); +} +module.exports = EventEmitter; +module.exports.once = once; +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } +} +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function () { + return defaultMaxListeners; + }, + set: function (arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } + defaultMaxListeners = arg; + } +}); +EventEmitter.init = function () { + if (this._events === undefined || + this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + this._maxListeners = this._maxListeners || undefined; +}; +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); + } + this._maxListeners = n; + return this; +}; +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) + args.push(arguments[i]); + var doError = (type === 'error'); + var events = this._events; + if (events !== undefined) + doError = (doError && events.error === undefined); + else if (!doError) + return false; + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + var handler = events[type]; + if (handler === undefined) + return false; + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + return true; +}; +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + checkListener(listener); + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } + else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, listener.listener ? listener.listener : listener); + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } + else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } + else if (prepend) { + existing.unshift(listener); + } + else { + existing.push(listener); + } + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + String(type) + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + return target; +} +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; +EventEmitter.prototype.on = EventEmitter.prototype.addListener; +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + checkListener(listener); + events = this._events; + if (events === undefined) + return this; + list = events[type]; + if (list === undefined) + return this; + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } + else if (typeof list !== 'function') { + position = -1; + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + if (position < 0) + return this; + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + if (list.length === 1) + events[type] = list[0]; + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + return this; + }; +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + events = this._events; + if (events === undefined) + return this; + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } + else if (events[type] !== undefined) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else + delete events[type]; + } + return this; + } + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') + continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + listeners = events[type]; + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } + else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + return this; + }; +function _listeners(target, type, unwrap) { + var events = target._events; + if (events === undefined) + return []; + var evlistener = events[type]; + if (evlistener === undefined) + return []; + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + return unwrap ? + unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; +EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } + else { + return listenerCount.call(emitter, type); + } +}; +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + if (events !== undefined) { + var evlistener = events[type]; + if (typeof evlistener === 'function') { + return 1; + } + else if (evlistener !== undefined) { + return evlistener.length; + } + } + return 0; +} +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); +} +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + } + ; + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); +} +function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } +} +function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } + else { + emitter.on(name, listener); + } + } + else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } + else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } +} + + +/***/ }), + +/***/ "./node_modules/webworkify-webpack/index.js": +/*!**************************************************!*\ + !*** ./node_modules/webworkify-webpack/index.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +function webpackBootstrapFunc(modules) { + /******/ // The module cache + /******/ var installedModules = {}; + /******/ // The require function + /******/ function __nested_webpack_require_168__(moduleId) { + /******/ // Check if module is in cache + /******/ if (installedModules[moduleId]) + /******/ return installedModules[moduleId].exports; + /******/ // Create a new module (and put it into the cache) + /******/ var module = installedModules[moduleId] = { + /******/ i: moduleId, + /******/ l: false, + /******/ exports: {} + /******/ + }; + /******/ // Execute the module function + /******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_168__); + /******/ // Flag the module as loaded + /******/ module.l = true; + /******/ // Return the exports of the module + /******/ return module.exports; + /******/ + } + /******/ // expose the modules object (__webpack_modules__) + /******/ __nested_webpack_require_168__.m = modules; + /******/ // expose the module cache + /******/ __nested_webpack_require_168__.c = installedModules; + /******/ // identity function for calling harmony imports with the correct context + /******/ __nested_webpack_require_168__.i = function (value) { return value; }; + /******/ // define getter function for harmony exports + /******/ __nested_webpack_require_168__.d = function (exports, name, getter) { + /******/ if (!__nested_webpack_require_168__.o(exports, name)) { + /******/ Object.defineProperty(exports, name, { + /******/ configurable: false, + /******/ enumerable: true, + /******/ get: getter + /******/ + }); + /******/ } + /******/ + }; + /******/ // define __esModule on exports + /******/ __nested_webpack_require_168__.r = function (exports) { + /******/ Object.defineProperty(exports, '__esModule', { value: true }); + /******/ + }; + /******/ // getDefaultExport function for compatibility with non-harmony modules + /******/ __nested_webpack_require_168__.n = function (module) { + /******/ var getter = module && module.__esModule ? + /******/ function getDefault() { return module['default']; } : + /******/ function getModuleExports() { return module; }; + /******/ __nested_webpack_require_168__.d(getter, 'a', getter); + /******/ return getter; + /******/ + }; + /******/ // Object.prototype.hasOwnProperty.call + /******/ __nested_webpack_require_168__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; + /******/ // __webpack_public_path__ + /******/ __nested_webpack_require_168__.p = "/"; + /******/ // on error function for async loading + /******/ __nested_webpack_require_168__.oe = function (err) { console.error(err); throw err; }; + var f = __nested_webpack_require_168__(__nested_webpack_require_168__.s = ENTRY_MODULE); + return f.default || f; // try to call default if defined to also support babel esmodule exports +} +var moduleNameReqExp = '[\\.|\\-|\\+|\\w|\/|@]+'; +var dependencyRegExp = '\\(\\s*(\/\\*.*?\\*\/)?\\s*.*?(' + moduleNameReqExp + ').*?\\)'; // additional chars when output.pathinfo is true +// http://stackoverflow.com/a/2593661/130442 +function quoteRegExp(str) { + return (str + '').replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&'); +} +function isNumeric(n) { + return !isNaN(1 * n); // 1 * n converts integers, integers as string ("123"), 1e3 and "1e3" to integers and strings to NaN +} +function getModuleDependencies(sources, module, queueName) { + var retval = {}; + retval[queueName] = []; + var fnString = module.toString(); + var wrapperSignature = fnString.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/); + if (!wrapperSignature) + return retval; + var webpackRequireName = wrapperSignature[1]; + // main bundle deps + var re = new RegExp('(\\\\n|\\W)' + quoteRegExp(webpackRequireName) + dependencyRegExp, 'g'); + var match; + while ((match = re.exec(fnString))) { + if (match[3] === 'dll-reference') + continue; + retval[queueName].push(match[3]); + } + // dll deps + re = new RegExp('\\(' + quoteRegExp(webpackRequireName) + '\\("(dll-reference\\s(' + moduleNameReqExp + '))"\\)\\)' + dependencyRegExp, 'g'); + while ((match = re.exec(fnString))) { + if (!sources[match[2]]) { + retval[queueName].push(match[1]); + sources[match[2]] = __webpack_require__(match[1]).m; + } + retval[match[2]] = retval[match[2]] || []; + retval[match[2]].push(match[4]); + } + // convert 1e3 back to 1000 - this can be important after uglify-js converted 1000 to 1e3 + var keys = Object.keys(retval); + for (var i = 0; i < keys.length; i++) { + for (var j = 0; j < retval[keys[i]].length; j++) { + if (isNumeric(retval[keys[i]][j])) { + retval[keys[i]][j] = 1 * retval[keys[i]][j]; + } + } + } + return retval; +} +function hasValuesInQueues(queues) { + var keys = Object.keys(queues); + return keys.reduce(function (hasValues, key) { + return hasValues || queues[key].length > 0; + }, false); +} +function getRequiredModules(sources, moduleId) { + var modulesQueue = { + main: [moduleId] + }; + var requiredModules = { + main: [] + }; + var seenModules = { + main: {} + }; + while (hasValuesInQueues(modulesQueue)) { + var queues = Object.keys(modulesQueue); + for (var i = 0; i < queues.length; i++) { + var queueName = queues[i]; + var queue = modulesQueue[queueName]; + var moduleToCheck = queue.pop(); + seenModules[queueName] = seenModules[queueName] || {}; + if (seenModules[queueName][moduleToCheck] || !sources[queueName][moduleToCheck]) + continue; + seenModules[queueName][moduleToCheck] = true; + requiredModules[queueName] = requiredModules[queueName] || []; + requiredModules[queueName].push(moduleToCheck); + var newModules = getModuleDependencies(sources, sources[queueName][moduleToCheck], queueName); + var newModulesKeys = Object.keys(newModules); + for (var j = 0; j < newModulesKeys.length; j++) { + modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]] || []; + modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]].concat(newModules[newModulesKeys[j]]); + } + } + } + return requiredModules; +} +module.exports = function (moduleId, options) { + options = options || {}; + var sources = { + main: __webpack_require__.m + }; + var requiredModules = options.all ? { main: Object.keys(sources.main) } : getRequiredModules(sources, moduleId); + var src = ''; + Object.keys(requiredModules).filter(function (m) { return m !== 'main'; }).forEach(function (module) { + var entryModule = 0; + while (requiredModules[module][entryModule]) { + entryModule++; + } + requiredModules[module].push(entryModule); + sources[module][entryModule] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })'; + src = src + 'var ' + module + ' = (' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(entryModule)) + ')({' + requiredModules[module].map(function (id) { return '' + JSON.stringify(id) + ': ' + sources[module][id].toString(); }).join(',') + '});\n'; + }); + src = src + 'new ((' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(moduleId)) + ')({' + requiredModules.main.map(function (id) { return '' + JSON.stringify(id) + ': ' + sources.main[id].toString(); }).join(',') + '}))(self);'; + var blob = new window.Blob([src], { type: 'text/javascript' }); + if (options.bare) { + return blob; + } + var URL = window.URL || window.webkitURL || window.mozURL || window.msURL; + var workerUrl = URL.createObjectURL(blob); + var worker = new window.Worker(workerUrl); + worker.objectURL = workerUrl; + return worker; +}; + + +/***/ }), + +/***/ "./src/config.js": +/*!***********************!*\ + !*** ./src/config.js ***! + \***********************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "defaultConfig": function() { return /* binding */ defaultConfig; }, +/* harmony export */ "createDefaultConfig": function() { return /* binding */ createDefaultConfig; } +/* harmony export */ }); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var defaultConfig = { + enableWorker: false, + enableStashBuffer: true, + stashInitialSize: undefined, + isLive: false, + lazyLoad: true, + lazyLoadMaxDuration: 3 * 60, + lazyLoadRecoverDuration: 30, + deferLoadAfterSourceOpen: true, + // autoCleanupSourceBuffer: default as false, leave unspecified + autoCleanupMaxBackwardDuration: 3 * 60, + autoCleanupMinBackwardDuration: 2 * 60, + statisticsInfoReportInterval: 600, + fixAudioTimestampGap: true, + accurateSeek: false, + seekType: 'range', + seekParamStart: 'bstart', + seekParamEnd: 'bend', + rangeLoadZeroStart: false, + customSeekHandler: undefined, + reuseRedirectedURL: false, + // referrerPolicy: leave as unspecified + headers: undefined, + customLoader: undefined +}; +function createDefaultConfig() { + return Object.assign({}, defaultConfig); +} + + +/***/ }), + +/***/ "./src/core/features.js": +/*!******************************!*\ + !*** ./src/core/features.js ***! + \******************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _io_io_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../io/io-controller.js */ "./src/io/io-controller.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config.js */ "./src/config.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +var Features = /** @class */ (function () { + function Features() { + } + Features.supportMSEH264Playback = function () { + return window.MediaSource && + window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'); + }; + Features.supportNetworkStreamIO = function () { + var ioctl = new _io_io_controller_js__WEBPACK_IMPORTED_MODULE_0__.default({}, (0,_config_js__WEBPACK_IMPORTED_MODULE_1__.createDefaultConfig)()); + var loaderType = ioctl.loaderType; + ioctl.destroy(); + return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader'; + }; + Features.getNetworkLoaderTypeName = function () { + var ioctl = new _io_io_controller_js__WEBPACK_IMPORTED_MODULE_0__.default({}, (0,_config_js__WEBPACK_IMPORTED_MODULE_1__.createDefaultConfig)()); + var loaderType = ioctl.loaderType; + ioctl.destroy(); + return loaderType; + }; + Features.supportNativeMediaPlayback = function (mimeType) { + if (Features.videoElement == undefined) { + Features.videoElement = window.document.createElement('video'); + } + var canPlay = Features.videoElement.canPlayType(mimeType); + return canPlay === 'probably' || canPlay == 'maybe'; + }; + Features.getFeatureList = function () { + var features = { + mseFlvPlayback: false, + mseLiveFlvPlayback: false, + networkStreamIO: false, + networkLoaderName: '', + nativeMP4H264Playback: false, + nativeWebmVP8Playback: false, + nativeWebmVP9Playback: false + }; + features.mseFlvPlayback = Features.supportMSEH264Playback(); + features.networkStreamIO = Features.supportNetworkStreamIO(); + features.networkLoaderName = Features.getNetworkLoaderTypeName(); + features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO; + features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs="avc1.42001E, mp4a.40.2"'); + features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs="vp8.0, vorbis"'); + features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs="vp9"'); + return features; + }; + return Features; +}()); +/* harmony default export */ __webpack_exports__["default"] = (Features); + + +/***/ }), + +/***/ "./src/core/media-info.js": +/*!********************************!*\ + !*** ./src/core/media-info.js ***! + \********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var MediaInfo = /** @class */ (function () { + function MediaInfo() { + this.mimeType = null; + this.duration = null; + this.hasAudio = null; + this.hasVideo = null; + this.audioCodec = null; + this.videoCodec = null; + this.audioDataRate = null; + this.videoDataRate = null; + this.audioSampleRate = null; + this.audioChannelCount = null; + this.width = null; + this.height = null; + this.fps = null; + this.profile = null; + this.level = null; + this.refFrames = null; + this.chromaFormat = null; + this.sarNum = null; + this.sarDen = null; + this.metadata = null; + this.segments = null; // MediaInfo[] + this.segmentCount = null; + this.hasKeyframesIndex = null; + this.keyframesIndex = null; + } + MediaInfo.prototype.isComplete = function () { + var audioInfoComplete = (this.hasAudio === false) || + (this.hasAudio === true && + this.audioCodec != null && + this.audioSampleRate != null && + this.audioChannelCount != null); + var videoInfoComplete = (this.hasVideo === false) || + (this.hasVideo === true && + this.videoCodec != null && + this.width != null && + this.height != null && + this.fps != null && + this.profile != null && + this.level != null && + this.refFrames != null && + this.chromaFormat != null && + this.sarNum != null && + this.sarDen != null); + // keyframesIndex may not be present + return this.mimeType != null && + this.duration != null && + this.metadata != null && + this.hasKeyframesIndex != null && + audioInfoComplete && + videoInfoComplete; + }; + MediaInfo.prototype.isSeekable = function () { + return this.hasKeyframesIndex === true; + }; + MediaInfo.prototype.getNearestKeyframe = function (milliseconds) { + if (this.keyframesIndex == null) { + return null; + } + var table = this.keyframesIndex; + var keyframeIdx = this._search(table.times, milliseconds); + return { + index: keyframeIdx, + milliseconds: table.times[keyframeIdx], + fileposition: table.filepositions[keyframeIdx] + }; + }; + MediaInfo.prototype._search = function (list, value) { + var idx = 0; + var last = list.length - 1; + var mid = 0; + var lbound = 0; + var ubound = last; + if (value < list[0]) { + idx = 0; + lbound = ubound + 1; // skip search + } + while (lbound <= ubound) { + mid = lbound + Math.floor((ubound - lbound) / 2); + if (mid === last || (value >= list[mid] && value < list[mid + 1])) { + idx = mid; + break; + } + else if (list[mid] < value) { + lbound = mid + 1; + } + else { + ubound = mid - 1; + } + } + return idx; + }; + return MediaInfo; +}()); +/* harmony default export */ __webpack_exports__["default"] = (MediaInfo); + + +/***/ }), + +/***/ "./src/core/media-segment-info.js": +/*!****************************************!*\ + !*** ./src/core/media-segment-info.js ***! + \****************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SampleInfo": function() { return /* binding */ SampleInfo; }, +/* harmony export */ "MediaSegmentInfo": function() { return /* binding */ MediaSegmentInfo; }, +/* harmony export */ "IDRSampleList": function() { return /* binding */ IDRSampleList; }, +/* harmony export */ "MediaSegmentInfoList": function() { return /* binding */ MediaSegmentInfoList; } +/* harmony export */ }); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Represents an media sample (audio / video) +var SampleInfo = /** @class */ (function () { + function SampleInfo(dts, pts, duration, originalDts, isSync) { + this.dts = dts; + this.pts = pts; + this.duration = duration; + this.originalDts = originalDts; + this.isSyncPoint = isSync; + this.fileposition = null; + } + return SampleInfo; +}()); + +// Media Segment concept is defined in Media Source Extensions spec. +// Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box. +var MediaSegmentInfo = /** @class */ (function () { + function MediaSegmentInfo() { + this.beginDts = 0; + this.endDts = 0; + this.beginPts = 0; + this.endPts = 0; + this.originalBeginDts = 0; + this.originalEndDts = 0; + this.syncPoints = []; // SampleInfo[n], for video IDR frames only + this.firstSample = null; // SampleInfo + this.lastSample = null; // SampleInfo + } + MediaSegmentInfo.prototype.appendSyncPoint = function (sampleInfo) { + sampleInfo.isSyncPoint = true; + this.syncPoints.push(sampleInfo); + }; + return MediaSegmentInfo; +}()); + +// Ordered list for recording video IDR frames, sorted by originalDts +var IDRSampleList = /** @class */ (function () { + function IDRSampleList() { + this._list = []; + } + IDRSampleList.prototype.clear = function () { + this._list = []; + }; + IDRSampleList.prototype.appendArray = function (syncPoints) { + var list = this._list; + if (syncPoints.length === 0) { + return; + } + if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) { + this.clear(); + } + Array.prototype.push.apply(list, syncPoints); + }; + IDRSampleList.prototype.getLastSyncPointBeforeDts = function (dts) { + if (this._list.length == 0) { + return null; + } + var list = this._list; + var idx = 0; + var last = list.length - 1; + var mid = 0; + var lbound = 0; + var ubound = last; + if (dts < list[0].dts) { + idx = 0; + lbound = ubound + 1; + } + while (lbound <= ubound) { + mid = lbound + Math.floor((ubound - lbound) / 2); + if (mid === last || (dts >= list[mid].dts && dts < list[mid + 1].dts)) { + idx = mid; + break; + } + else if (list[mid].dts < dts) { + lbound = mid + 1; + } + else { + ubound = mid - 1; + } + } + return this._list[idx]; + }; + return IDRSampleList; +}()); + +// Data structure for recording information of media segments in single track. +var MediaSegmentInfoList = /** @class */ (function () { + function MediaSegmentInfoList(type) { + this._type = type; + this._list = []; + this._lastAppendLocation = -1; // cached last insert location + } + Object.defineProperty(MediaSegmentInfoList.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(MediaSegmentInfoList.prototype, "length", { + get: function () { + return this._list.length; + }, + enumerable: false, + configurable: true + }); + MediaSegmentInfoList.prototype.isEmpty = function () { + return this._list.length === 0; + }; + MediaSegmentInfoList.prototype.clear = function () { + this._list = []; + this._lastAppendLocation = -1; + }; + MediaSegmentInfoList.prototype._searchNearestSegmentBefore = function (originalBeginDts) { + var list = this._list; + if (list.length === 0) { + return -2; + } + var last = list.length - 1; + var mid = 0; + var lbound = 0; + var ubound = last; + var idx = 0; + if (originalBeginDts < list[0].originalBeginDts) { + idx = -1; + return idx; + } + while (lbound <= ubound) { + mid = lbound + Math.floor((ubound - lbound) / 2); + if (mid === last || (originalBeginDts > list[mid].lastSample.originalDts && + (originalBeginDts < list[mid + 1].originalBeginDts))) { + idx = mid; + break; + } + else if (list[mid].originalBeginDts < originalBeginDts) { + lbound = mid + 1; + } + else { + ubound = mid - 1; + } + } + return idx; + }; + MediaSegmentInfoList.prototype._searchNearestSegmentAfter = function (originalBeginDts) { + return this._searchNearestSegmentBefore(originalBeginDts) + 1; + }; + MediaSegmentInfoList.prototype.append = function (mediaSegmentInfo) { + var list = this._list; + var msi = mediaSegmentInfo; + var lastAppendIdx = this._lastAppendLocation; + var insertIdx = 0; + if (lastAppendIdx !== -1 && lastAppendIdx < list.length && + msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts && + ((lastAppendIdx === list.length - 1) || + (lastAppendIdx < list.length - 1 && + msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts))) { + insertIdx = lastAppendIdx + 1; // use cached location idx + } + else { + if (list.length > 0) { + insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1; + } + } + this._lastAppendLocation = insertIdx; + this._list.splice(insertIdx, 0, msi); + }; + MediaSegmentInfoList.prototype.getLastSegmentBefore = function (originalBeginDts) { + var idx = this._searchNearestSegmentBefore(originalBeginDts); + if (idx >= 0) { + return this._list[idx]; + } + else { // -1 + return null; + } + }; + MediaSegmentInfoList.prototype.getLastSampleBefore = function (originalBeginDts) { + var segment = this.getLastSegmentBefore(originalBeginDts); + if (segment != null) { + return segment.lastSample; + } + else { + return null; + } + }; + MediaSegmentInfoList.prototype.getLastSyncPointBefore = function (originalBeginDts) { + var segmentIdx = this._searchNearestSegmentBefore(originalBeginDts); + var syncPoints = this._list[segmentIdx].syncPoints; + while (syncPoints.length === 0 && segmentIdx > 0) { + segmentIdx--; + syncPoints = this._list[segmentIdx].syncPoints; + } + if (syncPoints.length > 0) { + return syncPoints[syncPoints.length - 1]; + } + else { + return null; + } + }; + return MediaSegmentInfoList; +}()); + + + +/***/ }), + +/***/ "./src/core/mse-controller.js": +/*!************************************!*\ + !*** ./src/core/mse-controller.js ***! + \************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js"); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js"); +/* harmony import */ var _mse_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mse-events.js */ "./src/core/mse-events.js"); +/* harmony import */ var _media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./media-segment-info.js */ "./src/core/media-segment-info.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + +// Media Source Extensions controller +var MSEController = /** @class */ (function () { + function MSEController(config) { + this.TAG = 'MSEController'; + this._config = config; + this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())(); + if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) { + // For live stream, do auto cleanup by default + this._config.autoCleanupSourceBuffer = true; + } + this.e = { + onSourceOpen: this._onSourceOpen.bind(this), + onSourceEnded: this._onSourceEnded.bind(this), + onSourceClose: this._onSourceClose.bind(this), + onSourceBufferError: this._onSourceBufferError.bind(this), + onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this) + }; + this._mediaSource = null; + this._mediaSourceObjectURL = null; + this._mediaElement = null; + this._isBufferFull = false; + this._hasPendingEos = false; + this._requireSetMediaDuration = false; + this._pendingMediaDuration = 0; + this._pendingSourceBufferInit = []; + this._mimeTypes = { + video: null, + audio: null + }; + this._sourceBuffers = { + video: null, + audio: null + }; + this._lastInitSegments = { + video: null, + audio: null + }; + this._pendingSegments = { + video: [], + audio: [] + }; + this._pendingRemoveRanges = { + video: [], + audio: [] + }; + this._idrList = new _media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.IDRSampleList(); + } + MSEController.prototype.destroy = function () { + if (this._mediaElement || this._mediaSource) { + this.detachMediaElement(); + } + this.e = null; + this._emitter.removeAllListeners(); + this._emitter = null; + }; + MSEController.prototype.on = function (event, listener) { + this._emitter.addListener(event, listener); + }; + MSEController.prototype.off = function (event, listener) { + this._emitter.removeListener(event, listener); + }; + MSEController.prototype.attachMediaElement = function (mediaElement) { + if (this._mediaSource) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__.IllegalStateException('MediaSource has been attached to an HTMLMediaElement!'); + } + var ms = this._mediaSource = new window.MediaSource(); + ms.addEventListener('sourceopen', this.e.onSourceOpen); + ms.addEventListener('sourceended', this.e.onSourceEnded); + ms.addEventListener('sourceclose', this.e.onSourceClose); + this._mediaElement = mediaElement; + this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource); + mediaElement.src = this._mediaSourceObjectURL; + }; + MSEController.prototype.detachMediaElement = function () { + if (this._mediaSource) { + var ms = this._mediaSource; + for (var type in this._sourceBuffers) { + // pending segments should be discard + var ps = this._pendingSegments[type]; + ps.splice(0, ps.length); + this._pendingSegments[type] = null; + this._pendingRemoveRanges[type] = null; + this._lastInitSegments[type] = null; + // remove all sourcebuffers + var sb = this._sourceBuffers[type]; + if (sb) { + if (ms.readyState !== 'closed') { + // ms edge can throw an error: Unexpected call to method or property access + try { + ms.removeSourceBuffer(sb); + } + catch (error) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message); + } + sb.removeEventListener('error', this.e.onSourceBufferError); + sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd); + } + this._mimeTypes[type] = null; + this._sourceBuffers[type] = null; + } + } + if (ms.readyState === 'open') { + try { + ms.endOfStream(); + } + catch (error) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message); + } + } + ms.removeEventListener('sourceopen', this.e.onSourceOpen); + ms.removeEventListener('sourceended', this.e.onSourceEnded); + ms.removeEventListener('sourceclose', this.e.onSourceClose); + this._pendingSourceBufferInit = []; + this._isBufferFull = false; + this._idrList.clear(); + this._mediaSource = null; + } + if (this._mediaElement) { + this._mediaElement.src = ''; + this._mediaElement.removeAttribute('src'); + this._mediaElement = null; + } + if (this._mediaSourceObjectURL) { + window.URL.revokeObjectURL(this._mediaSourceObjectURL); + this._mediaSourceObjectURL = null; + } + }; + MSEController.prototype.appendInitSegment = function (initSegment, deferred) { + if (!this._mediaSource || this._mediaSource.readyState !== 'open') { + // sourcebuffer creation requires mediaSource.readyState === 'open' + // so we defer the sourcebuffer creation, until sourceopen event triggered + this._pendingSourceBufferInit.push(initSegment); + // make sure that this InitSegment is in the front of pending segments queue + this._pendingSegments[initSegment.type].push(initSegment); + return; + } + var is = initSegment; + var mimeType = "" + is.container; + if (is.codec && is.codec.length > 0) { + mimeType += ";codecs=" + is.codec; + } + var firstInitSegment = false; + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType); + this._lastInitSegments[is.type] = is; + if (mimeType !== this._mimeTypes[is.type]) { + if (!this._mimeTypes[is.type]) { // empty, first chance create sourcebuffer + firstInitSegment = true; + try { + var sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType); + sb.addEventListener('error', this.e.onSourceBufferError); + sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd); + } + catch (error) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message); + this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, { code: error.code, msg: error.message }); + return; + } + } + else { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, "Notice: " + is.type + " mimeType changed, origin: " + this._mimeTypes[is.type] + ", target: " + mimeType); + } + this._mimeTypes[is.type] = mimeType; + } + if (!deferred) { + // deferred means this InitSegment has been pushed to pendingSegments queue + this._pendingSegments[is.type].push(is); + } + if (!firstInitSegment) { // append immediately only if init segment in subsequence + if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) { + this._doAppendSegments(); + } + } + if (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) { + // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN + // Manually correct MediaSource.duration to make progress bar seekable, and report right duration + this._requireSetMediaDuration = true; + this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds + this._updateMediaSourceDuration(); + } + }; + MSEController.prototype.appendMediaSegment = function (mediaSegment) { + var ms = mediaSegment; + this._pendingSegments[ms.type].push(ms); + if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) { + this._doCleanupSourceBuffer(); + } + var sb = this._sourceBuffers[ms.type]; + if (sb && !sb.updating && !this._hasPendingRemoveRanges()) { + this._doAppendSegments(); + } + }; + MSEController.prototype.seek = function (seconds) { + // remove all appended buffers + for (var type in this._sourceBuffers) { + if (!this._sourceBuffers[type]) { + continue; + } + // abort current buffer append algorithm + var sb = this._sourceBuffers[type]; + if (this._mediaSource.readyState === 'open') { + try { + // If range removal algorithm is running, InvalidStateError will be throwed + // Ignore it. + sb.abort(); + } + catch (error) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message); + } + } + // IDRList should be clear + this._idrList.clear(); + // pending segments should be discard + var ps = this._pendingSegments[type]; + ps.splice(0, ps.length); + if (this._mediaSource.readyState === 'closed') { + // Parent MediaSource object has been detached from HTMLMediaElement + continue; + } + // record ranges to be remove from SourceBuffer + for (var i = 0; i < sb.buffered.length; i++) { + var start = sb.buffered.start(i); + var end = sb.buffered.end(i); + this._pendingRemoveRanges[type].push({ start: start, end: end }); + } + // if sb is not updating, let's remove ranges now! + if (!sb.updating) { + this._doRemoveRanges(); + } + // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call + // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround. + // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230 + if (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari) { + var lastInitSegment = this._lastInitSegments[type]; + if (lastInitSegment) { + this._pendingSegments[type].push(lastInitSegment); + if (!sb.updating) { + this._doAppendSegments(); + } + } + } + } + }; + MSEController.prototype.endOfStream = function () { + var ms = this._mediaSource; + var sb = this._sourceBuffers; + if (!ms || ms.readyState !== 'open') { + if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) { + // If MediaSource hasn't turned into open state, and there're pending segments + // Mark pending endOfStream, defer call until all pending segments appended complete + this._hasPendingEos = true; + } + return; + } + if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) { + // If any sourcebuffer is updating, defer endOfStream operation + // See _onSourceBufferUpdateEnd() + this._hasPendingEos = true; + } + else { + this._hasPendingEos = false; + // Notify media data loading complete + // This is helpful for correcting total duration to match last media segment + // Otherwise MediaElement's ended event may not be triggered + ms.endOfStream(); + } + }; + MSEController.prototype.getNearestKeyframe = function (dts) { + return this._idrList.getLastSyncPointBeforeDts(dts); + }; + MSEController.prototype._needCleanupSourceBuffer = function () { + if (!this._config.autoCleanupSourceBuffer) { + return false; + } + var currentTime = this._mediaElement.currentTime; + for (var type in this._sourceBuffers) { + var sb = this._sourceBuffers[type]; + if (sb) { + var buffered = sb.buffered; + if (buffered.length >= 1) { + if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) { + return true; + } + } + } + } + return false; + }; + MSEController.prototype._doCleanupSourceBuffer = function () { + var currentTime = this._mediaElement.currentTime; + for (var type in this._sourceBuffers) { + var sb = this._sourceBuffers[type]; + if (sb) { + var buffered = sb.buffered; + var doRemove = false; + for (var i = 0; i < buffered.length; i++) { + var start = buffered.start(i); + var end = buffered.end(i); + if (start <= currentTime && currentTime < end + 3) { // padding 3 seconds + if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) { + doRemove = true; + var removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration; + this._pendingRemoveRanges[type].push({ start: start, end: removeEnd }); + } + } + else if (end < currentTime) { + doRemove = true; + this._pendingRemoveRanges[type].push({ start: start, end: end }); + } + } + if (doRemove && !sb.updating) { + this._doRemoveRanges(); + } + } + } + }; + MSEController.prototype._updateMediaSourceDuration = function () { + var sb = this._sourceBuffers; + if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') { + return; + } + if ((sb.video && sb.video.updating) || (sb.audio && sb.audio.updating)) { + return; + } + var current = this._mediaSource.duration; + var target = this._pendingMediaDuration; + if (target > 0 && (isNaN(current) || target > current)) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, "Update MediaSource duration from " + current + " to " + target); + this._mediaSource.duration = target; + } + this._requireSetMediaDuration = false; + this._pendingMediaDuration = 0; + }; + MSEController.prototype._doRemoveRanges = function () { + for (var type in this._pendingRemoveRanges) { + if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) { + continue; + } + var sb = this._sourceBuffers[type]; + var ranges = this._pendingRemoveRanges[type]; + while (ranges.length && !sb.updating) { + var range = ranges.shift(); + sb.remove(range.start, range.end); + } + } + }; + MSEController.prototype._doAppendSegments = function () { + var pendingSegments = this._pendingSegments; + for (var type in pendingSegments) { + if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) { + continue; + } + if (pendingSegments[type].length > 0) { + var segment = pendingSegments[type].shift(); + if (segment.timestampOffset) { + // For MPEG audio stream in MSE, if unbuffered-seeking occurred + // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer. + var currentOffset = this._sourceBuffers[type].timestampOffset; + var targetOffset = segment.timestampOffset / 1000; // in seconds + var delta = Math.abs(currentOffset - targetOffset); + if (delta > 0.1) { // If time delta > 100ms + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, "Update MPEG audio timestampOffset from " + currentOffset + " to " + targetOffset); + this._sourceBuffers[type].timestampOffset = targetOffset; + } + delete segment.timestampOffset; + } + if (!segment.data || segment.data.byteLength === 0) { + // Ignore empty buffer + continue; + } + try { + this._sourceBuffers[type].appendBuffer(segment.data); + this._isBufferFull = false; + if (type === 'video' && segment.hasOwnProperty('info')) { + this._idrList.appendArray(segment.info.syncPoints); + } + } + catch (error) { + this._pendingSegments[type].unshift(segment); + if (error.code === 22) { // QuotaExceededError + /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full + * Currently we can only do lazy-load to avoid SourceBuffer become scattered. + * SourceBuffer eviction policy may be changed in future version of FireFox. + * + * Related issues: + * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885 + * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023 + */ + // report buffer full, abort network IO + if (!this._isBufferFull) { + this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.BUFFER_FULL); + } + this._isBufferFull = true; + } + else { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message); + this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, { code: error.code, msg: error.message }); + } + } + } + } + }; + MSEController.prototype._onSourceOpen = function () { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'MediaSource onSourceOpen'); + this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen); + // deferred sourcebuffer creation / initialization + if (this._pendingSourceBufferInit.length > 0) { + var pendings = this._pendingSourceBufferInit; + while (pendings.length) { + var segment = pendings.shift(); + this.appendInitSegment(segment, true); + } + } + // there may be some pending media segments, append them + if (this._hasPendingSegments()) { + this._doAppendSegments(); + } + this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.SOURCE_OPEN); + }; + MSEController.prototype._onSourceEnded = function () { + // fired on endOfStream + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'MediaSource onSourceEnded'); + }; + MSEController.prototype._onSourceClose = function () { + // fired on detaching from media element + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'MediaSource onSourceClose'); + if (this._mediaSource && this.e != null) { + this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen); + this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded); + this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose); + } + }; + MSEController.prototype._hasPendingSegments = function () { + var ps = this._pendingSegments; + return ps.video.length > 0 || ps.audio.length > 0; + }; + MSEController.prototype._hasPendingRemoveRanges = function () { + var prr = this._pendingRemoveRanges; + return prr.video.length > 0 || prr.audio.length > 0; + }; + MSEController.prototype._onSourceBufferUpdateEnd = function () { + if (this._requireSetMediaDuration) { + this._updateMediaSourceDuration(); + } + else if (this._hasPendingRemoveRanges()) { + this._doRemoveRanges(); + } + else if (this._hasPendingSegments()) { + this._doAppendSegments(); + } + else if (this._hasPendingEos) { + this.endOfStream(); + } + this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.UPDATE_END); + }; + MSEController.prototype._onSourceBufferError = function (e) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, "SourceBuffer Error: " + e); + // this error might not always be fatal, just ignore it + }; + return MSEController; +}()); +/* harmony default export */ __webpack_exports__["default"] = (MSEController); + + +/***/ }), + +/***/ "./src/core/mse-events.js": +/*!********************************!*\ + !*** ./src/core/mse-events.js ***! + \********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var MSEEvents = { + ERROR: 'error', + SOURCE_OPEN: 'source_open', + UPDATE_END: 'update_end', + BUFFER_FULL: 'buffer_full' +}; +/* harmony default export */ __webpack_exports__["default"] = (MSEEvents); + + +/***/ }), + +/***/ "./src/core/transmuxer.js": +/*!********************************!*\ + !*** ./src/core/transmuxer.js ***! + \********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js"); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var webworkify_webpack__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! webworkify-webpack */ "./node_modules/webworkify-webpack/index.js"); +/* harmony import */ var webworkify_webpack__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(webworkify_webpack__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logging-control.js */ "./src/utils/logging-control.js"); +/* harmony import */ var _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./transmuxing-controller.js */ "./src/core/transmuxing-controller.js"); +/* harmony import */ var _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transmuxing-events.js */ "./src/core/transmuxing-events.js"); +/* harmony import */ var _media_info_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./media-info.js */ "./src/core/media-info.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + + +var Transmuxer = /** @class */ (function () { + function Transmuxer(mediaDataSource, config) { + this.TAG = 'Transmuxer'; + this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())(); + if (config.enableWorker && typeof (Worker) !== 'undefined') { + try { + this._worker = webworkify_webpack__WEBPACK_IMPORTED_MODULE_1___default()(/*require.resolve*/(/*! ./transmuxing-worker */ "./src/core/transmuxing-worker.js")); + this._workerDestroying = false; + this._worker.addEventListener('message', this._onWorkerMessage.bind(this)); + this._worker.postMessage({ cmd: 'init', param: [mediaDataSource, config] }); + this.e = { + onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this) + }; + _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_3__.default.registerListener(this.e.onLoggingConfigChanged); + this._worker.postMessage({ cmd: 'logging_config', param: _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_3__.default.getConfig() }); + } + catch (error) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_2__.default.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing'); + this._worker = null; + this._controller = new _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_4__.default(mediaDataSource, config); + } + } + else { + this._controller = new _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_4__.default(mediaDataSource, config); + } + if (this._controller) { + var ctl = this._controller; + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.IO_ERROR, this._onIOError.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.DEMUX_ERROR, this._onDemuxError.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.INIT_SEGMENT, this._onInitSegment.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_SEGMENT, this._onMediaSegment.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.LOADING_COMPLETE, this._onLoadingComplete.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_INFO, this._onMediaInfo.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.METADATA_ARRIVED, this._onMetaDataArrived.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.SCRIPTDATA_ARRIVED, this._onScriptDataArrived.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.STATISTICS_INFO, this._onStatisticsInfo.bind(this)); + ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this)); + } + } + Transmuxer.prototype.destroy = function () { + if (this._worker) { + if (!this._workerDestroying) { + this._workerDestroying = true; + this._worker.postMessage({ cmd: 'destroy' }); + _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_3__.default.removeListener(this.e.onLoggingConfigChanged); + this.e = null; + } + } + else { + this._controller.destroy(); + this._controller = null; + } + this._emitter.removeAllListeners(); + this._emitter = null; + }; + Transmuxer.prototype.on = function (event, listener) { + this._emitter.addListener(event, listener); + }; + Transmuxer.prototype.off = function (event, listener) { + this._emitter.removeListener(event, listener); + }; + Transmuxer.prototype.hasWorker = function () { + return this._worker != null; + }; + Transmuxer.prototype.open = function () { + if (this._worker) { + this._worker.postMessage({ cmd: 'start' }); + } + else { + this._controller.start(); + } + }; + Transmuxer.prototype.close = function () { + if (this._worker) { + this._worker.postMessage({ cmd: 'stop' }); + } + else { + this._controller.stop(); + } + }; + Transmuxer.prototype.seek = function (milliseconds) { + if (this._worker) { + this._worker.postMessage({ cmd: 'seek', param: milliseconds }); + } + else { + this._controller.seek(milliseconds); + } + }; + Transmuxer.prototype.pause = function () { + if (this._worker) { + this._worker.postMessage({ cmd: 'pause' }); + } + else { + this._controller.pause(); + } + }; + Transmuxer.prototype.resume = function () { + if (this._worker) { + this._worker.postMessage({ cmd: 'resume' }); + } + else { + this._controller.resume(); + } + }; + Transmuxer.prototype._onInitSegment = function (type, initSegment) { + var _this = this; + // do async invoke + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.INIT_SEGMENT, type, initSegment); + }); + }; + Transmuxer.prototype._onMediaSegment = function (type, mediaSegment) { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_SEGMENT, type, mediaSegment); + }); + }; + Transmuxer.prototype._onLoadingComplete = function () { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.LOADING_COMPLETE); + }); + }; + Transmuxer.prototype._onRecoveredEarlyEof = function () { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOVERED_EARLY_EOF); + }); + }; + Transmuxer.prototype._onMediaInfo = function (mediaInfo) { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_INFO, mediaInfo); + }); + }; + Transmuxer.prototype._onMetaDataArrived = function (metadata) { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.METADATA_ARRIVED, metadata); + }); + }; + Transmuxer.prototype._onScriptDataArrived = function (data) { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.SCRIPTDATA_ARRIVED, data); + }); + }; + Transmuxer.prototype._onStatisticsInfo = function (statisticsInfo) { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.STATISTICS_INFO, statisticsInfo); + }); + }; + Transmuxer.prototype._onIOError = function (type, info) { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.IO_ERROR, type, info); + }); + }; + Transmuxer.prototype._onDemuxError = function (type, info) { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.DEMUX_ERROR, type, info); + }); + }; + Transmuxer.prototype._onRecommendSeekpoint = function (milliseconds) { + var _this = this; + Promise.resolve().then(function () { + _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOMMEND_SEEKPOINT, milliseconds); + }); + }; + Transmuxer.prototype._onLoggingConfigChanged = function (config) { + if (this._worker) { + this._worker.postMessage({ cmd: 'logging_config', param: config }); + } + }; + Transmuxer.prototype._onWorkerMessage = function (e) { + var message = e.data; + var data = message.data; + if (message.msg === 'destroyed' || this._workerDestroying) { + this._workerDestroying = false; + this._worker.terminate(); + this._worker = null; + return; + } + switch (message.msg) { + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.INIT_SEGMENT: + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_SEGMENT: + this._emitter.emit(message.msg, data.type, data.data); + break; + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.LOADING_COMPLETE: + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOVERED_EARLY_EOF: + this._emitter.emit(message.msg); + break; + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_INFO: + Object.setPrototypeOf(data, _media_info_js__WEBPACK_IMPORTED_MODULE_6__.default.prototype); + this._emitter.emit(message.msg, data); + break; + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.METADATA_ARRIVED: + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.SCRIPTDATA_ARRIVED: + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.STATISTICS_INFO: + this._emitter.emit(message.msg, data); + break; + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.IO_ERROR: + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.DEMUX_ERROR: + this._emitter.emit(message.msg, data.type, data.info); + break; + case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOMMEND_SEEKPOINT: + this._emitter.emit(message.msg, data); + break; + case 'logcat_callback': + _utils_logger_js__WEBPACK_IMPORTED_MODULE_2__.default.emitter.emit('log', data.type, data.logcat); + break; + default: + break; + } + }; + return Transmuxer; +}()); +/* harmony default export */ __webpack_exports__["default"] = (Transmuxer); + + +/***/ }), + +/***/ "./src/core/transmuxing-controller.js": +/*!********************************************!*\ + !*** ./src/core/transmuxing-controller.js ***! + \********************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js"); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js"); +/* harmony import */ var _media_info_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./media-info.js */ "./src/core/media-info.js"); +/* harmony import */ var _demux_flv_demuxer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../demux/flv-demuxer.js */ "./src/demux/flv-demuxer.js"); +/* harmony import */ var _remux_mp4_remuxer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../remux/mp4-remuxer.js */ "./src/remux/mp4-remuxer.js"); +/* harmony import */ var _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../demux/demux-errors.js */ "./src/demux/demux-errors.js"); +/* harmony import */ var _io_io_controller_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../io/io-controller.js */ "./src/io/io-controller.js"); +/* harmony import */ var _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./transmuxing-events.js */ "./src/core/transmuxing-events.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + + + + +// Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support +var TransmuxingController = /** @class */ (function () { + function TransmuxingController(mediaDataSource, config) { + this.TAG = 'TransmuxingController'; + this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())(); + this._config = config; + // treat single part media as multipart media, which has only one segment + if (!mediaDataSource.segments) { + mediaDataSource.segments = [{ + duration: mediaDataSource.duration, + filesize: mediaDataSource.filesize, + url: mediaDataSource.url + }]; + } + // fill in default IO params if not exists + if (typeof mediaDataSource.cors !== 'boolean') { + mediaDataSource.cors = true; + } + if (typeof mediaDataSource.withCredentials !== 'boolean') { + mediaDataSource.withCredentials = false; + } + this._mediaDataSource = mediaDataSource; + this._currentSegmentIndex = 0; + var totalDuration = 0; + this._mediaDataSource.segments.forEach(function (segment) { + // timestampBase for each segment, and calculate total duration + segment.timestampBase = totalDuration; + totalDuration += segment.duration; + // params needed by IOController + segment.cors = mediaDataSource.cors; + segment.withCredentials = mediaDataSource.withCredentials; + // referrer policy control, if exist + if (config.referrerPolicy) { + segment.referrerPolicy = config.referrerPolicy; + } + }); + if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) { + this._mediaDataSource.duration = totalDuration; + } + this._mediaInfo = null; + this._demuxer = null; + this._remuxer = null; + this._ioctl = null; + this._pendingSeekTime = null; + this._pendingResolveSeekPoint = null; + this._statisticsReporter = null; + } + TransmuxingController.prototype.destroy = function () { + this._mediaInfo = null; + this._mediaDataSource = null; + if (this._statisticsReporter) { + this._disableStatisticsReporter(); + } + if (this._ioctl) { + this._ioctl.destroy(); + this._ioctl = null; + } + if (this._demuxer) { + this._demuxer.destroy(); + this._demuxer = null; + } + if (this._remuxer) { + this._remuxer.destroy(); + this._remuxer = null; + } + this._emitter.removeAllListeners(); + this._emitter = null; + }; + TransmuxingController.prototype.on = function (event, listener) { + this._emitter.addListener(event, listener); + }; + TransmuxingController.prototype.off = function (event, listener) { + this._emitter.removeListener(event, listener); + }; + TransmuxingController.prototype.start = function () { + this._loadSegment(0); + this._enableStatisticsReporter(); + }; + TransmuxingController.prototype._loadSegment = function (segmentIndex, optionalFrom) { + this._currentSegmentIndex = segmentIndex; + var dataSource = this._mediaDataSource.segments[segmentIndex]; + var ioctl = this._ioctl = new _io_io_controller_js__WEBPACK_IMPORTED_MODULE_7__.default(dataSource, this._config, segmentIndex); + ioctl.onError = this._onIOException.bind(this); + ioctl.onSeeked = this._onIOSeeked.bind(this); + ioctl.onComplete = this._onIOComplete.bind(this); + ioctl.onRedirect = this._onIORedirect.bind(this); + ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this); + if (optionalFrom) { + this._demuxer.bindDataSource(this._ioctl); + } + else { + ioctl.onDataArrival = this._onInitChunkArrival.bind(this); + } + ioctl.open(optionalFrom); + }; + TransmuxingController.prototype.stop = function () { + this._internalAbort(); + this._disableStatisticsReporter(); + }; + TransmuxingController.prototype._internalAbort = function () { + if (this._ioctl) { + this._ioctl.destroy(); + this._ioctl = null; + } + }; + TransmuxingController.prototype.pause = function () { + if (this._ioctl && this._ioctl.isWorking()) { + this._ioctl.pause(); + this._disableStatisticsReporter(); + } + }; + TransmuxingController.prototype.resume = function () { + if (this._ioctl && this._ioctl.isPaused()) { + this._ioctl.resume(); + this._enableStatisticsReporter(); + } + }; + TransmuxingController.prototype.seek = function (milliseconds) { + if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) { + return; + } + var targetSegmentIndex = this._searchSegmentIndexContains(milliseconds); + if (targetSegmentIndex === this._currentSegmentIndex) { + // intra-segment seeking + var segmentInfo = this._mediaInfo.segments[targetSegmentIndex]; + if (segmentInfo == undefined) { + // current segment loading started, but mediainfo hasn't received yet + // wait for the metadata loaded, then seek to expected position + this._pendingSeekTime = milliseconds; + } + else { + var keyframe = segmentInfo.getNearestKeyframe(milliseconds); + this._remuxer.seek(keyframe.milliseconds); + this._ioctl.seek(keyframe.fileposition); + // Will be resolved in _onRemuxerMediaSegmentArrival() + this._pendingResolveSeekPoint = keyframe.milliseconds; + } + } + else { + // cross-segment seeking + var targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex]; + if (targetSegmentInfo == undefined) { + // target segment hasn't been loaded. We need metadata then seek to expected time + this._pendingSeekTime = milliseconds; + this._internalAbort(); + this._remuxer.seek(); + this._remuxer.insertDiscontinuity(); + this._loadSegment(targetSegmentIndex); + // Here we wait for the metadata loaded, then seek to expected position + } + else { + // We have target segment's metadata, direct seek to target position + var keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds); + this._internalAbort(); + this._remuxer.seek(milliseconds); + this._remuxer.insertDiscontinuity(); + this._demuxer.resetMediaInfo(); + this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase; + this._loadSegment(targetSegmentIndex, keyframe.fileposition); + this._pendingResolveSeekPoint = keyframe.milliseconds; + this._reportSegmentMediaInfo(targetSegmentIndex); + } + } + this._enableStatisticsReporter(); + }; + TransmuxingController.prototype._searchSegmentIndexContains = function (milliseconds) { + var segments = this._mediaDataSource.segments; + var idx = segments.length - 1; + for (var i = 0; i < segments.length; i++) { + if (milliseconds < segments[i].timestampBase) { + idx = i - 1; + break; + } + } + return idx; + }; + TransmuxingController.prototype._onInitChunkArrival = function (data, byteStart) { + var _this = this; + var probeData = null; + var consumed = 0; + if (byteStart > 0) { + // IOController seeked immediately after opened, byteStart > 0 callback may received + this._demuxer.bindDataSource(this._ioctl); + this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase; + consumed = this._demuxer.parseChunks(data, byteStart); + } + else if ((probeData = _demux_flv_demuxer_js__WEBPACK_IMPORTED_MODULE_4__.default.probe(data)).match) { + // Always create new FLVDemuxer + this._demuxer = new _demux_flv_demuxer_js__WEBPACK_IMPORTED_MODULE_4__.default(probeData, this._config); + if (!this._remuxer) { + this._remuxer = new _remux_mp4_remuxer_js__WEBPACK_IMPORTED_MODULE_5__.default(this._config); + } + var mds = this._mediaDataSource; + if (mds.duration != undefined && !isNaN(mds.duration)) { + this._demuxer.overridedDuration = mds.duration; + } + if (typeof mds.hasAudio === 'boolean') { + this._demuxer.overridedHasAudio = mds.hasAudio; + } + if (typeof mds.hasVideo === 'boolean') { + this._demuxer.overridedHasVideo = mds.hasVideo; + } + this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase; + this._demuxer.onError = this._onDemuxException.bind(this); + this._demuxer.onMediaInfo = this._onMediaInfo.bind(this); + this._demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this); + this._demuxer.onScriptDataArrived = this._onScriptDataArrived.bind(this); + this._remuxer.bindDataSource(this._demuxer + .bindDataSource(this._ioctl)); + this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this); + this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this); + consumed = this._demuxer.parseChunks(data, byteStart); + } + else { + probeData = null; + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, 'Non-FLV, Unsupported media type!'); + Promise.resolve().then(function () { + _this._internalAbort(); + }); + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.DEMUX_ERROR, _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_6__.default.FORMAT_UNSUPPORTED, 'Non-FLV, Unsupported media type'); + consumed = 0; + } + return consumed; + }; + TransmuxingController.prototype._onMediaInfo = function (mediaInfo) { + var _this = this; + if (this._mediaInfo == null) { + // Store first segment's mediainfo as global mediaInfo + this._mediaInfo = Object.assign({}, mediaInfo); + this._mediaInfo.keyframesIndex = null; + this._mediaInfo.segments = []; + this._mediaInfo.segmentCount = this._mediaDataSource.segments.length; + Object.setPrototypeOf(this._mediaInfo, _media_info_js__WEBPACK_IMPORTED_MODULE_3__.default.prototype); + } + var segmentInfo = Object.assign({}, mediaInfo); + Object.setPrototypeOf(segmentInfo, _media_info_js__WEBPACK_IMPORTED_MODULE_3__.default.prototype); + this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo; + // notify mediaInfo update + this._reportSegmentMediaInfo(this._currentSegmentIndex); + if (this._pendingSeekTime != null) { + Promise.resolve().then(function () { + var target = _this._pendingSeekTime; + _this._pendingSeekTime = null; + _this.seek(target); + }); + } + }; + TransmuxingController.prototype._onMetaDataArrived = function (metadata) { + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.METADATA_ARRIVED, metadata); + }; + TransmuxingController.prototype._onScriptDataArrived = function (data) { + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.SCRIPTDATA_ARRIVED, data); + }; + TransmuxingController.prototype._onIOSeeked = function () { + this._remuxer.insertDiscontinuity(); + }; + TransmuxingController.prototype._onIOComplete = function (extraData) { + var segmentIndex = extraData; + var nextSegmentIndex = segmentIndex + 1; + if (nextSegmentIndex < this._mediaDataSource.segments.length) { + this._internalAbort(); + this._remuxer.flushStashedSamples(); + this._loadSegment(nextSegmentIndex); + } + else { + this._remuxer.flushStashedSamples(); + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.LOADING_COMPLETE); + this._disableStatisticsReporter(); + } + }; + TransmuxingController.prototype._onIORedirect = function (redirectedURL) { + var segmentIndex = this._ioctl.extraData; + this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL; + }; + TransmuxingController.prototype._onIORecoveredEarlyEof = function () { + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.RECOVERED_EARLY_EOF); + }; + TransmuxingController.prototype._onIOException = function (type, info) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, "IOException: type = " + type + ", code = " + info.code + ", msg = " + info.msg); + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.IO_ERROR, type, info); + this._disableStatisticsReporter(); + }; + TransmuxingController.prototype._onDemuxException = function (type, info) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, "DemuxException: type = " + type + ", info = " + info); + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.DEMUX_ERROR, type, info); + }; + TransmuxingController.prototype._onRemuxerInitSegmentArrival = function (type, initSegment) { + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.INIT_SEGMENT, type, initSegment); + }; + TransmuxingController.prototype._onRemuxerMediaSegmentArrival = function (type, mediaSegment) { + if (this._pendingSeekTime != null) { + // Media segments after new-segment cross-seeking should be dropped. + return; + } + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.MEDIA_SEGMENT, type, mediaSegment); + // Resolve pending seekPoint + if (this._pendingResolveSeekPoint != null && type === 'video') { + var syncPoints = mediaSegment.info.syncPoints; + var seekpoint = this._pendingResolveSeekPoint; + this._pendingResolveSeekPoint = null; + // Safari: Pass PTS for recommend_seekpoint + if (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) { + seekpoint = syncPoints[0].pts; + } + // else: use original DTS (keyframe.milliseconds) + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.RECOMMEND_SEEKPOINT, seekpoint); + } + }; + TransmuxingController.prototype._enableStatisticsReporter = function () { + if (this._statisticsReporter == null) { + this._statisticsReporter = self.setInterval(this._reportStatisticsInfo.bind(this), this._config.statisticsInfoReportInterval); + } + }; + TransmuxingController.prototype._disableStatisticsReporter = function () { + if (this._statisticsReporter) { + self.clearInterval(this._statisticsReporter); + this._statisticsReporter = null; + } + }; + TransmuxingController.prototype._reportSegmentMediaInfo = function (segmentIndex) { + var segmentInfo = this._mediaInfo.segments[segmentIndex]; + var exportInfo = Object.assign({}, segmentInfo); + exportInfo.duration = this._mediaInfo.duration; + exportInfo.segmentCount = this._mediaInfo.segmentCount; + delete exportInfo.segments; + delete exportInfo.keyframesIndex; + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.MEDIA_INFO, exportInfo); + }; + TransmuxingController.prototype._reportStatisticsInfo = function () { + var info = {}; + info.url = this._ioctl.currentURL; + info.hasRedirect = this._ioctl.hasRedirect; + if (info.hasRedirect) { + info.redirectedURL = this._ioctl.currentRedirectedURL; + } + info.speed = this._ioctl.currentSpeed; + info.loaderType = this._ioctl.loaderType; + info.currentSegmentIndex = this._currentSegmentIndex; + info.totalSegmentCount = this._mediaDataSource.segments.length; + this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.STATISTICS_INFO, info); + }; + return TransmuxingController; +}()); +/* harmony default export */ __webpack_exports__["default"] = (TransmuxingController); + + +/***/ }), + +/***/ "./src/core/transmuxing-events.js": +/*!****************************************!*\ + !*** ./src/core/transmuxing-events.js ***! + \****************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var TransmuxingEvents = { + IO_ERROR: 'io_error', + DEMUX_ERROR: 'demux_error', + INIT_SEGMENT: 'init_segment', + MEDIA_SEGMENT: 'media_segment', + LOADING_COMPLETE: 'loading_complete', + RECOVERED_EARLY_EOF: 'recovered_early_eof', + MEDIA_INFO: 'media_info', + METADATA_ARRIVED: 'metadata_arrived', + SCRIPTDATA_ARRIVED: 'scriptdata_arrived', + STATISTICS_INFO: 'statistics_info', + RECOMMEND_SEEKPOINT: 'recommend_seekpoint' +}; +/* harmony default export */ __webpack_exports__["default"] = (TransmuxingEvents); + + +/***/ }), + +/***/ "./src/core/transmuxing-worker.js": +/*!****************************************!*\ + !*** ./src/core/transmuxing-worker.js ***! + \****************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logging-control.js */ "./src/utils/logging-control.js"); +/* harmony import */ var _utils_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/polyfill.js */ "./src/utils/polyfill.js"); +/* harmony import */ var _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transmuxing-controller.js */ "./src/core/transmuxing-controller.js"); +/* harmony import */ var _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./transmuxing-events.js */ "./src/core/transmuxing-events.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +/* post message to worker: + data: { + cmd: string + param: any + } + + receive message from worker: + data: { + msg: string, + data: any + } + */ +var TransmuxingWorker = function (self) { + var TAG = 'TransmuxingWorker'; + var controller = null; + var logcatListener = onLogcatCallback.bind(this); + _utils_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.default.install(); + self.addEventListener('message', function (e) { + switch (e.data.cmd) { + case 'init': + controller = new _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_2__.default(e.data.param[0], e.data.param[1]); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.IO_ERROR, onIOError.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.DEMUX_ERROR, onDemuxError.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.INIT_SEGMENT, onInitSegment.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_SEGMENT, onMediaSegment.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.LOADING_COMPLETE, onLoadingComplete.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOVERED_EARLY_EOF, onRecoveredEarlyEof.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO, onMediaInfo.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.METADATA_ARRIVED, onMetaDataArrived.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.SCRIPTDATA_ARRIVED, onScriptDataArrived.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO, onStatisticsInfo.bind(this)); + controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOMMEND_SEEKPOINT, onRecommendSeekpoint.bind(this)); + break; + case 'destroy': + if (controller) { + controller.destroy(); + controller = null; + } + self.postMessage({ msg: 'destroyed' }); + break; + case 'start': + controller.start(); + break; + case 'stop': + controller.stop(); + break; + case 'seek': + controller.seek(e.data.param); + break; + case 'pause': + controller.pause(); + break; + case 'resume': + controller.resume(); + break; + case 'logging_config': { + var config = e.data.param; + _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_0__.default.applyConfig(config); + if (config.enableCallback === true) { + _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_0__.default.addLogListener(logcatListener); + } + else { + _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_0__.default.removeLogListener(logcatListener); + } + break; + } + } + }); + function onInitSegment(type, initSegment) { + var obj = { + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.INIT_SEGMENT, + data: { + type: type, + data: initSegment + } + }; + self.postMessage(obj, [initSegment.data]); // data: ArrayBuffer + } + function onMediaSegment(type, mediaSegment) { + var obj = { + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_SEGMENT, + data: { + type: type, + data: mediaSegment + } + }; + self.postMessage(obj, [mediaSegment.data]); // data: ArrayBuffer + } + function onLoadingComplete() { + var obj = { + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.LOADING_COMPLETE + }; + self.postMessage(obj); + } + function onRecoveredEarlyEof() { + var obj = { + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOVERED_EARLY_EOF + }; + self.postMessage(obj); + } + function onMediaInfo(mediaInfo) { + var obj = { + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO, + data: mediaInfo + }; + self.postMessage(obj); + } + function onMetaDataArrived(metadata) { + var obj = { + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.METADATA_ARRIVED, + data: metadata + }; + self.postMessage(obj); + } + function onScriptDataArrived(data) { + var obj = { + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.SCRIPTDATA_ARRIVED, + data: data + }; + self.postMessage(obj); + } + function onStatisticsInfo(statInfo) { + var obj = { + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO, + data: statInfo + }; + self.postMessage(obj); + } + function onIOError(type, info) { + self.postMessage({ + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.IO_ERROR, + data: { + type: type, + info: info + } + }); + } + function onDemuxError(type, info) { + self.postMessage({ + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.DEMUX_ERROR, + data: { + type: type, + info: info + } + }); + } + function onRecommendSeekpoint(milliseconds) { + self.postMessage({ + msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOMMEND_SEEKPOINT, + data: milliseconds + }); + } + function onLogcatCallback(type, str) { + self.postMessage({ + msg: 'logcat_callback', + data: { + type: type, + logcat: str + } + }); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (TransmuxingWorker); + + +/***/ }), + +/***/ "./src/demux/amf-parser.js": +/*!*********************************!*\ + !*** ./src/demux/amf-parser.js ***! + \*********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _utils_utf8_conv_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/utf8-conv.js */ "./src/utils/utf8-conv.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +var le = (function () { + var buf = new ArrayBuffer(2); + (new DataView(buf)).setInt16(0, 256, true); // little-endian write + return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE +})(); +var AMF = /** @class */ (function () { + function AMF() { + } + AMF.parseScriptData = function (arrayBuffer, dataOffset, dataSize) { + var data = {}; + try { + var name_1 = AMF.parseValue(arrayBuffer, dataOffset, dataSize); + var value = AMF.parseValue(arrayBuffer, dataOffset + name_1.size, dataSize - name_1.size); + data[name_1.data] = value.data; + } + catch (e) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.e('AMF', e.toString()); + } + return data; + }; + AMF.parseObject = function (arrayBuffer, dataOffset, dataSize) { + if (dataSize < 3) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data not enough when parse ScriptDataObject'); + } + var name = AMF.parseString(arrayBuffer, dataOffset, dataSize); + var value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size); + var isObjectEnd = value.objectEnd; + return { + data: { + name: name.data, + value: value.data + }, + size: name.size + value.size, + objectEnd: isObjectEnd + }; + }; + AMF.parseVariable = function (arrayBuffer, dataOffset, dataSize) { + return AMF.parseObject(arrayBuffer, dataOffset, dataSize); + }; + AMF.parseString = function (arrayBuffer, dataOffset, dataSize) { + if (dataSize < 2) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data not enough when parse String'); + } + var v = new DataView(arrayBuffer, dataOffset, dataSize); + var length = v.getUint16(0, !le); + var str; + if (length > 0) { + str = (0,_utils_utf8_conv_js__WEBPACK_IMPORTED_MODULE_1__.default)(new Uint8Array(arrayBuffer, dataOffset + 2, length)); + } + else { + str = ''; + } + return { + data: str, + size: 2 + length + }; + }; + AMF.parseLongString = function (arrayBuffer, dataOffset, dataSize) { + if (dataSize < 4) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data not enough when parse LongString'); + } + var v = new DataView(arrayBuffer, dataOffset, dataSize); + var length = v.getUint32(0, !le); + var str; + if (length > 0) { + str = (0,_utils_utf8_conv_js__WEBPACK_IMPORTED_MODULE_1__.default)(new Uint8Array(arrayBuffer, dataOffset + 4, length)); + } + else { + str = ''; + } + return { + data: str, + size: 4 + length + }; + }; + AMF.parseDate = function (arrayBuffer, dataOffset, dataSize) { + if (dataSize < 10) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data size invalid when parse Date'); + } + var v = new DataView(arrayBuffer, dataOffset, dataSize); + var timestamp = v.getFloat64(0, !le); + var localTimeOffset = v.getInt16(8, !le); + timestamp += localTimeOffset * 60 * 1000; // get UTC time + return { + data: new Date(timestamp), + size: 8 + 2 + }; + }; + AMF.parseValue = function (arrayBuffer, dataOffset, dataSize) { + if (dataSize < 1) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data not enough when parse Value'); + } + var v = new DataView(arrayBuffer, dataOffset, dataSize); + var offset = 1; + var type = v.getUint8(0); + var value; + var objectEnd = false; + try { + switch (type) { + case 0: // Number(Double) type + value = v.getFloat64(1, !le); + offset += 8; + break; + case 1: { // Boolean type + var b = v.getUint8(1); + value = b ? true : false; + offset += 1; + break; + } + case 2: { // String type + var amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1); + value = amfstr.data; + offset += amfstr.size; + break; + } + case 3: { // Object(s) type + value = {}; + var terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd + if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) { + terminal = 3; + } + while (offset < dataSize - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24) + var amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal); + if (amfobj.objectEnd) + break; + value[amfobj.data.name] = amfobj.data.value; + offset += amfobj.size; + } + if (offset <= dataSize - 3) { + var marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF; + if (marker === 9) { + offset += 3; + } + } + break; + } + case 8: { // ECMA array type (Mixed array) + value = {}; + offset += 4; // ECMAArrayLength(UI32) + var terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd + if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) { + terminal = 3; + } + while (offset < dataSize - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24) + var amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - terminal); + if (amfvar.objectEnd) + break; + value[amfvar.data.name] = amfvar.data.value; + offset += amfvar.size; + } + if (offset <= dataSize - 3) { + var marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF; + if (marker === 9) { + offset += 3; + } + } + break; + } + case 9: // ScriptDataObjectEnd + value = undefined; + offset = 1; + objectEnd = true; + break; + case 10: { // Strict array type + // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf + value = []; + var strictArrayLength = v.getUint32(1, !le); + offset += 4; + for (var i = 0; i < strictArrayLength; i++) { + var val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset); + value.push(val.data); + offset += val.size; + } + break; + } + case 11: { // Date type + var date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1); + value = date.data; + offset += date.size; + break; + } + case 12: { // Long string type + var amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1); + value = amfLongStr.data; + offset += amfLongStr.size; + break; + } + default: + // ignore and skip + offset = dataSize; + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w('AMF', 'Unsupported AMF value type ' + type); + } + } + catch (e) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.e('AMF', e.toString()); + } + return { + data: value, + size: offset, + objectEnd: objectEnd + }; + }; + return AMF; +}()); +/* harmony default export */ __webpack_exports__["default"] = (AMF); + + +/***/ }), + +/***/ "./src/demux/demux-errors.js": +/*!***********************************!*\ + !*** ./src/demux/demux-errors.js ***! + \***********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var DemuxErrors = { + OK: 'OK', + FORMAT_ERROR: 'FormatError', + FORMAT_UNSUPPORTED: 'FormatUnsupported', + CODEC_UNSUPPORTED: 'CodecUnsupported' +}; +/* harmony default export */ __webpack_exports__["default"] = (DemuxErrors); + + +/***/ }), + +/***/ "./src/demux/exp-golomb.js": +/*!*********************************!*\ + !*** ./src/demux/exp-golomb.js ***! + \*********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Exponential-Golomb buffer decoder +var ExpGolomb = /** @class */ (function () { + function ExpGolomb(uint8array) { + this.TAG = 'ExpGolomb'; + this._buffer = uint8array; + this._buffer_index = 0; + this._total_bytes = uint8array.byteLength; + this._total_bits = uint8array.byteLength * 8; + this._current_word = 0; + this._current_word_bits_left = 0; + } + ExpGolomb.prototype.destroy = function () { + this._buffer = null; + }; + ExpGolomb.prototype._fillCurrentWord = function () { + var buffer_bytes_left = this._total_bytes - this._buffer_index; + if (buffer_bytes_left <= 0) + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__.IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available'); + var bytes_read = Math.min(4, buffer_bytes_left); + var word = new Uint8Array(4); + word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read)); + this._current_word = new DataView(word.buffer).getUint32(0, false); + this._buffer_index += bytes_read; + this._current_word_bits_left = bytes_read * 8; + }; + ExpGolomb.prototype.readBits = function (bits) { + if (bits > 32) + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__.InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!'); + if (bits <= this._current_word_bits_left) { + var result_1 = this._current_word >>> (32 - bits); + this._current_word <<= bits; + this._current_word_bits_left -= bits; + return result_1; + } + var result = this._current_word_bits_left ? this._current_word : 0; + result = result >>> (32 - this._current_word_bits_left); + var bits_need_left = bits - this._current_word_bits_left; + this._fillCurrentWord(); + var bits_read_next = Math.min(bits_need_left, this._current_word_bits_left); + var result2 = this._current_word >>> (32 - bits_read_next); + this._current_word <<= bits_read_next; + this._current_word_bits_left -= bits_read_next; + result = (result << bits_read_next) | result2; + return result; + }; + ExpGolomb.prototype.readBool = function () { + return this.readBits(1) === 1; + }; + ExpGolomb.prototype.readByte = function () { + return this.readBits(8); + }; + ExpGolomb.prototype._skipLeadingZero = function () { + var zero_count; + for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) { + if (0 !== (this._current_word & (0x80000000 >>> zero_count))) { + this._current_word <<= zero_count; + this._current_word_bits_left -= zero_count; + return zero_count; + } + } + this._fillCurrentWord(); + return zero_count + this._skipLeadingZero(); + }; + ExpGolomb.prototype.readUEG = function () { + var leading_zeros = this._skipLeadingZero(); + return this.readBits(leading_zeros + 1) - 1; + }; + ExpGolomb.prototype.readSEG = function () { + var value = this.readUEG(); + if (value & 0x01) { + return (value + 1) >>> 1; + } + else { + return -1 * (value >>> 1); + } + }; + return ExpGolomb; +}()); +/* harmony default export */ __webpack_exports__["default"] = (ExpGolomb); + + +/***/ }), + +/***/ "./src/demux/flv-demuxer.js": +/*!**********************************!*\ + !*** ./src/demux/flv-demuxer.js ***! + \**********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _amf_parser_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./amf-parser.js */ "./src/demux/amf-parser.js"); +/* harmony import */ var _sps_parser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sps-parser.js */ "./src/demux/sps-parser.js"); +/* harmony import */ var _demux_errors_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./demux-errors.js */ "./src/demux/demux-errors.js"); +/* harmony import */ var _core_media_info_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/media-info.js */ "./src/core/media-info.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + +function Swap16(src) { + return (((src >>> 8) & 0xFF) | + ((src & 0xFF) << 8)); +} +function Swap32(src) { + return (((src & 0xFF000000) >>> 24) | + ((src & 0x00FF0000) >>> 8) | + ((src & 0x0000FF00) << 8) | + ((src & 0x000000FF) << 24)); +} +function ReadBig32(array, index) { + return ((array[index] << 24) | + (array[index + 1] << 16) | + (array[index + 2] << 8) | + (array[index + 3])); +} +var FLVDemuxer = /** @class */ (function () { + function FLVDemuxer(probeData, config) { + this.TAG = 'FLVDemuxer'; + this._config = config; + this._onError = null; + this._onMediaInfo = null; + this._onMetaDataArrived = null; + this._onScriptDataArrived = null; + this._onTrackMetadata = null; + this._onDataAvailable = null; + this._dataOffset = probeData.dataOffset; + this._firstParse = true; + this._dispatch = false; + this._hasAudio = probeData.hasAudioTrack; + this._hasVideo = probeData.hasVideoTrack; + this._hasAudioFlagOverrided = false; + this._hasVideoFlagOverrided = false; + this._audioInitialMetadataDispatched = false; + this._videoInitialMetadataDispatched = false; + this._mediaInfo = new _core_media_info_js__WEBPACK_IMPORTED_MODULE_4__.default(); + this._mediaInfo.hasAudio = this._hasAudio; + this._mediaInfo.hasVideo = this._hasVideo; + this._metadata = null; + this._audioMetadata = null; + this._videoMetadata = null; + this._naluLengthSize = 4; + this._timestampBase = 0; // int32, in milliseconds + this._timescale = 1000; + this._duration = 0; // int32, in milliseconds + this._durationOverrided = false; + this._referenceFrameRate = { + fixed: true, + fps: 23.976, + fps_num: 23976, + fps_den: 1000 + }; + this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000]; + this._mpegSamplingRates = [ + 96000, 88200, 64000, 48000, 44100, 32000, + 24000, 22050, 16000, 12000, 11025, 8000, 7350 + ]; + this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0]; + this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0]; + this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0]; + this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1]; + this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1]; + this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1]; + this._videoTrack = { type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0 }; + this._audioTrack = { type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0 }; + this._littleEndian = (function () { + var buf = new ArrayBuffer(2); + (new DataView(buf)).setInt16(0, 256, true); // little-endian write + return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE + })(); + } + FLVDemuxer.prototype.destroy = function () { + this._mediaInfo = null; + this._metadata = null; + this._audioMetadata = null; + this._videoMetadata = null; + this._videoTrack = null; + this._audioTrack = null; + this._onError = null; + this._onMediaInfo = null; + this._onMetaDataArrived = null; + this._onScriptDataArrived = null; + this._onTrackMetadata = null; + this._onDataAvailable = null; + }; + FLVDemuxer.probe = function (buffer) { + var data = new Uint8Array(buffer); + var mismatch = { match: false }; + if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) { + return mismatch; + } + var hasAudio = ((data[4] & 4) >>> 2) !== 0; + var hasVideo = (data[4] & 1) !== 0; + var offset = ReadBig32(data, 5); + if (offset < 9) { + return mismatch; + } + return { + match: true, + consumed: offset, + dataOffset: offset, + hasAudioTrack: hasAudio, + hasVideoTrack: hasVideo + }; + }; + FLVDemuxer.prototype.bindDataSource = function (loader) { + loader.onDataArrival = this.parseChunks.bind(this); + return this; + }; + Object.defineProperty(FLVDemuxer.prototype, "onTrackMetadata", { + // prototype: function(type: string, metadata: any): void + get: function () { + return this._onTrackMetadata; + }, + set: function (callback) { + this._onTrackMetadata = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "onMediaInfo", { + // prototype: function(mediaInfo: MediaInfo): void + get: function () { + return this._onMediaInfo; + }, + set: function (callback) { + this._onMediaInfo = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "onMetaDataArrived", { + get: function () { + return this._onMetaDataArrived; + }, + set: function (callback) { + this._onMetaDataArrived = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "onScriptDataArrived", { + get: function () { + return this._onScriptDataArrived; + }, + set: function (callback) { + this._onScriptDataArrived = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "onError", { + // prototype: function(type: number, info: string): void + get: function () { + return this._onError; + }, + set: function (callback) { + this._onError = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "onDataAvailable", { + // prototype: function(videoTrack: any, audioTrack: any): void + get: function () { + return this._onDataAvailable; + }, + set: function (callback) { + this._onDataAvailable = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "timestampBase", { + // timestamp base for output samples, must be in milliseconds + get: function () { + return this._timestampBase; + }, + set: function (base) { + this._timestampBase = base; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "overridedDuration", { + get: function () { + return this._duration; + }, + // Force-override media duration. Must be in milliseconds, int32 + set: function (duration) { + this._durationOverrided = true; + this._duration = duration; + this._mediaInfo.duration = duration; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "overridedHasAudio", { + // Force-override audio track present flag, boolean + set: function (hasAudio) { + this._hasAudioFlagOverrided = true; + this._hasAudio = hasAudio; + this._mediaInfo.hasAudio = hasAudio; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FLVDemuxer.prototype, "overridedHasVideo", { + // Force-override video track present flag, boolean + set: function (hasVideo) { + this._hasVideoFlagOverrided = true; + this._hasVideo = hasVideo; + this._mediaInfo.hasVideo = hasVideo; + }, + enumerable: false, + configurable: true + }); + FLVDemuxer.prototype.resetMediaInfo = function () { + this._mediaInfo = new _core_media_info_js__WEBPACK_IMPORTED_MODULE_4__.default(); + }; + FLVDemuxer.prototype._isInitialMetadataDispatched = function () { + if (this._hasAudio && this._hasVideo) { // both audio & video + return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched; + } + if (this._hasAudio && !this._hasVideo) { // audio only + return this._audioInitialMetadataDispatched; + } + if (!this._hasAudio && this._hasVideo) { // video only + return this._videoInitialMetadataDispatched; + } + return false; + }; + // function parseChunks(chunk: ArrayBuffer, byteStart: number): number; + FLVDemuxer.prototype.parseChunks = function (chunk, byteStart) { + if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__.IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified'); + } + var offset = 0; + var le = this._littleEndian; + if (byteStart === 0) { // buffer with FLV header + if (chunk.byteLength > 13) { + var probeData = FLVDemuxer.probe(chunk); + offset = probeData.dataOffset; + } + else { + return 0; + } + } + if (this._firstParse) { // handle PreviousTagSize0 before Tag1 + this._firstParse = false; + if (byteStart + offset !== this._dataOffset) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'First time parsing but chunk byteStart invalid!'); + } + var v = new DataView(chunk, offset); + var prevTagSize0 = v.getUint32(0, !le); + if (prevTagSize0 !== 0) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'PrevTagSize0 !== 0 !!!'); + } + offset += 4; + } + while (offset < chunk.byteLength) { + this._dispatch = true; + var v = new DataView(chunk, offset); + if (offset + 11 + 4 > chunk.byteLength) { + // data not enough for parsing an flv tag + break; + } + var tagType = v.getUint8(0); + var dataSize = v.getUint32(0, !le) & 0x00FFFFFF; + if (offset + 11 + dataSize + 4 > chunk.byteLength) { + // data not enough for parsing actual data body + break; + } + if (tagType !== 8 && tagType !== 9 && tagType !== 18) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Unsupported tag type " + tagType + ", skipped"); + // consume the whole tag (skip it) + offset += 11 + dataSize + 4; + continue; + } + var ts2 = v.getUint8(4); + var ts1 = v.getUint8(5); + var ts0 = v.getUint8(6); + var ts3 = v.getUint8(7); + var timestamp = ts0 | (ts1 << 8) | (ts2 << 16) | (ts3 << 24); + var streamId = v.getUint32(7, !le) & 0x00FFFFFF; + if (streamId !== 0) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Meet tag which has StreamID != 0!'); + } + var dataOffset = offset + 11; + switch (tagType) { + case 8: // Audio + this._parseAudioData(chunk, dataOffset, dataSize, timestamp); + break; + case 9: // Video + this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset); + break; + case 18: // ScriptDataObject + this._parseScriptData(chunk, dataOffset, dataSize); + break; + } + var prevTagSize = v.getUint32(11 + dataSize, !le); + if (prevTagSize !== 11 + dataSize) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Invalid PrevTagSize " + prevTagSize); + } + offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize + } + // dispatch parsed frames to consumer (typically, the remuxer) + if (this._isInitialMetadataDispatched()) { + if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) { + this._onDataAvailable(this._audioTrack, this._videoTrack); + } + } + return offset; // consumed bytes, just equals latest offset index + }; + FLVDemuxer.prototype._parseScriptData = function (arrayBuffer, dataOffset, dataSize) { + var scriptData = _amf_parser_js__WEBPACK_IMPORTED_MODULE_1__.default.parseScriptData(arrayBuffer, dataOffset, dataSize); + if (scriptData.hasOwnProperty('onMetaData')) { + if (scriptData.onMetaData == null || typeof scriptData.onMetaData !== 'object') { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Invalid onMetaData structure!'); + return; + } + if (this._metadata) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Found another onMetaData tag!'); + } + this._metadata = scriptData; + var onMetaData = this._metadata.onMetaData; + if (this._onMetaDataArrived) { + this._onMetaDataArrived(Object.assign({}, onMetaData)); + } + if (typeof onMetaData.hasAudio === 'boolean') { // hasAudio + if (this._hasAudioFlagOverrided === false) { + this._hasAudio = onMetaData.hasAudio; + this._mediaInfo.hasAudio = this._hasAudio; + } + } + if (typeof onMetaData.hasVideo === 'boolean') { // hasVideo + if (this._hasVideoFlagOverrided === false) { + this._hasVideo = onMetaData.hasVideo; + this._mediaInfo.hasVideo = this._hasVideo; + } + } + if (typeof onMetaData.audiodatarate === 'number') { // audiodatarate + this._mediaInfo.audioDataRate = onMetaData.audiodatarate; + } + if (typeof onMetaData.videodatarate === 'number') { // videodatarate + this._mediaInfo.videoDataRate = onMetaData.videodatarate; + } + if (typeof onMetaData.width === 'number') { // width + this._mediaInfo.width = onMetaData.width; + } + if (typeof onMetaData.height === 'number') { // height + this._mediaInfo.height = onMetaData.height; + } + if (typeof onMetaData.duration === 'number') { // duration + if (!this._durationOverrided) { + var duration = Math.floor(onMetaData.duration * this._timescale); + this._duration = duration; + this._mediaInfo.duration = duration; + } + } + else { + this._mediaInfo.duration = 0; + } + if (typeof onMetaData.framerate === 'number') { // framerate + var fps_num = Math.floor(onMetaData.framerate * 1000); + if (fps_num > 0) { + var fps = fps_num / 1000; + this._referenceFrameRate.fixed = true; + this._referenceFrameRate.fps = fps; + this._referenceFrameRate.fps_num = fps_num; + this._referenceFrameRate.fps_den = 1000; + this._mediaInfo.fps = fps; + } + } + if (typeof onMetaData.keyframes === 'object') { // keyframes + this._mediaInfo.hasKeyframesIndex = true; + var keyframes = onMetaData.keyframes; + this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes); + onMetaData.keyframes = null; // keyframes has been extracted, remove it + } + else { + this._mediaInfo.hasKeyframesIndex = false; + } + this._dispatch = false; + this._mediaInfo.metadata = onMetaData; + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed onMetaData'); + if (this._mediaInfo.isComplete()) { + this._onMediaInfo(this._mediaInfo); + } + } + if (Object.keys(scriptData).length > 0) { + if (this._onScriptDataArrived) { + this._onScriptDataArrived(Object.assign({}, scriptData)); + } + } + }; + FLVDemuxer.prototype._parseKeyframesIndex = function (keyframes) { + var times = []; + var filepositions = []; + // ignore first keyframe which is actually AVC Sequence Header (AVCDecoderConfigurationRecord) + for (var i = 1; i < keyframes.times.length; i++) { + var time = this._timestampBase + Math.floor(keyframes.times[i] * 1000); + times.push(time); + filepositions.push(keyframes.filepositions[i]); + } + return { + times: times, + filepositions: filepositions + }; + }; + FLVDemuxer.prototype._parseAudioData = function (arrayBuffer, dataOffset, dataSize, tagTimestamp) { + if (dataSize <= 1) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!'); + return; + } + if (this._hasAudioFlagOverrided === true && this._hasAudio === false) { + // If hasAudio: false indicated explicitly in MediaDataSource, + // Ignore all the audio packets + return; + } + var le = this._littleEndian; + var v = new DataView(arrayBuffer, dataOffset, dataSize); + var soundSpec = v.getUint8(0); + var soundFormat = soundSpec >>> 4; + if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat); + return; + } + var soundRate = 0; + var soundRateIndex = (soundSpec & 12) >>> 2; + if (soundRateIndex >= 0 && soundRateIndex <= 4) { + soundRate = this._flvSoundRateTable[soundRateIndex]; + } + else { + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex); + return; + } + var soundSize = (soundSpec & 2) >>> 1; // unused + var soundType = (soundSpec & 1); + var meta = this._audioMetadata; + var track = this._audioTrack; + if (!meta) { + if (this._hasAudio === false && this._hasAudioFlagOverrided === false) { + this._hasAudio = true; + this._mediaInfo.hasAudio = true; + } + // initial metadata + meta = this._audioMetadata = {}; + meta.type = 'audio'; + meta.id = track.id; + meta.timescale = this._timescale; + meta.duration = this._duration; + meta.audioSampleRate = soundRate; + meta.channelCount = (soundType === 0 ? 1 : 2); + } + if (soundFormat === 10) { // AAC + var aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1); + if (aacData == undefined) { + return; + } + if (aacData.packetType === 0) { // AAC sequence header (AudioSpecificConfig) + if (meta.config) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Found another AudioSpecificConfig!'); + } + var misc = aacData.data; + meta.audioSampleRate = misc.samplingRate; + meta.channelCount = misc.channelCount; + meta.codec = misc.codec; + meta.originalCodec = misc.originalCodec; + meta.config = misc.config; + // The decode result of an aac sample is 1024 PCM samples + meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale; + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed AudioSpecificConfig'); + if (this._isInitialMetadataDispatched()) { + // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer + if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) { + this._onDataAvailable(this._audioTrack, this._videoTrack); + } + } + else { + this._audioInitialMetadataDispatched = true; + } + // then notify new metadata + this._dispatch = false; + this._onTrackMetadata('audio', meta); + var mi = this._mediaInfo; + mi.audioCodec = meta.originalCodec; + mi.audioSampleRate = meta.audioSampleRate; + mi.audioChannelCount = meta.channelCount; + if (mi.hasVideo) { + if (mi.videoCodec != null) { + mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"'; + } + } + else { + mi.mimeType = 'video/x-flv; codecs="' + mi.audioCodec + '"'; + } + if (mi.isComplete()) { + this._onMediaInfo(mi); + } + } + else if (aacData.packetType === 1) { // AAC raw frame data + var dts = this._timestampBase + tagTimestamp; + var aacSample = { unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts }; + track.samples.push(aacSample); + track.length += aacData.data.length; + } + else { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.e(this.TAG, "Flv: Unsupported AAC data type " + aacData.packetType); + } + } + else if (soundFormat === 2) { // MP3 + if (!meta.codec) { + // We need metadata for mp3 audio track, extract info from frame header + var misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true); + if (misc == undefined) { + return; + } + meta.audioSampleRate = misc.samplingRate; + meta.channelCount = misc.channelCount; + meta.codec = misc.codec; + meta.originalCodec = misc.originalCodec; + // The decode result of an mp3 sample is 1152 PCM samples + meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale; + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed MPEG Audio Frame Header'); + this._audioInitialMetadataDispatched = true; + this._onTrackMetadata('audio', meta); + var mi = this._mediaInfo; + mi.audioCodec = meta.codec; + mi.audioSampleRate = meta.audioSampleRate; + mi.audioChannelCount = meta.channelCount; + mi.audioDataRate = misc.bitRate; + if (mi.hasVideo) { + if (mi.videoCodec != null) { + mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"'; + } + } + else { + mi.mimeType = 'video/x-flv; codecs="' + mi.audioCodec + '"'; + } + if (mi.isComplete()) { + this._onMediaInfo(mi); + } + } + // This packet is always a valid audio packet, extract it + var data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false); + if (data == undefined) { + return; + } + var dts = this._timestampBase + tagTimestamp; + var mp3Sample = { unit: data, length: data.byteLength, dts: dts, pts: dts }; + track.samples.push(mp3Sample); + track.length += data.length; + } + }; + FLVDemuxer.prototype._parseAACAudioData = function (arrayBuffer, dataOffset, dataSize) { + if (dataSize <= 1) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!'); + return; + } + var result = {}; + var array = new Uint8Array(arrayBuffer, dataOffset, dataSize); + result.packetType = array[0]; + if (array[0] === 0) { + result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1); + } + else { + result.data = array.subarray(1); + } + return result; + }; + FLVDemuxer.prototype._parseAACAudioSpecificConfig = function (arrayBuffer, dataOffset, dataSize) { + var array = new Uint8Array(arrayBuffer, dataOffset, dataSize); + var config = null; + /* Audio Object Type: + 0: Null + 1: AAC Main + 2: AAC LC + 3: AAC SSR (Scalable Sample Rate) + 4: AAC LTP (Long Term Prediction) + 5: HE-AAC / SBR (Spectral Band Replication) + 6: AAC Scalable + */ + var audioObjectType = 0; + var originalAudioObjectType = 0; + var audioExtensionObjectType = null; + var samplingIndex = 0; + var extensionSamplingIndex = null; + // 5 bits + audioObjectType = originalAudioObjectType = array[0] >>> 3; + // 4 bits + samplingIndex = ((array[0] & 0x07) << 1) | (array[1] >>> 7); + if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) { + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!'); + return; + } + var samplingFrequence = this._mpegSamplingRates[samplingIndex]; + // 4 bits + var channelConfig = (array[1] & 0x78) >>> 3; + if (channelConfig < 0 || channelConfig >= 8) { + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.FORMAT_ERROR, 'Flv: AAC invalid channel configuration'); + return; + } + if (audioObjectType === 5) { // HE-AAC? + // 4 bits + extensionSamplingIndex = ((array[1] & 0x07) << 1) | (array[2] >>> 7); + // 5 bits + audioExtensionObjectType = (array[2] & 0x7C) >>> 2; + } + // workarounds for various browsers + var userAgent = self.navigator.userAgent.toLowerCase(); + if (userAgent.indexOf('firefox') !== -1) { + // firefox: use SBR (HE-AAC) if freq less than 24kHz + if (samplingIndex >= 6) { + audioObjectType = 5; + config = new Array(4); + extensionSamplingIndex = samplingIndex - 3; + } + else { // use LC-AAC + audioObjectType = 2; + config = new Array(2); + extensionSamplingIndex = samplingIndex; + } + } + else if (userAgent.indexOf('android') !== -1) { + // android: always use LC-AAC + audioObjectType = 2; + config = new Array(2); + extensionSamplingIndex = samplingIndex; + } + else { + // for other browsers, e.g. chrome... + // Always use HE-AAC to make it easier to switch aac codec profile + audioObjectType = 5; + extensionSamplingIndex = samplingIndex; + config = new Array(4); + if (samplingIndex >= 6) { + extensionSamplingIndex = samplingIndex - 3; + } + else if (channelConfig === 1) { // Mono channel + audioObjectType = 2; + config = new Array(2); + extensionSamplingIndex = samplingIndex; + } + } + config[0] = audioObjectType << 3; + config[0] |= (samplingIndex & 0x0F) >>> 1; + config[1] = (samplingIndex & 0x0F) << 7; + config[1] |= (channelConfig & 0x0F) << 3; + if (audioObjectType === 5) { + config[1] |= ((extensionSamplingIndex & 0x0F) >>> 1); + config[2] = (extensionSamplingIndex & 0x01) << 7; + // extended audio object type: force to 2 (LC-AAC) + config[2] |= (2 << 2); + config[3] = 0; + } + return { + config: config, + samplingRate: samplingFrequence, + channelCount: channelConfig, + codec: 'mp4a.40.' + audioObjectType, + originalCodec: 'mp4a.40.' + originalAudioObjectType + }; + }; + FLVDemuxer.prototype._parseMP3AudioData = function (arrayBuffer, dataOffset, dataSize, requestHeader) { + if (dataSize < 4) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!'); + return; + } + var le = this._littleEndian; + var array = new Uint8Array(arrayBuffer, dataOffset, dataSize); + var result = null; + if (requestHeader) { + if (array[0] !== 0xFF) { + return; + } + var ver = (array[1] >>> 3) & 0x03; + var layer = (array[1] & 0x06) >> 1; + var bitrate_index = (array[2] & 0xF0) >>> 4; + var sampling_freq_index = (array[2] & 0x0C) >>> 2; + var channel_mode = (array[3] >>> 6) & 0x03; + var channel_count = channel_mode !== 3 ? 2 : 1; + var sample_rate = 0; + var bit_rate = 0; + var object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types + var codec = 'mp3'; + switch (ver) { + case 0: // MPEG 2.5 + sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index]; + break; + case 2: // MPEG 2 + sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index]; + break; + case 3: // MPEG 1 + sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index]; + break; + } + switch (layer) { + case 1: // Layer 3 + object_type = 34; + if (bitrate_index < this._mpegAudioL3BitRateTable.length) { + bit_rate = this._mpegAudioL3BitRateTable[bitrate_index]; + } + break; + case 2: // Layer 2 + object_type = 33; + if (bitrate_index < this._mpegAudioL2BitRateTable.length) { + bit_rate = this._mpegAudioL2BitRateTable[bitrate_index]; + } + break; + case 3: // Layer 1 + object_type = 32; + if (bitrate_index < this._mpegAudioL1BitRateTable.length) { + bit_rate = this._mpegAudioL1BitRateTable[bitrate_index]; + } + break; + } + result = { + bitRate: bit_rate, + samplingRate: sample_rate, + channelCount: channel_count, + codec: codec, + originalCodec: codec + }; + } + else { + result = array; + } + return result; + }; + FLVDemuxer.prototype._parseVideoData = function (arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) { + if (dataSize <= 1) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!'); + return; + } + if (this._hasVideoFlagOverrided === true && this._hasVideo === false) { + // If hasVideo: false indicated explicitly in MediaDataSource, + // Ignore all the video packets + return; + } + var spec = (new Uint8Array(arrayBuffer, dataOffset, dataSize))[0]; + var frameType = (spec & 240) >>> 4; + var codecId = spec & 15; + if (codecId !== 7) { + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.CODEC_UNSUPPORTED, "Flv: Unsupported codec in video frame: " + codecId); + return; + } + this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType); + }; + FLVDemuxer.prototype._parseAVCVideoPacket = function (arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) { + if (dataSize < 4) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime'); + return; + } + var le = this._littleEndian; + var v = new DataView(arrayBuffer, dataOffset, dataSize); + var packetType = v.getUint8(0); + var cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF; + var cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int + if (packetType === 0) { // AVCDecoderConfigurationRecord + this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4); + } + else if (packetType === 1) { // One or more Nalus + this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts); + } + else if (packetType === 2) { + // empty, AVC end of sequence + } + else { + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.FORMAT_ERROR, "Flv: Invalid video packet type " + packetType); + return; + } + }; + FLVDemuxer.prototype._parseAVCDecoderConfigurationRecord = function (arrayBuffer, dataOffset, dataSize) { + if (dataSize < 7) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!'); + return; + } + var meta = this._videoMetadata; + var track = this._videoTrack; + var le = this._littleEndian; + var v = new DataView(arrayBuffer, dataOffset, dataSize); + if (!meta) { + if (this._hasVideo === false && this._hasVideoFlagOverrided === false) { + this._hasVideo = true; + this._mediaInfo.hasVideo = true; + } + meta = this._videoMetadata = {}; + meta.type = 'video'; + meta.id = track.id; + meta.timescale = this._timescale; + meta.duration = this._duration; + } + else { + if (typeof meta.avcc !== 'undefined') { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Found another AVCDecoderConfigurationRecord!'); + } + } + var version = v.getUint8(0); // configurationVersion + var avcProfile = v.getUint8(1); // avcProfileIndication + var profileCompatibility = v.getUint8(2); // profile_compatibility + var avcLevel = v.getUint8(3); // AVCLevelIndication + if (version !== 1 || avcProfile === 0) { + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord'); + return; + } + this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne + if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!! + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.FORMAT_ERROR, "Flv: Strange NaluLengthSizeMinusOne: " + (this._naluLengthSize - 1)); + return; + } + var spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets + if (spsCount === 0) { + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS'); + return; + } + else if (spsCount > 1) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Flv: Strange AVCDecoderConfigurationRecord: SPS Count = " + spsCount); + } + var offset = 6; + for (var i = 0; i < spsCount; i++) { + var len = v.getUint16(offset, !le); // sequenceParameterSetLength + offset += 2; + if (len === 0) { + continue; + } + // Notice: Nalu without startcode header (00 00 00 01) + var sps = new Uint8Array(arrayBuffer, dataOffset + offset, len); + offset += len; + var config = _sps_parser_js__WEBPACK_IMPORTED_MODULE_2__.default.parseSPS(sps); + if (i !== 0) { + // ignore other sps's config + continue; + } + meta.codecWidth = config.codec_size.width; + meta.codecHeight = config.codec_size.height; + meta.presentWidth = config.present_size.width; + meta.presentHeight = config.present_size.height; + meta.profile = config.profile_string; + meta.level = config.level_string; + meta.bitDepth = config.bit_depth; + meta.chromaFormat = config.chroma_format; + meta.sarRatio = config.sar_ratio; + meta.frameRate = config.frame_rate; + if (config.frame_rate.fixed === false || + config.frame_rate.fps_num === 0 || + config.frame_rate.fps_den === 0) { + meta.frameRate = this._referenceFrameRate; + } + var fps_den = meta.frameRate.fps_den; + var fps_num = meta.frameRate.fps_num; + meta.refSampleDuration = meta.timescale * (fps_den / fps_num); + var codecArray = sps.subarray(1, 4); + var codecString = 'avc1.'; + for (var j = 0; j < 3; j++) { + var h = codecArray[j].toString(16); + if (h.length < 2) { + h = '0' + h; + } + codecString += h; + } + meta.codec = codecString; + var mi = this._mediaInfo; + mi.width = meta.codecWidth; + mi.height = meta.codecHeight; + mi.fps = meta.frameRate.fps; + mi.profile = meta.profile; + mi.level = meta.level; + mi.refFrames = config.ref_frames; + mi.chromaFormat = config.chroma_format_string; + mi.sarNum = meta.sarRatio.width; + mi.sarDen = meta.sarRatio.height; + mi.videoCodec = codecString; + if (mi.hasAudio) { + if (mi.audioCodec != null) { + mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"'; + } + } + else { + mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + '"'; + } + if (mi.isComplete()) { + this._onMediaInfo(mi); + } + } + var ppsCount = v.getUint8(offset); // numOfPictureParameterSets + if (ppsCount === 0) { + this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_3__.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS'); + return; + } + else if (ppsCount > 1) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Flv: Strange AVCDecoderConfigurationRecord: PPS Count = " + ppsCount); + } + offset++; + for (var i = 0; i < ppsCount; i++) { + var len = v.getUint16(offset, !le); // pictureParameterSetLength + offset += 2; + if (len === 0) { + continue; + } + // pps is useless for extracting video information + offset += len; + } + meta.avcc = new Uint8Array(dataSize); + meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0); + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord'); + if (this._isInitialMetadataDispatched()) { + // flush parsed frames + if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) { + this._onDataAvailable(this._audioTrack, this._videoTrack); + } + } + else { + this._videoInitialMetadataDispatched = true; + } + // notify new metadata + this._dispatch = false; + this._onTrackMetadata('video', meta); + }; + FLVDemuxer.prototype._parseAVCVideoData = function (arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) { + var le = this._littleEndian; + var v = new DataView(arrayBuffer, dataOffset, dataSize); + var units = [], length = 0; + var offset = 0; + var lengthSize = this._naluLengthSize; + var dts = this._timestampBase + tagTimestamp; + var keyframe = (frameType === 1); // from FLV Frame Type constants + while (offset < dataSize) { + if (offset + 4 >= dataSize) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Malformed Nalu near timestamp " + dts + ", offset = " + offset + ", dataSize = " + dataSize); + break; // data not enough for next Nalu + } + // Nalu with length-header (AVC1) + var naluSize = v.getUint32(offset, !le); // Big-Endian read + if (lengthSize === 3) { + naluSize >>>= 8; + } + if (naluSize > dataSize - lengthSize) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Malformed Nalus near timestamp " + dts + ", NaluSize > DataSize!"); + return; + } + var unitType = v.getUint8(offset + lengthSize) & 0x1F; + if (unitType === 5) { // IDR + keyframe = true; + } + var data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize); + var unit = { type: unitType, data: data }; + units.push(unit); + length += data.byteLength; + offset += lengthSize + naluSize; + } + if (units.length) { + var track = this._videoTrack; + var avcSample = { + units: units, + length: length, + isKeyframe: keyframe, + dts: dts, + cts: cts, + pts: (dts + cts) + }; + if (keyframe) { + avcSample.fileposition = tagPosition; + } + track.samples.push(avcSample); + track.length += length; + } + }; + return FLVDemuxer; +}()); +/* harmony default export */ __webpack_exports__["default"] = (FLVDemuxer); + + +/***/ }), + +/***/ "./src/demux/sps-parser.js": +/*!*********************************!*\ + !*** ./src/demux/sps-parser.js ***! + \*********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _exp_golomb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./exp-golomb.js */ "./src/demux/exp-golomb.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var SPSParser = /** @class */ (function () { + function SPSParser() { + } + SPSParser._ebsp2rbsp = function (uint8array) { + var src = uint8array; + var src_length = src.byteLength; + var dst = new Uint8Array(src_length); + var dst_idx = 0; + for (var i = 0; i < src_length; i++) { + if (i >= 2) { + // Unescape: Skip 0x03 after 00 00 + if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) { + continue; + } + } + dst[dst_idx] = src[i]; + dst_idx++; + } + return new Uint8Array(dst.buffer, 0, dst_idx); + }; + SPSParser.parseSPS = function (uint8array) { + var rbsp = SPSParser._ebsp2rbsp(uint8array); + var gb = new _exp_golomb_js__WEBPACK_IMPORTED_MODULE_0__.default(rbsp); + gb.readByte(); + var profile_idc = gb.readByte(); // profile_idc + gb.readByte(); // constraint_set_flags[5] + reserved_zero[3] + var level_idc = gb.readByte(); // level_idc + gb.readUEG(); // seq_parameter_set_id + var profile_string = SPSParser.getProfileString(profile_idc); + var level_string = SPSParser.getLevelString(level_idc); + var chroma_format_idc = 1; + var chroma_format = 420; + var chroma_format_table = [0, 420, 422, 444]; + var bit_depth = 8; + if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 || + profile_idc === 244 || profile_idc === 44 || profile_idc === 83 || + profile_idc === 86 || profile_idc === 118 || profile_idc === 128 || + profile_idc === 138 || profile_idc === 144) { + chroma_format_idc = gb.readUEG(); + if (chroma_format_idc === 3) { + gb.readBits(1); // separate_colour_plane_flag + } + if (chroma_format_idc <= 3) { + chroma_format = chroma_format_table[chroma_format_idc]; + } + bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8 + gb.readUEG(); // bit_depth_chroma_minus8 + gb.readBits(1); // qpprime_y_zero_transform_bypass_flag + if (gb.readBool()) { // seq_scaling_matrix_present_flag + var scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12; + for (var i = 0; i < scaling_list_count; i++) { + if (gb.readBool()) { // seq_scaling_list_present_flag + if (i < 6) { + SPSParser._skipScalingList(gb, 16); + } + else { + SPSParser._skipScalingList(gb, 64); + } + } + } + } + } + gb.readUEG(); // log2_max_frame_num_minus4 + var pic_order_cnt_type = gb.readUEG(); + if (pic_order_cnt_type === 0) { + gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4 + } + else if (pic_order_cnt_type === 1) { + gb.readBits(1); // delta_pic_order_always_zero_flag + gb.readSEG(); // offset_for_non_ref_pic + gb.readSEG(); // offset_for_top_to_bottom_field + var num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG(); + for (var i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) { + gb.readSEG(); // offset_for_ref_frame + } + } + var ref_frames = gb.readUEG(); // max_num_ref_frames + gb.readBits(1); // gaps_in_frame_num_value_allowed_flag + var pic_width_in_mbs_minus1 = gb.readUEG(); + var pic_height_in_map_units_minus1 = gb.readUEG(); + var frame_mbs_only_flag = gb.readBits(1); + if (frame_mbs_only_flag === 0) { + gb.readBits(1); // mb_adaptive_frame_field_flag + } + gb.readBits(1); // direct_8x8_inference_flag + var frame_crop_left_offset = 0; + var frame_crop_right_offset = 0; + var frame_crop_top_offset = 0; + var frame_crop_bottom_offset = 0; + var frame_cropping_flag = gb.readBool(); + if (frame_cropping_flag) { + frame_crop_left_offset = gb.readUEG(); + frame_crop_right_offset = gb.readUEG(); + frame_crop_top_offset = gb.readUEG(); + frame_crop_bottom_offset = gb.readUEG(); + } + var sar_width = 1, sar_height = 1; + var fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0; + var vui_parameters_present_flag = gb.readBool(); + if (vui_parameters_present_flag) { + if (gb.readBool()) { // aspect_ratio_info_present_flag + var aspect_ratio_idc = gb.readByte(); + var sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2]; + var sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1]; + if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) { + sar_width = sar_w_table[aspect_ratio_idc - 1]; + sar_height = sar_h_table[aspect_ratio_idc - 1]; + } + else if (aspect_ratio_idc === 255) { + sar_width = gb.readByte() << 8 | gb.readByte(); + sar_height = gb.readByte() << 8 | gb.readByte(); + } + } + if (gb.readBool()) { // overscan_info_present_flag + gb.readBool(); // overscan_appropriate_flag + } + if (gb.readBool()) { // video_signal_type_present_flag + gb.readBits(4); // video_format & video_full_range_flag + if (gb.readBool()) { // colour_description_present_flag + gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients + } + } + if (gb.readBool()) { // chroma_loc_info_present_flag + gb.readUEG(); // chroma_sample_loc_type_top_field + gb.readUEG(); // chroma_sample_loc_type_bottom_field + } + if (gb.readBool()) { // timing_info_present_flag + var num_units_in_tick = gb.readBits(32); + var time_scale = gb.readBits(32); + fps_fixed = gb.readBool(); // fixed_frame_rate_flag + fps_num = time_scale; + fps_den = num_units_in_tick * 2; + fps = fps_num / fps_den; + } + } + var sarScale = 1; + if (sar_width !== 1 || sar_height !== 1) { + sarScale = sar_width / sar_height; + } + var crop_unit_x = 0, crop_unit_y = 0; + if (chroma_format_idc === 0) { + crop_unit_x = 1; + crop_unit_y = 2 - frame_mbs_only_flag; + } + else { + var sub_wc = (chroma_format_idc === 3) ? 1 : 2; + var sub_hc = (chroma_format_idc === 1) ? 2 : 1; + crop_unit_x = sub_wc; + crop_unit_y = sub_hc * (2 - frame_mbs_only_flag); + } + var codec_width = (pic_width_in_mbs_minus1 + 1) * 16; + var codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16); + codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x; + codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y; + var present_width = Math.ceil(codec_width * sarScale); + gb.destroy(); + gb = null; + return { + profile_string: profile_string, + level_string: level_string, + bit_depth: bit_depth, + ref_frames: ref_frames, + chroma_format: chroma_format, + chroma_format_string: SPSParser.getChromaFormatString(chroma_format), + frame_rate: { + fixed: fps_fixed, + fps: fps, + fps_den: fps_den, + fps_num: fps_num + }, + sar_ratio: { + width: sar_width, + height: sar_height + }, + codec_size: { + width: codec_width, + height: codec_height + }, + present_size: { + width: present_width, + height: codec_height + } + }; + }; + SPSParser._skipScalingList = function (gb, count) { + var last_scale = 8, next_scale = 8; + var delta_scale = 0; + for (var i = 0; i < count; i++) { + if (next_scale !== 0) { + delta_scale = gb.readSEG(); + next_scale = (last_scale + delta_scale + 256) % 256; + } + last_scale = (next_scale === 0) ? last_scale : next_scale; + } + }; + SPSParser.getProfileString = function (profile_idc) { + switch (profile_idc) { + case 66: + return 'Baseline'; + case 77: + return 'Main'; + case 88: + return 'Extended'; + case 100: + return 'High'; + case 110: + return 'High10'; + case 122: + return 'High422'; + case 244: + return 'High444'; + default: + return 'Unknown'; + } + }; + SPSParser.getLevelString = function (level_idc) { + return (level_idc / 10).toFixed(1); + }; + SPSParser.getChromaFormatString = function (chroma) { + switch (chroma) { + case 420: + return '4:2:0'; + case 422: + return '4:2:2'; + case 444: + return '4:4:4'; + default: + return 'Unknown'; + } + }; + return SPSParser; +}()); +/* harmony default export */ __webpack_exports__["default"] = (SPSParser); + + +/***/ }), + +/***/ "./src/flv.js": +/*!********************!*\ + !*** ./src/flv.js ***! + \********************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_polyfill_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/polyfill.js */ "./src/utils/polyfill.js"); +/* harmony import */ var _core_features_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/features.js */ "./src/core/features.js"); +/* harmony import */ var _io_loader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./io/loader.js */ "./src/io/loader.js"); +/* harmony import */ var _player_flv_player_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./player/flv-player.js */ "./src/player/flv-player.js"); +/* harmony import */ var _player_native_player_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./player/native-player.js */ "./src/player/native-player.js"); +/* harmony import */ var _player_player_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./player/player-events.js */ "./src/player/player-events.js"); +/* harmony import */ var _player_player_errors_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./player/player-errors.js */ "./src/player/player-errors.js"); +/* harmony import */ var _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/logging-control.js */ "./src/utils/logging-control.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + + + + +// here are all the interfaces +// install polyfills +_utils_polyfill_js__WEBPACK_IMPORTED_MODULE_0__.default.install(); +// factory method +function createPlayer(mediaDataSource, optionalConfig) { + var mds = mediaDataSource; + if (mds == null || typeof mds !== 'object') { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_8__.InvalidArgumentException('MediaDataSource must be an javascript object!'); + } + if (!mds.hasOwnProperty('type')) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_8__.InvalidArgumentException('MediaDataSource must has type field to indicate video file type!'); + } + switch (mds.type) { + case 'flv': + return new _player_flv_player_js__WEBPACK_IMPORTED_MODULE_3__.default(mds, optionalConfig); + default: + return new _player_native_player_js__WEBPACK_IMPORTED_MODULE_4__.default(mds, optionalConfig); + } +} +// feature detection +function isSupported() { + return _core_features_js__WEBPACK_IMPORTED_MODULE_1__.default.supportMSEH264Playback(); +} +function getFeatureList() { + return _core_features_js__WEBPACK_IMPORTED_MODULE_1__.default.getFeatureList(); +} +// interfaces +var flvjs = {}; +flvjs.createPlayer = createPlayer; +flvjs.isSupported = isSupported; +flvjs.getFeatureList = getFeatureList; +flvjs.BaseLoader = _io_loader_js__WEBPACK_IMPORTED_MODULE_2__.BaseLoader; +flvjs.LoaderStatus = _io_loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus; +flvjs.LoaderErrors = _io_loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors; +flvjs.Events = _player_player_events_js__WEBPACK_IMPORTED_MODULE_5__.default; +flvjs.ErrorTypes = _player_player_errors_js__WEBPACK_IMPORTED_MODULE_6__.ErrorTypes; +flvjs.ErrorDetails = _player_player_errors_js__WEBPACK_IMPORTED_MODULE_6__.ErrorDetails; +flvjs.FlvPlayer = _player_flv_player_js__WEBPACK_IMPORTED_MODULE_3__.default; +flvjs.NativePlayer = _player_native_player_js__WEBPACK_IMPORTED_MODULE_4__.default; +flvjs.LoggingControl = _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_7__.default; +Object.defineProperty(flvjs, 'version', { + enumerable: true, + get: function () { + // replace by webpack.DefinePlugin + return "1.6.2"; + } +}); +/* harmony default export */ __webpack_exports__["default"] = (flvjs); + + +/***/ }), + +/***/ "./src/index.js": +/*!**********************!*\ + !*** ./src/index.js ***! + \**********************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +// entry/index file +// make it compatible with browserify's umd wrapper +module.exports = __webpack_require__(/*! ./flv.js */ "./src/flv.js").default; + + +/***/ }), + +/***/ "./src/io/fetch-stream-loader.js": +/*!***************************************!*\ + !*** ./src/io/fetch-stream-loader.js ***! + \***************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js"); +/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); + + + +/* fetch + stream IO loader. Currently working on chrome 43+. + * fetch provides a better alternative http API to XMLHttpRequest + * + * fetch spec https://fetch.spec.whatwg.org/ + * stream spec https://streams.spec.whatwg.org/ + */ +var FetchStreamLoader = /** @class */ (function (_super) { + __extends(FetchStreamLoader, _super); + function FetchStreamLoader(seekHandler, config) { + var _this = _super.call(this, 'fetch-stream-loader') || this; + _this.TAG = 'FetchStreamLoader'; + _this._seekHandler = seekHandler; + _this._config = config; + _this._needStash = true; + _this._requestAbort = false; + _this._contentLength = null; + _this._receivedLength = 0; + return _this; + } + FetchStreamLoader.isSupported = function () { + try { + // fetch + stream is broken on Microsoft Edge. Disable before build 15048. + // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/ + // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist. + var isWorkWellEdge = _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.msedge && _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.version.minor >= 15048; + var browserNotBlacklisted = _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.msedge ? isWorkWellEdge : true; + return (self.fetch && self.ReadableStream && browserNotBlacklisted); + } + catch (e) { + return false; + } + }; + FetchStreamLoader.prototype.destroy = function () { + if (this.isWorking()) { + this.abort(); + } + _super.prototype.destroy.call(this); + }; + FetchStreamLoader.prototype.open = function (dataSource, range) { + var _this = this; + this._dataSource = dataSource; + this._range = range; + var sourceURL = dataSource.url; + if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) { + sourceURL = dataSource.redirectedURL; + } + var seekConfig = this._seekHandler.getConfig(sourceURL, range); + var headers = new self.Headers(); + if (typeof seekConfig.headers === 'object') { + var configHeaders = seekConfig.headers; + for (var key in configHeaders) { + if (configHeaders.hasOwnProperty(key)) { + headers.append(key, configHeaders[key]); + } + } + } + var params = { + method: 'GET', + headers: headers, + mode: 'cors', + cache: 'default', + // The default policy of Fetch API in the whatwg standard + // Safari incorrectly indicates 'no-referrer' as default policy, fuck it + referrerPolicy: 'no-referrer-when-downgrade' + }; + // add additional headers + if (typeof this._config.headers === 'object') { + for (var key in this._config.headers) { + headers.append(key, this._config.headers[key]); + } + } + // cors is enabled by default + if (dataSource.cors === false) { + // no-cors means 'disregard cors policy', which can only be used in ServiceWorker + params.mode = 'same-origin'; + } + // withCredentials is disabled by default + if (dataSource.withCredentials) { + params.credentials = 'include'; + } + // referrerPolicy from config + if (dataSource.referrerPolicy) { + params.referrerPolicy = dataSource.referrerPolicy; + } + // add abort controller, by wmlgl 2019-5-10 12:21:27 + if (self.AbortController) { + this._abortController = new self.AbortController(); + params.signal = this._abortController.signal; + } + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kConnecting; + self.fetch(seekConfig.url, params).then(function (res) { + if (_this._requestAbort) { + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kIdle; + res.body.cancel(); + return; + } + if (res.ok && (res.status >= 200 && res.status <= 299)) { + if (res.url !== seekConfig.url) { + if (_this._onURLRedirect) { + var redirectedURL = _this._seekHandler.removeURLParameters(res.url); + _this._onURLRedirect(redirectedURL); + } + } + var lengthHeader = res.headers.get('Content-Length'); + if (lengthHeader != null) { + _this._contentLength = parseInt(lengthHeader); + if (_this._contentLength !== 0) { + if (_this._onContentLengthKnown) { + _this._onContentLengthKnown(_this._contentLength); + } + } + } + return _this._pump.call(_this, res.body.getReader()); + } + else { + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError; + if (_this._onError) { + _this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: res.status, msg: res.statusText }); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText); + } + } + }).catch(function (e) { + if (_this._abortController && _this._abortController.signal.aborted) { + return; + } + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError; + if (_this._onError) { + _this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EXCEPTION, { code: -1, msg: e.message }); + } + else { + throw e; + } + }); + }; + FetchStreamLoader.prototype.abort = function () { + this._requestAbort = true; + if (this._status !== _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kBuffering || !_utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.chrome) { + // Chrome may throw Exception-like things here, avoid using if is buffering + if (this._abortController) { + try { + this._abortController.abort(); + } + catch (e) { } + } + } + }; + FetchStreamLoader.prototype._pump = function (reader) { + var _this = this; + return reader.read().then(function (result) { + if (result.done) { + // First check received length + if (_this._contentLength !== null && _this._receivedLength < _this._contentLength) { + // Report Early-EOF + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError; + var type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EARLY_EOF; + var info = { code: -1, msg: 'Fetch stream meet Early-EOF' }; + if (_this._onError) { + _this._onError(type, info); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException(info.msg); + } + } + else { + // OK. Download complete + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete; + if (_this._onComplete) { + _this._onComplete(_this._range.from, _this._range.from + _this._receivedLength - 1); + } + } + } + else { + if (_this._abortController && _this._abortController.signal.aborted) { + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete; + return; + } + else if (_this._requestAbort === true) { + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete; + return reader.cancel(); + } + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kBuffering; + var chunk = result.value.buffer; + var byteStart = _this._range.from + _this._receivedLength; + _this._receivedLength += chunk.byteLength; + if (_this._onDataArrival) { + _this._onDataArrival(chunk, byteStart, _this._receivedLength); + } + _this._pump(reader); + } + }).catch(function (e) { + if (_this._abortController && _this._abortController.signal.aborted) { + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete; + return; + } + if (e.code === 11 && _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.msedge) { // InvalidStateError on Microsoft Edge + // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call + // Ignore the unknown exception. + // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/ + return; + } + _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError; + var type = 0; + var info = null; + if ((e.code === 19 || e.message === 'network error') && // NETWORK_ERR + (_this._contentLength === null || + (_this._contentLength !== null && _this._receivedLength < _this._contentLength))) { + type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EARLY_EOF; + info = { code: e.code, msg: 'Fetch stream meet Early-EOF' }; + } + else { + type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EXCEPTION; + info = { code: e.code, msg: e.message }; + } + if (_this._onError) { + _this._onError(type, info); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException(info.msg); + } + }); + }; + return FetchStreamLoader; +}(_loader_js__WEBPACK_IMPORTED_MODULE_1__.BaseLoader)); +/* harmony default export */ __webpack_exports__["default"] = (FetchStreamLoader); + + +/***/ }), + +/***/ "./src/io/io-controller.js": +/*!*********************************!*\ + !*** ./src/io/io-controller.js ***! + \*********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _speed_sampler_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./speed-sampler.js */ "./src/io/speed-sampler.js"); +/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js"); +/* harmony import */ var _fetch_stream_loader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fetch-stream-loader.js */ "./src/io/fetch-stream-loader.js"); +/* harmony import */ var _xhr_moz_chunked_loader_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./xhr-moz-chunked-loader.js */ "./src/io/xhr-moz-chunked-loader.js"); +/* harmony import */ var _xhr_range_loader_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./xhr-range-loader.js */ "./src/io/xhr-range-loader.js"); +/* harmony import */ var _websocket_loader_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./websocket-loader.js */ "./src/io/websocket-loader.js"); +/* harmony import */ var _range_seek_handler_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./range-seek-handler.js */ "./src/io/range-seek-handler.js"); +/* harmony import */ var _param_seek_handler_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./param-seek-handler.js */ "./src/io/param-seek-handler.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + + + + + +/** + * DataSource: { + * url: string, + * filesize: number, + * cors: boolean, + * withCredentials: boolean + * } + * + */ +// Manage IO Loaders +var IOController = /** @class */ (function () { + function IOController(dataSource, config, extraData) { + this.TAG = 'IOController'; + this._config = config; + this._extraData = extraData; + this._stashInitialSize = 1024 * 384; // default initial size: 384KB + if (config.stashInitialSize != undefined && config.stashInitialSize > 0) { + // apply from config + this._stashInitialSize = config.stashInitialSize; + } + this._stashUsed = 0; + this._stashSize = this._stashInitialSize; + this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB + this._stashBuffer = new ArrayBuffer(this._bufferSize); + this._stashByteStart = 0; + this._enableStash = true; + if (config.enableStashBuffer === false) { + this._enableStash = false; + } + this._loader = null; + this._loaderClass = null; + this._seekHandler = null; + this._dataSource = dataSource; + this._isWebSocketURL = /wss?:\/\/(.+?)/.test(dataSource.url); + this._refTotalLength = dataSource.filesize ? dataSource.filesize : null; + this._totalLength = this._refTotalLength; + this._fullRequestFlag = false; + this._currentRange = null; + this._redirectedURL = null; + this._speedNormalized = 0; + this._speedSampler = new _speed_sampler_js__WEBPACK_IMPORTED_MODULE_1__.default(); + this._speedNormalizeList = [64, 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096]; + this._isEarlyEofReconnecting = false; + this._paused = false; + this._resumeFrom = 0; + this._onDataArrival = null; + this._onSeeked = null; + this._onError = null; + this._onComplete = null; + this._onRedirect = null; + this._onRecoveredEarlyEof = null; + this._selectSeekHandler(); + this._selectLoader(); + this._createLoader(); + } + IOController.prototype.destroy = function () { + if (this._loader.isWorking()) { + this._loader.abort(); + } + this._loader.destroy(); + this._loader = null; + this._loaderClass = null; + this._dataSource = null; + this._stashBuffer = null; + this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0; + this._currentRange = null; + this._speedSampler = null; + this._isEarlyEofReconnecting = false; + this._onDataArrival = null; + this._onSeeked = null; + this._onError = null; + this._onComplete = null; + this._onRedirect = null; + this._onRecoveredEarlyEof = null; + this._extraData = null; + }; + IOController.prototype.isWorking = function () { + return this._loader && this._loader.isWorking() && !this._paused; + }; + IOController.prototype.isPaused = function () { + return this._paused; + }; + Object.defineProperty(IOController.prototype, "status", { + get: function () { + return this._loader.status; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "extraData", { + get: function () { + return this._extraData; + }, + set: function (data) { + this._extraData = data; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "onDataArrival", { + // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number + get: function () { + return this._onDataArrival; + }, + set: function (callback) { + this._onDataArrival = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "onSeeked", { + get: function () { + return this._onSeeked; + }, + set: function (callback) { + this._onSeeked = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "onError", { + // prototype: function onError(type: number, info: {code: number, msg: string}): void + get: function () { + return this._onError; + }, + set: function (callback) { + this._onError = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "onComplete", { + get: function () { + return this._onComplete; + }, + set: function (callback) { + this._onComplete = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "onRedirect", { + get: function () { + return this._onRedirect; + }, + set: function (callback) { + this._onRedirect = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "onRecoveredEarlyEof", { + get: function () { + return this._onRecoveredEarlyEof; + }, + set: function (callback) { + this._onRecoveredEarlyEof = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "currentURL", { + get: function () { + return this._dataSource.url; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "hasRedirect", { + get: function () { + return (this._redirectedURL != null || this._dataSource.redirectedURL != undefined); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "currentRedirectedURL", { + get: function () { + return this._redirectedURL || this._dataSource.redirectedURL; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "currentSpeed", { + // in KB/s + get: function () { + if (this._loaderClass === _xhr_range_loader_js__WEBPACK_IMPORTED_MODULE_5__.default) { + // SpeedSampler is inaccuracy if loader is RangeLoader + return this._loader.currentSpeed; + } + return this._speedSampler.lastSecondKBps; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(IOController.prototype, "loaderType", { + get: function () { + return this._loader.type; + }, + enumerable: false, + configurable: true + }); + IOController.prototype._selectSeekHandler = function () { + var config = this._config; + if (config.seekType === 'range') { + this._seekHandler = new _range_seek_handler_js__WEBPACK_IMPORTED_MODULE_7__.default(this._config.rangeLoadZeroStart); + } + else if (config.seekType === 'param') { + var paramStart = config.seekParamStart || 'bstart'; + var paramEnd = config.seekParamEnd || 'bend'; + this._seekHandler = new _param_seek_handler_js__WEBPACK_IMPORTED_MODULE_8__.default(paramStart, paramEnd); + } + else if (config.seekType === 'custom') { + if (typeof config.customSeekHandler !== 'function') { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!'); + } + this._seekHandler = new config.customSeekHandler(); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.InvalidArgumentException("Invalid seekType in config: " + config.seekType); + } + }; + IOController.prototype._selectLoader = function () { + if (this._config.customLoader != null) { + this._loaderClass = this._config.customLoader; + } + else if (this._isWebSocketURL) { + this._loaderClass = _websocket_loader_js__WEBPACK_IMPORTED_MODULE_6__.default; + } + else if (_fetch_stream_loader_js__WEBPACK_IMPORTED_MODULE_3__.default.isSupported()) { + this._loaderClass = _fetch_stream_loader_js__WEBPACK_IMPORTED_MODULE_3__.default; + } + else if (_xhr_moz_chunked_loader_js__WEBPACK_IMPORTED_MODULE_4__.default.isSupported()) { + this._loaderClass = _xhr_moz_chunked_loader_js__WEBPACK_IMPORTED_MODULE_4__.default; + } + else if (_xhr_range_loader_js__WEBPACK_IMPORTED_MODULE_5__.default.isSupported()) { + this._loaderClass = _xhr_range_loader_js__WEBPACK_IMPORTED_MODULE_5__.default; + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.RuntimeException('Your browser doesn\'t support xhr with arraybuffer responseType!'); + } + }; + IOController.prototype._createLoader = function () { + this._loader = new this._loaderClass(this._seekHandler, this._config); + if (this._loader.needStashBuffer === false) { + this._enableStash = false; + } + this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this); + this._loader.onURLRedirect = this._onURLRedirect.bind(this); + this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this); + this._loader.onComplete = this._onLoaderComplete.bind(this); + this._loader.onError = this._onLoaderError.bind(this); + }; + IOController.prototype.open = function (optionalFrom) { + this._currentRange = { from: 0, to: -1 }; + if (optionalFrom) { + this._currentRange.from = optionalFrom; + } + this._speedSampler.reset(); + if (!optionalFrom) { + this._fullRequestFlag = true; + } + this._loader.open(this._dataSource, Object.assign({}, this._currentRange)); + }; + IOController.prototype.abort = function () { + this._loader.abort(); + if (this._paused) { + this._paused = false; + this._resumeFrom = 0; + } + }; + IOController.prototype.pause = function () { + if (this.isWorking()) { + this._loader.abort(); + if (this._stashUsed !== 0) { + this._resumeFrom = this._stashByteStart; + this._currentRange.to = this._stashByteStart - 1; + } + else { + this._resumeFrom = this._currentRange.to + 1; + } + this._stashUsed = 0; + this._stashByteStart = 0; + this._paused = true; + } + }; + IOController.prototype.resume = function () { + if (this._paused) { + this._paused = false; + var bytes = this._resumeFrom; + this._resumeFrom = 0; + this._internalSeek(bytes, true); + } + }; + IOController.prototype.seek = function (bytes) { + this._paused = false; + this._stashUsed = 0; + this._stashByteStart = 0; + this._internalSeek(bytes, true); + }; + /** + * When seeking request is from media seeking, unconsumed stash data should be dropped + * However, stash data shouldn't be dropped if seeking requested from http reconnection + * + * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer + */ + IOController.prototype._internalSeek = function (bytes, dropUnconsumed) { + if (this._loader.isWorking()) { + this._loader.abort(); + } + // dispatch & flush stash buffer before seek + this._flushStashBuffer(dropUnconsumed); + this._loader.destroy(); + this._loader = null; + var requestRange = { from: bytes, to: -1 }; + this._currentRange = { from: requestRange.from, to: -1 }; + this._speedSampler.reset(); + this._stashSize = this._stashInitialSize; + this._createLoader(); + this._loader.open(this._dataSource, requestRange); + if (this._onSeeked) { + this._onSeeked(); + } + }; + IOController.prototype.updateUrl = function (url) { + if (!url || typeof url !== 'string' || url.length === 0) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.InvalidArgumentException('Url must be a non-empty string!'); + } + this._dataSource.url = url; + // TODO: replace with new url + }; + IOController.prototype._expandBuffer = function (expectedBytes) { + var bufferNewSize = this._stashSize; + while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) { + bufferNewSize *= 2; + } + bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB + if (bufferNewSize === this._bufferSize) { + return; + } + var newBuffer = new ArrayBuffer(bufferNewSize); + if (this._stashUsed > 0) { // copy existing data into new buffer + var stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed); + var stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize); + stashNewArray.set(stashOldArray, 0); + } + this._stashBuffer = newBuffer; + this._bufferSize = bufferNewSize; + }; + IOController.prototype._normalizeSpeed = function (input) { + var list = this._speedNormalizeList; + var last = list.length - 1; + var mid = 0; + var lbound = 0; + var ubound = last; + if (input < list[0]) { + return list[0]; + } + // binary search + while (lbound <= ubound) { + mid = lbound + Math.floor((ubound - lbound) / 2); + if (mid === last || (input >= list[mid] && input < list[mid + 1])) { + return list[mid]; + } + else if (list[mid] < input) { + lbound = mid + 1; + } + else { + ubound = mid - 1; + } + } + }; + IOController.prototype._adjustStashSize = function (normalized) { + var stashSizeKB = 0; + if (this._config.isLive) { + // live stream: always use single normalized speed for size of stashSizeKB + stashSizeKB = normalized; + } + else { + if (normalized < 512) { + stashSizeKB = normalized; + } + else if (normalized >= 512 && normalized <= 1024) { + stashSizeKB = Math.floor(normalized * 1.5); + } + else { + stashSizeKB = normalized * 2; + } + } + if (stashSizeKB > 8192) { + stashSizeKB = 8192; + } + var bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB + if (this._bufferSize < bufferSize) { + this._expandBuffer(bufferSize); + } + this._stashSize = stashSizeKB * 1024; + }; + IOController.prototype._dispatchChunks = function (chunks, byteStart) { + this._currentRange.to = byteStart + chunks.byteLength - 1; + return this._onDataArrival(chunks, byteStart); + }; + IOController.prototype._onURLRedirect = function (redirectedURL) { + this._redirectedURL = redirectedURL; + if (this._onRedirect) { + this._onRedirect(redirectedURL); + } + }; + IOController.prototype._onContentLengthKnown = function (contentLength) { + if (contentLength && this._fullRequestFlag) { + this._totalLength = contentLength; + this._fullRequestFlag = false; + } + }; + IOController.prototype._onLoaderChunkArrival = function (chunk, byteStart, receivedLength) { + if (!this._onDataArrival) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.IllegalStateException('IOController: No existing consumer (onDataArrival) callback!'); + } + if (this._paused) { + return; + } + if (this._isEarlyEofReconnecting) { + // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback + this._isEarlyEofReconnecting = false; + if (this._onRecoveredEarlyEof) { + this._onRecoveredEarlyEof(); + } + } + this._speedSampler.addBytes(chunk.byteLength); + // adjust stash buffer size according to network speed dynamically + var KBps = this._speedSampler.lastSecondKBps; + if (KBps !== 0) { + var normalized = this._normalizeSpeed(KBps); + if (this._speedNormalized !== normalized) { + this._speedNormalized = normalized; + this._adjustStashSize(normalized); + } + } + if (!this._enableStash) { // disable stash + if (this._stashUsed === 0) { + // dispatch chunk directly to consumer; + // check ret value (consumed bytes) and stash unconsumed to stashBuffer + var consumed = this._dispatchChunks(chunk, byteStart); + if (consumed < chunk.byteLength) { // unconsumed data remain. + var remain = chunk.byteLength - consumed; + if (remain > this._bufferSize) { + this._expandBuffer(remain); + } + var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize); + stashArray.set(new Uint8Array(chunk, consumed), 0); + this._stashUsed += remain; + this._stashByteStart = byteStart + consumed; + } + } + else { + // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer. + if (this._stashUsed + chunk.byteLength > this._bufferSize) { + this._expandBuffer(this._stashUsed + chunk.byteLength); + } + var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize); + stashArray.set(new Uint8Array(chunk), this._stashUsed); + this._stashUsed += chunk.byteLength; + var consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart); + if (consumed < this._stashUsed && consumed > 0) { // unconsumed data remain + var remainArray = new Uint8Array(this._stashBuffer, consumed); + stashArray.set(remainArray, 0); + } + this._stashUsed -= consumed; + this._stashByteStart += consumed; + } + } + else { // enable stash + if (this._stashUsed === 0 && this._stashByteStart === 0) { // seeked? or init chunk? + // This is the first chunk after seek action + this._stashByteStart = byteStart; + } + if (this._stashUsed + chunk.byteLength <= this._stashSize) { + // just stash + var stashArray = new Uint8Array(this._stashBuffer, 0, this._stashSize); + stashArray.set(new Uint8Array(chunk), this._stashUsed); + this._stashUsed += chunk.byteLength; + } + else { // stashUsed + chunkSize > stashSize, size limit exceeded + var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize); + if (this._stashUsed > 0) { // There're stash datas in buffer + // dispatch the whole stashBuffer, and stash remain data + // then append chunk to stashBuffer (stash) + var buffer = this._stashBuffer.slice(0, this._stashUsed); + var consumed = this._dispatchChunks(buffer, this._stashByteStart); + if (consumed < buffer.byteLength) { + if (consumed > 0) { + var remainArray = new Uint8Array(buffer, consumed); + stashArray.set(remainArray, 0); + this._stashUsed = remainArray.byteLength; + this._stashByteStart += consumed; + } + } + else { + this._stashUsed = 0; + this._stashByteStart += consumed; + } + if (this._stashUsed + chunk.byteLength > this._bufferSize) { + this._expandBuffer(this._stashUsed + chunk.byteLength); + stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize); + } + stashArray.set(new Uint8Array(chunk), this._stashUsed); + this._stashUsed += chunk.byteLength; + } + else { // stash buffer empty, but chunkSize > stashSize (oh, holy shit) + // dispatch chunk directly and stash remain data + var consumed = this._dispatchChunks(chunk, byteStart); + if (consumed < chunk.byteLength) { + var remain = chunk.byteLength - consumed; + if (remain > this._bufferSize) { + this._expandBuffer(remain); + stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize); + } + stashArray.set(new Uint8Array(chunk, consumed), 0); + this._stashUsed += remain; + this._stashByteStart = byteStart + consumed; + } + } + } + } + }; + IOController.prototype._flushStashBuffer = function (dropUnconsumed) { + if (this._stashUsed > 0) { + var buffer = this._stashBuffer.slice(0, this._stashUsed); + var consumed = this._dispatchChunks(buffer, this._stashByteStart); + var remain = buffer.byteLength - consumed; + if (consumed < buffer.byteLength) { + if (dropUnconsumed) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, remain + " bytes unconsumed data remain when flush buffer, dropped"); + } + else { + if (consumed > 0) { + var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize); + var remainArray = new Uint8Array(buffer, consumed); + stashArray.set(remainArray, 0); + this._stashUsed = remainArray.byteLength; + this._stashByteStart += consumed; + } + return 0; + } + } + this._stashUsed = 0; + this._stashByteStart = 0; + return remain; + } + return 0; + }; + IOController.prototype._onLoaderComplete = function (from, to) { + // Force-flush stash buffer, and drop unconsumed data + this._flushStashBuffer(true); + if (this._onComplete) { + this._onComplete(this._extraData); + } + }; + IOController.prototype._onLoaderError = function (type, data) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.e(this.TAG, "Loader error, code = " + data.code + ", msg = " + data.msg); + this._flushStashBuffer(false); + if (this._isEarlyEofReconnecting) { + // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer + this._isEarlyEofReconnecting = false; + type = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.UNRECOVERABLE_EARLY_EOF; + } + switch (type) { + case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.EARLY_EOF: { + if (!this._config.isLive) { + // Do internal http reconnect if not live stream + if (this._totalLength) { + var nextFrom = this._currentRange.to + 1; + if (nextFrom < this._totalLength) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Connection lost, trying reconnect...'); + this._isEarlyEofReconnecting = true; + this._internalSeek(nextFrom, false); + } + return; + } + // else: We don't know totalLength, throw UnrecoverableEarlyEof + } + // live stream: throw UnrecoverableEarlyEof error to upper-layer + type = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.UNRECOVERABLE_EARLY_EOF; + break; + } + case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.UNRECOVERABLE_EARLY_EOF: + case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.CONNECTING_TIMEOUT: + case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.HTTP_STATUS_CODE_INVALID: + case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.EXCEPTION: + break; + } + if (this._onError) { + this._onError(type, data); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.RuntimeException('IOException: ' + data.msg); + } + }; + return IOController; +}()); +/* harmony default export */ __webpack_exports__["default"] = (IOController); + + +/***/ }), + +/***/ "./src/io/loader.js": +/*!**************************!*\ + !*** ./src/io/loader.js ***! + \**************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "LoaderStatus": function() { return /* binding */ LoaderStatus; }, +/* harmony export */ "LoaderErrors": function() { return /* binding */ LoaderErrors; }, +/* harmony export */ "BaseLoader": function() { return /* binding */ BaseLoader; } +/* harmony export */ }); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var LoaderStatus = { + kIdle: 0, + kConnecting: 1, + kBuffering: 2, + kError: 3, + kComplete: 4 +}; +var LoaderErrors = { + OK: 'OK', + EXCEPTION: 'Exception', + HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid', + CONNECTING_TIMEOUT: 'ConnectingTimeout', + EARLY_EOF: 'EarlyEof', + UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof' +}; +/* Loader has callbacks which have following prototypes: + * function onContentLengthKnown(contentLength: number): void + * function onURLRedirect(url: string): void + * function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void + * function onError(errorType: number, errorInfo: {code: number, msg: string}): void + * function onComplete(rangeFrom: number, rangeTo: number): void + */ +var BaseLoader = /** @class */ (function () { + function BaseLoader(typeName) { + this._type = typeName || 'undefined'; + this._status = LoaderStatus.kIdle; + this._needStash = false; + // callbacks + this._onContentLengthKnown = null; + this._onURLRedirect = null; + this._onDataArrival = null; + this._onError = null; + this._onComplete = null; + } + BaseLoader.prototype.destroy = function () { + this._status = LoaderStatus.kIdle; + this._onContentLengthKnown = null; + this._onURLRedirect = null; + this._onDataArrival = null; + this._onError = null; + this._onComplete = null; + }; + BaseLoader.prototype.isWorking = function () { + return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering; + }; + Object.defineProperty(BaseLoader.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseLoader.prototype, "status", { + get: function () { + return this._status; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseLoader.prototype, "needStashBuffer", { + get: function () { + return this._needStash; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseLoader.prototype, "onContentLengthKnown", { + get: function () { + return this._onContentLengthKnown; + }, + set: function (callback) { + this._onContentLengthKnown = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseLoader.prototype, "onURLRedirect", { + get: function () { + return this._onURLRedirect; + }, + set: function (callback) { + this._onURLRedirect = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseLoader.prototype, "onDataArrival", { + get: function () { + return this._onDataArrival; + }, + set: function (callback) { + this._onDataArrival = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseLoader.prototype, "onError", { + get: function () { + return this._onError; + }, + set: function (callback) { + this._onError = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseLoader.prototype, "onComplete", { + get: function () { + return this._onComplete; + }, + set: function (callback) { + this._onComplete = callback; + }, + enumerable: false, + configurable: true + }); + // pure virtual + BaseLoader.prototype.open = function (dataSource, range) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__.NotImplementedException('Unimplemented abstract function!'); + }; + BaseLoader.prototype.abort = function () { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__.NotImplementedException('Unimplemented abstract function!'); + }; + return BaseLoader; +}()); + + + +/***/ }), + +/***/ "./src/io/param-seek-handler.js": +/*!**************************************!*\ + !*** ./src/io/param-seek-handler.js ***! + \**************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ParamSeekHandler = /** @class */ (function () { + function ParamSeekHandler(paramStart, paramEnd) { + this._startName = paramStart; + this._endName = paramEnd; + } + ParamSeekHandler.prototype.getConfig = function (baseUrl, range) { + var url = baseUrl; + if (range.from !== 0 || range.to !== -1) { + var needAnd = true; + if (url.indexOf('?') === -1) { + url += '?'; + needAnd = false; + } + if (needAnd) { + url += '&'; + } + url += this._startName + "=" + range.from.toString(); + if (range.to !== -1) { + url += "&" + this._endName + "=" + range.to.toString(); + } + } + return { + url: url, + headers: {} + }; + }; + ParamSeekHandler.prototype.removeURLParameters = function (seekedURL) { + var baseURL = seekedURL.split('?')[0]; + var params = undefined; + var queryIndex = seekedURL.indexOf('?'); + if (queryIndex !== -1) { + params = seekedURL.substring(queryIndex + 1); + } + var resultParams = ''; + if (params != undefined && params.length > 0) { + var pairs = params.split('&'); + for (var i = 0; i < pairs.length; i++) { + var pair = pairs[i].split('='); + var requireAnd = (i > 0); + if (pair[0] !== this._startName && pair[0] !== this._endName) { + if (requireAnd) { + resultParams += '&'; + } + resultParams += pairs[i]; + } + } + } + return (resultParams.length === 0) ? baseURL : baseURL + '?' + resultParams; + }; + return ParamSeekHandler; +}()); +/* harmony default export */ __webpack_exports__["default"] = (ParamSeekHandler); + + +/***/ }), + +/***/ "./src/io/range-seek-handler.js": +/*!**************************************!*\ + !*** ./src/io/range-seek-handler.js ***! + \**************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var RangeSeekHandler = /** @class */ (function () { + function RangeSeekHandler(zeroStart) { + this._zeroStart = zeroStart || false; + } + RangeSeekHandler.prototype.getConfig = function (url, range) { + var headers = {}; + if (range.from !== 0 || range.to !== -1) { + var param = void 0; + if (range.to !== -1) { + param = "bytes=" + range.from.toString() + "-" + range.to.toString(); + } + else { + param = "bytes=" + range.from.toString() + "-"; + } + headers['Range'] = param; + } + else if (this._zeroStart) { + headers['Range'] = 'bytes=0-'; + } + return { + url: url, + headers: headers + }; + }; + RangeSeekHandler.prototype.removeURLParameters = function (seekedURL) { + return seekedURL; + }; + return RangeSeekHandler; +}()); +/* harmony default export */ __webpack_exports__["default"] = (RangeSeekHandler); + + +/***/ }), + +/***/ "./src/io/speed-sampler.js": +/*!*********************************!*\ + !*** ./src/io/speed-sampler.js ***! + \*********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Utility class to calculate realtime network I/O speed +var SpeedSampler = /** @class */ (function () { + function SpeedSampler() { + // milliseconds + this._firstCheckpoint = 0; + this._lastCheckpoint = 0; + this._intervalBytes = 0; + this._totalBytes = 0; + this._lastSecondBytes = 0; + // compatibility detection + if (self.performance && self.performance.now) { + this._now = self.performance.now.bind(self.performance); + } + else { + this._now = Date.now; + } + } + SpeedSampler.prototype.reset = function () { + this._firstCheckpoint = this._lastCheckpoint = 0; + this._totalBytes = this._intervalBytes = 0; + this._lastSecondBytes = 0; + }; + SpeedSampler.prototype.addBytes = function (bytes) { + if (this._firstCheckpoint === 0) { + this._firstCheckpoint = this._now(); + this._lastCheckpoint = this._firstCheckpoint; + this._intervalBytes += bytes; + this._totalBytes += bytes; + } + else if (this._now() - this._lastCheckpoint < 1000) { + this._intervalBytes += bytes; + this._totalBytes += bytes; + } + else { // duration >= 1000 + this._lastSecondBytes = this._intervalBytes; + this._intervalBytes = bytes; + this._totalBytes += bytes; + this._lastCheckpoint = this._now(); + } + }; + Object.defineProperty(SpeedSampler.prototype, "currentKBps", { + get: function () { + this.addBytes(0); + var durationSeconds = (this._now() - this._lastCheckpoint) / 1000; + if (durationSeconds == 0) + durationSeconds = 1; + return (this._intervalBytes / durationSeconds) / 1024; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SpeedSampler.prototype, "lastSecondKBps", { + get: function () { + this.addBytes(0); + if (this._lastSecondBytes !== 0) { + return this._lastSecondBytes / 1024; + } + else { // lastSecondBytes === 0 + if (this._now() - this._lastCheckpoint >= 500) { + // if time interval since last checkpoint has exceeded 500ms + // the speed is nearly accurate + return this.currentKBps; + } + else { + // We don't know + return 0; + } + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SpeedSampler.prototype, "averageKBps", { + get: function () { + var durationSeconds = (this._now() - this._firstCheckpoint) / 1000; + return (this._totalBytes / durationSeconds) / 1024; + }, + enumerable: false, + configurable: true + }); + return SpeedSampler; +}()); +/* harmony default export */ __webpack_exports__["default"] = (SpeedSampler); + + +/***/ }), + +/***/ "./src/io/websocket-loader.js": +/*!************************************!*\ + !*** ./src/io/websocket-loader.js ***! + \************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); + + +// For FLV over WebSocket live stream +var WebSocketLoader = /** @class */ (function (_super) { + __extends(WebSocketLoader, _super); + function WebSocketLoader() { + var _this = _super.call(this, 'websocket-loader') || this; + _this.TAG = 'WebSocketLoader'; + _this._needStash = true; + _this._ws = null; + _this._requestAbort = false; + _this._receivedLength = 0; + return _this; + } + WebSocketLoader.isSupported = function () { + try { + return (typeof self.WebSocket !== 'undefined'); + } + catch (e) { + return false; + } + }; + WebSocketLoader.prototype.destroy = function () { + if (this._ws) { + this.abort(); + } + _super.prototype.destroy.call(this); + }; + WebSocketLoader.prototype.open = function (dataSource) { + try { + var ws = this._ws = new self.WebSocket(dataSource.url); + ws.binaryType = 'arraybuffer'; + ws.onopen = this._onWebSocketOpen.bind(this); + ws.onclose = this._onWebSocketClose.bind(this); + ws.onmessage = this._onWebSocketMessage.bind(this); + ws.onerror = this._onWebSocketError.bind(this); + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kConnecting; + } + catch (e) { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kError; + var info = { code: e.code, msg: e.message }; + if (this._onError) { + this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.EXCEPTION, info); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_1__.RuntimeException(info.msg); + } + } + }; + WebSocketLoader.prototype.abort = function () { + var ws = this._ws; + if (ws && (ws.readyState === 0 || ws.readyState === 1)) { // CONNECTING || OPEN + this._requestAbort = true; + ws.close(); + } + this._ws = null; + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kComplete; + }; + WebSocketLoader.prototype._onWebSocketOpen = function (e) { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kBuffering; + }; + WebSocketLoader.prototype._onWebSocketClose = function (e) { + if (this._requestAbort === true) { + this._requestAbort = false; + return; + } + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kComplete; + if (this._onComplete) { + this._onComplete(0, this._receivedLength - 1); + } + }; + WebSocketLoader.prototype._onWebSocketMessage = function (e) { + var _this = this; + if (e.data instanceof ArrayBuffer) { + this._dispatchArrayBuffer(e.data); + } + else if (e.data instanceof Blob) { + var reader_1 = new FileReader(); + reader_1.onload = function () { + _this._dispatchArrayBuffer(reader_1.result); + }; + reader_1.readAsArrayBuffer(e.data); + } + else { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kError; + var info = { code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name }; + if (this._onError) { + this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.EXCEPTION, info); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_1__.RuntimeException(info.msg); + } + } + }; + WebSocketLoader.prototype._dispatchArrayBuffer = function (arraybuffer) { + var chunk = arraybuffer; + var byteStart = this._receivedLength; + this._receivedLength += chunk.byteLength; + if (this._onDataArrival) { + this._onDataArrival(chunk, byteStart, this._receivedLength); + } + }; + WebSocketLoader.prototype._onWebSocketError = function (e) { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kError; + var info = { + code: e.code, + msg: e.message + }; + if (this._onError) { + this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.EXCEPTION, info); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_1__.RuntimeException(info.msg); + } + }; + return WebSocketLoader; +}(_loader_js__WEBPACK_IMPORTED_MODULE_0__.BaseLoader)); +/* harmony default export */ __webpack_exports__["default"] = (WebSocketLoader); + + +/***/ }), + +/***/ "./src/io/xhr-moz-chunked-loader.js": +/*!******************************************!*\ + !*** ./src/io/xhr-moz-chunked-loader.js ***! + \******************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); + + + +// For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'` +var MozChunkedLoader = /** @class */ (function (_super) { + __extends(MozChunkedLoader, _super); + function MozChunkedLoader(seekHandler, config) { + var _this = _super.call(this, 'xhr-moz-chunked-loader') || this; + _this.TAG = 'MozChunkedLoader'; + _this._seekHandler = seekHandler; + _this._config = config; + _this._needStash = true; + _this._xhr = null; + _this._requestAbort = false; + _this._contentLength = null; + _this._receivedLength = 0; + return _this; + } + MozChunkedLoader.isSupported = function () { + try { + var xhr = new XMLHttpRequest(); + // Firefox 37- requires .open() to be called before setting responseType + xhr.open('GET', 'https://example.com', true); + xhr.responseType = 'moz-chunked-arraybuffer'; + return (xhr.responseType === 'moz-chunked-arraybuffer'); + } + catch (e) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w('MozChunkedLoader', e.message); + return false; + } + }; + MozChunkedLoader.prototype.destroy = function () { + if (this.isWorking()) { + this.abort(); + } + if (this._xhr) { + this._xhr.onreadystatechange = null; + this._xhr.onprogress = null; + this._xhr.onloadend = null; + this._xhr.onerror = null; + this._xhr = null; + } + _super.prototype.destroy.call(this); + }; + MozChunkedLoader.prototype.open = function (dataSource, range) { + this._dataSource = dataSource; + this._range = range; + var sourceURL = dataSource.url; + if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) { + sourceURL = dataSource.redirectedURL; + } + var seekConfig = this._seekHandler.getConfig(sourceURL, range); + this._requestURL = seekConfig.url; + var xhr = this._xhr = new XMLHttpRequest(); + xhr.open('GET', seekConfig.url, true); + xhr.responseType = 'moz-chunked-arraybuffer'; + xhr.onreadystatechange = this._onReadyStateChange.bind(this); + xhr.onprogress = this._onProgress.bind(this); + xhr.onloadend = this._onLoadEnd.bind(this); + xhr.onerror = this._onXhrError.bind(this); + // cors is auto detected and enabled by xhr + // withCredentials is disabled by default + if (dataSource.withCredentials) { + xhr.withCredentials = true; + } + if (typeof seekConfig.headers === 'object') { + var headers = seekConfig.headers; + for (var key in headers) { + if (headers.hasOwnProperty(key)) { + xhr.setRequestHeader(key, headers[key]); + } + } + } + // add additional headers + if (typeof this._config.headers === 'object') { + var headers = this._config.headers; + for (var key in headers) { + if (headers.hasOwnProperty(key)) { + xhr.setRequestHeader(key, headers[key]); + } + } + } + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kConnecting; + xhr.send(); + }; + MozChunkedLoader.prototype.abort = function () { + this._requestAbort = true; + if (this._xhr) { + this._xhr.abort(); + } + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete; + }; + MozChunkedLoader.prototype._onReadyStateChange = function (e) { + var xhr = e.target; + if (xhr.readyState === 2) { // HEADERS_RECEIVED + if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) { + if (this._onURLRedirect) { + var redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL); + this._onURLRedirect(redirectedURL); + } + } + if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError; + if (this._onError) { + this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: xhr.status, msg: xhr.statusText }); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText); + } + } + else { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kBuffering; + } + } + }; + MozChunkedLoader.prototype._onProgress = function (e) { + if (this._status === _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError) { + // Ignore error response + return; + } + if (this._contentLength === null) { + if (e.total !== null && e.total !== 0) { + this._contentLength = e.total; + if (this._onContentLengthKnown) { + this._onContentLengthKnown(this._contentLength); + } + } + } + var chunk = e.target.response; + var byteStart = this._range.from + this._receivedLength; + this._receivedLength += chunk.byteLength; + if (this._onDataArrival) { + this._onDataArrival(chunk, byteStart, this._receivedLength); + } + }; + MozChunkedLoader.prototype._onLoadEnd = function (e) { + if (this._requestAbort === true) { + this._requestAbort = false; + return; + } + else if (this._status === _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError) { + return; + } + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete; + if (this._onComplete) { + this._onComplete(this._range.from, this._range.from + this._receivedLength - 1); + } + }; + MozChunkedLoader.prototype._onXhrError = function (e) { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError; + var type = 0; + var info = null; + if (this._contentLength && e.loaded < this._contentLength) { + type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EARLY_EOF; + info = { code: -1, msg: 'Moz-Chunked stream meet Early-Eof' }; + } + else { + type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EXCEPTION; + info = { code: -1, msg: e.constructor.name + ' ' + e.type }; + } + if (this._onError) { + this._onError(type, info); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException(info.msg); + } + }; + return MozChunkedLoader; +}(_loader_js__WEBPACK_IMPORTED_MODULE_1__.BaseLoader)); +/* harmony default export */ __webpack_exports__["default"] = (MozChunkedLoader); + + +/***/ }), + +/***/ "./src/io/xhr-range-loader.js": +/*!************************************!*\ + !*** ./src/io/xhr-range-loader.js ***! + \************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _speed_sampler_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./speed-sampler.js */ "./src/io/speed-sampler.js"); +/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); + + + + +// Universal IO Loader, implemented by adding Range header in xhr's request header +var RangeLoader = /** @class */ (function (_super) { + __extends(RangeLoader, _super); + function RangeLoader(seekHandler, config) { + var _this = _super.call(this, 'xhr-range-loader') || this; + _this.TAG = 'RangeLoader'; + _this._seekHandler = seekHandler; + _this._config = config; + _this._needStash = false; + _this._chunkSizeKBList = [ + 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192 + ]; + _this._currentChunkSizeKB = 384; + _this._currentSpeedNormalized = 0; + _this._zeroSpeedChunkCount = 0; + _this._xhr = null; + _this._speedSampler = new _speed_sampler_js__WEBPACK_IMPORTED_MODULE_1__.default(); + _this._requestAbort = false; + _this._waitForTotalLength = false; + _this._totalLengthReceived = false; + _this._currentRequestURL = null; + _this._currentRedirectedURL = null; + _this._currentRequestRange = null; + _this._totalLength = null; // size of the entire file + _this._contentLength = null; // Content-Length of entire request range + _this._receivedLength = 0; // total received bytes + _this._lastTimeLoaded = 0; // received bytes of current request sub-range + return _this; + } + RangeLoader.isSupported = function () { + try { + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'https://example.com', true); + xhr.responseType = 'arraybuffer'; + return (xhr.responseType === 'arraybuffer'); + } + catch (e) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w('RangeLoader', e.message); + return false; + } + }; + RangeLoader.prototype.destroy = function () { + if (this.isWorking()) { + this.abort(); + } + if (this._xhr) { + this._xhr.onreadystatechange = null; + this._xhr.onprogress = null; + this._xhr.onload = null; + this._xhr.onerror = null; + this._xhr = null; + } + _super.prototype.destroy.call(this); + }; + Object.defineProperty(RangeLoader.prototype, "currentSpeed", { + get: function () { + return this._speedSampler.lastSecondKBps; + }, + enumerable: false, + configurable: true + }); + RangeLoader.prototype.open = function (dataSource, range) { + this._dataSource = dataSource; + this._range = range; + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kConnecting; + var useRefTotalLength = false; + if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) { + useRefTotalLength = true; + this._totalLength = this._dataSource.filesize; + } + if (!this._totalLengthReceived && !useRefTotalLength) { + // We need total filesize + this._waitForTotalLength = true; + this._internalOpen(this._dataSource, { from: 0, to: -1 }); + } + else { + // We have filesize, start loading + this._openSubRange(); + } + }; + RangeLoader.prototype._openSubRange = function () { + var chunkSize = this._currentChunkSizeKB * 1024; + var from = this._range.from + this._receivedLength; + var to = from + chunkSize; + if (this._contentLength != null) { + if (to - this._range.from >= this._contentLength) { + to = this._range.from + this._contentLength - 1; + } + } + this._currentRequestRange = { from: from, to: to }; + this._internalOpen(this._dataSource, this._currentRequestRange); + }; + RangeLoader.prototype._internalOpen = function (dataSource, range) { + this._lastTimeLoaded = 0; + var sourceURL = dataSource.url; + if (this._config.reuseRedirectedURL) { + if (this._currentRedirectedURL != undefined) { + sourceURL = this._currentRedirectedURL; + } + else if (dataSource.redirectedURL != undefined) { + sourceURL = dataSource.redirectedURL; + } + } + var seekConfig = this._seekHandler.getConfig(sourceURL, range); + this._currentRequestURL = seekConfig.url; + var xhr = this._xhr = new XMLHttpRequest(); + xhr.open('GET', seekConfig.url, true); + xhr.responseType = 'arraybuffer'; + xhr.onreadystatechange = this._onReadyStateChange.bind(this); + xhr.onprogress = this._onProgress.bind(this); + xhr.onload = this._onLoad.bind(this); + xhr.onerror = this._onXhrError.bind(this); + if (dataSource.withCredentials) { + xhr.withCredentials = true; + } + if (typeof seekConfig.headers === 'object') { + var headers = seekConfig.headers; + for (var key in headers) { + if (headers.hasOwnProperty(key)) { + xhr.setRequestHeader(key, headers[key]); + } + } + } + // add additional headers + if (typeof this._config.headers === 'object') { + var headers = this._config.headers; + for (var key in headers) { + if (headers.hasOwnProperty(key)) { + xhr.setRequestHeader(key, headers[key]); + } + } + } + xhr.send(); + }; + RangeLoader.prototype.abort = function () { + this._requestAbort = true; + this._internalAbort(); + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kComplete; + }; + RangeLoader.prototype._internalAbort = function () { + if (this._xhr) { + this._xhr.onreadystatechange = null; + this._xhr.onprogress = null; + this._xhr.onload = null; + this._xhr.onerror = null; + this._xhr.abort(); + this._xhr = null; + } + }; + RangeLoader.prototype._onReadyStateChange = function (e) { + var xhr = e.target; + if (xhr.readyState === 2) { // HEADERS_RECEIVED + if (xhr.responseURL != undefined) { // if the browser support this property + var redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL); + if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) { + this._currentRedirectedURL = redirectedURL; + if (this._onURLRedirect) { + this._onURLRedirect(redirectedURL); + } + } + } + if ((xhr.status >= 200 && xhr.status <= 299)) { + if (this._waitForTotalLength) { + return; + } + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kBuffering; + } + else { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kError; + if (this._onError) { + this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: xhr.status, msg: xhr.statusText }); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText); + } + } + } + }; + RangeLoader.prototype._onProgress = function (e) { + if (this._status === _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kError) { + // Ignore error response + return; + } + if (this._contentLength === null) { + var openNextRange = false; + if (this._waitForTotalLength) { + this._waitForTotalLength = false; + this._totalLengthReceived = true; + openNextRange = true; + var total = e.total; + this._internalAbort(); + if (total != null & total !== 0) { + this._totalLength = total; + } + } + // calculate currrent request range's contentLength + if (this._range.to === -1) { + this._contentLength = this._totalLength - this._range.from; + } + else { // to !== -1 + this._contentLength = this._range.to - this._range.from + 1; + } + if (openNextRange) { + this._openSubRange(); + return; + } + if (this._onContentLengthKnown) { + this._onContentLengthKnown(this._contentLength); + } + } + var delta = e.loaded - this._lastTimeLoaded; + this._lastTimeLoaded = e.loaded; + this._speedSampler.addBytes(delta); + }; + RangeLoader.prototype._normalizeSpeed = function (input) { + var list = this._chunkSizeKBList; + var last = list.length - 1; + var mid = 0; + var lbound = 0; + var ubound = last; + if (input < list[0]) { + return list[0]; + } + while (lbound <= ubound) { + mid = lbound + Math.floor((ubound - lbound) / 2); + if (mid === last || (input >= list[mid] && input < list[mid + 1])) { + return list[mid]; + } + else if (list[mid] < input) { + lbound = mid + 1; + } + else { + ubound = mid - 1; + } + } + }; + RangeLoader.prototype._onLoad = function (e) { + if (this._status === _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kError) { + // Ignore error response + return; + } + if (this._waitForTotalLength) { + this._waitForTotalLength = false; + return; + } + this._lastTimeLoaded = 0; + var KBps = this._speedSampler.lastSecondKBps; + if (KBps === 0) { + this._zeroSpeedChunkCount++; + if (this._zeroSpeedChunkCount >= 3) { + // Try get currentKBps after 3 chunks + KBps = this._speedSampler.currentKBps; + } + } + if (KBps !== 0) { + var normalized = this._normalizeSpeed(KBps); + if (this._currentSpeedNormalized !== normalized) { + this._currentSpeedNormalized = normalized; + this._currentChunkSizeKB = normalized; + } + } + var chunk = e.target.response; + var byteStart = this._range.from + this._receivedLength; + this._receivedLength += chunk.byteLength; + var reportComplete = false; + if (this._contentLength != null && this._receivedLength < this._contentLength) { + // continue load next chunk + this._openSubRange(); + } + else { + reportComplete = true; + } + // dispatch received chunk + if (this._onDataArrival) { + this._onDataArrival(chunk, byteStart, this._receivedLength); + } + if (reportComplete) { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kComplete; + if (this._onComplete) { + this._onComplete(this._range.from, this._range.from + this._receivedLength - 1); + } + } + }; + RangeLoader.prototype._onXhrError = function (e) { + this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kError; + var type = 0; + var info = null; + if (this._contentLength && this._receivedLength > 0 + && this._receivedLength < this._contentLength) { + type = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.EARLY_EOF; + info = { code: -1, msg: 'RangeLoader meet Early-Eof' }; + } + else { + type = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.EXCEPTION; + info = { code: -1, msg: e.constructor.name + ' ' + e.type }; + } + if (this._onError) { + this._onError(type, info); + } + else { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.RuntimeException(info.msg); + } + }; + return RangeLoader; +}(_loader_js__WEBPACK_IMPORTED_MODULE_2__.BaseLoader)); +/* harmony default export */ __webpack_exports__["default"] = (RangeLoader); + + +/***/ }), + +/***/ "./src/player/flv-player.js": +/*!**********************************!*\ + !*** ./src/player/flv-player.js ***! + \**********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js"); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js"); +/* harmony import */ var _player_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./player-events.js */ "./src/player/player-events.js"); +/* harmony import */ var _core_transmuxer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/transmuxer.js */ "./src/core/transmuxer.js"); +/* harmony import */ var _core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../core/transmuxing-events.js */ "./src/core/transmuxing-events.js"); +/* harmony import */ var _core_mse_controller_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../core/mse-controller.js */ "./src/core/mse-controller.js"); +/* harmony import */ var _core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../core/mse-events.js */ "./src/core/mse-events.js"); +/* harmony import */ var _player_errors_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./player-errors.js */ "./src/player/player-errors.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../config.js */ "./src/config.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + + + + + + +var FlvPlayer = /** @class */ (function () { + function FlvPlayer(mediaDataSource, config) { + this.TAG = 'FlvPlayer'; + this._type = 'FlvPlayer'; + this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())(); + this._config = (0,_config_js__WEBPACK_IMPORTED_MODULE_9__.createDefaultConfig)(); + if (typeof config === 'object') { + Object.assign(this._config, config); + } + if (mediaDataSource.type.toLowerCase() !== 'flv') { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_10__.InvalidArgumentException('FlvPlayer requires an flv MediaDataSource input!'); + } + if (mediaDataSource.isLive === true) { + this._config.isLive = true; + } + this.e = { + onvLoadedMetadata: this._onvLoadedMetadata.bind(this), + onvSeeking: this._onvSeeking.bind(this), + onvCanPlay: this._onvCanPlay.bind(this), + onvStalled: this._onvStalled.bind(this), + onvProgress: this._onvProgress.bind(this) + }; + if (self.performance && self.performance.now) { + this._now = self.performance.now.bind(self.performance); + } + else { + this._now = Date.now; + } + this._pendingSeekTime = null; // in seconds + this._requestSetTime = false; + this._seekpointRecord = null; + this._progressChecker = null; + this._mediaDataSource = mediaDataSource; + this._mediaElement = null; + this._msectl = null; + this._transmuxer = null; + this._mseSourceOpened = false; + this._hasPendingLoad = false; + this._receivedCanPlay = false; + this._mediaInfo = null; + this._statisticsInfo = null; + var chromeNeedIDRFix = (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.chrome && + (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.version.major < 50 || + (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.version.major === 50 && _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.version.build < 2661))); + this._alwaysSeekKeyframe = (chromeNeedIDRFix || _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.msedge || _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.msie) ? true : false; + if (this._alwaysSeekKeyframe) { + this._config.accurateSeek = false; + } + } + FlvPlayer.prototype.destroy = function () { + if (this._progressChecker != null) { + window.clearInterval(this._progressChecker); + this._progressChecker = null; + } + if (this._transmuxer) { + this.unload(); + } + if (this._mediaElement) { + this.detachMediaElement(); + } + this.e = null; + this._mediaDataSource = null; + this._emitter.removeAllListeners(); + this._emitter = null; + }; + FlvPlayer.prototype.on = function (event, listener) { + var _this = this; + if (event === _player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO) { + if (this._mediaInfo != null) { + Promise.resolve().then(function () { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO, _this.mediaInfo); + }); + } + } + else if (event === _player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO) { + if (this._statisticsInfo != null) { + Promise.resolve().then(function () { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO, _this.statisticsInfo); + }); + } + } + this._emitter.addListener(event, listener); + }; + FlvPlayer.prototype.off = function (event, listener) { + this._emitter.removeListener(event, listener); + }; + FlvPlayer.prototype.attachMediaElement = function (mediaElement) { + var _this = this; + this._mediaElement = mediaElement; + mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata); + mediaElement.addEventListener('seeking', this.e.onvSeeking); + mediaElement.addEventListener('canplay', this.e.onvCanPlay); + mediaElement.addEventListener('stalled', this.e.onvStalled); + mediaElement.addEventListener('progress', this.e.onvProgress); + this._msectl = new _core_mse_controller_js__WEBPACK_IMPORTED_MODULE_6__.default(this._config); + this._msectl.on(_core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__.default.UPDATE_END, this._onmseUpdateEnd.bind(this)); + this._msectl.on(_core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__.default.BUFFER_FULL, this._onmseBufferFull.bind(this)); + this._msectl.on(_core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__.default.SOURCE_OPEN, function () { + _this._mseSourceOpened = true; + if (_this._hasPendingLoad) { + _this._hasPendingLoad = false; + _this.load(); + } + }); + this._msectl.on(_core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__.default.ERROR, function (info) { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, _player_errors_js__WEBPACK_IMPORTED_MODULE_8__.ErrorTypes.MEDIA_ERROR, _player_errors_js__WEBPACK_IMPORTED_MODULE_8__.ErrorDetails.MEDIA_MSE_ERROR, info); + }); + this._msectl.attachMediaElement(mediaElement); + if (this._pendingSeekTime != null) { + try { + mediaElement.currentTime = this._pendingSeekTime; + this._pendingSeekTime = null; + } + catch (e) { + // IE11 may throw InvalidStateError if readyState === 0 + // We can defer set currentTime operation after loadedmetadata + } + } + }; + FlvPlayer.prototype.detachMediaElement = function () { + if (this._mediaElement) { + this._msectl.detachMediaElement(); + this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata); + this._mediaElement.removeEventListener('seeking', this.e.onvSeeking); + this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay); + this._mediaElement.removeEventListener('stalled', this.e.onvStalled); + this._mediaElement.removeEventListener('progress', this.e.onvProgress); + this._mediaElement = null; + } + if (this._msectl) { + this._msectl.destroy(); + this._msectl = null; + } + }; + FlvPlayer.prototype.load = function () { + var _this = this; + if (!this._mediaElement) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_10__.IllegalStateException('HTMLMediaElement must be attached before load()!'); + } + if (this._transmuxer) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_10__.IllegalStateException('FlvPlayer.load() has been called, please call unload() first!'); + } + if (this._hasPendingLoad) { + return; + } + if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) { + this._hasPendingLoad = true; + return; + } + if (this._mediaElement.readyState > 0) { + this._requestSetTime = true; + // IE11 may throw InvalidStateError if readyState === 0 + this._mediaElement.currentTime = 0; + } + this._transmuxer = new _core_transmuxer_js__WEBPACK_IMPORTED_MODULE_4__.default(this._mediaDataSource, this._config); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.INIT_SEGMENT, function (type, is) { + _this._msectl.appendInitSegment(is); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_SEGMENT, function (type, ms) { + _this._msectl.appendMediaSegment(ms); + // lazyLoad check + if (_this._config.lazyLoad && !_this._config.isLive) { + var currentTime = _this._mediaElement.currentTime; + if (ms.info.endDts >= (currentTime + _this._config.lazyLoadMaxDuration) * 1000) { + if (_this._progressChecker == null) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(_this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task'); + _this._suspendTransmuxer(); + } + } + } + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.LOADING_COMPLETE, function () { + _this._msectl.endOfStream(); + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.LOADING_COMPLETE); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOVERED_EARLY_EOF, function () { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOVERED_EARLY_EOF); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.IO_ERROR, function (detail, info) { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, _player_errors_js__WEBPACK_IMPORTED_MODULE_8__.ErrorTypes.NETWORK_ERROR, detail, info); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.DEMUX_ERROR, function (detail, info) { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, _player_errors_js__WEBPACK_IMPORTED_MODULE_8__.ErrorTypes.MEDIA_ERROR, detail, { code: -1, msg: info }); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_INFO, function (mediaInfo) { + _this._mediaInfo = mediaInfo; + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO, Object.assign({}, mediaInfo)); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.METADATA_ARRIVED, function (metadata) { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.METADATA_ARRIVED, metadata); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.SCRIPTDATA_ARRIVED, function (data) { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.SCRIPTDATA_ARRIVED, data); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.STATISTICS_INFO, function (statInfo) { + _this._statisticsInfo = _this._fillStatisticsInfo(statInfo); + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO, Object.assign({}, _this._statisticsInfo)); + }); + this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOMMEND_SEEKPOINT, function (milliseconds) { + if (_this._mediaElement && !_this._config.accurateSeek) { + _this._requestSetTime = true; + _this._mediaElement.currentTime = milliseconds / 1000; + } + }); + this._transmuxer.open(); + }; + FlvPlayer.prototype.unload = function () { + if (this._mediaElement) { + this._mediaElement.pause(); + } + if (this._msectl) { + this._msectl.seek(0); + } + if (this._transmuxer) { + this._transmuxer.close(); + this._transmuxer.destroy(); + this._transmuxer = null; + } + }; + FlvPlayer.prototype.play = function () { + return this._mediaElement.play(); + }; + FlvPlayer.prototype.pause = function () { + this._mediaElement.pause(); + }; + Object.defineProperty(FlvPlayer.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FlvPlayer.prototype, "buffered", { + get: function () { + return this._mediaElement.buffered; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FlvPlayer.prototype, "duration", { + get: function () { + return this._mediaElement.duration; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FlvPlayer.prototype, "volume", { + get: function () { + return this._mediaElement.volume; + }, + set: function (value) { + this._mediaElement.volume = value; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FlvPlayer.prototype, "muted", { + get: function () { + return this._mediaElement.muted; + }, + set: function (muted) { + this._mediaElement.muted = muted; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FlvPlayer.prototype, "currentTime", { + get: function () { + if (this._mediaElement) { + return this._mediaElement.currentTime; + } + return 0; + }, + set: function (seconds) { + if (this._mediaElement) { + this._internalSeek(seconds); + } + else { + this._pendingSeekTime = seconds; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FlvPlayer.prototype, "mediaInfo", { + get: function () { + return Object.assign({}, this._mediaInfo); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(FlvPlayer.prototype, "statisticsInfo", { + get: function () { + if (this._statisticsInfo == null) { + this._statisticsInfo = {}; + } + this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo); + return Object.assign({}, this._statisticsInfo); + }, + enumerable: false, + configurable: true + }); + FlvPlayer.prototype._fillStatisticsInfo = function (statInfo) { + statInfo.playerType = this._type; + if (!(this._mediaElement instanceof HTMLVideoElement)) { + return statInfo; + } + var hasQualityInfo = true; + var decoded = 0; + var dropped = 0; + if (this._mediaElement.getVideoPlaybackQuality) { + var quality = this._mediaElement.getVideoPlaybackQuality(); + decoded = quality.totalVideoFrames; + dropped = quality.droppedVideoFrames; + } + else if (this._mediaElement.webkitDecodedFrameCount != undefined) { + decoded = this._mediaElement.webkitDecodedFrameCount; + dropped = this._mediaElement.webkitDroppedFrameCount; + } + else { + hasQualityInfo = false; + } + if (hasQualityInfo) { + statInfo.decodedFrames = decoded; + statInfo.droppedFrames = dropped; + } + return statInfo; + }; + FlvPlayer.prototype._onmseUpdateEnd = function () { + if (!this._config.lazyLoad || this._config.isLive) { + return; + } + var buffered = this._mediaElement.buffered; + var currentTime = this._mediaElement.currentTime; + var currentRangeStart = 0; + var currentRangeEnd = 0; + for (var i = 0; i < buffered.length; i++) { + var start = buffered.start(i); + var end = buffered.end(i); + if (start <= currentTime && currentTime < end) { + currentRangeStart = start; + currentRangeEnd = end; + break; + } + } + if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task'); + this._suspendTransmuxer(); + } + }; + FlvPlayer.prototype._onmseBufferFull = function () { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task'); + if (this._progressChecker == null) { + this._suspendTransmuxer(); + } + }; + FlvPlayer.prototype._suspendTransmuxer = function () { + if (this._transmuxer) { + this._transmuxer.pause(); + if (this._progressChecker == null) { + this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000); + } + } + }; + FlvPlayer.prototype._checkProgressAndResume = function () { + var currentTime = this._mediaElement.currentTime; + var buffered = this._mediaElement.buffered; + var needResume = false; + for (var i = 0; i < buffered.length; i++) { + var from = buffered.start(i); + var to = buffered.end(i); + if (currentTime >= from && currentTime < to) { + if (currentTime >= to - this._config.lazyLoadRecoverDuration) { + needResume = true; + } + break; + } + } + if (needResume) { + window.clearInterval(this._progressChecker); + this._progressChecker = null; + if (needResume) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'Continue loading from paused position'); + this._transmuxer.resume(); + } + } + }; + FlvPlayer.prototype._isTimepointBuffered = function (seconds) { + var buffered = this._mediaElement.buffered; + for (var i = 0; i < buffered.length; i++) { + var from = buffered.start(i); + var to = buffered.end(i); + if (seconds >= from && seconds < to) { + return true; + } + } + return false; + }; + FlvPlayer.prototype._internalSeek = function (seconds) { + var directSeek = this._isTimepointBuffered(seconds); + var directSeekBegin = false; + var directSeekBeginTime = 0; + if (seconds < 1.0 && this._mediaElement.buffered.length > 0) { + var videoBeginTime = this._mediaElement.buffered.start(0); + if ((videoBeginTime < 1.0 && seconds < videoBeginTime) || _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari) { + directSeekBegin = true; + // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid + directSeekBeginTime = _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari ? 0.1 : videoBeginTime; + } + } + if (directSeekBegin) { // seek to video begin, set currentTime directly if beginPTS buffered + this._requestSetTime = true; + this._mediaElement.currentTime = directSeekBeginTime; + } + else if (directSeek) { // buffered position + if (!this._alwaysSeekKeyframe) { + this._requestSetTime = true; + this._mediaElement.currentTime = seconds; + } + else { + var idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000)); + this._requestSetTime = true; + if (idr != null) { + this._mediaElement.currentTime = idr.dts / 1000; + } + else { + this._mediaElement.currentTime = seconds; + } + } + if (this._progressChecker != null) { + this._checkProgressAndResume(); + } + } + else { + if (this._progressChecker != null) { + window.clearInterval(this._progressChecker); + this._progressChecker = null; + } + this._msectl.seek(seconds); + this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds + // no need to set mediaElement.currentTime if non-accurateSeek, + // just wait for the recommend_seekpoint callback + if (this._config.accurateSeek) { + this._requestSetTime = true; + this._mediaElement.currentTime = seconds; + } + } + }; + FlvPlayer.prototype._checkAndApplyUnbufferedSeekpoint = function () { + if (this._seekpointRecord) { + if (this._seekpointRecord.recordTime <= this._now() - 100) { + var target = this._mediaElement.currentTime; + this._seekpointRecord = null; + if (!this._isTimepointBuffered(target)) { + if (this._progressChecker != null) { + window.clearTimeout(this._progressChecker); + this._progressChecker = null; + } + // .currentTime is consists with .buffered timestamp + // Chrome/Edge use DTS, while FireFox/Safari use PTS + this._msectl.seek(target); + this._transmuxer.seek(Math.floor(target * 1000)); + // set currentTime if accurateSeek, or wait for recommend_seekpoint callback + if (this._config.accurateSeek) { + this._requestSetTime = true; + this._mediaElement.currentTime = target; + } + } + } + else { + window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50); + } + } + }; + FlvPlayer.prototype._checkAndResumeStuckPlayback = function (stalled) { + var media = this._mediaElement; + if (stalled || !this._receivedCanPlay || media.readyState < 2) { // HAVE_CURRENT_DATA + var buffered = media.buffered; + if (buffered.length > 0 && media.currentTime < buffered.start(0)) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.w(this.TAG, "Playback seems stuck at " + media.currentTime + ", seek to " + buffered.start(0)); + this._requestSetTime = true; + this._mediaElement.currentTime = buffered.start(0); + this._mediaElement.removeEventListener('progress', this.e.onvProgress); + } + } + else { + // Playback didn't stuck, remove progress event listener + this._mediaElement.removeEventListener('progress', this.e.onvProgress); + } + }; + FlvPlayer.prototype._onvLoadedMetadata = function (e) { + if (this._pendingSeekTime != null) { + this._mediaElement.currentTime = this._pendingSeekTime; + this._pendingSeekTime = null; + } + }; + FlvPlayer.prototype._onvSeeking = function (e) { + var target = this._mediaElement.currentTime; + var buffered = this._mediaElement.buffered; + if (this._requestSetTime) { + this._requestSetTime = false; + return; + } + if (target < 1.0 && buffered.length > 0) { + // seek to video begin, set currentTime directly if beginPTS buffered + var videoBeginTime = buffered.start(0); + if ((videoBeginTime < 1.0 && target < videoBeginTime) || _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari) { + this._requestSetTime = true; + // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid + this._mediaElement.currentTime = _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari ? 0.1 : videoBeginTime; + return; + } + } + if (this._isTimepointBuffered(target)) { + if (this._alwaysSeekKeyframe) { + var idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000)); + if (idr != null) { + this._requestSetTime = true; + this._mediaElement.currentTime = idr.dts / 1000; + } + } + if (this._progressChecker != null) { + this._checkProgressAndResume(); + } + return; + } + this._seekpointRecord = { + seekPoint: target, + recordTime: this._now() + }; + window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50); + }; + FlvPlayer.prototype._onvCanPlay = function (e) { + this._receivedCanPlay = true; + this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay); + }; + FlvPlayer.prototype._onvStalled = function (e) { + this._checkAndResumeStuckPlayback(true); + }; + FlvPlayer.prototype._onvProgress = function (e) { + this._checkAndResumeStuckPlayback(); + }; + return FlvPlayer; +}()); +/* harmony default export */ __webpack_exports__["default"] = (FlvPlayer); + + +/***/ }), + +/***/ "./src/player/native-player.js": +/*!*************************************!*\ + !*** ./src/player/native-player.js ***! + \*************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js"); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _player_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./player-events.js */ "./src/player/player-events.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. +var NativePlayer = /** @class */ (function () { + function NativePlayer(mediaDataSource, config) { + this.TAG = 'NativePlayer'; + this._type = 'NativePlayer'; + this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())(); + this._config = (0,_config_js__WEBPACK_IMPORTED_MODULE_2__.createDefaultConfig)(); + if (typeof config === 'object') { + Object.assign(this._config, config); + } + if (mediaDataSource.type.toLowerCase() === 'flv') { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.InvalidArgumentException('NativePlayer does\'t support flv MediaDataSource input!'); + } + if (mediaDataSource.hasOwnProperty('segments')) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.InvalidArgumentException("NativePlayer(" + mediaDataSource.type + ") doesn't support multipart playback!"); + } + this.e = { + onvLoadedMetadata: this._onvLoadedMetadata.bind(this) + }; + this._pendingSeekTime = null; + this._statisticsReporter = null; + this._mediaDataSource = mediaDataSource; + this._mediaElement = null; + } + NativePlayer.prototype.destroy = function () { + if (this._mediaElement) { + this.unload(); + this.detachMediaElement(); + } + this.e = null; + this._mediaDataSource = null; + this._emitter.removeAllListeners(); + this._emitter = null; + }; + NativePlayer.prototype.on = function (event, listener) { + var _this = this; + if (event === _player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.MEDIA_INFO) { + if (this._mediaElement != null && this._mediaElement.readyState !== 0) { // HAVE_NOTHING + Promise.resolve().then(function () { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.MEDIA_INFO, _this.mediaInfo); + }); + } + } + else if (event === _player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.STATISTICS_INFO) { + if (this._mediaElement != null && this._mediaElement.readyState !== 0) { + Promise.resolve().then(function () { + _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.STATISTICS_INFO, _this.statisticsInfo); + }); + } + } + this._emitter.addListener(event, listener); + }; + NativePlayer.prototype.off = function (event, listener) { + this._emitter.removeListener(event, listener); + }; + NativePlayer.prototype.attachMediaElement = function (mediaElement) { + this._mediaElement = mediaElement; + mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata); + if (this._pendingSeekTime != null) { + try { + mediaElement.currentTime = this._pendingSeekTime; + this._pendingSeekTime = null; + } + catch (e) { + // IE11 may throw InvalidStateError if readyState === 0 + // Defer set currentTime operation after loadedmetadata + } + } + }; + NativePlayer.prototype.detachMediaElement = function () { + if (this._mediaElement) { + this._mediaElement.src = ''; + this._mediaElement.removeAttribute('src'); + this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata); + this._mediaElement = null; + } + if (this._statisticsReporter != null) { + window.clearInterval(this._statisticsReporter); + this._statisticsReporter = null; + } + }; + NativePlayer.prototype.load = function () { + if (!this._mediaElement) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.IllegalStateException('HTMLMediaElement must be attached before load()!'); + } + this._mediaElement.src = this._mediaDataSource.url; + if (this._mediaElement.readyState > 0) { + this._mediaElement.currentTime = 0; + } + this._mediaElement.preload = 'auto'; + this._mediaElement.load(); + this._statisticsReporter = window.setInterval(this._reportStatisticsInfo.bind(this), this._config.statisticsInfoReportInterval); + }; + NativePlayer.prototype.unload = function () { + if (this._mediaElement) { + this._mediaElement.src = ''; + this._mediaElement.removeAttribute('src'); + } + if (this._statisticsReporter != null) { + window.clearInterval(this._statisticsReporter); + this._statisticsReporter = null; + } + }; + NativePlayer.prototype.play = function () { + return this._mediaElement.play(); + }; + NativePlayer.prototype.pause = function () { + this._mediaElement.pause(); + }; + Object.defineProperty(NativePlayer.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(NativePlayer.prototype, "buffered", { + get: function () { + return this._mediaElement.buffered; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(NativePlayer.prototype, "duration", { + get: function () { + return this._mediaElement.duration; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(NativePlayer.prototype, "volume", { + get: function () { + return this._mediaElement.volume; + }, + set: function (value) { + this._mediaElement.volume = value; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(NativePlayer.prototype, "muted", { + get: function () { + return this._mediaElement.muted; + }, + set: function (muted) { + this._mediaElement.muted = muted; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(NativePlayer.prototype, "currentTime", { + get: function () { + if (this._mediaElement) { + return this._mediaElement.currentTime; + } + return 0; + }, + set: function (seconds) { + if (this._mediaElement) { + this._mediaElement.currentTime = seconds; + } + else { + this._pendingSeekTime = seconds; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(NativePlayer.prototype, "mediaInfo", { + get: function () { + var mediaPrefix = (this._mediaElement instanceof HTMLAudioElement) ? 'audio/' : 'video/'; + var info = { + mimeType: mediaPrefix + this._mediaDataSource.type + }; + if (this._mediaElement) { + info.duration = Math.floor(this._mediaElement.duration * 1000); + if (this._mediaElement instanceof HTMLVideoElement) { + info.width = this._mediaElement.videoWidth; + info.height = this._mediaElement.videoHeight; + } + } + return info; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(NativePlayer.prototype, "statisticsInfo", { + get: function () { + var info = { + playerType: this._type, + url: this._mediaDataSource.url + }; + if (!(this._mediaElement instanceof HTMLVideoElement)) { + return info; + } + var hasQualityInfo = true; + var decoded = 0; + var dropped = 0; + if (this._mediaElement.getVideoPlaybackQuality) { + var quality = this._mediaElement.getVideoPlaybackQuality(); + decoded = quality.totalVideoFrames; + dropped = quality.droppedVideoFrames; + } + else if (this._mediaElement.webkitDecodedFrameCount != undefined) { + decoded = this._mediaElement.webkitDecodedFrameCount; + dropped = this._mediaElement.webkitDroppedFrameCount; + } + else { + hasQualityInfo = false; + } + if (hasQualityInfo) { + info.decodedFrames = decoded; + info.droppedFrames = dropped; + } + return info; + }, + enumerable: false, + configurable: true + }); + NativePlayer.prototype._onvLoadedMetadata = function (e) { + if (this._pendingSeekTime != null) { + this._mediaElement.currentTime = this._pendingSeekTime; + this._pendingSeekTime = null; + } + this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.MEDIA_INFO, this.mediaInfo); + }; + NativePlayer.prototype._reportStatisticsInfo = function () { + this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.STATISTICS_INFO, this.statisticsInfo); + }; + return NativePlayer; +}()); +/* harmony default export */ __webpack_exports__["default"] = (NativePlayer); + + +/***/ }), + +/***/ "./src/player/player-errors.js": +/*!*************************************!*\ + !*** ./src/player/player-errors.js ***! + \*************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ErrorTypes": function() { return /* binding */ ErrorTypes; }, +/* harmony export */ "ErrorDetails": function() { return /* binding */ ErrorDetails; } +/* harmony export */ }); +/* harmony import */ var _io_loader_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../io/loader.js */ "./src/io/loader.js"); +/* harmony import */ var _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../demux/demux-errors.js */ "./src/demux/demux-errors.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +var ErrorTypes = { + NETWORK_ERROR: 'NetworkError', + MEDIA_ERROR: 'MediaError', + OTHER_ERROR: 'OtherError' +}; +var ErrorDetails = { + NETWORK_EXCEPTION: _io_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.EXCEPTION, + NETWORK_STATUS_CODE_INVALID: _io_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.HTTP_STATUS_CODE_INVALID, + NETWORK_TIMEOUT: _io_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.CONNECTING_TIMEOUT, + NETWORK_UNRECOVERABLE_EARLY_EOF: _io_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.UNRECOVERABLE_EARLY_EOF, + MEDIA_MSE_ERROR: 'MediaMSEError', + MEDIA_FORMAT_ERROR: _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_1__.default.FORMAT_ERROR, + MEDIA_FORMAT_UNSUPPORTED: _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_1__.default.FORMAT_UNSUPPORTED, + MEDIA_CODEC_UNSUPPORTED: _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_1__.default.CODEC_UNSUPPORTED +}; + + +/***/ }), + +/***/ "./src/player/player-events.js": +/*!*************************************!*\ + !*** ./src/player/player-events.js ***! + \*************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var PlayerEvents = { + ERROR: 'error', + LOADING_COMPLETE: 'loading_complete', + RECOVERED_EARLY_EOF: 'recovered_early_eof', + MEDIA_INFO: 'media_info', + METADATA_ARRIVED: 'metadata_arrived', + SCRIPTDATA_ARRIVED: 'scriptdata_arrived', + STATISTICS_INFO: 'statistics_info' +}; +/* harmony default export */ __webpack_exports__["default"] = (PlayerEvents); + + +/***/ }), + +/***/ "./src/remux/aac-silent.js": +/*!*********************************!*\ + !*** ./src/remux/aac-silent.js ***! + \*********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js) + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var AAC = /** @class */ (function () { + function AAC() { + } + AAC.getSilentFrame = function (codec, channelCount) { + if (codec === 'mp4a.40.2') { + // handle LC-AAC + if (channelCount === 1) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]); + } + else if (channelCount === 2) { + return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]); + } + else if (channelCount === 3) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]); + } + else if (channelCount === 4) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]); + } + else if (channelCount === 5) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]); + } + else if (channelCount === 6) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]); + } + } + else { + // handle HE-AAC (mp4a.40.5 / mp4a.40.29) + if (channelCount === 1) { + // ffmpeg -y -f lavfi -i "aevalsrc=0:d=0.05" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac + return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]); + } + else if (channelCount === 2) { + // ffmpeg -y -f lavfi -i "aevalsrc=0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac + return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]); + } + else if (channelCount === 3) { + // ffmpeg -y -f lavfi -i "aevalsrc=0|0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac + return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]); + } + } + return null; + }; + return AAC; +}()); +/* harmony default export */ __webpack_exports__["default"] = (AAC); + + +/***/ }), + +/***/ "./src/remux/mp4-generator.js": +/*!************************************!*\ + !*** ./src/remux/mp4-generator.js ***! + \************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js) + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12) +var MP4 = /** @class */ (function () { + function MP4() { + } + MP4.init = function () { + MP4.types = { + avc1: [], avcC: [], btrt: [], dinf: [], + dref: [], esds: [], ftyp: [], hdlr: [], + mdat: [], mdhd: [], mdia: [], mfhd: [], + minf: [], moof: [], moov: [], mp4a: [], + mvex: [], mvhd: [], sdtp: [], stbl: [], + stco: [], stsc: [], stsd: [], stsz: [], + stts: [], tfdt: [], tfhd: [], traf: [], + trak: [], trun: [], trex: [], tkhd: [], + vmhd: [], smhd: [], '.mp3': [] + }; + for (var name_1 in MP4.types) { + if (MP4.types.hasOwnProperty(name_1)) { + MP4.types[name_1] = [ + name_1.charCodeAt(0), + name_1.charCodeAt(1), + name_1.charCodeAt(2), + name_1.charCodeAt(3) + ]; + } + } + var constants = MP4.constants = {}; + constants.FTYP = new Uint8Array([ + 0x69, 0x73, 0x6F, 0x6D, + 0x0, 0x0, 0x0, 0x1, + 0x69, 0x73, 0x6F, 0x6D, + 0x61, 0x76, 0x63, 0x31 // avc1 + ]); + constants.STSD_PREFIX = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01 // entry_count + ]); + constants.STTS = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 // entry_count + ]); + constants.STSC = constants.STCO = constants.STTS; + constants.STSZ = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 // sample_count + ]); + constants.HDLR_VIDEO = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x76, 0x69, 0x64, 0x65, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x56, 0x69, 0x64, 0x65, + 0x6F, 0x48, 0x61, 0x6E, + 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler + ]); + constants.HDLR_AUDIO = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x73, 0x6F, 0x75, 0x6E, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x53, 0x6F, 0x75, 0x6E, + 0x64, 0x48, 0x61, 0x6E, + 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler + ]); + constants.DREF = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x0C, + 0x75, 0x72, 0x6C, 0x20, + 0x00, 0x00, 0x00, 0x01 // version(0) + flags + ]); + // Sound media header + constants.SMHD = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2) + ]); + // video media header + constants.VMHD = new Uint8Array([ + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 + ]); + }; + // Generate a box + MP4.box = function (type) { + var size = 8; + var result = null; + var datas = Array.prototype.slice.call(arguments, 1); + var arrayCount = datas.length; + for (var i = 0; i < arrayCount; i++) { + size += datas[i].byteLength; + } + result = new Uint8Array(size); + result[0] = (size >>> 24) & 0xFF; // size + result[1] = (size >>> 16) & 0xFF; + result[2] = (size >>> 8) & 0xFF; + result[3] = (size) & 0xFF; + result.set(type, 4); // type + var offset = 8; + for (var i = 0; i < arrayCount; i++) { // data body + result.set(datas[i], offset); + offset += datas[i].byteLength; + } + return result; + }; + // emit ftyp & moov + MP4.generateInitSegment = function (meta) { + var ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP); + var moov = MP4.moov(meta); + var result = new Uint8Array(ftyp.byteLength + moov.byteLength); + result.set(ftyp, 0); + result.set(moov, ftyp.byteLength); + return result; + }; + // Movie metadata box + MP4.moov = function (meta) { + var mvhd = MP4.mvhd(meta.timescale, meta.duration); + var trak = MP4.trak(meta); + var mvex = MP4.mvex(meta); + return MP4.box(MP4.types.moov, mvhd, trak, mvex); + }; + // Movie header box + MP4.mvhd = function (timescale, duration) { + return MP4.box(MP4.types.mvhd, new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + (timescale >>> 24) & 0xFF, + (timescale >>> 16) & 0xFF, + (timescale >>> 8) & 0xFF, + (timescale) & 0xFF, + (duration >>> 24) & 0xFF, + (duration >>> 16) & 0xFF, + (duration >>> 8) & 0xFF, + (duration) & 0xFF, + 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID + ])); + }; + // Track box + MP4.trak = function (meta) { + return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta)); + }; + // Track header box + MP4.tkhd = function (meta) { + var trackId = meta.id, duration = meta.duration; + var width = meta.presentWidth, height = meta.presentHeight; + return MP4.box(MP4.types.tkhd, new Uint8Array([ + 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + (trackId >>> 24) & 0xFF, + (trackId >>> 16) & 0xFF, + (trackId >>> 8) & 0xFF, + (trackId) & 0xFF, + 0x00, 0x00, 0x00, 0x00, + (duration >>> 24) & 0xFF, + (duration >>> 16) & 0xFF, + (duration >>> 8) & 0xFF, + (duration) & 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, + (width >>> 8) & 0xFF, + (width) & 0xFF, + 0x00, 0x00, + (height >>> 8) & 0xFF, + (height) & 0xFF, + 0x00, 0x00 + ])); + }; + // Media Box + MP4.mdia = function (meta) { + return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta)); + }; + // Media header box + MP4.mdhd = function (meta) { + var timescale = meta.timescale; + var duration = meta.duration; + return MP4.box(MP4.types.mdhd, new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + (timescale >>> 24) & 0xFF, + (timescale >>> 16) & 0xFF, + (timescale >>> 8) & 0xFF, + (timescale) & 0xFF, + (duration >>> 24) & 0xFF, + (duration >>> 16) & 0xFF, + (duration >>> 8) & 0xFF, + (duration) & 0xFF, + 0x55, 0xC4, + 0x00, 0x00 // pre_defined = 0 + ])); + }; + // Media handler reference box + MP4.hdlr = function (meta) { + var data = null; + if (meta.type === 'audio') { + data = MP4.constants.HDLR_AUDIO; + } + else { + data = MP4.constants.HDLR_VIDEO; + } + return MP4.box(MP4.types.hdlr, data); + }; + // Media infomation box + MP4.minf = function (meta) { + var xmhd = null; + if (meta.type === 'audio') { + xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD); + } + else { + xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD); + } + return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta)); + }; + // Data infomation box + MP4.dinf = function () { + var result = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, MP4.constants.DREF)); + return result; + }; + // Sample table box + MP4.stbl = function (meta) { + var result = MP4.box(MP4.types.stbl, // type: stbl + MP4.stsd(meta), // Sample Description Table + MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample + MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk + MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size + MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset + ); + return result; + }; + // Sample description box + MP4.stsd = function (meta) { + if (meta.type === 'audio') { + if (meta.codec === 'mp3') { + return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta)); + } + // else: aac -> mp4a + return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta)); + } + else { + return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta)); + } + }; + MP4.mp3 = function (meta) { + var channelCount = meta.channelCount; + var sampleRate = meta.audioSampleRate; + var data = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, channelCount, + 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, + (sampleRate >>> 8) & 0xFF, + (sampleRate) & 0xFF, + 0x00, 0x00 + ]); + return MP4.box(MP4.types['.mp3'], data); + }; + MP4.mp4a = function (meta) { + var channelCount = meta.channelCount; + var sampleRate = meta.audioSampleRate; + var data = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, channelCount, + 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, + (sampleRate >>> 8) & 0xFF, + (sampleRate) & 0xFF, + 0x00, 0x00 + ]); + return MP4.box(MP4.types.mp4a, data, MP4.esds(meta)); + }; + MP4.esds = function (meta) { + var config = meta.config || []; + var configSize = config.length; + var data = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x03, + 0x17 + configSize, + 0x00, 0x01, + 0x00, + 0x04, + 0x0F + configSize, + 0x40, + 0x15, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x05 // descriptor_type + ].concat([ + configSize + ]).concat(config).concat([ + 0x06, 0x01, 0x02 // GASpecificConfig + ])); + return MP4.box(MP4.types.esds, data); + }; + MP4.avc1 = function (meta) { + var avcc = meta.avcc; + var width = meta.codecWidth, height = meta.codecHeight; + var data = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + (width >>> 8) & 0xFF, + (width) & 0xFF, + (height >>> 8) & 0xFF, + (height) & 0xFF, + 0x00, 0x48, 0x00, 0x00, + 0x00, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, + 0x0A, + 0x78, 0x71, 0x71, 0x2F, + 0x66, 0x6C, 0x76, 0x2E, + 0x6A, 0x73, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x18, + 0xFF, 0xFF // pre_defined = -1 + ]); + return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc)); + }; + // Movie Extends box + MP4.mvex = function (meta) { + return MP4.box(MP4.types.mvex, MP4.trex(meta)); + }; + // Track Extends box + MP4.trex = function (meta) { + var trackId = meta.id; + var data = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + (trackId >>> 24) & 0xFF, + (trackId >>> 16) & 0xFF, + (trackId >>> 8) & 0xFF, + (trackId) & 0xFF, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x01 // default_sample_flags + ]); + return MP4.box(MP4.types.trex, data); + }; + // Movie fragment box + MP4.moof = function (track, baseMediaDecodeTime) { + return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime)); + }; + MP4.mfhd = function (sequenceNumber) { + var data = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + (sequenceNumber >>> 24) & 0xFF, + (sequenceNumber >>> 16) & 0xFF, + (sequenceNumber >>> 8) & 0xFF, + (sequenceNumber) & 0xFF + ]); + return MP4.box(MP4.types.mfhd, data); + }; + // Track fragment box + MP4.traf = function (track, baseMediaDecodeTime) { + var trackId = track.id; + // Track fragment header box + var tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + (trackId >>> 24) & 0xFF, + (trackId >>> 16) & 0xFF, + (trackId >>> 8) & 0xFF, + (trackId) & 0xFF + ])); + // Track Fragment Decode Time + var tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, + (baseMediaDecodeTime >>> 24) & 0xFF, + (baseMediaDecodeTime >>> 16) & 0xFF, + (baseMediaDecodeTime >>> 8) & 0xFF, + (baseMediaDecodeTime) & 0xFF + ])); + var sdtp = MP4.sdtp(track); + var trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8); + return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp); + }; + // Sample Dependency Type box + MP4.sdtp = function (track) { + var samples = track.samples || []; + var sampleCount = samples.length; + var data = new Uint8Array(4 + sampleCount); + // 0~4 bytes: version(0) & flags + for (var i = 0; i < sampleCount; i++) { + var flags = samples[i].flags; + data[i + 4] = (flags.isLeading << 6) // is_leading: 2 (bit) + | (flags.dependsOn << 4) // sample_depends_on + | (flags.isDependedOn << 2) // sample_is_depended_on + | (flags.hasRedundancy); // sample_has_redundancy + } + return MP4.box(MP4.types.sdtp, data); + }; + // Track fragment run box + MP4.trun = function (track, offset) { + var samples = track.samples || []; + var sampleCount = samples.length; + var dataSize = 12 + 16 * sampleCount; + var data = new Uint8Array(dataSize); + offset += 8 + dataSize; + data.set([ + 0x00, 0x00, 0x0F, 0x01, + (sampleCount >>> 24) & 0xFF, + (sampleCount >>> 16) & 0xFF, + (sampleCount >>> 8) & 0xFF, + (sampleCount) & 0xFF, + (offset >>> 24) & 0xFF, + (offset >>> 16) & 0xFF, + (offset >>> 8) & 0xFF, + (offset) & 0xFF + ], 0); + for (var i = 0; i < sampleCount; i++) { + var duration = samples[i].duration; + var size = samples[i].size; + var flags = samples[i].flags; + var cts = samples[i].cts; + data.set([ + (duration >>> 24) & 0xFF, + (duration >>> 16) & 0xFF, + (duration >>> 8) & 0xFF, + (duration) & 0xFF, + (size >>> 24) & 0xFF, + (size >>> 16) & 0xFF, + (size >>> 8) & 0xFF, + (size) & 0xFF, + (flags.isLeading << 2) | flags.dependsOn, + (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync, + 0x00, 0x00, + (cts >>> 24) & 0xFF, + (cts >>> 16) & 0xFF, + (cts >>> 8) & 0xFF, + (cts) & 0xFF + ], 12 + 16 * i); + } + return MP4.box(MP4.types.trun, data); + }; + MP4.mdat = function (data) { + return MP4.box(MP4.types.mdat, data); + }; + return MP4; +}()); +MP4.init(); +/* harmony default export */ __webpack_exports__["default"] = (MP4); + + +/***/ }), + +/***/ "./src/remux/mp4-remuxer.js": +/*!**********************************!*\ + !*** ./src/remux/mp4-remuxer.js ***! + \**********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js"); +/* harmony import */ var _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mp4-generator.js */ "./src/remux/mp4-generator.js"); +/* harmony import */ var _aac_silent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./aac-silent.js */ "./src/remux/aac-silent.js"); +/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js"); +/* harmony import */ var _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/media-segment-info.js */ "./src/core/media-segment-info.js"); +/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + +// Fragmented mp4 remuxer +var MP4Remuxer = /** @class */ (function () { + function MP4Remuxer(config) { + this.TAG = 'MP4Remuxer'; + this._config = config; + this._isLive = (config.isLive === true) ? true : false; + this._dtsBase = -1; + this._dtsBaseInited = false; + this._audioDtsBase = Infinity; + this._videoDtsBase = Infinity; + this._audioNextDts = undefined; + this._videoNextDts = undefined; + this._audioStashedLastSample = null; + this._videoStashedLastSample = null; + this._audioMeta = null; + this._videoMeta = null; + this._audioSegmentInfoList = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.MediaSegmentInfoList('audio'); + this._videoSegmentInfoList = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.MediaSegmentInfoList('video'); + this._onInitSegment = null; + this._onMediaSegment = null; + // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment + // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412 + this._forceFirstIDR = (_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.chrome && + (_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.version.major < 50 || + (_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.version.major === 50 && _utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.version.build < 2661))) ? true : false; + // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking + // Make audio beginDts equals with video beginDts, in order to fix seek freeze + this._fillSilentAfterSeek = (_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.msedge || _utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.msie); + // While only FireFox supports 'audio/mp4, codecs="mp3"', use 'audio/mpeg' for chrome, safari, ... + this._mp3UseMpegAudio = !_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.firefox; + this._fillAudioTimestampGap = this._config.fixAudioTimestampGap; + } + MP4Remuxer.prototype.destroy = function () { + this._dtsBase = -1; + this._dtsBaseInited = false; + this._audioMeta = null; + this._videoMeta = null; + this._audioSegmentInfoList.clear(); + this._audioSegmentInfoList = null; + this._videoSegmentInfoList.clear(); + this._videoSegmentInfoList = null; + this._onInitSegment = null; + this._onMediaSegment = null; + }; + MP4Remuxer.prototype.bindDataSource = function (producer) { + producer.onDataAvailable = this.remux.bind(this); + producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this); + return this; + }; + Object.defineProperty(MP4Remuxer.prototype, "onInitSegment", { + /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void + InitSegment: { + type: string, + data: ArrayBuffer, + codec: string, + container: string + } + */ + get: function () { + return this._onInitSegment; + }, + set: function (callback) { + this._onInitSegment = callback; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(MP4Remuxer.prototype, "onMediaSegment", { + /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void + MediaSegment: { + type: string, + data: ArrayBuffer, + sampleCount: int32 + info: MediaSegmentInfo + } + */ + get: function () { + return this._onMediaSegment; + }, + set: function (callback) { + this._onMediaSegment = callback; + }, + enumerable: false, + configurable: true + }); + MP4Remuxer.prototype.insertDiscontinuity = function () { + this._audioNextDts = this._videoNextDts = undefined; + }; + MP4Remuxer.prototype.seek = function (originalDts) { + this._audioStashedLastSample = null; + this._videoStashedLastSample = null; + this._videoSegmentInfoList.clear(); + this._audioSegmentInfoList.clear(); + }; + MP4Remuxer.prototype.remux = function (audioTrack, videoTrack) { + if (!this._onMediaSegment) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__.IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!'); + } + if (!this._dtsBaseInited) { + this._calculateDtsBase(audioTrack, videoTrack); + } + this._remuxVideo(videoTrack); + this._remuxAudio(audioTrack); + }; + MP4Remuxer.prototype._onTrackMetadataReceived = function (type, metadata) { + var metabox = null; + var container = 'mp4'; + var codec = metadata.codec; + if (type === 'audio') { + this._audioMeta = metadata; + if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) { + // 'audio/mpeg' for MP3 audio track + container = 'mpeg'; + codec = ''; + metabox = new Uint8Array(); + } + else { + // 'audio/mp4, codecs="codec"' + metabox = _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.generateInitSegment(metadata); + } + } + else if (type === 'video') { + this._videoMeta = metadata; + metabox = _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.generateInitSegment(metadata); + } + else { + return; + } + // dispatch metabox (Initialization Segment) + if (!this._onInitSegment) { + throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__.IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!'); + } + this._onInitSegment(type, { + type: type, + data: metabox.buffer, + codec: codec, + container: type + "/" + container, + mediaDuration: metadata.duration // in timescale 1000 (milliseconds) + }); + }; + MP4Remuxer.prototype._calculateDtsBase = function (audioTrack, videoTrack) { + if (this._dtsBaseInited) { + return; + } + if (audioTrack.samples && audioTrack.samples.length) { + this._audioDtsBase = audioTrack.samples[0].dts; + } + if (videoTrack.samples && videoTrack.samples.length) { + this._videoDtsBase = videoTrack.samples[0].dts; + } + this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase); + this._dtsBaseInited = true; + }; + MP4Remuxer.prototype.flushStashedSamples = function () { + var videoSample = this._videoStashedLastSample; + var audioSample = this._audioStashedLastSample; + var videoTrack = { + type: 'video', + id: 1, + sequenceNumber: 0, + samples: [], + length: 0 + }; + if (videoSample != null) { + videoTrack.samples.push(videoSample); + videoTrack.length = videoSample.length; + } + var audioTrack = { + type: 'audio', + id: 2, + sequenceNumber: 0, + samples: [], + length: 0 + }; + if (audioSample != null) { + audioTrack.samples.push(audioSample); + audioTrack.length = audioSample.length; + } + this._videoStashedLastSample = null; + this._audioStashedLastSample = null; + this._remuxVideo(videoTrack, true); + this._remuxAudio(audioTrack, true); + }; + MP4Remuxer.prototype._remuxAudio = function (audioTrack, force) { + if (this._audioMeta == null) { + return; + } + var track = audioTrack; + var samples = track.samples; + var dtsCorrection = undefined; + var firstDts = -1, lastDts = -1, lastPts = -1; + var refSampleDuration = this._audioMeta.refSampleDuration; + var mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio; + var firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined; + var insertPrefixSilentFrame = false; + if (!samples || samples.length === 0) { + return; + } + if (samples.length === 1 && !force) { + // If [sample count in current batch] === 1 && (force != true) + // Ignore and keep in demuxer's queue + return; + } // else if (force === true) do remux + var offset = 0; + var mdatbox = null; + var mdatBytes = 0; + // calculate initial mdat size + if (mpegRawTrack) { + // for raw mpeg buffer + offset = 0; + mdatBytes = track.length; + } + else { + // for fmp4 mdat box + offset = 8; // size + type + mdatBytes = 8 + track.length; + } + var lastSample = null; + // Pop the lastSample and waiting for stash + if (samples.length > 1) { + lastSample = samples.pop(); + mdatBytes -= lastSample.length; + } + // Insert [stashed lastSample in the previous batch] to the front + if (this._audioStashedLastSample != null) { + var sample = this._audioStashedLastSample; + this._audioStashedLastSample = null; + samples.unshift(sample); + mdatBytes += sample.length; + } + // Stash the lastSample of current batch, waiting for next batch + if (lastSample != null) { + this._audioStashedLastSample = lastSample; + } + var firstSampleOriginalDts = samples[0].dts - this._dtsBase; + // calculate dtsCorrection + if (this._audioNextDts) { + dtsCorrection = firstSampleOriginalDts - this._audioNextDts; + } + else { // this._audioNextDts == undefined + if (this._audioSegmentInfoList.isEmpty()) { + dtsCorrection = 0; + if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) { + if (this._audioMeta.originalCodec !== 'mp3') { + insertPrefixSilentFrame = true; + } + } + } + else { + var lastSample_1 = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts); + if (lastSample_1 != null) { + var distance = (firstSampleOriginalDts - (lastSample_1.originalDts + lastSample_1.duration)); + if (distance <= 3) { + distance = 0; + } + var expectedDts = lastSample_1.dts + lastSample_1.duration + distance; + dtsCorrection = firstSampleOriginalDts - expectedDts; + } + else { // lastSample == null, cannot found + dtsCorrection = 0; + } + } + } + if (insertPrefixSilentFrame) { + // align audio segment beginDts to match with current video segment's beginDts + var firstSampleDts = firstSampleOriginalDts - dtsCorrection; + var videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts); + if (videoSegment != null && videoSegment.beginDts < firstSampleDts) { + var silentUnit = _aac_silent_js__WEBPACK_IMPORTED_MODULE_2__.default.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount); + if (silentUnit) { + var dts = videoSegment.beginDts; + var silentFrameDuration = firstSampleDts - videoSegment.beginDts; + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, "InsertPrefixSilentAudio: dts: " + dts + ", duration: " + silentFrameDuration); + samples.unshift({ unit: silentUnit, dts: dts, pts: dts }); + mdatBytes += silentUnit.byteLength; + } // silentUnit == null: Cannot generate, skip + } + else { + insertPrefixSilentFrame = false; + } + } + var mp4Samples = []; + // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples + for (var i = 0; i < samples.length; i++) { + var sample = samples[i]; + var unit = sample.unit; + var originalDts = sample.dts - this._dtsBase; + var dts = originalDts; + var needFillSilentFrames = false; + var silentFrames = null; + var sampleDuration = 0; + if (originalDts < -0.001) { + continue; //pass the first sample with the invalid dts + } + if (this._audioMeta.codec !== 'mp3') { + // for AAC codec, we need to keep dts increase based on refSampleDuration + var curRefDts = originalDts; + var maxAudioFramesDrift = 3; + if (this._audioNextDts) { + curRefDts = this._audioNextDts; + } + dtsCorrection = originalDts - curRefDts; + if (dtsCorrection <= -maxAudioFramesDrift * refSampleDuration) { + // If we're overlapping by more than maxAudioFramesDrift number of frame, drop this sample + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Dropping 1 audio frame (originalDts: " + originalDts + " ms ,curRefDts: " + curRefDts + " ms) due to dtsCorrection: " + dtsCorrection + " ms overlap."); + continue; + } + else if (dtsCorrection >= maxAudioFramesDrift * refSampleDuration && this._fillAudioTimestampGap && !_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.safari) { + // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap + needFillSilentFrames = true; + // We need to insert silent frames to fill timestamp gap + var frameCount = Math.floor(dtsCorrection / refSampleDuration); + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' + + 'Silent frames will be generated to avoid unsync.\n' + + ("originalDts: " + originalDts + " ms, curRefDts: " + curRefDts + " ms, ") + + ("dtsCorrection: " + Math.round(dtsCorrection) + " ms, generate: " + frameCount + " frames")); + dts = Math.floor(curRefDts); + sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts; + var silentUnit = _aac_silent_js__WEBPACK_IMPORTED_MODULE_2__.default.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount); + if (silentUnit == null) { + _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Unable to generate silent frame for ' + + (this._audioMeta.originalCodec + " with " + this._audioMeta.channelCount + " channels, repeat last frame")); + // Repeat last frame + silentUnit = unit; + } + silentFrames = []; + for (var j = 0; j < frameCount; j++) { + curRefDts = curRefDts + refSampleDuration; + var intDts = Math.floor(curRefDts); // change to integer + var intDuration = Math.floor(curRefDts + refSampleDuration) - intDts; + var frame = { + dts: intDts, + pts: intDts, + cts: 0, + unit: silentUnit, + size: silentUnit.byteLength, + duration: intDuration, + originalDts: originalDts, + flags: { + isLeading: 0, + dependsOn: 1, + isDependedOn: 0, + hasRedundancy: 0 + } + }; + silentFrames.push(frame); + mdatBytes += frame.size; + ; + } + this._audioNextDts = curRefDts + refSampleDuration; + } + else { + dts = Math.floor(curRefDts); + sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts; + this._audioNextDts = curRefDts + refSampleDuration; + } + } + else { + // keep the original dts calculate algorithm for mp3 + dts = originalDts - dtsCorrection; + if (i !== samples.length - 1) { + var nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection; + sampleDuration = nextDts - dts; + } + else { // the last sample + if (lastSample != null) { // use stashed sample's dts to calculate sample duration + var nextDts = lastSample.dts - this._dtsBase - dtsCorrection; + sampleDuration = nextDts - dts; + } + else if (mp4Samples.length >= 1) { // use second last sample duration + sampleDuration = mp4Samples[mp4Samples.length - 1].duration; + } + else { // the only one sample, use reference sample duration + sampleDuration = Math.floor(refSampleDuration); + } + } + this._audioNextDts = dts + sampleDuration; + } + if (firstDts === -1) { + firstDts = dts; + } + mp4Samples.push({ + dts: dts, + pts: dts, + cts: 0, + unit: sample.unit, + size: sample.unit.byteLength, + duration: sampleDuration, + originalDts: originalDts, + flags: { + isLeading: 0, + dependsOn: 1, + isDependedOn: 0, + hasRedundancy: 0 + } + }); + if (needFillSilentFrames) { + // Silent frames should be inserted after wrong-duration frame + mp4Samples.push.apply(mp4Samples, silentFrames); + } + } + if (mp4Samples.length === 0) { + //no samples need to remux + track.samples = []; + track.length = 0; + return; + } + // allocate mdatbox + if (mpegRawTrack) { + // allocate for raw mpeg buffer + mdatbox = new Uint8Array(mdatBytes); + } + else { + // allocate for fmp4 mdat box + mdatbox = new Uint8Array(mdatBytes); + // size field + mdatbox[0] = (mdatBytes >>> 24) & 0xFF; + mdatbox[1] = (mdatBytes >>> 16) & 0xFF; + mdatbox[2] = (mdatBytes >>> 8) & 0xFF; + mdatbox[3] = (mdatBytes) & 0xFF; + // type field (fourCC) + mdatbox.set(_mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.types.mdat, 4); + } + // Write samples into mdatbox + for (var i = 0; i < mp4Samples.length; i++) { + var unit = mp4Samples[i].unit; + mdatbox.set(unit, offset); + offset += unit.byteLength; + } + var latest = mp4Samples[mp4Samples.length - 1]; + lastDts = latest.dts + latest.duration; + //this._audioNextDts = lastDts; + // fill media segment info & add to info list + var info = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.MediaSegmentInfo(); + info.beginDts = firstDts; + info.endDts = lastDts; + info.beginPts = firstDts; + info.endPts = lastDts; + info.originalBeginDts = mp4Samples[0].originalDts; + info.originalEndDts = latest.originalDts + latest.duration; + info.firstSample = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(mp4Samples[0].dts, mp4Samples[0].pts, mp4Samples[0].duration, mp4Samples[0].originalDts, false); + info.lastSample = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(latest.dts, latest.pts, latest.duration, latest.originalDts, false); + if (!this._isLive) { + this._audioSegmentInfoList.append(info); + } + track.samples = mp4Samples; + track.sequenceNumber++; + var moofbox = null; + if (mpegRawTrack) { + // Generate empty buffer, because useless for raw mpeg + moofbox = new Uint8Array(); + } + else { + // Generate moof for fmp4 segment + moofbox = _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.moof(track, firstDts); + } + track.samples = []; + track.length = 0; + var segment = { + type: 'audio', + data: this._mergeBoxes(moofbox, mdatbox).buffer, + sampleCount: mp4Samples.length, + info: info + }; + if (mpegRawTrack && firstSegmentAfterSeek) { + // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer + // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer. + segment.timestampOffset = firstDts; + } + this._onMediaSegment('audio', segment); + }; + MP4Remuxer.prototype._remuxVideo = function (videoTrack, force) { + if (this._videoMeta == null) { + return; + } + var track = videoTrack; + var samples = track.samples; + var dtsCorrection = undefined; + var firstDts = -1, lastDts = -1; + var firstPts = -1, lastPts = -1; + if (!samples || samples.length === 0) { + return; + } + if (samples.length === 1 && !force) { + // If [sample count in current batch] === 1 && (force != true) + // Ignore and keep in demuxer's queue + return; + } // else if (force === true) do remux + var offset = 8; + var mdatbox = null; + var mdatBytes = 8 + videoTrack.length; + var lastSample = null; + // Pop the lastSample and waiting for stash + if (samples.length > 1) { + lastSample = samples.pop(); + mdatBytes -= lastSample.length; + } + // Insert [stashed lastSample in the previous batch] to the front + if (this._videoStashedLastSample != null) { + var sample = this._videoStashedLastSample; + this._videoStashedLastSample = null; + samples.unshift(sample); + mdatBytes += sample.length; + } + // Stash the lastSample of current batch, waiting for next batch + if (lastSample != null) { + this._videoStashedLastSample = lastSample; + } + var firstSampleOriginalDts = samples[0].dts - this._dtsBase; + // calculate dtsCorrection + if (this._videoNextDts) { + dtsCorrection = firstSampleOriginalDts - this._videoNextDts; + } + else { // this._videoNextDts == undefined + if (this._videoSegmentInfoList.isEmpty()) { + dtsCorrection = 0; + } + else { + var lastSample_2 = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts); + if (lastSample_2 != null) { + var distance = (firstSampleOriginalDts - (lastSample_2.originalDts + lastSample_2.duration)); + if (distance <= 3) { + distance = 0; + } + var expectedDts = lastSample_2.dts + lastSample_2.duration + distance; + dtsCorrection = firstSampleOriginalDts - expectedDts; + } + else { // lastSample == null, cannot found + dtsCorrection = 0; + } + } + } + var info = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.MediaSegmentInfo(); + var mp4Samples = []; + // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples + for (var i = 0; i < samples.length; i++) { + var sample = samples[i]; + var originalDts = sample.dts - this._dtsBase; + var isKeyframe = sample.isKeyframe; + var dts = originalDts - dtsCorrection; + var cts = sample.cts; + var pts = dts + cts; + if (firstDts === -1) { + firstDts = dts; + firstPts = pts; + } + var sampleDuration = 0; + if (i !== samples.length - 1) { + var nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection; + sampleDuration = nextDts - dts; + } + else { // the last sample + if (lastSample != null) { // use stashed sample's dts to calculate sample duration + var nextDts = lastSample.dts - this._dtsBase - dtsCorrection; + sampleDuration = nextDts - dts; + } + else if (mp4Samples.length >= 1) { // use second last sample duration + sampleDuration = mp4Samples[mp4Samples.length - 1].duration; + } + else { // the only one sample, use reference sample duration + sampleDuration = Math.floor(this._videoMeta.refSampleDuration); + } + } + if (isKeyframe) { + var syncPoint = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(dts, pts, sampleDuration, sample.dts, true); + syncPoint.fileposition = sample.fileposition; + info.appendSyncPoint(syncPoint); + } + mp4Samples.push({ + dts: dts, + pts: pts, + cts: cts, + units: sample.units, + size: sample.length, + isKeyframe: isKeyframe, + duration: sampleDuration, + originalDts: originalDts, + flags: { + isLeading: 0, + dependsOn: isKeyframe ? 2 : 1, + isDependedOn: isKeyframe ? 1 : 0, + hasRedundancy: 0, + isNonSync: isKeyframe ? 0 : 1 + } + }); + } + // allocate mdatbox + mdatbox = new Uint8Array(mdatBytes); + mdatbox[0] = (mdatBytes >>> 24) & 0xFF; + mdatbox[1] = (mdatBytes >>> 16) & 0xFF; + mdatbox[2] = (mdatBytes >>> 8) & 0xFF; + mdatbox[3] = (mdatBytes) & 0xFF; + mdatbox.set(_mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.types.mdat, 4); + // Write samples into mdatbox + for (var i = 0; i < mp4Samples.length; i++) { + var units = mp4Samples[i].units; + while (units.length) { + var unit = units.shift(); + var data = unit.data; + mdatbox.set(data, offset); + offset += data.byteLength; + } + } + var latest = mp4Samples[mp4Samples.length - 1]; + lastDts = latest.dts + latest.duration; + lastPts = latest.pts + latest.duration; + this._videoNextDts = lastDts; + // fill media segment info & add to info list + info.beginDts = firstDts; + info.endDts = lastDts; + info.beginPts = firstPts; + info.endPts = lastPts; + info.originalBeginDts = mp4Samples[0].originalDts; + info.originalEndDts = latest.originalDts + latest.duration; + info.firstSample = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(mp4Samples[0].dts, mp4Samples[0].pts, mp4Samples[0].duration, mp4Samples[0].originalDts, mp4Samples[0].isKeyframe); + info.lastSample = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(latest.dts, latest.pts, latest.duration, latest.originalDts, latest.isKeyframe); + if (!this._isLive) { + this._videoSegmentInfoList.append(info); + } + track.samples = mp4Samples; + track.sequenceNumber++; + // workaround for chrome < 50: force first sample as a random access point + // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412 + if (this._forceFirstIDR) { + var flags = mp4Samples[0].flags; + flags.dependsOn = 2; + flags.isNonSync = 0; + } + var moofbox = _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.moof(track, firstDts); + track.samples = []; + track.length = 0; + this._onMediaSegment('video', { + type: 'video', + data: this._mergeBoxes(moofbox, mdatbox).buffer, + sampleCount: mp4Samples.length, + info: info + }); + }; + MP4Remuxer.prototype._mergeBoxes = function (moof, mdat) { + var result = new Uint8Array(moof.byteLength + mdat.byteLength); + result.set(moof, 0); + result.set(mdat, moof.byteLength); + return result; + }; + return MP4Remuxer; +}()); +/* harmony default export */ __webpack_exports__["default"] = (MP4Remuxer); + + +/***/ }), + +/***/ "./src/utils/browser.js": +/*!******************************!*\ + !*** ./src/utils/browser.js ***! + \******************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var Browser = {}; +function detect() { + // modified from jquery-browser-plugin + var ua = self.navigator.userAgent.toLowerCase(); + var match = /(edge)\/([\w.]+)/.exec(ua) || + /(opr)[\/]([\w.]+)/.exec(ua) || + /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(iemobile)[\/]([\w.]+)/.exec(ua) || + /(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf('trident') >= 0 && /(rv)(?::| )([\w.]+)/.exec(ua) || + ua.indexOf('compatible') < 0 && /(firefox)[ \/]([\w.]+)/.exec(ua) || + []; + var platform_match = /(ipad)/.exec(ua) || + /(ipod)/.exec(ua) || + /(windows phone)/.exec(ua) || + /(iphone)/.exec(ua) || + /(kindle)/.exec(ua) || + /(android)/.exec(ua) || + /(windows)/.exec(ua) || + /(mac)/.exec(ua) || + /(linux)/.exec(ua) || + /(cros)/.exec(ua) || + []; + var matched = { + browser: match[5] || match[3] || match[1] || '', + version: match[2] || match[4] || '0', + majorVersion: match[4] || match[2] || '0', + platform: platform_match[0] || '' + }; + var browser = {}; + if (matched.browser) { + browser[matched.browser] = true; + var versionArray = matched.majorVersion.split('.'); + browser.version = { + major: parseInt(matched.majorVersion, 10), + string: matched.version + }; + if (versionArray.length > 1) { + browser.version.minor = parseInt(versionArray[1], 10); + } + if (versionArray.length > 2) { + browser.version.build = parseInt(versionArray[2], 10); + } + } + if (matched.platform) { + browser[matched.platform] = true; + } + if (browser.chrome || browser.opr || browser.safari) { + browser.webkit = true; + } + // MSIE. IE11 has 'rv' identifer + if (browser.rv || browser.iemobile) { + if (browser.rv) { + delete browser.rv; + } + var msie = 'msie'; + matched.browser = msie; + browser[msie] = true; + } + // Microsoft Edge + if (browser.edge) { + delete browser.edge; + var msedge = 'msedge'; + matched.browser = msedge; + browser[msedge] = true; + } + // Opera 15+ + if (browser.opr) { + var opera = 'opera'; + matched.browser = opera; + browser[opera] = true; + } + // Stock android browsers are marked as Safari + if (browser.safari && browser.android) { + var android = 'android'; + matched.browser = android; + browser[android] = true; + } + browser.name = matched.browser; + browser.platform = matched.platform; + for (var key in Browser) { + if (Browser.hasOwnProperty(key)) { + delete Browser[key]; + } + } + Object.assign(Browser, browser); +} +detect(); +/* harmony default export */ __webpack_exports__["default"] = (Browser); + + +/***/ }), + +/***/ "./src/utils/exception.js": +/*!********************************!*\ + !*** ./src/utils/exception.js ***! + \********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RuntimeException": function() { return /* binding */ RuntimeException; }, +/* harmony export */ "IllegalStateException": function() { return /* binding */ IllegalStateException; }, +/* harmony export */ "InvalidArgumentException": function() { return /* binding */ InvalidArgumentException; }, +/* harmony export */ "NotImplementedException": function() { return /* binding */ NotImplementedException; } +/* harmony export */ }); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var RuntimeException = /** @class */ (function () { + function RuntimeException(message) { + this._message = message; + } + Object.defineProperty(RuntimeException.prototype, "name", { + get: function () { + return 'RuntimeException'; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(RuntimeException.prototype, "message", { + get: function () { + return this._message; + }, + enumerable: false, + configurable: true + }); + RuntimeException.prototype.toString = function () { + return this.name + ': ' + this.message; + }; + return RuntimeException; +}()); + +var IllegalStateException = /** @class */ (function (_super) { + __extends(IllegalStateException, _super); + function IllegalStateException(message) { + return _super.call(this, message) || this; + } + Object.defineProperty(IllegalStateException.prototype, "name", { + get: function () { + return 'IllegalStateException'; + }, + enumerable: false, + configurable: true + }); + return IllegalStateException; +}(RuntimeException)); + +var InvalidArgumentException = /** @class */ (function (_super) { + __extends(InvalidArgumentException, _super); + function InvalidArgumentException(message) { + return _super.call(this, message) || this; + } + Object.defineProperty(InvalidArgumentException.prototype, "name", { + get: function () { + return 'InvalidArgumentException'; + }, + enumerable: false, + configurable: true + }); + return InvalidArgumentException; +}(RuntimeException)); + +var NotImplementedException = /** @class */ (function (_super) { + __extends(NotImplementedException, _super); + function NotImplementedException(message) { + return _super.call(this, message) || this; + } + Object.defineProperty(NotImplementedException.prototype, "name", { + get: function () { + return 'NotImplementedException'; + }, + enumerable: false, + configurable: true + }); + return NotImplementedException; +}(RuntimeException)); + + + +/***/ }), + +/***/ "./src/utils/logger.js": +/*!*****************************!*\ + !*** ./src/utils/logger.js ***! + \*****************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js"); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Log = /** @class */ (function () { + function Log() { + } + Log.e = function (tag, msg) { + if (!tag || Log.FORCE_GLOBAL_TAG) + tag = Log.GLOBAL_TAG; + var str = "[" + tag + "] > " + msg; + if (Log.ENABLE_CALLBACK) { + Log.emitter.emit('log', 'error', str); + } + if (!Log.ENABLE_ERROR) { + return; + } + if (console.error) { + console.error(str); + } + else if (console.warn) { + console.warn(str); + } + else { + console.log(str); + } + }; + Log.i = function (tag, msg) { + if (!tag || Log.FORCE_GLOBAL_TAG) + tag = Log.GLOBAL_TAG; + var str = "[" + tag + "] > " + msg; + if (Log.ENABLE_CALLBACK) { + Log.emitter.emit('log', 'info', str); + } + if (!Log.ENABLE_INFO) { + return; + } + if (console.info) { + console.info(str); + } + else { + console.log(str); + } + }; + Log.w = function (tag, msg) { + if (!tag || Log.FORCE_GLOBAL_TAG) + tag = Log.GLOBAL_TAG; + var str = "[" + tag + "] > " + msg; + if (Log.ENABLE_CALLBACK) { + Log.emitter.emit('log', 'warn', str); + } + if (!Log.ENABLE_WARN) { + return; + } + if (console.warn) { + console.warn(str); + } + else { + console.log(str); + } + }; + Log.d = function (tag, msg) { + if (!tag || Log.FORCE_GLOBAL_TAG) + tag = Log.GLOBAL_TAG; + var str = "[" + tag + "] > " + msg; + if (Log.ENABLE_CALLBACK) { + Log.emitter.emit('log', 'debug', str); + } + if (!Log.ENABLE_DEBUG) { + return; + } + if (console.debug) { + console.debug(str); + } + else { + console.log(str); + } + }; + Log.v = function (tag, msg) { + if (!tag || Log.FORCE_GLOBAL_TAG) + tag = Log.GLOBAL_TAG; + var str = "[" + tag + "] > " + msg; + if (Log.ENABLE_CALLBACK) { + Log.emitter.emit('log', 'verbose', str); + } + if (!Log.ENABLE_VERBOSE) { + return; + } + console.log(str); + }; + return Log; +}()); +Log.GLOBAL_TAG = 'flv.js'; +Log.FORCE_GLOBAL_TAG = false; +Log.ENABLE_ERROR = true; +Log.ENABLE_INFO = true; +Log.ENABLE_WARN = true; +Log.ENABLE_DEBUG = true; +Log.ENABLE_VERBOSE = true; +Log.ENABLE_CALLBACK = false; +Log.emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())(); +/* harmony default export */ __webpack_exports__["default"] = (Log); + + +/***/ }), + +/***/ "./src/utils/logging-control.js": +/*!**************************************!*\ + !*** ./src/utils/logging-control.js ***! + \**************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js"); +/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger.js */ "./src/utils/logger.js"); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +var LoggingControl = /** @class */ (function () { + function LoggingControl() { + } + Object.defineProperty(LoggingControl, "forceGlobalTag", { + get: function () { + return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.FORCE_GLOBAL_TAG; + }, + set: function (enable) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.FORCE_GLOBAL_TAG = enable; + LoggingControl._notifyChange(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(LoggingControl, "globalTag", { + get: function () { + return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.GLOBAL_TAG; + }, + set: function (tag) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.GLOBAL_TAG = tag; + LoggingControl._notifyChange(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(LoggingControl, "enableAll", { + get: function () { + return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE + && _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG + && _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO + && _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN + && _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR; + }, + set: function (enable) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE = enable; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG = enable; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO = enable; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN = enable; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR = enable; + LoggingControl._notifyChange(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(LoggingControl, "enableDebug", { + get: function () { + return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG; + }, + set: function (enable) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG = enable; + LoggingControl._notifyChange(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(LoggingControl, "enableVerbose", { + get: function () { + return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE; + }, + set: function (enable) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE = enable; + LoggingControl._notifyChange(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(LoggingControl, "enableInfo", { + get: function () { + return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO; + }, + set: function (enable) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO = enable; + LoggingControl._notifyChange(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(LoggingControl, "enableWarn", { + get: function () { + return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN; + }, + set: function (enable) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN = enable; + LoggingControl._notifyChange(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(LoggingControl, "enableError", { + get: function () { + return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR; + }, + set: function (enable) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR = enable; + LoggingControl._notifyChange(); + }, + enumerable: false, + configurable: true + }); + LoggingControl.getConfig = function () { + return { + globalTag: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.GLOBAL_TAG, + forceGlobalTag: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.FORCE_GLOBAL_TAG, + enableVerbose: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE, + enableDebug: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG, + enableInfo: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO, + enableWarn: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN, + enableError: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR, + enableCallback: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_CALLBACK + }; + }; + LoggingControl.applyConfig = function (config) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.GLOBAL_TAG = config.globalTag; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.FORCE_GLOBAL_TAG = config.forceGlobalTag; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE = config.enableVerbose; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG = config.enableDebug; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO = config.enableInfo; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN = config.enableWarn; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR = config.enableError; + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_CALLBACK = config.enableCallback; + }; + LoggingControl._notifyChange = function () { + var emitter = LoggingControl.emitter; + if (emitter.listenerCount('change') > 0) { + var config = LoggingControl.getConfig(); + emitter.emit('change', config); + } + }; + LoggingControl.registerListener = function (listener) { + LoggingControl.emitter.addListener('change', listener); + }; + LoggingControl.removeListener = function (listener) { + LoggingControl.emitter.removeListener('change', listener); + }; + LoggingControl.addLogListener = function (listener) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.emitter.addListener('log', listener); + if (_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.emitter.listenerCount('log') > 0) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_CALLBACK = true; + LoggingControl._notifyChange(); + } + }; + LoggingControl.removeLogListener = function (listener) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.emitter.removeListener('log', listener); + if (_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.emitter.listenerCount('log') === 0) { + _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_CALLBACK = false; + LoggingControl._notifyChange(); + } + }; + return LoggingControl; +}()); +LoggingControl.emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())(); +/* harmony default export */ __webpack_exports__["default"] = (LoggingControl); + + +/***/ }), + +/***/ "./src/utils/polyfill.js": +/*!*******************************!*\ + !*** ./src/utils/polyfill.js ***! + \*******************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var Polyfill = /** @class */ (function () { + function Polyfill() { + } + Polyfill.install = function () { + // ES6 Object.setPrototypeOf + Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) { + obj.__proto__ = proto; + return obj; + }; + // ES6 Object.assign + Object.assign = Object.assign || function (target) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var output = Object(target); + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + if (source !== undefined && source !== null) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + output[key] = source[key]; + } + } + } + } + return output; + }; + // ES6 Promise (missing support in IE11) + if (typeof self.Promise !== 'function') { + __webpack_require__(/*! es6-promise */ "./node_modules/es6-promise/dist/es6-promise.js").polyfill(); + } + }; + return Polyfill; +}()); +Polyfill.install(); +/* harmony default export */ __webpack_exports__["default"] = (Polyfill); + + +/***/ }), + +/***/ "./src/utils/utf8-conv.js": +/*!********************************!*\ + !*** ./src/utils/utf8-conv.js ***! + \********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * Copyright (C) 2016 Bilibili. All Rights Reserved. + * + * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8) + * @author zheng qian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +function checkContinuation(uint8array, start, checkLength) { + var array = uint8array; + if (start + checkLength < array.length) { + while (checkLength--) { + if ((array[++start] & 0xC0) !== 0x80) + return false; + } + return true; + } + else { + return false; + } +} +function decodeUTF8(uint8array) { + var out = []; + var input = uint8array; + var i = 0; + var length = uint8array.length; + while (i < length) { + if (input[i] < 0x80) { + out.push(String.fromCharCode(input[i])); + ++i; + continue; + } + else if (input[i] < 0xC0) { + // fallthrough + } + else if (input[i] < 0xE0) { + if (checkContinuation(input, i, 1)) { + var ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F); + if (ucs4 >= 0x80) { + out.push(String.fromCharCode(ucs4 & 0xFFFF)); + i += 2; + continue; + } + } + } + else if (input[i] < 0xF0) { + if (checkContinuation(input, i, 2)) { + var ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F; + if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) { + out.push(String.fromCharCode(ucs4 & 0xFFFF)); + i += 3; + continue; + } + } + } + else if (input[i] < 0xF8) { + if (checkContinuation(input, i, 3)) { + var ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12 + | (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F); + if (ucs4 > 0x10000 && ucs4 < 0x110000) { + ucs4 -= 0x10000; + out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800)); + out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00)); + i += 4; + continue; + } + } + } + out.push(String.fromCharCode(0xFFFD)); + ++i; + } + return out.join(''); +} +/* harmony default export */ __webpack_exports__["default"] = (decodeUTF8); + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ !function() { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +/******/ +/******/ // module factories are used so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ var __webpack_exports__ = __webpack_require__("./src/index.js"); +/******/ +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/flv.js/flv.min.js b/modules/core/src/main/resources/static/ckplayer/flv.js/flv.min.js new file mode 100644 index 00000000..19d28d73 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/flv.js/flv.min.js @@ -0,0 +1,9 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.flvjs=t():e.flvjs=t()}(self,(function(){return function(){var e={264:function(e,t,i){ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.8+1e68dce6 + */ +e.exports=function(){"use strict";function e(e){var t=typeof e;return null!==e&&("object"===t||"function"===t)}function t(e){return"function"==typeof e}var n=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},r=0,s=void 0,o=void 0,a=function(e,t){b[r]=e,b[r+1]=t,2===(r+=2)&&(o?o(E):A())};function h(e){o=e}function u(e){a=e}var l="undefined"!=typeof window?window:void 0,d=l||{},c=d.MutationObserver||d.WebKitMutationObserver,f="undefined"==typeof self&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),_="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function p(){return function(){return process.nextTick(E)}}function m(){return void 0!==s?function(){s(E)}:y()}function g(){var e=0,t=new c(E),i=document.createTextNode("");return t.observe(i,{characterData:!0}),function(){i.data=e=++e%2}}function v(){var e=new MessageChannel;return e.port1.onmessage=E,function(){return e.port2.postMessage(0)}}function y(){var e=setTimeout;return function(){return e(E,1)}}var b=new Array(1e3);function E(){for(var e=0;e0&&o.length>r&&!o.warned){o.warned=!0;var l=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");l.name="MaxListenersExceededWarning",l.emitter=e,l.type=t,l.count=o.length,u=l,console&&console.warn&&console.warn(u)}return e}function l(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function d(e,t,i){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},r=l.bind(n);return r.listener=i,n.wrapFn=r,r}function c(e,t,i){var n=e._events;if(void 0===n)return[];var r=n[t];return void 0===r?[]:"function"==typeof r?i?[r.listener||r]:[r]:i?function(e){for(var t=new Array(e.length),i=0;i0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var h=s[e];if(void 0===h)return!1;if("function"==typeof h)n(h,this,t);else{var u=h.length,l=_(h,u);for(i=0;i=0;s--)if(i[s]===t||i[s].listener===t){o=i[s].listener,r=s;break}if(r<0)return this;0===r?i.shift():function(e,t){for(;t+1=0;n--)this.removeListener(e,t[n]);return this},s.prototype.listeners=function(e){return c(this,e,!0)},s.prototype.rawListeners=function(e){return c(this,e,!1)},s.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):f.call(e,t)},s.prototype.listenerCount=f,s.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},397:function(e,t,i){function n(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=t,i.i=function(e){return e},i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},i.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var n=i(i.s=ENTRY_MODULE);return n.default||n}var r="[\\.|\\-|\\+|\\w|/|@]+",s="\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)";function o(e){return(e+"").replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function a(e,t,n){var a={};a[n]=[];var h=t.toString(),u=h.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/);if(!u)return a;for(var l,d=u[1],c=new RegExp("(\\\\n|\\W)"+o(d)+s,"g");l=c.exec(h);)"dll-reference"!==l[3]&&a[n].push(l[3]);for(c=new RegExp("\\("+o(d)+'\\("(dll-reference\\s('+r+'))"\\)\\)'+s,"g");l=c.exec(h);)e[l[2]]||(a[n].push(l[1]),e[l[2]]=i(l[1]).m),a[l[2]]=a[l[2]]||[],a[l[2]].push(l[4]);for(var f,_=Object.keys(a),p=0;p<_.length;p++)for(var m=0;m0}),!1)}e.exports=function(e,t){t=t||{};var r={main:i.m},s=t.all?{main:Object.keys(r.main)}:function(e,t){for(var i={main:[t]},n={main:[]},r={main:{}};h(i);)for(var s=Object.keys(i),o=0;o=e[r]&&t0&&e[0].originalDts=t[r].dts&&et[n].lastSample.originalDts&&e=t[n].lastSample.originalDts&&(n===t.length-1||n0&&(r=this._searchNearestSegmentBefore(i.originalBeginDts)+1),this._lastAppendLocation=r,this._list.splice(r,0,i)},e.prototype.getLastSegmentBefore=function(e){var t=this._searchNearestSegmentBefore(e);return t>=0?this._list[t]:null},e.prototype.getLastSampleBefore=function(e){var t=this.getLastSegmentBefore(e);return null!=t?t.lastSample:null},e.prototype.getLastSyncPointBefore=function(e){for(var t=this._searchNearestSegmentBefore(e),i=this._list[t].syncPoints;0===i.length&&t>0;)t--,i=this._list[t].syncPoints;return i.length>0?i[i.length-1]:null},e}()},949:function(e,t,i){"use strict";i.d(t,{Z:function(){return R}});var n=i(716),r=i.n(n),s=i(300),o=i(538),a=i(118);function h(e,t,i){var n=e;if(t+i=128){t.push(String.fromCharCode(65535&s)),n+=2;continue}}else if(i[n]<240){if(h(i,n,2))if((s=(15&i[n])<<12|(63&i[n+1])<<6|63&i[n+2])>=2048&&55296!=(63488&s)){t.push(String.fromCharCode(65535&s)),n+=3;continue}}else if(i[n]<248){var s;if(h(i,n,3))if((s=(7&i[n])<<18|(63&i[n+1])<<12|(63&i[n+2])<<6|63&i[n+3])>65536&&s<1114112){s-=65536,t.push(String.fromCharCode(s>>>10|55296)),t.push(String.fromCharCode(1023&s|56320)),n+=4;continue}}t.push(String.fromCharCode(65533)),++n}return t.join("")},d=i(29),c=(u=new ArrayBuffer(2),new DataView(u).setInt16(0,256,!0),256===new Int16Array(u)[0]),f=function(){function e(){}return e.parseScriptData=function(t,i,n){var r={};try{var o=e.parseValue(t,i,n),a=e.parseValue(t,i+o.size,n-o.size);r[o.data]=a.data}catch(e){s.Z.e("AMF",e.toString())}return r},e.parseObject=function(t,i,n){if(n<3)throw new d.rT("Data not enough when parse ScriptDataObject");var r=e.parseString(t,i,n),s=e.parseValue(t,i+r.size,n-r.size),o=s.objectEnd;return{data:{name:r.data,value:s.data},size:r.size+s.size,objectEnd:o}},e.parseVariable=function(t,i,n){return e.parseObject(t,i,n)},e.parseString=function(e,t,i){if(i<2)throw new d.rT("Data not enough when parse String");var n=new DataView(e,t,i).getUint16(0,!c);return{data:n>0?l(new Uint8Array(e,t+2,n)):"",size:2+n}},e.parseLongString=function(e,t,i){if(i<4)throw new d.rT("Data not enough when parse LongString");var n=new DataView(e,t,i).getUint32(0,!c);return{data:n>0?l(new Uint8Array(e,t+4,n)):"",size:4+n}},e.parseDate=function(e,t,i){if(i<10)throw new d.rT("Data size invalid when parse Date");var n=new DataView(e,t,i),r=n.getFloat64(0,!c),s=n.getInt16(8,!c);return{data:new Date(r+=60*s*1e3),size:10}},e.parseValue=function(t,i,n){if(n<1)throw new d.rT("Data not enough when parse Value");var r,o=new DataView(t,i,n),a=1,h=o.getUint8(0),u=!1;try{switch(h){case 0:r=o.getFloat64(1,!c),a+=8;break;case 1:r=!!o.getUint8(1),a+=1;break;case 2:var l=e.parseString(t,i+1,n-1);r=l.data,a+=l.size;break;case 3:r={};var f=0;for(9==(16777215&o.getUint32(n-4,!c))&&(f=3);a32)throw new d.OC("ExpGolomb: readBits() bits exceeded max 32bits!");if(e<=this._current_word_bits_left){var t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}var i=this._current_word_bits_left?this._current_word:0;i>>>=32-this._current_word_bits_left;var n=e-this._current_word_bits_left;this._fillCurrentWord();var r=Math.min(n,this._current_word_bits_left),s=this._current_word>>>32-r;return this._current_word<<=r,this._current_word_bits_left-=r,i=i<>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()},e.prototype.readUEG=function(){var e=this._skipLeadingZero();return this.readBits(e+1)-1},e.prototype.readSEG=function(){var e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)},e}(),p=function(){function e(){}return e._ebsp2rbsp=function(e){for(var t=e,i=t.byteLength,n=new Uint8Array(i),r=0,s=0;s=2&&3===t[s]&&0===t[s-1]&&0===t[s-2]||(n[r]=t[s],r++);return new Uint8Array(n.buffer,0,r)},e.parseSPS=function(t){var i=e._ebsp2rbsp(t),n=new _(i);n.readByte();var r=n.readByte();n.readByte();var s=n.readByte();n.readUEG();var o=e.getProfileString(r),a=e.getLevelString(s),h=1,u=420,l=8;if((100===r||110===r||122===r||244===r||44===r||83===r||86===r||118===r||128===r||138===r||144===r)&&(3===(h=n.readUEG())&&n.readBits(1),h<=3&&(u=[0,420,422,444][h]),l=n.readUEG()+8,n.readUEG(),n.readBits(1),n.readBool()))for(var d=3!==h?8:12,c=0;c0&&k<16?(L=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][k-1],R=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][k-1]):255===k&&(L=n.readByte()<<8|n.readByte(),R=n.readByte()<<8|n.readByte())}if(n.readBool()&&n.readBool(),n.readBool()&&(n.readBits(4),n.readBool()&&n.readBits(24)),n.readBool()&&(n.readUEG(),n.readUEG()),n.readBool()){var D=n.readBits(32),I=n.readBits(32);O=n.readBool(),w=(T=I)/(C=2*D)}}var M=1;1===L&&1===R||(M=L/R);var B=0,x=0;0===h?(B=1,x=2-y):(B=3===h?1:2,x=(1===h?2:1)*(2-y));var P=16*(g+1),U=16*(v+1)*(2-y);P-=(b+E)*B,U-=(S+A)*x;var N=Math.ceil(P*M);return n.destroy(),n=null,{profile_string:o,level_string:a,bit_depth:l,ref_frames:m,chroma_format:u,chroma_format_string:e.getChromaFormatString(u),frame_rate:{fixed:O,fps:w,fps_den:C,fps_num:T},sar_ratio:{width:L,height:R},codec_size:{width:P,height:U},present_size:{width:N,height:U}}},e._skipScalingList=function(e,t){for(var i=8,n=8,r=0;r>>2!=0,o=0!=(1&t[4]),a=(n=t)[r=5]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3];return a<9?i:{match:!0,consumed:a,dataOffset:a,hasAudioTrack:s,hasVideoTrack:o}},e.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},Object.defineProperty(e.prototype,"onTrackMetadata",{get:function(){return this._onTrackMetadata},set:function(e){this._onTrackMetadata=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaInfo",{get:function(){return this._onMediaInfo},set:function(e){this._onMediaInfo=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMetaDataArrived",{get:function(){return this._onMetaDataArrived},set:function(e){this._onMetaDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onScriptDataArrived",{get:function(){return this._onScriptDataArrived},set:function(e){this._onScriptDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataAvailable",{get:function(){return this._onDataAvailable},set:function(e){this._onDataAvailable=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"timestampBase",{get:function(){return this._timestampBase},set:function(e){this._timestampBase=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedDuration",{get:function(){return this._duration},set:function(e){this._durationOverrided=!0,this._duration=e,this._mediaInfo.duration=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasAudio",{set:function(e){this._hasAudioFlagOverrided=!0,this._hasAudio=e,this._mediaInfo.hasAudio=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasVideo",{set:function(e){this._hasVideoFlagOverrided=!0,this._hasVideo=e,this._mediaInfo.hasVideo=e},enumerable:!1,configurable:!0}),e.prototype.resetMediaInfo=function(){this._mediaInfo=new a.Z},e.prototype._isInitialMetadataDispatched=function(){return this._hasAudio&&this._hasVideo?this._audioInitialMetadataDispatched&&this._videoInitialMetadataDispatched:this._hasAudio&&!this._hasVideo?this._audioInitialMetadataDispatched:!(this._hasAudio||!this._hasVideo)&&this._videoInitialMetadataDispatched},e.prototype.parseChunks=function(t,i){if(!(this._onError&&this._onMediaInfo&&this._onTrackMetadata&&this._onDataAvailable))throw new d.rT("Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var n=0,r=this._littleEndian;if(0===i){if(!(t.byteLength>13))return 0;n=e.probe(t).dataOffset}this._firstParse&&(this._firstParse=!1,i+n!==this._dataOffset&&s.Z.w(this.TAG,"First time parsing but chunk byteStart invalid!"),0!==(o=new DataView(t,n)).getUint32(0,!r)&&s.Z.w(this.TAG,"PrevTagSize0 !== 0 !!!"),n+=4);for(;nt.byteLength)break;var a=o.getUint8(0),h=16777215&o.getUint32(0,!r);if(n+11+h+4>t.byteLength)break;if(8===a||9===a||18===a){var u=o.getUint8(4),l=o.getUint8(5),c=o.getUint8(6)|l<<8|u<<16|o.getUint8(7)<<24;0!==(16777215&o.getUint32(7,!r))&&s.Z.w(this.TAG,"Meet tag which has StreamID != 0!");var f=n+11;switch(a){case 8:this._parseAudioData(t,f,h,c);break;case 9:this._parseVideoData(t,f,h,c,i+n);break;case 18:this._parseScriptData(t,f,h)}var _=o.getUint32(11+h,!r);_!==11+h&&s.Z.w(this.TAG,"Invalid PrevTagSize "+_),n+=11+h+4}else s.Z.w(this.TAG,"Unsupported tag type "+a+", skipped"),n+=11+h+4}return this._isInitialMetadataDispatched()&&this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack),n},e.prototype._parseScriptData=function(e,t,i){var n=f.parseScriptData(e,t,i);if(n.hasOwnProperty("onMetaData")){if(null==n.onMetaData||"object"!=typeof n.onMetaData)return void s.Z.w(this.TAG,"Invalid onMetaData structure!");this._metadata&&s.Z.w(this.TAG,"Found another onMetaData tag!"),this._metadata=n;var r=this._metadata.onMetaData;if(this._onMetaDataArrived&&this._onMetaDataArrived(Object.assign({},r)),"boolean"==typeof r.hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=r.hasAudio,this._mediaInfo.hasAudio=this._hasAudio),"boolean"==typeof r.hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=r.hasVideo,this._mediaInfo.hasVideo=this._hasVideo),"number"==typeof r.audiodatarate&&(this._mediaInfo.audioDataRate=r.audiodatarate),"number"==typeof r.videodatarate&&(this._mediaInfo.videoDataRate=r.videodatarate),"number"==typeof r.width&&(this._mediaInfo.width=r.width),"number"==typeof r.height&&(this._mediaInfo.height=r.height),"number"==typeof r.duration){if(!this._durationOverrided){var o=Math.floor(r.duration*this._timescale);this._duration=o,this._mediaInfo.duration=o}}else this._mediaInfo.duration=0;if("number"==typeof r.framerate){var a=Math.floor(1e3*r.framerate);if(a>0){var h=a/1e3;this._referenceFrameRate.fixed=!0,this._referenceFrameRate.fps=h,this._referenceFrameRate.fps_num=a,this._referenceFrameRate.fps_den=1e3,this._mediaInfo.fps=h}}if("object"==typeof r.keyframes){this._mediaInfo.hasKeyframesIndex=!0;var u=r.keyframes;this._mediaInfo.keyframesIndex=this._parseKeyframesIndex(u),r.keyframes=null}else this._mediaInfo.hasKeyframesIndex=!1;this._dispatch=!1,this._mediaInfo.metadata=r,s.Z.v(this.TAG,"Parsed onMetaData"),this._mediaInfo.isComplete()&&this._onMediaInfo(this._mediaInfo)}Object.keys(n).length>0&&this._onScriptDataArrived&&this._onScriptDataArrived(Object.assign({},n))},e.prototype._parseKeyframesIndex=function(e){for(var t=[],i=[],n=1;n>>4;if(2===o||10===o){var a=0,h=(12&r)>>>2;if(h>=0&&h<=4){a=this._flvSoundRateTable[h];var u=1&r,l=this._audioMetadata,d=this._audioTrack;if(l||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(l=this._audioMetadata={}).type="audio",l.id=d.id,l.timescale=this._timescale,l.duration=this._duration,l.audioSampleRate=a,l.channelCount=0===u?1:2),10===o){var c=this._parseAACAudioData(e,t+1,i-1);if(null==c)return;if(0===c.packetType){l.config&&s.Z.w(this.TAG,"Found another AudioSpecificConfig!");var f=c.data;l.audioSampleRate=f.samplingRate,l.channelCount=f.channelCount,l.codec=f.codec,l.originalCodec=f.originalCodec,l.config=f.config,l.refSampleDuration=1024/l.audioSampleRate*l.timescale,s.Z.v(this.TAG,"Parsed AudioSpecificConfig"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",l),(g=this._mediaInfo).audioCodec=l.originalCodec,g.audioSampleRate=l.audioSampleRate,g.audioChannelCount=l.channelCount,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}else if(1===c.packetType){var _=this._timestampBase+n,p={unit:c.data,length:c.data.byteLength,dts:_,pts:_};d.samples.push(p),d.length+=c.data.length}else s.Z.e(this.TAG,"Flv: Unsupported AAC data type "+c.packetType)}else if(2===o){if(!l.codec){var g;if(null==(f=this._parseMP3AudioData(e,t+1,i-1,!0)))return;l.audioSampleRate=f.samplingRate,l.channelCount=f.channelCount,l.codec=f.codec,l.originalCodec=f.originalCodec,l.refSampleDuration=1152/l.audioSampleRate*l.timescale,s.Z.v(this.TAG,"Parsed MPEG Audio Frame Header"),this._audioInitialMetadataDispatched=!0,this._onTrackMetadata("audio",l),(g=this._mediaInfo).audioCodec=l.codec,g.audioSampleRate=l.audioSampleRate,g.audioChannelCount=l.channelCount,g.audioDataRate=f.bitRate,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}var v=this._parseMP3AudioData(e,t+1,i-1,!1);if(null==v)return;_=this._timestampBase+n;var y={unit:v,length:v.byteLength,dts:_,pts:_};d.samples.push(y),d.length+=v.length}}else this._onError(m.Z.FORMAT_ERROR,"Flv: Invalid audio sample rate idx: "+h)}else this._onError(m.Z.CODEC_UNSUPPORTED,"Flv: Unsupported audio codec idx: "+o)}},e.prototype._parseAACAudioData=function(e,t,i){if(!(i<=1)){var n={},r=new Uint8Array(e,t,i);return n.packetType=r[0],0===r[0]?n.data=this._parseAACAudioSpecificConfig(e,t+1,i-1):n.data=r.subarray(1),n}s.Z.w(this.TAG,"Flv: Invalid AAC packet, missing AACPacketType or/and Data!")},e.prototype._parseAACAudioSpecificConfig=function(e,t,i){var n,r,s=new Uint8Array(e,t,i),o=null,a=0,h=null;if(a=n=s[0]>>>3,(r=(7&s[0])<<1|s[1]>>>7)<0||r>=this._mpegSamplingRates.length)this._onError(m.Z.FORMAT_ERROR,"Flv: AAC invalid sampling frequency index!");else{var u=this._mpegSamplingRates[r],l=(120&s[1])>>>3;if(!(l<0||l>=8)){5===a&&(h=(7&s[1])<<1|s[2]>>>7,(124&s[2])>>>2);var d=self.navigator.userAgent.toLowerCase();return-1!==d.indexOf("firefox")?r>=6?(a=5,o=new Array(4),h=r-3):(a=2,o=new Array(2),h=r):-1!==d.indexOf("android")?(a=2,o=new Array(2),h=r):(a=5,h=r,o=new Array(4),r>=6?h=r-3:1===l&&(a=2,o=new Array(2),h=r)),o[0]=a<<3,o[0]|=(15&r)>>>1,o[1]=(15&r)<<7,o[1]|=(15&l)<<3,5===a&&(o[1]|=(15&h)>>>1,o[2]=(1&h)<<7,o[2]|=8,o[3]=0),{config:o,samplingRate:u,channelCount:l,codec:"mp4a.40."+a,originalCodec:"mp4a.40."+n}}this._onError(m.Z.FORMAT_ERROR,"Flv: AAC invalid channel configuration")}},e.prototype._parseMP3AudioData=function(e,t,i,n){if(!(i<4)){this._littleEndian;var r=new Uint8Array(e,t,i),o=null;if(n){if(255!==r[0])return;var a=r[1]>>>3&3,h=(6&r[1])>>1,u=(240&r[2])>>>4,l=(12&r[2])>>>2,d=3!==(r[3]>>>6&3)?2:1,c=0,f=0;switch(a){case 0:c=this._mpegAudioV25SampleRateTable[l];break;case 2:c=this._mpegAudioV20SampleRateTable[l];break;case 3:c=this._mpegAudioV10SampleRateTable[l]}switch(h){case 1:34,u>>4,h=15&o;7===h?this._parseAVCVideoPacket(e,t+1,i-1,n,r,a):this._onError(m.Z.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: "+h)}},e.prototype._parseAVCVideoPacket=function(e,t,i,n,r,o){if(i<4)s.Z.w(this.TAG,"Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime");else{var a=this._littleEndian,h=new DataView(e,t,i),u=h.getUint8(0),l=(16777215&h.getUint32(0,!a))<<8>>8;if(0===u)this._parseAVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===u)this._parseAVCVideoData(e,t+4,i-4,n,r,o,l);else if(2!==u)return void this._onError(m.Z.FORMAT_ERROR,"Flv: Invalid video packet type "+u)}},e.prototype._parseAVCDecoderConfigurationRecord=function(e,t,i){if(i<7)s.Z.w(this.TAG,"Flv: Invalid AVCDecoderConfigurationRecord, lack of data!");else{var n=this._videoMetadata,r=this._videoTrack,o=this._littleEndian,a=new DataView(e,t,i);n?void 0!==n.avcc&&s.Z.w(this.TAG,"Found another AVCDecoderConfigurationRecord!"):(!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(n=this._videoMetadata={}).type="video",n.id=r.id,n.timescale=this._timescale,n.duration=this._duration);var h=a.getUint8(0),u=a.getUint8(1);a.getUint8(2),a.getUint8(3);if(1===h&&0!==u)if(this._naluLengthSize=1+(3&a.getUint8(4)),3===this._naluLengthSize||4===this._naluLengthSize){var l=31&a.getUint8(5);if(0!==l){l>1&&s.Z.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: SPS Count = "+l);for(var d=6,c=0;c1&&s.Z.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: PPS Count = "+R),d++;for(c=0;c=i){s.Z.w(this.TAG,"Malformed Nalu near timestamp "+_+", offset = "+c+", dataSize = "+i);break}var m=u.getUint32(c,!h);if(3===f&&(m>>>=8),m>i-f)return void s.Z.w(this.TAG,"Malformed Nalus near timestamp "+_+", NaluSize > DataSize!");var g=31&u.getUint8(c+f);5===g&&(p=!0);var v=new Uint8Array(e,t+c,f+m),y={type:g,data:v};l.push(y),d+=v.byteLength,c+=f+m}if(l.length){var b=this._videoTrack,E={units:l,length:d,isKeyframe:p,dts:_,cts:a,pts:_+a};p&&(E.fileposition=r),b.samples.push(E),b.length+=d}},e}(),v=function(){function e(){}return e.init=function(){for(var t in e.types={avc1:[],avcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],mvex:[],mvhd:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[],".mp3":[]},e.types)e.types.hasOwnProperty(t)&&(e.types[t]=[t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2),t.charCodeAt(3)]);var i=e.constants={};i.FTYP=new Uint8Array([105,115,111,109,0,0,0,1,105,115,111,109,97,118,99,49]),i.STSD_PREFIX=new Uint8Array([0,0,0,0,0,0,0,1]),i.STTS=new Uint8Array([0,0,0,0,0,0,0,0]),i.STSC=i.STCO=i.STTS,i.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),i.HDLR_VIDEO=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),i.HDLR_AUDIO=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),i.DREF=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),i.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),i.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0])},e.box=function(e){for(var t=8,i=null,n=Array.prototype.slice.call(arguments,1),r=n.length,s=0;s>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);var o=8;for(s=0;s>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))},e.trak=function(t){return e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.tkhd=function(t){var i=t.id,n=t.duration,r=t.presentWidth,s=t.presentHeight;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,r>>>8&255,255&r,0,0,s>>>8&255,255&s,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t),e.hdlr(t),e.minf(t))},e.mdhd=function(t){var i=t.timescale,n=t.duration;return e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,85,196,0,0]))},e.hdlr=function(t){var i=null;return i="audio"===t.type?e.constants.HDLR_AUDIO:e.constants.HDLR_VIDEO,e.box(e.types.hdlr,i)},e.minf=function(t){var i=null;return i="audio"===t.type?e.box(e.types.smhd,e.constants.SMHD):e.box(e.types.vmhd,e.constants.VMHD),e.box(e.types.minf,i,e.dinf(),e.stbl(t))},e.dinf=function(){return e.box(e.types.dinf,e.box(e.types.dref,e.constants.DREF))},e.stbl=function(t){return e.box(e.types.stbl,e.stsd(t),e.box(e.types.stts,e.constants.STTS),e.box(e.types.stsc,e.constants.STSC),e.box(e.types.stsz,e.constants.STSZ),e.box(e.types.stco,e.constants.STCO))},e.stsd=function(t){return"audio"===t.type?"mp3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp3(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp4a(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.avc1(t))},e.mp3=function(t){var i=t.channelCount,n=t.audioSampleRate,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types[".mp3"],r)},e.mp4a=function(t){var i=t.channelCount,n=t.audioSampleRate,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types.mp4a,r,e.esds(t))},e.esds=function(t){var i=t.config||[],n=i.length,r=new Uint8Array([0,0,0,0,3,23+n,0,1,0,4,15+n,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([n]).concat(i).concat([6,1,2]));return e.box(e.types.esds,r)},e.avc1=function(t){var i=t.avcc,n=t.codecWidth,r=t.codecHeight,s=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,r>>>8&255,255&r,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.avc1,s,e.box(e.types.avcC,i))},e.mvex=function(t){return e.box(e.types.mvex,e.trex(t))},e.trex=function(t){var i=t.id,n=new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return e.box(e.types.trex,n)},e.moof=function(t,i){return e.box(e.types.moof,e.mfhd(t.sequenceNumber),e.traf(t,i))},e.mfhd=function(t){var i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t]);return e.box(e.types.mfhd,i)},e.traf=function(t,i){var n=t.id,r=e.box(e.types.tfhd,new Uint8Array([0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n])),s=e.box(e.types.tfdt,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),o=e.sdtp(t),a=e.trun(t,o.byteLength+16+16+8+16+8+8);return e.box(e.types.traf,r,s,a,o)},e.sdtp=function(t){for(var i=t.samples||[],n=i.length,r=new Uint8Array(4+n),s=0;s>>24&255,r>>>16&255,r>>>8&255,255&r,i>>>24&255,i>>>16&255,i>>>8&255,255&i],0);for(var a=0;a>>24&255,h>>>16&255,h>>>8&255,255&h,u>>>24&255,u>>>16&255,u>>>8&255,255&u,l.isLeading<<2|l.dependsOn,l.isDependedOn<<6|l.hasRedundancy<<4|l.isNonSync,0,0,d>>>24&255,d>>>16&255,d>>>8&255,255&d],12+16*a)}return e.box(e.types.trun,o)},e.mdat=function(t){return e.box(e.types.mdat,t)},e}();v.init();var y=v,b=function(){function e(){}return e.getSilentFrame=function(e,t){if("mp4a.40.2"===e){if(1===t)return new Uint8Array([0,200,0,128,35,128]);if(2===t)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===t)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}return null},e}(),E=i(51),S=function(){function e(e){this.TAG="MP4Remuxer",this._config=e,this._isLive=!0===e.isLive,this._dtsBase=-1,this._dtsBaseInited=!1,this._audioDtsBase=1/0,this._videoDtsBase=1/0,this._audioNextDts=void 0,this._videoNextDts=void 0,this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList=new E.J1("audio"),this._videoSegmentInfoList=new E.J1("video"),this._onInitSegment=null,this._onMediaSegment=null,this._forceFirstIDR=!(!o.Z.chrome||!(o.Z.version.major<50||50===o.Z.version.major&&o.Z.version.build<2661)),this._fillSilentAfterSeek=o.Z.msedge||o.Z.msie,this._mp3UseMpegAudio=!o.Z.firefox,this._fillAudioTimestampGap=this._config.fixAudioTimestampGap}return e.prototype.destroy=function(){this._dtsBase=-1,this._dtsBaseInited=!1,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList.clear(),this._audioSegmentInfoList=null,this._videoSegmentInfoList.clear(),this._videoSegmentInfoList=null,this._onInitSegment=null,this._onMediaSegment=null},e.prototype.bindDataSource=function(e){return e.onDataAvailable=this.remux.bind(this),e.onTrackMetadata=this._onTrackMetadataReceived.bind(this),this},Object.defineProperty(e.prototype,"onInitSegment",{get:function(){return this._onInitSegment},set:function(e){this._onInitSegment=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaSegment",{get:function(){return this._onMediaSegment},set:function(e){this._onMediaSegment=e},enumerable:!1,configurable:!0}),e.prototype.insertDiscontinuity=function(){this._audioNextDts=this._videoNextDts=void 0},e.prototype.seek=function(e){this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._videoSegmentInfoList.clear(),this._audioSegmentInfoList.clear()},e.prototype.remux=function(e,t){if(!this._onMediaSegment)throw new d.rT("MP4Remuxer: onMediaSegment callback must be specificed!");this._dtsBaseInited||this._calculateDtsBase(e,t),this._remuxVideo(t),this._remuxAudio(e)},e.prototype._onTrackMetadataReceived=function(e,t){var i=null,n="mp4",r=t.codec;if("audio"===e)this._audioMeta=t,"mp3"===t.codec&&this._mp3UseMpegAudio?(n="mpeg",r="",i=new Uint8Array):i=y.generateInitSegment(t);else{if("video"!==e)return;this._videoMeta=t,i=y.generateInitSegment(t)}if(!this._onInitSegment)throw new d.rT("MP4Remuxer: onInitSegment callback must be specified!");this._onInitSegment(e,{type:e,data:i.buffer,codec:r,container:e+"/"+n,mediaDuration:t.duration})},e.prototype._calculateDtsBase=function(e,t){this._dtsBaseInited||(e.samples&&e.samples.length&&(this._audioDtsBase=e.samples[0].dts),t.samples&&t.samples.length&&(this._videoDtsBase=t.samples[0].dts),this._dtsBase=Math.min(this._audioDtsBase,this._videoDtsBase),this._dtsBaseInited=!0)},e.prototype.flushStashedSamples=function(){var e=this._videoStashedLastSample,t=this._audioStashedLastSample,i={type:"video",id:1,sequenceNumber:0,samples:[],length:0};null!=e&&(i.samples.push(e),i.length=e.length);var n={type:"audio",id:2,sequenceNumber:0,samples:[],length:0};null!=t&&(n.samples.push(t),n.length=t.length),this._videoStashedLastSample=null,this._audioStashedLastSample=null,this._remuxVideo(i,!0),this._remuxAudio(n,!0)},e.prototype._remuxAudio=function(e,t){if(null!=this._audioMeta){var i,n=e,r=n.samples,a=void 0,h=-1,u=this._audioMeta.refSampleDuration,l="mp3"===this._audioMeta.codec&&this._mp3UseMpegAudio,d=this._dtsBaseInited&&void 0===this._audioNextDts,c=!1;if(r&&0!==r.length&&(1!==r.length||t)){var f=0,_=null,p=0;l?(f=0,p=n.length):(f=8,p=8+n.length);var m=null;if(r.length>1&&(p-=(m=r.pop()).length),null!=this._audioStashedLastSample){var g=this._audioStashedLastSample;this._audioStashedLastSample=null,r.unshift(g),p+=g.length}null!=m&&(this._audioStashedLastSample=m);var v=r[0].dts-this._dtsBase;if(this._audioNextDts)a=v-this._audioNextDts;else if(this._audioSegmentInfoList.isEmpty())a=0,this._fillSilentAfterSeek&&!this._videoSegmentInfoList.isEmpty()&&"mp3"!==this._audioMeta.originalCodec&&(c=!0);else{var S=this._audioSegmentInfoList.getLastSampleBefore(v);if(null!=S){var A=v-(S.originalDts+S.duration);A<=3&&(A=0),a=v-(S.dts+S.duration+A)}else a=0}if(c){var L=v-a,R=this._videoSegmentInfoList.getLastSegmentBefore(v);if(null!=R&&R.beginDts=3*u&&this._fillAudioTimestampGap&&!o.Z.safari){I=!0;var P,U=Math.floor(a/u);s.Z.w(this.TAG,"Large audio timestamp gap detected, may cause AV sync to drift. Silent frames will be generated to avoid unsync.\noriginalDts: "+D+" ms, curRefDts: "+x+" ms, dtsCorrection: "+Math.round(a)+" ms, generate: "+U+" frames"),w=Math.floor(x),B=Math.floor(x+u)-w,null==(P=b.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount))&&(s.Z.w(this.TAG,"Unable to generate silent frame for "+this._audioMeta.originalCodec+" with "+this._audioMeta.channelCount+" channels, repeat last frame"),P=k),M=[];for(var N=0;N=1?T[T.length-1].duration:Math.floor(u);this._audioNextDts=w+B}-1===h&&(h=w),T.push({dts:w,pts:w,cts:0,unit:g.unit,size:g.unit.byteLength,duration:B,originalDts:D,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}}),I&&T.push.apply(T,M)}}if(0===T.length)return n.samples=[],void(n.length=0);l?_=new Uint8Array(p):((_=new Uint8Array(p))[0]=p>>>24&255,_[1]=p>>>16&255,_[2]=p>>>8&255,_[3]=255&p,_.set(y.types.mdat,4));for(C=0;C1&&(d-=(c=s.pop()).length),null!=this._videoStashedLastSample){var f=this._videoStashedLastSample;this._videoStashedLastSample=null,s.unshift(f),d+=f.length}null!=c&&(this._videoStashedLastSample=c);var _=s[0].dts-this._dtsBase;if(this._videoNextDts)o=_-this._videoNextDts;else if(this._videoSegmentInfoList.isEmpty())o=0;else{var p=this._videoSegmentInfoList.getLastSampleBefore(_);if(null!=p){var m=_-(p.originalDts+p.duration);m<=3&&(m=0),o=_-(p.dts+p.duration+m)}else o=0}for(var g=new E.Yy,v=[],b=0;b=1?v[v.length-1].duration:Math.floor(this._videoMeta.refSampleDuration);if(A){var T=new E.Wk(L,w,O,f.dts,!0);T.fileposition=f.fileposition,g.appendSyncPoint(T)}v.push({dts:L,pts:w,cts:R,units:f.units,size:f.length,isKeyframe:A,duration:O,originalDts:S,flags:{isLeading:0,dependsOn:A?2:1,isDependedOn:A?1:0,hasRedundancy:0,isNonSync:A?0:1}})}(l=new Uint8Array(d))[0]=d>>>24&255,l[1]=d>>>16&255,l[2]=d>>>8&255,l[3]=255&d,l.set(y.types.mdat,4);for(b=0;b0)this._demuxer.bindDataSource(this._ioctl),this._demuxer.timestampBase=this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase,r=this._demuxer.parseChunks(e,t);else if((n=g.probe(e)).match){this._demuxer=new g(n,this._config),this._remuxer||(this._remuxer=new S(this._config));var o=this._mediaDataSource;null==o.duration||isNaN(o.duration)||(this._demuxer.overridedDuration=o.duration),"boolean"==typeof o.hasAudio&&(this._demuxer.overridedHasAudio=o.hasAudio),"boolean"==typeof o.hasVideo&&(this._demuxer.overridedHasVideo=o.hasVideo),this._demuxer.timestampBase=o.segments[this._currentSegmentIndex].timestampBase,this._demuxer.onError=this._onDemuxException.bind(this),this._demuxer.onMediaInfo=this._onMediaInfo.bind(this),this._demuxer.onMetaDataArrived=this._onMetaDataArrived.bind(this),this._demuxer.onScriptDataArrived=this._onScriptDataArrived.bind(this),this._remuxer.bindDataSource(this._demuxer.bindDataSource(this._ioctl)),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this),r=this._demuxer.parseChunks(e,t)}else n=null,s.Z.e(this.TAG,"Non-FLV, Unsupported media type!"),Promise.resolve().then((function(){i._internalAbort()})),this._emitter.emit(L.Z.DEMUX_ERROR,m.Z.FORMAT_UNSUPPORTED,"Non-FLV, Unsupported media type"),r=0;return r},e.prototype._onMediaInfo=function(e){var t=this;null==this._mediaInfo&&(this._mediaInfo=Object.assign({},e),this._mediaInfo.keyframesIndex=null,this._mediaInfo.segments=[],this._mediaInfo.segmentCount=this._mediaDataSource.segments.length,Object.setPrototypeOf(this._mediaInfo,a.Z.prototype));var i=Object.assign({},e);Object.setPrototypeOf(i,a.Z.prototype),this._mediaInfo.segments[this._currentSegmentIndex]=i,this._reportSegmentMediaInfo(this._currentSegmentIndex),null!=this._pendingSeekTime&&Promise.resolve().then((function(){var e=t._pendingSeekTime;t._pendingSeekTime=null,t.seek(e)}))},e.prototype._onMetaDataArrived=function(e){this._emitter.emit(L.Z.METADATA_ARRIVED,e)},e.prototype._onScriptDataArrived=function(e){this._emitter.emit(L.Z.SCRIPTDATA_ARRIVED,e)},e.prototype._onIOSeeked=function(){this._remuxer.insertDiscontinuity()},e.prototype._onIOComplete=function(e){var t=e+1;t0&&i[0].originalDts===n&&(n=i[0].pts),this._emitter.emit(L.Z.RECOMMEND_SEEKPOINT,n)}},e.prototype._enableStatisticsReporter=function(){null==this._statisticsReporter&&(this._statisticsReporter=self.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval))},e.prototype._disableStatisticsReporter=function(){this._statisticsReporter&&(self.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype._reportSegmentMediaInfo=function(e){var t=this._mediaInfo.segments[e],i=Object.assign({},t);i.duration=this._mediaInfo.duration,i.segmentCount=this._mediaInfo.segmentCount,delete i.segments,delete i.keyframesIndex,this._emitter.emit(L.Z.MEDIA_INFO,i)},e.prototype._reportStatisticsInfo=function(){var e={};e.url=this._ioctl.currentURL,e.hasRedirect=this._ioctl.hasRedirect,e.hasRedirect&&(e.redirectedURL=this._ioctl.currentRedirectedURL),e.speed=this._ioctl.currentSpeed,e.loaderType=this._ioctl.loaderType,e.currentSegmentIndex=this._currentSegmentIndex,e.totalSegmentCount=this._mediaDataSource.segments.length,this._emitter.emit(L.Z.STATISTICS_INFO,e)},e}()},257:function(e,t){"use strict";t.Z={IO_ERROR:"io_error",DEMUX_ERROR:"demux_error",INIT_SEGMENT:"init_segment",MEDIA_SEGMENT:"media_segment",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",STATISTICS_INFO:"statistics_info",RECOMMEND_SEEKPOINT:"recommend_seekpoint"}},82:function(e,t,i){"use strict";i(846),i(219),i(949),i(257)},600:function(e,t){"use strict";t.Z={OK:"OK",FORMAT_ERROR:"FormatError",FORMAT_UNSUPPORTED:"FormatUnsupported",CODEC_UNSUPPORTED:"CodecUnsupported"}},60:function(e,t,i){"use strict";i.d(t,{default:function(){return D}});var n=i(219),r=i(191),s={enableWorker:!1,enableStashBuffer:!0,stashInitialSize:void 0,isLive:!1,lazyLoad:!0,lazyLoadMaxDuration:180,lazyLoadRecoverDuration:30,deferLoadAfterSourceOpen:!0,autoCleanupMaxBackwardDuration:180,autoCleanupMinBackwardDuration:120,statisticsInfoReportInterval:600,fixAudioTimestampGap:!0,accurateSeek:!1,seekType:"range",seekParamStart:"bstart",seekParamEnd:"bend",rangeLoadZeroStart:!1,customSeekHandler:void 0,reuseRedirectedURL:!1,headers:void 0,customLoader:void 0};function o(){return Object.assign({},s)}var a=function(){function e(){}return e.supportMSEH264Playback=function(){return window.MediaSource&&window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')},e.supportNetworkStreamIO=function(){var e=new r.Z({},o()),t=e.loaderType;return e.destroy(),"fetch-stream-loader"==t||"xhr-moz-chunked-loader"==t},e.getNetworkLoaderTypeName=function(){var e=new r.Z({},o()),t=e.loaderType;return e.destroy(),t},e.supportNativeMediaPlayback=function(t){null==e.videoElement&&(e.videoElement=window.document.createElement("video"));var i=e.videoElement.canPlayType(t);return"probably"===i||"maybe"==i},e.getFeatureList=function(){var t={mseFlvPlayback:!1,mseLiveFlvPlayback:!1,networkStreamIO:!1,networkLoaderName:"",nativeMP4H264Playback:!1,nativeWebmVP8Playback:!1,nativeWebmVP9Playback:!1};return t.mseFlvPlayback=e.supportMSEH264Playback(),t.networkStreamIO=e.supportNetworkStreamIO(),t.networkLoaderName=e.getNetworkLoaderTypeName(),t.mseLiveFlvPlayback=t.mseFlvPlayback&&t.networkStreamIO,t.nativeMP4H264Playback=e.supportNativeMediaPlayback('video/mp4; codecs="avc1.42001E, mp4a.40.2"'),t.nativeWebmVP8Playback=e.supportNativeMediaPlayback('video/webm; codecs="vp8.0, vorbis"'),t.nativeWebmVP9Playback=e.supportNativeMediaPlayback('video/webm; codecs="vp9"'),t},e}(),h=i(939),u=i(716),l=i.n(u),d=i(300),c=i(538),f={ERROR:"error",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",STATISTICS_INFO:"statistics_info"},_=i(397),p=i.n(_),m=i(846),g=i(949),v=i(257),y=i(118),b=function(){function e(e,t){if(this.TAG="Transmuxer",this._emitter=new(l()),t.enableWorker&&"undefined"!=typeof Worker)try{this._worker=p()(82),this._workerDestroying=!1,this._worker.addEventListener("message",this._onWorkerMessage.bind(this)),this._worker.postMessage({cmd:"init",param:[e,t]}),this.e={onLoggingConfigChanged:this._onLoggingConfigChanged.bind(this)},m.Z.registerListener(this.e.onLoggingConfigChanged),this._worker.postMessage({cmd:"logging_config",param:m.Z.getConfig()})}catch(i){d.Z.e(this.TAG,"Error while initialize transmuxing worker, fallback to inline transmuxing"),this._worker=null,this._controller=new g.Z(e,t)}else this._controller=new g.Z(e,t);if(this._controller){var i=this._controller;i.on(v.Z.IO_ERROR,this._onIOError.bind(this)),i.on(v.Z.DEMUX_ERROR,this._onDemuxError.bind(this)),i.on(v.Z.INIT_SEGMENT,this._onInitSegment.bind(this)),i.on(v.Z.MEDIA_SEGMENT,this._onMediaSegment.bind(this)),i.on(v.Z.LOADING_COMPLETE,this._onLoadingComplete.bind(this)),i.on(v.Z.RECOVERED_EARLY_EOF,this._onRecoveredEarlyEof.bind(this)),i.on(v.Z.MEDIA_INFO,this._onMediaInfo.bind(this)),i.on(v.Z.METADATA_ARRIVED,this._onMetaDataArrived.bind(this)),i.on(v.Z.SCRIPTDATA_ARRIVED,this._onScriptDataArrived.bind(this)),i.on(v.Z.STATISTICS_INFO,this._onStatisticsInfo.bind(this)),i.on(v.Z.RECOMMEND_SEEKPOINT,this._onRecommendSeekpoint.bind(this))}}return e.prototype.destroy=function(){this._worker?this._workerDestroying||(this._workerDestroying=!0,this._worker.postMessage({cmd:"destroy"}),m.Z.removeListener(this.e.onLoggingConfigChanged),this.e=null):(this._controller.destroy(),this._controller=null),this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.hasWorker=function(){return null!=this._worker},e.prototype.open=function(){this._worker?this._worker.postMessage({cmd:"start"}):this._controller.start()},e.prototype.close=function(){this._worker?this._worker.postMessage({cmd:"stop"}):this._controller.stop()},e.prototype.seek=function(e){this._worker?this._worker.postMessage({cmd:"seek",param:e}):this._controller.seek(e)},e.prototype.pause=function(){this._worker?this._worker.postMessage({cmd:"pause"}):this._controller.pause()},e.prototype.resume=function(){this._worker?this._worker.postMessage({cmd:"resume"}):this._controller.resume()},e.prototype._onInitSegment=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.Z.INIT_SEGMENT,e,t)}))},e.prototype._onMediaSegment=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.Z.MEDIA_SEGMENT,e,t)}))},e.prototype._onLoadingComplete=function(){var e=this;Promise.resolve().then((function(){e._emitter.emit(v.Z.LOADING_COMPLETE)}))},e.prototype._onRecoveredEarlyEof=function(){var e=this;Promise.resolve().then((function(){e._emitter.emit(v.Z.RECOVERED_EARLY_EOF)}))},e.prototype._onMediaInfo=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.Z.MEDIA_INFO,e)}))},e.prototype._onMetaDataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.Z.METADATA_ARRIVED,e)}))},e.prototype._onScriptDataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.Z.SCRIPTDATA_ARRIVED,e)}))},e.prototype._onStatisticsInfo=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.Z.STATISTICS_INFO,e)}))},e.prototype._onIOError=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.Z.IO_ERROR,e,t)}))},e.prototype._onDemuxError=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.Z.DEMUX_ERROR,e,t)}))},e.prototype._onRecommendSeekpoint=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.Z.RECOMMEND_SEEKPOINT,e)}))},e.prototype._onLoggingConfigChanged=function(e){this._worker&&this._worker.postMessage({cmd:"logging_config",param:e})},e.prototype._onWorkerMessage=function(e){var t=e.data,i=t.data;if("destroyed"===t.msg||this._workerDestroying)return this._workerDestroying=!1,this._worker.terminate(),void(this._worker=null);switch(t.msg){case v.Z.INIT_SEGMENT:case v.Z.MEDIA_SEGMENT:this._emitter.emit(t.msg,i.type,i.data);break;case v.Z.LOADING_COMPLETE:case v.Z.RECOVERED_EARLY_EOF:this._emitter.emit(t.msg);break;case v.Z.MEDIA_INFO:Object.setPrototypeOf(i,y.Z.prototype),this._emitter.emit(t.msg,i);break;case v.Z.METADATA_ARRIVED:case v.Z.SCRIPTDATA_ARRIVED:case v.Z.STATISTICS_INFO:this._emitter.emit(t.msg,i);break;case v.Z.IO_ERROR:case v.Z.DEMUX_ERROR:this._emitter.emit(t.msg,i.type,i.info);break;case v.Z.RECOMMEND_SEEKPOINT:this._emitter.emit(t.msg,i);break;case"logcat_callback":d.Z.emitter.emit("log",i.type,i.logcat)}},e}(),E={ERROR:"error",SOURCE_OPEN:"source_open",UPDATE_END:"update_end",BUFFER_FULL:"buffer_full"},S=i(51),A=i(29),L=function(){function e(e){this.TAG="MSEController",this._config=e,this._emitter=new(l()),this._config.isLive&&null==this._config.autoCleanupSourceBuffer&&(this._config.autoCleanupSourceBuffer=!0),this.e={onSourceOpen:this._onSourceOpen.bind(this),onSourceEnded:this._onSourceEnded.bind(this),onSourceClose:this._onSourceClose.bind(this),onSourceBufferError:this._onSourceBufferError.bind(this),onSourceBufferUpdateEnd:this._onSourceBufferUpdateEnd.bind(this)},this._mediaSource=null,this._mediaSourceObjectURL=null,this._mediaElement=null,this._isBufferFull=!1,this._hasPendingEos=!1,this._requireSetMediaDuration=!1,this._pendingMediaDuration=0,this._pendingSourceBufferInit=[],this._mimeTypes={video:null,audio:null},this._sourceBuffers={video:null,audio:null},this._lastInitSegments={video:null,audio:null},this._pendingSegments={video:[],audio:[]},this._pendingRemoveRanges={video:[],audio:[]},this._idrList=new S.Vn}return e.prototype.destroy=function(){(this._mediaElement||this._mediaSource)&&this.detachMediaElement(),this.e=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){if(this._mediaSource)throw new A.rT("MediaSource has been attached to an HTMLMediaElement!");var t=this._mediaSource=new window.MediaSource;t.addEventListener("sourceopen",this.e.onSourceOpen),t.addEventListener("sourceended",this.e.onSourceEnded),t.addEventListener("sourceclose",this.e.onSourceClose),this._mediaElement=e,this._mediaSourceObjectURL=window.URL.createObjectURL(this._mediaSource),e.src=this._mediaSourceObjectURL},e.prototype.detachMediaElement=function(){if(this._mediaSource){var e=this._mediaSource;for(var t in this._sourceBuffers){var i=this._pendingSegments[t];i.splice(0,i.length),this._pendingSegments[t]=null,this._pendingRemoveRanges[t]=null,this._lastInitSegments[t]=null;var n=this._sourceBuffers[t];if(n){if("closed"!==e.readyState){try{e.removeSourceBuffer(n)}catch(e){d.Z.e(this.TAG,e.message)}n.removeEventListener("error",this.e.onSourceBufferError),n.removeEventListener("updateend",this.e.onSourceBufferUpdateEnd)}this._mimeTypes[t]=null,this._sourceBuffers[t]=null}}if("open"===e.readyState)try{e.endOfStream()}catch(e){d.Z.e(this.TAG,e.message)}e.removeEventListener("sourceopen",this.e.onSourceOpen),e.removeEventListener("sourceended",this.e.onSourceEnded),e.removeEventListener("sourceclose",this.e.onSourceClose),this._pendingSourceBufferInit=[],this._isBufferFull=!1,this._idrList.clear(),this._mediaSource=null}this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src"),this._mediaElement=null),this._mediaSourceObjectURL&&(window.URL.revokeObjectURL(this._mediaSourceObjectURL),this._mediaSourceObjectURL=null)},e.prototype.appendInitSegment=function(e,t){if(!this._mediaSource||"open"!==this._mediaSource.readyState)return this._pendingSourceBufferInit.push(e),void this._pendingSegments[e.type].push(e);var i=e,n=""+i.container;i.codec&&i.codec.length>0&&(n+=";codecs="+i.codec);var r=!1;if(d.Z.v(this.TAG,"Received Initialization Segment, mimeType: "+n),this._lastInitSegments[i.type]=i,n!==this._mimeTypes[i.type]){if(this._mimeTypes[i.type])d.Z.v(this.TAG,"Notice: "+i.type+" mimeType changed, origin: "+this._mimeTypes[i.type]+", target: "+n);else{r=!0;try{var s=this._sourceBuffers[i.type]=this._mediaSource.addSourceBuffer(n);s.addEventListener("error",this.e.onSourceBufferError),s.addEventListener("updateend",this.e.onSourceBufferUpdateEnd)}catch(e){return d.Z.e(this.TAG,e.message),void this._emitter.emit(E.ERROR,{code:e.code,msg:e.message})}}this._mimeTypes[i.type]=n}t||this._pendingSegments[i.type].push(i),r||this._sourceBuffers[i.type]&&!this._sourceBuffers[i.type].updating&&this._doAppendSegments(),c.Z.safari&&"audio/mpeg"===i.container&&i.mediaDuration>0&&(this._requireSetMediaDuration=!0,this._pendingMediaDuration=i.mediaDuration/1e3,this._updateMediaSourceDuration())},e.prototype.appendMediaSegment=function(e){var t=e;this._pendingSegments[t.type].push(t),this._config.autoCleanupSourceBuffer&&this._needCleanupSourceBuffer()&&this._doCleanupSourceBuffer();var i=this._sourceBuffers[t.type];!i||i.updating||this._hasPendingRemoveRanges()||this._doAppendSegments()},e.prototype.seek=function(e){for(var t in this._sourceBuffers)if(this._sourceBuffers[t]){var i=this._sourceBuffers[t];if("open"===this._mediaSource.readyState)try{i.abort()}catch(e){d.Z.e(this.TAG,e.message)}this._idrList.clear();var n=this._pendingSegments[t];if(n.splice(0,n.length),"closed"!==this._mediaSource.readyState){for(var r=0;r=1&&e-n.start(0)>=this._config.autoCleanupMaxBackwardDuration)return!0}}return!1},e.prototype._doCleanupSourceBuffer=function(){var e=this._mediaElement.currentTime;for(var t in this._sourceBuffers){var i=this._sourceBuffers[t];if(i){for(var n=i.buffered,r=!1,s=0;s=this._config.autoCleanupMaxBackwardDuration){r=!0;var h=e-this._config.autoCleanupMinBackwardDuration;this._pendingRemoveRanges[t].push({start:o,end:h})}}else a0&&(isNaN(t)||i>t)&&(d.Z.v(this.TAG,"Update MediaSource duration from "+t+" to "+i),this._mediaSource.duration=i),this._requireSetMediaDuration=!1,this._pendingMediaDuration=0}},e.prototype._doRemoveRanges=function(){for(var e in this._pendingRemoveRanges)if(this._sourceBuffers[e]&&!this._sourceBuffers[e].updating)for(var t=this._sourceBuffers[e],i=this._pendingRemoveRanges[e];i.length&&!t.updating;){var n=i.shift();t.remove(n.start,n.end)}},e.prototype._doAppendSegments=function(){var e=this._pendingSegments;for(var t in e)if(this._sourceBuffers[t]&&!this._sourceBuffers[t].updating&&e[t].length>0){var i=e[t].shift();if(i.timestampOffset){var n=this._sourceBuffers[t].timestampOffset,r=i.timestampOffset/1e3;Math.abs(n-r)>.1&&(d.Z.v(this.TAG,"Update MPEG audio timestampOffset from "+n+" to "+r),this._sourceBuffers[t].timestampOffset=r),delete i.timestampOffset}if(!i.data||0===i.data.byteLength)continue;try{this._sourceBuffers[t].appendBuffer(i.data),this._isBufferFull=!1,"video"===t&&i.hasOwnProperty("info")&&this._idrList.appendArray(i.info.syncPoints)}catch(e){this._pendingSegments[t].unshift(i),22===e.code?(this._isBufferFull||this._emitter.emit(E.BUFFER_FULL),this._isBufferFull=!0):(d.Z.e(this.TAG,e.message),this._emitter.emit(E.ERROR,{code:e.code,msg:e.message}))}}},e.prototype._onSourceOpen=function(){if(d.Z.v(this.TAG,"MediaSource onSourceOpen"),this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._pendingSourceBufferInit.length>0)for(var e=this._pendingSourceBufferInit;e.length;){var t=e.shift();this.appendInitSegment(t,!0)}this._hasPendingSegments()&&this._doAppendSegments(),this._emitter.emit(E.SOURCE_OPEN)},e.prototype._onSourceEnded=function(){d.Z.v(this.TAG,"MediaSource onSourceEnded")},e.prototype._onSourceClose=function(){d.Z.v(this.TAG,"MediaSource onSourceClose"),this._mediaSource&&null!=this.e&&(this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._mediaSource.removeEventListener("sourceended",this.e.onSourceEnded),this._mediaSource.removeEventListener("sourceclose",this.e.onSourceClose))},e.prototype._hasPendingSegments=function(){var e=this._pendingSegments;return e.video.length>0||e.audio.length>0},e.prototype._hasPendingRemoveRanges=function(){var e=this._pendingRemoveRanges;return e.video.length>0||e.audio.length>0},e.prototype._onSourceBufferUpdateEnd=function(){this._requireSetMediaDuration?this._updateMediaSourceDuration():this._hasPendingRemoveRanges()?this._doRemoveRanges():this._hasPendingSegments()?this._doAppendSegments():this._hasPendingEos&&this.endOfStream(),this._emitter.emit(E.UPDATE_END)},e.prototype._onSourceBufferError=function(e){d.Z.e(this.TAG,"SourceBuffer Error: "+e)},e}(),R=i(600),w={NETWORK_ERROR:"NetworkError",MEDIA_ERROR:"MediaError",OTHER_ERROR:"OtherError"},O={NETWORK_EXCEPTION:h.nm.EXCEPTION,NETWORK_STATUS_CODE_INVALID:h.nm.HTTP_STATUS_CODE_INVALID,NETWORK_TIMEOUT:h.nm.CONNECTING_TIMEOUT,NETWORK_UNRECOVERABLE_EARLY_EOF:h.nm.UNRECOVERABLE_EARLY_EOF,MEDIA_MSE_ERROR:"MediaMSEError",MEDIA_FORMAT_ERROR:R.Z.FORMAT_ERROR,MEDIA_FORMAT_UNSUPPORTED:R.Z.FORMAT_UNSUPPORTED,MEDIA_CODEC_UNSUPPORTED:R.Z.CODEC_UNSUPPORTED},T=function(){function e(e,t){if(this.TAG="FlvPlayer",this._type="FlvPlayer",this._emitter=new(l()),this._config=o(),"object"==typeof t&&Object.assign(this._config,t),"flv"!==e.type.toLowerCase())throw new A.OC("FlvPlayer requires an flv MediaDataSource input!");!0===e.isLive&&(this._config.isLive=!0),this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this),onvSeeking:this._onvSeeking.bind(this),onvCanPlay:this._onvCanPlay.bind(this),onvStalled:this._onvStalled.bind(this),onvProgress:this._onvProgress.bind(this)},self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now,this._pendingSeekTime=null,this._requestSetTime=!1,this._seekpointRecord=null,this._progressChecker=null,this._mediaDataSource=e,this._mediaElement=null,this._msectl=null,this._transmuxer=null,this._mseSourceOpened=!1,this._hasPendingLoad=!1,this._receivedCanPlay=!1,this._mediaInfo=null,this._statisticsInfo=null;var i=c.Z.chrome&&(c.Z.version.major<50||50===c.Z.version.major&&c.Z.version.build<2661);this._alwaysSeekKeyframe=!!(i||c.Z.msedge||c.Z.msie),this._alwaysSeekKeyframe&&(this._config.accurateSeek=!1)}return e.prototype.destroy=function(){null!=this._progressChecker&&(window.clearInterval(this._progressChecker),this._progressChecker=null),this._transmuxer&&this.unload(),this._mediaElement&&this.detachMediaElement(),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var i=this;e===f.MEDIA_INFO?null!=this._mediaInfo&&Promise.resolve().then((function(){i._emitter.emit(f.MEDIA_INFO,i.mediaInfo)})):e===f.STATISTICS_INFO&&null!=this._statisticsInfo&&Promise.resolve().then((function(){i._emitter.emit(f.STATISTICS_INFO,i.statisticsInfo)})),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){var t=this;if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),e.addEventListener("seeking",this.e.onvSeeking),e.addEventListener("canplay",this.e.onvCanPlay),e.addEventListener("stalled",this.e.onvStalled),e.addEventListener("progress",this.e.onvProgress),this._msectl=new L(this._config),this._msectl.on(E.UPDATE_END,this._onmseUpdateEnd.bind(this)),this._msectl.on(E.BUFFER_FULL,this._onmseBufferFull.bind(this)),this._msectl.on(E.SOURCE_OPEN,(function(){t._mseSourceOpened=!0,t._hasPendingLoad&&(t._hasPendingLoad=!1,t.load())})),this._msectl.on(E.ERROR,(function(e){t._emitter.emit(f.ERROR,w.MEDIA_ERROR,O.MEDIA_MSE_ERROR,e)})),this._msectl.attachMediaElement(e),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._msectl.detachMediaElement(),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement.removeEventListener("seeking",this.e.onvSeeking),this._mediaElement.removeEventListener("canplay",this.e.onvCanPlay),this._mediaElement.removeEventListener("stalled",this.e.onvStalled),this._mediaElement.removeEventListener("progress",this.e.onvProgress),this._mediaElement=null),this._msectl&&(this._msectl.destroy(),this._msectl=null)},e.prototype.load=function(){var e=this;if(!this._mediaElement)throw new A.rT("HTMLMediaElement must be attached before load()!");if(this._transmuxer)throw new A.rT("FlvPlayer.load() has been called, please call unload() first!");this._hasPendingLoad||(this._config.deferLoadAfterSourceOpen&&!1===this._mseSourceOpened?this._hasPendingLoad=!0:(this._mediaElement.readyState>0&&(this._requestSetTime=!0,this._mediaElement.currentTime=0),this._transmuxer=new b(this._mediaDataSource,this._config),this._transmuxer.on(v.Z.INIT_SEGMENT,(function(t,i){e._msectl.appendInitSegment(i)})),this._transmuxer.on(v.Z.MEDIA_SEGMENT,(function(t,i){if(e._msectl.appendMediaSegment(i),e._config.lazyLoad&&!e._config.isLive){var n=e._mediaElement.currentTime;i.info.endDts>=1e3*(n+e._config.lazyLoadMaxDuration)&&null==e._progressChecker&&(d.Z.v(e.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),e._suspendTransmuxer())}})),this._transmuxer.on(v.Z.LOADING_COMPLETE,(function(){e._msectl.endOfStream(),e._emitter.emit(f.LOADING_COMPLETE)})),this._transmuxer.on(v.Z.RECOVERED_EARLY_EOF,(function(){e._emitter.emit(f.RECOVERED_EARLY_EOF)})),this._transmuxer.on(v.Z.IO_ERROR,(function(t,i){e._emitter.emit(f.ERROR,w.NETWORK_ERROR,t,i)})),this._transmuxer.on(v.Z.DEMUX_ERROR,(function(t,i){e._emitter.emit(f.ERROR,w.MEDIA_ERROR,t,{code:-1,msg:i})})),this._transmuxer.on(v.Z.MEDIA_INFO,(function(t){e._mediaInfo=t,e._emitter.emit(f.MEDIA_INFO,Object.assign({},t))})),this._transmuxer.on(v.Z.METADATA_ARRIVED,(function(t){e._emitter.emit(f.METADATA_ARRIVED,t)})),this._transmuxer.on(v.Z.SCRIPTDATA_ARRIVED,(function(t){e._emitter.emit(f.SCRIPTDATA_ARRIVED,t)})),this._transmuxer.on(v.Z.STATISTICS_INFO,(function(t){e._statisticsInfo=e._fillStatisticsInfo(t),e._emitter.emit(f.STATISTICS_INFO,Object.assign({},e._statisticsInfo))})),this._transmuxer.on(v.Z.RECOMMEND_SEEKPOINT,(function(t){e._mediaElement&&!e._config.accurateSeek&&(e._requestSetTime=!0,e._mediaElement.currentTime=t/1e3)})),this._transmuxer.open()))},e.prototype.unload=function(){this._mediaElement&&this._mediaElement.pause(),this._msectl&&this._msectl.seek(0),this._transmuxer&&(this._transmuxer.close(),this._transmuxer.destroy(),this._transmuxer=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._internalSeek(e):this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return Object.assign({},this._mediaInfo)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return null==this._statisticsInfo&&(this._statisticsInfo={}),this._statisticsInfo=this._fillStatisticsInfo(this._statisticsInfo),Object.assign({},this._statisticsInfo)},enumerable:!1,configurable:!0}),e.prototype._fillStatisticsInfo=function(e){if(e.playerType=this._type,!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var r=this._mediaElement.getVideoPlaybackQuality();i=r.totalVideoFrames,n=r.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},e.prototype._onmseUpdateEnd=function(){if(this._config.lazyLoad&&!this._config.isLive){for(var e=this._mediaElement.buffered,t=this._mediaElement.currentTime,i=0,n=0;n=t+this._config.lazyLoadMaxDuration&&null==this._progressChecker&&(d.Z.v(this.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),this._suspendTransmuxer())}},e.prototype._onmseBufferFull=function(){d.Z.v(this.TAG,"MSE SourceBuffer is full, suspend transmuxing task"),null==this._progressChecker&&this._suspendTransmuxer()},e.prototype._suspendTransmuxer=function(){this._transmuxer&&(this._transmuxer.pause(),null==this._progressChecker&&(this._progressChecker=window.setInterval(this._checkProgressAndResume.bind(this),1e3)))},e.prototype._checkProgressAndResume=function(){for(var e=this._mediaElement.currentTime,t=this._mediaElement.buffered,i=!1,n=0;n=r&&e=s-this._config.lazyLoadRecoverDuration&&(i=!0);break}}i&&(window.clearInterval(this._progressChecker),this._progressChecker=null,i&&(d.Z.v(this.TAG,"Continue loading from paused position"),this._transmuxer.resume()))},e.prototype._isTimepointBuffered=function(e){for(var t=this._mediaElement.buffered,i=0;i=n&&e0){var r=this._mediaElement.buffered.start(0);(r<1&&e0&&t.currentTime0){var n=i.start(0);if(n<1&&t0&&(this._mediaElement.currentTime=0),this._mediaElement.preload="auto",this._mediaElement.load(),this._statisticsReporter=window.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval)},e.prototype.unload=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src")),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._mediaElement.currentTime=e:this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){var e={mimeType:(this._mediaElement instanceof HTMLAudioElement?"audio/":"video/")+this._mediaDataSource.type};return this._mediaElement&&(e.duration=Math.floor(1e3*this._mediaElement.duration),this._mediaElement instanceof HTMLVideoElement&&(e.width=this._mediaElement.videoWidth,e.height=this._mediaElement.videoHeight)),e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){var e={playerType:this._type,url:this._mediaDataSource.url};if(!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var r=this._mediaElement.getVideoPlaybackQuality();i=r.totalVideoFrames,n=r.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},enumerable:!1,configurable:!0}),e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null),this._emitter.emit(f.MEDIA_INFO,this.mediaInfo)},e.prototype._reportStatisticsInfo=function(){this._emitter.emit(f.STATISTICS_INFO,this.statisticsInfo)},e}();n.Z.install();var k={createPlayer:function(e,t){var i=e;if(null==i||"object"!=typeof i)throw new A.OC("MediaDataSource must be an javascript object!");if(!i.hasOwnProperty("type"))throw new A.OC("MediaDataSource must has type field to indicate video file type!");switch(i.type){case"flv":return new T(i,t);default:return new C(i,t)}},isSupported:function(){return a.supportMSEH264Playback()},getFeatureList:function(){return a.getFeatureList()}};k.BaseLoader=h.fp,k.LoaderStatus=h.GM,k.LoaderErrors=h.nm,k.Events=f,k.ErrorTypes=w,k.ErrorDetails=O,k.FlvPlayer=T,k.NativePlayer=C,k.LoggingControl=m.Z,Object.defineProperty(k,"version",{enumerable:!0,get:function(){return"1.6.2"}});var D=k},324:function(e,t,i){e.exports=i(60).default},191:function(e,t,i){"use strict";i.d(t,{Z:function(){return y}});var n,r=i(300),s=function(){function e(){this._firstCheckpoint=0,this._lastCheckpoint=0,this._intervalBytes=0,this._totalBytes=0,this._lastSecondBytes=0,self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now}return e.prototype.reset=function(){this._firstCheckpoint=this._lastCheckpoint=0,this._totalBytes=this._intervalBytes=0,this._lastSecondBytes=0},e.prototype.addBytes=function(e){0===this._firstCheckpoint?(this._firstCheckpoint=this._now(),this._lastCheckpoint=this._firstCheckpoint,this._intervalBytes+=e,this._totalBytes+=e):this._now()-this._lastCheckpoint<1e3?(this._intervalBytes+=e,this._totalBytes+=e):(this._lastSecondBytes=this._intervalBytes,this._intervalBytes=e,this._totalBytes+=e,this._lastCheckpoint=this._now())},Object.defineProperty(e.prototype,"currentKBps",{get:function(){this.addBytes(0);var e=(this._now()-this._lastCheckpoint)/1e3;return 0==e&&(e=1),this._intervalBytes/e/1024},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastSecondKBps",{get:function(){return this.addBytes(0),0!==this._lastSecondBytes?this._lastSecondBytes/1024:this._now()-this._lastCheckpoint>=500?this.currentKBps:0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"averageKBps",{get:function(){var e=(this._now()-this._firstCheckpoint)/1e3;return this._totalBytes/e/1024},enumerable:!1,configurable:!0}),e}(),o=i(939),a=i(538),h=i(29),u=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])})(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),l=function(e){function t(t,i){var n=e.call(this,"fetch-stream-loader")||this;return n.TAG="FetchStreamLoader",n._seekHandler=t,n._config=i,n._needStash=!0,n._requestAbort=!1,n._contentLength=null,n._receivedLength=0,n}return u(t,e),t.isSupported=function(){try{var e=a.Z.msedge&&a.Z.version.minor>=15048,t=!a.Z.msedge||e;return self.fetch&&self.ReadableStream&&t}catch(e){return!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){var i=this;this._dataSource=e,this._range=t;var n=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(n=e.redirectedURL);var r=this._seekHandler.getConfig(n,t),s=new self.Headers;if("object"==typeof r.headers){var a=r.headers;for(var u in a)a.hasOwnProperty(u)&&s.append(u,a[u])}var l={method:"GET",headers:s,mode:"cors",cache:"default",referrerPolicy:"no-referrer-when-downgrade"};if("object"==typeof this._config.headers)for(var u in this._config.headers)s.append(u,this._config.headers[u]);!1===e.cors&&(l.mode="same-origin"),e.withCredentials&&(l.credentials="include"),e.referrerPolicy&&(l.referrerPolicy=e.referrerPolicy),self.AbortController&&(this._abortController=new self.AbortController,l.signal=this._abortController.signal),this._status=o.GM.kConnecting,self.fetch(r.url,l).then((function(e){if(i._requestAbort)return i._status=o.GM.kIdle,void e.body.cancel();if(e.ok&&e.status>=200&&e.status<=299){if(e.url!==r.url&&i._onURLRedirect){var t=i._seekHandler.removeURLParameters(e.url);i._onURLRedirect(t)}var n=e.headers.get("Content-Length");return null!=n&&(i._contentLength=parseInt(n),0!==i._contentLength&&i._onContentLengthKnown&&i._onContentLengthKnown(i._contentLength)),i._pump.call(i,e.body.getReader())}if(i._status=o.GM.kError,!i._onError)throw new h.OZ("FetchStreamLoader: Http code invalid, "+e.status+" "+e.statusText);i._onError(o.nm.HTTP_STATUS_CODE_INVALID,{code:e.status,msg:e.statusText})})).catch((function(e){if(!i._abortController||!i._abortController.signal.aborted){if(i._status=o.GM.kError,!i._onError)throw e;i._onError(o.nm.EXCEPTION,{code:-1,msg:e.message})}}))},t.prototype.abort=function(){if(this._requestAbort=!0,(this._status!==o.GM.kBuffering||!a.Z.chrome)&&this._abortController)try{this._abortController.abort()}catch(e){}},t.prototype._pump=function(e){var t=this;return e.read().then((function(i){if(i.done)if(null!==t._contentLength&&t._receivedLength299)){if(this._status=o.GM.kError,!this._onError)throw new h.OZ("MozChunkedLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(o.nm.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}else this._status=o.GM.kBuffering}},t.prototype._onProgress=function(e){if(this._status!==o.GM.kError){null===this._contentLength&&null!==e.total&&0!==e.total&&(this._contentLength=e.total,this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength));var t=e.target.response,i=this._range.from+this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,i,this._receivedLength)}},t.prototype._onLoadEnd=function(e){!0!==this._requestAbort?this._status!==o.GM.kError&&(this._status=o.GM.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1)):this._requestAbort=!1},t.prototype._onXhrError=function(e){this._status=o.GM.kError;var t=0,i=null;if(this._contentLength&&e.loaded=this._contentLength&&(i=this._range.from+this._contentLength-1),this._currentRequestRange={from:t,to:i},this._internalOpen(this._dataSource,this._currentRequestRange)},t.prototype._internalOpen=function(e,t){this._lastTimeLoaded=0;var i=e.url;this._config.reuseRedirectedURL&&(null!=this._currentRedirectedURL?i=this._currentRedirectedURL:null!=e.redirectedURL&&(i=e.redirectedURL));var n=this._seekHandler.getConfig(i,t);this._currentRequestURL=n.url;var r=this._xhr=new XMLHttpRequest;if(r.open("GET",n.url,!0),r.responseType="arraybuffer",r.onreadystatechange=this._onReadyStateChange.bind(this),r.onprogress=this._onProgress.bind(this),r.onload=this._onLoad.bind(this),r.onerror=this._onXhrError.bind(this),e.withCredentials&&(r.withCredentials=!0),"object"==typeof n.headers){var s=n.headers;for(var o in s)s.hasOwnProperty(o)&&r.setRequestHeader(o,s[o])}if("object"==typeof this._config.headers){s=this._config.headers;for(var o in s)s.hasOwnProperty(o)&&r.setRequestHeader(o,s[o])}r.send()},t.prototype.abort=function(){this._requestAbort=!0,this._internalAbort(),this._status=o.GM.kComplete},t.prototype._internalAbort=function(){this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr.abort(),this._xhr=null)},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL){var i=this._seekHandler.removeURLParameters(t.responseURL);t.responseURL!==this._currentRequestURL&&i!==this._currentRedirectedURL&&(this._currentRedirectedURL=i,this._onURLRedirect&&this._onURLRedirect(i))}if(t.status>=200&&t.status<=299){if(this._waitForTotalLength)return;this._status=o.GM.kBuffering}else{if(this._status=o.GM.kError,!this._onError)throw new h.OZ("RangeLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(o.nm.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}}},t.prototype._onProgress=function(e){if(this._status!==o.GM.kError){if(null===this._contentLength){var t=!1;if(this._waitForTotalLength){this._waitForTotalLength=!1,this._totalLengthReceived=!0,t=!0;var i=e.total;this._internalAbort(),null!=i&0!==i&&(this._totalLength=i)}if(-1===this._range.to?this._contentLength=this._totalLength-this._range.from:this._contentLength=this._range.to-this._range.from+1,t)return void this._openSubRange();this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength)}var n=e.loaded-this._lastTimeLoaded;this._lastTimeLoaded=e.loaded,this._speedSampler.addBytes(n)}},t.prototype._normalizeSpeed=function(e){var t=this._chunkSizeKBList,i=t.length-1,n=0,r=0,s=i;if(e=t[n]&&e=3&&(t=this._speedSampler.currentKBps)),0!==t){var i=this._normalizeSpeed(t);this._currentSpeedNormalized!==i&&(this._currentSpeedNormalized=i,this._currentChunkSizeKB=i)}var n=e.target.response,r=this._range.from+this._receivedLength;this._receivedLength+=n.byteLength;var s=!1;null!=this._contentLength&&this._receivedLength0&&this._receivedLength0)for(var s=i.split("&"),o=0;o0;a[0]!==this._startName&&a[0]!==this._endName&&(h&&(r+="&"),r+=s[o])}return 0===r.length?t:t+"?"+r},e}(),y=function(){function e(e,t,i){this.TAG="IOController",this._config=t,this._extraData=i,this._stashInitialSize=393216,null!=t.stashInitialSize&&t.stashInitialSize>0&&(this._stashInitialSize=t.stashInitialSize),this._stashUsed=0,this._stashSize=this._stashInitialSize,this._bufferSize=3145728,this._stashBuffer=new ArrayBuffer(this._bufferSize),this._stashByteStart=0,this._enableStash=!0,!1===t.enableStashBuffer&&(this._enableStash=!1),this._loader=null,this._loaderClass=null,this._seekHandler=null,this._dataSource=e,this._isWebSocketURL=/wss?:\/\/(.+?)/.test(e.url),this._refTotalLength=e.filesize?e.filesize:null,this._totalLength=this._refTotalLength,this._fullRequestFlag=!1,this._currentRange=null,this._redirectedURL=null,this._speedNormalized=0,this._speedSampler=new s,this._speedNormalizeList=[64,128,256,384,512,768,1024,1536,2048,3072,4096],this._isEarlyEofReconnecting=!1,this._paused=!1,this._resumeFrom=0,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._selectSeekHandler(),this._selectLoader(),this._createLoader()}return e.prototype.destroy=function(){this._loader.isWorking()&&this._loader.abort(),this._loader.destroy(),this._loader=null,this._loaderClass=null,this._dataSource=null,this._stashBuffer=null,this._stashUsed=this._stashSize=this._bufferSize=this._stashByteStart=0,this._currentRange=null,this._speedSampler=null,this._isEarlyEofReconnecting=!1,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._extraData=null},e.prototype.isWorking=function(){return this._loader&&this._loader.isWorking()&&!this._paused},e.prototype.isPaused=function(){return this._paused},Object.defineProperty(e.prototype,"status",{get:function(){return this._loader.status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extraData",{get:function(){return this._extraData},set:function(e){this._extraData=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onSeeked",{get:function(){return this._onSeeked},set:function(e){this._onSeeked=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRedirect",{get:function(){return this._onRedirect},set:function(e){this._onRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRecoveredEarlyEof",{get:function(){return this._onRecoveredEarlyEof},set:function(e){this._onRecoveredEarlyEof=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentURL",{get:function(){return this._dataSource.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasRedirect",{get:function(){return null!=this._redirectedURL||null!=this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentRedirectedURL",{get:function(){return this._redirectedURL||this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentSpeed",{get:function(){return this._loaderClass===_?this._loader.currentSpeed:this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"loaderType",{get:function(){return this._loader.type},enumerable:!1,configurable:!0}),e.prototype._selectSeekHandler=function(){var e=this._config;if("range"===e.seekType)this._seekHandler=new g(this._config.rangeLoadZeroStart);else if("param"===e.seekType){var t=e.seekParamStart||"bstart",i=e.seekParamEnd||"bend";this._seekHandler=new v(t,i)}else{if("custom"!==e.seekType)throw new h.OC("Invalid seekType in config: "+e.seekType);if("function"!=typeof e.customSeekHandler)throw new h.OC("Custom seekType specified in config but invalid customSeekHandler!");this._seekHandler=new e.customSeekHandler}},e.prototype._selectLoader=function(){if(null!=this._config.customLoader)this._loaderClass=this._config.customLoader;else if(this._isWebSocketURL)this._loaderClass=m;else if(l.isSupported())this._loaderClass=l;else if(c.isSupported())this._loaderClass=c;else{if(!_.isSupported())throw new h.OZ("Your browser doesn't support xhr with arraybuffer responseType!");this._loaderClass=_}},e.prototype._createLoader=function(){this._loader=new this._loaderClass(this._seekHandler,this._config),!1===this._loader.needStashBuffer&&(this._enableStash=!1),this._loader.onContentLengthKnown=this._onContentLengthKnown.bind(this),this._loader.onURLRedirect=this._onURLRedirect.bind(this),this._loader.onDataArrival=this._onLoaderChunkArrival.bind(this),this._loader.onComplete=this._onLoaderComplete.bind(this),this._loader.onError=this._onLoaderError.bind(this)},e.prototype.open=function(e){this._currentRange={from:0,to:-1},e&&(this._currentRange.from=e),this._speedSampler.reset(),e||(this._fullRequestFlag=!0),this._loader.open(this._dataSource,Object.assign({},this._currentRange))},e.prototype.abort=function(){this._loader.abort(),this._paused&&(this._paused=!1,this._resumeFrom=0)},e.prototype.pause=function(){this.isWorking()&&(this._loader.abort(),0!==this._stashUsed?(this._resumeFrom=this._stashByteStart,this._currentRange.to=this._stashByteStart-1):this._resumeFrom=this._currentRange.to+1,this._stashUsed=0,this._stashByteStart=0,this._paused=!0)},e.prototype.resume=function(){if(this._paused){this._paused=!1;var e=this._resumeFrom;this._resumeFrom=0,this._internalSeek(e,!0)}},e.prototype.seek=function(e){this._paused=!1,this._stashUsed=0,this._stashByteStart=0,this._internalSeek(e,!0)},e.prototype._internalSeek=function(e,t){this._loader.isWorking()&&this._loader.abort(),this._flushStashBuffer(t),this._loader.destroy(),this._loader=null;var i={from:e,to:-1};this._currentRange={from:i.from,to:-1},this._speedSampler.reset(),this._stashSize=this._stashInitialSize,this._createLoader(),this._loader.open(this._dataSource,i),this._onSeeked&&this._onSeeked()},e.prototype.updateUrl=function(e){if(!e||"string"!=typeof e||0===e.length)throw new h.OC("Url must be a non-empty string!");this._dataSource.url=e},e.prototype._expandBuffer=function(e){for(var t=this._stashSize;t+10485760){var n=new Uint8Array(this._stashBuffer,0,this._stashUsed);new Uint8Array(i,0,t).set(n,0)}this._stashBuffer=i,this._bufferSize=t}},e.prototype._normalizeSpeed=function(e){var t=this._speedNormalizeList,i=t.length-1,n=0,r=0,s=i;if(e=t[n]&&e=512&&e<=1024?Math.floor(1.5*e):2*e)>8192&&(t=8192);var i=1024*t+1048576;this._bufferSize0){var s=this._stashBuffer.slice(0,this._stashUsed);if((u=this._dispatchChunks(s,this._stashByteStart))0){l=new Uint8Array(s,u);a.set(l,0),this._stashUsed=l.byteLength,this._stashByteStart+=u}}else this._stashUsed=0,this._stashByteStart+=u;this._stashUsed+e.byteLength>this._bufferSize&&(this._expandBuffer(this._stashUsed+e.byteLength),a=new Uint8Array(this._stashBuffer,0,this._bufferSize)),a.set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else{if((u=this._dispatchChunks(e,t))this._bufferSize&&(this._expandBuffer(o),a=new Uint8Array(this._stashBuffer,0,this._bufferSize)),a.set(new Uint8Array(e,u),0),this._stashUsed+=o,this._stashByteStart=t+u}}else if(0===this._stashUsed){var o;if((u=this._dispatchChunks(e,t))this._bufferSize&&this._expandBuffer(o),(a=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e,u),0),this._stashUsed+=o,this._stashByteStart=t+u}else{var a,u;if(this._stashUsed+e.byteLength>this._bufferSize&&this._expandBuffer(this._stashUsed+e.byteLength),(a=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength,(u=this._dispatchChunks(this._stashBuffer.slice(0,this._stashUsed),this._stashByteStart))0){var l=new Uint8Array(this._stashBuffer,u);a.set(l,0)}this._stashUsed-=u,this._stashByteStart+=u}}},e.prototype._flushStashBuffer=function(e){if(this._stashUsed>0){var t=this._stashBuffer.slice(0,this._stashUsed),i=this._dispatchChunks(t,this._stashByteStart),n=t.byteLength-i;if(i0){var s=new Uint8Array(this._stashBuffer,0,this._bufferSize),o=new Uint8Array(t,i);s.set(o,0),this._stashUsed=o.byteLength,this._stashByteStart+=i}return 0}r.Z.w(this.TAG,n+" bytes unconsumed data remain when flush buffer, dropped")}return this._stashUsed=0,this._stashByteStart=0,n}return 0},e.prototype._onLoaderComplete=function(e,t){this._flushStashBuffer(!0),this._onComplete&&this._onComplete(this._extraData)},e.prototype._onLoaderError=function(e,t){switch(r.Z.e(this.TAG,"Loader error, code = "+t.code+", msg = "+t.msg),this._flushStashBuffer(!1),this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,e=o.nm.UNRECOVERABLE_EARLY_EOF),e){case o.nm.EARLY_EOF:if(!this._config.isLive&&this._totalLength){var i=this._currentRange.to+1;return void(i=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(firefox)[ \/]([\w.]+)/.exec(e)||[],n=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(android)/.exec(e)||/(windows)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||[],r={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",majorVersion:t[4]||t[2]||"0",platform:n[0]||""},s={};if(r.browser){s[r.browser]=!0;var o=r.majorVersion.split(".");s.version={major:parseInt(r.majorVersion,10),string:r.version},o.length>1&&(s.version.minor=parseInt(o[1],10)),o.length>2&&(s.version.build=parseInt(o[2],10))}if(r.platform&&(s[r.platform]=!0),(s.chrome||s.opr||s.safari)&&(s.webkit=!0),s.rv||s.iemobile){s.rv&&delete s.rv;var a="msie";r.browser=a,s.msie=!0}if(s.edge){delete s.edge;var h="msedge";r.browser=h,s.msedge=!0}if(s.opr){var u="opera";r.browser=u,s.opera=!0}if(s.safari&&s.android){var l="android";r.browser=l,s.android=!0}for(var d in s.name=r.browser,s.platform=r.platform,i)i.hasOwnProperty(d)&&delete i[d];Object.assign(i,s)}(),t.Z=i},29:function(e,t,i){"use strict";i.d(t,{OZ:function(){return s},rT:function(){return o},OC:function(){return a},do:function(){return h}});var n,r=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])})(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),s=function(){function e(e){this._message=e}return Object.defineProperty(e.prototype,"name",{get:function(){return"RuntimeException"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this.name+": "+this.message},e}(),o=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"IllegalStateException"},enumerable:!1,configurable:!0}),t}(s),a=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"InvalidArgumentException"},enumerable:!1,configurable:!0}),t}(s),h=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"NotImplementedException"},enumerable:!1,configurable:!0}),t}(s)},300:function(e,t,i){"use strict";var n=i(716),r=i.n(n),s=function(){function e(){}return e.e=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","error",n),e.ENABLE_ERROR&&(console.error?console.error(n):console.warn?console.warn(n):console.log(n))},e.i=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","info",n),e.ENABLE_INFO&&(console.info?console.info(n):console.log(n))},e.w=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","warn",n),e.ENABLE_WARN&&(console.warn?console.warn(n):console.log(n))},e.d=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","debug",n),e.ENABLE_DEBUG&&(console.debug?console.debug(n):console.log(n))},e.v=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","verbose",n),e.ENABLE_VERBOSE&&console.log(n)},e}();s.GLOBAL_TAG="flv.js",s.FORCE_GLOBAL_TAG=!1,s.ENABLE_ERROR=!0,s.ENABLE_INFO=!0,s.ENABLE_WARN=!0,s.ENABLE_DEBUG=!0,s.ENABLE_VERBOSE=!0,s.ENABLE_CALLBACK=!1,s.emitter=new(r()),t.Z=s},846:function(e,t,i){"use strict";var n=i(716),r=i.n(n),s=i(300),o=function(){function e(){}return Object.defineProperty(e,"forceGlobalTag",{get:function(){return s.Z.FORCE_GLOBAL_TAG},set:function(t){s.Z.FORCE_GLOBAL_TAG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"globalTag",{get:function(){return s.Z.GLOBAL_TAG},set:function(t){s.Z.GLOBAL_TAG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableAll",{get:function(){return s.Z.ENABLE_VERBOSE&&s.Z.ENABLE_DEBUG&&s.Z.ENABLE_INFO&&s.Z.ENABLE_WARN&&s.Z.ENABLE_ERROR},set:function(t){s.Z.ENABLE_VERBOSE=t,s.Z.ENABLE_DEBUG=t,s.Z.ENABLE_INFO=t,s.Z.ENABLE_WARN=t,s.Z.ENABLE_ERROR=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableDebug",{get:function(){return s.Z.ENABLE_DEBUG},set:function(t){s.Z.ENABLE_DEBUG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableVerbose",{get:function(){return s.Z.ENABLE_VERBOSE},set:function(t){s.Z.ENABLE_VERBOSE=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableInfo",{get:function(){return s.Z.ENABLE_INFO},set:function(t){s.Z.ENABLE_INFO=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableWarn",{get:function(){return s.Z.ENABLE_WARN},set:function(t){s.Z.ENABLE_WARN=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableError",{get:function(){return s.Z.ENABLE_ERROR},set:function(t){s.Z.ENABLE_ERROR=t,e._notifyChange()},enumerable:!1,configurable:!0}),e.getConfig=function(){return{globalTag:s.Z.GLOBAL_TAG,forceGlobalTag:s.Z.FORCE_GLOBAL_TAG,enableVerbose:s.Z.ENABLE_VERBOSE,enableDebug:s.Z.ENABLE_DEBUG,enableInfo:s.Z.ENABLE_INFO,enableWarn:s.Z.ENABLE_WARN,enableError:s.Z.ENABLE_ERROR,enableCallback:s.Z.ENABLE_CALLBACK}},e.applyConfig=function(e){s.Z.GLOBAL_TAG=e.globalTag,s.Z.FORCE_GLOBAL_TAG=e.forceGlobalTag,s.Z.ENABLE_VERBOSE=e.enableVerbose,s.Z.ENABLE_DEBUG=e.enableDebug,s.Z.ENABLE_INFO=e.enableInfo,s.Z.ENABLE_WARN=e.enableWarn,s.Z.ENABLE_ERROR=e.enableError,s.Z.ENABLE_CALLBACK=e.enableCallback},e._notifyChange=function(){var t=e.emitter;if(t.listenerCount("change")>0){var i=e.getConfig();t.emit("change",i)}},e.registerListener=function(t){e.emitter.addListener("change",t)},e.removeListener=function(t){e.emitter.removeListener("change",t)},e.addLogListener=function(t){s.Z.emitter.addListener("log",t),s.Z.emitter.listenerCount("log")>0&&(s.Z.ENABLE_CALLBACK=!0,e._notifyChange())},e.removeLogListener=function(t){s.Z.emitter.removeListener("log",t),0===s.Z.emitter.listenerCount("log")&&(s.Z.ENABLE_CALLBACK=!1,e._notifyChange())},e}();o.emitter=new(r()),t.Z=o},219:function(e,t,i){"use strict";var n=function(){function e(){}return e.install=function(){Object.setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},Object.assign=Object.assign||function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),i=1;i http://a.com/e/f/../g + // With opts.alwaysNormalize = true (not spec compliant) + // http://a.com/b/cd + /e/f/../g => http://a.com/e/g + buildAbsoluteURL: function (baseURL, relativeURL, opts) { + opts = opts || {}; + // remove any remaining space and CRLF + baseURL = baseURL.trim(); + relativeURL = relativeURL.trim(); + if (!relativeURL) { + // 2a) If the embedded URL is entirely empty, it inherits the + // entire base URL (i.e., is set equal to the base URL) + // and we are done. + if (!opts.alwaysNormalize) { + return baseURL; + } + var basePartsForNormalise = URLToolkit.parseURL(baseURL); + if (!basePartsForNormalise) { + throw new Error('Error trying to parse base URL.'); + } + basePartsForNormalise.path = URLToolkit.normalizePath( + basePartsForNormalise.path + ); + return URLToolkit.buildURLFromParts(basePartsForNormalise); + } + var relativeParts = URLToolkit.parseURL(relativeURL); + if (!relativeParts) { + throw new Error('Error trying to parse relative URL.'); + } + if (relativeParts.scheme) { + // 2b) If the embedded URL starts with a scheme name, it is + // interpreted as an absolute URL and we are done. + if (!opts.alwaysNormalize) { + return relativeURL; + } + relativeParts.path = URLToolkit.normalizePath(relativeParts.path); + return URLToolkit.buildURLFromParts(relativeParts); + } + var baseParts = URLToolkit.parseURL(baseURL); + if (!baseParts) { + throw new Error('Error trying to parse base URL.'); + } + if (!baseParts.netLoc && baseParts.path && baseParts.path[0] !== '/') { + // If netLoc missing and path doesn't start with '/', assume everthing before the first '/' is the netLoc + // This causes 'example.com/a' to be handled as '//example.com/a' instead of '/example.com/a' + var pathParts = FIRST_SEGMENT_REGEX.exec(baseParts.path); + baseParts.netLoc = pathParts[1]; + baseParts.path = pathParts[2]; + } + if (baseParts.netLoc && !baseParts.path) { + baseParts.path = '/'; + } + var builtParts = { + // 2c) Otherwise, the embedded URL inherits the scheme of + // the base URL. + scheme: baseParts.scheme, + netLoc: relativeParts.netLoc, + path: null, + params: relativeParts.params, + query: relativeParts.query, + fragment: relativeParts.fragment, + }; + if (!relativeParts.netLoc) { + // 3) If the embedded URL's is non-empty, we skip to + // Step 7. Otherwise, the embedded URL inherits the + // (if any) of the base URL. + builtParts.netLoc = baseParts.netLoc; + // 4) If the embedded URL path is preceded by a slash "/", the + // path is not relative and we skip to Step 7. + if (relativeParts.path[0] !== '/') { + if (!relativeParts.path) { + // 5) If the embedded URL path is empty (and not preceded by a + // slash), then the embedded URL inherits the base URL path + builtParts.path = baseParts.path; + // 5a) if the embedded URL's is non-empty, we skip to + // step 7; otherwise, it inherits the of the base + // URL (if any) and + if (!relativeParts.params) { + builtParts.params = baseParts.params; + // 5b) if the embedded URL's is non-empty, we skip to + // step 7; otherwise, it inherits the of the base + // URL (if any) and we skip to step 7. + if (!relativeParts.query) { + builtParts.query = baseParts.query; + } + } + } else { + // 6) The last segment of the base URL's path (anything + // following the rightmost slash "/", or the entire path if no + // slash is present) is removed and the embedded URL's path is + // appended in its place. + var baseURLPath = baseParts.path; + var newPath = + baseURLPath.substring(0, baseURLPath.lastIndexOf('/') + 1) + + relativeParts.path; + builtParts.path = URLToolkit.normalizePath(newPath); + } + } + } + if (builtParts.path === null) { + builtParts.path = opts.alwaysNormalize + ? URLToolkit.normalizePath(relativeParts.path) + : relativeParts.path; + } + return URLToolkit.buildURLFromParts(builtParts); + }, + parseURL: function (url) { + var parts = URL_REGEX.exec(url); + if (!parts) { + return null; + } + return { + scheme: parts[1] || '', + netLoc: parts[2] || '', + path: parts[3] || '', + params: parts[4] || '', + query: parts[5] || '', + fragment: parts[6] || '', + }; + }, + normalizePath: function (path) { + // The following operations are + // then applied, in order, to the new path: + // 6a) All occurrences of "./", where "." is a complete path + // segment, are removed. + // 6b) If the path ends with "." as a complete path segment, + // that "." is removed. + path = path.split('').reverse().join('').replace(SLASH_DOT_REGEX, ''); + // 6c) All occurrences of "/../", where is a + // complete path segment not equal to "..", are removed. + // Removal of these path segments is performed iteratively, + // removing the leftmost matching pattern on each iteration, + // until no matching pattern remains. + // 6d) If the path ends with "/..", where is a + // complete path segment not equal to "..", that + // "/.." is removed. + while ( + path.length !== (path = path.replace(SLASH_DOT_DOT_REGEX, '')).length + ) {} + return path.split('').reverse().join(''); + }, + buildURLFromParts: function (parts) { + return ( + parts.scheme + + parts.netLoc + + parts.path + + parts.params + + parts.query + + parts.fragment + ); + }, + }; + + if (true) + module.exports = URLToolkit; + else {} +})(this); + + +/***/ }), + +/***/ "./node_modules/webworkify-webpack/index.js": +/*!**************************************************!*\ + !*** ./node_modules/webworkify-webpack/index.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function webpackBootstrapFunc (modules) { +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.l = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // identity function for calling harmony imports with the correct context +/******/ __webpack_require__.i = function(value) { return value; }; + +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; + +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; + +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; + +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/"; + +/******/ // on error function for async loading +/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; + + var f = __webpack_require__(__webpack_require__.s = ENTRY_MODULE) + return f.default || f // try to call default if defined to also support babel esmodule exports +} + +var moduleNameReqExp = '[\\.|\\-|\\+|\\w|\/|@]+' +var dependencyRegExp = '\\(\\s*(\/\\*.*?\\*\/)?\\s*.*?(' + moduleNameReqExp + ').*?\\)' // additional chars when output.pathinfo is true + +// http://stackoverflow.com/a/2593661/130442 +function quoteRegExp (str) { + return (str + '').replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&') +} + +function isNumeric(n) { + return !isNaN(1 * n); // 1 * n converts integers, integers as string ("123"), 1e3 and "1e3" to integers and strings to NaN +} + +function getModuleDependencies (sources, module, queueName) { + var retval = {} + retval[queueName] = [] + + var fnString = module.toString() + var wrapperSignature = fnString.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/) + if (!wrapperSignature) return retval + var webpackRequireName = wrapperSignature[1] + + // main bundle deps + var re = new RegExp('(\\\\n|\\W)' + quoteRegExp(webpackRequireName) + dependencyRegExp, 'g') + var match + while ((match = re.exec(fnString))) { + if (match[3] === 'dll-reference') continue + retval[queueName].push(match[3]) + } + + // dll deps + re = new RegExp('\\(' + quoteRegExp(webpackRequireName) + '\\("(dll-reference\\s(' + moduleNameReqExp + '))"\\)\\)' + dependencyRegExp, 'g') + while ((match = re.exec(fnString))) { + if (!sources[match[2]]) { + retval[queueName].push(match[1]) + sources[match[2]] = __webpack_require__(match[1]).m + } + retval[match[2]] = retval[match[2]] || [] + retval[match[2]].push(match[4]) + } + + // convert 1e3 back to 1000 - this can be important after uglify-js converted 1000 to 1e3 + var keys = Object.keys(retval); + for (var i = 0; i < keys.length; i++) { + for (var j = 0; j < retval[keys[i]].length; j++) { + if (isNumeric(retval[keys[i]][j])) { + retval[keys[i]][j] = 1 * retval[keys[i]][j]; + } + } + } + + return retval +} + +function hasValuesInQueues (queues) { + var keys = Object.keys(queues) + return keys.reduce(function (hasValues, key) { + return hasValues || queues[key].length > 0 + }, false) +} + +function getRequiredModules (sources, moduleId) { + var modulesQueue = { + main: [moduleId] + } + var requiredModules = { + main: [] + } + var seenModules = { + main: {} + } + + while (hasValuesInQueues(modulesQueue)) { + var queues = Object.keys(modulesQueue) + for (var i = 0; i < queues.length; i++) { + var queueName = queues[i] + var queue = modulesQueue[queueName] + var moduleToCheck = queue.pop() + seenModules[queueName] = seenModules[queueName] || {} + if (seenModules[queueName][moduleToCheck] || !sources[queueName][moduleToCheck]) continue + seenModules[queueName][moduleToCheck] = true + requiredModules[queueName] = requiredModules[queueName] || [] + requiredModules[queueName].push(moduleToCheck) + var newModules = getModuleDependencies(sources, sources[queueName][moduleToCheck], queueName) + var newModulesKeys = Object.keys(newModules) + for (var j = 0; j < newModulesKeys.length; j++) { + modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]] || [] + modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]].concat(newModules[newModulesKeys[j]]) + } + } + } + + return requiredModules +} + +module.exports = function (moduleId, options) { + options = options || {} + var sources = { + main: __webpack_require__.m + } + + var requiredModules = options.all ? { main: Object.keys(sources.main) } : getRequiredModules(sources, moduleId) + + var src = '' + + Object.keys(requiredModules).filter(function (m) { return m !== 'main' }).forEach(function (module) { + var entryModule = 0 + while (requiredModules[module][entryModule]) { + entryModule++ + } + requiredModules[module].push(entryModule) + sources[module][entryModule] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })' + src = src + 'var ' + module + ' = (' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(entryModule)) + ')({' + requiredModules[module].map(function (id) { return '' + JSON.stringify(id) + ': ' + sources[module][id].toString() }).join(',') + '});\n' + }) + + src = src + 'new ((' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(moduleId)) + ')({' + requiredModules.main.map(function (id) { return '' + JSON.stringify(id) + ': ' + sources.main[id].toString() }).join(',') + '}))(self);' + + var blob = new window.Blob([src], { type: 'text/javascript' }) + if (options.bare) { return blob } + + var URL = window.URL || window.webkitURL || window.mozURL || window.msURL + + var workerUrl = URL.createObjectURL(blob) + var worker = new window.Worker(workerUrl) + worker.objectURL = workerUrl + + return worker +} + + +/***/ }), + +/***/ "./src/config.ts": +/*!***********************!*\ + !*** ./src/config.ts ***! + \***********************/ +/*! exports provided: hlsDefaultConfig, mergeConfig, enableStreamingMode */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hlsDefaultConfig", function() { return hlsDefaultConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeConfig", function() { return mergeConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableStreamingMode", function() { return enableStreamingMode; }); +/* harmony import */ var _controller_abr_controller__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./controller/abr-controller */ "./src/controller/abr-controller.ts"); +/* harmony import */ var _controller_audio_stream_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./controller/audio-stream-controller */ "./src/controller/audio-stream-controller.ts"); +/* harmony import */ var _controller_audio_track_controller__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./controller/audio-track-controller */ "./src/controller/audio-track-controller.ts"); +/* harmony import */ var _controller_subtitle_stream_controller__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./controller/subtitle-stream-controller */ "./src/controller/subtitle-stream-controller.ts"); +/* harmony import */ var _controller_subtitle_track_controller__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./controller/subtitle-track-controller */ "./src/controller/subtitle-track-controller.ts"); +/* harmony import */ var _controller_buffer_controller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./controller/buffer-controller */ "./src/controller/buffer-controller.ts"); +/* harmony import */ var _controller_timeline_controller__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./controller/timeline-controller */ "./src/controller/timeline-controller.ts"); +/* harmony import */ var _controller_cap_level_controller__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./controller/cap-level-controller */ "./src/controller/cap-level-controller.ts"); +/* harmony import */ var _controller_fps_controller__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./controller/fps-controller */ "./src/controller/fps-controller.ts"); +/* harmony import */ var _controller_eme_controller__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./controller/eme-controller */ "./src/controller/eme-controller.ts"); +/* harmony import */ var _controller_cmcd_controller__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./controller/cmcd-controller */ "./src/controller/cmcd-controller.ts"); +/* harmony import */ var _utils_xhr_loader__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/xhr-loader */ "./src/utils/xhr-loader.ts"); +/* harmony import */ var _utils_fetch_loader__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils/fetch-loader */ "./src/utils/fetch-loader.ts"); +/* harmony import */ var _utils_cues__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utils/cues */ "./src/utils/cues.ts"); +/* harmony import */ var _utils_mediakeys_helper__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utils/mediakeys-helper */ "./src/utils/mediakeys-helper.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./utils/logger */ "./src/utils/logger.ts"); +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + + + + + + + + + + + + + + +// If possible, keep hlsDefaultConfig shallow +// It is cloned whenever a new Hls instance is created, by keeping the config +// shallow the properties are cloned, and we don't end up manipulating the default +var hlsDefaultConfig = _objectSpread(_objectSpread({ + autoStartLoad: true, + // used by stream-controller + startPosition: -1, + // used by stream-controller + defaultAudioCodec: undefined, + // used by stream-controller + debug: false, + // used by logger + capLevelOnFPSDrop: false, + // used by fps-controller + capLevelToPlayerSize: false, + // used by cap-level-controller + initialLiveManifestSize: 1, + // used by stream-controller + maxBufferLength: 30, + // used by stream-controller + backBufferLength: Infinity, + // used by buffer-controller + maxBufferSize: 60 * 1000 * 1000, + // used by stream-controller + maxBufferHole: 0.1, + // used by stream-controller + highBufferWatchdogPeriod: 2, + // used by stream-controller + nudgeOffset: 0.1, + // used by stream-controller + nudgeMaxRetry: 3, + // used by stream-controller + maxFragLookUpTolerance: 0.25, + // used by stream-controller + liveSyncDurationCount: 3, + // used by latency-controller + liveMaxLatencyDurationCount: Infinity, + // used by latency-controller + liveSyncDuration: undefined, + // used by latency-controller + liveMaxLatencyDuration: undefined, + // used by latency-controller + maxLiveSyncPlaybackRate: 1, + // used by latency-controller + liveDurationInfinity: false, + // used by buffer-controller + liveBackBufferLength: null, + // used by buffer-controller + maxMaxBufferLength: 600, + // used by stream-controller + enableWorker: true, + // used by demuxer + enableSoftwareAES: true, + // used by decrypter + manifestLoadingTimeOut: 10000, + // used by playlist-loader + manifestLoadingMaxRetry: 1, + // used by playlist-loader + manifestLoadingRetryDelay: 1000, + // used by playlist-loader + manifestLoadingMaxRetryTimeout: 64000, + // used by playlist-loader + startLevel: undefined, + // used by level-controller + levelLoadingTimeOut: 10000, + // used by playlist-loader + levelLoadingMaxRetry: 4, + // used by playlist-loader + levelLoadingRetryDelay: 1000, + // used by playlist-loader + levelLoadingMaxRetryTimeout: 64000, + // used by playlist-loader + fragLoadingTimeOut: 20000, + // used by fragment-loader + fragLoadingMaxRetry: 6, + // used by fragment-loader + fragLoadingRetryDelay: 1000, + // used by fragment-loader + fragLoadingMaxRetryTimeout: 64000, + // used by fragment-loader + startFragPrefetch: false, + // used by stream-controller + fpsDroppedMonitoringPeriod: 5000, + // used by fps-controller + fpsDroppedMonitoringThreshold: 0.2, + // used by fps-controller + appendErrorMaxRetry: 3, + // used by buffer-controller + loader: _utils_xhr_loader__WEBPACK_IMPORTED_MODULE_11__["default"], + // loader: FetchLoader, + fLoader: undefined, + // used by fragment-loader + pLoader: undefined, + // used by playlist-loader + xhrSetup: undefined, + // used by xhr-loader + licenseXhrSetup: undefined, + // used by eme-controller + licenseResponseCallback: undefined, + // used by eme-controller + abrController: _controller_abr_controller__WEBPACK_IMPORTED_MODULE_0__["default"], + bufferController: _controller_buffer_controller__WEBPACK_IMPORTED_MODULE_5__["default"], + capLevelController: _controller_cap_level_controller__WEBPACK_IMPORTED_MODULE_7__["default"], + fpsController: _controller_fps_controller__WEBPACK_IMPORTED_MODULE_8__["default"], + stretchShortVideoTrack: false, + // used by mp4-remuxer + maxAudioFramesDrift: 1, + // used by mp4-remuxer + forceKeyFrameOnDiscontinuity: true, + // used by ts-demuxer + abrEwmaFastLive: 3, + // used by abr-controller + abrEwmaSlowLive: 9, + // used by abr-controller + abrEwmaFastVoD: 3, + // used by abr-controller + abrEwmaSlowVoD: 9, + // used by abr-controller + abrEwmaDefaultEstimate: 5e5, + // 500 kbps // used by abr-controller + abrBandWidthFactor: 0.95, + // used by abr-controller + abrBandWidthUpFactor: 0.7, + // used by abr-controller + abrMaxWithRealBitrate: false, + // used by abr-controller + maxStarvationDelay: 4, + // used by abr-controller + maxLoadingDelay: 4, + // used by abr-controller + minAutoBitrate: 0, + // used by hls + emeEnabled: false, + // used by eme-controller + widevineLicenseUrl: undefined, + // used by eme-controller + drmSystemOptions: {}, + // used by eme-controller + requestMediaKeySystemAccessFunc: _utils_mediakeys_helper__WEBPACK_IMPORTED_MODULE_14__["requestMediaKeySystemAccess"], + // used by eme-controller + testBandwidth: true, + progressive: false, + lowLatencyMode: true, + cmcd: undefined +}, timelineConfig()), {}, { + subtitleStreamController: true ? _controller_subtitle_stream_controller__WEBPACK_IMPORTED_MODULE_3__["SubtitleStreamController"] : undefined, + subtitleTrackController: true ? _controller_subtitle_track_controller__WEBPACK_IMPORTED_MODULE_4__["default"] : undefined, + timelineController: true ? _controller_timeline_controller__WEBPACK_IMPORTED_MODULE_6__["TimelineController"] : undefined, + audioStreamController: true ? _controller_audio_stream_controller__WEBPACK_IMPORTED_MODULE_1__["default"] : undefined, + audioTrackController: true ? _controller_audio_track_controller__WEBPACK_IMPORTED_MODULE_2__["default"] : undefined, + emeController: true ? _controller_eme_controller__WEBPACK_IMPORTED_MODULE_9__["default"] : undefined, + cmcdController: true ? _controller_cmcd_controller__WEBPACK_IMPORTED_MODULE_10__["default"] : undefined +}); + +function timelineConfig() { + return { + cueHandler: _utils_cues__WEBPACK_IMPORTED_MODULE_13__["default"], + // used by timeline-controller + enableCEA708Captions: true, + // used by timeline-controller + enableWebVTT: true, + // used by timeline-controller + enableIMSC1: true, + // used by timeline-controller + captionsTextTrack1Label: 'English', + // used by timeline-controller + captionsTextTrack1LanguageCode: 'en', + // used by timeline-controller + captionsTextTrack2Label: 'Spanish', + // used by timeline-controller + captionsTextTrack2LanguageCode: 'es', + // used by timeline-controller + captionsTextTrack3Label: 'Unknown CC', + // used by timeline-controller + captionsTextTrack3LanguageCode: '', + // used by timeline-controller + captionsTextTrack4Label: 'Unknown CC', + // used by timeline-controller + captionsTextTrack4LanguageCode: '', + // used by timeline-controller + renderTextTracksNatively: true + }; +} + +function mergeConfig(defaultConfig, userConfig) { + if ((userConfig.liveSyncDurationCount || userConfig.liveMaxLatencyDurationCount) && (userConfig.liveSyncDuration || userConfig.liveMaxLatencyDuration)) { + throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration"); + } + + if (userConfig.liveMaxLatencyDurationCount !== undefined && (userConfig.liveSyncDurationCount === undefined || userConfig.liveMaxLatencyDurationCount <= userConfig.liveSyncDurationCount)) { + throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"'); + } + + if (userConfig.liveMaxLatencyDuration !== undefined && (userConfig.liveSyncDuration === undefined || userConfig.liveMaxLatencyDuration <= userConfig.liveSyncDuration)) { + throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"'); + } + + return _extends({}, defaultConfig, userConfig); +} +function enableStreamingMode(config) { + var currentLoader = config.loader; + + if (currentLoader !== _utils_fetch_loader__WEBPACK_IMPORTED_MODULE_12__["default"] && currentLoader !== _utils_xhr_loader__WEBPACK_IMPORTED_MODULE_11__["default"]) { + // If a developer has configured their own loader, respect that choice + _utils_logger__WEBPACK_IMPORTED_MODULE_15__["logger"].log('[config]: Custom loader detected, cannot enable progressive streaming'); + config.progressive = false; + } else { + var canStreamProgressively = Object(_utils_fetch_loader__WEBPACK_IMPORTED_MODULE_12__["fetchSupported"])(); + + if (canStreamProgressively) { + config.loader = _utils_fetch_loader__WEBPACK_IMPORTED_MODULE_12__["default"]; + config.progressive = true; + config.enableSoftwareAES = true; + _utils_logger__WEBPACK_IMPORTED_MODULE_15__["logger"].log('[config]: Progressive streaming enabled, using FetchLoader'); + } + } +} + +/***/ }), + +/***/ "./src/controller/abr-controller.ts": +/*!******************************************!*\ + !*** ./src/controller/abr-controller.ts ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _utils_ewma_bandwidth_estimator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/ewma-bandwidth-estimator */ "./src/utils/ewma-bandwidth-estimator.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/buffer-helper */ "./src/utils/buffer-helper.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + + + + + + + + +var AbrController = /*#__PURE__*/function () { + function AbrController(hls) { + this.hls = void 0; + this.lastLoadedFragLevel = 0; + this._nextAutoLevel = -1; + this.timer = void 0; + this.onCheck = this._abandonRulesCheck.bind(this); + this.fragCurrent = null; + this.partCurrent = null; + this.bitrateTestDelay = 0; + this.bwEstimator = void 0; + this.hls = hls; + var config = hls.config; + this.bwEstimator = new _utils_ewma_bandwidth_estimator__WEBPACK_IMPORTED_MODULE_1__["default"](config.abrEwmaSlowVoD, config.abrEwmaFastVoD, config.abrEwmaDefaultEstimate); + this.registerListeners(); + } + + var _proto = AbrController.prototype; + + _proto.registerListeners = function registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_LOADING, this.onFragLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_LOADED, this.onFragLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_BUFFERED, this.onFragBuffered, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, this.onError, this); + }; + + _proto.unregisterListeners = function unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_LOADING, this.onFragLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_LOADED, this.onFragLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_BUFFERED, this.onFragBuffered, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, this.onError, this); + }; + + _proto.destroy = function destroy() { + this.unregisterListeners(); + this.clearTimer(); // @ts-ignore + + this.hls = this.onCheck = null; + this.fragCurrent = this.partCurrent = null; + }; + + _proto.onFragLoading = function onFragLoading(event, data) { + var frag = data.frag; + + if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_5__["PlaylistLevelType"].MAIN) { + if (!this.timer) { + var _data$part; + + this.fragCurrent = frag; + this.partCurrent = (_data$part = data.part) != null ? _data$part : null; + this.timer = self.setInterval(this.onCheck, 100); + } + } + }; + + _proto.onLevelLoaded = function onLevelLoaded(event, data) { + var config = this.hls.config; + + if (data.details.live) { + this.bwEstimator.update(config.abrEwmaSlowLive, config.abrEwmaFastLive); + } else { + this.bwEstimator.update(config.abrEwmaSlowVoD, config.abrEwmaFastVoD); + } + } + /* + This method monitors the download rate of the current fragment, and will downswitch if that fragment will not load + quickly enough to prevent underbuffering + */ + ; + + _proto._abandonRulesCheck = function _abandonRulesCheck() { + var frag = this.fragCurrent, + part = this.partCurrent, + hls = this.hls; + var autoLevelEnabled = hls.autoLevelEnabled, + config = hls.config, + media = hls.media; + + if (!frag || !media) { + return; + } + + var stats = part ? part.stats : frag.stats; + var duration = part ? part.duration : frag.duration; // If loading has been aborted and not in lowLatencyMode, stop timer and return + + if (stats.aborted) { + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].warn('frag loader destroy or aborted, disarm abandonRules'); + this.clearTimer(); // reset forced auto level value so that next level will be selected + + this._nextAutoLevel = -1; + return; + } // This check only runs if we're in ABR mode and actually playing + + + if (!autoLevelEnabled || media.paused || !media.playbackRate || !media.readyState) { + return; + } + + var requestDelay = performance.now() - stats.loading.start; + var playbackRate = Math.abs(media.playbackRate); // In order to work with a stable bandwidth, only begin monitoring bandwidth after half of the fragment has been loaded + + if (requestDelay <= 500 * duration / playbackRate) { + return; + } + + var levels = hls.levels, + minAutoLevel = hls.minAutoLevel; + var level = levels[frag.level]; + var expectedLen = stats.total || Math.max(stats.loaded, Math.round(duration * level.maxBitrate / 8)); + var loadRate = Math.max(1, stats.bwEstimate ? stats.bwEstimate / 8 : stats.loaded * 1000 / requestDelay); // fragLoadDelay is an estimate of the time (in seconds) it will take to buffer the entire fragment + + var fragLoadedDelay = (expectedLen - stats.loaded) / loadRate; + var pos = media.currentTime; // bufferStarvationDelay is an estimate of the amount time (in seconds) it will take to exhaust the buffer + + var bufferStarvationDelay = (_utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].bufferInfo(media, pos, config.maxBufferHole).end - pos) / playbackRate; // Attempt an emergency downswitch only if less than 2 fragment lengths are buffered, and the time to finish loading + // the current fragment is greater than the amount of buffer we have left + + if (bufferStarvationDelay >= 2 * duration / playbackRate || fragLoadedDelay <= bufferStarvationDelay) { + return; + } + + var fragLevelNextLoadedDelay = Number.POSITIVE_INFINITY; + var nextLoadLevel; // Iterate through lower level and try to find the largest one that avoids rebuffering + + for (nextLoadLevel = frag.level - 1; nextLoadLevel > minAutoLevel; nextLoadLevel--) { + // compute time to load next fragment at lower level + // 0.8 : consider only 80% of current bw to be conservative + // 8 = bits per byte (bps/Bps) + var levelNextBitrate = levels[nextLoadLevel].maxBitrate; + fragLevelNextLoadedDelay = duration * levelNextBitrate / (8 * 0.8 * loadRate); + + if (fragLevelNextLoadedDelay < bufferStarvationDelay) { + break; + } + } // Only emergency switch down if it takes less time to load a new fragment at lowest level instead of continuing + // to load the current one + + + if (fragLevelNextLoadedDelay >= fragLoadedDelay) { + return; + } + + var bwEstimate = this.bwEstimator.getEstimate(); + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].warn("Fragment " + frag.sn + (part ? ' part ' + part.index : '') + " of level " + frag.level + " is loading too slowly and will cause an underbuffer; aborting and switching to level " + nextLoadLevel + "\n Current BW estimate: " + (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(bwEstimate) ? (bwEstimate / 1024).toFixed(3) : 'Unknown') + " Kb/s\n Estimated load time for current fragment: " + fragLoadedDelay.toFixed(3) + " s\n Estimated load time for the next fragment: " + fragLevelNextLoadedDelay.toFixed(3) + " s\n Time to underbuffer: " + bufferStarvationDelay.toFixed(3) + " s"); + hls.nextLoadLevel = nextLoadLevel; + this.bwEstimator.sample(requestDelay, stats.loaded); + this.clearTimer(); + + if (frag.loader) { + this.fragCurrent = this.partCurrent = null; + frag.loader.abort(); + } + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_LOAD_EMERGENCY_ABORTED, { + frag: frag, + part: part, + stats: stats + }); + }; + + _proto.onFragLoaded = function onFragLoaded(event, _ref) { + var frag = _ref.frag, + part = _ref.part; + + if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_5__["PlaylistLevelType"].MAIN && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(frag.sn)) { + var stats = part ? part.stats : frag.stats; + var duration = part ? part.duration : frag.duration; // stop monitoring bw once frag loaded + + this.clearTimer(); // store level id after successful fragment load + + this.lastLoadedFragLevel = frag.level; // reset forced auto level value so that next level will be selected + + this._nextAutoLevel = -1; // compute level average bitrate + + if (this.hls.config.abrMaxWithRealBitrate) { + var level = this.hls.levels[frag.level]; + var loadedBytes = (level.loaded ? level.loaded.bytes : 0) + stats.loaded; + var loadedDuration = (level.loaded ? level.loaded.duration : 0) + duration; + level.loaded = { + bytes: loadedBytes, + duration: loadedDuration + }; + level.realBitrate = Math.round(8 * loadedBytes / loadedDuration); + } + + if (frag.bitrateTest) { + var fragBufferedData = { + stats: stats, + frag: frag, + part: part, + id: frag.type + }; + this.onFragBuffered(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_BUFFERED, fragBufferedData); + frag.bitrateTest = false; + } + } + }; + + _proto.onFragBuffered = function onFragBuffered(event, data) { + var frag = data.frag, + part = data.part; + var stats = part ? part.stats : frag.stats; + + if (stats.aborted) { + return; + } // Only count non-alt-audio frags which were actually buffered in our BW calculations + + + if (frag.type !== _types_loader__WEBPACK_IMPORTED_MODULE_5__["PlaylistLevelType"].MAIN || frag.sn === 'initSegment') { + return; + } // Use the difference between parsing and request instead of buffering and request to compute fragLoadingProcessing; + // rationale is that buffer appending only happens once media is attached. This can happen when config.startFragPrefetch + // is used. If we used buffering in that case, our BW estimate sample will be very large. + + + var processingMs = stats.parsing.end - stats.loading.start; + this.bwEstimator.sample(processingMs, stats.loaded); + stats.bwEstimate = this.bwEstimator.getEstimate(); + + if (frag.bitrateTest) { + this.bitrateTestDelay = processingMs / 1000; + } else { + this.bitrateTestDelay = 0; + } + }; + + _proto.onError = function onError(event, data) { + // stop timer in case of frag loading error + switch (data.details) { + case _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorDetails"].FRAG_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorDetails"].FRAG_LOAD_TIMEOUT: + this.clearTimer(); + break; + + default: + break; + } + }; + + _proto.clearTimer = function clearTimer() { + self.clearInterval(this.timer); + this.timer = undefined; + } // return next auto level + ; + + _proto.getNextABRAutoLevel = function getNextABRAutoLevel() { + var fragCurrent = this.fragCurrent, + partCurrent = this.partCurrent, + hls = this.hls; + var maxAutoLevel = hls.maxAutoLevel, + config = hls.config, + minAutoLevel = hls.minAutoLevel, + media = hls.media; + var currentFragDuration = partCurrent ? partCurrent.duration : fragCurrent ? fragCurrent.duration : 0; + var pos = media ? media.currentTime : 0; // playbackRate is the absolute value of the playback rate; if media.playbackRate is 0, we use 1 to load as + // if we're playing back at the normal rate. + + var playbackRate = media && media.playbackRate !== 0 ? Math.abs(media.playbackRate) : 1.0; + var avgbw = this.bwEstimator ? this.bwEstimator.getEstimate() : config.abrEwmaDefaultEstimate; // bufferStarvationDelay is the wall-clock time left until the playback buffer is exhausted. + + var bufferStarvationDelay = (_utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].bufferInfo(media, pos, config.maxBufferHole).end - pos) / playbackRate; // First, look to see if we can find a level matching with our avg bandwidth AND that could also guarantee no rebuffering at all + + var bestLevel = this.findBestLevel(avgbw, minAutoLevel, maxAutoLevel, bufferStarvationDelay, config.abrBandWidthFactor, config.abrBandWidthUpFactor); + + if (bestLevel >= 0) { + return bestLevel; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].trace((bufferStarvationDelay ? 'rebuffering expected' : 'buffer is empty') + ", finding optimal quality level"); // not possible to get rid of rebuffering ... let's try to find level that will guarantee less than maxStarvationDelay of rebuffering + // if no matching level found, logic will return 0 + + var maxStarvationDelay = currentFragDuration ? Math.min(currentFragDuration, config.maxStarvationDelay) : config.maxStarvationDelay; + var bwFactor = config.abrBandWidthFactor; + var bwUpFactor = config.abrBandWidthUpFactor; + + if (!bufferStarvationDelay) { + // in case buffer is empty, let's check if previous fragment was loaded to perform a bitrate test + var bitrateTestDelay = this.bitrateTestDelay; + + if (bitrateTestDelay) { + // if it is the case, then we need to adjust our max starvation delay using maxLoadingDelay config value + // max video loading delay used in automatic start level selection : + // in that mode ABR controller will ensure that video loading time (ie the time to fetch the first fragment at lowest quality level + + // the time to fetch the fragment at the appropriate quality level is less than ```maxLoadingDelay``` ) + // cap maxLoadingDelay and ensure it is not bigger 'than bitrate test' frag duration + var maxLoadingDelay = currentFragDuration ? Math.min(currentFragDuration, config.maxLoadingDelay) : config.maxLoadingDelay; + maxStarvationDelay = maxLoadingDelay - bitrateTestDelay; + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].trace("bitrate test took " + Math.round(1000 * bitrateTestDelay) + "ms, set first fragment max fetchDuration to " + Math.round(1000 * maxStarvationDelay) + " ms"); // don't use conservative factor on bitrate test + + bwFactor = bwUpFactor = 1; + } + } + + bestLevel = this.findBestLevel(avgbw, minAutoLevel, maxAutoLevel, bufferStarvationDelay + maxStarvationDelay, bwFactor, bwUpFactor); + return Math.max(bestLevel, 0); + }; + + _proto.findBestLevel = function findBestLevel(currentBw, minAutoLevel, maxAutoLevel, maxFetchDuration, bwFactor, bwUpFactor) { + var _level$details; + + var fragCurrent = this.fragCurrent, + partCurrent = this.partCurrent, + currentLevel = this.lastLoadedFragLevel; + var levels = this.hls.levels; + var level = levels[currentLevel]; + var live = !!(level !== null && level !== void 0 && (_level$details = level.details) !== null && _level$details !== void 0 && _level$details.live); + var currentCodecSet = level === null || level === void 0 ? void 0 : level.codecSet; + var currentFragDuration = partCurrent ? partCurrent.duration : fragCurrent ? fragCurrent.duration : 0; + + for (var i = maxAutoLevel; i >= minAutoLevel; i--) { + var levelInfo = levels[i]; + + if (!levelInfo || currentCodecSet && levelInfo.codecSet !== currentCodecSet) { + continue; + } + + var levelDetails = levelInfo.details; + var avgDuration = (partCurrent ? levelDetails === null || levelDetails === void 0 ? void 0 : levelDetails.partTarget : levelDetails === null || levelDetails === void 0 ? void 0 : levelDetails.averagetargetduration) || currentFragDuration; + var adjustedbw = void 0; // follow algorithm captured from stagefright : + // https://android.googlesource.com/platform/frameworks/av/+/master/media/libstagefright/httplive/LiveSession.cpp + // Pick the highest bandwidth stream below or equal to estimated bandwidth. + // consider only 80% of the available bandwidth, but if we are switching up, + // be even more conservative (70%) to avoid overestimating and immediately + // switching back. + + if (i <= currentLevel) { + adjustedbw = bwFactor * currentBw; + } else { + adjustedbw = bwUpFactor * currentBw; + } + + var bitrate = levels[i].maxBitrate; + var fetchDuration = bitrate * avgDuration / adjustedbw; + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: " + i + "/" + Math.round(adjustedbw) + "/" + bitrate + "/" + avgDuration + "/" + maxFetchDuration + "/" + fetchDuration); // if adjusted bw is greater than level bitrate AND + + if (adjustedbw > bitrate && ( // fragment fetchDuration unknown OR live stream OR fragment fetchDuration less than max allowed fetch duration, then this level matches + // we don't account for max Fetch Duration for live streams, this is to avoid switching down when near the edge of live sliding window ... + // special case to support startLevel = -1 (bitrateTest) on live streams : in that case we should not exit loop so that findBestLevel will return -1 + !fetchDuration || live && !this.bitrateTestDelay || fetchDuration < maxFetchDuration)) { + // as we are looping from highest to lowest, this will return the best achievable quality level + return i; + } + } // not enough time budget even with quality level 0 ... rebuffering might happen + + + return -1; + }; + + _createClass(AbrController, [{ + key: "nextAutoLevel", + get: function get() { + var forcedAutoLevel = this._nextAutoLevel; + var bwEstimator = this.bwEstimator; // in case next auto level has been forced, and bw not available or not reliable, return forced value + + if (forcedAutoLevel !== -1 && (!bwEstimator || !bwEstimator.canEstimate())) { + return forcedAutoLevel; + } // compute next level using ABR logic + + + var nextABRAutoLevel = this.getNextABRAutoLevel(); // if forced auto level has been defined, use it to cap ABR computed quality level + + if (forcedAutoLevel !== -1) { + nextABRAutoLevel = Math.min(forcedAutoLevel, nextABRAutoLevel); + } + + return nextABRAutoLevel; + }, + set: function set(nextLevel) { + this._nextAutoLevel = nextLevel; + } + }]); + + return AbrController; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (AbrController); + +/***/ }), + +/***/ "./src/controller/audio-stream-controller.ts": +/*!***************************************************!*\ + !*** ./src/controller/audio-stream-controller.ts ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base-stream-controller */ "./src/controller/base-stream-controller.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/buffer-helper */ "./src/utils/buffer-helper.ts"); +/* harmony import */ var _fragment_tracker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fragment-tracker */ "./src/controller/fragment-tracker.ts"); +/* harmony import */ var _types_level__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../types/level */ "./src/types/level.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +/* harmony import */ var _loader_fragment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../loader/fragment */ "./src/loader/fragment.ts"); +/* harmony import */ var _demux_chunk_cache__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../demux/chunk-cache */ "./src/demux/chunk-cache.ts"); +/* harmony import */ var _demux_transmuxer_interface__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../demux/transmuxer-interface */ "./src/demux/transmuxer-interface.ts"); +/* harmony import */ var _types_transmuxer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../types/transmuxer */ "./src/types/transmuxer.ts"); +/* harmony import */ var _fragment_finders__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./fragment-finders */ "./src/controller/fragment-finders.ts"); +/* harmony import */ var _utils_discontinuities__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/discontinuities */ "./src/utils/discontinuities.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + + + + + + + + + + + + + + +var TICK_INTERVAL = 100; // how often to tick in ms + +var AudioStreamController = /*#__PURE__*/function (_BaseStreamController) { + _inheritsLoose(AudioStreamController, _BaseStreamController); + + function AudioStreamController(hls, fragmentTracker) { + var _this; + + _this = _BaseStreamController.call(this, hls, fragmentTracker, '[audio-stream-controller]') || this; + _this.videoBuffer = null; + _this.videoTrackCC = -1; + _this.waitingVideoCC = -1; + _this.audioSwitch = false; + _this.trackId = -1; + _this.waitingData = null; + _this.mainDetails = null; + _this.bufferFlushed = false; + + _this._registerListeners(); + + return _this; + } + + var _proto = AudioStreamController.prototype; + + _proto.onHandlerDestroying = function onHandlerDestroying() { + this._unregisterListeners(); + + this.mainDetails = null; + }; + + _proto._registerListeners = function _registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, this.onError, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_RESET, this.onBufferReset, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_CREATED, this.onBufferCreated, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_FLUSHED, this.onBufferFlushed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].INIT_PTS_FOUND, this.onInitPtsFound, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_BUFFERED, this.onFragBuffered, this); + }; + + _proto._unregisterListeners = function _unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, this.onError, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_RESET, this.onBufferReset, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_CREATED, this.onBufferCreated, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_FLUSHED, this.onBufferFlushed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].INIT_PTS_FOUND, this.onInitPtsFound, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_BUFFERED, this.onFragBuffered, this); + } // INIT_PTS_FOUND is triggered when the video track parsed in the stream-controller has a new PTS value + ; + + _proto.onInitPtsFound = function onInitPtsFound(event, _ref) { + var frag = _ref.frag, + id = _ref.id, + initPTS = _ref.initPTS; + + // Always update the new INIT PTS + // Can change due level switch + if (id === 'main') { + var cc = frag.cc; + this.initPTS[frag.cc] = initPTS; + this.log("InitPTS for cc: " + cc + " found from main: " + initPTS); + this.videoTrackCC = cc; // If we are waiting, tick immediately to unblock audio fragment transmuxing + + if (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_INIT_PTS) { + this.tick(); + } + } + }; + + _proto.startLoad = function startLoad(startPosition) { + if (!this.levels) { + this.startPosition = startPosition; + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].STOPPED; + return; + } + + var lastCurrentTime = this.lastCurrentTime; + this.stopLoad(); + this.setInterval(TICK_INTERVAL); + this.fragLoadError = 0; + + if (lastCurrentTime > 0 && startPosition === -1) { + this.log("Override startPosition with lastCurrentTime @" + lastCurrentTime.toFixed(3)); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } else { + this.loadedmetadata = false; + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_TRACK; + } + + this.nextLoadPosition = this.startPosition = this.lastCurrentTime = startPosition; + this.tick(); + }; + + _proto.doTick = function doTick() { + switch (this.state) { + case _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE: + this.doTickIdle(); + break; + + case _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_TRACK: + { + var _levels$trackId; + + var levels = this.levels, + trackId = this.trackId; + var details = levels === null || levels === void 0 ? void 0 : (_levels$trackId = levels[trackId]) === null || _levels$trackId === void 0 ? void 0 : _levels$trackId.details; + + if (details) { + if (this.waitForCdnTuneIn(details)) { + break; + } + + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_INIT_PTS; + } + + break; + } + + case _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].FRAG_LOADING_WAITING_RETRY: + { + var _this$media; + + var now = performance.now(); + var retryDate = this.retryDate; // if current time is gt than retryDate, or if media seeking let's switch to IDLE state to retry loading + + if (!retryDate || now >= retryDate || (_this$media = this.media) !== null && _this$media !== void 0 && _this$media.seeking) { + this.log('RetryDate reached, switch back to IDLE state'); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } + + break; + } + + case _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_INIT_PTS: + { + // Ensure we don't get stuck in the WAITING_INIT_PTS state if the waiting frag CC doesn't match any initPTS + var waitingData = this.waitingData; + + if (waitingData) { + var frag = waitingData.frag, + part = waitingData.part, + cache = waitingData.cache, + complete = waitingData.complete; + + if (this.initPTS[frag.cc] !== undefined) { + this.waitingData = null; + this.waitingVideoCC = -1; + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].FRAG_LOADING; + var payload = cache.flush(); + var data = { + frag: frag, + part: part, + payload: payload, + networkDetails: null + }; + + this._handleFragmentLoadProgress(data); + + if (complete) { + _BaseStreamController.prototype._handleFragmentLoadComplete.call(this, data); + } + } else if (this.videoTrackCC !== this.waitingVideoCC) { + // Drop waiting fragment if videoTrackCC has changed since waitingFragment was set and initPTS was not found + _utils_logger__WEBPACK_IMPORTED_MODULE_14__["logger"].log("Waiting fragment cc (" + frag.cc + ") cancelled because video is at cc " + this.videoTrackCC); + this.clearWaitingFragment(); + } else { + // Drop waiting fragment if an earlier fragment is needed + var pos = this.getLoadPosition(); + var bufferInfo = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].bufferInfo(this.mediaBuffer, pos, this.config.maxBufferHole); + var waitingFragmentAtPosition = Object(_fragment_finders__WEBPACK_IMPORTED_MODULE_11__["fragmentWithinToleranceTest"])(bufferInfo.end, this.config.maxFragLookUpTolerance, frag); + + if (waitingFragmentAtPosition < 0) { + _utils_logger__WEBPACK_IMPORTED_MODULE_14__["logger"].log("Waiting fragment cc (" + frag.cc + ") @ " + frag.start + " cancelled because another fragment at " + bufferInfo.end + " is needed"); + this.clearWaitingFragment(); + } + } + } else { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } + } + } + + this.onTickEnd(); + }; + + _proto.clearWaitingFragment = function clearWaitingFragment() { + var waitingData = this.waitingData; + + if (waitingData) { + this.fragmentTracker.removeFragment(waitingData.frag); + this.waitingData = null; + this.waitingVideoCC = -1; + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } + }; + + _proto.onTickEnd = function onTickEnd() { + var media = this.media; + + if (!media || !media.readyState) { + // Exit early if we don't have media or if the media hasn't buffered anything yet (readyState 0) + return; + } + + var mediaBuffer = this.mediaBuffer ? this.mediaBuffer : media; + var buffered = mediaBuffer.buffered; + + if (!this.loadedmetadata && buffered.length) { + this.loadedmetadata = true; + } + + this.lastCurrentTime = media.currentTime; + }; + + _proto.doTickIdle = function doTickIdle() { + var _frag$decryptdata, _frag$decryptdata2; + + var hls = this.hls, + levels = this.levels, + media = this.media, + trackId = this.trackId; + var config = hls.config; + + if (!levels || !levels[trackId]) { + return; + } // if video not attached AND + // start fragment already requested OR start frag prefetch not enabled + // exit loop + // => if media not attached but start frag prefetch is enabled and start frag not requested yet, we will not exit loop + + + if (!media && (this.startFragRequested || !config.startFragPrefetch)) { + return; + } + + var levelInfo = levels[trackId]; + var trackDetails = levelInfo.details; + + if (!trackDetails || trackDetails.live && this.levelLastLoaded !== trackId || this.waitForCdnTuneIn(trackDetails)) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_TRACK; + return; + } + + if (this.bufferFlushed) { + this.bufferFlushed = false; + this.afterBufferFlushed(this.mediaBuffer ? this.mediaBuffer : this.media, _loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].AUDIO, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].AUDIO); + } + + var bufferInfo = this.getFwdBufferInfo(this.mediaBuffer ? this.mediaBuffer : this.media, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].AUDIO); + + if (bufferInfo === null) { + return; + } + + var bufferLen = bufferInfo.len; + var maxBufLen = this.getMaxBufferLength(); + var audioSwitch = this.audioSwitch; // if buffer length is less than maxBufLen try to load a new fragment + + if (bufferLen >= maxBufLen && !audioSwitch) { + return; + } + + if (!audioSwitch && this._streamEnded(bufferInfo, trackDetails)) { + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_EOS, { + type: 'audio' + }); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].ENDED; + return; + } + + var fragments = trackDetails.fragments; + var start = fragments[0].start; + var targetBufferTime = bufferInfo.end; + + if (audioSwitch) { + var pos = this.getLoadPosition(); + targetBufferTime = pos; // if currentTime (pos) is less than alt audio playlist start time, it means that alt audio is ahead of currentTime + + if (trackDetails.PTSKnown && pos < start) { + // if everything is buffered from pos to start or if audio buffer upfront, let's seek to start + if (bufferInfo.end > start || bufferInfo.nextStart) { + this.log('Alt audio track ahead of main track, seek to start of alt audio track'); + media.currentTime = start + 0.05; + } + } + } + + var frag = this.getNextFragment(targetBufferTime, trackDetails); + + if (!frag) { + this.bufferFlushed = true; + return; + } + + if (((_frag$decryptdata = frag.decryptdata) === null || _frag$decryptdata === void 0 ? void 0 : _frag$decryptdata.keyFormat) === 'identity' && !((_frag$decryptdata2 = frag.decryptdata) !== null && _frag$decryptdata2 !== void 0 && _frag$decryptdata2.key)) { + this.loadKey(frag, trackDetails); + } else { + this.loadFragment(frag, trackDetails, targetBufferTime); + } + }; + + _proto.getMaxBufferLength = function getMaxBufferLength() { + var maxConfigBuffer = _BaseStreamController.prototype.getMaxBufferLength.call(this); + + var mainBufferInfo = this.getFwdBufferInfo(this.videoBuffer ? this.videoBuffer : this.media, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN); + + if (mainBufferInfo === null) { + return maxConfigBuffer; + } + + return Math.max(maxConfigBuffer, mainBufferInfo.len); + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + this.videoBuffer = null; + + _BaseStreamController.prototype.onMediaDetaching.call(this); + }; + + _proto.onAudioTracksUpdated = function onAudioTracksUpdated(event, _ref2) { + var audioTracks = _ref2.audioTracks; + this.resetTransmuxer(); + this.levels = audioTracks.map(function (mediaPlaylist) { + return new _types_level__WEBPACK_IMPORTED_MODULE_5__["Level"](mediaPlaylist); + }); + }; + + _proto.onAudioTrackSwitching = function onAudioTrackSwitching(event, data) { + // if any URL found on new audio track, it is an alternate audio track + var altAudio = !!data.url; + this.trackId = data.id; + var fragCurrent = this.fragCurrent; + + if (fragCurrent !== null && fragCurrent !== void 0 && fragCurrent.loader) { + fragCurrent.loader.abort(); + } + + this.fragCurrent = null; + this.clearWaitingFragment(); // destroy useless transmuxer when switching audio to main + + if (!altAudio) { + this.resetTransmuxer(); + } else { + // switching to audio track, start timer if not already started + this.setInterval(TICK_INTERVAL); + } // should we switch tracks ? + + + if (altAudio) { + this.audioSwitch = true; // main audio track are handled by stream-controller, just do something if switching to alt audio track + + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } else { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].STOPPED; + } + + this.tick(); + }; + + _proto.onManifestLoading = function onManifestLoading() { + this.mainDetails = null; + this.fragmentTracker.removeAllFragments(); + this.startPosition = this.lastCurrentTime = 0; + this.bufferFlushed = false; + }; + + _proto.onLevelLoaded = function onLevelLoaded(event, data) { + this.mainDetails = data.details; + }; + + _proto.onAudioTrackLoaded = function onAudioTrackLoaded(event, data) { + var _track$details; + + var levels = this.levels; + var newDetails = data.details, + trackId = data.id; + + if (!levels) { + this.warn("Audio tracks were reset while loading level " + trackId); + return; + } + + this.log("Track " + trackId + " loaded [" + newDetails.startSN + "," + newDetails.endSN + "],duration:" + newDetails.totalduration); + var track = levels[trackId]; + var sliding = 0; + + if (newDetails.live || (_track$details = track.details) !== null && _track$details !== void 0 && _track$details.live) { + var mainDetails = this.mainDetails; + + if (!newDetails.fragments[0]) { + newDetails.deltaUpdateFailed = true; + } + + if (newDetails.deltaUpdateFailed || !mainDetails) { + return; + } + + if (!track.details && newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) { + // Make sure our audio rendition is aligned with the "main" rendition, using + // pdt as our reference times. + Object(_utils_discontinuities__WEBPACK_IMPORTED_MODULE_12__["alignMediaPlaylistByPDT"])(newDetails, mainDetails); + sliding = newDetails.fragments[0].start; + } else { + sliding = this.alignPlaylists(newDetails, track.details); + } + } + + track.details = newDetails; + this.levelLastLoaded = trackId; // compute start position if we are aligned with the main playlist + + if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) { + this.setStartPosition(track.details, sliding); + } // only switch back to IDLE state if we were waiting for track to start downloading a new fragment + + + if (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_TRACK && !this.waitForCdnTuneIn(newDetails)) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } // trigger handler right now + + + this.tick(); + }; + + _proto._handleFragmentLoadProgress = function _handleFragmentLoadProgress(data) { + var _frag$initSegment; + + var frag = data.frag, + part = data.part, + payload = data.payload; + var config = this.config, + trackId = this.trackId, + levels = this.levels; + + if (!levels) { + this.warn("Audio tracks were reset while fragment load was in progress. Fragment " + frag.sn + " of level " + frag.level + " will not be buffered"); + return; + } + + var track = levels[trackId]; + console.assert(track, 'Audio track is defined on fragment load progress'); + var details = track.details; + console.assert(details, 'Audio track details are defined on fragment load progress'); + var audioCodec = config.defaultAudioCodec || track.audioCodec || 'mp4a.40.2'; + var transmuxer = this.transmuxer; + + if (!transmuxer) { + transmuxer = this.transmuxer = new _demux_transmuxer_interface__WEBPACK_IMPORTED_MODULE_9__["default"](this.hls, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].AUDIO, this._handleTransmuxComplete.bind(this), this._handleTransmuxerFlush.bind(this)); + } // Check if we have video initPTS + // If not we need to wait for it + + + var initPTS = this.initPTS[frag.cc]; + var initSegmentData = (_frag$initSegment = frag.initSegment) === null || _frag$initSegment === void 0 ? void 0 : _frag$initSegment.data; + + if (initPTS !== undefined) { + // this.log(`Transmuxing ${sn} of [${details.startSN} ,${details.endSN}],track ${trackId}`); + // time Offset is accurate if level PTS is known, or if playlist is not sliding (not live) + var accurateTimeOffset = false; // details.PTSKnown || !details.live; + + var partIndex = part ? part.index : -1; + var partial = partIndex !== -1; + var chunkMeta = new _types_transmuxer__WEBPACK_IMPORTED_MODULE_10__["ChunkMetadata"](frag.level, frag.sn, frag.stats.chunkCount, payload.byteLength, partIndex, partial); + transmuxer.push(payload, initSegmentData, audioCodec, '', frag, part, details.totalduration, accurateTimeOffset, chunkMeta, initPTS); + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_14__["logger"].log("Unknown video PTS for cc " + frag.cc + ", waiting for video PTS before demuxing audio frag " + frag.sn + " of [" + details.startSN + " ," + details.endSN + "],track " + trackId); + + var _this$waitingData = this.waitingData = this.waitingData || { + frag: frag, + part: part, + cache: new _demux_chunk_cache__WEBPACK_IMPORTED_MODULE_8__["default"](), + complete: false + }, + cache = _this$waitingData.cache; + + cache.push(new Uint8Array(payload)); + this.waitingVideoCC = this.videoTrackCC; + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_INIT_PTS; + } + }; + + _proto._handleFragmentLoadComplete = function _handleFragmentLoadComplete(fragLoadedData) { + if (this.waitingData) { + this.waitingData.complete = true; + return; + } + + _BaseStreamController.prototype._handleFragmentLoadComplete.call(this, fragLoadedData); + }; + + _proto.onBufferReset = function + /* event: Events.BUFFER_RESET */ + onBufferReset() { + // reset reference to sourcebuffers + this.mediaBuffer = this.videoBuffer = null; + this.loadedmetadata = false; + }; + + _proto.onBufferCreated = function onBufferCreated(event, data) { + var audioTrack = data.tracks.audio; + + if (audioTrack) { + this.mediaBuffer = audioTrack.buffer; + } + + if (data.tracks.video) { + this.videoBuffer = data.tracks.video.buffer; + } + }; + + _proto.onFragBuffered = function onFragBuffered(event, data) { + var frag = data.frag, + part = data.part; + + if (frag.type !== _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].AUDIO) { + return; + } + + if (this.fragContextChanged(frag)) { + // If a level switch was requested while a fragment was buffering, it will emit the FRAG_BUFFERED event upon completion + // Avoid setting state back to IDLE or concluding the audio switch; otherwise, the switched-to track will not buffer + this.warn("Fragment " + frag.sn + (part ? ' p: ' + part.index : '') + " of level " + frag.level + " finished buffering, but was aborted. state: " + this.state + ", audioSwitch: " + this.audioSwitch); + return; + } + + if (frag.sn !== 'initSegment') { + this.fragPrevious = frag; + + if (this.audioSwitch) { + this.audioSwitch = false; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].AUDIO_TRACK_SWITCHED, { + id: this.trackId + }); + } + } + + this.fragBufferedComplete(frag, part); + }; + + _proto.onError = function onError(event, data) { + switch (data.details) { + case _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"].FRAG_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"].FRAG_LOAD_TIMEOUT: + case _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"].KEY_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"].KEY_LOAD_TIMEOUT: + // TODO: Skip fragments that do not belong to this.fragCurrent audio-group id + this.onFragmentOrKeyLoadError(_types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].AUDIO, data); + break; + + case _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"].AUDIO_TRACK_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"].AUDIO_TRACK_LOAD_TIMEOUT: + // when in ERROR state, don't switch back to IDLE state in case a non-fatal error is received + if (this.state !== _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].ERROR && this.state !== _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].STOPPED) { + // if fatal error, stop processing, otherwise move to IDLE to retry loading + this.state = data.fatal ? _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].ERROR : _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + this.warn(data.details + " while loading frag, switching to " + this.state + " state"); + } + + break; + + case _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"].BUFFER_FULL_ERROR: + // if in appending state + if (data.parent === 'audio' && (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSING || this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSED)) { + var flushBuffer = true; + var bufferedInfo = this.getFwdBufferInfo(this.mediaBuffer, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].AUDIO); // 0.5 : tolerance needed as some browsers stalls playback before reaching buffered end + // reduce max buf len if current position is buffered + + if (bufferedInfo && bufferedInfo.len > 0.5) { + flushBuffer = !this.reduceMaxBufferLength(bufferedInfo.len); + } + + if (flushBuffer) { + // current position is not buffered, but browser is still complaining about buffer full error + // this happens on IE/Edge, refer to https://github.com/video-dev/hls.js/pull/708 + // in that case flush the whole audio buffer to recover + this.warn('Buffer full error also media.currentTime is not buffered, flush audio buffer'); + this.fragCurrent = null; + + _BaseStreamController.prototype.flushMainBuffer.call(this, 0, Number.POSITIVE_INFINITY, 'audio'); + } + + this.resetLoadingState(); + } + + break; + + default: + break; + } + }; + + _proto.onBufferFlushed = function onBufferFlushed(event, _ref3) { + var type = _ref3.type; + + if (type === _loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].AUDIO) { + this.bufferFlushed = true; + } + }; + + _proto._handleTransmuxComplete = function _handleTransmuxComplete(transmuxResult) { + var _id3$samples; + + var id = 'audio'; + var hls = this.hls; + var remuxResult = transmuxResult.remuxResult, + chunkMeta = transmuxResult.chunkMeta; + var context = this.getCurrentContext(chunkMeta); + + if (!context) { + this.warn("The loading context changed while buffering fragment " + chunkMeta.sn + " of level " + chunkMeta.level + ". This chunk will not be buffered."); + this.resetLiveStartWhenNotLoaded(chunkMeta.level); + return; + } + + var frag = context.frag, + part = context.part; + var audio = remuxResult.audio, + text = remuxResult.text, + id3 = remuxResult.id3, + initSegment = remuxResult.initSegment; // Check if the current fragment has been aborted. We check this by first seeing if we're still playing the current level. + // If we are, subsequently check if the currently loading fragment (fragCurrent) has changed. + + if (this.fragContextChanged(frag)) { + return; + } + + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSING; + + if (this.audioSwitch && audio) { + this.completeAudioSwitch(); + } + + if (initSegment !== null && initSegment !== void 0 && initSegment.tracks) { + this._bufferInitSegment(initSegment.tracks, frag, chunkMeta); + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_PARSING_INIT_SEGMENT, { + frag: frag, + id: id, + tracks: initSegment.tracks + }); // Only flush audio from old audio tracks when PTS is known on new audio track + } + + if (audio) { + var startPTS = audio.startPTS, + endPTS = audio.endPTS, + startDTS = audio.startDTS, + endDTS = audio.endDTS; + + if (part) { + part.elementaryStreams[_loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].AUDIO] = { + startPTS: startPTS, + endPTS: endPTS, + startDTS: startDTS, + endDTS: endDTS + }; + } + + frag.setElementaryStreamInfo(_loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].AUDIO, startPTS, endPTS, startDTS, endDTS); + this.bufferFragmentData(audio, frag, part, chunkMeta); + } + + if (id3 !== null && id3 !== void 0 && (_id3$samples = id3.samples) !== null && _id3$samples !== void 0 && _id3$samples.length) { + var emittedID3 = _extends({ + frag: frag, + id: id + }, id3); + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_PARSING_METADATA, emittedID3); + } + + if (text) { + var emittedText = _extends({ + frag: frag, + id: id + }, text); + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].FRAG_PARSING_USERDATA, emittedText); + } + }; + + _proto._bufferInitSegment = function _bufferInitSegment(tracks, frag, chunkMeta) { + if (this.state !== _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSING) { + return; + } // delete any video track found on audio transmuxer + + + if (tracks.video) { + delete tracks.video; + } // include levelCodec in audio and video tracks + + + var track = tracks.audio; + + if (!track) { + return; + } + + track.levelCodec = track.codec; + track.id = 'audio'; + this.log("Init audio buffer, container:" + track.container + ", codecs[parsed]=[" + track.codec + "]"); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_CODECS, tracks); + var initSegment = track.initSegment; + + if (initSegment !== null && initSegment !== void 0 && initSegment.byteLength) { + var segment = { + type: 'audio', + frag: frag, + part: null, + chunkMeta: chunkMeta, + parent: frag.type, + data: initSegment + }; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].BUFFER_APPENDING, segment); + } // trigger handler right now + + + this.tick(); + }; + + _proto.loadFragment = function loadFragment(frag, trackDetails, targetBufferTime) { + // only load if fragment is not loaded or if in audio switch + var fragState = this.fragmentTracker.getState(frag); + this.fragCurrent = frag; // we force a frag loading in audio switch as fragment tracker might not have evicted previous frags in case of quick audio switch + + if (this.audioSwitch || fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_4__["FragmentState"].NOT_LOADED || fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_4__["FragmentState"].PARTIAL) { + if (frag.sn === 'initSegment') { + this._loadInitSegment(frag); + } else if (trackDetails.live && !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(this.initPTS[frag.cc])) { + this.log("Waiting for video PTS in continuity counter " + frag.cc + " of live stream before loading audio fragment " + frag.sn + " of level " + this.trackId); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_INIT_PTS; + } else { + this.startFragRequested = true; + + _BaseStreamController.prototype.loadFragment.call(this, frag, trackDetails, targetBufferTime); + } + } + }; + + _proto.completeAudioSwitch = function completeAudioSwitch() { + var hls = this.hls, + media = this.media, + trackId = this.trackId; + + if (media) { + this.log('Switching audio track : flushing all audio'); + + _BaseStreamController.prototype.flushMainBuffer.call(this, 0, Number.POSITIVE_INFINITY, 'audio'); + } + + this.audioSwitch = false; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].AUDIO_TRACK_SWITCHED, { + id: trackId + }); + }; + + return AudioStreamController; +}(_base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["default"]); + +/* harmony default export */ __webpack_exports__["default"] = (AudioStreamController); + +/***/ }), + +/***/ "./src/controller/audio-track-controller.ts": +/*!**************************************************!*\ + !*** ./src/controller/audio-track-controller.ts ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _base_playlist_controller__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base-playlist-controller */ "./src/controller/base-playlist-controller.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + + + + + +var AudioTrackController = /*#__PURE__*/function (_BasePlaylistControll) { + _inheritsLoose(AudioTrackController, _BasePlaylistControll); + + function AudioTrackController(hls) { + var _this; + + _this = _BasePlaylistControll.call(this, hls, '[audio-track-controller]') || this; + _this.tracks = []; + _this.groupId = null; + _this.tracksInGroup = []; + _this.trackId = -1; + _this.trackName = ''; + _this.selectDefaultTrack = true; + + _this.registerListeners(); + + return _this; + } + + var _proto = AudioTrackController.prototype; + + _proto.registerListeners = function registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_LOADING, this.onLevelLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_SWITCHING, this.onLevelSwitching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, this.onError, this); + }; + + _proto.unregisterListeners = function unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_LOADING, this.onLevelLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_SWITCHING, this.onLevelSwitching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, this.onError, this); + }; + + _proto.destroy = function destroy() { + this.unregisterListeners(); + this.tracks.length = 0; + this.tracksInGroup.length = 0; + + _BasePlaylistControll.prototype.destroy.call(this); + }; + + _proto.onManifestLoading = function onManifestLoading() { + this.tracks = []; + this.groupId = null; + this.tracksInGroup = []; + this.trackId = -1; + this.trackName = ''; + this.selectDefaultTrack = true; + }; + + _proto.onManifestParsed = function onManifestParsed(event, data) { + this.tracks = data.audioTracks || []; + }; + + _proto.onAudioTrackLoaded = function onAudioTrackLoaded(event, data) { + var id = data.id, + details = data.details; + var currentTrack = this.tracksInGroup[id]; + + if (!currentTrack) { + this.warn("Invalid audio track id " + id); + return; + } + + var curDetails = currentTrack.details; + currentTrack.details = data.details; + this.log("audioTrack " + id + " loaded [" + details.startSN + "-" + details.endSN + "]"); + + if (id === this.trackId) { + this.retryCount = 0; + this.playlistLoaded(id, data, curDetails); + } + }; + + _proto.onLevelLoading = function onLevelLoading(event, data) { + this.switchLevel(data.level); + }; + + _proto.onLevelSwitching = function onLevelSwitching(event, data) { + this.switchLevel(data.level); + }; + + _proto.switchLevel = function switchLevel(levelIndex) { + var levelInfo = this.hls.levels[levelIndex]; + + if (!(levelInfo !== null && levelInfo !== void 0 && levelInfo.audioGroupIds)) { + return; + } + + var audioGroupId = levelInfo.audioGroupIds[levelInfo.urlId]; + + if (this.groupId !== audioGroupId) { + this.groupId = audioGroupId; + var audioTracks = this.tracks.filter(function (track) { + return !audioGroupId || track.groupId === audioGroupId; + }); // Disable selectDefaultTrack if there are no default tracks + + if (this.selectDefaultTrack && !audioTracks.some(function (track) { + return track.default; + })) { + this.selectDefaultTrack = false; + } + + this.tracksInGroup = audioTracks; + var audioTracksUpdated = { + audioTracks: audioTracks + }; + this.log("Updating audio tracks, " + audioTracks.length + " track(s) found in \"" + audioGroupId + "\" group-id"); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].AUDIO_TRACKS_UPDATED, audioTracksUpdated); + this.selectInitialTrack(); + } + }; + + _proto.onError = function onError(event, data) { + _BasePlaylistControll.prototype.onError.call(this, event, data); + + if (data.fatal || !data.context) { + return; + } + + if (data.context.type === _types_loader__WEBPACK_IMPORTED_MODULE_3__["PlaylistContextType"].AUDIO_TRACK && data.context.id === this.trackId && data.context.groupId === this.groupId) { + this.retryLoadingOrFail(data); + } + }; + + _proto.setAudioTrack = function setAudioTrack(newId) { + var tracks = this.tracksInGroup; // check if level idx is valid + + if (newId < 0 || newId >= tracks.length) { + this.warn('Invalid id passed to audio-track controller'); + return; + } // stopping live reloading timer if any + + + this.clearTimer(); + var lastTrack = tracks[this.trackId]; + this.log("Now switching to audio-track index " + newId); + var track = tracks[newId]; + var id = track.id, + _track$groupId = track.groupId, + groupId = _track$groupId === void 0 ? '' : _track$groupId, + name = track.name, + type = track.type, + url = track.url; + this.trackId = newId; + this.trackName = name; + this.selectDefaultTrack = false; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].AUDIO_TRACK_SWITCHING, { + id: id, + groupId: groupId, + name: name, + type: type, + url: url + }); // Do not reload track unless live + + if (track.details && !track.details.live) { + return; + } + + var hlsUrlParameters = this.switchParams(track.url, lastTrack === null || lastTrack === void 0 ? void 0 : lastTrack.details); + this.loadPlaylist(hlsUrlParameters); + }; + + _proto.selectInitialTrack = function selectInitialTrack() { + var audioTracks = this.tracksInGroup; + console.assert(audioTracks.length, 'Initial audio track should be selected when tracks are known'); + var currentAudioTrackName = this.trackName; + var trackId = this.findTrackId(currentAudioTrackName) || this.findTrackId(); + + if (trackId !== -1) { + this.setAudioTrack(trackId); + } else { + this.warn("No track found for running audio group-ID: " + this.groupId); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].AUDIO_TRACK_LOAD_ERROR, + fatal: true + }); + } + }; + + _proto.findTrackId = function findTrackId(name) { + var audioTracks = this.tracksInGroup; + + for (var i = 0; i < audioTracks.length; i++) { + var track = audioTracks[i]; + + if (!this.selectDefaultTrack || track.default) { + if (!name || name === track.name) { + return track.id; + } + } + } + + return -1; + }; + + _proto.loadPlaylist = function loadPlaylist(hlsUrlParameters) { + var audioTrack = this.tracksInGroup[this.trackId]; + + if (this.shouldLoadTrack(audioTrack)) { + var id = audioTrack.id; + var groupId = audioTrack.groupId; + var url = audioTrack.url; + + if (hlsUrlParameters) { + try { + url = hlsUrlParameters.addDirectives(url); + } catch (error) { + this.warn("Could not construct new URL with HLS Delivery Directives: " + error); + } + } // track not retrieved yet, or live playlist we need to (re)load it + + + this.log("loading audio-track playlist for id: " + id); + this.clearTimer(); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].AUDIO_TRACK_LOADING, { + url: url, + id: id, + groupId: groupId, + deliveryDirectives: hlsUrlParameters || null + }); + } + }; + + _createClass(AudioTrackController, [{ + key: "audioTracks", + get: function get() { + return this.tracksInGroup; + } + }, { + key: "audioTrack", + get: function get() { + return this.trackId; + }, + set: function set(newId) { + // If audio track is selected from API then don't choose from the manifest default track + this.selectDefaultTrack = false; + this.setAudioTrack(newId); + } + }]); + + return AudioTrackController; +}(_base_playlist_controller__WEBPACK_IMPORTED_MODULE_2__["default"]); + +/* harmony default export */ __webpack_exports__["default"] = (AudioTrackController); + +/***/ }), + +/***/ "./src/controller/base-playlist-controller.ts": +/*!****************************************************!*\ + !*** ./src/controller/base-playlist-controller.ts ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BasePlaylistController; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _types_level__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../types/level */ "./src/types/level.ts"); +/* harmony import */ var _level_helper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./level-helper */ "./src/controller/level-helper.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); + + + + + + + +var BasePlaylistController = /*#__PURE__*/function () { + function BasePlaylistController(hls, logPrefix) { + this.hls = void 0; + this.timer = -1; + this.canLoad = false; + this.retryCount = 0; + this.log = void 0; + this.warn = void 0; + this.log = _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].log.bind(_utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"], logPrefix + ":"); + this.warn = _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn.bind(_utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"], logPrefix + ":"); + this.hls = hls; + } + + var _proto = BasePlaylistController.prototype; + + _proto.destroy = function destroy() { + this.clearTimer(); // @ts-ignore + + this.hls = this.log = this.warn = null; + }; + + _proto.onError = function onError(event, data) { + if (data.fatal && data.type === _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorTypes"].NETWORK_ERROR) { + this.clearTimer(); + } + }; + + _proto.clearTimer = function clearTimer() { + clearTimeout(this.timer); + this.timer = -1; + }; + + _proto.startLoad = function startLoad() { + this.canLoad = true; + this.retryCount = 0; + this.loadPlaylist(); + }; + + _proto.stopLoad = function stopLoad() { + this.canLoad = false; + this.clearTimer(); + }; + + _proto.switchParams = function switchParams(playlistUri, previous) { + var renditionReports = previous === null || previous === void 0 ? void 0 : previous.renditionReports; + + if (renditionReports) { + for (var i = 0; i < renditionReports.length; i++) { + var attr = renditionReports[i]; + var uri = '' + attr.URI; + + if (uri === playlistUri.substr(-uri.length)) { + var msn = parseInt(attr['LAST-MSN']); + var part = parseInt(attr['LAST-PART']); + + if (previous && this.hls.config.lowLatencyMode) { + var currentGoal = Math.min(previous.age - previous.partTarget, previous.targetduration); + + if (part !== undefined && currentGoal > previous.partTarget) { + part += 1; + } + } + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(msn)) { + return new _types_level__WEBPACK_IMPORTED_MODULE_1__["HlsUrlParameters"](msn, Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(part) ? part : undefined, _types_level__WEBPACK_IMPORTED_MODULE_1__["HlsSkip"].No); + } + } + } + } + }; + + _proto.loadPlaylist = function loadPlaylist(hlsUrlParameters) {}; + + _proto.shouldLoadTrack = function shouldLoadTrack(track) { + return this.canLoad && track && !!track.url && (!track.details || track.details.live); + }; + + _proto.playlistLoaded = function playlistLoaded(index, data, previousDetails) { + var _this = this; + + var details = data.details, + stats = data.stats; // Set last updated date-time + + var elapsed = stats.loading.end ? Math.max(0, self.performance.now() - stats.loading.end) : 0; + details.advancedDateTime = Date.now() - elapsed; // if current playlist is a live playlist, arm a timer to reload it + + if (details.live || previousDetails !== null && previousDetails !== void 0 && previousDetails.live) { + details.reloaded(previousDetails); + + if (previousDetails) { + this.log("live playlist " + index + " " + (details.advanced ? 'REFRESHED ' + details.lastPartSn + '-' + details.lastPartIndex : 'MISSED')); + } // Merge live playlists to adjust fragment starts and fill in delta playlist skipped segments + + + if (previousDetails && details.fragments.length > 0) { + Object(_level_helper__WEBPACK_IMPORTED_MODULE_2__["mergeDetails"])(previousDetails, details); + } + + if (!this.canLoad || !details.live) { + return; + } + + var deliveryDirectives; + var msn = undefined; + var part = undefined; + + if (details.canBlockReload && details.endSN && details.advanced) { + // Load level with LL-HLS delivery directives + var lowLatencyMode = this.hls.config.lowLatencyMode; + var lastPartSn = details.lastPartSn; + var endSn = details.endSN; + var lastPartIndex = details.lastPartIndex; + var hasParts = lastPartIndex !== -1; + var lastPart = lastPartSn === endSn; // When low latency mode is disabled, we'll skip part requests once the last part index is found + + var nextSnStartIndex = lowLatencyMode ? 0 : lastPartIndex; + + if (hasParts) { + msn = lastPart ? endSn + 1 : lastPartSn; + part = lastPart ? nextSnStartIndex : lastPartIndex + 1; + } else { + msn = endSn + 1; + } // Low-Latency CDN Tune-in: "age" header and time since load indicates we're behind by more than one part + // Update directives to obtain the Playlist that has the estimated additional duration of media + + + var lastAdvanced = details.age; + var cdnAge = lastAdvanced + details.ageHeader; + var currentGoal = Math.min(cdnAge - details.partTarget, details.targetduration * 1.5); + + if (currentGoal > 0) { + if (previousDetails && currentGoal > previousDetails.tuneInGoal) { + // If we attempted to get the next or latest playlist update, but currentGoal increased, + // then we either can't catchup, or the "age" header cannot be trusted. + this.warn("CDN Tune-in goal increased from: " + previousDetails.tuneInGoal + " to: " + currentGoal + " with playlist age: " + details.age); + currentGoal = 0; + } else { + var segments = Math.floor(currentGoal / details.targetduration); + msn += segments; + + if (part !== undefined) { + var parts = Math.round(currentGoal % details.targetduration / details.partTarget); + part += parts; + } + + this.log("CDN Tune-in age: " + details.ageHeader + "s last advanced " + lastAdvanced.toFixed(2) + "s goal: " + currentGoal + " skip sn " + segments + " to part " + part); + } + + details.tuneInGoal = currentGoal; + } + + deliveryDirectives = this.getDeliveryDirectives(details, data.deliveryDirectives, msn, part); + + if (lowLatencyMode || !lastPart) { + this.loadPlaylist(deliveryDirectives); + return; + } + } else { + deliveryDirectives = this.getDeliveryDirectives(details, data.deliveryDirectives, msn, part); + } + + var reloadInterval = Object(_level_helper__WEBPACK_IMPORTED_MODULE_2__["computeReloadInterval"])(details, stats); + + if (msn !== undefined && details.canBlockReload) { + reloadInterval -= details.partTarget || 1; + } + + this.log("reload live playlist " + index + " in " + Math.round(reloadInterval) + " ms"); + this.timer = self.setTimeout(function () { + return _this.loadPlaylist(deliveryDirectives); + }, reloadInterval); + } else { + this.clearTimer(); + } + }; + + _proto.getDeliveryDirectives = function getDeliveryDirectives(details, previousDeliveryDirectives, msn, part) { + var skip = Object(_types_level__WEBPACK_IMPORTED_MODULE_1__["getSkipValue"])(details, msn); + + if (previousDeliveryDirectives !== null && previousDeliveryDirectives !== void 0 && previousDeliveryDirectives.skip && details.deltaUpdateFailed) { + msn = previousDeliveryDirectives.msn; + part = previousDeliveryDirectives.part; + skip = _types_level__WEBPACK_IMPORTED_MODULE_1__["HlsSkip"].No; + } + + return new _types_level__WEBPACK_IMPORTED_MODULE_1__["HlsUrlParameters"](msn, part, skip); + }; + + _proto.retryLoadingOrFail = function retryLoadingOrFail(errorEvent) { + var _this2 = this; + + var config = this.hls.config; + var retry = this.retryCount < config.levelLoadingMaxRetry; + + if (retry) { + var _errorEvent$context; + + this.retryCount++; + + if (errorEvent.details.indexOf('LoadTimeOut') > -1 && (_errorEvent$context = errorEvent.context) !== null && _errorEvent$context !== void 0 && _errorEvent$context.deliveryDirectives) { + // The LL-HLS request already timed out so retry immediately + this.warn("retry playlist loading #" + this.retryCount + " after \"" + errorEvent.details + "\""); + this.loadPlaylist(); + } else { + // exponential backoff capped to max retry timeout + var delay = Math.min(Math.pow(2, this.retryCount) * config.levelLoadingRetryDelay, config.levelLoadingMaxRetryTimeout); // Schedule level/track reload + + this.timer = self.setTimeout(function () { + return _this2.loadPlaylist(); + }, delay); + this.warn("retry playlist loading #" + this.retryCount + " in " + delay + " ms after \"" + errorEvent.details + "\""); + } + } else { + this.warn("cannot recover from error \"" + errorEvent.details + "\""); // stopping live reloading timer if any + + this.clearTimer(); // switch error to fatal + + errorEvent.fatal = true; + } + + return retry; + }; + + return BasePlaylistController; +}(); + + + +/***/ }), + +/***/ "./src/controller/base-stream-controller.ts": +/*!**************************************************!*\ + !*** ./src/controller/base-stream-controller.ts ***! + \**************************************************/ +/*! exports provided: State, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "State", function() { return State; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BaseStreamController; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _task_loop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../task-loop */ "./src/task-loop.ts"); +/* harmony import */ var _fragment_tracker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fragment-tracker */ "./src/controller/fragment-tracker.ts"); +/* harmony import */ var _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/buffer-helper */ "./src/utils/buffer-helper.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _types_transmuxer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../types/transmuxer */ "./src/types/transmuxer.ts"); +/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _utils_discontinuities__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/discontinuities */ "./src/utils/discontinuities.ts"); +/* harmony import */ var _fragment_finders__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./fragment-finders */ "./src/controller/fragment-finders.ts"); +/* harmony import */ var _level_helper__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./level-helper */ "./src/controller/level-helper.ts"); +/* harmony import */ var _loader_fragment_loader__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../loader/fragment-loader */ "./src/loader/fragment-loader.ts"); +/* harmony import */ var _crypt_decrypter__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../crypt/decrypter */ "./src/crypt/decrypter.ts"); +/* harmony import */ var _utils_time_ranges__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/time-ranges */ "./src/utils/time-ranges.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); + + + + + + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + + + + + + + + + + + + + + + +var State = { + STOPPED: 'STOPPED', + IDLE: 'IDLE', + KEY_LOADING: 'KEY_LOADING', + FRAG_LOADING: 'FRAG_LOADING', + FRAG_LOADING_WAITING_RETRY: 'FRAG_LOADING_WAITING_RETRY', + WAITING_TRACK: 'WAITING_TRACK', + PARSING: 'PARSING', + PARSED: 'PARSED', + BACKTRACKING: 'BACKTRACKING', + ENDED: 'ENDED', + ERROR: 'ERROR', + WAITING_INIT_PTS: 'WAITING_INIT_PTS', + WAITING_LEVEL: 'WAITING_LEVEL' +}; + +var BaseStreamController = /*#__PURE__*/function (_TaskLoop) { + _inheritsLoose(BaseStreamController, _TaskLoop); + + function BaseStreamController(hls, fragmentTracker, logPrefix) { + var _this; + + _this = _TaskLoop.call(this) || this; + _this.hls = void 0; + _this.fragPrevious = null; + _this.fragCurrent = null; + _this.fragmentTracker = void 0; + _this.transmuxer = null; + _this._state = State.STOPPED; + _this.media = void 0; + _this.mediaBuffer = void 0; + _this.config = void 0; + _this.bitrateTest = false; + _this.lastCurrentTime = 0; + _this.nextLoadPosition = 0; + _this.startPosition = 0; + _this.loadedmetadata = false; + _this.fragLoadError = 0; + _this.retryDate = 0; + _this.levels = null; + _this.fragmentLoader = void 0; + _this.levelLastLoaded = null; + _this.startFragRequested = false; + _this.decrypter = void 0; + _this.initPTS = []; + _this.onvseeking = null; + _this.onvended = null; + _this.logPrefix = ''; + _this.log = void 0; + _this.warn = void 0; + _this.logPrefix = logPrefix; + _this.log = _utils_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].log.bind(_utils_logger__WEBPACK_IMPORTED_MODULE_4__["logger"], logPrefix + ":"); + _this.warn = _utils_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].warn.bind(_utils_logger__WEBPACK_IMPORTED_MODULE_4__["logger"], logPrefix + ":"); + _this.hls = hls; + _this.fragmentLoader = new _loader_fragment_loader__WEBPACK_IMPORTED_MODULE_12__["default"](hls.config); + _this.fragmentTracker = fragmentTracker; + _this.config = hls.config; + _this.decrypter = new _crypt_decrypter__WEBPACK_IMPORTED_MODULE_13__["default"](hls, hls.config); + hls.on(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].KEY_LOADED, _this.onKeyLoaded, _assertThisInitialized(_this)); + return _this; + } + + var _proto = BaseStreamController.prototype; + + _proto.doTick = function doTick() { + this.onTickEnd(); + }; + + _proto.onTickEnd = function onTickEnd() {} // eslint-disable-next-line @typescript-eslint/no-unused-vars + ; + + _proto.startLoad = function startLoad(startPosition) {}; + + _proto.stopLoad = function stopLoad() { + this.fragmentLoader.abort(); + var frag = this.fragCurrent; + + if (frag) { + this.fragmentTracker.removeFragment(frag); + } + + this.resetTransmuxer(); + this.fragCurrent = null; + this.fragPrevious = null; + this.clearInterval(); + this.clearNextTick(); + this.state = State.STOPPED; + }; + + _proto._streamEnded = function _streamEnded(bufferInfo, levelDetails) { + var fragCurrent = this.fragCurrent, + fragmentTracker = this.fragmentTracker; // we just got done loading the final fragment and there is no other buffered range after ... + // rationale is that in case there are any buffered ranges after, it means that there are unbuffered portion in between + // so we should not switch to ENDED in that case, to be able to buffer them + + if (!levelDetails.live && fragCurrent && fragCurrent.sn === levelDetails.endSN && !bufferInfo.nextStart) { + var fragState = fragmentTracker.getState(fragCurrent); + return fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_2__["FragmentState"].PARTIAL || fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_2__["FragmentState"].OK; + } + + return false; + }; + + _proto.onMediaAttached = function onMediaAttached(event, data) { + var media = this.media = this.mediaBuffer = data.media; + this.onvseeking = this.onMediaSeeking.bind(this); + this.onvended = this.onMediaEnded.bind(this); + media.addEventListener('seeking', this.onvseeking); + media.addEventListener('ended', this.onvended); + var config = this.config; + + if (this.levels && config.autoStartLoad && this.state === State.STOPPED) { + this.startLoad(config.startPosition); + } + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + var media = this.media; + + if (media !== null && media !== void 0 && media.ended) { + this.log('MSE detaching and video ended, reset startPosition'); + this.startPosition = this.lastCurrentTime = 0; + } // remove video listeners + + + if (media) { + media.removeEventListener('seeking', this.onvseeking); + media.removeEventListener('ended', this.onvended); + this.onvseeking = this.onvended = null; + } + + this.media = this.mediaBuffer = null; + this.loadedmetadata = false; + this.fragmentTracker.removeAllFragments(); + this.stopLoad(); + }; + + _proto.onMediaSeeking = function onMediaSeeking() { + var config = this.config, + fragCurrent = this.fragCurrent, + media = this.media, + mediaBuffer = this.mediaBuffer, + state = this.state; + var currentTime = media ? media.currentTime : 0; + var bufferInfo = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].bufferInfo(mediaBuffer || media, currentTime, config.maxBufferHole); + this.log("media seeking to " + (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(currentTime) ? currentTime.toFixed(3) : currentTime) + ", state: " + state); + + if (state === State.ENDED) { + this.resetLoadingState(); + } else if (fragCurrent && !bufferInfo.len) { + // check if we are seeking to a unbuffered area AND if frag loading is in progress + var tolerance = config.maxFragLookUpTolerance; + var fragStartOffset = fragCurrent.start - tolerance; + var fragEndOffset = fragCurrent.start + fragCurrent.duration + tolerance; + var pastFragment = currentTime > fragEndOffset; // check if the seek position is past current fragment, and if so abort loading + + if (currentTime < fragStartOffset || pastFragment) { + if (pastFragment && fragCurrent.loader) { + this.log('seeking outside of buffer while fragment load in progress, cancel fragment load'); + fragCurrent.loader.abort(); + } + + this.resetLoadingState(); + } + } + + if (media) { + this.lastCurrentTime = currentTime; + } // in case seeking occurs although no media buffered, adjust startPosition and nextLoadPosition to seek target + + + if (!this.loadedmetadata && !bufferInfo.len) { + this.nextLoadPosition = this.startPosition = currentTime; + } // Async tick to speed up processing + + + this.tickImmediate(); + }; + + _proto.onMediaEnded = function onMediaEnded() { + // reset startPosition and lastCurrentTime to restart playback @ stream beginning + this.startPosition = this.lastCurrentTime = 0; + }; + + _proto.onKeyLoaded = function onKeyLoaded(event, data) { + if (this.state !== State.KEY_LOADING || data.frag !== this.fragCurrent || !this.levels) { + return; + } + + this.state = State.IDLE; + var levelDetails = this.levels[data.frag.level].details; + + if (levelDetails) { + this.loadFragment(data.frag, levelDetails, data.frag.start); + } + }; + + _proto.onHandlerDestroying = function onHandlerDestroying() { + this.stopLoad(); + + _TaskLoop.prototype.onHandlerDestroying.call(this); + }; + + _proto.onHandlerDestroyed = function onHandlerDestroyed() { + this.state = State.STOPPED; + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].KEY_LOADED, this.onKeyLoaded, this); + + if (this.fragmentLoader) { + this.fragmentLoader.destroy(); + } + + if (this.decrypter) { + this.decrypter.destroy(); + } + + this.hls = this.log = this.warn = this.decrypter = this.fragmentLoader = this.fragmentTracker = null; + + _TaskLoop.prototype.onHandlerDestroyed.call(this); + }; + + _proto.loadKey = function loadKey(frag, details) { + this.log("Loading key for " + frag.sn + " of [" + details.startSN + "-" + details.endSN + "], " + (this.logPrefix === '[stream-controller]' ? 'level' : 'track') + " " + frag.level); + this.state = State.KEY_LOADING; + this.fragCurrent = frag; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].KEY_LOADING, { + frag: frag + }); + }; + + _proto.loadFragment = function loadFragment(frag, levelDetails, targetBufferTime) { + this._loadFragForPlayback(frag, levelDetails, targetBufferTime); + }; + + _proto._loadFragForPlayback = function _loadFragForPlayback(frag, levelDetails, targetBufferTime) { + var _this2 = this; + + var progressCallback = function progressCallback(data) { + if (_this2.fragContextChanged(frag)) { + _this2.warn("Fragment " + frag.sn + (data.part ? ' p: ' + data.part.index : '') + " of level " + frag.level + " was dropped during download."); + + _this2.fragmentTracker.removeFragment(frag); + + return; + } + + frag.stats.chunkCount++; + + _this2._handleFragmentLoadProgress(data); + }; + + this._doFragLoad(frag, levelDetails, targetBufferTime, progressCallback).then(function (data) { + if (!data) { + // if we're here we probably needed to backtrack or are waiting for more parts + return; + } + + _this2.fragLoadError = 0; + var state = _this2.state; + + if (_this2.fragContextChanged(frag)) { + if (state === State.FRAG_LOADING || state === State.BACKTRACKING || !_this2.fragCurrent && state === State.PARSING) { + _this2.fragmentTracker.removeFragment(frag); + + _this2.state = State.IDLE; + } + + return; + } + + if ('payload' in data) { + _this2.log("Loaded fragment " + frag.sn + " of level " + frag.level); + + _this2.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].FRAG_LOADED, data); // Tracker backtrack must be called after onFragLoaded to update the fragment entity state to BACKTRACKED + // This happens after handleTransmuxComplete when the worker or progressive is disabled + + + if (_this2.state === State.BACKTRACKING) { + _this2.fragmentTracker.backtrack(frag, data); + + _this2.resetFragmentLoading(frag); + + return; + } + } // Pass through the whole payload; controllers not implementing progressive loading receive data from this callback + + + _this2._handleFragmentLoadComplete(data); + }).catch(function (reason) { + _this2.warn(reason); + + _this2.resetFragmentLoading(frag); + }); + }; + + _proto.flushMainBuffer = function flushMainBuffer(startOffset, endOffset, type) { + if (type === void 0) { + type = null; + } + + if (!(startOffset - endOffset)) { + return; + } // When alternate audio is playing, the audio-stream-controller is responsible for the audio buffer. Otherwise, + // passing a null type flushes both buffers + + + var flushScope = { + startOffset: startOffset, + endOffset: endOffset, + type: type + }; // Reset load errors on flush + + this.fragLoadError = 0; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].BUFFER_FLUSHING, flushScope); + }; + + _proto._loadInitSegment = function _loadInitSegment(frag) { + var _this3 = this; + + this._doFragLoad(frag).then(function (data) { + if (!data || _this3.fragContextChanged(frag) || !_this3.levels) { + throw new Error('init load aborted'); + } + + return data; + }).then(function (data) { + var hls = _this3.hls; + var payload = data.payload; + var decryptData = frag.decryptdata; // check to see if the payload needs to be decrypted + + if (payload && payload.byteLength > 0 && decryptData && decryptData.key && decryptData.iv && decryptData.method === 'AES-128') { + var startTime = self.performance.now(); // decrypt the subtitles + + return _this3.decrypter.webCryptoDecrypt(new Uint8Array(payload), decryptData.key.buffer, decryptData.iv.buffer).then(function (decryptedData) { + var endTime = self.performance.now(); + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].FRAG_DECRYPTED, { + frag: frag, + payload: decryptedData, + stats: { + tstart: startTime, + tdecrypt: endTime + } + }); + data.payload = decryptedData; + return data; + }); + } + + return data; + }).then(function (data) { + var fragCurrent = _this3.fragCurrent, + hls = _this3.hls, + levels = _this3.levels; + + if (!levels) { + throw new Error('init load aborted, missing levels'); + } + + var details = levels[frag.level].details; + console.assert(details, 'Level details are defined when init segment is loaded'); + var stats = frag.stats; + _this3.state = State.IDLE; + _this3.fragLoadError = 0; + frag.data = new Uint8Array(data.payload); + stats.parsing.start = stats.buffering.start = self.performance.now(); + stats.parsing.end = stats.buffering.end = self.performance.now(); // Silence FRAG_BUFFERED event if fragCurrent is null + + if (data.frag === fragCurrent) { + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].FRAG_BUFFERED, { + stats: stats, + frag: fragCurrent, + part: null, + id: frag.type + }); + } + + _this3.tick(); + }).catch(function (reason) { + _this3.warn(reason); + + _this3.resetFragmentLoading(frag); + }); + }; + + _proto.fragContextChanged = function fragContextChanged(frag) { + var fragCurrent = this.fragCurrent; + return !frag || !fragCurrent || frag.level !== fragCurrent.level || frag.sn !== fragCurrent.sn || frag.urlId !== fragCurrent.urlId; + }; + + _proto.fragBufferedComplete = function fragBufferedComplete(frag, part) { + var media = this.mediaBuffer ? this.mediaBuffer : this.media; + this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + (this.logPrefix === '[stream-controller]' ? 'level' : 'track') + " " + frag.level + " " + _utils_time_ranges__WEBPACK_IMPORTED_MODULE_14__["default"].toString(_utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].getBuffered(media))); + this.state = State.IDLE; + this.tick(); + }; + + _proto._handleFragmentLoadComplete = function _handleFragmentLoadComplete(fragLoadedEndData) { + var transmuxer = this.transmuxer; + + if (!transmuxer) { + return; + } + + var frag = fragLoadedEndData.frag, + part = fragLoadedEndData.part, + partsLoaded = fragLoadedEndData.partsLoaded; // If we did not load parts, or loaded all parts, we have complete (not partial) fragment data + + var complete = !partsLoaded || partsLoaded.length === 0 || partsLoaded.some(function (fragLoaded) { + return !fragLoaded; + }); + var chunkMeta = new _types_transmuxer__WEBPACK_IMPORTED_MODULE_7__["ChunkMetadata"](frag.level, frag.sn, frag.stats.chunkCount + 1, 0, part ? part.index : -1, !complete); + transmuxer.flush(chunkMeta); + } // eslint-disable-next-line @typescript-eslint/no-unused-vars + ; + + _proto._handleFragmentLoadProgress = function _handleFragmentLoadProgress(frag) {}; + + _proto._doFragLoad = function _doFragLoad(frag, details, targetBufferTime, progressCallback) { + var _this4 = this; + + if (targetBufferTime === void 0) { + targetBufferTime = null; + } + + if (!this.levels) { + throw new Error('frag load aborted, missing levels'); + } + + targetBufferTime = Math.max(frag.start, targetBufferTime || 0); + + if (this.config.lowLatencyMode && details) { + var partList = details.partList; + + if (partList && progressCallback) { + if (targetBufferTime > frag.end && details.fragmentHint) { + frag = details.fragmentHint; + } + + var partIndex = this.getNextPart(partList, frag, targetBufferTime); + + if (partIndex > -1) { + var part = partList[partIndex]; + this.log("Loading part sn: " + frag.sn + " p: " + part.index + " cc: " + frag.cc + " of playlist [" + details.startSN + "-" + details.endSN + "] parts [0-" + partIndex + "-" + (partList.length - 1) + "] " + (this.logPrefix === '[stream-controller]' ? 'level' : 'track') + ": " + frag.level + ", target: " + parseFloat(targetBufferTime.toFixed(3))); + this.nextLoadPosition = part.start + part.duration; + this.state = State.FRAG_LOADING; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].FRAG_LOADING, { + frag: frag, + part: partList[partIndex], + targetBufferTime: targetBufferTime + }); + return this.doFragPartsLoad(frag, partList, partIndex, progressCallback).catch(function (error) { + return _this4.handleFragLoadError(error); + }); + } else if (!frag.url || this.loadedEndOfParts(partList, targetBufferTime)) { + // Fragment hint has no parts + return Promise.resolve(null); + } + } + } + + this.log("Loading fragment " + frag.sn + " cc: " + frag.cc + " " + (details ? 'of [' + details.startSN + '-' + details.endSN + '] ' : '') + (this.logPrefix === '[stream-controller]' ? 'level' : 'track') + ": " + frag.level + ", target: " + parseFloat(targetBufferTime.toFixed(3))); // Don't update nextLoadPosition for fragments which are not buffered + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(frag.sn) && !this.bitrateTest) { + this.nextLoadPosition = frag.start + frag.duration; + } + + this.state = State.FRAG_LOADING; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].FRAG_LOADING, { + frag: frag, + targetBufferTime: targetBufferTime + }); + return this.fragmentLoader.load(frag, progressCallback).catch(function (error) { + return _this4.handleFragLoadError(error); + }); + }; + + _proto.doFragPartsLoad = function doFragPartsLoad(frag, partList, partIndex, progressCallback) { + var _this5 = this; + + return new Promise(function (resolve, reject) { + var partsLoaded = []; + + var loadPartIndex = function loadPartIndex(index) { + var part = partList[index]; + + _this5.fragmentLoader.loadPart(frag, part, progressCallback).then(function (partLoadedData) { + partsLoaded[part.index] = partLoadedData; + var loadedPart = partLoadedData.part; + + _this5.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].FRAG_LOADED, partLoadedData); + + var nextPart = partList[index + 1]; + + if (nextPart && nextPart.fragment === frag) { + loadPartIndex(index + 1); + } else { + return resolve({ + frag: frag, + part: loadedPart, + partsLoaded: partsLoaded + }); + } + }).catch(reject); + }; + + loadPartIndex(partIndex); + }); + }; + + _proto.handleFragLoadError = function handleFragLoadError(_ref) { + var data = _ref.data; + + if (data && data.details === _errors__WEBPACK_IMPORTED_MODULE_6__["ErrorDetails"].INTERNAL_ABORTED) { + this.handleFragLoadAborted(data.frag, data.part); + } else { + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].ERROR, data); + } + + return null; + }; + + _proto._handleTransmuxerFlush = function _handleTransmuxerFlush(chunkMeta) { + var context = this.getCurrentContext(chunkMeta); + + if (!context || this.state !== State.PARSING) { + if (!this.fragCurrent) { + this.state = State.IDLE; + } + + return; + } + + var frag = context.frag, + part = context.part, + level = context.level; + var now = self.performance.now(); + frag.stats.parsing.end = now; + + if (part) { + part.stats.parsing.end = now; + } + + this.updateLevelTiming(frag, part, level, chunkMeta.partial); + }; + + _proto.getCurrentContext = function getCurrentContext(chunkMeta) { + var levels = this.levels; + var levelIndex = chunkMeta.level, + sn = chunkMeta.sn, + partIndex = chunkMeta.part; + + if (!levels || !levels[levelIndex]) { + this.warn("Levels object was unset while buffering fragment " + sn + " of level " + levelIndex + ". The current chunk will not be buffered."); + return null; + } + + var level = levels[levelIndex]; + var part = partIndex > -1 ? Object(_level_helper__WEBPACK_IMPORTED_MODULE_11__["getPartWith"])(level, sn, partIndex) : null; + var frag = part ? part.fragment : Object(_level_helper__WEBPACK_IMPORTED_MODULE_11__["getFragmentWithSN"])(level, sn, this.fragCurrent); + + if (!frag) { + return null; + } + + return { + frag: frag, + part: part, + level: level + }; + }; + + _proto.bufferFragmentData = function bufferFragmentData(data, frag, part, chunkMeta) { + if (!data || this.state !== State.PARSING) { + return; + } + + var data1 = data.data1, + data2 = data.data2; + var buffer = data1; + + if (data1 && data2) { + // Combine the moof + mdat so that we buffer with a single append + buffer = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_8__["appendUint8Array"])(data1, data2); + } + + if (!buffer || !buffer.length) { + return; + } + + var segment = { + type: data.type, + frag: frag, + part: part, + chunkMeta: chunkMeta, + parent: frag.type, + data: buffer + }; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].BUFFER_APPENDING, segment); + + if (data.dropped && data.independent && !part) { + // Clear buffer so that we reload previous segments sequentially if required + this.flushBufferGap(frag); + } + }; + + _proto.flushBufferGap = function flushBufferGap(frag) { + var media = this.media; + + if (!media) { + return; + } // If currentTime is not buffered, clear the back buffer so that we can backtrack as much as needed + + + if (!_utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].isBuffered(media, media.currentTime)) { + this.flushMainBuffer(0, frag.start); + return; + } // Remove back-buffer without interrupting playback to allow back tracking + + + var currentTime = media.currentTime; + var bufferInfo = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].bufferInfo(media, currentTime, 0); + var fragDuration = frag.duration; + var segmentFraction = Math.min(this.config.maxFragLookUpTolerance * 2, fragDuration * 0.25); + var start = Math.max(Math.min(frag.start - segmentFraction, bufferInfo.end - segmentFraction), currentTime + segmentFraction); + + if (frag.start - start > segmentFraction) { + this.flushMainBuffer(start, frag.start); + } + }; + + _proto.getFwdBufferInfo = function getFwdBufferInfo(bufferable, type) { + var config = this.config; + var pos = this.getLoadPosition(); + + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(pos)) { + return null; + } + + var bufferInfo = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].bufferInfo(bufferable, pos, config.maxBufferHole); // Workaround flaw in getting forward buffer when maxBufferHole is smaller than gap at current pos + + if (bufferInfo.len === 0 && bufferInfo.nextStart !== undefined) { + var bufferedFragAtPos = this.fragmentTracker.getBufferedFrag(pos, type); + + if (bufferedFragAtPos && bufferInfo.nextStart < bufferedFragAtPos.end) { + return _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].bufferInfo(bufferable, pos, Math.max(bufferInfo.nextStart, config.maxBufferHole)); + } + } + + return bufferInfo; + }; + + _proto.getMaxBufferLength = function getMaxBufferLength(levelBitrate) { + var config = this.config; + var maxBufLen; + + if (levelBitrate) { + maxBufLen = Math.max(8 * config.maxBufferSize / levelBitrate, config.maxBufferLength); + } else { + maxBufLen = config.maxBufferLength; + } + + return Math.min(maxBufLen, config.maxMaxBufferLength); + }; + + _proto.reduceMaxBufferLength = function reduceMaxBufferLength(threshold) { + var config = this.config; + var minLength = threshold || config.maxBufferLength; + + if (config.maxMaxBufferLength >= minLength) { + // reduce max buffer length as it might be too high. we do this to avoid loop flushing ... + config.maxMaxBufferLength /= 2; + this.warn("Reduce max buffer length to " + config.maxMaxBufferLength + "s"); + return true; + } + + return false; + }; + + _proto.getNextFragment = function getNextFragment(pos, levelDetails) { + var _frag, _frag2; + + var fragments = levelDetails.fragments; + var fragLen = fragments.length; + + if (!fragLen) { + return null; + } // find fragment index, contiguous with end of buffer position + + + var config = this.config; + var start = fragments[0].start; + var frag; + + if (levelDetails.live) { + var initialLiveManifestSize = config.initialLiveManifestSize; + + if (fragLen < initialLiveManifestSize) { + this.warn("Not enough fragments to start playback (have: " + fragLen + ", need: " + initialLiveManifestSize + ")"); + return null; + } // The real fragment start times for a live stream are only known after the PTS range for that level is known. + // In order to discover the range, we load the best matching fragment for that level and demux it. + // Do not load using live logic if the starting frag is requested - we want to use getFragmentAtPosition() so that + // we get the fragment matching that start time + + + if (!levelDetails.PTSKnown && !this.startFragRequested && this.startPosition === -1) { + frag = this.getInitialLiveFragment(levelDetails, fragments); + this.startPosition = frag ? this.hls.liveSyncPosition || frag.start : pos; + } + } else if (pos <= start) { + // VoD playlist: if loadPosition before start of playlist, load first fragment + frag = fragments[0]; + } // If we haven't run into any special cases already, just load the fragment most closely matching the requested position + + + if (!frag) { + var end = config.lowLatencyMode ? levelDetails.partEnd : levelDetails.fragmentEnd; + frag = this.getFragmentAtPosition(pos, end, levelDetails); + } // If an initSegment is present, it must be buffered first + + + if ((_frag = frag) !== null && _frag !== void 0 && _frag.initSegment && !((_frag2 = frag) !== null && _frag2 !== void 0 && _frag2.initSegment.data) && !this.bitrateTest) { + frag = frag.initSegment; + } + + return frag; + }; + + _proto.getNextPart = function getNextPart(partList, frag, targetBufferTime) { + var nextPart = -1; + var contiguous = false; + var independentAttrOmitted = true; + + for (var i = 0, len = partList.length; i < len; i++) { + var part = partList[i]; + independentAttrOmitted = independentAttrOmitted && !part.independent; + + if (nextPart > -1 && targetBufferTime < part.start) { + break; + } + + var loaded = part.loaded; + + if (!loaded && (contiguous || part.independent || independentAttrOmitted) && part.fragment === frag) { + nextPart = i; + } + + contiguous = loaded; + } + + return nextPart; + }; + + _proto.loadedEndOfParts = function loadedEndOfParts(partList, targetBufferTime) { + var lastPart = partList[partList.length - 1]; + return lastPart && targetBufferTime > lastPart.start && lastPart.loaded; + } + /* + This method is used find the best matching first fragment for a live playlist. This fragment is used to calculate the + "sliding" of the playlist, which is its offset from the start of playback. After sliding we can compute the real + start and end times for each fragment in the playlist (after which this method will not need to be called). + */ + ; + + _proto.getInitialLiveFragment = function getInitialLiveFragment(levelDetails, fragments) { + var fragPrevious = this.fragPrevious; + var frag = null; + + if (fragPrevious) { + if (levelDetails.hasProgramDateTime) { + // Prefer using PDT, because it can be accurate enough to choose the correct fragment without knowing the level sliding + this.log("Live playlist, switching playlist, load frag with same PDT: " + fragPrevious.programDateTime); + frag = Object(_fragment_finders__WEBPACK_IMPORTED_MODULE_10__["findFragmentByPDT"])(fragments, fragPrevious.endProgramDateTime, this.config.maxFragLookUpTolerance); + } + + if (!frag) { + // SN does not need to be accurate between renditions, but depending on the packaging it may be so. + var targetSN = fragPrevious.sn + 1; + + if (targetSN >= levelDetails.startSN && targetSN <= levelDetails.endSN) { + var fragNext = fragments[targetSN - levelDetails.startSN]; // Ensure that we're staying within the continuity range, since PTS resets upon a new range + + if (fragPrevious.cc === fragNext.cc) { + frag = fragNext; + this.log("Live playlist, switching playlist, load frag with next SN: " + frag.sn); + } + } // It's important to stay within the continuity range if available; otherwise the fragments in the playlist + // will have the wrong start times + + + if (!frag) { + frag = Object(_fragment_finders__WEBPACK_IMPORTED_MODULE_10__["findFragWithCC"])(fragments, fragPrevious.cc); + + if (frag) { + this.log("Live playlist, switching playlist, load frag with same CC: " + frag.sn); + } + } + } + } else { + // Find a new start fragment when fragPrevious is null + var liveStart = this.hls.liveSyncPosition; + + if (liveStart !== null) { + frag = this.getFragmentAtPosition(liveStart, this.bitrateTest ? levelDetails.fragmentEnd : levelDetails.edge, levelDetails); + } + } + + return frag; + } + /* + This method finds the best matching fragment given the provided position. + */ + ; + + _proto.getFragmentAtPosition = function getFragmentAtPosition(bufferEnd, end, levelDetails) { + var config = this.config, + fragPrevious = this.fragPrevious; + var fragments = levelDetails.fragments, + endSN = levelDetails.endSN; + var fragmentHint = levelDetails.fragmentHint; + var tolerance = config.maxFragLookUpTolerance; + var loadingParts = !!(config.lowLatencyMode && levelDetails.partList && fragmentHint); + + if (loadingParts && fragmentHint && !this.bitrateTest) { + // Include incomplete fragment with parts at end + fragments = fragments.concat(fragmentHint); + endSN = fragmentHint.sn; + } + + var frag; + + if (bufferEnd < end) { + var lookupTolerance = bufferEnd > end - tolerance ? 0 : tolerance; // Remove the tolerance if it would put the bufferEnd past the actual end of stream + // Uses buffer and sequence number to calculate switch segment (required if using EXT-X-DISCONTINUITY-SEQUENCE) + + frag = Object(_fragment_finders__WEBPACK_IMPORTED_MODULE_10__["findFragmentByPTS"])(fragPrevious, fragments, bufferEnd, lookupTolerance); + } else { + // reach end of playlist + frag = fragments[fragments.length - 1]; + } + + if (frag) { + var curSNIdx = frag.sn - levelDetails.startSN; + var sameLevel = fragPrevious && frag.level === fragPrevious.level; + var nextFrag = fragments[curSNIdx + 1]; + var fragState = this.fragmentTracker.getState(frag); + + if (fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_2__["FragmentState"].BACKTRACKED) { + frag = null; + var i = curSNIdx; + + while (fragments[i] && this.fragmentTracker.getState(fragments[i]) === _fragment_tracker__WEBPACK_IMPORTED_MODULE_2__["FragmentState"].BACKTRACKED) { + // When fragPrevious is null, backtrack to first the first fragment is not BACKTRACKED for loading + // When fragPrevious is set, we want the first BACKTRACKED fragment for parsing and buffering + if (!fragPrevious) { + frag = fragments[--i]; + } else { + frag = fragments[i--]; + } + } + + if (!frag) { + frag = nextFrag; + } + } else if (fragPrevious && frag.sn === fragPrevious.sn && !loadingParts) { + // Force the next fragment to load if the previous one was already selected. This can occasionally happen with + // non-uniform fragment durations + if (sameLevel) { + if (frag.sn < endSN && this.fragmentTracker.getState(nextFrag) !== _fragment_tracker__WEBPACK_IMPORTED_MODULE_2__["FragmentState"].OK) { + this.log("SN " + frag.sn + " just loaded, load next one: " + nextFrag.sn); + frag = nextFrag; + } else { + frag = null; + } + } + } + } + + return frag; + }; + + _proto.synchronizeToLiveEdge = function synchronizeToLiveEdge(levelDetails) { + var config = this.config, + media = this.media; + + if (!media) { + return; + } + + var liveSyncPosition = this.hls.liveSyncPosition; + var currentTime = media.currentTime; + var start = levelDetails.fragments[0].start; + var end = levelDetails.edge; + var withinSlidingWindow = currentTime >= start - config.maxFragLookUpTolerance && currentTime <= end; // Continue if we can seek forward to sync position or if current time is outside of sliding window + + if (liveSyncPosition !== null && media.duration > liveSyncPosition && (currentTime < liveSyncPosition || !withinSlidingWindow)) { + // Continue if buffer is starving or if current time is behind max latency + var maxLatency = config.liveMaxLatencyDuration !== undefined ? config.liveMaxLatencyDuration : config.liveMaxLatencyDurationCount * levelDetails.targetduration; + + if (!withinSlidingWindow && media.readyState < 4 || currentTime < end - maxLatency) { + if (!this.loadedmetadata) { + this.nextLoadPosition = liveSyncPosition; + } // Only seek if ready and there is not a significant forward buffer available for playback + + + if (media.readyState) { + this.warn("Playback: " + currentTime.toFixed(3) + " is located too far from the end of live sliding playlist: " + end + ", reset currentTime to : " + liveSyncPosition.toFixed(3)); + media.currentTime = liveSyncPosition; + } + } + } + }; + + _proto.alignPlaylists = function alignPlaylists(details, previousDetails) { + var levels = this.levels, + levelLastLoaded = this.levelLastLoaded, + fragPrevious = this.fragPrevious; + var lastLevel = levelLastLoaded !== null ? levels[levelLastLoaded] : null; // FIXME: If not for `shouldAlignOnDiscontinuities` requiring fragPrevious.cc, + // this could all go in level-helper mergeDetails() + + var length = details.fragments.length; + + if (!length) { + this.warn("No fragments in live playlist"); + return 0; + } + + var slidingStart = details.fragments[0].start; + var firstLevelLoad = !previousDetails; + + var aligned = details.alignedSliding && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(slidingStart); + + if (firstLevelLoad || !aligned && !slidingStart) { + Object(_utils_discontinuities__WEBPACK_IMPORTED_MODULE_9__["alignStream"])(fragPrevious, lastLevel, details); + var alignedSlidingStart = details.fragments[0].start; + this.log("Live playlist sliding: " + alignedSlidingStart.toFixed(2) + " start-sn: " + (previousDetails ? previousDetails.startSN : 'na') + "->" + details.startSN + " prev-sn: " + (fragPrevious ? fragPrevious.sn : 'na') + " fragments: " + length); + return alignedSlidingStart; + } + + return slidingStart; + }; + + _proto.waitForCdnTuneIn = function waitForCdnTuneIn(details) { + // Wait for Low-Latency CDN Tune-in to get an updated playlist + var advancePartLimit = 3; + return details.live && details.canBlockReload && details.tuneInGoal > Math.max(details.partHoldBack, details.partTarget * advancePartLimit); + }; + + _proto.setStartPosition = function setStartPosition(details, sliding) { + // compute start position if set to -1. use it straight away if value is defined + var startPosition = this.startPosition; + + if (startPosition < sliding) { + startPosition = -1; + } + + if (startPosition === -1 || this.lastCurrentTime === -1) { + // first, check if start time offset has been set in playlist, if yes, use this value + var startTimeOffset = details.startTimeOffset; + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(startTimeOffset)) { + startPosition = sliding + startTimeOffset; + + if (startTimeOffset < 0) { + startPosition += details.totalduration; + } + + startPosition = Math.min(Math.max(sliding, startPosition), sliding + details.totalduration); + this.log("Start time offset " + startTimeOffset + " found in playlist, adjust startPosition to " + startPosition); + this.startPosition = startPosition; + } else if (details.live) { + // Leave this.startPosition at -1, so that we can use `getInitialLiveFragment` logic when startPosition has + // not been specified via the config or an as an argument to startLoad (#3736). + startPosition = this.hls.liveSyncPosition || sliding; + } else { + this.startPosition = startPosition = 0; + } + + this.lastCurrentTime = startPosition; + } + + this.nextLoadPosition = startPosition; + }; + + _proto.getLoadPosition = function getLoadPosition() { + var media = this.media; // if we have not yet loaded any fragment, start loading from start position + + var pos = 0; + + if (this.loadedmetadata && media) { + pos = media.currentTime; + } else if (this.nextLoadPosition) { + pos = this.nextLoadPosition; + } + + return pos; + }; + + _proto.handleFragLoadAborted = function handleFragLoadAborted(frag, part) { + if (this.transmuxer && frag.sn !== 'initSegment' && frag.stats.aborted) { + this.warn("Fragment " + frag.sn + (part ? ' part' + part.index : '') + " of level " + frag.level + " was aborted"); + this.resetFragmentLoading(frag); + } + }; + + _proto.resetFragmentLoading = function resetFragmentLoading(frag) { + if (!this.fragCurrent || !this.fragContextChanged(frag)) { + this.state = State.IDLE; + } + }; + + _proto.onFragmentOrKeyLoadError = function onFragmentOrKeyLoadError(filterType, data) { + if (data.fatal) { + return; + } + + var frag = data.frag; // Handle frag error related to caller's filterType + + if (!frag || frag.type !== filterType) { + return; + } + + var fragCurrent = this.fragCurrent; + console.assert(fragCurrent && frag.sn === fragCurrent.sn && frag.level === fragCurrent.level && frag.urlId === fragCurrent.urlId, 'Frag load error must match current frag to retry'); + var config = this.config; // keep retrying until the limit will be reached + + if (this.fragLoadError + 1 <= config.fragLoadingMaxRetry) { + if (this.resetLiveStartWhenNotLoaded(frag.level)) { + return; + } // exponential backoff capped to config.fragLoadingMaxRetryTimeout + + + var delay = Math.min(Math.pow(2, this.fragLoadError) * config.fragLoadingRetryDelay, config.fragLoadingMaxRetryTimeout); + this.warn("Fragment " + frag.sn + " of " + filterType + " " + frag.level + " failed to load, retrying in " + delay + "ms"); + this.retryDate = self.performance.now() + delay; + this.fragLoadError++; + this.state = State.FRAG_LOADING_WAITING_RETRY; + } else if (data.levelRetry) { + if (filterType === _types_loader__WEBPACK_IMPORTED_MODULE_15__["PlaylistLevelType"].AUDIO) { + // Reset current fragment since audio track audio is essential and may not have a fail-over track + this.fragCurrent = null; + } // Fragment errors that result in a level switch or redundant fail-over + // should reset the stream controller state to idle + + + this.fragLoadError = 0; + this.state = State.IDLE; + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].error(data.details + " reaches max retry, redispatch as fatal ..."); // switch error to fatal + + data.fatal = true; + this.hls.stopLoad(); + this.state = State.ERROR; + } + }; + + _proto.afterBufferFlushed = function afterBufferFlushed(media, bufferType, playlistType) { + if (!media) { + return; + } // After successful buffer flushing, filter flushed fragments from bufferedFrags use mediaBuffered instead of media + // (so that we will check against video.buffered ranges in case of alt audio track) + + + var bufferedTimeRanges = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_3__["BufferHelper"].getBuffered(media); + this.fragmentTracker.detectEvictedFragments(bufferType, bufferedTimeRanges, playlistType); + + if (this.state === State.ENDED) { + this.resetLoadingState(); + } + }; + + _proto.resetLoadingState = function resetLoadingState() { + this.fragCurrent = null; + this.fragPrevious = null; + this.state = State.IDLE; + }; + + _proto.resetLiveStartWhenNotLoaded = function resetLiveStartWhenNotLoaded(level) { + // if loadedmetadata is not set, it means that we are emergency switch down on first frag + // in that case, reset startFragRequested flag + if (!this.loadedmetadata) { + this.startFragRequested = false; + var details = this.levels ? this.levels[level].details : null; + + if (details !== null && details !== void 0 && details.live) { + // We can't afford to retry after a delay in a live scenario. Update the start position and return to IDLE. + this.startPosition = -1; + this.setStartPosition(details, 0); + this.resetLoadingState(); + return true; + } + + this.nextLoadPosition = this.startPosition; + } + + return false; + }; + + _proto.updateLevelTiming = function updateLevelTiming(frag, part, level, partial) { + var _this6 = this; + + var details = level.details; + console.assert(!!details, 'level.details must be defined'); + var parsed = Object.keys(frag.elementaryStreams).reduce(function (result, type) { + var info = frag.elementaryStreams[type]; + + if (info) { + var parsedDuration = info.endPTS - info.startPTS; + + if (parsedDuration <= 0) { + // Destroy the transmuxer after it's next time offset failed to advance because duration was <= 0. + // The new transmuxer will be configured with a time offset matching the next fragment start, + // preventing the timeline from shifting. + _this6.warn("Could not parse fragment " + frag.sn + " " + type + " duration reliably (" + parsedDuration + ") resetting transmuxer to fallback to playlist timing"); + + _this6.resetTransmuxer(); + + return result || false; + } + + var drift = partial ? 0 : Object(_level_helper__WEBPACK_IMPORTED_MODULE_11__["updateFragPTSDTS"])(details, frag, info.startPTS, info.endPTS, info.startDTS, info.endDTS); + + _this6.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].LEVEL_PTS_UPDATED, { + details: details, + level: level, + drift: drift, + type: type, + frag: frag, + start: info.startPTS, + end: info.endPTS + }); + + return true; + } + + return result; + }, false); + + if (parsed) { + this.state = State.PARSED; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].FRAG_PARSED, { + frag: frag, + part: part + }); + } else { + this.resetLoadingState(); + } + }; + + _proto.resetTransmuxer = function resetTransmuxer() { + if (this.transmuxer) { + this.transmuxer.destroy(); + this.transmuxer = null; + } + }; + + _createClass(BaseStreamController, [{ + key: "state", + get: function get() { + return this._state; + }, + set: function set(nextState) { + var previousState = this._state; + + if (previousState !== nextState) { + this._state = nextState; + this.log(previousState + "->" + nextState); + } + } + }]); + + return BaseStreamController; +}(_task_loop__WEBPACK_IMPORTED_MODULE_1__["default"]); + + + +/***/ }), + +/***/ "./src/controller/buffer-controller.ts": +/*!*********************************************!*\ + !*** ./src/controller/buffer-controller.ts ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BufferController; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/buffer-helper */ "./src/utils/buffer-helper.ts"); +/* harmony import */ var _utils_mediasource_helper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/mediasource-helper */ "./src/utils/mediasource-helper.ts"); +/* harmony import */ var _loader_fragment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../loader/fragment */ "./src/loader/fragment.ts"); +/* harmony import */ var _buffer_operation_queue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./buffer-operation-queue */ "./src/controller/buffer-operation-queue.ts"); + + + + + + + + + + + + +var MediaSource = Object(_utils_mediasource_helper__WEBPACK_IMPORTED_MODULE_5__["getMediaSource"])(); +var VIDEO_CODEC_PROFILE_REPACE = /([ha]vc.)(?:\.[^.,]+)+/; + +var BufferController = /*#__PURE__*/function () { + // The level details used to determine duration, target-duration and live + // cache the self generated object url to detect hijack of video tag + // A queue of buffer operations which require the SourceBuffer to not be updating upon execution + // References to event listeners for each SourceBuffer, so that they can be referenced for event removal + // The number of BUFFER_CODEC events received before any sourceBuffers are created + // The total number of BUFFER_CODEC events received + // A reference to the attached media element + // A reference to the active media source + // counters + function BufferController(_hls) { + var _this = this; + + this.details = null; + this._objectUrl = null; + this.operationQueue = void 0; + this.listeners = void 0; + this.hls = void 0; + this.bufferCodecEventsExpected = 0; + this._bufferCodecEventsTotal = 0; + this.media = null; + this.mediaSource = null; + this.appendError = 0; + this.tracks = {}; + this.pendingTracks = {}; + this.sourceBuffer = void 0; + + this._onMediaSourceOpen = function () { + var hls = _this.hls, + media = _this.media, + mediaSource = _this.mediaSource; + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('[buffer-controller]: Media source opened'); + + if (media) { + _this.updateMediaElementDuration(); + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_ATTACHED, { + media: media + }); + } + + if (mediaSource) { + // once received, don't listen anymore to sourceopen event + mediaSource.removeEventListener('sourceopen', _this._onMediaSourceOpen); + } + + _this.checkPendingTracks(); + }; + + this._onMediaSourceClose = function () { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('[buffer-controller]: Media source closed'); + }; + + this._onMediaSourceEnded = function () { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('[buffer-controller]: Media source ended'); + }; + + this.hls = _hls; + + this._initSourceBuffer(); + + this.registerListeners(); + } + + var _proto = BufferController.prototype; + + _proto.hasSourceTypes = function hasSourceTypes() { + return this.getSourceBufferTypes().length > 0 || Object.keys(this.pendingTracks).length > 0; + }; + + _proto.destroy = function destroy() { + this.unregisterListeners(); + this.details = null; + }; + + _proto.registerListeners = function registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_ATTACHING, this.onMediaAttaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_RESET, this.onBufferReset, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_APPENDING, this.onBufferAppending, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_CODECS, this.onBufferCodecs, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_EOS, this.onBufferEos, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_FLUSHING, this.onBufferFlushing, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_UPDATED, this.onLevelUpdated, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_PARSED, this.onFragParsed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_CHANGED, this.onFragChanged, this); + }; + + _proto.unregisterListeners = function unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_ATTACHING, this.onMediaAttaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_RESET, this.onBufferReset, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_APPENDING, this.onBufferAppending, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_CODECS, this.onBufferCodecs, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_EOS, this.onBufferEos, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_FLUSHING, this.onBufferFlushing, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_UPDATED, this.onLevelUpdated, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_PARSED, this.onFragParsed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_CHANGED, this.onFragChanged, this); + }; + + _proto._initSourceBuffer = function _initSourceBuffer() { + this.sourceBuffer = {}; + this.operationQueue = new _buffer_operation_queue__WEBPACK_IMPORTED_MODULE_7__["default"](this.sourceBuffer); + this.listeners = { + audio: [], + video: [], + audiovideo: [] + }; + }; + + _proto.onManifestParsed = function onManifestParsed(event, data) { + // in case of alt audio 2 BUFFER_CODECS events will be triggered, one per stream controller + // sourcebuffers will be created all at once when the expected nb of tracks will be reached + // in case alt audio is not used, only one BUFFER_CODEC event will be fired from main stream controller + // it will contain the expected nb of source buffers, no need to compute it + var codecEvents = 2; + + if (data.audio && !data.video || !data.altAudio) { + codecEvents = 1; + } + + this.bufferCodecEventsExpected = this._bufferCodecEventsTotal = codecEvents; + this.details = null; + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log(this.bufferCodecEventsExpected + " bufferCodec event(s) expected"); + }; + + _proto.onMediaAttaching = function onMediaAttaching(event, data) { + var media = this.media = data.media; + + if (media && MediaSource) { + var ms = this.mediaSource = new MediaSource(); // MediaSource listeners are arrow functions with a lexical scope, and do not need to be bound + + ms.addEventListener('sourceopen', this._onMediaSourceOpen); + ms.addEventListener('sourceended', this._onMediaSourceEnded); + ms.addEventListener('sourceclose', this._onMediaSourceClose); // link video and media Source + + media.src = self.URL.createObjectURL(ms); // cache the locally generated object url + + this._objectUrl = media.src; + } + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + var media = this.media, + mediaSource = this.mediaSource, + _objectUrl = this._objectUrl; + + if (mediaSource) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('[buffer-controller]: media source detaching'); + + if (mediaSource.readyState === 'open') { + try { + // endOfStream could trigger exception if any sourcebuffer is in updating state + // we don't really care about checking sourcebuffer state here, + // as we are anyway detaching the MediaSource + // let's just avoid this exception to propagate + mediaSource.endOfStream(); + } catch (err) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("[buffer-controller]: onMediaDetaching: " + err.message + " while calling endOfStream"); + } + } // Clean up the SourceBuffers by invoking onBufferReset + + + this.onBufferReset(); + mediaSource.removeEventListener('sourceopen', this._onMediaSourceOpen); + mediaSource.removeEventListener('sourceended', this._onMediaSourceEnded); + mediaSource.removeEventListener('sourceclose', this._onMediaSourceClose); // Detach properly the MediaSource from the HTMLMediaElement as + // suggested in https://github.com/w3c/media-source/issues/53. + + if (media) { + if (_objectUrl) { + self.URL.revokeObjectURL(_objectUrl); + } // clean up video tag src only if it's our own url. some external libraries might + // hijack the video tag and change its 'src' without destroying the Hls instance first + + + if (media.src === _objectUrl) { + media.removeAttribute('src'); + media.load(); + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('[buffer-controller]: media.src was changed by a third party - skip cleanup'); + } + } + + this.mediaSource = null; + this.media = null; + this._objectUrl = null; + this.bufferCodecEventsExpected = this._bufferCodecEventsTotal; + this.pendingTracks = {}; + this.tracks = {}; + } + + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_DETACHED, undefined); + }; + + _proto.onBufferReset = function onBufferReset() { + var _this2 = this; + + this.getSourceBufferTypes().forEach(function (type) { + var sb = _this2.sourceBuffer[type]; + + try { + if (sb) { + _this2.removeBufferListeners(type); + + if (_this2.mediaSource) { + _this2.mediaSource.removeSourceBuffer(sb); + } // Synchronously remove the SB from the map before the next call in order to prevent an async function from + // accessing it + + + _this2.sourceBuffer[type] = undefined; + } + } catch (err) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("[buffer-controller]: Failed to reset the " + type + " buffer", err); + } + }); + + this._initSourceBuffer(); + }; + + _proto.onBufferCodecs = function onBufferCodecs(event, data) { + var _this3 = this; + + var sourceBufferCount = this.getSourceBufferTypes().length; + Object.keys(data).forEach(function (trackName) { + if (sourceBufferCount) { + // check if SourceBuffer codec needs to change + var track = _this3.tracks[trackName]; + + if (track && typeof track.buffer.changeType === 'function') { + var _data$trackName = data[trackName], + codec = _data$trackName.codec, + levelCodec = _data$trackName.levelCodec, + container = _data$trackName.container; + var currentCodec = (track.levelCodec || track.codec).replace(VIDEO_CODEC_PROFILE_REPACE, '$1'); + var nextCodec = (levelCodec || codec).replace(VIDEO_CODEC_PROFILE_REPACE, '$1'); + + if (currentCodec !== nextCodec) { + var mimeType = container + ";codecs=" + (levelCodec || codec); + + _this3.appendChangeType(trackName, mimeType); + } + } + } else { + // if source buffer(s) not created yet, appended buffer tracks in this.pendingTracks + _this3.pendingTracks[trackName] = data[trackName]; + } + }); // if sourcebuffers already created, do nothing ... + + if (sourceBufferCount) { + return; + } + + this.bufferCodecEventsExpected = Math.max(this.bufferCodecEventsExpected - 1, 0); + + if (this.mediaSource && this.mediaSource.readyState === 'open') { + this.checkPendingTracks(); + } + }; + + _proto.appendChangeType = function appendChangeType(type, mimeType) { + var _this4 = this; + + var operationQueue = this.operationQueue; + var operation = { + execute: function execute() { + var sb = _this4.sourceBuffer[type]; + + if (sb) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("[buffer-controller]: changing " + type + " sourceBuffer type to " + mimeType); + sb.changeType(mimeType); + } + + operationQueue.shiftAndExecuteNext(type); + }, + onStart: function onStart() {}, + onComplete: function onComplete() {}, + onError: function onError(e) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("[buffer-controller]: Failed to change " + type + " SourceBuffer type", e); + } + }; + operationQueue.append(operation, type); + }; + + _proto.onBufferAppending = function onBufferAppending(event, eventData) { + var _this5 = this; + + var hls = this.hls, + operationQueue = this.operationQueue, + tracks = this.tracks; + var data = eventData.data, + type = eventData.type, + frag = eventData.frag, + part = eventData.part, + chunkMeta = eventData.chunkMeta; + var chunkStats = chunkMeta.buffering[type]; + var bufferAppendingStart = self.performance.now(); + chunkStats.start = bufferAppendingStart; + var fragBuffering = frag.stats.buffering; + var partBuffering = part ? part.stats.buffering : null; + + if (fragBuffering.start === 0) { + fragBuffering.start = bufferAppendingStart; + } + + if (partBuffering && partBuffering.start === 0) { + partBuffering.start = bufferAppendingStart; + } // TODO: Only update timestampOffset when audio/mpeg fragment or part is not contiguous with previously appended + // Adjusting `SourceBuffer.timestampOffset` (desired point in the timeline where the next frames should be appended) + // in Chrome browser when we detect MPEG audio container and time delta between level PTS and `SourceBuffer.timestampOffset` + // is greater than 100ms (this is enough to handle seek for VOD or level change for LIVE videos). + // More info here: https://github.com/video-dev/hls.js/issues/332#issuecomment-257986486 + + + var audioTrack = tracks.audio; + var checkTimestampOffset = type === 'audio' && chunkMeta.id === 1 && (audioTrack === null || audioTrack === void 0 ? void 0 : audioTrack.container) === 'audio/mpeg'; + var operation = { + execute: function execute() { + chunkStats.executeStart = self.performance.now(); + + if (checkTimestampOffset) { + var sb = _this5.sourceBuffer[type]; + + if (sb) { + var delta = frag.start - sb.timestampOffset; + + if (Math.abs(delta) >= 0.1) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("[buffer-controller]: Updating audio SourceBuffer timestampOffset to " + frag.start + " (delta: " + delta + ") sn: " + frag.sn + ")"); + sb.timestampOffset = frag.start; + } + } + } + + _this5.appendExecutor(data, type); + }, + onStart: function onStart() {// logger.debug(`[buffer-controller]: ${type} SourceBuffer updatestart`); + }, + onComplete: function onComplete() { + // logger.debug(`[buffer-controller]: ${type} SourceBuffer updateend`); + var end = self.performance.now(); + chunkStats.executeEnd = chunkStats.end = end; + + if (fragBuffering.first === 0) { + fragBuffering.first = end; + } + + if (partBuffering && partBuffering.first === 0) { + partBuffering.first = end; + } + + var sourceBuffer = _this5.sourceBuffer; + var timeRanges = {}; + + for (var _type in sourceBuffer) { + timeRanges[_type] = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_4__["BufferHelper"].getBuffered(sourceBuffer[_type]); + } + + _this5.appendError = 0; + + _this5.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_APPENDED, { + type: type, + frag: frag, + part: part, + chunkMeta: chunkMeta, + parent: frag.type, + timeRanges: timeRanges + }); + }, + onError: function onError(err) { + // in case any error occured while appending, put back segment in segments table + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("[buffer-controller]: Error encountered while trying to append to the " + type + " SourceBuffer", err); + var event = { + type: _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorTypes"].MEDIA_ERROR, + parent: frag.type, + details: _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorDetails"].BUFFER_APPEND_ERROR, + err: err, + fatal: false + }; + + if (err.code === DOMException.QUOTA_EXCEEDED_ERR) { + // QuotaExceededError: http://www.w3.org/TR/html5/infrastructure.html#quotaexceedederror + // let's stop appending any segments, and report BUFFER_FULL_ERROR error + event.details = _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorDetails"].BUFFER_FULL_ERROR; + } else { + _this5.appendError++; + event.details = _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorDetails"].BUFFER_APPEND_ERROR; + /* with UHD content, we could get loop of quota exceeded error until + browser is able to evict some data from sourcebuffer. Retrying can help recover. + */ + + if (_this5.appendError > hls.config.appendErrorMaxRetry) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("[buffer-controller]: Failed " + hls.config.appendErrorMaxRetry + " times to append segment in sourceBuffer"); + event.fatal = true; + } + } + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, event); + } + }; + operationQueue.append(operation, type); + }; + + _proto.onBufferFlushing = function onBufferFlushing(event, data) { + var _this6 = this; + + var operationQueue = this.operationQueue; + + var flushOperation = function flushOperation(type) { + return { + execute: _this6.removeExecutor.bind(_this6, type, data.startOffset, data.endOffset), + onStart: function onStart() {// logger.debug(`[buffer-controller]: Started flushing ${data.startOffset} -> ${data.endOffset} for ${type} Source Buffer`); + }, + onComplete: function onComplete() { + // logger.debug(`[buffer-controller]: Finished flushing ${data.startOffset} -> ${data.endOffset} for ${type} Source Buffer`); + _this6.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_FLUSHED, { + type: type + }); + }, + onError: function onError(e) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("[buffer-controller]: Failed to remove from " + type + " SourceBuffer", e); + } + }; + }; + + if (data.type) { + operationQueue.append(flushOperation(data.type), data.type); + } else { + this.getSourceBufferTypes().forEach(function (type) { + operationQueue.append(flushOperation(type), type); + }); + } + }; + + _proto.onFragParsed = function onFragParsed(event, data) { + var _this7 = this; + + var frag = data.frag, + part = data.part; + var buffersAppendedTo = []; + var elementaryStreams = part ? part.elementaryStreams : frag.elementaryStreams; + + if (elementaryStreams[_loader_fragment__WEBPACK_IMPORTED_MODULE_6__["ElementaryStreamTypes"].AUDIOVIDEO]) { + buffersAppendedTo.push('audiovideo'); + } else { + if (elementaryStreams[_loader_fragment__WEBPACK_IMPORTED_MODULE_6__["ElementaryStreamTypes"].AUDIO]) { + buffersAppendedTo.push('audio'); + } + + if (elementaryStreams[_loader_fragment__WEBPACK_IMPORTED_MODULE_6__["ElementaryStreamTypes"].VIDEO]) { + buffersAppendedTo.push('video'); + } + } + + var onUnblocked = function onUnblocked() { + var now = self.performance.now(); + frag.stats.buffering.end = now; + + if (part) { + part.stats.buffering.end = now; + } + + var stats = part ? part.stats : frag.stats; + + _this7.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_BUFFERED, { + frag: frag, + part: part, + stats: stats, + id: frag.type + }); + }; + + if (buffersAppendedTo.length === 0) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Fragments must have at least one ElementaryStreamType set. type: " + frag.type + " level: " + frag.level + " sn: " + frag.sn); + } + + this.blockBuffers(onUnblocked, buffersAppendedTo); + }; + + _proto.onFragChanged = function onFragChanged(event, data) { + this.flushBackBuffer(); + } // on BUFFER_EOS mark matching sourcebuffer(s) as ended and trigger checkEos() + // an undefined data.type will mark all buffers as EOS. + ; + + _proto.onBufferEos = function onBufferEos(event, data) { + var _this8 = this; + + var ended = this.getSourceBufferTypes().reduce(function (acc, type) { + var sb = _this8.sourceBuffer[type]; + + if (!data.type || data.type === type) { + if (sb && !sb.ended) { + sb.ended = true; + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("[buffer-controller]: " + type + " sourceBuffer now EOS"); + } + } + + return acc && !!(!sb || sb.ended); + }, true); + + if (ended) { + this.blockBuffers(function () { + var mediaSource = _this8.mediaSource; + + if (!mediaSource || mediaSource.readyState !== 'open') { + return; + } // Allow this to throw and be caught by the enqueueing function + + + mediaSource.endOfStream(); + }); + } + }; + + _proto.onLevelUpdated = function onLevelUpdated(event, _ref) { + var details = _ref.details; + + if (!details.fragments.length) { + return; + } + + this.details = details; + + if (this.getSourceBufferTypes().length) { + this.blockBuffers(this.updateMediaElementDuration.bind(this)); + } else { + this.updateMediaElementDuration(); + } + }; + + _proto.flushBackBuffer = function flushBackBuffer() { + var hls = this.hls, + details = this.details, + media = this.media, + sourceBuffer = this.sourceBuffer; + + if (!media || details === null) { + return; + } + + var sourceBufferTypes = this.getSourceBufferTypes(); + + if (!sourceBufferTypes.length) { + return; + } // Support for deprecated liveBackBufferLength + + + var backBufferLength = details.live && hls.config.liveBackBufferLength !== null ? hls.config.liveBackBufferLength : hls.config.backBufferLength; + + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(backBufferLength) || backBufferLength < 0) { + return; + } + + var currentTime = media.currentTime; + var targetDuration = details.levelTargetDuration; + var maxBackBufferLength = Math.max(backBufferLength, targetDuration); + var targetBackBufferPosition = Math.floor(currentTime / targetDuration) * targetDuration - maxBackBufferLength; + sourceBufferTypes.forEach(function (type) { + var sb = sourceBuffer[type]; + + if (sb) { + var buffered = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_4__["BufferHelper"].getBuffered(sb); // when target buffer start exceeds actual buffer start + + if (buffered.length > 0 && targetBackBufferPosition > buffered.start(0)) { + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BACK_BUFFER_REACHED, { + bufferEnd: targetBackBufferPosition + }); // Support for deprecated event: + + if (details.live) { + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LIVE_BACK_BUFFER_REACHED, { + bufferEnd: targetBackBufferPosition + }); + } + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_FLUSHING, { + startOffset: 0, + endOffset: targetBackBufferPosition, + type: type + }); + } + } + }); + } + /** + * Update Media Source duration to current level duration or override to Infinity if configuration parameter + * 'liveDurationInfinity` is set to `true` + * More details: https://github.com/video-dev/hls.js/issues/355 + */ + ; + + _proto.updateMediaElementDuration = function updateMediaElementDuration() { + if (!this.details || !this.media || !this.mediaSource || this.mediaSource.readyState !== 'open') { + return; + } + + var details = this.details, + hls = this.hls, + media = this.media, + mediaSource = this.mediaSource; + var levelDuration = details.fragments[0].start + details.totalduration; + var mediaDuration = media.duration; + var msDuration = Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(mediaSource.duration) ? mediaSource.duration : 0; + + if (details.live && hls.config.liveDurationInfinity) { + // Override duration to Infinity + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('[buffer-controller]: Media Source duration is set to Infinity'); + mediaSource.duration = Infinity; + this.updateSeekableRange(details); + } else if (levelDuration > msDuration && levelDuration > mediaDuration || !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(mediaDuration)) { + // levelDuration was the last value we set. + // not using mediaSource.duration as the browser may tweak this value + // only update Media Source duration if its value increase, this is to avoid + // flushing already buffered portion when switching between quality level + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("[buffer-controller]: Updating Media Source duration to " + levelDuration.toFixed(3)); + mediaSource.duration = levelDuration; + } + }; + + _proto.updateSeekableRange = function updateSeekableRange(levelDetails) { + var mediaSource = this.mediaSource; + var fragments = levelDetails.fragments; + var len = fragments.length; + + if (len && levelDetails.live && mediaSource !== null && mediaSource !== void 0 && mediaSource.setLiveSeekableRange) { + var start = Math.max(0, fragments[0].start); + var end = Math.max(start, start + levelDetails.totalduration); + mediaSource.setLiveSeekableRange(start, end); + } + }; + + _proto.checkPendingTracks = function checkPendingTracks() { + var bufferCodecEventsExpected = this.bufferCodecEventsExpected, + operationQueue = this.operationQueue, + pendingTracks = this.pendingTracks; // Check if we've received all of the expected bufferCodec events. When none remain, create all the sourceBuffers at once. + // This is important because the MSE spec allows implementations to throw QuotaExceededErrors if creating new sourceBuffers after + // data has been appended to existing ones. + // 2 tracks is the max (one for audio, one for video). If we've reach this max go ahead and create the buffers. + + var pendingTracksCount = Object.keys(pendingTracks).length; + + if (pendingTracksCount && !bufferCodecEventsExpected || pendingTracksCount === 2) { + // ok, let's create them now ! + this.createSourceBuffers(pendingTracks); + this.pendingTracks = {}; // append any pending segments now ! + + var buffers = this.getSourceBufferTypes(); + + if (buffers.length === 0) { + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorDetails"].BUFFER_INCOMPATIBLE_CODECS_ERROR, + fatal: true, + reason: 'could not create source buffer for media codec(s)' + }); + return; + } + + buffers.forEach(function (type) { + operationQueue.executeNext(type); + }); + } + }; + + _proto.createSourceBuffers = function createSourceBuffers(tracks) { + var sourceBuffer = this.sourceBuffer, + mediaSource = this.mediaSource; + + if (!mediaSource) { + throw Error('createSourceBuffers called when mediaSource was null'); + } + + var tracksCreated = 0; + + for (var trackName in tracks) { + if (!sourceBuffer[trackName]) { + var track = tracks[trackName]; + + if (!track) { + throw Error("source buffer exists for track " + trackName + ", however track does not"); + } // use levelCodec as first priority + + + var codec = track.levelCodec || track.codec; + var mimeType = track.container + ";codecs=" + codec; + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("[buffer-controller]: creating sourceBuffer(" + mimeType + ")"); + + try { + var sb = sourceBuffer[trackName] = mediaSource.addSourceBuffer(mimeType); + var sbName = trackName; + this.addBufferListener(sbName, 'updatestart', this._onSBUpdateStart); + this.addBufferListener(sbName, 'updateend', this._onSBUpdateEnd); + this.addBufferListener(sbName, 'error', this._onSBUpdateError); + this.tracks[trackName] = { + buffer: sb, + codec: codec, + container: track.container, + levelCodec: track.levelCodec, + id: track.id + }; + tracksCreated++; + } catch (err) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("[buffer-controller]: error while trying to add sourceBuffer: " + err.message); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorDetails"].BUFFER_ADD_CODEC_ERROR, + fatal: false, + error: err, + mimeType: mimeType + }); + } + } + } + + if (tracksCreated) { + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_CREATED, { + tracks: this.tracks + }); + } + } // Keep as arrow functions so that we can directly reference these functions directly as event listeners + ; + + _proto._onSBUpdateStart = function _onSBUpdateStart(type) { + var operationQueue = this.operationQueue; + var operation = operationQueue.current(type); + operation.onStart(); + }; + + _proto._onSBUpdateEnd = function _onSBUpdateEnd(type) { + var operationQueue = this.operationQueue; + var operation = operationQueue.current(type); + operation.onComplete(); + operationQueue.shiftAndExecuteNext(type); + }; + + _proto._onSBUpdateError = function _onSBUpdateError(type, event) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("[buffer-controller]: " + type + " SourceBuffer error", event); // according to http://www.w3.org/TR/media-source/#sourcebuffer-append-error + // SourceBuffer errors are not necessarily fatal; if so, the HTMLMediaElement will fire an error event + + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_3__["ErrorDetails"].BUFFER_APPENDING_ERROR, + fatal: false + }); // updateend is always fired after error, so we'll allow that to shift the current operation off of the queue + + var operation = this.operationQueue.current(type); + + if (operation) { + operation.onError(event); + } + } // This method must result in an updateend event; if remove is not called, _onSBUpdateEnd must be called manually + ; + + _proto.removeExecutor = function removeExecutor(type, startOffset, endOffset) { + var media = this.media, + mediaSource = this.mediaSource, + operationQueue = this.operationQueue, + sourceBuffer = this.sourceBuffer; + var sb = sourceBuffer[type]; + + if (!media || !mediaSource || !sb) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("[buffer-controller]: Attempting to remove from the " + type + " SourceBuffer, but it does not exist"); + operationQueue.shiftAndExecuteNext(type); + return; + } + + var mediaDuration = Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(media.duration) ? media.duration : Infinity; + var msDuration = Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(mediaSource.duration) ? mediaSource.duration : Infinity; + var removeStart = Math.max(0, startOffset); + var removeEnd = Math.min(endOffset, mediaDuration, msDuration); + + if (removeEnd > removeStart) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("[buffer-controller]: Removing [" + removeStart + "," + removeEnd + "] from the " + type + " SourceBuffer"); + console.assert(!sb.updating, type + " sourceBuffer must not be updating"); + sb.remove(removeStart, removeEnd); + } else { + // Cycle the queue + operationQueue.shiftAndExecuteNext(type); + } + } // This method must result in an updateend event; if append is not called, _onSBUpdateEnd must be called manually + ; + + _proto.appendExecutor = function appendExecutor(data, type) { + var operationQueue = this.operationQueue, + sourceBuffer = this.sourceBuffer; + var sb = sourceBuffer[type]; + + if (!sb) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("[buffer-controller]: Attempting to append to the " + type + " SourceBuffer, but it does not exist"); + operationQueue.shiftAndExecuteNext(type); + return; + } + + sb.ended = false; + console.assert(!sb.updating, type + " sourceBuffer must not be updating"); + sb.appendBuffer(data); + } // Enqueues an operation to each SourceBuffer queue which, upon execution, resolves a promise. When all promises + // resolve, the onUnblocked function is executed. Functions calling this method do not need to unblock the queue + // upon completion, since we already do it here + ; + + _proto.blockBuffers = function blockBuffers(onUnblocked, buffers) { + var _this9 = this; + + if (buffers === void 0) { + buffers = this.getSourceBufferTypes(); + } + + if (!buffers.length) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('[buffer-controller]: Blocking operation requested, but no SourceBuffers exist'); + Promise.resolve(onUnblocked); + return; + } + + var operationQueue = this.operationQueue; // logger.debug(`[buffer-controller]: Blocking ${buffers} SourceBuffer`); + + var blockingOperations = buffers.map(function (type) { + return operationQueue.appendBlocker(type); + }); + Promise.all(blockingOperations).then(function () { + // logger.debug(`[buffer-controller]: Blocking operation resolved; unblocking ${buffers} SourceBuffer`); + onUnblocked(); + buffers.forEach(function (type) { + var sb = _this9.sourceBuffer[type]; // Only cycle the queue if the SB is not updating. There's a bug in Chrome which sets the SB updating flag to + // true when changing the MediaSource duration (https://bugs.chromium.org/p/chromium/issues/detail?id=959359&can=2&q=mediasource%20duration) + // While this is a workaround, it's probably useful to have around + + if (!sb || !sb.updating) { + operationQueue.shiftAndExecuteNext(type); + } + }); + }); + }; + + _proto.getSourceBufferTypes = function getSourceBufferTypes() { + return Object.keys(this.sourceBuffer); + }; + + _proto.addBufferListener = function addBufferListener(type, event, fn) { + var buffer = this.sourceBuffer[type]; + + if (!buffer) { + return; + } + + var listener = fn.bind(this, type); + this.listeners[type].push({ + event: event, + listener: listener + }); + buffer.addEventListener(event, listener); + }; + + _proto.removeBufferListeners = function removeBufferListeners(type) { + var buffer = this.sourceBuffer[type]; + + if (!buffer) { + return; + } + + this.listeners[type].forEach(function (l) { + buffer.removeEventListener(l.event, l.listener); + }); + }; + + return BufferController; +}(); + + + +/***/ }), + +/***/ "./src/controller/buffer-operation-queue.ts": +/*!**************************************************!*\ + !*** ./src/controller/buffer-operation-queue.ts ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BufferOperationQueue; }); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + +var BufferOperationQueue = /*#__PURE__*/function () { + function BufferOperationQueue(sourceBufferReference) { + this.buffers = void 0; + this.queues = { + video: [], + audio: [], + audiovideo: [] + }; + this.buffers = sourceBufferReference; + } + + var _proto = BufferOperationQueue.prototype; + + _proto.append = function append(operation, type) { + var queue = this.queues[type]; + queue.push(operation); + + if (queue.length === 1 && this.buffers[type]) { + this.executeNext(type); + } + }; + + _proto.insertAbort = function insertAbort(operation, type) { + var queue = this.queues[type]; + queue.unshift(operation); + this.executeNext(type); + }; + + _proto.appendBlocker = function appendBlocker(type) { + var execute; + var promise = new Promise(function (resolve) { + execute = resolve; + }); + var operation = { + execute: execute, + onStart: function onStart() {}, + onComplete: function onComplete() {}, + onError: function onError() {} + }; + this.append(operation, type); + return promise; + }; + + _proto.executeNext = function executeNext(type) { + var buffers = this.buffers, + queues = this.queues; + var sb = buffers[type]; + var queue = queues[type]; + + if (queue.length) { + var operation = queue[0]; + + try { + // Operations are expected to result in an 'updateend' event being fired. If not, the queue will lock. Operations + // which do not end with this event must call _onSBUpdateEnd manually + operation.execute(); + } catch (e) { + _utils_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('[buffer-operation-queue]: Unhandled exception executing the current operation'); + operation.onError(e); // Only shift the current operation off, otherwise the updateend handler will do this for us + + if (!sb || !sb.updating) { + queue.shift(); + this.executeNext(type); + } + } + } + }; + + _proto.shiftAndExecuteNext = function shiftAndExecuteNext(type) { + this.queues[type].shift(); + this.executeNext(type); + }; + + _proto.current = function current(type) { + return this.queues[type][0]; + }; + + return BufferOperationQueue; +}(); + + + +/***/ }), + +/***/ "./src/controller/cap-level-controller.ts": +/*!************************************************!*\ + !*** ./src/controller/cap-level-controller.ts ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +/* + * cap stream level to media size dimension controller + */ + + +var CapLevelController = /*#__PURE__*/function () { + function CapLevelController(hls) { + this.autoLevelCapping = void 0; + this.firstLevel = void 0; + this.media = void 0; + this.restrictedLevels = void 0; + this.timer = void 0; + this.hls = void 0; + this.streamController = void 0; + this.clientRect = void 0; + this.hls = hls; + this.autoLevelCapping = Number.POSITIVE_INFINITY; + this.firstLevel = -1; + this.media = null; + this.restrictedLevels = []; + this.timer = undefined; + this.clientRect = null; + this.registerListeners(); + } + + var _proto = CapLevelController.prototype; + + _proto.setStreamController = function setStreamController(streamController) { + this.streamController = streamController; + }; + + _proto.destroy = function destroy() { + this.unregisterListener(); + + if (this.hls.config.capLevelToPlayerSize) { + this.stopCapping(); + } + + this.media = null; + this.clientRect = null; // @ts-ignore + + this.hls = this.streamController = null; + }; + + _proto.registerListeners = function registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHING, this.onMediaAttaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_CODECS, this.onBufferCodecs, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + }; + + _proto.unregisterListener = function unregisterListener() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHING, this.onMediaAttaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_CODECS, this.onBufferCodecs, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + }; + + _proto.onFpsDropLevelCapping = function onFpsDropLevelCapping(event, data) { + // Don't add a restricted level more than once + if (CapLevelController.isLevelAllowed(data.droppedLevel, this.restrictedLevels)) { + this.restrictedLevels.push(data.droppedLevel); + } + }; + + _proto.onMediaAttaching = function onMediaAttaching(event, data) { + this.media = data.media instanceof HTMLVideoElement ? data.media : null; + }; + + _proto.onManifestParsed = function onManifestParsed(event, data) { + var hls = this.hls; + this.restrictedLevels = []; + this.firstLevel = data.firstLevel; + + if (hls.config.capLevelToPlayerSize && data.video) { + // Start capping immediately if the manifest has signaled video codecs + this.startCapping(); + } + } // Only activate capping when playing a video stream; otherwise, multi-bitrate audio-only streams will be restricted + // to the first level + ; + + _proto.onBufferCodecs = function onBufferCodecs(event, data) { + var hls = this.hls; + + if (hls.config.capLevelToPlayerSize && data.video) { + // If the manifest did not signal a video codec capping has been deferred until we're certain video is present + this.startCapping(); + } + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + this.stopCapping(); + }; + + _proto.detectPlayerSize = function detectPlayerSize() { + if (this.media && this.mediaHeight > 0 && this.mediaWidth > 0) { + var levels = this.hls.levels; + + if (levels.length) { + var hls = this.hls; + hls.autoLevelCapping = this.getMaxLevel(levels.length - 1); + + if (hls.autoLevelCapping > this.autoLevelCapping && this.streamController) { + // if auto level capping has a higher value for the previous one, flush the buffer using nextLevelSwitch + // usually happen when the user go to the fullscreen mode. + this.streamController.nextLevelSwitch(); + } + + this.autoLevelCapping = hls.autoLevelCapping; + } + } + } + /* + * returns level should be the one with the dimensions equal or greater than the media (player) dimensions (so the video will be downscaled) + */ + ; + + _proto.getMaxLevel = function getMaxLevel(capLevelIndex) { + var _this = this; + + var levels = this.hls.levels; + + if (!levels.length) { + return -1; + } + + var validLevels = levels.filter(function (level, index) { + return CapLevelController.isLevelAllowed(index, _this.restrictedLevels) && index <= capLevelIndex; + }); + this.clientRect = null; + return CapLevelController.getMaxLevelByMediaSize(validLevels, this.mediaWidth, this.mediaHeight); + }; + + _proto.startCapping = function startCapping() { + if (this.timer) { + // Don't reset capping if started twice; this can happen if the manifest signals a video codec + return; + } + + this.autoLevelCapping = Number.POSITIVE_INFINITY; + this.hls.firstLevel = this.getMaxLevel(this.firstLevel); + self.clearInterval(this.timer); + this.timer = self.setInterval(this.detectPlayerSize.bind(this), 1000); + this.detectPlayerSize(); + }; + + _proto.stopCapping = function stopCapping() { + this.restrictedLevels = []; + this.firstLevel = -1; + this.autoLevelCapping = Number.POSITIVE_INFINITY; + + if (this.timer) { + self.clearInterval(this.timer); + this.timer = undefined; + } + }; + + _proto.getDimensions = function getDimensions() { + if (this.clientRect) { + return this.clientRect; + } + + var media = this.media; + var boundsRect = { + width: 0, + height: 0 + }; + + if (media) { + var clientRect = media.getBoundingClientRect(); + boundsRect.width = clientRect.width; + boundsRect.height = clientRect.height; + + if (!boundsRect.width && !boundsRect.height) { + // When the media element has no width or height (equivalent to not being in the DOM), + // then use its width and height attributes (media.width, media.height) + boundsRect.width = clientRect.right - clientRect.left || media.width || 0; + boundsRect.height = clientRect.bottom - clientRect.top || media.height || 0; + } + } + + this.clientRect = boundsRect; + return boundsRect; + }; + + CapLevelController.isLevelAllowed = function isLevelAllowed(level, restrictedLevels) { + if (restrictedLevels === void 0) { + restrictedLevels = []; + } + + return restrictedLevels.indexOf(level) === -1; + }; + + CapLevelController.getMaxLevelByMediaSize = function getMaxLevelByMediaSize(levels, width, height) { + if (!levels || !levels.length) { + return -1; + } // Levels can have the same dimensions but differing bandwidths - since levels are ordered, we can look to the next + // to determine whether we've chosen the greatest bandwidth for the media's dimensions + + + var atGreatestBandiwdth = function atGreatestBandiwdth(curLevel, nextLevel) { + if (!nextLevel) { + return true; + } + + return curLevel.width !== nextLevel.width || curLevel.height !== nextLevel.height; + }; // If we run through the loop without breaking, the media's dimensions are greater than every level, so default to + // the max level + + + var maxLevelIndex = levels.length - 1; + + for (var i = 0; i < levels.length; i += 1) { + var level = levels[i]; + + if ((level.width >= width || level.height >= height) && atGreatestBandiwdth(level, levels[i + 1])) { + maxLevelIndex = i; + break; + } + } + + return maxLevelIndex; + }; + + _createClass(CapLevelController, [{ + key: "mediaWidth", + get: function get() { + return this.getDimensions().width * CapLevelController.contentScaleFactor; + } + }, { + key: "mediaHeight", + get: function get() { + return this.getDimensions().height * CapLevelController.contentScaleFactor; + } + }], [{ + key: "contentScaleFactor", + get: function get() { + var pixelRatio = 1; + + try { + pixelRatio = self.devicePixelRatio; + } catch (e) { + /* no-op */ + } + + return pixelRatio; + } + }]); + + return CapLevelController; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (CapLevelController); + +/***/ }), + +/***/ "./src/controller/cmcd-controller.ts": +/*!*******************************************!*\ + !*** ./src/controller/cmcd-controller.ts ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CMCDController; }); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _types_cmcd__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../types/cmcd */ "./src/types/cmcd.ts"); +/* harmony import */ var _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/buffer-helper */ "./src/utils/buffer-helper.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + + + + + +/** + * Controller to deal with Common Media Client Data (CMCD) + * @see https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf + */ + +var CMCDController = /*#__PURE__*/function () { + // eslint-disable-line no-restricted-globals + // eslint-disable-line no-restricted-globals + function CMCDController(hls) { + var _this = this; + + this.hls = void 0; + this.config = void 0; + this.media = void 0; + this.sid = void 0; + this.cid = void 0; + this.useHeaders = false; + this.initialized = false; + this.starved = false; + this.buffering = true; + this.audioBuffer = void 0; + this.videoBuffer = void 0; + + this.onWaiting = function () { + if (_this.initialized) { + _this.starved = true; + } + + _this.buffering = true; + }; + + this.onPlaying = function () { + if (!_this.initialized) { + _this.initialized = true; + } + + _this.buffering = false; + }; + + this.applyPlaylistData = function (context) { + try { + _this.apply(context, { + ot: _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].MANIFEST, + su: !_this.initialized + }); + } catch (error) { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('Could not generate manifest CMCD data.', error); + } + }; + + this.applyFragmentData = function (context) { + try { + var fragment = context.frag; + var level = _this.hls.levels[fragment.level]; + + var ot = _this.getObjectType(fragment); + + var data = { + d: fragment.duration * 1000, + ot: ot + }; + + if (ot === _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].VIDEO || ot === _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].AUDIO || ot == _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].MUXED) { + data.br = level.bitrate / 1000; + data.tb = _this.getTopBandwidth(ot); + data.bl = _this.getBufferLength(ot); + } + + _this.apply(context, data); + } catch (error) { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('Could not generate segment CMCD data.', error); + } + }; + + this.hls = hls; + var config = this.config = hls.config; + var cmcd = config.cmcd; + + if (cmcd != null) { + config.pLoader = this.createPlaylistLoader(); + config.fLoader = this.createFragmentLoader(); + this.sid = cmcd.sessionId || CMCDController.uuid(); + this.cid = cmcd.contentId; + this.useHeaders = cmcd.useHeaders === true; + this.registerListeners(); + } + } + + var _proto = CMCDController.prototype; + + _proto.registerListeners = function registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHED, this.onMediaDetached, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_CREATED, this.onBufferCreated, this); + }; + + _proto.unregisterListeners = function unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHED, this.onMediaDetached, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_CREATED, this.onBufferCreated, this); + this.onMediaDetached(); + }; + + _proto.destroy = function destroy() { + this.unregisterListeners(); // @ts-ignore + + this.hls = this.config = this.audioBuffer = this.videoBuffer = null; + }; + + _proto.onMediaAttached = function onMediaAttached(event, data) { + this.media = data.media; + this.media.addEventListener('waiting', this.onWaiting); + this.media.addEventListener('playing', this.onPlaying); + }; + + _proto.onMediaDetached = function onMediaDetached() { + if (!this.media) { + return; + } + + this.media.removeEventListener('waiting', this.onWaiting); + this.media.removeEventListener('playing', this.onPlaying); // @ts-ignore + + this.media = null; + }; + + _proto.onBufferCreated = function onBufferCreated(event, data) { + var _data$tracks$audio, _data$tracks$video; + + this.audioBuffer = (_data$tracks$audio = data.tracks.audio) === null || _data$tracks$audio === void 0 ? void 0 : _data$tracks$audio.buffer; + this.videoBuffer = (_data$tracks$video = data.tracks.video) === null || _data$tracks$video === void 0 ? void 0 : _data$tracks$video.buffer; + }; + + /** + * Create baseline CMCD data + */ + _proto.createData = function createData() { + var _this$media; + + return { + v: _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDVersion"], + sf: _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDStreamingFormat"].HLS, + sid: this.sid, + cid: this.cid, + pr: (_this$media = this.media) === null || _this$media === void 0 ? void 0 : _this$media.playbackRate, + mtp: this.hls.bandwidthEstimate / 1000 + }; + } + /** + * Apply CMCD data to a request. + */ + ; + + _proto.apply = function apply(context, data) { + if (data === void 0) { + data = {}; + } + + // apply baseline data + _extends(data, this.createData()); + + var isVideo = data.ot === _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].INIT || data.ot === _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].VIDEO || data.ot === _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].MUXED; + + if (this.starved && isVideo) { + data.bs = true; + data.su = true; + this.starved = false; + } + + if (data.su == null) { + data.su = this.buffering; + } // TODO: Implement rtp, nrr, nor, dl + + + if (this.useHeaders) { + var headers = CMCDController.toHeaders(data); + + if (!Object.keys(headers).length) { + return; + } + + if (!context.headers) { + context.headers = {}; + } + + _extends(context.headers, headers); + } else { + var query = CMCDController.toQuery(data); + + if (!query) { + return; + } + + context.url = CMCDController.appendQueryToUri(context.url, query); + } + } + /** + * Apply CMCD data to a manifest request. + */ + ; + + /** + * The CMCD object type. + */ + _proto.getObjectType = function getObjectType(fragment) { + var type = fragment.type; + + if (type === 'subtitle') { + return _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].TIMED_TEXT; + } + + if (fragment.sn === 'initSegment') { + return _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].INIT; + } + + if (type === 'audio') { + return _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].AUDIO; + } + + if (type === 'main') { + if (!this.hls.audioTracks.length) { + return _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].MUXED; + } + + return _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].VIDEO; + } + + return undefined; + } + /** + * Get the highest bitrate. + */ + ; + + _proto.getTopBandwidth = function getTopBandwidth(type) { + var bitrate = 0; + var levels = type === _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].AUDIO ? this.hls.audioTracks : this.hls.levels; + + for (var _iterator = _createForOfIteratorHelperLoose(levels), _step; !(_step = _iterator()).done;) { + var level = _step.value; + + if (level.bitrate > bitrate) { + bitrate = level.bitrate; + } + } + + return bitrate > 0 ? bitrate : NaN; + } + /** + * Get the buffer length for a media type in milliseconds + */ + ; + + _proto.getBufferLength = function getBufferLength(type) { + var media = this.hls.media; + var buffer = type === _types_cmcd__WEBPACK_IMPORTED_MODULE_1__["CMCDObjectType"].AUDIO ? this.audioBuffer : this.videoBuffer; + + if (!buffer || !media) { + return NaN; + } + + var info = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_2__["BufferHelper"].bufferInfo(buffer, media.currentTime, this.config.maxBufferHole); + return info.len * 1000; + } + /** + * Create a playlist loader + */ + ; + + _proto.createPlaylistLoader = function createPlaylistLoader() { + var pLoader = this.config.pLoader; + var apply = this.applyPlaylistData; + var Ctor = pLoader || this.config.loader; + return /*#__PURE__*/function () { + function CmcdPlaylistLoader(config) { + this.loader = void 0; + this.loader = new Ctor(config); + } + + var _proto2 = CmcdPlaylistLoader.prototype; + + _proto2.destroy = function destroy() { + this.loader.destroy(); + }; + + _proto2.abort = function abort() { + this.loader.abort(); + }; + + _proto2.load = function load(context, config, callbacks) { + apply(context); + this.loader.load(context, config, callbacks); + }; + + _createClass(CmcdPlaylistLoader, [{ + key: "stats", + get: function get() { + return this.loader.stats; + } + }, { + key: "context", + get: function get() { + return this.loader.context; + } + }]); + + return CmcdPlaylistLoader; + }(); + } + /** + * Create a playlist loader + */ + ; + + _proto.createFragmentLoader = function createFragmentLoader() { + var fLoader = this.config.fLoader; + var apply = this.applyFragmentData; + var Ctor = fLoader || this.config.loader; + return /*#__PURE__*/function () { + function CmcdFragmentLoader(config) { + this.loader = void 0; + this.loader = new Ctor(config); + } + + var _proto3 = CmcdFragmentLoader.prototype; + + _proto3.destroy = function destroy() { + this.loader.destroy(); + }; + + _proto3.abort = function abort() { + this.loader.abort(); + }; + + _proto3.load = function load(context, config, callbacks) { + apply(context); + this.loader.load(context, config, callbacks); + }; + + _createClass(CmcdFragmentLoader, [{ + key: "stats", + get: function get() { + return this.loader.stats; + } + }, { + key: "context", + get: function get() { + return this.loader.context; + } + }]); + + return CmcdFragmentLoader; + }(); + } + /** + * Generate a random v4 UUI + * + * @returns {string} + */ + ; + + CMCDController.uuid = function uuid() { + var url = URL.createObjectURL(new Blob()); + var uuid = url.toString(); + URL.revokeObjectURL(url); + return uuid.substr(uuid.lastIndexOf('/') + 1); + } + /** + * Serialize a CMCD data object according to the rules defined in the + * section 3.2 of + * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf). + */ + ; + + CMCDController.serialize = function serialize(data) { + var results = []; + + var isValid = function isValid(value) { + return !Number.isNaN(value) && value != null && value !== '' && value !== false; + }; + + var toRounded = function toRounded(value) { + return Math.round(value); + }; + + var toHundred = function toHundred(value) { + return toRounded(value / 100) * 100; + }; + + var toUrlSafe = function toUrlSafe(value) { + return encodeURIComponent(value); + }; + + var formatters = { + br: toRounded, + d: toRounded, + bl: toHundred, + dl: toHundred, + mtp: toHundred, + nor: toUrlSafe, + rtp: toHundred, + tb: toRounded + }; + var keys = Object.keys(data || {}).sort(); + + for (var _iterator2 = _createForOfIteratorHelperLoose(keys), _step2; !(_step2 = _iterator2()).done;) { + var key = _step2.value; + var value = data[key]; // ignore invalid values + + if (!isValid(value)) { + continue; + } // Version should only be reported if not equal to 1. + + + if (key === 'v' && value === 1) { + continue; + } // Playback rate should only be sent if not equal to 1. + + + if (key == 'pr' && value === 1) { + continue; + } // Certain values require special formatting + + + var formatter = formatters[key]; + + if (formatter) { + value = formatter(value); + } // Serialize the key/value pair + + + var type = typeof value; + var result = void 0; + + if (key === 'ot' || key === 'sf' || key === 'st') { + result = key + "=" + value; + } else if (type === 'boolean') { + result = key; + } else if (type === 'number') { + result = key + "=" + value; + } else { + result = key + "=" + JSON.stringify(value); + } + + results.push(result); + } + + return results.join(','); + } + /** + * Convert a CMCD data object to request headers according to the rules + * defined in the section 2.1 and 3.2 of + * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf). + */ + ; + + CMCDController.toHeaders = function toHeaders(data) { + var keys = Object.keys(data); + var headers = {}; + var headerNames = ['Object', 'Request', 'Session', 'Status']; + var headerGroups = [{}, {}, {}, {}]; + var headerMap = { + br: 0, + d: 0, + ot: 0, + tb: 0, + bl: 1, + dl: 1, + mtp: 1, + nor: 1, + nrr: 1, + su: 1, + cid: 2, + pr: 2, + sf: 2, + sid: 2, + st: 2, + v: 2, + bs: 3, + rtp: 3 + }; + + for (var _i = 0, _keys = keys; _i < _keys.length; _i++) { + var key = _keys[_i]; + // Unmapped fields are mapped to the Request header + var index = headerMap[key] != null ? headerMap[key] : 1; + headerGroups[index][key] = data[key]; + } + + for (var i = 0; i < headerGroups.length; i++) { + var value = CMCDController.serialize(headerGroups[i]); + + if (value) { + headers["CMCD-" + headerNames[i]] = value; + } + } + + return headers; + } + /** + * Convert a CMCD data object to query args according to the rules + * defined in the section 2.2 and 3.2 of + * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf). + */ + ; + + CMCDController.toQuery = function toQuery(data) { + return "CMCD=" + encodeURIComponent(CMCDController.serialize(data)); + } + /** + * Append query args to a uri. + */ + ; + + CMCDController.appendQueryToUri = function appendQueryToUri(uri, query) { + if (!query) { + return uri; + } + + var separator = uri.includes('?') ? '&' : '?'; + return "" + uri + separator + query; + }; + + return CMCDController; +}(); + + + +/***/ }), + +/***/ "./src/controller/eme-controller.ts": +/*!******************************************!*\ + !*** ./src/controller/eme-controller.ts ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _utils_mediakeys_helper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/mediakeys-helper */ "./src/utils/mediakeys-helper.ts"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +/** + * @author Stephan Hesse | + * + * DRM support for Hls.js + */ + + + + +var MAX_LICENSE_REQUEST_FAILURES = 3; +/** + * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaKeySystemConfiguration + * @param {Array} audioCodecs List of required audio codecs to support + * @param {Array} videoCodecs List of required video codecs to support + * @param {object} drmSystemOptions Optional parameters/requirements for the key-system + * @returns {Array} An array of supported configurations + */ + +var createWidevineMediaKeySystemConfigurations = function createWidevineMediaKeySystemConfigurations(audioCodecs, videoCodecs, drmSystemOptions) { + /* jshint ignore:line */ + var baseConfig = { + // initDataTypes: ['keyids', 'mp4'], + // label: "", + // persistentState: "not-allowed", // or "required" ? + // distinctiveIdentifier: "not-allowed", // or "required" ? + // sessionTypes: ['temporary'], + audioCapabilities: [], + // { contentType: 'audio/mp4; codecs="mp4a.40.2"' } + videoCapabilities: [] // { contentType: 'video/mp4; codecs="avc1.42E01E"' } + + }; + audioCodecs.forEach(function (codec) { + baseConfig.audioCapabilities.push({ + contentType: "audio/mp4; codecs=\"" + codec + "\"", + robustness: drmSystemOptions.audioRobustness || '' + }); + }); + videoCodecs.forEach(function (codec) { + baseConfig.videoCapabilities.push({ + contentType: "video/mp4; codecs=\"" + codec + "\"", + robustness: drmSystemOptions.videoRobustness || '' + }); + }); + return [baseConfig]; +}; +/** + * The idea here is to handle key-system (and their respective platforms) specific configuration differences + * in order to work with the local requestMediaKeySystemAccess method. + * + * We can also rule-out platform-related key-system support at this point by throwing an error. + * + * @param {string} keySystem Identifier for the key-system, see `KeySystems` enum + * @param {Array} audioCodecs List of required audio codecs to support + * @param {Array} videoCodecs List of required video codecs to support + * @throws will throw an error if a unknown key system is passed + * @returns {Array} A non-empty Array of MediaKeySystemConfiguration objects + */ + + +var getSupportedMediaKeySystemConfigurations = function getSupportedMediaKeySystemConfigurations(keySystem, audioCodecs, videoCodecs, drmSystemOptions) { + switch (keySystem) { + case _utils_mediakeys_helper__WEBPACK_IMPORTED_MODULE_3__["KeySystems"].WIDEVINE: + return createWidevineMediaKeySystemConfigurations(audioCodecs, videoCodecs, drmSystemOptions); + + default: + throw new Error("Unknown key-system: " + keySystem); + } +}; + +/** + * Controller to deal with encrypted media extensions (EME) + * @see https://developer.mozilla.org/en-US/docs/Web/API/Encrypted_Media_Extensions_API + * + * @class + * @constructor + */ +var EMEController = /*#__PURE__*/function () { + /** + * @constructs + * @param {Hls} hls Our Hls.js instance + */ + function EMEController(hls) { + this.hls = void 0; + this._widevineLicenseUrl = void 0; + this._licenseXhrSetup = void 0; + this._licenseResponseCallback = void 0; + this._emeEnabled = void 0; + this._requestMediaKeySystemAccess = void 0; + this._drmSystemOptions = void 0; + this._config = void 0; + this._mediaKeysList = []; + this._media = null; + this._hasSetMediaKeys = false; + this._requestLicenseFailureCount = 0; + this.mediaKeysPromise = null; + this._onMediaEncrypted = this.onMediaEncrypted.bind(this); + this.hls = hls; + this._config = hls.config; + this._widevineLicenseUrl = this._config.widevineLicenseUrl; + this._licenseXhrSetup = this._config.licenseXhrSetup; + this._licenseResponseCallback = this._config.licenseResponseCallback; + this._emeEnabled = this._config.emeEnabled; + this._requestMediaKeySystemAccess = this._config.requestMediaKeySystemAccessFunc; + this._drmSystemOptions = this._config.drmSystemOptions; + + this._registerListeners(); + } + + var _proto = EMEController.prototype; + + _proto.destroy = function destroy() { + this._unregisterListeners(); // @ts-ignore + + + this.hls = this._onMediaEncrypted = null; + this._requestMediaKeySystemAccess = null; + }; + + _proto._registerListeners = function _registerListeners() { + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHED, this.onMediaDetached, this); + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + }; + + _proto._unregisterListeners = function _unregisterListeners() { + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHED, this.onMediaDetached, this); + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + } + /** + * @param {string} keySystem Identifier for the key-system, see `KeySystems` enum + * @returns {string} License server URL for key-system (if any configured, otherwise causes error) + * @throws if a unsupported keysystem is passed + */ + ; + + _proto.getLicenseServerUrl = function getLicenseServerUrl(keySystem) { + switch (keySystem) { + case _utils_mediakeys_helper__WEBPACK_IMPORTED_MODULE_3__["KeySystems"].WIDEVINE: + if (!this._widevineLicenseUrl) { + break; + } + + return this._widevineLicenseUrl; + } + + throw new Error("no license server URL configured for key-system \"" + keySystem + "\""); + } + /** + * Requests access object and adds it to our list upon success + * @private + * @param {string} keySystem System ID (see `KeySystems`) + * @param {Array} audioCodecs List of required audio codecs to support + * @param {Array} videoCodecs List of required video codecs to support + * @throws When a unsupported KeySystem is passed + */ + ; + + _proto._attemptKeySystemAccess = function _attemptKeySystemAccess(keySystem, audioCodecs, videoCodecs) { + var _this = this; + + // This can throw, but is caught in event handler callpath + var mediaKeySystemConfigs = getSupportedMediaKeySystemConfigurations(keySystem, audioCodecs, videoCodecs, this._drmSystemOptions); + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('Requesting encrypted media key-system access'); // expecting interface like window.navigator.requestMediaKeySystemAccess + + var keySystemAccessPromise = this.requestMediaKeySystemAccess(keySystem, mediaKeySystemConfigs); + this.mediaKeysPromise = keySystemAccessPromise.then(function (mediaKeySystemAccess) { + return _this._onMediaKeySystemAccessObtained(keySystem, mediaKeySystemAccess); + }); + keySystemAccessPromise.catch(function (err) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Failed to obtain key-system \"" + keySystem + "\" access:", err); + }); + }; + + /** + * Handles obtaining access to a key-system + * @private + * @param {string} keySystem + * @param {MediaKeySystemAccess} mediaKeySystemAccess https://developer.mozilla.org/en-US/docs/Web/API/MediaKeySystemAccess + */ + _proto._onMediaKeySystemAccessObtained = function _onMediaKeySystemAccessObtained(keySystem, mediaKeySystemAccess) { + var _this2 = this; + + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Access for key-system \"" + keySystem + "\" obtained"); + var mediaKeysListItem = { + mediaKeysSessionInitialized: false, + mediaKeySystemAccess: mediaKeySystemAccess, + mediaKeySystemDomain: keySystem + }; + + this._mediaKeysList.push(mediaKeysListItem); + + var mediaKeysPromise = Promise.resolve().then(function () { + return mediaKeySystemAccess.createMediaKeys(); + }).then(function (mediaKeys) { + mediaKeysListItem.mediaKeys = mediaKeys; + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Media-keys created for key-system \"" + keySystem + "\""); + + _this2._onMediaKeysCreated(); + + return mediaKeys; + }); + mediaKeysPromise.catch(function (err) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Failed to create media-keys:', err); + }); + return mediaKeysPromise; + } + /** + * Handles key-creation (represents access to CDM). We are going to create key-sessions upon this + * for all existing keys where no session exists yet. + * + * @private + */ + ; + + _proto._onMediaKeysCreated = function _onMediaKeysCreated() { + var _this3 = this; + + // check for all key-list items if a session exists, otherwise, create one + this._mediaKeysList.forEach(function (mediaKeysListItem) { + if (!mediaKeysListItem.mediaKeysSession) { + // mediaKeys is definitely initialized here + mediaKeysListItem.mediaKeysSession = mediaKeysListItem.mediaKeys.createSession(); + + _this3._onNewMediaKeySession(mediaKeysListItem.mediaKeysSession); + } + }); + } + /** + * @private + * @param {*} keySession + */ + ; + + _proto._onNewMediaKeySession = function _onNewMediaKeySession(keySession) { + var _this4 = this; + + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("New key-system session " + keySession.sessionId); + keySession.addEventListener('message', function (event) { + _this4._onKeySessionMessage(keySession, event.message); + }, false); + } + /** + * @private + * @param {MediaKeySession} keySession + * @param {ArrayBuffer} message + */ + ; + + _proto._onKeySessionMessage = function _onKeySessionMessage(keySession, message) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('Got EME message event, creating license request'); + + this._requestLicense(message, function (data) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Received license data (length: " + (data ? data.byteLength : data) + "), updating key-session"); + keySession.update(data); + }); + } + /** + * @private + * @param e {MediaEncryptedEvent} + */ + ; + + _proto.onMediaEncrypted = function onMediaEncrypted(e) { + var _this5 = this; + + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Media is encrypted using \"" + e.initDataType + "\" init data type"); + + if (!this.mediaKeysPromise) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Fatal: Media is encrypted but no CDM access or no keys have been requested'); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_NO_KEYS, + fatal: true + }); + return; + } + + var finallySetKeyAndStartSession = function finallySetKeyAndStartSession(mediaKeys) { + if (!_this5._media) { + return; + } + + _this5._attemptSetMediaKeys(mediaKeys); + + _this5._generateRequestWithPreferredKeySession(e.initDataType, e.initData); + }; // Could use `Promise.finally` but some Promise polyfills are missing it + + + this.mediaKeysPromise.then(finallySetKeyAndStartSession).catch(finallySetKeyAndStartSession); + } + /** + * @private + */ + ; + + _proto._attemptSetMediaKeys = function _attemptSetMediaKeys(mediaKeys) { + if (!this._media) { + throw new Error('Attempted to set mediaKeys without first attaching a media element'); + } + + if (!this._hasSetMediaKeys) { + // FIXME: see if we can/want/need-to really to deal with several potential key-sessions? + var keysListItem = this._mediaKeysList[0]; + + if (!keysListItem || !keysListItem.mediaKeys) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Fatal: Media is encrypted but no CDM access or no keys have been obtained yet'); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_NO_KEYS, + fatal: true + }); + return; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('Setting keys for encrypted media'); + + this._media.setMediaKeys(keysListItem.mediaKeys); + + this._hasSetMediaKeys = true; + } + } + /** + * @private + */ + ; + + _proto._generateRequestWithPreferredKeySession = function _generateRequestWithPreferredKeySession(initDataType, initData) { + var _this6 = this; + + // FIXME: see if we can/want/need-to really to deal with several potential key-sessions? + var keysListItem = this._mediaKeysList[0]; + + if (!keysListItem) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Fatal: Media is encrypted but not any key-system access has been obtained yet'); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_NO_ACCESS, + fatal: true + }); + return; + } + + if (keysListItem.mediaKeysSessionInitialized) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('Key-Session already initialized but requested again'); + return; + } + + var keySession = keysListItem.mediaKeysSession; + + if (!keySession) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Fatal: Media is encrypted but no key-session existing'); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_NO_SESSION, + fatal: true + }); + return; + } // initData is null if the media is not CORS-same-origin + + + if (!initData) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('Fatal: initData required for generating a key session is null'); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_NO_INIT_DATA, + fatal: true + }); + return; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Generating key-session request for \"" + initDataType + "\" init data type"); + keysListItem.mediaKeysSessionInitialized = true; + keySession.generateRequest(initDataType, initData).then(function () { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Key-session generation succeeded'); + }).catch(function (err) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Error generating key-session request:', err); + + _this6.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_NO_SESSION, + fatal: false + }); + }); + } + /** + * @private + * @param {string} url License server URL + * @param {ArrayBuffer} keyMessage Message data issued by key-system + * @param {function} callback Called when XHR has succeeded + * @returns {XMLHttpRequest} Unsent (but opened state) XHR object + * @throws if XMLHttpRequest construction failed + */ + ; + + _proto._createLicenseXhr = function _createLicenseXhr(url, keyMessage, callback) { + var xhr = new XMLHttpRequest(); + xhr.responseType = 'arraybuffer'; + xhr.onreadystatechange = this._onLicenseRequestReadyStageChange.bind(this, xhr, url, keyMessage, callback); + var licenseXhrSetup = this._licenseXhrSetup; + + if (licenseXhrSetup) { + try { + licenseXhrSetup.call(this.hls, xhr, url); + licenseXhrSetup = undefined; + } catch (e) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error(e); + } + } + + try { + // if licenseXhrSetup did not yet call open, let's do it now + if (!xhr.readyState) { + xhr.open('POST', url, true); + } + + if (licenseXhrSetup) { + licenseXhrSetup.call(this.hls, xhr, url); + } + } catch (e) { + // IE11 throws an exception on xhr.open if attempting to access an HTTP resource over HTTPS + throw new Error("issue setting up KeySystem license XHR " + e); + } + + return xhr; + } + /** + * @private + * @param {XMLHttpRequest} xhr + * @param {string} url License server URL + * @param {ArrayBuffer} keyMessage Message data issued by key-system + * @param {function} callback Called when XHR has succeeded + */ + ; + + _proto._onLicenseRequestReadyStageChange = function _onLicenseRequestReadyStageChange(xhr, url, keyMessage, callback) { + switch (xhr.readyState) { + case 4: + if (xhr.status === 200) { + this._requestLicenseFailureCount = 0; + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('License request succeeded'); + var _data = xhr.response; + var licenseResponseCallback = this._licenseResponseCallback; + + if (licenseResponseCallback) { + try { + _data = licenseResponseCallback.call(this.hls, xhr, url); + } catch (e) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error(e); + } + } + + callback(_data); + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("License Request XHR failed (" + url + "). Status: " + xhr.status + " (" + xhr.statusText + ")"); + this._requestLicenseFailureCount++; + + if (this._requestLicenseFailureCount > MAX_LICENSE_REQUEST_FAILURES) { + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_LICENSE_REQUEST_FAILED, + fatal: true + }); + return; + } + + var attemptsLeft = MAX_LICENSE_REQUEST_FAILURES - this._requestLicenseFailureCount + 1; + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Retrying license request, " + attemptsLeft + " attempts left"); + + this._requestLicense(keyMessage, callback); + } + + break; + } + } + /** + * @private + * @param {MediaKeysListItem} keysListItem + * @param {ArrayBuffer} keyMessage + * @returns {ArrayBuffer} Challenge data posted to license server + * @throws if KeySystem is unsupported + */ + ; + + _proto._generateLicenseRequestChallenge = function _generateLicenseRequestChallenge(keysListItem, keyMessage) { + switch (keysListItem.mediaKeySystemDomain) { + // case KeySystems.PLAYREADY: + // from https://github.com/MicrosoftEdge/Demos/blob/master/eme/scripts/demo.js + + /* + if (this.licenseType !== this.LICENSE_TYPE_WIDEVINE) { + // For PlayReady CDMs, we need to dig the Challenge out of the XML. + var keyMessageXml = new DOMParser().parseFromString(String.fromCharCode.apply(null, new Uint16Array(keyMessage)), 'application/xml'); + if (keyMessageXml.getElementsByTagName('Challenge')[0]) { + challenge = atob(keyMessageXml.getElementsByTagName('Challenge')[0].childNodes[0].nodeValue); + } else { + throw 'Cannot find in key message'; + } + var headerNames = keyMessageXml.getElementsByTagName('name'); + var headerValues = keyMessageXml.getElementsByTagName('value'); + if (headerNames.length !== headerValues.length) { + throw 'Mismatched header / pair in key message'; + } + for (var i = 0; i < headerNames.length; i++) { + xhr.setRequestHeader(headerNames[i].childNodes[0].nodeValue, headerValues[i].childNodes[0].nodeValue); + } + } + break; + */ + case _utils_mediakeys_helper__WEBPACK_IMPORTED_MODULE_3__["KeySystems"].WIDEVINE: + // For Widevine CDMs, the challenge is the keyMessage. + return keyMessage; + } + + throw new Error("unsupported key-system: " + keysListItem.mediaKeySystemDomain); + } + /** + * @private + * @param keyMessage + * @param callback + */ + ; + + _proto._requestLicense = function _requestLicense(keyMessage, callback) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('Requesting content license for key-system'); + var keysListItem = this._mediaKeysList[0]; + + if (!keysListItem) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Fatal error: Media is encrypted but no key-system access has been obtained yet'); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_NO_ACCESS, + fatal: true + }); + return; + } + + try { + var _url = this.getLicenseServerUrl(keysListItem.mediaKeySystemDomain); + + var _xhr = this._createLicenseXhr(_url, keyMessage, callback); + + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Sending license request to URL: " + _url); + + var challenge = this._generateLicenseRequestChallenge(keysListItem, keyMessage); + + _xhr.send(challenge); + } catch (e) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Failure requesting DRM license: " + e); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].KEY_SYSTEM_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_SYSTEM_LICENSE_REQUEST_FAILED, + fatal: true + }); + } + }; + + _proto.onMediaAttached = function onMediaAttached(event, data) { + if (!this._emeEnabled) { + return; + } + + var media = data.media; // keep reference of media + + this._media = media; + media.addEventListener('encrypted', this._onMediaEncrypted); + }; + + _proto.onMediaDetached = function onMediaDetached() { + var media = this._media; + var mediaKeysList = this._mediaKeysList; + + if (!media) { + return; + } + + media.removeEventListener('encrypted', this._onMediaEncrypted); + this._media = null; + this._mediaKeysList = []; // Close all sessions and remove media keys from the video element. + + Promise.all(mediaKeysList.map(function (mediaKeysListItem) { + if (mediaKeysListItem.mediaKeysSession) { + return mediaKeysListItem.mediaKeysSession.close().catch(function () {// Ignore errors when closing the sessions. Closing a session that + // generated no key requests will throw an error. + }); + } + })).then(function () { + return media.setMediaKeys(null); + }).catch(function () {// Ignore any failures while removing media keys from the video element. + }); + }; + + _proto.onManifestParsed = function onManifestParsed(event, data) { + if (!this._emeEnabled) { + return; + } + + var audioCodecs = data.levels.map(function (level) { + return level.audioCodec; + }).filter(function (audioCodec) { + return !!audioCodec; + }); + var videoCodecs = data.levels.map(function (level) { + return level.videoCodec; + }).filter(function (videoCodec) { + return !!videoCodec; + }); + + this._attemptKeySystemAccess(_utils_mediakeys_helper__WEBPACK_IMPORTED_MODULE_3__["KeySystems"].WIDEVINE, audioCodecs, videoCodecs); + }; + + _createClass(EMEController, [{ + key: "requestMediaKeySystemAccess", + get: function get() { + if (!this._requestMediaKeySystemAccess) { + throw new Error('No requestMediaKeySystemAccess function configured'); + } + + return this._requestMediaKeySystemAccess; + } + }]); + + return EMEController; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (EMEController); + +/***/ }), + +/***/ "./src/controller/fps-controller.ts": +/*!******************************************!*\ + !*** ./src/controller/fps-controller.ts ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + + +var FPSController = /*#__PURE__*/function () { + // stream controller must be provided as a dependency! + function FPSController(hls) { + this.hls = void 0; + this.isVideoPlaybackQualityAvailable = false; + this.timer = void 0; + this.media = null; + this.lastTime = void 0; + this.lastDroppedFrames = 0; + this.lastDecodedFrames = 0; + this.streamController = void 0; + this.hls = hls; + this.registerListeners(); + } + + var _proto = FPSController.prototype; + + _proto.setStreamController = function setStreamController(streamController) { + this.streamController = streamController; + }; + + _proto.registerListeners = function registerListeners() { + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHING, this.onMediaAttaching, this); + }; + + _proto.unregisterListeners = function unregisterListeners() { + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHING, this.onMediaAttaching); + }; + + _proto.destroy = function destroy() { + if (this.timer) { + clearInterval(this.timer); + } + + this.unregisterListeners(); + this.isVideoPlaybackQualityAvailable = false; + this.media = null; + }; + + _proto.onMediaAttaching = function onMediaAttaching(event, data) { + var config = this.hls.config; + + if (config.capLevelOnFPSDrop) { + var media = data.media instanceof self.HTMLVideoElement ? data.media : null; + this.media = media; + + if (media && typeof media.getVideoPlaybackQuality === 'function') { + this.isVideoPlaybackQualityAvailable = true; + } + + self.clearInterval(this.timer); + this.timer = self.setInterval(this.checkFPSInterval.bind(this), config.fpsDroppedMonitoringPeriod); + } + }; + + _proto.checkFPS = function checkFPS(video, decodedFrames, droppedFrames) { + var currentTime = performance.now(); + + if (decodedFrames) { + if (this.lastTime) { + var currentPeriod = currentTime - this.lastTime; + var currentDropped = droppedFrames - this.lastDroppedFrames; + var currentDecoded = decodedFrames - this.lastDecodedFrames; + var droppedFPS = 1000 * currentDropped / currentPeriod; + var hls = this.hls; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FPS_DROP, { + currentDropped: currentDropped, + currentDecoded: currentDecoded, + totalDroppedFrames: droppedFrames + }); + + if (droppedFPS > 0) { + // logger.log('checkFPS : droppedFPS/decodedFPS:' + droppedFPS/(1000 * currentDecoded / currentPeriod)); + if (currentDropped > hls.config.fpsDroppedMonitoringThreshold * currentDecoded) { + var currentLevel = hls.currentLevel; + _utils_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].warn('drop FPS ratio greater than max allowed value for currentLevel: ' + currentLevel); + + if (currentLevel > 0 && (hls.autoLevelCapping === -1 || hls.autoLevelCapping >= currentLevel)) { + currentLevel = currentLevel - 1; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FPS_DROP_LEVEL_CAPPING, { + level: currentLevel, + droppedLevel: hls.currentLevel + }); + hls.autoLevelCapping = currentLevel; + this.streamController.nextLevelSwitch(); + } + } + } + } + + this.lastTime = currentTime; + this.lastDroppedFrames = droppedFrames; + this.lastDecodedFrames = decodedFrames; + } + }; + + _proto.checkFPSInterval = function checkFPSInterval() { + var video = this.media; + + if (video) { + if (this.isVideoPlaybackQualityAvailable) { + var videoPlaybackQuality = video.getVideoPlaybackQuality(); + this.checkFPS(video, videoPlaybackQuality.totalVideoFrames, videoPlaybackQuality.droppedVideoFrames); + } else { + // HTMLVideoElement doesn't include the webkit types + this.checkFPS(video, video.webkitDecodedFrameCount, video.webkitDroppedFrameCount); + } + } + }; + + return FPSController; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (FPSController); + +/***/ }), + +/***/ "./src/controller/fragment-finders.ts": +/*!********************************************!*\ + !*** ./src/controller/fragment-finders.ts ***! + \********************************************/ +/*! exports provided: findFragmentByPDT, findFragmentByPTS, fragmentWithinToleranceTest, pdtWithinToleranceTest, findFragWithCC */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findFragmentByPDT", function() { return findFragmentByPDT; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findFragmentByPTS", function() { return findFragmentByPTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fragmentWithinToleranceTest", function() { return fragmentWithinToleranceTest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pdtWithinToleranceTest", function() { return pdtWithinToleranceTest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findFragWithCC", function() { return findFragWithCC; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _utils_binary_search__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/binary-search */ "./src/utils/binary-search.ts"); + + + +/** + * Returns first fragment whose endPdt value exceeds the given PDT. + * @param {Array} fragments - The array of candidate fragments + * @param {number|null} [PDTValue = null] - The PDT value which must be exceeded + * @param {number} [maxFragLookUpTolerance = 0] - The amount of time that a fragment's start/end can be within in order to be considered contiguous + * @returns {*|null} fragment - The best matching fragment + */ +function findFragmentByPDT(fragments, PDTValue, maxFragLookUpTolerance) { + if (PDTValue === null || !Array.isArray(fragments) || !fragments.length || !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(PDTValue)) { + return null; + } // if less than start + + + var startPDT = fragments[0].programDateTime; + + if (PDTValue < (startPDT || 0)) { + return null; + } + + var endPDT = fragments[fragments.length - 1].endProgramDateTime; + + if (PDTValue >= (endPDT || 0)) { + return null; + } + + maxFragLookUpTolerance = maxFragLookUpTolerance || 0; + + for (var seg = 0; seg < fragments.length; ++seg) { + var frag = fragments[seg]; + + if (pdtWithinToleranceTest(PDTValue, maxFragLookUpTolerance, frag)) { + return frag; + } + } + + return null; +} +/** + * Finds a fragment based on the SN of the previous fragment; or based on the needs of the current buffer. + * This method compensates for small buffer gaps by applying a tolerance to the start of any candidate fragment, thus + * breaking any traps which would cause the same fragment to be continuously selected within a small range. + * @param {*} fragPrevious - The last frag successfully appended + * @param {Array} fragments - The array of candidate fragments + * @param {number} [bufferEnd = 0] - The end of the contiguous buffered range the playhead is currently within + * @param {number} maxFragLookUpTolerance - The amount of time that a fragment's start/end can be within in order to be considered contiguous + * @returns {*} foundFrag - The best matching fragment + */ + +function findFragmentByPTS(fragPrevious, fragments, bufferEnd, maxFragLookUpTolerance) { + if (bufferEnd === void 0) { + bufferEnd = 0; + } + + if (maxFragLookUpTolerance === void 0) { + maxFragLookUpTolerance = 0; + } + + var fragNext = null; + + if (fragPrevious) { + fragNext = fragments[fragPrevious.sn - fragments[0].sn + 1] || null; + } else if (bufferEnd === 0 && fragments[0].start === 0) { + fragNext = fragments[0]; + } // Prefer the next fragment if it's within tolerance + + + if (fragNext && fragmentWithinToleranceTest(bufferEnd, maxFragLookUpTolerance, fragNext) === 0) { + return fragNext; + } // We might be seeking past the tolerance so find the best match + + + var foundFragment = _utils_binary_search__WEBPACK_IMPORTED_MODULE_1__["default"].search(fragments, fragmentWithinToleranceTest.bind(null, bufferEnd, maxFragLookUpTolerance)); + + if (foundFragment) { + return foundFragment; + } // If no match was found return the next fragment after fragPrevious, or null + + + return fragNext; +} +/** + * The test function used by the findFragmentBySn's BinarySearch to look for the best match to the current buffer conditions. + * @param {*} candidate - The fragment to test + * @param {number} [bufferEnd = 0] - The end of the current buffered range the playhead is currently within + * @param {number} [maxFragLookUpTolerance = 0] - The amount of time that a fragment's start can be within in order to be considered contiguous + * @returns {number} - 0 if it matches, 1 if too low, -1 if too high + */ + +function fragmentWithinToleranceTest(bufferEnd, maxFragLookUpTolerance, candidate) { + if (bufferEnd === void 0) { + bufferEnd = 0; + } + + if (maxFragLookUpTolerance === void 0) { + maxFragLookUpTolerance = 0; + } + + // offset should be within fragment boundary - config.maxFragLookUpTolerance + // this is to cope with situations like + // bufferEnd = 9.991 + // frag[Ø] : [0,10] + // frag[1] : [10,20] + // bufferEnd is within frag[0] range ... although what we are expecting is to return frag[1] here + // frag start frag start+duration + // |-----------------------------| + // <---> <---> + // ...--------><-----------------------------><---------.... + // previous frag matching fragment next frag + // return -1 return 0 return 1 + // logger.log(`level/sn/start/end/bufEnd:${level}/${candidate.sn}/${candidate.start}/${(candidate.start+candidate.duration)}/${bufferEnd}`); + // Set the lookup tolerance to be small enough to detect the current segment - ensures we don't skip over very small segments + var candidateLookupTolerance = Math.min(maxFragLookUpTolerance, candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0)); + + if (candidate.start + candidate.duration - candidateLookupTolerance <= bufferEnd) { + return 1; + } else if (candidate.start - candidateLookupTolerance > bufferEnd && candidate.start) { + // if maxFragLookUpTolerance will have negative value then don't return -1 for first element + return -1; + } + + return 0; +} +/** + * The test function used by the findFragmentByPdt's BinarySearch to look for the best match to the current buffer conditions. + * This function tests the candidate's program date time values, as represented in Unix time + * @param {*} candidate - The fragment to test + * @param {number} [pdtBufferEnd = 0] - The Unix time representing the end of the current buffered range + * @param {number} [maxFragLookUpTolerance = 0] - The amount of time that a fragment's start can be within in order to be considered contiguous + * @returns {boolean} True if contiguous, false otherwise + */ + +function pdtWithinToleranceTest(pdtBufferEnd, maxFragLookUpTolerance, candidate) { + var candidateLookupTolerance = Math.min(maxFragLookUpTolerance, candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0)) * 1000; // endProgramDateTime can be null, default to zero + + var endProgramDateTime = candidate.endProgramDateTime || 0; + return endProgramDateTime - candidateLookupTolerance > pdtBufferEnd; +} +function findFragWithCC(fragments, cc) { + return _utils_binary_search__WEBPACK_IMPORTED_MODULE_1__["default"].search(fragments, function (candidate) { + if (candidate.cc < cc) { + return 1; + } else if (candidate.cc > cc) { + return -1; + } else { + return 0; + } + }); +} + +/***/ }), + +/***/ "./src/controller/fragment-tracker.ts": +/*!********************************************!*\ + !*** ./src/controller/fragment-tracker.ts ***! + \********************************************/ +/*! exports provided: FragmentState, FragmentTracker */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FragmentState", function() { return FragmentState; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FragmentTracker", function() { return FragmentTracker; }); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); + + +var FragmentState; + +(function (FragmentState) { + FragmentState["NOT_LOADED"] = "NOT_LOADED"; + FragmentState["BACKTRACKED"] = "BACKTRACKED"; + FragmentState["APPENDING"] = "APPENDING"; + FragmentState["PARTIAL"] = "PARTIAL"; + FragmentState["OK"] = "OK"; +})(FragmentState || (FragmentState = {})); + +var FragmentTracker = /*#__PURE__*/function () { + function FragmentTracker(hls) { + this.activeFragment = null; + this.activeParts = null; + this.fragments = Object.create(null); + this.timeRanges = Object.create(null); + this.bufferPadding = 0.2; + this.hls = void 0; + this.hls = hls; + + this._registerListeners(); + } + + var _proto = FragmentTracker.prototype; + + _proto._registerListeners = function _registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_APPENDED, this.onBufferAppended, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FRAG_BUFFERED, this.onFragBuffered, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FRAG_LOADED, this.onFragLoaded, this); + }; + + _proto._unregisterListeners = function _unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_APPENDED, this.onBufferAppended, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FRAG_BUFFERED, this.onFragBuffered, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FRAG_LOADED, this.onFragLoaded, this); + }; + + _proto.destroy = function destroy() { + this._unregisterListeners(); // @ts-ignore + + + this.fragments = this.timeRanges = null; + } + /** + * Return a Fragment with an appended range that matches the position and levelType. + * If not found any Fragment, return null + */ + ; + + _proto.getAppendedFrag = function getAppendedFrag(position, levelType) { + if (levelType === _types_loader__WEBPACK_IMPORTED_MODULE_1__["PlaylistLevelType"].MAIN) { + var activeFragment = this.activeFragment, + activeParts = this.activeParts; + + if (!activeFragment) { + return null; + } + + if (activeParts) { + for (var i = activeParts.length; i--;) { + var activePart = activeParts[i]; + var appendedPTS = activePart ? activePart.end : activeFragment.appendedPTS; + + if (activePart.start <= position && appendedPTS !== undefined && position <= appendedPTS) { + // 9 is a magic number. remove parts from lookup after a match but keep some short seeks back. + if (i > 9) { + this.activeParts = activeParts.slice(i - 9); + } + + return activePart; + } + } + } else if (activeFragment.start <= position && activeFragment.appendedPTS !== undefined && position <= activeFragment.appendedPTS) { + return activeFragment; + } + } + + return this.getBufferedFrag(position, levelType); + } + /** + * Return a buffered Fragment that matches the position and levelType. + * A buffered Fragment is one whose loading, parsing and appending is done (completed or "partial" meaning aborted). + * If not found any Fragment, return null + */ + ; + + _proto.getBufferedFrag = function getBufferedFrag(position, levelType) { + var fragments = this.fragments; + var keys = Object.keys(fragments); + + for (var i = keys.length; i--;) { + var fragmentEntity = fragments[keys[i]]; + + if ((fragmentEntity === null || fragmentEntity === void 0 ? void 0 : fragmentEntity.body.type) === levelType && fragmentEntity.buffered) { + var frag = fragmentEntity.body; + + if (frag.start <= position && position <= frag.end) { + return frag; + } + } + } + + return null; + } + /** + * Partial fragments effected by coded frame eviction will be removed + * The browser will unload parts of the buffer to free up memory for new buffer data + * Fragments will need to be reloaded when the buffer is freed up, removing partial fragments will allow them to reload(since there might be parts that are still playable) + */ + ; + + _proto.detectEvictedFragments = function detectEvictedFragments(elementaryStream, timeRange, playlistType) { + var _this = this; + + // Check if any flagged fragments have been unloaded + Object.keys(this.fragments).forEach(function (key) { + var fragmentEntity = _this.fragments[key]; + + if (!fragmentEntity) { + return; + } + + if (!fragmentEntity.buffered) { + if (fragmentEntity.body.type === playlistType) { + _this.removeFragment(fragmentEntity.body); + } + + return; + } + + var esData = fragmentEntity.range[elementaryStream]; + + if (!esData) { + return; + } + + esData.time.some(function (time) { + var isNotBuffered = !_this.isTimeBuffered(time.startPTS, time.endPTS, timeRange); + + if (isNotBuffered) { + // Unregister partial fragment as it needs to load again to be reused + _this.removeFragment(fragmentEntity.body); + } + + return isNotBuffered; + }); + }); + } + /** + * Checks if the fragment passed in is loaded in the buffer properly + * Partially loaded fragments will be registered as a partial fragment + */ + ; + + _proto.detectPartialFragments = function detectPartialFragments(data) { + var _this2 = this; + + var timeRanges = this.timeRanges; + var frag = data.frag, + part = data.part; + + if (!timeRanges || frag.sn === 'initSegment') { + return; + } + + var fragKey = getFragmentKey(frag); + var fragmentEntity = this.fragments[fragKey]; + + if (!fragmentEntity) { + return; + } + + Object.keys(timeRanges).forEach(function (elementaryStream) { + var streamInfo = frag.elementaryStreams[elementaryStream]; + + if (!streamInfo) { + return; + } + + var timeRange = timeRanges[elementaryStream]; + var partial = part !== null || streamInfo.partial === true; + fragmentEntity.range[elementaryStream] = _this2.getBufferedTimes(frag, part, partial, timeRange); + }); + fragmentEntity.backtrack = fragmentEntity.loaded = null; + + if (Object.keys(fragmentEntity.range).length) { + fragmentEntity.buffered = true; + } else { + // remove fragment if nothing was appended + this.removeFragment(fragmentEntity.body); + } + }; + + _proto.fragBuffered = function fragBuffered(frag) { + var fragKey = getFragmentKey(frag); + var fragmentEntity = this.fragments[fragKey]; + + if (fragmentEntity) { + fragmentEntity.backtrack = fragmentEntity.loaded = null; + fragmentEntity.buffered = true; + } + }; + + _proto.getBufferedTimes = function getBufferedTimes(fragment, part, partial, timeRange) { + var buffered = { + time: [], + partial: partial + }; + var startPTS = part ? part.start : fragment.start; + var endPTS = part ? part.end : fragment.end; + var minEndPTS = fragment.minEndPTS || endPTS; + var maxStartPTS = fragment.maxStartPTS || startPTS; + + for (var i = 0; i < timeRange.length; i++) { + var startTime = timeRange.start(i) - this.bufferPadding; + var endTime = timeRange.end(i) + this.bufferPadding; + + if (maxStartPTS >= startTime && minEndPTS <= endTime) { + // Fragment is entirely contained in buffer + // No need to check the other timeRange times since it's completely playable + buffered.time.push({ + startPTS: Math.max(startPTS, timeRange.start(i)), + endPTS: Math.min(endPTS, timeRange.end(i)) + }); + break; + } else if (startPTS < endTime && endPTS > startTime) { + buffered.partial = true; // Check for intersection with buffer + // Get playable sections of the fragment + + buffered.time.push({ + startPTS: Math.max(startPTS, timeRange.start(i)), + endPTS: Math.min(endPTS, timeRange.end(i)) + }); + } else if (endPTS <= startTime) { + // No need to check the rest of the timeRange as it is in order + break; + } + } + + return buffered; + } + /** + * Gets the partial fragment for a certain time + */ + ; + + _proto.getPartialFragment = function getPartialFragment(time) { + var bestFragment = null; + var timePadding; + var startTime; + var endTime; + var bestOverlap = 0; + var bufferPadding = this.bufferPadding, + fragments = this.fragments; + Object.keys(fragments).forEach(function (key) { + var fragmentEntity = fragments[key]; + + if (!fragmentEntity) { + return; + } + + if (isPartial(fragmentEntity)) { + startTime = fragmentEntity.body.start - bufferPadding; + endTime = fragmentEntity.body.end + bufferPadding; + + if (time >= startTime && time <= endTime) { + // Use the fragment that has the most padding from start and end time + timePadding = Math.min(time - startTime, endTime - time); + + if (bestOverlap <= timePadding) { + bestFragment = fragmentEntity.body; + bestOverlap = timePadding; + } + } + } + }); + return bestFragment; + }; + + _proto.getState = function getState(fragment) { + var fragKey = getFragmentKey(fragment); + var fragmentEntity = this.fragments[fragKey]; + + if (fragmentEntity) { + if (!fragmentEntity.buffered) { + if (fragmentEntity.backtrack) { + return FragmentState.BACKTRACKED; + } + + return FragmentState.APPENDING; + } else if (isPartial(fragmentEntity)) { + return FragmentState.PARTIAL; + } else { + return FragmentState.OK; + } + } + + return FragmentState.NOT_LOADED; + }; + + _proto.backtrack = function backtrack(frag, data) { + var fragKey = getFragmentKey(frag); + var fragmentEntity = this.fragments[fragKey]; + + if (!fragmentEntity || fragmentEntity.backtrack) { + return null; + } + + var backtrack = fragmentEntity.backtrack = data ? data : fragmentEntity.loaded; + fragmentEntity.loaded = null; + return backtrack; + }; + + _proto.getBacktrackData = function getBacktrackData(fragment) { + var fragKey = getFragmentKey(fragment); + var fragmentEntity = this.fragments[fragKey]; + + if (fragmentEntity) { + var _backtrack$payload; + + var backtrack = fragmentEntity.backtrack; // If data was already sent to Worker it is detached no longer available + + if (backtrack !== null && backtrack !== void 0 && (_backtrack$payload = backtrack.payload) !== null && _backtrack$payload !== void 0 && _backtrack$payload.byteLength) { + return backtrack; + } else { + this.removeFragment(fragment); + } + } + + return null; + }; + + _proto.isTimeBuffered = function isTimeBuffered(startPTS, endPTS, timeRange) { + var startTime; + var endTime; + + for (var i = 0; i < timeRange.length; i++) { + startTime = timeRange.start(i) - this.bufferPadding; + endTime = timeRange.end(i) + this.bufferPadding; + + if (startPTS >= startTime && endPTS <= endTime) { + return true; + } + + if (endPTS <= startTime) { + // No need to check the rest of the timeRange as it is in order + return false; + } + } + + return false; + }; + + _proto.onFragLoaded = function onFragLoaded(event, data) { + var frag = data.frag, + part = data.part; // don't track initsegment (for which sn is not a number) + // don't track frags used for bitrateTest, they're irrelevant. + // don't track parts for memory efficiency + + if (frag.sn === 'initSegment' || frag.bitrateTest || part) { + return; + } + + var fragKey = getFragmentKey(frag); + this.fragments[fragKey] = { + body: frag, + loaded: data, + backtrack: null, + buffered: false, + range: Object.create(null) + }; + }; + + _proto.onBufferAppended = function onBufferAppended(event, data) { + var _this3 = this; + + var frag = data.frag, + part = data.part, + timeRanges = data.timeRanges; + + if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_1__["PlaylistLevelType"].MAIN) { + this.activeFragment = frag; + + if (part) { + var activeParts = this.activeParts; + + if (!activeParts) { + this.activeParts = activeParts = []; + } + + activeParts.push(part); + } else { + this.activeParts = null; + } + } // Store the latest timeRanges loaded in the buffer + + + this.timeRanges = timeRanges; + Object.keys(timeRanges).forEach(function (elementaryStream) { + var timeRange = timeRanges[elementaryStream]; + + _this3.detectEvictedFragments(elementaryStream, timeRange); + + if (!part) { + for (var i = 0; i < timeRange.length; i++) { + frag.appendedPTS = Math.max(timeRange.end(i), frag.appendedPTS || 0); + } + } + }); + }; + + _proto.onFragBuffered = function onFragBuffered(event, data) { + this.detectPartialFragments(data); + }; + + _proto.hasFragment = function hasFragment(fragment) { + var fragKey = getFragmentKey(fragment); + return !!this.fragments[fragKey]; + }; + + _proto.removeFragmentsInRange = function removeFragmentsInRange(start, end, playlistType) { + var _this4 = this; + + Object.keys(this.fragments).forEach(function (key) { + var fragmentEntity = _this4.fragments[key]; + + if (!fragmentEntity) { + return; + } + + if (fragmentEntity.buffered) { + var frag = fragmentEntity.body; + + if (frag.type === playlistType && frag.start < end && frag.end > start) { + _this4.removeFragment(frag); + } + } + }); + }; + + _proto.removeFragment = function removeFragment(fragment) { + var fragKey = getFragmentKey(fragment); + fragment.stats.loaded = 0; + fragment.clearElementaryStreamInfo(); + delete this.fragments[fragKey]; + }; + + _proto.removeAllFragments = function removeAllFragments() { + this.fragments = Object.create(null); + this.activeFragment = null; + this.activeParts = null; + }; + + return FragmentTracker; +}(); + +function isPartial(fragmentEntity) { + var _fragmentEntity$range, _fragmentEntity$range2; + + return fragmentEntity.buffered && (((_fragmentEntity$range = fragmentEntity.range.video) === null || _fragmentEntity$range === void 0 ? void 0 : _fragmentEntity$range.partial) || ((_fragmentEntity$range2 = fragmentEntity.range.audio) === null || _fragmentEntity$range2 === void 0 ? void 0 : _fragmentEntity$range2.partial)); +} + +function getFragmentKey(fragment) { + return fragment.type + "_" + fragment.level + "_" + fragment.urlId + "_" + fragment.sn; +} + +/***/ }), + +/***/ "./src/controller/gap-controller.ts": +/*!******************************************!*\ + !*** ./src/controller/gap-controller.ts ***! + \******************************************/ +/*! exports provided: STALL_MINIMUM_DURATION_MS, MAX_START_GAP_JUMP, SKIP_BUFFER_HOLE_STEP_SECONDS, SKIP_BUFFER_RANGE_START, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STALL_MINIMUM_DURATION_MS", function() { return STALL_MINIMUM_DURATION_MS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAX_START_GAP_JUMP", function() { return MAX_START_GAP_JUMP; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SKIP_BUFFER_HOLE_STEP_SECONDS", function() { return SKIP_BUFFER_HOLE_STEP_SECONDS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SKIP_BUFFER_RANGE_START", function() { return SKIP_BUFFER_RANGE_START; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return GapController; }); +/* harmony import */ var _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/buffer-helper */ "./src/utils/buffer-helper.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + + + +var STALL_MINIMUM_DURATION_MS = 250; +var MAX_START_GAP_JUMP = 2.0; +var SKIP_BUFFER_HOLE_STEP_SECONDS = 0.1; +var SKIP_BUFFER_RANGE_START = 0.05; + +var GapController = /*#__PURE__*/function () { + function GapController(config, media, fragmentTracker, hls) { + this.config = void 0; + this.media = void 0; + this.fragmentTracker = void 0; + this.hls = void 0; + this.nudgeRetry = 0; + this.stallReported = false; + this.stalled = null; + this.moved = false; + this.seeking = false; + this.config = config; + this.media = media; + this.fragmentTracker = fragmentTracker; + this.hls = hls; + } + + var _proto = GapController.prototype; + + _proto.destroy = function destroy() { + // @ts-ignore + this.hls = this.fragmentTracker = this.media = null; + } + /** + * Checks if the playhead is stuck within a gap, and if so, attempts to free it. + * A gap is an unbuffered range between two buffered ranges (or the start and the first buffered range). + * + * @param {number} lastCurrentTime Previously read playhead position + */ + ; + + _proto.poll = function poll(lastCurrentTime) { + var config = this.config, + media = this.media, + stalled = this.stalled; + var currentTime = media.currentTime, + seeking = media.seeking; + var seeked = this.seeking && !seeking; + var beginSeek = !this.seeking && seeking; + this.seeking = seeking; // The playhead is moving, no-op + + if (currentTime !== lastCurrentTime) { + this.moved = true; + + if (stalled !== null) { + // The playhead is now moving, but was previously stalled + if (this.stallReported) { + var _stalledDuration = self.performance.now() - stalled; + + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("playback not stuck anymore @" + currentTime + ", after " + Math.round(_stalledDuration) + "ms"); + this.stallReported = false; + } + + this.stalled = null; + this.nudgeRetry = 0; + } + + return; + } // Clear stalled state when beginning or finishing seeking so that we don't report stalls coming out of a seek + + + if (beginSeek || seeked) { + this.stalled = null; + } // The playhead should not be moving + + + if (media.paused || media.ended || media.playbackRate === 0 || !_utils_buffer_helper__WEBPACK_IMPORTED_MODULE_0__["BufferHelper"].getBuffered(media).length) { + return; + } + + var bufferInfo = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_0__["BufferHelper"].bufferInfo(media, currentTime, 0); + var isBuffered = bufferInfo.len > 0; + var nextStart = bufferInfo.nextStart || 0; // There is no playable buffer (seeked, waiting for buffer) + + if (!isBuffered && !nextStart) { + return; + } + + if (seeking) { + // Waiting for seeking in a buffered range to complete + var hasEnoughBuffer = bufferInfo.len > MAX_START_GAP_JUMP; // Next buffered range is too far ahead to jump to while still seeking + + var noBufferGap = !nextStart || nextStart - currentTime > MAX_START_GAP_JUMP && !this.fragmentTracker.getPartialFragment(currentTime); + + if (hasEnoughBuffer || noBufferGap) { + return; + } // Reset moved state when seeking to a point in or before a gap + + + this.moved = false; + } // Skip start gaps if we haven't played, but the last poll detected the start of a stall + // The addition poll gives the browser a chance to jump the gap for us + + + if (!this.moved && this.stalled !== null) { + var _level$details; + + // Jump start gaps within jump threshold + var startJump = Math.max(nextStart, bufferInfo.start || 0) - currentTime; // When joining a live stream with audio tracks, account for live playlist window sliding by allowing + // a larger jump over start gaps caused by the audio-stream-controller buffering a start fragment + // that begins over 1 target duration after the video start position. + + var level = this.hls.levels ? this.hls.levels[this.hls.currentLevel] : null; + var isLive = level === null || level === void 0 ? void 0 : (_level$details = level.details) === null || _level$details === void 0 ? void 0 : _level$details.live; + var maxStartGapJump = isLive ? level.details.targetduration * 2 : MAX_START_GAP_JUMP; + + if (startJump > 0 && startJump <= maxStartGapJump) { + this._trySkipBufferHole(null); + + return; + } + } // Start tracking stall time + + + var tnow = self.performance.now(); + + if (stalled === null) { + this.stalled = tnow; + return; + } + + var stalledDuration = tnow - stalled; + + if (!seeking && stalledDuration >= STALL_MINIMUM_DURATION_MS) { + // Report stalling after trying to fix + this._reportStall(bufferInfo.len); + } + + var bufferedWithHoles = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_0__["BufferHelper"].bufferInfo(media, currentTime, config.maxBufferHole); + + this._tryFixBufferStall(bufferedWithHoles, stalledDuration); + } + /** + * Detects and attempts to fix known buffer stalling issues. + * @param bufferInfo - The properties of the current buffer. + * @param stalledDurationMs - The amount of time Hls.js has been stalling for. + * @private + */ + ; + + _proto._tryFixBufferStall = function _tryFixBufferStall(bufferInfo, stalledDurationMs) { + var config = this.config, + fragmentTracker = this.fragmentTracker, + media = this.media; + var currentTime = media.currentTime; + var partial = fragmentTracker.getPartialFragment(currentTime); + + if (partial) { + // Try to skip over the buffer hole caused by a partial fragment + // This method isn't limited by the size of the gap between buffered ranges + var targetTime = this._trySkipBufferHole(partial); // we return here in this case, meaning + // the branch below only executes when we don't handle a partial fragment + + + if (targetTime) { + return; + } + } // if we haven't had to skip over a buffer hole of a partial fragment + // we may just have to "nudge" the playlist as the browser decoding/rendering engine + // needs to cross some sort of threshold covering all source-buffers content + // to start playing properly. + + + if (bufferInfo.len > config.maxBufferHole && stalledDurationMs > config.highBufferWatchdogPeriod * 1000) { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('Trying to nudge playhead over buffer-hole'); // Try to nudge currentTime over a buffer hole if we've been stalling for the configured amount of seconds + // We only try to jump the hole if it's under the configured size + // Reset stalled so to rearm watchdog timer + + this.stalled = null; + + this._tryNudgeBuffer(); + } + } + /** + * Triggers a BUFFER_STALLED_ERROR event, but only once per stall period. + * @param bufferLen - The playhead distance from the end of the current buffer segment. + * @private + */ + ; + + _proto._reportStall = function _reportStall(bufferLen) { + var hls = this.hls, + media = this.media, + stallReported = this.stallReported; + + if (!stallReported) { + // Report stalled error once + this.stallReported = true; + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Playback stalling at @" + media.currentTime + " due to low buffer (buffer=" + bufferLen + ")"); + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].BUFFER_STALLED_ERROR, + fatal: false, + buffer: bufferLen + }); + } + } + /** + * Attempts to fix buffer stalls by jumping over known gaps caused by partial fragments + * @param partial - The partial fragment found at the current time (where playback is stalling). + * @private + */ + ; + + _proto._trySkipBufferHole = function _trySkipBufferHole(partial) { + var config = this.config, + hls = this.hls, + media = this.media; + var currentTime = media.currentTime; + var lastEndTime = 0; // Check if currentTime is between unbuffered regions of partial fragments + + var buffered = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_0__["BufferHelper"].getBuffered(media); + + for (var i = 0; i < buffered.length; i++) { + var startTime = buffered.start(i); + + if (currentTime + config.maxBufferHole >= lastEndTime && currentTime < startTime) { + var targetTime = Math.max(startTime + SKIP_BUFFER_RANGE_START, media.currentTime + SKIP_BUFFER_HOLE_STEP_SECONDS); + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("skipping hole, adjusting currentTime from " + currentTime + " to " + targetTime); + this.moved = true; + this.stalled = null; + media.currentTime = targetTime; + + if (partial) { + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].BUFFER_SEEK_OVER_HOLE, + fatal: false, + reason: "fragment loaded with buffer holes, seeking from " + currentTime + " to " + targetTime, + frag: partial + }); + } + + return targetTime; + } + + lastEndTime = buffered.end(i); + } + + return 0; + } + /** + * Attempts to fix buffer stalls by advancing the mediaElement's current time by a small amount. + * @private + */ + ; + + _proto._tryNudgeBuffer = function _tryNudgeBuffer() { + var config = this.config, + hls = this.hls, + media = this.media; + var currentTime = media.currentTime; + var nudgeRetry = (this.nudgeRetry || 0) + 1; + this.nudgeRetry = nudgeRetry; + + if (nudgeRetry < config.nudgeMaxRetry) { + var targetTime = currentTime + nudgeRetry * config.nudgeOffset; // playback stalled in buffered area ... let's nudge currentTime to try to overcome this + + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Nudging 'currentTime' from " + currentTime + " to " + targetTime); + media.currentTime = targetTime; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].BUFFER_NUDGE_ON_STALL, + fatal: false + }); + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error("Playhead still not moving while enough data buffered @" + currentTime + " after " + config.nudgeMaxRetry + " nudges"); + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].BUFFER_STALLED_ERROR, + fatal: true + }); + } + }; + + return GapController; +}(); + + + +/***/ }), + +/***/ "./src/controller/id3-track-controller.ts": +/*!************************************************!*\ + !*** ./src/controller/id3-track-controller.ts ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/texttrack-utils */ "./src/utils/texttrack-utils.ts"); +/* harmony import */ var _demux_id3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../demux/id3 */ "./src/demux/id3.ts"); + + + +var MIN_CUE_DURATION = 0.25; + +var ID3TrackController = /*#__PURE__*/function () { + function ID3TrackController(hls) { + this.hls = void 0; + this.id3Track = null; + this.media = null; + this.hls = hls; + + this._registerListeners(); + } + + var _proto = ID3TrackController.prototype; + + _proto.destroy = function destroy() { + this._unregisterListeners(); + }; + + _proto._registerListeners = function _registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FRAG_PARSING_METADATA, this.onFragParsingMetadata, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_FLUSHING, this.onBufferFlushing, this); + }; + + _proto._unregisterListeners = function _unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FRAG_PARSING_METADATA, this.onFragParsingMetadata, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_FLUSHING, this.onBufferFlushing, this); + } // Add ID3 metatadata text track. + ; + + _proto.onMediaAttached = function onMediaAttached(event, data) { + this.media = data.media; + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + if (!this.id3Track) { + return; + } + + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_1__["clearCurrentCues"])(this.id3Track); + this.id3Track = null; + this.media = null; + }; + + _proto.getID3Track = function getID3Track(textTracks) { + if (!this.media) { + return; + } + + for (var i = 0; i < textTracks.length; i++) { + var textTrack = textTracks[i]; + + if (textTrack.kind === 'metadata' && textTrack.label === 'id3') { + // send 'addtrack' when reusing the textTrack for metadata, + // same as what we do for captions + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_1__["sendAddTrackEvent"])(textTrack, this.media); + return textTrack; + } + } + + return this.media.addTextTrack('metadata', 'id3'); + }; + + _proto.onFragParsingMetadata = function onFragParsingMetadata(event, data) { + if (!this.media) { + return; + } + + var fragment = data.frag; + var samples = data.samples; // create track dynamically + + if (!this.id3Track) { + this.id3Track = this.getID3Track(this.media.textTracks); + this.id3Track.mode = 'hidden'; + } // Attempt to recreate Safari functionality by creating + // WebKitDataCue objects when available and store the decoded + // ID3 data in the value property of the cue + + + var Cue = self.WebKitDataCue || self.VTTCue || self.TextTrackCue; + + for (var i = 0; i < samples.length; i++) { + var frames = _demux_id3__WEBPACK_IMPORTED_MODULE_2__["getID3Frames"](samples[i].data); + + if (frames) { + var startTime = samples[i].pts; + var endTime = i < samples.length - 1 ? samples[i + 1].pts : fragment.end; + var timeDiff = endTime - startTime; + + if (timeDiff <= 0) { + endTime = startTime + MIN_CUE_DURATION; + } + + for (var j = 0; j < frames.length; j++) { + var frame = frames[j]; // Safari doesn't put the timestamp frame in the TextTrack + + if (!_demux_id3__WEBPACK_IMPORTED_MODULE_2__["isTimeStampFrame"](frame)) { + var cue = new Cue(startTime, endTime, ''); + cue.value = frame; + this.id3Track.addCue(cue); + } + } + } + } + }; + + _proto.onBufferFlushing = function onBufferFlushing(event, _ref) { + var startOffset = _ref.startOffset, + endOffset = _ref.endOffset, + type = _ref.type; + + if (!type || type === 'audio') { + // id3 cues come from parsed audio only remove cues when audio buffer is cleared + var id3Track = this.id3Track; + + if (id3Track) { + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_1__["removeCuesInRange"])(id3Track, startOffset, endOffset); + } + } + }; + + return ID3TrackController; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (ID3TrackController); + +/***/ }), + +/***/ "./src/controller/latency-controller.ts": +/*!**********************************************!*\ + !*** ./src/controller/latency-controller.ts ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LatencyController; }); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + + + + + +var LatencyController = /*#__PURE__*/function () { + function LatencyController(hls) { + var _this = this; + + this.hls = void 0; + this.config = void 0; + this.media = null; + this.levelDetails = null; + this.currentTime = 0; + this.stallCount = 0; + this._latency = null; + + this.timeupdateHandler = function () { + return _this.timeupdate(); + }; + + this.hls = hls; + this.config = hls.config; + this.registerListeners(); + } + + var _proto = LatencyController.prototype; + + _proto.destroy = function destroy() { + this.unregisterListeners(); + this.onMediaDetaching(); + this.levelDetails = null; // @ts-ignore + + this.hls = this.timeupdateHandler = null; + }; + + _proto.registerListeners = function registerListeners() { + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_UPDATED, this.onLevelUpdated, this); + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, this.onError, this); + }; + + _proto.unregisterListeners = function unregisterListeners() { + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_ATTACHED, this.onMediaAttached); + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_DETACHING, this.onMediaDetaching); + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADING, this.onManifestLoading); + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_UPDATED, this.onLevelUpdated); + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, this.onError); + }; + + _proto.onMediaAttached = function onMediaAttached(event, data) { + this.media = data.media; + this.media.addEventListener('timeupdate', this.timeupdateHandler); + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + if (this.media) { + this.media.removeEventListener('timeupdate', this.timeupdateHandler); + this.media = null; + } + }; + + _proto.onManifestLoading = function onManifestLoading() { + this.levelDetails = null; + this._latency = null; + this.stallCount = 0; + }; + + _proto.onLevelUpdated = function onLevelUpdated(event, _ref) { + var details = _ref.details; + this.levelDetails = details; + + if (details.advanced) { + this.timeupdate(); + } + + if (!details.live && this.media) { + this.media.removeEventListener('timeupdate', this.timeupdateHandler); + } + }; + + _proto.onError = function onError(event, data) { + if (data.details !== _errors__WEBPACK_IMPORTED_MODULE_0__["ErrorDetails"].BUFFER_STALLED_ERROR) { + return; + } + + this.stallCount++; + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('[playback-rate-controller]: Stall detected, adjusting target latency'); + }; + + _proto.timeupdate = function timeupdate() { + var media = this.media, + levelDetails = this.levelDetails; + + if (!media || !levelDetails) { + return; + } + + this.currentTime = media.currentTime; + var latency = this.computeLatency(); + + if (latency === null) { + return; + } + + this._latency = latency; // Adapt playbackRate to meet target latency in low-latency mode + + var _this$config = this.config, + lowLatencyMode = _this$config.lowLatencyMode, + maxLiveSyncPlaybackRate = _this$config.maxLiveSyncPlaybackRate; + + if (!lowLatencyMode || maxLiveSyncPlaybackRate === 1) { + return; + } + + var targetLatency = this.targetLatency; + + if (targetLatency === null) { + return; + } + + var distanceFromTarget = latency - targetLatency; // Only adjust playbackRate when within one target duration of targetLatency + // and more than one second from under-buffering. + // Playback further than one target duration from target can be considered DVR playback. + + var liveMinLatencyDuration = Math.min(this.maxLatency, targetLatency + levelDetails.targetduration); + var inLiveRange = distanceFromTarget < liveMinLatencyDuration; + + if (levelDetails.live && inLiveRange && distanceFromTarget > 0.05 && this.forwardBufferLength > 1) { + var max = Math.min(2, Math.max(1.0, maxLiveSyncPlaybackRate)); + var rate = Math.round(2 / (1 + Math.exp(-0.75 * distanceFromTarget - this.edgeStalled)) * 20) / 20; + media.playbackRate = Math.min(max, Math.max(1, rate)); + } else if (media.playbackRate !== 1 && media.playbackRate !== 0) { + media.playbackRate = 1; + } + }; + + _proto.estimateLiveEdge = function estimateLiveEdge() { + var levelDetails = this.levelDetails; + + if (levelDetails === null) { + return null; + } + + return levelDetails.edge + levelDetails.age; + }; + + _proto.computeLatency = function computeLatency() { + var liveEdge = this.estimateLiveEdge(); + + if (liveEdge === null) { + return null; + } + + return liveEdge - this.currentTime; + }; + + _createClass(LatencyController, [{ + key: "latency", + get: function get() { + return this._latency || 0; + } + }, { + key: "maxLatency", + get: function get() { + var config = this.config, + levelDetails = this.levelDetails; + + if (config.liveMaxLatencyDuration !== undefined) { + return config.liveMaxLatencyDuration; + } + + return levelDetails ? config.liveMaxLatencyDurationCount * levelDetails.targetduration : 0; + } + }, { + key: "targetLatency", + get: function get() { + var levelDetails = this.levelDetails; + + if (levelDetails === null) { + return null; + } + + var holdBack = levelDetails.holdBack, + partHoldBack = levelDetails.partHoldBack, + targetduration = levelDetails.targetduration; + var _this$config2 = this.config, + liveSyncDuration = _this$config2.liveSyncDuration, + liveSyncDurationCount = _this$config2.liveSyncDurationCount, + lowLatencyMode = _this$config2.lowLatencyMode; + var userConfig = this.hls.userConfig; + var targetLatency = lowLatencyMode ? partHoldBack || holdBack : holdBack; + + if (userConfig.liveSyncDuration || userConfig.liveSyncDurationCount || targetLatency === 0) { + targetLatency = liveSyncDuration !== undefined ? liveSyncDuration : liveSyncDurationCount * targetduration; + } + + var maxLiveSyncOnStallIncrease = targetduration; + var liveSyncOnStallIncrease = 1.0; + return targetLatency + Math.min(this.stallCount * liveSyncOnStallIncrease, maxLiveSyncOnStallIncrease); + } + }, { + key: "liveSyncPosition", + get: function get() { + var liveEdge = this.estimateLiveEdge(); + var targetLatency = this.targetLatency; + var levelDetails = this.levelDetails; + + if (liveEdge === null || targetLatency === null || levelDetails === null) { + return null; + } + + var edge = levelDetails.edge; + var syncPosition = liveEdge - targetLatency - this.edgeStalled; + var min = edge - levelDetails.totalduration; + var max = edge - (this.config.lowLatencyMode && levelDetails.partTarget || levelDetails.targetduration); + return Math.min(Math.max(min, syncPosition), max); + } + }, { + key: "drift", + get: function get() { + var levelDetails = this.levelDetails; + + if (levelDetails === null) { + return 1; + } + + return levelDetails.drift; + } + }, { + key: "edgeStalled", + get: function get() { + var levelDetails = this.levelDetails; + + if (levelDetails === null) { + return 0; + } + + var maxLevelUpdateAge = (this.config.lowLatencyMode && levelDetails.partTarget || levelDetails.targetduration) * 3; + return Math.max(levelDetails.age - maxLevelUpdateAge, 0); + } + }, { + key: "forwardBufferLength", + get: function get() { + var media = this.media, + levelDetails = this.levelDetails; + + if (!media || !levelDetails) { + return 0; + } + + var bufferedRanges = media.buffered.length; + return bufferedRanges ? media.buffered.end(bufferedRanges - 1) : levelDetails.edge - this.currentTime; + } + }]); + + return LatencyController; +}(); + + + +/***/ }), + +/***/ "./src/controller/level-controller.ts": +/*!********************************************!*\ + !*** ./src/controller/level-controller.ts ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LevelController; }); +/* harmony import */ var _types_level__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types/level */ "./src/types/level.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_codecs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/codecs */ "./src/utils/codecs.ts"); +/* harmony import */ var _level_helper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./level-helper */ "./src/controller/level-helper.ts"); +/* harmony import */ var _base_playlist_controller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base-playlist-controller */ "./src/controller/base-playlist-controller.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +/* + * Level Controller + */ + + + + + + + +var chromeOrFirefox = /chrome|firefox/.test(navigator.userAgent.toLowerCase()); + +var LevelController = /*#__PURE__*/function (_BasePlaylistControll) { + _inheritsLoose(LevelController, _BasePlaylistControll); + + function LevelController(hls) { + var _this; + + _this = _BasePlaylistControll.call(this, hls, '[level-controller]') || this; + _this._levels = []; + _this._firstLevel = -1; + _this._startLevel = void 0; + _this.currentLevelIndex = -1; + _this.manualLevelIndex = -1; + _this.onParsedComplete = void 0; + + _this._registerListeners(); + + return _this; + } + + var _proto = LevelController.prototype; + + _proto._registerListeners = function _registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADED, this.onManifestLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_LOADED, this.onFragLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, this.onError, this); + }; + + _proto._unregisterListeners = function _unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADED, this.onManifestLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_LOADED, this.onFragLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, this.onError, this); + }; + + _proto.destroy = function destroy() { + this._unregisterListeners(); + + this.manualLevelIndex = -1; + this._levels.length = 0; + + _BasePlaylistControll.prototype.destroy.call(this); + }; + + _proto.startLoad = function startLoad() { + var levels = this._levels; // clean up live level details to force reload them, and reset load errors + + levels.forEach(function (level) { + level.loadError = 0; + }); + + _BasePlaylistControll.prototype.startLoad.call(this); + }; + + _proto.onManifestLoaded = function onManifestLoaded(event, data) { + var levels = []; + var audioTracks = []; + var subtitleTracks = []; + var bitrateStart; + var levelSet = {}; + var levelFromSet; + var resolutionFound = false; + var videoCodecFound = false; + var audioCodecFound = false; // regroup redundant levels together + + data.levels.forEach(function (levelParsed) { + var attributes = levelParsed.attrs; + resolutionFound = resolutionFound || !!(levelParsed.width && levelParsed.height); + videoCodecFound = videoCodecFound || !!levelParsed.videoCodec; + audioCodecFound = audioCodecFound || !!levelParsed.audioCodec; // erase audio codec info if browser does not support mp4a.40.34. + // demuxer will autodetect codec and fallback to mpeg/audio + + if (chromeOrFirefox && levelParsed.audioCodec && levelParsed.audioCodec.indexOf('mp4a.40.34') !== -1) { + levelParsed.audioCodec = undefined; + } + + var levelKey = levelParsed.bitrate + "-" + levelParsed.attrs.RESOLUTION + "-" + levelParsed.attrs.CODECS; + levelFromSet = levelSet[levelKey]; + + if (!levelFromSet) { + levelFromSet = new _types_level__WEBPACK_IMPORTED_MODULE_0__["Level"](levelParsed); + levelSet[levelKey] = levelFromSet; + levels.push(levelFromSet); + } else { + levelFromSet.url.push(levelParsed.url); + } + + if (attributes) { + if (attributes.AUDIO) { + Object(_level_helper__WEBPACK_IMPORTED_MODULE_4__["addGroupId"])(levelFromSet, 'audio', attributes.AUDIO); + } + + if (attributes.SUBTITLES) { + Object(_level_helper__WEBPACK_IMPORTED_MODULE_4__["addGroupId"])(levelFromSet, 'text', attributes.SUBTITLES); + } + } + }); // remove audio-only level if we also have levels with video codecs or RESOLUTION signalled + + if ((resolutionFound || videoCodecFound) && audioCodecFound) { + levels = levels.filter(function (_ref) { + var videoCodec = _ref.videoCodec, + width = _ref.width, + height = _ref.height; + return !!videoCodec || !!(width && height); + }); + } // only keep levels with supported audio/video codecs + + + levels = levels.filter(function (_ref2) { + var audioCodec = _ref2.audioCodec, + videoCodec = _ref2.videoCodec; + return (!audioCodec || Object(_utils_codecs__WEBPACK_IMPORTED_MODULE_3__["isCodecSupportedInMp4"])(audioCodec, 'audio')) && (!videoCodec || Object(_utils_codecs__WEBPACK_IMPORTED_MODULE_3__["isCodecSupportedInMp4"])(videoCodec, 'video')); + }); + + if (data.audioTracks) { + audioTracks = data.audioTracks.filter(function (track) { + return !track.audioCodec || Object(_utils_codecs__WEBPACK_IMPORTED_MODULE_3__["isCodecSupportedInMp4"])(track.audioCodec, 'audio'); + }); // Assign ids after filtering as array indices by group-id + + Object(_level_helper__WEBPACK_IMPORTED_MODULE_4__["assignTrackIdsByGroup"])(audioTracks); + } + + if (data.subtitles) { + subtitleTracks = data.subtitles; + Object(_level_helper__WEBPACK_IMPORTED_MODULE_4__["assignTrackIdsByGroup"])(subtitleTracks); + } + + if (levels.length > 0) { + // start bitrate is the first bitrate of the manifest + bitrateStart = levels[0].bitrate; // sort level on bitrate + + levels.sort(function (a, b) { + return a.bitrate - b.bitrate; + }); + this._levels = levels; // find index of first level in sorted levels + + for (var i = 0; i < levels.length; i++) { + if (levels[i].bitrate === bitrateStart) { + this._firstLevel = i; + this.log("manifest loaded, " + levels.length + " level(s) found, first bitrate: " + bitrateStart); + break; + } + } // Audio is only alternate if manifest include a URI along with the audio group tag, + // and this is not an audio-only stream where levels contain audio-only + + + var audioOnly = audioCodecFound && !videoCodecFound; + var edata = { + levels: levels, + audioTracks: audioTracks, + subtitleTracks: subtitleTracks, + firstLevel: this._firstLevel, + stats: data.stats, + audio: audioCodecFound, + video: videoCodecFound, + altAudio: !audioOnly && audioTracks.some(function (t) { + return !!t.url; + }) + }; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_PARSED, edata); // Initiate loading after all controllers have received MANIFEST_PARSED + + if (this.hls.config.autoStartLoad || this.hls.forceStartLoad) { + this.hls.startLoad(this.hls.config.startPosition); + } + } else { + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].MANIFEST_INCOMPATIBLE_CODECS_ERROR, + fatal: true, + url: data.url, + reason: 'no level with compatible codecs found in manifest' + }); + } + }; + + _proto.onError = function onError(event, data) { + _BasePlaylistControll.prototype.onError.call(this, event, data); + + if (data.fatal) { + return; + } // Switch to redundant level when track fails to load + + + var context = data.context; + var level = this._levels[this.currentLevelIndex]; + + if (context && (context.type === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].AUDIO_TRACK && level.audioGroupIds && context.groupId === level.audioGroupIds[level.urlId] || context.type === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].SUBTITLE_TRACK && level.textGroupIds && context.groupId === level.textGroupIds[level.urlId])) { + this.redundantFailover(this.currentLevelIndex); + return; + } + + var levelError = false; + var levelSwitch = true; + var levelIndex; // try to recover not fatal errors + + switch (data.details) { + case _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].FRAG_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].FRAG_LOAD_TIMEOUT: + case _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].KEY_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].KEY_LOAD_TIMEOUT: + if (data.frag) { + var _level = this._levels[data.frag.level]; // Set levelIndex when we're out of fragment retries + + if (_level) { + _level.fragmentError++; + + if (_level.fragmentError > this.hls.config.fragLoadingMaxRetry) { + levelIndex = data.frag.level; + } + } else { + levelIndex = data.frag.level; + } + } + + break; + + case _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].LEVEL_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].LEVEL_LOAD_TIMEOUT: + // Do not perform level switch if an error occurred using delivery directives + // Attempt to reload level without directives first + if (context) { + if (context.deliveryDirectives) { + levelSwitch = false; + } + + levelIndex = context.level; + } + + levelError = true; + break; + + case _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].REMUX_ALLOC_ERROR: + levelIndex = data.level; + levelError = true; + break; + } + + if (levelIndex !== undefined) { + this.recoverLevel(data, levelIndex, levelError, levelSwitch); + } + } + /** + * Switch to a redundant stream if any available. + * If redundant stream is not available, emergency switch down if ABR mode is enabled. + */ + ; + + _proto.recoverLevel = function recoverLevel(errorEvent, levelIndex, levelError, levelSwitch) { + var errorDetails = errorEvent.details; + var level = this._levels[levelIndex]; + level.loadError++; + + if (levelError) { + var retrying = this.retryLoadingOrFail(errorEvent); + + if (retrying) { + // boolean used to inform stream controller not to switch back to IDLE on non fatal error + errorEvent.levelRetry = true; + } else { + this.currentLevelIndex = -1; + return; + } + } + + if (levelSwitch) { + var redundantLevels = level.url.length; // Try redundant fail-over until level.loadError reaches redundantLevels + + if (redundantLevels > 1 && level.loadError < redundantLevels) { + errorEvent.levelRetry = true; + this.redundantFailover(levelIndex); + } else if (this.manualLevelIndex === -1) { + // Search for available level in auto level selection mode, cycling from highest to lowest bitrate + var nextLevel = levelIndex === 0 ? this._levels.length - 1 : levelIndex - 1; + + if (this.currentLevelIndex !== nextLevel && this._levels[nextLevel].loadError === 0) { + this.warn(errorDetails + ": switch to " + nextLevel); + errorEvent.levelRetry = true; + this.hls.nextAutoLevel = nextLevel; + } + } + } + }; + + _proto.redundantFailover = function redundantFailover(levelIndex) { + var level = this._levels[levelIndex]; + var redundantLevels = level.url.length; + + if (redundantLevels > 1) { + // Update the url id of all levels so that we stay on the same set of variants when level switching + var newUrlId = (level.urlId + 1) % redundantLevels; + this.warn("Switching to redundant URL-id " + newUrlId); + + this._levels.forEach(function (level) { + level.urlId = newUrlId; + }); + + this.level = levelIndex; + } + } // reset errors on the successful load of a fragment + ; + + _proto.onFragLoaded = function onFragLoaded(event, _ref3) { + var frag = _ref3.frag; + + if (frag !== undefined && frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN) { + var level = this._levels[frag.level]; + + if (level !== undefined) { + level.fragmentError = 0; + level.loadError = 0; + } + } + }; + + _proto.onLevelLoaded = function onLevelLoaded(event, data) { + var _data$deliveryDirecti2; + + var level = data.level, + details = data.details; + var curLevel = this._levels[level]; + + if (!curLevel) { + var _data$deliveryDirecti; + + this.warn("Invalid level index " + level); + + if ((_data$deliveryDirecti = data.deliveryDirectives) !== null && _data$deliveryDirecti !== void 0 && _data$deliveryDirecti.skip) { + details.deltaUpdateFailed = true; + } + + return; + } // only process level loaded events matching with expected level + + + if (level === this.currentLevelIndex) { + // reset level load error counter on successful level loaded only if there is no issues with fragments + if (curLevel.fragmentError === 0) { + curLevel.loadError = 0; + this.retryCount = 0; + } + + this.playlistLoaded(level, data, curLevel.details); + } else if ((_data$deliveryDirecti2 = data.deliveryDirectives) !== null && _data$deliveryDirecti2 !== void 0 && _data$deliveryDirecti2.skip) { + // received a delta playlist update that cannot be merged + details.deltaUpdateFailed = true; + } + }; + + _proto.onAudioTrackSwitched = function onAudioTrackSwitched(event, data) { + var currentLevel = this.hls.levels[this.currentLevelIndex]; + + if (!currentLevel) { + return; + } + + if (currentLevel.audioGroupIds) { + var urlId = -1; + var audioGroupId = this.hls.audioTracks[data.id].groupId; + + for (var i = 0; i < currentLevel.audioGroupIds.length; i++) { + if (currentLevel.audioGroupIds[i] === audioGroupId) { + urlId = i; + break; + } + } + + if (urlId !== currentLevel.urlId) { + currentLevel.urlId = urlId; + this.startLoad(); + } + } + }; + + _proto.loadPlaylist = function loadPlaylist(hlsUrlParameters) { + var level = this.currentLevelIndex; + var currentLevel = this._levels[level]; + + if (this.canLoad && currentLevel && currentLevel.url.length > 0) { + var id = currentLevel.urlId; + var url = currentLevel.url[id]; + + if (hlsUrlParameters) { + try { + url = hlsUrlParameters.addDirectives(url); + } catch (error) { + this.warn("Could not construct new URL with HLS Delivery Directives: " + error); + } + } + + this.log("Attempt loading level index " + level + (hlsUrlParameters ? ' at sn ' + hlsUrlParameters.msn + ' part ' + hlsUrlParameters.part : '') + " with URL-id " + id + " " + url); // console.log('Current audio track group ID:', this.hls.audioTracks[this.hls.audioTrack].groupId); + // console.log('New video quality level audio group id:', levelObject.attrs.AUDIO, level); + + this.clearTimer(); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_LOADING, { + url: url, + level: level, + id: id, + deliveryDirectives: hlsUrlParameters || null + }); + } + }; + + _proto.removeLevel = function removeLevel(levelIndex, urlId) { + var filterLevelAndGroupByIdIndex = function filterLevelAndGroupByIdIndex(url, id) { + return id !== urlId; + }; + + var levels = this._levels.filter(function (level, index) { + if (index !== levelIndex) { + return true; + } + + if (level.url.length > 1 && urlId !== undefined) { + level.url = level.url.filter(filterLevelAndGroupByIdIndex); + + if (level.audioGroupIds) { + level.audioGroupIds = level.audioGroupIds.filter(filterLevelAndGroupByIdIndex); + } + + if (level.textGroupIds) { + level.textGroupIds = level.textGroupIds.filter(filterLevelAndGroupByIdIndex); + } + + level.urlId = 0; + return true; + } + + return false; + }).map(function (level, index) { + var details = level.details; + + if (details !== null && details !== void 0 && details.fragments) { + details.fragments.forEach(function (fragment) { + fragment.level = index; + }); + } + + return level; + }); + + this._levels = levels; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVELS_UPDATED, { + levels: levels + }); + }; + + _createClass(LevelController, [{ + key: "levels", + get: function get() { + if (this._levels.length === 0) { + return null; + } + + return this._levels; + } + }, { + key: "level", + get: function get() { + return this.currentLevelIndex; + }, + set: function set(newLevel) { + var _levels$newLevel; + + var levels = this._levels; + + if (levels.length === 0) { + return; + } + + if (this.currentLevelIndex === newLevel && (_levels$newLevel = levels[newLevel]) !== null && _levels$newLevel !== void 0 && _levels$newLevel.details) { + return; + } // check if level idx is valid + + + if (newLevel < 0 || newLevel >= levels.length) { + // invalid level id given, trigger error + var fatal = newLevel < 0; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorTypes"].OTHER_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].LEVEL_SWITCH_ERROR, + level: newLevel, + fatal: fatal, + reason: 'invalid level idx' + }); + + if (fatal) { + return; + } + + newLevel = Math.min(newLevel, levels.length - 1); + } // stopping live reloading timer if any + + + this.clearTimer(); + var lastLevelIndex = this.currentLevelIndex; + var lastLevel = levels[lastLevelIndex]; + var level = levels[newLevel]; + this.log("switching to level " + newLevel + " from " + lastLevelIndex); + this.currentLevelIndex = newLevel; + + var levelSwitchingData = _extends({}, level, { + level: newLevel, + maxBitrate: level.maxBitrate, + uri: level.uri, + urlId: level.urlId + }); // @ts-ignore + + + delete levelSwitchingData._urlId; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_SWITCHING, levelSwitchingData); // check if we need to load playlist for this level + + var levelDetails = level.details; + + if (!levelDetails || levelDetails.live) { + // level not retrieved yet, or live playlist we need to (re)load it + var hlsUrlParameters = this.switchParams(level.uri, lastLevel === null || lastLevel === void 0 ? void 0 : lastLevel.details); + this.loadPlaylist(hlsUrlParameters); + } + } + }, { + key: "manualLevel", + get: function get() { + return this.manualLevelIndex; + }, + set: function set(newLevel) { + this.manualLevelIndex = newLevel; + + if (this._startLevel === undefined) { + this._startLevel = newLevel; + } + + if (newLevel !== -1) { + this.level = newLevel; + } + } + }, { + key: "firstLevel", + get: function get() { + return this._firstLevel; + }, + set: function set(newLevel) { + this._firstLevel = newLevel; + } + }, { + key: "startLevel", + get: function get() { + // hls.startLevel takes precedence over config.startLevel + // if none of these values are defined, fallback on this._firstLevel (first quality level appearing in variant manifest) + if (this._startLevel === undefined) { + var configStartLevel = this.hls.config.startLevel; + + if (configStartLevel !== undefined) { + return configStartLevel; + } else { + return this._firstLevel; + } + } else { + return this._startLevel; + } + }, + set: function set(newLevel) { + this._startLevel = newLevel; + } + }, { + key: "nextLoadLevel", + get: function get() { + if (this.manualLevelIndex !== -1) { + return this.manualLevelIndex; + } else { + return this.hls.nextAutoLevel; + } + }, + set: function set(nextLevel) { + this.level = nextLevel; + + if (this.manualLevelIndex === -1) { + this.hls.nextAutoLevel = nextLevel; + } + } + }]); + + return LevelController; +}(_base_playlist_controller__WEBPACK_IMPORTED_MODULE_5__["default"]); + + + +/***/ }), + +/***/ "./src/controller/level-helper.ts": +/*!****************************************!*\ + !*** ./src/controller/level-helper.ts ***! + \****************************************/ +/*! exports provided: addGroupId, assignTrackIdsByGroup, updatePTS, updateFragPTSDTS, mergeDetails, mapPartIntersection, mapFragmentIntersection, adjustSliding, addSliding, computeReloadInterval, getFragmentWithSN, getPartWith */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addGroupId", function() { return addGroupId; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assignTrackIdsByGroup", function() { return assignTrackIdsByGroup; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updatePTS", function() { return updatePTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateFragPTSDTS", function() { return updateFragPTSDTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeDetails", function() { return mergeDetails; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapPartIntersection", function() { return mapPartIntersection; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapFragmentIntersection", function() { return mapFragmentIntersection; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "adjustSliding", function() { return adjustSliding; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSliding", function() { return addSliding; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeReloadInterval", function() { return computeReloadInterval; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFragmentWithSN", function() { return getFragmentWithSN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPartWith", function() { return getPartWith; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + + + + + +/** + * @module LevelHelper + * Providing methods dealing with playlist sliding and drift + * */ + +function addGroupId(level, type, id) { + switch (type) { + case 'audio': + if (!level.audioGroupIds) { + level.audioGroupIds = []; + } + + level.audioGroupIds.push(id); + break; + + case 'text': + if (!level.textGroupIds) { + level.textGroupIds = []; + } + + level.textGroupIds.push(id); + break; + } +} +function assignTrackIdsByGroup(tracks) { + var groups = {}; + tracks.forEach(function (track) { + var groupId = track.groupId || ''; + track.id = groups[groupId] = groups[groupId] || 0; + groups[groupId]++; + }); +} +function updatePTS(fragments, fromIdx, toIdx) { + var fragFrom = fragments[fromIdx]; + var fragTo = fragments[toIdx]; + updateFromToPTS(fragFrom, fragTo); +} + +function updateFromToPTS(fragFrom, fragTo) { + var fragToPTS = fragTo.startPTS; // if we know startPTS[toIdx] + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(fragToPTS)) { + // update fragment duration. + // it helps to fix drifts between playlist reported duration and fragment real duration + var duration = 0; + var frag; + + if (fragTo.sn > fragFrom.sn) { + duration = fragToPTS - fragFrom.start; + frag = fragFrom; + } else { + duration = fragFrom.start - fragToPTS; + frag = fragTo; + } // TODO? Drift can go either way, or the playlist could be completely accurate + // console.assert(duration > 0, + // `duration of ${duration} computed for frag ${frag.sn}, level ${frag.level}, there should be some duration drift between playlist and fragment!`); + + + if (frag.duration !== duration) { + frag.duration = duration; + } // we dont know startPTS[toIdx] + + } else if (fragTo.sn > fragFrom.sn) { + var contiguous = fragFrom.cc === fragTo.cc; // TODO: With part-loading end/durations we need to confirm the whole fragment is loaded before using (or setting) minEndPTS + + if (contiguous && fragFrom.minEndPTS) { + fragTo.start = fragFrom.start + (fragFrom.minEndPTS - fragFrom.start); + } else { + fragTo.start = fragFrom.start + fragFrom.duration; + } + } else { + fragTo.start = Math.max(fragFrom.start - fragTo.duration, 0); + } +} + +function updateFragPTSDTS(details, frag, startPTS, endPTS, startDTS, endDTS) { + var parsedMediaDuration = endPTS - startPTS; + + if (parsedMediaDuration <= 0) { + _utils_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].warn('Fragment should have a positive duration', frag); + endPTS = startPTS + frag.duration; + endDTS = startDTS + frag.duration; + } + + var maxStartPTS = startPTS; + var minEndPTS = endPTS; + var fragStartPts = frag.startPTS; + var fragEndPts = frag.endPTS; + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(fragStartPts)) { + // delta PTS between audio and video + var deltaPTS = Math.abs(fragStartPts - startPTS); + + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(frag.deltaPTS)) { + frag.deltaPTS = deltaPTS; + } else { + frag.deltaPTS = Math.max(deltaPTS, frag.deltaPTS); + } + + maxStartPTS = Math.max(startPTS, fragStartPts); + startPTS = Math.min(startPTS, fragStartPts); + startDTS = Math.min(startDTS, frag.startDTS); + minEndPTS = Math.min(endPTS, fragEndPts); + endPTS = Math.max(endPTS, fragEndPts); + endDTS = Math.max(endDTS, frag.endDTS); + } + + frag.duration = endPTS - startPTS; + var drift = startPTS - frag.start; + frag.appendedPTS = endPTS; + frag.start = frag.startPTS = startPTS; + frag.maxStartPTS = maxStartPTS; + frag.startDTS = startDTS; + frag.endPTS = endPTS; + frag.minEndPTS = minEndPTS; + frag.endDTS = endDTS; + var sn = frag.sn; // 'initSegment' + // exit if sn out of range + + if (!details || sn < details.startSN || sn > details.endSN) { + return 0; + } + + var i; + var fragIdx = sn - details.startSN; + var fragments = details.fragments; // update frag reference in fragments array + // rationale is that fragments array might not contain this frag object. + // this will happen if playlist has been refreshed between frag loading and call to updateFragPTSDTS() + // if we don't update frag, we won't be able to propagate PTS info on the playlist + // resulting in invalid sliding computation + + fragments[fragIdx] = frag; // adjust fragment PTS/duration from seqnum-1 to frag 0 + + for (i = fragIdx; i > 0; i--) { + updateFromToPTS(fragments[i], fragments[i - 1]); + } // adjust fragment PTS/duration from seqnum to last frag + + + for (i = fragIdx; i < fragments.length - 1; i++) { + updateFromToPTS(fragments[i], fragments[i + 1]); + } + + if (details.fragmentHint) { + updateFromToPTS(fragments[fragments.length - 1], details.fragmentHint); + } + + details.PTSKnown = details.alignedSliding = true; + return drift; +} +function mergeDetails(oldDetails, newDetails) { + // Track the last initSegment processed. Initialize it to the last one on the timeline. + var currentInitSegment = null; + var oldFragments = oldDetails.fragments; + + for (var i = oldFragments.length - 1; i >= 0; i--) { + var oldInit = oldFragments[i].initSegment; + + if (oldInit) { + currentInitSegment = oldInit; + break; + } + } + + if (oldDetails.fragmentHint) { + // prevent PTS and duration from being adjusted on the next hint + delete oldDetails.fragmentHint.endPTS; + } // check if old/new playlists have fragments in common + // loop through overlapping SN and update startPTS , cc, and duration if any found + + + var ccOffset = 0; + var PTSFrag; + mapFragmentIntersection(oldDetails, newDetails, function (oldFrag, newFrag) { + var _currentInitSegment; + + if (oldFrag.relurl) { + // Do not compare CC if the old fragment has no url. This is a level.fragmentHint used by LL-HLS parts. + // It maybe be off by 1 if it was created before any parts or discontinuity tags were appended to the end + // of the playlist. + ccOffset = oldFrag.cc - newFrag.cc; + } + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(oldFrag.startPTS) && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(oldFrag.endPTS)) { + newFrag.start = newFrag.startPTS = oldFrag.startPTS; + newFrag.startDTS = oldFrag.startDTS; + newFrag.appendedPTS = oldFrag.appendedPTS; + newFrag.maxStartPTS = oldFrag.maxStartPTS; + newFrag.endPTS = oldFrag.endPTS; + newFrag.endDTS = oldFrag.endDTS; + newFrag.minEndPTS = oldFrag.minEndPTS; + newFrag.duration = oldFrag.endPTS - oldFrag.startPTS; + + if (newFrag.duration) { + PTSFrag = newFrag; + } // PTS is known when any segment has startPTS and endPTS + + + newDetails.PTSKnown = newDetails.alignedSliding = true; + } + + newFrag.elementaryStreams = oldFrag.elementaryStreams; + newFrag.loader = oldFrag.loader; + newFrag.stats = oldFrag.stats; + newFrag.urlId = oldFrag.urlId; + + if (oldFrag.initSegment) { + newFrag.initSegment = oldFrag.initSegment; + currentInitSegment = oldFrag.initSegment; + } else if (!newFrag.initSegment || newFrag.initSegment.relurl == ((_currentInitSegment = currentInitSegment) === null || _currentInitSegment === void 0 ? void 0 : _currentInitSegment.relurl)) { + newFrag.initSegment = currentInitSegment; + } + }); + + if (newDetails.skippedSegments) { + newDetails.deltaUpdateFailed = newDetails.fragments.some(function (frag) { + return !frag; + }); + + if (newDetails.deltaUpdateFailed) { + _utils_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].warn('[level-helper] Previous playlist missing segments skipped in delta playlist'); + + for (var _i = newDetails.skippedSegments; _i--;) { + newDetails.fragments.shift(); + } + + newDetails.startSN = newDetails.fragments[0].sn; + newDetails.startCC = newDetails.fragments[0].cc; + } + } + + var newFragments = newDetails.fragments; + + if (ccOffset) { + _utils_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].warn('discontinuity sliding from playlist, take drift into account'); + + for (var _i2 = 0; _i2 < newFragments.length; _i2++) { + newFragments[_i2].cc += ccOffset; + } + } + + if (newDetails.skippedSegments) { + newDetails.startCC = newDetails.fragments[0].cc; + } // Merge parts + + + mapPartIntersection(oldDetails.partList, newDetails.partList, function (oldPart, newPart) { + newPart.elementaryStreams = oldPart.elementaryStreams; + newPart.stats = oldPart.stats; + }); // if at least one fragment contains PTS info, recompute PTS information for all fragments + + if (PTSFrag) { + updateFragPTSDTS(newDetails, PTSFrag, PTSFrag.startPTS, PTSFrag.endPTS, PTSFrag.startDTS, PTSFrag.endDTS); + } else { + // ensure that delta is within oldFragments range + // also adjust sliding in case delta is 0 (we could have old=[50-60] and new=old=[50-61]) + // in that case we also need to adjust start offset of all fragments + adjustSliding(oldDetails, newDetails); + } + + if (newFragments.length) { + newDetails.totalduration = newDetails.edge - newFragments[0].start; + } + + newDetails.driftStartTime = oldDetails.driftStartTime; + newDetails.driftStart = oldDetails.driftStart; + var advancedDateTime = newDetails.advancedDateTime; + + if (newDetails.advanced && advancedDateTime) { + var edge = newDetails.edge; + + if (!newDetails.driftStart) { + newDetails.driftStartTime = advancedDateTime; + newDetails.driftStart = edge; + } + + newDetails.driftEndTime = advancedDateTime; + newDetails.driftEnd = edge; + } else { + newDetails.driftEndTime = oldDetails.driftEndTime; + newDetails.driftEnd = oldDetails.driftEnd; + newDetails.advancedDateTime = oldDetails.advancedDateTime; + } +} +function mapPartIntersection(oldParts, newParts, intersectionFn) { + if (oldParts && newParts) { + var delta = 0; + + for (var i = 0, len = oldParts.length; i <= len; i++) { + var _oldPart = oldParts[i]; + var _newPart = newParts[i + delta]; + + if (_oldPart && _newPart && _oldPart.index === _newPart.index && _oldPart.fragment.sn === _newPart.fragment.sn) { + intersectionFn(_oldPart, _newPart); + } else { + delta--; + } + } + } +} +function mapFragmentIntersection(oldDetails, newDetails, intersectionFn) { + var skippedSegments = newDetails.skippedSegments; + var start = Math.max(oldDetails.startSN, newDetails.startSN) - newDetails.startSN; + var end = (oldDetails.fragmentHint ? 1 : 0) + (skippedSegments ? newDetails.endSN : Math.min(oldDetails.endSN, newDetails.endSN)) - newDetails.startSN; + var delta = newDetails.startSN - oldDetails.startSN; + var newFrags = newDetails.fragmentHint ? newDetails.fragments.concat(newDetails.fragmentHint) : newDetails.fragments; + var oldFrags = oldDetails.fragmentHint ? oldDetails.fragments.concat(oldDetails.fragmentHint) : oldDetails.fragments; + + for (var i = start; i <= end; i++) { + var _oldFrag = oldFrags[delta + i]; + var _newFrag = newFrags[i]; + + if (skippedSegments && !_newFrag && i < skippedSegments) { + // Fill in skipped segments in delta playlist + _newFrag = newDetails.fragments[i] = _oldFrag; + } + + if (_oldFrag && _newFrag) { + intersectionFn(_oldFrag, _newFrag); + } + } +} +function adjustSliding(oldDetails, newDetails) { + var delta = newDetails.startSN + newDetails.skippedSegments - oldDetails.startSN; + var oldFragments = oldDetails.fragments; + + if (delta < 0 || delta >= oldFragments.length) { + return; + } + + addSliding(newDetails, oldFragments[delta].start); +} +function addSliding(details, start) { + if (start) { + var fragments = details.fragments; + + for (var i = details.skippedSegments; i < fragments.length; i++) { + fragments[i].start += start; + } + + if (details.fragmentHint) { + details.fragmentHint.start += start; + } + } +} +function computeReloadInterval(newDetails, stats) { + var reloadInterval = 1000 * newDetails.levelTargetDuration; + var reloadIntervalAfterMiss = reloadInterval / 2; + var timeSinceLastModified = newDetails.age; + var useLastModified = timeSinceLastModified > 0 && timeSinceLastModified < reloadInterval * 3; + var roundTrip = stats.loading.end - stats.loading.start; + var estimatedTimeUntilUpdate; + var availabilityDelay = newDetails.availabilityDelay; // let estimate = 'average'; + + if (newDetails.updated === false) { + if (useLastModified) { + // estimate = 'miss round trip'; + // We should have had a hit so try again in the time it takes to get a response, + // but no less than 1/3 second. + var minRetry = 333 * newDetails.misses; + estimatedTimeUntilUpdate = Math.max(Math.min(reloadIntervalAfterMiss, roundTrip * 2), minRetry); + newDetails.availabilityDelay = (newDetails.availabilityDelay || 0) + estimatedTimeUntilUpdate; + } else { + // estimate = 'miss half average'; + // follow HLS Spec, If the client reloads a Playlist file and finds that it has not + // changed then it MUST wait for a period of one-half the target + // duration before retrying. + estimatedTimeUntilUpdate = reloadIntervalAfterMiss; + } + } else if (useLastModified) { + // estimate = 'next modified date'; + // Get the closest we've been to timeSinceLastModified on update + availabilityDelay = Math.min(availabilityDelay || reloadInterval / 2, timeSinceLastModified); + newDetails.availabilityDelay = availabilityDelay; + estimatedTimeUntilUpdate = availabilityDelay + reloadInterval - timeSinceLastModified; + } else { + estimatedTimeUntilUpdate = reloadInterval - roundTrip; + } // console.log(`[computeReloadInterval] live reload ${newDetails.updated ? 'REFRESHED' : 'MISSED'}`, + // '\n method', estimate, + // '\n estimated time until update =>', estimatedTimeUntilUpdate, + // '\n average target duration', reloadInterval, + // '\n time since modified', timeSinceLastModified, + // '\n time round trip', roundTrip, + // '\n availability delay', availabilityDelay); + + + return Math.round(estimatedTimeUntilUpdate); +} +function getFragmentWithSN(level, sn, fragCurrent) { + if (!level || !level.details) { + return null; + } + + var levelDetails = level.details; + var fragment = levelDetails.fragments[sn - levelDetails.startSN]; + + if (fragment) { + return fragment; + } + + fragment = levelDetails.fragmentHint; + + if (fragment && fragment.sn === sn) { + return fragment; + } + + if (sn < levelDetails.startSN && fragCurrent && fragCurrent.sn === sn) { + return fragCurrent; + } + + return null; +} +function getPartWith(level, sn, partIndex) { + if (!level || !level.details) { + return null; + } + + var partList = level.details.partList; + + if (partList) { + for (var i = partList.length; i--;) { + var part = partList[i]; + + if (part.index === partIndex && part.fragment.sn === sn) { + return part; + } + } + } + + return null; +} + +/***/ }), + +/***/ "./src/controller/stream-controller.ts": +/*!*********************************************!*\ + !*** ./src/controller/stream-controller.ts ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StreamController; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base-stream-controller */ "./src/controller/base-stream-controller.ts"); +/* harmony import */ var _is_supported__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../is-supported */ "./src/is-supported.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/buffer-helper */ "./src/utils/buffer-helper.ts"); +/* harmony import */ var _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fragment-tracker */ "./src/controller/fragment-tracker.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +/* harmony import */ var _loader_fragment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../loader/fragment */ "./src/loader/fragment.ts"); +/* harmony import */ var _demux_transmuxer_interface__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../demux/transmuxer-interface */ "./src/demux/transmuxer-interface.ts"); +/* harmony import */ var _types_transmuxer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../types/transmuxer */ "./src/types/transmuxer.ts"); +/* harmony import */ var _gap_controller__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./gap-controller */ "./src/controller/gap-controller.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + + + + + + + + + + + + +var TICK_INTERVAL = 100; // how often to tick in ms + +var StreamController = /*#__PURE__*/function (_BaseStreamController) { + _inheritsLoose(StreamController, _BaseStreamController); + + function StreamController(hls, fragmentTracker) { + var _this; + + _this = _BaseStreamController.call(this, hls, fragmentTracker, '[stream-controller]') || this; + _this.audioCodecSwap = false; + _this.gapController = null; + _this.level = -1; + _this._forceStartLoad = false; + _this.altAudio = false; + _this.audioOnly = false; + _this.fragPlaying = null; + _this.onvplaying = null; + _this.onvseeked = null; + _this.fragLastKbps = 0; + _this.stalled = false; + _this.couldBacktrack = false; + _this.audioCodecSwitch = false; + _this.videoBuffer = null; + + _this._registerListeners(); + + return _this; + } + + var _proto = StreamController.prototype; + + _proto._registerListeners = function _registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].LEVEL_LOADING, this.onLevelLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].ERROR, this.onError, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_CREATED, this.onBufferCreated, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_FLUSHED, this.onBufferFlushed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].LEVELS_UPDATED, this.onLevelsUpdated, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_BUFFERED, this.onFragBuffered, this); + }; + + _proto._unregisterListeners = function _unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].ERROR, this.onError, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_CREATED, this.onBufferCreated, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_FLUSHED, this.onBufferFlushed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].LEVELS_UPDATED, this.onLevelsUpdated, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_BUFFERED, this.onFragBuffered, this); + }; + + _proto.onHandlerDestroying = function onHandlerDestroying() { + this._unregisterListeners(); + + this.onMediaDetaching(); + }; + + _proto.startLoad = function startLoad(startPosition) { + if (this.levels) { + var lastCurrentTime = this.lastCurrentTime, + hls = this.hls; + this.stopLoad(); + this.setInterval(TICK_INTERVAL); + this.level = -1; + this.fragLoadError = 0; + + if (!this.startFragRequested) { + // determine load level + var startLevel = hls.startLevel; + + if (startLevel === -1) { + if (hls.config.testBandwidth) { + // -1 : guess start Level by doing a bitrate test by loading first fragment of lowest quality level + startLevel = 0; + this.bitrateTest = true; + } else { + startLevel = hls.nextAutoLevel; + } + } // set new level to playlist loader : this will trigger start level load + // hls.nextLoadLevel remains until it is set to a new value or until a new frag is successfully loaded + + + this.level = hls.nextLoadLevel = startLevel; + this.loadedmetadata = false; + } // if startPosition undefined but lastCurrentTime set, set startPosition to last currentTime + + + if (lastCurrentTime > 0 && startPosition === -1) { + this.log("Override startPosition with lastCurrentTime @" + lastCurrentTime.toFixed(3)); + startPosition = lastCurrentTime; + } + + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + this.nextLoadPosition = this.startPosition = this.lastCurrentTime = startPosition; + this.tick(); + } else { + this._forceStartLoad = true; + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].STOPPED; + } + }; + + _proto.stopLoad = function stopLoad() { + this._forceStartLoad = false; + + _BaseStreamController.prototype.stopLoad.call(this); + }; + + _proto.doTick = function doTick() { + switch (this.state) { + case _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE: + this.doTickIdle(); + break; + + case _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_LEVEL: + { + var _levels$level; + + var levels = this.levels, + level = this.level; + var details = levels === null || levels === void 0 ? void 0 : (_levels$level = levels[level]) === null || _levels$level === void 0 ? void 0 : _levels$level.details; + + if (details && (!details.live || this.levelLastLoaded === this.level)) { + if (this.waitForCdnTuneIn(details)) { + break; + } + + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + break; + } + + break; + } + + case _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].FRAG_LOADING_WAITING_RETRY: + { + var _this$media; + + var now = self.performance.now(); + var retryDate = this.retryDate; // if current time is gt than retryDate, or if media seeking let's switch to IDLE state to retry loading + + if (!retryDate || now >= retryDate || (_this$media = this.media) !== null && _this$media !== void 0 && _this$media.seeking) { + this.log('retryDate reached, switch back to IDLE state'); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } + } + break; + + default: + break; + } // check buffer + // check/update current fragment + + + this.onTickEnd(); + }; + + _proto.onTickEnd = function onTickEnd() { + _BaseStreamController.prototype.onTickEnd.call(this); + + this.checkBuffer(); + this.checkFragmentChanged(); + }; + + _proto.doTickIdle = function doTickIdle() { + var _frag$decryptdata, _frag$decryptdata2; + + var hls = this.hls, + levelLastLoaded = this.levelLastLoaded, + levels = this.levels, + media = this.media; + var config = hls.config, + level = hls.nextLoadLevel; // if start level not parsed yet OR + // if video not attached AND start fragment already requested OR start frag prefetch not enabled + // exit loop, as we either need more info (level not parsed) or we need media to be attached to load new fragment + + if (levelLastLoaded === null || !media && (this.startFragRequested || !config.startFragPrefetch)) { + return; + } // If the "main" level is audio-only but we are loading an alternate track in the same group, do not load anything + + + if (this.altAudio && this.audioOnly) { + return; + } + + if (!levels || !levels[level]) { + return; + } + + var levelInfo = levels[level]; // if buffer length is less than maxBufLen try to load a new fragment + // set next load level : this will trigger a playlist load if needed + + this.level = hls.nextLoadLevel = level; + var levelDetails = levelInfo.details; // if level info not retrieved yet, switch state and wait for level retrieval + // if live playlist, ensure that new playlist has been refreshed to avoid loading/try to load + // a useless and outdated fragment (that might even introduce load error if it is already out of the live playlist) + + if (!levelDetails || this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_LEVEL || levelDetails.live && this.levelLastLoaded !== level) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_LEVEL; + return; + } + + var bufferInfo = this.getFwdBufferInfo(this.mediaBuffer ? this.mediaBuffer : media, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN); + + if (bufferInfo === null) { + return; + } + + var bufferLen = bufferInfo.len; // compute max Buffer Length that we could get from this load level, based on level bitrate. don't buffer more than 60 MB and more than 30s + + var maxBufLen = this.getMaxBufferLength(levelInfo.maxBitrate); // Stay idle if we are still with buffer margins + + if (bufferLen >= maxBufLen) { + return; + } + + if (this._streamEnded(bufferInfo, levelDetails)) { + var data = {}; + + if (this.altAudio) { + data.type = 'video'; + } + + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_EOS, data); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].ENDED; + return; + } + + var targetBufferTime = bufferInfo.end; + var frag = this.getNextFragment(targetBufferTime, levelDetails); // Avoid backtracking after seeking or switching by loading an earlier segment in streams that could backtrack + + if (this.couldBacktrack && !this.fragPrevious && frag && frag.sn !== 'initSegment') { + var fragIdx = frag.sn - levelDetails.startSN; + + if (fragIdx > 1) { + frag = levelDetails.fragments[fragIdx - 1]; + this.fragmentTracker.removeFragment(frag); + } + } // Avoid loop loading by using nextLoadPosition set for backtracking + + + if (frag && this.fragmentTracker.getState(frag) === _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__["FragmentState"].OK && this.nextLoadPosition > targetBufferTime) { + // Cleanup the fragment tracker before trying to find the next unbuffered fragment + var type = this.audioOnly && !this.altAudio ? _loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].AUDIO : _loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].VIDEO; + this.afterBufferFlushed(media, type, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN); + frag = this.getNextFragment(this.nextLoadPosition, levelDetails); + } + + if (!frag) { + return; + } + + if (frag.initSegment && !frag.initSegment.data && !this.bitrateTest) { + frag = frag.initSegment; + } // We want to load the key if we're dealing with an identity key, because we will decrypt + // this content using the key we fetch. Other keys will be handled by the DRM CDM via EME. + + + if (((_frag$decryptdata = frag.decryptdata) === null || _frag$decryptdata === void 0 ? void 0 : _frag$decryptdata.keyFormat) === 'identity' && !((_frag$decryptdata2 = frag.decryptdata) !== null && _frag$decryptdata2 !== void 0 && _frag$decryptdata2.key)) { + this.loadKey(frag, levelDetails); + } else { + this.loadFragment(frag, levelDetails, targetBufferTime); + } + }; + + _proto.loadFragment = function loadFragment(frag, levelDetails, targetBufferTime) { + var _this$media2; + + // Check if fragment is not loaded + var fragState = this.fragmentTracker.getState(frag); + this.fragCurrent = frag; // Use data from loaded backtracked fragment if available + + if (fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__["FragmentState"].BACKTRACKED) { + var data = this.fragmentTracker.getBacktrackData(frag); + + if (data) { + this._handleFragmentLoadProgress(data); + + this._handleFragmentLoadComplete(data); + + return; + } else { + fragState = _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__["FragmentState"].NOT_LOADED; + } + } + + if (fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__["FragmentState"].NOT_LOADED || fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__["FragmentState"].PARTIAL) { + if (frag.sn === 'initSegment') { + this._loadInitSegment(frag); + } else if (this.bitrateTest) { + frag.bitrateTest = true; + this.log("Fragment " + frag.sn + " of level " + frag.level + " is being downloaded to test bitrate and will not be buffered"); + + this._loadBitrateTestFrag(frag); + } else { + this.startFragRequested = true; + + _BaseStreamController.prototype.loadFragment.call(this, frag, levelDetails, targetBufferTime); + } + } else if (fragState === _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__["FragmentState"].APPENDING) { + // Lower the buffer size and try again + if (this.reduceMaxBufferLength(frag.duration)) { + this.fragmentTracker.removeFragment(frag); + } + } else if (((_this$media2 = this.media) === null || _this$media2 === void 0 ? void 0 : _this$media2.buffered.length) === 0) { + // Stop gap for bad tracker / buffer flush behavior + this.fragmentTracker.removeAllFragments(); + } + }; + + _proto.getAppendedFrag = function getAppendedFrag(position) { + var fragOrPart = this.fragmentTracker.getAppendedFrag(position, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN); + + if (fragOrPart && 'fragment' in fragOrPart) { + return fragOrPart.fragment; + } + + return fragOrPart; + }; + + _proto.getBufferedFrag = function getBufferedFrag(position) { + return this.fragmentTracker.getBufferedFrag(position, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN); + }; + + _proto.followingBufferedFrag = function followingBufferedFrag(frag) { + if (frag) { + // try to get range of next fragment (500ms after this range) + return this.getBufferedFrag(frag.end + 0.5); + } + + return null; + } + /* + on immediate level switch : + - pause playback if playing + - cancel any pending load request + - and trigger a buffer flush + */ + ; + + _proto.immediateLevelSwitch = function immediateLevelSwitch() { + this.abortCurrentFrag(); + this.flushMainBuffer(0, Number.POSITIVE_INFINITY); + } + /** + * try to switch ASAP without breaking video playback: + * in order to ensure smooth but quick level switching, + * we need to find the next flushable buffer range + * we should take into account new segment fetch time + */ + ; + + _proto.nextLevelSwitch = function nextLevelSwitch() { + var levels = this.levels, + media = this.media; // ensure that media is defined and that metadata are available (to retrieve currentTime) + + if (media !== null && media !== void 0 && media.readyState) { + var fetchdelay; + var fragPlayingCurrent = this.getAppendedFrag(media.currentTime); + + if (fragPlayingCurrent && fragPlayingCurrent.start > 1) { + // flush buffer preceding current fragment (flush until current fragment start offset) + // minus 1s to avoid video freezing, that could happen if we flush keyframe of current video ... + this.flushMainBuffer(0, fragPlayingCurrent.start - 1); + } + + if (!media.paused && levels) { + // add a safety delay of 1s + var nextLevelId = this.hls.nextLoadLevel; + var nextLevel = levels[nextLevelId]; + var fragLastKbps = this.fragLastKbps; + + if (fragLastKbps && this.fragCurrent) { + fetchdelay = this.fragCurrent.duration * nextLevel.maxBitrate / (1000 * fragLastKbps) + 1; + } else { + fetchdelay = 0; + } + } else { + fetchdelay = 0; + } // this.log('fetchdelay:'+fetchdelay); + // find buffer range that will be reached once new fragment will be fetched + + + var bufferedFrag = this.getBufferedFrag(media.currentTime + fetchdelay); + + if (bufferedFrag) { + // we can flush buffer range following this one without stalling playback + var nextBufferedFrag = this.followingBufferedFrag(bufferedFrag); + + if (nextBufferedFrag) { + // if we are here, we can also cancel any loading/demuxing in progress, as they are useless + this.abortCurrentFrag(); // start flush position is in next buffered frag. Leave some padding for non-independent segments and smoother playback. + + var maxStart = nextBufferedFrag.maxStartPTS ? nextBufferedFrag.maxStartPTS : nextBufferedFrag.start; + var fragDuration = nextBufferedFrag.duration; + var startPts = Math.max(bufferedFrag.end, maxStart + Math.min(Math.max(fragDuration - this.config.maxFragLookUpTolerance, fragDuration * 0.5), fragDuration * 0.75)); + this.flushMainBuffer(startPts, Number.POSITIVE_INFINITY); + } + } + } + }; + + _proto.abortCurrentFrag = function abortCurrentFrag() { + var fragCurrent = this.fragCurrent; + this.fragCurrent = null; + + if (fragCurrent !== null && fragCurrent !== void 0 && fragCurrent.loader) { + fragCurrent.loader.abort(); + } + + if (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].KEY_LOADING) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } + + this.nextLoadPosition = this.getLoadPosition(); + }; + + _proto.flushMainBuffer = function flushMainBuffer(startOffset, endOffset) { + _BaseStreamController.prototype.flushMainBuffer.call(this, startOffset, endOffset, this.altAudio ? 'video' : null); + }; + + _proto.onMediaAttached = function onMediaAttached(event, data) { + _BaseStreamController.prototype.onMediaAttached.call(this, event, data); + + var media = data.media; + this.onvplaying = this.onMediaPlaying.bind(this); + this.onvseeked = this.onMediaSeeked.bind(this); + media.addEventListener('playing', this.onvplaying); + media.addEventListener('seeked', this.onvseeked); + this.gapController = new _gap_controller__WEBPACK_IMPORTED_MODULE_10__["default"](this.config, media, this.fragmentTracker, this.hls); + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + var media = this.media; + + if (media) { + media.removeEventListener('playing', this.onvplaying); + media.removeEventListener('seeked', this.onvseeked); + this.onvplaying = this.onvseeked = null; + this.videoBuffer = null; + } + + this.fragPlaying = null; + + if (this.gapController) { + this.gapController.destroy(); + this.gapController = null; + } + + _BaseStreamController.prototype.onMediaDetaching.call(this); + }; + + _proto.onMediaPlaying = function onMediaPlaying() { + // tick to speed up FRAG_CHANGED triggering + this.tick(); + }; + + _proto.onMediaSeeked = function onMediaSeeked() { + var media = this.media; + var currentTime = media ? media.currentTime : null; + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(currentTime)) { + this.log("Media seeked to " + currentTime.toFixed(3)); + } // tick to speed up FRAG_CHANGED triggering + + + this.tick(); + }; + + _proto.onManifestLoading = function onManifestLoading() { + // reset buffer on manifest loading + this.log('Trigger BUFFER_RESET'); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_RESET, undefined); + this.fragmentTracker.removeAllFragments(); + this.couldBacktrack = this.stalled = false; + this.startPosition = this.lastCurrentTime = 0; + this.fragPlaying = null; + }; + + _proto.onManifestParsed = function onManifestParsed(event, data) { + var aac = false; + var heaac = false; + var codec; + data.levels.forEach(function (level) { + // detect if we have different kind of audio codecs used amongst playlists + codec = level.audioCodec; + + if (codec) { + if (codec.indexOf('mp4a.40.2') !== -1) { + aac = true; + } + + if (codec.indexOf('mp4a.40.5') !== -1) { + heaac = true; + } + } + }); + this.audioCodecSwitch = aac && heaac && !Object(_is_supported__WEBPACK_IMPORTED_MODULE_2__["changeTypeSupported"])(); + + if (this.audioCodecSwitch) { + this.log('Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC'); + } + + this.levels = data.levels; + this.startFragRequested = false; + }; + + _proto.onLevelLoading = function onLevelLoading(event, data) { + var levels = this.levels; + + if (!levels || this.state !== _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE) { + return; + } + + var level = levels[data.level]; + + if (!level.details || level.details.live && this.levelLastLoaded !== data.level || this.waitForCdnTuneIn(level.details)) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_LEVEL; + } + }; + + _proto.onLevelLoaded = function onLevelLoaded(event, data) { + var _curLevel$details; + + var levels = this.levels; + var newLevelId = data.level; + var newDetails = data.details; + var duration = newDetails.totalduration; + + if (!levels) { + this.warn("Levels were reset while loading level " + newLevelId); + return; + } + + this.log("Level " + newLevelId + " loaded [" + newDetails.startSN + "," + newDetails.endSN + "], cc [" + newDetails.startCC + ", " + newDetails.endCC + "] duration:" + duration); + var fragCurrent = this.fragCurrent; + + if (fragCurrent && (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].FRAG_LOADING || this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].FRAG_LOADING_WAITING_RETRY)) { + if (fragCurrent.level !== data.level && fragCurrent.loader) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + fragCurrent.loader.abort(); + } + } + + var curLevel = levels[newLevelId]; + var sliding = 0; + + if (newDetails.live || (_curLevel$details = curLevel.details) !== null && _curLevel$details !== void 0 && _curLevel$details.live) { + if (!newDetails.fragments[0]) { + newDetails.deltaUpdateFailed = true; + } + + if (newDetails.deltaUpdateFailed) { + return; + } + + sliding = this.alignPlaylists(newDetails, curLevel.details); + } // override level info + + + curLevel.details = newDetails; + this.levelLastLoaded = newLevelId; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].LEVEL_UPDATED, { + details: newDetails, + level: newLevelId + }); // only switch back to IDLE state if we were waiting for level to start downloading a new fragment + + if (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_LEVEL) { + if (this.waitForCdnTuneIn(newDetails)) { + // Wait for Low-Latency CDN Tune-in + return; + } + + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } + + if (!this.startFragRequested) { + this.setStartPosition(newDetails, sliding); + } else if (newDetails.live) { + this.synchronizeToLiveEdge(newDetails); + } // trigger handler right now + + + this.tick(); + }; + + _proto._handleFragmentLoadProgress = function _handleFragmentLoadProgress(data) { + var _frag$initSegment; + + var frag = data.frag, + part = data.part, + payload = data.payload; + var levels = this.levels; + + if (!levels) { + this.warn("Levels were reset while fragment load was in progress. Fragment " + frag.sn + " of level " + frag.level + " will not be buffered"); + return; + } + + var currentLevel = levels[frag.level]; + var details = currentLevel.details; + + if (!details) { + this.warn("Dropping fragment " + frag.sn + " of level " + frag.level + " after level details were reset"); + return; + } + + var videoCodec = currentLevel.videoCodec; // time Offset is accurate if level PTS is known, or if playlist is not sliding (not live) + + var accurateTimeOffset = details.PTSKnown || !details.live; + var initSegmentData = (_frag$initSegment = frag.initSegment) === null || _frag$initSegment === void 0 ? void 0 : _frag$initSegment.data; + + var audioCodec = this._getAudioCodec(currentLevel); // transmux the MPEG-TS data to ISO-BMFF segments + // this.log(`Transmuxing ${frag.sn} of [${details.startSN} ,${details.endSN}],level ${frag.level}, cc ${frag.cc}`); + + + var transmuxer = this.transmuxer = this.transmuxer || new _demux_transmuxer_interface__WEBPACK_IMPORTED_MODULE_8__["default"](this.hls, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN, this._handleTransmuxComplete.bind(this), this._handleTransmuxerFlush.bind(this)); + var partIndex = part ? part.index : -1; + var partial = partIndex !== -1; + var chunkMeta = new _types_transmuxer__WEBPACK_IMPORTED_MODULE_9__["ChunkMetadata"](frag.level, frag.sn, frag.stats.chunkCount, payload.byteLength, partIndex, partial); + var initPTS = this.initPTS[frag.cc]; + transmuxer.push(payload, initSegmentData, audioCodec, videoCodec, frag, part, details.totalduration, accurateTimeOffset, chunkMeta, initPTS); + }; + + _proto.onAudioTrackSwitching = function onAudioTrackSwitching(event, data) { + // if any URL found on new audio track, it is an alternate audio track + var fromAltAudio = this.altAudio; + var altAudio = !!data.url; + var trackId = data.id; // if we switch on main audio, ensure that main fragment scheduling is synced with media.buffered + // don't do anything if we switch to alt audio: audio stream controller is handling it. + // we will just have to change buffer scheduling on audioTrackSwitched + + if (!altAudio) { + if (this.mediaBuffer !== this.media) { + this.log('Switching on main audio, use media.buffered to schedule main fragment loading'); + this.mediaBuffer = this.media; + var fragCurrent = this.fragCurrent; // we need to refill audio buffer from main: cancel any frag loading to speed up audio switch + + if (fragCurrent !== null && fragCurrent !== void 0 && fragCurrent.loader) { + this.log('Switching to main audio track, cancel main fragment load'); + fragCurrent.loader.abort(); + } // destroy transmuxer to force init segment generation (following audio switch) + + + this.resetTransmuxer(); // switch to IDLE state to load new fragment + + this.resetLoadingState(); + } else if (this.audioOnly) { + // Reset audio transmuxer so when switching back to main audio we're not still appending where we left off + this.resetTransmuxer(); + } + + var hls = this.hls; // If switching from alt to main audio, flush all audio and trigger track switched + + if (fromAltAudio) { + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_FLUSHING, { + startOffset: 0, + endOffset: Number.POSITIVE_INFINITY, + type: 'audio' + }); + } + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].AUDIO_TRACK_SWITCHED, { + id: trackId + }); + } + }; + + _proto.onAudioTrackSwitched = function onAudioTrackSwitched(event, data) { + var trackId = data.id; + var altAudio = !!this.hls.audioTracks[trackId].url; + + if (altAudio) { + var videoBuffer = this.videoBuffer; // if we switched on alternate audio, ensure that main fragment scheduling is synced with video sourcebuffer buffered + + if (videoBuffer && this.mediaBuffer !== videoBuffer) { + this.log('Switching on alternate audio, use video.buffered to schedule main fragment loading'); + this.mediaBuffer = videoBuffer; + } + } + + this.altAudio = altAudio; + this.tick(); + }; + + _proto.onBufferCreated = function onBufferCreated(event, data) { + var tracks = data.tracks; + var mediaTrack; + var name; + var alternate = false; + + for (var type in tracks) { + var track = tracks[type]; + + if (track.id === 'main') { + name = type; + mediaTrack = track; // keep video source buffer reference + + if (type === 'video') { + var videoTrack = tracks[type]; + + if (videoTrack) { + this.videoBuffer = videoTrack.buffer; + } + } + } else { + alternate = true; + } + } + + if (alternate && mediaTrack) { + this.log("Alternate track found, use " + name + ".buffered to schedule main fragment loading"); + this.mediaBuffer = mediaTrack.buffer; + } else { + this.mediaBuffer = this.media; + } + }; + + _proto.onFragBuffered = function onFragBuffered(event, data) { + var frag = data.frag, + part = data.part; + + if (frag && frag.type !== _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN) { + return; + } + + if (this.fragContextChanged(frag)) { + // If a level switch was requested while a fragment was buffering, it will emit the FRAG_BUFFERED event upon completion + // Avoid setting state back to IDLE, since that will interfere with a level switch + this.warn("Fragment " + frag.sn + (part ? ' p: ' + part.index : '') + " of level " + frag.level + " finished buffering, but was aborted. state: " + this.state); + + if (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSED) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } + + return; + } + + var stats = part ? part.stats : frag.stats; + this.fragLastKbps = Math.round(8 * stats.total / (stats.buffering.end - stats.loading.first)); + + if (frag.sn !== 'initSegment') { + this.fragPrevious = frag; + } + + this.fragBufferedComplete(frag, part); + }; + + _proto.onError = function onError(event, data) { + switch (data.details) { + case _errors__WEBPACK_IMPORTED_MODULE_11__["ErrorDetails"].FRAG_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_11__["ErrorDetails"].FRAG_LOAD_TIMEOUT: + case _errors__WEBPACK_IMPORTED_MODULE_11__["ErrorDetails"].KEY_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_11__["ErrorDetails"].KEY_LOAD_TIMEOUT: + this.onFragmentOrKeyLoadError(_types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN, data); + break; + + case _errors__WEBPACK_IMPORTED_MODULE_11__["ErrorDetails"].LEVEL_LOAD_ERROR: + case _errors__WEBPACK_IMPORTED_MODULE_11__["ErrorDetails"].LEVEL_LOAD_TIMEOUT: + if (this.state !== _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].ERROR) { + if (data.fatal) { + // if fatal error, stop processing + this.warn("" + data.details); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].ERROR; + } else { + // in case of non fatal error while loading level, if level controller is not retrying to load level , switch back to IDLE + if (!data.levelRetry && this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].WAITING_LEVEL) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + } + } + } + + break; + + case _errors__WEBPACK_IMPORTED_MODULE_11__["ErrorDetails"].BUFFER_FULL_ERROR: + // if in appending state + if (data.parent === 'main' && (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSING || this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSED)) { + var flushBuffer = true; + var bufferedInfo = this.getFwdBufferInfo(this.media, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN); // 0.5 : tolerance needed as some browsers stalls playback before reaching buffered end + // reduce max buf len if current position is buffered + + if (bufferedInfo && bufferedInfo.len > 0.5) { + flushBuffer = !this.reduceMaxBufferLength(bufferedInfo.len); + } + + if (flushBuffer) { + // current position is not buffered, but browser is still complaining about buffer full error + // this happens on IE/Edge, refer to https://github.com/video-dev/hls.js/pull/708 + // in that case flush the whole buffer to recover + this.warn('buffer full error also media.currentTime is not buffered, flush main'); // flush main buffer + + this.immediateLevelSwitch(); + } + + this.resetLoadingState(); + } + + break; + + default: + break; + } + } // Checks the health of the buffer and attempts to resolve playback stalls. + ; + + _proto.checkBuffer = function checkBuffer() { + var media = this.media, + gapController = this.gapController; + + if (!media || !gapController || !media.readyState) { + // Exit early if we don't have media or if the media hasn't buffered anything yet (readyState 0) + return; + } // Check combined buffer + + + var buffered = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_4__["BufferHelper"].getBuffered(media); + + if (!this.loadedmetadata && buffered.length) { + this.loadedmetadata = true; + this.seekToStartPos(); + } else { + // Resolve gaps using the main buffer, whose ranges are the intersections of the A/V sourcebuffers + gapController.poll(this.lastCurrentTime); + } + + this.lastCurrentTime = media.currentTime; + }; + + _proto.onFragLoadEmergencyAborted = function onFragLoadEmergencyAborted() { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; // if loadedmetadata is not set, it means that we are emergency switch down on first frag + // in that case, reset startFragRequested flag + + if (!this.loadedmetadata) { + this.startFragRequested = false; + this.nextLoadPosition = this.startPosition; + } + + this.tickImmediate(); + }; + + _proto.onBufferFlushed = function onBufferFlushed(event, _ref) { + var type = _ref.type; + + if (type !== _loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].AUDIO || this.audioOnly && !this.altAudio) { + var media = (type === _loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].VIDEO ? this.videoBuffer : this.mediaBuffer) || this.media; + this.afterBufferFlushed(media, type, _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN); + } + }; + + _proto.onLevelsUpdated = function onLevelsUpdated(event, data) { + this.levels = data.levels; + }; + + _proto.swapAudioCodec = function swapAudioCodec() { + this.audioCodecSwap = !this.audioCodecSwap; + } + /** + * Seeks to the set startPosition if not equal to the mediaElement's current time. + * @private + */ + ; + + _proto.seekToStartPos = function seekToStartPos() { + var media = this.media; + var currentTime = media.currentTime; + var startPosition = this.startPosition; // only adjust currentTime if different from startPosition or if startPosition not buffered + // at that stage, there should be only one buffered range, as we reach that code after first fragment has been buffered + + if (startPosition >= 0 && currentTime < startPosition) { + if (media.seeking) { + _utils_logger__WEBPACK_IMPORTED_MODULE_12__["logger"].log("could not seek to " + startPosition + ", already seeking at " + currentTime); + return; + } + + var buffered = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_4__["BufferHelper"].getBuffered(media); + var bufferStart = buffered.length ? buffered.start(0) : 0; + var delta = bufferStart - startPosition; + + if (delta > 0 && (delta < this.config.maxBufferHole || delta < this.config.maxFragLookUpTolerance)) { + _utils_logger__WEBPACK_IMPORTED_MODULE_12__["logger"].log("adjusting start position by " + delta + " to match buffer start"); + startPosition += delta; + this.startPosition = startPosition; + } + + this.log("seek to target start position " + startPosition + " from current time " + currentTime); + media.currentTime = startPosition; + } + }; + + _proto._getAudioCodec = function _getAudioCodec(currentLevel) { + var audioCodec = this.config.defaultAudioCodec || currentLevel.audioCodec; + + if (this.audioCodecSwap && audioCodec) { + this.log('Swapping audio codec'); + + if (audioCodec.indexOf('mp4a.40.5') !== -1) { + audioCodec = 'mp4a.40.2'; + } else { + audioCodec = 'mp4a.40.5'; + } + } + + return audioCodec; + }; + + _proto._loadBitrateTestFrag = function _loadBitrateTestFrag(frag) { + var _this2 = this; + + this._doFragLoad(frag).then(function (data) { + var hls = _this2.hls; + + if (!data || hls.nextLoadLevel || _this2.fragContextChanged(frag)) { + return; + } + + _this2.fragLoadError = 0; + _this2.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE; + _this2.startFragRequested = false; + _this2.bitrateTest = false; + var stats = frag.stats; // Bitrate tests fragments are neither parsed nor buffered + + stats.parsing.start = stats.parsing.end = stats.buffering.start = stats.buffering.end = self.performance.now(); + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_LOADED, data); + }); + }; + + _proto._handleTransmuxComplete = function _handleTransmuxComplete(transmuxResult) { + var _id3$samples; + + var id = 'main'; + var hls = this.hls; + var remuxResult = transmuxResult.remuxResult, + chunkMeta = transmuxResult.chunkMeta; + var context = this.getCurrentContext(chunkMeta); + + if (!context) { + this.warn("The loading context changed while buffering fragment " + chunkMeta.sn + " of level " + chunkMeta.level + ". This chunk will not be buffered."); + this.resetLiveStartWhenNotLoaded(chunkMeta.level); + return; + } + + var frag = context.frag, + part = context.part, + level = context.level; + var video = remuxResult.video, + text = remuxResult.text, + id3 = remuxResult.id3, + initSegment = remuxResult.initSegment; // The audio-stream-controller handles audio buffering if Hls.js is playing an alternate audio track + + var audio = this.altAudio ? undefined : remuxResult.audio; // Check if the current fragment has been aborted. We check this by first seeing if we're still playing the current level. + // If we are, subsequently check if the currently loading fragment (fragCurrent) has changed. + + if (this.fragContextChanged(frag)) { + return; + } + + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSING; + + if (initSegment) { + if (initSegment.tracks) { + this._bufferInitSegment(level, initSegment.tracks, frag, chunkMeta); + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_PARSING_INIT_SEGMENT, { + frag: frag, + id: id, + tracks: initSegment.tracks + }); + } // This would be nice if Number.isFinite acted as a typeguard, but it doesn't. See: https://github.com/Microsoft/TypeScript/issues/10038 + + + var initPTS = initSegment.initPTS; + var timescale = initSegment.timescale; + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(initPTS)) { + this.initPTS[frag.cc] = initPTS; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].INIT_PTS_FOUND, { + frag: frag, + id: id, + initPTS: initPTS, + timescale: timescale + }); + } + } // Avoid buffering if backtracking this fragment + + + if (video && remuxResult.independent !== false) { + if (level.details) { + var startPTS = video.startPTS, + endPTS = video.endPTS, + startDTS = video.startDTS, + endDTS = video.endDTS; + + if (part) { + part.elementaryStreams[video.type] = { + startPTS: startPTS, + endPTS: endPTS, + startDTS: startDTS, + endDTS: endDTS + }; + } else { + if (video.firstKeyFrame && video.independent) { + this.couldBacktrack = true; + } + + if (video.dropped && video.independent) { + // Backtrack if dropped frames create a gap after currentTime + var pos = this.getLoadPosition() + this.config.maxBufferHole; + + if (pos < startPTS) { + this.backtrack(frag); + return; + } // Set video stream start to fragment start so that truncated samples do not distort the timeline, and mark it partial + + + frag.setElementaryStreamInfo(video.type, frag.start, endPTS, frag.start, endDTS, true); + } + } + + frag.setElementaryStreamInfo(video.type, startPTS, endPTS, startDTS, endDTS); + this.bufferFragmentData(video, frag, part, chunkMeta); + } + } else if (remuxResult.independent === false) { + this.backtrack(frag); + return; + } + + if (audio) { + var _startPTS = audio.startPTS, + _endPTS = audio.endPTS, + _startDTS = audio.startDTS, + _endDTS = audio.endDTS; + + if (part) { + part.elementaryStreams[_loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].AUDIO] = { + startPTS: _startPTS, + endPTS: _endPTS, + startDTS: _startDTS, + endDTS: _endDTS + }; + } + + frag.setElementaryStreamInfo(_loader_fragment__WEBPACK_IMPORTED_MODULE_7__["ElementaryStreamTypes"].AUDIO, _startPTS, _endPTS, _startDTS, _endDTS); + this.bufferFragmentData(audio, frag, part, chunkMeta); + } + + if (id3 !== null && id3 !== void 0 && (_id3$samples = id3.samples) !== null && _id3$samples !== void 0 && _id3$samples.length) { + var emittedID3 = { + frag: frag, + id: id, + samples: id3.samples + }; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_PARSING_METADATA, emittedID3); + } + + if (text) { + var emittedText = { + frag: frag, + id: id, + samples: text.samples + }; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_PARSING_USERDATA, emittedText); + } + }; + + _proto._bufferInitSegment = function _bufferInitSegment(currentLevel, tracks, frag, chunkMeta) { + var _this3 = this; + + if (this.state !== _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].PARSING) { + return; + } + + this.audioOnly = !!tracks.audio && !tracks.video; // if audio track is expected to come from audio stream controller, discard any coming from main + + if (this.altAudio && !this.audioOnly) { + delete tracks.audio; + } // include levelCodec in audio and video tracks + + + var audio = tracks.audio, + video = tracks.video, + audiovideo = tracks.audiovideo; + + if (audio) { + var audioCodec = currentLevel.audioCodec; + var ua = navigator.userAgent.toLowerCase(); + + if (this.audioCodecSwitch) { + if (audioCodec) { + if (audioCodec.indexOf('mp4a.40.5') !== -1) { + audioCodec = 'mp4a.40.2'; + } else { + audioCodec = 'mp4a.40.5'; + } + } // In the case that AAC and HE-AAC audio codecs are signalled in manifest, + // force HE-AAC, as it seems that most browsers prefers it. + // don't force HE-AAC if mono stream, or in Firefox + + + if (audio.metadata.channelCount !== 1 && ua.indexOf('firefox') === -1) { + audioCodec = 'mp4a.40.5'; + } + } // HE-AAC is broken on Android, always signal audio codec as AAC even if variant manifest states otherwise + + + if (ua.indexOf('android') !== -1 && audio.container !== 'audio/mpeg') { + // Exclude mpeg audio + audioCodec = 'mp4a.40.2'; + this.log("Android: force audio codec to " + audioCodec); + } + + if (currentLevel.audioCodec && currentLevel.audioCodec !== audioCodec) { + this.log("Swapping manifest audio codec \"" + currentLevel.audioCodec + "\" for \"" + audioCodec + "\""); + } + + audio.levelCodec = audioCodec; + audio.id = 'main'; + this.log("Init audio buffer, container:" + audio.container + ", codecs[selected/level/parsed]=[" + (audioCodec || '') + "/" + (currentLevel.audioCodec || '') + "/" + audio.codec + "]"); + } + + if (video) { + video.levelCodec = currentLevel.videoCodec; + video.id = 'main'; + this.log("Init video buffer, container:" + video.container + ", codecs[level/parsed]=[" + (currentLevel.videoCodec || '') + "/" + video.codec + "]"); + } + + if (audiovideo) { + this.log("Init audiovideo buffer, container:" + audiovideo.container + ", codecs[level/parsed]=[" + (currentLevel.attrs.CODECS || '') + "/" + audiovideo.codec + "]"); + } + + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_CODECS, tracks); // loop through tracks that are going to be provided to bufferController + + Object.keys(tracks).forEach(function (trackName) { + var track = tracks[trackName]; + var initSegment = track.initSegment; + + if (initSegment !== null && initSegment !== void 0 && initSegment.byteLength) { + _this3.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_APPENDING, { + type: trackName, + data: initSegment, + frag: frag, + part: null, + chunkMeta: chunkMeta, + parent: frag.type + }); + } + }); // trigger handler right now + + this.tick(); + }; + + _proto.backtrack = function backtrack(frag) { + this.couldBacktrack = true; // Causes findFragments to backtrack through fragments to find the keyframe + + this.resetTransmuxer(); + this.flushBufferGap(frag); + var data = this.fragmentTracker.backtrack(frag); + this.fragPrevious = null; + this.nextLoadPosition = frag.start; + + if (data) { + this.resetFragmentLoading(frag); + } else { + // Change state to BACKTRACKING so that fragmentEntity.backtrack data can be added after _doFragLoad + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].BACKTRACKING; + } + }; + + _proto.checkFragmentChanged = function checkFragmentChanged() { + var video = this.media; + var fragPlayingCurrent = null; + + if (video && video.readyState > 1 && video.seeking === false) { + var currentTime = video.currentTime; + /* if video element is in seeked state, currentTime can only increase. + (assuming that playback rate is positive ...) + As sometimes currentTime jumps back to zero after a + media decode error, check this, to avoid seeking back to + wrong position after a media decode error + */ + + if (_utils_buffer_helper__WEBPACK_IMPORTED_MODULE_4__["BufferHelper"].isBuffered(video, currentTime)) { + fragPlayingCurrent = this.getAppendedFrag(currentTime); + } else if (_utils_buffer_helper__WEBPACK_IMPORTED_MODULE_4__["BufferHelper"].isBuffered(video, currentTime + 0.1)) { + /* ensure that FRAG_CHANGED event is triggered at startup, + when first video frame is displayed and playback is paused. + add a tolerance of 100ms, in case current position is not buffered, + check if current pos+100ms is buffered and use that buffer range + for FRAG_CHANGED event reporting */ + fragPlayingCurrent = this.getAppendedFrag(currentTime + 0.1); + } + + if (fragPlayingCurrent) { + var fragPlaying = this.fragPlaying; + var fragCurrentLevel = fragPlayingCurrent.level; + + if (!fragPlaying || fragPlayingCurrent.sn !== fragPlaying.sn || fragPlaying.level !== fragCurrentLevel || fragPlayingCurrent.urlId !== fragPlaying.urlId) { + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].FRAG_CHANGED, { + frag: fragPlayingCurrent + }); + + if (!fragPlaying || fragPlaying.level !== fragCurrentLevel) { + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].LEVEL_SWITCHED, { + level: fragCurrentLevel + }); + } + + this.fragPlaying = fragPlayingCurrent; + } + } + } + }; + + _createClass(StreamController, [{ + key: "nextLevel", + get: function get() { + var frag = this.nextBufferedFrag; + + if (frag) { + return frag.level; + } else { + return -1; + } + } + }, { + key: "currentLevel", + get: function get() { + var media = this.media; + + if (media) { + var fragPlayingCurrent = this.getAppendedFrag(media.currentTime); + + if (fragPlayingCurrent) { + return fragPlayingCurrent.level; + } + } + + return -1; + } + }, { + key: "nextBufferedFrag", + get: function get() { + var media = this.media; + + if (media) { + // first get end range of current fragment + var fragPlayingCurrent = this.getAppendedFrag(media.currentTime); + return this.followingBufferedFrag(fragPlayingCurrent); + } else { + return null; + } + } + }, { + key: "forceStartLoad", + get: function get() { + return this._forceStartLoad; + } + }]); + + return StreamController; +}(_base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["default"]); + + + +/***/ }), + +/***/ "./src/controller/subtitle-stream-controller.ts": +/*!******************************************************!*\ + !*** ./src/controller/subtitle-stream-controller.ts ***! + \******************************************************/ +/*! exports provided: SubtitleStreamController */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubtitleStreamController", function() { return SubtitleStreamController; }); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/buffer-helper */ "./src/utils/buffer-helper.ts"); +/* harmony import */ var _fragment_finders__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fragment-finders */ "./src/controller/fragment-finders.ts"); +/* harmony import */ var _utils_discontinuities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/discontinuities */ "./src/utils/discontinuities.ts"); +/* harmony import */ var _level_helper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level-helper */ "./src/controller/level-helper.ts"); +/* harmony import */ var _fragment_tracker__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fragment-tracker */ "./src/controller/fragment-tracker.ts"); +/* harmony import */ var _base_stream_controller__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base-stream-controller */ "./src/controller/base-stream-controller.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +/* harmony import */ var _types_level__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../types/level */ "./src/types/level.ts"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + + + + + + + + + + +var TICK_INTERVAL = 500; // how often to tick in ms + +var SubtitleStreamController = /*#__PURE__*/function (_BaseStreamController) { + _inheritsLoose(SubtitleStreamController, _BaseStreamController); + + function SubtitleStreamController(hls, fragmentTracker) { + var _this; + + _this = _BaseStreamController.call(this, hls, fragmentTracker, '[subtitle-stream-controller]') || this; + _this.levels = []; + _this.currentTrackId = -1; + _this.tracksBuffered = []; + _this.mainDetails = null; + + _this._registerListeners(); + + return _this; + } + + var _proto = SubtitleStreamController.prototype; + + _proto.onHandlerDestroying = function onHandlerDestroying() { + this._unregisterListeners(); + + this.mainDetails = null; + }; + + _proto._registerListeners = function _registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, this.onError, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_FLUSHING, this.onBufferFlushing, this); + }; + + _proto._unregisterListeners = function _unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_LOADED, this.onLevelLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, this.onError, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].BUFFER_FLUSHING, this.onBufferFlushing, this); + }; + + _proto.startLoad = function startLoad() { + this.stopLoad(); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_7__["State"].IDLE; + this.setInterval(TICK_INTERVAL); + this.tick(); + }; + + _proto.onManifestLoading = function onManifestLoading() { + this.mainDetails = null; + this.fragmentTracker.removeAllFragments(); + }; + + _proto.onLevelLoaded = function onLevelLoaded(event, data) { + this.mainDetails = data.details; + }; + + _proto.onSubtitleFragProcessed = function onSubtitleFragProcessed(event, data) { + var frag = data.frag, + success = data.success; + this.fragPrevious = frag; + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_7__["State"].IDLE; + + if (!success) { + return; + } + + var buffered = this.tracksBuffered[this.currentTrackId]; + + if (!buffered) { + return; + } // Create/update a buffered array matching the interface used by BufferHelper.bufferedInfo + // so we can re-use the logic used to detect how much has been buffered + + + var timeRange; + var fragStart = frag.start; + + for (var i = 0; i < buffered.length; i++) { + if (fragStart >= buffered[i].start && fragStart <= buffered[i].end) { + timeRange = buffered[i]; + break; + } + } + + var fragEnd = frag.start + frag.duration; + + if (timeRange) { + timeRange.end = fragEnd; + } else { + timeRange = { + start: fragStart, + end: fragEnd + }; + buffered.push(timeRange); + } + + this.fragmentTracker.fragBuffered(frag); + }; + + _proto.onBufferFlushing = function onBufferFlushing(event, data) { + var startOffset = data.startOffset, + endOffset = data.endOffset; + + if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) { + var currentTrackId = this.currentTrackId, + levels = this.levels; + + if (!levels.length || !levels[currentTrackId] || !levels[currentTrackId].details) { + return; + } + + var trackDetails = levels[currentTrackId].details; + var targetDuration = trackDetails.targetduration; + var endOffsetSubtitles = endOffset - targetDuration; + + if (endOffsetSubtitles <= 0) { + return; + } + + data.endOffsetSubtitles = Math.max(0, endOffsetSubtitles); + this.tracksBuffered.forEach(function (buffered) { + for (var i = 0; i < buffered.length;) { + if (buffered[i].end <= endOffsetSubtitles) { + buffered.shift(); + continue; + } else if (buffered[i].start < endOffsetSubtitles) { + buffered[i].start = endOffsetSubtitles; + } else { + break; + } + + i++; + } + }); + this.fragmentTracker.removeFragmentsInRange(startOffset, endOffsetSubtitles, _types_loader__WEBPACK_IMPORTED_MODULE_8__["PlaylistLevelType"].SUBTITLE); + } + } // If something goes wrong, proceed to next frag, if we were processing one. + ; + + _proto.onError = function onError(event, data) { + var _this$fragCurrent; + + var frag = data.frag; // don't handle error not related to subtitle fragment + + if (!frag || frag.type !== _types_loader__WEBPACK_IMPORTED_MODULE_8__["PlaylistLevelType"].SUBTITLE) { + return; + } + + if ((_this$fragCurrent = this.fragCurrent) !== null && _this$fragCurrent !== void 0 && _this$fragCurrent.loader) { + this.fragCurrent.loader.abort(); + } + + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_7__["State"].IDLE; + } // Got all new subtitle levels. + ; + + _proto.onSubtitleTracksUpdated = function onSubtitleTracksUpdated(event, _ref) { + var _this2 = this; + + var subtitleTracks = _ref.subtitleTracks; + this.tracksBuffered = []; + this.levels = subtitleTracks.map(function (mediaPlaylist) { + return new _types_level__WEBPACK_IMPORTED_MODULE_9__["Level"](mediaPlaylist); + }); + this.fragmentTracker.removeAllFragments(); + this.fragPrevious = null; + this.levels.forEach(function (level) { + _this2.tracksBuffered[level.id] = []; + }); + this.mediaBuffer = null; + }; + + _proto.onSubtitleTrackSwitch = function onSubtitleTrackSwitch(event, data) { + this.currentTrackId = data.id; + + if (!this.levels.length || this.currentTrackId === -1) { + this.clearInterval(); + return; + } // Check if track has the necessary details to load fragments + + + var currentTrack = this.levels[this.currentTrackId]; + + if (currentTrack !== null && currentTrack !== void 0 && currentTrack.details) { + this.mediaBuffer = this.mediaBufferTimeRanges; + this.setInterval(TICK_INTERVAL); + } else { + this.mediaBuffer = null; + } + } // Got a new set of subtitle fragments. + ; + + _proto.onSubtitleTrackLoaded = function onSubtitleTrackLoaded(event, data) { + var _track$details; + + var newDetails = data.details, + trackId = data.id; + var currentTrackId = this.currentTrackId, + levels = this.levels; + + if (!levels.length) { + return; + } + + var track = levels[currentTrackId]; + + if (trackId >= levels.length || trackId !== currentTrackId || !track) { + return; + } + + this.mediaBuffer = this.mediaBufferTimeRanges; + + if (newDetails.live || (_track$details = track.details) !== null && _track$details !== void 0 && _track$details.live) { + var mainDetails = this.mainDetails; + + if (newDetails.deltaUpdateFailed || !mainDetails) { + return; + } + + var mainSlidingStartFragment = mainDetails.fragments[0]; + + if (!track.details) { + if (newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) { + Object(_utils_discontinuities__WEBPACK_IMPORTED_MODULE_4__["alignMediaPlaylistByPDT"])(newDetails, mainDetails); + } else if (mainSlidingStartFragment) { + // line up live playlist with main so that fragments in range are loaded + Object(_level_helper__WEBPACK_IMPORTED_MODULE_5__["addSliding"])(newDetails, mainSlidingStartFragment.start); + } + } else { + var sliding = this.alignPlaylists(newDetails, track.details); + + if (sliding === 0 && mainSlidingStartFragment) { + // realign with main when there is no overlap with last refresh + Object(_level_helper__WEBPACK_IMPORTED_MODULE_5__["addSliding"])(newDetails, mainSlidingStartFragment.start); + } + } + } + + track.details = newDetails; + this.levelLastLoaded = trackId; // trigger handler right now + + this.tick(); // If playlist is misaligned because of bad PDT or drift, delete details to resync with main on reload + + if (newDetails.live && !this.fragCurrent && this.media && this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_7__["State"].IDLE) { + var foundFrag = Object(_fragment_finders__WEBPACK_IMPORTED_MODULE_3__["findFragmentByPTS"])(null, newDetails.fragments, this.media.currentTime, 0); + + if (!foundFrag) { + this.warn('Subtitle playlist not aligned with playback'); + track.details = undefined; + } + } + }; + + _proto._handleFragmentLoadComplete = function _handleFragmentLoadComplete(fragLoadedData) { + var frag = fragLoadedData.frag, + payload = fragLoadedData.payload; + var decryptData = frag.decryptdata; + var hls = this.hls; + + if (this.fragContextChanged(frag)) { + return; + } // check to see if the payload needs to be decrypted + + + if (payload && payload.byteLength > 0 && decryptData && decryptData.key && decryptData.iv && decryptData.method === 'AES-128') { + var startTime = performance.now(); // decrypt the subtitles + + this.decrypter.webCryptoDecrypt(new Uint8Array(payload), decryptData.key.buffer, decryptData.iv.buffer).then(function (decryptedData) { + var endTime = performance.now(); + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].FRAG_DECRYPTED, { + frag: frag, + payload: decryptedData, + stats: { + tstart: startTime, + tdecrypt: endTime + } + }); + }); + } + }; + + _proto.doTick = function doTick() { + if (!this.media) { + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_7__["State"].IDLE; + return; + } + + if (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_7__["State"].IDLE) { + var _foundFrag; + + var currentTrackId = this.currentTrackId, + levels = this.levels; + + if (!levels.length || !levels[currentTrackId] || !levels[currentTrackId].details) { + return; + } // Expand range of subs loaded by one target-duration in either direction to make up for misaligned playlists + + + var trackDetails = levels[currentTrackId].details; + var targetDuration = trackDetails.targetduration; + var config = this.config, + media = this.media; + var bufferedInfo = _utils_buffer_helper__WEBPACK_IMPORTED_MODULE_2__["BufferHelper"].bufferedInfo(this.mediaBufferTimeRanges, media.currentTime - targetDuration, config.maxBufferHole); + var targetBufferTime = bufferedInfo.end, + bufferLen = bufferedInfo.len; + var maxBufLen = this.getMaxBufferLength() + targetDuration; + + if (bufferLen > maxBufLen) { + return; + } + + console.assert(trackDetails, 'Subtitle track details are defined on idle subtitle stream controller tick'); + var fragments = trackDetails.fragments; + var fragLen = fragments.length; + var end = trackDetails.edge; + var foundFrag; + var fragPrevious = this.fragPrevious; + + if (targetBufferTime < end) { + var maxFragLookUpTolerance = config.maxFragLookUpTolerance; + + if (fragPrevious && trackDetails.hasProgramDateTime) { + foundFrag = Object(_fragment_finders__WEBPACK_IMPORTED_MODULE_3__["findFragmentByPDT"])(fragments, fragPrevious.endProgramDateTime, maxFragLookUpTolerance); + } + + if (!foundFrag) { + foundFrag = Object(_fragment_finders__WEBPACK_IMPORTED_MODULE_3__["findFragmentByPTS"])(fragPrevious, fragments, targetBufferTime, maxFragLookUpTolerance); + + if (!foundFrag && fragPrevious && fragPrevious.start < fragments[0].start) { + foundFrag = fragments[0]; + } + } + } else { + foundFrag = fragments[fragLen - 1]; + } + + if ((_foundFrag = foundFrag) !== null && _foundFrag !== void 0 && _foundFrag.encrypted) { + _utils_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].log("Loading key for " + foundFrag.sn); + this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_7__["State"].KEY_LOADING; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].KEY_LOADING, { + frag: foundFrag + }); + } else if (foundFrag && this.fragmentTracker.getState(foundFrag) === _fragment_tracker__WEBPACK_IMPORTED_MODULE_6__["FragmentState"].NOT_LOADED) { + // only load if fragment is not loaded + this.loadFragment(foundFrag, trackDetails, targetBufferTime); + } + } + }; + + _proto.loadFragment = function loadFragment(frag, levelDetails, targetBufferTime) { + this.fragCurrent = frag; + + _BaseStreamController.prototype.loadFragment.call(this, frag, levelDetails, targetBufferTime); + }; + + _createClass(SubtitleStreamController, [{ + key: "mediaBufferTimeRanges", + get: function get() { + return this.tracksBuffered[this.currentTrackId] || []; + } + }]); + + return SubtitleStreamController; +}(_base_stream_controller__WEBPACK_IMPORTED_MODULE_7__["default"]); + +/***/ }), + +/***/ "./src/controller/subtitle-track-controller.ts": +/*!*****************************************************!*\ + !*** ./src/controller/subtitle-track-controller.ts ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/texttrack-utils */ "./src/utils/texttrack-utils.ts"); +/* harmony import */ var _base_playlist_controller__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base-playlist-controller */ "./src/controller/base-playlist-controller.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + + + + + +var SubtitleTrackController = /*#__PURE__*/function (_BasePlaylistControll) { + _inheritsLoose(SubtitleTrackController, _BasePlaylistControll); + + // Enable/disable subtitle display rendering + function SubtitleTrackController(hls) { + var _this; + + _this = _BasePlaylistControll.call(this, hls, '[subtitle-track-controller]') || this; + _this.media = null; + _this.tracks = []; + _this.groupId = null; + _this.tracksInGroup = []; + _this.trackId = -1; + _this.selectDefaultTrack = true; + _this.queuedDefaultTrack = -1; + + _this.trackChangeListener = function () { + return _this.onTextTracksChanged(); + }; + + _this.asyncPollTrackChange = function () { + return _this.pollTrackChange(0); + }; + + _this.useTextTrackPolling = false; + _this.subtitlePollingInterval = -1; + _this.subtitleDisplay = true; + + _this.registerListeners(); + + return _this; + } + + var _proto = SubtitleTrackController.prototype; + + _proto.destroy = function destroy() { + this.unregisterListeners(); + this.tracks.length = 0; + this.tracksInGroup.length = 0; + this.trackChangeListener = this.asyncPollTrackChange = null; + + _BasePlaylistControll.prototype.destroy.call(this); + }; + + _proto.registerListeners = function registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_LOADING, this.onLevelLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_SWITCHING, this.onLevelSwitching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, this.onError, this); + }; + + _proto.unregisterListeners = function unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_ATTACHED, this.onMediaAttached, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].MANIFEST_PARSED, this.onManifestParsed, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_LOADING, this.onLevelLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].LEVEL_SWITCHING, this.onLevelSwitching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, this.onError, this); + } // Listen for subtitle track change, then extract the current track ID. + ; + + _proto.onMediaAttached = function onMediaAttached(event, data) { + this.media = data.media; + + if (!this.media) { + return; + } + + if (this.queuedDefaultTrack > -1) { + this.subtitleTrack = this.queuedDefaultTrack; + this.queuedDefaultTrack = -1; + } + + this.useTextTrackPolling = !(this.media.textTracks && 'onchange' in this.media.textTracks); + + if (this.useTextTrackPolling) { + this.pollTrackChange(500); + } else { + this.media.textTracks.addEventListener('change', this.asyncPollTrackChange); + } + }; + + _proto.pollTrackChange = function pollTrackChange(timeout) { + self.clearInterval(this.subtitlePollingInterval); + this.subtitlePollingInterval = self.setInterval(this.trackChangeListener, timeout); + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + if (!this.media) { + return; + } + + self.clearInterval(this.subtitlePollingInterval); + + if (!this.useTextTrackPolling) { + this.media.textTracks.removeEventListener('change', this.asyncPollTrackChange); + } + + if (this.trackId > -1) { + this.queuedDefaultTrack = this.trackId; + } + + var textTracks = filterSubtitleTracks(this.media.textTracks); // Clear loaded cues on media detachment from tracks + + textTracks.forEach(function (track) { + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_1__["clearCurrentCues"])(track); + }); // Disable all subtitle tracks before detachment so when reattached only tracks in that content are enabled. + + this.subtitleTrack = -1; + this.media = null; + }; + + _proto.onManifestLoading = function onManifestLoading() { + this.tracks = []; + this.groupId = null; + this.tracksInGroup = []; + this.trackId = -1; + this.selectDefaultTrack = true; + } // Fired whenever a new manifest is loaded. + ; + + _proto.onManifestParsed = function onManifestParsed(event, data) { + this.tracks = data.subtitleTracks; + }; + + _proto.onSubtitleTrackLoaded = function onSubtitleTrackLoaded(event, data) { + var id = data.id, + details = data.details; + var trackId = this.trackId; + var currentTrack = this.tracksInGroup[trackId]; + + if (!currentTrack) { + this.warn("Invalid subtitle track id " + id); + return; + } + + var curDetails = currentTrack.details; + currentTrack.details = data.details; + this.log("subtitle track " + id + " loaded [" + details.startSN + "-" + details.endSN + "]"); + + if (id === this.trackId) { + this.retryCount = 0; + this.playlistLoaded(id, data, curDetails); + } + }; + + _proto.onLevelLoading = function onLevelLoading(event, data) { + this.switchLevel(data.level); + }; + + _proto.onLevelSwitching = function onLevelSwitching(event, data) { + this.switchLevel(data.level); + }; + + _proto.switchLevel = function switchLevel(levelIndex) { + var levelInfo = this.hls.levels[levelIndex]; + + if (!(levelInfo !== null && levelInfo !== void 0 && levelInfo.textGroupIds)) { + return; + } + + var textGroupId = levelInfo.textGroupIds[levelInfo.urlId]; + + if (this.groupId !== textGroupId) { + var lastTrack = this.tracksInGroup ? this.tracksInGroup[this.trackId] : undefined; + var subtitleTracks = this.tracks.filter(function (track) { + return !textGroupId || track.groupId === textGroupId; + }); + this.tracksInGroup = subtitleTracks; + var initialTrackId = this.findTrackId(lastTrack === null || lastTrack === void 0 ? void 0 : lastTrack.name) || this.findTrackId(); + this.groupId = textGroupId; + var subtitleTracksUpdated = { + subtitleTracks: subtitleTracks + }; + this.log("Updating subtitle tracks, " + subtitleTracks.length + " track(s) found in \"" + textGroupId + "\" group-id"); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACKS_UPDATED, subtitleTracksUpdated); + + if (initialTrackId !== -1) { + this.setSubtitleTrack(initialTrackId, lastTrack); + } + } + }; + + _proto.findTrackId = function findTrackId(name) { + var textTracks = this.tracksInGroup; + + for (var i = 0; i < textTracks.length; i++) { + var track = textTracks[i]; + + if (!this.selectDefaultTrack || track.default) { + if (!name || name === track.name) { + return track.id; + } + } + } + + return -1; + }; + + _proto.onError = function onError(event, data) { + _BasePlaylistControll.prototype.onError.call(this, event, data); + + if (data.fatal || !data.context) { + return; + } + + if (data.context.type === _types_loader__WEBPACK_IMPORTED_MODULE_3__["PlaylistContextType"].SUBTITLE_TRACK && data.context.id === this.trackId && data.context.groupId === this.groupId) { + this.retryLoadingOrFail(data); + } + } + /** get alternate subtitle tracks list from playlist **/ + ; + + _proto.loadPlaylist = function loadPlaylist(hlsUrlParameters) { + var currentTrack = this.tracksInGroup[this.trackId]; + + if (this.shouldLoadTrack(currentTrack)) { + var id = currentTrack.id; + var groupId = currentTrack.groupId; + var url = currentTrack.url; + + if (hlsUrlParameters) { + try { + url = hlsUrlParameters.addDirectives(url); + } catch (error) { + this.warn("Could not construct new URL with HLS Delivery Directives: " + error); + } + } + + this.log("Loading subtitle playlist for id " + id); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_LOADING, { + url: url, + id: id, + groupId: groupId, + deliveryDirectives: hlsUrlParameters || null + }); + } + } + /** + * Disables the old subtitleTrack and sets current mode on the next subtitleTrack. + * This operates on the DOM textTracks. + * A value of -1 will disable all subtitle tracks. + */ + ; + + _proto.toggleTrackModes = function toggleTrackModes(newId) { + var _this2 = this; + + var media = this.media, + subtitleDisplay = this.subtitleDisplay, + trackId = this.trackId; + + if (!media) { + return; + } + + var textTracks = filterSubtitleTracks(media.textTracks); + var groupTracks = textTracks.filter(function (track) { + return track.groupId === _this2.groupId; + }); + + if (newId === -1) { + [].slice.call(textTracks).forEach(function (track) { + track.mode = 'disabled'; + }); + } else { + var oldTrack = groupTracks[trackId]; + + if (oldTrack) { + oldTrack.mode = 'disabled'; + } + } + + var nextTrack = groupTracks[newId]; + + if (nextTrack) { + nextTrack.mode = subtitleDisplay ? 'showing' : 'hidden'; + } + } + /** + * This method is responsible for validating the subtitle index and periodically reloading if live. + * Dispatches the SUBTITLE_TRACK_SWITCH event, which instructs the subtitle-stream-controller to load the selected track. + */ + ; + + _proto.setSubtitleTrack = function setSubtitleTrack(newId, lastTrack) { + var _tracks$newId; + + var tracks = this.tracksInGroup; // setting this.subtitleTrack will trigger internal logic + // if media has not been attached yet, it will fail + // we keep a reference to the default track id + // and we'll set subtitleTrack when onMediaAttached is triggered + + if (!this.media) { + this.queuedDefaultTrack = newId; + return; + } + + if (this.trackId !== newId) { + this.toggleTrackModes(newId); + } // exit if track id as already set or invalid + + + if (this.trackId === newId && (newId === -1 || (_tracks$newId = tracks[newId]) !== null && _tracks$newId !== void 0 && _tracks$newId.details) || newId < -1 || newId >= tracks.length) { + return; + } // stopping live reloading timer if any + + + this.clearTimer(); + var track = tracks[newId]; + this.log("Switching to subtitle track " + newId); + this.trackId = newId; + + if (track) { + var id = track.id, + _track$groupId = track.groupId, + groupId = _track$groupId === void 0 ? '' : _track$groupId, + name = track.name, + type = track.type, + url = track.url; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_SWITCH, { + id: id, + groupId: groupId, + name: name, + type: type, + url: url + }); + var hlsUrlParameters = this.switchParams(track.url, lastTrack === null || lastTrack === void 0 ? void 0 : lastTrack.details); + this.loadPlaylist(hlsUrlParameters); + } else { + // switch to -1 + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].SUBTITLE_TRACK_SWITCH, { + id: newId + }); + } + }; + + _proto.onTextTracksChanged = function onTextTracksChanged() { + if (!this.useTextTrackPolling) { + self.clearInterval(this.subtitlePollingInterval); + } // Media is undefined when switching streams via loadSource() + + + if (!this.media || !this.hls.config.renderTextTracksNatively) { + return; + } + + var trackId = -1; + var tracks = filterSubtitleTracks(this.media.textTracks); + + for (var id = 0; id < tracks.length; id++) { + if (tracks[id].mode === 'hidden') { + // Do not break in case there is a following track with showing. + trackId = id; + } else if (tracks[id].mode === 'showing') { + trackId = id; + break; + } + } // Setting current subtitleTrack will invoke code. + + + if (this.subtitleTrack !== trackId) { + this.subtitleTrack = trackId; + } + }; + + _createClass(SubtitleTrackController, [{ + key: "subtitleTracks", + get: function get() { + return this.tracksInGroup; + } + /** get/set index of the selected subtitle track (based on index in subtitle track lists) **/ + + }, { + key: "subtitleTrack", + get: function get() { + return this.trackId; + }, + set: function set(newId) { + this.selectDefaultTrack = false; + var lastTrack = this.tracksInGroup ? this.tracksInGroup[this.trackId] : undefined; + this.setSubtitleTrack(newId, lastTrack); + } + }]); + + return SubtitleTrackController; +}(_base_playlist_controller__WEBPACK_IMPORTED_MODULE_2__["default"]); + +function filterSubtitleTracks(textTrackList) { + var tracks = []; + + for (var i = 0; i < textTrackList.length; i++) { + var track = textTrackList[i]; // Edge adds a track without a label; we don't want to use it + + if (track.kind === 'subtitles' && track.label) { + tracks.push(textTrackList[i]); + } + } + + return tracks; +} + +/* harmony default export */ __webpack_exports__["default"] = (SubtitleTrackController); + +/***/ }), + +/***/ "./src/controller/timeline-controller.ts": +/*!***********************************************!*\ + !*** ./src/controller/timeline-controller.ts ***! + \***********************************************/ +/*! exports provided: TimelineController */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineController", function() { return TimelineController; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_cea_608_parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/cea-608-parser */ "./src/utils/cea-608-parser.ts"); +/* harmony import */ var _utils_output_filter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/output-filter */ "./src/utils/output-filter.ts"); +/* harmony import */ var _utils_webvtt_parser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/webvtt-parser */ "./src/utils/webvtt-parser.ts"); +/* harmony import */ var _utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/texttrack-utils */ "./src/utils/texttrack-utils.ts"); +/* harmony import */ var _utils_imsc1_ttml_parser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/imsc1-ttml-parser */ "./src/utils/imsc1-ttml-parser.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + + + + + + + + + +var TimelineController = /*#__PURE__*/function () { + function TimelineController(hls) { + this.hls = void 0; + this.media = null; + this.config = void 0; + this.enabled = true; + this.Cues = void 0; + this.textTracks = []; + this.tracks = []; + this.initPTS = []; + this.timescale = []; + this.unparsedVttFrags = []; + this.captionsTracks = {}; + this.nonNativeCaptionsTracks = {}; + this.cea608Parser1 = void 0; + this.cea608Parser2 = void 0; + this.lastSn = -1; + this.prevCC = -1; + this.vttCCs = newVTTCCs(); + this.captionsProperties = void 0; + this.hls = hls; + this.config = hls.config; + this.Cues = hls.config.cueHandler; + this.captionsProperties = { + textTrack1: { + label: this.config.captionsTextTrack1Label, + languageCode: this.config.captionsTextTrack1LanguageCode + }, + textTrack2: { + label: this.config.captionsTextTrack2Label, + languageCode: this.config.captionsTextTrack2LanguageCode + }, + textTrack3: { + label: this.config.captionsTextTrack3Label, + languageCode: this.config.captionsTextTrack3LanguageCode + }, + textTrack4: { + label: this.config.captionsTextTrack4Label, + languageCode: this.config.captionsTextTrack4LanguageCode + } + }; + + if (this.config.enableCEA708Captions) { + var channel1 = new _utils_output_filter__WEBPACK_IMPORTED_MODULE_3__["default"](this, 'textTrack1'); + var channel2 = new _utils_output_filter__WEBPACK_IMPORTED_MODULE_3__["default"](this, 'textTrack2'); + var channel3 = new _utils_output_filter__WEBPACK_IMPORTED_MODULE_3__["default"](this, 'textTrack3'); + var channel4 = new _utils_output_filter__WEBPACK_IMPORTED_MODULE_3__["default"](this, 'textTrack4'); + this.cea608Parser1 = new _utils_cea_608_parser__WEBPACK_IMPORTED_MODULE_2__["default"](1, channel1, channel2); + this.cea608Parser2 = new _utils_cea_608_parser__WEBPACK_IMPORTED_MODULE_2__["default"](3, channel3, channel4); + } + + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_ATTACHING, this.onMediaAttaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADED, this.onManifestLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_LOADING, this.onFragLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_LOADED, this.onFragLoaded, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_DECRYPTED, this.onFragDecrypted, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].INIT_PTS_FOUND, this.onInitPtsFound, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_FLUSHING, this.onBufferFlushing, this); + } + + var _proto = TimelineController.prototype; + + _proto.destroy = function destroy() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_ATTACHING, this.onMediaAttaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MEDIA_DETACHING, this.onMediaDetaching, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADED, this.onManifestLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_LOADING, this.onFragLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_LOADED, this.onFragLoaded, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_DECRYPTED, this.onFragDecrypted, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].INIT_PTS_FOUND, this.onInitPtsFound, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].BUFFER_FLUSHING, this.onBufferFlushing, this); // @ts-ignore + + this.hls = this.config = this.cea608Parser1 = this.cea608Parser2 = null; + }; + + _proto.addCues = function addCues(trackName, startTime, endTime, screen, cueRanges) { + // skip cues which overlap more than 50% with previously parsed time ranges + var merged = false; + + for (var i = cueRanges.length; i--;) { + var cueRange = cueRanges[i]; + var overlap = intersection(cueRange[0], cueRange[1], startTime, endTime); + + if (overlap >= 0) { + cueRange[0] = Math.min(cueRange[0], startTime); + cueRange[1] = Math.max(cueRange[1], endTime); + merged = true; + + if (overlap / (endTime - startTime) > 0.5) { + return; + } + } + } + + if (!merged) { + cueRanges.push([startTime, endTime]); + } + + if (this.config.renderTextTracksNatively) { + var track = this.captionsTracks[trackName]; + this.Cues.newCue(track, startTime, endTime, screen); + } else { + var cues = this.Cues.newCue(null, startTime, endTime, screen); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].CUES_PARSED, { + type: 'captions', + cues: cues, + track: trackName + }); + } + } // Triggered when an initial PTS is found; used for synchronisation of WebVTT. + ; + + _proto.onInitPtsFound = function onInitPtsFound(event, _ref) { + var _this = this; + + var frag = _ref.frag, + id = _ref.id, + initPTS = _ref.initPTS, + timescale = _ref.timescale; + var unparsedVttFrags = this.unparsedVttFrags; + + if (id === 'main') { + this.initPTS[frag.cc] = initPTS; + this.timescale[frag.cc] = timescale; + } // Due to asynchronous processing, initial PTS may arrive later than the first VTT fragments are loaded. + // Parse any unparsed fragments upon receiving the initial PTS. + + + if (unparsedVttFrags.length) { + this.unparsedVttFrags = []; + unparsedVttFrags.forEach(function (frag) { + _this.onFragLoaded(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_LOADED, frag); + }); + } + }; + + _proto.getExistingTrack = function getExistingTrack(trackName) { + var media = this.media; + + if (media) { + for (var i = 0; i < media.textTracks.length; i++) { + var textTrack = media.textTracks[i]; + + if (textTrack[trackName]) { + return textTrack; + } + } + } + + return null; + }; + + _proto.createCaptionsTrack = function createCaptionsTrack(trackName) { + if (this.config.renderTextTracksNatively) { + this.createNativeTrack(trackName); + } else { + this.createNonNativeTrack(trackName); + } + }; + + _proto.createNativeTrack = function createNativeTrack(trackName) { + if (this.captionsTracks[trackName]) { + return; + } + + var captionsProperties = this.captionsProperties, + captionsTracks = this.captionsTracks, + media = this.media; + var _captionsProperties$t = captionsProperties[trackName], + label = _captionsProperties$t.label, + languageCode = _captionsProperties$t.languageCode; // Enable reuse of existing text track. + + var existingTrack = this.getExistingTrack(trackName); + + if (!existingTrack) { + var textTrack = this.createTextTrack('captions', label, languageCode); + + if (textTrack) { + // Set a special property on the track so we know it's managed by Hls.js + textTrack[trackName] = true; + captionsTracks[trackName] = textTrack; + } + } else { + captionsTracks[trackName] = existingTrack; + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["clearCurrentCues"])(captionsTracks[trackName]); + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["sendAddTrackEvent"])(captionsTracks[trackName], media); + } + }; + + _proto.createNonNativeTrack = function createNonNativeTrack(trackName) { + if (this.nonNativeCaptionsTracks[trackName]) { + return; + } // Create a list of a single track for the provider to consume + + + var trackProperties = this.captionsProperties[trackName]; + + if (!trackProperties) { + return; + } + + var label = trackProperties.label; + var track = { + _id: trackName, + label: label, + kind: 'captions', + default: trackProperties.media ? !!trackProperties.media.default : false, + closedCaptions: trackProperties.media + }; + this.nonNativeCaptionsTracks[trackName] = track; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].NON_NATIVE_TEXT_TRACKS_FOUND, { + tracks: [track] + }); + }; + + _proto.createTextTrack = function createTextTrack(kind, label, lang) { + var media = this.media; + + if (!media) { + return; + } + + return media.addTextTrack(kind, label, lang); + }; + + _proto.onMediaAttaching = function onMediaAttaching(event, data) { + this.media = data.media; + + this._cleanTracks(); + }; + + _proto.onMediaDetaching = function onMediaDetaching() { + var captionsTracks = this.captionsTracks; + Object.keys(captionsTracks).forEach(function (trackName) { + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["clearCurrentCues"])(captionsTracks[trackName]); + delete captionsTracks[trackName]; + }); + this.nonNativeCaptionsTracks = {}; + }; + + _proto.onManifestLoading = function onManifestLoading() { + this.lastSn = -1; // Detect discontinuity in fragment parsing + + this.prevCC = -1; + this.vttCCs = newVTTCCs(); // Detect discontinuity in subtitle manifests + + this._cleanTracks(); + + this.tracks = []; + this.captionsTracks = {}; + this.nonNativeCaptionsTracks = {}; + this.textTracks = []; + this.unparsedVttFrags = this.unparsedVttFrags || []; + this.initPTS = []; + this.timescale = []; + + if (this.cea608Parser1 && this.cea608Parser2) { + this.cea608Parser1.reset(); + this.cea608Parser2.reset(); + } + }; + + _proto._cleanTracks = function _cleanTracks() { + // clear outdated subtitles + var media = this.media; + + if (!media) { + return; + } + + var textTracks = media.textTracks; + + if (textTracks) { + for (var i = 0; i < textTracks.length; i++) { + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["clearCurrentCues"])(textTracks[i]); + } + } + }; + + _proto.onSubtitleTracksUpdated = function onSubtitleTracksUpdated(event, data) { + var _this2 = this; + + this.textTracks = []; + var tracks = data.subtitleTracks || []; + var hasIMSC1 = tracks.some(function (track) { + return track.textCodec === _utils_imsc1_ttml_parser__WEBPACK_IMPORTED_MODULE_6__["IMSC1_CODEC"]; + }); + + if (this.config.enableWebVTT || hasIMSC1 && this.config.enableIMSC1) { + var sameTracks = this.tracks && tracks && this.tracks.length === tracks.length; + this.tracks = tracks || []; + + if (this.config.renderTextTracksNatively) { + var inUseTracks = this.media ? this.media.textTracks : []; + this.tracks.forEach(function (track, index) { + var textTrack; + + if (index < inUseTracks.length) { + var inUseTrack = null; + + for (var i = 0; i < inUseTracks.length; i++) { + if (canReuseVttTextTrack(inUseTracks[i], track)) { + inUseTrack = inUseTracks[i]; + break; + } + } // Reuse tracks with the same label, but do not reuse 608/708 tracks + + + if (inUseTrack) { + textTrack = inUseTrack; + } + } + + if (textTrack) { + Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["clearCurrentCues"])(textTrack); + } else { + textTrack = _this2.createTextTrack('subtitles', track.name, track.lang); + + if (textTrack) { + textTrack.mode = 'disabled'; + } + } + + if (textTrack) { + textTrack.groupId = track.groupId; + + _this2.textTracks.push(textTrack); + } + }); + } else if (!sameTracks && this.tracks && this.tracks.length) { + // Create a list of tracks for the provider to consume + var tracksList = this.tracks.map(function (track) { + return { + label: track.name, + kind: track.type.toLowerCase(), + default: track.default, + subtitleTrack: track + }; + }); + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].NON_NATIVE_TEXT_TRACKS_FOUND, { + tracks: tracksList + }); + } + } + }; + + _proto.onManifestLoaded = function onManifestLoaded(event, data) { + var _this3 = this; + + if (this.config.enableCEA708Captions && data.captions) { + data.captions.forEach(function (captionsTrack) { + var instreamIdMatch = /(?:CC|SERVICE)([1-4])/.exec(captionsTrack.instreamId); + + if (!instreamIdMatch) { + return; + } + + var trackName = "textTrack" + instreamIdMatch[1]; + var trackProperties = _this3.captionsProperties[trackName]; + + if (!trackProperties) { + return; + } + + trackProperties.label = captionsTrack.name; + + if (captionsTrack.lang) { + // optional attribute + trackProperties.languageCode = captionsTrack.lang; + } + + trackProperties.media = captionsTrack; + }); + } + }; + + _proto.onFragLoading = function onFragLoading(event, data) { + var cea608Parser1 = this.cea608Parser1, + cea608Parser2 = this.cea608Parser2, + lastSn = this.lastSn; + + if (!this.enabled || !(cea608Parser1 && cea608Parser2)) { + return; + } // if this frag isn't contiguous, clear the parser so cues with bad start/end times aren't added to the textTrack + + + if (data.frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_7__["PlaylistLevelType"].MAIN) { + var sn = data.frag.sn; + + if (sn !== lastSn + 1) { + cea608Parser1.reset(); + cea608Parser2.reset(); + } + + this.lastSn = sn; + } + }; + + _proto.onFragLoaded = function onFragLoaded(event, data) { + var frag = data.frag, + payload = data.payload; + var initPTS = this.initPTS, + unparsedVttFrags = this.unparsedVttFrags; + + if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_7__["PlaylistLevelType"].SUBTITLE) { + // If fragment is subtitle type, parse as WebVTT. + if (payload.byteLength) { + // We need an initial synchronisation PTS. Store fragments as long as none has arrived. + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(initPTS[frag.cc])) { + unparsedVttFrags.push(data); + + if (initPTS.length) { + // finish unsuccessfully, otherwise the subtitle-stream-controller could be blocked from loading new frags. + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, { + success: false, + frag: frag, + error: new Error('Missing initial subtitle PTS') + }); + } + + return; + } + + var decryptData = frag.decryptdata; // If the subtitles are not encrypted, parse VTTs now. Otherwise, we need to wait. + + if (decryptData == null || decryptData.key == null || decryptData.method !== 'AES-128') { + var trackPlaylistMedia = this.tracks[frag.level]; + var vttCCs = this.vttCCs; + + if (!vttCCs[frag.cc]) { + vttCCs[frag.cc] = { + start: frag.start, + prevCC: this.prevCC, + new: true + }; + this.prevCC = frag.cc; + } + + if (trackPlaylistMedia && trackPlaylistMedia.textCodec === _utils_imsc1_ttml_parser__WEBPACK_IMPORTED_MODULE_6__["IMSC1_CODEC"]) { + this._parseIMSC1(frag, payload); + } else { + this._parseVTTs(frag, payload, vttCCs); + } + } + } else { + // In case there is no payload, finish unsuccessfully. + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, { + success: false, + frag: frag, + error: new Error('Empty subtitle payload') + }); + } + } + }; + + _proto._parseIMSC1 = function _parseIMSC1(frag, payload) { + var _this4 = this; + + var hls = this.hls; + Object(_utils_imsc1_ttml_parser__WEBPACK_IMPORTED_MODULE_6__["parseIMSC1"])(payload, this.initPTS[frag.cc], this.timescale[frag.cc], function (cues) { + _this4._appendCues(cues, frag.level); + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, { + success: true, + frag: frag + }); + }, function (error) { + _utils_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].log("Failed to parse IMSC1: " + error); + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, { + success: false, + frag: frag, + error: error + }); + }); + }; + + _proto._parseVTTs = function _parseVTTs(frag, payload, vttCCs) { + var _this5 = this; + + var hls = this.hls; // Parse the WebVTT file contents. + + Object(_utils_webvtt_parser__WEBPACK_IMPORTED_MODULE_4__["parseWebVTT"])(payload, this.initPTS[frag.cc], this.timescale[frag.cc], vttCCs, frag.cc, frag.start, function (cues) { + _this5._appendCues(cues, frag.level); + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, { + success: true, + frag: frag + }); + }, function (error) { + _this5._fallbackToIMSC1(frag, payload); // Something went wrong while parsing. Trigger event with success false. + + + _utils_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].log("Failed to parse VTT cue: " + error); + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, { + success: false, + frag: frag, + error: error + }); + }); + }; + + _proto._fallbackToIMSC1 = function _fallbackToIMSC1(frag, payload) { + var _this6 = this; + + // If textCodec is unknown, try parsing as IMSC1. Set textCodec based on the result + var trackPlaylistMedia = this.tracks[frag.level]; + + if (!trackPlaylistMedia.textCodec) { + Object(_utils_imsc1_ttml_parser__WEBPACK_IMPORTED_MODULE_6__["parseIMSC1"])(payload, this.initPTS[frag.cc], this.timescale[frag.cc], function () { + trackPlaylistMedia.textCodec = _utils_imsc1_ttml_parser__WEBPACK_IMPORTED_MODULE_6__["IMSC1_CODEC"]; + + _this6._parseIMSC1(frag, payload); + }, function () { + trackPlaylistMedia.textCodec = 'wvtt'; + }); + } + }; + + _proto._appendCues = function _appendCues(cues, fragLevel) { + var hls = this.hls; + + if (this.config.renderTextTracksNatively) { + var textTrack = this.textTracks[fragLevel]; // WebVTTParser.parse is an async method and if the currently selected text track mode is set to "disabled" + // before parsing is done then don't try to access currentTrack.cues.getCueById as cues will be null + // and trying to access getCueById method of cues will throw an exception + // Because we check if the mode is disabled, we can force check `cues` below. They can't be null. + + if (textTrack.mode === 'disabled') { + return; + } + + cues.forEach(function (cue) { + return Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["addCueToTrack"])(textTrack, cue); + }); + } else { + var currentTrack = this.tracks[fragLevel]; + var track = currentTrack.default ? 'default' : 'subtitles' + fragLevel; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].CUES_PARSED, { + type: 'subtitles', + cues: cues, + track: track + }); + } + }; + + _proto.onFragDecrypted = function onFragDecrypted(event, data) { + var frag = data.frag; + + if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_7__["PlaylistLevelType"].SUBTITLE) { + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(this.initPTS[frag.cc])) { + this.unparsedVttFrags.push(data); + return; + } + + this.onFragLoaded(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_LOADED, data); + } + }; + + _proto.onSubtitleTracksCleared = function onSubtitleTracksCleared() { + this.tracks = []; + this.captionsTracks = {}; + }; + + _proto.onFragParsingUserdata = function onFragParsingUserdata(event, data) { + var cea608Parser1 = this.cea608Parser1, + cea608Parser2 = this.cea608Parser2; + + if (!this.enabled || !(cea608Parser1 && cea608Parser2)) { + return; + } // If the event contains captions (found in the bytes property), push all bytes into the parser immediately + // It will create the proper timestamps based on the PTS value + + + for (var i = 0; i < data.samples.length; i++) { + var ccBytes = data.samples[i].bytes; + + if (ccBytes) { + var ccdatas = this.extractCea608Data(ccBytes); + cea608Parser1.addData(data.samples[i].pts, ccdatas[0]); + cea608Parser2.addData(data.samples[i].pts, ccdatas[1]); + } + } + }; + + _proto.onBufferFlushing = function onBufferFlushing(event, _ref2) { + var startOffset = _ref2.startOffset, + endOffset = _ref2.endOffset, + endOffsetSubtitles = _ref2.endOffsetSubtitles, + type = _ref2.type; + var media = this.media; + + if (!media || media.currentTime < endOffset) { + return; + } // Clear 608 caption cues from the captions TextTracks when the video back buffer is flushed + // Forward cues are never removed because we can loose streamed 608 content from recent fragments + + + if (!type || type === 'video') { + var captionsTracks = this.captionsTracks; + Object.keys(captionsTracks).forEach(function (trackName) { + return Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["removeCuesInRange"])(captionsTracks[trackName], startOffset, endOffset); + }); + } + + if (this.config.renderTextTracksNatively) { + // Clear VTT/IMSC1 subtitle cues from the subtitle TextTracks when the back buffer is flushed + if (startOffset === 0 && endOffsetSubtitles !== undefined) { + var textTracks = this.textTracks; + Object.keys(textTracks).forEach(function (trackName) { + return Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["removeCuesInRange"])(textTracks[trackName], startOffset, endOffsetSubtitles); + }); + } + } + }; + + _proto.extractCea608Data = function extractCea608Data(byteArray) { + var count = byteArray[0] & 31; + var position = 2; + var actualCCBytes = [[], []]; + + for (var j = 0; j < count; j++) { + var tmpByte = byteArray[position++]; + var ccbyte1 = 0x7f & byteArray[position++]; + var ccbyte2 = 0x7f & byteArray[position++]; + var ccValid = (4 & tmpByte) !== 0; + var ccType = 3 & tmpByte; + + if (ccbyte1 === 0 && ccbyte2 === 0) { + continue; + } + + if (ccValid) { + if (ccType === 0 || ccType === 1) { + actualCCBytes[ccType].push(ccbyte1); + actualCCBytes[ccType].push(ccbyte2); + } + } + } + + return actualCCBytes; + }; + + return TimelineController; +}(); + +function canReuseVttTextTrack(inUseTrack, manifestTrack) { + return inUseTrack && inUseTrack.label === manifestTrack.name && !(inUseTrack.textTrack1 || inUseTrack.textTrack2); +} + +function intersection(x1, x2, y1, y2) { + return Math.min(x2, y2) - Math.max(x1, y1); +} + +function newVTTCCs() { + return { + ccOffset: 0, + presentationOffset: 0, + 0: { + start: 0, + prevCC: -1, + new: false + } + }; +} + +/***/ }), + +/***/ "./src/crypt/aes-crypto.ts": +/*!*********************************!*\ + !*** ./src/crypt/aes-crypto.ts ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AESCrypto; }); +var AESCrypto = /*#__PURE__*/function () { + function AESCrypto(subtle, iv) { + this.subtle = void 0; + this.aesIV = void 0; + this.subtle = subtle; + this.aesIV = iv; + } + + var _proto = AESCrypto.prototype; + + _proto.decrypt = function decrypt(data, key) { + return this.subtle.decrypt({ + name: 'AES-CBC', + iv: this.aesIV + }, key, data); + }; + + return AESCrypto; +}(); + + + +/***/ }), + +/***/ "./src/crypt/aes-decryptor.ts": +/*!************************************!*\ + !*** ./src/crypt/aes-decryptor.ts ***! + \************************************/ +/*! exports provided: removePadding, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removePadding", function() { return removePadding; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AESDecryptor; }); +/* harmony import */ var _utils_typed_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/typed-array */ "./src/utils/typed-array.ts"); + // PKCS7 + +function removePadding(array) { + var outputBytes = array.byteLength; + var paddingBytes = outputBytes && new DataView(array.buffer).getUint8(outputBytes - 1); + + if (paddingBytes) { + return Object(_utils_typed_array__WEBPACK_IMPORTED_MODULE_0__["sliceUint8"])(array, 0, outputBytes - paddingBytes); + } + + return array; +} + +var AESDecryptor = /*#__PURE__*/function () { + function AESDecryptor() { + this.rcon = [0x0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + this.subMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)]; + this.invSubMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)]; + this.sBox = new Uint32Array(256); + this.invSBox = new Uint32Array(256); + this.key = new Uint32Array(0); + this.ksRows = 0; + this.keySize = 0; + this.keySchedule = void 0; + this.invKeySchedule = void 0; + this.initTable(); + } // Using view.getUint32() also swaps the byte order. + + + var _proto = AESDecryptor.prototype; + + _proto.uint8ArrayToUint32Array_ = function uint8ArrayToUint32Array_(arrayBuffer) { + var view = new DataView(arrayBuffer); + var newArray = new Uint32Array(4); + + for (var i = 0; i < 4; i++) { + newArray[i] = view.getUint32(i * 4); + } + + return newArray; + }; + + _proto.initTable = function initTable() { + var sBox = this.sBox; + var invSBox = this.invSBox; + var subMix = this.subMix; + var subMix0 = subMix[0]; + var subMix1 = subMix[1]; + var subMix2 = subMix[2]; + var subMix3 = subMix[3]; + var invSubMix = this.invSubMix; + var invSubMix0 = invSubMix[0]; + var invSubMix1 = invSubMix[1]; + var invSubMix2 = invSubMix[2]; + var invSubMix3 = invSubMix[3]; + var d = new Uint32Array(256); + var x = 0; + var xi = 0; + var i = 0; + + for (i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = i << 1 ^ 0x11b; + } + } + + for (i = 0; i < 256; i++) { + var sx = xi ^ xi << 1 ^ xi << 2 ^ xi << 3 ^ xi << 4; + sx = sx >>> 8 ^ sx & 0xff ^ 0x63; + sBox[x] = sx; + invSBox[sx] = x; // Compute multiplication + + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; // Compute sub/invSub bytes, mix columns tables + + var t = d[sx] * 0x101 ^ sx * 0x1010100; + subMix0[x] = t << 24 | t >>> 8; + subMix1[x] = t << 16 | t >>> 16; + subMix2[x] = t << 8 | t >>> 24; + subMix3[x] = t; // Compute inv sub bytes, inv mix columns tables + + t = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100; + invSubMix0[sx] = t << 24 | t >>> 8; + invSubMix1[sx] = t << 16 | t >>> 16; + invSubMix2[sx] = t << 8 | t >>> 24; + invSubMix3[sx] = t; // Compute next counter + + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }; + + _proto.expandKey = function expandKey(keyBuffer) { + // convert keyBuffer to Uint32Array + var key = this.uint8ArrayToUint32Array_(keyBuffer); + var sameKey = true; + var offset = 0; + + while (offset < key.length && sameKey) { + sameKey = key[offset] === this.key[offset]; + offset++; + } + + if (sameKey) { + return; + } + + this.key = key; + var keySize = this.keySize = key.length; + + if (keySize !== 4 && keySize !== 6 && keySize !== 8) { + throw new Error('Invalid aes key size=' + keySize); + } + + var ksRows = this.ksRows = (keySize + 6 + 1) * 4; + var ksRow; + var invKsRow; + var keySchedule = this.keySchedule = new Uint32Array(ksRows); + var invKeySchedule = this.invKeySchedule = new Uint32Array(ksRows); + var sbox = this.sBox; + var rcon = this.rcon; + var invSubMix = this.invSubMix; + var invSubMix0 = invSubMix[0]; + var invSubMix1 = invSubMix[1]; + var invSubMix2 = invSubMix[2]; + var invSubMix3 = invSubMix[3]; + var prev; + var t; + + for (ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + prev = keySchedule[ksRow] = key[ksRow]; + continue; + } + + t = prev; + + if (ksRow % keySize === 0) { + // Rot word + t = t << 8 | t >>> 24; // Sub word + + t = sbox[t >>> 24] << 24 | sbox[t >>> 16 & 0xff] << 16 | sbox[t >>> 8 & 0xff] << 8 | sbox[t & 0xff]; // Mix Rcon + + t ^= rcon[ksRow / keySize | 0] << 24; + } else if (keySize > 6 && ksRow % keySize === 4) { + // Sub word + t = sbox[t >>> 24] << 24 | sbox[t >>> 16 & 0xff] << 16 | sbox[t >>> 8 & 0xff] << 8 | sbox[t & 0xff]; + } + + keySchedule[ksRow] = prev = (keySchedule[ksRow - keySize] ^ t) >>> 0; + } + + for (invKsRow = 0; invKsRow < ksRows; invKsRow++) { + ksRow = ksRows - invKsRow; + + if (invKsRow & 3) { + t = keySchedule[ksRow]; + } else { + t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = invSubMix0[sbox[t >>> 24]] ^ invSubMix1[sbox[t >>> 16 & 0xff]] ^ invSubMix2[sbox[t >>> 8 & 0xff]] ^ invSubMix3[sbox[t & 0xff]]; + } + + invKeySchedule[invKsRow] = invKeySchedule[invKsRow] >>> 0; + } + } // Adding this as a method greatly improves performance. + ; + + _proto.networkToHostOrderSwap = function networkToHostOrderSwap(word) { + return word << 24 | (word & 0xff00) << 8 | (word & 0xff0000) >> 8 | word >>> 24; + }; + + _proto.decrypt = function decrypt(inputArrayBuffer, offset, aesIV) { + var nRounds = this.keySize + 6; + var invKeySchedule = this.invKeySchedule; + var invSBOX = this.invSBox; + var invSubMix = this.invSubMix; + var invSubMix0 = invSubMix[0]; + var invSubMix1 = invSubMix[1]; + var invSubMix2 = invSubMix[2]; + var invSubMix3 = invSubMix[3]; + var initVector = this.uint8ArrayToUint32Array_(aesIV); + var initVector0 = initVector[0]; + var initVector1 = initVector[1]; + var initVector2 = initVector[2]; + var initVector3 = initVector[3]; + var inputInt32 = new Int32Array(inputArrayBuffer); + var outputInt32 = new Int32Array(inputInt32.length); + var t0, t1, t2, t3; + var s0, s1, s2, s3; + var inputWords0, inputWords1, inputWords2, inputWords3; + var ksRow, i; + var swapWord = this.networkToHostOrderSwap; + + while (offset < inputInt32.length) { + inputWords0 = swapWord(inputInt32[offset]); + inputWords1 = swapWord(inputInt32[offset + 1]); + inputWords2 = swapWord(inputInt32[offset + 2]); + inputWords3 = swapWord(inputInt32[offset + 3]); + s0 = inputWords0 ^ invKeySchedule[0]; + s1 = inputWords3 ^ invKeySchedule[1]; + s2 = inputWords2 ^ invKeySchedule[2]; + s3 = inputWords1 ^ invKeySchedule[3]; + ksRow = 4; // Iterate through the rounds of decryption + + for (i = 1; i < nRounds; i++) { + t0 = invSubMix0[s0 >>> 24] ^ invSubMix1[s1 >> 16 & 0xff] ^ invSubMix2[s2 >> 8 & 0xff] ^ invSubMix3[s3 & 0xff] ^ invKeySchedule[ksRow]; + t1 = invSubMix0[s1 >>> 24] ^ invSubMix1[s2 >> 16 & 0xff] ^ invSubMix2[s3 >> 8 & 0xff] ^ invSubMix3[s0 & 0xff] ^ invKeySchedule[ksRow + 1]; + t2 = invSubMix0[s2 >>> 24] ^ invSubMix1[s3 >> 16 & 0xff] ^ invSubMix2[s0 >> 8 & 0xff] ^ invSubMix3[s1 & 0xff] ^ invKeySchedule[ksRow + 2]; + t3 = invSubMix0[s3 >>> 24] ^ invSubMix1[s0 >> 16 & 0xff] ^ invSubMix2[s1 >> 8 & 0xff] ^ invSubMix3[s2 & 0xff] ^ invKeySchedule[ksRow + 3]; // Update state + + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + ksRow = ksRow + 4; + } // Shift rows, sub bytes, add round key + + + t0 = invSBOX[s0 >>> 24] << 24 ^ invSBOX[s1 >> 16 & 0xff] << 16 ^ invSBOX[s2 >> 8 & 0xff] << 8 ^ invSBOX[s3 & 0xff] ^ invKeySchedule[ksRow]; + t1 = invSBOX[s1 >>> 24] << 24 ^ invSBOX[s2 >> 16 & 0xff] << 16 ^ invSBOX[s3 >> 8 & 0xff] << 8 ^ invSBOX[s0 & 0xff] ^ invKeySchedule[ksRow + 1]; + t2 = invSBOX[s2 >>> 24] << 24 ^ invSBOX[s3 >> 16 & 0xff] << 16 ^ invSBOX[s0 >> 8 & 0xff] << 8 ^ invSBOX[s1 & 0xff] ^ invKeySchedule[ksRow + 2]; + t3 = invSBOX[s3 >>> 24] << 24 ^ invSBOX[s0 >> 16 & 0xff] << 16 ^ invSBOX[s1 >> 8 & 0xff] << 8 ^ invSBOX[s2 & 0xff] ^ invKeySchedule[ksRow + 3]; // Write + + outputInt32[offset] = swapWord(t0 ^ initVector0); + outputInt32[offset + 1] = swapWord(t3 ^ initVector1); + outputInt32[offset + 2] = swapWord(t2 ^ initVector2); + outputInt32[offset + 3] = swapWord(t1 ^ initVector3); // reset initVector to last 4 unsigned int + + initVector0 = inputWords0; + initVector1 = inputWords1; + initVector2 = inputWords2; + initVector3 = inputWords3; + offset = offset + 4; + } + + return outputInt32.buffer; + }; + + return AESDecryptor; +}(); + + + +/***/ }), + +/***/ "./src/crypt/decrypter.ts": +/*!********************************!*\ + !*** ./src/crypt/decrypter.ts ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Decrypter; }); +/* harmony import */ var _aes_crypto__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./aes-crypto */ "./src/crypt/aes-crypto.ts"); +/* harmony import */ var _fast_aes_key__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fast-aes-key */ "./src/crypt/fast-aes-key.ts"); +/* harmony import */ var _aes_decryptor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./aes-decryptor */ "./src/crypt/aes-decryptor.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _utils_typed_array__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/typed-array */ "./src/utils/typed-array.ts"); + + + + + + +var CHUNK_SIZE = 16; // 16 bytes, 128 bits + +var Decrypter = /*#__PURE__*/function () { + function Decrypter(observer, config, _temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$removePKCS7Paddi = _ref.removePKCS7Padding, + removePKCS7Padding = _ref$removePKCS7Paddi === void 0 ? true : _ref$removePKCS7Paddi; + + this.logEnabled = true; + this.observer = void 0; + this.config = void 0; + this.removePKCS7Padding = void 0; + this.subtle = null; + this.softwareDecrypter = null; + this.key = null; + this.fastAesKey = null; + this.remainderData = null; + this.currentIV = null; + this.currentResult = null; + this.observer = observer; + this.config = config; + this.removePKCS7Padding = removePKCS7Padding; // built in decryptor expects PKCS7 padding + + if (removePKCS7Padding) { + try { + var browserCrypto = self.crypto; + + if (browserCrypto) { + this.subtle = browserCrypto.subtle || browserCrypto.webkitSubtle; + } + } catch (e) { + /* no-op */ + } + } + + if (this.subtle === null) { + this.config.enableSoftwareAES = true; + } + } + + var _proto = Decrypter.prototype; + + _proto.destroy = function destroy() { + // @ts-ignore + this.observer = null; + }; + + _proto.isSync = function isSync() { + return this.config.enableSoftwareAES; + }; + + _proto.flush = function flush() { + var currentResult = this.currentResult; + + if (!currentResult) { + this.reset(); + return; + } + + var data = new Uint8Array(currentResult); + this.reset(); + + if (this.removePKCS7Padding) { + return Object(_aes_decryptor__WEBPACK_IMPORTED_MODULE_2__["removePadding"])(data); + } + + return data; + }; + + _proto.reset = function reset() { + this.currentResult = null; + this.currentIV = null; + this.remainderData = null; + + if (this.softwareDecrypter) { + this.softwareDecrypter = null; + } + }; + + _proto.decrypt = function decrypt(data, key, iv, callback) { + if (this.config.enableSoftwareAES) { + this.softwareDecrypt(new Uint8Array(data), key, iv); + var decryptResult = this.flush(); + + if (decryptResult) { + callback(decryptResult.buffer); + } + } else { + this.webCryptoDecrypt(new Uint8Array(data), key, iv).then(callback); + } + }; + + _proto.softwareDecrypt = function softwareDecrypt(data, key, iv) { + var currentIV = this.currentIV, + currentResult = this.currentResult, + remainderData = this.remainderData; + this.logOnce('JS AES decrypt'); // The output is staggered during progressive parsing - the current result is cached, and emitted on the next call + // This is done in order to strip PKCS7 padding, which is found at the end of each segment. We only know we've reached + // the end on flush(), but by that time we have already received all bytes for the segment. + // Progressive decryption does not work with WebCrypto + + if (remainderData) { + data = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["appendUint8Array"])(remainderData, data); + this.remainderData = null; + } // Byte length must be a multiple of 16 (AES-128 = 128 bit blocks = 16 bytes) + + + var currentChunk = this.getValidChunk(data); + + if (!currentChunk.length) { + return null; + } + + if (currentIV) { + iv = currentIV; + } + + var softwareDecrypter = this.softwareDecrypter; + + if (!softwareDecrypter) { + softwareDecrypter = this.softwareDecrypter = new _aes_decryptor__WEBPACK_IMPORTED_MODULE_2__["default"](); + } + + softwareDecrypter.expandKey(key); + var result = currentResult; + this.currentResult = softwareDecrypter.decrypt(currentChunk.buffer, 0, iv); + this.currentIV = Object(_utils_typed_array__WEBPACK_IMPORTED_MODULE_5__["sliceUint8"])(currentChunk, -16).buffer; + + if (!result) { + return null; + } + + return result; + }; + + _proto.webCryptoDecrypt = function webCryptoDecrypt(data, key, iv) { + var _this = this; + + var subtle = this.subtle; + + if (this.key !== key || !this.fastAesKey) { + this.key = key; + this.fastAesKey = new _fast_aes_key__WEBPACK_IMPORTED_MODULE_1__["default"](subtle, key); + } + + return this.fastAesKey.expandKey().then(function (aesKey) { + // decrypt using web crypto + if (!subtle) { + return Promise.reject(new Error('web crypto not initialized')); + } + + var crypto = new _aes_crypto__WEBPACK_IMPORTED_MODULE_0__["default"](subtle, iv); + return crypto.decrypt(data.buffer, aesKey); + }).catch(function (err) { + return _this.onWebCryptoError(err, data, key, iv); + }); + }; + + _proto.onWebCryptoError = function onWebCryptoError(err, data, key, iv) { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('[decrypter.ts]: WebCrypto Error, disable WebCrypto API:', err); + this.config.enableSoftwareAES = true; + this.logEnabled = true; + return this.softwareDecrypt(data, key, iv); + }; + + _proto.getValidChunk = function getValidChunk(data) { + var currentChunk = data; + var splitPoint = data.length - data.length % CHUNK_SIZE; + + if (splitPoint !== data.length) { + currentChunk = Object(_utils_typed_array__WEBPACK_IMPORTED_MODULE_5__["sliceUint8"])(data, 0, splitPoint); + this.remainderData = Object(_utils_typed_array__WEBPACK_IMPORTED_MODULE_5__["sliceUint8"])(data, splitPoint); + } + + return currentChunk; + }; + + _proto.logOnce = function logOnce(msg) { + if (!this.logEnabled) { + return; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].log("[decrypter.ts]: " + msg); + this.logEnabled = false; + }; + + return Decrypter; +}(); + + + +/***/ }), + +/***/ "./src/crypt/fast-aes-key.ts": +/*!***********************************!*\ + !*** ./src/crypt/fast-aes-key.ts ***! + \***********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FastAESKey; }); +var FastAESKey = /*#__PURE__*/function () { + function FastAESKey(subtle, key) { + this.subtle = void 0; + this.key = void 0; + this.subtle = subtle; + this.key = key; + } + + var _proto = FastAESKey.prototype; + + _proto.expandKey = function expandKey() { + return this.subtle.importKey('raw', this.key, { + name: 'AES-CBC' + }, false, ['encrypt', 'decrypt']); + }; + + return FastAESKey; +}(); + + + +/***/ }), + +/***/ "./src/demux/aacdemuxer.ts": +/*!*********************************!*\ + !*** ./src/demux/aacdemuxer.ts ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _base_audio_demuxer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-audio-demuxer */ "./src/demux/base-audio-demuxer.ts"); +/* harmony import */ var _adts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./adts */ "./src/demux/adts.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _demux_id3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../demux/id3 */ "./src/demux/id3.ts"); +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +/** + * AAC demuxer + */ + + + + + +var AACDemuxer = /*#__PURE__*/function (_BaseAudioDemuxer) { + _inheritsLoose(AACDemuxer, _BaseAudioDemuxer); + + function AACDemuxer(observer, config) { + var _this; + + _this = _BaseAudioDemuxer.call(this) || this; + _this.observer = void 0; + _this.config = void 0; + _this.observer = observer; + _this.config = config; + return _this; + } + + var _proto = AACDemuxer.prototype; + + _proto.resetInitSegment = function resetInitSegment(audioCodec, videoCodec, duration) { + _BaseAudioDemuxer.prototype.resetInitSegment.call(this, audioCodec, videoCodec, duration); + + this._audioTrack = { + container: 'audio/adts', + type: 'audio', + id: 0, + pid: -1, + sequenceNumber: 0, + isAAC: true, + samples: [], + manifestCodec: audioCodec, + duration: duration, + inputTimeScale: 90000, + dropped: 0 + }; + } // Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS + ; + + AACDemuxer.probe = function probe(data) { + if (!data) { + return false; + } // Check for the ADTS sync word + // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be either 0 or 1 + // Layer bits (position 14 and 15) in header should be always 0 for ADTS + // More info https://wiki.multimedia.cx/index.php?title=ADTS + + + var id3Data = _demux_id3__WEBPACK_IMPORTED_MODULE_3__["getID3Data"](data, 0) || []; + var offset = id3Data.length; + + for (var length = data.length; offset < length; offset++) { + if (_adts__WEBPACK_IMPORTED_MODULE_1__["probe"](data, offset)) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('ADTS sync word found !'); + return true; + } + } + + return false; + }; + + _proto.canParse = function canParse(data, offset) { + return _adts__WEBPACK_IMPORTED_MODULE_1__["canParse"](data, offset); + }; + + _proto.appendFrame = function appendFrame(track, data, offset) { + _adts__WEBPACK_IMPORTED_MODULE_1__["initTrackConfig"](track, this.observer, data, offset, track.manifestCodec); + var frame = _adts__WEBPACK_IMPORTED_MODULE_1__["appendFrame"](track, data, offset, this.initPTS, this.frameIndex); + + if (frame && frame.missing === 0) { + return frame; + } + }; + + return AACDemuxer; +}(_base_audio_demuxer__WEBPACK_IMPORTED_MODULE_0__["default"]); + +AACDemuxer.minProbeByteLength = 9; +/* harmony default export */ __webpack_exports__["default"] = (AACDemuxer); + +/***/ }), + +/***/ "./src/demux/adts.ts": +/*!***************************!*\ + !*** ./src/demux/adts.ts ***! + \***************************/ +/*! exports provided: getAudioConfig, isHeaderPattern, getHeaderLength, getFullFrameLength, canGetFrameLength, isHeader, canParse, probe, initTrackConfig, getFrameDuration, parseFrameHeader, appendFrame */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAudioConfig", function() { return getAudioConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHeaderPattern", function() { return isHeaderPattern; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getHeaderLength", function() { return getHeaderLength; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFullFrameLength", function() { return getFullFrameLength; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canGetFrameLength", function() { return canGetFrameLength; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHeader", function() { return isHeader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canParse", function() { return canParse; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "probe", function() { return probe; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initTrackConfig", function() { return initTrackConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFrameDuration", function() { return getFrameDuration; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseFrameHeader", function() { return parseFrameHeader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "appendFrame", function() { return appendFrame; }); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/** + * ADTS parser helper + * @link https://wiki.multimedia.cx/index.php?title=ADTS + */ + + + +function getAudioConfig(observer, data, offset, audioCodec) { + var adtsObjectType; + var adtsExtensionSamplingIndex; + var adtsChanelConfig; + var config; + var userAgent = navigator.userAgent.toLowerCase(); + var manifestCodec = audioCodec; + var adtsSampleingRates = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350]; // byte 2 + + adtsObjectType = ((data[offset + 2] & 0xc0) >>> 6) + 1; + var adtsSamplingIndex = (data[offset + 2] & 0x3c) >>> 2; + + if (adtsSamplingIndex > adtsSampleingRates.length - 1) { + observer.trigger(_events__WEBPACK_IMPORTED_MODULE_2__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].FRAG_PARSING_ERROR, + fatal: true, + reason: "invalid ADTS sampling index:" + adtsSamplingIndex + }); + return; + } + + adtsChanelConfig = (data[offset + 2] & 0x01) << 2; // byte 3 + + adtsChanelConfig |= (data[offset + 3] & 0xc0) >>> 6; + _utils_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].log("manifest codec:" + audioCodec + ", ADTS type:" + adtsObjectType + ", samplingIndex:" + adtsSamplingIndex); // firefox: freq less than 24kHz = AAC SBR (HE-AAC) + + if (/firefox/i.test(userAgent)) { + if (adtsSamplingIndex >= 6) { + adtsObjectType = 5; + config = new Array(4); // HE-AAC uses SBR (Spectral Band Replication) , high frequencies are constructed from low frequencies + // there is a factor 2 between frame sample rate and output sample rate + // multiply frequency by 2 (see table below, equivalent to substract 3) + + adtsExtensionSamplingIndex = adtsSamplingIndex - 3; + } else { + adtsObjectType = 2; + config = new Array(2); + adtsExtensionSamplingIndex = adtsSamplingIndex; + } // Android : always use AAC + + } else if (userAgent.indexOf('android') !== -1) { + adtsObjectType = 2; + config = new Array(2); + adtsExtensionSamplingIndex = adtsSamplingIndex; + } else { + /* for other browsers (Chrome/Vivaldi/Opera ...) + always force audio type to be HE-AAC SBR, as some browsers do not support audio codec switch properly (like Chrome ...) + */ + adtsObjectType = 5; + config = new Array(4); // if (manifest codec is HE-AAC or HE-AACv2) OR (manifest codec not specified AND frequency less than 24kHz) + + if (audioCodec && (audioCodec.indexOf('mp4a.40.29') !== -1 || audioCodec.indexOf('mp4a.40.5') !== -1) || !audioCodec && adtsSamplingIndex >= 6) { + // HE-AAC uses SBR (Spectral Band Replication) , high frequencies are constructed from low frequencies + // there is a factor 2 between frame sample rate and output sample rate + // multiply frequency by 2 (see table below, equivalent to substract 3) + adtsExtensionSamplingIndex = adtsSamplingIndex - 3; + } else { + // if (manifest codec is AAC) AND (frequency less than 24kHz AND nb channel is 1) OR (manifest codec not specified and mono audio) + // Chrome fails to play back with low frequency AAC LC mono when initialized with HE-AAC. This is not a problem with stereo. + if (audioCodec && audioCodec.indexOf('mp4a.40.2') !== -1 && (adtsSamplingIndex >= 6 && adtsChanelConfig === 1 || /vivaldi/i.test(userAgent)) || !audioCodec && adtsChanelConfig === 1) { + adtsObjectType = 2; + config = new Array(2); + } + + adtsExtensionSamplingIndex = adtsSamplingIndex; + } + } + /* refer to http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio#Audio_Specific_Config + ISO 14496-3 (AAC).pdf - Table 1.13 — Syntax of AudioSpecificConfig() + Audio Profile / Audio Object Type + 0: Null + 1: AAC Main + 2: AAC LC (Low Complexity) + 3: AAC SSR (Scalable Sample Rate) + 4: AAC LTP (Long Term Prediction) + 5: SBR (Spectral Band Replication) + 6: AAC Scalable + sampling freq + 0: 96000 Hz + 1: 88200 Hz + 2: 64000 Hz + 3: 48000 Hz + 4: 44100 Hz + 5: 32000 Hz + 6: 24000 Hz + 7: 22050 Hz + 8: 16000 Hz + 9: 12000 Hz + 10: 11025 Hz + 11: 8000 Hz + 12: 7350 Hz + 13: Reserved + 14: Reserved + 15: frequency is written explictly + Channel Configurations + These are the channel configurations: + 0: Defined in AOT Specifc Config + 1: 1 channel: front-center + 2: 2 channels: front-left, front-right + */ + // audioObjectType = profile => profile, the MPEG-4 Audio Object Type minus 1 + + + config[0] = adtsObjectType << 3; // samplingFrequencyIndex + + config[0] |= (adtsSamplingIndex & 0x0e) >> 1; + config[1] |= (adtsSamplingIndex & 0x01) << 7; // channelConfiguration + + config[1] |= adtsChanelConfig << 3; + + if (adtsObjectType === 5) { + // adtsExtensionSampleingIndex + config[1] |= (adtsExtensionSamplingIndex & 0x0e) >> 1; + config[2] = (adtsExtensionSamplingIndex & 0x01) << 7; // adtsObjectType (force to 2, chrome is checking that object type is less than 5 ??? + // https://chromium.googlesource.com/chromium/src.git/+/master/media/formats/mp4/aac.cc + + config[2] |= 2 << 2; + config[3] = 0; + } + + return { + config: config, + samplerate: adtsSampleingRates[adtsSamplingIndex], + channelCount: adtsChanelConfig, + codec: 'mp4a.40.' + adtsObjectType, + manifestCodec: manifestCodec + }; +} +function isHeaderPattern(data, offset) { + return data[offset] === 0xff && (data[offset + 1] & 0xf6) === 0xf0; +} +function getHeaderLength(data, offset) { + return data[offset + 1] & 0x01 ? 7 : 9; +} +function getFullFrameLength(data, offset) { + return (data[offset + 3] & 0x03) << 11 | data[offset + 4] << 3 | (data[offset + 5] & 0xe0) >>> 5; +} +function canGetFrameLength(data, offset) { + return offset + 5 < data.length; +} +function isHeader(data, offset) { + // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be either 0 or 1 + // Layer bits (position 14 and 15) in header should be always 0 for ADTS + // More info https://wiki.multimedia.cx/index.php?title=ADTS + return offset + 1 < data.length && isHeaderPattern(data, offset); +} +function canParse(data, offset) { + return canGetFrameLength(data, offset) && isHeaderPattern(data, offset) && getFullFrameLength(data, offset) <= data.length - offset; +} +function probe(data, offset) { + // same as isHeader but we also check that ADTS frame follows last ADTS frame + // or end of data is reached + if (isHeader(data, offset)) { + // ADTS header Length + var headerLength = getHeaderLength(data, offset); + + if (offset + headerLength >= data.length) { + return false; + } // ADTS frame Length + + + var frameLength = getFullFrameLength(data, offset); + + if (frameLength <= headerLength) { + return false; + } + + var newOffset = offset + frameLength; + return newOffset === data.length || isHeader(data, newOffset); + } + + return false; +} +function initTrackConfig(track, observer, data, offset, audioCodec) { + if (!track.samplerate) { + var config = getAudioConfig(observer, data, offset, audioCodec); + + if (!config) { + return; + } + + track.config = config.config; + track.samplerate = config.samplerate; + track.channelCount = config.channelCount; + track.codec = config.codec; + track.manifestCodec = config.manifestCodec; + _utils_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].log("parsed codec:" + track.codec + ", rate:" + config.samplerate + ", channels:" + config.channelCount); + } +} +function getFrameDuration(samplerate) { + return 1024 * 90000 / samplerate; +} +function parseFrameHeader(data, offset, pts, frameIndex, frameDuration) { + // The protection skip bit tells us if we have 2 bytes of CRC data at the end of the ADTS header + var headerLength = getHeaderLength(data, offset); // retrieve frame size + + var frameLength = getFullFrameLength(data, offset); + frameLength -= headerLength; + + if (frameLength > 0) { + var stamp = pts + frameIndex * frameDuration; // logger.log(`AAC frame, offset/length/total/pts:${offset+headerLength}/${frameLength}/${data.byteLength}/${(stamp/90).toFixed(0)}`); + + return { + headerLength: headerLength, + frameLength: frameLength, + stamp: stamp + }; + } +} +function appendFrame(track, data, offset, pts, frameIndex) { + var frameDuration = getFrameDuration(track.samplerate); + var header = parseFrameHeader(data, offset, pts, frameIndex, frameDuration); + + if (header) { + var frameLength = header.frameLength, + headerLength = header.headerLength, + stamp = header.stamp; + var length = headerLength + frameLength; + var missing = Math.max(0, offset + length - data.length); // logger.log(`AAC frame ${frameIndex}, pts:${stamp} length@offset/total: ${frameLength}@${offset+headerLength}/${data.byteLength} missing: ${missing}`); + + var unit; + + if (missing) { + unit = new Uint8Array(length - headerLength); + unit.set(data.subarray(offset + headerLength, data.length), 0); + } else { + unit = data.subarray(offset + headerLength, offset + length); + } + + var sample = { + unit: unit, + pts: stamp + }; + + if (!missing) { + track.samples.push(sample); + } + + return { + sample: sample, + length: length, + missing: missing + }; + } +} + +/***/ }), + +/***/ "./src/demux/base-audio-demuxer.ts": +/*!*****************************************!*\ + !*** ./src/demux/base-audio-demuxer.ts ***! + \*****************************************/ +/*! exports provided: initPTSFn, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initPTSFn", function() { return initPTSFn; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _demux_id3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../demux/id3 */ "./src/demux/id3.ts"); +/* harmony import */ var _dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dummy-demuxed-track */ "./src/demux/dummy-demuxed-track.ts"); +/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _utils_typed_array__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/typed-array */ "./src/utils/typed-array.ts"); + + + + + + +var BaseAudioDemuxer = /*#__PURE__*/function () { + function BaseAudioDemuxer() { + this._audioTrack = void 0; + this._id3Track = void 0; + this.frameIndex = 0; + this.cachedData = null; + this.initPTS = null; + } + + var _proto = BaseAudioDemuxer.prototype; + + _proto.resetInitSegment = function resetInitSegment(audioCodec, videoCodec, duration) { + this._id3Track = { + type: 'id3', + id: 0, + pid: -1, + inputTimeScale: 90000, + sequenceNumber: 0, + samples: [], + dropped: 0 + }; + }; + + _proto.resetTimeStamp = function resetTimeStamp() {}; + + _proto.resetContiguity = function resetContiguity() {}; + + _proto.canParse = function canParse(data, offset) { + return false; + }; + + _proto.appendFrame = function appendFrame(track, data, offset) {} // feed incoming data to the front of the parsing pipeline + ; + + _proto.demux = function demux(data, timeOffset) { + if (this.cachedData) { + data = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_3__["appendUint8Array"])(this.cachedData, data); + this.cachedData = null; + } + + var id3Data = _demux_id3__WEBPACK_IMPORTED_MODULE_1__["getID3Data"](data, 0); + var offset = id3Data ? id3Data.length : 0; + var lastDataIndex; + var pts; + var track = this._audioTrack; + var id3Track = this._id3Track; + var timestamp = id3Data ? _demux_id3__WEBPACK_IMPORTED_MODULE_1__["getTimeStamp"](id3Data) : undefined; + var length = data.length; + + if (this.frameIndex === 0 || this.initPTS === null) { + this.initPTS = initPTSFn(timestamp, timeOffset); + } // more expressive than alternative: id3Data?.length + + + if (id3Data && id3Data.length > 0) { + id3Track.samples.push({ + pts: this.initPTS, + dts: this.initPTS, + data: id3Data + }); + } + + pts = this.initPTS; + + while (offset < length) { + if (this.canParse(data, offset)) { + var frame = this.appendFrame(track, data, offset); + + if (frame) { + this.frameIndex++; + pts = frame.sample.pts; + offset += frame.length; + lastDataIndex = offset; + } else { + offset = length; + } + } else if (_demux_id3__WEBPACK_IMPORTED_MODULE_1__["canParse"](data, offset)) { + // after a ID3.canParse, a call to ID3.getID3Data *should* always returns some data + id3Data = _demux_id3__WEBPACK_IMPORTED_MODULE_1__["getID3Data"](data, offset); + id3Track.samples.push({ + pts: pts, + dts: pts, + data: id3Data + }); + offset += id3Data.length; + lastDataIndex = offset; + } else { + offset++; + } + + if (offset === length && lastDataIndex !== length) { + var partialData = Object(_utils_typed_array__WEBPACK_IMPORTED_MODULE_4__["sliceUint8"])(data, lastDataIndex); + + if (this.cachedData) { + this.cachedData = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_3__["appendUint8Array"])(this.cachedData, partialData); + } else { + this.cachedData = partialData; + } + } + } + + return { + audioTrack: track, + avcTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_2__["dummyTrack"])(), + id3Track: id3Track, + textTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_2__["dummyTrack"])() + }; + }; + + _proto.demuxSampleAes = function demuxSampleAes(data, keyData, timeOffset) { + return Promise.reject(new Error("[" + this + "] This demuxer does not support Sample-AES decryption")); + }; + + _proto.flush = function flush(timeOffset) { + // Parse cache in case of remaining frames. + var cachedData = this.cachedData; + + if (cachedData) { + this.cachedData = null; + this.demux(cachedData, 0); + } + + this.frameIndex = 0; + return { + audioTrack: this._audioTrack, + avcTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_2__["dummyTrack"])(), + id3Track: this._id3Track, + textTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_2__["dummyTrack"])() + }; + }; + + _proto.destroy = function destroy() {}; + + return BaseAudioDemuxer; +}(); +/** + * Initialize PTS + *

+ * use timestamp unless it is undefined, NaN or Infinity + *

+ */ + + +var initPTSFn = function initPTSFn(timestamp, timeOffset) { + return Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(timestamp) ? timestamp * 90 : timeOffset * 90000; +}; +/* harmony default export */ __webpack_exports__["default"] = (BaseAudioDemuxer); + +/***/ }), + +/***/ "./src/demux/chunk-cache.ts": +/*!**********************************!*\ + !*** ./src/demux/chunk-cache.ts ***! + \**********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ChunkCache; }); +var ChunkCache = /*#__PURE__*/function () { + function ChunkCache() { + this.chunks = []; + this.dataLength = 0; + } + + var _proto = ChunkCache.prototype; + + _proto.push = function push(chunk) { + this.chunks.push(chunk); + this.dataLength += chunk.length; + }; + + _proto.flush = function flush() { + var chunks = this.chunks, + dataLength = this.dataLength; + var result; + + if (!chunks.length) { + return new Uint8Array(0); + } else if (chunks.length === 1) { + result = chunks[0]; + } else { + result = concatUint8Arrays(chunks, dataLength); + } + + this.reset(); + return result; + }; + + _proto.reset = function reset() { + this.chunks.length = 0; + this.dataLength = 0; + }; + + return ChunkCache; +}(); + + + +function concatUint8Arrays(chunks, dataLength) { + var result = new Uint8Array(dataLength); + var offset = 0; + + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + result.set(chunk, offset); + offset += chunk.length; + } + + return result; +} + +/***/ }), + +/***/ "./src/demux/dummy-demuxed-track.ts": +/*!******************************************!*\ + !*** ./src/demux/dummy-demuxed-track.ts ***! + \******************************************/ +/*! exports provided: dummyTrack */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dummyTrack", function() { return dummyTrack; }); +function dummyTrack() { + return { + type: '', + id: -1, + pid: -1, + inputTimeScale: 90000, + sequenceNumber: -1, + samples: [], + dropped: 0 + }; +} + +/***/ }), + +/***/ "./src/demux/exp-golomb.ts": +/*!*********************************!*\ + !*** ./src/demux/exp-golomb.ts ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/** + * Parser for exponential Golomb codes, a variable-bitwidth number encoding scheme used by h264. + */ + + +var ExpGolomb = /*#__PURE__*/function () { + function ExpGolomb(data) { + this.data = void 0; + this.bytesAvailable = void 0; + this.word = void 0; + this.bitsAvailable = void 0; + this.data = data; // the number of bytes left to examine in this.data + + this.bytesAvailable = data.byteLength; // the current word being examined + + this.word = 0; // :uint + // the number of bits left to examine in the current word + + this.bitsAvailable = 0; // :uint + } // ():void + + + var _proto = ExpGolomb.prototype; + + _proto.loadWord = function loadWord() { + var data = this.data; + var bytesAvailable = this.bytesAvailable; + var position = data.byteLength - bytesAvailable; + var workingBytes = new Uint8Array(4); + var availableBytes = Math.min(4, bytesAvailable); + + if (availableBytes === 0) { + throw new Error('no bytes available'); + } + + workingBytes.set(data.subarray(position, position + availableBytes)); + this.word = new DataView(workingBytes.buffer).getUint32(0); // track the amount of this.data that has been processed + + this.bitsAvailable = availableBytes * 8; + this.bytesAvailable -= availableBytes; + } // (count:int):void + ; + + _proto.skipBits = function skipBits(count) { + var skipBytes; // :int + + if (this.bitsAvailable > count) { + this.word <<= count; + this.bitsAvailable -= count; + } else { + count -= this.bitsAvailable; + skipBytes = count >> 3; + count -= skipBytes >> 3; + this.bytesAvailable -= skipBytes; + this.loadWord(); + this.word <<= count; + this.bitsAvailable -= count; + } + } // (size:int):uint + ; + + _proto.readBits = function readBits(size) { + var bits = Math.min(this.bitsAvailable, size); // :uint + + var valu = this.word >>> 32 - bits; // :uint + + if (size > 32) { + _utils_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error('Cannot read more than 32 bits at a time'); + } + + this.bitsAvailable -= bits; + + if (this.bitsAvailable > 0) { + this.word <<= bits; + } else if (this.bytesAvailable > 0) { + this.loadWord(); + } + + bits = size - bits; + + if (bits > 0 && this.bitsAvailable) { + return valu << bits | this.readBits(bits); + } else { + return valu; + } + } // ():uint + ; + + _proto.skipLZ = function skipLZ() { + var leadingZeroCount; // :uint + + for (leadingZeroCount = 0; leadingZeroCount < this.bitsAvailable; ++leadingZeroCount) { + if ((this.word & 0x80000000 >>> leadingZeroCount) !== 0) { + // the first bit of working word is 1 + this.word <<= leadingZeroCount; + this.bitsAvailable -= leadingZeroCount; + return leadingZeroCount; + } + } // we exhausted word and still have not found a 1 + + + this.loadWord(); + return leadingZeroCount + this.skipLZ(); + } // ():void + ; + + _proto.skipUEG = function skipUEG() { + this.skipBits(1 + this.skipLZ()); + } // ():void + ; + + _proto.skipEG = function skipEG() { + this.skipBits(1 + this.skipLZ()); + } // ():uint + ; + + _proto.readUEG = function readUEG() { + var clz = this.skipLZ(); // :uint + + return this.readBits(clz + 1) - 1; + } // ():int + ; + + _proto.readEG = function readEG() { + var valu = this.readUEG(); // :int + + if (0x01 & valu) { + // the number is odd if the low order bit is set + return 1 + valu >>> 1; // add 1 to make it even, and divide by 2 + } else { + return -1 * (valu >>> 1); // divide by two then make it negative + } + } // Some convenience functions + // :Boolean + ; + + _proto.readBoolean = function readBoolean() { + return this.readBits(1) === 1; + } // ():int + ; + + _proto.readUByte = function readUByte() { + return this.readBits(8); + } // ():int + ; + + _proto.readUShort = function readUShort() { + return this.readBits(16); + } // ():int + ; + + _proto.readUInt = function readUInt() { + return this.readBits(32); + } + /** + * Advance the ExpGolomb decoder past a scaling list. The scaling + * list is optionally transmitted as part of a sequence parameter + * set and is not relevant to transmuxing. + * @param count the number of entries in this scaling list + * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1 + */ + ; + + _proto.skipScalingList = function skipScalingList(count) { + var lastScale = 8; + var nextScale = 8; + var deltaScale; + + for (var j = 0; j < count; j++) { + if (nextScale !== 0) { + deltaScale = this.readEG(); + nextScale = (lastScale + deltaScale + 256) % 256; + } + + lastScale = nextScale === 0 ? lastScale : nextScale; + } + } + /** + * Read a sequence parameter set and return some interesting video + * properties. A sequence parameter set is the H264 metadata that + * describes the properties of upcoming video frames. + * @param data {Uint8Array} the bytes of a sequence parameter set + * @return {object} an object with configuration parsed from the + * sequence parameter set, including the dimensions of the + * associated video frames. + */ + ; + + _proto.readSPS = function readSPS() { + var frameCropLeftOffset = 0; + var frameCropRightOffset = 0; + var frameCropTopOffset = 0; + var frameCropBottomOffset = 0; + var numRefFramesInPicOrderCntCycle; + var scalingListCount; + var i; + var readUByte = this.readUByte.bind(this); + var readBits = this.readBits.bind(this); + var readUEG = this.readUEG.bind(this); + var readBoolean = this.readBoolean.bind(this); + var skipBits = this.skipBits.bind(this); + var skipEG = this.skipEG.bind(this); + var skipUEG = this.skipUEG.bind(this); + var skipScalingList = this.skipScalingList.bind(this); + readUByte(); + var profileIdc = readUByte(); // profile_idc + + readBits(5); // profileCompat constraint_set[0-4]_flag, u(5) + + skipBits(3); // reserved_zero_3bits u(3), + + readUByte(); // level_idc u(8) + + skipUEG(); // seq_parameter_set_id + // some profiles have more optional data we don't need + + if (profileIdc === 100 || profileIdc === 110 || profileIdc === 122 || profileIdc === 244 || profileIdc === 44 || profileIdc === 83 || profileIdc === 86 || profileIdc === 118 || profileIdc === 128) { + var chromaFormatIdc = readUEG(); + + if (chromaFormatIdc === 3) { + skipBits(1); + } // separate_colour_plane_flag + + + skipUEG(); // bit_depth_luma_minus8 + + skipUEG(); // bit_depth_chroma_minus8 + + skipBits(1); // qpprime_y_zero_transform_bypass_flag + + if (readBoolean()) { + // seq_scaling_matrix_present_flag + scalingListCount = chromaFormatIdc !== 3 ? 8 : 12; + + for (i = 0; i < scalingListCount; i++) { + if (readBoolean()) { + // seq_scaling_list_present_flag[ i ] + if (i < 6) { + skipScalingList(16); + } else { + skipScalingList(64); + } + } + } + } + } + + skipUEG(); // log2_max_frame_num_minus4 + + var picOrderCntType = readUEG(); + + if (picOrderCntType === 0) { + readUEG(); // log2_max_pic_order_cnt_lsb_minus4 + } else if (picOrderCntType === 1) { + skipBits(1); // delta_pic_order_always_zero_flag + + skipEG(); // offset_for_non_ref_pic + + skipEG(); // offset_for_top_to_bottom_field + + numRefFramesInPicOrderCntCycle = readUEG(); + + for (i = 0; i < numRefFramesInPicOrderCntCycle; i++) { + skipEG(); + } // offset_for_ref_frame[ i ] + + } + + skipUEG(); // max_num_ref_frames + + skipBits(1); // gaps_in_frame_num_value_allowed_flag + + var picWidthInMbsMinus1 = readUEG(); + var picHeightInMapUnitsMinus1 = readUEG(); + var frameMbsOnlyFlag = readBits(1); + + if (frameMbsOnlyFlag === 0) { + skipBits(1); + } // mb_adaptive_frame_field_flag + + + skipBits(1); // direct_8x8_inference_flag + + if (readBoolean()) { + // frame_cropping_flag + frameCropLeftOffset = readUEG(); + frameCropRightOffset = readUEG(); + frameCropTopOffset = readUEG(); + frameCropBottomOffset = readUEG(); + } + + var pixelRatio = [1, 1]; + + if (readBoolean()) { + // vui_parameters_present_flag + if (readBoolean()) { + // aspect_ratio_info_present_flag + var aspectRatioIdc = readUByte(); + + switch (aspectRatioIdc) { + case 1: + pixelRatio = [1, 1]; + break; + + case 2: + pixelRatio = [12, 11]; + break; + + case 3: + pixelRatio = [10, 11]; + break; + + case 4: + pixelRatio = [16, 11]; + break; + + case 5: + pixelRatio = [40, 33]; + break; + + case 6: + pixelRatio = [24, 11]; + break; + + case 7: + pixelRatio = [20, 11]; + break; + + case 8: + pixelRatio = [32, 11]; + break; + + case 9: + pixelRatio = [80, 33]; + break; + + case 10: + pixelRatio = [18, 11]; + break; + + case 11: + pixelRatio = [15, 11]; + break; + + case 12: + pixelRatio = [64, 33]; + break; + + case 13: + pixelRatio = [160, 99]; + break; + + case 14: + pixelRatio = [4, 3]; + break; + + case 15: + pixelRatio = [3, 2]; + break; + + case 16: + pixelRatio = [2, 1]; + break; + + case 255: + { + pixelRatio = [readUByte() << 8 | readUByte(), readUByte() << 8 | readUByte()]; + break; + } + } + } + } + + return { + width: Math.ceil((picWidthInMbsMinus1 + 1) * 16 - frameCropLeftOffset * 2 - frameCropRightOffset * 2), + height: (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 - (frameMbsOnlyFlag ? 2 : 4) * (frameCropTopOffset + frameCropBottomOffset), + pixelRatio: pixelRatio + }; + }; + + _proto.readSliceType = function readSliceType() { + // skip NALu type + this.readUByte(); // discard first_mb_in_slice + + this.readUEG(); // return slice_type + + return this.readUEG(); + }; + + return ExpGolomb; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (ExpGolomb); + +/***/ }), + +/***/ "./src/demux/id3.ts": +/*!**************************!*\ + !*** ./src/demux/id3.ts ***! + \**************************/ +/*! exports provided: isHeader, isFooter, getID3Data, canParse, getTimeStamp, isTimeStampFrame, getID3Frames, decodeFrame, utf8ArrayToStr, testables */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHeader", function() { return isHeader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFooter", function() { return isFooter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getID3Data", function() { return getID3Data; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canParse", function() { return canParse; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeStamp", function() { return getTimeStamp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTimeStampFrame", function() { return isTimeStampFrame; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getID3Frames", function() { return getID3Frames; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decodeFrame", function() { return decodeFrame; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utf8ArrayToStr", function() { return utf8ArrayToStr; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "testables", function() { return testables; }); +// breaking up those two types in order to clarify what is happening in the decoding path. + +/** + * Returns true if an ID3 header can be found at offset in data + * @param {Uint8Array} data - The data to search in + * @param {number} offset - The offset at which to start searching + * @return {boolean} - True if an ID3 header is found + */ +var isHeader = function isHeader(data, offset) { + /* + * http://id3.org/id3v2.3.0 + * [0] = 'I' + * [1] = 'D' + * [2] = '3' + * [3,4] = {Version} + * [5] = {Flags} + * [6-9] = {ID3 Size} + * + * An ID3v2 tag can be detected with the following pattern: + * $49 44 33 yy yy xx zz zz zz zz + * Where yy is less than $FF, xx is the 'flags' byte and zz is less than $80 + */ + if (offset + 10 <= data.length) { + // look for 'ID3' identifier + if (data[offset] === 0x49 && data[offset + 1] === 0x44 && data[offset + 2] === 0x33) { + // check version is within range + if (data[offset + 3] < 0xff && data[offset + 4] < 0xff) { + // check size is within range + if (data[offset + 6] < 0x80 && data[offset + 7] < 0x80 && data[offset + 8] < 0x80 && data[offset + 9] < 0x80) { + return true; + } + } + } + } + + return false; +}; +/** + * Returns true if an ID3 footer can be found at offset in data + * @param {Uint8Array} data - The data to search in + * @param {number} offset - The offset at which to start searching + * @return {boolean} - True if an ID3 footer is found + */ + +var isFooter = function isFooter(data, offset) { + /* + * The footer is a copy of the header, but with a different identifier + */ + if (offset + 10 <= data.length) { + // look for '3DI' identifier + if (data[offset] === 0x33 && data[offset + 1] === 0x44 && data[offset + 2] === 0x49) { + // check version is within range + if (data[offset + 3] < 0xff && data[offset + 4] < 0xff) { + // check size is within range + if (data[offset + 6] < 0x80 && data[offset + 7] < 0x80 && data[offset + 8] < 0x80 && data[offset + 9] < 0x80) { + return true; + } + } + } + } + + return false; +}; +/** + * Returns any adjacent ID3 tags found in data starting at offset, as one block of data + * @param {Uint8Array} data - The data to search in + * @param {number} offset - The offset at which to start searching + * @return {Uint8Array | undefined} - The block of data containing any ID3 tags found + * or *undefined* if no header is found at the starting offset + */ + +var getID3Data = function getID3Data(data, offset) { + var front = offset; + var length = 0; + + while (isHeader(data, offset)) { + // ID3 header is 10 bytes + length += 10; + var size = readSize(data, offset + 6); + length += size; + + if (isFooter(data, offset + 10)) { + // ID3 footer is 10 bytes + length += 10; + } + + offset += length; + } + + if (length > 0) { + return data.subarray(front, front + length); + } + + return undefined; +}; + +var readSize = function readSize(data, offset) { + var size = 0; + size = (data[offset] & 0x7f) << 21; + size |= (data[offset + 1] & 0x7f) << 14; + size |= (data[offset + 2] & 0x7f) << 7; + size |= data[offset + 3] & 0x7f; + return size; +}; + +var canParse = function canParse(data, offset) { + return isHeader(data, offset) && readSize(data, offset + 6) + 10 <= data.length - offset; +}; +/** + * Searches for the Elementary Stream timestamp found in the ID3 data chunk + * @param {Uint8Array} data - Block of data containing one or more ID3 tags + * @return {number | undefined} - The timestamp + */ + +var getTimeStamp = function getTimeStamp(data) { + var frames = getID3Frames(data); + + for (var i = 0; i < frames.length; i++) { + var frame = frames[i]; + + if (isTimeStampFrame(frame)) { + return readTimeStamp(frame); + } + } + + return undefined; +}; +/** + * Returns true if the ID3 frame is an Elementary Stream timestamp frame + * @param {ID3 frame} frame + */ + +var isTimeStampFrame = function isTimeStampFrame(frame) { + return frame && frame.key === 'PRIV' && frame.info === 'com.apple.streaming.transportStreamTimestamp'; +}; + +var getFrameData = function getFrameData(data) { + /* + Frame ID $xx xx xx xx (four characters) + Size $xx xx xx xx + Flags $xx xx + */ + var type = String.fromCharCode(data[0], data[1], data[2], data[3]); + var size = readSize(data, 4); // skip frame id, size, and flags + + var offset = 10; + return { + type: type, + size: size, + data: data.subarray(offset, offset + size) + }; +}; +/** + * Returns an array of ID3 frames found in all the ID3 tags in the id3Data + * @param {Uint8Array} id3Data - The ID3 data containing one or more ID3 tags + * @return {ID3.Frame[]} - Array of ID3 frame objects + */ + + +var getID3Frames = function getID3Frames(id3Data) { + var offset = 0; + var frames = []; + + while (isHeader(id3Data, offset)) { + var size = readSize(id3Data, offset + 6); // skip past ID3 header + + offset += 10; + var end = offset + size; // loop through frames in the ID3 tag + + while (offset + 8 < end) { + var frameData = getFrameData(id3Data.subarray(offset)); + var frame = decodeFrame(frameData); + + if (frame) { + frames.push(frame); + } // skip frame header and frame data + + + offset += frameData.size + 10; + } + + if (isFooter(id3Data, offset)) { + offset += 10; + } + } + + return frames; +}; +var decodeFrame = function decodeFrame(frame) { + if (frame.type === 'PRIV') { + return decodePrivFrame(frame); + } else if (frame.type[0] === 'W') { + return decodeURLFrame(frame); + } + + return decodeTextFrame(frame); +}; + +var decodePrivFrame = function decodePrivFrame(frame) { + /* + Format: \0 + */ + if (frame.size < 2) { + return undefined; + } + + var owner = utf8ArrayToStr(frame.data, true); + var privateData = new Uint8Array(frame.data.subarray(owner.length + 1)); + return { + key: frame.type, + info: owner, + data: privateData.buffer + }; +}; + +var decodeTextFrame = function decodeTextFrame(frame) { + if (frame.size < 2) { + return undefined; + } + + if (frame.type === 'TXXX') { + /* + Format: + [0] = {Text Encoding} + [1-?] = {Description}\0{Value} + */ + var index = 1; + var description = utf8ArrayToStr(frame.data.subarray(index), true); + index += description.length + 1; + var value = utf8ArrayToStr(frame.data.subarray(index)); + return { + key: frame.type, + info: description, + data: value + }; + } + /* + Format: + [0] = {Text Encoding} + [1-?] = {Value} + */ + + + var text = utf8ArrayToStr(frame.data.subarray(1)); + return { + key: frame.type, + data: text + }; +}; + +var decodeURLFrame = function decodeURLFrame(frame) { + if (frame.type === 'WXXX') { + /* + Format: + [0] = {Text Encoding} + [1-?] = {Description}\0{URL} + */ + if (frame.size < 2) { + return undefined; + } + + var index = 1; + var description = utf8ArrayToStr(frame.data.subarray(index), true); + index += description.length + 1; + var value = utf8ArrayToStr(frame.data.subarray(index)); + return { + key: frame.type, + info: description, + data: value + }; + } + /* + Format: + [0-?] = {URL} + */ + + + var url = utf8ArrayToStr(frame.data); + return { + key: frame.type, + data: url + }; +}; + +var readTimeStamp = function readTimeStamp(timeStampFrame) { + if (timeStampFrame.data.byteLength === 8) { + var data = new Uint8Array(timeStampFrame.data); // timestamp is 33 bit expressed as a big-endian eight-octet number, + // with the upper 31 bits set to zero. + + var pts33Bit = data[3] & 0x1; + var timestamp = (data[4] << 23) + (data[5] << 15) + (data[6] << 7) + data[7]; + timestamp /= 45; + + if (pts33Bit) { + timestamp += 47721858.84; + } // 2^32 / 90 + + + return Math.round(timestamp); + } + + return undefined; +}; // http://stackoverflow.com/questions/8936984/uint8array-to-string-in-javascript/22373197 +// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt + +/* utf.js - UTF-8 <=> UTF-16 convertion + * + * Copyright (C) 1999 Masanao Izumo + * Version: 1.0 + * LastModified: Dec 25 1999 + * This library is free. You can redistribute it and/or modify it. + */ + + +var utf8ArrayToStr = function utf8ArrayToStr(array, exitOnNull) { + if (exitOnNull === void 0) { + exitOnNull = false; + } + + var decoder = getTextDecoder(); + + if (decoder) { + var decoded = decoder.decode(array); + + if (exitOnNull) { + // grab up to the first null + var idx = decoded.indexOf('\0'); + return idx !== -1 ? decoded.substring(0, idx) : decoded; + } // remove any null characters + + + return decoded.replace(/\0/g, ''); + } + + var len = array.length; + var c; + var char2; + var char3; + var out = ''; + var i = 0; + + while (i < len) { + c = array[i++]; + + if (c === 0x00 && exitOnNull) { + return out; + } else if (c === 0x00 || c === 0x03) { + // If the character is 3 (END_OF_TEXT) or 0 (NULL) then skip it + continue; + } + + switch (c >> 4) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + // 0xxxxxxx + out += String.fromCharCode(c); + break; + + case 12: + case 13: + // 110x xxxx 10xx xxxx + char2 = array[i++]; + out += String.fromCharCode((c & 0x1f) << 6 | char2 & 0x3f); + break; + + case 14: + // 1110 xxxx 10xx xxxx 10xx xxxx + char2 = array[i++]; + char3 = array[i++]; + out += String.fromCharCode((c & 0x0f) << 12 | (char2 & 0x3f) << 6 | (char3 & 0x3f) << 0); + break; + + default: + } + } + + return out; +}; +var testables = { + decodeTextFrame: decodeTextFrame +}; +var decoder; + +function getTextDecoder() { + if (!decoder && typeof self.TextDecoder !== 'undefined') { + decoder = new self.TextDecoder('utf-8'); + } + + return decoder; +} + +/***/ }), + +/***/ "./src/demux/mp3demuxer.ts": +/*!*********************************!*\ + !*** ./src/demux/mp3demuxer.ts ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _base_audio_demuxer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-audio-demuxer */ "./src/demux/base-audio-demuxer.ts"); +/* harmony import */ var _demux_id3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../demux/id3 */ "./src/demux/id3.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _mpegaudio__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mpegaudio */ "./src/demux/mpegaudio.ts"); +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +/** + * MP3 demuxer + */ + + + + + +var MP3Demuxer = /*#__PURE__*/function (_BaseAudioDemuxer) { + _inheritsLoose(MP3Demuxer, _BaseAudioDemuxer); + + function MP3Demuxer() { + return _BaseAudioDemuxer.apply(this, arguments) || this; + } + + var _proto = MP3Demuxer.prototype; + + _proto.resetInitSegment = function resetInitSegment(audioCodec, videoCodec, duration) { + _BaseAudioDemuxer.prototype.resetInitSegment.call(this, audioCodec, videoCodec, duration); + + this._audioTrack = { + container: 'audio/mpeg', + type: 'audio', + id: 0, + pid: -1, + sequenceNumber: 0, + isAAC: false, + samples: [], + manifestCodec: audioCodec, + duration: duration, + inputTimeScale: 90000, + dropped: 0 + }; + }; + + MP3Demuxer.probe = function probe(data) { + if (!data) { + return false; + } // check if data contains ID3 timestamp and MPEG sync word + // Look for MPEG header | 1111 1111 | 111X XYZX | where X can be either 0 or 1 and Y or Z should be 1 + // Layer bits (position 14 and 15) in header should be always different from 0 (Layer I or Layer II or Layer III) + // More info http://www.mp3-tech.org/programmer/frame_header.html + + + var id3Data = _demux_id3__WEBPACK_IMPORTED_MODULE_1__["getID3Data"](data, 0) || []; + var offset = id3Data.length; + + for (var length = data.length; offset < length; offset++) { + if (_mpegaudio__WEBPACK_IMPORTED_MODULE_3__["probe"](data, offset)) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].log('MPEG Audio sync word found !'); + return true; + } + } + + return false; + }; + + _proto.canParse = function canParse(data, offset) { + return _mpegaudio__WEBPACK_IMPORTED_MODULE_3__["canParse"](data, offset); + }; + + _proto.appendFrame = function appendFrame(track, data, offset) { + if (this.initPTS === null) { + return; + } + + return _mpegaudio__WEBPACK_IMPORTED_MODULE_3__["appendFrame"](track, data, offset, this.initPTS, this.frameIndex); + }; + + return MP3Demuxer; +}(_base_audio_demuxer__WEBPACK_IMPORTED_MODULE_0__["default"]); + +MP3Demuxer.minProbeByteLength = 4; +/* harmony default export */ __webpack_exports__["default"] = (MP3Demuxer); + +/***/ }), + +/***/ "./src/demux/mp4demuxer.ts": +/*!*********************************!*\ + !*** ./src/demux/mp4demuxer.ts ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dummy-demuxed-track */ "./src/demux/dummy-demuxed-track.ts"); +/** + * MP4 demuxer + */ + + + +var MP4Demuxer = /*#__PURE__*/function () { + function MP4Demuxer(observer, config) { + this.remainderData = null; + this.config = void 0; + this.config = config; + } + + var _proto = MP4Demuxer.prototype; + + _proto.resetTimeStamp = function resetTimeStamp() {}; + + _proto.resetInitSegment = function resetInitSegment() {}; + + _proto.resetContiguity = function resetContiguity() {}; + + MP4Demuxer.probe = function probe(data) { + // ensure we find a moof box in the first 16 kB + return Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_0__["findBox"])({ + data: data, + start: 0, + end: Math.min(data.length, 16384) + }, ['moof']).length > 0; + }; + + _proto.demux = function demux(data) { + // Load all data into the avc track. The CMAF remuxer will look for the data in the samples object; the rest of the fields do not matter + var avcSamples = data; + var avcTrack = Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__["dummyTrack"])(); + + if (this.config.progressive) { + // Split the bytestream into two ranges: one encompassing all data up until the start of the last moof, and everything else. + // This is done to guarantee that we're sending valid data to MSE - when demuxing progressively, we have no guarantee + // that the fetch loader gives us flush moof+mdat pairs. If we push jagged data to MSE, it will throw an exception. + if (this.remainderData) { + avcSamples = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_0__["appendUint8Array"])(this.remainderData, data); + } + + var segmentedData = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_0__["segmentValidRange"])(avcSamples); + this.remainderData = segmentedData.remainder; + avcTrack.samples = segmentedData.valid || new Uint8Array(); + } else { + avcTrack.samples = avcSamples; + } + + return { + audioTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__["dummyTrack"])(), + avcTrack: avcTrack, + id3Track: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__["dummyTrack"])(), + textTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__["dummyTrack"])() + }; + }; + + _proto.flush = function flush() { + var avcTrack = Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__["dummyTrack"])(); + avcTrack.samples = this.remainderData || new Uint8Array(); + this.remainderData = null; + return { + audioTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__["dummyTrack"])(), + avcTrack: avcTrack, + id3Track: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__["dummyTrack"])(), + textTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_1__["dummyTrack"])() + }; + }; + + _proto.demuxSampleAes = function demuxSampleAes(data, keyData, timeOffset) { + return Promise.reject(new Error('The MP4 demuxer does not support SAMPLE-AES decryption')); + }; + + _proto.destroy = function destroy() {}; + + return MP4Demuxer; +}(); + +MP4Demuxer.minProbeByteLength = 1024; +/* harmony default export */ __webpack_exports__["default"] = (MP4Demuxer); + +/***/ }), + +/***/ "./src/demux/mpegaudio.ts": +/*!********************************!*\ + !*** ./src/demux/mpegaudio.ts ***! + \********************************/ +/*! exports provided: appendFrame, parseHeader, isHeaderPattern, isHeader, canParse, probe */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "appendFrame", function() { return appendFrame; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseHeader", function() { return parseHeader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHeaderPattern", function() { return isHeaderPattern; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHeader", function() { return isHeader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canParse", function() { return canParse; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "probe", function() { return probe; }); +/** + * MPEG parser helper + */ +var chromeVersion = null; +var BitratesMap = [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]; +var SamplingRateMap = [44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000]; +var SamplesCoefficients = [// MPEG 2.5 +[0, // Reserved +72, // Layer3 +144, // Layer2 +12 // Layer1 +], // Reserved +[0, // Reserved +0, // Layer3 +0, // Layer2 +0 // Layer1 +], // MPEG 2 +[0, // Reserved +72, // Layer3 +144, // Layer2 +12 // Layer1 +], // MPEG 1 +[0, // Reserved +144, // Layer3 +144, // Layer2 +12 // Layer1 +]]; +var BytesInSlot = [0, // Reserved +1, // Layer3 +1, // Layer2 +4 // Layer1 +]; +function appendFrame(track, data, offset, pts, frameIndex) { + // Using http://www.datavoyage.com/mpgscript/mpeghdr.htm as a reference + if (offset + 24 > data.length) { + return; + } + + var header = parseHeader(data, offset); + + if (header && offset + header.frameLength <= data.length) { + var frameDuration = header.samplesPerFrame * 90000 / header.sampleRate; + var stamp = pts + frameIndex * frameDuration; + var sample = { + unit: data.subarray(offset, offset + header.frameLength), + pts: stamp, + dts: stamp + }; + track.config = []; + track.channelCount = header.channelCount; + track.samplerate = header.sampleRate; + track.samples.push(sample); + return { + sample: sample, + length: header.frameLength, + missing: 0 + }; + } +} +function parseHeader(data, offset) { + var mpegVersion = data[offset + 1] >> 3 & 3; + var mpegLayer = data[offset + 1] >> 1 & 3; + var bitRateIndex = data[offset + 2] >> 4 & 15; + var sampleRateIndex = data[offset + 2] >> 2 & 3; + + if (mpegVersion !== 1 && bitRateIndex !== 0 && bitRateIndex !== 15 && sampleRateIndex !== 3) { + var paddingBit = data[offset + 2] >> 1 & 1; + var channelMode = data[offset + 3] >> 6; + var columnInBitrates = mpegVersion === 3 ? 3 - mpegLayer : mpegLayer === 3 ? 3 : 4; + var bitRate = BitratesMap[columnInBitrates * 14 + bitRateIndex - 1] * 1000; + var columnInSampleRates = mpegVersion === 3 ? 0 : mpegVersion === 2 ? 1 : 2; + var sampleRate = SamplingRateMap[columnInSampleRates * 3 + sampleRateIndex]; + var channelCount = channelMode === 3 ? 1 : 2; // If bits of channel mode are `11` then it is a single channel (Mono) + + var sampleCoefficient = SamplesCoefficients[mpegVersion][mpegLayer]; + var bytesInSlot = BytesInSlot[mpegLayer]; + var samplesPerFrame = sampleCoefficient * 8 * bytesInSlot; + var frameLength = Math.floor(sampleCoefficient * bitRate / sampleRate + paddingBit) * bytesInSlot; + + if (chromeVersion === null) { + var userAgent = navigator.userAgent || ''; + var result = userAgent.match(/Chrome\/(\d+)/i); + chromeVersion = result ? parseInt(result[1]) : 0; + } + + var needChromeFix = !!chromeVersion && chromeVersion <= 87; + + if (needChromeFix && mpegLayer === 2 && bitRate >= 224000 && channelMode === 0) { + // Work around bug in Chromium by setting channelMode to dual-channel (01) instead of stereo (00) + data[offset + 3] = data[offset + 3] | 0x80; + } + + return { + sampleRate: sampleRate, + channelCount: channelCount, + frameLength: frameLength, + samplesPerFrame: samplesPerFrame + }; + } +} +function isHeaderPattern(data, offset) { + return data[offset] === 0xff && (data[offset + 1] & 0xe0) === 0xe0 && (data[offset + 1] & 0x06) !== 0x00; +} +function isHeader(data, offset) { + // Look for MPEG header | 1111 1111 | 111X XYZX | where X can be either 0 or 1 and Y or Z should be 1 + // Layer bits (position 14 and 15) in header should be always different from 0 (Layer I or Layer II or Layer III) + // More info http://www.mp3-tech.org/programmer/frame_header.html + return offset + 1 < data.length && isHeaderPattern(data, offset); +} +function canParse(data, offset) { + var headerSize = 4; + return isHeaderPattern(data, offset) && headerSize <= data.length - offset; +} +function probe(data, offset) { + // same as isHeader but we also check that MPEG frame follows last MPEG frame + // or end of data is reached + if (offset + 1 < data.length && isHeaderPattern(data, offset)) { + // MPEG header Length + var headerLength = 4; // MPEG frame Length + + var header = parseHeader(data, offset); + var frameLength = headerLength; + + if (header !== null && header !== void 0 && header.frameLength) { + frameLength = header.frameLength; + } + + var newOffset = offset + frameLength; + return newOffset === data.length || isHeader(data, newOffset); + } + + return false; +} + +/***/ }), + +/***/ "./src/demux/sample-aes.ts": +/*!*********************************!*\ + !*** ./src/demux/sample-aes.ts ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _crypt_decrypter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../crypt/decrypter */ "./src/crypt/decrypter.ts"); +/* harmony import */ var _tsdemuxer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tsdemuxer */ "./src/demux/tsdemuxer.ts"); +/** + * SAMPLE-AES decrypter + */ + + + +var SampleAesDecrypter = /*#__PURE__*/function () { + function SampleAesDecrypter(observer, config, keyData) { + this.keyData = void 0; + this.decrypter = void 0; + this.keyData = keyData; + this.decrypter = new _crypt_decrypter__WEBPACK_IMPORTED_MODULE_0__["default"](observer, config, { + removePKCS7Padding: false + }); + } + + var _proto = SampleAesDecrypter.prototype; + + _proto.decryptBuffer = function decryptBuffer(encryptedData, callback) { + this.decrypter.decrypt(encryptedData, this.keyData.key.buffer, this.keyData.iv.buffer, callback); + } // AAC - encrypt all full 16 bytes blocks starting from offset 16 + ; + + _proto.decryptAacSample = function decryptAacSample(samples, sampleIndex, callback, sync) { + var curUnit = samples[sampleIndex].unit; + var encryptedData = curUnit.subarray(16, curUnit.length - curUnit.length % 16); + var encryptedBuffer = encryptedData.buffer.slice(encryptedData.byteOffset, encryptedData.byteOffset + encryptedData.length); + var localthis = this; + this.decryptBuffer(encryptedBuffer, function (decryptedBuffer) { + var decryptedData = new Uint8Array(decryptedBuffer); + curUnit.set(decryptedData, 16); + + if (!sync) { + localthis.decryptAacSamples(samples, sampleIndex + 1, callback); + } + }); + }; + + _proto.decryptAacSamples = function decryptAacSamples(samples, sampleIndex, callback) { + for (;; sampleIndex++) { + if (sampleIndex >= samples.length) { + callback(); + return; + } + + if (samples[sampleIndex].unit.length < 32) { + continue; + } + + var sync = this.decrypter.isSync(); + this.decryptAacSample(samples, sampleIndex, callback, sync); + + if (!sync) { + return; + } + } + } // AVC - encrypt one 16 bytes block out of ten, starting from offset 32 + ; + + _proto.getAvcEncryptedData = function getAvcEncryptedData(decodedData) { + var encryptedDataLen = Math.floor((decodedData.length - 48) / 160) * 16 + 16; + var encryptedData = new Int8Array(encryptedDataLen); + var outputPos = 0; + + for (var inputPos = 32; inputPos <= decodedData.length - 16; inputPos += 160, outputPos += 16) { + encryptedData.set(decodedData.subarray(inputPos, inputPos + 16), outputPos); + } + + return encryptedData; + }; + + _proto.getAvcDecryptedUnit = function getAvcDecryptedUnit(decodedData, decryptedData) { + var uint8DecryptedData = new Uint8Array(decryptedData); + var inputPos = 0; + + for (var outputPos = 32; outputPos <= decodedData.length - 16; outputPos += 160, inputPos += 16) { + decodedData.set(uint8DecryptedData.subarray(inputPos, inputPos + 16), outputPos); + } + + return decodedData; + }; + + _proto.decryptAvcSample = function decryptAvcSample(samples, sampleIndex, unitIndex, callback, curUnit, sync) { + var decodedData = Object(_tsdemuxer__WEBPACK_IMPORTED_MODULE_1__["discardEPB"])(curUnit.data); + var encryptedData = this.getAvcEncryptedData(decodedData); + var localthis = this; + this.decryptBuffer(encryptedData.buffer, function (decryptedBuffer) { + curUnit.data = localthis.getAvcDecryptedUnit(decodedData, decryptedBuffer); + + if (!sync) { + localthis.decryptAvcSamples(samples, sampleIndex, unitIndex + 1, callback); + } + }); + }; + + _proto.decryptAvcSamples = function decryptAvcSamples(samples, sampleIndex, unitIndex, callback) { + if (samples instanceof Uint8Array) { + throw new Error('Cannot decrypt samples of type Uint8Array'); + } + + for (;; sampleIndex++, unitIndex = 0) { + if (sampleIndex >= samples.length) { + callback(); + return; + } + + var curUnits = samples[sampleIndex].units; + + for (;; unitIndex++) { + if (unitIndex >= curUnits.length) { + break; + } + + var curUnit = curUnits[unitIndex]; + + if (curUnit.data.length <= 48 || curUnit.type !== 1 && curUnit.type !== 5) { + continue; + } + + var sync = this.decrypter.isSync(); + this.decryptAvcSample(samples, sampleIndex, unitIndex, callback, curUnit, sync); + + if (!sync) { + return; + } + } + } + }; + + return SampleAesDecrypter; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (SampleAesDecrypter); + +/***/ }), + +/***/ "./src/demux/transmuxer-interface.ts": +/*!*******************************************!*\ + !*** ./src/demux/transmuxer-interface.ts ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TransmuxerInterface; }); +/* harmony import */ var webworkify_webpack__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webworkify-webpack */ "./node_modules/webworkify-webpack/index.js"); +/* harmony import */ var webworkify_webpack__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webworkify_webpack__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _demux_transmuxer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../demux/transmuxer */ "./src/demux/transmuxer.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_mediasource_helper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/mediasource-helper */ "./src/utils/mediasource-helper.ts"); +/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! eventemitter3 */ "./node_modules/eventemitter3/index.js"); +/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(eventemitter3__WEBPACK_IMPORTED_MODULE_6__); + + + + + + + +var MediaSource = Object(_utils_mediasource_helper__WEBPACK_IMPORTED_MODULE_5__["getMediaSource"])() || { + isTypeSupported: function isTypeSupported() { + return false; + } +}; + +var TransmuxerInterface = /*#__PURE__*/function () { + function TransmuxerInterface(hls, id, onTransmuxComplete, onFlush) { + var _this = this; + + this.hls = void 0; + this.id = void 0; + this.observer = void 0; + this.frag = null; + this.part = null; + this.worker = void 0; + this.onwmsg = void 0; + this.transmuxer = null; + this.onTransmuxComplete = void 0; + this.onFlush = void 0; + this.hls = hls; + this.id = id; + this.onTransmuxComplete = onTransmuxComplete; + this.onFlush = onFlush; + var config = hls.config; + + var forwardMessage = function forwardMessage(ev, data) { + data = data || {}; + data.frag = _this.frag; + data.id = _this.id; + hls.trigger(ev, data); + }; // forward events to main thread + + + this.observer = new eventemitter3__WEBPACK_IMPORTED_MODULE_6__["EventEmitter"](); + this.observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_DECRYPTED, forwardMessage); + this.observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, forwardMessage); + var typeSupported = { + mp4: MediaSource.isTypeSupported('video/mp4'), + mpeg: MediaSource.isTypeSupported('audio/mpeg'), + mp3: MediaSource.isTypeSupported('audio/mp4; codecs="mp3"') + }; // navigator.vendor is not always available in Web Worker + // refer to https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/navigator + + var vendor = navigator.vendor; + + if (config.enableWorker && typeof Worker !== 'undefined') { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].log('demuxing in webworker'); + var worker; + + try { + worker = this.worker = webworkify_webpack__WEBPACK_IMPORTED_MODULE_0__(/*require.resolve*/(/*! ../demux/transmuxer-worker.ts */ "./src/demux/transmuxer-worker.ts")); + this.onwmsg = this.onWorkerMessage.bind(this); + worker.addEventListener('message', this.onwmsg); + + worker.onerror = function (event) { + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorTypes"].OTHER_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorDetails"].INTERNAL_EXCEPTION, + fatal: true, + event: 'demuxerWorker', + error: new Error(event.message + " (" + event.filename + ":" + event.lineno + ")") + }); + }; + + worker.postMessage({ + cmd: 'init', + typeSupported: typeSupported, + vendor: vendor, + id: id, + config: JSON.stringify(config) + }); + } catch (err) { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('Error in worker:', err); + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error('Error while initializing DemuxerWorker, fallback to inline'); + + if (worker) { + // revoke the Object URL that was used to create transmuxer worker, so as not to leak it + self.URL.revokeObjectURL(worker.objectURL); + } + + this.transmuxer = new _demux_transmuxer__WEBPACK_IMPORTED_MODULE_2__["default"](this.observer, typeSupported, config, vendor, id); + this.worker = null; + } + } else { + this.transmuxer = new _demux_transmuxer__WEBPACK_IMPORTED_MODULE_2__["default"](this.observer, typeSupported, config, vendor, id); + } + } + + var _proto = TransmuxerInterface.prototype; + + _proto.destroy = function destroy() { + var w = this.worker; + + if (w) { + w.removeEventListener('message', this.onwmsg); + w.terminate(); + this.worker = null; + } else { + var transmuxer = this.transmuxer; + + if (transmuxer) { + transmuxer.destroy(); + this.transmuxer = null; + } + } + + var observer = this.observer; + + if (observer) { + observer.removeAllListeners(); + } // @ts-ignore + + + this.observer = null; + }; + + _proto.push = function push(data, initSegmentData, audioCodec, videoCodec, frag, part, duration, accurateTimeOffset, chunkMeta, defaultInitPTS) { + var _this2 = this; + + chunkMeta.transmuxing.start = self.performance.now(); + var transmuxer = this.transmuxer, + worker = this.worker; + var timeOffset = part ? part.start : frag.start; + var decryptdata = frag.decryptdata; + var lastFrag = this.frag; + var discontinuity = !(lastFrag && frag.cc === lastFrag.cc); + var trackSwitch = !(lastFrag && chunkMeta.level === lastFrag.level); + var snDiff = lastFrag ? chunkMeta.sn - lastFrag.sn : -1; + var partDiff = this.part ? chunkMeta.part - this.part.index : 1; + var contiguous = !trackSwitch && (snDiff === 1 || snDiff === 0 && partDiff === 1); + var now = self.performance.now(); + + if (trackSwitch || snDiff || frag.stats.parsing.start === 0) { + frag.stats.parsing.start = now; + } + + if (part && (partDiff || !contiguous)) { + part.stats.parsing.start = now; + } + + var state = new _demux_transmuxer__WEBPACK_IMPORTED_MODULE_2__["TransmuxState"](discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset); + + if (!contiguous || discontinuity) { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].log("[transmuxer-interface, " + frag.type + "]: Starting new transmux session for sn: " + chunkMeta.sn + " p: " + chunkMeta.part + " level: " + chunkMeta.level + " id: " + chunkMeta.id + "\n discontinuity: " + discontinuity + "\n trackSwitch: " + trackSwitch + "\n contiguous: " + contiguous + "\n accurateTimeOffset: " + accurateTimeOffset + "\n timeOffset: " + timeOffset); + var config = new _demux_transmuxer__WEBPACK_IMPORTED_MODULE_2__["TransmuxConfig"](audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS); + this.configureTransmuxer(config); + } + + this.frag = frag; + this.part = part; // Frags with sn of 'initSegment' are not transmuxed + + if (worker) { + // post fragment payload as transferable objects for ArrayBuffer (no copy) + worker.postMessage({ + cmd: 'demux', + data: data, + decryptdata: decryptdata, + chunkMeta: chunkMeta, + state: state + }, data instanceof ArrayBuffer ? [data] : []); + } else if (transmuxer) { + var _transmuxResult = transmuxer.push(data, decryptdata, chunkMeta, state); + + if (Object(_demux_transmuxer__WEBPACK_IMPORTED_MODULE_2__["isPromise"])(_transmuxResult)) { + _transmuxResult.then(function (data) { + _this2.handleTransmuxComplete(data); + }); + } else { + this.handleTransmuxComplete(_transmuxResult); + } + } + }; + + _proto.flush = function flush(chunkMeta) { + var _this3 = this; + + chunkMeta.transmuxing.start = self.performance.now(); + var transmuxer = this.transmuxer, + worker = this.worker; + + if (worker) { + worker.postMessage({ + cmd: 'flush', + chunkMeta: chunkMeta + }); + } else if (transmuxer) { + var _transmuxResult2 = transmuxer.flush(chunkMeta); + + if (Object(_demux_transmuxer__WEBPACK_IMPORTED_MODULE_2__["isPromise"])(_transmuxResult2)) { + _transmuxResult2.then(function (data) { + _this3.handleFlushResult(data, chunkMeta); + }); + } else { + this.handleFlushResult(_transmuxResult2, chunkMeta); + } + } + }; + + _proto.handleFlushResult = function handleFlushResult(results, chunkMeta) { + var _this4 = this; + + results.forEach(function (result) { + _this4.handleTransmuxComplete(result); + }); + this.onFlush(chunkMeta); + }; + + _proto.onWorkerMessage = function onWorkerMessage(ev) { + var data = ev.data; + var hls = this.hls; + + switch (data.event) { + case 'init': + { + // revoke the Object URL that was used to create transmuxer worker, so as not to leak it + self.URL.revokeObjectURL(this.worker.objectURL); + break; + } + + case 'transmuxComplete': + { + this.handleTransmuxComplete(data.data); + break; + } + + case 'flush': + { + this.onFlush(data.data); + break; + } + + /* falls through */ + + default: + { + data.data = data.data || {}; + data.data.frag = this.frag; + data.data.id = this.id; + hls.trigger(data.event, data.data); + break; + } + } + }; + + _proto.configureTransmuxer = function configureTransmuxer(config) { + var worker = this.worker, + transmuxer = this.transmuxer; + + if (worker) { + worker.postMessage({ + cmd: 'configure', + config: config + }); + } else if (transmuxer) { + transmuxer.configure(config); + } + }; + + _proto.handleTransmuxComplete = function handleTransmuxComplete(result) { + result.chunkMeta.transmuxing.end = self.performance.now(); + this.onTransmuxComplete(result); + }; + + return TransmuxerInterface; +}(); + + + +/***/ }), + +/***/ "./src/demux/transmuxer-worker.ts": +/*!****************************************!*\ + !*** ./src/demux/transmuxer-worker.ts ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TransmuxerWorker; }); +/* harmony import */ var _demux_transmuxer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../demux/transmuxer */ "./src/demux/transmuxer.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! eventemitter3 */ "./node_modules/eventemitter3/index.js"); +/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(eventemitter3__WEBPACK_IMPORTED_MODULE_3__); + + + + +function TransmuxerWorker(self) { + var observer = new eventemitter3__WEBPACK_IMPORTED_MODULE_3__["EventEmitter"](); + + var forwardMessage = function forwardMessage(ev, data) { + self.postMessage({ + event: ev, + data: data + }); + }; // forward events to main thread + + + observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_DECRYPTED, forwardMessage); + observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, forwardMessage); + self.addEventListener('message', function (ev) { + var data = ev.data; + + switch (data.cmd) { + case 'init': + { + var config = JSON.parse(data.config); + self.transmuxer = new _demux_transmuxer__WEBPACK_IMPORTED_MODULE_0__["default"](observer, data.typeSupported, config, data.vendor, data.id); + Object(_utils_logger__WEBPACK_IMPORTED_MODULE_2__["enableLogs"])(config.debug); + forwardMessage('init', null); + break; + } + + case 'configure': + { + self.transmuxer.configure(data.config); + break; + } + + case 'demux': + { + var transmuxResult = self.transmuxer.push(data.data, data.decryptdata, data.chunkMeta, data.state); + + if (Object(_demux_transmuxer__WEBPACK_IMPORTED_MODULE_0__["isPromise"])(transmuxResult)) { + transmuxResult.then(function (data) { + emitTransmuxComplete(self, data); + }); + } else { + emitTransmuxComplete(self, transmuxResult); + } + + break; + } + + case 'flush': + { + var id = data.chunkMeta; + + var _transmuxResult = self.transmuxer.flush(id); + + if (Object(_demux_transmuxer__WEBPACK_IMPORTED_MODULE_0__["isPromise"])(_transmuxResult)) { + _transmuxResult.then(function (results) { + handleFlushResult(self, results, id); + }); + } else { + handleFlushResult(self, _transmuxResult, id); + } + + break; + } + + default: + break; + } + }); +} + +function emitTransmuxComplete(self, transmuxResult) { + if (isEmptyResult(transmuxResult.remuxResult)) { + return; + } + + var transferable = []; + var _transmuxResult$remux = transmuxResult.remuxResult, + audio = _transmuxResult$remux.audio, + video = _transmuxResult$remux.video; + + if (audio) { + addToTransferable(transferable, audio); + } + + if (video) { + addToTransferable(transferable, video); + } + + self.postMessage({ + event: 'transmuxComplete', + data: transmuxResult + }, transferable); +} // Converts data to a transferable object https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast) +// in order to minimize message passing overhead + + +function addToTransferable(transferable, track) { + if (track.data1) { + transferable.push(track.data1.buffer); + } + + if (track.data2) { + transferable.push(track.data2.buffer); + } +} + +function handleFlushResult(self, results, chunkMeta) { + results.forEach(function (result) { + emitTransmuxComplete(self, result); + }); + self.postMessage({ + event: 'flush', + data: chunkMeta + }); +} + +function isEmptyResult(remuxResult) { + return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment; +} + +/***/ }), + +/***/ "./src/demux/transmuxer.ts": +/*!*********************************!*\ + !*** ./src/demux/transmuxer.ts ***! + \*********************************/ +/*! exports provided: default, isPromise, TransmuxConfig, TransmuxState */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Transmuxer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPromise", function() { return isPromise; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransmuxConfig", function() { return TransmuxConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransmuxState", function() { return TransmuxState; }); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _crypt_decrypter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../crypt/decrypter */ "./src/crypt/decrypter.ts"); +/* harmony import */ var _demux_aacdemuxer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../demux/aacdemuxer */ "./src/demux/aacdemuxer.ts"); +/* harmony import */ var _demux_mp4demuxer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../demux/mp4demuxer */ "./src/demux/mp4demuxer.ts"); +/* harmony import */ var _demux_tsdemuxer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../demux/tsdemuxer */ "./src/demux/tsdemuxer.ts"); +/* harmony import */ var _demux_mp3demuxer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../demux/mp3demuxer */ "./src/demux/mp3demuxer.ts"); +/* harmony import */ var _remux_mp4_remuxer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../remux/mp4-remuxer */ "./src/remux/mp4-remuxer.ts"); +/* harmony import */ var _remux_passthrough_remuxer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../remux/passthrough-remuxer */ "./src/remux/passthrough-remuxer.ts"); +/* harmony import */ var _chunk_cache__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./chunk-cache */ "./src/demux/chunk-cache.ts"); +/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + + + + + + + + + + + +var now; // performance.now() not available on WebWorker, at least on Safari Desktop + +try { + now = self.performance.now.bind(self.performance); +} catch (err) { + _utils_logger__WEBPACK_IMPORTED_MODULE_11__["logger"].debug('Unable to use Performance API on this environment'); + now = self.Date.now; +} + +var muxConfig = [{ + demux: _demux_tsdemuxer__WEBPACK_IMPORTED_MODULE_5__["default"], + remux: _remux_mp4_remuxer__WEBPACK_IMPORTED_MODULE_7__["default"] +}, { + demux: _demux_mp4demuxer__WEBPACK_IMPORTED_MODULE_4__["default"], + remux: _remux_passthrough_remuxer__WEBPACK_IMPORTED_MODULE_8__["default"] +}, { + demux: _demux_aacdemuxer__WEBPACK_IMPORTED_MODULE_3__["default"], + remux: _remux_mp4_remuxer__WEBPACK_IMPORTED_MODULE_7__["default"] +}, { + demux: _demux_mp3demuxer__WEBPACK_IMPORTED_MODULE_6__["default"], + remux: _remux_mp4_remuxer__WEBPACK_IMPORTED_MODULE_7__["default"] +}]; +var minProbeByteLength = 1024; +muxConfig.forEach(function (_ref) { + var demux = _ref.demux; + minProbeByteLength = Math.max(minProbeByteLength, demux.minProbeByteLength); +}); + +var Transmuxer = /*#__PURE__*/function () { + function Transmuxer(observer, typeSupported, config, vendor, id) { + this.observer = void 0; + this.typeSupported = void 0; + this.config = void 0; + this.vendor = void 0; + this.id = void 0; + this.demuxer = void 0; + this.remuxer = void 0; + this.decrypter = void 0; + this.probe = void 0; + this.decryptionPromise = null; + this.transmuxConfig = void 0; + this.currentTransmuxState = void 0; + this.cache = new _chunk_cache__WEBPACK_IMPORTED_MODULE_9__["default"](); + this.observer = observer; + this.typeSupported = typeSupported; + this.config = config; + this.vendor = vendor; + this.id = id; + } + + var _proto = Transmuxer.prototype; + + _proto.configure = function configure(transmuxConfig) { + this.transmuxConfig = transmuxConfig; + + if (this.decrypter) { + this.decrypter.reset(); + } + }; + + _proto.push = function push(data, decryptdata, chunkMeta, state) { + var _this = this; + + var stats = chunkMeta.transmuxing; + stats.executeStart = now(); + var uintData = new Uint8Array(data); + var cache = this.cache, + config = this.config, + currentTransmuxState = this.currentTransmuxState, + transmuxConfig = this.transmuxConfig; + + if (state) { + this.currentTransmuxState = state; + } + + var keyData = getEncryptionType(uintData, decryptdata); + + if (keyData && keyData.method === 'AES-128') { + var decrypter = this.getDecrypter(); // Software decryption is synchronous; webCrypto is not + + if (config.enableSoftwareAES) { + // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached + // data is handled in the flush() call + var decryptedData = decrypter.softwareDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer); + + if (!decryptedData) { + stats.executeEnd = now(); + return emptyResult(chunkMeta); + } + + uintData = new Uint8Array(decryptedData); + } else { + this.decryptionPromise = decrypter.webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer).then(function (decryptedData) { + // Calling push here is important; if flush() is called while this is still resolving, this ensures that + // the decrypted data has been transmuxed + var result = _this.push(decryptedData, null, chunkMeta); + + _this.decryptionPromise = null; + return result; + }); + return this.decryptionPromise; + } + } + + var _ref2 = state || currentTransmuxState, + contiguous = _ref2.contiguous, + discontinuity = _ref2.discontinuity, + trackSwitch = _ref2.trackSwitch, + accurateTimeOffset = _ref2.accurateTimeOffset, + timeOffset = _ref2.timeOffset; + + var audioCodec = transmuxConfig.audioCodec, + videoCodec = transmuxConfig.videoCodec, + defaultInitPts = transmuxConfig.defaultInitPts, + duration = transmuxConfig.duration, + initSegmentData = transmuxConfig.initSegmentData; // Reset muxers before probing to ensure that their state is clean, even if flushing occurs before a successful probe + + if (discontinuity || trackSwitch) { + this.resetInitSegment(initSegmentData, audioCodec, videoCodec, duration); + } + + if (discontinuity) { + this.resetInitialTimestamp(defaultInitPts); + } + + if (!contiguous) { + this.resetContiguity(); + } + + if (this.needsProbing(uintData, discontinuity, trackSwitch)) { + if (cache.dataLength) { + var cachedData = cache.flush(); + uintData = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_10__["appendUint8Array"])(cachedData, uintData); + } + + this.configureTransmuxer(uintData, transmuxConfig); + } + + var result = this.transmux(uintData, keyData, timeOffset, accurateTimeOffset, chunkMeta); + var currentState = this.currentTransmuxState; + currentState.contiguous = true; + currentState.discontinuity = false; + currentState.trackSwitch = false; + stats.executeEnd = now(); + return result; + } // Due to data caching, flush calls can produce more than one TransmuxerResult (hence the Array type) + ; + + _proto.flush = function flush(chunkMeta) { + var _this2 = this; + + var stats = chunkMeta.transmuxing; + stats.executeStart = now(); + var decrypter = this.decrypter, + cache = this.cache, + currentTransmuxState = this.currentTransmuxState, + decryptionPromise = this.decryptionPromise; + + if (decryptionPromise) { + // Upon resolution, the decryption promise calls push() and returns its TransmuxerResult up the stack. Therefore + // only flushing is required for async decryption + return decryptionPromise.then(function () { + return _this2.flush(chunkMeta); + }); + } + + var transmuxResults = []; + var timeOffset = currentTransmuxState.timeOffset; + + if (decrypter) { + // The decrypter may have data cached, which needs to be demuxed. In this case we'll have two TransmuxResults + // This happens in the case that we receive only 1 push call for a segment (either for non-progressive downloads, + // or for progressive downloads with small segments) + var decryptedData = decrypter.flush(); + + if (decryptedData) { + // Push always returns a TransmuxerResult if decryptdata is null + transmuxResults.push(this.push(decryptedData, null, chunkMeta)); + } + } + + var bytesSeen = cache.dataLength; + cache.reset(); + var demuxer = this.demuxer, + remuxer = this.remuxer; + + if (!demuxer || !remuxer) { + // If probing failed, and each demuxer saw enough bytes to be able to probe, then Hls.js has been given content its not able to handle + if (bytesSeen >= minProbeByteLength) { + this.observer.emit(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, _events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].FRAG_PARSING_ERROR, + fatal: true, + reason: 'no demux matching with content found' + }); + } + + stats.executeEnd = now(); + return [emptyResult(chunkMeta)]; + } + + var demuxResultOrPromise = demuxer.flush(timeOffset); + + if (isPromise(demuxResultOrPromise)) { + // Decrypt final SAMPLE-AES samples + return demuxResultOrPromise.then(function (demuxResult) { + _this2.flushRemux(transmuxResults, demuxResult, chunkMeta); + + return transmuxResults; + }); + } + + this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta); + return transmuxResults; + }; + + _proto.flushRemux = function flushRemux(transmuxResults, demuxResult, chunkMeta) { + var audioTrack = demuxResult.audioTrack, + avcTrack = demuxResult.avcTrack, + id3Track = demuxResult.id3Track, + textTrack = demuxResult.textTrack; + var _this$currentTransmux = this.currentTransmuxState, + accurateTimeOffset = _this$currentTransmux.accurateTimeOffset, + timeOffset = _this$currentTransmux.timeOffset; + _utils_logger__WEBPACK_IMPORTED_MODULE_11__["logger"].log("[transmuxer.ts]: Flushed fragment " + chunkMeta.sn + (chunkMeta.part > -1 ? ' p: ' + chunkMeta.part : '') + " of level " + chunkMeta.level); + var remuxResult = this.remuxer.remux(audioTrack, avcTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id); + transmuxResults.push({ + remuxResult: remuxResult, + chunkMeta: chunkMeta + }); + chunkMeta.transmuxing.executeEnd = now(); + }; + + _proto.resetInitialTimestamp = function resetInitialTimestamp(defaultInitPts) { + var demuxer = this.demuxer, + remuxer = this.remuxer; + + if (!demuxer || !remuxer) { + return; + } + + demuxer.resetTimeStamp(defaultInitPts); + remuxer.resetTimeStamp(defaultInitPts); + }; + + _proto.resetContiguity = function resetContiguity() { + var demuxer = this.demuxer, + remuxer = this.remuxer; + + if (!demuxer || !remuxer) { + return; + } + + demuxer.resetContiguity(); + remuxer.resetNextTimestamp(); + }; + + _proto.resetInitSegment = function resetInitSegment(initSegmentData, audioCodec, videoCodec, duration) { + var demuxer = this.demuxer, + remuxer = this.remuxer; + + if (!demuxer || !remuxer) { + return; + } + + demuxer.resetInitSegment(audioCodec, videoCodec, duration); + remuxer.resetInitSegment(initSegmentData, audioCodec, videoCodec); + }; + + _proto.destroy = function destroy() { + if (this.demuxer) { + this.demuxer.destroy(); + this.demuxer = undefined; + } + + if (this.remuxer) { + this.remuxer.destroy(); + this.remuxer = undefined; + } + }; + + _proto.transmux = function transmux(data, keyData, timeOffset, accurateTimeOffset, chunkMeta) { + var result; + + if (keyData && keyData.method === 'SAMPLE-AES') { + result = this.transmuxSampleAes(data, keyData, timeOffset, accurateTimeOffset, chunkMeta); + } else { + result = this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta); + } + + return result; + }; + + _proto.transmuxUnencrypted = function transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta) { + var _demux = this.demuxer.demux(data, timeOffset, false, !this.config.progressive), + audioTrack = _demux.audioTrack, + avcTrack = _demux.avcTrack, + id3Track = _demux.id3Track, + textTrack = _demux.textTrack; + + var remuxResult = this.remuxer.remux(audioTrack, avcTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, false, this.id); + return { + remuxResult: remuxResult, + chunkMeta: chunkMeta + }; + }; + + _proto.transmuxSampleAes = function transmuxSampleAes(data, decryptData, timeOffset, accurateTimeOffset, chunkMeta) { + var _this3 = this; + + return this.demuxer.demuxSampleAes(data, decryptData, timeOffset).then(function (demuxResult) { + var remuxResult = _this3.remuxer.remux(demuxResult.audioTrack, demuxResult.avcTrack, demuxResult.id3Track, demuxResult.textTrack, timeOffset, accurateTimeOffset, false, _this3.id); + + return { + remuxResult: remuxResult, + chunkMeta: chunkMeta + }; + }); + }; + + _proto.configureTransmuxer = function configureTransmuxer(data, transmuxConfig) { + var config = this.config, + observer = this.observer, + typeSupported = this.typeSupported, + vendor = this.vendor; + var audioCodec = transmuxConfig.audioCodec, + defaultInitPts = transmuxConfig.defaultInitPts, + duration = transmuxConfig.duration, + initSegmentData = transmuxConfig.initSegmentData, + videoCodec = transmuxConfig.videoCodec; // probe for content type + + var mux; + + for (var i = 0, len = muxConfig.length; i < len; i++) { + if (muxConfig[i].demux.probe(data)) { + mux = muxConfig[i]; + break; + } + } + + if (!mux) { + // If probing previous configs fail, use mp4 passthrough + _utils_logger__WEBPACK_IMPORTED_MODULE_11__["logger"].warn('Failed to find demuxer by probing frag, treating as mp4 passthrough'); + mux = { + demux: _demux_mp4demuxer__WEBPACK_IMPORTED_MODULE_4__["default"], + remux: _remux_passthrough_remuxer__WEBPACK_IMPORTED_MODULE_8__["default"] + }; + } // so let's check that current remuxer and demuxer are still valid + + + var demuxer = this.demuxer; + var remuxer = this.remuxer; + var Remuxer = mux.remux; + var Demuxer = mux.demux; + + if (!remuxer || !(remuxer instanceof Remuxer)) { + this.remuxer = new Remuxer(observer, config, typeSupported, vendor); + } + + if (!demuxer || !(demuxer instanceof Demuxer)) { + this.demuxer = new Demuxer(observer, config, typeSupported); + this.probe = Demuxer.probe; + } // Ensure that muxers are always initialized with an initSegment + + + this.resetInitSegment(initSegmentData, audioCodec, videoCodec, duration); + this.resetInitialTimestamp(defaultInitPts); + }; + + _proto.needsProbing = function needsProbing(data, discontinuity, trackSwitch) { + // in case of continuity change, or track switch + // we might switch from content type (AAC container to TS container, or TS to fmp4 for example) + return !this.demuxer || !this.remuxer || discontinuity || trackSwitch; + }; + + _proto.getDecrypter = function getDecrypter() { + var decrypter = this.decrypter; + + if (!decrypter) { + decrypter = this.decrypter = new _crypt_decrypter__WEBPACK_IMPORTED_MODULE_2__["default"](this.observer, this.config); + } + + return decrypter; + }; + + return Transmuxer; +}(); + + + +function getEncryptionType(data, decryptData) { + var encryptionType = null; + + if (data.byteLength > 0 && decryptData != null && decryptData.key != null && decryptData.iv !== null && decryptData.method != null) { + encryptionType = decryptData; + } + + return encryptionType; +} + +var emptyResult = function emptyResult(chunkMeta) { + return { + remuxResult: {}, + chunkMeta: chunkMeta + }; +}; + +function isPromise(p) { + return 'then' in p && p.then instanceof Function; +} +var TransmuxConfig = function TransmuxConfig(audioCodec, videoCodec, initSegmentData, duration, defaultInitPts) { + this.audioCodec = void 0; + this.videoCodec = void 0; + this.initSegmentData = void 0; + this.duration = void 0; + this.defaultInitPts = void 0; + this.audioCodec = audioCodec; + this.videoCodec = videoCodec; + this.initSegmentData = initSegmentData; + this.duration = duration; + this.defaultInitPts = defaultInitPts; +}; +var TransmuxState = function TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset) { + this.discontinuity = void 0; + this.contiguous = void 0; + this.accurateTimeOffset = void 0; + this.trackSwitch = void 0; + this.timeOffset = void 0; + this.discontinuity = discontinuity; + this.contiguous = contiguous; + this.accurateTimeOffset = accurateTimeOffset; + this.trackSwitch = trackSwitch; + this.timeOffset = timeOffset; +}; + +/***/ }), + +/***/ "./src/demux/tsdemuxer.ts": +/*!********************************!*\ + !*** ./src/demux/tsdemuxer.ts ***! + \********************************/ +/*! exports provided: discardEPB, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "discardEPB", function() { return discardEPB; }); +/* harmony import */ var _adts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./adts */ "./src/demux/adts.ts"); +/* harmony import */ var _mpegaudio__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mpegaudio */ "./src/demux/mpegaudio.ts"); +/* harmony import */ var _exp_golomb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./exp-golomb */ "./src/demux/exp-golomb.ts"); +/* harmony import */ var _id3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./id3 */ "./src/demux/id3.ts"); +/* harmony import */ var _sample_aes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sample-aes */ "./src/demux/sample-aes.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/** + * highly optimized TS demuxer: + * parse PAT, PMT + * extract PES packet from audio and video PIDs + * extract AVC/H264 NAL units and AAC/ADTS samples from PES packet + * trigger the remuxer upon parsing completion + * it also tries to workaround as best as it can audio codec switch (HE-AAC to AAC and vice versa), without having to restart the MediaSource. + * it also controls the remuxing process : + * upon discontinuity or level switch detection, it will also notifies the remuxer so that it can reset its state. + */ + + + + + + + + + +// We are using fixed track IDs for driving the MP4 remuxer +// instead of following the TS PIDs. +// There is no reason not to do this and some browsers/SourceBuffer-demuxers +// may not like if there are TrackID "switches" +// See https://github.com/video-dev/hls.js/issues/1331 +// Here we are mapping our internal track types to constant MP4 track IDs +// With MSE currently one can only have one track of each, and we are muxing +// whatever video/audio rendition in them. +var RemuxerTrackIdConfig = { + video: 1, + audio: 2, + id3: 3, + text: 4 +}; + +var TSDemuxer = /*#__PURE__*/function () { + function TSDemuxer(observer, config, typeSupported) { + this.observer = void 0; + this.config = void 0; + this.typeSupported = void 0; + this.sampleAes = null; + this.pmtParsed = false; + this.audioCodec = void 0; + this.videoCodec = void 0; + this._duration = 0; + this.aacLastPTS = null; + this._initPTS = null; + this._initDTS = null; + this._pmtId = -1; + this._avcTrack = void 0; + this._audioTrack = void 0; + this._id3Track = void 0; + this._txtTrack = void 0; + this.aacOverFlow = null; + this.avcSample = null; + this.remainderData = null; + this.observer = observer; + this.config = config; + this.typeSupported = typeSupported; + } + + TSDemuxer.probe = function probe(data) { + var syncOffset = TSDemuxer.syncOffset(data); + + if (syncOffset < 0) { + return false; + } else { + if (syncOffset) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].warn("MPEG2-TS detected but first sync word found @ offset " + syncOffset + ", junk ahead ?"); + } + + return true; + } + }; + + TSDemuxer.syncOffset = function syncOffset(data) { + // scan 1000 first bytes + var scanwindow = Math.min(1000, data.length - 3 * 188); + var i = 0; + + while (i < scanwindow) { + // a TS fragment should contain at least 3 TS packets, a PAT, a PMT, and one PID, each starting with 0x47 + if (data[i] === 0x47 && data[i + 188] === 0x47 && data[i + 2 * 188] === 0x47) { + return i; + } else { + i++; + } + } + + return -1; + } + /** + * Creates a track model internal to demuxer used to drive remuxing input + * + * @param type 'audio' | 'video' | 'id3' | 'text' + * @param duration + * @return TSDemuxer's internal track model + */ + ; + + TSDemuxer.createTrack = function createTrack(type, duration) { + return { + container: type === 'video' || type === 'audio' ? 'video/mp2t' : undefined, + type: type, + id: RemuxerTrackIdConfig[type], + pid: -1, + inputTimeScale: 90000, + sequenceNumber: 0, + samples: [], + dropped: 0, + duration: type === 'audio' ? duration : undefined + }; + } + /** + * Initializes a new init segment on the demuxer/remuxer interface. Needed for discontinuities/track-switches (or at stream start) + * Resets all internal track instances of the demuxer. + */ + ; + + var _proto = TSDemuxer.prototype; + + _proto.resetInitSegment = function resetInitSegment(audioCodec, videoCodec, duration) { + this.pmtParsed = false; + this._pmtId = -1; + this._avcTrack = TSDemuxer.createTrack('video', duration); + this._audioTrack = TSDemuxer.createTrack('audio', duration); + this._id3Track = TSDemuxer.createTrack('id3', duration); + this._txtTrack = TSDemuxer.createTrack('text', duration); + this._audioTrack.isAAC = true; // flush any partial content + + this.aacOverFlow = null; + this.aacLastPTS = null; + this.avcSample = null; + this.audioCodec = audioCodec; + this.videoCodec = videoCodec; + this._duration = duration; + }; + + _proto.resetTimeStamp = function resetTimeStamp() {}; + + _proto.resetContiguity = function resetContiguity() { + var _audioTrack = this._audioTrack, + _avcTrack = this._avcTrack, + _id3Track = this._id3Track; + + if (_audioTrack) { + _audioTrack.pesData = null; + } + + if (_avcTrack) { + _avcTrack.pesData = null; + } + + if (_id3Track) { + _id3Track.pesData = null; + } + + this.aacOverFlow = null; + this.aacLastPTS = null; + }; + + _proto.demux = function demux(data, timeOffset, isSampleAes, flush) { + if (isSampleAes === void 0) { + isSampleAes = false; + } + + if (flush === void 0) { + flush = false; + } + + if (!isSampleAes) { + this.sampleAes = null; + } + + var pes; + var avcTrack = this._avcTrack; + var audioTrack = this._audioTrack; + var id3Track = this._id3Track; + var avcId = avcTrack.pid; + var avcData = avcTrack.pesData; + var audioId = audioTrack.pid; + var id3Id = id3Track.pid; + var audioData = audioTrack.pesData; + var id3Data = id3Track.pesData; + var unknownPIDs = false; + var pmtParsed = this.pmtParsed; + var pmtId = this._pmtId; + var len = data.length; + + if (this.remainderData) { + data = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_6__["appendUint8Array"])(this.remainderData, data); + len = data.length; + this.remainderData = null; + } + + if (len < 188 && !flush) { + this.remainderData = data; + return { + audioTrack: audioTrack, + avcTrack: avcTrack, + id3Track: id3Track, + textTrack: this._txtTrack + }; + } + + var syncOffset = Math.max(0, TSDemuxer.syncOffset(data)); + len -= (len + syncOffset) % 188; + + if (len < data.byteLength && !flush) { + this.remainderData = new Uint8Array(data.buffer, len, data.buffer.byteLength - len); + } // loop through TS packets + + + for (var start = syncOffset; start < len; start += 188) { + if (data[start] === 0x47) { + var stt = !!(data[start + 1] & 0x40); // pid is a 13-bit field starting at the last bit of TS[1] + + var pid = ((data[start + 1] & 0x1f) << 8) + data[start + 2]; + var atf = (data[start + 3] & 0x30) >> 4; // if an adaption field is present, its length is specified by the fifth byte of the TS packet header. + + var offset = void 0; + + if (atf > 1) { + offset = start + 5 + data[start + 4]; // continue if there is only adaptation field + + if (offset === start + 188) { + continue; + } + } else { + offset = start + 4; + } + + switch (pid) { + case avcId: + if (stt) { + if (avcData && (pes = parsePES(avcData))) { + this.parseAVCPES(pes, false); + } + + avcData = { + data: [], + size: 0 + }; + } + + if (avcData) { + avcData.data.push(data.subarray(offset, start + 188)); + avcData.size += start + 188 - offset; + } + + break; + + case audioId: + if (stt) { + if (audioData && (pes = parsePES(audioData))) { + if (audioTrack.isAAC) { + this.parseAACPES(pes); + } else { + this.parseMPEGPES(pes); + } + } + + audioData = { + data: [], + size: 0 + }; + } + + if (audioData) { + audioData.data.push(data.subarray(offset, start + 188)); + audioData.size += start + 188 - offset; + } + + break; + + case id3Id: + if (stt) { + if (id3Data && (pes = parsePES(id3Data))) { + this.parseID3PES(pes); + } + + id3Data = { + data: [], + size: 0 + }; + } + + if (id3Data) { + id3Data.data.push(data.subarray(offset, start + 188)); + id3Data.size += start + 188 - offset; + } + + break; + + case 0: + if (stt) { + offset += data[offset] + 1; + } + + pmtId = this._pmtId = parsePAT(data, offset); + break; + + case pmtId: + { + if (stt) { + offset += data[offset] + 1; + } + + var parsedPIDs = parsePMT(data, offset, this.typeSupported.mpeg === true || this.typeSupported.mp3 === true, isSampleAes); // only update track id if track PID found while parsing PMT + // this is to avoid resetting the PID to -1 in case + // track PID transiently disappears from the stream + // this could happen in case of transient missing audio samples for example + // NOTE this is only the PID of the track as found in TS, + // but we are not using this for MP4 track IDs. + + avcId = parsedPIDs.avc; + + if (avcId > 0) { + avcTrack.pid = avcId; + } + + audioId = parsedPIDs.audio; + + if (audioId > 0) { + audioTrack.pid = audioId; + audioTrack.isAAC = parsedPIDs.isAAC; + } + + id3Id = parsedPIDs.id3; + + if (id3Id > 0) { + id3Track.pid = id3Id; + } + + if (unknownPIDs && !pmtParsed) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].log('reparse from beginning'); + unknownPIDs = false; // we set it to -188, the += 188 in the for loop will reset start to 0 + + start = syncOffset - 188; + } + + pmtParsed = this.pmtParsed = true; + break; + } + + case 17: + case 0x1fff: + break; + + default: + unknownPIDs = true; + break; + } + } else { + this.observer.emit(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].ERROR, _events__WEBPACK_IMPORTED_MODULE_5__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_8__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_8__["ErrorDetails"].FRAG_PARSING_ERROR, + fatal: false, + reason: 'TS packet did not start with 0x47' + }); + } + } + + avcTrack.pesData = avcData; + audioTrack.pesData = audioData; + id3Track.pesData = id3Data; + var demuxResult = { + audioTrack: audioTrack, + avcTrack: avcTrack, + id3Track: id3Track, + textTrack: this._txtTrack + }; + + if (flush) { + this.extractRemainingSamples(demuxResult); + } + + return demuxResult; + }; + + _proto.flush = function flush() { + var remainderData = this.remainderData; + this.remainderData = null; + var result; + + if (remainderData) { + result = this.demux(remainderData, -1, false, true); + } else { + result = { + audioTrack: this._audioTrack, + avcTrack: this._avcTrack, + textTrack: this._txtTrack, + id3Track: this._id3Track + }; + } + + this.extractRemainingSamples(result); + + if (this.sampleAes) { + return this.decrypt(result, this.sampleAes); + } + + return result; + }; + + _proto.extractRemainingSamples = function extractRemainingSamples(demuxResult) { + var audioTrack = demuxResult.audioTrack, + avcTrack = demuxResult.avcTrack, + id3Track = demuxResult.id3Track; + var avcData = avcTrack.pesData; + var audioData = audioTrack.pesData; + var id3Data = id3Track.pesData; // try to parse last PES packets + + var pes; + + if (avcData && (pes = parsePES(avcData))) { + this.parseAVCPES(pes, true); + avcTrack.pesData = null; + } else { + // either avcData null or PES truncated, keep it for next frag parsing + avcTrack.pesData = avcData; + } + + if (audioData && (pes = parsePES(audioData))) { + if (audioTrack.isAAC) { + this.parseAACPES(pes); + } else { + this.parseMPEGPES(pes); + } + + audioTrack.pesData = null; + } else { + if (audioData !== null && audioData !== void 0 && audioData.size) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].log('last AAC PES packet truncated,might overlap between fragments'); + } // either audioData null or PES truncated, keep it for next frag parsing + + + audioTrack.pesData = audioData; + } + + if (id3Data && (pes = parsePES(id3Data))) { + this.parseID3PES(pes); + id3Track.pesData = null; + } else { + // either id3Data null or PES truncated, keep it for next frag parsing + id3Track.pesData = id3Data; + } + }; + + _proto.demuxSampleAes = function demuxSampleAes(data, keyData, timeOffset) { + var demuxResult = this.demux(data, timeOffset, true, !this.config.progressive); + var sampleAes = this.sampleAes = new _sample_aes__WEBPACK_IMPORTED_MODULE_4__["default"](this.observer, this.config, keyData); + return this.decrypt(demuxResult, sampleAes); + }; + + _proto.decrypt = function decrypt(demuxResult, sampleAes) { + return new Promise(function (resolve) { + var audioTrack = demuxResult.audioTrack, + avcTrack = demuxResult.avcTrack; + + if (audioTrack.samples && audioTrack.isAAC) { + sampleAes.decryptAacSamples(audioTrack.samples, 0, function () { + if (avcTrack.samples) { + sampleAes.decryptAvcSamples(avcTrack.samples, 0, 0, function () { + resolve(demuxResult); + }); + } else { + resolve(demuxResult); + } + }); + } else if (avcTrack.samples) { + sampleAes.decryptAvcSamples(avcTrack.samples, 0, 0, function () { + resolve(demuxResult); + }); + } + }); + }; + + _proto.destroy = function destroy() { + this._initPTS = this._initDTS = null; + this._duration = 0; + }; + + _proto.parseAVCPES = function parseAVCPES(pes, last) { + var _this = this; + + var track = this._avcTrack; + var units = this.parseAVCNALu(pes.data); + var debug = false; + var avcSample = this.avcSample; + var push; + var spsfound = false; // free pes.data to save up some memory + + pes.data = null; // if new NAL units found and last sample still there, let's push ... + // this helps parsing streams with missing AUD (only do this if AUD never found) + + if (avcSample && units.length && !track.audFound) { + pushAccessUnit(avcSample, track); + avcSample = this.avcSample = createAVCSample(false, pes.pts, pes.dts, ''); + } + + units.forEach(function (unit) { + switch (unit.type) { + // NDR + case 1: + { + push = true; + + if (!avcSample) { + avcSample = _this.avcSample = createAVCSample(true, pes.pts, pes.dts, ''); + } + + if (debug) { + avcSample.debug += 'NDR '; + } + + avcSample.frame = true; + var data = unit.data; // only check slice type to detect KF in case SPS found in same packet (any keyframe is preceded by SPS ...) + + if (spsfound && data.length > 4) { + // retrieve slice type by parsing beginning of NAL unit (follow H264 spec, slice_header definition) to detect keyframe embedded in NDR + var sliceType = new _exp_golomb__WEBPACK_IMPORTED_MODULE_2__["default"](data).readSliceType(); // 2 : I slice, 4 : SI slice, 7 : I slice, 9: SI slice + // SI slice : A slice that is coded using intra prediction only and using quantisation of the prediction samples. + // An SI slice can be coded such that its decoded samples can be constructed identically to an SP slice. + // I slice: A slice that is not an SI slice that is decoded using intra prediction only. + // if (sliceType === 2 || sliceType === 7) { + + if (sliceType === 2 || sliceType === 4 || sliceType === 7 || sliceType === 9) { + avcSample.key = true; + } + } + + break; // IDR + } + + case 5: + push = true; // handle PES not starting with AUD + + if (!avcSample) { + avcSample = _this.avcSample = createAVCSample(true, pes.pts, pes.dts, ''); + } + + if (debug) { + avcSample.debug += 'IDR '; + } + + avcSample.key = true; + avcSample.frame = true; + break; + // SEI + + case 6: + { + push = true; + + if (debug && avcSample) { + avcSample.debug += 'SEI '; + } + + var expGolombDecoder = new _exp_golomb__WEBPACK_IMPORTED_MODULE_2__["default"](discardEPB(unit.data)); // skip frameType + + expGolombDecoder.readUByte(); + var payloadType = 0; + var payloadSize = 0; + var endOfCaptions = false; + var b = 0; + + while (!endOfCaptions && expGolombDecoder.bytesAvailable > 1) { + payloadType = 0; + + do { + b = expGolombDecoder.readUByte(); + payloadType += b; + } while (b === 0xff); // Parse payload size. + + + payloadSize = 0; + + do { + b = expGolombDecoder.readUByte(); + payloadSize += b; + } while (b === 0xff); // TODO: there can be more than one payload in an SEI packet... + // TODO: need to read type and size in a while loop to get them all + + + if (payloadType === 4 && expGolombDecoder.bytesAvailable !== 0) { + endOfCaptions = true; + var countryCode = expGolombDecoder.readUByte(); + + if (countryCode === 181) { + var providerCode = expGolombDecoder.readUShort(); + + if (providerCode === 49) { + var userStructure = expGolombDecoder.readUInt(); + + if (userStructure === 0x47413934) { + var userDataType = expGolombDecoder.readUByte(); // Raw CEA-608 bytes wrapped in CEA-708 packet + + if (userDataType === 3) { + var firstByte = expGolombDecoder.readUByte(); + var secondByte = expGolombDecoder.readUByte(); + var totalCCs = 31 & firstByte; + var byteArray = [firstByte, secondByte]; + + for (var i = 0; i < totalCCs; i++) { + // 3 bytes per CC + byteArray.push(expGolombDecoder.readUByte()); + byteArray.push(expGolombDecoder.readUByte()); + byteArray.push(expGolombDecoder.readUByte()); + } + + insertSampleInOrder(_this._txtTrack.samples, { + type: 3, + pts: pes.pts, + bytes: byteArray + }); + } + } + } + } + } else if (payloadType === 5 && expGolombDecoder.bytesAvailable !== 0) { + endOfCaptions = true; + + if (payloadSize > 16) { + var uuidStrArray = []; + + for (var _i = 0; _i < 16; _i++) { + uuidStrArray.push(expGolombDecoder.readUByte().toString(16)); + + if (_i === 3 || _i === 5 || _i === 7 || _i === 9) { + uuidStrArray.push('-'); + } + } + + var length = payloadSize - 16; + var userDataPayloadBytes = new Uint8Array(length); + + for (var _i2 = 0; _i2 < length; _i2++) { + userDataPayloadBytes[_i2] = expGolombDecoder.readUByte(); + } + + insertSampleInOrder(_this._txtTrack.samples, { + pts: pes.pts, + payloadType: payloadType, + uuid: uuidStrArray.join(''), + userData: Object(_id3__WEBPACK_IMPORTED_MODULE_3__["utf8ArrayToStr"])(userDataPayloadBytes), + userDataBytes: userDataPayloadBytes + }); + } + } else if (payloadSize < expGolombDecoder.bytesAvailable) { + for (var _i3 = 0; _i3 < payloadSize; _i3++) { + expGolombDecoder.readUByte(); + } + } + } + + break; // SPS + } + + case 7: + push = true; + spsfound = true; + + if (debug && avcSample) { + avcSample.debug += 'SPS '; + } + + if (!track.sps) { + var _expGolombDecoder = new _exp_golomb__WEBPACK_IMPORTED_MODULE_2__["default"](unit.data); + + var config = _expGolombDecoder.readSPS(); + + track.width = config.width; + track.height = config.height; + track.pixelRatio = config.pixelRatio; // TODO: `track.sps` is defined as a `number[]`, but we're setting it to a `Uint8Array[]`. + + track.sps = [unit.data]; + track.duration = _this._duration; + var codecarray = unit.data.subarray(1, 4); + var codecstring = 'avc1.'; + + for (var _i4 = 0; _i4 < 3; _i4++) { + var h = codecarray[_i4].toString(16); + + if (h.length < 2) { + h = '0' + h; + } + + codecstring += h; + } + + track.codec = codecstring; + } + + break; + // PPS + + case 8: + push = true; + + if (debug && avcSample) { + avcSample.debug += 'PPS '; + } + + if (!track.pps) { + // TODO: `track.pss` is defined as a `number[]`, but we're setting it to a `Uint8Array[]`. + track.pps = [unit.data]; + } + + break; + // AUD + + case 9: + push = false; + track.audFound = true; + + if (avcSample) { + pushAccessUnit(avcSample, track); + } + + avcSample = _this.avcSample = createAVCSample(false, pes.pts, pes.dts, debug ? 'AUD ' : ''); + break; + // Filler Data + + case 12: + push = false; + break; + + default: + push = false; + + if (avcSample) { + avcSample.debug += 'unknown NAL ' + unit.type + ' '; + } + + break; + } + + if (avcSample && push) { + var _units = avcSample.units; + + _units.push(unit); + } + }); // if last PES packet, push samples + + if (last && avcSample) { + pushAccessUnit(avcSample, track); + this.avcSample = null; + } + }; + + _proto.getLastNalUnit = function getLastNalUnit() { + var _avcSample; + + var avcSample = this.avcSample; + var lastUnit; // try to fallback to previous sample if current one is empty + + if (!avcSample || avcSample.units.length === 0) { + var samples = this._avcTrack.samples; + avcSample = samples[samples.length - 1]; + } + + if ((_avcSample = avcSample) !== null && _avcSample !== void 0 && _avcSample.units) { + var units = avcSample.units; + lastUnit = units[units.length - 1]; + } + + return lastUnit; + }; + + _proto.parseAVCNALu = function parseAVCNALu(array) { + var len = array.byteLength; + var track = this._avcTrack; + var state = track.naluState || 0; + var lastState = state; + var units = []; + var i = 0; + var value; + var overflow; + var unitType; + var lastUnitStart = -1; + var lastUnitType = 0; // logger.log('PES:' + Hex.hexDump(array)); + + if (state === -1) { + // special use case where we found 3 or 4-byte start codes exactly at the end of previous PES packet + lastUnitStart = 0; // NALu type is value read from offset 0 + + lastUnitType = array[0] & 0x1f; + state = 0; + i = 1; + } + + while (i < len) { + value = array[i++]; // optimization. state 0 and 1 are the predominant case. let's handle them outside of the switch/case + + if (!state) { + state = value ? 0 : 1; + continue; + } + + if (state === 1) { + state = value ? 0 : 2; + continue; + } // here we have state either equal to 2 or 3 + + + if (!value) { + state = 3; + } else if (value === 1) { + if (lastUnitStart >= 0) { + var unit = { + data: array.subarray(lastUnitStart, i - state - 1), + type: lastUnitType + }; // logger.log('pushing NALU, type/size:' + unit.type + '/' + unit.data.byteLength); + + units.push(unit); + } else { + // lastUnitStart is undefined => this is the first start code found in this PES packet + // first check if start code delimiter is overlapping between 2 PES packets, + // ie it started in last packet (lastState not zero) + // and ended at the beginning of this PES packet (i <= 4 - lastState) + var lastUnit = this.getLastNalUnit(); + + if (lastUnit) { + if (lastState && i <= 4 - lastState) { + // start delimiter overlapping between PES packets + // strip start delimiter bytes from the end of last NAL unit + // check if lastUnit had a state different from zero + if (lastUnit.state) { + // strip last bytes + lastUnit.data = lastUnit.data.subarray(0, lastUnit.data.byteLength - lastState); + } + } // If NAL units are not starting right at the beginning of the PES packet, push preceding data into previous NAL unit. + + + overflow = i - state - 1; + + if (overflow > 0) { + // logger.log('first NALU found with overflow:' + overflow); + var tmp = new Uint8Array(lastUnit.data.byteLength + overflow); + tmp.set(lastUnit.data, 0); + tmp.set(array.subarray(0, overflow), lastUnit.data.byteLength); + lastUnit.data = tmp; + } + } + } // check if we can read unit type + + + if (i < len) { + unitType = array[i] & 0x1f; // logger.log('find NALU @ offset:' + i + ',type:' + unitType); + + lastUnitStart = i; + lastUnitType = unitType; + state = 0; + } else { + // not enough byte to read unit type. let's read it on next PES parsing + state = -1; + } + } else { + state = 0; + } + } + + if (lastUnitStart >= 0 && state >= 0) { + var _unit = { + data: array.subarray(lastUnitStart, len), + type: lastUnitType, + state: state + }; + units.push(_unit); // logger.log('pushing NALU, type/size/state:' + unit.type + '/' + unit.data.byteLength + '/' + state); + } // no NALu found + + + if (units.length === 0) { + // append pes.data to previous NAL unit + var _lastUnit = this.getLastNalUnit(); + + if (_lastUnit) { + var _tmp = new Uint8Array(_lastUnit.data.byteLength + array.byteLength); + + _tmp.set(_lastUnit.data, 0); + + _tmp.set(array, _lastUnit.data.byteLength); + + _lastUnit.data = _tmp; + } + } + + track.naluState = state; + return units; + }; + + _proto.parseAACPES = function parseAACPES(pes) { + var startOffset = 0; + var track = this._audioTrack; + var aacOverFlow = this.aacOverFlow; + var data = pes.data; + + if (aacOverFlow) { + this.aacOverFlow = null; + var sampleLength = aacOverFlow.sample.unit.byteLength; + var frameMissingBytes = Math.min(aacOverFlow.missing, sampleLength); + var frameOverflowBytes = sampleLength - frameMissingBytes; + aacOverFlow.sample.unit.set(data.subarray(0, frameMissingBytes), frameOverflowBytes); + track.samples.push(aacOverFlow.sample); // logger.log(`AAC: append overflowing ${frameOverflowBytes} bytes to beginning of new PES`); + + startOffset = aacOverFlow.missing; + } // look for ADTS header (0xFFFx) + + + var offset; + var len; + + for (offset = startOffset, len = data.length; offset < len - 1; offset++) { + if (_adts__WEBPACK_IMPORTED_MODULE_0__["isHeader"](data, offset)) { + break; + } + } // if ADTS header does not start straight from the beginning of the PES payload, raise an error + + + if (offset !== startOffset) { + var reason; + var fatal; + + if (offset < len - 1) { + reason = "AAC PES did not start with ADTS header,offset:" + offset; + fatal = false; + } else { + reason = 'no ADTS header found in AAC PES'; + fatal = true; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].warn("parsing error:" + reason); + this.observer.emit(_events__WEBPACK_IMPORTED_MODULE_5__["Events"].ERROR, _events__WEBPACK_IMPORTED_MODULE_5__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_8__["ErrorTypes"].MEDIA_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_8__["ErrorDetails"].FRAG_PARSING_ERROR, + fatal: fatal, + reason: reason + }); + + if (fatal) { + return; + } + } + + _adts__WEBPACK_IMPORTED_MODULE_0__["initTrackConfig"](track, this.observer, data, offset, this.audioCodec); + var pts; + + if (pes.pts !== undefined) { + pts = pes.pts; + } else if (aacOverFlow) { + // if last AAC frame is overflowing, we should ensure timestamps are contiguous: + // first sample PTS should be equal to last sample PTS + frameDuration + var frameDuration = _adts__WEBPACK_IMPORTED_MODULE_0__["getFrameDuration"](track.samplerate); + pts = aacOverFlow.sample.pts + frameDuration; + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].warn('[tsdemuxer]: AAC PES unknown PTS'); + return; + } // scan for aac samples + + + var frameIndex = 0; + + while (offset < len) { + if (_adts__WEBPACK_IMPORTED_MODULE_0__["isHeader"](data, offset)) { + if (offset + 5 < len) { + var frame = _adts__WEBPACK_IMPORTED_MODULE_0__["appendFrame"](track, data, offset, pts, frameIndex); + + if (frame) { + if (frame.missing) { + this.aacOverFlow = frame; + } else { + offset += frame.length; + frameIndex++; + continue; + } + } + } // We are at an ADTS header, but do not have enough data for a frame + // Remaining data will be added to aacOverFlow + + + break; + } else { + // nothing found, keep looking + offset++; + } + } + }; + + _proto.parseMPEGPES = function parseMPEGPES(pes) { + var data = pes.data; + var length = data.length; + var frameIndex = 0; + var offset = 0; + var pts = pes.pts; + + if (pts === undefined) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].warn('[tsdemuxer]: MPEG PES unknown PTS'); + return; + } + + while (offset < length) { + if (_mpegaudio__WEBPACK_IMPORTED_MODULE_1__["isHeader"](data, offset)) { + var frame = _mpegaudio__WEBPACK_IMPORTED_MODULE_1__["appendFrame"](this._audioTrack, data, offset, pts, frameIndex); + + if (frame) { + offset += frame.length; + frameIndex++; + } else { + // logger.log('Unable to parse Mpeg audio frame'); + break; + } + } else { + // nothing found, keep looking + offset++; + } + } + }; + + _proto.parseID3PES = function parseID3PES(pes) { + if (pes.pts === undefined) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].warn('[tsdemuxer]: ID3 PES unknown PTS'); + return; + } + + this._id3Track.samples.push(pes); + }; + + return TSDemuxer; +}(); + +TSDemuxer.minProbeByteLength = 188; + +function createAVCSample(key, pts, dts, debug) { + return { + key: key, + frame: false, + pts: pts, + dts: dts, + units: [], + debug: debug, + length: 0 + }; +} + +function parsePAT(data, offset) { + // skip the PSI header and parse the first PMT entry + return (data[offset + 10] & 0x1f) << 8 | data[offset + 11]; // logger.log('PMT PID:' + this._pmtId); +} + +function parsePMT(data, offset, mpegSupported, isSampleAes) { + var result = { + audio: -1, + avc: -1, + id3: -1, + isAAC: true + }; + var sectionLength = (data[offset + 1] & 0x0f) << 8 | data[offset + 2]; + var tableEnd = offset + 3 + sectionLength - 4; // to determine where the table is, we have to figure out how + // long the program info descriptors are + + var programInfoLength = (data[offset + 10] & 0x0f) << 8 | data[offset + 11]; // advance the offset to the first entry in the mapping table + + offset += 12 + programInfoLength; + + while (offset < tableEnd) { + var pid = (data[offset + 1] & 0x1f) << 8 | data[offset + 2]; + + switch (data[offset]) { + case 0xcf: + // SAMPLE-AES AAC + if (!isSampleAes) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].log('ADTS AAC with AES-128-CBC frame encryption found in unencrypted stream'); + break; + } + + /* falls through */ + + case 0x0f: + // ISO/IEC 13818-7 ADTS AAC (MPEG-2 lower bit-rate audio) + // logger.log('AAC PID:' + pid); + if (result.audio === -1) { + result.audio = pid; + } + + break; + // Packetized metadata (ID3) + + case 0x15: + // logger.log('ID3 PID:' + pid); + if (result.id3 === -1) { + result.id3 = pid; + } + + break; + + case 0xdb: + // SAMPLE-AES AVC + if (!isSampleAes) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].log('H.264 with AES-128-CBC slice encryption found in unencrypted stream'); + break; + } + + /* falls through */ + + case 0x1b: + // ITU-T Rec. H.264 and ISO/IEC 14496-10 (lower bit-rate video) + // logger.log('AVC PID:' + pid); + if (result.avc === -1) { + result.avc = pid; + } + + break; + // ISO/IEC 11172-3 (MPEG-1 audio) + // or ISO/IEC 13818-3 (MPEG-2 halved sample rate audio) + + case 0x03: + case 0x04: + // logger.log('MPEG PID:' + pid); + if (!mpegSupported) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].log('MPEG audio found, not supported in this browser'); + } else if (result.audio === -1) { + result.audio = pid; + result.isAAC = false; + } + + break; + + case 0x24: + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].warn('Unsupported HEVC stream type found'); + break; + + default: + // logger.log('unknown stream type:' + data[offset]); + break; + } // move to the next table entry + // skip past the elementary stream descriptors, if present + + + offset += ((data[offset + 3] & 0x0f) << 8 | data[offset + 4]) + 5; + } + + return result; +} + +function parsePES(stream) { + var i = 0; + var frag; + var pesLen; + var pesHdrLen; + var pesPts; + var pesDts; + var data = stream.data; // safety check + + if (!stream || stream.size === 0) { + return null; + } // we might need up to 19 bytes to read PES header + // if first chunk of data is less than 19 bytes, let's merge it with following ones until we get 19 bytes + // usually only one merge is needed (and this is rare ...) + + + while (data[0].length < 19 && data.length > 1) { + var newData = new Uint8Array(data[0].length + data[1].length); + newData.set(data[0]); + newData.set(data[1], data[0].length); + data[0] = newData; + data.splice(1, 1); + } // retrieve PTS/DTS from first fragment + + + frag = data[0]; + var pesPrefix = (frag[0] << 16) + (frag[1] << 8) + frag[2]; + + if (pesPrefix === 1) { + pesLen = (frag[4] << 8) + frag[5]; // if PES parsed length is not zero and greater than total received length, stop parsing. PES might be truncated + // minus 6 : PES header size + + if (pesLen && pesLen > stream.size - 6) { + return null; + } + + var pesFlags = frag[7]; + + if (pesFlags & 0xc0) { + /* PES header described here : http://dvd.sourceforge.net/dvdinfo/pes-hdr.html + as PTS / DTS is 33 bit we cannot use bitwise operator in JS, + as Bitwise operators treat their operands as a sequence of 32 bits */ + pesPts = (frag[9] & 0x0e) * 536870912 + // 1 << 29 + (frag[10] & 0xff) * 4194304 + // 1 << 22 + (frag[11] & 0xfe) * 16384 + // 1 << 14 + (frag[12] & 0xff) * 128 + // 1 << 7 + (frag[13] & 0xfe) / 2; + + if (pesFlags & 0x40) { + pesDts = (frag[14] & 0x0e) * 536870912 + // 1 << 29 + (frag[15] & 0xff) * 4194304 + // 1 << 22 + (frag[16] & 0xfe) * 16384 + // 1 << 14 + (frag[17] & 0xff) * 128 + // 1 << 7 + (frag[18] & 0xfe) / 2; + + if (pesPts - pesDts > 60 * 90000) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].warn(Math.round((pesPts - pesDts) / 90000) + "s delta between PTS and DTS, align them"); + pesPts = pesDts; + } + } else { + pesDts = pesPts; + } + } + + pesHdrLen = frag[8]; // 9 bytes : 6 bytes for PES header + 3 bytes for PES extension + + var payloadStartOffset = pesHdrLen + 9; + + if (stream.size <= payloadStartOffset) { + return null; + } + + stream.size -= payloadStartOffset; // reassemble PES packet + + var pesData = new Uint8Array(stream.size); + + for (var j = 0, dataLen = data.length; j < dataLen; j++) { + frag = data[j]; + var len = frag.byteLength; + + if (payloadStartOffset) { + if (payloadStartOffset > len) { + // trim full frag if PES header bigger than frag + payloadStartOffset -= len; + continue; + } else { + // trim partial frag if PES header smaller than frag + frag = frag.subarray(payloadStartOffset); + len -= payloadStartOffset; + payloadStartOffset = 0; + } + } + + pesData.set(frag, i); + i += len; + } + + if (pesLen) { + // payload size : remove PES header + PES extension + pesLen -= pesHdrLen + 3; + } + + return { + data: pesData, + pts: pesPts, + dts: pesDts, + len: pesLen + }; + } + + return null; +} + +function pushAccessUnit(avcSample, avcTrack) { + if (avcSample.units.length && avcSample.frame) { + // if sample does not have PTS/DTS, patch with last sample PTS/DTS + if (avcSample.pts === undefined) { + var samples = avcTrack.samples; + var nbSamples = samples.length; + + if (nbSamples) { + var lastSample = samples[nbSamples - 1]; + avcSample.pts = lastSample.pts; + avcSample.dts = lastSample.dts; + } else { + // dropping samples, no timestamp found + avcTrack.dropped++; + return; + } + } + + avcTrack.samples.push(avcSample); + } + + if (avcSample.debug.length) { + _utils_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].log(avcSample.pts + '/' + avcSample.dts + ':' + avcSample.debug); + } +} + +function insertSampleInOrder(arr, data) { + var len = arr.length; + + if (len > 0) { + if (data.pts >= arr[len - 1].pts) { + arr.push(data); + } else { + for (var pos = len - 1; pos >= 0; pos--) { + if (data.pts < arr[pos].pts) { + arr.splice(pos, 0, data); + break; + } + } + } + } else { + arr.push(data); + } +} +/** + * remove Emulation Prevention bytes from a RBSP + */ + + +function discardEPB(data) { + var length = data.byteLength; + var EPBPositions = []; + var i = 1; // Find all `Emulation Prevention Bytes` + + while (i < length - 2) { + if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) { + EPBPositions.push(i + 2); + i += 2; + } else { + i++; + } + } // If no Emulation Prevention Bytes were found just return the original + // array + + + if (EPBPositions.length === 0) { + return data; + } // Create a new array to hold the NAL unit data + + + var newLength = length - EPBPositions.length; + var newData = new Uint8Array(newLength); + var sourceIndex = 0; + + for (i = 0; i < newLength; sourceIndex++, i++) { + if (sourceIndex === EPBPositions[0]) { + // Skip this byte + sourceIndex++; // Remove this position index + + EPBPositions.shift(); + } + + newData[i] = data[sourceIndex]; + } + + return newData; +} +/* harmony default export */ __webpack_exports__["default"] = (TSDemuxer); + +/***/ }), + +/***/ "./src/errors.ts": +/*!***********************!*\ + !*** ./src/errors.ts ***! + \***********************/ +/*! exports provided: ErrorTypes, ErrorDetails */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorTypes", function() { return ErrorTypes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorDetails", function() { return ErrorDetails; }); +var ErrorTypes; +/** + * @enum {ErrorDetails} + * @typedef {string} ErrorDetail + */ + +(function (ErrorTypes) { + ErrorTypes["NETWORK_ERROR"] = "networkError"; + ErrorTypes["MEDIA_ERROR"] = "mediaError"; + ErrorTypes["KEY_SYSTEM_ERROR"] = "keySystemError"; + ErrorTypes["MUX_ERROR"] = "muxError"; + ErrorTypes["OTHER_ERROR"] = "otherError"; +})(ErrorTypes || (ErrorTypes = {})); + +var ErrorDetails; + +(function (ErrorDetails) { + ErrorDetails["KEY_SYSTEM_NO_KEYS"] = "keySystemNoKeys"; + ErrorDetails["KEY_SYSTEM_NO_ACCESS"] = "keySystemNoAccess"; + ErrorDetails["KEY_SYSTEM_NO_SESSION"] = "keySystemNoSession"; + ErrorDetails["KEY_SYSTEM_LICENSE_REQUEST_FAILED"] = "keySystemLicenseRequestFailed"; + ErrorDetails["KEY_SYSTEM_NO_INIT_DATA"] = "keySystemNoInitData"; + ErrorDetails["MANIFEST_LOAD_ERROR"] = "manifestLoadError"; + ErrorDetails["MANIFEST_LOAD_TIMEOUT"] = "manifestLoadTimeOut"; + ErrorDetails["MANIFEST_PARSING_ERROR"] = "manifestParsingError"; + ErrorDetails["MANIFEST_INCOMPATIBLE_CODECS_ERROR"] = "manifestIncompatibleCodecsError"; + ErrorDetails["LEVEL_EMPTY_ERROR"] = "levelEmptyError"; + ErrorDetails["LEVEL_LOAD_ERROR"] = "levelLoadError"; + ErrorDetails["LEVEL_LOAD_TIMEOUT"] = "levelLoadTimeOut"; + ErrorDetails["LEVEL_SWITCH_ERROR"] = "levelSwitchError"; + ErrorDetails["AUDIO_TRACK_LOAD_ERROR"] = "audioTrackLoadError"; + ErrorDetails["AUDIO_TRACK_LOAD_TIMEOUT"] = "audioTrackLoadTimeOut"; + ErrorDetails["SUBTITLE_LOAD_ERROR"] = "subtitleTrackLoadError"; + ErrorDetails["SUBTITLE_TRACK_LOAD_TIMEOUT"] = "subtitleTrackLoadTimeOut"; + ErrorDetails["FRAG_LOAD_ERROR"] = "fragLoadError"; + ErrorDetails["FRAG_LOAD_TIMEOUT"] = "fragLoadTimeOut"; + ErrorDetails["FRAG_DECRYPT_ERROR"] = "fragDecryptError"; + ErrorDetails["FRAG_PARSING_ERROR"] = "fragParsingError"; + ErrorDetails["REMUX_ALLOC_ERROR"] = "remuxAllocError"; + ErrorDetails["KEY_LOAD_ERROR"] = "keyLoadError"; + ErrorDetails["KEY_LOAD_TIMEOUT"] = "keyLoadTimeOut"; + ErrorDetails["BUFFER_ADD_CODEC_ERROR"] = "bufferAddCodecError"; + ErrorDetails["BUFFER_INCOMPATIBLE_CODECS_ERROR"] = "bufferIncompatibleCodecsError"; + ErrorDetails["BUFFER_APPEND_ERROR"] = "bufferAppendError"; + ErrorDetails["BUFFER_APPENDING_ERROR"] = "bufferAppendingError"; + ErrorDetails["BUFFER_STALLED_ERROR"] = "bufferStalledError"; + ErrorDetails["BUFFER_FULL_ERROR"] = "bufferFullError"; + ErrorDetails["BUFFER_SEEK_OVER_HOLE"] = "bufferSeekOverHole"; + ErrorDetails["BUFFER_NUDGE_ON_STALL"] = "bufferNudgeOnStall"; + ErrorDetails["INTERNAL_EXCEPTION"] = "internalException"; + ErrorDetails["INTERNAL_ABORTED"] = "aborted"; + ErrorDetails["UNKNOWN"] = "unknown"; +})(ErrorDetails || (ErrorDetails = {})); + +/***/ }), + +/***/ "./src/events.ts": +/*!***********************!*\ + !*** ./src/events.ts ***! + \***********************/ +/*! exports provided: Events */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Events", function() { return Events; }); +/** + * @readonly + * @enum {string} + */ +var Events; + +(function (Events) { + Events["MEDIA_ATTACHING"] = "hlsMediaAttaching"; + Events["MEDIA_ATTACHED"] = "hlsMediaAttached"; + Events["MEDIA_DETACHING"] = "hlsMediaDetaching"; + Events["MEDIA_DETACHED"] = "hlsMediaDetached"; + Events["BUFFER_RESET"] = "hlsBufferReset"; + Events["BUFFER_CODECS"] = "hlsBufferCodecs"; + Events["BUFFER_CREATED"] = "hlsBufferCreated"; + Events["BUFFER_APPENDING"] = "hlsBufferAppending"; + Events["BUFFER_APPENDED"] = "hlsBufferAppended"; + Events["BUFFER_EOS"] = "hlsBufferEos"; + Events["BUFFER_FLUSHING"] = "hlsBufferFlushing"; + Events["BUFFER_FLUSHED"] = "hlsBufferFlushed"; + Events["MANIFEST_LOADING"] = "hlsManifestLoading"; + Events["MANIFEST_LOADED"] = "hlsManifestLoaded"; + Events["MANIFEST_PARSED"] = "hlsManifestParsed"; + Events["LEVEL_SWITCHING"] = "hlsLevelSwitching"; + Events["LEVEL_SWITCHED"] = "hlsLevelSwitched"; + Events["LEVEL_LOADING"] = "hlsLevelLoading"; + Events["LEVEL_LOADED"] = "hlsLevelLoaded"; + Events["LEVEL_UPDATED"] = "hlsLevelUpdated"; + Events["LEVEL_PTS_UPDATED"] = "hlsLevelPtsUpdated"; + Events["LEVELS_UPDATED"] = "hlsLevelsUpdated"; + Events["AUDIO_TRACKS_UPDATED"] = "hlsAudioTracksUpdated"; + Events["AUDIO_TRACK_SWITCHING"] = "hlsAudioTrackSwitching"; + Events["AUDIO_TRACK_SWITCHED"] = "hlsAudioTrackSwitched"; + Events["AUDIO_TRACK_LOADING"] = "hlsAudioTrackLoading"; + Events["AUDIO_TRACK_LOADED"] = "hlsAudioTrackLoaded"; + Events["SUBTITLE_TRACKS_UPDATED"] = "hlsSubtitleTracksUpdated"; + Events["SUBTITLE_TRACKS_CLEARED"] = "hlsSubtitleTracksCleared"; + Events["SUBTITLE_TRACK_SWITCH"] = "hlsSubtitleTrackSwitch"; + Events["SUBTITLE_TRACK_LOADING"] = "hlsSubtitleTrackLoading"; + Events["SUBTITLE_TRACK_LOADED"] = "hlsSubtitleTrackLoaded"; + Events["SUBTITLE_FRAG_PROCESSED"] = "hlsSubtitleFragProcessed"; + Events["CUES_PARSED"] = "hlsCuesParsed"; + Events["NON_NATIVE_TEXT_TRACKS_FOUND"] = "hlsNonNativeTextTracksFound"; + Events["INIT_PTS_FOUND"] = "hlsInitPtsFound"; + Events["FRAG_LOADING"] = "hlsFragLoading"; + Events["FRAG_LOAD_EMERGENCY_ABORTED"] = "hlsFragLoadEmergencyAborted"; + Events["FRAG_LOADED"] = "hlsFragLoaded"; + Events["FRAG_DECRYPTED"] = "hlsFragDecrypted"; + Events["FRAG_PARSING_INIT_SEGMENT"] = "hlsFragParsingInitSegment"; + Events["FRAG_PARSING_USERDATA"] = "hlsFragParsingUserdata"; + Events["FRAG_PARSING_METADATA"] = "hlsFragParsingMetadata"; + Events["FRAG_PARSED"] = "hlsFragParsed"; + Events["FRAG_BUFFERED"] = "hlsFragBuffered"; + Events["FRAG_CHANGED"] = "hlsFragChanged"; + Events["FPS_DROP"] = "hlsFpsDrop"; + Events["FPS_DROP_LEVEL_CAPPING"] = "hlsFpsDropLevelCapping"; + Events["ERROR"] = "hlsError"; + Events["DESTROYING"] = "hlsDestroying"; + Events["KEY_LOADING"] = "hlsKeyLoading"; + Events["KEY_LOADED"] = "hlsKeyLoaded"; + Events["LIVE_BACK_BUFFER_REACHED"] = "hlsLiveBackBufferReached"; + Events["BACK_BUFFER_REACHED"] = "hlsBackBufferReached"; +})(Events || (Events = {})); + +/***/ }), + +/***/ "./src/hls.ts": +/*!********************!*\ + !*** ./src/hls.ts ***! + \********************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Hls; }); +/* harmony import */ var url_toolkit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! url-toolkit */ "./node_modules/url-toolkit/src/url-toolkit.js"); +/* harmony import */ var url_toolkit__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(url_toolkit__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _loader_playlist_loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loader/playlist-loader */ "./src/loader/playlist-loader.ts"); +/* harmony import */ var _loader_key_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./loader/key-loader */ "./src/loader/key-loader.ts"); +/* harmony import */ var _controller_id3_track_controller__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./controller/id3-track-controller */ "./src/controller/id3-track-controller.ts"); +/* harmony import */ var _controller_latency_controller__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./controller/latency-controller */ "./src/controller/latency-controller.ts"); +/* harmony import */ var _controller_level_controller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./controller/level-controller */ "./src/controller/level-controller.ts"); +/* harmony import */ var _controller_fragment_tracker__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./controller/fragment-tracker */ "./src/controller/fragment-tracker.ts"); +/* harmony import */ var _controller_stream_controller__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./controller/stream-controller */ "./src/controller/stream-controller.ts"); +/* harmony import */ var _is_supported__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./is-supported */ "./src/is-supported.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config */ "./src/config.ts"); +/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! eventemitter3 */ "./node_modules/eventemitter3/index.js"); +/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(eventemitter3__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./errors */ "./src/errors.ts"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + + + + + + + + + + + + + + + + +/** + * @module Hls + * @class + * @constructor + */ +var Hls = /*#__PURE__*/function () { + Hls.isSupported = function isSupported() { + return Object(_is_supported__WEBPACK_IMPORTED_MODULE_8__["isSupported"])(); + }; + + /** + * Creates an instance of an HLS client that can attach to exactly one `HTMLMediaElement`. + * + * @constructs Hls + * @param {HlsConfig} config + */ + function Hls(userConfig) { + if (userConfig === void 0) { + userConfig = {}; + } + + this.config = void 0; + this.userConfig = void 0; + this.coreComponents = void 0; + this.networkControllers = void 0; + this._emitter = new eventemitter3__WEBPACK_IMPORTED_MODULE_11__["EventEmitter"](); + this._autoLevelCapping = void 0; + this.abrController = void 0; + this.bufferController = void 0; + this.capLevelController = void 0; + this.latencyController = void 0; + this.levelController = void 0; + this.streamController = void 0; + this.audioTrackController = void 0; + this.subtitleTrackController = void 0; + this.emeController = void 0; + this.cmcdController = void 0; + this._media = null; + this.url = null; + var config = this.config = Object(_config__WEBPACK_IMPORTED_MODULE_10__["mergeConfig"])(Hls.DefaultConfig, userConfig); + this.userConfig = userConfig; + Object(_utils_logger__WEBPACK_IMPORTED_MODULE_9__["enableLogs"])(config.debug); + this._autoLevelCapping = -1; + + if (config.progressive) { + Object(_config__WEBPACK_IMPORTED_MODULE_10__["enableStreamingMode"])(config); + } // core controllers and network loaders + + + var ConfigAbrController = config.abrController, + ConfigBufferController = config.bufferController, + ConfigCapLevelController = config.capLevelController, + ConfigFpsController = config.fpsController; + var abrController = this.abrController = new ConfigAbrController(this); + var bufferController = this.bufferController = new ConfigBufferController(this); + var capLevelController = this.capLevelController = new ConfigCapLevelController(this); + var fpsController = new ConfigFpsController(this); + var playListLoader = new _loader_playlist_loader__WEBPACK_IMPORTED_MODULE_1__["default"](this); + var keyLoader = new _loader_key_loader__WEBPACK_IMPORTED_MODULE_2__["default"](this); + var id3TrackController = new _controller_id3_track_controller__WEBPACK_IMPORTED_MODULE_3__["default"](this); // network controllers + + var levelController = this.levelController = new _controller_level_controller__WEBPACK_IMPORTED_MODULE_5__["default"](this); // FragmentTracker must be defined before StreamController because the order of event handling is important + + var fragmentTracker = new _controller_fragment_tracker__WEBPACK_IMPORTED_MODULE_6__["FragmentTracker"](this); + var streamController = this.streamController = new _controller_stream_controller__WEBPACK_IMPORTED_MODULE_7__["default"](this, fragmentTracker); // Cap level controller uses streamController to flush the buffer + + capLevelController.setStreamController(streamController); // fpsController uses streamController to switch when frames are being dropped + + fpsController.setStreamController(streamController); + var networkControllers = [levelController, streamController]; + this.networkControllers = networkControllers; + var coreComponents = [playListLoader, keyLoader, abrController, bufferController, capLevelController, fpsController, id3TrackController, fragmentTracker]; + this.audioTrackController = this.createController(config.audioTrackController, null, networkControllers); + this.createController(config.audioStreamController, fragmentTracker, networkControllers); // subtitleTrackController must be defined before because the order of event handling is important + + this.subtitleTrackController = this.createController(config.subtitleTrackController, null, networkControllers); + this.createController(config.subtitleStreamController, fragmentTracker, networkControllers); + this.createController(config.timelineController, null, coreComponents); + this.emeController = this.createController(config.emeController, null, coreComponents); + this.cmcdController = this.createController(config.cmcdController, null, coreComponents); + this.latencyController = this.createController(_controller_latency_controller__WEBPACK_IMPORTED_MODULE_4__["default"], null, coreComponents); + this.coreComponents = coreComponents; + } + + var _proto = Hls.prototype; + + _proto.createController = function createController(ControllerClass, fragmentTracker, components) { + if (ControllerClass) { + var controllerInstance = fragmentTracker ? new ControllerClass(this, fragmentTracker) : new ControllerClass(this); + + if (components) { + components.push(controllerInstance); + } + + return controllerInstance; + } + + return null; + } // Delegate the EventEmitter through the public API of Hls.js + ; + + _proto.on = function on(event, listener, context) { + if (context === void 0) { + context = this; + } + + this._emitter.on(event, listener, context); + }; + + _proto.once = function once(event, listener, context) { + if (context === void 0) { + context = this; + } + + this._emitter.once(event, listener, context); + }; + + _proto.removeAllListeners = function removeAllListeners(event) { + this._emitter.removeAllListeners(event); + }; + + _proto.off = function off(event, listener, context, once) { + if (context === void 0) { + context = this; + } + + this._emitter.off(event, listener, context, once); + }; + + _proto.listeners = function listeners(event) { + return this._emitter.listeners(event); + }; + + _proto.emit = function emit(event, name, eventObject) { + return this._emitter.emit(event, name, eventObject); + }; + + _proto.trigger = function trigger(event, eventObject) { + if (this.config.debug) { + return this.emit(event, event, eventObject); + } else { + try { + return this.emit(event, event, eventObject); + } catch (e) { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].error('An internal error happened while handling event ' + event + '. Error message: "' + e.message + '". Here is a stacktrace:', e); + this.trigger(_events__WEBPACK_IMPORTED_MODULE_12__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorTypes"].OTHER_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"].INTERNAL_EXCEPTION, + fatal: false, + event: event, + error: e + }); + } + } + + return false; + }; + + _proto.listenerCount = function listenerCount(event) { + return this._emitter.listenerCount(event); + } + /** + * Dispose of the instance + */ + ; + + _proto.destroy = function destroy() { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log('destroy'); + this.trigger(_events__WEBPACK_IMPORTED_MODULE_12__["Events"].DESTROYING, undefined); + this.detachMedia(); + this.removeAllListeners(); + this._autoLevelCapping = -1; + this.url = null; + this.networkControllers.forEach(function (component) { + return component.destroy(); + }); + this.networkControllers.length = 0; + this.coreComponents.forEach(function (component) { + return component.destroy(); + }); + this.coreComponents.length = 0; + } + /** + * Attaches Hls.js to a media element + * @param {HTMLMediaElement} media + */ + ; + + _proto.attachMedia = function attachMedia(media) { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log('attachMedia'); + this._media = media; + this.trigger(_events__WEBPACK_IMPORTED_MODULE_12__["Events"].MEDIA_ATTACHING, { + media: media + }); + } + /** + * Detach Hls.js from the media + */ + ; + + _proto.detachMedia = function detachMedia() { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log('detachMedia'); + this.trigger(_events__WEBPACK_IMPORTED_MODULE_12__["Events"].MEDIA_DETACHING, undefined); + this._media = null; + } + /** + * Set the source URL. Can be relative or absolute. + * @param {string} url + */ + ; + + _proto.loadSource = function loadSource(url) { + this.stopLoad(); + var media = this.media; + var loadedSource = this.url; + var loadingSource = this.url = url_toolkit__WEBPACK_IMPORTED_MODULE_0__["buildAbsoluteURL"](self.location.href, url, { + alwaysNormalize: true + }); + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("loadSource:" + loadingSource); + + if (media && loadedSource && loadedSource !== loadingSource && this.bufferController.hasSourceTypes()) { + this.detachMedia(); + this.attachMedia(media); + } // when attaching to a source URL, trigger a playlist load + + + this.trigger(_events__WEBPACK_IMPORTED_MODULE_12__["Events"].MANIFEST_LOADING, { + url: url + }); + } + /** + * Start loading data from the stream source. + * Depending on default config, client starts loading automatically when a source is set. + * + * @param {number} startPosition Set the start position to stream from + * @default -1 None (from earliest point) + */ + ; + + _proto.startLoad = function startLoad(startPosition) { + if (startPosition === void 0) { + startPosition = -1; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("startLoad(" + startPosition + ")"); + this.networkControllers.forEach(function (controller) { + controller.startLoad(startPosition); + }); + } + /** + * Stop loading of any stream data. + */ + ; + + _proto.stopLoad = function stopLoad() { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log('stopLoad'); + this.networkControllers.forEach(function (controller) { + controller.stopLoad(); + }); + } + /** + * Swap through possible audio codecs in the stream (for example to switch from stereo to 5.1) + */ + ; + + _proto.swapAudioCodec = function swapAudioCodec() { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log('swapAudioCodec'); + this.streamController.swapAudioCodec(); + } + /** + * When the media-element fails, this allows to detach and then re-attach it + * as one call (convenience method). + * + * Automatic recovery of media-errors by this process is configurable. + */ + ; + + _proto.recoverMediaError = function recoverMediaError() { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log('recoverMediaError'); + var media = this._media; + this.detachMedia(); + + if (media) { + this.attachMedia(media); + } + }; + + _proto.removeLevel = function removeLevel(levelIndex, urlId) { + if (urlId === void 0) { + urlId = 0; + } + + this.levelController.removeLevel(levelIndex, urlId); + } + /** + * @type {Level[]} + */ + ; + + _createClass(Hls, [{ + key: "levels", + get: function get() { + var levels = this.levelController.levels; + return levels ? levels : []; + } + /** + * Index of quality level currently played + * @type {number} + */ + + }, { + key: "currentLevel", + get: function get() { + return this.streamController.currentLevel; + } + /** + * Set quality level index immediately . + * This will flush the current buffer to replace the quality asap. + * That means playback will interrupt at least shortly to re-buffer and re-sync eventually. + * @type {number} -1 for automatic level selection + */ + , + set: function set(newLevel) { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("set currentLevel:" + newLevel); + this.loadLevel = newLevel; + this.abrController.clearTimer(); + this.streamController.immediateLevelSwitch(); + } + /** + * Index of next quality level loaded as scheduled by stream controller. + * @type {number} + */ + + }, { + key: "nextLevel", + get: function get() { + return this.streamController.nextLevel; + } + /** + * Set quality level index for next loaded data. + * This will switch the video quality asap, without interrupting playback. + * May abort current loading of data, and flush parts of buffer (outside currently played fragment region). + * @type {number} -1 for automatic level selection + */ + , + set: function set(newLevel) { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("set nextLevel:" + newLevel); + this.levelController.manualLevel = newLevel; + this.streamController.nextLevelSwitch(); + } + /** + * Return the quality level of the currently or last (of none is loaded currently) segment + * @type {number} + */ + + }, { + key: "loadLevel", + get: function get() { + return this.levelController.level; + } + /** + * Set quality level index for next loaded data in a conservative way. + * This will switch the quality without flushing, but interrupt current loading. + * Thus the moment when the quality switch will appear in effect will only be after the already existing buffer. + * @type {number} newLevel -1 for automatic level selection + */ + , + set: function set(newLevel) { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("set loadLevel:" + newLevel); + this.levelController.manualLevel = newLevel; + } + /** + * get next quality level loaded + * @type {number} + */ + + }, { + key: "nextLoadLevel", + get: function get() { + return this.levelController.nextLoadLevel; + } + /** + * Set quality level of next loaded segment in a fully "non-destructive" way. + * Same as `loadLevel` but will wait for next switch (until current loading is done). + * @type {number} level + */ + , + set: function set(level) { + this.levelController.nextLoadLevel = level; + } + /** + * Return "first level": like a default level, if not set, + * falls back to index of first level referenced in manifest + * @type {number} + */ + + }, { + key: "firstLevel", + get: function get() { + return Math.max(this.levelController.firstLevel, this.minAutoLevel); + } + /** + * Sets "first-level", see getter. + * @type {number} + */ + , + set: function set(newLevel) { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("set firstLevel:" + newLevel); + this.levelController.firstLevel = newLevel; + } + /** + * Return start level (level of first fragment that will be played back) + * if not overrided by user, first level appearing in manifest will be used as start level + * if -1 : automatic start level selection, playback will start from level matching download bandwidth + * (determined from download of first segment) + * @type {number} + */ + + }, { + key: "startLevel", + get: function get() { + return this.levelController.startLevel; + } + /** + * set start level (level of first fragment that will be played back) + * if not overrided by user, first level appearing in manifest will be used as start level + * if -1 : automatic start level selection, playback will start from level matching download bandwidth + * (determined from download of first segment) + * @type {number} newLevel + */ + , + set: function set(newLevel) { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("set startLevel:" + newLevel); // if not in automatic start level detection, ensure startLevel is greater than minAutoLevel + + if (newLevel !== -1) { + newLevel = Math.max(newLevel, this.minAutoLevel); + } + + this.levelController.startLevel = newLevel; + } + /** + * Get the current setting for capLevelToPlayerSize + * + * @type {boolean} + */ + + }, { + key: "capLevelToPlayerSize", + get: function get() { + return this.config.capLevelToPlayerSize; + } + /** + * set dynamically set capLevelToPlayerSize against (`CapLevelController`) + * + * @type {boolean} + */ + , + set: function set(shouldStartCapping) { + var newCapLevelToPlayerSize = !!shouldStartCapping; + + if (newCapLevelToPlayerSize !== this.config.capLevelToPlayerSize) { + if (newCapLevelToPlayerSize) { + this.capLevelController.startCapping(); // If capping occurs, nextLevelSwitch will happen based on size. + } else { + this.capLevelController.stopCapping(); + this.autoLevelCapping = -1; + this.streamController.nextLevelSwitch(); // Now we're uncapped, get the next level asap. + } + + this.config.capLevelToPlayerSize = newCapLevelToPlayerSize; + } + } + /** + * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`) + * @type {number} + */ + + }, { + key: "autoLevelCapping", + get: function get() { + return this._autoLevelCapping; + } + /** + * get bandwidth estimate + * @type {number} + */ + , + set: + /** + * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`) + * @type {number} + */ + function set(newLevel) { + if (this._autoLevelCapping !== newLevel) { + _utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("set autoLevelCapping:" + newLevel); + this._autoLevelCapping = newLevel; + } + } + /** + * True when automatic level selection enabled + * @type {boolean} + */ + + }, { + key: "bandwidthEstimate", + get: function get() { + var bwEstimator = this.abrController.bwEstimator; + + if (!bwEstimator) { + return NaN; + } + + return bwEstimator.getEstimate(); + } + }, { + key: "autoLevelEnabled", + get: function get() { + return this.levelController.manualLevel === -1; + } + /** + * Level set manually (if any) + * @type {number} + */ + + }, { + key: "manualLevel", + get: function get() { + return this.levelController.manualLevel; + } + /** + * min level selectable in auto mode according to config.minAutoBitrate + * @type {number} + */ + + }, { + key: "minAutoLevel", + get: function get() { + var levels = this.levels, + minAutoBitrate = this.config.minAutoBitrate; + if (!levels) return 0; + var len = levels.length; + + for (var i = 0; i < len; i++) { + if (levels[i].maxBitrate > minAutoBitrate) { + return i; + } + } + + return 0; + } + /** + * max level selectable in auto mode according to autoLevelCapping + * @type {number} + */ + + }, { + key: "maxAutoLevel", + get: function get() { + var levels = this.levels, + autoLevelCapping = this.autoLevelCapping; + var maxAutoLevel; + + if (autoLevelCapping === -1 && levels && levels.length) { + maxAutoLevel = levels.length - 1; + } else { + maxAutoLevel = autoLevelCapping; + } + + return maxAutoLevel; + } + /** + * next automatically selected quality level + * @type {number} + */ + + }, { + key: "nextAutoLevel", + get: function get() { + // ensure next auto level is between min and max auto level + return Math.min(Math.max(this.abrController.nextAutoLevel, this.minAutoLevel), this.maxAutoLevel); + } + /** + * this setter is used to force next auto level. + * this is useful to force a switch down in auto mode: + * in case of load error on level N, hls.js can set nextAutoLevel to N-1 for example) + * forced value is valid for one fragment. upon succesful frag loading at forced level, + * this value will be resetted to -1 by ABR controller. + * @type {number} + */ + , + set: function set(nextLevel) { + this.abrController.nextAutoLevel = Math.max(this.minAutoLevel, nextLevel); + } + /** + * @type {AudioTrack[]} + */ + + }, { + key: "audioTracks", + get: function get() { + var audioTrackController = this.audioTrackController; + return audioTrackController ? audioTrackController.audioTracks : []; + } + /** + * index of the selected audio track (index in audio track lists) + * @type {number} + */ + + }, { + key: "audioTrack", + get: function get() { + var audioTrackController = this.audioTrackController; + return audioTrackController ? audioTrackController.audioTrack : -1; + } + /** + * selects an audio track, based on its index in audio track lists + * @type {number} + */ + , + set: function set(audioTrackId) { + var audioTrackController = this.audioTrackController; + + if (audioTrackController) { + audioTrackController.audioTrack = audioTrackId; + } + } + /** + * get alternate subtitle tracks list from playlist + * @type {MediaPlaylist[]} + */ + + }, { + key: "subtitleTracks", + get: function get() { + var subtitleTrackController = this.subtitleTrackController; + return subtitleTrackController ? subtitleTrackController.subtitleTracks : []; + } + /** + * index of the selected subtitle track (index in subtitle track lists) + * @type {number} + */ + + }, { + key: "subtitleTrack", + get: function get() { + var subtitleTrackController = this.subtitleTrackController; + return subtitleTrackController ? subtitleTrackController.subtitleTrack : -1; + }, + set: + /** + * select an subtitle track, based on its index in subtitle track lists + * @type {number} + */ + function set(subtitleTrackId) { + var subtitleTrackController = this.subtitleTrackController; + + if (subtitleTrackController) { + subtitleTrackController.subtitleTrack = subtitleTrackId; + } + } + /** + * @type {boolean} + */ + + }, { + key: "media", + get: function get() { + return this._media; + } + }, { + key: "subtitleDisplay", + get: function get() { + var subtitleTrackController = this.subtitleTrackController; + return subtitleTrackController ? subtitleTrackController.subtitleDisplay : false; + } + /** + * Enable/disable subtitle display rendering + * @type {boolean} + */ + , + set: function set(value) { + var subtitleTrackController = this.subtitleTrackController; + + if (subtitleTrackController) { + subtitleTrackController.subtitleDisplay = value; + } + } + /** + * get mode for Low-Latency HLS loading + * @type {boolean} + */ + + }, { + key: "lowLatencyMode", + get: function get() { + return this.config.lowLatencyMode; + } + /** + * Enable/disable Low-Latency HLS part playlist and segment loading, and start live streams at playlist PART-HOLD-BACK rather than HOLD-BACK. + * @type {boolean} + */ + , + set: function set(mode) { + this.config.lowLatencyMode = mode; + } + /** + * position (in seconds) of live sync point (ie edge of live position minus safety delay defined by ```hls.config.liveSyncDuration```) + * @type {number} + */ + + }, { + key: "liveSyncPosition", + get: function get() { + return this.latencyController.liveSyncPosition; + } + /** + * estimated position (in seconds) of live edge (ie edge of live playlist plus time sync playlist advanced) + * returns 0 before first playlist is loaded + * @type {number} + */ + + }, { + key: "latency", + get: function get() { + return this.latencyController.latency; + } + /** + * maximum distance from the edge before the player seeks forward to ```hls.liveSyncPosition``` + * configured using ```liveMaxLatencyDurationCount``` (multiple of target duration) or ```liveMaxLatencyDuration``` + * returns 0 before first playlist is loaded + * @type {number} + */ + + }, { + key: "maxLatency", + get: function get() { + return this.latencyController.maxLatency; + } + /** + * target distance from the edge as calculated by the latency controller + * @type {number} + */ + + }, { + key: "targetLatency", + get: function get() { + return this.latencyController.targetLatency; + } + /** + * the rate at which the edge of the current live playlist is advancing or 1 if there is none + * @type {number} + */ + + }, { + key: "drift", + get: function get() { + return this.latencyController.drift; + } + /** + * set to true when startLoad is called before MANIFEST_PARSED event + * @type {boolean} + */ + + }, { + key: "forceStartLoad", + get: function get() { + return this.streamController.forceStartLoad; + } + }], [{ + key: "version", + get: function get() { + return "1.1.2-0.canary.8054"; + } + }, { + key: "Events", + get: function get() { + return _events__WEBPACK_IMPORTED_MODULE_12__["Events"]; + } + }, { + key: "ErrorTypes", + get: function get() { + return _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorTypes"]; + } + }, { + key: "ErrorDetails", + get: function get() { + return _errors__WEBPACK_IMPORTED_MODULE_13__["ErrorDetails"]; + } + }, { + key: "DefaultConfig", + get: function get() { + if (!Hls.defaultConfig) { + return _config__WEBPACK_IMPORTED_MODULE_10__["hlsDefaultConfig"]; + } + + return Hls.defaultConfig; + } + /** + * @type {HlsConfig} + */ + , + set: function set(defaultConfig) { + Hls.defaultConfig = defaultConfig; + } + }]); + + return Hls; +}(); + +Hls.defaultConfig = void 0; + + +/***/ }), + +/***/ "./src/is-supported.ts": +/*!*****************************!*\ + !*** ./src/is-supported.ts ***! + \*****************************/ +/*! exports provided: isSupported, changeTypeSupported */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSupported", function() { return isSupported; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "changeTypeSupported", function() { return changeTypeSupported; }); +/* harmony import */ var _utils_mediasource_helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/mediasource-helper */ "./src/utils/mediasource-helper.ts"); + + +function getSourceBuffer() { + return self.SourceBuffer || self.WebKitSourceBuffer; +} + +function isSupported() { + var mediaSource = Object(_utils_mediasource_helper__WEBPACK_IMPORTED_MODULE_0__["getMediaSource"])(); + + if (!mediaSource) { + return false; + } + + var sourceBuffer = getSourceBuffer(); + var isTypeSupported = mediaSource && typeof mediaSource.isTypeSupported === 'function' && mediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'); // if SourceBuffer is exposed ensure its API is valid + // safari and old version of Chrome doe not expose SourceBuffer globally so checking SourceBuffer.prototype is impossible + + var sourceBufferValidAPI = !sourceBuffer || sourceBuffer.prototype && typeof sourceBuffer.prototype.appendBuffer === 'function' && typeof sourceBuffer.prototype.remove === 'function'; + return !!isTypeSupported && !!sourceBufferValidAPI; +} +function changeTypeSupported() { + var _sourceBuffer$prototy; + + var sourceBuffer = getSourceBuffer(); + return typeof (sourceBuffer === null || sourceBuffer === void 0 ? void 0 : (_sourceBuffer$prototy = sourceBuffer.prototype) === null || _sourceBuffer$prototy === void 0 ? void 0 : _sourceBuffer$prototy.changeType) === 'function'; +} + +/***/ }), + +/***/ "./src/loader/fragment-loader.ts": +/*!***************************************!*\ + !*** ./src/loader/fragment-loader.ts ***! + \***************************************/ +/*! exports provided: default, LoadError */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FragmentLoader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoadError", function() { return LoadError; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); + + + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } + +function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + + +var MIN_CHUNK_SIZE = Math.pow(2, 17); // 128kb + +var FragmentLoader = /*#__PURE__*/function () { + function FragmentLoader(config) { + this.config = void 0; + this.loader = null; + this.partLoadTimeout = -1; + this.config = config; + } + + var _proto = FragmentLoader.prototype; + + _proto.destroy = function destroy() { + if (this.loader) { + this.loader.destroy(); + this.loader = null; + } + }; + + _proto.abort = function abort() { + if (this.loader) { + // Abort the loader for current fragment. Only one may load at any given time + this.loader.abort(); + } + }; + + _proto.load = function load(frag, _onProgress) { + var _this = this; + + var url = frag.url; + + if (!url) { + return Promise.reject(new LoadError({ + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].FRAG_LOAD_ERROR, + fatal: false, + frag: frag, + networkDetails: null + }, "Fragment does not have a " + (url ? 'part list' : 'url'))); + } + + this.abort(); + var config = this.config; + var FragmentILoader = config.fLoader; + var DefaultILoader = config.loader; + return new Promise(function (resolve, reject) { + if (_this.loader) { + _this.loader.destroy(); + } + + var loader = _this.loader = frag.loader = FragmentILoader ? new FragmentILoader(config) : new DefaultILoader(config); + var loaderContext = createLoaderContext(frag); + var loaderConfig = { + timeout: config.fragLoadingTimeOut, + maxRetry: 0, + retryDelay: 0, + maxRetryDelay: config.fragLoadingMaxRetryTimeout, + highWaterMark: MIN_CHUNK_SIZE + }; // Assign frag stats to the loader's stats reference + + frag.stats = loader.stats; + loader.load(loaderContext, loaderConfig, { + onSuccess: function onSuccess(response, stats, context, networkDetails) { + _this.resetLoader(frag, loader); + + resolve({ + frag: frag, + part: null, + payload: response.data, + networkDetails: networkDetails + }); + }, + onError: function onError(response, context, networkDetails) { + _this.resetLoader(frag, loader); + + reject(new LoadError({ + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].FRAG_LOAD_ERROR, + fatal: false, + frag: frag, + response: response, + networkDetails: networkDetails + })); + }, + onAbort: function onAbort(stats, context, networkDetails) { + _this.resetLoader(frag, loader); + + reject(new LoadError({ + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].INTERNAL_ABORTED, + fatal: false, + frag: frag, + networkDetails: networkDetails + })); + }, + onTimeout: function onTimeout(response, context, networkDetails) { + _this.resetLoader(frag, loader); + + reject(new LoadError({ + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].FRAG_LOAD_TIMEOUT, + fatal: false, + frag: frag, + networkDetails: networkDetails + })); + }, + onProgress: function onProgress(stats, context, data, networkDetails) { + if (_onProgress) { + _onProgress({ + frag: frag, + part: null, + payload: data, + networkDetails: networkDetails + }); + } + } + }); + }); + }; + + _proto.loadPart = function loadPart(frag, part, onProgress) { + var _this2 = this; + + this.abort(); + var config = this.config; + var FragmentILoader = config.fLoader; + var DefaultILoader = config.loader; + return new Promise(function (resolve, reject) { + if (_this2.loader) { + _this2.loader.destroy(); + } + + var loader = _this2.loader = frag.loader = FragmentILoader ? new FragmentILoader(config) : new DefaultILoader(config); + var loaderContext = createLoaderContext(frag, part); + var loaderConfig = { + timeout: config.fragLoadingTimeOut, + maxRetry: 0, + retryDelay: 0, + maxRetryDelay: config.fragLoadingMaxRetryTimeout, + highWaterMark: MIN_CHUNK_SIZE + }; // Assign part stats to the loader's stats reference + + part.stats = loader.stats; + loader.load(loaderContext, loaderConfig, { + onSuccess: function onSuccess(response, stats, context, networkDetails) { + _this2.resetLoader(frag, loader); + + _this2.updateStatsFromPart(frag, part); + + var partLoadedData = { + frag: frag, + part: part, + payload: response.data, + networkDetails: networkDetails + }; + onProgress(partLoadedData); + resolve(partLoadedData); + }, + onError: function onError(response, context, networkDetails) { + _this2.resetLoader(frag, loader); + + reject(new LoadError({ + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].FRAG_LOAD_ERROR, + fatal: false, + frag: frag, + part: part, + response: response, + networkDetails: networkDetails + })); + }, + onAbort: function onAbort(stats, context, networkDetails) { + frag.stats.aborted = part.stats.aborted; + + _this2.resetLoader(frag, loader); + + reject(new LoadError({ + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].INTERNAL_ABORTED, + fatal: false, + frag: frag, + part: part, + networkDetails: networkDetails + })); + }, + onTimeout: function onTimeout(response, context, networkDetails) { + _this2.resetLoader(frag, loader); + + reject(new LoadError({ + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].FRAG_LOAD_TIMEOUT, + fatal: false, + frag: frag, + part: part, + networkDetails: networkDetails + })); + } + }); + }); + }; + + _proto.updateStatsFromPart = function updateStatsFromPart(frag, part) { + var fragStats = frag.stats; + var partStats = part.stats; + var partTotal = partStats.total; + fragStats.loaded += partStats.loaded; + + if (partTotal) { + var estTotalParts = Math.round(frag.duration / part.duration); + var estLoadedParts = Math.min(Math.round(fragStats.loaded / partTotal), estTotalParts); + var estRemainingParts = estTotalParts - estLoadedParts; + var estRemainingBytes = estRemainingParts * Math.round(fragStats.loaded / estLoadedParts); + fragStats.total = fragStats.loaded + estRemainingBytes; + } else { + fragStats.total = Math.max(fragStats.loaded, fragStats.total); + } + + var fragLoading = fragStats.loading; + var partLoading = partStats.loading; + + if (fragLoading.start) { + // add to fragment loader latency + fragLoading.first += partLoading.first - partLoading.start; + } else { + fragLoading.start = partLoading.start; + fragLoading.first = partLoading.first; + } + + fragLoading.end = partLoading.end; + }; + + _proto.resetLoader = function resetLoader(frag, loader) { + frag.loader = null; + + if (this.loader === loader) { + self.clearTimeout(this.partLoadTimeout); + this.loader = null; + } + + loader.destroy(); + }; + + return FragmentLoader; +}(); + + + +function createLoaderContext(frag, part) { + if (part === void 0) { + part = null; + } + + var segment = part || frag; + var loaderContext = { + frag: frag, + part: part, + responseType: 'arraybuffer', + url: segment.url, + headers: {}, + rangeStart: 0, + rangeEnd: 0 + }; + var start = segment.byteRangeStartOffset; + var end = segment.byteRangeEndOffset; + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(start) && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(end)) { + loaderContext.rangeStart = start; + loaderContext.rangeEnd = end; + } + + return loaderContext; +} + +var LoadError = /*#__PURE__*/function (_Error) { + _inheritsLoose(LoadError, _Error); + + function LoadError(data) { + var _this3; + + for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + params[_key - 1] = arguments[_key]; + } + + _this3 = _Error.call.apply(_Error, [this].concat(params)) || this; + _this3.data = void 0; + _this3.data = data; + return _this3; + } + + return LoadError; +}( /*#__PURE__*/_wrapNativeSuper(Error)); + +/***/ }), + +/***/ "./src/loader/fragment.ts": +/*!********************************!*\ + !*** ./src/loader/fragment.ts ***! + \********************************/ +/*! exports provided: ElementaryStreamTypes, BaseSegment, Fragment, Part */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ElementaryStreamTypes", function() { return ElementaryStreamTypes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseSegment", function() { return BaseSegment; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Fragment", function() { return Fragment; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Part", function() { return Part; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var url_toolkit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! url-toolkit */ "./node_modules/url-toolkit/src/url-toolkit.js"); +/* harmony import */ var url_toolkit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(url_toolkit__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _level_key__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./level-key */ "./src/loader/level-key.ts"); +/* harmony import */ var _load_stats__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./load-stats */ "./src/loader/load-stats.ts"); + + + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + + + + + +var ElementaryStreamTypes; + +(function (ElementaryStreamTypes) { + ElementaryStreamTypes["AUDIO"] = "audio"; + ElementaryStreamTypes["VIDEO"] = "video"; + ElementaryStreamTypes["AUDIOVIDEO"] = "audiovideo"; +})(ElementaryStreamTypes || (ElementaryStreamTypes = {})); + +var BaseSegment = /*#__PURE__*/function () { + // baseurl is the URL to the playlist + // relurl is the portion of the URL that comes from inside the playlist. + // Holds the types of data this fragment supports + function BaseSegment(baseurl) { + var _this$elementaryStrea; + + this._byteRange = null; + this._url = null; + this.baseurl = void 0; + this.relurl = void 0; + this.elementaryStreams = (_this$elementaryStrea = {}, _this$elementaryStrea[ElementaryStreamTypes.AUDIO] = null, _this$elementaryStrea[ElementaryStreamTypes.VIDEO] = null, _this$elementaryStrea[ElementaryStreamTypes.AUDIOVIDEO] = null, _this$elementaryStrea); + this.baseurl = baseurl; + } // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array + + + var _proto = BaseSegment.prototype; + + _proto.setByteRange = function setByteRange(value, previous) { + var params = value.split('@', 2); + var byteRange = []; + + if (params.length === 1) { + byteRange[0] = previous ? previous.byteRangeEndOffset : 0; + } else { + byteRange[0] = parseInt(params[1]); + } + + byteRange[1] = parseInt(params[0]) + byteRange[0]; + this._byteRange = byteRange; + }; + + _createClass(BaseSegment, [{ + key: "byteRange", + get: function get() { + if (!this._byteRange) { + return []; + } + + return this._byteRange; + } + }, { + key: "byteRangeStartOffset", + get: function get() { + return this.byteRange[0]; + } + }, { + key: "byteRangeEndOffset", + get: function get() { + return this.byteRange[1]; + } + }, { + key: "url", + get: function get() { + if (!this._url && this.baseurl && this.relurl) { + this._url = Object(url_toolkit__WEBPACK_IMPORTED_MODULE_1__["buildAbsoluteURL"])(this.baseurl, this.relurl, { + alwaysNormalize: true + }); + } + + return this._url || ''; + }, + set: function set(value) { + this._url = value; + } + }]); + + return BaseSegment; +}(); +var Fragment = /*#__PURE__*/function (_BaseSegment) { + _inheritsLoose(Fragment, _BaseSegment); + + // EXTINF has to be present for a m38 to be considered valid + // sn notates the sequence number for a segment, and if set to a string can be 'initSegment' + // levelkey is the EXT-X-KEY that applies to this segment for decryption + // core difference from the private field _decryptdata is the lack of the initialized IV + // _decryptdata will set the IV for this segment based on the segment number in the fragment + // A string representing the fragment type + // A reference to the loader. Set while the fragment is loading, and removed afterwards. Used to abort fragment loading + // The level/track index to which the fragment belongs + // The continuity counter of the fragment + // The starting Presentation Time Stamp (PTS) of the fragment. Set after transmux complete. + // The ending Presentation Time Stamp (PTS) of the fragment. Set after transmux complete. + // The latest Presentation Time Stamp (PTS) appended to the buffer. + // The starting Decode Time Stamp (DTS) of the fragment. Set after transmux complete. + // The ending Decode Time Stamp (DTS) of the fragment. Set after transmux complete. + // The start time of the fragment, as listed in the manifest. Updated after transmux complete. + // Set by `updateFragPTSDTS` in level-helper + // The maximum starting Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete. + // The minimum ending Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete. + // Load/parse timing information + // A flag indicating whether the segment was downloaded in order to test bitrate, and was not buffered + // #EXTINF segment title + // The Media Initialization Section for this segment + function Fragment(type, baseurl) { + var _this; + + _this = _BaseSegment.call(this, baseurl) || this; + _this._decryptdata = null; + _this.rawProgramDateTime = null; + _this.programDateTime = null; + _this.tagList = []; + _this.duration = 0; + _this.sn = 0; + _this.levelkey = void 0; + _this.type = void 0; + _this.loader = null; + _this.level = -1; + _this.cc = 0; + _this.startPTS = void 0; + _this.endPTS = void 0; + _this.appendedPTS = void 0; + _this.startDTS = void 0; + _this.endDTS = void 0; + _this.start = 0; + _this.deltaPTS = void 0; + _this.maxStartPTS = void 0; + _this.minEndPTS = void 0; + _this.stats = new _load_stats__WEBPACK_IMPORTED_MODULE_4__["LoadStats"](); + _this.urlId = 0; + _this.data = void 0; + _this.bitrateTest = false; + _this.title = null; + _this.initSegment = null; + _this.type = type; + return _this; + } + + var _proto2 = Fragment.prototype; + + /** + * Utility method for parseLevelPlaylist to create an initialization vector for a given segment + * @param {number} segmentNumber - segment number to generate IV with + * @returns {Uint8Array} + */ + _proto2.createInitializationVector = function createInitializationVector(segmentNumber) { + var uint8View = new Uint8Array(16); + + for (var i = 12; i < 16; i++) { + uint8View[i] = segmentNumber >> 8 * (15 - i) & 0xff; + } + + return uint8View; + } + /** + * Utility method for parseLevelPlaylist to get a fragment's decryption data from the currently parsed encryption key data + * @param levelkey - a playlist's encryption info + * @param segmentNumber - the fragment's segment number + * @returns {LevelKey} - an object to be applied as a fragment's decryptdata + */ + ; + + _proto2.setDecryptDataFromLevelKey = function setDecryptDataFromLevelKey(levelkey, segmentNumber) { + var decryptdata = levelkey; + + if ((levelkey === null || levelkey === void 0 ? void 0 : levelkey.method) === 'AES-128' && levelkey.uri && !levelkey.iv) { + decryptdata = _level_key__WEBPACK_IMPORTED_MODULE_3__["LevelKey"].fromURI(levelkey.uri); + decryptdata.method = levelkey.method; + decryptdata.iv = this.createInitializationVector(segmentNumber); + decryptdata.keyFormat = 'identity'; + } + + return decryptdata; + }; + + _proto2.setElementaryStreamInfo = function setElementaryStreamInfo(type, startPTS, endPTS, startDTS, endDTS, partial) { + if (partial === void 0) { + partial = false; + } + + var elementaryStreams = this.elementaryStreams; + var info = elementaryStreams[type]; + + if (!info) { + elementaryStreams[type] = { + startPTS: startPTS, + endPTS: endPTS, + startDTS: startDTS, + endDTS: endDTS, + partial: partial + }; + return; + } + + info.startPTS = Math.min(info.startPTS, startPTS); + info.endPTS = Math.max(info.endPTS, endPTS); + info.startDTS = Math.min(info.startDTS, startDTS); + info.endDTS = Math.max(info.endDTS, endDTS); + }; + + _proto2.clearElementaryStreamInfo = function clearElementaryStreamInfo() { + var elementaryStreams = this.elementaryStreams; + elementaryStreams[ElementaryStreamTypes.AUDIO] = null; + elementaryStreams[ElementaryStreamTypes.VIDEO] = null; + elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null; + }; + + _createClass(Fragment, [{ + key: "decryptdata", + get: function get() { + if (!this.levelkey && !this._decryptdata) { + return null; + } + + if (!this._decryptdata && this.levelkey) { + var sn = this.sn; + + if (typeof sn !== 'number') { + // We are fetching decryption data for a initialization segment + // If the segment was encrypted with AES-128 + // It must have an IV defined. We cannot substitute the Segment Number in. + if (this.levelkey && this.levelkey.method === 'AES-128' && !this.levelkey.iv) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("missing IV for initialization segment with method=\"" + this.levelkey.method + "\" - compliance issue"); + } + /* + Be converted to a Number. + 'initSegment' will become NaN. + NaN, which when converted through ToInt32() -> +0. + --- + Explicitly set sn to resulting value from implicit conversions 'initSegment' values for IV generation. + */ + + + sn = 0; + } + + this._decryptdata = this.setDecryptDataFromLevelKey(this.levelkey, sn); + } + + return this._decryptdata; + } + }, { + key: "end", + get: function get() { + return this.start + this.duration; + } + }, { + key: "endProgramDateTime", + get: function get() { + if (this.programDateTime === null) { + return null; + } + + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(this.programDateTime)) { + return null; + } + + var duration = !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(this.duration) ? 0 : this.duration; + return this.programDateTime + duration * 1000; + } + }, { + key: "encrypted", + get: function get() { + var _this$decryptdata; + + // At the m3u8-parser level we need to add support for manifest signalled keyformats + // when we want the fragment to start reporting that it is encrypted. + // Currently, keyFormat will only be set for identity keys + if ((_this$decryptdata = this.decryptdata) !== null && _this$decryptdata !== void 0 && _this$decryptdata.keyFormat && this.decryptdata.uri) { + return true; + } + + return false; + } + }]); + + return Fragment; +}(BaseSegment); +var Part = /*#__PURE__*/function (_BaseSegment2) { + _inheritsLoose(Part, _BaseSegment2); + + function Part(partAttrs, frag, baseurl, index, previous) { + var _this2; + + _this2 = _BaseSegment2.call(this, baseurl) || this; + _this2.fragOffset = 0; + _this2.duration = 0; + _this2.gap = false; + _this2.independent = false; + _this2.relurl = void 0; + _this2.fragment = void 0; + _this2.index = void 0; + _this2.stats = new _load_stats__WEBPACK_IMPORTED_MODULE_4__["LoadStats"](); + _this2.duration = partAttrs.decimalFloatingPoint('DURATION'); + _this2.gap = partAttrs.bool('GAP'); + _this2.independent = partAttrs.bool('INDEPENDENT'); + _this2.relurl = partAttrs.enumeratedString('URI'); + _this2.fragment = frag; + _this2.index = index; + var byteRange = partAttrs.enumeratedString('BYTERANGE'); + + if (byteRange) { + _this2.setByteRange(byteRange, previous); + } + + if (previous) { + _this2.fragOffset = previous.fragOffset + previous.duration; + } + + return _this2; + } + + _createClass(Part, [{ + key: "start", + get: function get() { + return this.fragment.start + this.fragOffset; + } + }, { + key: "end", + get: function get() { + return this.start + this.duration; + } + }, { + key: "loaded", + get: function get() { + var elementaryStreams = this.elementaryStreams; + return !!(elementaryStreams.audio || elementaryStreams.video || elementaryStreams.audiovideo); + } + }]); + + return Part; +}(BaseSegment); + +/***/ }), + +/***/ "./src/loader/key-loader.ts": +/*!**********************************!*\ + !*** ./src/loader/key-loader.ts ***! + \**********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return KeyLoader; }); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* + * Decrypt key Loader + */ + + + + +var KeyLoader = /*#__PURE__*/function () { + function KeyLoader(hls) { + this.hls = void 0; + this.loaders = {}; + this.decryptkey = null; + this.decrypturl = null; + this.hls = hls; + + this._registerListeners(); + } + + var _proto = KeyLoader.prototype; + + _proto._registerListeners = function _registerListeners() { + this.hls.on(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].KEY_LOADING, this.onKeyLoading, this); + }; + + _proto._unregisterListeners = function _unregisterListeners() { + this.hls.off(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].KEY_LOADING, this.onKeyLoading); + }; + + _proto.destroy = function destroy() { + this._unregisterListeners(); + + for (var loaderName in this.loaders) { + var loader = this.loaders[loaderName]; + + if (loader) { + loader.destroy(); + } + } + + this.loaders = {}; + }; + + _proto.onKeyLoading = function onKeyLoading(event, data) { + var frag = data.frag; + var type = frag.type; + var loader = this.loaders[type]; + + if (!frag.decryptdata) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('Missing decryption data on fragment in onKeyLoading'); + return; + } // Load the key if the uri is different from previous one, or if the decrypt key has not yet been retrieved + + + var uri = frag.decryptdata.uri; + + if (uri !== this.decrypturl || this.decryptkey === null) { + var config = this.hls.config; + + if (loader) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("abort previous key loader for type:" + type); + loader.abort(); + } + + if (!uri) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('key uri is falsy'); + return; + } + + var Loader = config.loader; + var fragLoader = frag.loader = this.loaders[type] = new Loader(config); + this.decrypturl = uri; + this.decryptkey = null; + var loaderContext = { + url: uri, + frag: frag, + responseType: 'arraybuffer' + }; // maxRetry is 0 so that instead of retrying the same key on the same variant multiple times, + // key-loader will trigger an error and rely on stream-controller to handle retry logic. + // this will also align retry logic with fragment-loader + + var loaderConfig = { + timeout: config.fragLoadingTimeOut, + maxRetry: 0, + retryDelay: config.fragLoadingRetryDelay, + maxRetryDelay: config.fragLoadingMaxRetryTimeout, + highWaterMark: 0 + }; + var loaderCallbacks = { + onSuccess: this.loadsuccess.bind(this), + onError: this.loaderror.bind(this), + onTimeout: this.loadtimeout.bind(this) + }; + fragLoader.load(loaderContext, loaderConfig, loaderCallbacks); + } else if (this.decryptkey) { + // Return the key if it's already been loaded + frag.decryptdata.key = this.decryptkey; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].KEY_LOADED, { + frag: frag + }); + } + }; + + _proto.loadsuccess = function loadsuccess(response, stats, context) { + var frag = context.frag; + + if (!frag.decryptdata) { + _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('after key load, decryptdata unset'); + return; + } + + this.decryptkey = frag.decryptdata.key = new Uint8Array(response.data); // detach fragment loader on load success + + frag.loader = null; + delete this.loaders[frag.type]; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].KEY_LOADED, { + frag: frag + }); + }; + + _proto.loaderror = function loaderror(response, context) { + var frag = context.frag; + var loader = frag.loader; + + if (loader) { + loader.abort(); + } + + delete this.loaders[frag.type]; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_LOAD_ERROR, + fatal: false, + frag: frag, + response: response + }); + }; + + _proto.loadtimeout = function loadtimeout(stats, context) { + var frag = context.frag; + var loader = frag.loader; + + if (loader) { + loader.abort(); + } + + delete this.loaders[frag.type]; + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_0__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_1__["ErrorDetails"].KEY_LOAD_TIMEOUT, + fatal: false, + frag: frag + }); + }; + + return KeyLoader; +}(); + + + +/***/ }), + +/***/ "./src/loader/level-details.ts": +/*!*************************************!*\ + !*** ./src/loader/level-details.ts ***! + \*************************************/ +/*! exports provided: LevelDetails */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LevelDetails", function() { return LevelDetails; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); + + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var DEFAULT_TARGET_DURATION = 10; +var LevelDetails = /*#__PURE__*/function () { + // Manifest reload synchronization + function LevelDetails(baseUrl) { + this.PTSKnown = false; + this.alignedSliding = false; + this.averagetargetduration = void 0; + this.endCC = 0; + this.endSN = 0; + this.fragments = void 0; + this.fragmentHint = void 0; + this.partList = null; + this.live = true; + this.ageHeader = 0; + this.advancedDateTime = void 0; + this.updated = true; + this.advanced = true; + this.availabilityDelay = void 0; + this.misses = 0; + this.needSidxRanges = false; + this.startCC = 0; + this.startSN = 0; + this.startTimeOffset = null; + this.targetduration = 0; + this.totalduration = 0; + this.type = null; + this.url = void 0; + this.m3u8 = ''; + this.version = null; + this.canBlockReload = false; + this.canSkipUntil = 0; + this.canSkipDateRanges = false; + this.skippedSegments = 0; + this.recentlyRemovedDateranges = void 0; + this.partHoldBack = 0; + this.holdBack = 0; + this.partTarget = 0; + this.preloadHint = void 0; + this.renditionReports = void 0; + this.tuneInGoal = 0; + this.deltaUpdateFailed = void 0; + this.driftStartTime = 0; + this.driftEndTime = 0; + this.driftStart = 0; + this.driftEnd = 0; + this.fragments = []; + this.url = baseUrl; + } + + var _proto = LevelDetails.prototype; + + _proto.reloaded = function reloaded(previous) { + if (!previous) { + this.advanced = true; + this.updated = true; + return; + } + + var partSnDiff = this.lastPartSn - previous.lastPartSn; + var partIndexDiff = this.lastPartIndex - previous.lastPartIndex; + this.updated = this.endSN !== previous.endSN || !!partIndexDiff || !!partSnDiff; + this.advanced = this.endSN > previous.endSN || partSnDiff > 0 || partSnDiff === 0 && partIndexDiff > 0; + + if (this.updated || this.advanced) { + this.misses = Math.floor(previous.misses * 0.6); + } else { + this.misses = previous.misses + 1; + } + + this.availabilityDelay = previous.availabilityDelay; + }; + + _createClass(LevelDetails, [{ + key: "hasProgramDateTime", + get: function get() { + if (this.fragments.length) { + return Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(this.fragments[this.fragments.length - 1].programDateTime); + } + + return false; + } + }, { + key: "levelTargetDuration", + get: function get() { + return this.averagetargetduration || this.targetduration || DEFAULT_TARGET_DURATION; + } + }, { + key: "drift", + get: function get() { + var runTime = this.driftEndTime - this.driftStartTime; + + if (runTime > 0) { + var runDuration = this.driftEnd - this.driftStart; + return runDuration * 1000 / runTime; + } + + return 1; + } + }, { + key: "edge", + get: function get() { + return this.partEnd || this.fragmentEnd; + } + }, { + key: "partEnd", + get: function get() { + var _this$partList; + + if ((_this$partList = this.partList) !== null && _this$partList !== void 0 && _this$partList.length) { + return this.partList[this.partList.length - 1].end; + } + + return this.fragmentEnd; + } + }, { + key: "fragmentEnd", + get: function get() { + var _this$fragments; + + if ((_this$fragments = this.fragments) !== null && _this$fragments !== void 0 && _this$fragments.length) { + return this.fragments[this.fragments.length - 1].end; + } + + return 0; + } + }, { + key: "age", + get: function get() { + if (this.advancedDateTime) { + return Math.max(Date.now() - this.advancedDateTime, 0) / 1000; + } + + return 0; + } + }, { + key: "lastPartIndex", + get: function get() { + var _this$partList2; + + if ((_this$partList2 = this.partList) !== null && _this$partList2 !== void 0 && _this$partList2.length) { + return this.partList[this.partList.length - 1].index; + } + + return -1; + } + }, { + key: "lastPartSn", + get: function get() { + var _this$partList3; + + if ((_this$partList3 = this.partList) !== null && _this$partList3 !== void 0 && _this$partList3.length) { + return this.partList[this.partList.length - 1].fragment.sn; + } + + return this.endSN; + } + }]); + + return LevelDetails; +}(); + +/***/ }), + +/***/ "./src/loader/level-key.ts": +/*!*********************************!*\ + !*** ./src/loader/level-key.ts ***! + \*********************************/ +/*! exports provided: LevelKey */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LevelKey", function() { return LevelKey; }); +/* harmony import */ var url_toolkit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! url-toolkit */ "./node_modules/url-toolkit/src/url-toolkit.js"); +/* harmony import */ var url_toolkit__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(url_toolkit__WEBPACK_IMPORTED_MODULE_0__); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + + +var LevelKey = /*#__PURE__*/function () { + LevelKey.fromURL = function fromURL(baseUrl, relativeUrl) { + return new LevelKey(baseUrl, relativeUrl); + }; + + LevelKey.fromURI = function fromURI(uri) { + return new LevelKey(uri); + }; + + function LevelKey(absoluteOrBaseURI, relativeURL) { + this._uri = null; + this.method = null; + this.keyFormat = null; + this.keyFormatVersions = null; + this.keyID = null; + this.key = null; + this.iv = null; + + if (relativeURL) { + this._uri = Object(url_toolkit__WEBPACK_IMPORTED_MODULE_0__["buildAbsoluteURL"])(absoluteOrBaseURI, relativeURL, { + alwaysNormalize: true + }); + } else { + this._uri = absoluteOrBaseURI; + } + } + + _createClass(LevelKey, [{ + key: "uri", + get: function get() { + return this._uri; + } + }]); + + return LevelKey; +}(); + +/***/ }), + +/***/ "./src/loader/load-stats.ts": +/*!**********************************!*\ + !*** ./src/loader/load-stats.ts ***! + \**********************************/ +/*! exports provided: LoadStats */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoadStats", function() { return LoadStats; }); +var LoadStats = function LoadStats() { + this.aborted = false; + this.loaded = 0; + this.retry = 0; + this.total = 0; + this.chunkCount = 0; + this.bwEstimate = 0; + this.loading = { + start: 0, + first: 0, + end: 0 + }; + this.parsing = { + start: 0, + end: 0 + }; + this.buffering = { + start: 0, + first: 0, + end: 0 + }; +}; + +/***/ }), + +/***/ "./src/loader/m3u8-parser.ts": +/*!***********************************!*\ + !*** ./src/loader/m3u8-parser.ts ***! + \***********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return M3U8Parser; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var url_toolkit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! url-toolkit */ "./node_modules/url-toolkit/src/url-toolkit.js"); +/* harmony import */ var url_toolkit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(url_toolkit__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _fragment__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fragment */ "./src/loader/fragment.ts"); +/* harmony import */ var _level_details__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./level-details */ "./src/loader/level-details.ts"); +/* harmony import */ var _level_key__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./level-key */ "./src/loader/level-key.ts"); +/* harmony import */ var _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/attr-list */ "./src/utils/attr-list.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _utils_codecs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/codecs */ "./src/utils/codecs.ts"); + + + + + + + + + + + +// https://regex101.com is your friend +var MASTER_PLAYLIST_REGEX = /#EXT-X-STREAM-INF:([^\r\n]*)(?:[\r\n](?:#[^\r\n]*)?)*([^\r\n]+)|#EXT-X-SESSION-DATA:([^\r\n]*)[\r\n]+/g; +var MASTER_PLAYLIST_MEDIA_REGEX = /#EXT-X-MEDIA:(.*)/g; +var LEVEL_PLAYLIST_REGEX_FAST = new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source, // duration (#EXTINF:,), group 1 => duration, group 2 => title +/(?!#) *(\S[\S ]*)/.source, // segment URI, group 3 => the URI (note newline is not eaten) +/#EXT-X-BYTERANGE:*(.+)/.source, // next segment's byterange, group 4 => range spec (x@y) +/#EXT-X-PROGRAM-DATE-TIME:(.+)/.source, // next segment's program date/time group 5 => the datetime spec +/#.*/.source // All other non-segment oriented tags will match with all groups empty +].join('|'), 'g'); +var LEVEL_PLAYLIST_REGEX_SLOW = new RegExp([/#(EXTM3U)/.source, /#EXT-X-(PLAYLIST-TYPE):(.+)/.source, /#EXT-X-(MEDIA-SEQUENCE): *(\d+)/.source, /#EXT-X-(SKIP):(.+)/.source, /#EXT-X-(TARGETDURATION): *(\d+)/.source, /#EXT-X-(KEY):(.+)/.source, /#EXT-X-(START):(.+)/.source, /#EXT-X-(ENDLIST)/.source, /#EXT-X-(DISCONTINUITY-SEQ)UENCE: *(\d+)/.source, /#EXT-X-(DIS)CONTINUITY/.source, /#EXT-X-(VERSION):(\d+)/.source, /#EXT-X-(MAP):(.+)/.source, /#EXT-X-(SERVER-CONTROL):(.+)/.source, /#EXT-X-(PART-INF):(.+)/.source, /#EXT-X-(GAP)/.source, /#EXT-X-(BITRATE):\s*(\d+)/.source, /#EXT-X-(PART):(.+)/.source, /#EXT-X-(PRELOAD-HINT):(.+)/.source, /#EXT-X-(RENDITION-REPORT):(.+)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\r?\n?/.source].join('|')); +var MP4_REGEX_SUFFIX = /\.(mp4|m4s|m4v|m4a)$/i; + +function isMP4Url(url) { + var _URLToolkit$parseURL$, _URLToolkit$parseURL; + + return MP4_REGEX_SUFFIX.test((_URLToolkit$parseURL$ = (_URLToolkit$parseURL = url_toolkit__WEBPACK_IMPORTED_MODULE_1__["parseURL"](url)) === null || _URLToolkit$parseURL === void 0 ? void 0 : _URLToolkit$parseURL.path) != null ? _URLToolkit$parseURL$ : ''); +} + +var M3U8Parser = /*#__PURE__*/function () { + function M3U8Parser() {} + + M3U8Parser.findGroup = function findGroup(groups, mediaGroupId) { + for (var i = 0; i < groups.length; i++) { + var group = groups[i]; + + if (group.id === mediaGroupId) { + return group; + } + } + }; + + M3U8Parser.convertAVC1ToAVCOTI = function convertAVC1ToAVCOTI(codec) { + // Convert avc1 codec string from RFC-4281 to RFC-6381 for MediaSource.isTypeSupported + var avcdata = codec.split('.'); + + if (avcdata.length > 2) { + var result = avcdata.shift() + '.'; + result += parseInt(avcdata.shift()).toString(16); + result += ('000' + parseInt(avcdata.shift()).toString(16)).substr(-4); + return result; + } + + return codec; + }; + + M3U8Parser.resolve = function resolve(url, baseUrl) { + return url_toolkit__WEBPACK_IMPORTED_MODULE_1__["buildAbsoluteURL"](baseUrl, url, { + alwaysNormalize: true + }); + }; + + M3U8Parser.parseMasterPlaylist = function parseMasterPlaylist(string, baseurl) { + var levels = []; + var sessionData = {}; + var hasSessionData = false; + MASTER_PLAYLIST_REGEX.lastIndex = 0; + var result; + + while ((result = MASTER_PLAYLIST_REGEX.exec(string)) != null) { + if (result[1]) { + // '#EXT-X-STREAM-INF' is found, parse level tag in group 1 + var attrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](result[1]); + var level = { + attrs: attrs, + bitrate: attrs.decimalInteger('AVERAGE-BANDWIDTH') || attrs.decimalInteger('BANDWIDTH'), + name: attrs.NAME, + url: M3U8Parser.resolve(result[2], baseurl) + }; + var resolution = attrs.decimalResolution('RESOLUTION'); + + if (resolution) { + level.width = resolution.width; + level.height = resolution.height; + } + + setCodecs((attrs.CODECS || '').split(/[ ,]+/).filter(function (c) { + return c; + }), level); + + if (level.videoCodec && level.videoCodec.indexOf('avc1') !== -1) { + level.videoCodec = M3U8Parser.convertAVC1ToAVCOTI(level.videoCodec); + } + + levels.push(level); + } else if (result[3]) { + // '#EXT-X-SESSION-DATA' is found, parse session data in group 3 + var sessionAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](result[3]); + + if (sessionAttrs['DATA-ID']) { + hasSessionData = true; + sessionData[sessionAttrs['DATA-ID']] = sessionAttrs; + } + } + } + + return { + levels: levels, + sessionData: hasSessionData ? sessionData : null + }; + }; + + M3U8Parser.parseMasterPlaylistMedia = function parseMasterPlaylistMedia(string, baseurl, type, groups) { + if (groups === void 0) { + groups = []; + } + + var result; + var medias = []; + var id = 0; + MASTER_PLAYLIST_MEDIA_REGEX.lastIndex = 0; + + while ((result = MASTER_PLAYLIST_MEDIA_REGEX.exec(string)) !== null) { + var attrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](result[1]); + + if (attrs.TYPE === type) { + var media = { + attrs: attrs, + bitrate: 0, + id: id++, + groupId: attrs['GROUP-ID'], + instreamId: attrs['INSTREAM-ID'], + name: attrs.NAME || attrs.LANGUAGE || '', + type: type, + default: attrs.bool('DEFAULT'), + autoselect: attrs.bool('AUTOSELECT'), + forced: attrs.bool('FORCED'), + lang: attrs.LANGUAGE, + url: attrs.URI ? M3U8Parser.resolve(attrs.URI, baseurl) : '' + }; + + if (groups.length) { + // If there are audio or text groups signalled in the manifest, let's look for a matching codec string for this track + // If we don't find the track signalled, lets use the first audio groups codec we have + // Acting as a best guess + var groupCodec = M3U8Parser.findGroup(groups, media.groupId) || groups[0]; + assignCodec(media, groupCodec, 'audioCodec'); + assignCodec(media, groupCodec, 'textCodec'); + } + + medias.push(media); + } + } + + return medias; + }; + + M3U8Parser.parseLevelPlaylist = function parseLevelPlaylist(string, baseurl, id, type, levelUrlId) { + var level = new _level_details__WEBPACK_IMPORTED_MODULE_3__["LevelDetails"](baseurl); + var fragments = level.fragments; // The most recent init segment seen (applies to all subsequent segments) + + var currentInitSegment = null; + var currentSN = 0; + var currentPart = 0; + var totalduration = 0; + var discontinuityCounter = 0; + var prevFrag = null; + var frag = new _fragment__WEBPACK_IMPORTED_MODULE_2__["Fragment"](type, baseurl); + var result; + var i; + var levelkey; + var firstPdtIndex = -1; + var createNextFrag = false; + LEVEL_PLAYLIST_REGEX_FAST.lastIndex = 0; + level.m3u8 = string; + + while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) { + if (createNextFrag) { + createNextFrag = false; + frag = new _fragment__WEBPACK_IMPORTED_MODULE_2__["Fragment"](type, baseurl); // setup the next fragment for part loading + + frag.start = totalduration; + frag.sn = currentSN; + frag.cc = discontinuityCounter; + frag.level = id; + + if (currentInitSegment) { + frag.initSegment = currentInitSegment; + frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime; + } + } + + var duration = result[1]; + + if (duration) { + // INF + frag.duration = parseFloat(duration); // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 + + var title = (' ' + result[2]).slice(1); + frag.title = title || null; + frag.tagList.push(title ? ['INF', duration, title] : ['INF', duration]); + } else if (result[3]) { + // url + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(frag.duration)) { + frag.start = totalduration; + + if (levelkey) { + frag.levelkey = levelkey; + } + + frag.sn = currentSN; + frag.level = id; + frag.cc = discontinuityCounter; + frag.urlId = levelUrlId; + fragments.push(frag); // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 + + frag.relurl = (' ' + result[3]).slice(1); + assignProgramDateTime(frag, prevFrag); + prevFrag = frag; + totalduration += frag.duration; + currentSN++; + currentPart = 0; + createNextFrag = true; + } + } else if (result[4]) { + // X-BYTERANGE + var data = (' ' + result[4]).slice(1); + + if (prevFrag) { + frag.setByteRange(data, prevFrag); + } else { + frag.setByteRange(data); + } + } else if (result[5]) { + // PROGRAM-DATE-TIME + // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 + frag.rawProgramDateTime = (' ' + result[5]).slice(1); + frag.tagList.push(['PROGRAM-DATE-TIME', frag.rawProgramDateTime]); + + if (firstPdtIndex === -1) { + firstPdtIndex = fragments.length; + } + } else { + result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW); + + if (!result) { + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].warn('No matches on slow regex match for level playlist!'); + continue; + } + + for (i = 1; i < result.length; i++) { + if (typeof result[i] !== 'undefined') { + break; + } + } // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 + + + var tag = (' ' + result[i]).slice(1); + var value1 = (' ' + result[i + 1]).slice(1); + var value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) : ''; + + switch (tag) { + case 'PLAYLIST-TYPE': + level.type = value1.toUpperCase(); + break; + + case 'MEDIA-SEQUENCE': + currentSN = level.startSN = parseInt(value1); + break; + + case 'SKIP': + { + var skipAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1); + var skippedSegments = skipAttrs.decimalInteger('SKIPPED-SEGMENTS'); + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(skippedSegments)) { + level.skippedSegments = skippedSegments; // This will result in fragments[] containing undefined values, which we will fill in with `mergeDetails` + + for (var _i = skippedSegments; _i--;) { + fragments.unshift(null); + } + + currentSN += skippedSegments; + } + + var recentlyRemovedDateranges = skipAttrs.enumeratedString('RECENTLY-REMOVED-DATERANGES'); + + if (recentlyRemovedDateranges) { + level.recentlyRemovedDateranges = recentlyRemovedDateranges.split('\t'); + } + + break; + } + + case 'TARGETDURATION': + level.targetduration = parseFloat(value1); + break; + + case 'VERSION': + level.version = parseInt(value1); + break; + + case 'EXTM3U': + break; + + case 'ENDLIST': + level.live = false; + break; + + case '#': + if (value1 || value2) { + frag.tagList.push(value2 ? [value1, value2] : [value1]); + } + + break; + + case 'DIS': + discontinuityCounter++; + + /* falls through */ + + case 'GAP': + frag.tagList.push([tag]); + break; + + case 'BITRATE': + frag.tagList.push([tag, value1]); + break; + + case 'DISCONTINUITY-SEQ': + discontinuityCounter = parseInt(value1); + break; + + case 'KEY': + { + var _keyAttrs$enumeratedS; + + // https://tools.ietf.org/html/rfc8216#section-4.3.2.4 + var keyAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1); + var decryptmethod = keyAttrs.enumeratedString('METHOD'); + var decrypturi = keyAttrs.URI; + var decryptiv = keyAttrs.hexadecimalInteger('IV'); + var decryptkeyformatversions = keyAttrs.enumeratedString('KEYFORMATVERSIONS'); + var decryptkeyid = keyAttrs.enumeratedString('KEYID'); // From RFC: This attribute is OPTIONAL; its absence indicates an implicit value of "identity". + + var decryptkeyformat = (_keyAttrs$enumeratedS = keyAttrs.enumeratedString('KEYFORMAT')) != null ? _keyAttrs$enumeratedS : 'identity'; + var unsupportedKnownKeyformatsInManifest = ['com.apple.streamingkeydelivery', 'com.microsoft.playready', 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', // widevine (v2) + 'com.widevine' // earlier widevine (v1) + ]; + + if (unsupportedKnownKeyformatsInManifest.indexOf(decryptkeyformat) > -1) { + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].warn("Keyformat " + decryptkeyformat + " is not supported from the manifest"); + continue; + } else if (decryptkeyformat !== 'identity') { + // We are supposed to skip keys we don't understand. + // As we currently only officially support identity keys + // from the manifest we shouldn't save any other key. + continue; + } // TODO: multiple keys can be defined on a fragment, and we need to support this + // for clients that support both playready and widevine + + + if (decryptmethod) { + // TODO: need to determine if the level key is actually a relative URL + // if it isn't, then we should instead construct the LevelKey using fromURI. + levelkey = _level_key__WEBPACK_IMPORTED_MODULE_4__["LevelKey"].fromURL(baseurl, decrypturi); + + if (decrypturi && ['AES-128', 'SAMPLE-AES', 'SAMPLE-AES-CENC'].indexOf(decryptmethod) >= 0) { + levelkey.method = decryptmethod; + levelkey.keyFormat = decryptkeyformat; + + if (decryptkeyid) { + levelkey.keyID = decryptkeyid; + } + + if (decryptkeyformatversions) { + levelkey.keyFormatVersions = decryptkeyformatversions; + } // Initialization Vector (IV) + + + levelkey.iv = decryptiv; + } + } + + break; + } + + case 'START': + { + var startAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1); + var startTimeOffset = startAttrs.decimalFloatingPoint('TIME-OFFSET'); // TIME-OFFSET can be 0 + + if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(startTimeOffset)) { + level.startTimeOffset = startTimeOffset; + } + + break; + } + + case 'MAP': + { + var mapAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1); + frag.relurl = mapAttrs.URI; + + if (mapAttrs.BYTERANGE) { + frag.setByteRange(mapAttrs.BYTERANGE); + } + + frag.level = id; + frag.sn = 'initSegment'; + + if (levelkey) { + frag.levelkey = levelkey; + } + + frag.initSegment = null; + currentInitSegment = frag; + createNextFrag = true; + break; + } + + case 'SERVER-CONTROL': + { + var serverControlAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1); + level.canBlockReload = serverControlAttrs.bool('CAN-BLOCK-RELOAD'); + level.canSkipUntil = serverControlAttrs.optionalFloat('CAN-SKIP-UNTIL', 0); + level.canSkipDateRanges = level.canSkipUntil > 0 && serverControlAttrs.bool('CAN-SKIP-DATERANGES'); + level.partHoldBack = serverControlAttrs.optionalFloat('PART-HOLD-BACK', 0); + level.holdBack = serverControlAttrs.optionalFloat('HOLD-BACK', 0); + break; + } + + case 'PART-INF': + { + var partInfAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1); + level.partTarget = partInfAttrs.decimalFloatingPoint('PART-TARGET'); + break; + } + + case 'PART': + { + var partList = level.partList; + + if (!partList) { + partList = level.partList = []; + } + + var previousFragmentPart = currentPart > 0 ? partList[partList.length - 1] : undefined; + var index = currentPart++; + var part = new _fragment__WEBPACK_IMPORTED_MODULE_2__["Part"](new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1), frag, baseurl, index, previousFragmentPart); + partList.push(part); + frag.duration += part.duration; + break; + } + + case 'PRELOAD-HINT': + { + var preloadHintAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1); + level.preloadHint = preloadHintAttrs; + break; + } + + case 'RENDITION-REPORT': + { + var renditionReportAttrs = new _utils_attr_list__WEBPACK_IMPORTED_MODULE_5__["AttrList"](value1); + level.renditionReports = level.renditionReports || []; + level.renditionReports.push(renditionReportAttrs); + break; + } + + default: + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].warn("line parsed but not handled: " + result); + break; + } + } + } + + if (prevFrag && !prevFrag.relurl) { + fragments.pop(); + totalduration -= prevFrag.duration; + + if (level.partList) { + level.fragmentHint = prevFrag; + } + } else if (level.partList) { + assignProgramDateTime(frag, prevFrag); + frag.cc = discontinuityCounter; + level.fragmentHint = frag; + } + + var fragmentLength = fragments.length; + var firstFragment = fragments[0]; + var lastFragment = fragments[fragmentLength - 1]; + totalduration += level.skippedSegments * level.targetduration; + + if (totalduration > 0 && fragmentLength && lastFragment) { + level.averagetargetduration = totalduration / fragmentLength; + var lastSn = lastFragment.sn; + level.endSN = lastSn !== 'initSegment' ? lastSn : 0; + + if (firstFragment) { + level.startCC = firstFragment.cc; + + if (!firstFragment.initSegment) { + // this is a bit lurky but HLS really has no other way to tell us + // if the fragments are TS or MP4, except if we download them :/ + // but this is to be able to handle SIDX. + if (level.fragments.every(function (frag) { + return frag.relurl && isMP4Url(frag.relurl); + })) { + _utils_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].warn('MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX'); + frag = new _fragment__WEBPACK_IMPORTED_MODULE_2__["Fragment"](type, baseurl); + frag.relurl = lastFragment.relurl; + frag.level = id; + frag.sn = 'initSegment'; + firstFragment.initSegment = frag; + level.needSidxRanges = true; + } + } + } + } else { + level.endSN = 0; + level.startCC = 0; + } + + if (level.fragmentHint) { + totalduration += level.fragmentHint.duration; + } + + level.totalduration = totalduration; + level.endCC = discontinuityCounter; + /** + * Backfill any missing PDT values + * "If the first EXT-X-PROGRAM-DATE-TIME tag in a Playlist appears after + * one or more Media Segment URIs, the client SHOULD extrapolate + * backward from that tag (using EXTINF durations and/or media + * timestamps) to associate dates with those segments." + * We have already extrapolated forward, but all fragments up to the first instance of PDT do not have their PDTs + * computed. + */ + + if (firstPdtIndex > 0) { + backfillProgramDateTimes(fragments, firstPdtIndex); + } + + return level; + }; + + return M3U8Parser; +}(); + + + +function setCodecs(codecs, level) { + ['video', 'audio', 'text'].forEach(function (type) { + var filtered = codecs.filter(function (codec) { + return Object(_utils_codecs__WEBPACK_IMPORTED_MODULE_7__["isCodecType"])(codec, type); + }); + + if (filtered.length) { + var preferred = filtered.filter(function (codec) { + return codec.lastIndexOf('avc1', 0) === 0 || codec.lastIndexOf('mp4a', 0) === 0; + }); + level[type + "Codec"] = preferred.length > 0 ? preferred[0] : filtered[0]; // remove from list + + codecs = codecs.filter(function (codec) { + return filtered.indexOf(codec) === -1; + }); + } + }); + level.unknownCodecs = codecs; +} + +function assignCodec(media, groupItem, codecProperty) { + var codecValue = groupItem[codecProperty]; + + if (codecValue) { + media[codecProperty] = codecValue; + } +} + +function backfillProgramDateTimes(fragments, firstPdtIndex) { + var fragPrev = fragments[firstPdtIndex]; + + for (var i = firstPdtIndex; i--;) { + var frag = fragments[i]; // Exit on delta-playlist skipped segments + + if (!frag) { + return; + } + + frag.programDateTime = fragPrev.programDateTime - frag.duration * 1000; + fragPrev = frag; + } +} + +function assignProgramDateTime(frag, prevFrag) { + if (frag.rawProgramDateTime) { + frag.programDateTime = Date.parse(frag.rawProgramDateTime); + } else if (prevFrag !== null && prevFrag !== void 0 && prevFrag.programDateTime) { + frag.programDateTime = prevFrag.endProgramDateTime; + } + + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(frag.programDateTime)) { + frag.programDateTime = null; + frag.rawProgramDateTime = null; + } +} + +/***/ }), + +/***/ "./src/loader/playlist-loader.ts": +/*!***************************************!*\ + !*** ./src/loader/playlist-loader.ts ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _m3u8_parser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./m3u8-parser */ "./src/loader/m3u8-parser.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +/* harmony import */ var _utils_attr_list__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/attr-list */ "./src/utils/attr-list.ts"); + + + +/** + * PlaylistLoader - delegate for media manifest/playlist loading tasks. Takes care of parsing media to internal data-models. + * + * Once loaded, dispatches events with parsed data-models of manifest/levels/audio/subtitle tracks. + * + * Uses loader(s) set in config to do actual internal loading of resource tasks. + * + * @module + * + */ + + + + + + + + +function mapContextToLevelType(context) { + var type = context.type; + + switch (type) { + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].AUDIO_TRACK: + return _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].AUDIO; + + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].SUBTITLE_TRACK: + return _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].SUBTITLE; + + default: + return _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].MAIN; + } +} + +function getResponseUrl(response, context) { + var url = response.url; // responseURL not supported on some browsers (it is used to detect URL redirection) + // data-uri mode also not supported (but no need to detect redirection) + + if (url === undefined || url.indexOf('data:') === 0) { + // fallback to initial URL + url = context.url; + } + + return url; +} + +var PlaylistLoader = /*#__PURE__*/function () { + function PlaylistLoader(hls) { + this.hls = void 0; + this.loaders = Object.create(null); + this.hls = hls; + this.registerListeners(); + } + + var _proto = PlaylistLoader.prototype; + + _proto.registerListeners = function registerListeners() { + var hls = this.hls; + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_LOADING, this.onLevelLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this); + hls.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this); + }; + + _proto.unregisterListeners = function unregisterListeners() { + var hls = this.hls; + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADING, this.onManifestLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_LOADING, this.onLevelLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this); + hls.off(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this); + } + /** + * Returns defaults or configured loader-type overloads (pLoader and loader config params) + */ + ; + + _proto.createInternalLoader = function createInternalLoader(context) { + var config = this.hls.config; + var PLoader = config.pLoader; + var Loader = config.loader; + var InternalLoader = PLoader || Loader; + var loader = new InternalLoader(config); + context.loader = loader; + this.loaders[context.type] = loader; + return loader; + }; + + _proto.getInternalLoader = function getInternalLoader(context) { + return this.loaders[context.type]; + }; + + _proto.resetInternalLoader = function resetInternalLoader(contextType) { + if (this.loaders[contextType]) { + delete this.loaders[contextType]; + } + } + /** + * Call `destroy` on all internal loader instances mapped (one per context type) + */ + ; + + _proto.destroyInternalLoaders = function destroyInternalLoaders() { + for (var contextType in this.loaders) { + var loader = this.loaders[contextType]; + + if (loader) { + loader.destroy(); + } + + this.resetInternalLoader(contextType); + } + }; + + _proto.destroy = function destroy() { + this.unregisterListeners(); + this.destroyInternalLoaders(); + }; + + _proto.onManifestLoading = function onManifestLoading(event, data) { + var url = data.url; + this.load({ + id: null, + groupId: null, + level: 0, + responseType: 'text', + type: _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].MANIFEST, + url: url, + deliveryDirectives: null + }); + }; + + _proto.onLevelLoading = function onLevelLoading(event, data) { + var id = data.id, + level = data.level, + url = data.url, + deliveryDirectives = data.deliveryDirectives; + this.load({ + id: id, + groupId: null, + level: level, + responseType: 'text', + type: _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].LEVEL, + url: url, + deliveryDirectives: deliveryDirectives + }); + }; + + _proto.onAudioTrackLoading = function onAudioTrackLoading(event, data) { + var id = data.id, + groupId = data.groupId, + url = data.url, + deliveryDirectives = data.deliveryDirectives; + this.load({ + id: id, + groupId: groupId, + level: null, + responseType: 'text', + type: _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].AUDIO_TRACK, + url: url, + deliveryDirectives: deliveryDirectives + }); + }; + + _proto.onSubtitleTrackLoading = function onSubtitleTrackLoading(event, data) { + var id = data.id, + groupId = data.groupId, + url = data.url, + deliveryDirectives = data.deliveryDirectives; + this.load({ + id: id, + groupId: groupId, + level: null, + responseType: 'text', + type: _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].SUBTITLE_TRACK, + url: url, + deliveryDirectives: deliveryDirectives + }); + }; + + _proto.load = function load(context) { + var _context$deliveryDire; + + var config = this.hls.config; // logger.debug(`[playlist-loader]: Loading playlist of type ${context.type}, level: ${context.level}, id: ${context.id}`); + // Check if a loader for this context already exists + + var loader = this.getInternalLoader(context); + + if (loader) { + var loaderContext = loader.context; + + if (loaderContext && loaderContext.url === context.url) { + // same URL can't overlap + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].trace('[playlist-loader]: playlist request ongoing'); + return; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].log("[playlist-loader]: aborting previous loader for type: " + context.type); + loader.abort(); + } + + var maxRetry; + var timeout; + var retryDelay; + var maxRetryDelay; // apply different configs for retries depending on + // context (manifest, level, audio/subs playlist) + + switch (context.type) { + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].MANIFEST: + maxRetry = config.manifestLoadingMaxRetry; + timeout = config.manifestLoadingTimeOut; + retryDelay = config.manifestLoadingRetryDelay; + maxRetryDelay = config.manifestLoadingMaxRetryTimeout; + break; + + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].LEVEL: + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].AUDIO_TRACK: + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].SUBTITLE_TRACK: + // Manage retries in Level/Track Controller + maxRetry = 0; + timeout = config.levelLoadingTimeOut; + break; + + default: + maxRetry = config.levelLoadingMaxRetry; + timeout = config.levelLoadingTimeOut; + retryDelay = config.levelLoadingRetryDelay; + maxRetryDelay = config.levelLoadingMaxRetryTimeout; + break; + } + + loader = this.createInternalLoader(context); // Override level/track timeout for LL-HLS requests + // (the default of 10000ms is counter productive to blocking playlist reload requests) + + if ((_context$deliveryDire = context.deliveryDirectives) !== null && _context$deliveryDire !== void 0 && _context$deliveryDire.part) { + var levelDetails; + + if (context.type === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].LEVEL && context.level !== null) { + levelDetails = this.hls.levels[context.level].details; + } else if (context.type === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].AUDIO_TRACK && context.id !== null) { + levelDetails = this.hls.audioTracks[context.id].details; + } else if (context.type === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].SUBTITLE_TRACK && context.id !== null) { + levelDetails = this.hls.subtitleTracks[context.id].details; + } + + if (levelDetails) { + var partTarget = levelDetails.partTarget; + var targetDuration = levelDetails.targetduration; + + if (partTarget && targetDuration) { + timeout = Math.min(Math.max(partTarget * 3, targetDuration * 0.8) * 1000, timeout); + } + } + } + + var loaderConfig = { + timeout: timeout, + maxRetry: maxRetry, + retryDelay: retryDelay, + maxRetryDelay: maxRetryDelay, + highWaterMark: 0 + }; + var loaderCallbacks = { + onSuccess: this.loadsuccess.bind(this), + onError: this.loaderror.bind(this), + onTimeout: this.loadtimeout.bind(this) + }; // logger.debug(`[playlist-loader]: Calling internal loader delegate for URL: ${context.url}`); + + loader.load(context, loaderConfig, loaderCallbacks); + }; + + _proto.loadsuccess = function loadsuccess(response, stats, context, networkDetails) { + if (networkDetails === void 0) { + networkDetails = null; + } + + if (context.isSidxRequest) { + this.handleSidxRequest(response, context); + this.handlePlaylistLoaded(response, stats, context, networkDetails); + return; + } + + this.resetInternalLoader(context.type); + var string = response.data; // Validate if it is an M3U8 at all + + if (string.indexOf('#EXTM3U') !== 0) { + this.handleManifestParsingError(response, context, 'no EXTM3U delimiter', networkDetails); + return; + } + + stats.parsing.start = performance.now(); // Check if chunk-list or master. handle empty chunk list case (first EXTINF not signaled, but TARGETDURATION present) + + if (string.indexOf('#EXTINF:') > 0 || string.indexOf('#EXT-X-TARGETDURATION:') > 0) { + this.handleTrackOrLevelPlaylist(response, stats, context, networkDetails); + } else { + this.handleMasterPlaylist(response, stats, context, networkDetails); + } + }; + + _proto.loaderror = function loaderror(response, context, networkDetails) { + if (networkDetails === void 0) { + networkDetails = null; + } + + this.handleNetworkError(context, networkDetails, false, response); + }; + + _proto.loadtimeout = function loadtimeout(stats, context, networkDetails) { + if (networkDetails === void 0) { + networkDetails = null; + } + + this.handleNetworkError(context, networkDetails, true); + }; + + _proto.handleMasterPlaylist = function handleMasterPlaylist(response, stats, context, networkDetails) { + var hls = this.hls; + var string = response.data; + var url = getResponseUrl(response, context); + + var _M3U8Parser$parseMast = _m3u8_parser__WEBPACK_IMPORTED_MODULE_5__["default"].parseMasterPlaylist(string, url), + levels = _M3U8Parser$parseMast.levels, + sessionData = _M3U8Parser$parseMast.sessionData; + + if (!levels.length) { + this.handleManifestParsingError(response, context, 'no level found in manifest', networkDetails); + return; + } // multi level playlist, parse level info + + + var audioGroups = levels.map(function (level) { + return { + id: level.attrs.AUDIO, + audioCodec: level.audioCodec + }; + }); + var subtitleGroups = levels.map(function (level) { + return { + id: level.attrs.SUBTITLES, + textCodec: level.textCodec + }; + }); + var audioTracks = _m3u8_parser__WEBPACK_IMPORTED_MODULE_5__["default"].parseMasterPlaylistMedia(string, url, 'AUDIO', audioGroups); + var subtitles = _m3u8_parser__WEBPACK_IMPORTED_MODULE_5__["default"].parseMasterPlaylistMedia(string, url, 'SUBTITLES', subtitleGroups); + var captions = _m3u8_parser__WEBPACK_IMPORTED_MODULE_5__["default"].parseMasterPlaylistMedia(string, url, 'CLOSED-CAPTIONS'); + + if (audioTracks.length) { + // check if we have found an audio track embedded in main playlist (audio track without URI attribute) + var embeddedAudioFound = audioTracks.some(function (audioTrack) { + return !audioTrack.url; + }); // if no embedded audio track defined, but audio codec signaled in quality level, + // we need to signal this main audio track this could happen with playlists with + // alt audio rendition in which quality levels (main) + // contains both audio+video. but with mixed audio track not signaled + + if (!embeddedAudioFound && levels[0].audioCodec && !levels[0].attrs.AUDIO) { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].log('[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one'); + audioTracks.unshift({ + type: 'main', + name: 'main', + default: false, + autoselect: false, + forced: false, + id: -1, + attrs: new _utils_attr_list__WEBPACK_IMPORTED_MODULE_7__["AttrList"]({}), + bitrate: 0, + url: '' + }); + } + } + + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADED, { + levels: levels, + audioTracks: audioTracks, + subtitles: subtitles, + captions: captions, + url: url, + stats: stats, + networkDetails: networkDetails, + sessionData: sessionData + }); + }; + + _proto.handleTrackOrLevelPlaylist = function handleTrackOrLevelPlaylist(response, stats, context, networkDetails) { + var hls = this.hls; + var id = context.id, + level = context.level, + type = context.type; + var url = getResponseUrl(response, context); + var levelUrlId = Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(id) ? id : 0; + var levelId = Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(level) ? level : levelUrlId; + var levelType = mapContextToLevelType(context); + var levelDetails = _m3u8_parser__WEBPACK_IMPORTED_MODULE_5__["default"].parseLevelPlaylist(response.data, url, levelId, levelType, levelUrlId); + + if (!levelDetails.fragments.length) { + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].LEVEL_EMPTY_ERROR, + fatal: false, + url: url, + reason: 'no fragments found in level', + level: typeof context.level === 'number' ? context.level : undefined + }); + return; + } // We have done our first request (Manifest-type) and receive + // not a master playlist but a chunk-list (track/level) + // We fire the manifest-loaded event anyway with the parsed level-details + // by creating a single-level structure for it. + + + if (type === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].MANIFEST) { + var singleLevel = { + attrs: new _utils_attr_list__WEBPACK_IMPORTED_MODULE_7__["AttrList"]({}), + bitrate: 0, + details: levelDetails, + name: '', + url: url + }; + hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].MANIFEST_LOADED, { + levels: [singleLevel], + audioTracks: [], + url: url, + stats: stats, + networkDetails: networkDetails, + sessionData: null + }); + } // save parsing time + + + stats.parsing.end = performance.now(); // in case we need SIDX ranges + // return early after calling load for + // the SIDX box. + + if (levelDetails.needSidxRanges) { + var _levelDetails$fragmen; + + var sidxUrl = (_levelDetails$fragmen = levelDetails.fragments[0].initSegment) === null || _levelDetails$fragmen === void 0 ? void 0 : _levelDetails$fragmen.url; + this.load({ + url: sidxUrl, + isSidxRequest: true, + type: type, + level: level, + levelDetails: levelDetails, + id: id, + groupId: null, + rangeStart: 0, + rangeEnd: 2048, + responseType: 'arraybuffer', + deliveryDirectives: null + }); + return; + } // extend the context with the new levelDetails property + + + context.levelDetails = levelDetails; + this.handlePlaylistLoaded(response, stats, context, networkDetails); + }; + + _proto.handleSidxRequest = function handleSidxRequest(response, context) { + var sidxInfo = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["parseSegmentIndex"])(new Uint8Array(response.data)); // if provided fragment does not contain sidx, early return + + if (!sidxInfo) { + return; + } + + var sidxReferences = sidxInfo.references; + var levelDetails = context.levelDetails; + sidxReferences.forEach(function (segmentRef, index) { + var segRefInfo = segmentRef.info; + var frag = levelDetails.fragments[index]; + + if (frag.byteRange.length === 0) { + frag.setByteRange(String(1 + segRefInfo.end - segRefInfo.start) + '@' + String(segRefInfo.start)); + } + + if (frag.initSegment) { + frag.initSegment.setByteRange(String(sidxInfo.moovEndOffset) + '@0'); + } + }); + }; + + _proto.handleManifestParsingError = function handleManifestParsingError(response, context, reason, networkDetails) { + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorTypes"].NETWORK_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].MANIFEST_PARSING_ERROR, + fatal: context.type === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].MANIFEST, + url: response.url, + reason: reason, + response: response, + context: context, + networkDetails: networkDetails + }); + }; + + _proto.handleNetworkError = function handleNetworkError(context, networkDetails, timeout, response) { + if (timeout === void 0) { + timeout = false; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("[playlist-loader]: A network " + (timeout ? 'timeout' : 'error') + " occurred while loading " + context.type + " level: " + context.level + " id: " + context.id + " group-id: \"" + context.groupId + "\""); + var details = _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].UNKNOWN; + var fatal = false; + var loader = this.getInternalLoader(context); + + switch (context.type) { + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].MANIFEST: + details = timeout ? _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].MANIFEST_LOAD_TIMEOUT : _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].MANIFEST_LOAD_ERROR; + fatal = true; + break; + + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].LEVEL: + details = timeout ? _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].LEVEL_LOAD_TIMEOUT : _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].LEVEL_LOAD_ERROR; + fatal = false; + break; + + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].AUDIO_TRACK: + details = timeout ? _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].AUDIO_TRACK_LOAD_TIMEOUT : _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].AUDIO_TRACK_LOAD_ERROR; + fatal = false; + break; + + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].SUBTITLE_TRACK: + details = timeout ? _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].SUBTITLE_TRACK_LOAD_TIMEOUT : _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorDetails"].SUBTITLE_LOAD_ERROR; + fatal = false; + break; + } + + if (loader) { + this.resetInternalLoader(context.type); + } + + var errorData = { + type: _errors__WEBPACK_IMPORTED_MODULE_2__["ErrorTypes"].NETWORK_ERROR, + details: details, + fatal: fatal, + url: context.url, + loader: loader, + context: context, + networkDetails: networkDetails + }; + + if (response) { + errorData.response = response; + } + + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, errorData); + }; + + _proto.handlePlaylistLoaded = function handlePlaylistLoaded(response, stats, context, networkDetails) { + var type = context.type, + level = context.level, + id = context.id, + groupId = context.groupId, + loader = context.loader, + levelDetails = context.levelDetails, + deliveryDirectives = context.deliveryDirectives; + + if (!(levelDetails !== null && levelDetails !== void 0 && levelDetails.targetduration)) { + this.handleManifestParsingError(response, context, 'invalid target duration', networkDetails); + return; + } + + if (!loader) { + return; + } + + if (levelDetails.live) { + if (loader.getCacheAge) { + levelDetails.ageHeader = loader.getCacheAge() || 0; + } + + if (!loader.getCacheAge || isNaN(levelDetails.ageHeader)) { + levelDetails.ageHeader = 0; + } + } + + switch (type) { + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].MANIFEST: + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].LEVEL: + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].LEVEL_LOADED, { + details: levelDetails, + level: level || 0, + id: id || 0, + stats: stats, + networkDetails: networkDetails, + deliveryDirectives: deliveryDirectives + }); + break; + + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].AUDIO_TRACK: + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].AUDIO_TRACK_LOADED, { + details: levelDetails, + id: id || 0, + groupId: groupId || '', + stats: stats, + networkDetails: networkDetails, + deliveryDirectives: deliveryDirectives + }); + break; + + case _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistContextType"].SUBTITLE_TRACK: + this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_TRACK_LOADED, { + details: levelDetails, + id: id || 0, + groupId: groupId || '', + stats: stats, + networkDetails: networkDetails, + deliveryDirectives: deliveryDirectives + }); + break; + } + }; + + return PlaylistLoader; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (PlaylistLoader); + +/***/ }), + +/***/ "./src/polyfills/number.ts": +/*!*********************************!*\ + !*** ./src/polyfills/number.ts ***! + \*********************************/ +/*! exports provided: isFiniteNumber, MAX_SAFE_INTEGER */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFiniteNumber", function() { return isFiniteNumber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAX_SAFE_INTEGER", function() { return MAX_SAFE_INTEGER; }); +var isFiniteNumber = Number.isFinite || function (value) { + return typeof value === 'number' && isFinite(value); +}; +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +/***/ }), + +/***/ "./src/remux/aac-helper.ts": +/*!*********************************!*\ + !*** ./src/remux/aac-helper.ts ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * AAC helper + */ +var AAC = /*#__PURE__*/function () { + function AAC() {} + + AAC.getSilentFrame = function getSilentFrame(codec, channelCount) { + switch (codec) { + case 'mp4a.40.2': + if (channelCount === 1) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]); + } else if (channelCount === 2) { + return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]); + } else if (channelCount === 3) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]); + } else if (channelCount === 4) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]); + } else if (channelCount === 5) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]); + } else if (channelCount === 6) { + return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]); + } + + break; + // handle HE-AAC below (mp4a.40.5 / mp4a.40.29) + + default: + if (channelCount === 1) { + // ffmpeg -y -f lavfi -i "aevalsrc=0:d=0.05" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac + return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]); + } else if (channelCount === 2) { + // ffmpeg -y -f lavfi -i "aevalsrc=0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac + return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]); + } else if (channelCount === 3) { + // ffmpeg -y -f lavfi -i "aevalsrc=0|0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac + return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]); + } + + break; + } + + return undefined; + }; + + return AAC; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (AAC); + +/***/ }), + +/***/ "./src/remux/mp4-generator.ts": +/*!************************************!*\ + !*** ./src/remux/mp4-generator.ts ***! + \************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Generate MP4 Box + */ +var UINT32_MAX = Math.pow(2, 32) - 1; + +var MP4 = /*#__PURE__*/function () { + function MP4() {} + + MP4.init = function init() { + MP4.types = { + avc1: [], + // codingname + avcC: [], + btrt: [], + dinf: [], + dref: [], + esds: [], + ftyp: [], + hdlr: [], + mdat: [], + mdhd: [], + mdia: [], + mfhd: [], + minf: [], + moof: [], + moov: [], + mp4a: [], + '.mp3': [], + mvex: [], + mvhd: [], + pasp: [], + sdtp: [], + stbl: [], + stco: [], + stsc: [], + stsd: [], + stsz: [], + stts: [], + tfdt: [], + tfhd: [], + traf: [], + trak: [], + trun: [], + trex: [], + tkhd: [], + vmhd: [], + smhd: [] + }; + var i; + + for (i in MP4.types) { + if (MP4.types.hasOwnProperty(i)) { + MP4.types[i] = [i.charCodeAt(0), i.charCodeAt(1), i.charCodeAt(2), i.charCodeAt(3)]; + } + } + + var videoHdlr = new Uint8Array([0x00, // version 0 + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, 0x00, 0x00, // pre_defined + 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide' + 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, 0x00, // reserved + 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler' + ]); + var audioHdlr = new Uint8Array([0x00, // version 0 + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, 0x00, 0x00, // pre_defined + 0x73, 0x6f, 0x75, 0x6e, // handler_type: 'soun' + 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, 0x00, // reserved + 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler' + ]); + MP4.HDLR_TYPES = { + video: videoHdlr, + audio: audioHdlr + }; + var dref = new Uint8Array([0x00, // version 0 + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, 0x00, 0x01, // entry_count + 0x00, 0x00, 0x00, 0x0c, // entry_size + 0x75, 0x72, 0x6c, 0x20, // 'url' type + 0x00, // version 0 + 0x00, 0x00, 0x01 // entry_flags + ]); + var stco = new Uint8Array([0x00, // version + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, 0x00, 0x00 // entry_count + ]); + MP4.STTS = MP4.STSC = MP4.STCO = stco; + MP4.STSZ = new Uint8Array([0x00, // version + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, 0x00, 0x00, // sample_size + 0x00, 0x00, 0x00, 0x00 // sample_count + ]); + MP4.VMHD = new Uint8Array([0x00, // version + 0x00, 0x00, 0x01, // flags + 0x00, 0x00, // graphicsmode + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // opcolor + ]); + MP4.SMHD = new Uint8Array([0x00, // version + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, // balance + 0x00, 0x00 // reserved + ]); + MP4.STSD = new Uint8Array([0x00, // version 0 + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, 0x00, 0x01]); // entry_count + + var majorBrand = new Uint8Array([105, 115, 111, 109]); // isom + + var avc1Brand = new Uint8Array([97, 118, 99, 49]); // avc1 + + var minorVersion = new Uint8Array([0, 0, 0, 1]); + MP4.FTYP = MP4.box(MP4.types.ftyp, majorBrand, minorVersion, majorBrand, avc1Brand); + MP4.DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, dref)); + }; + + MP4.box = function box(type) { + var size = 8; + + for (var _len = arguments.length, payload = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + payload[_key - 1] = arguments[_key]; + } + + var i = payload.length; + var len = i; // calculate the total size we need to allocate + + while (i--) { + size += payload[i].byteLength; + } + + var result = new Uint8Array(size); + result[0] = size >> 24 & 0xff; + result[1] = size >> 16 & 0xff; + result[2] = size >> 8 & 0xff; + result[3] = size & 0xff; + result.set(type, 4); // copy the payload into the result + + for (i = 0, size = 8; i < len; i++) { + // copy payload[i] array @ offset size + result.set(payload[i], size); + size += payload[i].byteLength; + } + + return result; + }; + + MP4.hdlr = function hdlr(type) { + return MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type]); + }; + + MP4.mdat = function mdat(data) { + return MP4.box(MP4.types.mdat, data); + }; + + MP4.mdhd = function mdhd(timescale, duration) { + duration *= timescale; + var upperWordDuration = Math.floor(duration / (UINT32_MAX + 1)); + var lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1)); + return MP4.box(MP4.types.mdhd, new Uint8Array([0x01, // version 1 + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // creation_time + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // modification_time + timescale >> 24 & 0xff, timescale >> 16 & 0xff, timescale >> 8 & 0xff, timescale & 0xff, // timescale + upperWordDuration >> 24, upperWordDuration >> 16 & 0xff, upperWordDuration >> 8 & 0xff, upperWordDuration & 0xff, lowerWordDuration >> 24, lowerWordDuration >> 16 & 0xff, lowerWordDuration >> 8 & 0xff, lowerWordDuration & 0xff, 0x55, 0xc4, // 'und' language (undetermined) + 0x00, 0x00])); + }; + + MP4.mdia = function mdia(track) { + return MP4.box(MP4.types.mdia, MP4.mdhd(track.timescale, track.duration), MP4.hdlr(track.type), MP4.minf(track)); + }; + + MP4.mfhd = function mfhd(sequenceNumber) { + return MP4.box(MP4.types.mfhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // flags + sequenceNumber >> 24, sequenceNumber >> 16 & 0xff, sequenceNumber >> 8 & 0xff, sequenceNumber & 0xff // sequence_number + ])); + }; + + MP4.minf = function minf(track) { + if (track.type === 'audio') { + return MP4.box(MP4.types.minf, MP4.box(MP4.types.smhd, MP4.SMHD), MP4.DINF, MP4.stbl(track)); + } else { + return MP4.box(MP4.types.minf, MP4.box(MP4.types.vmhd, MP4.VMHD), MP4.DINF, MP4.stbl(track)); + } + }; + + MP4.moof = function moof(sn, baseMediaDecodeTime, track) { + return MP4.box(MP4.types.moof, MP4.mfhd(sn), MP4.traf(track, baseMediaDecodeTime)); + } + /** + * @param tracks... (optional) {array} the tracks associated with this movie + */ + ; + + MP4.moov = function moov(tracks) { + var i = tracks.length; + var boxes = []; + + while (i--) { + boxes[i] = MP4.trak(tracks[i]); + } + + return MP4.box.apply(null, [MP4.types.moov, MP4.mvhd(tracks[0].timescale, tracks[0].duration)].concat(boxes).concat(MP4.mvex(tracks))); + }; + + MP4.mvex = function mvex(tracks) { + var i = tracks.length; + var boxes = []; + + while (i--) { + boxes[i] = MP4.trex(tracks[i]); + } + + return MP4.box.apply(null, [MP4.types.mvex].concat(boxes)); + }; + + MP4.mvhd = function mvhd(timescale, duration) { + duration *= timescale; + var upperWordDuration = Math.floor(duration / (UINT32_MAX + 1)); + var lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1)); + var bytes = new Uint8Array([0x01, // version 1 + 0x00, 0x00, 0x00, // flags + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // creation_time + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // modification_time + timescale >> 24 & 0xff, timescale >> 16 & 0xff, timescale >> 8 & 0xff, timescale & 0xff, // timescale + upperWordDuration >> 24, upperWordDuration >> 16 & 0xff, upperWordDuration >> 8 & 0xff, upperWordDuration & 0xff, lowerWordDuration >> 24, lowerWordDuration >> 16 & 0xff, lowerWordDuration >> 8 & 0xff, lowerWordDuration & 0xff, 0x00, 0x01, 0x00, 0x00, // 1.0 rate + 0x01, 0x00, // 1.0 volume + 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // transformation: unity matrix + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined + 0xff, 0xff, 0xff, 0xff // next_track_ID + ]); + return MP4.box(MP4.types.mvhd, bytes); + }; + + MP4.sdtp = function sdtp(track) { + var samples = track.samples || []; + var bytes = new Uint8Array(4 + samples.length); + var i; + var flags; // leave the full box header (4 bytes) all zero + // write the sample table + + for (i = 0; i < samples.length; i++) { + flags = samples[i].flags; + bytes[i + 4] = flags.dependsOn << 4 | flags.isDependedOn << 2 | flags.hasRedundancy; + } + + return MP4.box(MP4.types.sdtp, bytes); + }; + + MP4.stbl = function stbl(track) { + return MP4.box(MP4.types.stbl, MP4.stsd(track), MP4.box(MP4.types.stts, MP4.STTS), MP4.box(MP4.types.stsc, MP4.STSC), MP4.box(MP4.types.stsz, MP4.STSZ), MP4.box(MP4.types.stco, MP4.STCO)); + }; + + MP4.avc1 = function avc1(track) { + var sps = []; + var pps = []; + var i; + var data; + var len; // assemble the SPSs + + for (i = 0; i < track.sps.length; i++) { + data = track.sps[i]; + len = data.byteLength; + sps.push(len >>> 8 & 0xff); + sps.push(len & 0xff); // SPS + + sps = sps.concat(Array.prototype.slice.call(data)); + } // assemble the PPSs + + + for (i = 0; i < track.pps.length; i++) { + data = track.pps[i]; + len = data.byteLength; + pps.push(len >>> 8 & 0xff); + pps.push(len & 0xff); + pps = pps.concat(Array.prototype.slice.call(data)); + } + + var avcc = MP4.box(MP4.types.avcC, new Uint8Array([0x01, // version + sps[3], // profile + sps[4], // profile compat + sps[5], // level + 0xfc | 3, // lengthSizeMinusOne, hard-coded to 4 bytes + 0xe0 | track.sps.length // 3bit reserved (111) + numOfSequenceParameterSets + ].concat(sps).concat([track.pps.length // numOfPictureParameterSets + ]).concat(pps))); // "PPS" + + var width = track.width; + var height = track.height; + var hSpacing = track.pixelRatio[0]; + var vSpacing = track.pixelRatio[1]; + return MP4.box(MP4.types.avc1, new Uint8Array([0x00, 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, // reserved + 0x00, 0x01, // data_reference_index + 0x00, 0x00, // pre_defined + 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined + width >> 8 & 0xff, width & 0xff, // width + height >> 8 & 0xff, height & 0xff, // height + 0x00, 0x48, 0x00, 0x00, // horizresolution + 0x00, 0x48, 0x00, 0x00, // vertresolution + 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, 0x01, // frame_count + 0x12, 0x64, 0x61, 0x69, 0x6c, // dailymotion/hls.js + 0x79, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x68, 0x6c, 0x73, 0x2e, 0x6a, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // compressorname + 0x00, 0x18, // depth = 24 + 0x11, 0x11]), // pre_defined = -1 + avcc, MP4.box(MP4.types.btrt, new Uint8Array([0x00, 0x1c, 0x9c, 0x80, // bufferSizeDB + 0x00, 0x2d, 0xc6, 0xc0, // maxBitrate + 0x00, 0x2d, 0xc6, 0xc0])), // avgBitrate + MP4.box(MP4.types.pasp, new Uint8Array([hSpacing >> 24, // hSpacing + hSpacing >> 16 & 0xff, hSpacing >> 8 & 0xff, hSpacing & 0xff, vSpacing >> 24, // vSpacing + vSpacing >> 16 & 0xff, vSpacing >> 8 & 0xff, vSpacing & 0xff]))); + }; + + MP4.esds = function esds(track) { + var configlen = track.config.length; + return new Uint8Array([0x00, // version 0 + 0x00, 0x00, 0x00, // flags + 0x03, // descriptor_type + 0x17 + configlen, // length + 0x00, 0x01, // es_id + 0x00, // stream_priority + 0x04, // descriptor_type + 0x0f + configlen, // length + 0x40, // codec : mpeg4_audio + 0x15, // stream_type + 0x00, 0x00, 0x00, // buffer_size + 0x00, 0x00, 0x00, 0x00, // maxBitrate + 0x00, 0x00, 0x00, 0x00, // avgBitrate + 0x05 // descriptor_type + ].concat([configlen]).concat(track.config).concat([0x06, 0x01, 0x02])); // GASpecificConfig)); // length + audio config descriptor + }; + + MP4.mp4a = function mp4a(track) { + var samplerate = track.samplerate; + return MP4.box(MP4.types.mp4a, new Uint8Array([0x00, 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, // reserved + 0x00, 0x01, // data_reference_index + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, track.channelCount, // channelcount + 0x00, 0x10, // sampleSize:16bits + 0x00, 0x00, 0x00, 0x00, // reserved2 + samplerate >> 8 & 0xff, samplerate & 0xff, // + 0x00, 0x00]), MP4.box(MP4.types.esds, MP4.esds(track))); + }; + + MP4.mp3 = function mp3(track) { + var samplerate = track.samplerate; + return MP4.box(MP4.types['.mp3'], new Uint8Array([0x00, 0x00, 0x00, // reserved + 0x00, 0x00, 0x00, // reserved + 0x00, 0x01, // data_reference_index + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, track.channelCount, // channelcount + 0x00, 0x10, // sampleSize:16bits + 0x00, 0x00, 0x00, 0x00, // reserved2 + samplerate >> 8 & 0xff, samplerate & 0xff, // + 0x00, 0x00])); + }; + + MP4.stsd = function stsd(track) { + if (track.type === 'audio') { + if (!track.isAAC && track.codec === 'mp3') { + return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp3(track)); + } + + return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp4a(track)); + } else { + return MP4.box(MP4.types.stsd, MP4.STSD, MP4.avc1(track)); + } + }; + + MP4.tkhd = function tkhd(track) { + var id = track.id; + var duration = track.duration * track.timescale; + var width = track.width; + var height = track.height; + var upperWordDuration = Math.floor(duration / (UINT32_MAX + 1)); + var lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1)); + return MP4.box(MP4.types.tkhd, new Uint8Array([0x01, // version 1 + 0x00, 0x00, 0x07, // flags + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // creation_time + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // modification_time + id >> 24 & 0xff, id >> 16 & 0xff, id >> 8 & 0xff, id & 0xff, // track_ID + 0x00, 0x00, 0x00, 0x00, // reserved + upperWordDuration >> 24, upperWordDuration >> 16 & 0xff, upperWordDuration >> 8 & 0xff, upperWordDuration & 0xff, lowerWordDuration >> 24, lowerWordDuration >> 16 & 0xff, lowerWordDuration >> 8 & 0xff, lowerWordDuration & 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved + 0x00, 0x00, // layer + 0x00, 0x00, // alternate_group + 0x00, 0x00, // non-audio track volume + 0x00, 0x00, // reserved + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // transformation: unity matrix + width >> 8 & 0xff, width & 0xff, 0x00, 0x00, // width + height >> 8 & 0xff, height & 0xff, 0x00, 0x00 // height + ])); + }; + + MP4.traf = function traf(track, baseMediaDecodeTime) { + var sampleDependencyTable = MP4.sdtp(track); + var id = track.id; + var upperWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1)); + var lowerWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1)); + return MP4.box(MP4.types.traf, MP4.box(MP4.types.tfhd, new Uint8Array([0x00, // version 0 + 0x00, 0x00, 0x00, // flags + id >> 24, id >> 16 & 0xff, id >> 8 & 0xff, id & 0xff // track_ID + ])), MP4.box(MP4.types.tfdt, new Uint8Array([0x01, // version 1 + 0x00, 0x00, 0x00, // flags + upperWordBaseMediaDecodeTime >> 24, upperWordBaseMediaDecodeTime >> 16 & 0xff, upperWordBaseMediaDecodeTime >> 8 & 0xff, upperWordBaseMediaDecodeTime & 0xff, lowerWordBaseMediaDecodeTime >> 24, lowerWordBaseMediaDecodeTime >> 16 & 0xff, lowerWordBaseMediaDecodeTime >> 8 & 0xff, lowerWordBaseMediaDecodeTime & 0xff])), MP4.trun(track, sampleDependencyTable.length + 16 + // tfhd + 20 + // tfdt + 8 + // traf header + 16 + // mfhd + 8 + // moof header + 8), // mdat header + sampleDependencyTable); + } + /** + * Generate a track box. + * @param track {object} a track definition + * @return {Uint8Array} the track box + */ + ; + + MP4.trak = function trak(track) { + track.duration = track.duration || 0xffffffff; + return MP4.box(MP4.types.trak, MP4.tkhd(track), MP4.mdia(track)); + }; + + MP4.trex = function trex(track) { + var id = track.id; + return MP4.box(MP4.types.trex, new Uint8Array([0x00, // version 0 + 0x00, 0x00, 0x00, // flags + id >> 24, id >> 16 & 0xff, id >> 8 & 0xff, id & 0xff, // track_ID + 0x00, 0x00, 0x00, 0x01, // default_sample_description_index + 0x00, 0x00, 0x00, 0x00, // default_sample_duration + 0x00, 0x00, 0x00, 0x00, // default_sample_size + 0x00, 0x01, 0x00, 0x01 // default_sample_flags + ])); + }; + + MP4.trun = function trun(track, offset) { + var samples = track.samples || []; + var len = samples.length; + var arraylen = 12 + 16 * len; + var array = new Uint8Array(arraylen); + var i; + var sample; + var duration; + var size; + var flags; + var cts; + offset += 8 + arraylen; + array.set([0x00, // version 0 + 0x00, 0x0f, 0x01, // flags + len >>> 24 & 0xff, len >>> 16 & 0xff, len >>> 8 & 0xff, len & 0xff, // sample_count + offset >>> 24 & 0xff, offset >>> 16 & 0xff, offset >>> 8 & 0xff, offset & 0xff // data_offset + ], 0); + + for (i = 0; i < len; i++) { + sample = samples[i]; + duration = sample.duration; + size = sample.size; + flags = sample.flags; + cts = sample.cts; + array.set([duration >>> 24 & 0xff, duration >>> 16 & 0xff, duration >>> 8 & 0xff, duration & 0xff, // sample_duration + size >>> 24 & 0xff, size >>> 16 & 0xff, size >>> 8 & 0xff, size & 0xff, // sample_size + flags.isLeading << 2 | flags.dependsOn, flags.isDependedOn << 6 | flags.hasRedundancy << 4 | flags.paddingValue << 1 | flags.isNonSync, flags.degradPrio & 0xf0 << 8, flags.degradPrio & 0x0f, // sample_flags + cts >>> 24 & 0xff, cts >>> 16 & 0xff, cts >>> 8 & 0xff, cts & 0xff // sample_composition_time_offset + ], 12 + 16 * i); + } + + return MP4.box(MP4.types.trun, array); + }; + + MP4.initSegment = function initSegment(tracks) { + if (!MP4.types) { + MP4.init(); + } + + var movie = MP4.moov(tracks); + var result = new Uint8Array(MP4.FTYP.byteLength + movie.byteLength); + result.set(MP4.FTYP); + result.set(movie, MP4.FTYP.byteLength); + return result; + }; + + return MP4; +}(); + +MP4.types = void 0; +MP4.HDLR_TYPES = void 0; +MP4.STTS = void 0; +MP4.STSC = void 0; +MP4.STCO = void 0; +MP4.STSZ = void 0; +MP4.VMHD = void 0; +MP4.SMHD = void 0; +MP4.STSD = void 0; +MP4.FTYP = void 0; +MP4.DINF = void 0; +/* harmony default export */ __webpack_exports__["default"] = (MP4); + +/***/ }), + +/***/ "./src/remux/mp4-remuxer.ts": +/*!**********************************!*\ + !*** ./src/remux/mp4-remuxer.ts ***! + \**********************************/ +/*! exports provided: default, normalizePts */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MP4Remuxer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizePts", function() { return normalizePts; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _aac_helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./aac-helper */ "./src/remux/aac-helper.ts"); +/* harmony import */ var _mp4_generator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mp4-generator */ "./src/remux/mp4-generator.ts"); +/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../events */ "./src/events.ts"); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../errors */ "./src/errors.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts"); +/* harmony import */ var _utils_timescale_conversion__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/timescale-conversion */ "./src/utils/timescale-conversion.ts"); + + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + + + + + + + + +var MAX_SILENT_FRAME_DURATION = 10 * 1000; // 10 seconds + +var AAC_SAMPLES_PER_FRAME = 1024; +var MPEG_AUDIO_SAMPLE_PER_FRAME = 1152; +var chromeVersion = null; +var safariWebkitVersion = null; +var requiresPositiveDts = false; + +var MP4Remuxer = /*#__PURE__*/function () { + function MP4Remuxer(observer, config, typeSupported, vendor) { + if (vendor === void 0) { + vendor = ''; + } + + this.observer = void 0; + this.config = void 0; + this.typeSupported = void 0; + this.ISGenerated = false; + this._initPTS = void 0; + this._initDTS = void 0; + this.nextAvcDts = null; + this.nextAudioPts = null; + this.isAudioContiguous = false; + this.isVideoContiguous = false; + this.observer = observer; + this.config = config; + this.typeSupported = typeSupported; + this.ISGenerated = false; + + if (chromeVersion === null) { + var userAgent = navigator.userAgent || ''; + var result = userAgent.match(/Chrome\/(\d+)/i); + chromeVersion = result ? parseInt(result[1]) : 0; + } + + if (safariWebkitVersion === null) { + var _result = navigator.userAgent.match(/Safari\/(\d+)/i); + + safariWebkitVersion = _result ? parseInt(_result[1]) : 0; + } + + requiresPositiveDts = !!chromeVersion && chromeVersion < 75 || !!safariWebkitVersion && safariWebkitVersion < 600; + } + + var _proto = MP4Remuxer.prototype; + + _proto.destroy = function destroy() {}; + + _proto.resetTimeStamp = function resetTimeStamp(defaultTimeStamp) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].log('[mp4-remuxer]: initPTS & initDTS reset'); + this._initPTS = this._initDTS = defaultTimeStamp; + }; + + _proto.resetNextTimestamp = function resetNextTimestamp() { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].log('[mp4-remuxer]: reset next timestamp'); + this.isVideoContiguous = false; + this.isAudioContiguous = false; + }; + + _proto.resetInitSegment = function resetInitSegment() { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].log('[mp4-remuxer]: ISGenerated flag reset'); + this.ISGenerated = false; + }; + + _proto.getVideoStartPts = function getVideoStartPts(videoSamples) { + var rolloverDetected = false; + var startPTS = videoSamples.reduce(function (minPTS, sample) { + var delta = sample.pts - minPTS; + + if (delta < -4294967296) { + // 2^32, see PTSNormalize for reasoning, but we're hitting a rollover here, and we don't want that to impact the timeOffset calculation + rolloverDetected = true; + return normalizePts(minPTS, sample.pts); + } else if (delta > 0) { + return minPTS; + } else { + return sample.pts; + } + }, videoSamples[0].pts); + + if (rolloverDetected) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].debug('PTS rollover detected'); + } + + return startPTS; + }; + + _proto.remux = function remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, flush, playlistType) { + var video; + var audio; + var initSegment; + var text; + var id3; + var independent; + var audioTimeOffset = timeOffset; + var videoTimeOffset = timeOffset; // If we're remuxing audio and video progressively, wait until we've received enough samples for each track before proceeding. + // This is done to synchronize the audio and video streams. We know if the current segment will have samples if the "pid" + // parameter is greater than -1. The pid is set when the PMT is parsed, which contains the tracks list. + // However, if the initSegment has already been generated, or we've reached the end of a segment (flush), + // then we can remux one track without waiting for the other. + + var hasAudio = audioTrack.pid > -1; + var hasVideo = videoTrack.pid > -1; + var length = videoTrack.samples.length; + var enoughAudioSamples = audioTrack.samples.length > 0; + var enoughVideoSamples = length > 1; + var canRemuxAvc = (!hasAudio || enoughAudioSamples) && (!hasVideo || enoughVideoSamples) || this.ISGenerated || flush; + + if (canRemuxAvc) { + if (!this.ISGenerated) { + initSegment = this.generateIS(audioTrack, videoTrack, timeOffset); + } + + var isVideoContiguous = this.isVideoContiguous; + var firstKeyFrameIndex = -1; + + if (enoughVideoSamples) { + firstKeyFrameIndex = findKeyframeIndex(videoTrack.samples); + + if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) { + independent = true; + + if (firstKeyFrameIndex > 0) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe"); + var startPTS = this.getVideoStartPts(videoTrack.samples); + videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex); + videoTrack.dropped += firstKeyFrameIndex; + videoTimeOffset += (videoTrack.samples[0].pts - startPTS) / (videoTrack.timescale || 90000); + } else if (firstKeyFrameIndex === -1) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples"); + independent = false; + } + } + } + + if (this.ISGenerated) { + if (enoughAudioSamples && enoughVideoSamples) { + // timeOffset is expected to be the offset of the first timestamp of this fragment (first DTS) + // if first audio DTS is not aligned with first video DTS then we need to take that into account + // when providing timeOffset to remuxAudio / remuxVideo. if we don't do that, there might be a permanent / small + // drift between audio and video streams + var _startPTS = this.getVideoStartPts(videoTrack.samples); + + var tsDelta = normalizePts(audioTrack.samples[0].pts, _startPTS) - _startPTS; + + var audiovideoTimestampDelta = tsDelta / videoTrack.inputTimeScale; + audioTimeOffset += Math.max(0, audiovideoTimestampDelta); + videoTimeOffset += Math.max(0, -audiovideoTimestampDelta); + } // Purposefully remuxing audio before video, so that remuxVideo can use nextAudioPts, which is calculated in remuxAudio. + + + if (enoughAudioSamples) { + // if initSegment was generated without audio samples, regenerate it again + if (!audioTrack.samplerate) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn('[mp4-remuxer]: regenerate InitSegment as audio detected'); + initSegment = this.generateIS(audioTrack, videoTrack, timeOffset); + } + + audio = this.remuxAudio(audioTrack, audioTimeOffset, this.isAudioContiguous, accurateTimeOffset, hasVideo || enoughVideoSamples || playlistType === _types_loader__WEBPACK_IMPORTED_MODULE_6__["PlaylistLevelType"].AUDIO ? videoTimeOffset : undefined); + + if (enoughVideoSamples) { + var audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0; // if initSegment was generated without video samples, regenerate it again + + if (!videoTrack.inputTimeScale) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn('[mp4-remuxer]: regenerate InitSegment as video detected'); + initSegment = this.generateIS(audioTrack, videoTrack, timeOffset); + } + + video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, audioTrackLength); + } + } else if (enoughVideoSamples) { + video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, 0); + } + + if (video) { + video.firstKeyFrame = firstKeyFrameIndex; + video.independent = firstKeyFrameIndex !== -1; + } + } + } // Allow ID3 and text to remux, even if more audio/video samples are required + + + if (this.ISGenerated) { + if (id3Track.samples.length) { + id3 = this.remuxID3(id3Track, timeOffset); + } + + if (textTrack.samples.length) { + text = this.remuxText(textTrack, timeOffset); + } + } + + return { + audio: audio, + video: video, + initSegment: initSegment, + independent: independent, + text: text, + id3: id3 + }; + }; + + _proto.generateIS = function generateIS(audioTrack, videoTrack, timeOffset) { + var audioSamples = audioTrack.samples; + var videoSamples = videoTrack.samples; + var typeSupported = this.typeSupported; + var tracks = {}; + var computePTSDTS = !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(this._initPTS); + var container = 'audio/mp4'; + var initPTS; + var initDTS; + var timescale; + + if (computePTSDTS) { + initPTS = initDTS = Infinity; + } + + if (audioTrack.config && audioSamples.length) { + // let's use audio sampling rate as MP4 time scale. + // rationale is that there is a integer nb of audio frames per audio sample (1024 for AAC) + // using audio sampling rate here helps having an integer MP4 frame duration + // this avoids potential rounding issue and AV sync issue + audioTrack.timescale = audioTrack.samplerate; + + if (!audioTrack.isAAC) { + if (typeSupported.mpeg) { + // Chrome and Safari + container = 'audio/mpeg'; + audioTrack.codec = ''; + } else if (typeSupported.mp3) { + // Firefox + audioTrack.codec = 'mp3'; + } + } + + tracks.audio = { + id: 'audio', + container: container, + codec: audioTrack.codec, + initSegment: !audioTrack.isAAC && typeSupported.mpeg ? new Uint8Array(0) : _mp4_generator__WEBPACK_IMPORTED_MODULE_2__["default"].initSegment([audioTrack]), + metadata: { + channelCount: audioTrack.channelCount + } + }; + + if (computePTSDTS) { + timescale = audioTrack.inputTimeScale; // remember first PTS of this demuxing context. for audio, PTS = DTS + + initPTS = initDTS = audioSamples[0].pts - Math.round(timescale * timeOffset); + } + } + + if (videoTrack.sps && videoTrack.pps && videoSamples.length) { + // let's use input time scale as MP4 video timescale + // we use input time scale straight away to avoid rounding issues on frame duration / cts computation + videoTrack.timescale = videoTrack.inputTimeScale; + tracks.video = { + id: 'main', + container: 'video/mp4', + codec: videoTrack.codec, + initSegment: _mp4_generator__WEBPACK_IMPORTED_MODULE_2__["default"].initSegment([videoTrack]), + metadata: { + width: videoTrack.width, + height: videoTrack.height + } + }; + + if (computePTSDTS) { + timescale = videoTrack.inputTimeScale; + var startPTS = this.getVideoStartPts(videoSamples); + var startOffset = Math.round(timescale * timeOffset); + initDTS = Math.min(initDTS, normalizePts(videoSamples[0].dts, startPTS) - startOffset); + initPTS = Math.min(initPTS, startPTS - startOffset); + } + } + + if (Object.keys(tracks).length) { + this.ISGenerated = true; + + if (computePTSDTS) { + this._initPTS = initPTS; + this._initDTS = initDTS; + } + + return { + tracks: tracks, + initPTS: initPTS, + timescale: timescale + }; + } + }; + + _proto.remuxVideo = function remuxVideo(track, timeOffset, contiguous, audioTrackLength) { + var timeScale = track.inputTimeScale; + var inputSamples = track.samples; + var outputSamples = []; + var nbSamples = inputSamples.length; + var initPTS = this._initPTS; + var nextAvcDts = this.nextAvcDts; + var offset = 8; + var mp4SampleDuration; + var firstDTS; + var lastDTS; + var minPTS = Number.POSITIVE_INFINITY; + var maxPTS = Number.NEGATIVE_INFINITY; + var ptsDtsShift = 0; + var sortSamples = false; // if parsed fragment is contiguous with last one, let's use last DTS value as reference + + if (!contiguous || nextAvcDts === null) { + var pts = timeOffset * timeScale; + var cts = inputSamples[0].pts - normalizePts(inputSamples[0].dts, inputSamples[0].pts); // if not contiguous, let's use target timeOffset + + nextAvcDts = pts - cts; + } // PTS is coded on 33bits, and can loop from -2^32 to 2^32 + // PTSNormalize will make PTS/DTS value monotonic, we use last known DTS value as reference value + + + for (var i = 0; i < nbSamples; i++) { + var sample = inputSamples[i]; + sample.pts = normalizePts(sample.pts - initPTS, nextAvcDts); + sample.dts = normalizePts(sample.dts - initPTS, nextAvcDts); + + if (sample.dts > sample.pts) { + var PTS_DTS_SHIFT_TOLERANCE_90KHZ = 90000 * 0.2; + ptsDtsShift = Math.max(Math.min(ptsDtsShift, sample.pts - sample.dts), -1 * PTS_DTS_SHIFT_TOLERANCE_90KHZ); + } + + if (sample.dts < inputSamples[i > 0 ? i - 1 : i].dts) { + sortSamples = true; + } + } // sort video samples by DTS then PTS then demux id order + + + if (sortSamples) { + inputSamples.sort(function (a, b) { + var deltadts = a.dts - b.dts; + var deltapts = a.pts - b.pts; + return deltadts || deltapts; + }); + } // Get first/last DTS + + + firstDTS = inputSamples[0].dts; + lastDTS = inputSamples[inputSamples.length - 1].dts; // on Safari let's signal the same sample duration for all samples + // sample duration (as expected by trun MP4 boxes), should be the delta between sample DTS + // set this constant duration as being the avg delta between consecutive DTS. + + var averageSampleDuration = Math.round((lastDTS - firstDTS) / (nbSamples - 1)); // handle broken streams with PTS < DTS, tolerance up 0.2 seconds + + if (ptsDtsShift < 0) { + if (ptsDtsShift < averageSampleDuration * -2) { + // Fix for "CNN special report, with CC" in test-streams (including Safari browser) + // With large PTS < DTS errors such as this, we want to correct CTS while maintaining increasing DTS values + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn("PTS < DTS detected in video samples, offsetting DTS from PTS by " + Object(_utils_timescale_conversion__WEBPACK_IMPORTED_MODULE_7__["toMsFromMpegTsClock"])(-averageSampleDuration, true) + " ms"); + var lastDts = ptsDtsShift; + + for (var _i = 0; _i < nbSamples; _i++) { + inputSamples[_i].dts = lastDts = Math.max(lastDts, inputSamples[_i].pts - averageSampleDuration); + inputSamples[_i].pts = Math.max(lastDts, inputSamples[_i].pts); + } + } else { + // Fix for "Custom IV with bad PTS DTS" in test-streams + // With smaller PTS < DTS errors we can simply move all DTS back. This increases CTS without causing buffer gaps or decode errors in Safari + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn("PTS < DTS detected in video samples, shifting DTS by " + Object(_utils_timescale_conversion__WEBPACK_IMPORTED_MODULE_7__["toMsFromMpegTsClock"])(ptsDtsShift, true) + " ms to overcome this issue"); + + for (var _i2 = 0; _i2 < nbSamples; _i2++) { + inputSamples[_i2].dts = inputSamples[_i2].dts + ptsDtsShift; + } + } + + firstDTS = inputSamples[0].dts; + } // if fragment are contiguous, detect hole/overlapping between fragments + + + if (contiguous) { + // check timestamp continuity across consecutive fragments (this is to remove inter-fragment gap/hole) + var delta = firstDTS - nextAvcDts; + var foundHole = delta > averageSampleDuration; + var foundOverlap = delta < -1; + + if (foundHole || foundOverlap) { + if (foundHole) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn("AVC: " + Object(_utils_timescale_conversion__WEBPACK_IMPORTED_MODULE_7__["toMsFromMpegTsClock"])(delta, true) + " ms (" + delta + "dts) hole between fragments detected, filling it"); + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn("AVC: " + Object(_utils_timescale_conversion__WEBPACK_IMPORTED_MODULE_7__["toMsFromMpegTsClock"])(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected"); + } + + firstDTS = nextAvcDts; + var firstPTS = inputSamples[0].pts - delta; + inputSamples[0].dts = firstDTS; + inputSamples[0].pts = firstPTS; + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].log("Video: First PTS/DTS adjusted: " + Object(_utils_timescale_conversion__WEBPACK_IMPORTED_MODULE_7__["toMsFromMpegTsClock"])(firstPTS, true) + "/" + Object(_utils_timescale_conversion__WEBPACK_IMPORTED_MODULE_7__["toMsFromMpegTsClock"])(firstDTS, true) + ", delta: " + Object(_utils_timescale_conversion__WEBPACK_IMPORTED_MODULE_7__["toMsFromMpegTsClock"])(delta, true) + " ms"); + } + } + + if (requiresPositiveDts) { + firstDTS = Math.max(0, firstDTS); + } + + var nbNalu = 0; + var naluLen = 0; + + for (var _i3 = 0; _i3 < nbSamples; _i3++) { + // compute total/avc sample length and nb of NAL units + var _sample = inputSamples[_i3]; + var units = _sample.units; + var nbUnits = units.length; + var sampleLen = 0; + + for (var j = 0; j < nbUnits; j++) { + sampleLen += units[j].data.length; + } + + naluLen += sampleLen; + nbNalu += nbUnits; + _sample.length = sampleLen; // normalize PTS/DTS + // ensure sample monotonic DTS + + _sample.dts = Math.max(_sample.dts, firstDTS); // ensure that computed value is greater or equal than sample DTS + + _sample.pts = Math.max(_sample.pts, _sample.dts, 0); + minPTS = Math.min(_sample.pts, minPTS); + maxPTS = Math.max(_sample.pts, maxPTS); + } + + lastDTS = inputSamples[nbSamples - 1].dts; + /* concatenate the video data and construct the mdat in place + (need 8 more bytes to fill length and mpdat type) */ + + var mdatSize = naluLen + 4 * nbNalu + 8; + var mdat; + + try { + mdat = new Uint8Array(mdatSize); + } catch (err) { + this.observer.emit(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].ERROR, _events__WEBPACK_IMPORTED_MODULE_3__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorTypes"].MUX_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorDetails"].REMUX_ALLOC_ERROR, + fatal: false, + bytes: mdatSize, + reason: "fail allocating video mdat " + mdatSize + }); + return; + } + + var view = new DataView(mdat.buffer); + view.setUint32(0, mdatSize); + mdat.set(_mp4_generator__WEBPACK_IMPORTED_MODULE_2__["default"].types.mdat, 4); + + for (var _i4 = 0; _i4 < nbSamples; _i4++) { + var avcSample = inputSamples[_i4]; + var avcSampleUnits = avcSample.units; + var mp4SampleLength = 0; // convert NALU bitstream to MP4 format (prepend NALU with size field) + + for (var _j = 0, _nbUnits = avcSampleUnits.length; _j < _nbUnits; _j++) { + var unit = avcSampleUnits[_j]; + var unitData = unit.data; + var unitDataLen = unit.data.byteLength; + view.setUint32(offset, unitDataLen); + offset += 4; + mdat.set(unitData, offset); + offset += unitDataLen; + mp4SampleLength += 4 + unitDataLen; + } // expected sample duration is the Decoding Timestamp diff of consecutive samples + + + if (_i4 < nbSamples - 1) { + mp4SampleDuration = inputSamples[_i4 + 1].dts - avcSample.dts; + } else { + var config = this.config; + var lastFrameDuration = avcSample.dts - inputSamples[_i4 > 0 ? _i4 - 1 : _i4].dts; + + if (config.stretchShortVideoTrack && this.nextAudioPts !== null) { + // In some cases, a segment's audio track duration may exceed the video track duration. + // Since we've already remuxed audio, and we know how long the audio track is, we look to + // see if the delta to the next segment is longer than maxBufferHole. + // If so, playback would potentially get stuck, so we artificially inflate + // the duration of the last frame to minimize any potential gap between segments. + var gapTolerance = Math.floor(config.maxBufferHole * timeScale); + var deltaToFrameEnd = (audioTrackLength ? minPTS + audioTrackLength * timeScale : this.nextAudioPts) - avcSample.pts; + + if (deltaToFrameEnd > gapTolerance) { + // We subtract lastFrameDuration from deltaToFrameEnd to try to prevent any video + // frame overlap. maxBufferHole should be >> lastFrameDuration anyway. + mp4SampleDuration = deltaToFrameEnd - lastFrameDuration; + + if (mp4SampleDuration < 0) { + mp4SampleDuration = lastFrameDuration; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].log("[mp4-remuxer]: It is approximately " + deltaToFrameEnd / 90 + " ms to the next segment; using duration " + mp4SampleDuration / 90 + " ms for the last video frame."); + } else { + mp4SampleDuration = lastFrameDuration; + } + } else { + mp4SampleDuration = lastFrameDuration; + } + } + + var compositionTimeOffset = Math.round(avcSample.pts - avcSample.dts); + outputSamples.push(new Mp4Sample(avcSample.key, mp4SampleDuration, mp4SampleLength, compositionTimeOffset)); + } + + if (outputSamples.length && chromeVersion && chromeVersion < 70) { + // Chrome workaround, mark first sample as being a Random Access Point (keyframe) to avoid sourcebuffer append issue + // https://code.google.com/p/chromium/issues/detail?id=229412 + var flags = outputSamples[0].flags; + flags.dependsOn = 2; + flags.isNonSync = 0; + } + + console.assert(mp4SampleDuration !== undefined, 'mp4SampleDuration must be computed'); // next AVC sample DTS should be equal to last sample DTS + last sample duration (in PES timescale) + + this.nextAvcDts = nextAvcDts = lastDTS + mp4SampleDuration; + this.isVideoContiguous = true; + var moof = _mp4_generator__WEBPACK_IMPORTED_MODULE_2__["default"].moof(track.sequenceNumber++, firstDTS, _extends({}, track, { + samples: outputSamples + })); + var type = 'video'; + var data = { + data1: moof, + data2: mdat, + startPTS: minPTS / timeScale, + endPTS: (maxPTS + mp4SampleDuration) / timeScale, + startDTS: firstDTS / timeScale, + endDTS: nextAvcDts / timeScale, + type: type, + hasAudio: false, + hasVideo: true, + nb: outputSamples.length, + dropped: track.dropped + }; + track.samples = []; + track.dropped = 0; + console.assert(mdat.length, 'MDAT length must not be zero'); + return data; + }; + + _proto.remuxAudio = function remuxAudio(track, timeOffset, contiguous, accurateTimeOffset, videoTimeOffset) { + var inputTimeScale = track.inputTimeScale; + var mp4timeScale = track.samplerate ? track.samplerate : inputTimeScale; + var scaleFactor = inputTimeScale / mp4timeScale; + var mp4SampleDuration = track.isAAC ? AAC_SAMPLES_PER_FRAME : MPEG_AUDIO_SAMPLE_PER_FRAME; + var inputSampleDuration = mp4SampleDuration * scaleFactor; + var initPTS = this._initPTS; + var rawMPEG = !track.isAAC && this.typeSupported.mpeg; + var outputSamples = []; + var inputSamples = track.samples; + var offset = rawMPEG ? 0 : 8; + var nextAudioPts = this.nextAudioPts || -1; // window.audioSamples ? window.audioSamples.push(inputSamples.map(s => s.pts)) : (window.audioSamples = [inputSamples.map(s => s.pts)]); + // for audio samples, also consider consecutive fragments as being contiguous (even if a level switch occurs), + // for sake of clarity: + // consecutive fragments are frags with + // - less than 100ms gaps between new time offset (if accurate) and next expected PTS OR + // - less than 20 audio frames distance + // contiguous fragments are consecutive fragments from same quality level (same level, new SN = old SN + 1) + // this helps ensuring audio continuity + // and this also avoids audio glitches/cut when switching quality, or reporting wrong duration on first audio frame + + var timeOffsetMpegTS = timeOffset * inputTimeScale; + this.isAudioContiguous = contiguous = contiguous || inputSamples.length && nextAudioPts > 0 && (accurateTimeOffset && Math.abs(timeOffsetMpegTS - nextAudioPts) < 9000 || Math.abs(normalizePts(inputSamples[0].pts - initPTS, timeOffsetMpegTS) - nextAudioPts) < 20 * inputSampleDuration); // compute normalized PTS + + inputSamples.forEach(function (sample) { + sample.pts = normalizePts(sample.pts - initPTS, timeOffsetMpegTS); + }); + + if (!contiguous || nextAudioPts < 0) { + // filter out sample with negative PTS that are not playable anyway + // if we don't remove these negative samples, they will shift all audio samples forward. + // leading to audio overlap between current / next fragment + inputSamples = inputSamples.filter(function (sample) { + return sample.pts >= 0; + }); // in case all samples have negative PTS, and have been filtered out, return now + + if (!inputSamples.length) { + return; + } + + if (videoTimeOffset === 0) { + // Set the start to 0 to match video so that start gaps larger than inputSampleDuration are filled with silence + nextAudioPts = 0; + } else if (accurateTimeOffset) { + // When not seeking, not live, and LevelDetails.PTSKnown, use fragment start as predicted next audio PTS + nextAudioPts = Math.max(0, timeOffsetMpegTS); + } else { + // if frags are not contiguous and if we cant trust time offset, let's use first sample PTS as next audio PTS + nextAudioPts = inputSamples[0].pts; + } + } // If the audio track is missing samples, the frames seem to get "left-shifted" within the + // resulting mp4 segment, causing sync issues and leaving gaps at the end of the audio segment. + // In an effort to prevent this from happening, we inject frames here where there are gaps. + // When possible, we inject a silent frame; when that's not possible, we duplicate the last + // frame. + + + if (track.isAAC) { + var alignedWithVideo = videoTimeOffset !== undefined; + var maxAudioFramesDrift = this.config.maxAudioFramesDrift; + + for (var i = 0, nextPts = nextAudioPts; i < inputSamples.length; i++) { + // First, let's see how far off this frame is from where we expect it to be + var sample = inputSamples[i]; + var pts = sample.pts; + var delta = pts - nextPts; + var duration = Math.abs(1000 * delta / inputTimeScale); // When remuxing with video, if we're overlapping by more than a duration, drop this sample to stay in sync + + if (delta <= -maxAudioFramesDrift * inputSampleDuration && alignedWithVideo) { + if (i === 0) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms."); + this.nextAudioPts = nextAudioPts = nextPts = pts; + } + } // eslint-disable-line brace-style + // Insert missing frames if: + // 1: We're more than maxAudioFramesDrift frame away + // 2: Not more than MAX_SILENT_FRAME_DURATION away + // 3: currentTime (aka nextPtsNorm) is not 0 + // 4: remuxing with video (videoTimeOffset !== undefined) + else if (delta >= maxAudioFramesDrift * inputSampleDuration && duration < MAX_SILENT_FRAME_DURATION && alignedWithVideo) { + var missing = Math.round(delta / inputSampleDuration); // Adjust nextPts so that silent samples are aligned with media pts. This will prevent media samples from + // later being shifted if nextPts is based on timeOffset and delta is not a multiple of inputSampleDuration. + + nextPts = pts - missing * inputSampleDuration; + + if (nextPts < 0) { + missing--; + nextPts += inputSampleDuration; + } + + if (i === 0) { + this.nextAudioPts = nextAudioPts = nextPts; + } + + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap."); + + for (var j = 0; j < missing; j++) { + var newStamp = Math.max(nextPts, 0); + var fillFrame = _aac_helper__WEBPACK_IMPORTED_MODULE_1__["default"].getSilentFrame(track.manifestCodec || track.codec, track.channelCount); + + if (!fillFrame) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.'); + fillFrame = sample.unit.subarray(); + } + + inputSamples.splice(i, 0, { + unit: fillFrame, + pts: newStamp + }); + nextPts += inputSampleDuration; + i++; + } + } + + sample.pts = nextPts; + nextPts += inputSampleDuration; + } + } + + var firstPTS = null; + var lastPTS = null; + var mdat; + var mdatSize = 0; + var sampleLength = inputSamples.length; + + while (sampleLength--) { + mdatSize += inputSamples[sampleLength].unit.byteLength; + } + + for (var _j2 = 0, _nbSamples = inputSamples.length; _j2 < _nbSamples; _j2++) { + var audioSample = inputSamples[_j2]; + var unit = audioSample.unit; + var _pts = audioSample.pts; + + if (lastPTS !== null) { + // If we have more than one sample, set the duration of the sample to the "real" duration; the PTS diff with + // the previous sample + var prevSample = outputSamples[_j2 - 1]; + prevSample.duration = Math.round((_pts - lastPTS) / scaleFactor); + } else { + if (contiguous && track.isAAC) { + // set PTS/DTS to expected PTS/DTS + _pts = nextAudioPts; + } // remember first PTS of our audioSamples + + + firstPTS = _pts; + + if (mdatSize > 0) { + /* concatenate the audio data and construct the mdat in place + (need 8 more bytes to fill length and mdat type) */ + mdatSize += offset; + + try { + mdat = new Uint8Array(mdatSize); + } catch (err) { + this.observer.emit(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].ERROR, _events__WEBPACK_IMPORTED_MODULE_3__["Events"].ERROR, { + type: _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorTypes"].MUX_ERROR, + details: _errors__WEBPACK_IMPORTED_MODULE_4__["ErrorDetails"].REMUX_ALLOC_ERROR, + fatal: false, + bytes: mdatSize, + reason: "fail allocating audio mdat " + mdatSize + }); + return; + } + + if (!rawMPEG) { + var view = new DataView(mdat.buffer); + view.setUint32(0, mdatSize); + mdat.set(_mp4_generator__WEBPACK_IMPORTED_MODULE_2__["default"].types.mdat, 4); + } + } else { + // no audio samples + return; + } + } + + mdat.set(unit, offset); + var unitLen = unit.byteLength; + offset += unitLen; // Default the sample's duration to the computed mp4SampleDuration, which will either be 1024 for AAC or 1152 for MPEG + // In the case that we have 1 sample, this will be the duration. If we have more than one sample, the duration + // becomes the PTS diff with the previous sample + + outputSamples.push(new Mp4Sample(true, mp4SampleDuration, unitLen, 0)); + lastPTS = _pts; + } // We could end up with no audio samples if all input samples were overlapping with the previously remuxed ones + + + var nbSamples = outputSamples.length; + + if (!nbSamples) { + return; + } // The next audio sample PTS should be equal to last sample PTS + duration + + + var lastSample = outputSamples[outputSamples.length - 1]; + this.nextAudioPts = nextAudioPts = lastPTS + scaleFactor * lastSample.duration; // Set the track samples from inputSamples to outputSamples before remuxing + + var moof = rawMPEG ? new Uint8Array(0) : _mp4_generator__WEBPACK_IMPORTED_MODULE_2__["default"].moof(track.sequenceNumber++, firstPTS / scaleFactor, _extends({}, track, { + samples: outputSamples + })); // Clear the track samples. This also clears the samples array in the demuxer, since the reference is shared + + track.samples = []; + var start = firstPTS / inputTimeScale; + var end = nextAudioPts / inputTimeScale; + var type = 'audio'; + var audioData = { + data1: moof, + data2: mdat, + startPTS: start, + endPTS: end, + startDTS: start, + endDTS: end, + type: type, + hasAudio: true, + hasVideo: false, + nb: nbSamples + }; + this.isAudioContiguous = true; + console.assert(mdat.length, 'MDAT length must not be zero'); + return audioData; + }; + + _proto.remuxEmptyAudio = function remuxEmptyAudio(track, timeOffset, contiguous, videoData) { + var inputTimeScale = track.inputTimeScale; + var mp4timeScale = track.samplerate ? track.samplerate : inputTimeScale; + var scaleFactor = inputTimeScale / mp4timeScale; + var nextAudioPts = this.nextAudioPts; // sync with video's timestamp + + var startDTS = (nextAudioPts !== null ? nextAudioPts : videoData.startDTS * inputTimeScale) + this._initDTS; + var endDTS = videoData.endDTS * inputTimeScale + this._initDTS; // one sample's duration value + + var frameDuration = scaleFactor * AAC_SAMPLES_PER_FRAME; // samples count of this segment's duration + + var nbSamples = Math.ceil((endDTS - startDTS) / frameDuration); // silent frame + + var silentFrame = _aac_helper__WEBPACK_IMPORTED_MODULE_1__["default"].getSilentFrame(track.manifestCodec || track.codec, track.channelCount); + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].warn('[mp4-remuxer]: remux empty Audio'); // Can't remux if we can't generate a silent frame... + + if (!silentFrame) { + _utils_logger__WEBPACK_IMPORTED_MODULE_5__["logger"].trace('[mp4-remuxer]: Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec'); + return; + } + + var samples = []; + + for (var i = 0; i < nbSamples; i++) { + var stamp = startDTS + i * frameDuration; + samples.push({ + unit: silentFrame, + pts: stamp, + dts: stamp + }); + } + + track.samples = samples; + return this.remuxAudio(track, timeOffset, contiguous, false); + }; + + _proto.remuxID3 = function remuxID3(track, timeOffset) { + var length = track.samples.length; + + if (!length) { + return; + } + + var inputTimeScale = track.inputTimeScale; + var initPTS = this._initPTS; + var initDTS = this._initDTS; + + for (var index = 0; index < length; index++) { + var sample = track.samples[index]; // setting id3 pts, dts to relative time + // using this._initPTS and this._initDTS to calculate relative time + + sample.pts = normalizePts(sample.pts - initPTS, timeOffset * inputTimeScale) / inputTimeScale; + sample.dts = normalizePts(sample.dts - initDTS, timeOffset * inputTimeScale) / inputTimeScale; + } + + var samples = track.samples; + track.samples = []; + return { + samples: samples + }; + }; + + _proto.remuxText = function remuxText(track, timeOffset) { + var length = track.samples.length; + + if (!length) { + return; + } + + var inputTimeScale = track.inputTimeScale; + var initPTS = this._initPTS; + + for (var index = 0; index < length; index++) { + var sample = track.samples[index]; // setting text pts, dts to relative time + // using this._initPTS and this._initDTS to calculate relative time + + sample.pts = normalizePts(sample.pts - initPTS, timeOffset * inputTimeScale) / inputTimeScale; + } + + track.samples.sort(function (a, b) { + return a.pts - b.pts; + }); + var samples = track.samples; + track.samples = []; + return { + samples: samples + }; + }; + + return MP4Remuxer; +}(); + + +function normalizePts(value, reference) { + var offset; + + if (reference === null) { + return value; + } + + if (reference < value) { + // - 2^33 + offset = -8589934592; + } else { + // + 2^33 + offset = 8589934592; + } + /* PTS is 33bit (from 0 to 2^33 -1) + if diff between value and reference is bigger than half of the amplitude (2^32) then it means that + PTS looping occured. fill the gap */ + + + while (Math.abs(value - reference) > 4294967296) { + value += offset; + } + + return value; +} + +function findKeyframeIndex(samples) { + for (var i = 0; i < samples.length; i++) { + if (samples[i].key) { + return i; + } + } + + return -1; +} + +var Mp4Sample = function Mp4Sample(isKeyframe, duration, size, cts) { + this.size = void 0; + this.duration = void 0; + this.cts = void 0; + this.flags = void 0; + this.duration = duration; + this.size = size; + this.cts = cts; + this.flags = new Mp4SampleFlags(isKeyframe); +}; + +var Mp4SampleFlags = function Mp4SampleFlags(isKeyframe) { + this.isLeading = 0; + this.isDependedOn = 0; + this.hasRedundancy = 0; + this.degradPrio = 0; + this.dependsOn = 1; + this.isNonSync = 1; + this.dependsOn = isKeyframe ? 2 : 1; + this.isNonSync = isKeyframe ? 0 : 1; +}; + +/***/ }), + +/***/ "./src/remux/passthrough-remuxer.ts": +/*!******************************************!*\ + !*** ./src/remux/passthrough-remuxer.ts ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _loader_fragment__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../loader/fragment */ "./src/loader/fragment.ts"); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + + + + + + +var PassThroughRemuxer = /*#__PURE__*/function () { + function PassThroughRemuxer() { + this.emitInitSegment = false; + this.audioCodec = void 0; + this.videoCodec = void 0; + this.initData = void 0; + this.initPTS = void 0; + this.initTracks = void 0; + this.lastEndDTS = null; + } + + var _proto = PassThroughRemuxer.prototype; + + _proto.destroy = function destroy() {}; + + _proto.resetTimeStamp = function resetTimeStamp(defaultInitPTS) { + this.initPTS = defaultInitPTS; + this.lastEndDTS = null; + }; + + _proto.resetNextTimestamp = function resetNextTimestamp() { + this.lastEndDTS = null; + }; + + _proto.resetInitSegment = function resetInitSegment(initSegment, audioCodec, videoCodec) { + this.audioCodec = audioCodec; + this.videoCodec = videoCodec; + this.generateInitSegment(initSegment); + this.emitInitSegment = true; + }; + + _proto.generateInitSegment = function generateInitSegment(initSegment) { + var audioCodec = this.audioCodec, + videoCodec = this.videoCodec; + + if (!initSegment || !initSegment.byteLength) { + this.initTracks = undefined; + this.initData = undefined; + return; + } + + var initData = this.initData = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_1__["parseInitSegment"])(initSegment); // Get codec from initSegment or fallback to default + + if (!audioCodec) { + audioCodec = getParsedTrackCodec(initData.audio, _loader_fragment__WEBPACK_IMPORTED_MODULE_2__["ElementaryStreamTypes"].AUDIO); + } + + if (!videoCodec) { + videoCodec = getParsedTrackCodec(initData.video, _loader_fragment__WEBPACK_IMPORTED_MODULE_2__["ElementaryStreamTypes"].VIDEO); + } + + var tracks = {}; + + if (initData.audio && initData.video) { + tracks.audiovideo = { + container: 'video/mp4', + codec: audioCodec + ',' + videoCodec, + initSegment: initSegment, + id: 'main' + }; + } else if (initData.audio) { + tracks.audio = { + container: 'audio/mp4', + codec: audioCodec, + initSegment: initSegment, + id: 'audio' + }; + } else if (initData.video) { + tracks.video = { + container: 'video/mp4', + codec: videoCodec, + initSegment: initSegment, + id: 'main' + }; + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.'); + } + + this.initTracks = tracks; + }; + + _proto.remux = function remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset) { + var initPTS = this.initPTS, + lastEndDTS = this.lastEndDTS; + var result = { + audio: undefined, + video: undefined, + text: textTrack, + id3: id3Track, + initSegment: undefined + }; // If we haven't yet set a lastEndDTS, or it was reset, set it to the provided timeOffset. We want to use the + // lastEndDTS over timeOffset whenever possible; during progressive playback, the media source will not update + // the media duration (which is what timeOffset is provided as) before we need to process the next chunk. + + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(lastEndDTS)) { + lastEndDTS = this.lastEndDTS = timeOffset || 0; + } // The binary segment data is added to the videoTrack in the mp4demuxer. We don't check to see if the data is only + // audio or video (or both); adding it to video was an arbitrary choice. + + + var data = videoTrack.samples; + + if (!data || !data.length) { + return result; + } + + var initSegment = { + initPTS: undefined, + timescale: 1 + }; + var initData = this.initData; + + if (!initData || !initData.length) { + this.generateInitSegment(data); + initData = this.initData; + } + + if (!initData || !initData.length) { + // We can't remux if the initSegment could not be generated + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('[passthrough-remuxer.ts]: Failed to generate initSegment.'); + return result; + } + + if (this.emitInitSegment) { + initSegment.tracks = this.initTracks; + this.emitInitSegment = false; + } + + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(initPTS)) { + this.initPTS = initSegment.initPTS = initPTS = computeInitPTS(initData, data, lastEndDTS); + } + + var duration = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_1__["getDuration"])(data, initData); + var startDTS = lastEndDTS; + var endDTS = duration + startDTS; + Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_1__["offsetStartDTS"])(initData, data, initPTS); + + if (duration > 0) { + this.lastEndDTS = endDTS; + } else { + _utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('Duration parsed from mp4 should be greater than zero'); + this.resetNextTimestamp(); + } + + var hasAudio = !!initData.audio; + var hasVideo = !!initData.video; + var type = ''; + + if (hasAudio) { + type += 'audio'; + } + + if (hasVideo) { + type += 'video'; + } + + var track = { + data1: data, + startPTS: startDTS, + startDTS: startDTS, + endPTS: endDTS, + endDTS: endDTS, + type: type, + hasAudio: hasAudio, + hasVideo: hasVideo, + nb: 1, + dropped: 0 + }; + result.audio = track.type === 'audio' ? track : undefined; + result.video = track.type !== 'audio' ? track : undefined; + result.text = textTrack; + result.id3 = id3Track; + result.initSegment = initSegment; + return result; + }; + + return PassThroughRemuxer; +}(); + +var computeInitPTS = function computeInitPTS(initData, data, timeOffset) { + return Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_1__["getStartDTS"])(initData, data) - timeOffset; +}; + +function getParsedTrackCodec(track, type) { + var parsedCodec = track === null || track === void 0 ? void 0 : track.codec; + + if (parsedCodec && parsedCodec.length > 4) { + return parsedCodec; + } // Since mp4-tools cannot parse full codec string (see 'TODO: Parse codec details'... in mp4-tools) + // Provide defaults based on codec type + // This allows for some playback of some fmp4 playlists without CODECS defined in manifest + + + if (parsedCodec === 'hvc1') { + return 'hvc1.1.c.L120.90'; + } + + if (parsedCodec === 'av01') { + return 'av01.0.04M.08'; + } + + if (parsedCodec === 'avc1' || type === _loader_fragment__WEBPACK_IMPORTED_MODULE_2__["ElementaryStreamTypes"].VIDEO) { + return 'avc1.42e01e'; + } + + return 'mp4a.40.5'; +} + +/* harmony default export */ __webpack_exports__["default"] = (PassThroughRemuxer); + +/***/ }), + +/***/ "./src/task-loop.ts": +/*!**************************!*\ + !*** ./src/task-loop.ts ***! + \**************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TaskLoop; }); +/** + * Sub-class specialization of EventHandler base class. + * + * TaskLoop allows to schedule a task function being called (optionnaly repeatedly) on the main loop, + * scheduled asynchroneously, avoiding recursive calls in the same tick. + * + * The task itself is implemented in `doTick`. It can be requested and called for single execution + * using the `tick` method. + * + * It will be assured that the task execution method (`tick`) only gets called once per main loop "tick", + * no matter how often it gets requested for execution. Execution in further ticks will be scheduled accordingly. + * + * If further execution requests have already been scheduled on the next tick, it can be checked with `hasNextTick`, + * and cancelled with `clearNextTick`. + * + * The task can be scheduled as an interval repeatedly with a period as parameter (see `setInterval`, `clearInterval`). + * + * Sub-classes need to implement the `doTick` method which will effectively have the task execution routine. + * + * Further explanations: + * + * The baseclass has a `tick` method that will schedule the doTick call. It may be called synchroneously + * only for a stack-depth of one. On re-entrant calls, sub-sequent calls are scheduled for next main loop ticks. + * + * When the task execution (`tick` method) is called in re-entrant way this is detected and + * we are limiting the task execution per call stack to exactly one, but scheduling/post-poning further + * task processing on the next main loop iteration (also known as "next tick" in the Node/JS runtime lingo). + */ +var TaskLoop = /*#__PURE__*/function () { + function TaskLoop() { + this._boundTick = void 0; + this._tickTimer = null; + this._tickInterval = null; + this._tickCallCount = 0; + this._boundTick = this.tick.bind(this); + } + + var _proto = TaskLoop.prototype; + + _proto.destroy = function destroy() { + this.onHandlerDestroying(); + this.onHandlerDestroyed(); + }; + + _proto.onHandlerDestroying = function onHandlerDestroying() { + // clear all timers before unregistering from event bus + this.clearNextTick(); + this.clearInterval(); + }; + + _proto.onHandlerDestroyed = function onHandlerDestroyed() {} + /** + * @returns {boolean} + */ + ; + + _proto.hasInterval = function hasInterval() { + return !!this._tickInterval; + } + /** + * @returns {boolean} + */ + ; + + _proto.hasNextTick = function hasNextTick() { + return !!this._tickTimer; + } + /** + * @param {number} millis Interval time (ms) + * @returns {boolean} True when interval has been scheduled, false when already scheduled (no effect) + */ + ; + + _proto.setInterval = function setInterval(millis) { + if (!this._tickInterval) { + this._tickInterval = self.setInterval(this._boundTick, millis); + return true; + } + + return false; + } + /** + * @returns {boolean} True when interval was cleared, false when none was set (no effect) + */ + ; + + _proto.clearInterval = function clearInterval() { + if (this._tickInterval) { + self.clearInterval(this._tickInterval); + this._tickInterval = null; + return true; + } + + return false; + } + /** + * @returns {boolean} True when timeout was cleared, false when none was set (no effect) + */ + ; + + _proto.clearNextTick = function clearNextTick() { + if (this._tickTimer) { + self.clearTimeout(this._tickTimer); + this._tickTimer = null; + return true; + } + + return false; + } + /** + * Will call the subclass doTick implementation in this main loop tick + * or in the next one (via setTimeout(,0)) in case it has already been called + * in this tick (in case this is a re-entrant call). + */ + ; + + _proto.tick = function tick() { + this._tickCallCount++; + + if (this._tickCallCount === 1) { + this.doTick(); // re-entrant call to tick from previous doTick call stack + // -> schedule a call on the next main loop iteration to process this task processing request + + if (this._tickCallCount > 1) { + // make sure only one timer exists at any time at max + this.tickImmediate(); + } + + this._tickCallCount = 0; + } + }; + + _proto.tickImmediate = function tickImmediate() { + this.clearNextTick(); + this._tickTimer = self.setTimeout(this._boundTick, 0); + } + /** + * For subclass to implement task logic + * @abstract + */ + ; + + _proto.doTick = function doTick() {}; + + return TaskLoop; +}(); + + + +/***/ }), + +/***/ "./src/types/cmcd.ts": +/*!***************************!*\ + !*** ./src/types/cmcd.ts ***! + \***************************/ +/*! exports provided: CMCDVersion, CMCDObjectType, CMCDStreamingFormat, CMCDStreamType */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CMCDVersion", function() { return CMCDVersion; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CMCDObjectType", function() { return CMCDObjectType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CMCDStreamingFormat", function() { return CMCDStreamingFormat; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CMCDStreamType", function() { return CMCDStreamType; }); +/** + * CMCD spec version + */ +var CMCDVersion = 1; +/** + * CMCD Object Type + */ + +var CMCDObjectType; +/** + * CMCD Streaming Format + */ + +(function (CMCDObjectType) { + CMCDObjectType["MANIFEST"] = "m"; + CMCDObjectType["AUDIO"] = "a"; + CMCDObjectType["VIDEO"] = "v"; + CMCDObjectType["MUXED"] = "av"; + CMCDObjectType["INIT"] = "i"; + CMCDObjectType["CAPTION"] = "c"; + CMCDObjectType["TIMED_TEXT"] = "tt"; + CMCDObjectType["KEY"] = "k"; + CMCDObjectType["OTHER"] = "o"; +})(CMCDObjectType || (CMCDObjectType = {})); + +var CMCDStreamingFormat; +/** + * CMCD Streaming Type + */ + +(function (CMCDStreamingFormat) { + CMCDStreamingFormat["DASH"] = "d"; + CMCDStreamingFormat["HLS"] = "h"; + CMCDStreamingFormat["SMOOTH"] = "s"; + CMCDStreamingFormat["OTHER"] = "o"; +})(CMCDStreamingFormat || (CMCDStreamingFormat = {})); + +var CMCDStreamType; +/** + * CMCD Headers + */ + +(function (CMCDStreamType) { + CMCDStreamType["VOD"] = "v"; + CMCDStreamType["LIVE"] = "l"; +})(CMCDStreamType || (CMCDStreamType = {})); + +/***/ }), + +/***/ "./src/types/level.ts": +/*!****************************!*\ + !*** ./src/types/level.ts ***! + \****************************/ +/*! exports provided: HlsSkip, getSkipValue, HlsUrlParameters, Level */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HlsSkip", function() { return HlsSkip; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSkipValue", function() { return getSkipValue; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HlsUrlParameters", function() { return HlsUrlParameters; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Level", function() { return Level; }); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var HlsSkip; + +(function (HlsSkip) { + HlsSkip["No"] = ""; + HlsSkip["Yes"] = "YES"; + HlsSkip["v2"] = "v2"; +})(HlsSkip || (HlsSkip = {})); + +function getSkipValue(details, msn) { + var canSkipUntil = details.canSkipUntil, + canSkipDateRanges = details.canSkipDateRanges, + endSN = details.endSN; + var snChangeGoal = msn !== undefined ? msn - endSN : 0; + + if (canSkipUntil && snChangeGoal < canSkipUntil) { + if (canSkipDateRanges) { + return HlsSkip.v2; + } + + return HlsSkip.Yes; + } + + return HlsSkip.No; +} +var HlsUrlParameters = /*#__PURE__*/function () { + function HlsUrlParameters(msn, part, skip) { + this.msn = void 0; + this.part = void 0; + this.skip = void 0; + this.msn = msn; + this.part = part; + this.skip = skip; + } + + var _proto = HlsUrlParameters.prototype; + + _proto.addDirectives = function addDirectives(uri) { + var url = new self.URL(uri); + + if (this.msn !== undefined) { + url.searchParams.set('_HLS_msn', this.msn.toString()); + } + + if (this.part !== undefined) { + url.searchParams.set('_HLS_part', this.part.toString()); + } + + if (this.skip) { + url.searchParams.set('_HLS_skip', this.skip); + } + + return url.toString(); + }; + + return HlsUrlParameters; +}(); +var Level = /*#__PURE__*/function () { + function Level(data) { + this.attrs = void 0; + this.audioCodec = void 0; + this.bitrate = void 0; + this.codecSet = void 0; + this.height = void 0; + this.id = void 0; + this.name = void 0; + this.videoCodec = void 0; + this.width = void 0; + this.unknownCodecs = void 0; + this.audioGroupIds = void 0; + this.details = void 0; + this.fragmentError = 0; + this.loadError = 0; + this.loaded = void 0; + this.realBitrate = 0; + this.textGroupIds = void 0; + this.url = void 0; + this._urlId = 0; + this.url = [data.url]; + this.attrs = data.attrs; + this.bitrate = data.bitrate; + + if (data.details) { + this.details = data.details; + } + + this.id = data.id || 0; + this.name = data.name; + this.width = data.width || 0; + this.height = data.height || 0; + this.audioCodec = data.audioCodec; + this.videoCodec = data.videoCodec; + this.unknownCodecs = data.unknownCodecs; + this.codecSet = [data.videoCodec, data.audioCodec].filter(function (c) { + return c; + }).join(',').replace(/\.[^.,]+/g, ''); + } + + _createClass(Level, [{ + key: "maxBitrate", + get: function get() { + return Math.max(this.realBitrate, this.bitrate); + } + }, { + key: "uri", + get: function get() { + return this.url[this._urlId] || ''; + } + }, { + key: "urlId", + get: function get() { + return this._urlId; + }, + set: function set(value) { + var newValue = value % this.url.length; + + if (this._urlId !== newValue) { + this.details = undefined; + this._urlId = newValue; + } + } + }]); + + return Level; +}(); + +/***/ }), + +/***/ "./src/types/loader.ts": +/*!*****************************!*\ + !*** ./src/types/loader.ts ***! + \*****************************/ +/*! exports provided: PlaylistContextType, PlaylistLevelType */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlaylistContextType", function() { return PlaylistContextType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlaylistLevelType", function() { return PlaylistLevelType; }); +var PlaylistContextType; + +(function (PlaylistContextType) { + PlaylistContextType["MANIFEST"] = "manifest"; + PlaylistContextType["LEVEL"] = "level"; + PlaylistContextType["AUDIO_TRACK"] = "audioTrack"; + PlaylistContextType["SUBTITLE_TRACK"] = "subtitleTrack"; +})(PlaylistContextType || (PlaylistContextType = {})); + +var PlaylistLevelType; + +(function (PlaylistLevelType) { + PlaylistLevelType["MAIN"] = "main"; + PlaylistLevelType["AUDIO"] = "audio"; + PlaylistLevelType["SUBTITLE"] = "subtitle"; +})(PlaylistLevelType || (PlaylistLevelType = {})); + +/***/ }), + +/***/ "./src/types/transmuxer.ts": +/*!*********************************!*\ + !*** ./src/types/transmuxer.ts ***! + \*********************************/ +/*! exports provided: ChunkMetadata */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ChunkMetadata", function() { return ChunkMetadata; }); +var ChunkMetadata = function ChunkMetadata(level, sn, id, size, part, partial) { + if (size === void 0) { + size = 0; + } + + if (part === void 0) { + part = -1; + } + + if (partial === void 0) { + partial = false; + } + + this.level = void 0; + this.sn = void 0; + this.part = void 0; + this.id = void 0; + this.size = void 0; + this.partial = void 0; + this.transmuxing = getNewPerformanceTiming(); + this.buffering = { + audio: getNewPerformanceTiming(), + video: getNewPerformanceTiming(), + audiovideo: getNewPerformanceTiming() + }; + this.level = level; + this.sn = sn; + this.id = id; + this.size = size; + this.part = part; + this.partial = partial; +}; + +function getNewPerformanceTiming() { + return { + start: 0, + executeStart: 0, + executeEnd: 0, + end: 0 + }; +} + +/***/ }), + +/***/ "./src/utils/attr-list.ts": +/*!********************************!*\ + !*** ./src/utils/attr-list.ts ***! + \********************************/ +/*! exports provided: AttrList */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttrList", function() { return AttrList; }); +var DECIMAL_RESOLUTION_REGEX = /^(\d+)x(\d+)$/; // eslint-disable-line no-useless-escape + +var ATTR_LIST_REGEX = /\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g; // eslint-disable-line no-useless-escape +// adapted from https://github.com/kanongil/node-m3u8parse/blob/master/attrlist.js + +var AttrList = /*#__PURE__*/function () { + function AttrList(attrs) { + if (typeof attrs === 'string') { + attrs = AttrList.parseAttrList(attrs); + } + + for (var attr in attrs) { + if (attrs.hasOwnProperty(attr)) { + this[attr] = attrs[attr]; + } + } + } + + var _proto = AttrList.prototype; + + _proto.decimalInteger = function decimalInteger(attrName) { + var intValue = parseInt(this[attrName], 10); + + if (intValue > Number.MAX_SAFE_INTEGER) { + return Infinity; + } + + return intValue; + }; + + _proto.hexadecimalInteger = function hexadecimalInteger(attrName) { + if (this[attrName]) { + var stringValue = (this[attrName] || '0x').slice(2); + stringValue = (stringValue.length & 1 ? '0' : '') + stringValue; + var value = new Uint8Array(stringValue.length / 2); + + for (var i = 0; i < stringValue.length / 2; i++) { + value[i] = parseInt(stringValue.slice(i * 2, i * 2 + 2), 16); + } + + return value; + } else { + return null; + } + }; + + _proto.hexadecimalIntegerAsNumber = function hexadecimalIntegerAsNumber(attrName) { + var intValue = parseInt(this[attrName], 16); + + if (intValue > Number.MAX_SAFE_INTEGER) { + return Infinity; + } + + return intValue; + }; + + _proto.decimalFloatingPoint = function decimalFloatingPoint(attrName) { + return parseFloat(this[attrName]); + }; + + _proto.optionalFloat = function optionalFloat(attrName, defaultValue) { + var value = this[attrName]; + return value ? parseFloat(value) : defaultValue; + }; + + _proto.enumeratedString = function enumeratedString(attrName) { + return this[attrName]; + }; + + _proto.bool = function bool(attrName) { + return this[attrName] === 'YES'; + }; + + _proto.decimalResolution = function decimalResolution(attrName) { + var res = DECIMAL_RESOLUTION_REGEX.exec(this[attrName]); + + if (res === null) { + return undefined; + } + + return { + width: parseInt(res[1], 10), + height: parseInt(res[2], 10) + }; + }; + + AttrList.parseAttrList = function parseAttrList(input) { + var match; + var attrs = {}; + var quote = '"'; + ATTR_LIST_REGEX.lastIndex = 0; + + while ((match = ATTR_LIST_REGEX.exec(input)) !== null) { + var value = match[2]; + + if (value.indexOf(quote) === 0 && value.lastIndexOf(quote) === value.length - 1) { + value = value.slice(1, -1); + } + + attrs[match[1]] = value; + } + + return attrs; + }; + + return AttrList; +}(); + +/***/ }), + +/***/ "./src/utils/binary-search.ts": +/*!************************************!*\ + !*** ./src/utils/binary-search.ts ***! + \************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +var BinarySearch = { + /** + * Searches for an item in an array which matches a certain condition. + * This requires the condition to only match one item in the array, + * and for the array to be ordered. + * + * @param {Array<T>} list The array to search. + * @param {BinarySearchComparison<T>} comparisonFn + * Called and provided a candidate item as the first argument. + * Should return: + * > -1 if the item should be located at a lower index than the provided item. + * > 1 if the item should be located at a higher index than the provided item. + * > 0 if the item is the item you're looking for. + * + * @return {T | null} The object if it is found or null otherwise. + */ + search: function search(list, comparisonFn) { + var minIndex = 0; + var maxIndex = list.length - 1; + var currentIndex = null; + var currentElement = null; + + while (minIndex <= maxIndex) { + currentIndex = (minIndex + maxIndex) / 2 | 0; + currentElement = list[currentIndex]; + var comparisonResult = comparisonFn(currentElement); + + if (comparisonResult > 0) { + minIndex = currentIndex + 1; + } else if (comparisonResult < 0) { + maxIndex = currentIndex - 1; + } else { + return currentElement; + } + } + + return null; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (BinarySearch); + +/***/ }), + +/***/ "./src/utils/buffer-helper.ts": +/*!************************************!*\ + !*** ./src/utils/buffer-helper.ts ***! + \************************************/ +/*! exports provided: BufferHelper */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BufferHelper", function() { return BufferHelper; }); +/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./logger */ "./src/utils/logger.ts"); +/** + * @module BufferHelper + * + * Providing methods dealing with buffer length retrieval for example. + * + * In general, a helper around HTML5 MediaElement TimeRanges gathered from `buffered` property. + * + * Also @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered + */ + +var noopBuffered = { + length: 0, + start: function start() { + return 0; + }, + end: function end() { + return 0; + } +}; +var BufferHelper = /*#__PURE__*/function () { + function BufferHelper() {} + + /** + * Return true if `media`'s buffered include `position` + * @param {Bufferable} media + * @param {number} position + * @returns {boolean} + */ + BufferHelper.isBuffered = function isBuffered(media, position) { + try { + if (media) { + var buffered = BufferHelper.getBuffered(media); + + for (var i = 0; i < buffered.length; i++) { + if (position >= buffered.start(i) && position <= buffered.end(i)) { + return true; + } + } + } + } catch (error) {// this is to catch + // InvalidStateError: Failed to read the 'buffered' property from 'SourceBuffer': + // This SourceBuffer has been removed from the parent media source + } + + return false; + }; + + BufferHelper.bufferInfo = function bufferInfo(media, pos, maxHoleDuration) { + try { + if (media) { + var vbuffered = BufferHelper.getBuffered(media); + var buffered = []; + var i; + + for (i = 0; i < vbuffered.length; i++) { + buffered.push({ + start: vbuffered.start(i), + end: vbuffered.end(i) + }); + } + + return this.bufferedInfo(buffered, pos, maxHoleDuration); + } + } catch (error) {// this is to catch + // InvalidStateError: Failed to read the 'buffered' property from 'SourceBuffer': + // This SourceBuffer has been removed from the parent media source + } + + return { + len: 0, + start: pos, + end: pos, + nextStart: undefined + }; + }; + + BufferHelper.bufferedInfo = function bufferedInfo(buffered, pos, maxHoleDuration) { + pos = Math.max(0, pos); // sort on buffer.start/smaller end (IE does not always return sorted buffered range) + + buffered.sort(function (a, b) { + var diff = a.start - b.start; + + if (diff) { + return diff; + } else { + return b.end - a.end; + } + }); + var buffered2 = []; + + if (maxHoleDuration) { + // there might be some small holes between buffer time range + // consider that holes smaller than maxHoleDuration are irrelevant and build another + // buffer time range representations that discards those holes + for (var i = 0; i < buffered.length; i++) { + var buf2len = buffered2.length; + + if (buf2len) { + var buf2end = buffered2[buf2len - 1].end; // if small hole (value between 0 or maxHoleDuration ) or overlapping (negative) + + if (buffered[i].start - buf2end < maxHoleDuration) { + // merge overlapping time ranges + // update lastRange.end only if smaller than item.end + // e.g. [ 1, 15] with [ 2,8] => [ 1,15] (no need to modify lastRange.end) + // whereas [ 1, 8] with [ 2,15] => [ 1,15] ( lastRange should switch from [1,8] to [1,15]) + if (buffered[i].end > buf2end) { + buffered2[buf2len - 1].end = buffered[i].end; + } + } else { + // big hole + buffered2.push(buffered[i]); + } + } else { + // first value + buffered2.push(buffered[i]); + } + } + } else { + buffered2 = buffered; + } + + var bufferLen = 0; // bufferStartNext can possibly be undefined based on the conditional logic below + + var bufferStartNext; // bufferStart and bufferEnd are buffer boundaries around current video position + + var bufferStart = pos; + var bufferEnd = pos; + + for (var _i = 0; _i < buffered2.length; _i++) { + var start = buffered2[_i].start; + var end = buffered2[_i].end; // logger.log('buf start/end:' + buffered.start(i) + '/' + buffered.end(i)); + + if (pos + maxHoleDuration >= start && pos < end) { + // play position is inside this buffer TimeRange, retrieve end of buffer position and buffer length + bufferStart = start; + bufferEnd = end; + bufferLen = bufferEnd - pos; + } else if (pos + maxHoleDuration < start) { + bufferStartNext = start; + break; + } + } + + return { + len: bufferLen, + start: bufferStart || 0, + end: bufferEnd || 0, + nextStart: bufferStartNext + }; + } + /** + * Safe method to get buffered property. + * SourceBuffer.buffered may throw if SourceBuffer is removed from it's MediaSource + */ + ; + + BufferHelper.getBuffered = function getBuffered(media) { + try { + return media.buffered; + } catch (e) { + _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].log('failed to get media.buffered', e); + return noopBuffered; + } + }; + + return BufferHelper; +}(); + +/***/ }), + +/***/ "./src/utils/cea-608-parser.ts": +/*!*************************************!*\ + !*** ./src/utils/cea-608-parser.ts ***! + \*************************************/ +/*! exports provided: Row, CaptionScreen, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Row", function() { return Row; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CaptionScreen", function() { return CaptionScreen; }); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); + +/** + * + * This code was ported from the dash.js project at: + * https://github.com/Dash-Industry-Forum/dash.js/blob/development/externals/cea608-parser.js + * https://github.com/Dash-Industry-Forum/dash.js/commit/8269b26a761e0853bb21d78780ed945144ecdd4d#diff-71bc295a2d6b6b7093a1d3290d53a4b2 + * + * The original copyright appears below: + * + * The copyright in this software is being made available under the BSD License, + * included below. This software may be subject to other third party and contributor + * rights, including patent rights, and no such rights are granted under this license. + * + * Copyright (c) 2015-2016, DASH Industry Forum. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * 2. Neither the name of Dash Industry Forum nor the names of its + * contributors may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Exceptions from regular ASCII. CodePoints are mapped to UTF-16 codes + */ + +var specialCea608CharsCodes = { + 0x2a: 0xe1, + // lowercase a, acute accent + 0x5c: 0xe9, + // lowercase e, acute accent + 0x5e: 0xed, + // lowercase i, acute accent + 0x5f: 0xf3, + // lowercase o, acute accent + 0x60: 0xfa, + // lowercase u, acute accent + 0x7b: 0xe7, + // lowercase c with cedilla + 0x7c: 0xf7, + // division symbol + 0x7d: 0xd1, + // uppercase N tilde + 0x7e: 0xf1, + // lowercase n tilde + 0x7f: 0x2588, + // Full block + // THIS BLOCK INCLUDES THE 16 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS + // THAT COME FROM HI BYTE=0x11 AND LOW BETWEEN 0x30 AND 0x3F + // THIS MEANS THAT \x50 MUST BE ADDED TO THE VALUES + 0x80: 0xae, + // Registered symbol (R) + 0x81: 0xb0, + // degree sign + 0x82: 0xbd, + // 1/2 symbol + 0x83: 0xbf, + // Inverted (open) question mark + 0x84: 0x2122, + // Trademark symbol (TM) + 0x85: 0xa2, + // Cents symbol + 0x86: 0xa3, + // Pounds sterling + 0x87: 0x266a, + // Music 8'th note + 0x88: 0xe0, + // lowercase a, grave accent + 0x89: 0x20, + // transparent space (regular) + 0x8a: 0xe8, + // lowercase e, grave accent + 0x8b: 0xe2, + // lowercase a, circumflex accent + 0x8c: 0xea, + // lowercase e, circumflex accent + 0x8d: 0xee, + // lowercase i, circumflex accent + 0x8e: 0xf4, + // lowercase o, circumflex accent + 0x8f: 0xfb, + // lowercase u, circumflex accent + // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS + // THAT COME FROM HI BYTE=0x12 AND LOW BETWEEN 0x20 AND 0x3F + 0x90: 0xc1, + // capital letter A with acute + 0x91: 0xc9, + // capital letter E with acute + 0x92: 0xd3, + // capital letter O with acute + 0x93: 0xda, + // capital letter U with acute + 0x94: 0xdc, + // capital letter U with diaresis + 0x95: 0xfc, + // lowercase letter U with diaeresis + 0x96: 0x2018, + // opening single quote + 0x97: 0xa1, + // inverted exclamation mark + 0x98: 0x2a, + // asterisk + 0x99: 0x2019, + // closing single quote + 0x9a: 0x2501, + // box drawings heavy horizontal + 0x9b: 0xa9, + // copyright sign + 0x9c: 0x2120, + // Service mark + 0x9d: 0x2022, + // (round) bullet + 0x9e: 0x201c, + // Left double quotation mark + 0x9f: 0x201d, + // Right double quotation mark + 0xa0: 0xc0, + // uppercase A, grave accent + 0xa1: 0xc2, + // uppercase A, circumflex + 0xa2: 0xc7, + // uppercase C with cedilla + 0xa3: 0xc8, + // uppercase E, grave accent + 0xa4: 0xca, + // uppercase E, circumflex + 0xa5: 0xcb, + // capital letter E with diaresis + 0xa6: 0xeb, + // lowercase letter e with diaresis + 0xa7: 0xce, + // uppercase I, circumflex + 0xa8: 0xcf, + // uppercase I, with diaresis + 0xa9: 0xef, + // lowercase i, with diaresis + 0xaa: 0xd4, + // uppercase O, circumflex + 0xab: 0xd9, + // uppercase U, grave accent + 0xac: 0xf9, + // lowercase u, grave accent + 0xad: 0xdb, + // uppercase U, circumflex + 0xae: 0xab, + // left-pointing double angle quotation mark + 0xaf: 0xbb, + // right-pointing double angle quotation mark + // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS + // THAT COME FROM HI BYTE=0x13 AND LOW BETWEEN 0x20 AND 0x3F + 0xb0: 0xc3, + // Uppercase A, tilde + 0xb1: 0xe3, + // Lowercase a, tilde + 0xb2: 0xcd, + // Uppercase I, acute accent + 0xb3: 0xcc, + // Uppercase I, grave accent + 0xb4: 0xec, + // Lowercase i, grave accent + 0xb5: 0xd2, + // Uppercase O, grave accent + 0xb6: 0xf2, + // Lowercase o, grave accent + 0xb7: 0xd5, + // Uppercase O, tilde + 0xb8: 0xf5, + // Lowercase o, tilde + 0xb9: 0x7b, + // Open curly brace + 0xba: 0x7d, + // Closing curly brace + 0xbb: 0x5c, + // Backslash + 0xbc: 0x5e, + // Caret + 0xbd: 0x5f, + // Underscore + 0xbe: 0x7c, + // Pipe (vertical line) + 0xbf: 0x223c, + // Tilde operator + 0xc0: 0xc4, + // Uppercase A, umlaut + 0xc1: 0xe4, + // Lowercase A, umlaut + 0xc2: 0xd6, + // Uppercase O, umlaut + 0xc3: 0xf6, + // Lowercase o, umlaut + 0xc4: 0xdf, + // Esszett (sharp S) + 0xc5: 0xa5, + // Yen symbol + 0xc6: 0xa4, + // Generic currency sign + 0xc7: 0x2503, + // Box drawings heavy vertical + 0xc8: 0xc5, + // Uppercase A, ring + 0xc9: 0xe5, + // Lowercase A, ring + 0xca: 0xd8, + // Uppercase O, stroke + 0xcb: 0xf8, + // Lowercase o, strok + 0xcc: 0x250f, + // Box drawings heavy down and right + 0xcd: 0x2513, + // Box drawings heavy down and left + 0xce: 0x2517, + // Box drawings heavy up and right + 0xcf: 0x251b // Box drawings heavy up and left + +}; +/** + * Utils + */ + +var getCharForByte = function getCharForByte(_byte) { + var charCode = _byte; + + if (specialCea608CharsCodes.hasOwnProperty(_byte)) { + charCode = specialCea608CharsCodes[_byte]; + } + + return String.fromCharCode(charCode); +}; + +var NR_ROWS = 15; +var NR_COLS = 100; // Tables to look up row from PAC data + +var rowsLowCh1 = { + 0x11: 1, + 0x12: 3, + 0x15: 5, + 0x16: 7, + 0x17: 9, + 0x10: 11, + 0x13: 12, + 0x14: 14 +}; +var rowsHighCh1 = { + 0x11: 2, + 0x12: 4, + 0x15: 6, + 0x16: 8, + 0x17: 10, + 0x13: 13, + 0x14: 15 +}; +var rowsLowCh2 = { + 0x19: 1, + 0x1a: 3, + 0x1d: 5, + 0x1e: 7, + 0x1f: 9, + 0x18: 11, + 0x1b: 12, + 0x1c: 14 +}; +var rowsHighCh2 = { + 0x19: 2, + 0x1a: 4, + 0x1d: 6, + 0x1e: 8, + 0x1f: 10, + 0x1b: 13, + 0x1c: 15 +}; +var backgroundColors = ['white', 'green', 'blue', 'cyan', 'red', 'yellow', 'magenta', 'black', 'transparent']; +var VerboseLevel; + +(function (VerboseLevel) { + VerboseLevel[VerboseLevel["ERROR"] = 0] = "ERROR"; + VerboseLevel[VerboseLevel["TEXT"] = 1] = "TEXT"; + VerboseLevel[VerboseLevel["WARNING"] = 2] = "WARNING"; + VerboseLevel[VerboseLevel["INFO"] = 2] = "INFO"; + VerboseLevel[VerboseLevel["DEBUG"] = 3] = "DEBUG"; + VerboseLevel[VerboseLevel["DATA"] = 3] = "DATA"; +})(VerboseLevel || (VerboseLevel = {})); + +var CaptionsLogger = /*#__PURE__*/function () { + function CaptionsLogger() { + this.time = null; + this.verboseLevel = VerboseLevel.ERROR; + } + + var _proto = CaptionsLogger.prototype; + + _proto.log = function log(severity, msg) { + if (this.verboseLevel >= severity) { + _utils_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].log(this.time + " [" + severity + "] " + msg); + } + }; + + return CaptionsLogger; +}(); + +var numArrayToHexArray = function numArrayToHexArray(numArray) { + var hexArray = []; + + for (var j = 0; j < numArray.length; j++) { + hexArray.push(numArray[j].toString(16)); + } + + return hexArray; +}; + +var PenState = /*#__PURE__*/function () { + function PenState(foreground, underline, italics, background, flash) { + this.foreground = void 0; + this.underline = void 0; + this.italics = void 0; + this.background = void 0; + this.flash = void 0; + this.foreground = foreground || 'white'; + this.underline = underline || false; + this.italics = italics || false; + this.background = background || 'black'; + this.flash = flash || false; + } + + var _proto2 = PenState.prototype; + + _proto2.reset = function reset() { + this.foreground = 'white'; + this.underline = false; + this.italics = false; + this.background = 'black'; + this.flash = false; + }; + + _proto2.setStyles = function setStyles(styles) { + var attribs = ['foreground', 'underline', 'italics', 'background', 'flash']; + + for (var i = 0; i < attribs.length; i++) { + var style = attribs[i]; + + if (styles.hasOwnProperty(style)) { + this[style] = styles[style]; + } + } + }; + + _proto2.isDefault = function isDefault() { + return this.foreground === 'white' && !this.underline && !this.italics && this.background === 'black' && !this.flash; + }; + + _proto2.equals = function equals(other) { + return this.foreground === other.foreground && this.underline === other.underline && this.italics === other.italics && this.background === other.background && this.flash === other.flash; + }; + + _proto2.copy = function copy(newPenState) { + this.foreground = newPenState.foreground; + this.underline = newPenState.underline; + this.italics = newPenState.italics; + this.background = newPenState.background; + this.flash = newPenState.flash; + }; + + _proto2.toString = function toString() { + return 'color=' + this.foreground + ', underline=' + this.underline + ', italics=' + this.italics + ', background=' + this.background + ', flash=' + this.flash; + }; + + return PenState; +}(); +/** + * Unicode character with styling and background. + * @constructor + */ + + +var StyledUnicodeChar = /*#__PURE__*/function () { + function StyledUnicodeChar(uchar, foreground, underline, italics, background, flash) { + this.uchar = void 0; + this.penState = void 0; + this.uchar = uchar || ' '; // unicode character + + this.penState = new PenState(foreground, underline, italics, background, flash); + } + + var _proto3 = StyledUnicodeChar.prototype; + + _proto3.reset = function reset() { + this.uchar = ' '; + this.penState.reset(); + }; + + _proto3.setChar = function setChar(uchar, newPenState) { + this.uchar = uchar; + this.penState.copy(newPenState); + }; + + _proto3.setPenState = function setPenState(newPenState) { + this.penState.copy(newPenState); + }; + + _proto3.equals = function equals(other) { + return this.uchar === other.uchar && this.penState.equals(other.penState); + }; + + _proto3.copy = function copy(newChar) { + this.uchar = newChar.uchar; + this.penState.copy(newChar.penState); + }; + + _proto3.isEmpty = function isEmpty() { + return this.uchar === ' ' && this.penState.isDefault(); + }; + + return StyledUnicodeChar; +}(); +/** + * CEA-608 row consisting of NR_COLS instances of StyledUnicodeChar. + * @constructor + */ + + +var Row = /*#__PURE__*/function () { + function Row(logger) { + this.chars = void 0; + this.pos = void 0; + this.currPenState = void 0; + this.cueStartTime = void 0; + this.logger = void 0; + this.chars = []; + + for (var i = 0; i < NR_COLS; i++) { + this.chars.push(new StyledUnicodeChar()); + } + + this.logger = logger; + this.pos = 0; + this.currPenState = new PenState(); + } + + var _proto4 = Row.prototype; + + _proto4.equals = function equals(other) { + var equal = true; + + for (var i = 0; i < NR_COLS; i++) { + if (!this.chars[i].equals(other.chars[i])) { + equal = false; + break; + } + } + + return equal; + }; + + _proto4.copy = function copy(other) { + for (var i = 0; i < NR_COLS; i++) { + this.chars[i].copy(other.chars[i]); + } + }; + + _proto4.isEmpty = function isEmpty() { + var empty = true; + + for (var i = 0; i < NR_COLS; i++) { + if (!this.chars[i].isEmpty()) { + empty = false; + break; + } + } + + return empty; + } + /** + * Set the cursor to a valid column. + */ + ; + + _proto4.setCursor = function setCursor(absPos) { + if (this.pos !== absPos) { + this.pos = absPos; + } + + if (this.pos < 0) { + this.logger.log(VerboseLevel.DEBUG, 'Negative cursor position ' + this.pos); + this.pos = 0; + } else if (this.pos > NR_COLS) { + this.logger.log(VerboseLevel.DEBUG, 'Too large cursor position ' + this.pos); + this.pos = NR_COLS; + } + } + /** + * Move the cursor relative to current position. + */ + ; + + _proto4.moveCursor = function moveCursor(relPos) { + var newPos = this.pos + relPos; + + if (relPos > 1) { + for (var i = this.pos + 1; i < newPos + 1; i++) { + this.chars[i].setPenState(this.currPenState); + } + } + + this.setCursor(newPos); + } + /** + * Backspace, move one step back and clear character. + */ + ; + + _proto4.backSpace = function backSpace() { + this.moveCursor(-1); + this.chars[this.pos].setChar(' ', this.currPenState); + }; + + _proto4.insertChar = function insertChar(_byte2) { + if (_byte2 >= 0x90) { + // Extended char + this.backSpace(); + } + + var _char = getCharForByte(_byte2); + + if (this.pos >= NR_COLS) { + this.logger.log(VerboseLevel.ERROR, 'Cannot insert ' + _byte2.toString(16) + ' (' + _char + ') at position ' + this.pos + '. Skipping it!'); + return; + } + + this.chars[this.pos].setChar(_char, this.currPenState); + this.moveCursor(1); + }; + + _proto4.clearFromPos = function clearFromPos(startPos) { + var i; + + for (i = startPos; i < NR_COLS; i++) { + this.chars[i].reset(); + } + }; + + _proto4.clear = function clear() { + this.clearFromPos(0); + this.pos = 0; + this.currPenState.reset(); + }; + + _proto4.clearToEndOfRow = function clearToEndOfRow() { + this.clearFromPos(this.pos); + }; + + _proto4.getTextString = function getTextString() { + var chars = []; + var empty = true; + + for (var i = 0; i < NR_COLS; i++) { + var _char2 = this.chars[i].uchar; + + if (_char2 !== ' ') { + empty = false; + } + + chars.push(_char2); + } + + if (empty) { + return ''; + } else { + return chars.join(''); + } + }; + + _proto4.setPenStyles = function setPenStyles(styles) { + this.currPenState.setStyles(styles); + var currChar = this.chars[this.pos]; + currChar.setPenState(this.currPenState); + }; + + return Row; +}(); +/** + * Keep a CEA-608 screen of 32x15 styled characters + * @constructor + */ + +var CaptionScreen = /*#__PURE__*/function () { + function CaptionScreen(logger) { + this.rows = void 0; + this.currRow = void 0; + this.nrRollUpRows = void 0; + this.lastOutputScreen = void 0; + this.logger = void 0; + this.rows = []; + + for (var i = 0; i < NR_ROWS; i++) { + this.rows.push(new Row(logger)); + } // Note that we use zero-based numbering (0-14) + + + this.logger = logger; + this.currRow = NR_ROWS - 1; + this.nrRollUpRows = null; + this.lastOutputScreen = null; + this.reset(); + } + + var _proto5 = CaptionScreen.prototype; + + _proto5.reset = function reset() { + for (var i = 0; i < NR_ROWS; i++) { + this.rows[i].clear(); + } + + this.currRow = NR_ROWS - 1; + }; + + _proto5.equals = function equals(other) { + var equal = true; + + for (var i = 0; i < NR_ROWS; i++) { + if (!this.rows[i].equals(other.rows[i])) { + equal = false; + break; + } + } + + return equal; + }; + + _proto5.copy = function copy(other) { + for (var i = 0; i < NR_ROWS; i++) { + this.rows[i].copy(other.rows[i]); + } + }; + + _proto5.isEmpty = function isEmpty() { + var empty = true; + + for (var i = 0; i < NR_ROWS; i++) { + if (!this.rows[i].isEmpty()) { + empty = false; + break; + } + } + + return empty; + }; + + _proto5.backSpace = function backSpace() { + var row = this.rows[this.currRow]; + row.backSpace(); + }; + + _proto5.clearToEndOfRow = function clearToEndOfRow() { + var row = this.rows[this.currRow]; + row.clearToEndOfRow(); + } + /** + * Insert a character (without styling) in the current row. + */ + ; + + _proto5.insertChar = function insertChar(_char3) { + var row = this.rows[this.currRow]; + row.insertChar(_char3); + }; + + _proto5.setPen = function setPen(styles) { + var row = this.rows[this.currRow]; + row.setPenStyles(styles); + }; + + _proto5.moveCursor = function moveCursor(relPos) { + var row = this.rows[this.currRow]; + row.moveCursor(relPos); + }; + + _proto5.setCursor = function setCursor(absPos) { + this.logger.log(VerboseLevel.INFO, 'setCursor: ' + absPos); + var row = this.rows[this.currRow]; + row.setCursor(absPos); + }; + + _proto5.setPAC = function setPAC(pacData) { + this.logger.log(VerboseLevel.INFO, 'pacData = ' + JSON.stringify(pacData)); + var newRow = pacData.row - 1; + + if (this.nrRollUpRows && newRow < this.nrRollUpRows - 1) { + newRow = this.nrRollUpRows - 1; + } // Make sure this only affects Roll-up Captions by checking this.nrRollUpRows + + + if (this.nrRollUpRows && this.currRow !== newRow) { + // clear all rows first + for (var i = 0; i < NR_ROWS; i++) { + this.rows[i].clear(); + } // Copy this.nrRollUpRows rows from lastOutputScreen and place it in the newRow location + // topRowIndex - the start of rows to copy (inclusive index) + + + var topRowIndex = this.currRow + 1 - this.nrRollUpRows; // We only copy if the last position was already shown. + // We use the cueStartTime value to check this. + + var lastOutputScreen = this.lastOutputScreen; + + if (lastOutputScreen) { + var prevLineTime = lastOutputScreen.rows[topRowIndex].cueStartTime; + var time = this.logger.time; + + if (prevLineTime && time !== null && prevLineTime < time) { + for (var _i = 0; _i < this.nrRollUpRows; _i++) { + this.rows[newRow - this.nrRollUpRows + _i + 1].copy(lastOutputScreen.rows[topRowIndex + _i]); + } + } + } + } + + this.currRow = newRow; + var row = this.rows[this.currRow]; + + if (pacData.indent !== null) { + var indent = pacData.indent; + var prevPos = Math.max(indent - 1, 0); + row.setCursor(pacData.indent); + pacData.color = row.chars[prevPos].penState.foreground; + } + + var styles = { + foreground: pacData.color, + underline: pacData.underline, + italics: pacData.italics, + background: 'black', + flash: false + }; + this.setPen(styles); + } + /** + * Set background/extra foreground, but first do back_space, and then insert space (backwards compatibility). + */ + ; + + _proto5.setBkgData = function setBkgData(bkgData) { + this.logger.log(VerboseLevel.INFO, 'bkgData = ' + JSON.stringify(bkgData)); + this.backSpace(); + this.setPen(bkgData); + this.insertChar(0x20); // Space + }; + + _proto5.setRollUpRows = function setRollUpRows(nrRows) { + this.nrRollUpRows = nrRows; + }; + + _proto5.rollUp = function rollUp() { + if (this.nrRollUpRows === null) { + this.logger.log(VerboseLevel.DEBUG, 'roll_up but nrRollUpRows not set yet'); + return; // Not properly setup + } + + this.logger.log(VerboseLevel.TEXT, this.getDisplayText()); + var topRowIndex = this.currRow + 1 - this.nrRollUpRows; + var topRow = this.rows.splice(topRowIndex, 1)[0]; + topRow.clear(); + this.rows.splice(this.currRow, 0, topRow); + this.logger.log(VerboseLevel.INFO, 'Rolling up'); // this.logger.log(VerboseLevel.TEXT, this.get_display_text()) + } + /** + * Get all non-empty rows with as unicode text. + */ + ; + + _proto5.getDisplayText = function getDisplayText(asOneRow) { + asOneRow = asOneRow || false; + var displayText = []; + var text = ''; + var rowNr = -1; + + for (var i = 0; i < NR_ROWS; i++) { + var rowText = this.rows[i].getTextString(); + + if (rowText) { + rowNr = i + 1; + + if (asOneRow) { + displayText.push('Row ' + rowNr + ": '" + rowText + "'"); + } else { + displayText.push(rowText.trim()); + } + } + } + + if (displayText.length > 0) { + if (asOneRow) { + text = '[' + displayText.join(' | ') + ']'; + } else { + text = displayText.join('\n'); + } + } + + return text; + }; + + _proto5.getTextAndFormat = function getTextAndFormat() { + return this.rows; + }; + + return CaptionScreen; +}(); // var modes = ['MODE_ROLL-UP', 'MODE_POP-ON', 'MODE_PAINT-ON', 'MODE_TEXT']; + +var Cea608Channel = /*#__PURE__*/function () { + function Cea608Channel(channelNumber, outputFilter, logger) { + this.chNr = void 0; + this.outputFilter = void 0; + this.mode = void 0; + this.verbose = void 0; + this.displayedMemory = void 0; + this.nonDisplayedMemory = void 0; + this.lastOutputScreen = void 0; + this.currRollUpRow = void 0; + this.writeScreen = void 0; + this.cueStartTime = void 0; + this.logger = void 0; + this.chNr = channelNumber; + this.outputFilter = outputFilter; + this.mode = null; + this.verbose = 0; + this.displayedMemory = new CaptionScreen(logger); + this.nonDisplayedMemory = new CaptionScreen(logger); + this.lastOutputScreen = new CaptionScreen(logger); + this.currRollUpRow = this.displayedMemory.rows[NR_ROWS - 1]; + this.writeScreen = this.displayedMemory; + this.mode = null; + this.cueStartTime = null; // Keeps track of where a cue started. + + this.logger = logger; + } + + var _proto6 = Cea608Channel.prototype; + + _proto6.reset = function reset() { + this.mode = null; + this.displayedMemory.reset(); + this.nonDisplayedMemory.reset(); + this.lastOutputScreen.reset(); + this.outputFilter.reset(); + this.currRollUpRow = this.displayedMemory.rows[NR_ROWS - 1]; + this.writeScreen = this.displayedMemory; + this.mode = null; + this.cueStartTime = null; + }; + + _proto6.getHandler = function getHandler() { + return this.outputFilter; + }; + + _proto6.setHandler = function setHandler(newHandler) { + this.outputFilter = newHandler; + }; + + _proto6.setPAC = function setPAC(pacData) { + this.writeScreen.setPAC(pacData); + }; + + _proto6.setBkgData = function setBkgData(bkgData) { + this.writeScreen.setBkgData(bkgData); + }; + + _proto6.setMode = function setMode(newMode) { + if (newMode === this.mode) { + return; + } + + this.mode = newMode; + this.logger.log(VerboseLevel.INFO, 'MODE=' + newMode); + + if (this.mode === 'MODE_POP-ON') { + this.writeScreen = this.nonDisplayedMemory; + } else { + this.writeScreen = this.displayedMemory; + this.writeScreen.reset(); + } + + if (this.mode !== 'MODE_ROLL-UP') { + this.displayedMemory.nrRollUpRows = null; + this.nonDisplayedMemory.nrRollUpRows = null; + } + + this.mode = newMode; + }; + + _proto6.insertChars = function insertChars(chars) { + for (var i = 0; i < chars.length; i++) { + this.writeScreen.insertChar(chars[i]); + } + + var screen = this.writeScreen === this.displayedMemory ? 'DISP' : 'NON_DISP'; + this.logger.log(VerboseLevel.INFO, screen + ': ' + this.writeScreen.getDisplayText(true)); + + if (this.mode === 'MODE_PAINT-ON' || this.mode === 'MODE_ROLL-UP') { + this.logger.log(VerboseLevel.TEXT, 'DISPLAYED: ' + this.displayedMemory.getDisplayText(true)); + this.outputDataUpdate(); + } + }; + + _proto6.ccRCL = function ccRCL() { + // Resume Caption Loading (switch mode to Pop On) + this.logger.log(VerboseLevel.INFO, 'RCL - Resume Caption Loading'); + this.setMode('MODE_POP-ON'); + }; + + _proto6.ccBS = function ccBS() { + // BackSpace + this.logger.log(VerboseLevel.INFO, 'BS - BackSpace'); + + if (this.mode === 'MODE_TEXT') { + return; + } + + this.writeScreen.backSpace(); + + if (this.writeScreen === this.displayedMemory) { + this.outputDataUpdate(); + } + }; + + _proto6.ccAOF = function ccAOF() {// Reserved (formerly Alarm Off) + }; + + _proto6.ccAON = function ccAON() {// Reserved (formerly Alarm On) + }; + + _proto6.ccDER = function ccDER() { + // Delete to End of Row + this.logger.log(VerboseLevel.INFO, 'DER- Delete to End of Row'); + this.writeScreen.clearToEndOfRow(); + this.outputDataUpdate(); + }; + + _proto6.ccRU = function ccRU(nrRows) { + // Roll-Up Captions-2,3,or 4 Rows + this.logger.log(VerboseLevel.INFO, 'RU(' + nrRows + ') - Roll Up'); + this.writeScreen = this.displayedMemory; + this.setMode('MODE_ROLL-UP'); + this.writeScreen.setRollUpRows(nrRows); + }; + + _proto6.ccFON = function ccFON() { + // Flash On + this.logger.log(VerboseLevel.INFO, 'FON - Flash On'); + this.writeScreen.setPen({ + flash: true + }); + }; + + _proto6.ccRDC = function ccRDC() { + // Resume Direct Captioning (switch mode to PaintOn) + this.logger.log(VerboseLevel.INFO, 'RDC - Resume Direct Captioning'); + this.setMode('MODE_PAINT-ON'); + }; + + _proto6.ccTR = function ccTR() { + // Text Restart in text mode (not supported, however) + this.logger.log(VerboseLevel.INFO, 'TR'); + this.setMode('MODE_TEXT'); + }; + + _proto6.ccRTD = function ccRTD() { + // Resume Text Display in Text mode (not supported, however) + this.logger.log(VerboseLevel.INFO, 'RTD'); + this.setMode('MODE_TEXT'); + }; + + _proto6.ccEDM = function ccEDM() { + // Erase Displayed Memory + this.logger.log(VerboseLevel.INFO, 'EDM - Erase Displayed Memory'); + this.displayedMemory.reset(); + this.outputDataUpdate(true); + }; + + _proto6.ccCR = function ccCR() { + // Carriage Return + this.logger.log(VerboseLevel.INFO, 'CR - Carriage Return'); + this.writeScreen.rollUp(); + this.outputDataUpdate(true); + }; + + _proto6.ccENM = function ccENM() { + // Erase Non-Displayed Memory + this.logger.log(VerboseLevel.INFO, 'ENM - Erase Non-displayed Memory'); + this.nonDisplayedMemory.reset(); + }; + + _proto6.ccEOC = function ccEOC() { + // End of Caption (Flip Memories) + this.logger.log(VerboseLevel.INFO, 'EOC - End Of Caption'); + + if (this.mode === 'MODE_POP-ON') { + var tmp = this.displayedMemory; + this.displayedMemory = this.nonDisplayedMemory; + this.nonDisplayedMemory = tmp; + this.writeScreen = this.nonDisplayedMemory; + this.logger.log(VerboseLevel.TEXT, 'DISP: ' + this.displayedMemory.getDisplayText()); + } + + this.outputDataUpdate(true); + }; + + _proto6.ccTO = function ccTO(nrCols) { + // Tab Offset 1,2, or 3 columns + this.logger.log(VerboseLevel.INFO, 'TO(' + nrCols + ') - Tab Offset'); + this.writeScreen.moveCursor(nrCols); + }; + + _proto6.ccMIDROW = function ccMIDROW(secondByte) { + // Parse MIDROW command + var styles = { + flash: false + }; + styles.underline = secondByte % 2 === 1; + styles.italics = secondByte >= 0x2e; + + if (!styles.italics) { + var colorIndex = Math.floor(secondByte / 2) - 0x10; + var colors = ['white', 'green', 'blue', 'cyan', 'red', 'yellow', 'magenta']; + styles.foreground = colors[colorIndex]; + } else { + styles.foreground = 'white'; + } + + this.logger.log(VerboseLevel.INFO, 'MIDROW: ' + JSON.stringify(styles)); + this.writeScreen.setPen(styles); + }; + + _proto6.outputDataUpdate = function outputDataUpdate(dispatch) { + if (dispatch === void 0) { + dispatch = false; + } + + var time = this.logger.time; + + if (time === null) { + return; + } + + if (this.outputFilter) { + if (this.cueStartTime === null && !this.displayedMemory.isEmpty()) { + // Start of a new cue + this.cueStartTime = time; + } else { + if (!this.displayedMemory.equals(this.lastOutputScreen)) { + this.outputFilter.newCue(this.cueStartTime, time, this.lastOutputScreen); + + if (dispatch && this.outputFilter.dispatchCue) { + this.outputFilter.dispatchCue(); + } + + this.cueStartTime = this.displayedMemory.isEmpty() ? null : time; + } + } + + this.lastOutputScreen.copy(this.displayedMemory); + } + }; + + _proto6.cueSplitAtTime = function cueSplitAtTime(t) { + if (this.outputFilter) { + if (!this.displayedMemory.isEmpty()) { + if (this.outputFilter.newCue) { + this.outputFilter.newCue(this.cueStartTime, t, this.displayedMemory); + } + + this.cueStartTime = t; + } + } + }; + + return Cea608Channel; +}(); + +var Cea608Parser = /*#__PURE__*/function () { + function Cea608Parser(field, out1, out2) { + this.channels = void 0; + this.currentChannel = 0; + this.cmdHistory = void 0; + this.logger = void 0; + var logger = new CaptionsLogger(); + this.channels = [null, new Cea608Channel(field, out1, logger), new Cea608Channel(field + 1, out2, logger)]; + this.cmdHistory = createCmdHistory(); + this.logger = logger; + } + + var _proto7 = Cea608Parser.prototype; + + _proto7.getHandler = function getHandler(channel) { + return this.channels[channel].getHandler(); + }; + + _proto7.setHandler = function setHandler(channel, newHandler) { + this.channels[channel].setHandler(newHandler); + } + /** + * Add data for time t in forms of list of bytes (unsigned ints). The bytes are treated as pairs. + */ + ; + + _proto7.addData = function addData(time, byteList) { + var cmdFound; + var a; + var b; + var charsFound = false; + this.logger.time = time; + + for (var i = 0; i < byteList.length; i += 2) { + a = byteList[i] & 0x7f; + b = byteList[i + 1] & 0x7f; + + if (a === 0 && b === 0) { + continue; + } else { + this.logger.log(VerboseLevel.DATA, '[' + numArrayToHexArray([byteList[i], byteList[i + 1]]) + '] -> (' + numArrayToHexArray([a, b]) + ')'); + } + + cmdFound = this.parseCmd(a, b); + + if (!cmdFound) { + cmdFound = this.parseMidrow(a, b); + } + + if (!cmdFound) { + cmdFound = this.parsePAC(a, b); + } + + if (!cmdFound) { + cmdFound = this.parseBackgroundAttributes(a, b); + } + + if (!cmdFound) { + charsFound = this.parseChars(a, b); + + if (charsFound) { + var currChNr = this.currentChannel; + + if (currChNr && currChNr > 0) { + var channel = this.channels[currChNr]; + channel.insertChars(charsFound); + } else { + this.logger.log(VerboseLevel.WARNING, 'No channel found yet. TEXT-MODE?'); + } + } + } + + if (!cmdFound && !charsFound) { + this.logger.log(VerboseLevel.WARNING, "Couldn't parse cleaned data " + numArrayToHexArray([a, b]) + ' orig: ' + numArrayToHexArray([byteList[i], byteList[i + 1]])); + } + } + } + /** + * Parse Command. + * @returns {Boolean} Tells if a command was found + */ + ; + + _proto7.parseCmd = function parseCmd(a, b) { + var cmdHistory = this.cmdHistory; + var cond1 = (a === 0x14 || a === 0x1c || a === 0x15 || a === 0x1d) && b >= 0x20 && b <= 0x2f; + var cond2 = (a === 0x17 || a === 0x1f) && b >= 0x21 && b <= 0x23; + + if (!(cond1 || cond2)) { + return false; + } + + if (hasCmdRepeated(a, b, cmdHistory)) { + setLastCmd(null, null, cmdHistory); + this.logger.log(VerboseLevel.DEBUG, 'Repeated command (' + numArrayToHexArray([a, b]) + ') is dropped'); + return true; + } + + var chNr = a === 0x14 || a === 0x15 || a === 0x17 ? 1 : 2; + var channel = this.channels[chNr]; + + if (a === 0x14 || a === 0x15 || a === 0x1c || a === 0x1d) { + if (b === 0x20) { + channel.ccRCL(); + } else if (b === 0x21) { + channel.ccBS(); + } else if (b === 0x22) { + channel.ccAOF(); + } else if (b === 0x23) { + channel.ccAON(); + } else if (b === 0x24) { + channel.ccDER(); + } else if (b === 0x25) { + channel.ccRU(2); + } else if (b === 0x26) { + channel.ccRU(3); + } else if (b === 0x27) { + channel.ccRU(4); + } else if (b === 0x28) { + channel.ccFON(); + } else if (b === 0x29) { + channel.ccRDC(); + } else if (b === 0x2a) { + channel.ccTR(); + } else if (b === 0x2b) { + channel.ccRTD(); + } else if (b === 0x2c) { + channel.ccEDM(); + } else if (b === 0x2d) { + channel.ccCR(); + } else if (b === 0x2e) { + channel.ccENM(); + } else if (b === 0x2f) { + channel.ccEOC(); + } + } else { + // a == 0x17 || a == 0x1F + channel.ccTO(b - 0x20); + } + + setLastCmd(a, b, cmdHistory); + this.currentChannel = chNr; + return true; + } + /** + * Parse midrow styling command + * @returns {Boolean} + */ + ; + + _proto7.parseMidrow = function parseMidrow(a, b) { + var chNr = 0; + + if ((a === 0x11 || a === 0x19) && b >= 0x20 && b <= 0x2f) { + if (a === 0x11) { + chNr = 1; + } else { + chNr = 2; + } + + if (chNr !== this.currentChannel) { + this.logger.log(VerboseLevel.ERROR, 'Mismatch channel in midrow parsing'); + return false; + } + + var channel = this.channels[chNr]; + + if (!channel) { + return false; + } + + channel.ccMIDROW(b); + this.logger.log(VerboseLevel.DEBUG, 'MIDROW (' + numArrayToHexArray([a, b]) + ')'); + return true; + } + + return false; + } + /** + * Parse Preable Access Codes (Table 53). + * @returns {Boolean} Tells if PAC found + */ + ; + + _proto7.parsePAC = function parsePAC(a, b) { + var row; + var cmdHistory = this.cmdHistory; + var case1 = (a >= 0x11 && a <= 0x17 || a >= 0x19 && a <= 0x1f) && b >= 0x40 && b <= 0x7f; + var case2 = (a === 0x10 || a === 0x18) && b >= 0x40 && b <= 0x5f; + + if (!(case1 || case2)) { + return false; + } + + if (hasCmdRepeated(a, b, cmdHistory)) { + setLastCmd(null, null, cmdHistory); + return true; // Repeated commands are dropped (once) + } + + var chNr = a <= 0x17 ? 1 : 2; + + if (b >= 0x40 && b <= 0x5f) { + row = chNr === 1 ? rowsLowCh1[a] : rowsLowCh2[a]; + } else { + // 0x60 <= b <= 0x7F + row = chNr === 1 ? rowsHighCh1[a] : rowsHighCh2[a]; + } + + var channel = this.channels[chNr]; + + if (!channel) { + return false; + } + + channel.setPAC(this.interpretPAC(row, b)); + setLastCmd(a, b, cmdHistory); + this.currentChannel = chNr; + return true; + } + /** + * Interpret the second byte of the pac, and return the information. + * @returns {Object} pacData with style parameters. + */ + ; + + _proto7.interpretPAC = function interpretPAC(row, _byte3) { + var pacIndex; + var pacData = { + color: null, + italics: false, + indent: null, + underline: false, + row: row + }; + + if (_byte3 > 0x5f) { + pacIndex = _byte3 - 0x60; + } else { + pacIndex = _byte3 - 0x40; + } + + pacData.underline = (pacIndex & 1) === 1; + + if (pacIndex <= 0xd) { + pacData.color = ['white', 'green', 'blue', 'cyan', 'red', 'yellow', 'magenta', 'white'][Math.floor(pacIndex / 2)]; + } else if (pacIndex <= 0xf) { + pacData.italics = true; + pacData.color = 'white'; + } else { + pacData.indent = Math.floor((pacIndex - 0x10) / 2) * 4; + } + + return pacData; // Note that row has zero offset. The spec uses 1. + } + /** + * Parse characters. + * @returns An array with 1 to 2 codes corresponding to chars, if found. null otherwise. + */ + ; + + _proto7.parseChars = function parseChars(a, b) { + var channelNr; + var charCodes = null; + var charCode1 = null; + + if (a >= 0x19) { + channelNr = 2; + charCode1 = a - 8; + } else { + channelNr = 1; + charCode1 = a; + } + + if (charCode1 >= 0x11 && charCode1 <= 0x13) { + // Special character + var oneCode; + + if (charCode1 === 0x11) { + oneCode = b + 0x50; + } else if (charCode1 === 0x12) { + oneCode = b + 0x70; + } else { + oneCode = b + 0x90; + } + + this.logger.log(VerboseLevel.INFO, "Special char '" + getCharForByte(oneCode) + "' in channel " + channelNr); + charCodes = [oneCode]; + } else if (a >= 0x20 && a <= 0x7f) { + charCodes = b === 0 ? [a] : [a, b]; + } + + if (charCodes) { + var hexCodes = numArrayToHexArray(charCodes); + this.logger.log(VerboseLevel.DEBUG, 'Char codes = ' + hexCodes.join(',')); + setLastCmd(a, b, this.cmdHistory); + } + + return charCodes; + } + /** + * Parse extended background attributes as well as new foreground color black. + * @returns {Boolean} Tells if background attributes are found + */ + ; + + _proto7.parseBackgroundAttributes = function parseBackgroundAttributes(a, b) { + var case1 = (a === 0x10 || a === 0x18) && b >= 0x20 && b <= 0x2f; + var case2 = (a === 0x17 || a === 0x1f) && b >= 0x2d && b <= 0x2f; + + if (!(case1 || case2)) { + return false; + } + + var index; + var bkgData = {}; + + if (a === 0x10 || a === 0x18) { + index = Math.floor((b - 0x20) / 2); + bkgData.background = backgroundColors[index]; + + if (b % 2 === 1) { + bkgData.background = bkgData.background + '_semi'; + } + } else if (b === 0x2d) { + bkgData.background = 'transparent'; + } else { + bkgData.foreground = 'black'; + + if (b === 0x2f) { + bkgData.underline = true; + } + } + + var chNr = a <= 0x17 ? 1 : 2; + var channel = this.channels[chNr]; + channel.setBkgData(bkgData); + setLastCmd(a, b, this.cmdHistory); + return true; + } + /** + * Reset state of parser and its channels. + */ + ; + + _proto7.reset = function reset() { + for (var i = 0; i < Object.keys(this.channels).length; i++) { + var channel = this.channels[i]; + + if (channel) { + channel.reset(); + } + } + + this.cmdHistory = createCmdHistory(); + } + /** + * Trigger the generation of a cue, and the start of a new one if displayScreens are not empty. + */ + ; + + _proto7.cueSplitAtTime = function cueSplitAtTime(t) { + for (var i = 0; i < this.channels.length; i++) { + var channel = this.channels[i]; + + if (channel) { + channel.cueSplitAtTime(t); + } + } + }; + + return Cea608Parser; +}(); + +function setLastCmd(a, b, cmdHistory) { + cmdHistory.a = a; + cmdHistory.b = b; +} + +function hasCmdRepeated(a, b, cmdHistory) { + return cmdHistory.a === a && cmdHistory.b === b; +} + +function createCmdHistory() { + return { + a: null, + b: null + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (Cea608Parser); + +/***/ }), + +/***/ "./src/utils/codecs.ts": +/*!*****************************!*\ + !*** ./src/utils/codecs.ts ***! + \*****************************/ +/*! exports provided: isCodecType, isCodecSupportedInMp4 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isCodecType", function() { return isCodecType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isCodecSupportedInMp4", function() { return isCodecSupportedInMp4; }); +// from http://mp4ra.org/codecs.html +var sampleEntryCodesISO = { + audio: { + a3ds: true, + 'ac-3': true, + 'ac-4': true, + alac: true, + alaw: true, + dra1: true, + 'dts+': true, + 'dts-': true, + dtsc: true, + dtse: true, + dtsh: true, + 'ec-3': true, + enca: true, + g719: true, + g726: true, + m4ae: true, + mha1: true, + mha2: true, + mhm1: true, + mhm2: true, + mlpa: true, + mp4a: true, + 'raw ': true, + Opus: true, + samr: true, + sawb: true, + sawp: true, + sevc: true, + sqcp: true, + ssmv: true, + twos: true, + ulaw: true + }, + video: { + avc1: true, + avc2: true, + avc3: true, + avc4: true, + avcp: true, + av01: true, + drac: true, + dvav: true, + dvhe: true, + encv: true, + hev1: true, + hvc1: true, + mjp2: true, + mp4v: true, + mvc1: true, + mvc2: true, + mvc3: true, + mvc4: true, + resv: true, + rv60: true, + s263: true, + svc1: true, + svc2: true, + 'vc-1': true, + vp08: true, + vp09: true + }, + text: { + stpp: true, + wvtt: true + } +}; +function isCodecType(codec, type) { + var typeCodes = sampleEntryCodesISO[type]; + return !!typeCodes && typeCodes[codec.slice(0, 4)] === true; +} +function isCodecSupportedInMp4(codec, type) { + return MediaSource.isTypeSupported((type || 'video') + "/mp4;codecs=\"" + codec + "\""); +} + +/***/ }), + +/***/ "./src/utils/cues.ts": +/*!***************************!*\ + !*** ./src/utils/cues.ts ***! + \***************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _vttparser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vttparser */ "./src/utils/vttparser.ts"); +/* harmony import */ var _webvtt_parser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webvtt-parser */ "./src/utils/webvtt-parser.ts"); +/* harmony import */ var _texttrack_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./texttrack-utils */ "./src/utils/texttrack-utils.ts"); + + + +var WHITESPACE_CHAR = /\s/; +var Cues = { + newCue: function newCue(track, startTime, endTime, captionScreen) { + var result = []; + var row; // the type data states this is VTTCue, but it can potentially be a TextTrackCue on old browsers + + var cue; + var indenting; + var indent; + var text; + var Cue = self.VTTCue || self.TextTrackCue; + + for (var r = 0; r < captionScreen.rows.length; r++) { + row = captionScreen.rows[r]; + indenting = true; + indent = 0; + text = ''; + + if (!row.isEmpty()) { + for (var c = 0; c < row.chars.length; c++) { + if (WHITESPACE_CHAR.test(row.chars[c].uchar) && indenting) { + indent++; + } else { + text += row.chars[c].uchar; + indenting = false; + } + } // To be used for cleaning-up orphaned roll-up captions + + + row.cueStartTime = startTime; // Give a slight bump to the endTime if it's equal to startTime to avoid a SyntaxError in IE + + if (startTime === endTime) { + endTime += 0.0001; + } + + if (indent >= 16) { + indent--; + } else { + indent++; + } + + var cueText = Object(_vttparser__WEBPACK_IMPORTED_MODULE_0__["fixLineBreaks"])(text.trim()); + var id = Object(_webvtt_parser__WEBPACK_IMPORTED_MODULE_1__["generateCueId"])(startTime, endTime, cueText); // If this cue already exists in the track do not push it + + if (!track || !track.cues || !track.cues.getCueById(id)) { + cue = new Cue(startTime, endTime, cueText); + cue.id = id; + cue.line = r + 1; + cue.align = 'left'; // Clamp the position between 10 and 80 percent (CEA-608 PAC indent code) + // https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-608 + // Firefox throws an exception and captions break with out of bounds 0-100 values + + cue.position = 10 + Math.min(80, Math.floor(indent * 8 / 32) * 10); + result.push(cue); + } + } + } + + if (track && result.length) { + // Sort bottom cues in reverse order so that they render in line order when overlapping in Chrome + result.sort(function (cueA, cueB) { + if (cueA.line === 'auto' || cueB.line === 'auto') { + return 0; + } + + if (cueA.line > 8 && cueB.line > 8) { + return cueB.line - cueA.line; + } + + return cueA.line - cueB.line; + }); + result.forEach(function (cue) { + return Object(_texttrack_utils__WEBPACK_IMPORTED_MODULE_2__["addCueToTrack"])(track, cue); + }); + } + + return result; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (Cues); + +/***/ }), + +/***/ "./src/utils/discontinuities.ts": +/*!**************************************!*\ + !*** ./src/utils/discontinuities.ts ***! + \**************************************/ +/*! exports provided: findFirstFragWithCC, shouldAlignOnDiscontinuities, findDiscontinuousReferenceFrag, adjustSlidingStart, alignStream, alignPDT, alignFragmentByPDTDelta, alignMediaPlaylistByPDT */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findFirstFragWithCC", function() { return findFirstFragWithCC; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shouldAlignOnDiscontinuities", function() { return shouldAlignOnDiscontinuities; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findDiscontinuousReferenceFrag", function() { return findDiscontinuousReferenceFrag; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "adjustSlidingStart", function() { return adjustSlidingStart; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "alignStream", function() { return alignStream; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "alignPDT", function() { return alignPDT; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "alignFragmentByPDTDelta", function() { return alignFragmentByPDTDelta; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "alignMediaPlaylistByPDT", function() { return alignMediaPlaylistByPDT; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger */ "./src/utils/logger.ts"); +/* harmony import */ var _controller_level_helper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../controller/level-helper */ "./src/controller/level-helper.ts"); + + + + +function findFirstFragWithCC(fragments, cc) { + var firstFrag = null; + + for (var i = 0, len = fragments.length; i < len; i++) { + var currentFrag = fragments[i]; + + if (currentFrag && currentFrag.cc === cc) { + firstFrag = currentFrag; + break; + } + } + + return firstFrag; +} +function shouldAlignOnDiscontinuities(lastFrag, lastLevel, details) { + if (lastLevel.details) { + if (details.endCC > details.startCC || lastFrag && lastFrag.cc < details.startCC) { + return true; + } + } + + return false; +} // Find the first frag in the previous level which matches the CC of the first frag of the new level + +function findDiscontinuousReferenceFrag(prevDetails, curDetails) { + var prevFrags = prevDetails.fragments; + var curFrags = curDetails.fragments; + + if (!curFrags.length || !prevFrags.length) { + _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].log('No fragments to align'); + return; + } + + var prevStartFrag = findFirstFragWithCC(prevFrags, curFrags[0].cc); + + if (!prevStartFrag || prevStartFrag && !prevStartFrag.startPTS) { + _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].log('No frag in previous level to align on'); + return; + } + + return prevStartFrag; +} + +function adjustFragmentStart(frag, sliding) { + if (frag) { + var start = frag.start + sliding; + frag.start = frag.startPTS = start; + frag.endPTS = start + frag.duration; + } +} + +function adjustSlidingStart(sliding, details) { + // Update segments + var fragments = details.fragments; + + for (var i = 0, len = fragments.length; i < len; i++) { + adjustFragmentStart(fragments[i], sliding); + } // Update LL-HLS parts at the end of the playlist + + + if (details.fragmentHint) { + adjustFragmentStart(details.fragmentHint, sliding); + } + + details.alignedSliding = true; +} +/** + * Using the parameters of the last level, this function computes PTS' of the new fragments so that they form a + * contiguous stream with the last fragments. + * The PTS of a fragment lets Hls.js know where it fits into a stream - by knowing every PTS, we know which fragment to + * download at any given time. PTS is normally computed when the fragment is demuxed, so taking this step saves us time + * and an extra download. + * @param lastFrag + * @param lastLevel + * @param details + */ + +function alignStream(lastFrag, lastLevel, details) { + if (!lastLevel) { + return; + } + + alignDiscontinuities(lastFrag, details, lastLevel); + + if (!details.alignedSliding && lastLevel.details) { + // If the PTS wasn't figured out via discontinuity sequence that means there was no CC increase within the level. + // Aligning via Program Date Time should therefore be reliable, since PDT should be the same within the same + // discontinuity sequence. + alignPDT(details, lastLevel.details); + } + + if (!details.alignedSliding && lastLevel.details && !details.skippedSegments) { + // Try to align on sn so that we pick a better start fragment. + // Do not perform this on playlists with delta updates as this is only to align levels on switch + // and adjustSliding only adjusts fragments after skippedSegments. + Object(_controller_level_helper__WEBPACK_IMPORTED_MODULE_2__["adjustSliding"])(lastLevel.details, details); + } +} +/** + * Computes the PTS if a new level's fragments using the PTS of a fragment in the last level which shares the same + * discontinuity sequence. + * @param lastFrag - The last Fragment which shares the same discontinuity sequence + * @param lastLevel - The details of the last loaded level + * @param details - The details of the new level + */ + +function alignDiscontinuities(lastFrag, details, lastLevel) { + if (shouldAlignOnDiscontinuities(lastFrag, lastLevel, details)) { + var referenceFrag = findDiscontinuousReferenceFrag(lastLevel.details, details); + + if (referenceFrag && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(referenceFrag.start)) { + _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].log("Adjusting PTS using last level due to CC increase within current level " + details.url); + adjustSlidingStart(referenceFrag.start, details); + } + } +} +/** + * Computes the PTS of a new level's fragments using the difference in Program Date Time from the last level. + * @param details - The details of the new level + * @param lastDetails - The details of the last loaded level + */ + + +function alignPDT(details, lastDetails) { + // This check protects the unsafe "!" usage below for null program date time access. + if (!lastDetails.fragments.length || !details.hasProgramDateTime || !lastDetails.hasProgramDateTime) { + return; + } // if last level sliding is 1000 and its first frag PROGRAM-DATE-TIME is 2017-08-20 1:10:00 AM + // and if new details first frag PROGRAM DATE-TIME is 2017-08-20 1:10:08 AM + // then we can deduce that playlist B sliding is 1000+8 = 1008s + + + var lastPDT = lastDetails.fragments[0].programDateTime; // hasProgramDateTime check above makes this safe. + + var newPDT = details.fragments[0].programDateTime; // date diff is in ms. frag.start is in seconds + + var sliding = (newPDT - lastPDT) / 1000 + lastDetails.fragments[0].start; + + if (sliding && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(sliding)) { + _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].log("Adjusting PTS using programDateTime delta " + (newPDT - lastPDT) + "ms, sliding:" + sliding.toFixed(3) + " " + details.url + " "); + adjustSlidingStart(sliding, details); + } +} +function alignFragmentByPDTDelta(frag, delta) { + var programDateTime = frag.programDateTime; + if (!programDateTime) return; + var start = (programDateTime - delta) / 1000; + frag.start = frag.startPTS = start; + frag.endPTS = start + frag.duration; +} +/** + * Ensures appropriate time-alignment between renditions based on PDT. Unlike `alignPDT`, which adjusts + * the timeline based on the delta between PDTs of the 0th fragment of two playlists/`LevelDetails`, + * this function assumes the timelines represented in `refDetails` are accurate, including the PDTs, + * and uses the "wallclock"/PDT timeline as a cross-reference to `details`, adjusting the presentation + * times/timelines of `details` accordingly. + * Given the asynchronous nature of fetches and initial loads of live `main` and audio/subtitle tracks, + * the primary purpose of this function is to ensure the "local timelines" of audio/subtitle tracks + * are aligned to the main/video timeline, using PDT as the cross-reference/"anchor" that should + * be consistent across playlists, per the HLS spec. + * @param details - The details of the rendition you'd like to time-align (e.g. an audio rendition). + * @param refDetails - The details of the reference rendition with start and PDT times for alignment. + */ + +function alignMediaPlaylistByPDT(details, refDetails) { + // This check protects the unsafe "!" usage below for null program date time access. + if (!refDetails.fragments.length || !details.hasProgramDateTime || !refDetails.hasProgramDateTime) { + return; + } + + var refPDT = refDetails.fragments[0].programDateTime; // hasProgramDateTime check above makes this safe. + + var refStart = refDetails.fragments[0].start; // Use the delta between the reference details' presentation timeline's start time and its PDT + // to align the other rendtion's timeline. + + var delta = refPDT - refStart * 1000; // Per spec: "If any Media Playlist in a Master Playlist contains an EXT-X-PROGRAM-DATE-TIME tag, then all + // Media Playlists in that Master Playlist MUST contain EXT-X-PROGRAM-DATE-TIME tags with consistent mappings + // of date and time to media timestamps." + // So we should be able to use each rendition's PDT as a reference time and use the delta to compute our relevant + // start and end times. + // NOTE: This code assumes each level/details timelines have already been made "internally consistent" + + details.fragments.forEach(function (frag) { + alignFragmentByPDTDelta(frag, delta); + }); + + if (details.fragmentHint) { + alignFragmentByPDTDelta(details.fragmentHint, delta); + } + + details.alignedSliding = true; +} + +/***/ }), + +/***/ "./src/utils/ewma-bandwidth-estimator.ts": +/*!***********************************************!*\ + !*** ./src/utils/ewma-bandwidth-estimator.ts ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_ewma__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/ewma */ "./src/utils/ewma.ts"); +/* + * EWMA Bandwidth Estimator + * - heavily inspired from shaka-player + * Tracks bandwidth samples and estimates available bandwidth. + * Based on the minimum of two exponentially-weighted moving averages with + * different half-lives. + */ + + +var EwmaBandWidthEstimator = /*#__PURE__*/function () { + function EwmaBandWidthEstimator(slow, fast, defaultEstimate) { + this.defaultEstimate_ = void 0; + this.minWeight_ = void 0; + this.minDelayMs_ = void 0; + this.slow_ = void 0; + this.fast_ = void 0; + this.defaultEstimate_ = defaultEstimate; + this.minWeight_ = 0.001; + this.minDelayMs_ = 50; + this.slow_ = new _utils_ewma__WEBPACK_IMPORTED_MODULE_0__["default"](slow); + this.fast_ = new _utils_ewma__WEBPACK_IMPORTED_MODULE_0__["default"](fast); + } + + var _proto = EwmaBandWidthEstimator.prototype; + + _proto.update = function update(slow, fast) { + var slow_ = this.slow_, + fast_ = this.fast_; + + if (this.slow_.halfLife !== slow) { + this.slow_ = new _utils_ewma__WEBPACK_IMPORTED_MODULE_0__["default"](slow, slow_.getEstimate(), slow_.getTotalWeight()); + } + + if (this.fast_.halfLife !== fast) { + this.fast_ = new _utils_ewma__WEBPACK_IMPORTED_MODULE_0__["default"](fast, fast_.getEstimate(), fast_.getTotalWeight()); + } + }; + + _proto.sample = function sample(durationMs, numBytes) { + durationMs = Math.max(durationMs, this.minDelayMs_); + var numBits = 8 * numBytes; // weight is duration in seconds + + var durationS = durationMs / 1000; // value is bandwidth in bits/s + + var bandwidthInBps = numBits / durationS; + this.fast_.sample(durationS, bandwidthInBps); + this.slow_.sample(durationS, bandwidthInBps); + }; + + _proto.canEstimate = function canEstimate() { + var fast = this.fast_; + return fast && fast.getTotalWeight() >= this.minWeight_; + }; + + _proto.getEstimate = function getEstimate() { + if (this.canEstimate()) { + // console.log('slow estimate:'+ Math.round(this.slow_.getEstimate())); + // console.log('fast estimate:'+ Math.round(this.fast_.getEstimate())); + // Take the minimum of these two estimates. This should have the effect of + // adapting down quickly, but up more slowly. + return Math.min(this.fast_.getEstimate(), this.slow_.getEstimate()); + } else { + return this.defaultEstimate_; + } + }; + + _proto.destroy = function destroy() {}; + + return EwmaBandWidthEstimator; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (EwmaBandWidthEstimator); + +/***/ }), + +/***/ "./src/utils/ewma.ts": +/*!***************************!*\ + !*** ./src/utils/ewma.ts ***! + \***************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * compute an Exponential Weighted moving average + * - https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average + * - heavily inspired from shaka-player + */ +var EWMA = /*#__PURE__*/function () { + // About half of the estimated value will be from the last |halfLife| samples by weight. + function EWMA(halfLife, estimate, weight) { + if (estimate === void 0) { + estimate = 0; + } + + if (weight === void 0) { + weight = 0; + } + + this.halfLife = void 0; + this.alpha_ = void 0; + this.estimate_ = void 0; + this.totalWeight_ = void 0; + this.halfLife = halfLife; // Larger values of alpha expire historical data more slowly. + + this.alpha_ = halfLife ? Math.exp(Math.log(0.5) / halfLife) : 0; + this.estimate_ = estimate; + this.totalWeight_ = weight; + } + + var _proto = EWMA.prototype; + + _proto.sample = function sample(weight, value) { + var adjAlpha = Math.pow(this.alpha_, weight); + this.estimate_ = value * (1 - adjAlpha) + adjAlpha * this.estimate_; + this.totalWeight_ += weight; + }; + + _proto.getTotalWeight = function getTotalWeight() { + return this.totalWeight_; + }; + + _proto.getEstimate = function getEstimate() { + if (this.alpha_) { + var zeroFactor = 1 - Math.pow(this.alpha_, this.totalWeight_); + + if (zeroFactor) { + return this.estimate_ / zeroFactor; + } + } + + return this.estimate_; + }; + + return EWMA; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (EWMA); + +/***/ }), + +/***/ "./src/utils/fetch-loader.ts": +/*!***********************************!*\ + !*** ./src/utils/fetch-loader.ts ***! + \***********************************/ +/*! exports provided: fetchSupported, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchSupported", function() { return fetchSupported; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _loader_load_stats__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../loader/load-stats */ "./src/loader/load-stats.ts"); +/* harmony import */ var _demux_chunk_cache__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../demux/chunk-cache */ "./src/demux/chunk-cache.ts"); + + + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } + +function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } + +function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + + + +function fetchSupported() { + if ( // @ts-ignore + self.fetch && self.AbortController && self.ReadableStream && self.Request) { + try { + new self.ReadableStream({}); // eslint-disable-line no-new + + return true; + } catch (e) { + /* noop */ + } + } + + return false; +} + +var FetchLoader = /*#__PURE__*/function () { + function FetchLoader(config + /* HlsConfig */ + ) { + this.fetchSetup = void 0; + this.requestTimeout = void 0; + this.request = void 0; + this.response = void 0; + this.controller = void 0; + this.context = void 0; + this.config = null; + this.callbacks = null; + this.stats = void 0; + this.loader = null; + this.fetchSetup = config.fetchSetup || getRequest; + this.controller = new self.AbortController(); + this.stats = new _loader_load_stats__WEBPACK_IMPORTED_MODULE_1__["LoadStats"](); + } + + var _proto = FetchLoader.prototype; + + _proto.destroy = function destroy() { + this.loader = this.callbacks = null; + this.abortInternal(); + }; + + _proto.abortInternal = function abortInternal() { + var response = this.response; + + if (!response || !response.ok) { + this.stats.aborted = true; + this.controller.abort(); + } + }; + + _proto.abort = function abort() { + var _this$callbacks; + + this.abortInternal(); + + if ((_this$callbacks = this.callbacks) !== null && _this$callbacks !== void 0 && _this$callbacks.onAbort) { + this.callbacks.onAbort(this.stats, this.context, this.response); + } + }; + + _proto.load = function load(context, config, callbacks) { + var _this = this; + + var stats = this.stats; + + if (stats.loading.start) { + throw new Error('Loader can only be used once.'); + } + + stats.loading.start = self.performance.now(); + var initParams = getRequestParameters(context, this.controller.signal); + var onProgress = callbacks.onProgress; + var isArrayBuffer = context.responseType === 'arraybuffer'; + var LENGTH = isArrayBuffer ? 'byteLength' : 'length'; + this.context = context; + this.config = config; + this.callbacks = callbacks; + this.request = this.fetchSetup(context, initParams); + self.clearTimeout(this.requestTimeout); + this.requestTimeout = self.setTimeout(function () { + _this.abortInternal(); + + callbacks.onTimeout(stats, context, _this.response); + }, config.timeout); + self.fetch(this.request).then(function (response) { + _this.response = _this.loader = response; + + if (!response.ok) { + var status = response.status, + statusText = response.statusText; + throw new FetchError(statusText || 'fetch, bad network response', status, response); + } + + stats.loading.first = Math.max(self.performance.now(), stats.loading.start); + stats.total = parseInt(response.headers.get('Content-Length') || '0'); + + if (onProgress && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(config.highWaterMark)) { + return _this.loadProgressively(response, stats, context, config.highWaterMark, onProgress); + } + + if (isArrayBuffer) { + return response.arrayBuffer(); + } + + return response.text(); + }).then(function (responseData) { + var response = _this.response; + self.clearTimeout(_this.requestTimeout); + stats.loading.end = Math.max(self.performance.now(), stats.loading.first); + stats.loaded = stats.total = responseData[LENGTH]; + var loaderResponse = { + url: response.url, + data: responseData + }; + + if (onProgress && !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(config.highWaterMark)) { + onProgress(stats, context, responseData, response); + } + + callbacks.onSuccess(loaderResponse, stats, context, response); + }).catch(function (error) { + self.clearTimeout(_this.requestTimeout); + + if (stats.aborted) { + return; + } // CORS errors result in an undefined code. Set it to 0 here to align with XHR's behavior + + + var code = error.code || 0; + callbacks.onError({ + code: code, + text: error.message + }, context, error.details); + }); + }; + + _proto.getCacheAge = function getCacheAge() { + var result = null; + + if (this.response) { + var ageHeader = this.response.headers.get('age'); + result = ageHeader ? parseFloat(ageHeader) : null; + } + + return result; + }; + + _proto.loadProgressively = function loadProgressively(response, stats, context, highWaterMark, onProgress) { + if (highWaterMark === void 0) { + highWaterMark = 0; + } + + var chunkCache = new _demux_chunk_cache__WEBPACK_IMPORTED_MODULE_2__["default"](); + var reader = response.body.getReader(); + + var pump = function pump() { + return reader.read().then(function (data) { + if (data.done) { + if (chunkCache.dataLength) { + onProgress(stats, context, chunkCache.flush(), response); + } + + return Promise.resolve(new ArrayBuffer(0)); + } + + var chunk = data.value; + var len = chunk.length; + stats.loaded += len; + + if (len < highWaterMark || chunkCache.dataLength) { + // The current chunk is too small to to be emitted or the cache already has data + // Push it to the cache + chunkCache.push(chunk); + + if (chunkCache.dataLength >= highWaterMark) { + // flush in order to join the typed arrays + onProgress(stats, context, chunkCache.flush(), response); + } + } else { + // If there's nothing cached already, and the chache is large enough + // just emit the progress event + onProgress(stats, context, chunk, response); + } + + return pump(); + }).catch(function () { + /* aborted */ + return Promise.reject(); + }); + }; + + return pump(); + }; + + return FetchLoader; +}(); + +function getRequestParameters(context, signal) { + var initParams = { + method: 'GET', + mode: 'cors', + credentials: 'same-origin', + signal: signal, + headers: new self.Headers(_extends({}, context.headers)) + }; + + if (context.rangeEnd) { + initParams.headers.set('Range', 'bytes=' + context.rangeStart + '-' + String(context.rangeEnd - 1)); + } + + return initParams; +} + +function getRequest(context, initParams) { + return new self.Request(context.url, initParams); +} + +var FetchError = /*#__PURE__*/function (_Error) { + _inheritsLoose(FetchError, _Error); + + function FetchError(message, code, details) { + var _this2; + + _this2 = _Error.call(this, message) || this; + _this2.code = void 0; + _this2.details = void 0; + _this2.code = code; + _this2.details = details; + return _this2; + } + + return FetchError; +}( /*#__PURE__*/_wrapNativeSuper(Error)); + +/* harmony default export */ __webpack_exports__["default"] = (FetchLoader); + +/***/ }), + +/***/ "./src/utils/imsc1-ttml-parser.ts": +/*!****************************************!*\ + !*** ./src/utils/imsc1-ttml-parser.ts ***! + \****************************************/ +/*! exports provided: IMSC1_CODEC, parseIMSC1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IMSC1_CODEC", function() { return IMSC1_CODEC; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseIMSC1", function() { return parseIMSC1; }); +/* harmony import */ var _mp4_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mp4-tools */ "./src/utils/mp4-tools.ts"); +/* harmony import */ var _vttparser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vttparser */ "./src/utils/vttparser.ts"); +/* harmony import */ var _vttcue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vttcue */ "./src/utils/vttcue.ts"); +/* harmony import */ var _demux_id3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../demux/id3 */ "./src/demux/id3.ts"); +/* harmony import */ var _timescale_conversion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./timescale-conversion */ "./src/utils/timescale-conversion.ts"); +/* harmony import */ var _webvtt_parser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./webvtt-parser */ "./src/utils/webvtt-parser.ts"); +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + + + + + + + +var IMSC1_CODEC = 'stpp.ttml.im1t'; // Time format: h:m:s:frames(.subframes) + +var HMSF_REGEX = /^(\d{2,}):(\d{2}):(\d{2}):(\d{2})\.?(\d+)?$/; // Time format: hours, minutes, seconds, milliseconds, frames, ticks + +var TIME_UNIT_REGEX = /^(\d*(?:\.\d*)?)(h|m|s|ms|f|t)$/; +var textAlignToLineAlign = { + left: 'start', + center: 'center', + right: 'end', + start: 'start', + end: 'end' +}; +function parseIMSC1(payload, initPTS, timescale, callBack, errorCallBack) { + var results = Object(_mp4_tools__WEBPACK_IMPORTED_MODULE_0__["findBox"])(new Uint8Array(payload), ['mdat']); + + if (results.length === 0) { + errorCallBack(new Error('Could not parse IMSC1 mdat')); + return; + } + + var mdat = results[0]; + var ttml = Object(_demux_id3__WEBPACK_IMPORTED_MODULE_3__["utf8ArrayToStr"])(new Uint8Array(payload, mdat.start, mdat.end - mdat.start)); + var syncTime = Object(_timescale_conversion__WEBPACK_IMPORTED_MODULE_4__["toTimescaleFromScale"])(initPTS, 1, timescale); + + try { + callBack(parseTTML(ttml, syncTime)); + } catch (error) { + errorCallBack(error); + } +} + +function parseTTML(ttml, syncTime) { + var parser = new DOMParser(); + var xmlDoc = parser.parseFromString(ttml, 'text/xml'); + var tt = xmlDoc.getElementsByTagName('tt')[0]; + + if (!tt) { + throw new Error('Invalid ttml'); + } + + var defaultRateInfo = { + frameRate: 30, + subFrameRate: 1, + frameRateMultiplier: 0, + tickRate: 0 + }; + var rateInfo = Object.keys(defaultRateInfo).reduce(function (result, key) { + result[key] = tt.getAttribute("ttp:" + key) || defaultRateInfo[key]; + return result; + }, {}); + var trim = tt.getAttribute('xml:space') !== 'preserve'; + var styleElements = collectionToDictionary(getElementCollection(tt, 'styling', 'style')); + var regionElements = collectionToDictionary(getElementCollection(tt, 'layout', 'region')); + var cueElements = getElementCollection(tt, 'body', '[begin]'); + return [].map.call(cueElements, function (cueElement) { + var cueText = getTextContent(cueElement, trim); + + if (!cueText || !cueElement.hasAttribute('begin')) { + return null; + } + + var startTime = parseTtmlTime(cueElement.getAttribute('begin'), rateInfo); + var duration = parseTtmlTime(cueElement.getAttribute('dur'), rateInfo); + var endTime = parseTtmlTime(cueElement.getAttribute('end'), rateInfo); + + if (startTime === null) { + throw timestampParsingError(cueElement); + } + + if (endTime === null) { + if (duration === null) { + throw timestampParsingError(cueElement); + } + + endTime = startTime + duration; + } + + var cue = new _vttcue__WEBPACK_IMPORTED_MODULE_2__["default"](startTime - syncTime, endTime - syncTime, cueText); + cue.id = Object(_webvtt_parser__WEBPACK_IMPORTED_MODULE_5__["generateCueId"])(cue.startTime, cue.endTime, cue.text); + var region = regionElements[cueElement.getAttribute('region')]; + var style = styleElements[cueElement.getAttribute('style')]; // TODO: Add regions to track and cue (origin and extend) + // These values are hard-coded (for now) to simulate region settings in the demo + + cue.position = 10; + cue.size = 80; // Apply styles to cue + + var styles = getTtmlStyles(region, style); + var textAlign = styles.textAlign; + + if (textAlign) { + // cue.positionAlign not settable in FF~2016 + var lineAlign = textAlignToLineAlign[textAlign]; + + if (lineAlign) { + cue.lineAlign = lineAlign; + } + + cue.align = textAlign; + } + + _extends(cue, styles); + + return cue; + }).filter(function (cue) { + return cue !== null; + }); +} + +function getElementCollection(fromElement, parentName, childName) { + var parent = fromElement.getElementsByTagName(parentName)[0]; + + if (parent) { + return [].slice.call(parent.querySelectorAll(childName)); + } + + return []; +} + +function collectionToDictionary(elementsWithId) { + return elementsWithId.reduce(function (dict, element) { + var id = element.getAttribute('xml:id'); + + if (id) { + dict[id] = element; + } + + return dict; + }, {}); +} + +function getTextContent(element, trim) { + return [].slice.call(element.childNodes).reduce(function (str, node, i) { + var _node$childNodes; + + if (node.nodeName === 'br' && i) { + return str + '\n'; + } + + if ((_node$childNodes = node.childNodes) !== null && _node$childNodes !== void 0 && _node$childNodes.length) { + return getTextContent(node, trim); + } else if (trim) { + return str + node.textContent.trim().replace(/\s+/g, ' '); + } + + return str + node.textContent; + }, ''); +} + +function getTtmlStyles(region, style) { + var ttsNs = 'http://www.w3.org/ns/ttml#styling'; + var styleAttributes = ['displayAlign', 'textAlign', 'color', 'backgroundColor', 'fontSize', 'fontFamily' // 'fontWeight', + // 'lineHeight', + // 'wrapOption', + // 'fontStyle', + // 'direction', + // 'writingMode' + ]; + return styleAttributes.reduce(function (styles, name) { + var value = getAttributeNS(style, ttsNs, name) || getAttributeNS(region, ttsNs, name); + + if (value) { + styles[name] = value; + } + + return styles; + }, {}); +} + +function getAttributeNS(element, ns, name) { + return element.hasAttributeNS(ns, name) ? element.getAttributeNS(ns, name) : null; +} + +function timestampParsingError(node) { + return new Error("Could not parse ttml timestamp " + node); +} + +function parseTtmlTime(timeAttributeValue, rateInfo) { + if (!timeAttributeValue) { + return null; + } + + var seconds = Object(_vttparser__WEBPACK_IMPORTED_MODULE_1__["parseTimeStamp"])(timeAttributeValue); + + if (seconds === null) { + if (HMSF_REGEX.test(timeAttributeValue)) { + seconds = parseHoursMinutesSecondsFrames(timeAttributeValue, rateInfo); + } else if (TIME_UNIT_REGEX.test(timeAttributeValue)) { + seconds = parseTimeUnits(timeAttributeValue, rateInfo); + } + } + + return seconds; +} + +function parseHoursMinutesSecondsFrames(timeAttributeValue, rateInfo) { + var m = HMSF_REGEX.exec(timeAttributeValue); + var frames = (m[4] | 0) + (m[5] | 0) / rateInfo.subFrameRate; + return (m[1] | 0) * 3600 + (m[2] | 0) * 60 + (m[3] | 0) + frames / rateInfo.frameRate; +} + +function parseTimeUnits(timeAttributeValue, rateInfo) { + var m = TIME_UNIT_REGEX.exec(timeAttributeValue); + var value = Number(m[1]); + var unit = m[2]; + + switch (unit) { + case 'h': + return value * 3600; + + case 'm': + return value * 60; + + case 'ms': + return value * 1000; + + case 'f': + return value / rateInfo.frameRate; + + case 't': + return value / rateInfo.tickRate; + } + + return value; +} + +/***/ }), + +/***/ "./src/utils/logger.ts": +/*!*****************************!*\ + !*** ./src/utils/logger.ts ***! + \*****************************/ +/*! exports provided: enableLogs, logger */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableLogs", function() { return enableLogs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return logger; }); +var noop = function noop() {}; + +var fakeLogger = { + trace: noop, + debug: noop, + log: noop, + warn: noop, + info: noop, + error: noop +}; +var exportedLogger = fakeLogger; // let lastCallTime; +// function formatMsgWithTimeInfo(type, msg) { +// const now = Date.now(); +// const diff = lastCallTime ? '+' + (now - lastCallTime) : '0'; +// lastCallTime = now; +// msg = (new Date(now)).toISOString() + ' | [' + type + '] > ' + msg + ' ( ' + diff + ' ms )'; +// return msg; +// } + +function consolePrintFn(type) { + var func = self.console[type]; + + if (func) { + return func.bind(self.console, "[" + type + "] >"); + } + + return noop; +} + +function exportLoggerFunctions(debugConfig) { + for (var _len = arguments.length, functions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + functions[_key - 1] = arguments[_key]; + } + + functions.forEach(function (type) { + exportedLogger[type] = debugConfig[type] ? debugConfig[type].bind(debugConfig) : consolePrintFn(type); + }); +} + +function enableLogs(debugConfig) { + // check that console is available + if (self.console && debugConfig === true || typeof debugConfig === 'object') { + exportLoggerFunctions(debugConfig, // Remove out from list here to hard-disable a log-level + // 'trace', + 'debug', 'log', 'info', 'warn', 'error'); // Some browsers don't allow to use bind on console object anyway + // fallback to default if needed + + try { + exportedLogger.log(); + } catch (e) { + exportedLogger = fakeLogger; + } + } else { + exportedLogger = fakeLogger; + } +} +var logger = exportedLogger; + +/***/ }), + +/***/ "./src/utils/mediakeys-helper.ts": +/*!***************************************!*\ + !*** ./src/utils/mediakeys-helper.ts ***! + \***************************************/ +/*! exports provided: KeySystems, requestMediaKeySystemAccess */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeySystems", function() { return KeySystems; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "requestMediaKeySystemAccess", function() { return requestMediaKeySystemAccess; }); +/** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/requestMediaKeySystemAccess + */ +var KeySystems; + +(function (KeySystems) { + KeySystems["WIDEVINE"] = "com.widevine.alpha"; + KeySystems["PLAYREADY"] = "com.microsoft.playready"; +})(KeySystems || (KeySystems = {})); + +var requestMediaKeySystemAccess = function () { + if (typeof self !== 'undefined' && self.navigator && self.navigator.requestMediaKeySystemAccess) { + return self.navigator.requestMediaKeySystemAccess.bind(self.navigator); + } else { + return null; + } +}(); + + + +/***/ }), + +/***/ "./src/utils/mediasource-helper.ts": +/*!*****************************************!*\ + !*** ./src/utils/mediasource-helper.ts ***! + \*****************************************/ +/*! exports provided: getMediaSource */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMediaSource", function() { return getMediaSource; }); +/** + * MediaSource helper + */ +function getMediaSource() { + return self.MediaSource || self.WebKitMediaSource; +} + +/***/ }), + +/***/ "./src/utils/mp4-tools.ts": +/*!********************************!*\ + !*** ./src/utils/mp4-tools.ts ***! + \********************************/ +/*! exports provided: bin2str, readUint16, readUint32, writeUint32, findBox, parseSegmentIndex, parseInitSegment, getStartDTS, getDuration, computeRawDurationFromSamples, offsetStartDTS, segmentValidRange, appendUint8Array */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bin2str", function() { return bin2str; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readUint16", function() { return readUint16; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readUint32", function() { return readUint32; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "writeUint32", function() { return writeUint32; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findBox", function() { return findBox; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseSegmentIndex", function() { return parseSegmentIndex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseInitSegment", function() { return parseInitSegment; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getStartDTS", function() { return getStartDTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDuration", function() { return getDuration; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeRawDurationFromSamples", function() { return computeRawDurationFromSamples; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "offsetStartDTS", function() { return offsetStartDTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segmentValidRange", function() { return segmentValidRange; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "appendUint8Array", function() { return appendUint8Array; }); +/* harmony import */ var _typed_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typed-array */ "./src/utils/typed-array.ts"); +/* harmony import */ var _loader_fragment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../loader/fragment */ "./src/loader/fragment.ts"); + + +var UINT32_MAX = Math.pow(2, 32) - 1; +var push = [].push; +function bin2str(data) { + return String.fromCharCode.apply(null, data); +} +function readUint16(buffer, offset) { + if ('data' in buffer) { + offset += buffer.start; + buffer = buffer.data; + } + + var val = buffer[offset] << 8 | buffer[offset + 1]; + return val < 0 ? 65536 + val : val; +} +function readUint32(buffer, offset) { + if ('data' in buffer) { + offset += buffer.start; + buffer = buffer.data; + } + + var val = buffer[offset] << 24 | buffer[offset + 1] << 16 | buffer[offset + 2] << 8 | buffer[offset + 3]; + return val < 0 ? 4294967296 + val : val; +} +function writeUint32(buffer, offset, value) { + if ('data' in buffer) { + offset += buffer.start; + buffer = buffer.data; + } + + buffer[offset] = value >> 24; + buffer[offset + 1] = value >> 16 & 0xff; + buffer[offset + 2] = value >> 8 & 0xff; + buffer[offset + 3] = value & 0xff; +} // Find the data for a box specified by its path + +function findBox(input, path) { + var results = []; + + if (!path.length) { + // short-circuit the search for empty paths + return results; + } + + var data; + var start; + var end; + + if ('data' in input) { + data = input.data; + start = input.start; + end = input.end; + } else { + data = input; + start = 0; + end = data.byteLength; + } + + for (var i = start; i < end;) { + var size = readUint32(data, i); + var type = bin2str(data.subarray(i + 4, i + 8)); + var endbox = size > 1 ? i + size : end; + + if (type === path[0]) { + if (path.length === 1) { + // this is the end of the path and we've found the box we were + // looking for + results.push({ + data: data, + start: i + 8, + end: endbox + }); + } else { + // recursively search for the next box along the path + var subresults = findBox({ + data: data, + start: i + 8, + end: endbox + }, path.slice(1)); + + if (subresults.length) { + push.apply(results, subresults); + } + } + } + + i = endbox; + } // we've finished searching all of data + + + return results; +} +function parseSegmentIndex(initSegment) { + var moovBox = findBox(initSegment, ['moov']); + var moov = moovBox[0]; + var moovEndOffset = moov ? moov.end : null; // we need this in case we need to chop of garbage of the end of current data + + var sidxBox = findBox(initSegment, ['sidx']); + + if (!sidxBox || !sidxBox[0]) { + return null; + } + + var references = []; + var sidx = sidxBox[0]; + var version = sidx.data[0]; // set initial offset, we skip the reference ID (not needed) + + var index = version === 0 ? 8 : 16; + var timescale = readUint32(sidx, index); + index += 4; // TODO: parse earliestPresentationTime and firstOffset + // usually zero in our case + + var earliestPresentationTime = 0; + var firstOffset = 0; + + if (version === 0) { + index += 8; + } else { + index += 16; + } // skip reserved + + + index += 2; + var startByte = sidx.end + firstOffset; + var referencesCount = readUint16(sidx, index); + index += 2; + + for (var i = 0; i < referencesCount; i++) { + var referenceIndex = index; + var referenceInfo = readUint32(sidx, referenceIndex); + referenceIndex += 4; + var referenceSize = referenceInfo & 0x7fffffff; + var referenceType = (referenceInfo & 0x80000000) >>> 31; + + if (referenceType === 1) { + // eslint-disable-next-line no-console + console.warn('SIDX has hierarchical references (not supported)'); + return null; + } + + var subsegmentDuration = readUint32(sidx, referenceIndex); + referenceIndex += 4; + references.push({ + referenceSize: referenceSize, + subsegmentDuration: subsegmentDuration, + // unscaled + info: { + duration: subsegmentDuration / timescale, + start: startByte, + end: startByte + referenceSize - 1 + } + }); + startByte += referenceSize; // Skipping 1 bit for |startsWithSap|, 3 bits for |sapType|, and 28 bits + // for |sapDelta|. + + referenceIndex += 4; // skip to next ref + + index = referenceIndex; + } + + return { + earliestPresentationTime: earliestPresentationTime, + timescale: timescale, + version: version, + referencesCount: referencesCount, + references: references, + moovEndOffset: moovEndOffset + }; +} +/** + * Parses an MP4 initialization segment and extracts stream type and + * timescale values for any declared tracks. Timescale values indicate the + * number of clock ticks per second to assume for time-based values + * elsewhere in the MP4. + * + * To determine the start time of an MP4, you need two pieces of + * information: the timescale unit and the earliest base media decode + * time. Multiple timescales can be specified within an MP4 but the + * base media decode time is always expressed in the timescale from + * the media header box for the track: + * ``` + * moov > trak > mdia > mdhd.timescale + * moov > trak > mdia > hdlr + * ``` + * @param initSegment {Uint8Array} the bytes of the init segment + * @return {InitData} a hash of track type to timescale values or null if + * the init segment is malformed. + */ + +function parseInitSegment(initSegment) { + var result = []; + var traks = findBox(initSegment, ['moov', 'trak']); + + for (var i = 0; i < traks.length; i++) { + var trak = traks[i]; + var tkhd = findBox(trak, ['tkhd'])[0]; + + if (tkhd) { + var version = tkhd.data[tkhd.start]; + + var _index = version === 0 ? 12 : 20; + + var trackId = readUint32(tkhd, _index); + var mdhd = findBox(trak, ['mdia', 'mdhd'])[0]; + + if (mdhd) { + version = mdhd.data[mdhd.start]; + _index = version === 0 ? 12 : 20; + var timescale = readUint32(mdhd, _index); + var hdlr = findBox(trak, ['mdia', 'hdlr'])[0]; + + if (hdlr) { + var hdlrType = bin2str(hdlr.data.subarray(hdlr.start + 8, hdlr.start + 12)); + var type = { + soun: _loader_fragment__WEBPACK_IMPORTED_MODULE_1__["ElementaryStreamTypes"].AUDIO, + vide: _loader_fragment__WEBPACK_IMPORTED_MODULE_1__["ElementaryStreamTypes"].VIDEO + }[hdlrType]; + + if (type) { + // Parse codec details + var stsd = findBox(trak, ['mdia', 'minf', 'stbl', 'stsd'])[0]; + var codec = void 0; + + if (stsd) { + codec = bin2str(stsd.data.subarray(stsd.start + 12, stsd.start + 16)); // TODO: Parse codec details to be able to build MIME type. + // stsd.start += 8; + // const codecBox = findBox(stsd, [codec])[0]; + // if (codecBox) { + // TODO: Codec parsing support for avc1, mp4a, hevc, av01... + // } + } + + result[trackId] = { + timescale: timescale, + type: type + }; + result[type] = { + timescale: timescale, + id: trackId, + codec: codec + }; + } + } + } + } + } + + var trex = findBox(initSegment, ['moov', 'mvex', 'trex']); + trex.forEach(function (trex) { + var trackId = readUint32(trex, 4); + var track = result[trackId]; + + if (track) { + track.default = { + duration: readUint32(trex, 12), + flags: readUint32(trex, 20) + }; + } + }); + return result; +} +/** + * Determine the base media decode start time, in seconds, for an MP4 + * fragment. If multiple fragments are specified, the earliest time is + * returned. + * + * The base media decode time can be parsed from track fragment + * metadata: + * ``` + * moof > traf > tfdt.baseMediaDecodeTime + * ``` + * It requires the timescale value from the mdhd to interpret. + * + * @param initData {InitData} a hash of track type to timescale values + * @param fmp4 {Uint8Array} the bytes of the mp4 fragment + * @return {number} the earliest base media decode start time for the + * fragment, in seconds + */ + +function getStartDTS(initData, fmp4) { + // we need info from two children of each track fragment box + return findBox(fmp4, ['moof', 'traf']).reduce(function (result, traf) { + var tfdt = findBox(traf, ['tfdt'])[0]; + var version = tfdt.data[tfdt.start]; + var start = findBox(traf, ['tfhd']).reduce(function (result, tfhd) { + // get the track id from the tfhd + var id = readUint32(tfhd, 4); + var track = initData[id]; + + if (track) { + var baseTime = readUint32(tfdt, 4); + + if (version === 1) { + baseTime *= Math.pow(2, 32); + baseTime += readUint32(tfdt, 8); + } // assume a 90kHz clock if no timescale was specified + + + var scale = track.timescale || 90e3; // convert base time to seconds + + var startTime = baseTime / scale; + + if (isFinite(startTime) && (result === null || startTime < result)) { + return startTime; + } + } + + return result; + }, null); + + if (start !== null && isFinite(start) && (result === null || start < result)) { + return start; + } + + return result; + }, null) || 0; +} +/* + For Reference: + aligned(8) class TrackFragmentHeaderBox + extends FullBox(‘tfhd’, 0, tf_flags){ + unsigned int(32) track_ID; + // all the following are optional fields + unsigned int(64) base_data_offset; + unsigned int(32) sample_description_index; + unsigned int(32) default_sample_duration; + unsigned int(32) default_sample_size; + unsigned int(32) default_sample_flags + } + */ + +function getDuration(data, initData) { + var rawDuration = 0; + var videoDuration = 0; + var audioDuration = 0; + var trafs = findBox(data, ['moof', 'traf']); + + for (var i = 0; i < trafs.length; i++) { + var traf = trafs[i]; // There is only one tfhd & trun per traf + // This is true for CMAF style content, and we should perhaps check the ftyp + // and only look for a single trun then, but for ISOBMFF we should check + // for multiple track runs. + + var tfhd = findBox(traf, ['tfhd'])[0]; // get the track id from the tfhd + + var id = readUint32(tfhd, 4); + var track = initData[id]; + + if (!track) { + continue; + } + + var trackDefault = track.default; + var tfhdFlags = readUint32(tfhd, 0) | (trackDefault === null || trackDefault === void 0 ? void 0 : trackDefault.flags); + var sampleDuration = trackDefault === null || trackDefault === void 0 ? void 0 : trackDefault.duration; + + if (tfhdFlags & 0x000008) { + // 0x000008 indicates the presence of the default_sample_duration field + if (tfhdFlags & 0x000002) { + // 0x000002 indicates the presence of the sample_description_index field, which precedes default_sample_duration + // If present, the default_sample_duration exists at byte offset 12 + sampleDuration = readUint32(tfhd, 12); + } else { + // Otherwise, the duration is at byte offset 8 + sampleDuration = readUint32(tfhd, 8); + } + } // assume a 90kHz clock if no timescale was specified + + + var timescale = track.timescale || 90e3; + var truns = findBox(traf, ['trun']); + + for (var j = 0; j < truns.length; j++) { + if (sampleDuration) { + var sampleCount = readUint32(truns[j], 4); + rawDuration = sampleDuration * sampleCount; + } else { + rawDuration = computeRawDurationFromSamples(truns[j]); + } + + if (track.type === _loader_fragment__WEBPACK_IMPORTED_MODULE_1__["ElementaryStreamTypes"].VIDEO) { + videoDuration += rawDuration / timescale; + } else if (track.type === _loader_fragment__WEBPACK_IMPORTED_MODULE_1__["ElementaryStreamTypes"].AUDIO) { + audioDuration += rawDuration / timescale; + } + } + } + + if (videoDuration === 0 && audioDuration === 0) { + // If duration samples are not available in the traf use sidx subsegment_duration + var sidx = parseSegmentIndex(data); + + if (sidx !== null && sidx !== void 0 && sidx.references) { + return sidx.references.reduce(function (dur, ref) { + return dur + ref.info.duration || 0; + }, 0); + } + } + + if (videoDuration) { + return videoDuration; + } + + return audioDuration; +} +/* + For Reference: + aligned(8) class TrackRunBox + extends FullBox(‘trun’, version, tr_flags) { + unsigned int(32) sample_count; + // the following are optional fields + signed int(32) data_offset; + unsigned int(32) first_sample_flags; + // all fields in the following array are optional + { + unsigned int(32) sample_duration; + unsigned int(32) sample_size; + unsigned int(32) sample_flags + if (version == 0) + { unsigned int(32) + else + { signed int(32) + }[ sample_count ] + } + */ + +function computeRawDurationFromSamples(trun) { + var flags = readUint32(trun, 0); // Flags are at offset 0, non-optional sample_count is at offset 4. Therefore we start 8 bytes in. + // Each field is an int32, which is 4 bytes + + var offset = 8; // data-offset-present flag + + if (flags & 0x000001) { + offset += 4; + } // first-sample-flags-present flag + + + if (flags & 0x000004) { + offset += 4; + } + + var duration = 0; + var sampleCount = readUint32(trun, 4); + + for (var i = 0; i < sampleCount; i++) { + // sample-duration-present flag + if (flags & 0x000100) { + var sampleDuration = readUint32(trun, offset); + duration += sampleDuration; + offset += 4; + } // sample-size-present flag + + + if (flags & 0x000200) { + offset += 4; + } // sample-flags-present flag + + + if (flags & 0x000400) { + offset += 4; + } // sample-composition-time-offsets-present flag + + + if (flags & 0x000800) { + offset += 4; + } + } + + return duration; +} +function offsetStartDTS(initData, fmp4, timeOffset) { + findBox(fmp4, ['moof', 'traf']).forEach(function (traf) { + findBox(traf, ['tfhd']).forEach(function (tfhd) { + // get the track id from the tfhd + var id = readUint32(tfhd, 4); + var track = initData[id]; + + if (!track) { + return; + } // assume a 90kHz clock if no timescale was specified + + + var timescale = track.timescale || 90e3; // get the base media decode time from the tfdt + + findBox(traf, ['tfdt']).forEach(function (tfdt) { + var version = tfdt.data[tfdt.start]; + var baseMediaDecodeTime = readUint32(tfdt, 4); + + if (version === 0) { + writeUint32(tfdt, 4, baseMediaDecodeTime - timeOffset * timescale); + } else { + baseMediaDecodeTime *= Math.pow(2, 32); + baseMediaDecodeTime += readUint32(tfdt, 8); + baseMediaDecodeTime -= timeOffset * timescale; + baseMediaDecodeTime = Math.max(baseMediaDecodeTime, 0); + var upper = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1)); + var lower = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1)); + writeUint32(tfdt, 4, upper); + writeUint32(tfdt, 8, lower); + } + }); + }); + }); +} // TODO: Check if the last moof+mdat pair is part of the valid range + +function segmentValidRange(data) { + var segmentedRange = { + valid: null, + remainder: null + }; + var moofs = findBox(data, ['moof']); + + if (!moofs) { + return segmentedRange; + } else if (moofs.length < 2) { + segmentedRange.remainder = data; + return segmentedRange; + } + + var last = moofs[moofs.length - 1]; // Offset by 8 bytes; findBox offsets the start by as much + + segmentedRange.valid = Object(_typed_array__WEBPACK_IMPORTED_MODULE_0__["sliceUint8"])(data, 0, last.start - 8); + segmentedRange.remainder = Object(_typed_array__WEBPACK_IMPORTED_MODULE_0__["sliceUint8"])(data, last.start - 8); + return segmentedRange; +} +function appendUint8Array(data1, data2) { + var temp = new Uint8Array(data1.length + data2.length); + temp.set(data1); + temp.set(data2, data1.length); + return temp; +} + +/***/ }), + +/***/ "./src/utils/output-filter.ts": +/*!************************************!*\ + !*** ./src/utils/output-filter.ts ***! + \************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return OutputFilter; }); +var OutputFilter = /*#__PURE__*/function () { + function OutputFilter(timelineController, trackName) { + this.timelineController = void 0; + this.cueRanges = []; + this.trackName = void 0; + this.startTime = null; + this.endTime = null; + this.screen = null; + this.timelineController = timelineController; + this.trackName = trackName; + } + + var _proto = OutputFilter.prototype; + + _proto.dispatchCue = function dispatchCue() { + if (this.startTime === null) { + return; + } + + this.timelineController.addCues(this.trackName, this.startTime, this.endTime, this.screen, this.cueRanges); + this.startTime = null; + }; + + _proto.newCue = function newCue(startTime, endTime, screen) { + if (this.startTime === null || this.startTime > startTime) { + this.startTime = startTime; + } + + this.endTime = endTime; + this.screen = screen; + this.timelineController.createCaptionsTrack(this.trackName); + }; + + _proto.reset = function reset() { + this.cueRanges = []; + }; + + return OutputFilter; +}(); + + + +/***/ }), + +/***/ "./src/utils/texttrack-utils.ts": +/*!**************************************!*\ + !*** ./src/utils/texttrack-utils.ts ***! + \**************************************/ +/*! exports provided: sendAddTrackEvent, addCueToTrack, clearCurrentCues, removeCuesInRange, getCuesInRange */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sendAddTrackEvent", function() { return sendAddTrackEvent; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addCueToTrack", function() { return addCueToTrack; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearCurrentCues", function() { return clearCurrentCues; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeCuesInRange", function() { return removeCuesInRange; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCuesInRange", function() { return getCuesInRange; }); +/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./logger */ "./src/utils/logger.ts"); + +function sendAddTrackEvent(track, videoEl) { + var event; + + try { + event = new Event('addtrack'); + } catch (err) { + // for IE11 + event = document.createEvent('Event'); + event.initEvent('addtrack', false, false); + } + + event.track = track; + videoEl.dispatchEvent(event); +} +function addCueToTrack(track, cue) { + // Sometimes there are cue overlaps on segmented vtts so the same + // cue can appear more than once in different vtt files. + // This avoid showing duplicated cues with same timecode and text. + var mode = track.mode; + + if (mode === 'disabled') { + track.mode = 'hidden'; + } + + if (track.cues && !track.cues.getCueById(cue.id)) { + try { + track.addCue(cue); + + if (!track.cues.getCueById(cue.id)) { + throw new Error("addCue is failed for: " + cue); + } + } catch (err) { + _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug("[texttrack-utils]: " + err); + var textTrackCue = new self.TextTrackCue(cue.startTime, cue.endTime, cue.text); + textTrackCue.id = cue.id; + track.addCue(textTrackCue); + } + } + + if (mode === 'disabled') { + track.mode = mode; + } +} +function clearCurrentCues(track) { + // When track.mode is disabled, track.cues will be null. + // To guarantee the removal of cues, we need to temporarily + // change the mode to hidden + var mode = track.mode; + + if (mode === 'disabled') { + track.mode = 'hidden'; + } + + if (track.cues) { + for (var i = track.cues.length; i--;) { + track.removeCue(track.cues[i]); + } + } + + if (mode === 'disabled') { + track.mode = mode; + } +} +function removeCuesInRange(track, start, end) { + var mode = track.mode; + + if (mode === 'disabled') { + track.mode = 'hidden'; + } + + if (track.cues && track.cues.length > 0) { + var cues = getCuesInRange(track.cues, start, end); + + for (var i = 0; i < cues.length; i++) { + track.removeCue(cues[i]); + } + } + + if (mode === 'disabled') { + track.mode = mode; + } +} // Find first cue starting after given time. +// Modified version of binary search O(log(n)). + +function getFirstCueIndexAfterTime(cues, time) { + // If first cue starts after time, start there + if (time < cues[0].startTime) { + return 0; + } // If the last cue ends before time there is no overlap + + + var len = cues.length - 1; + + if (time > cues[len].endTime) { + return -1; + } + + var left = 0; + var right = len; + + while (left <= right) { + var mid = Math.floor((right + left) / 2); + + if (time < cues[mid].startTime) { + right = mid - 1; + } else if (time > cues[mid].startTime && left < len) { + left = mid + 1; + } else { + // If it's not lower or higher, it must be equal. + return mid; + } + } // At this point, left and right have swapped. + // No direct match was found, left or right element must be the closest. Check which one has the smallest diff. + + + return cues[left].startTime - time < time - cues[right].startTime ? left : right; +} + +function getCuesInRange(cues, start, end) { + var cuesFound = []; + var firstCueInRange = getFirstCueIndexAfterTime(cues, start); + + if (firstCueInRange > -1) { + for (var i = firstCueInRange, len = cues.length; i < len; i++) { + var cue = cues[i]; + + if (cue.startTime >= start && cue.endTime <= end) { + cuesFound.push(cue); + } else if (cue.startTime > end) { + return cuesFound; + } + } + } + + return cuesFound; +} + +/***/ }), + +/***/ "./src/utils/time-ranges.ts": +/*!**********************************!*\ + !*** ./src/utils/time-ranges.ts ***! + \**********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * TimeRanges to string helper + */ +var TimeRanges = { + toString: function toString(r) { + var log = ''; + var len = r.length; + + for (var i = 0; i < len; i++) { + log += '[' + r.start(i).toFixed(3) + ',' + r.end(i).toFixed(3) + ']'; + } + + return log; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (TimeRanges); + +/***/ }), + +/***/ "./src/utils/timescale-conversion.ts": +/*!*******************************************!*\ + !*** ./src/utils/timescale-conversion.ts ***! + \*******************************************/ +/*! exports provided: toTimescaleFromBase, toTimescaleFromScale, toMsFromMpegTsClock, toMpegTsClockFromTimescale */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toTimescaleFromBase", function() { return toTimescaleFromBase; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toTimescaleFromScale", function() { return toTimescaleFromScale; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toMsFromMpegTsClock", function() { return toMsFromMpegTsClock; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toMpegTsClockFromTimescale", function() { return toMpegTsClockFromTimescale; }); +var MPEG_TS_CLOCK_FREQ_HZ = 90000; +function toTimescaleFromBase(value, destScale, srcBase, round) { + if (srcBase === void 0) { + srcBase = 1; + } + + if (round === void 0) { + round = false; + } + + var result = value * destScale * srcBase; // equivalent to `(value * scale) / (1 / base)` + + return round ? Math.round(result) : result; +} +function toTimescaleFromScale(value, destScale, srcScale, round) { + if (srcScale === void 0) { + srcScale = 1; + } + + if (round === void 0) { + round = false; + } + + return toTimescaleFromBase(value, destScale, 1 / srcScale, round); +} +function toMsFromMpegTsClock(value, round) { + if (round === void 0) { + round = false; + } + + return toTimescaleFromBase(value, 1000, 1 / MPEG_TS_CLOCK_FREQ_HZ, round); +} +function toMpegTsClockFromTimescale(value, srcScale) { + if (srcScale === void 0) { + srcScale = 1; + } + + return toTimescaleFromBase(value, MPEG_TS_CLOCK_FREQ_HZ, 1 / srcScale); +} + +/***/ }), + +/***/ "./src/utils/typed-array.ts": +/*!**********************************!*\ + !*** ./src/utils/typed-array.ts ***! + \**********************************/ +/*! exports provided: sliceUint8 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sliceUint8", function() { return sliceUint8; }); +function sliceUint8(array, start, end) { + // @ts-expect-error This polyfills IE11 usage of Uint8Array slice. + // It always exists in the TypeScript definition so fails, but it fails at runtime on IE11. + return Uint8Array.prototype.slice ? array.slice(start, end) : new Uint8Array(Array.prototype.slice.call(array, start, end)); +} + +/***/ }), + +/***/ "./src/utils/vttcue.ts": +/*!*****************************!*\ + !*** ./src/utils/vttcue.ts ***! + \*****************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Copyright 2013 vtt.js Contributors + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* harmony default export */ __webpack_exports__["default"] = ((function () { + if (typeof self !== 'undefined' && self.VTTCue) { + return self.VTTCue; + } + + var AllowedDirections = ['', 'lr', 'rl']; + var AllowedAlignments = ['start', 'middle', 'end', 'left', 'right']; + + function isAllowedValue(allowed, value) { + if (typeof value !== 'string') { + return false; + } // necessary for assuring the generic conforms to the Array interface + + + if (!Array.isArray(allowed)) { + return false; + } // reset the type so that the next narrowing works well + + + var lcValue = value.toLowerCase(); // use the allow list to narrow the type to a specific subset of strings + + if (~allowed.indexOf(lcValue)) { + return lcValue; + } + + return false; + } + + function findDirectionSetting(value) { + return isAllowedValue(AllowedDirections, value); + } + + function findAlignSetting(value) { + return isAllowedValue(AllowedAlignments, value); + } + + function extend(obj) { + for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + rest[_key - 1] = arguments[_key]; + } + + var i = 1; + + for (; i < arguments.length; i++) { + var cobj = arguments[i]; + + for (var p in cobj) { + obj[p] = cobj[p]; + } + } + + return obj; + } + + function VTTCue(startTime, endTime, text) { + var cue = this; + var baseObj = { + enumerable: true + }; + /** + * Shim implementation specific properties. These properties are not in + * the spec. + */ + // Lets us know when the VTTCue's data has changed in such a way that we need + // to recompute its display state. This lets us compute its display state + // lazily. + + cue.hasBeenReset = false; + /** + * VTTCue and TextTrackCue properties + * http://dev.w3.org/html5/webvtt/#vttcue-interface + */ + + var _id = ''; + var _pauseOnExit = false; + var _startTime = startTime; + var _endTime = endTime; + var _text = text; + var _region = null; + var _vertical = ''; + var _snapToLines = true; + var _line = 'auto'; + var _lineAlign = 'start'; + var _position = 50; + var _positionAlign = 'middle'; + var _size = 50; + var _align = 'middle'; + Object.defineProperty(cue, 'id', extend({}, baseObj, { + get: function get() { + return _id; + }, + set: function set(value) { + _id = '' + value; + } + })); + Object.defineProperty(cue, 'pauseOnExit', extend({}, baseObj, { + get: function get() { + return _pauseOnExit; + }, + set: function set(value) { + _pauseOnExit = !!value; + } + })); + Object.defineProperty(cue, 'startTime', extend({}, baseObj, { + get: function get() { + return _startTime; + }, + set: function set(value) { + if (typeof value !== 'number') { + throw new TypeError('Start time must be set to a number.'); + } + + _startTime = value; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'endTime', extend({}, baseObj, { + get: function get() { + return _endTime; + }, + set: function set(value) { + if (typeof value !== 'number') { + throw new TypeError('End time must be set to a number.'); + } + + _endTime = value; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'text', extend({}, baseObj, { + get: function get() { + return _text; + }, + set: function set(value) { + _text = '' + value; + this.hasBeenReset = true; + } + })); // todo: implement VTTRegion polyfill? + + Object.defineProperty(cue, 'region', extend({}, baseObj, { + get: function get() { + return _region; + }, + set: function set(value) { + _region = value; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'vertical', extend({}, baseObj, { + get: function get() { + return _vertical; + }, + set: function set(value) { + var setting = findDirectionSetting(value); // Have to check for false because the setting an be an empty string. + + if (setting === false) { + throw new SyntaxError('An invalid or illegal string was specified.'); + } + + _vertical = setting; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'snapToLines', extend({}, baseObj, { + get: function get() { + return _snapToLines; + }, + set: function set(value) { + _snapToLines = !!value; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'line', extend({}, baseObj, { + get: function get() { + return _line; + }, + set: function set(value) { + if (typeof value !== 'number' && value !== 'auto') { + throw new SyntaxError('An invalid number or illegal string was specified.'); + } + + _line = value; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'lineAlign', extend({}, baseObj, { + get: function get() { + return _lineAlign; + }, + set: function set(value) { + var setting = findAlignSetting(value); + + if (!setting) { + throw new SyntaxError('An invalid or illegal string was specified.'); + } + + _lineAlign = setting; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'position', extend({}, baseObj, { + get: function get() { + return _position; + }, + set: function set(value) { + if (value < 0 || value > 100) { + throw new Error('Position must be between 0 and 100.'); + } + + _position = value; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'positionAlign', extend({}, baseObj, { + get: function get() { + return _positionAlign; + }, + set: function set(value) { + var setting = findAlignSetting(value); + + if (!setting) { + throw new SyntaxError('An invalid or illegal string was specified.'); + } + + _positionAlign = setting; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'size', extend({}, baseObj, { + get: function get() { + return _size; + }, + set: function set(value) { + if (value < 0 || value > 100) { + throw new Error('Size must be between 0 and 100.'); + } + + _size = value; + this.hasBeenReset = true; + } + })); + Object.defineProperty(cue, 'align', extend({}, baseObj, { + get: function get() { + return _align; + }, + set: function set(value) { + var setting = findAlignSetting(value); + + if (!setting) { + throw new SyntaxError('An invalid or illegal string was specified.'); + } + + _align = setting; + this.hasBeenReset = true; + } + })); + /** + * Other <track> spec defined properties + */ + // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state + + cue.displayState = undefined; + } + /** + * VTTCue methods + */ + + + VTTCue.prototype.getCueAsHTML = function () { + // Assume WebVTT.convertCueToDOMTree is on the global. + var WebVTT = self.WebVTT; + return WebVTT.convertCueToDOMTree(self, this.text); + }; // this is a polyfill hack + + + return VTTCue; +})()); + +/***/ }), + +/***/ "./src/utils/vttparser.ts": +/*!********************************!*\ + !*** ./src/utils/vttparser.ts ***! + \********************************/ +/*! exports provided: parseTimeStamp, fixLineBreaks, VTTParser */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseTimeStamp", function() { return parseTimeStamp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fixLineBreaks", function() { return fixLineBreaks; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VTTParser", function() { return VTTParser; }); +/* harmony import */ var _vttcue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vttcue */ "./src/utils/vttcue.ts"); +/* + * Source: https://github.com/mozilla/vtt.js/blob/master/dist/vtt.js + */ + + +var StringDecoder = /*#__PURE__*/function () { + function StringDecoder() {} + + var _proto = StringDecoder.prototype; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _proto.decode = function decode(data, options) { + if (!data) { + return ''; + } + + if (typeof data !== 'string') { + throw new Error('Error - expected string data.'); + } + + return decodeURIComponent(encodeURIComponent(data)); + }; + + return StringDecoder; +}(); // Try to parse input as a time stamp. + + +function parseTimeStamp(input) { + function computeSeconds(h, m, s, f) { + return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + parseFloat(f || 0); + } + + var m = input.match(/^(?:(\d+):)?(\d{2}):(\d{2})(\.\d+)?/); + + if (!m) { + return null; + } + + if (parseFloat(m[2]) > 59) { + // Timestamp takes the form of [hours]:[minutes].[milliseconds] + // First position is hours as it's over 59. + return computeSeconds(m[2], m[3], 0, m[4]); + } // Timestamp takes the form of [hours (optional)]:[minutes]:[seconds].[milliseconds] + + + return computeSeconds(m[1], m[2], m[3], m[4]); +} // A settings object holds key/value pairs and will ignore anything but the first +// assignment to a specific key. + +var Settings = /*#__PURE__*/function () { + function Settings() { + this.values = Object.create(null); + } + + var _proto2 = Settings.prototype; + + // Only accept the first assignment to any key. + _proto2.set = function set(k, v) { + if (!this.get(k) && v !== '') { + this.values[k] = v; + } + } // Return the value for a key, or a default value. + // If 'defaultKey' is passed then 'dflt' is assumed to be an object with + // a number of possible default values as properties where 'defaultKey' is + // the key of the property that will be chosen; otherwise it's assumed to be + // a single value. + ; + + _proto2.get = function get(k, dflt, defaultKey) { + if (defaultKey) { + return this.has(k) ? this.values[k] : dflt[defaultKey]; + } + + return this.has(k) ? this.values[k] : dflt; + } // Check whether we have a value for a key. + ; + + _proto2.has = function has(k) { + return k in this.values; + } // Accept a setting if its one of the given alternatives. + ; + + _proto2.alt = function alt(k, v, a) { + for (var n = 0; n < a.length; ++n) { + if (v === a[n]) { + this.set(k, v); + break; + } + } + } // Accept a setting if its a valid (signed) integer. + ; + + _proto2.integer = function integer(k, v) { + if (/^-?\d+$/.test(v)) { + // integer + this.set(k, parseInt(v, 10)); + } + } // Accept a setting if its a valid percentage. + ; + + _proto2.percent = function percent(k, v) { + if (/^([\d]{1,3})(\.[\d]*)?%$/.test(v)) { + var percent = parseFloat(v); + + if (percent >= 0 && percent <= 100) { + this.set(k, percent); + return true; + } + } + + return false; + }; + + return Settings; +}(); // Helper function to parse input into groups separated by 'groupDelim', and +// interpret each group as a key/value pair separated by 'keyValueDelim'. + + +function parseOptions(input, callback, keyValueDelim, groupDelim) { + var groups = groupDelim ? input.split(groupDelim) : [input]; + + for (var i in groups) { + if (typeof groups[i] !== 'string') { + continue; + } + + var kv = groups[i].split(keyValueDelim); + + if (kv.length !== 2) { + continue; + } + + var _k = kv[0]; + var _v = kv[1]; + callback(_k, _v); + } +} + +var defaults = new _vttcue__WEBPACK_IMPORTED_MODULE_0__["default"](0, 0, ''); // 'middle' was changed to 'center' in the spec: https://github.com/w3c/webvtt/pull/244 +// Safari doesn't yet support this change, but FF and Chrome do. + +var center = defaults.align === 'middle' ? 'middle' : 'center'; + +function parseCue(input, cue, regionList) { + // Remember the original input if we need to throw an error. + var oInput = input; // 4.1 WebVTT timestamp + + function consumeTimeStamp() { + var ts = parseTimeStamp(input); + + if (ts === null) { + throw new Error('Malformed timestamp: ' + oInput); + } // Remove time stamp from input. + + + input = input.replace(/^[^\sa-zA-Z-]+/, ''); + return ts; + } // 4.4.2 WebVTT cue settings + + + function consumeCueSettings(input, cue) { + var settings = new Settings(); + parseOptions(input, function (k, v) { + var vals; + + switch (k) { + case 'region': + // Find the last region we parsed with the same region id. + for (var i = regionList.length - 1; i >= 0; i--) { + if (regionList[i].id === v) { + settings.set(k, regionList[i].region); + break; + } + } + + break; + + case 'vertical': + settings.alt(k, v, ['rl', 'lr']); + break; + + case 'line': + vals = v.split(','); + settings.integer(k, vals[0]); + + if (settings.percent(k, vals[0])) { + settings.set('snapToLines', false); + } + + settings.alt(k, vals[0], ['auto']); + + if (vals.length === 2) { + settings.alt('lineAlign', vals[1], ['start', center, 'end']); + } + + break; + + case 'position': + vals = v.split(','); + settings.percent(k, vals[0]); + + if (vals.length === 2) { + settings.alt('positionAlign', vals[1], ['start', center, 'end', 'line-left', 'line-right', 'auto']); + } + + break; + + case 'size': + settings.percent(k, v); + break; + + case 'align': + settings.alt(k, v, ['start', center, 'end', 'left', 'right']); + break; + } + }, /:/, /\s/); // Apply default values for any missing fields. + + cue.region = settings.get('region', null); + cue.vertical = settings.get('vertical', ''); + var line = settings.get('line', 'auto'); + + if (line === 'auto' && defaults.line === -1) { + // set numeric line number for Safari + line = -1; + } + + cue.line = line; + cue.lineAlign = settings.get('lineAlign', 'start'); + cue.snapToLines = settings.get('snapToLines', true); + cue.size = settings.get('size', 100); + cue.align = settings.get('align', center); + var position = settings.get('position', 'auto'); + + if (position === 'auto' && defaults.position === 50) { + // set numeric position for Safari + position = cue.align === 'start' || cue.align === 'left' ? 0 : cue.align === 'end' || cue.align === 'right' ? 100 : 50; + } + + cue.position = position; + } + + function skipWhitespace() { + input = input.replace(/^\s+/, ''); + } // 4.1 WebVTT cue timings. + + + skipWhitespace(); + cue.startTime = consumeTimeStamp(); // (1) collect cue start time + + skipWhitespace(); + + if (input.substr(0, 3) !== '-->') { + // (3) next characters must match '-->' + throw new Error("Malformed time stamp (time stamps must be separated by '-->'): " + oInput); + } + + input = input.substr(3); + skipWhitespace(); + cue.endTime = consumeTimeStamp(); // (5) collect cue end time + // 4.1 WebVTT cue settings list. + + skipWhitespace(); + consumeCueSettings(input, cue); +} + +function fixLineBreaks(input) { + return input.replace(/<br(?: \/)?>/gi, '\n'); +} +var VTTParser = /*#__PURE__*/function () { + function VTTParser() { + this.state = 'INITIAL'; + this.buffer = ''; + this.decoder = new StringDecoder(); + this.regionList = []; + this.cue = null; + this.oncue = void 0; + this.onparsingerror = void 0; + this.onflush = void 0; + } + + var _proto3 = VTTParser.prototype; + + _proto3.parse = function parse(data) { + var _this = this; // If there is no data then we won't decode it, but will just try to parse + // whatever is in buffer already. This may occur in circumstances, for + // example when flush() is called. + + + if (data) { + // Try to decode the data that we received. + _this.buffer += _this.decoder.decode(data, { + stream: true + }); + } + + function collectNextLine() { + var buffer = _this.buffer; + var pos = 0; + buffer = fixLineBreaks(buffer); + + while (pos < buffer.length && buffer[pos] !== '\r' && buffer[pos] !== '\n') { + ++pos; + } + + var line = buffer.substr(0, pos); // Advance the buffer early in case we fail below. + + if (buffer[pos] === '\r') { + ++pos; + } + + if (buffer[pos] === '\n') { + ++pos; + } + + _this.buffer = buffer.substr(pos); + return line; + } // 3.2 WebVTT metadata header syntax + + + function parseHeader(input) { + parseOptions(input, function (k, v) {// switch (k) { + // case 'region': + // 3.3 WebVTT region metadata header syntax + // console.log('parse region', v); + // parseRegion(v); + // break; + // } + }, /:/); + } // 5.1 WebVTT file parsing. + + + try { + var line = ''; + + if (_this.state === 'INITIAL') { + // We can't start parsing until we have the first line. + if (!/\r\n|\n/.test(_this.buffer)) { + return this; + } + + line = collectNextLine(); // strip of UTF-8 BOM if any + // https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 + + var m = line.match(/^()?WEBVTT([ \t].*)?$/); + + if (!m || !m[0]) { + throw new Error('Malformed WebVTT signature.'); + } + + _this.state = 'HEADER'; + } + + var alreadyCollectedLine = false; + + while (_this.buffer) { + // We can't parse a line until we have the full line. + if (!/\r\n|\n/.test(_this.buffer)) { + return this; + } + + if (!alreadyCollectedLine) { + line = collectNextLine(); + } else { + alreadyCollectedLine = false; + } + + switch (_this.state) { + case 'HEADER': + // 13-18 - Allow a header (metadata) under the WEBVTT line. + if (/:/.test(line)) { + parseHeader(line); + } else if (!line) { + // An empty line terminates the header and starts the body (cues). + _this.state = 'ID'; + } + + continue; + + case 'NOTE': + // Ignore NOTE blocks. + if (!line) { + _this.state = 'ID'; + } + + continue; + + case 'ID': + // Check for the start of NOTE blocks. + if (/^NOTE($|[ \t])/.test(line)) { + _this.state = 'NOTE'; + break; + } // 19-29 - Allow any number of line terminators, then initialize new cue values. + + + if (!line) { + continue; + } + + _this.cue = new _vttcue__WEBPACK_IMPORTED_MODULE_0__["default"](0, 0, ''); + _this.state = 'CUE'; // 30-39 - Check if self line contains an optional identifier or timing data. + + if (line.indexOf('-->') === -1) { + _this.cue.id = line; + continue; + } + + // Process line as start of a cue. + + /* falls through */ + + case 'CUE': + // 40 - Collect cue timings and settings. + if (!_this.cue) { + _this.state = 'BADCUE'; + continue; + } + + try { + parseCue(line, _this.cue, _this.regionList); + } catch (e) { + // In case of an error ignore rest of the cue. + _this.cue = null; + _this.state = 'BADCUE'; + continue; + } + + _this.state = 'CUETEXT'; + continue; + + case 'CUETEXT': + { + var hasSubstring = line.indexOf('-->') !== -1; // 34 - If we have an empty line then report the cue. + // 35 - If we have the special substring '-->' then report the cue, + // but do not collect the line as we need to process the current + // one as a new cue. + + if (!line || hasSubstring && (alreadyCollectedLine = true)) { + // We are done parsing self cue. + if (_this.oncue && _this.cue) { + _this.oncue(_this.cue); + } + + _this.cue = null; + _this.state = 'ID'; + continue; + } + + if (_this.cue === null) { + continue; + } + + if (_this.cue.text) { + _this.cue.text += '\n'; + } + + _this.cue.text += line; + } + continue; + + case 'BADCUE': + // 54-62 - Collect and discard the remaining cue. + if (!line) { + _this.state = 'ID'; + } + + } + } + } catch (e) { + // If we are currently parsing a cue, report what we have. + if (_this.state === 'CUETEXT' && _this.cue && _this.oncue) { + _this.oncue(_this.cue); + } + + _this.cue = null; // Enter BADWEBVTT state if header was not parsed correctly otherwise + // another exception occurred so enter BADCUE state. + + _this.state = _this.state === 'INITIAL' ? 'BADWEBVTT' : 'BADCUE'; + } + + return this; + }; + + _proto3.flush = function flush() { + var _this = this; + + try { + // Finish decoding the stream. + // _this.buffer += _this.decoder.decode(); + // Synthesize the end of the current cue or region. + if (_this.cue || _this.state === 'HEADER') { + _this.buffer += '\n\n'; + + _this.parse(); + } // If we've flushed, parsed, and we're still on the INITIAL state then + // that means we don't have enough of the stream to parse the first + // line. + + + if (_this.state === 'INITIAL' || _this.state === 'BADWEBVTT') { + throw new Error('Malformed WebVTT signature.'); + } + } catch (e) { + if (_this.onparsingerror) { + _this.onparsingerror(e); + } + } + + if (_this.onflush) { + _this.onflush(); + } + + return this; + }; + + return VTTParser; +}(); + +/***/ }), + +/***/ "./src/utils/webvtt-parser.ts": +/*!************************************!*\ + !*** ./src/utils/webvtt-parser.ts ***! + \************************************/ +/*! exports provided: generateCueId, parseWebVTT */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generateCueId", function() { return generateCueId; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseWebVTT", function() { return parseWebVTT; }); +/* harmony import */ var _home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/polyfills/number */ "./src/polyfills/number.ts"); +/* harmony import */ var _vttparser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vttparser */ "./src/utils/vttparser.ts"); +/* harmony import */ var _demux_id3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../demux/id3 */ "./src/demux/id3.ts"); +/* harmony import */ var _timescale_conversion__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./timescale-conversion */ "./src/utils/timescale-conversion.ts"); +/* harmony import */ var _remux_mp4_remuxer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../remux/mp4-remuxer */ "./src/remux/mp4-remuxer.ts"); + + + + + + + + +var LINEBREAKS = /\r\n|\n\r|\n|\r/g; // String.prototype.startsWith is not supported in IE11 + +var startsWith = function startsWith(inputString, searchString, position) { + if (position === void 0) { + position = 0; + } + + return inputString.substr(position, searchString.length) === searchString; +}; + +var cueString2millis = function cueString2millis(timeString) { + var ts = parseInt(timeString.substr(-3)); + var secs = parseInt(timeString.substr(-6, 2)); + var mins = parseInt(timeString.substr(-9, 2)); + var hours = timeString.length > 9 ? parseInt(timeString.substr(0, timeString.indexOf(':'))) : 0; + + if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(ts) || !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(secs) || !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(mins) || !Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(hours)) { + throw Error("Malformed X-TIMESTAMP-MAP: Local:" + timeString); + } + + ts += 1000 * secs; + ts += 60 * 1000 * mins; + ts += 60 * 60 * 1000 * hours; + return ts; +}; // From https://github.com/darkskyapp/string-hash + + +var hash = function hash(text) { + var hash = 5381; + var i = text.length; + + while (i) { + hash = hash * 33 ^ text.charCodeAt(--i); + } + + return (hash >>> 0).toString(); +}; // Create a unique hash id for a cue based on start/end times and text. +// This helps timeline-controller to avoid showing repeated captions. + + +function generateCueId(startTime, endTime, text) { + return hash(startTime.toString()) + hash(endTime.toString()) + hash(text); +} + +var calculateOffset = function calculateOffset(vttCCs, cc, presentationTime) { + var currCC = vttCCs[cc]; + var prevCC = vttCCs[currCC.prevCC]; // This is the first discontinuity or cues have been processed since the last discontinuity + // Offset = current discontinuity time + + if (!prevCC || !prevCC.new && currCC.new) { + vttCCs.ccOffset = vttCCs.presentationOffset = currCC.start; + currCC.new = false; + return; + } // There have been discontinuities since cues were last parsed. + // Offset = time elapsed + + + while ((_prevCC = prevCC) !== null && _prevCC !== void 0 && _prevCC.new) { + var _prevCC; + + vttCCs.ccOffset += currCC.start - prevCC.start; + currCC.new = false; + currCC = prevCC; + prevCC = vttCCs[currCC.prevCC]; + } + + vttCCs.presentationOffset = presentationTime; +}; + +function parseWebVTT(vttByteArray, initPTS, timescale, vttCCs, cc, timeOffset, callBack, errorCallBack) { + var parser = new _vttparser__WEBPACK_IMPORTED_MODULE_1__["VTTParser"](); // Convert byteArray into string, replacing any somewhat exotic linefeeds with "\n", then split on that character. + // Uint8Array.prototype.reduce is not implemented in IE11 + + var vttLines = Object(_demux_id3__WEBPACK_IMPORTED_MODULE_2__["utf8ArrayToStr"])(new Uint8Array(vttByteArray)).trim().replace(LINEBREAKS, '\n').split('\n'); + var cues = []; + var initPTS90Hz = Object(_timescale_conversion__WEBPACK_IMPORTED_MODULE_3__["toMpegTsClockFromTimescale"])(initPTS, timescale); + var cueTime = '00:00.000'; + var timestampMapMPEGTS = 0; + var timestampMapLOCAL = 0; + var parsingError; + var inHeader = true; + var timestampMap = false; + + parser.oncue = function (cue) { + // Adjust cue timing; clamp cues to start no earlier than - and drop cues that don't end after - 0 on timeline. + var currCC = vttCCs[cc]; + var cueOffset = vttCCs.ccOffset; // Calculate subtitle PTS offset + + var webVttMpegTsMapOffset = (timestampMapMPEGTS - initPTS90Hz) / 90000; // Update offsets for new discontinuities + + if (currCC !== null && currCC !== void 0 && currCC.new) { + if (timestampMapLOCAL !== undefined) { + // When local time is provided, offset = discontinuity start time - local time + cueOffset = vttCCs.ccOffset = currCC.start; + } else { + calculateOffset(vttCCs, cc, webVttMpegTsMapOffset); + } + } + + if (webVttMpegTsMapOffset) { + // If we have MPEGTS, offset = presentation time + discontinuity offset + cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset; + } + + if (timestampMap) { + var duration = cue.endTime - cue.startTime; + var startTime = Object(_remux_mp4_remuxer__WEBPACK_IMPORTED_MODULE_4__["normalizePts"])((cue.startTime + cueOffset - timestampMapLOCAL) * 90000, timeOffset * 90000) / 90000; + cue.startTime = startTime; + cue.endTime = startTime + duration; + } //trim trailing webvtt block whitespaces + + + var text = cue.text.trim(); // Fix encoding of special characters + + cue.text = decodeURIComponent(encodeURIComponent(text)); // If the cue was not assigned an id from the VTT file (line above the content), create one. + + if (!cue.id) { + cue.id = generateCueId(cue.startTime, cue.endTime, text); + } + + if (cue.endTime > 0) { + cues.push(cue); + } + }; + + parser.onparsingerror = function (error) { + parsingError = error; + }; + + parser.onflush = function () { + if (parsingError) { + errorCallBack(parsingError); + return; + } + + callBack(cues); + }; // Go through contents line by line. + + + vttLines.forEach(function (line) { + if (inHeader) { + // Look for X-TIMESTAMP-MAP in header. + if (startsWith(line, 'X-TIMESTAMP-MAP=')) { + // Once found, no more are allowed anyway, so stop searching. + inHeader = false; + timestampMap = true; // Extract LOCAL and MPEGTS. + + line.substr(16).split(',').forEach(function (timestamp) { + if (startsWith(timestamp, 'LOCAL:')) { + cueTime = timestamp.substr(6); + } else if (startsWith(timestamp, 'MPEGTS:')) { + timestampMapMPEGTS = parseInt(timestamp.substr(7)); + } + }); + + try { + // Convert cue time to seconds + timestampMapLOCAL = cueString2millis(cueTime) / 1000; + } catch (error) { + timestampMap = false; + parsingError = error; + } // Return without parsing X-TIMESTAMP-MAP line. + + + return; + } else if (line === '') { + inHeader = false; + } + } // Parse line by default. + + + parser.parse(line + '\n'); + }); + parser.flush(); +} + +/***/ }), + +/***/ "./src/utils/xhr-loader.ts": +/*!*********************************!*\ + !*** ./src/utils/xhr-loader.ts ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts"); +/* harmony import */ var _loader_load_stats__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../loader/load-stats */ "./src/loader/load-stats.ts"); + + +var AGE_HEADER_LINE_REGEX = /^age:\s*[\d.]+\s*$/m; + +var XhrLoader = /*#__PURE__*/function () { + function XhrLoader(config + /* HlsConfig */ + ) { + this.xhrSetup = void 0; + this.requestTimeout = void 0; + this.retryTimeout = void 0; + this.retryDelay = void 0; + this.config = null; + this.callbacks = null; + this.context = void 0; + this.loader = null; + this.stats = void 0; + this.xhrSetup = config ? config.xhrSetup : null; + this.stats = new _loader_load_stats__WEBPACK_IMPORTED_MODULE_1__["LoadStats"](); + this.retryDelay = 0; + } + + var _proto = XhrLoader.prototype; + + _proto.destroy = function destroy() { + this.callbacks = null; + this.abortInternal(); + this.loader = null; + this.config = null; + }; + + _proto.abortInternal = function abortInternal() { + var loader = this.loader; + self.clearTimeout(this.requestTimeout); + self.clearTimeout(this.retryTimeout); + + if (loader) { + loader.onreadystatechange = null; + loader.onprogress = null; + + if (loader.readyState !== 4) { + this.stats.aborted = true; + loader.abort(); + } + } + }; + + _proto.abort = function abort() { + var _this$callbacks; + + this.abortInternal(); + + if ((_this$callbacks = this.callbacks) !== null && _this$callbacks !== void 0 && _this$callbacks.onAbort) { + this.callbacks.onAbort(this.stats, this.context, this.loader); + } + }; + + _proto.load = function load(context, config, callbacks) { + if (this.stats.loading.start) { + throw new Error('Loader can only be used once.'); + } + + this.stats.loading.start = self.performance.now(); + this.context = context; + this.config = config; + this.callbacks = callbacks; + this.retryDelay = config.retryDelay; + this.loadInternal(); + }; + + _proto.loadInternal = function loadInternal() { + var config = this.config, + context = this.context; + + if (!config) { + return; + } + + var xhr = this.loader = new self.XMLHttpRequest(); + var stats = this.stats; + stats.loading.first = 0; + stats.loaded = 0; + var xhrSetup = this.xhrSetup; + + try { + if (xhrSetup) { + try { + xhrSetup(xhr, context.url); + } catch (e) { + // fix xhrSetup: (xhr, url) => {xhr.setRequestHeader("Content-Language", "test");} + // not working, as xhr.setRequestHeader expects xhr.readyState === OPEN + xhr.open('GET', context.url, true); + xhrSetup(xhr, context.url); + } + } + + if (!xhr.readyState) { + xhr.open('GET', context.url, true); + } + + var headers = this.context.headers; + + if (headers) { + for (var header in headers) { + xhr.setRequestHeader(header, headers[header]); + } + } + } catch (e) { + // IE11 throws an exception on xhr.open if attempting to access an HTTP resource over HTTPS + this.callbacks.onError({ + code: xhr.status, + text: e.message + }, context, xhr); + return; + } + + if (context.rangeEnd) { + xhr.setRequestHeader('Range', 'bytes=' + context.rangeStart + '-' + (context.rangeEnd - 1)); + } + + xhr.onreadystatechange = this.readystatechange.bind(this); + xhr.onprogress = this.loadprogress.bind(this); + xhr.responseType = context.responseType; // setup timeout before we perform request + + self.clearTimeout(this.requestTimeout); + this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), config.timeout); + xhr.send(); + }; + + _proto.readystatechange = function readystatechange() { + var context = this.context, + xhr = this.loader, + stats = this.stats; + + if (!context || !xhr) { + return; + } + + var readyState = xhr.readyState; + var config = this.config; // don't proceed if xhr has been aborted + + if (stats.aborted) { + return; + } // >= HEADERS_RECEIVED + + + if (readyState >= 2) { + // clear xhr timeout and rearm it if readyState less than 4 + self.clearTimeout(this.requestTimeout); + + if (stats.loading.first === 0) { + stats.loading.first = Math.max(self.performance.now(), stats.loading.start); + } + + if (readyState === 4) { + xhr.onreadystatechange = null; + xhr.onprogress = null; + var status = xhr.status; // http status between 200 to 299 are all successful + + if (status >= 200 && status < 300) { + stats.loading.end = Math.max(self.performance.now(), stats.loading.first); + var data; + var len; + + if (context.responseType === 'arraybuffer') { + data = xhr.response; + len = data.byteLength; + } else { + data = xhr.responseText; + len = data.length; + } + + stats.loaded = stats.total = len; + + if (!this.callbacks) { + return; + } + + var onProgress = this.callbacks.onProgress; + + if (onProgress) { + onProgress(stats, context, data, xhr); + } + + if (!this.callbacks) { + return; + } + + var response = { + url: xhr.responseURL, + data: data + }; + this.callbacks.onSuccess(response, stats, context, xhr); + } else { + // if max nb of retries reached or if http status between 400 and 499 (such error cannot be recovered, retrying is useless), return error + if (stats.retry >= config.maxRetry || status >= 400 && status < 499) { + _utils_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error(status + " while loading " + context.url); + this.callbacks.onError({ + code: status, + text: xhr.statusText + }, context, xhr); + } else { + // retry + _utils_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn(status + " while loading " + context.url + ", retrying in " + this.retryDelay + "..."); // abort and reset internal state + + this.abortInternal(); + this.loader = null; // schedule retry + + self.clearTimeout(this.retryTimeout); + this.retryTimeout = self.setTimeout(this.loadInternal.bind(this), this.retryDelay); // set exponential backoff + + this.retryDelay = Math.min(2 * this.retryDelay, config.maxRetryDelay); + stats.retry++; + } + } + } else { + // readyState >= 2 AND readyState !==4 (readyState = HEADERS_RECEIVED || LOADING) rearm timeout as xhr not finished yet + self.clearTimeout(this.requestTimeout); + this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), config.timeout); + } + } + }; + + _proto.loadtimeout = function loadtimeout() { + _utils_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn("timeout while loading " + this.context.url); + var callbacks = this.callbacks; + + if (callbacks) { + this.abortInternal(); + callbacks.onTimeout(this.stats, this.context, this.loader); + } + }; + + _proto.loadprogress = function loadprogress(event) { + var stats = this.stats; + stats.loaded = event.loaded; + + if (event.lengthComputable) { + stats.total = event.total; + } + }; + + _proto.getCacheAge = function getCacheAge() { + var result = null; + + if (this.loader && AGE_HEADER_LINE_REGEX.test(this.loader.getAllResponseHeaders())) { + var ageHeader = this.loader.getResponseHeader('age'); + result = ageHeader ? parseFloat(ageHeader) : null; + } + + return result; + }; + + return XhrLoader; +}(); + +/* harmony default export */ __webpack_exports__["default"] = (XhrLoader); + +/***/ }) + +/******/ })["default"]; +}); +//# sourceMappingURL=hls.js.map \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/hls.js/hls.min.js b/modules/core/src/main/resources/static/ckplayer/hls.js/hls.min.js new file mode 100644 index 00000000..1d469397 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/hls.js/hls.min.js @@ -0,0 +1 @@ +"undefined"!=typeof window&&function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Hls=e():t.Hls=e()}(this,(function(){return function(t){var e={};function r(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return t[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,i){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(i,n,function(e){return t[e]}.bind(null,n));return i},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="/dist/",r(r.s=20)}([function(t,e,r){"use strict";var i;r.d(e,"a",(function(){return i})),function(t){t.MEDIA_ATTACHING="hlsMediaAttaching",t.MEDIA_ATTACHED="hlsMediaAttached",t.MEDIA_DETACHING="hlsMediaDetaching",t.MEDIA_DETACHED="hlsMediaDetached",t.BUFFER_RESET="hlsBufferReset",t.BUFFER_CODECS="hlsBufferCodecs",t.BUFFER_CREATED="hlsBufferCreated",t.BUFFER_APPENDING="hlsBufferAppending",t.BUFFER_APPENDED="hlsBufferAppended",t.BUFFER_EOS="hlsBufferEos",t.BUFFER_FLUSHING="hlsBufferFlushing",t.BUFFER_FLUSHED="hlsBufferFlushed",t.MANIFEST_LOADING="hlsManifestLoading",t.MANIFEST_LOADED="hlsManifestLoaded",t.MANIFEST_PARSED="hlsManifestParsed",t.LEVEL_SWITCHING="hlsLevelSwitching",t.LEVEL_SWITCHED="hlsLevelSwitched",t.LEVEL_LOADING="hlsLevelLoading",t.LEVEL_LOADED="hlsLevelLoaded",t.LEVEL_UPDATED="hlsLevelUpdated",t.LEVEL_PTS_UPDATED="hlsLevelPtsUpdated",t.LEVELS_UPDATED="hlsLevelsUpdated",t.AUDIO_TRACKS_UPDATED="hlsAudioTracksUpdated",t.AUDIO_TRACK_SWITCHING="hlsAudioTrackSwitching",t.AUDIO_TRACK_SWITCHED="hlsAudioTrackSwitched",t.AUDIO_TRACK_LOADING="hlsAudioTrackLoading",t.AUDIO_TRACK_LOADED="hlsAudioTrackLoaded",t.SUBTITLE_TRACKS_UPDATED="hlsSubtitleTracksUpdated",t.SUBTITLE_TRACKS_CLEARED="hlsSubtitleTracksCleared",t.SUBTITLE_TRACK_SWITCH="hlsSubtitleTrackSwitch",t.SUBTITLE_TRACK_LOADING="hlsSubtitleTrackLoading",t.SUBTITLE_TRACK_LOADED="hlsSubtitleTrackLoaded",t.SUBTITLE_FRAG_PROCESSED="hlsSubtitleFragProcessed",t.CUES_PARSED="hlsCuesParsed",t.NON_NATIVE_TEXT_TRACKS_FOUND="hlsNonNativeTextTracksFound",t.INIT_PTS_FOUND="hlsInitPtsFound",t.FRAG_LOADING="hlsFragLoading",t.FRAG_LOAD_EMERGENCY_ABORTED="hlsFragLoadEmergencyAborted",t.FRAG_LOADED="hlsFragLoaded",t.FRAG_DECRYPTED="hlsFragDecrypted",t.FRAG_PARSING_INIT_SEGMENT="hlsFragParsingInitSegment",t.FRAG_PARSING_USERDATA="hlsFragParsingUserdata",t.FRAG_PARSING_METADATA="hlsFragParsingMetadata",t.FRAG_PARSED="hlsFragParsed",t.FRAG_BUFFERED="hlsFragBuffered",t.FRAG_CHANGED="hlsFragChanged",t.FPS_DROP="hlsFpsDrop",t.FPS_DROP_LEVEL_CAPPING="hlsFpsDropLevelCapping",t.ERROR="hlsError",t.DESTROYING="hlsDestroying",t.KEY_LOADING="hlsKeyLoading",t.KEY_LOADED="hlsKeyLoaded",t.LIVE_BACK_BUFFER_REACHED="hlsLiveBackBufferReached",t.BACK_BUFFER_REACHED="hlsBackBufferReached"}(i||(i={}))},function(t,e,r){"use strict";r.d(e,"a",(function(){return o})),r.d(e,"b",(function(){return l}));var i=function(){},n={trace:i,debug:i,log:i,warn:i,info:i,error:i},a=n;function s(t){var e=self.console[t];return e?e.bind(self.console,"["+t+"] >"):i}function o(t){if(self.console&&!0===t||"object"==typeof t){!function(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;i<e;i++)r[i-1]=arguments[i];r.forEach((function(e){a[e]=t[e]?t[e].bind(t):s(e)}))}(t,"debug","log","info","warn","error");try{a.log()}catch(t){a=n}}else a=n}var l=n},function(t,e,r){"use strict";var i,n;r.d(e,"b",(function(){return i})),r.d(e,"a",(function(){return n})),function(t){t.NETWORK_ERROR="networkError",t.MEDIA_ERROR="mediaError",t.KEY_SYSTEM_ERROR="keySystemError",t.MUX_ERROR="muxError",t.OTHER_ERROR="otherError"}(i||(i={})),function(t){t.KEY_SYSTEM_NO_KEYS="keySystemNoKeys",t.KEY_SYSTEM_NO_ACCESS="keySystemNoAccess",t.KEY_SYSTEM_NO_SESSION="keySystemNoSession",t.KEY_SYSTEM_LICENSE_REQUEST_FAILED="keySystemLicenseRequestFailed",t.KEY_SYSTEM_NO_INIT_DATA="keySystemNoInitData",t.MANIFEST_LOAD_ERROR="manifestLoadError",t.MANIFEST_LOAD_TIMEOUT="manifestLoadTimeOut",t.MANIFEST_PARSING_ERROR="manifestParsingError",t.MANIFEST_INCOMPATIBLE_CODECS_ERROR="manifestIncompatibleCodecsError",t.LEVEL_EMPTY_ERROR="levelEmptyError",t.LEVEL_LOAD_ERROR="levelLoadError",t.LEVEL_LOAD_TIMEOUT="levelLoadTimeOut",t.LEVEL_SWITCH_ERROR="levelSwitchError",t.AUDIO_TRACK_LOAD_ERROR="audioTrackLoadError",t.AUDIO_TRACK_LOAD_TIMEOUT="audioTrackLoadTimeOut",t.SUBTITLE_LOAD_ERROR="subtitleTrackLoadError",t.SUBTITLE_TRACK_LOAD_TIMEOUT="subtitleTrackLoadTimeOut",t.FRAG_LOAD_ERROR="fragLoadError",t.FRAG_LOAD_TIMEOUT="fragLoadTimeOut",t.FRAG_DECRYPT_ERROR="fragDecryptError",t.FRAG_PARSING_ERROR="fragParsingError",t.REMUX_ALLOC_ERROR="remuxAllocError",t.KEY_LOAD_ERROR="keyLoadError",t.KEY_LOAD_TIMEOUT="keyLoadTimeOut",t.BUFFER_ADD_CODEC_ERROR="bufferAddCodecError",t.BUFFER_INCOMPATIBLE_CODECS_ERROR="bufferIncompatibleCodecsError",t.BUFFER_APPEND_ERROR="bufferAppendError",t.BUFFER_APPENDING_ERROR="bufferAppendingError",t.BUFFER_STALLED_ERROR="bufferStalledError",t.BUFFER_FULL_ERROR="bufferFullError",t.BUFFER_SEEK_OVER_HOLE="bufferSeekOverHole",t.BUFFER_NUDGE_ON_STALL="bufferNudgeOnStall",t.INTERNAL_EXCEPTION="internalException",t.INTERNAL_ABORTED="aborted",t.UNKNOWN="unknown"}(n||(n={}))},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var i=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)};Number.MAX_SAFE_INTEGER},function(t,e,r){"use strict";var i,n;r.d(e,"a",(function(){return i})),r.d(e,"b",(function(){return n})),function(t){t.MANIFEST="manifest",t.LEVEL="level",t.AUDIO_TRACK="audioTrack",t.SUBTITLE_TRACK="subtitleTrack"}(i||(i={})),function(t){t.MAIN="main",t.AUDIO="audio",t.SUBTITLE="subtitle"}(n||(n={}))},function(t,e,r){"use strict";r.d(e,"a",(function(){return i})),r.d(e,"b",(function(){return g})),r.d(e,"c",(function(){return v}));var i,n=r(3),a=r(11),s=r(1),o=r(17),l=r(12);function u(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,h(t,e)}function h(t,e){return(h=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function d(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function c(t,e,r){return e&&d(t.prototype,e),r&&d(t,r),t}!function(t){t.AUDIO="audio",t.VIDEO="video",t.AUDIOVIDEO="audiovideo"}(i||(i={}));var f=function(){function t(t){var e;this._byteRange=null,this._url=null,this.baseurl=void 0,this.relurl=void 0,this.elementaryStreams=((e={})[i.AUDIO]=null,e[i.VIDEO]=null,e[i.AUDIOVIDEO]=null,e),this.baseurl=t}return t.prototype.setByteRange=function(t,e){var r=t.split("@",2),i=[];1===r.length?i[0]=e?e.byteRangeEndOffset:0:i[0]=parseInt(r[1]),i[1]=parseInt(r[0])+i[0],this._byteRange=i},c(t,[{key:"byteRange",get:function(){return this._byteRange?this._byteRange:[]}},{key:"byteRangeStartOffset",get:function(){return this.byteRange[0]}},{key:"byteRangeEndOffset",get:function(){return this.byteRange[1]}},{key:"url",get:function(){return!this._url&&this.baseurl&&this.relurl&&(this._url=Object(a.buildAbsoluteURL)(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url||""},set:function(t){this._url=t}}]),t}(),g=function(t){function e(e,r){var i;return(i=t.call(this,r)||this)._decryptdata=null,i.rawProgramDateTime=null,i.programDateTime=null,i.tagList=[],i.duration=0,i.sn=0,i.levelkey=void 0,i.type=void 0,i.loader=null,i.level=-1,i.cc=0,i.startPTS=void 0,i.endPTS=void 0,i.appendedPTS=void 0,i.startDTS=void 0,i.endDTS=void 0,i.start=0,i.deltaPTS=void 0,i.maxStartPTS=void 0,i.minEndPTS=void 0,i.stats=new l.a,i.urlId=0,i.data=void 0,i.bitrateTest=!1,i.title=null,i.initSegment=null,i.type=e,i}u(e,t);var r=e.prototype;return r.createInitializationVector=function(t){for(var e=new Uint8Array(16),r=12;r<16;r++)e[r]=t>>8*(15-r)&255;return e},r.setDecryptDataFromLevelKey=function(t,e){var r=t;return"AES-128"===(null==t?void 0:t.method)&&t.uri&&!t.iv&&((r=o.a.fromURI(t.uri)).method=t.method,r.iv=this.createInitializationVector(e),r.keyFormat="identity"),r},r.setElementaryStreamInfo=function(t,e,r,i,n,a){void 0===a&&(a=!1);var s=this.elementaryStreams,o=s[t];o?(o.startPTS=Math.min(o.startPTS,e),o.endPTS=Math.max(o.endPTS,r),o.startDTS=Math.min(o.startDTS,i),o.endDTS=Math.max(o.endDTS,n)):s[t]={startPTS:e,endPTS:r,startDTS:i,endDTS:n,partial:a}},r.clearElementaryStreamInfo=function(){var t=this.elementaryStreams;t[i.AUDIO]=null,t[i.VIDEO]=null,t[i.AUDIOVIDEO]=null},c(e,[{key:"decryptdata",get:function(){if(!this.levelkey&&!this._decryptdata)return null;if(!this._decryptdata&&this.levelkey){var t=this.sn;"number"!=typeof t&&(this.levelkey&&"AES-128"===this.levelkey.method&&!this.levelkey.iv&&s.b.warn('missing IV for initialization segment with method="'+this.levelkey.method+'" - compliance issue'),t=0),this._decryptdata=this.setDecryptDataFromLevelKey(this.levelkey,t)}return this._decryptdata}},{key:"end",get:function(){return this.start+this.duration}},{key:"endProgramDateTime",get:function(){if(null===this.programDateTime)return null;if(!Object(n.a)(this.programDateTime))return null;var t=Object(n.a)(this.duration)?this.duration:0;return this.programDateTime+1e3*t}},{key:"encrypted",get:function(){var t;return!(null===(t=this.decryptdata)||void 0===t||!t.keyFormat||!this.decryptdata.uri)}}]),e}(f),v=function(t){function e(e,r,i,n,a){var s;(s=t.call(this,i)||this).fragOffset=0,s.duration=0,s.gap=!1,s.independent=!1,s.relurl=void 0,s.fragment=void 0,s.index=void 0,s.stats=new l.a,s.duration=e.decimalFloatingPoint("DURATION"),s.gap=e.bool("GAP"),s.independent=e.bool("INDEPENDENT"),s.relurl=e.enumeratedString("URI"),s.fragment=r,s.index=n;var o=e.enumeratedString("BYTERANGE");return o&&s.setByteRange(o,a),a&&(s.fragOffset=a.fragOffset+a.duration),s}return u(e,t),c(e,[{key:"start",get:function(){return this.fragment.start+this.fragOffset}},{key:"end",get:function(){return this.start+this.duration}},{key:"loaded",get:function(){var t=this.elementaryStreams;return!!(t.audio||t.video||t.audiovideo)}}]),e}(f)},function(t,e,r){"use strict";r.d(e,"b",(function(){return h})),r.d(e,"g",(function(){return d})),r.d(e,"f",(function(){return c})),r.d(e,"d",(function(){return f})),r.d(e,"c",(function(){return g})),r.d(e,"e",(function(){return p})),r.d(e,"h",(function(){return m})),r.d(e,"a",(function(){return y}));var i=r(9),n=r(5),a=Math.pow(2,32)-1,s=[].push;function o(t){return String.fromCharCode.apply(null,t)}function l(t,e){"data"in t&&(e+=t.start,t=t.data);var r=t[e]<<24|t[e+1]<<16|t[e+2]<<8|t[e+3];return r<0?4294967296+r:r}function u(t,e,r){"data"in t&&(e+=t.start,t=t.data),t[e]=r>>24,t[e+1]=r>>16&255,t[e+2]=r>>8&255,t[e+3]=255&r}function h(t,e){var r,i,n,a=[];if(!e.length)return a;"data"in t?(r=t.data,i=t.start,n=t.end):(i=0,n=(r=t).byteLength);for(var u=i;u<n;){var d=l(r,u),c=d>1?u+d:n;if(o(r.subarray(u+4,u+8))===e[0])if(1===e.length)a.push({data:r,start:u+8,end:c});else{var f=h({data:r,start:u+8,end:c},e.slice(1));f.length&&s.apply(a,f)}u=c}return a}function d(t){var e=h(t,["moov"])[0],r=e?e.end:null,i=h(t,["sidx"]);if(!i||!i[0])return null;var n=[],a=i[0],s=a.data[0],o=0===s?8:16,u=l(a,o);o+=4;o+=0===s?8:16,o+=2;var d=a.end+0,c=function(t,e){"data"in t&&(e+=t.start,t=t.data);var r=t[e]<<8|t[e+1];return r<0?65536+r:r}(a,o);o+=2;for(var f=0;f<c;f++){var g=o,v=l(a,g);g+=4;var p=2147483647&v;if(1===(2147483648&v)>>>31)return console.warn("SIDX has hierarchical references (not supported)"),null;var m=l(a,g);g+=4,n.push({referenceSize:p,subsegmentDuration:m,info:{duration:m/u,start:d,end:d+p-1}}),d+=p,o=g+=4}return{earliestPresentationTime:0,timescale:u,version:s,referencesCount:c,references:n,moovEndOffset:r}}function c(t){for(var e=[],r=h(t,["moov","trak"]),i=0;i<r.length;i++){var a=r[i],s=h(a,["tkhd"])[0];if(s){var u=s.data[s.start],d=0===u?12:20,c=l(s,d),f=h(a,["mdia","mdhd"])[0];if(f){var g=l(f,d=0===(u=f.data[f.start])?12:20),v=h(a,["mdia","hdlr"])[0];if(v){var p=o(v.data.subarray(v.start+8,v.start+12)),m={soun:n.a.AUDIO,vide:n.a.VIDEO}[p];if(m){var y=h(a,["mdia","minf","stbl","stsd"])[0],T=void 0;y&&(T=o(y.data.subarray(y.start+12,y.start+16))),e[c]={timescale:g,type:m},e[m]={timescale:g,id:c,codec:T}}}}}}return h(t,["moov","mvex","trex"]).forEach((function(t){var r=l(t,4),i=e[r];i&&(i.default={duration:l(t,12),flags:l(t,20)})})),e}function f(t,e){return h(e,["moof","traf"]).reduce((function(e,r){var i=h(r,["tfdt"])[0],n=i.data[i.start],a=h(r,["tfhd"]).reduce((function(e,r){var a=l(r,4),s=t[a];if(s){var o=l(i,4);1===n&&(o*=Math.pow(2,32),o+=l(i,8));var u=o/(s.timescale||9e4);if(isFinite(u)&&(null===e||u<e))return u}return e}),null);return null!==a&&isFinite(a)&&(null===e||a<e)?a:e}),null)||0}function g(t,e){for(var r=0,i=0,a=0,s=h(t,["moof","traf"]),o=0;o<s.length;o++){var u=s[o],c=h(u,["tfhd"])[0],f=e[l(c,4)];if(f){var g=f.default,p=l(c,0)|(null==g?void 0:g.flags),m=null==g?void 0:g.duration;8&p&&(m=l(c,2&p?12:8));for(var y=f.timescale||9e4,T=h(u,["trun"]),b=0;b<T.length;b++){if(m)r=m*l(T[b],4);else r=v(T[b]);f.type===n.a.VIDEO?i+=r/y:f.type===n.a.AUDIO&&(a+=r/y)}}}if(0===i&&0===a){var E=d(t);if(null!=E&&E.references)return E.references.reduce((function(t,e){return t+e.info.duration||0}),0)}return i||a}function v(t){var e=l(t,0),r=8;1&e&&(r+=4),4&e&&(r+=4);for(var i=0,n=l(t,4),a=0;a<n;a++){if(256&e)i+=l(t,r),r+=4;512&e&&(r+=4),1024&e&&(r+=4),2048&e&&(r+=4)}return i}function p(t,e,r){h(e,["moof","traf"]).forEach((function(e){h(e,["tfhd"]).forEach((function(i){var n=l(i,4),s=t[n];if(s){var o=s.timescale||9e4;h(e,["tfdt"]).forEach((function(t){var e=t.data[t.start],i=l(t,4);if(0===e)u(t,4,i-r*o);else{i*=Math.pow(2,32),i+=l(t,8),i-=r*o,i=Math.max(i,0);var n=Math.floor(i/(a+1)),s=Math.floor(i%(a+1));u(t,4,n),u(t,8,s)}}))}}))}))}function m(t){var e={valid:null,remainder:null},r=h(t,["moof"]);if(!r)return e;if(r.length<2)return e.remainder=t,e;var n=r[r.length-1];return e.valid=Object(i.a)(t,0,n.start-8),e.remainder=Object(i.a)(t,n.start-8),e}function y(t,e){var r=new Uint8Array(t.length+e.length);return r.set(t),r.set(e,t.length),r}},function(t,e,r){"use strict";r.d(e,"b",(function(){return s})),r.d(e,"a",(function(){return l})),r.d(e,"d",(function(){return u})),r.d(e,"e",(function(){return h})),r.d(e,"c",(function(){return c})),r.d(e,"f",(function(){return y}));var i,n=function(t,e){return e+10<=t.length&&73===t[e]&&68===t[e+1]&&51===t[e+2]&&t[e+3]<255&&t[e+4]<255&&t[e+6]<128&&t[e+7]<128&&t[e+8]<128&&t[e+9]<128},a=function(t,e){return e+10<=t.length&&51===t[e]&&68===t[e+1]&&73===t[e+2]&&t[e+3]<255&&t[e+4]<255&&t[e+6]<128&&t[e+7]<128&&t[e+8]<128&&t[e+9]<128},s=function(t,e){for(var r=e,i=0;n(t,e);){i+=10,i+=o(t,e+6),a(t,e+10)&&(i+=10),e+=i}if(i>0)return t.subarray(r,r+i)},o=function(t,e){var r=0;return r=(127&t[e])<<21,r|=(127&t[e+1])<<14,r|=(127&t[e+2])<<7,r|=127&t[e+3]},l=function(t,e){return n(t,e)&&o(t,e+6)+10<=t.length-e},u=function(t){for(var e=c(t),r=0;r<e.length;r++){var i=e[r];if(h(i))return m(i)}},h=function(t){return t&&"PRIV"===t.key&&"com.apple.streaming.transportStreamTimestamp"===t.info},d=function(t){var e=String.fromCharCode(t[0],t[1],t[2],t[3]),r=o(t,4);return{type:e,size:r,data:t.subarray(10,10+r)}},c=function(t){for(var e=0,r=[];n(t,e);){for(var i=o(t,e+6),s=(e+=10)+i;e+8<s;){var l=d(t.subarray(e)),u=f(l);u&&r.push(u),e+=l.size+10}a(t,e)&&(e+=10)}return r},f=function(t){return"PRIV"===t.type?g(t):"W"===t.type[0]?p(t):v(t)},g=function(t){if(!(t.size<2)){var e=y(t.data,!0),r=new Uint8Array(t.data.subarray(e.length+1));return{key:t.type,info:e,data:r.buffer}}},v=function(t){if(!(t.size<2)){if("TXXX"===t.type){var e=1,r=y(t.data.subarray(e),!0);e+=r.length+1;var i=y(t.data.subarray(e));return{key:t.type,info:r,data:i}}var n=y(t.data.subarray(1));return{key:t.type,data:n}}},p=function(t){if("WXXX"===t.type){if(t.size<2)return;var e=1,r=y(t.data.subarray(e),!0);e+=r.length+1;var i=y(t.data.subarray(e));return{key:t.type,info:r,data:i}}var n=y(t.data);return{key:t.type,data:n}},m=function(t){if(8===t.data.byteLength){var e=new Uint8Array(t.data),r=1&e[3],i=(e[4]<<23)+(e[5]<<15)+(e[6]<<7)+e[7];return i/=45,r&&(i+=47721858.84),Math.round(i)}},y=function(t,e){void 0===e&&(e=!1);var r=T();if(r){var i=r.decode(t);if(e){var n=i.indexOf("\0");return-1!==n?i.substring(0,n):i}return i.replace(/\0/g,"")}for(var a,s,o,l=t.length,u="",h=0;h<l;){if(0===(a=t[h++])&&e)return u;if(0!==a&&3!==a)switch(a>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:u+=String.fromCharCode(a);break;case 12:case 13:s=t[h++],u+=String.fromCharCode((31&a)<<6|63&s);break;case 14:s=t[h++],o=t[h++],u+=String.fromCharCode((15&a)<<12|(63&s)<<6|(63&o)<<0)}}return u};function T(){return i||void 0===self.TextDecoder||(i=new self.TextDecoder("utf-8")),i}},function(t,e,r){"use strict";r.d(e,"c",(function(){return n})),r.d(e,"b",(function(){return a})),r.d(e,"a",(function(){return s}));function i(t,e,r,i){void 0===r&&(r=1),void 0===i&&(i=!1);var n=t*e*r;return i?Math.round(n):n}function n(t,e,r,n){return void 0===r&&(r=1),void 0===n&&(n=!1),i(t,e,1/r,n)}function a(t,e){return void 0===e&&(e=!1),i(t,1e3,1/9e4,e)}function s(t,e){return void 0===e&&(e=1),i(t,9e4,1/e)}},function(t,e,r){"use strict";function i(t,e,r){return Uint8Array.prototype.slice?t.slice(e,r):new Uint8Array(Array.prototype.slice.call(t,e,r))}r.d(e,"a",(function(){return i}))},function(t,e,r){"use strict";r.d(e,"c",(function(){return lt})),r.d(e,"d",(function(){return ht})),r.d(e,"a",(function(){return dt})),r.d(e,"b",(function(){return ct}));var i=r(0),n=r(2),a=r(15),s=r(3),o=r(7);var l=r(6),u=r(9),h=function(){function t(){this._audioTrack=void 0,this._id3Track=void 0,this.frameIndex=0,this.cachedData=null,this.initPTS=null}var e=t.prototype;return e.resetInitSegment=function(t,e,r){this._id3Track={type:"id3",id:0,pid:-1,inputTimeScale:9e4,sequenceNumber:0,samples:[],dropped:0}},e.resetTimeStamp=function(){},e.resetContiguity=function(){},e.canParse=function(t,e){return!1},e.appendFrame=function(t,e,r){},e.demux=function(t,e){this.cachedData&&(t=Object(l.a)(this.cachedData,t),this.cachedData=null);var r,i,n=o.b(t,0),a=n?n.length:0,s=this._audioTrack,h=this._id3Track,c=n?o.d(n):void 0,f=t.length;for(0!==this.frameIndex&&null!==this.initPTS||(this.initPTS=d(c,e)),n&&n.length>0&&h.samples.push({pts:this.initPTS,dts:this.initPTS,data:n}),i=this.initPTS;a<f;){if(this.canParse(t,a)){var g=this.appendFrame(s,t,a);g?(this.frameIndex++,i=g.sample.pts,r=a+=g.length):a=f}else o.a(t,a)?(n=o.b(t,a),h.samples.push({pts:i,dts:i,data:n}),r=a+=n.length):a++;if(a===f&&r!==f){var v=Object(u.a)(t,r);this.cachedData?this.cachedData=Object(l.a)(this.cachedData,v):this.cachedData=v}}return{audioTrack:s,avcTrack:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0},id3Track:h,textTrack:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0}}},e.demuxSampleAes=function(t,e,r){return Promise.reject(new Error("["+this+"] This demuxer does not support Sample-AES decryption"))},e.flush=function(t){var e=this.cachedData;return e&&(this.cachedData=null,this.demux(e,0)),this.frameIndex=0,{audioTrack:this._audioTrack,avcTrack:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0},id3Track:this._id3Track,textTrack:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0}}},e.destroy=function(){},t}(),d=function(t,e){return Object(s.a)(t)?90*t:9e4*e},c=h,f=r(1);function g(t,e){return 255===t[e]&&240==(246&t[e+1])}function v(t,e){return 1&t[e+1]?7:9}function p(t,e){return(3&t[e+3])<<11|t[e+4]<<3|(224&t[e+5])>>>5}function m(t,e){return e+1<t.length&&g(t,e)}function y(t,e){if(m(t,e)){var r=v(t,e);if(e+r>=t.length)return!1;var i=p(t,e);if(i<=r)return!1;var n=e+i;return n===t.length||m(t,n)}return!1}function T(t,e,r,a,s){if(!t.samplerate){var o=function(t,e,r,a){var s,o,l,u,h=navigator.userAgent.toLowerCase(),d=a,c=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350];s=1+((192&e[r+2])>>>6);var g=(60&e[r+2])>>>2;if(!(g>c.length-1))return l=(1&e[r+2])<<2,l|=(192&e[r+3])>>>6,f.b.log("manifest codec:"+a+", ADTS type:"+s+", samplingIndex:"+g),/firefox/i.test(h)?g>=6?(s=5,u=new Array(4),o=g-3):(s=2,u=new Array(2),o=g):-1!==h.indexOf("android")?(s=2,u=new Array(2),o=g):(s=5,u=new Array(4),a&&(-1!==a.indexOf("mp4a.40.29")||-1!==a.indexOf("mp4a.40.5"))||!a&&g>=6?o=g-3:((a&&-1!==a.indexOf("mp4a.40.2")&&(g>=6&&1===l||/vivaldi/i.test(h))||!a&&1===l)&&(s=2,u=new Array(2)),o=g)),u[0]=s<<3,u[0]|=(14&g)>>1,u[1]|=(1&g)<<7,u[1]|=l<<3,5===s&&(u[1]|=(14&o)>>1,u[2]=(1&o)<<7,u[2]|=8,u[3]=0),{config:u,samplerate:c[g],channelCount:l,codec:"mp4a.40."+s,manifestCodec:d};t.trigger(i.a.ERROR,{type:n.b.MEDIA_ERROR,details:n.a.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+g})}(e,r,a,s);if(!o)return;t.config=o.config,t.samplerate=o.samplerate,t.channelCount=o.channelCount,t.codec=o.codec,t.manifestCodec=o.manifestCodec,f.b.log("parsed codec:"+t.codec+", rate:"+o.samplerate+", channels:"+o.channelCount)}}function b(t){return 9216e4/t}function E(t,e,r,i,n){var a=function(t,e,r,i,n){var a=v(t,e),s=p(t,e);if((s-=a)>0)return{headerLength:a,frameLength:s,stamp:r+i*n}}(e,r,i,n,b(t.samplerate));if(a){var s,o=a.frameLength,l=a.headerLength,u=a.stamp,h=l+o,d=Math.max(0,r+h-e.length);d?(s=new Uint8Array(h-l)).set(e.subarray(r+l,e.length),0):s=e.subarray(r+l,r+h);var c={unit:s,pts:u};return d||t.samples.push(c),{sample:c,length:h,missing:d}}}function S(t,e){return(S=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var L=function(t){var e,r;function i(e,r){var i;return(i=t.call(this)||this).observer=void 0,i.config=void 0,i.observer=e,i.config=r,i}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,S(e,r);var n=i.prototype;return n.resetInitSegment=function(e,r,i){t.prototype.resetInitSegment.call(this,e,r,i),this._audioTrack={container:"audio/adts",type:"audio",id:0,pid:-1,sequenceNumber:0,isAAC:!0,samples:[],manifestCodec:e,duration:i,inputTimeScale:9e4,dropped:0}},i.probe=function(t){if(!t)return!1;for(var e=(o.b(t,0)||[]).length,r=t.length;e<r;e++)if(y(t,e))return f.b.log("ADTS sync word found !"),!0;return!1},n.canParse=function(t,e){return function(t,e){return function(t,e){return e+5<t.length}(t,e)&&g(t,e)&&p(t,e)<=t.length-e}(t,e)},n.appendFrame=function(t,e,r){T(t,this.observer,e,r,t.manifestCodec);var i=E(t,e,r,this.initPTS,this.frameIndex);if(i&&0===i.missing)return i},i}(c);L.minProbeByteLength=9;var A=L,R=function(){function t(t,e){this.remainderData=null,this.config=void 0,this.config=e}var e=t.prototype;return e.resetTimeStamp=function(){},e.resetInitSegment=function(){},e.resetContiguity=function(){},t.probe=function(t){return Object(l.b)({data:t,start:0,end:Math.min(t.length,16384)},["moof"]).length>0},e.demux=function(t){var e=t,r={type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0};if(this.config.progressive){this.remainderData&&(e=Object(l.a)(this.remainderData,t));var i=Object(l.h)(e);this.remainderData=i.remainder,r.samples=i.valid||new Uint8Array}else r.samples=e;return{audioTrack:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0},avcTrack:r,id3Track:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0},textTrack:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0}}},e.flush=function(){var t={type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0};return t.samples=this.remainderData||new Uint8Array,this.remainderData=null,{audioTrack:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0},avcTrack:t,id3Track:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0},textTrack:{type:"",id:-1,pid:-1,inputTimeScale:9e4,sequenceNumber:-1,samples:[],dropped:0}}},e.demuxSampleAes=function(t,e,r){return Promise.reject(new Error("The MP4 demuxer does not support SAMPLE-AES decryption"))},e.destroy=function(){},t}();R.minProbeByteLength=1024;var D=R,k=null,_=[32,64,96,128,160,192,224,256,288,320,352,384,416,448,32,48,56,64,80,96,112,128,160,192,224,256,320,384,32,40,48,56,64,80,96,112,128,160,192,224,256,320,32,48,56,64,80,96,112,128,144,160,176,192,224,256,8,16,24,32,40,48,56,64,80,96,112,128,144,160],I=[44100,48e3,32e3,22050,24e3,16e3,11025,12e3,8e3],C=[[0,72,144,12],[0,0,0,0],[0,72,144,12],[0,144,144,12]],w=[0,1,1,4];function O(t,e,r,i,n){if(!(r+24>e.length)){var a=x(e,r);if(a&&r+a.frameLength<=e.length){var s=i+n*(9e4*a.samplesPerFrame/a.sampleRate),o={unit:e.subarray(r,r+a.frameLength),pts:s,dts:s};return t.config=[],t.channelCount=a.channelCount,t.samplerate=a.sampleRate,t.samples.push(o),{sample:o,length:a.frameLength,missing:0}}}}function x(t,e){var r=t[e+1]>>3&3,i=t[e+1]>>1&3,n=t[e+2]>>4&15,a=t[e+2]>>2&3;if(1!==r&&0!==n&&15!==n&&3!==a){var s=t[e+2]>>1&1,o=t[e+3]>>6,l=1e3*_[14*(3===r?3-i:3===i?3:4)+n-1],u=I[3*(3===r?0:2===r?1:2)+a],h=3===o?1:2,d=C[r][i],c=w[i],f=8*d*c,g=Math.floor(d*l/u+s)*c;if(null===k){var v=(navigator.userAgent||"").match(/Chrome\/(\d+)/i);k=v?parseInt(v[1]):0}return!!k&&k<=87&&2===i&&l>=224e3&&0===o&&(t[e+3]=128|t[e+3]),{sampleRate:u,channelCount:h,frameLength:g,samplesPerFrame:f}}}function P(t,e){return 255===t[e]&&224==(224&t[e+1])&&0!=(6&t[e+1])}function M(t,e){return e+1<t.length&&P(t,e)}function F(t,e){if(e+1<t.length&&P(t,e)){var r=x(t,e),i=4;null!=r&&r.frameLength&&(i=r.frameLength);var n=e+i;return n===t.length||M(t,n)}return!1}var N=function(){function t(t){this.data=void 0,this.bytesAvailable=void 0,this.word=void 0,this.bitsAvailable=void 0,this.data=t,this.bytesAvailable=t.byteLength,this.word=0,this.bitsAvailable=0}var e=t.prototype;return e.loadWord=function(){var t=this.data,e=this.bytesAvailable,r=t.byteLength-e,i=new Uint8Array(4),n=Math.min(4,e);if(0===n)throw new Error("no bytes available");i.set(t.subarray(r,r+n)),this.word=new DataView(i.buffer).getUint32(0),this.bitsAvailable=8*n,this.bytesAvailable-=n},e.skipBits=function(t){var e;this.bitsAvailable>t?(this.word<<=t,this.bitsAvailable-=t):(t-=this.bitsAvailable,t-=(e=t>>3)>>3,this.bytesAvailable-=e,this.loadWord(),this.word<<=t,this.bitsAvailable-=t)},e.readBits=function(t){var e=Math.min(this.bitsAvailable,t),r=this.word>>>32-e;return t>32&&f.b.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=e,this.bitsAvailable>0?this.word<<=e:this.bytesAvailable>0&&this.loadWord(),(e=t-e)>0&&this.bitsAvailable?r<<e|this.readBits(e):r},e.skipLZ=function(){var t;for(t=0;t<this.bitsAvailable;++t)if(0!=(this.word&2147483648>>>t))return this.word<<=t,this.bitsAvailable-=t,t;return this.loadWord(),t+this.skipLZ()},e.skipUEG=function(){this.skipBits(1+this.skipLZ())},e.skipEG=function(){this.skipBits(1+this.skipLZ())},e.readUEG=function(){var t=this.skipLZ();return this.readBits(t+1)-1},e.readEG=function(){var t=this.readUEG();return 1&t?1+t>>>1:-1*(t>>>1)},e.readBoolean=function(){return 1===this.readBits(1)},e.readUByte=function(){return this.readBits(8)},e.readUShort=function(){return this.readBits(16)},e.readUInt=function(){return this.readBits(32)},e.skipScalingList=function(t){for(var e=8,r=8,i=0;i<t;i++)0!==r&&(r=(e+this.readEG()+256)%256),e=0===r?e:r},e.readSPS=function(){var t,e,r,i=0,n=0,a=0,s=0,o=this.readUByte.bind(this),l=this.readBits.bind(this),u=this.readUEG.bind(this),h=this.readBoolean.bind(this),d=this.skipBits.bind(this),c=this.skipEG.bind(this),f=this.skipUEG.bind(this),g=this.skipScalingList.bind(this);o();var v=o();if(l(5),d(3),o(),f(),100===v||110===v||122===v||244===v||44===v||83===v||86===v||118===v||128===v){var p=u();if(3===p&&d(1),f(),f(),d(1),h())for(e=3!==p?8:12,r=0;r<e;r++)h()&&g(r<6?16:64)}f();var m=u();if(0===m)u();else if(1===m)for(d(1),c(),c(),t=u(),r=0;r<t;r++)c();f(),d(1);var y=u(),T=u(),b=l(1);0===b&&d(1),d(1),h()&&(i=u(),n=u(),a=u(),s=u());var E=[1,1];if(h()&&h())switch(o()){case 1:E=[1,1];break;case 2:E=[12,11];break;case 3:E=[10,11];break;case 4:E=[16,11];break;case 5:E=[40,33];break;case 6:E=[24,11];break;case 7:E=[20,11];break;case 8:E=[32,11];break;case 9:E=[80,33];break;case 10:E=[18,11];break;case 11:E=[15,11];break;case 12:E=[64,33];break;case 13:E=[160,99];break;case 14:E=[4,3];break;case 15:E=[3,2];break;case 16:E=[2,1];break;case 255:E=[o()<<8|o(),o()<<8|o()]}return{width:Math.ceil(16*(y+1)-2*i-2*n),height:(2-b)*(T+1)*16-(b?2:4)*(a+s),pixelRatio:E}},e.readSliceType=function(){return this.readUByte(),this.readUEG(),this.readUEG()},t}(),U=function(){function t(t,e,r){this.keyData=void 0,this.decrypter=void 0,this.keyData=r,this.decrypter=new a.a(t,e,{removePKCS7Padding:!1})}var e=t.prototype;return e.decryptBuffer=function(t,e){this.decrypter.decrypt(t,this.keyData.key.buffer,this.keyData.iv.buffer,e)},e.decryptAacSample=function(t,e,r,i){var n=t[e].unit,a=n.subarray(16,n.length-n.length%16),s=a.buffer.slice(a.byteOffset,a.byteOffset+a.length),o=this;this.decryptBuffer(s,(function(a){var s=new Uint8Array(a);n.set(s,16),i||o.decryptAacSamples(t,e+1,r)}))},e.decryptAacSamples=function(t,e,r){for(;;e++){if(e>=t.length)return void r();if(!(t[e].unit.length<32)){var i=this.decrypter.isSync();if(this.decryptAacSample(t,e,r,i),!i)return}}},e.getAvcEncryptedData=function(t){for(var e=16*Math.floor((t.length-48)/160)+16,r=new Int8Array(e),i=0,n=32;n<=t.length-16;n+=160,i+=16)r.set(t.subarray(n,n+16),i);return r},e.getAvcDecryptedUnit=function(t,e){for(var r=new Uint8Array(e),i=0,n=32;n<=t.length-16;n+=160,i+=16)t.set(r.subarray(i,i+16),n);return t},e.decryptAvcSample=function(t,e,r,i,n,a){var s=q(n.data),o=this.getAvcEncryptedData(s),l=this;this.decryptBuffer(o.buffer,(function(o){n.data=l.getAvcDecryptedUnit(s,o),a||l.decryptAvcSamples(t,e,r+1,i)}))},e.decryptAvcSamples=function(t,e,r,i){if(t instanceof Uint8Array)throw new Error("Cannot decrypt samples of type Uint8Array");for(;;e++,r=0){if(e>=t.length)return void i();for(var n=t[e].units;!(r>=n.length);r++){var a=n[r];if(!(a.data.length<=48||1!==a.type&&5!==a.type)){var s=this.decrypter.isSync();if(this.decryptAvcSample(t,e,r,i,a,s),!s)return}}}},t}(),B={video:1,audio:2,id3:3,text:4},G=function(){function t(t,e,r){this.observer=void 0,this.config=void 0,this.typeSupported=void 0,this.sampleAes=null,this.pmtParsed=!1,this.audioCodec=void 0,this.videoCodec=void 0,this._duration=0,this.aacLastPTS=null,this._initPTS=null,this._initDTS=null,this._pmtId=-1,this._avcTrack=void 0,this._audioTrack=void 0,this._id3Track=void 0,this._txtTrack=void 0,this.aacOverFlow=null,this.avcSample=null,this.remainderData=null,this.observer=t,this.config=e,this.typeSupported=r}t.probe=function(e){var r=t.syncOffset(e);return!(r<0)&&(r&&f.b.warn("MPEG2-TS detected but first sync word found @ offset "+r+", junk ahead ?"),!0)},t.syncOffset=function(t){for(var e=Math.min(1e3,t.length-564),r=0;r<e;){if(71===t[r]&&71===t[r+188]&&71===t[r+376])return r;r++}return-1},t.createTrack=function(t,e){return{container:"video"===t||"audio"===t?"video/mp2t":void 0,type:t,id:B[t],pid:-1,inputTimeScale:9e4,sequenceNumber:0,samples:[],dropped:0,duration:"audio"===t?e:void 0}};var e=t.prototype;return e.resetInitSegment=function(e,r,i){this.pmtParsed=!1,this._pmtId=-1,this._avcTrack=t.createTrack("video",i),this._audioTrack=t.createTrack("audio",i),this._id3Track=t.createTrack("id3",i),this._txtTrack=t.createTrack("text",i),this._audioTrack.isAAC=!0,this.aacOverFlow=null,this.aacLastPTS=null,this.avcSample=null,this.audioCodec=e,this.videoCodec=r,this._duration=i},e.resetTimeStamp=function(){},e.resetContiguity=function(){var t=this._audioTrack,e=this._avcTrack,r=this._id3Track;t&&(t.pesData=null),e&&(e.pesData=null),r&&(r.pesData=null),this.aacOverFlow=null,this.aacLastPTS=null},e.demux=function(e,r,a,s){var o;void 0===a&&(a=!1),void 0===s&&(s=!1),a||(this.sampleAes=null);var u=this._avcTrack,h=this._audioTrack,d=this._id3Track,c=u.pid,g=u.pesData,v=h.pid,p=d.pid,m=h.pesData,y=d.pesData,T=!1,b=this.pmtParsed,E=this._pmtId,S=e.length;if(this.remainderData&&(S=(e=Object(l.a)(this.remainderData,e)).length,this.remainderData=null),S<188&&!s)return this.remainderData=e,{audioTrack:h,avcTrack:u,id3Track:d,textTrack:this._txtTrack};var L=Math.max(0,t.syncOffset(e));(S-=(S+L)%188)<e.byteLength&&!s&&(this.remainderData=new Uint8Array(e.buffer,S,e.buffer.byteLength-S));for(var A=L;A<S;A+=188)if(71===e[A]){var R=!!(64&e[A+1]),D=((31&e[A+1])<<8)+e[A+2],k=void 0;if((48&e[A+3])>>4>1){if((k=A+5+e[A+4])===A+188)continue}else k=A+4;switch(D){case c:R&&(g&&(o=V(g))&&this.parseAVCPES(o,!1),g={data:[],size:0}),g&&(g.data.push(e.subarray(k,A+188)),g.size+=A+188-k);break;case v:R&&(m&&(o=V(m))&&(h.isAAC?this.parseAACPES(o):this.parseMPEGPES(o)),m={data:[],size:0}),m&&(m.data.push(e.subarray(k,A+188)),m.size+=A+188-k);break;case p:R&&(y&&(o=V(y))&&this.parseID3PES(o),y={data:[],size:0}),y&&(y.data.push(e.subarray(k,A+188)),y.size+=A+188-k);break;case 0:R&&(k+=e[k]+1),E=this._pmtId=j(e,k);break;case E:R&&(k+=e[k]+1);var _=H(e,k,!0===this.typeSupported.mpeg||!0===this.typeSupported.mp3,a);(c=_.avc)>0&&(u.pid=c),(v=_.audio)>0&&(h.pid=v,h.isAAC=_.isAAC),(p=_.id3)>0&&(d.pid=p),T&&!b&&(f.b.log("reparse from beginning"),T=!1,A=L-188),b=this.pmtParsed=!0;break;case 17:case 8191:break;default:T=!0}}else this.observer.emit(i.a.ERROR,i.a.ERROR,{type:n.b.MEDIA_ERROR,details:n.a.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});u.pesData=g,h.pesData=m,d.pesData=y;var I={audioTrack:h,avcTrack:u,id3Track:d,textTrack:this._txtTrack};return s&&this.extractRemainingSamples(I),I},e.flush=function(){var t,e=this.remainderData;return this.remainderData=null,t=e?this.demux(e,-1,!1,!0):{audioTrack:this._audioTrack,avcTrack:this._avcTrack,textTrack:this._txtTrack,id3Track:this._id3Track},this.extractRemainingSamples(t),this.sampleAes?this.decrypt(t,this.sampleAes):t},e.extractRemainingSamples=function(t){var e,r=t.audioTrack,i=t.avcTrack,n=t.id3Track,a=i.pesData,s=r.pesData,o=n.pesData;a&&(e=V(a))?(this.parseAVCPES(e,!0),i.pesData=null):i.pesData=a,s&&(e=V(s))?(r.isAAC?this.parseAACPES(e):this.parseMPEGPES(e),r.pesData=null):(null!=s&&s.size&&f.b.log("last AAC PES packet truncated,might overlap between fragments"),r.pesData=s),o&&(e=V(o))?(this.parseID3PES(e),n.pesData=null):n.pesData=o},e.demuxSampleAes=function(t,e,r){var i=this.demux(t,r,!0,!this.config.progressive),n=this.sampleAes=new U(this.observer,this.config,e);return this.decrypt(i,n)},e.decrypt=function(t,e){return new Promise((function(r){var i=t.audioTrack,n=t.avcTrack;i.samples&&i.isAAC?e.decryptAacSamples(i.samples,0,(function(){n.samples?e.decryptAvcSamples(n.samples,0,0,(function(){r(t)})):r(t)})):n.samples&&e.decryptAvcSamples(n.samples,0,0,(function(){r(t)}))}))},e.destroy=function(){this._initPTS=this._initDTS=null,this._duration=0},e.parseAVCPES=function(t,e){var r,i=this,n=this._avcTrack,a=this.parseAVCNALu(t.data),s=this.avcSample,l=!1;t.data=null,s&&a.length&&!n.audFound&&(W(s,n),s=this.avcSample=K(!1,t.pts,t.dts,"")),a.forEach((function(e){switch(e.type){case 1:r=!0,s||(s=i.avcSample=K(!0,t.pts,t.dts,"")),s.frame=!0;var a=e.data;if(l&&a.length>4){var u=new N(a).readSliceType();2!==u&&4!==u&&7!==u&&9!==u||(s.key=!0)}break;case 5:r=!0,s||(s=i.avcSample=K(!0,t.pts,t.dts,"")),s.key=!0,s.frame=!0;break;case 6:r=!0;var h=new N(q(e.data));h.readUByte();for(var d=0,c=0,f=!1,g=0;!f&&h.bytesAvailable>1;){d=0;do{d+=g=h.readUByte()}while(255===g);c=0;do{c+=g=h.readUByte()}while(255===g);if(4===d&&0!==h.bytesAvailable){if(f=!0,181===h.readUByte())if(49===h.readUShort())if(1195456820===h.readUInt())if(3===h.readUByte()){for(var v=h.readUByte(),p=31&v,m=[v,h.readUByte()],y=0;y<p;y++)m.push(h.readUByte()),m.push(h.readUByte()),m.push(h.readUByte());Y(i._txtTrack.samples,{type:3,pts:t.pts,bytes:m})}}else if(5===d&&0!==h.bytesAvailable){if(f=!0,c>16){for(var T=[],b=0;b<16;b++)T.push(h.readUByte().toString(16)),3!==b&&5!==b&&7!==b&&9!==b||T.push("-");for(var E=c-16,S=new Uint8Array(E),L=0;L<E;L++)S[L]=h.readUByte();Y(i._txtTrack.samples,{pts:t.pts,payloadType:d,uuid:T.join(""),userData:Object(o.f)(S),userDataBytes:S})}}else if(c<h.bytesAvailable)for(var A=0;A<c;A++)h.readUByte()}break;case 7:if(r=!0,l=!0,!n.sps){var R=new N(e.data).readSPS();n.width=R.width,n.height=R.height,n.pixelRatio=R.pixelRatio,n.sps=[e.data],n.duration=i._duration;for(var D=e.data.subarray(1,4),k="avc1.",_=0;_<3;_++){var I=D[_].toString(16);I.length<2&&(I="0"+I),k+=I}n.codec=k}break;case 8:r=!0,n.pps||(n.pps=[e.data]);break;case 9:r=!1,n.audFound=!0,s&&W(s,n),s=i.avcSample=K(!1,t.pts,t.dts,"");break;case 12:r=!1;break;default:r=!1,s&&(s.debug+="unknown NAL "+e.type+" ")}s&&r&&s.units.push(e)})),e&&s&&(W(s,n),this.avcSample=null)},e.getLastNalUnit=function(){var t,e,r=this.avcSample;if(!r||0===r.units.length){var i=this._avcTrack.samples;r=i[i.length-1]}if(null!==(t=r)&&void 0!==t&&t.units){var n=r.units;e=n[n.length-1]}return e},e.parseAVCNALu=function(t){var e,r,i=t.byteLength,n=this._avcTrack,a=n.naluState||0,s=a,o=[],l=0,u=-1,h=0;for(-1===a&&(u=0,h=31&t[0],a=0,l=1);l<i;)if(e=t[l++],a)if(1!==a)if(e)if(1===e){if(u>=0){var d={data:t.subarray(u,l-a-1),type:h};o.push(d)}else{var c=this.getLastNalUnit();if(c&&(s&&l<=4-s&&c.state&&(c.data=c.data.subarray(0,c.data.byteLength-s)),(r=l-a-1)>0)){var f=new Uint8Array(c.data.byteLength+r);f.set(c.data,0),f.set(t.subarray(0,r),c.data.byteLength),c.data=f}}l<i?(u=l,h=31&t[l],a=0):a=-1}else a=0;else a=3;else a=e?0:2;else a=e?0:1;if(u>=0&&a>=0){var g={data:t.subarray(u,i),type:h,state:a};o.push(g)}if(0===o.length){var v=this.getLastNalUnit();if(v){var p=new Uint8Array(v.data.byteLength+t.byteLength);p.set(v.data,0),p.set(t,v.data.byteLength),v.data=p}}return n.naluState=a,o},e.parseAACPES=function(t){var e,r,a,s,o,l=0,u=this._audioTrack,h=this.aacOverFlow,d=t.data;if(h){this.aacOverFlow=null;var c=h.sample.unit.byteLength,g=Math.min(h.missing,c),v=c-g;h.sample.unit.set(d.subarray(0,g),v),u.samples.push(h.sample),l=h.missing}for(e=l,r=d.length;e<r-1&&!m(d,e);e++);if(e!==l&&(e<r-1?(a="AAC PES did not start with ADTS header,offset:"+e,s=!1):(a="no ADTS header found in AAC PES",s=!0),f.b.warn("parsing error:"+a),this.observer.emit(i.a.ERROR,i.a.ERROR,{type:n.b.MEDIA_ERROR,details:n.a.FRAG_PARSING_ERROR,fatal:s,reason:a}),s))return;if(T(u,this.observer,d,e,this.audioCodec),void 0!==t.pts)o=t.pts;else{if(!h)return void f.b.warn("[tsdemuxer]: AAC PES unknown PTS");var p=b(u.samplerate);o=h.sample.pts+p}for(var y=0;e<r;){if(m(d,e)){if(e+5<r){var S=E(u,d,e,o,y);if(S){if(!S.missing){e+=S.length,y++;continue}this.aacOverFlow=S}}break}e++}},e.parseMPEGPES=function(t){var e=t.data,r=e.length,i=0,n=0,a=t.pts;if(void 0!==a)for(;n<r;)if(M(e,n)){var s=O(this._audioTrack,e,n,a,i);if(!s)break;n+=s.length,i++}else n++;else f.b.warn("[tsdemuxer]: MPEG PES unknown PTS")},e.parseID3PES=function(t){void 0!==t.pts?this._id3Track.samples.push(t):f.b.warn("[tsdemuxer]: ID3 PES unknown PTS")},t}();function K(t,e,r,i){return{key:t,frame:!1,pts:e,dts:r,units:[],debug:i,length:0}}function j(t,e){return(31&t[e+10])<<8|t[e+11]}function H(t,e,r,i){var n={audio:-1,avc:-1,id3:-1,isAAC:!0},a=e+3+((15&t[e+1])<<8|t[e+2])-4;for(e+=12+((15&t[e+10])<<8|t[e+11]);e<a;){var s=(31&t[e+1])<<8|t[e+2];switch(t[e]){case 207:if(!i){f.b.log("ADTS AAC with AES-128-CBC frame encryption found in unencrypted stream");break}case 15:-1===n.audio&&(n.audio=s);break;case 21:-1===n.id3&&(n.id3=s);break;case 219:if(!i){f.b.log("H.264 with AES-128-CBC slice encryption found in unencrypted stream");break}case 27:-1===n.avc&&(n.avc=s);break;case 3:case 4:r?-1===n.audio&&(n.audio=s,n.isAAC=!1):f.b.log("MPEG audio found, not supported in this browser");break;case 36:f.b.warn("Unsupported HEVC stream type found")}e+=5+((15&t[e+3])<<8|t[e+4])}return n}function V(t){var e,r,i,n,a,s=0,o=t.data;if(!t||0===t.size)return null;for(;o[0].length<19&&o.length>1;){var l=new Uint8Array(o[0].length+o[1].length);l.set(o[0]),l.set(o[1],o[0].length),o[0]=l,o.splice(1,1)}if(1===((e=o[0])[0]<<16)+(e[1]<<8)+e[2]){if((r=(e[4]<<8)+e[5])&&r>t.size-6)return null;var u=e[7];192&u&&(n=536870912*(14&e[9])+4194304*(255&e[10])+16384*(254&e[11])+128*(255&e[12])+(254&e[13])/2,64&u?n-(a=536870912*(14&e[14])+4194304*(255&e[15])+16384*(254&e[16])+128*(255&e[17])+(254&e[18])/2)>54e5&&(f.b.warn(Math.round((n-a)/9e4)+"s delta between PTS and DTS, align them"),n=a):a=n);var h=(i=e[8])+9;if(t.size<=h)return null;t.size-=h;for(var d=new Uint8Array(t.size),c=0,g=o.length;c<g;c++){var v=(e=o[c]).byteLength;if(h){if(h>v){h-=v;continue}e=e.subarray(h),v-=h,h=0}d.set(e,s),s+=v}return r&&(r-=i+3),{data:d,pts:n,dts:a,len:r}}return null}function W(t,e){if(t.units.length&&t.frame){if(void 0===t.pts){var r=e.samples,i=r.length;if(!i)return void e.dropped++;var n=r[i-1];t.pts=n.pts,t.dts=n.dts}e.samples.push(t)}t.debug.length&&f.b.log(t.pts+"/"+t.dts+":"+t.debug)}function Y(t,e){var r=t.length;if(r>0){if(e.pts>=t[r-1].pts)t.push(e);else for(var i=r-1;i>=0;i--)if(e.pts<t[i].pts){t.splice(i,0,e);break}}else t.push(e)}function q(t){for(var e=t.byteLength,r=[],i=1;i<e-2;)0===t[i]&&0===t[i+1]&&3===t[i+2]?(r.push(i+2),i+=2):i++;if(0===r.length)return t;var n=e-r.length,a=new Uint8Array(n),s=0;for(i=0;i<n;s++,i++)s===r[0]&&(s++,r.shift()),a[i]=t[s];return a}G.minProbeByteLength=188;var X=G;function z(t,e){return(z=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var Q=function(t){var e,r;function i(){return t.apply(this,arguments)||this}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,z(e,r);var n=i.prototype;return n.resetInitSegment=function(e,r,i){t.prototype.resetInitSegment.call(this,e,r,i),this._audioTrack={container:"audio/mpeg",type:"audio",id:0,pid:-1,sequenceNumber:0,isAAC:!1,samples:[],manifestCodec:e,duration:i,inputTimeScale:9e4,dropped:0}},i.probe=function(t){if(!t)return!1;for(var e=(o.b(t,0)||[]).length,r=t.length;e<r;e++)if(F(t,e))return f.b.log("MPEG Audio sync word found !"),!0;return!1},n.canParse=function(t,e){return function(t,e){return P(t,e)&&4<=t.length-e}(t,e)},n.appendFrame=function(t,e,r){if(null!==this.initPTS)return O(t,e,r,this.initPTS,this.frameIndex)},i}(c);Q.minProbeByteLength=4;var $=Q,J=r(16),Z=r(5),tt=function(){function t(){this.emitInitSegment=!1,this.audioCodec=void 0,this.videoCodec=void 0,this.initData=void 0,this.initPTS=void 0,this.initTracks=void 0,this.lastEndDTS=null}var e=t.prototype;return e.destroy=function(){},e.resetTimeStamp=function(t){this.initPTS=t,this.lastEndDTS=null},e.resetNextTimestamp=function(){this.lastEndDTS=null},e.resetInitSegment=function(t,e,r){this.audioCodec=e,this.videoCodec=r,this.generateInitSegment(t),this.emitInitSegment=!0},e.generateInitSegment=function(t){var e=this.audioCodec,r=this.videoCodec;if(!t||!t.byteLength)return this.initTracks=void 0,void(this.initData=void 0);var i=this.initData=Object(l.f)(t);e||(e=rt(i.audio,Z.a.AUDIO)),r||(r=rt(i.video,Z.a.VIDEO));var n={};i.audio&&i.video?n.audiovideo={container:"video/mp4",codec:e+","+r,initSegment:t,id:"main"}:i.audio?n.audio={container:"audio/mp4",codec:e,initSegment:t,id:"audio"}:i.video?n.video={container:"video/mp4",codec:r,initSegment:t,id:"main"}:f.b.warn("[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes."),this.initTracks=n},e.remux=function(t,e,r,i,n){var a=this.initPTS,o=this.lastEndDTS,u={audio:void 0,video:void 0,text:i,id3:r,initSegment:void 0};Object(s.a)(o)||(o=this.lastEndDTS=n||0);var h=e.samples;if(!h||!h.length)return u;var d={initPTS:void 0,timescale:1},c=this.initData;if(c&&c.length||(this.generateInitSegment(h),c=this.initData),!c||!c.length)return f.b.warn("[passthrough-remuxer.ts]: Failed to generate initSegment."),u;this.emitInitSegment&&(d.tracks=this.initTracks,this.emitInitSegment=!1),Object(s.a)(a)||(this.initPTS=d.initPTS=a=et(c,h,o));var g=Object(l.c)(h,c),v=o,p=g+v;Object(l.e)(c,h,a),g>0?this.lastEndDTS=p:(f.b.warn("Duration parsed from mp4 should be greater than zero"),this.resetNextTimestamp());var m=!!c.audio,y=!!c.video,T="";m&&(T+="audio"),y&&(T+="video");var b={data1:h,startPTS:v,startDTS:v,endPTS:p,endDTS:p,type:T,hasAudio:m,hasVideo:y,nb:1,dropped:0};return u.audio="audio"===b.type?b:void 0,u.video="audio"!==b.type?b:void 0,u.text=i,u.id3=r,u.initSegment=d,u},t}(),et=function(t,e,r){return Object(l.d)(t,e)-r};function rt(t,e){var r=null==t?void 0:t.codec;return r&&r.length>4?r:"hvc1"===r?"hvc1.1.c.L120.90":"av01"===r?"av01.0.04M.08":"avc1"===r||e===Z.a.VIDEO?"avc1.42e01e":"mp4a.40.5"}var it,nt=tt,at=r(13);try{it=self.performance.now.bind(self.performance)}catch(t){f.b.debug("Unable to use Performance API on this environment"),it=self.Date.now}var st=[{demux:X,remux:J.a},{demux:D,remux:nt},{demux:A,remux:J.a},{demux:$,remux:J.a}],ot=1024;st.forEach((function(t){var e=t.demux;ot=Math.max(ot,e.minProbeByteLength)}));var lt=function(){function t(t,e,r,i,n){this.observer=void 0,this.typeSupported=void 0,this.config=void 0,this.vendor=void 0,this.id=void 0,this.demuxer=void 0,this.remuxer=void 0,this.decrypter=void 0,this.probe=void 0,this.decryptionPromise=null,this.transmuxConfig=void 0,this.currentTransmuxState=void 0,this.cache=new at.a,this.observer=t,this.typeSupported=e,this.config=r,this.vendor=i,this.id=n}var e=t.prototype;return e.configure=function(t){this.transmuxConfig=t,this.decrypter&&this.decrypter.reset()},e.push=function(t,e,r,i){var n=this,a=r.transmuxing;a.executeStart=it();var s=new Uint8Array(t),o=this.cache,u=this.config,h=this.currentTransmuxState,d=this.transmuxConfig;i&&(this.currentTransmuxState=i);var c=function(t,e){var r=null;t.byteLength>0&&null!=e&&null!=e.key&&null!==e.iv&&null!=e.method&&(r=e);return r}(s,e);if(c&&"AES-128"===c.method){var f=this.getDecrypter();if(!u.enableSoftwareAES)return this.decryptionPromise=f.webCryptoDecrypt(s,c.key.buffer,c.iv.buffer).then((function(t){var e=n.push(t,null,r);return n.decryptionPromise=null,e})),this.decryptionPromise;var g=f.softwareDecrypt(s,c.key.buffer,c.iv.buffer);if(!g)return a.executeEnd=it(),ut(r);s=new Uint8Array(g)}var v=i||h,p=v.contiguous,m=v.discontinuity,y=v.trackSwitch,T=v.accurateTimeOffset,b=v.timeOffset,E=d.audioCodec,S=d.videoCodec,L=d.defaultInitPts,A=d.duration,R=d.initSegmentData;if((m||y)&&this.resetInitSegment(R,E,S,A),m&&this.resetInitialTimestamp(L),p||this.resetContiguity(),this.needsProbing(s,m,y)){if(o.dataLength){var D=o.flush();s=Object(l.a)(D,s)}this.configureTransmuxer(s,d)}var k=this.transmux(s,c,b,T,r),_=this.currentTransmuxState;return _.contiguous=!0,_.discontinuity=!1,_.trackSwitch=!1,a.executeEnd=it(),k},e.flush=function(t){var e=this,r=t.transmuxing;r.executeStart=it();var a=this.decrypter,s=this.cache,o=this.currentTransmuxState,l=this.decryptionPromise;if(l)return l.then((function(){return e.flush(t)}));var u=[],h=o.timeOffset;if(a){var d=a.flush();d&&u.push(this.push(d,null,t))}var c=s.dataLength;s.reset();var f=this.demuxer,g=this.remuxer;if(!f||!g)return c>=ot&&this.observer.emit(i.a.ERROR,i.a.ERROR,{type:n.b.MEDIA_ERROR,details:n.a.FRAG_PARSING_ERROR,fatal:!0,reason:"no demux matching with content found"}),r.executeEnd=it(),[ut(t)];var v=f.flush(h);return ht(v)?v.then((function(r){return e.flushRemux(u,r,t),u})):(this.flushRemux(u,v,t),u)},e.flushRemux=function(t,e,r){var i=e.audioTrack,n=e.avcTrack,a=e.id3Track,s=e.textTrack,o=this.currentTransmuxState,l=o.accurateTimeOffset,u=o.timeOffset;f.b.log("[transmuxer.ts]: Flushed fragment "+r.sn+(r.part>-1?" p: "+r.part:"")+" of level "+r.level);var h=this.remuxer.remux(i,n,a,s,u,l,!0,this.id);t.push({remuxResult:h,chunkMeta:r}),r.transmuxing.executeEnd=it()},e.resetInitialTimestamp=function(t){var e=this.demuxer,r=this.remuxer;e&&r&&(e.resetTimeStamp(t),r.resetTimeStamp(t))},e.resetContiguity=function(){var t=this.demuxer,e=this.remuxer;t&&e&&(t.resetContiguity(),e.resetNextTimestamp())},e.resetInitSegment=function(t,e,r,i){var n=this.demuxer,a=this.remuxer;n&&a&&(n.resetInitSegment(e,r,i),a.resetInitSegment(t,e,r))},e.destroy=function(){this.demuxer&&(this.demuxer.destroy(),this.demuxer=void 0),this.remuxer&&(this.remuxer.destroy(),this.remuxer=void 0)},e.transmux=function(t,e,r,i,n){return e&&"SAMPLE-AES"===e.method?this.transmuxSampleAes(t,e,r,i,n):this.transmuxUnencrypted(t,r,i,n)},e.transmuxUnencrypted=function(t,e,r,i){var n=this.demuxer.demux(t,e,!1,!this.config.progressive),a=n.audioTrack,s=n.avcTrack,o=n.id3Track,l=n.textTrack;return{remuxResult:this.remuxer.remux(a,s,o,l,e,r,!1,this.id),chunkMeta:i}},e.transmuxSampleAes=function(t,e,r,i,n){var a=this;return this.demuxer.demuxSampleAes(t,e,r).then((function(t){return{remuxResult:a.remuxer.remux(t.audioTrack,t.avcTrack,t.id3Track,t.textTrack,r,i,!1,a.id),chunkMeta:n}}))},e.configureTransmuxer=function(t,e){for(var r,i=this.config,n=this.observer,a=this.typeSupported,s=this.vendor,o=e.audioCodec,l=e.defaultInitPts,u=e.duration,h=e.initSegmentData,d=e.videoCodec,c=0,g=st.length;c<g;c++)if(st[c].demux.probe(t)){r=st[c];break}r||(f.b.warn("Failed to find demuxer by probing frag, treating as mp4 passthrough"),r={demux:D,remux:nt});var v=this.demuxer,p=this.remuxer,m=r.remux,y=r.demux;p&&p instanceof m||(this.remuxer=new m(n,i,a,s)),v&&v instanceof y||(this.demuxer=new y(n,i,a),this.probe=y.probe),this.resetInitSegment(h,o,d,u),this.resetInitialTimestamp(l)},e.needsProbing=function(t,e,r){return!this.demuxer||!this.remuxer||e||r},e.getDecrypter=function(){var t=this.decrypter;return t||(t=this.decrypter=new a.a(this.observer,this.config)),t},t}();var ut=function(t){return{remuxResult:{},chunkMeta:t}};function ht(t){return"then"in t&&t.then instanceof Function}var dt=function(t,e,r,i,n){this.audioCodec=void 0,this.videoCodec=void 0,this.initSegmentData=void 0,this.duration=void 0,this.defaultInitPts=void 0,this.audioCodec=t,this.videoCodec=e,this.initSegmentData=r,this.duration=i,this.defaultInitPts=n},ct=function(t,e,r,i,n){this.discontinuity=void 0,this.contiguous=void 0,this.accurateTimeOffset=void 0,this.trackSwitch=void 0,this.timeOffset=void 0,this.discontinuity=t,this.contiguous=e,this.accurateTimeOffset=r,this.trackSwitch=i,this.timeOffset=n}},function(t,e,r){var i,n,a,s,o;i=/^((?:[a-zA-Z0-9+\-.]+:)?)(\/\/[^\/?#]*)?((?:[^\/?#]*\/)*[^;?#]*)?(;[^?#]*)?(\?[^#]*)?(#[^]*)?$/,n=/^([^\/?#]*)([^]*)$/,a=/(?:\/|^)\.(?=\/)/g,s=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,o={buildAbsoluteURL:function(t,e,r){if(r=r||{},t=t.trim(),!(e=e.trim())){if(!r.alwaysNormalize)return t;var i=o.parseURL(t);if(!i)throw new Error("Error trying to parse base URL.");return i.path=o.normalizePath(i.path),o.buildURLFromParts(i)}var a=o.parseURL(e);if(!a)throw new Error("Error trying to parse relative URL.");if(a.scheme)return r.alwaysNormalize?(a.path=o.normalizePath(a.path),o.buildURLFromParts(a)):e;var s=o.parseURL(t);if(!s)throw new Error("Error trying to parse base URL.");if(!s.netLoc&&s.path&&"/"!==s.path[0]){var l=n.exec(s.path);s.netLoc=l[1],s.path=l[2]}s.netLoc&&!s.path&&(s.path="/");var u={scheme:s.scheme,netLoc:a.netLoc,path:null,params:a.params,query:a.query,fragment:a.fragment};if(!a.netLoc&&(u.netLoc=s.netLoc,"/"!==a.path[0]))if(a.path){var h=s.path,d=h.substring(0,h.lastIndexOf("/")+1)+a.path;u.path=o.normalizePath(d)}else u.path=s.path,a.params||(u.params=s.params,a.query||(u.query=s.query));return null===u.path&&(u.path=r.alwaysNormalize?o.normalizePath(a.path):a.path),o.buildURLFromParts(u)},parseURL:function(t){var e=i.exec(t);return e?{scheme:e[1]||"",netLoc:e[2]||"",path:e[3]||"",params:e[4]||"",query:e[5]||"",fragment:e[6]||""}:null},normalizePath:function(t){for(t=t.split("").reverse().join("").replace(a,"");t.length!==(t=t.replace(s,"")).length;);return t.split("").reverse().join("")},buildURLFromParts:function(t){return t.scheme+t.netLoc+t.path+t.params+t.query+t.fragment}},t.exports=o},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var i=function(){this.aborted=!1,this.loaded=0,this.retry=0,this.total=0,this.chunkCount=0,this.bwEstimate=0,this.loading={start:0,first:0,end:0},this.parsing={start:0,end:0},this.buffering={start:0,first:0,end:0}}},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var i=function(){function t(){this.chunks=[],this.dataLength=0}var e=t.prototype;return e.push=function(t){this.chunks.push(t),this.dataLength+=t.length},e.flush=function(){var t,e=this.chunks,r=this.dataLength;return e.length?(t=1===e.length?e[0]:function(t,e){for(var r=new Uint8Array(e),i=0,n=0;n<t.length;n++){var a=t[n];r.set(a,i),i+=a.length}return r}(e,r),this.reset(),t):new Uint8Array(0)},e.reset=function(){this.chunks.length=0,this.dataLength=0},t}()},function(t,e,r){"use strict";var i=Object.prototype.hasOwnProperty,n="~";function a(){}function s(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function o(t,e,r,i,a){if("function"!=typeof r)throw new TypeError("The listener must be a function");var o=new s(r,i||t,a),l=n?n+e:e;return t._events[l]?t._events[l].fn?t._events[l]=[t._events[l],o]:t._events[l].push(o):(t._events[l]=o,t._eventsCount++),t}function l(t,e){0==--t._eventsCount?t._events=new a:delete t._events[e]}function u(){this._events=new a,this._eventsCount=0}Object.create&&(a.prototype=Object.create(null),(new a).__proto__||(n=!1)),u.prototype.eventNames=function(){var t,e,r=[];if(0===this._eventsCount)return r;for(e in t=this._events)i.call(t,e)&&r.push(n?e.slice(1):e);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(t)):r},u.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,a=r.length,s=new Array(a);i<a;i++)s[i]=r[i].fn;return s},u.prototype.listenerCount=function(t){var e=n?n+t:t,r=this._events[e];return r?r.fn?1:r.length:0},u.prototype.emit=function(t,e,r,i,a,s){var o=n?n+t:t;if(!this._events[o])return!1;var l,u,h=this._events[o],d=arguments.length;if(h.fn){switch(h.once&&this.removeListener(t,h.fn,void 0,!0),d){case 1:return h.fn.call(h.context),!0;case 2:return h.fn.call(h.context,e),!0;case 3:return h.fn.call(h.context,e,r),!0;case 4:return h.fn.call(h.context,e,r,i),!0;case 5:return h.fn.call(h.context,e,r,i,a),!0;case 6:return h.fn.call(h.context,e,r,i,a,s),!0}for(u=1,l=new Array(d-1);u<d;u++)l[u-1]=arguments[u];h.fn.apply(h.context,l)}else{var c,f=h.length;for(u=0;u<f;u++)switch(h[u].once&&this.removeListener(t,h[u].fn,void 0,!0),d){case 1:h[u].fn.call(h[u].context);break;case 2:h[u].fn.call(h[u].context,e);break;case 3:h[u].fn.call(h[u].context,e,r);break;case 4:h[u].fn.call(h[u].context,e,r,i);break;default:if(!l)for(c=1,l=new Array(d-1);c<d;c++)l[c-1]=arguments[c];h[u].fn.apply(h[u].context,l)}}return!0},u.prototype.on=function(t,e,r){return o(this,t,e,r,!1)},u.prototype.once=function(t,e,r){return o(this,t,e,r,!0)},u.prototype.removeListener=function(t,e,r,i){var a=n?n+t:t;if(!this._events[a])return this;if(!e)return l(this,a),this;var s=this._events[a];if(s.fn)s.fn!==e||i&&!s.once||r&&s.context!==r||l(this,a);else{for(var o=0,u=[],h=s.length;o<h;o++)(s[o].fn!==e||i&&!s[o].once||r&&s[o].context!==r)&&u.push(s[o]);u.length?this._events[a]=1===u.length?u[0]:u:l(this,a)}return this},u.prototype.removeAllListeners=function(t){var e;return t?(e=n?n+t:t,this._events[e]&&l(this,e)):(this._events=new a,this._eventsCount=0),this},u.prototype.off=u.prototype.removeListener,u.prototype.addListener=u.prototype.on,u.prefixed=n,u.EventEmitter=u,t.exports=u},function(t,e,r){"use strict";r.d(e,"a",(function(){return u}));var i=function(){function t(t,e){this.subtle=void 0,this.aesIV=void 0,this.subtle=t,this.aesIV=e}return t.prototype.decrypt=function(t,e){return this.subtle.decrypt({name:"AES-CBC",iv:this.aesIV},e,t)},t}(),n=function(){function t(t,e){this.subtle=void 0,this.key=void 0,this.subtle=t,this.key=e}return t.prototype.expandKey=function(){return this.subtle.importKey("raw",this.key,{name:"AES-CBC"},!1,["encrypt","decrypt"])},t}(),a=r(9);var s=function(){function t(){this.rcon=[0,1,2,4,8,16,32,64,128,27,54],this.subMix=[new Uint32Array(256),new Uint32Array(256),new Uint32Array(256),new Uint32Array(256)],this.invSubMix=[new Uint32Array(256),new Uint32Array(256),new Uint32Array(256),new Uint32Array(256)],this.sBox=new Uint32Array(256),this.invSBox=new Uint32Array(256),this.key=new Uint32Array(0),this.ksRows=0,this.keySize=0,this.keySchedule=void 0,this.invKeySchedule=void 0,this.initTable()}var e=t.prototype;return e.uint8ArrayToUint32Array_=function(t){for(var e=new DataView(t),r=new Uint32Array(4),i=0;i<4;i++)r[i]=e.getUint32(4*i);return r},e.initTable=function(){var t=this.sBox,e=this.invSBox,r=this.subMix,i=r[0],n=r[1],a=r[2],s=r[3],o=this.invSubMix,l=o[0],u=o[1],h=o[2],d=o[3],c=new Uint32Array(256),f=0,g=0,v=0;for(v=0;v<256;v++)c[v]=v<128?v<<1:v<<1^283;for(v=0;v<256;v++){var p=g^g<<1^g<<2^g<<3^g<<4;p=p>>>8^255&p^99,t[f]=p,e[p]=f;var m=c[f],y=c[m],T=c[y],b=257*c[p]^16843008*p;i[f]=b<<24|b>>>8,n[f]=b<<16|b>>>16,a[f]=b<<8|b>>>24,s[f]=b,b=16843009*T^65537*y^257*m^16843008*f,l[p]=b<<24|b>>>8,u[p]=b<<16|b>>>16,h[p]=b<<8|b>>>24,d[p]=b,f?(f=m^c[c[c[T^m]]],g^=c[c[g]]):f=g=1}},e.expandKey=function(t){for(var e=this.uint8ArrayToUint32Array_(t),r=!0,i=0;i<e.length&&r;)r=e[i]===this.key[i],i++;if(!r){this.key=e;var n=this.keySize=e.length;if(4!==n&&6!==n&&8!==n)throw new Error("Invalid aes key size="+n);var a,s,o,l,u=this.ksRows=4*(n+6+1),h=this.keySchedule=new Uint32Array(u),d=this.invKeySchedule=new Uint32Array(u),c=this.sBox,f=this.rcon,g=this.invSubMix,v=g[0],p=g[1],m=g[2],y=g[3];for(a=0;a<u;a++)a<n?o=h[a]=e[a]:(l=o,a%n==0?(l=c[(l=l<<8|l>>>24)>>>24]<<24|c[l>>>16&255]<<16|c[l>>>8&255]<<8|c[255&l],l^=f[a/n|0]<<24):n>6&&a%n==4&&(l=c[l>>>24]<<24|c[l>>>16&255]<<16|c[l>>>8&255]<<8|c[255&l]),h[a]=o=(h[a-n]^l)>>>0);for(s=0;s<u;s++)a=u-s,l=3&s?h[a]:h[a-4],d[s]=s<4||a<=4?l:v[c[l>>>24]]^p[c[l>>>16&255]]^m[c[l>>>8&255]]^y[c[255&l]],d[s]=d[s]>>>0}},e.networkToHostOrderSwap=function(t){return t<<24|(65280&t)<<8|(16711680&t)>>8|t>>>24},e.decrypt=function(t,e,r){for(var i,n,a,s,o,l,u,h,d,c,f,g,v,p,m=this.keySize+6,y=this.invKeySchedule,T=this.invSBox,b=this.invSubMix,E=b[0],S=b[1],L=b[2],A=b[3],R=this.uint8ArrayToUint32Array_(r),D=R[0],k=R[1],_=R[2],I=R[3],C=new Int32Array(t),w=new Int32Array(C.length),O=this.networkToHostOrderSwap;e<C.length;){for(d=O(C[e]),c=O(C[e+1]),f=O(C[e+2]),g=O(C[e+3]),o=d^y[0],l=g^y[1],u=f^y[2],h=c^y[3],v=4,p=1;p<m;p++)i=E[o>>>24]^S[l>>16&255]^L[u>>8&255]^A[255&h]^y[v],n=E[l>>>24]^S[u>>16&255]^L[h>>8&255]^A[255&o]^y[v+1],a=E[u>>>24]^S[h>>16&255]^L[o>>8&255]^A[255&l]^y[v+2],s=E[h>>>24]^S[o>>16&255]^L[l>>8&255]^A[255&u]^y[v+3],o=i,l=n,u=a,h=s,v+=4;i=T[o>>>24]<<24^T[l>>16&255]<<16^T[u>>8&255]<<8^T[255&h]^y[v],n=T[l>>>24]<<24^T[u>>16&255]<<16^T[h>>8&255]<<8^T[255&o]^y[v+1],a=T[u>>>24]<<24^T[h>>16&255]<<16^T[o>>8&255]<<8^T[255&l]^y[v+2],s=T[h>>>24]<<24^T[o>>16&255]<<16^T[l>>8&255]<<8^T[255&u]^y[v+3],w[e]=O(i^D),w[e+1]=O(s^k),w[e+2]=O(a^_),w[e+3]=O(n^I),D=d,k=c,_=f,I=g,e+=4}return w.buffer},t}(),o=r(1),l=r(6),u=function(){function t(t,e,r){var i=(void 0===r?{}:r).removePKCS7Padding,n=void 0===i||i;if(this.logEnabled=!0,this.observer=void 0,this.config=void 0,this.removePKCS7Padding=void 0,this.subtle=null,this.softwareDecrypter=null,this.key=null,this.fastAesKey=null,this.remainderData=null,this.currentIV=null,this.currentResult=null,this.observer=t,this.config=e,this.removePKCS7Padding=n,n)try{var a=self.crypto;a&&(this.subtle=a.subtle||a.webkitSubtle)}catch(t){}null===this.subtle&&(this.config.enableSoftwareAES=!0)}var e=t.prototype;return e.destroy=function(){this.observer=null},e.isSync=function(){return this.config.enableSoftwareAES},e.flush=function(){var t=this.currentResult;if(t){var e,r,i,n=new Uint8Array(t);return this.reset(),this.removePKCS7Padding?(r=(e=n).byteLength,(i=r&&new DataView(e.buffer).getUint8(r-1))?Object(a.a)(e,0,r-i):e):n}this.reset()},e.reset=function(){this.currentResult=null,this.currentIV=null,this.remainderData=null,this.softwareDecrypter&&(this.softwareDecrypter=null)},e.decrypt=function(t,e,r,i){if(this.config.enableSoftwareAES){this.softwareDecrypt(new Uint8Array(t),e,r);var n=this.flush();n&&i(n.buffer)}else this.webCryptoDecrypt(new Uint8Array(t),e,r).then(i)},e.softwareDecrypt=function(t,e,r){var i=this.currentIV,n=this.currentResult,o=this.remainderData;this.logOnce("JS AES decrypt"),o&&(t=Object(l.a)(o,t),this.remainderData=null);var u=this.getValidChunk(t);if(!u.length)return null;i&&(r=i);var h=this.softwareDecrypter;h||(h=this.softwareDecrypter=new s),h.expandKey(e);var d=n;return this.currentResult=h.decrypt(u.buffer,0,r),this.currentIV=Object(a.a)(u,-16).buffer,d||null},e.webCryptoDecrypt=function(t,e,r){var a=this,s=this.subtle;return this.key===e&&this.fastAesKey||(this.key=e,this.fastAesKey=new n(s,e)),this.fastAesKey.expandKey().then((function(e){return s?new i(s,r).decrypt(t.buffer,e):Promise.reject(new Error("web crypto not initialized"))})).catch((function(i){return a.onWebCryptoError(i,t,e,r)}))},e.onWebCryptoError=function(t,e,r,i){return o.b.warn("[decrypter.ts]: WebCrypto Error, disable WebCrypto API:",t),this.config.enableSoftwareAES=!0,this.logEnabled=!0,this.softwareDecrypt(e,r,i)},e.getValidChunk=function(t){var e=t,r=t.length-t.length%16;return r!==t.length&&(e=Object(a.a)(t,0,r),this.remainderData=Object(a.a)(t,r)),e},e.logOnce=function(t){this.logEnabled&&(o.b.log("[decrypter.ts]: "+t),this.logEnabled=!1)},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return m})),r.d(e,"b",(function(){return y}));var i=r(3),n=function(){function t(){}return t.getSilentFrame=function(t,e){switch(t){case"mp4a.40.2":if(1===e)return new Uint8Array([0,200,0,128,35,128]);if(2===e)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===e)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===e)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===e)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===e)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224]);break;default:if(1===e)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===e)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===e)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}},t}(),a=Math.pow(2,32)-1,s=function(){function t(){}return t.init=function(){var e;for(e in t.types={avc1:[],avcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],".mp3":[],mvex:[],mvhd:[],pasp:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[]},t.types)t.types.hasOwnProperty(e)&&(t.types[e]=[e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2),e.charCodeAt(3)]);var r=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),i=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]);t.HDLR_TYPES={video:r,audio:i};var n=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),a=new Uint8Array([0,0,0,0,0,0,0,0]);t.STTS=t.STSC=t.STCO=a,t.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),t.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0]),t.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),t.STSD=new Uint8Array([0,0,0,0,0,0,0,1]);var s=new Uint8Array([105,115,111,109]),o=new Uint8Array([97,118,99,49]),l=new Uint8Array([0,0,0,1]);t.FTYP=t.box(t.types.ftyp,s,l,s,o),t.DINF=t.box(t.types.dinf,t.box(t.types.dref,n))},t.box=function(t){for(var e=8,r=arguments.length,i=new Array(r>1?r-1:0),n=1;n<r;n++)i[n-1]=arguments[n];for(var a=i.length,s=a;a--;)e+=i[a].byteLength;var o=new Uint8Array(e);for(o[0]=e>>24&255,o[1]=e>>16&255,o[2]=e>>8&255,o[3]=255&e,o.set(t,4),a=0,e=8;a<s;a++)o.set(i[a],e),e+=i[a].byteLength;return o},t.hdlr=function(e){return t.box(t.types.hdlr,t.HDLR_TYPES[e])},t.mdat=function(e){return t.box(t.types.mdat,e)},t.mdhd=function(e,r){r*=e;var i=Math.floor(r/(a+1)),n=Math.floor(r%(a+1));return t.box(t.types.mdhd,new Uint8Array([1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,e>>24&255,e>>16&255,e>>8&255,255&e,i>>24,i>>16&255,i>>8&255,255&i,n>>24,n>>16&255,n>>8&255,255&n,85,196,0,0]))},t.mdia=function(e){return t.box(t.types.mdia,t.mdhd(e.timescale,e.duration),t.hdlr(e.type),t.minf(e))},t.mfhd=function(e){return t.box(t.types.mfhd,new Uint8Array([0,0,0,0,e>>24,e>>16&255,e>>8&255,255&e]))},t.minf=function(e){return"audio"===e.type?t.box(t.types.minf,t.box(t.types.smhd,t.SMHD),t.DINF,t.stbl(e)):t.box(t.types.minf,t.box(t.types.vmhd,t.VMHD),t.DINF,t.stbl(e))},t.moof=function(e,r,i){return t.box(t.types.moof,t.mfhd(e),t.traf(i,r))},t.moov=function(e){for(var r=e.length,i=[];r--;)i[r]=t.trak(e[r]);return t.box.apply(null,[t.types.moov,t.mvhd(e[0].timescale,e[0].duration)].concat(i).concat(t.mvex(e)))},t.mvex=function(e){for(var r=e.length,i=[];r--;)i[r]=t.trex(e[r]);return t.box.apply(null,[t.types.mvex].concat(i))},t.mvhd=function(e,r){r*=e;var i=Math.floor(r/(a+1)),n=Math.floor(r%(a+1)),s=new Uint8Array([1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,e>>24&255,e>>16&255,e>>8&255,255&e,i>>24,i>>16&255,i>>8&255,255&i,n>>24,n>>16&255,n>>8&255,255&n,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return t.box(t.types.mvhd,s)},t.sdtp=function(e){var r,i,n=e.samples||[],a=new Uint8Array(4+n.length);for(r=0;r<n.length;r++)i=n[r].flags,a[r+4]=i.dependsOn<<4|i.isDependedOn<<2|i.hasRedundancy;return t.box(t.types.sdtp,a)},t.stbl=function(e){return t.box(t.types.stbl,t.stsd(e),t.box(t.types.stts,t.STTS),t.box(t.types.stsc,t.STSC),t.box(t.types.stsz,t.STSZ),t.box(t.types.stco,t.STCO))},t.avc1=function(e){var r,i,n,a=[],s=[];for(r=0;r<e.sps.length;r++)n=(i=e.sps[r]).byteLength,a.push(n>>>8&255),a.push(255&n),a=a.concat(Array.prototype.slice.call(i));for(r=0;r<e.pps.length;r++)n=(i=e.pps[r]).byteLength,s.push(n>>>8&255),s.push(255&n),s=s.concat(Array.prototype.slice.call(i));var o=t.box(t.types.avcC,new Uint8Array([1,a[3],a[4],a[5],255,224|e.sps.length].concat(a).concat([e.pps.length]).concat(s))),l=e.width,u=e.height,h=e.pixelRatio[0],d=e.pixelRatio[1];return t.box(t.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,t.box(t.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])),t.box(t.types.pasp,new Uint8Array([h>>24,h>>16&255,h>>8&255,255&h,d>>24,d>>16&255,d>>8&255,255&d])))},t.esds=function(t){var e=t.config.length;return new Uint8Array([0,0,0,0,3,23+e,0,1,0,4,15+e,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([e]).concat(t.config).concat([6,1,2]))},t.mp4a=function(e){var r=e.samplerate;return t.box(t.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,e.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),t.box(t.types.esds,t.esds(e)))},t.mp3=function(e){var r=e.samplerate;return t.box(t.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,e.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]))},t.stsd=function(e){return"audio"===e.type?e.isAAC||"mp3"!==e.codec?t.box(t.types.stsd,t.STSD,t.mp4a(e)):t.box(t.types.stsd,t.STSD,t.mp3(e)):t.box(t.types.stsd,t.STSD,t.avc1(e))},t.tkhd=function(e){var r=e.id,i=e.duration*e.timescale,n=e.width,s=e.height,o=Math.floor(i/(a+1)),l=Math.floor(i%(a+1));return t.box(t.types.tkhd,new Uint8Array([1,0,0,7,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,o>>24,o>>16&255,o>>8&255,255&o,l>>24,l>>16&255,l>>8&255,255&l,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,n>>8&255,255&n,0,0,s>>8&255,255&s,0,0]))},t.traf=function(e,r){var i=t.sdtp(e),n=e.id,s=Math.floor(r/(a+1)),o=Math.floor(r%(a+1));return t.box(t.types.traf,t.box(t.types.tfhd,new Uint8Array([0,0,0,0,n>>24,n>>16&255,n>>8&255,255&n])),t.box(t.types.tfdt,new Uint8Array([1,0,0,0,s>>24,s>>16&255,s>>8&255,255&s,o>>24,o>>16&255,o>>8&255,255&o])),t.trun(e,i.length+16+20+8+16+8+8),i)},t.trak=function(e){return e.duration=e.duration||4294967295,t.box(t.types.trak,t.tkhd(e),t.mdia(e))},t.trex=function(e){var r=e.id;return t.box(t.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))},t.trun=function(e,r){var i,n,a,s,o,l,u=e.samples||[],h=u.length,d=12+16*h,c=new Uint8Array(d);for(r+=8+d,c.set([0,0,15,1,h>>>24&255,h>>>16&255,h>>>8&255,255&h,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),i=0;i<h;i++)a=(n=u[i]).duration,s=n.size,o=n.flags,l=n.cts,c.set([a>>>24&255,a>>>16&255,a>>>8&255,255&a,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*i);return t.box(t.types.trun,c)},t.initSegment=function(e){t.types||t.init();var r=t.moov(e),i=new Uint8Array(t.FTYP.byteLength+r.byteLength);return i.set(t.FTYP),i.set(r,t.FTYP.byteLength),i},t}();s.types=void 0,s.HDLR_TYPES=void 0,s.STTS=void 0,s.STSC=void 0,s.STCO=void 0,s.STSZ=void 0,s.VMHD=void 0,s.SMHD=void 0,s.STSD=void 0,s.FTYP=void 0,s.DINF=void 0;var o=s,l=r(0),u=r(2),h=r(1),d=r(4),c=r(8);function f(){return(f=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t}).apply(this,arguments)}var g=null,v=null,p=!1,m=function(){function t(t,e,r,i){if(void 0===i&&(i=""),this.observer=void 0,this.config=void 0,this.typeSupported=void 0,this.ISGenerated=!1,this._initPTS=void 0,this._initDTS=void 0,this.nextAvcDts=null,this.nextAudioPts=null,this.isAudioContiguous=!1,this.isVideoContiguous=!1,this.observer=t,this.config=e,this.typeSupported=r,this.ISGenerated=!1,null===g){var n=(navigator.userAgent||"").match(/Chrome\/(\d+)/i);g=n?parseInt(n[1]):0}if(null===v){var a=navigator.userAgent.match(/Safari\/(\d+)/i);v=a?parseInt(a[1]):0}p=!!g&&g<75||!!v&&v<600}var e=t.prototype;return e.destroy=function(){},e.resetTimeStamp=function(t){h.b.log("[mp4-remuxer]: initPTS & initDTS reset"),this._initPTS=this._initDTS=t},e.resetNextTimestamp=function(){h.b.log("[mp4-remuxer]: reset next timestamp"),this.isVideoContiguous=!1,this.isAudioContiguous=!1},e.resetInitSegment=function(){h.b.log("[mp4-remuxer]: ISGenerated flag reset"),this.ISGenerated=!1},e.getVideoStartPts=function(t){var e=!1,r=t.reduce((function(t,r){var i=r.pts-t;return i<-4294967296?(e=!0,y(t,r.pts)):i>0?t:r.pts}),t[0].pts);return e&&h.b.debug("PTS rollover detected"),r},e.remux=function(t,e,r,i,n,a,s,o){var l,u,c,f,g,v,p=n,m=n,T=t.pid>-1,b=e.pid>-1,E=e.samples.length,S=t.samples.length>0,L=E>1;if((!T||S)&&(!b||L)||this.ISGenerated||s){this.ISGenerated||(c=this.generateIS(t,e,n));var A=this.isVideoContiguous,R=-1;if(L&&(R=function(t){for(var e=0;e<t.length;e++)if(t[e].key)return e;return-1}(e.samples),!A&&this.config.forceKeyFrameOnDiscontinuity))if(v=!0,R>0){h.b.warn("[mp4-remuxer]: Dropped "+R+" out of "+E+" video samples due to a missing keyframe");var D=this.getVideoStartPts(e.samples);e.samples=e.samples.slice(R),e.dropped+=R,m+=(e.samples[0].pts-D)/(e.timescale||9e4)}else-1===R&&(h.b.warn("[mp4-remuxer]: No keyframe found out of "+E+" video samples"),v=!1);if(this.ISGenerated){if(S&&L){var k=this.getVideoStartPts(e.samples),_=(y(t.samples[0].pts,k)-k)/e.inputTimeScale;p+=Math.max(0,_),m+=Math.max(0,-_)}if(S){if(t.samplerate||(h.b.warn("[mp4-remuxer]: regenerate InitSegment as audio detected"),c=this.generateIS(t,e,n)),u=this.remuxAudio(t,p,this.isAudioContiguous,a,b||L||o===d.b.AUDIO?m:void 0),L){var I=u?u.endPTS-u.startPTS:0;e.inputTimeScale||(h.b.warn("[mp4-remuxer]: regenerate InitSegment as video detected"),c=this.generateIS(t,e,n)),l=this.remuxVideo(e,m,A,I)}}else L&&(l=this.remuxVideo(e,m,A,0));l&&(l.firstKeyFrame=R,l.independent=-1!==R)}}return this.ISGenerated&&(r.samples.length&&(g=this.remuxID3(r,n)),i.samples.length&&(f=this.remuxText(i,n))),{audio:u,video:l,initSegment:c,independent:v,text:f,id3:g}},e.generateIS=function(t,e,r){var n,a,s,l=t.samples,u=e.samples,h=this.typeSupported,d={},c=!Object(i.a)(this._initPTS),f="audio/mp4";if(c&&(n=a=1/0),t.config&&l.length&&(t.timescale=t.samplerate,t.isAAC||(h.mpeg?(f="audio/mpeg",t.codec=""):h.mp3&&(t.codec="mp3")),d.audio={id:"audio",container:f,codec:t.codec,initSegment:!t.isAAC&&h.mpeg?new Uint8Array(0):o.initSegment([t]),metadata:{channelCount:t.channelCount}},c&&(s=t.inputTimeScale,n=a=l[0].pts-Math.round(s*r))),e.sps&&e.pps&&u.length&&(e.timescale=e.inputTimeScale,d.video={id:"main",container:"video/mp4",codec:e.codec,initSegment:o.initSegment([e]),metadata:{width:e.width,height:e.height}},c)){s=e.inputTimeScale;var g=this.getVideoStartPts(u),v=Math.round(s*r);a=Math.min(a,y(u[0].dts,g)-v),n=Math.min(n,g-v)}if(Object.keys(d).length)return this.ISGenerated=!0,c&&(this._initPTS=n,this._initDTS=a),{tracks:d,initPTS:n,timescale:s}},e.remuxVideo=function(t,e,r,i){var n,a,s,d=t.inputTimeScale,v=t.samples,m=[],b=v.length,E=this._initPTS,S=this.nextAvcDts,L=8,A=Number.POSITIVE_INFINITY,R=Number.NEGATIVE_INFINITY,D=0,k=!1;r&&null!==S||(S=e*d-(v[0].pts-y(v[0].dts,v[0].pts)));for(var _=0;_<b;_++){var I=v[_];if(I.pts=y(I.pts-E,S),I.dts=y(I.dts-E,S),I.dts>I.pts){D=Math.max(Math.min(D,I.pts-I.dts),-18e3)}I.dts<v[_>0?_-1:_].dts&&(k=!0)}k&&v.sort((function(t,e){var r=t.dts-e.dts,i=t.pts-e.pts;return r||i})),a=v[0].dts,s=v[v.length-1].dts;var C=Math.round((s-a)/(b-1));if(D<0){if(D<-2*C){h.b.warn("PTS < DTS detected in video samples, offsetting DTS from PTS by "+Object(c.b)(-C,!0)+" ms");for(var w=D,O=0;O<b;O++)v[O].dts=w=Math.max(w,v[O].pts-C),v[O].pts=Math.max(w,v[O].pts)}else{h.b.warn("PTS < DTS detected in video samples, shifting DTS by "+Object(c.b)(D,!0)+" ms to overcome this issue");for(var x=0;x<b;x++)v[x].dts=v[x].dts+D}a=v[0].dts}if(r){var P=a-S,M=P>C;if(M||P<-1){M?h.b.warn("AVC: "+Object(c.b)(P,!0)+" ms ("+P+"dts) hole between fragments detected, filling it"):h.b.warn("AVC: "+Object(c.b)(-P,!0)+" ms ("+P+"dts) overlapping between fragments detected"),a=S;var F=v[0].pts-P;v[0].dts=a,v[0].pts=F,h.b.log("Video: First PTS/DTS adjusted: "+Object(c.b)(F,!0)+"/"+Object(c.b)(a,!0)+", delta: "+Object(c.b)(P,!0)+" ms")}}p&&(a=Math.max(0,a));for(var N=0,U=0,B=0;B<b;B++){for(var G=v[B],K=G.units,j=K.length,H=0,V=0;V<j;V++)H+=K[V].data.length;U+=H,N+=j,G.length=H,G.dts=Math.max(G.dts,a),G.pts=Math.max(G.pts,G.dts,0),A=Math.min(G.pts,A),R=Math.max(G.pts,R)}s=v[b-1].dts;var W,Y=U+4*N+8;try{W=new Uint8Array(Y)}catch(t){return void this.observer.emit(l.a.ERROR,l.a.ERROR,{type:u.b.MUX_ERROR,details:u.a.REMUX_ALLOC_ERROR,fatal:!1,bytes:Y,reason:"fail allocating video mdat "+Y})}var q=new DataView(W.buffer);q.setUint32(0,Y),W.set(o.types.mdat,4);for(var X=0;X<b;X++){for(var z=v[X],Q=z.units,$=0,J=0,Z=Q.length;J<Z;J++){var tt=Q[J],et=tt.data,rt=tt.data.byteLength;q.setUint32(L,rt),L+=4,W.set(et,L),L+=rt,$+=4+rt}if(X<b-1)n=v[X+1].dts-z.dts;else{var it=this.config,nt=z.dts-v[X>0?X-1:X].dts;if(it.stretchShortVideoTrack&&null!==this.nextAudioPts){var at=Math.floor(it.maxBufferHole*d),st=(i?A+i*d:this.nextAudioPts)-z.pts;st>at?((n=st-nt)<0&&(n=nt),h.b.log("[mp4-remuxer]: It is approximately "+st/90+" ms to the next segment; using duration "+n/90+" ms for the last video frame.")):n=nt}else n=nt}var ot=Math.round(z.pts-z.dts);m.push(new T(z.key,n,$,ot))}if(m.length&&g&&g<70){var lt=m[0].flags;lt.dependsOn=2,lt.isNonSync=0}this.nextAvcDts=S=s+n,this.isVideoContiguous=!0;var ut={data1:o.moof(t.sequenceNumber++,a,f({},t,{samples:m})),data2:W,startPTS:A/d,endPTS:(R+n)/d,startDTS:a/d,endDTS:S/d,type:"video",hasAudio:!1,hasVideo:!0,nb:m.length,dropped:t.dropped};return t.samples=[],t.dropped=0,ut},e.remuxAudio=function(t,e,r,i,a){var s=t.inputTimeScale,d=s/(t.samplerate?t.samplerate:s),c=t.isAAC?1024:1152,g=c*d,v=this._initPTS,p=!t.isAAC&&this.typeSupported.mpeg,m=[],b=t.samples,E=p?0:8,S=this.nextAudioPts||-1,L=e*s;if(this.isAudioContiguous=r=r||b.length&&S>0&&(i&&Math.abs(L-S)<9e3||Math.abs(y(b[0].pts-v,L)-S)<20*g),b.forEach((function(t){t.pts=y(t.pts-v,L)})),!r||S<0){if(!(b=b.filter((function(t){return t.pts>=0}))).length)return;S=0===a?0:i?Math.max(0,L):b[0].pts}if(t.isAAC)for(var A=void 0!==a,R=this.config.maxAudioFramesDrift,D=0,k=S;D<b.length;D++){var _=b[D],I=_.pts,C=I-k,w=Math.abs(1e3*C/s);if(C<=-R*g&&A)0===D&&(h.b.warn("Audio frame @ "+(I/s).toFixed(3)+"s overlaps nextAudioPts by "+Math.round(1e3*C/s)+" ms."),this.nextAudioPts=S=k=I);else if(C>=R*g&&w<1e4&&A){var O=Math.round(C/g);(k=I-O*g)<0&&(O--,k+=g),0===D&&(this.nextAudioPts=S=k),h.b.warn("[mp4-remuxer]: Injecting "+O+" audio frame @ "+(k/s).toFixed(3)+"s due to "+Math.round(1e3*C/s)+" ms gap.");for(var x=0;x<O;x++){var P=Math.max(k,0),M=n.getSilentFrame(t.manifestCodec||t.codec,t.channelCount);M||(h.b.log("[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead."),M=_.unit.subarray()),b.splice(D,0,{unit:M,pts:P}),k+=g,D++}}_.pts=k,k+=g}for(var F,N=null,U=null,B=0,G=b.length;G--;)B+=b[G].unit.byteLength;for(var K=0,j=b.length;K<j;K++){var H=b[K],V=H.unit,W=H.pts;if(null!==U){m[K-1].duration=Math.round((W-U)/d)}else{if(r&&t.isAAC&&(W=S),N=W,!(B>0))return;B+=E;try{F=new Uint8Array(B)}catch(t){return void this.observer.emit(l.a.ERROR,l.a.ERROR,{type:u.b.MUX_ERROR,details:u.a.REMUX_ALLOC_ERROR,fatal:!1,bytes:B,reason:"fail allocating audio mdat "+B})}p||(new DataView(F.buffer).setUint32(0,B),F.set(o.types.mdat,4))}F.set(V,E);var Y=V.byteLength;E+=Y,m.push(new T(!0,c,Y,0)),U=W}var q=m.length;if(q){var X=m[m.length-1];this.nextAudioPts=S=U+d*X.duration;var z=p?new Uint8Array(0):o.moof(t.sequenceNumber++,N/d,f({},t,{samples:m}));t.samples=[];var Q=N/s,$=S/s,J={data1:z,data2:F,startPTS:Q,endPTS:$,startDTS:Q,endDTS:$,type:"audio",hasAudio:!0,hasVideo:!1,nb:q};return this.isAudioContiguous=!0,J}},e.remuxEmptyAudio=function(t,e,r,i){var a=t.inputTimeScale,s=a/(t.samplerate?t.samplerate:a),o=this.nextAudioPts,l=(null!==o?o:i.startDTS*a)+this._initDTS,u=i.endDTS*a+this._initDTS,d=1024*s,c=Math.ceil((u-l)/d),f=n.getSilentFrame(t.manifestCodec||t.codec,t.channelCount);if(h.b.warn("[mp4-remuxer]: remux empty Audio"),f){for(var g=[],v=0;v<c;v++){var p=l+v*d;g.push({unit:f,pts:p,dts:p})}return t.samples=g,this.remuxAudio(t,e,r,!1)}h.b.trace("[mp4-remuxer]: Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec")},e.remuxID3=function(t,e){var r=t.samples.length;if(r){for(var i=t.inputTimeScale,n=this._initPTS,a=this._initDTS,s=0;s<r;s++){var o=t.samples[s];o.pts=y(o.pts-n,e*i)/i,o.dts=y(o.dts-a,e*i)/i}var l=t.samples;return t.samples=[],{samples:l}}},e.remuxText=function(t,e){var r=t.samples.length;if(r){for(var i=t.inputTimeScale,n=this._initPTS,a=0;a<r;a++){var s=t.samples[a];s.pts=y(s.pts-n,e*i)/i}t.samples.sort((function(t,e){return t.pts-e.pts}));var o=t.samples;return t.samples=[],{samples:o}}},t}();function y(t,e){var r;if(null===e)return t;for(r=e<t?-8589934592:8589934592;Math.abs(t-e)>4294967296;)t+=r;return t}var T=function(t,e,r,i){this.size=void 0,this.duration=void 0,this.cts=void 0,this.flags=void 0,this.duration=e,this.size=r,this.cts=i,this.flags=new b(t)},b=function(t){this.isLeading=0,this.isDependedOn=0,this.hasRedundancy=0,this.degradPrio=0,this.dependsOn=1,this.isNonSync=1,this.dependsOn=t?2:1,this.isNonSync=t?0:1}},function(t,e,r){"use strict";r.d(e,"a",(function(){return a}));var i=r(11);function n(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var a=function(){function t(t,e){this._uri=null,this.method=null,this.keyFormat=null,this.keyFormatVersions=null,this.keyID=null,this.key=null,this.iv=null,this._uri=e?Object(i.buildAbsoluteURL)(t,e,{alwaysNormalize:!0}):t}var e,r,a;return t.fromURL=function(e,r){return new t(e,r)},t.fromURI=function(e){return new t(e)},e=t,(r=[{key:"uri",get:function(){return this._uri}}])&&n(e.prototype,r),a&&n(e,a),t}()},function(t,e,r){function i(t){var e={};function r(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return t[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=t,r.c=e,r.i=function(t){return t},r.d=function(t,e,i){r.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:i})},r.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="/",r.oe=function(t){throw console.error(t),t};var i=r(r.s=ENTRY_MODULE);return i.default||i}function n(t){return(t+"").replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function a(t,e,i){var a={};a[i]=[];var s=e.toString(),o=s.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/);if(!o)return a;for(var l,u=o[1],h=new RegExp("(\\\\n|\\W)"+n(u)+"\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)","g");l=h.exec(s);)"dll-reference"!==l[3]&&a[i].push(l[3]);for(h=new RegExp("\\("+n(u)+'\\("(dll-reference\\s([\\.|\\-|\\+|\\w|/|@]+))"\\)\\)\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)',"g");l=h.exec(s);)t[l[2]]||(a[i].push(l[1]),t[l[2]]=r(l[1]).m),a[l[2]]=a[l[2]]||[],a[l[2]].push(l[4]);for(var d,c=Object.keys(a),f=0;f<c.length;f++)for(var g=0;g<a[c[f]].length;g++)d=a[c[f]][g],isNaN(1*d)||(a[c[f]][g]=1*a[c[f]][g]);return a}function s(t){return Object.keys(t).reduce((function(e,r){return e||t[r].length>0}),!1)}t.exports=function(t,e){e=e||{};var n={main:r.m},o=e.all?{main:Object.keys(n.main)}:function(t,e){for(var r={main:[e]},i={main:[]},n={main:{}};s(r);)for(var o=Object.keys(r),l=0;l<o.length;l++){var u=o[l],h=r[u].pop();if(n[u]=n[u]||{},!n[u][h]&&t[u][h]){n[u][h]=!0,i[u]=i[u]||[],i[u].push(h);for(var d=a(t,t[u][h],u),c=Object.keys(d),f=0;f<c.length;f++)r[c[f]]=r[c[f]]||[],r[c[f]]=r[c[f]].concat(d[c[f]])}}return i}(n,t),l="";Object.keys(o).filter((function(t){return"main"!==t})).forEach((function(t){for(var e=0;o[t][e];)e++;o[t].push(e),n[t][e]="(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })",l=l+"var "+t+" = ("+i.toString().replace("ENTRY_MODULE",JSON.stringify(e))+")({"+o[t].map((function(e){return JSON.stringify(e)+": "+n[t][e].toString()})).join(",")+"});\n"})),l=l+"new (("+i.toString().replace("ENTRY_MODULE",JSON.stringify(t))+")({"+o.main.map((function(t){return JSON.stringify(t)+": "+n.main[t].toString()})).join(",")+"}))(self);";var u=new window.Blob([l],{type:"text/javascript"});if(e.bare)return u;var h=(window.URL||window.webkitURL||window.mozURL||window.msURL).createObjectURL(u),d=new window.Worker(h);return d.objectURL=h,d}},function(t,e,r){"use strict";r.r(e),r.d(e,"default",(function(){return o}));var i=r(10),n=r(0),a=r(1),s=r(14);function o(t){var e=new s.EventEmitter,r=function(e,r){t.postMessage({event:e,data:r})};e.on(n.a.FRAG_DECRYPTED,r),e.on(n.a.ERROR,r),t.addEventListener("message",(function(n){var s=n.data;switch(s.cmd){case"init":var o=JSON.parse(s.config);t.transmuxer=new i.c(e,s.typeSupported,o,s.vendor,s.id),Object(a.a)(o.debug),r("init",null);break;case"configure":t.transmuxer.configure(s.config);break;case"demux":var u=t.transmuxer.push(s.data,s.decryptdata,s.chunkMeta,s.state);Object(i.d)(u)?u.then((function(e){l(t,e)})):l(t,u);break;case"flush":var d=s.chunkMeta,c=t.transmuxer.flush(d);Object(i.d)(c)?c.then((function(e){h(t,e,d)})):h(t,c,d)}}))}function l(t,e){if((r=e.remuxResult).audio||r.video||r.text||r.id3||r.initSegment){var r,i=[],n=e.remuxResult,a=n.audio,s=n.video;a&&u(i,a),s&&u(i,s),t.postMessage({event:"transmuxComplete",data:e},i)}}function u(t,e){e.data1&&t.push(e.data1.buffer),e.data2&&t.push(e.data2.buffer)}function h(t,e,r){e.forEach((function(e){l(t,e)})),t.postMessage({event:"flush",data:r})}},function(t,e,r){"use strict";r.r(e),r.d(e,"default",(function(){return ii}));var i=r(11),n=r(3),a=r(0),s=r(2),o=r(1),l=r(6),u=r(5);function h(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var d=function(){function t(t){this.PTSKnown=!1,this.alignedSliding=!1,this.averagetargetduration=void 0,this.endCC=0,this.endSN=0,this.fragments=void 0,this.fragmentHint=void 0,this.partList=null,this.live=!0,this.ageHeader=0,this.advancedDateTime=void 0,this.updated=!0,this.advanced=!0,this.availabilityDelay=void 0,this.misses=0,this.needSidxRanges=!1,this.startCC=0,this.startSN=0,this.startTimeOffset=null,this.targetduration=0,this.totalduration=0,this.type=null,this.url=void 0,this.m3u8="",this.version=null,this.canBlockReload=!1,this.canSkipUntil=0,this.canSkipDateRanges=!1,this.skippedSegments=0,this.recentlyRemovedDateranges=void 0,this.partHoldBack=0,this.holdBack=0,this.partTarget=0,this.preloadHint=void 0,this.renditionReports=void 0,this.tuneInGoal=0,this.deltaUpdateFailed=void 0,this.driftStartTime=0,this.driftEndTime=0,this.driftStart=0,this.driftEnd=0,this.fragments=[],this.url=t}var e,r,i;return t.prototype.reloaded=function(t){if(!t)return this.advanced=!0,void(this.updated=!0);var e=this.lastPartSn-t.lastPartSn,r=this.lastPartIndex-t.lastPartIndex;this.updated=this.endSN!==t.endSN||!!r||!!e,this.advanced=this.endSN>t.endSN||e>0||0===e&&r>0,this.updated||this.advanced?this.misses=Math.floor(.6*t.misses):this.misses=t.misses+1,this.availabilityDelay=t.availabilityDelay},e=t,(r=[{key:"hasProgramDateTime",get:function(){return!!this.fragments.length&&Object(n.a)(this.fragments[this.fragments.length-1].programDateTime)}},{key:"levelTargetDuration",get:function(){return this.averagetargetduration||this.targetduration||10}},{key:"drift",get:function(){var t=this.driftEndTime-this.driftStartTime;return t>0?1e3*(this.driftEnd-this.driftStart)/t:1}},{key:"edge",get:function(){return this.partEnd||this.fragmentEnd}},{key:"partEnd",get:function(){var t;return null!==(t=this.partList)&&void 0!==t&&t.length?this.partList[this.partList.length-1].end:this.fragmentEnd}},{key:"fragmentEnd",get:function(){var t;return null!==(t=this.fragments)&&void 0!==t&&t.length?this.fragments[this.fragments.length-1].end:0}},{key:"age",get:function(){return this.advancedDateTime?Math.max(Date.now()-this.advancedDateTime,0)/1e3:0}},{key:"lastPartIndex",get:function(){var t;return null!==(t=this.partList)&&void 0!==t&&t.length?this.partList[this.partList.length-1].index:-1}},{key:"lastPartSn",get:function(){var t;return null!==(t=this.partList)&&void 0!==t&&t.length?this.partList[this.partList.length-1].fragment.sn:this.endSN}}])&&h(e.prototype,r),i&&h(e,i),t}(),c=r(17),f=/^(\d+)x(\d+)$/,g=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,v=function(){function t(e){for(var r in"string"==typeof e&&(e=t.parseAttrList(e)),e)e.hasOwnProperty(r)&&(this[r]=e[r])}var e=t.prototype;return e.decimalInteger=function(t){var e=parseInt(this[t],10);return e>Number.MAX_SAFE_INTEGER?1/0:e},e.hexadecimalInteger=function(t){if(this[t]){var e=(this[t]||"0x").slice(2);e=(1&e.length?"0":"")+e;for(var r=new Uint8Array(e.length/2),i=0;i<e.length/2;i++)r[i]=parseInt(e.slice(2*i,2*i+2),16);return r}return null},e.hexadecimalIntegerAsNumber=function(t){var e=parseInt(this[t],16);return e>Number.MAX_SAFE_INTEGER?1/0:e},e.decimalFloatingPoint=function(t){return parseFloat(this[t])},e.optionalFloat=function(t,e){var r=this[t];return r?parseFloat(r):e},e.enumeratedString=function(t){return this[t]},e.bool=function(t){return"YES"===this[t]},e.decimalResolution=function(t){var e=f.exec(this[t]);if(null!==e)return{width:parseInt(e[1],10),height:parseInt(e[2],10)}},t.parseAttrList=function(t){var e,r={};for(g.lastIndex=0;null!==(e=g.exec(t));){var i=e[2];0===i.indexOf('"')&&i.lastIndexOf('"')===i.length-1&&(i=i.slice(1,-1)),r[e[1]]=i}return r},t}(),p={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,av01:!0,drac:!0,dvav:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0},text:{stpp:!0,wvtt:!0}};function m(t,e){return MediaSource.isTypeSupported((e||"video")+'/mp4;codecs="'+t+'"')}var y=/#EXT-X-STREAM-INF:([^\r\n]*)(?:[\r\n](?:#[^\r\n]*)?)*([^\r\n]+)|#EXT-X-SESSION-DATA:([^\r\n]*)[\r\n]+/g,T=/#EXT-X-MEDIA:(.*)/g,b=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/(?!#) *(\S[\S ]*)/.source,/#EXT-X-BYTERANGE:*(.+)/.source,/#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/#.*/.source].join("|"),"g"),E=new RegExp([/#(EXTM3U)/.source,/#EXT-X-(PLAYLIST-TYPE):(.+)/.source,/#EXT-X-(MEDIA-SEQUENCE): *(\d+)/.source,/#EXT-X-(SKIP):(.+)/.source,/#EXT-X-(TARGETDURATION): *(\d+)/.source,/#EXT-X-(KEY):(.+)/.source,/#EXT-X-(START):(.+)/.source,/#EXT-X-(ENDLIST)/.source,/#EXT-X-(DISCONTINUITY-SEQ)UENCE: *(\d+)/.source,/#EXT-X-(DIS)CONTINUITY/.source,/#EXT-X-(VERSION):(\d+)/.source,/#EXT-X-(MAP):(.+)/.source,/#EXT-X-(SERVER-CONTROL):(.+)/.source,/#EXT-X-(PART-INF):(.+)/.source,/#EXT-X-(GAP)/.source,/#EXT-X-(BITRATE):\s*(\d+)/.source,/#EXT-X-(PART):(.+)/.source,/#EXT-X-(PRELOAD-HINT):(.+)/.source,/#EXT-X-(RENDITION-REPORT):(.+)/.source,/(#)([^:]*):(.*)/.source,/(#)(.*)(?:.*)\r?\n?/.source].join("|")),S=/\.(mp4|m4s|m4v|m4a)$/i;var L=function(){function t(){}return t.findGroup=function(t,e){for(var r=0;r<t.length;r++){var i=t[r];if(i.id===e)return i}},t.convertAVC1ToAVCOTI=function(t){var e=t.split(".");if(e.length>2){var r=e.shift()+".";return r+=parseInt(e.shift()).toString(16),r+=("000"+parseInt(e.shift()).toString(16)).substr(-4)}return t},t.resolve=function(t,e){return i.buildAbsoluteURL(e,t,{alwaysNormalize:!0})},t.parseMasterPlaylist=function(e,r){var i,n=[],a={},s=!1;for(y.lastIndex=0;null!=(i=y.exec(e));)if(i[1]){var o=new v(i[1]),l={attrs:o,bitrate:o.decimalInteger("AVERAGE-BANDWIDTH")||o.decimalInteger("BANDWIDTH"),name:o.NAME,url:t.resolve(i[2],r)},u=o.decimalResolution("RESOLUTION");u&&(l.width=u.width,l.height=u.height),A((o.CODECS||"").split(/[ ,]+/).filter((function(t){return t})),l),l.videoCodec&&-1!==l.videoCodec.indexOf("avc1")&&(l.videoCodec=t.convertAVC1ToAVCOTI(l.videoCodec)),n.push(l)}else if(i[3]){var h=new v(i[3]);h["DATA-ID"]&&(s=!0,a[h["DATA-ID"]]=h)}return{levels:n,sessionData:s?a:null}},t.parseMasterPlaylistMedia=function(e,r,i,n){var a;void 0===n&&(n=[]);var s=[],o=0;for(T.lastIndex=0;null!==(a=T.exec(e));){var l=new v(a[1]);if(l.TYPE===i){var u={attrs:l,bitrate:0,id:o++,groupId:l["GROUP-ID"],instreamId:l["INSTREAM-ID"],name:l.NAME||l.LANGUAGE||"",type:i,default:l.bool("DEFAULT"),autoselect:l.bool("AUTOSELECT"),forced:l.bool("FORCED"),lang:l.LANGUAGE,url:l.URI?t.resolve(l.URI,r):""};if(n.length){var h=t.findGroup(n,u.groupId)||n[0];R(u,h,"audioCodec"),R(u,h,"textCodec")}s.push(u)}}return s},t.parseLevelPlaylist=function(t,e,r,a,s){var l,h,f,g=new d(e),p=g.fragments,m=null,y=0,T=0,L=0,A=0,R=null,k=new u.b(a,e),_=-1,I=!1;for(b.lastIndex=0,g.m3u8=t;null!==(l=b.exec(t));){I&&(I=!1,(k=new u.b(a,e)).start=L,k.sn=y,k.cc=A,k.level=r,m&&(k.initSegment=m,k.rawProgramDateTime=m.rawProgramDateTime));var C=l[1];if(C){k.duration=parseFloat(C);var w=(" "+l[2]).slice(1);k.title=w||null,k.tagList.push(w?["INF",C,w]:["INF",C])}else if(l[3])Object(n.a)(k.duration)&&(k.start=L,f&&(k.levelkey=f),k.sn=y,k.level=r,k.cc=A,k.urlId=s,p.push(k),k.relurl=(" "+l[3]).slice(1),D(k,R),R=k,L+=k.duration,y++,T=0,I=!0);else if(l[4]){var O=(" "+l[4]).slice(1);R?k.setByteRange(O,R):k.setByteRange(O)}else if(l[5])k.rawProgramDateTime=(" "+l[5]).slice(1),k.tagList.push(["PROGRAM-DATE-TIME",k.rawProgramDateTime]),-1===_&&(_=p.length);else{if(!(l=l[0].match(E))){o.b.warn("No matches on slow regex match for level playlist!");continue}for(h=1;h<l.length&&void 0===l[h];h++);var x=(" "+l[h]).slice(1),P=(" "+l[h+1]).slice(1),M=l[h+2]?(" "+l[h+2]).slice(1):"";switch(x){case"PLAYLIST-TYPE":g.type=P.toUpperCase();break;case"MEDIA-SEQUENCE":y=g.startSN=parseInt(P);break;case"SKIP":var F=new v(P),N=F.decimalInteger("SKIPPED-SEGMENTS");if(Object(n.a)(N)){g.skippedSegments=N;for(var U=N;U--;)p.unshift(null);y+=N}var B=F.enumeratedString("RECENTLY-REMOVED-DATERANGES");B&&(g.recentlyRemovedDateranges=B.split("\t"));break;case"TARGETDURATION":g.targetduration=parseFloat(P);break;case"VERSION":g.version=parseInt(P);break;case"EXTM3U":break;case"ENDLIST":g.live=!1;break;case"#":(P||M)&&k.tagList.push(M?[P,M]:[P]);break;case"DIS":A++;case"GAP":k.tagList.push([x]);break;case"BITRATE":k.tagList.push([x,P]);break;case"DISCONTINUITY-SEQ":A=parseInt(P);break;case"KEY":var G,K=new v(P),j=K.enumeratedString("METHOD"),H=K.URI,V=K.hexadecimalInteger("IV"),W=K.enumeratedString("KEYFORMATVERSIONS"),Y=K.enumeratedString("KEYID"),q=null!=(G=K.enumeratedString("KEYFORMAT"))?G:"identity";if(["com.apple.streamingkeydelivery","com.microsoft.playready","urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed","com.widevine"].indexOf(q)>-1){o.b.warn("Keyformat "+q+" is not supported from the manifest");continue}if("identity"!==q)continue;j&&(f=c.a.fromURL(e,H),H&&["AES-128","SAMPLE-AES","SAMPLE-AES-CENC"].indexOf(j)>=0&&(f.method=j,f.keyFormat=q,Y&&(f.keyID=Y),W&&(f.keyFormatVersions=W),f.iv=V));break;case"START":var X=new v(P).decimalFloatingPoint("TIME-OFFSET");Object(n.a)(X)&&(g.startTimeOffset=X);break;case"MAP":var z=new v(P);k.relurl=z.URI,z.BYTERANGE&&k.setByteRange(z.BYTERANGE),k.level=r,k.sn="initSegment",f&&(k.levelkey=f),k.initSegment=null,m=k,I=!0;break;case"SERVER-CONTROL":var Q=new v(P);g.canBlockReload=Q.bool("CAN-BLOCK-RELOAD"),g.canSkipUntil=Q.optionalFloat("CAN-SKIP-UNTIL",0),g.canSkipDateRanges=g.canSkipUntil>0&&Q.bool("CAN-SKIP-DATERANGES"),g.partHoldBack=Q.optionalFloat("PART-HOLD-BACK",0),g.holdBack=Q.optionalFloat("HOLD-BACK",0);break;case"PART-INF":var $=new v(P);g.partTarget=$.decimalFloatingPoint("PART-TARGET");break;case"PART":var J=g.partList;J||(J=g.partList=[]);var Z=T>0?J[J.length-1]:void 0,tt=T++,et=new u.c(new v(P),k,e,tt,Z);J.push(et),k.duration+=et.duration;break;case"PRELOAD-HINT":var rt=new v(P);g.preloadHint=rt;break;case"RENDITION-REPORT":var it=new v(P);g.renditionReports=g.renditionReports||[],g.renditionReports.push(it);break;default:o.b.warn("line parsed but not handled: "+l)}}}R&&!R.relurl?(p.pop(),L-=R.duration,g.partList&&(g.fragmentHint=R)):g.partList&&(D(k,R),k.cc=A,g.fragmentHint=k);var nt=p.length,at=p[0],st=p[nt-1];if((L+=g.skippedSegments*g.targetduration)>0&&nt&&st){g.averagetargetduration=L/nt;var ot=st.sn;g.endSN="initSegment"!==ot?ot:0,at&&(g.startCC=at.cc,at.initSegment||g.fragments.every((function(t){return t.relurl&&(e=t.relurl,S.test(null!=(r=null===(n=i.parseURL(e))||void 0===n?void 0:n.path)?r:""));var e,r,n}))&&(o.b.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),(k=new u.b(a,e)).relurl=st.relurl,k.level=r,k.sn="initSegment",at.initSegment=k,g.needSidxRanges=!0))}else g.endSN=0,g.startCC=0;return g.fragmentHint&&(L+=g.fragmentHint.duration),g.totalduration=L,g.endCC=A,_>0&&function(t,e){for(var r=t[e],i=e;i--;){var n=t[i];if(!n)return;n.programDateTime=r.programDateTime-1e3*n.duration,r=n}}(p,_),g},t}();function A(t,e){["video","audio","text"].forEach((function(r){var i=t.filter((function(t){return function(t,e){var r=p[e];return!!r&&!0===r[t.slice(0,4)]}(t,r)}));if(i.length){var n=i.filter((function(t){return 0===t.lastIndexOf("avc1",0)||0===t.lastIndexOf("mp4a",0)}));e[r+"Codec"]=n.length>0?n[0]:i[0],t=t.filter((function(t){return-1===i.indexOf(t)}))}})),e.unknownCodecs=t}function R(t,e,r){var i=e[r];i&&(t[r]=i)}function D(t,e){t.rawProgramDateTime?t.programDateTime=Date.parse(t.rawProgramDateTime):null!=e&&e.programDateTime&&(t.programDateTime=e.endProgramDateTime),Object(n.a)(t.programDateTime)||(t.programDateTime=null,t.rawProgramDateTime=null)}var k=r(4);function _(t,e){var r=t.url;return void 0!==r&&0!==r.indexOf("data:")||(r=e.url),r}var I=function(){function t(t){this.hls=void 0,this.loaders=Object.create(null),this.hls=t,this.registerListeners()}var e=t.prototype;return e.registerListeners=function(){var t=this.hls;t.on(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.on(a.a.LEVEL_LOADING,this.onLevelLoading,this),t.on(a.a.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),t.on(a.a.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this)},e.unregisterListeners=function(){var t=this.hls;t.off(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.off(a.a.LEVEL_LOADING,this.onLevelLoading,this),t.off(a.a.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),t.off(a.a.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this)},e.createInternalLoader=function(t){var e=this.hls.config,r=e.pLoader,i=e.loader,n=new(r||i)(e);return t.loader=n,this.loaders[t.type]=n,n},e.getInternalLoader=function(t){return this.loaders[t.type]},e.resetInternalLoader=function(t){this.loaders[t]&&delete this.loaders[t]},e.destroyInternalLoaders=function(){for(var t in this.loaders){var e=this.loaders[t];e&&e.destroy(),this.resetInternalLoader(t)}},e.destroy=function(){this.unregisterListeners(),this.destroyInternalLoaders()},e.onManifestLoading=function(t,e){var r=e.url;this.load({id:null,groupId:null,level:0,responseType:"text",type:k.a.MANIFEST,url:r,deliveryDirectives:null})},e.onLevelLoading=function(t,e){var r=e.id,i=e.level,n=e.url,a=e.deliveryDirectives;this.load({id:r,groupId:null,level:i,responseType:"text",type:k.a.LEVEL,url:n,deliveryDirectives:a})},e.onAudioTrackLoading=function(t,e){var r=e.id,i=e.groupId,n=e.url,a=e.deliveryDirectives;this.load({id:r,groupId:i,level:null,responseType:"text",type:k.a.AUDIO_TRACK,url:n,deliveryDirectives:a})},e.onSubtitleTrackLoading=function(t,e){var r=e.id,i=e.groupId,n=e.url,a=e.deliveryDirectives;this.load({id:r,groupId:i,level:null,responseType:"text",type:k.a.SUBTITLE_TRACK,url:n,deliveryDirectives:a})},e.load=function(t){var e,r,i,n,a,s,l=this.hls.config,u=this.getInternalLoader(t);if(u){var h=u.context;if(h&&h.url===t.url)return void o.b.trace("[playlist-loader]: playlist request ongoing");o.b.log("[playlist-loader]: aborting previous loader for type: "+t.type),u.abort()}switch(t.type){case k.a.MANIFEST:r=l.manifestLoadingMaxRetry,i=l.manifestLoadingTimeOut,n=l.manifestLoadingRetryDelay,a=l.manifestLoadingMaxRetryTimeout;break;case k.a.LEVEL:case k.a.AUDIO_TRACK:case k.a.SUBTITLE_TRACK:r=0,i=l.levelLoadingTimeOut;break;default:r=l.levelLoadingMaxRetry,i=l.levelLoadingTimeOut,n=l.levelLoadingRetryDelay,a=l.levelLoadingMaxRetryTimeout}if((u=this.createInternalLoader(t),null!==(e=t.deliveryDirectives)&&void 0!==e&&e.part)&&(t.type===k.a.LEVEL&&null!==t.level?s=this.hls.levels[t.level].details:t.type===k.a.AUDIO_TRACK&&null!==t.id?s=this.hls.audioTracks[t.id].details:t.type===k.a.SUBTITLE_TRACK&&null!==t.id&&(s=this.hls.subtitleTracks[t.id].details),s)){var d=s.partTarget,c=s.targetduration;d&&c&&(i=Math.min(1e3*Math.max(3*d,.8*c),i))}var f={timeout:i,maxRetry:r,retryDelay:n,maxRetryDelay:a,highWaterMark:0},g={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)};u.load(t,f,g)},e.loadsuccess=function(t,e,r,i){if(void 0===i&&(i=null),r.isSidxRequest)return this.handleSidxRequest(t,r),void this.handlePlaylistLoaded(t,e,r,i);this.resetInternalLoader(r.type);var n=t.data;0===n.indexOf("#EXTM3U")?(e.parsing.start=performance.now(),n.indexOf("#EXTINF:")>0||n.indexOf("#EXT-X-TARGETDURATION:")>0?this.handleTrackOrLevelPlaylist(t,e,r,i):this.handleMasterPlaylist(t,e,r,i)):this.handleManifestParsingError(t,r,"no EXTM3U delimiter",i)},e.loaderror=function(t,e,r){void 0===r&&(r=null),this.handleNetworkError(e,r,!1,t)},e.loadtimeout=function(t,e,r){void 0===r&&(r=null),this.handleNetworkError(e,r,!0)},e.handleMasterPlaylist=function(t,e,r,i){var n=this.hls,s=t.data,l=_(t,r),u=L.parseMasterPlaylist(s,l),h=u.levels,d=u.sessionData;if(h.length){var c=h.map((function(t){return{id:t.attrs.AUDIO,audioCodec:t.audioCodec}})),f=h.map((function(t){return{id:t.attrs.SUBTITLES,textCodec:t.textCodec}})),g=L.parseMasterPlaylistMedia(s,l,"AUDIO",c),p=L.parseMasterPlaylistMedia(s,l,"SUBTITLES",f),m=L.parseMasterPlaylistMedia(s,l,"CLOSED-CAPTIONS");if(g.length)g.some((function(t){return!t.url}))||!h[0].audioCodec||h[0].attrs.AUDIO||(o.b.log("[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one"),g.unshift({type:"main",name:"main",default:!1,autoselect:!1,forced:!1,id:-1,attrs:new v({}),bitrate:0,url:""}));n.trigger(a.a.MANIFEST_LOADED,{levels:h,audioTracks:g,subtitles:p,captions:m,url:l,stats:e,networkDetails:i,sessionData:d})}else this.handleManifestParsingError(t,r,"no level found in manifest",i)},e.handleTrackOrLevelPlaylist=function(t,e,r,i){var o=this.hls,l=r.id,u=r.level,h=r.type,d=_(t,r),c=Object(n.a)(l)?l:0,f=Object(n.a)(u)?u:c,g=function(t){switch(t.type){case k.a.AUDIO_TRACK:return k.b.AUDIO;case k.a.SUBTITLE_TRACK:return k.b.SUBTITLE;default:return k.b.MAIN}}(r),p=L.parseLevelPlaylist(t.data,d,f,g,c);if(p.fragments.length){if(h===k.a.MANIFEST){var m={attrs:new v({}),bitrate:0,details:p,name:"",url:d};o.trigger(a.a.MANIFEST_LOADED,{levels:[m],audioTracks:[],url:d,stats:e,networkDetails:i,sessionData:null})}if(e.parsing.end=performance.now(),p.needSidxRanges){var y,T=null===(y=p.fragments[0].initSegment)||void 0===y?void 0:y.url;this.load({url:T,isSidxRequest:!0,type:h,level:u,levelDetails:p,id:l,groupId:null,rangeStart:0,rangeEnd:2048,responseType:"arraybuffer",deliveryDirectives:null})}else r.levelDetails=p,this.handlePlaylistLoaded(t,e,r,i)}else o.trigger(a.a.ERROR,{type:s.b.NETWORK_ERROR,details:s.a.LEVEL_EMPTY_ERROR,fatal:!1,url:d,reason:"no fragments found in level",level:"number"==typeof r.level?r.level:void 0})},e.handleSidxRequest=function(t,e){var r=Object(l.g)(new Uint8Array(t.data));if(r){var i=r.references,n=e.levelDetails;i.forEach((function(t,e){var i=t.info,a=n.fragments[e];0===a.byteRange.length&&a.setByteRange(String(1+i.end-i.start)+"@"+String(i.start)),a.initSegment&&a.initSegment.setByteRange(String(r.moovEndOffset)+"@0")}))}},e.handleManifestParsingError=function(t,e,r,i){this.hls.trigger(a.a.ERROR,{type:s.b.NETWORK_ERROR,details:s.a.MANIFEST_PARSING_ERROR,fatal:e.type===k.a.MANIFEST,url:t.url,reason:r,response:t,context:e,networkDetails:i})},e.handleNetworkError=function(t,e,r,i){void 0===r&&(r=!1),o.b.warn("[playlist-loader]: A network "+(r?"timeout":"error")+" occurred while loading "+t.type+" level: "+t.level+" id: "+t.id+' group-id: "'+t.groupId+'"');var n=s.a.UNKNOWN,l=!1,u=this.getInternalLoader(t);switch(t.type){case k.a.MANIFEST:n=r?s.a.MANIFEST_LOAD_TIMEOUT:s.a.MANIFEST_LOAD_ERROR,l=!0;break;case k.a.LEVEL:n=r?s.a.LEVEL_LOAD_TIMEOUT:s.a.LEVEL_LOAD_ERROR,l=!1;break;case k.a.AUDIO_TRACK:n=r?s.a.AUDIO_TRACK_LOAD_TIMEOUT:s.a.AUDIO_TRACK_LOAD_ERROR,l=!1;break;case k.a.SUBTITLE_TRACK:n=r?s.a.SUBTITLE_TRACK_LOAD_TIMEOUT:s.a.SUBTITLE_LOAD_ERROR,l=!1}u&&this.resetInternalLoader(t.type);var h={type:s.b.NETWORK_ERROR,details:n,fatal:l,url:t.url,loader:u,context:t,networkDetails:e};i&&(h.response=i),this.hls.trigger(a.a.ERROR,h)},e.handlePlaylistLoaded=function(t,e,r,i){var n=r.type,s=r.level,o=r.id,l=r.groupId,u=r.loader,h=r.levelDetails,d=r.deliveryDirectives;if(null!=h&&h.targetduration){if(u)switch(h.live&&(u.getCacheAge&&(h.ageHeader=u.getCacheAge()||0),u.getCacheAge&&!isNaN(h.ageHeader)||(h.ageHeader=0)),n){case k.a.MANIFEST:case k.a.LEVEL:this.hls.trigger(a.a.LEVEL_LOADED,{details:h,level:s||0,id:o||0,stats:e,networkDetails:i,deliveryDirectives:d});break;case k.a.AUDIO_TRACK:this.hls.trigger(a.a.AUDIO_TRACK_LOADED,{details:h,id:o||0,groupId:l||"",stats:e,networkDetails:i,deliveryDirectives:d});break;case k.a.SUBTITLE_TRACK:this.hls.trigger(a.a.SUBTITLE_TRACK_LOADED,{details:h,id:o||0,groupId:l||"",stats:e,networkDetails:i,deliveryDirectives:d})}}else this.handleManifestParsingError(t,r,"invalid target duration",i)},t}(),C=function(){function t(t){this.hls=void 0,this.loaders={},this.decryptkey=null,this.decrypturl=null,this.hls=t,this._registerListeners()}var e=t.prototype;return e._registerListeners=function(){this.hls.on(a.a.KEY_LOADING,this.onKeyLoading,this)},e._unregisterListeners=function(){this.hls.off(a.a.KEY_LOADING,this.onKeyLoading)},e.destroy=function(){for(var t in this._unregisterListeners(),this.loaders){var e=this.loaders[t];e&&e.destroy()}this.loaders={}},e.onKeyLoading=function(t,e){var r=e.frag,i=r.type,n=this.loaders[i];if(r.decryptdata){var s=r.decryptdata.uri;if(s!==this.decrypturl||null===this.decryptkey){var l=this.hls.config;if(n&&(o.b.warn("abort previous key loader for type:"+i),n.abort()),!s)return void o.b.warn("key uri is falsy");var u=l.loader,h=r.loader=this.loaders[i]=new u(l);this.decrypturl=s,this.decryptkey=null;var d={url:s,frag:r,responseType:"arraybuffer"},c={timeout:l.fragLoadingTimeOut,maxRetry:0,retryDelay:l.fragLoadingRetryDelay,maxRetryDelay:l.fragLoadingMaxRetryTimeout,highWaterMark:0},f={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)};h.load(d,c,f)}else this.decryptkey&&(r.decryptdata.key=this.decryptkey,this.hls.trigger(a.a.KEY_LOADED,{frag:r}))}else o.b.warn("Missing decryption data on fragment in onKeyLoading")},e.loadsuccess=function(t,e,r){var i=r.frag;i.decryptdata?(this.decryptkey=i.decryptdata.key=new Uint8Array(t.data),i.loader=null,delete this.loaders[i.type],this.hls.trigger(a.a.KEY_LOADED,{frag:i})):o.b.error("after key load, decryptdata unset")},e.loaderror=function(t,e){var r=e.frag,i=r.loader;i&&i.abort(),delete this.loaders[r.type],this.hls.trigger(a.a.ERROR,{type:s.b.NETWORK_ERROR,details:s.a.KEY_LOAD_ERROR,fatal:!1,frag:r,response:t})},e.loadtimeout=function(t,e){var r=e.frag,i=r.loader;i&&i.abort(),delete this.loaders[r.type],this.hls.trigger(a.a.ERROR,{type:s.b.NETWORK_ERROR,details:s.a.KEY_LOAD_TIMEOUT,fatal:!1,frag:r})},t}();function w(t,e){var r;try{r=new Event("addtrack")}catch(t){(r=document.createEvent("Event")).initEvent("addtrack",!1,!1)}r.track=t,e.dispatchEvent(r)}function O(t,e){var r=t.mode;if("disabled"===r&&(t.mode="hidden"),t.cues&&!t.cues.getCueById(e.id))try{if(t.addCue(e),!t.cues.getCueById(e.id))throw new Error("addCue is failed for: "+e)}catch(r){o.b.debug("[texttrack-utils]: "+r);var i=new self.TextTrackCue(e.startTime,e.endTime,e.text);i.id=e.id,t.addCue(i)}"disabled"===r&&(t.mode=r)}function x(t){var e=t.mode;if("disabled"===e&&(t.mode="hidden"),t.cues)for(var r=t.cues.length;r--;)t.removeCue(t.cues[r]);"disabled"===e&&(t.mode=e)}function P(t,e,r){var i=t.mode;if("disabled"===i&&(t.mode="hidden"),t.cues&&t.cues.length>0)for(var n=function(t,e,r){var i=[],n=function(t,e){if(e<t[0].startTime)return 0;var r=t.length-1;if(e>t[r].endTime)return-1;var i=0,n=r;for(;i<=n;){var a=Math.floor((n+i)/2);if(e<t[a].startTime)n=a-1;else{if(!(e>t[a].startTime&&i<r))return a;i=a+1}}return t[i].startTime-e<e-t[n].startTime?i:n}(t,e);if(n>-1)for(var a=n,s=t.length;a<s;a++){var o=t[a];if(o.startTime>=e&&o.endTime<=r)i.push(o);else if(o.startTime>r)return i}return i}(t.cues,e,r),a=0;a<n.length;a++)t.removeCue(n[a]);"disabled"===i&&(t.mode=i)}var M=r(7),F=function(){function t(t){this.hls=void 0,this.id3Track=null,this.media=null,this.hls=t,this._registerListeners()}var e=t.prototype;return e.destroy=function(){this._unregisterListeners()},e._registerListeners=function(){var t=this.hls;t.on(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(a.a.FRAG_PARSING_METADATA,this.onFragParsingMetadata,this),t.on(a.a.BUFFER_FLUSHING,this.onBufferFlushing,this)},e._unregisterListeners=function(){var t=this.hls;t.off(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(a.a.FRAG_PARSING_METADATA,this.onFragParsingMetadata,this),t.off(a.a.BUFFER_FLUSHING,this.onBufferFlushing,this)},e.onMediaAttached=function(t,e){this.media=e.media},e.onMediaDetaching=function(){this.id3Track&&(x(this.id3Track),this.id3Track=null,this.media=null)},e.getID3Track=function(t){if(this.media){for(var e=0;e<t.length;e++){var r=t[e];if("metadata"===r.kind&&"id3"===r.label)return w(r,this.media),r}return this.media.addTextTrack("metadata","id3")}},e.onFragParsingMetadata=function(t,e){if(this.media){var r=e.frag,i=e.samples;this.id3Track||(this.id3Track=this.getID3Track(this.media.textTracks),this.id3Track.mode="hidden");for(var n=self.WebKitDataCue||self.VTTCue||self.TextTrackCue,a=0;a<i.length;a++){var s=M.c(i[a].data);if(s){var o=i[a].pts,l=a<i.length-1?i[a+1].pts:r.end;l-o<=0&&(l=o+.25);for(var u=0;u<s.length;u++){var h=s[u];if(!M.e(h)){var d=new n(o,l,"");d.value=h,this.id3Track.addCue(d)}}}}}},e.onBufferFlushing=function(t,e){var r=e.startOffset,i=e.endOffset,n=e.type;if(!n||"audio"===n){var a=this.id3Track;a&&P(a,r,i)}},t}();function N(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var U,B=function(){function t(t){var e=this;this.hls=void 0,this.config=void 0,this.media=null,this.levelDetails=null,this.currentTime=0,this.stallCount=0,this._latency=null,this.timeupdateHandler=function(){return e.timeupdate()},this.hls=t,this.config=t.config,this.registerListeners()}var e,r,i,n=t.prototype;return n.destroy=function(){this.unregisterListeners(),this.onMediaDetaching(),this.levelDetails=null,this.hls=this.timeupdateHandler=null},n.registerListeners=function(){this.hls.on(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),this.hls.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),this.hls.on(a.a.MANIFEST_LOADING,this.onManifestLoading,this),this.hls.on(a.a.LEVEL_UPDATED,this.onLevelUpdated,this),this.hls.on(a.a.ERROR,this.onError,this)},n.unregisterListeners=function(){this.hls.off(a.a.MEDIA_ATTACHED,this.onMediaAttached),this.hls.off(a.a.MEDIA_DETACHING,this.onMediaDetaching),this.hls.off(a.a.MANIFEST_LOADING,this.onManifestLoading),this.hls.off(a.a.LEVEL_UPDATED,this.onLevelUpdated),this.hls.off(a.a.ERROR,this.onError)},n.onMediaAttached=function(t,e){this.media=e.media,this.media.addEventListener("timeupdate",this.timeupdateHandler)},n.onMediaDetaching=function(){this.media&&(this.media.removeEventListener("timeupdate",this.timeupdateHandler),this.media=null)},n.onManifestLoading=function(){this.levelDetails=null,this._latency=null,this.stallCount=0},n.onLevelUpdated=function(t,e){var r=e.details;this.levelDetails=r,r.advanced&&this.timeupdate(),!r.live&&this.media&&this.media.removeEventListener("timeupdate",this.timeupdateHandler)},n.onError=function(t,e){e.details===s.a.BUFFER_STALLED_ERROR&&(this.stallCount++,o.b.warn("[playback-rate-controller]: Stall detected, adjusting target latency"))},n.timeupdate=function(){var t=this.media,e=this.levelDetails;if(t&&e){this.currentTime=t.currentTime;var r=this.computeLatency();if(null!==r){this._latency=r;var i=this.config,n=i.lowLatencyMode,a=i.maxLiveSyncPlaybackRate;if(n&&1!==a){var s=this.targetLatency;if(null!==s){var o=r-s,l=o<Math.min(this.maxLatency,s+e.targetduration);if(e.live&&l&&o>.05&&this.forwardBufferLength>1){var u=Math.min(2,Math.max(1,a)),h=Math.round(2/(1+Math.exp(-.75*o-this.edgeStalled))*20)/20;t.playbackRate=Math.min(u,Math.max(1,h))}else 1!==t.playbackRate&&0!==t.playbackRate&&(t.playbackRate=1)}}}}},n.estimateLiveEdge=function(){var t=this.levelDetails;return null===t?null:t.edge+t.age},n.computeLatency=function(){var t=this.estimateLiveEdge();return null===t?null:t-this.currentTime},e=t,(r=[{key:"latency",get:function(){return this._latency||0}},{key:"maxLatency",get:function(){var t=this.config,e=this.levelDetails;return void 0!==t.liveMaxLatencyDuration?t.liveMaxLatencyDuration:e?t.liveMaxLatencyDurationCount*e.targetduration:0}},{key:"targetLatency",get:function(){var t=this.levelDetails;if(null===t)return null;var e=t.holdBack,r=t.partHoldBack,i=t.targetduration,n=this.config,a=n.liveSyncDuration,s=n.liveSyncDurationCount,o=n.lowLatencyMode,l=this.hls.userConfig,u=o&&r||e;(l.liveSyncDuration||l.liveSyncDurationCount||0===u)&&(u=void 0!==a?a:s*i);var h=i;return u+Math.min(1*this.stallCount,h)}},{key:"liveSyncPosition",get:function(){var t=this.estimateLiveEdge(),e=this.targetLatency,r=this.levelDetails;if(null===t||null===e||null===r)return null;var i=r.edge,n=t-e-this.edgeStalled,a=i-r.totalduration,s=i-(this.config.lowLatencyMode&&r.partTarget||r.targetduration);return Math.min(Math.max(a,n),s)}},{key:"drift",get:function(){var t=this.levelDetails;return null===t?1:t.drift}},{key:"edgeStalled",get:function(){var t=this.levelDetails;if(null===t)return 0;var e=3*(this.config.lowLatencyMode&&t.partTarget||t.targetduration);return Math.max(t.age-e,0)}},{key:"forwardBufferLength",get:function(){var t=this.media,e=this.levelDetails;if(!t||!e)return 0;var r=t.buffered.length;return r?t.buffered.end(r-1):e.edge-this.currentTime}}])&&N(e.prototype,r),i&&N(e,i),t}();function G(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}!function(t){t.No="",t.Yes="YES",t.v2="v2"}(U||(U={}));var K=function(){function t(t,e,r){this.msn=void 0,this.part=void 0,this.skip=void 0,this.msn=t,this.part=e,this.skip=r}return t.prototype.addDirectives=function(t){var e=new self.URL(t);return void 0!==this.msn&&e.searchParams.set("_HLS_msn",this.msn.toString()),void 0!==this.part&&e.searchParams.set("_HLS_part",this.part.toString()),this.skip&&e.searchParams.set("_HLS_skip",this.skip),e.toString()},t}(),j=function(){function t(t){this.attrs=void 0,this.audioCodec=void 0,this.bitrate=void 0,this.codecSet=void 0,this.height=void 0,this.id=void 0,this.name=void 0,this.videoCodec=void 0,this.width=void 0,this.unknownCodecs=void 0,this.audioGroupIds=void 0,this.details=void 0,this.fragmentError=0,this.loadError=0,this.loaded=void 0,this.realBitrate=0,this.textGroupIds=void 0,this.url=void 0,this._urlId=0,this.url=[t.url],this.attrs=t.attrs,this.bitrate=t.bitrate,t.details&&(this.details=t.details),this.id=t.id||0,this.name=t.name,this.width=t.width||0,this.height=t.height||0,this.audioCodec=t.audioCodec,this.videoCodec=t.videoCodec,this.unknownCodecs=t.unknownCodecs,this.codecSet=[t.videoCodec,t.audioCodec].filter((function(t){return t})).join(",").replace(/\.[^.,]+/g,"")}var e,r,i;return e=t,(r=[{key:"maxBitrate",get:function(){return Math.max(this.realBitrate,this.bitrate)}},{key:"uri",get:function(){return this.url[this._urlId]||""}},{key:"urlId",get:function(){return this._urlId},set:function(t){var e=t%this.url.length;this._urlId!==e&&(this.details=void 0,this._urlId=e)}}])&&G(e.prototype,r),i&&G(e,i),t}();function H(t,e,r){switch(e){case"audio":t.audioGroupIds||(t.audioGroupIds=[]),t.audioGroupIds.push(r);break;case"text":t.textGroupIds||(t.textGroupIds=[]),t.textGroupIds.push(r)}}function V(t){var e={};t.forEach((function(t){var r=t.groupId||"";t.id=e[r]=e[r]||0,e[r]++}))}function W(t,e){var r=e.startPTS;if(Object(n.a)(r)){var i,a=0;e.sn>t.sn?(a=r-t.start,i=t):(a=t.start-r,i=e),i.duration!==a&&(i.duration=a)}else if(e.sn>t.sn){t.cc===e.cc&&t.minEndPTS?e.start=t.start+(t.minEndPTS-t.start):e.start=t.start+t.duration}else e.start=Math.max(t.start-e.duration,0)}function Y(t,e,r,i,a,s){i-r<=0&&(o.b.warn("Fragment should have a positive duration",e),i=r+e.duration,s=a+e.duration);var l=r,u=i,h=e.startPTS,d=e.endPTS;if(Object(n.a)(h)){var c=Math.abs(h-r);Object(n.a)(e.deltaPTS)?e.deltaPTS=Math.max(c,e.deltaPTS):e.deltaPTS=c,l=Math.max(r,h),r=Math.min(r,h),a=Math.min(a,e.startDTS),u=Math.min(i,d),i=Math.max(i,d),s=Math.max(s,e.endDTS)}e.duration=i-r;var f=r-e.start;e.appendedPTS=i,e.start=e.startPTS=r,e.maxStartPTS=l,e.startDTS=a,e.endPTS=i,e.minEndPTS=u,e.endDTS=s;var g,v=e.sn;if(!t||v<t.startSN||v>t.endSN)return 0;var p=v-t.startSN,m=t.fragments;for(m[p]=e,g=p;g>0;g--)W(m[g],m[g-1]);for(g=p;g<m.length-1;g++)W(m[g],m[g+1]);return t.fragmentHint&&W(m[m.length-1],t.fragmentHint),t.PTSKnown=t.alignedSliding=!0,f}function q(t,e){for(var r=null,i=t.fragments,a=i.length-1;a>=0;a--){var s=i[a].initSegment;if(s){r=s;break}}t.fragmentHint&&delete t.fragmentHint.endPTS;var l,u=0;if(function(t,e,r){for(var i=e.skippedSegments,n=Math.max(t.startSN,e.startSN)-e.startSN,a=(t.fragmentHint?1:0)+(i?e.endSN:Math.min(t.endSN,e.endSN))-e.startSN,s=e.startSN-t.startSN,o=e.fragmentHint?e.fragments.concat(e.fragmentHint):e.fragments,l=t.fragmentHint?t.fragments.concat(t.fragmentHint):t.fragments,u=n;u<=a;u++){var h=l[s+u],d=o[u];i&&!d&&u<i&&(d=e.fragments[u]=h),h&&d&&r(h,d)}}(t,e,(function(t,i){var a;t.relurl&&(u=t.cc-i.cc),Object(n.a)(t.startPTS)&&Object(n.a)(t.endPTS)&&(i.start=i.startPTS=t.startPTS,i.startDTS=t.startDTS,i.appendedPTS=t.appendedPTS,i.maxStartPTS=t.maxStartPTS,i.endPTS=t.endPTS,i.endDTS=t.endDTS,i.minEndPTS=t.minEndPTS,i.duration=t.endPTS-t.startPTS,i.duration&&(l=i),e.PTSKnown=e.alignedSliding=!0),i.elementaryStreams=t.elementaryStreams,i.loader=t.loader,i.stats=t.stats,i.urlId=t.urlId,t.initSegment?(i.initSegment=t.initSegment,r=t.initSegment):i.initSegment&&i.initSegment.relurl!=(null===(a=r)||void 0===a?void 0:a.relurl)||(i.initSegment=r)})),e.skippedSegments&&(e.deltaUpdateFailed=e.fragments.some((function(t){return!t})),e.deltaUpdateFailed)){o.b.warn("[level-helper] Previous playlist missing segments skipped in delta playlist");for(var h=e.skippedSegments;h--;)e.fragments.shift();e.startSN=e.fragments[0].sn,e.startCC=e.fragments[0].cc}var d=e.fragments;if(u){o.b.warn("discontinuity sliding from playlist, take drift into account");for(var c=0;c<d.length;c++)d[c].cc+=u}e.skippedSegments&&(e.startCC=e.fragments[0].cc),function(t,e,r){if(t&&e)for(var i=0,n=0,a=t.length;n<=a;n++){var s=t[n],o=e[n+i];s&&o&&s.index===o.index&&s.fragment.sn===o.fragment.sn?r(s,o):i--}}(t.partList,e.partList,(function(t,e){e.elementaryStreams=t.elementaryStreams,e.stats=t.stats})),l?Y(e,l,l.startPTS,l.endPTS,l.startDTS,l.endDTS):X(t,e),d.length&&(e.totalduration=e.edge-d[0].start),e.driftStartTime=t.driftStartTime,e.driftStart=t.driftStart;var f=e.advancedDateTime;if(e.advanced&&f){var g=e.edge;e.driftStart||(e.driftStartTime=f,e.driftStart=g),e.driftEndTime=f,e.driftEnd=g}else e.driftEndTime=t.driftEndTime,e.driftEnd=t.driftEnd,e.advancedDateTime=t.advancedDateTime}function X(t,e){var r=e.startSN+e.skippedSegments-t.startSN,i=t.fragments;r<0||r>=i.length||z(e,i[r].start)}function z(t,e){if(e){for(var r=t.fragments,i=t.skippedSegments;i<r.length;i++)r[i].start+=e;t.fragmentHint&&(t.fragmentHint.start+=e)}}var Q=function(){function t(t,e){this.hls=void 0,this.timer=-1,this.canLoad=!1,this.retryCount=0,this.log=void 0,this.warn=void 0,this.log=o.b.log.bind(o.b,e+":"),this.warn=o.b.warn.bind(o.b,e+":"),this.hls=t}var e=t.prototype;return e.destroy=function(){this.clearTimer(),this.hls=this.log=this.warn=null},e.onError=function(t,e){e.fatal&&e.type===s.b.NETWORK_ERROR&&this.clearTimer()},e.clearTimer=function(){clearTimeout(this.timer),this.timer=-1},e.startLoad=function(){this.canLoad=!0,this.retryCount=0,this.loadPlaylist()},e.stopLoad=function(){this.canLoad=!1,this.clearTimer()},e.switchParams=function(t,e){var r=null==e?void 0:e.renditionReports;if(r)for(var i=0;i<r.length;i++){var a=r[i],s=""+a.URI;if(s===t.substr(-s.length)){var o=parseInt(a["LAST-MSN"]),l=parseInt(a["LAST-PART"]);if(e&&this.hls.config.lowLatencyMode){var u=Math.min(e.age-e.partTarget,e.targetduration);void 0!==l&&u>e.partTarget&&(l+=1)}if(Object(n.a)(o))return new K(o,Object(n.a)(l)?l:void 0,U.No)}}},e.loadPlaylist=function(t){},e.shouldLoadTrack=function(t){return this.canLoad&&t&&!!t.url&&(!t.details||t.details.live)},e.playlistLoaded=function(t,e,r){var i=this,n=e.details,a=e.stats,s=a.loading.end?Math.max(0,self.performance.now()-a.loading.end):0;if(n.advancedDateTime=Date.now()-s,n.live||null!=r&&r.live){if(n.reloaded(r),r&&this.log("live playlist "+t+" "+(n.advanced?"REFRESHED "+n.lastPartSn+"-"+n.lastPartIndex:"MISSED")),r&&n.fragments.length>0&&q(r,n),!this.canLoad||!n.live)return;var o,l=void 0,u=void 0;if(n.canBlockReload&&n.endSN&&n.advanced){var h=this.hls.config.lowLatencyMode,d=n.lastPartSn,c=n.endSN,f=n.lastPartIndex,g=d===c;-1!==f?(l=g?c+1:d,u=g?h?0:f:f+1):l=c+1;var v=n.age,p=v+n.ageHeader,m=Math.min(p-n.partTarget,1.5*n.targetduration);if(m>0){if(r&&m>r.tuneInGoal)this.warn("CDN Tune-in goal increased from: "+r.tuneInGoal+" to: "+m+" with playlist age: "+n.age),m=0;else{var y=Math.floor(m/n.targetduration);if(l+=y,void 0!==u)u+=Math.round(m%n.targetduration/n.partTarget);this.log("CDN Tune-in age: "+n.ageHeader+"s last advanced "+v.toFixed(2)+"s goal: "+m+" skip sn "+y+" to part "+u)}n.tuneInGoal=m}if(o=this.getDeliveryDirectives(n,e.deliveryDirectives,l,u),h||!g)return void this.loadPlaylist(o)}else o=this.getDeliveryDirectives(n,e.deliveryDirectives,l,u);var T=function(t,e){var r,i=1e3*t.levelTargetDuration,n=i/2,a=t.age,s=a>0&&a<3*i,o=e.loading.end-e.loading.start,l=t.availabilityDelay;if(!1===t.updated)if(s){var u=333*t.misses;r=Math.max(Math.min(n,2*o),u),t.availabilityDelay=(t.availabilityDelay||0)+r}else r=n;else s?(l=Math.min(l||i/2,a),t.availabilityDelay=l,r=l+i-a):r=i-o;return Math.round(r)}(n,a);void 0!==l&&n.canBlockReload&&(T-=n.partTarget||1),this.log("reload live playlist "+t+" in "+Math.round(T)+" ms"),this.timer=self.setTimeout((function(){return i.loadPlaylist(o)}),T)}else this.clearTimer()},e.getDeliveryDirectives=function(t,e,r,i){var n=function(t,e){var r=t.canSkipUntil,i=t.canSkipDateRanges,n=t.endSN;return r&&(void 0!==e?e-n:0)<r?i?U.v2:U.Yes:U.No}(t,r);return null!=e&&e.skip&&t.deltaUpdateFailed&&(r=e.msn,i=e.part,n=U.No),new K(r,i,n)},e.retryLoadingOrFail=function(t){var e,r=this,i=this.hls.config,n=this.retryCount<i.levelLoadingMaxRetry;if(n)if(this.retryCount++,t.details.indexOf("LoadTimeOut")>-1&&null!==(e=t.context)&&void 0!==e&&e.deliveryDirectives)this.warn("retry playlist loading #"+this.retryCount+' after "'+t.details+'"'),this.loadPlaylist();else{var a=Math.min(Math.pow(2,this.retryCount)*i.levelLoadingRetryDelay,i.levelLoadingMaxRetryTimeout);this.timer=self.setTimeout((function(){return r.loadPlaylist()}),a),this.warn("retry playlist loading #"+this.retryCount+" in "+a+' ms after "'+t.details+'"')}else this.warn('cannot recover from error "'+t.details+'"'),this.clearTimer(),t.fatal=!0;return n},t}();function $(){return($=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t}).apply(this,arguments)}function J(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function Z(t,e){return(Z=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var tt,et=/chrome|firefox/.test(navigator.userAgent.toLowerCase()),rt=function(t){var e,r;function i(e){var r;return(r=t.call(this,e,"[level-controller]")||this)._levels=[],r._firstLevel=-1,r._startLevel=void 0,r.currentLevelIndex=-1,r.manualLevelIndex=-1,r.onParsedComplete=void 0,r._registerListeners(),r}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,Z(e,r);var n,o,l,u=i.prototype;return u._registerListeners=function(){var t=this.hls;t.on(a.a.MANIFEST_LOADED,this.onManifestLoaded,this),t.on(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.on(a.a.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),t.on(a.a.FRAG_LOADED,this.onFragLoaded,this),t.on(a.a.ERROR,this.onError,this)},u._unregisterListeners=function(){var t=this.hls;t.off(a.a.MANIFEST_LOADED,this.onManifestLoaded,this),t.off(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.off(a.a.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),t.off(a.a.FRAG_LOADED,this.onFragLoaded,this),t.off(a.a.ERROR,this.onError,this)},u.destroy=function(){this._unregisterListeners(),this.manualLevelIndex=-1,this._levels.length=0,t.prototype.destroy.call(this)},u.startLoad=function(){this._levels.forEach((function(t){t.loadError=0})),t.prototype.startLoad.call(this)},u.onManifestLoaded=function(t,e){var r,i,n=[],o=[],l=[],u={},h=!1,d=!1,c=!1;if(e.levels.forEach((function(t){var e=t.attrs;h=h||!(!t.width||!t.height),d=d||!!t.videoCodec,c=c||!!t.audioCodec,et&&t.audioCodec&&-1!==t.audioCodec.indexOf("mp4a.40.34")&&(t.audioCodec=void 0);var r=t.bitrate+"-"+t.attrs.RESOLUTION+"-"+t.attrs.CODECS;(i=u[r])?i.url.push(t.url):(i=new j(t),u[r]=i,n.push(i)),e&&(e.AUDIO&&H(i,"audio",e.AUDIO),e.SUBTITLES&&H(i,"text",e.SUBTITLES))})),(h||d)&&c&&(n=n.filter((function(t){var e=t.videoCodec,r=t.width,i=t.height;return!!e||!(!r||!i)}))),n=n.filter((function(t){var e=t.audioCodec,r=t.videoCodec;return(!e||m(e,"audio"))&&(!r||m(r,"video"))})),e.audioTracks&&V(o=e.audioTracks.filter((function(t){return!t.audioCodec||m(t.audioCodec,"audio")}))),e.subtitles&&V(l=e.subtitles),n.length>0){r=n[0].bitrate,n.sort((function(t,e){return t.bitrate-e.bitrate})),this._levels=n;for(var f=0;f<n.length;f++)if(n[f].bitrate===r){this._firstLevel=f,this.log("manifest loaded, "+n.length+" level(s) found, first bitrate: "+r);break}var g=c&&!d,v={levels:n,audioTracks:o,subtitleTracks:l,firstLevel:this._firstLevel,stats:e.stats,audio:c,video:d,altAudio:!g&&o.some((function(t){return!!t.url}))};this.hls.trigger(a.a.MANIFEST_PARSED,v),(this.hls.config.autoStartLoad||this.hls.forceStartLoad)&&this.hls.startLoad(this.hls.config.startPosition)}else this.hls.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.MANIFEST_INCOMPATIBLE_CODECS_ERROR,fatal:!0,url:e.url,reason:"no level with compatible codecs found in manifest"})},u.onError=function(e,r){if(t.prototype.onError.call(this,e,r),!r.fatal){var i=r.context,n=this._levels[this.currentLevelIndex];if(i&&(i.type===k.a.AUDIO_TRACK&&n.audioGroupIds&&i.groupId===n.audioGroupIds[n.urlId]||i.type===k.a.SUBTITLE_TRACK&&n.textGroupIds&&i.groupId===n.textGroupIds[n.urlId]))this.redundantFailover(this.currentLevelIndex);else{var a,o=!1,l=!0;switch(r.details){case s.a.FRAG_LOAD_ERROR:case s.a.FRAG_LOAD_TIMEOUT:case s.a.KEY_LOAD_ERROR:case s.a.KEY_LOAD_TIMEOUT:if(r.frag){var u=this._levels[r.frag.level];u?(u.fragmentError++,u.fragmentError>this.hls.config.fragLoadingMaxRetry&&(a=r.frag.level)):a=r.frag.level}break;case s.a.LEVEL_LOAD_ERROR:case s.a.LEVEL_LOAD_TIMEOUT:i&&(i.deliveryDirectives&&(l=!1),a=i.level),o=!0;break;case s.a.REMUX_ALLOC_ERROR:a=r.level,o=!0}void 0!==a&&this.recoverLevel(r,a,o,l)}}},u.recoverLevel=function(t,e,r,i){var n=t.details,a=this._levels[e];if(a.loadError++,r){if(!this.retryLoadingOrFail(t))return void(this.currentLevelIndex=-1);t.levelRetry=!0}if(i){var s=a.url.length;if(s>1&&a.loadError<s)t.levelRetry=!0,this.redundantFailover(e);else if(-1===this.manualLevelIndex){var o=0===e?this._levels.length-1:e-1;this.currentLevelIndex!==o&&0===this._levels[o].loadError&&(this.warn(n+": switch to "+o),t.levelRetry=!0,this.hls.nextAutoLevel=o)}}},u.redundantFailover=function(t){var e=this._levels[t],r=e.url.length;if(r>1){var i=(e.urlId+1)%r;this.warn("Switching to redundant URL-id "+i),this._levels.forEach((function(t){t.urlId=i})),this.level=t}},u.onFragLoaded=function(t,e){var r=e.frag;if(void 0!==r&&r.type===k.b.MAIN){var i=this._levels[r.level];void 0!==i&&(i.fragmentError=0,i.loadError=0)}},u.onLevelLoaded=function(t,e){var r,i,n=e.level,a=e.details,s=this._levels[n];if(!s)return this.warn("Invalid level index "+n),void(null!==(i=e.deliveryDirectives)&&void 0!==i&&i.skip&&(a.deltaUpdateFailed=!0));n===this.currentLevelIndex?(0===s.fragmentError&&(s.loadError=0,this.retryCount=0),this.playlistLoaded(n,e,s.details)):null!==(r=e.deliveryDirectives)&&void 0!==r&&r.skip&&(a.deltaUpdateFailed=!0)},u.onAudioTrackSwitched=function(t,e){var r=this.hls.levels[this.currentLevelIndex];if(r&&r.audioGroupIds){for(var i=-1,n=this.hls.audioTracks[e.id].groupId,a=0;a<r.audioGroupIds.length;a++)if(r.audioGroupIds[a]===n){i=a;break}i!==r.urlId&&(r.urlId=i,this.startLoad())}},u.loadPlaylist=function(t){var e=this.currentLevelIndex,r=this._levels[e];if(this.canLoad&&r&&r.url.length>0){var i=r.urlId,n=r.url[i];if(t)try{n=t.addDirectives(n)}catch(t){this.warn("Could not construct new URL with HLS Delivery Directives: "+t)}this.log("Attempt loading level index "+e+(t?" at sn "+t.msn+" part "+t.part:"")+" with URL-id "+i+" "+n),this.clearTimer(),this.hls.trigger(a.a.LEVEL_LOADING,{url:n,level:e,id:i,deliveryDirectives:t||null})}},u.removeLevel=function(t,e){var r=function(t,r){return r!==e},i=this._levels.filter((function(i,n){return n!==t||i.url.length>1&&void 0!==e&&(i.url=i.url.filter(r),i.audioGroupIds&&(i.audioGroupIds=i.audioGroupIds.filter(r)),i.textGroupIds&&(i.textGroupIds=i.textGroupIds.filter(r)),i.urlId=0,!0)})).map((function(t,e){var r=t.details;return null!=r&&r.fragments&&r.fragments.forEach((function(t){t.level=e})),t}));this._levels=i,this.hls.trigger(a.a.LEVELS_UPDATED,{levels:i})},n=i,(o=[{key:"levels",get:function(){return 0===this._levels.length?null:this._levels}},{key:"level",get:function(){return this.currentLevelIndex},set:function(t){var e,r=this._levels;if(0!==r.length&&(this.currentLevelIndex!==t||null===(e=r[t])||void 0===e||!e.details)){if(t<0||t>=r.length){var i=t<0;if(this.hls.trigger(a.a.ERROR,{type:s.b.OTHER_ERROR,details:s.a.LEVEL_SWITCH_ERROR,level:t,fatal:i,reason:"invalid level idx"}),i)return;t=Math.min(t,r.length-1)}this.clearTimer();var n=this.currentLevelIndex,o=r[n],l=r[t];this.log("switching to level "+t+" from "+n),this.currentLevelIndex=t;var u=$({},l,{level:t,maxBitrate:l.maxBitrate,uri:l.uri,urlId:l.urlId});delete u._urlId,this.hls.trigger(a.a.LEVEL_SWITCHING,u);var h=l.details;if(!h||h.live){var d=this.switchParams(l.uri,null==o?void 0:o.details);this.loadPlaylist(d)}}}},{key:"manualLevel",get:function(){return this.manualLevelIndex},set:function(t){this.manualLevelIndex=t,void 0===this._startLevel&&(this._startLevel=t),-1!==t&&(this.level=t)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(t){this._firstLevel=t}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var t=this.hls.config.startLevel;return void 0!==t?t:this._firstLevel}return this._startLevel},set:function(t){this._startLevel=t}},{key:"nextLoadLevel",get:function(){return-1!==this.manualLevelIndex?this.manualLevelIndex:this.hls.nextAutoLevel},set:function(t){this.level=t,-1===this.manualLevelIndex&&(this.hls.nextAutoLevel=t)}}])&&J(n.prototype,o),l&&J(n,l),i}(Q);!function(t){t.NOT_LOADED="NOT_LOADED",t.BACKTRACKED="BACKTRACKED",t.APPENDING="APPENDING",t.PARTIAL="PARTIAL",t.OK="OK"}(tt||(tt={}));var it=function(){function t(t){this.activeFragment=null,this.activeParts=null,this.fragments=Object.create(null),this.timeRanges=Object.create(null),this.bufferPadding=.2,this.hls=void 0,this.hls=t,this._registerListeners()}var e=t.prototype;return e._registerListeners=function(){var t=this.hls;t.on(a.a.BUFFER_APPENDED,this.onBufferAppended,this),t.on(a.a.FRAG_BUFFERED,this.onFragBuffered,this),t.on(a.a.FRAG_LOADED,this.onFragLoaded,this)},e._unregisterListeners=function(){var t=this.hls;t.off(a.a.BUFFER_APPENDED,this.onBufferAppended,this),t.off(a.a.FRAG_BUFFERED,this.onFragBuffered,this),t.off(a.a.FRAG_LOADED,this.onFragLoaded,this)},e.destroy=function(){this._unregisterListeners(),this.fragments=this.timeRanges=null},e.getAppendedFrag=function(t,e){if(e===k.b.MAIN){var r=this.activeFragment,i=this.activeParts;if(!r)return null;if(i)for(var n=i.length;n--;){var a=i[n],s=a?a.end:r.appendedPTS;if(a.start<=t&&void 0!==s&&t<=s)return n>9&&(this.activeParts=i.slice(n-9)),a}else if(r.start<=t&&void 0!==r.appendedPTS&&t<=r.appendedPTS)return r}return this.getBufferedFrag(t,e)},e.getBufferedFrag=function(t,e){for(var r=this.fragments,i=Object.keys(r),n=i.length;n--;){var a=r[i[n]];if((null==a?void 0:a.body.type)===e&&a.buffered){var s=a.body;if(s.start<=t&&t<=s.end)return s}}return null},e.detectEvictedFragments=function(t,e,r){var i=this;Object.keys(this.fragments).forEach((function(n){var a=i.fragments[n];if(a)if(a.buffered){var s=a.range[t];s&&s.time.some((function(t){var r=!i.isTimeBuffered(t.startPTS,t.endPTS,e);return r&&i.removeFragment(a.body),r}))}else a.body.type===r&&i.removeFragment(a.body)}))},e.detectPartialFragments=function(t){var e=this,r=this.timeRanges,i=t.frag,n=t.part;if(r&&"initSegment"!==i.sn){var a=at(i),s=this.fragments[a];s&&(Object.keys(r).forEach((function(t){var a=i.elementaryStreams[t];if(a){var o=r[t],l=null!==n||!0===a.partial;s.range[t]=e.getBufferedTimes(i,n,l,o)}})),s.backtrack=s.loaded=null,Object.keys(s.range).length?s.buffered=!0:this.removeFragment(s.body))}},e.fragBuffered=function(t){var e=at(t),r=this.fragments[e];r&&(r.backtrack=r.loaded=null,r.buffered=!0)},e.getBufferedTimes=function(t,e,r,i){for(var n={time:[],partial:r},a=e?e.start:t.start,s=e?e.end:t.end,o=t.minEndPTS||s,l=t.maxStartPTS||a,u=0;u<i.length;u++){var h=i.start(u)-this.bufferPadding,d=i.end(u)+this.bufferPadding;if(l>=h&&o<=d){n.time.push({startPTS:Math.max(a,i.start(u)),endPTS:Math.min(s,i.end(u))});break}if(a<d&&s>h)n.partial=!0,n.time.push({startPTS:Math.max(a,i.start(u)),endPTS:Math.min(s,i.end(u))});else if(s<=h)break}return n},e.getPartialFragment=function(t){var e,r,i,n=null,a=0,s=this.bufferPadding,o=this.fragments;return Object.keys(o).forEach((function(l){var u=o[l];u&&nt(u)&&(r=u.body.start-s,i=u.body.end+s,t>=r&&t<=i&&(e=Math.min(t-r,i-t),a<=e&&(n=u.body,a=e)))})),n},e.getState=function(t){var e=at(t),r=this.fragments[e];return r?r.buffered?nt(r)?tt.PARTIAL:tt.OK:r.backtrack?tt.BACKTRACKED:tt.APPENDING:tt.NOT_LOADED},e.backtrack=function(t,e){var r=at(t),i=this.fragments[r];if(!i||i.backtrack)return null;var n=i.backtrack=e||i.loaded;return i.loaded=null,n},e.getBacktrackData=function(t){var e=at(t),r=this.fragments[e];if(r){var i,n=r.backtrack;if(null!=n&&null!==(i=n.payload)&&void 0!==i&&i.byteLength)return n;this.removeFragment(t)}return null},e.isTimeBuffered=function(t,e,r){for(var i,n,a=0;a<r.length;a++){if(i=r.start(a)-this.bufferPadding,n=r.end(a)+this.bufferPadding,t>=i&&e<=n)return!0;if(e<=i)return!1}return!1},e.onFragLoaded=function(t,e){var r=e.frag,i=e.part;if("initSegment"!==r.sn&&!r.bitrateTest&&!i){var n=at(r);this.fragments[n]={body:r,loaded:e,backtrack:null,buffered:!1,range:Object.create(null)}}},e.onBufferAppended=function(t,e){var r=this,i=e.frag,n=e.part,a=e.timeRanges;if(i.type===k.b.MAIN)if(this.activeFragment=i,n){var s=this.activeParts;s||(this.activeParts=s=[]),s.push(n)}else this.activeParts=null;this.timeRanges=a,Object.keys(a).forEach((function(t){var e=a[t];if(r.detectEvictedFragments(t,e),!n)for(var s=0;s<e.length;s++)i.appendedPTS=Math.max(e.end(s),i.appendedPTS||0)}))},e.onFragBuffered=function(t,e){this.detectPartialFragments(e)},e.hasFragment=function(t){var e=at(t);return!!this.fragments[e]},e.removeFragmentsInRange=function(t,e,r){var i=this;Object.keys(this.fragments).forEach((function(n){var a=i.fragments[n];if(a&&a.buffered){var s=a.body;s.type===r&&s.start<e&&s.end>t&&i.removeFragment(s)}}))},e.removeFragment=function(t){var e=at(t);t.stats.loaded=0,t.clearElementaryStreamInfo(),delete this.fragments[e]},e.removeAllFragments=function(){this.fragments=Object.create(null),this.activeFragment=null,this.activeParts=null},t}();function nt(t){var e,r;return t.buffered&&((null===(e=t.range.video)||void 0===e?void 0:e.partial)||(null===(r=t.range.audio)||void 0===r?void 0:r.partial))}function at(t){return t.type+"_"+t.level+"_"+t.urlId+"_"+t.sn}var st=function(){function t(){this._boundTick=void 0,this._tickTimer=null,this._tickInterval=null,this._tickCallCount=0,this._boundTick=this.tick.bind(this)}var e=t.prototype;return e.destroy=function(){this.onHandlerDestroying(),this.onHandlerDestroyed()},e.onHandlerDestroying=function(){this.clearNextTick(),this.clearInterval()},e.onHandlerDestroyed=function(){},e.hasInterval=function(){return!!this._tickInterval},e.hasNextTick=function(){return!!this._tickTimer},e.setInterval=function(t){return!this._tickInterval&&(this._tickInterval=self.setInterval(this._boundTick,t),!0)},e.clearInterval=function(){return!!this._tickInterval&&(self.clearInterval(this._tickInterval),this._tickInterval=null,!0)},e.clearNextTick=function(){return!!this._tickTimer&&(self.clearTimeout(this._tickTimer),this._tickTimer=null,!0)},e.tick=function(){this._tickCallCount++,1===this._tickCallCount&&(this.doTick(),this._tickCallCount>1&&this.tickImmediate(),this._tickCallCount=0)},e.tickImmediate=function(){this.clearNextTick(),this._tickTimer=self.setTimeout(this._boundTick,0)},e.doTick=function(){},t}(),ot={length:0,start:function(){return 0},end:function(){return 0}},lt=function(){function t(){}return t.isBuffered=function(e,r){try{if(e)for(var i=t.getBuffered(e),n=0;n<i.length;n++)if(r>=i.start(n)&&r<=i.end(n))return!0}catch(t){}return!1},t.bufferInfo=function(e,r,i){try{if(e){var n,a=t.getBuffered(e),s=[];for(n=0;n<a.length;n++)s.push({start:a.start(n),end:a.end(n)});return this.bufferedInfo(s,r,i)}}catch(t){}return{len:0,start:r,end:r,nextStart:void 0}},t.bufferedInfo=function(t,e,r){e=Math.max(0,e),t.sort((function(t,e){var r=t.start-e.start;return r||e.end-t.end}));var i=[];if(r)for(var n=0;n<t.length;n++){var a=i.length;if(a){var s=i[a-1].end;t[n].start-s<r?t[n].end>s&&(i[a-1].end=t[n].end):i.push(t[n])}else i.push(t[n])}else i=t;for(var o,l=0,u=e,h=e,d=0;d<i.length;d++){var c=i[d].start,f=i[d].end;if(e+r>=c&&e<f)u=c,l=(h=f)-e;else if(e+r<c){o=c;break}}return{len:l,start:u||0,end:h||0,nextStart:o}},t.getBuffered=function(t){try{return t.buffered}catch(t){return o.b.log("failed to get media.buffered",t),ot}},t}(),ut=function(t,e,r,i,n,a){void 0===i&&(i=0),void 0===n&&(n=-1),void 0===a&&(a=!1),this.level=void 0,this.sn=void 0,this.part=void 0,this.id=void 0,this.size=void 0,this.partial=void 0,this.transmuxing={start:0,executeStart:0,executeEnd:0,end:0},this.buffering={audio:{start:0,executeStart:0,executeEnd:0,end:0},video:{start:0,executeStart:0,executeEnd:0,end:0},audiovideo:{start:0,executeStart:0,executeEnd:0,end:0}},this.level=t,this.sn=e,this.id=r,this.size=i,this.part=n,this.partial=a};function ht(t,e){if(t){var r=t.start+e;t.start=t.startPTS=r,t.endPTS=r+t.duration}}function dt(t,e){for(var r=e.fragments,i=0,n=r.length;i<n;i++)ht(r[i],t);e.fragmentHint&&ht(e.fragmentHint,t),e.alignedSliding=!0}function ct(t,e,r){e&&(!function(t,e,r){if(function(t,e,r){return!(!e.details||!(r.endCC>r.startCC||t&&t.cc<r.startCC))}(t,r,e)){var i=function(t,e){var r=t.fragments,i=e.fragments;if(i.length&&r.length){var n=function(t,e){for(var r=null,i=0,n=t.length;i<n;i++){var a=t[i];if(a&&a.cc===e){r=a;break}}return r}(r,i[0].cc);if(n&&(!n||n.startPTS))return n;o.b.log("No frag in previous level to align on")}else o.b.log("No fragments to align")}(r.details,e);i&&Object(n.a)(i.start)&&(o.b.log("Adjusting PTS using last level due to CC increase within current level "+e.url),dt(i.start,e))}}(t,r,e),!r.alignedSliding&&e.details&&function(t,e){if(!e.fragments.length||!t.hasProgramDateTime||!e.hasProgramDateTime)return;var r=e.fragments[0].programDateTime,i=t.fragments[0].programDateTime,a=(i-r)/1e3+e.fragments[0].start;a&&Object(n.a)(a)&&(o.b.log("Adjusting PTS using programDateTime delta "+(i-r)+"ms, sliding:"+a.toFixed(3)+" "+t.url+" "),dt(a,t))}(r,e.details),r.alignedSliding||!e.details||r.skippedSegments||X(e.details,r))}function ft(t,e){var r=t.programDateTime;if(r){var i=(r-e)/1e3;t.start=t.startPTS=i,t.endPTS=i+t.duration}}function gt(t,e){if(e.fragments.length&&t.hasProgramDateTime&&e.hasProgramDateTime){var r=e.fragments[0].programDateTime-1e3*e.fragments[0].start;t.fragments.forEach((function(t){ft(t,r)})),t.fragmentHint&&ft(t.fragmentHint,r),t.alignedSliding=!0}}var vt={search:function(t,e){for(var r=0,i=t.length-1,n=null,a=null;r<=i;){var s=e(a=t[n=(r+i)/2|0]);if(s>0)r=n+1;else{if(!(s<0))return a;i=n-1}}return null}};function pt(t,e,r){if(null===e||!Array.isArray(t)||!t.length||!Object(n.a)(e))return null;if(e<(t[0].programDateTime||0))return null;if(e>=(t[t.length-1].endProgramDateTime||0))return null;r=r||0;for(var i=0;i<t.length;++i){var a=t[i];if(Tt(e,r,a))return a}return null}function mt(t,e,r,i){void 0===r&&(r=0),void 0===i&&(i=0);var n=null;if(t?n=e[t.sn-e[0].sn+1]||null:0===r&&0===e[0].start&&(n=e[0]),n&&0===yt(r,i,n))return n;var a=vt.search(e,yt.bind(null,r,i));return a||n}function yt(t,e,r){void 0===t&&(t=0),void 0===e&&(e=0);var i=Math.min(e,r.duration+(r.deltaPTS?r.deltaPTS:0));return r.start+r.duration-i<=t?1:r.start-i>t&&r.start?-1:0}function Tt(t,e,r){var i=1e3*Math.min(e,r.duration+(r.deltaPTS?r.deltaPTS:0));return(r.endProgramDateTime||0)-i>t}function bt(t){var e="function"==typeof Map?new Map:void 0;return(bt=function(t){if(null===t||(r=t,-1===Function.toString.call(r).indexOf("[native code]")))return t;var r;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,i)}function i(){return Et(t,arguments,At(this).constructor)}return i.prototype=Object.create(t.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),Lt(i,t)})(t)}function Et(t,e,r){return(Et=St()?Reflect.construct:function(t,e,r){var i=[null];i.push.apply(i,e);var n=new(Function.bind.apply(t,i));return r&&Lt(n,r.prototype),n}).apply(null,arguments)}function St(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function Lt(t,e){return(Lt=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function At(t){return(At=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}var Rt=Math.pow(2,17),Dt=function(){function t(t){this.config=void 0,this.loader=null,this.partLoadTimeout=-1,this.config=t}var e=t.prototype;return e.destroy=function(){this.loader&&(this.loader.destroy(),this.loader=null)},e.abort=function(){this.loader&&this.loader.abort()},e.load=function(t,e){var r=this,i=t.url;if(!i)return Promise.reject(new _t({type:s.b.NETWORK_ERROR,details:s.a.FRAG_LOAD_ERROR,fatal:!1,frag:t,networkDetails:null},"Fragment does not have a "+(i?"part list":"url")));this.abort();var n=this.config,a=n.fLoader,o=n.loader;return new Promise((function(i,l){r.loader&&r.loader.destroy();var u=r.loader=t.loader=a?new a(n):new o(n),h=kt(t),d={timeout:n.fragLoadingTimeOut,maxRetry:0,retryDelay:0,maxRetryDelay:n.fragLoadingMaxRetryTimeout,highWaterMark:Rt};t.stats=u.stats,u.load(h,d,{onSuccess:function(e,n,a,s){r.resetLoader(t,u),i({frag:t,part:null,payload:e.data,networkDetails:s})},onError:function(e,i,n){r.resetLoader(t,u),l(new _t({type:s.b.NETWORK_ERROR,details:s.a.FRAG_LOAD_ERROR,fatal:!1,frag:t,response:e,networkDetails:n}))},onAbort:function(e,i,n){r.resetLoader(t,u),l(new _t({type:s.b.NETWORK_ERROR,details:s.a.INTERNAL_ABORTED,fatal:!1,frag:t,networkDetails:n}))},onTimeout:function(e,i,n){r.resetLoader(t,u),l(new _t({type:s.b.NETWORK_ERROR,details:s.a.FRAG_LOAD_TIMEOUT,fatal:!1,frag:t,networkDetails:n}))},onProgress:function(r,i,n,a){e&&e({frag:t,part:null,payload:n,networkDetails:a})}})}))},e.loadPart=function(t,e,r){var i=this;this.abort();var n=this.config,a=n.fLoader,o=n.loader;return new Promise((function(l,u){i.loader&&i.loader.destroy();var h=i.loader=t.loader=a?new a(n):new o(n),d=kt(t,e),c={timeout:n.fragLoadingTimeOut,maxRetry:0,retryDelay:0,maxRetryDelay:n.fragLoadingMaxRetryTimeout,highWaterMark:Rt};e.stats=h.stats,h.load(d,c,{onSuccess:function(n,a,s,o){i.resetLoader(t,h),i.updateStatsFromPart(t,e);var u={frag:t,part:e,payload:n.data,networkDetails:o};r(u),l(u)},onError:function(r,n,a){i.resetLoader(t,h),u(new _t({type:s.b.NETWORK_ERROR,details:s.a.FRAG_LOAD_ERROR,fatal:!1,frag:t,part:e,response:r,networkDetails:a}))},onAbort:function(r,n,a){t.stats.aborted=e.stats.aborted,i.resetLoader(t,h),u(new _t({type:s.b.NETWORK_ERROR,details:s.a.INTERNAL_ABORTED,fatal:!1,frag:t,part:e,networkDetails:a}))},onTimeout:function(r,n,a){i.resetLoader(t,h),u(new _t({type:s.b.NETWORK_ERROR,details:s.a.FRAG_LOAD_TIMEOUT,fatal:!1,frag:t,part:e,networkDetails:a}))}})}))},e.updateStatsFromPart=function(t,e){var r=t.stats,i=e.stats,n=i.total;if(r.loaded+=i.loaded,n){var a=Math.round(t.duration/e.duration),s=Math.min(Math.round(r.loaded/n),a),o=(a-s)*Math.round(r.loaded/s);r.total=r.loaded+o}else r.total=Math.max(r.loaded,r.total);var l=r.loading,u=i.loading;l.start?l.first+=u.first-u.start:(l.start=u.start,l.first=u.first),l.end=u.end},e.resetLoader=function(t,e){t.loader=null,this.loader===e&&(self.clearTimeout(this.partLoadTimeout),this.loader=null),e.destroy()},t}();function kt(t,e){void 0===e&&(e=null);var r=e||t,i={frag:t,part:e,responseType:"arraybuffer",url:r.url,headers:{},rangeStart:0,rangeEnd:0},a=r.byteRangeStartOffset,s=r.byteRangeEndOffset;return Object(n.a)(a)&&Object(n.a)(s)&&(i.rangeStart=a,i.rangeEnd=s),i}var _t=function(t){var e,r;function i(e){for(var r,i=arguments.length,n=new Array(i>1?i-1:0),a=1;a<i;a++)n[a-1]=arguments[a];return(r=t.call.apply(t,[this].concat(n))||this).data=void 0,r.data=e,r}return r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,Lt(e,r),i}(bt(Error)),It=r(15),Ct={toString:function(t){for(var e="",r=t.length,i=0;i<r;i++)e+="["+t.start(i).toFixed(3)+","+t.end(i).toFixed(3)+"]";return e}};function wt(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function Ot(t,e){return(Ot=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var xt="STOPPED",Pt="IDLE",Mt="KEY_LOADING",Ft="FRAG_LOADING",Nt="FRAG_LOADING_WAITING_RETRY",Ut="WAITING_TRACK",Bt="PARSING",Gt="PARSED",Kt="BACKTRACKING",jt="ENDED",Ht="ERROR",Vt="WAITING_INIT_PTS",Wt="WAITING_LEVEL",Yt=function(t){var e,r;function i(e,r,i){var n;return(n=t.call(this)||this).hls=void 0,n.fragPrevious=null,n.fragCurrent=null,n.fragmentTracker=void 0,n.transmuxer=null,n._state=xt,n.media=void 0,n.mediaBuffer=void 0,n.config=void 0,n.bitrateTest=!1,n.lastCurrentTime=0,n.nextLoadPosition=0,n.startPosition=0,n.loadedmetadata=!1,n.fragLoadError=0,n.retryDate=0,n.levels=null,n.fragmentLoader=void 0,n.levelLastLoaded=null,n.startFragRequested=!1,n.decrypter=void 0,n.initPTS=[],n.onvseeking=null,n.onvended=null,n.logPrefix="",n.log=void 0,n.warn=void 0,n.logPrefix=i,n.log=o.b.log.bind(o.b,i+":"),n.warn=o.b.warn.bind(o.b,i+":"),n.hls=e,n.fragmentLoader=new Dt(e.config),n.fragmentTracker=r,n.config=e.config,n.decrypter=new It.a(e,e.config),e.on(a.a.KEY_LOADED,n.onKeyLoaded,function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(n)),n}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,Ot(e,r);var u,h,d,c=i.prototype;return c.doTick=function(){this.onTickEnd()},c.onTickEnd=function(){},c.startLoad=function(t){},c.stopLoad=function(){this.fragmentLoader.abort();var t=this.fragCurrent;t&&this.fragmentTracker.removeFragment(t),this.resetTransmuxer(),this.fragCurrent=null,this.fragPrevious=null,this.clearInterval(),this.clearNextTick(),this.state=xt},c._streamEnded=function(t,e){var r=this.fragCurrent,i=this.fragmentTracker;if(!e.live&&r&&r.sn===e.endSN&&!t.nextStart){var n=i.getState(r);return n===tt.PARTIAL||n===tt.OK}return!1},c.onMediaAttached=function(t,e){var r=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvended=this.onMediaEnded.bind(this),r.addEventListener("seeking",this.onvseeking),r.addEventListener("ended",this.onvended);var i=this.config;this.levels&&i.autoStartLoad&&this.state===xt&&this.startLoad(i.startPosition)},c.onMediaDetaching=function(){var t=this.media;null!=t&&t.ended&&(this.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0),t&&(t.removeEventListener("seeking",this.onvseeking),t.removeEventListener("ended",this.onvended),this.onvseeking=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.fragmentTracker.removeAllFragments(),this.stopLoad()},c.onMediaSeeking=function(){var t=this.config,e=this.fragCurrent,r=this.media,i=this.mediaBuffer,a=this.state,s=r?r.currentTime:0,o=lt.bufferInfo(i||r,s,t.maxBufferHole);if(this.log("media seeking to "+(Object(n.a)(s)?s.toFixed(3):s)+", state: "+a),a===jt)this.resetLoadingState();else if(e&&!o.len){var l=t.maxFragLookUpTolerance,u=e.start-l,h=s>e.start+e.duration+l;(s<u||h)&&(h&&e.loader&&(this.log("seeking outside of buffer while fragment load in progress, cancel fragment load"),e.loader.abort()),this.resetLoadingState())}r&&(this.lastCurrentTime=s),this.loadedmetadata||o.len||(this.nextLoadPosition=this.startPosition=s),this.tickImmediate()},c.onMediaEnded=function(){this.startPosition=this.lastCurrentTime=0},c.onKeyLoaded=function(t,e){if(this.state===Mt&&e.frag===this.fragCurrent&&this.levels){this.state=Pt;var r=this.levels[e.frag.level].details;r&&this.loadFragment(e.frag,r,e.frag.start)}},c.onHandlerDestroying=function(){this.stopLoad(),t.prototype.onHandlerDestroying.call(this)},c.onHandlerDestroyed=function(){this.state=xt,this.hls.off(a.a.KEY_LOADED,this.onKeyLoaded,this),this.fragmentLoader&&this.fragmentLoader.destroy(),this.decrypter&&this.decrypter.destroy(),this.hls=this.log=this.warn=this.decrypter=this.fragmentLoader=this.fragmentTracker=null,t.prototype.onHandlerDestroyed.call(this)},c.loadKey=function(t,e){this.log("Loading key for "+t.sn+" of ["+e.startSN+"-"+e.endSN+"], "+("[stream-controller]"===this.logPrefix?"level":"track")+" "+t.level),this.state=Mt,this.fragCurrent=t,this.hls.trigger(a.a.KEY_LOADING,{frag:t})},c.loadFragment=function(t,e,r){this._loadFragForPlayback(t,e,r)},c._loadFragForPlayback=function(t,e,r){var i=this;this._doFragLoad(t,e,r,(function(e){if(i.fragContextChanged(t))return i.warn("Fragment "+t.sn+(e.part?" p: "+e.part.index:"")+" of level "+t.level+" was dropped during download."),void i.fragmentTracker.removeFragment(t);t.stats.chunkCount++,i._handleFragmentLoadProgress(e)})).then((function(e){if(e){i.fragLoadError=0;var r=i.state;if(!i.fragContextChanged(t))return"payload"in e&&(i.log("Loaded fragment "+t.sn+" of level "+t.level),i.hls.trigger(a.a.FRAG_LOADED,e),i.state===Kt)?(i.fragmentTracker.backtrack(t,e),void i.resetFragmentLoading(t)):void i._handleFragmentLoadComplete(e);(r===Ft||r===Kt||!i.fragCurrent&&r===Bt)&&(i.fragmentTracker.removeFragment(t),i.state=Pt)}})).catch((function(e){i.warn(e),i.resetFragmentLoading(t)}))},c.flushMainBuffer=function(t,e,r){if(void 0===r&&(r=null),t-e){var i={startOffset:t,endOffset:e,type:r};this.fragLoadError=0,this.hls.trigger(a.a.BUFFER_FLUSHING,i)}},c._loadInitSegment=function(t){var e=this;this._doFragLoad(t).then((function(r){if(!r||e.fragContextChanged(t)||!e.levels)throw new Error("init load aborted");return r})).then((function(r){var i=e.hls,n=r.payload,s=t.decryptdata;if(n&&n.byteLength>0&&s&&s.key&&s.iv&&"AES-128"===s.method){var o=self.performance.now();return e.decrypter.webCryptoDecrypt(new Uint8Array(n),s.key.buffer,s.iv.buffer).then((function(e){var n=self.performance.now();return i.trigger(a.a.FRAG_DECRYPTED,{frag:t,payload:e,stats:{tstart:o,tdecrypt:n}}),r.payload=e,r}))}return r})).then((function(r){var i=e.fragCurrent,n=e.hls,s=e.levels;if(!s)throw new Error("init load aborted, missing levels");s[t.level].details;var o=t.stats;e.state=Pt,e.fragLoadError=0,t.data=new Uint8Array(r.payload),o.parsing.start=o.buffering.start=self.performance.now(),o.parsing.end=o.buffering.end=self.performance.now(),r.frag===i&&n.trigger(a.a.FRAG_BUFFERED,{stats:o,frag:i,part:null,id:t.type}),e.tick()})).catch((function(r){e.warn(r),e.resetFragmentLoading(t)}))},c.fragContextChanged=function(t){var e=this.fragCurrent;return!t||!e||t.level!==e.level||t.sn!==e.sn||t.urlId!==e.urlId},c.fragBufferedComplete=function(t,e){var r=this.mediaBuffer?this.mediaBuffer:this.media;this.log("Buffered "+t.type+" sn: "+t.sn+(e?" part: "+e.index:"")+" of "+("[stream-controller]"===this.logPrefix?"level":"track")+" "+t.level+" "+Ct.toString(lt.getBuffered(r))),this.state=Pt,this.tick()},c._handleFragmentLoadComplete=function(t){var e=this.transmuxer;if(e){var r=t.frag,i=t.part,n=t.partsLoaded,a=!n||0===n.length||n.some((function(t){return!t})),s=new ut(r.level,r.sn,r.stats.chunkCount+1,0,i?i.index:-1,!a);e.flush(s)}},c._handleFragmentLoadProgress=function(t){},c._doFragLoad=function(t,e,r,i){var s=this;if(void 0===r&&(r=null),!this.levels)throw new Error("frag load aborted, missing levels");if(r=Math.max(t.start,r||0),this.config.lowLatencyMode&&e){var o=e.partList;if(o&&i){r>t.end&&e.fragmentHint&&(t=e.fragmentHint);var l=this.getNextPart(o,t,r);if(l>-1){var u=o[l];return this.log("Loading part sn: "+t.sn+" p: "+u.index+" cc: "+t.cc+" of playlist ["+e.startSN+"-"+e.endSN+"] parts [0-"+l+"-"+(o.length-1)+"] "+("[stream-controller]"===this.logPrefix?"level":"track")+": "+t.level+", target: "+parseFloat(r.toFixed(3))),this.nextLoadPosition=u.start+u.duration,this.state=Ft,this.hls.trigger(a.a.FRAG_LOADING,{frag:t,part:o[l],targetBufferTime:r}),this.doFragPartsLoad(t,o,l,i).catch((function(t){return s.handleFragLoadError(t)}))}if(!t.url||this.loadedEndOfParts(o,r))return Promise.resolve(null)}}return this.log("Loading fragment "+t.sn+" cc: "+t.cc+" "+(e?"of ["+e.startSN+"-"+e.endSN+"] ":"")+("[stream-controller]"===this.logPrefix?"level":"track")+": "+t.level+", target: "+parseFloat(r.toFixed(3))),Object(n.a)(t.sn)&&!this.bitrateTest&&(this.nextLoadPosition=t.start+t.duration),this.state=Ft,this.hls.trigger(a.a.FRAG_LOADING,{frag:t,targetBufferTime:r}),this.fragmentLoader.load(t,i).catch((function(t){return s.handleFragLoadError(t)}))},c.doFragPartsLoad=function(t,e,r,i){var n=this;return new Promise((function(s,o){var l=[];!function r(u){var h=e[u];n.fragmentLoader.loadPart(t,h,i).then((function(i){l[h.index]=i;var o=i.part;n.hls.trigger(a.a.FRAG_LOADED,i);var d=e[u+1];if(!d||d.fragment!==t)return s({frag:t,part:o,partsLoaded:l});r(u+1)})).catch(o)}(r)}))},c.handleFragLoadError=function(t){var e=t.data;return e&&e.details===s.a.INTERNAL_ABORTED?this.handleFragLoadAborted(e.frag,e.part):this.hls.trigger(a.a.ERROR,e),null},c._handleTransmuxerFlush=function(t){var e=this.getCurrentContext(t);if(e&&this.state===Bt){var r=e.frag,i=e.part,n=e.level,a=self.performance.now();r.stats.parsing.end=a,i&&(i.stats.parsing.end=a),this.updateLevelTiming(r,i,n,t.partial)}else this.fragCurrent||(this.state=Pt)},c.getCurrentContext=function(t){var e=this.levels,r=t.level,i=t.sn,n=t.part;if(!e||!e[r])return this.warn("Levels object was unset while buffering fragment "+i+" of level "+r+". The current chunk will not be buffered."),null;var a=e[r],s=n>-1?function(t,e,r){if(!t||!t.details)return null;var i=t.details.partList;if(i)for(var n=i.length;n--;){var a=i[n];if(a.index===r&&a.fragment.sn===e)return a}return null}(a,i,n):null,o=s?s.fragment:function(t,e,r){if(!t||!t.details)return null;var i=t.details,n=i.fragments[e-i.startSN];return n||((n=i.fragmentHint)&&n.sn===e?n:e<i.startSN&&r&&r.sn===e?r:null)}(a,i,this.fragCurrent);return o?{frag:o,part:s,level:a}:null},c.bufferFragmentData=function(t,e,r,i){if(t&&this.state===Bt){var n=t.data1,s=t.data2,o=n;if(n&&s&&(o=Object(l.a)(n,s)),o&&o.length){var u={type:t.type,frag:e,part:r,chunkMeta:i,parent:e.type,data:o};this.hls.trigger(a.a.BUFFER_APPENDING,u),t.dropped&&t.independent&&!r&&this.flushBufferGap(e)}}},c.flushBufferGap=function(t){var e=this.media;if(e)if(lt.isBuffered(e,e.currentTime)){var r=e.currentTime,i=lt.bufferInfo(e,r,0),n=t.duration,a=Math.min(2*this.config.maxFragLookUpTolerance,.25*n),s=Math.max(Math.min(t.start-a,i.end-a),r+a);t.start-s>a&&this.flushMainBuffer(s,t.start)}else this.flushMainBuffer(0,t.start)},c.getFwdBufferInfo=function(t,e){var r=this.config,i=this.getLoadPosition();if(!Object(n.a)(i))return null;var a=lt.bufferInfo(t,i,r.maxBufferHole);if(0===a.len&&void 0!==a.nextStart){var s=this.fragmentTracker.getBufferedFrag(i,e);if(s&&a.nextStart<s.end)return lt.bufferInfo(t,i,Math.max(a.nextStart,r.maxBufferHole))}return a},c.getMaxBufferLength=function(t){var e,r=this.config;return e=t?Math.max(8*r.maxBufferSize/t,r.maxBufferLength):r.maxBufferLength,Math.min(e,r.maxMaxBufferLength)},c.reduceMaxBufferLength=function(t){var e=this.config,r=t||e.maxBufferLength;return e.maxMaxBufferLength>=r&&(e.maxMaxBufferLength/=2,this.warn("Reduce max buffer length to "+e.maxMaxBufferLength+"s"),!0)},c.getNextFragment=function(t,e){var r,i,n=e.fragments,a=n.length;if(!a)return null;var s,o=this.config,l=n[0].start;if(e.live){var u=o.initialLiveManifestSize;if(a<u)return this.warn("Not enough fragments to start playback (have: "+a+", need: "+u+")"),null;e.PTSKnown||this.startFragRequested||-1!==this.startPosition||(s=this.getInitialLiveFragment(e,n),this.startPosition=s?this.hls.liveSyncPosition||s.start:t)}else t<=l&&(s=n[0]);if(!s){var h=o.lowLatencyMode?e.partEnd:e.fragmentEnd;s=this.getFragmentAtPosition(t,h,e)}return null===(r=s)||void 0===r||!r.initSegment||null!==(i=s)&&void 0!==i&&i.initSegment.data||this.bitrateTest||(s=s.initSegment),s},c.getNextPart=function(t,e,r){for(var i=-1,n=!1,a=!0,s=0,o=t.length;s<o;s++){var l=t[s];if(a=a&&!l.independent,i>-1&&r<l.start)break;var u=l.loaded;!u&&(n||l.independent||a)&&l.fragment===e&&(i=s),n=u}return i},c.loadedEndOfParts=function(t,e){var r=t[t.length-1];return r&&e>r.start&&r.loaded},c.getInitialLiveFragment=function(t,e){var r=this.fragPrevious,i=null;if(r){if(t.hasProgramDateTime&&(this.log("Live playlist, switching playlist, load frag with same PDT: "+r.programDateTime),i=pt(e,r.endProgramDateTime,this.config.maxFragLookUpTolerance)),!i){var n=r.sn+1;if(n>=t.startSN&&n<=t.endSN){var a=e[n-t.startSN];r.cc===a.cc&&(i=a,this.log("Live playlist, switching playlist, load frag with next SN: "+i.sn))}i||(i=function(t,e){return vt.search(t,(function(t){return t.cc<e?1:t.cc>e?-1:0}))}(e,r.cc))&&this.log("Live playlist, switching playlist, load frag with same CC: "+i.sn)}}else{var s=this.hls.liveSyncPosition;null!==s&&(i=this.getFragmentAtPosition(s,this.bitrateTest?t.fragmentEnd:t.edge,t))}return i},c.getFragmentAtPosition=function(t,e,r){var i,n=this.config,a=this.fragPrevious,s=r.fragments,o=r.endSN,l=r.fragmentHint,u=n.maxFragLookUpTolerance,h=!!(n.lowLatencyMode&&r.partList&&l);(h&&l&&!this.bitrateTest&&(s=s.concat(l),o=l.sn),t<e)?i=mt(a,s,t,t>e-u?0:u):i=s[s.length-1];if(i){var d=i.sn-r.startSN,c=a&&i.level===a.level,f=s[d+1];if(this.fragmentTracker.getState(i)===tt.BACKTRACKED){i=null;for(var g=d;s[g]&&this.fragmentTracker.getState(s[g])===tt.BACKTRACKED;)i=a?s[g--]:s[--g];i||(i=f)}else a&&i.sn===a.sn&&!h&&c&&(i.sn<o&&this.fragmentTracker.getState(f)!==tt.OK?(this.log("SN "+i.sn+" just loaded, load next one: "+f.sn),i=f):i=null)}return i},c.synchronizeToLiveEdge=function(t){var e=this.config,r=this.media;if(r){var i=this.hls.liveSyncPosition,n=r.currentTime,a=t.fragments[0].start,s=t.edge,o=n>=a-e.maxFragLookUpTolerance&&n<=s;if(null!==i&&r.duration>i&&(n<i||!o)){var l=void 0!==e.liveMaxLatencyDuration?e.liveMaxLatencyDuration:e.liveMaxLatencyDurationCount*t.targetduration;(!o&&r.readyState<4||n<s-l)&&(this.loadedmetadata||(this.nextLoadPosition=i),r.readyState&&(this.warn("Playback: "+n.toFixed(3)+" is located too far from the end of live sliding playlist: "+s+", reset currentTime to : "+i.toFixed(3)),r.currentTime=i))}}},c.alignPlaylists=function(t,e){var r=this.levels,i=this.levelLastLoaded,a=this.fragPrevious,s=null!==i?r[i]:null,o=t.fragments.length;if(!o)return this.warn("No fragments in live playlist"),0;var l=t.fragments[0].start,u=!e,h=t.alignedSliding&&Object(n.a)(l);if(u||!h&&!l){ct(a,s,t);var d=t.fragments[0].start;return this.log("Live playlist sliding: "+d.toFixed(2)+" start-sn: "+(e?e.startSN:"na")+"->"+t.startSN+" prev-sn: "+(a?a.sn:"na")+" fragments: "+o),d}return l},c.waitForCdnTuneIn=function(t){return t.live&&t.canBlockReload&&t.tuneInGoal>Math.max(t.partHoldBack,3*t.partTarget)},c.setStartPosition=function(t,e){var r=this.startPosition;if(r<e&&(r=-1),-1===r||-1===this.lastCurrentTime){var i=t.startTimeOffset;Object(n.a)(i)?(r=e+i,i<0&&(r+=t.totalduration),r=Math.min(Math.max(e,r),e+t.totalduration),this.log("Start time offset "+i+" found in playlist, adjust startPosition to "+r),this.startPosition=r):t.live?r=this.hls.liveSyncPosition||e:this.startPosition=r=0,this.lastCurrentTime=r}this.nextLoadPosition=r},c.getLoadPosition=function(){var t=this.media,e=0;return this.loadedmetadata&&t?e=t.currentTime:this.nextLoadPosition&&(e=this.nextLoadPosition),e},c.handleFragLoadAborted=function(t,e){this.transmuxer&&"initSegment"!==t.sn&&t.stats.aborted&&(this.warn("Fragment "+t.sn+(e?" part"+e.index:"")+" of level "+t.level+" was aborted"),this.resetFragmentLoading(t))},c.resetFragmentLoading=function(t){this.fragCurrent&&this.fragContextChanged(t)||(this.state=Pt)},c.onFragmentOrKeyLoadError=function(t,e){if(!e.fatal){var r=e.frag;if(r&&r.type===t){this.fragCurrent;var i=this.config;if(this.fragLoadError+1<=i.fragLoadingMaxRetry){if(this.resetLiveStartWhenNotLoaded(r.level))return;var n=Math.min(Math.pow(2,this.fragLoadError)*i.fragLoadingRetryDelay,i.fragLoadingMaxRetryTimeout);this.warn("Fragment "+r.sn+" of "+t+" "+r.level+" failed to load, retrying in "+n+"ms"),this.retryDate=self.performance.now()+n,this.fragLoadError++,this.state=Nt}else e.levelRetry?(t===k.b.AUDIO&&(this.fragCurrent=null),this.fragLoadError=0,this.state=Pt):(o.b.error(e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.stopLoad(),this.state=Ht)}}},c.afterBufferFlushed=function(t,e,r){if(t){var i=lt.getBuffered(t);this.fragmentTracker.detectEvictedFragments(e,i,r),this.state===jt&&this.resetLoadingState()}},c.resetLoadingState=function(){this.fragCurrent=null,this.fragPrevious=null,this.state=Pt},c.resetLiveStartWhenNotLoaded=function(t){if(!this.loadedmetadata){this.startFragRequested=!1;var e=this.levels?this.levels[t].details:null;if(null!=e&&e.live)return this.startPosition=-1,this.setStartPosition(e,0),this.resetLoadingState(),!0;this.nextLoadPosition=this.startPosition}return!1},c.updateLevelTiming=function(t,e,r,i){var n=this,s=r.details;Object.keys(t.elementaryStreams).reduce((function(e,o){var l=t.elementaryStreams[o];if(l){var u=l.endPTS-l.startPTS;if(u<=0)return n.warn("Could not parse fragment "+t.sn+" "+o+" duration reliably ("+u+") resetting transmuxer to fallback to playlist timing"),n.resetTransmuxer(),e||!1;var h=i?0:Y(s,t,l.startPTS,l.endPTS,l.startDTS,l.endDTS);return n.hls.trigger(a.a.LEVEL_PTS_UPDATED,{details:s,level:r,drift:h,type:o,frag:t,start:l.startPTS,end:l.endPTS}),!0}return e}),!1)?(this.state=Gt,this.hls.trigger(a.a.FRAG_PARSED,{frag:t,part:e})):this.resetLoadingState()},c.resetTransmuxer=function(){this.transmuxer&&(this.transmuxer.destroy(),this.transmuxer=null)},u=i,(h=[{key:"state",get:function(){return this._state},set:function(t){var e=this._state;e!==t&&(this._state=t,this.log(e+"->"+t))}}])&&wt(u.prototype,h),d&&wt(u,d),i}(st);function qt(){return self.MediaSource||self.WebKitMediaSource}function Xt(){return self.SourceBuffer||self.WebKitSourceBuffer}var zt=r(18),Qt=r(10),$t=r(14),Jt=qt()||{isTypeSupported:function(){return!1}},Zt=function(){function t(t,e,r,i){var n=this;this.hls=void 0,this.id=void 0,this.observer=void 0,this.frag=null,this.part=null,this.worker=void 0,this.onwmsg=void 0,this.transmuxer=null,this.onTransmuxComplete=void 0,this.onFlush=void 0,this.hls=t,this.id=e,this.onTransmuxComplete=r,this.onFlush=i;var l=t.config,u=function(e,r){(r=r||{}).frag=n.frag,r.id=n.id,t.trigger(e,r)};this.observer=new $t.EventEmitter,this.observer.on(a.a.FRAG_DECRYPTED,u),this.observer.on(a.a.ERROR,u);var h={mp4:Jt.isTypeSupported("video/mp4"),mpeg:Jt.isTypeSupported("audio/mpeg"),mp3:Jt.isTypeSupported('audio/mp4; codecs="mp3"')},d=navigator.vendor;if(l.enableWorker&&"undefined"!=typeof Worker){var c;o.b.log("demuxing in webworker");try{c=this.worker=zt(19),this.onwmsg=this.onWorkerMessage.bind(this),c.addEventListener("message",this.onwmsg),c.onerror=function(e){t.trigger(a.a.ERROR,{type:s.b.OTHER_ERROR,details:s.a.INTERNAL_EXCEPTION,fatal:!0,event:"demuxerWorker",error:new Error(e.message+" ("+e.filename+":"+e.lineno+")")})},c.postMessage({cmd:"init",typeSupported:h,vendor:d,id:e,config:JSON.stringify(l)})}catch(t){o.b.warn("Error in worker:",t),o.b.error("Error while initializing DemuxerWorker, fallback to inline"),c&&self.URL.revokeObjectURL(c.objectURL),this.transmuxer=new Qt.c(this.observer,h,l,d,e),this.worker=null}}else this.transmuxer=new Qt.c(this.observer,h,l,d,e)}var e=t.prototype;return e.destroy=function(){var t=this.worker;if(t)t.removeEventListener("message",this.onwmsg),t.terminate(),this.worker=null;else{var e=this.transmuxer;e&&(e.destroy(),this.transmuxer=null)}var r=this.observer;r&&r.removeAllListeners(),this.observer=null},e.push=function(t,e,r,i,n,a,s,l,u,h){var d=this;u.transmuxing.start=self.performance.now();var c=this.transmuxer,f=this.worker,g=a?a.start:n.start,v=n.decryptdata,p=this.frag,m=!(p&&n.cc===p.cc),y=!(p&&u.level===p.level),T=p?u.sn-p.sn:-1,b=this.part?u.part-this.part.index:1,E=!y&&(1===T||0===T&&1===b),S=self.performance.now();(y||T||0===n.stats.parsing.start)&&(n.stats.parsing.start=S),!a||!b&&E||(a.stats.parsing.start=S);var L=new Qt.b(m,E,l,y,g);if(!E||m){o.b.log("[transmuxer-interface, "+n.type+"]: Starting new transmux session for sn: "+u.sn+" p: "+u.part+" level: "+u.level+" id: "+u.id+"\n discontinuity: "+m+"\n trackSwitch: "+y+"\n contiguous: "+E+"\n accurateTimeOffset: "+l+"\n timeOffset: "+g);var A=new Qt.a(r,i,e,s,h);this.configureTransmuxer(A)}if(this.frag=n,this.part=a,f)f.postMessage({cmd:"demux",data:t,decryptdata:v,chunkMeta:u,state:L},t instanceof ArrayBuffer?[t]:[]);else if(c){var R=c.push(t,v,u,L);Object(Qt.d)(R)?R.then((function(t){d.handleTransmuxComplete(t)})):this.handleTransmuxComplete(R)}},e.flush=function(t){var e=this;t.transmuxing.start=self.performance.now();var r=this.transmuxer,i=this.worker;if(i)i.postMessage({cmd:"flush",chunkMeta:t});else if(r){var n=r.flush(t);Object(Qt.d)(n)?n.then((function(r){e.handleFlushResult(r,t)})):this.handleFlushResult(n,t)}},e.handleFlushResult=function(t,e){var r=this;t.forEach((function(t){r.handleTransmuxComplete(t)})),this.onFlush(e)},e.onWorkerMessage=function(t){var e=t.data,r=this.hls;switch(e.event){case"init":self.URL.revokeObjectURL(this.worker.objectURL);break;case"transmuxComplete":this.handleTransmuxComplete(e.data);break;case"flush":this.onFlush(e.data);break;default:e.data=e.data||{},e.data.frag=this.frag,e.data.id=this.id,r.trigger(e.event,e.data)}},e.configureTransmuxer=function(t){var e=this.worker,r=this.transmuxer;e?e.postMessage({cmd:"configure",config:t}):r&&r.configure(t)},e.handleTransmuxComplete=function(t){t.chunkMeta.transmuxing.end=self.performance.now(),this.onTransmuxComplete(t)},t}(),te=function(){function t(t,e,r,i){this.config=void 0,this.media=void 0,this.fragmentTracker=void 0,this.hls=void 0,this.nudgeRetry=0,this.stallReported=!1,this.stalled=null,this.moved=!1,this.seeking=!1,this.config=t,this.media=e,this.fragmentTracker=r,this.hls=i}var e=t.prototype;return e.destroy=function(){this.hls=this.fragmentTracker=this.media=null},e.poll=function(t){var e=this.config,r=this.media,i=this.stalled,n=r.currentTime,a=r.seeking,s=this.seeking&&!a,l=!this.seeking&&a;if(this.seeking=a,n===t){if((l||s)&&(this.stalled=null),!r.paused&&!r.ended&&0!==r.playbackRate&<.getBuffered(r).length){var u=lt.bufferInfo(r,n,0),h=u.len>0,d=u.nextStart||0;if(h||d){if(a){var c=u.len>2,f=!d||d-n>2&&!this.fragmentTracker.getPartialFragment(n);if(c||f)return;this.moved=!1}if(!this.moved&&null!==this.stalled){var g,v=Math.max(d,u.start||0)-n,p=this.hls.levels?this.hls.levels[this.hls.currentLevel]:null,m=(null==p||null===(g=p.details)||void 0===g?void 0:g.live)?2*p.details.targetduration:2;if(v>0&&v<=m)return void this._trySkipBufferHole(null)}var y=self.performance.now();if(null!==i){var T=y-i;!a&&T>=250&&this._reportStall(u.len);var b=lt.bufferInfo(r,n,e.maxBufferHole);this._tryFixBufferStall(b,T)}else this.stalled=y}}}else if(this.moved=!0,null!==i){if(this.stallReported){var E=self.performance.now()-i;o.b.warn("playback not stuck anymore @"+n+", after "+Math.round(E)+"ms"),this.stallReported=!1}this.stalled=null,this.nudgeRetry=0}},e._tryFixBufferStall=function(t,e){var r=this.config,i=this.fragmentTracker,n=this.media.currentTime,a=i.getPartialFragment(n);if(a&&this._trySkipBufferHole(a))return;t.len>r.maxBufferHole&&e>1e3*r.highBufferWatchdogPeriod&&(o.b.warn("Trying to nudge playhead over buffer-hole"),this.stalled=null,this._tryNudgeBuffer())},e._reportStall=function(t){var e=this.hls,r=this.media;this.stallReported||(this.stallReported=!0,o.b.warn("Playback stalling at @"+r.currentTime+" due to low buffer (buffer="+t+")"),e.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.BUFFER_STALLED_ERROR,fatal:!1,buffer:t}))},e._trySkipBufferHole=function(t){for(var e=this.config,r=this.hls,i=this.media,n=i.currentTime,l=0,u=lt.getBuffered(i),h=0;h<u.length;h++){var d=u.start(h);if(n+e.maxBufferHole>=l&&n<d){var c=Math.max(d+.05,i.currentTime+.1);return o.b.warn("skipping hole, adjusting currentTime from "+n+" to "+c),this.moved=!0,this.stalled=null,i.currentTime=c,t&&r.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.BUFFER_SEEK_OVER_HOLE,fatal:!1,reason:"fragment loaded with buffer holes, seeking from "+n+" to "+c,frag:t}),c}l=u.end(h)}return 0},e._tryNudgeBuffer=function(){var t=this.config,e=this.hls,r=this.media,i=r.currentTime,n=(this.nudgeRetry||0)+1;if(this.nudgeRetry=n,n<t.nudgeMaxRetry){var l=i+n*t.nudgeOffset;o.b.warn("Nudging 'currentTime' from "+i+" to "+l),r.currentTime=l,e.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.BUFFER_NUDGE_ON_STALL,fatal:!1})}else o.b.error("Playhead still not moving while enough data buffered @"+i+" after "+t.nudgeMaxRetry+" nudges"),e.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.BUFFER_STALLED_ERROR,fatal:!0})},t}();function ee(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function re(t,e){return(re=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var ie=function(t){var e,r;function i(e,r){var i;return(i=t.call(this,e,r,"[stream-controller]")||this).audioCodecSwap=!1,i.gapController=null,i.level=-1,i._forceStartLoad=!1,i.altAudio=!1,i.audioOnly=!1,i.fragPlaying=null,i.onvplaying=null,i.onvseeked=null,i.fragLastKbps=0,i.stalled=!1,i.couldBacktrack=!1,i.audioCodecSwitch=!1,i.videoBuffer=null,i._registerListeners(),i}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,re(e,r);var l,h,d,c=i.prototype;return c._registerListeners=function(){var t=this.hls;t.on(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.on(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.on(a.a.LEVEL_LOADING,this.onLevelLoading,this),t.on(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.on(a.a.FRAG_LOAD_EMERGENCY_ABORTED,this.onFragLoadEmergencyAborted,this),t.on(a.a.ERROR,this.onError,this),t.on(a.a.AUDIO_TRACK_SWITCHING,this.onAudioTrackSwitching,this),t.on(a.a.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),t.on(a.a.BUFFER_CREATED,this.onBufferCreated,this),t.on(a.a.BUFFER_FLUSHED,this.onBufferFlushed,this),t.on(a.a.LEVELS_UPDATED,this.onLevelsUpdated,this),t.on(a.a.FRAG_BUFFERED,this.onFragBuffered,this)},c._unregisterListeners=function(){var t=this.hls;t.off(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.off(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.off(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.off(a.a.FRAG_LOAD_EMERGENCY_ABORTED,this.onFragLoadEmergencyAborted,this),t.off(a.a.ERROR,this.onError,this),t.off(a.a.AUDIO_TRACK_SWITCHING,this.onAudioTrackSwitching,this),t.off(a.a.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),t.off(a.a.BUFFER_CREATED,this.onBufferCreated,this),t.off(a.a.BUFFER_FLUSHED,this.onBufferFlushed,this),t.off(a.a.LEVELS_UPDATED,this.onLevelsUpdated,this),t.off(a.a.FRAG_BUFFERED,this.onFragBuffered,this)},c.onHandlerDestroying=function(){this._unregisterListeners(),this.onMediaDetaching()},c.startLoad=function(t){if(this.levels){var e=this.lastCurrentTime,r=this.hls;if(this.stopLoad(),this.setInterval(100),this.level=-1,this.fragLoadError=0,!this.startFragRequested){var i=r.startLevel;-1===i&&(r.config.testBandwidth?(i=0,this.bitrateTest=!0):i=r.nextAutoLevel),this.level=r.nextLoadLevel=i,this.loadedmetadata=!1}e>0&&-1===t&&(this.log("Override startPosition with lastCurrentTime @"+e.toFixed(3)),t=e),this.state=Pt,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=t,this.tick()}else this._forceStartLoad=!0,this.state=xt},c.stopLoad=function(){this._forceStartLoad=!1,t.prototype.stopLoad.call(this)},c.doTick=function(){switch(this.state){case Pt:this.doTickIdle();break;case Wt:var t,e=this.levels,r=this.level,i=null==e||null===(t=e[r])||void 0===t?void 0:t.details;if(i&&(!i.live||this.levelLastLoaded===this.level)){if(this.waitForCdnTuneIn(i))break;this.state=Pt;break}break;case Nt:var n,a=self.performance.now(),s=this.retryDate;(!s||a>=s||null!==(n=this.media)&&void 0!==n&&n.seeking)&&(this.log("retryDate reached, switch back to IDLE state"),this.state=Pt)}this.onTickEnd()},c.onTickEnd=function(){t.prototype.onTickEnd.call(this),this.checkBuffer(),this.checkFragmentChanged()},c.doTickIdle=function(){var t,e,r=this.hls,i=this.levelLastLoaded,n=this.levels,s=this.media,o=r.config,l=r.nextLoadLevel;if(null!==i&&(s||!this.startFragRequested&&o.startFragPrefetch)&&(!this.altAudio||!this.audioOnly)&&n&&n[l]){var h=n[l];this.level=r.nextLoadLevel=l;var d=h.details;if(!d||this.state===Wt||d.live&&this.levelLastLoaded!==l)this.state=Wt;else{var c=this.getFwdBufferInfo(this.mediaBuffer?this.mediaBuffer:s,k.b.MAIN);if(null!==c)if(!(c.len>=this.getMaxBufferLength(h.maxBitrate))){if(this._streamEnded(c,d)){var f={};return this.altAudio&&(f.type="video"),this.hls.trigger(a.a.BUFFER_EOS,f),void(this.state=jt)}var g=c.end,v=this.getNextFragment(g,d);if(this.couldBacktrack&&!this.fragPrevious&&v&&"initSegment"!==v.sn){var p=v.sn-d.startSN;p>1&&(v=d.fragments[p-1],this.fragmentTracker.removeFragment(v))}if(v&&this.fragmentTracker.getState(v)===tt.OK&&this.nextLoadPosition>g){var m=this.audioOnly&&!this.altAudio?u.a.AUDIO:u.a.VIDEO;this.afterBufferFlushed(s,m,k.b.MAIN),v=this.getNextFragment(this.nextLoadPosition,d)}v&&(!v.initSegment||v.initSegment.data||this.bitrateTest||(v=v.initSegment),"identity"!==(null===(t=v.decryptdata)||void 0===t?void 0:t.keyFormat)||null!==(e=v.decryptdata)&&void 0!==e&&e.key?this.loadFragment(v,d,g):this.loadKey(v,d))}}}},c.loadFragment=function(e,r,i){var n,a=this.fragmentTracker.getState(e);if(this.fragCurrent=e,a===tt.BACKTRACKED){var s=this.fragmentTracker.getBacktrackData(e);if(s)return this._handleFragmentLoadProgress(s),void this._handleFragmentLoadComplete(s);a=tt.NOT_LOADED}a===tt.NOT_LOADED||a===tt.PARTIAL?"initSegment"===e.sn?this._loadInitSegment(e):this.bitrateTest?(e.bitrateTest=!0,this.log("Fragment "+e.sn+" of level "+e.level+" is being downloaded to test bitrate and will not be buffered"),this._loadBitrateTestFrag(e)):(this.startFragRequested=!0,t.prototype.loadFragment.call(this,e,r,i)):a===tt.APPENDING?this.reduceMaxBufferLength(e.duration)&&this.fragmentTracker.removeFragment(e):0===(null===(n=this.media)||void 0===n?void 0:n.buffered.length)&&this.fragmentTracker.removeAllFragments()},c.getAppendedFrag=function(t){var e=this.fragmentTracker.getAppendedFrag(t,k.b.MAIN);return e&&"fragment"in e?e.fragment:e},c.getBufferedFrag=function(t){return this.fragmentTracker.getBufferedFrag(t,k.b.MAIN)},c.followingBufferedFrag=function(t){return t?this.getBufferedFrag(t.end+.5):null},c.immediateLevelSwitch=function(){this.abortCurrentFrag(),this.flushMainBuffer(0,Number.POSITIVE_INFINITY)},c.nextLevelSwitch=function(){var t=this.levels,e=this.media;if(null!=e&&e.readyState){var r,i=this.getAppendedFrag(e.currentTime);if(i&&i.start>1&&this.flushMainBuffer(0,i.start-1),!e.paused&&t){var n=t[this.hls.nextLoadLevel],a=this.fragLastKbps;r=a&&this.fragCurrent?this.fragCurrent.duration*n.maxBitrate/(1e3*a)+1:0}else r=0;var s=this.getBufferedFrag(e.currentTime+r);if(s){var o=this.followingBufferedFrag(s);if(o){this.abortCurrentFrag();var l=o.maxStartPTS?o.maxStartPTS:o.start,u=o.duration,h=Math.max(s.end,l+Math.min(Math.max(u-this.config.maxFragLookUpTolerance,.5*u),.75*u));this.flushMainBuffer(h,Number.POSITIVE_INFINITY)}}}},c.abortCurrentFrag=function(){var t=this.fragCurrent;this.fragCurrent=null,null!=t&&t.loader&&t.loader.abort(),this.state===Mt&&(this.state=Pt),this.nextLoadPosition=this.getLoadPosition()},c.flushMainBuffer=function(e,r){t.prototype.flushMainBuffer.call(this,e,r,this.altAudio?"video":null)},c.onMediaAttached=function(e,r){t.prototype.onMediaAttached.call(this,e,r);var i=r.media;this.onvplaying=this.onMediaPlaying.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),i.addEventListener("playing",this.onvplaying),i.addEventListener("seeked",this.onvseeked),this.gapController=new te(this.config,i,this.fragmentTracker,this.hls)},c.onMediaDetaching=function(){var e=this.media;e&&(e.removeEventListener("playing",this.onvplaying),e.removeEventListener("seeked",this.onvseeked),this.onvplaying=this.onvseeked=null,this.videoBuffer=null),this.fragPlaying=null,this.gapController&&(this.gapController.destroy(),this.gapController=null),t.prototype.onMediaDetaching.call(this)},c.onMediaPlaying=function(){this.tick()},c.onMediaSeeked=function(){var t=this.media,e=t?t.currentTime:null;Object(n.a)(e)&&this.log("Media seeked to "+e.toFixed(3)),this.tick()},c.onManifestLoading=function(){this.log("Trigger BUFFER_RESET"),this.hls.trigger(a.a.BUFFER_RESET,void 0),this.fragmentTracker.removeAllFragments(),this.couldBacktrack=this.stalled=!1,this.startPosition=this.lastCurrentTime=0,this.fragPlaying=null},c.onManifestParsed=function(t,e){var r,i,n,a=!1,s=!1;e.levels.forEach((function(t){(r=t.audioCodec)&&(-1!==r.indexOf("mp4a.40.2")&&(a=!0),-1!==r.indexOf("mp4a.40.5")&&(s=!0))})),this.audioCodecSwitch=a&&s&&!("function"==typeof(null==(n=Xt())||null===(i=n.prototype)||void 0===i?void 0:i.changeType)),this.audioCodecSwitch&&this.log("Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startFragRequested=!1},c.onLevelLoading=function(t,e){var r=this.levels;if(r&&this.state===Pt){var i=r[e.level];(!i.details||i.details.live&&this.levelLastLoaded!==e.level||this.waitForCdnTuneIn(i.details))&&(this.state=Wt)}},c.onLevelLoaded=function(t,e){var r,i=this.levels,n=e.level,s=e.details,o=s.totalduration;if(i){this.log("Level "+n+" loaded ["+s.startSN+","+s.endSN+"], cc ["+s.startCC+", "+s.endCC+"] duration:"+o);var l=this.fragCurrent;!l||this.state!==Ft&&this.state!==Nt||l.level!==e.level&&l.loader&&(this.state=Pt,l.loader.abort());var u=i[n],h=0;if(s.live||null!==(r=u.details)&&void 0!==r&&r.live){if(s.fragments[0]||(s.deltaUpdateFailed=!0),s.deltaUpdateFailed)return;h=this.alignPlaylists(s,u.details)}if(u.details=s,this.levelLastLoaded=n,this.hls.trigger(a.a.LEVEL_UPDATED,{details:s,level:n}),this.state===Wt){if(this.waitForCdnTuneIn(s))return;this.state=Pt}this.startFragRequested?s.live&&this.synchronizeToLiveEdge(s):this.setStartPosition(s,h),this.tick()}else this.warn("Levels were reset while loading level "+n)},c._handleFragmentLoadProgress=function(t){var e,r=t.frag,i=t.part,n=t.payload,a=this.levels;if(a){var s=a[r.level],o=s.details;if(o){var l=s.videoCodec,u=o.PTSKnown||!o.live,h=null===(e=r.initSegment)||void 0===e?void 0:e.data,d=this._getAudioCodec(s),c=this.transmuxer=this.transmuxer||new Zt(this.hls,k.b.MAIN,this._handleTransmuxComplete.bind(this),this._handleTransmuxerFlush.bind(this)),f=i?i.index:-1,g=-1!==f,v=new ut(r.level,r.sn,r.stats.chunkCount,n.byteLength,f,g),p=this.initPTS[r.cc];c.push(n,h,d,l,r,i,o.totalduration,u,v,p)}else this.warn("Dropping fragment "+r.sn+" of level "+r.level+" after level details were reset")}else this.warn("Levels were reset while fragment load was in progress. Fragment "+r.sn+" of level "+r.level+" will not be buffered")},c.onAudioTrackSwitching=function(t,e){var r=this.altAudio,i=!!e.url,n=e.id;if(!i){if(this.mediaBuffer!==this.media){this.log("Switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var s=this.fragCurrent;null!=s&&s.loader&&(this.log("Switching to main audio track, cancel main fragment load"),s.loader.abort()),this.resetTransmuxer(),this.resetLoadingState()}else this.audioOnly&&this.resetTransmuxer();var o=this.hls;r&&o.trigger(a.a.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),o.trigger(a.a.AUDIO_TRACK_SWITCHED,{id:n})}},c.onAudioTrackSwitched=function(t,e){var r=e.id,i=!!this.hls.audioTracks[r].url;if(i){var n=this.videoBuffer;n&&this.mediaBuffer!==n&&(this.log("Switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=n)}this.altAudio=i,this.tick()},c.onBufferCreated=function(t,e){var r,i,n=e.tracks,a=!1;for(var s in n){var o=n[s];if("main"===o.id){if(i=s,r=o,"video"===s){var l=n[s];l&&(this.videoBuffer=l.buffer)}}else a=!0}a&&r?(this.log("Alternate track found, use "+i+".buffered to schedule main fragment loading"),this.mediaBuffer=r.buffer):this.mediaBuffer=this.media},c.onFragBuffered=function(t,e){var r=e.frag,i=e.part;if(!r||r.type===k.b.MAIN){if(this.fragContextChanged(r))return this.warn("Fragment "+r.sn+(i?" p: "+i.index:"")+" of level "+r.level+" finished buffering, but was aborted. state: "+this.state),void(this.state===Gt&&(this.state=Pt));var n=i?i.stats:r.stats;this.fragLastKbps=Math.round(8*n.total/(n.buffering.end-n.loading.first)),"initSegment"!==r.sn&&(this.fragPrevious=r),this.fragBufferedComplete(r,i)}},c.onError=function(t,e){switch(e.details){case s.a.FRAG_LOAD_ERROR:case s.a.FRAG_LOAD_TIMEOUT:case s.a.KEY_LOAD_ERROR:case s.a.KEY_LOAD_TIMEOUT:this.onFragmentOrKeyLoadError(k.b.MAIN,e);break;case s.a.LEVEL_LOAD_ERROR:case s.a.LEVEL_LOAD_TIMEOUT:this.state!==Ht&&(e.fatal?(this.warn(""+e.details),this.state=Ht):e.levelRetry||this.state!==Wt||(this.state=Pt));break;case s.a.BUFFER_FULL_ERROR:if("main"===e.parent&&(this.state===Bt||this.state===Gt)){var r=!0,i=this.getFwdBufferInfo(this.media,k.b.MAIN);i&&i.len>.5&&(r=!this.reduceMaxBufferLength(i.len)),r&&(this.warn("buffer full error also media.currentTime is not buffered, flush main"),this.immediateLevelSwitch()),this.resetLoadingState()}}},c.checkBuffer=function(){var t=this.media,e=this.gapController;if(t&&e&&t.readyState){var r=lt.getBuffered(t);!this.loadedmetadata&&r.length?(this.loadedmetadata=!0,this.seekToStartPos()):e.poll(this.lastCurrentTime),this.lastCurrentTime=t.currentTime}},c.onFragLoadEmergencyAborted=function(){this.state=Pt,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.tickImmediate()},c.onBufferFlushed=function(t,e){var r=e.type;if(r!==u.a.AUDIO||this.audioOnly&&!this.altAudio){var i=(r===u.a.VIDEO?this.videoBuffer:this.mediaBuffer)||this.media;this.afterBufferFlushed(i,r,k.b.MAIN)}},c.onLevelsUpdated=function(t,e){this.levels=e.levels},c.swapAudioCodec=function(){this.audioCodecSwap=!this.audioCodecSwap},c.seekToStartPos=function(){var t=this.media,e=t.currentTime,r=this.startPosition;if(r>=0&&e<r){if(t.seeking)return void o.b.log("could not seek to "+r+", already seeking at "+e);var i=lt.getBuffered(t),n=(i.length?i.start(0):0)-r;n>0&&(n<this.config.maxBufferHole||n<this.config.maxFragLookUpTolerance)&&(o.b.log("adjusting start position by "+n+" to match buffer start"),r+=n,this.startPosition=r),this.log("seek to target start position "+r+" from current time "+e),t.currentTime=r}},c._getAudioCodec=function(t){var e=this.config.defaultAudioCodec||t.audioCodec;return this.audioCodecSwap&&e&&(this.log("Swapping audio codec"),e=-1!==e.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5"),e},c._loadBitrateTestFrag=function(t){var e=this;this._doFragLoad(t).then((function(r){var i=e.hls;if(r&&!i.nextLoadLevel&&!e.fragContextChanged(t)){e.fragLoadError=0,e.state=Pt,e.startFragRequested=!1,e.bitrateTest=!1;var n=t.stats;n.parsing.start=n.parsing.end=n.buffering.start=n.buffering.end=self.performance.now(),i.trigger(a.a.FRAG_LOADED,r)}}))},c._handleTransmuxComplete=function(t){var e,r="main",i=this.hls,s=t.remuxResult,o=t.chunkMeta,l=this.getCurrentContext(o);if(!l)return this.warn("The loading context changed while buffering fragment "+o.sn+" of level "+o.level+". This chunk will not be buffered."),void this.resetLiveStartWhenNotLoaded(o.level);var h=l.frag,d=l.part,c=l.level,f=s.video,g=s.text,v=s.id3,p=s.initSegment,m=this.altAudio?void 0:s.audio;if(!this.fragContextChanged(h)){if(this.state=Bt,p){p.tracks&&(this._bufferInitSegment(c,p.tracks,h,o),i.trigger(a.a.FRAG_PARSING_INIT_SEGMENT,{frag:h,id:r,tracks:p.tracks}));var y=p.initPTS,T=p.timescale;Object(n.a)(y)&&(this.initPTS[h.cc]=y,i.trigger(a.a.INIT_PTS_FOUND,{frag:h,id:r,initPTS:y,timescale:T}))}if(f&&!1!==s.independent){if(c.details){var b=f.startPTS,E=f.endPTS,S=f.startDTS,L=f.endDTS;if(d)d.elementaryStreams[f.type]={startPTS:b,endPTS:E,startDTS:S,endDTS:L};else if(f.firstKeyFrame&&f.independent&&(this.couldBacktrack=!0),f.dropped&&f.independent){if(this.getLoadPosition()+this.config.maxBufferHole<b)return void this.backtrack(h);h.setElementaryStreamInfo(f.type,h.start,E,h.start,L,!0)}h.setElementaryStreamInfo(f.type,b,E,S,L),this.bufferFragmentData(f,h,d,o)}}else if(!1===s.independent)return void this.backtrack(h);if(m){var A=m.startPTS,R=m.endPTS,D=m.startDTS,k=m.endDTS;d&&(d.elementaryStreams[u.a.AUDIO]={startPTS:A,endPTS:R,startDTS:D,endDTS:k}),h.setElementaryStreamInfo(u.a.AUDIO,A,R,D,k),this.bufferFragmentData(m,h,d,o)}if(null!=v&&null!==(e=v.samples)&&void 0!==e&&e.length){var _={frag:h,id:r,samples:v.samples};i.trigger(a.a.FRAG_PARSING_METADATA,_)}if(g){var I={frag:h,id:r,samples:g.samples};i.trigger(a.a.FRAG_PARSING_USERDATA,I)}}},c._bufferInitSegment=function(t,e,r,i){var n=this;if(this.state===Bt){this.audioOnly=!!e.audio&&!e.video,this.altAudio&&!this.audioOnly&&delete e.audio;var s=e.audio,o=e.video,l=e.audiovideo;if(s){var u=t.audioCodec,h=navigator.userAgent.toLowerCase();this.audioCodecSwitch&&(u&&(u=-1!==u.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5"),1!==s.metadata.channelCount&&-1===h.indexOf("firefox")&&(u="mp4a.40.5")),-1!==h.indexOf("android")&&"audio/mpeg"!==s.container&&(u="mp4a.40.2",this.log("Android: force audio codec to "+u)),t.audioCodec&&t.audioCodec!==u&&this.log('Swapping manifest audio codec "'+t.audioCodec+'" for "'+u+'"'),s.levelCodec=u,s.id="main",this.log("Init audio buffer, container:"+s.container+", codecs[selected/level/parsed]=["+(u||"")+"/"+(t.audioCodec||"")+"/"+s.codec+"]")}o&&(o.levelCodec=t.videoCodec,o.id="main",this.log("Init video buffer, container:"+o.container+", codecs[level/parsed]=["+(t.videoCodec||"")+"/"+o.codec+"]")),l&&this.log("Init audiovideo buffer, container:"+l.container+", codecs[level/parsed]=["+(t.attrs.CODECS||"")+"/"+l.codec+"]"),this.hls.trigger(a.a.BUFFER_CODECS,e),Object.keys(e).forEach((function(t){var s=e[t].initSegment;null!=s&&s.byteLength&&n.hls.trigger(a.a.BUFFER_APPENDING,{type:t,data:s,frag:r,part:null,chunkMeta:i,parent:r.type})})),this.tick()}},c.backtrack=function(t){this.couldBacktrack=!0,this.resetTransmuxer(),this.flushBufferGap(t);var e=this.fragmentTracker.backtrack(t);this.fragPrevious=null,this.nextLoadPosition=t.start,e?this.resetFragmentLoading(t):this.state=Kt},c.checkFragmentChanged=function(){var t=this.media,e=null;if(t&&t.readyState>1&&!1===t.seeking){var r=t.currentTime;if(lt.isBuffered(t,r)?e=this.getAppendedFrag(r):lt.isBuffered(t,r+.1)&&(e=this.getAppendedFrag(r+.1)),e){var i=this.fragPlaying,n=e.level;i&&e.sn===i.sn&&i.level===n&&e.urlId===i.urlId||(this.hls.trigger(a.a.FRAG_CHANGED,{frag:e}),i&&i.level===n||this.hls.trigger(a.a.LEVEL_SWITCHED,{level:n}),this.fragPlaying=e)}}},l=i,(h=[{key:"nextLevel",get:function(){var t=this.nextBufferedFrag;return t?t.level:-1}},{key:"currentLevel",get:function(){var t=this.media;if(t){var e=this.getAppendedFrag(t.currentTime);if(e)return e.level}return-1}},{key:"nextBufferedFrag",get:function(){var t=this.media;if(t){var e=this.getAppendedFrag(t.currentTime);return this.followingBufferedFrag(e)}return null}},{key:"forceStartLoad",get:function(){return this._forceStartLoad}}])&&ee(l.prototype,h),d&&ee(l,d),i}(Yt),ne=function(){function t(t,e,r){void 0===e&&(e=0),void 0===r&&(r=0),this.halfLife=void 0,this.alpha_=void 0,this.estimate_=void 0,this.totalWeight_=void 0,this.halfLife=t,this.alpha_=t?Math.exp(Math.log(.5)/t):0,this.estimate_=e,this.totalWeight_=r}var e=t.prototype;return e.sample=function(t,e){var r=Math.pow(this.alpha_,t);this.estimate_=e*(1-r)+r*this.estimate_,this.totalWeight_+=t},e.getTotalWeight=function(){return this.totalWeight_},e.getEstimate=function(){if(this.alpha_){var t=1-Math.pow(this.alpha_,this.totalWeight_);if(t)return this.estimate_/t}return this.estimate_},t}(),ae=function(){function t(t,e,r){this.defaultEstimate_=void 0,this.minWeight_=void 0,this.minDelayMs_=void 0,this.slow_=void 0,this.fast_=void 0,this.defaultEstimate_=r,this.minWeight_=.001,this.minDelayMs_=50,this.slow_=new ne(t),this.fast_=new ne(e)}var e=t.prototype;return e.update=function(t,e){var r=this.slow_,i=this.fast_;this.slow_.halfLife!==t&&(this.slow_=new ne(t,r.getEstimate(),r.getTotalWeight())),this.fast_.halfLife!==e&&(this.fast_=new ne(e,i.getEstimate(),i.getTotalWeight()))},e.sample=function(t,e){var r=(t=Math.max(t,this.minDelayMs_))/1e3,i=8*e/r;this.fast_.sample(r,i),this.slow_.sample(r,i)},e.canEstimate=function(){var t=this.fast_;return t&&t.getTotalWeight()>=this.minWeight_},e.getEstimate=function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_},e.destroy=function(){},t}();function se(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var oe=function(){function t(t){this.hls=void 0,this.lastLoadedFragLevel=0,this._nextAutoLevel=-1,this.timer=void 0,this.onCheck=this._abandonRulesCheck.bind(this),this.fragCurrent=null,this.partCurrent=null,this.bitrateTestDelay=0,this.bwEstimator=void 0,this.hls=t;var e=t.config;this.bwEstimator=new ae(e.abrEwmaSlowVoD,e.abrEwmaFastVoD,e.abrEwmaDefaultEstimate),this.registerListeners()}var e,r,i,l=t.prototype;return l.registerListeners=function(){var t=this.hls;t.on(a.a.FRAG_LOADING,this.onFragLoading,this),t.on(a.a.FRAG_LOADED,this.onFragLoaded,this),t.on(a.a.FRAG_BUFFERED,this.onFragBuffered,this),t.on(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.on(a.a.ERROR,this.onError,this)},l.unregisterListeners=function(){var t=this.hls;t.off(a.a.FRAG_LOADING,this.onFragLoading,this),t.off(a.a.FRAG_LOADED,this.onFragLoaded,this),t.off(a.a.FRAG_BUFFERED,this.onFragBuffered,this),t.off(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.off(a.a.ERROR,this.onError,this)},l.destroy=function(){this.unregisterListeners(),this.clearTimer(),this.hls=this.onCheck=null,this.fragCurrent=this.partCurrent=null},l.onFragLoading=function(t,e){var r,i=e.frag;i.type===k.b.MAIN&&(this.timer||(this.fragCurrent=i,this.partCurrent=null!=(r=e.part)?r:null,this.timer=self.setInterval(this.onCheck,100)))},l.onLevelLoaded=function(t,e){var r=this.hls.config;e.details.live?this.bwEstimator.update(r.abrEwmaSlowLive,r.abrEwmaFastLive):this.bwEstimator.update(r.abrEwmaSlowVoD,r.abrEwmaFastVoD)},l._abandonRulesCheck=function(){var t=this.fragCurrent,e=this.partCurrent,r=this.hls,i=r.autoLevelEnabled,s=r.config,l=r.media;if(t&&l){var u=e?e.stats:t.stats,h=e?e.duration:t.duration;if(u.aborted)return o.b.warn("frag loader destroy or aborted, disarm abandonRules"),this.clearTimer(),void(this._nextAutoLevel=-1);if(i&&!l.paused&&l.playbackRate&&l.readyState){var d=performance.now()-u.loading.start,c=Math.abs(l.playbackRate);if(!(d<=500*h/c)){var f=r.levels,g=r.minAutoLevel,v=f[t.level],p=u.total||Math.max(u.loaded,Math.round(h*v.maxBitrate/8)),m=Math.max(1,u.bwEstimate?u.bwEstimate/8:1e3*u.loaded/d),y=(p-u.loaded)/m,T=l.currentTime,b=(lt.bufferInfo(l,T,s.maxBufferHole).end-T)/c;if(!(b>=2*h/c||y<=b)){var E,S=Number.POSITIVE_INFINITY;for(E=t.level-1;E>g;E--){if((S=h*f[E].maxBitrate/(6.4*m))<b)break}if(!(S>=y)){var L=this.bwEstimator.getEstimate();o.b.warn("Fragment "+t.sn+(e?" part "+e.index:"")+" of level "+t.level+" is loading too slowly and will cause an underbuffer; aborting and switching to level "+E+"\n Current BW estimate: "+(Object(n.a)(L)?(L/1024).toFixed(3):"Unknown")+" Kb/s\n Estimated load time for current fragment: "+y.toFixed(3)+" s\n Estimated load time for the next fragment: "+S.toFixed(3)+" s\n Time to underbuffer: "+b.toFixed(3)+" s"),r.nextLoadLevel=E,this.bwEstimator.sample(d,u.loaded),this.clearTimer(),t.loader&&(this.fragCurrent=this.partCurrent=null,t.loader.abort()),r.trigger(a.a.FRAG_LOAD_EMERGENCY_ABORTED,{frag:t,part:e,stats:u})}}}}}},l.onFragLoaded=function(t,e){var r=e.frag,i=e.part;if(r.type===k.b.MAIN&&Object(n.a)(r.sn)){var s=i?i.stats:r.stats,o=i?i.duration:r.duration;if(this.clearTimer(),this.lastLoadedFragLevel=r.level,this._nextAutoLevel=-1,this.hls.config.abrMaxWithRealBitrate){var l=this.hls.levels[r.level],u=(l.loaded?l.loaded.bytes:0)+s.loaded,h=(l.loaded?l.loaded.duration:0)+o;l.loaded={bytes:u,duration:h},l.realBitrate=Math.round(8*u/h)}if(r.bitrateTest){var d={stats:s,frag:r,part:i,id:r.type};this.onFragBuffered(a.a.FRAG_BUFFERED,d),r.bitrateTest=!1}}},l.onFragBuffered=function(t,e){var r=e.frag,i=e.part,n=i?i.stats:r.stats;if(!n.aborted&&r.type===k.b.MAIN&&"initSegment"!==r.sn){var a=n.parsing.end-n.loading.start;this.bwEstimator.sample(a,n.loaded),n.bwEstimate=this.bwEstimator.getEstimate(),r.bitrateTest?this.bitrateTestDelay=a/1e3:this.bitrateTestDelay=0}},l.onError=function(t,e){switch(e.details){case s.a.FRAG_LOAD_ERROR:case s.a.FRAG_LOAD_TIMEOUT:this.clearTimer()}},l.clearTimer=function(){self.clearInterval(this.timer),this.timer=void 0},l.getNextABRAutoLevel=function(){var t=this.fragCurrent,e=this.partCurrent,r=this.hls,i=r.maxAutoLevel,n=r.config,a=r.minAutoLevel,s=r.media,l=e?e.duration:t?t.duration:0,u=s?s.currentTime:0,h=s&&0!==s.playbackRate?Math.abs(s.playbackRate):1,d=this.bwEstimator?this.bwEstimator.getEstimate():n.abrEwmaDefaultEstimate,c=(lt.bufferInfo(s,u,n.maxBufferHole).end-u)/h,f=this.findBestLevel(d,a,i,c,n.abrBandWidthFactor,n.abrBandWidthUpFactor);if(f>=0)return f;o.b.trace((c?"rebuffering expected":"buffer is empty")+", finding optimal quality level");var g=l?Math.min(l,n.maxStarvationDelay):n.maxStarvationDelay,v=n.abrBandWidthFactor,p=n.abrBandWidthUpFactor;if(!c){var m=this.bitrateTestDelay;if(m)g=(l?Math.min(l,n.maxLoadingDelay):n.maxLoadingDelay)-m,o.b.trace("bitrate test took "+Math.round(1e3*m)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*g)+" ms"),v=p=1}return f=this.findBestLevel(d,a,i,c+g,v,p),Math.max(f,0)},l.findBestLevel=function(t,e,r,i,n,a){for(var s,l=this.fragCurrent,u=this.partCurrent,h=this.lastLoadedFragLevel,d=this.hls.levels,c=d[h],f=!(null==c||null===(s=c.details)||void 0===s||!s.live),g=null==c?void 0:c.codecSet,v=u?u.duration:l?l.duration:0,p=r;p>=e;p--){var m=d[p];if(m&&(!g||m.codecSet===g)){var y=m.details,T=(u?null==y?void 0:y.partTarget:null==y?void 0:y.averagetargetduration)||v,b=void 0;b=p<=h?n*t:a*t;var E=d[p].maxBitrate,S=E*T/b;if(o.b.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+p+"/"+Math.round(b)+"/"+E+"/"+T+"/"+i+"/"+S),b>E&&(!S||f&&!this.bitrateTestDelay||S<i))return p}}return-1},e=t,(r=[{key:"nextAutoLevel",get:function(){var t=this._nextAutoLevel,e=this.bwEstimator;if(!(-1===t||e&&e.canEstimate()))return t;var r=this.getNextABRAutoLevel();return-1!==t&&(r=Math.min(t,r)),r},set:function(t){this._nextAutoLevel=t}}])&&se(e.prototype,r),i&&se(e,i),t}(),le=r(13);function ue(){return(ue=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t}).apply(this,arguments)}function he(t,e){return(he=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var de=function(t){var e,r;function i(e,r){var i;return(i=t.call(this,e,r,"[audio-stream-controller]")||this).videoBuffer=null,i.videoTrackCC=-1,i.waitingVideoCC=-1,i.audioSwitch=!1,i.trackId=-1,i.waitingData=null,i.mainDetails=null,i.bufferFlushed=!1,i._registerListeners(),i}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,he(e,r);var l=i.prototype;return l.onHandlerDestroying=function(){this._unregisterListeners(),this.mainDetails=null},l._registerListeners=function(){var t=this.hls;t.on(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.on(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.on(a.a.AUDIO_TRACKS_UPDATED,this.onAudioTracksUpdated,this),t.on(a.a.AUDIO_TRACK_SWITCHING,this.onAudioTrackSwitching,this),t.on(a.a.AUDIO_TRACK_LOADED,this.onAudioTrackLoaded,this),t.on(a.a.ERROR,this.onError,this),t.on(a.a.BUFFER_RESET,this.onBufferReset,this),t.on(a.a.BUFFER_CREATED,this.onBufferCreated,this),t.on(a.a.BUFFER_FLUSHED,this.onBufferFlushed,this),t.on(a.a.INIT_PTS_FOUND,this.onInitPtsFound,this),t.on(a.a.FRAG_BUFFERED,this.onFragBuffered,this)},l._unregisterListeners=function(){var t=this.hls;t.off(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.off(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.off(a.a.AUDIO_TRACKS_UPDATED,this.onAudioTracksUpdated,this),t.off(a.a.AUDIO_TRACK_SWITCHING,this.onAudioTrackSwitching,this),t.off(a.a.AUDIO_TRACK_LOADED,this.onAudioTrackLoaded,this),t.off(a.a.ERROR,this.onError,this),t.off(a.a.BUFFER_RESET,this.onBufferReset,this),t.off(a.a.BUFFER_CREATED,this.onBufferCreated,this),t.off(a.a.BUFFER_FLUSHED,this.onBufferFlushed,this),t.off(a.a.INIT_PTS_FOUND,this.onInitPtsFound,this),t.off(a.a.FRAG_BUFFERED,this.onFragBuffered,this)},l.onInitPtsFound=function(t,e){var r=e.frag,i=e.id,n=e.initPTS;if("main"===i){var a=r.cc;this.initPTS[r.cc]=n,this.log("InitPTS for cc: "+a+" found from main: "+n),this.videoTrackCC=a,this.state===Vt&&this.tick()}},l.startLoad=function(t){if(!this.levels)return this.startPosition=t,void(this.state=xt);var e=this.lastCurrentTime;this.stopLoad(),this.setInterval(100),this.fragLoadError=0,e>0&&-1===t?(this.log("Override startPosition with lastCurrentTime @"+e.toFixed(3)),this.state=Pt):(this.loadedmetadata=!1,this.state=Ut),this.nextLoadPosition=this.startPosition=this.lastCurrentTime=t,this.tick()},l.doTick=function(){switch(this.state){case Pt:this.doTickIdle();break;case Ut:var e,r=this.levels,i=this.trackId,n=null==r||null===(e=r[i])||void 0===e?void 0:e.details;if(n){if(this.waitForCdnTuneIn(n))break;this.state=Vt}break;case Nt:var a,s=performance.now(),l=this.retryDate;(!l||s>=l||null!==(a=this.media)&&void 0!==a&&a.seeking)&&(this.log("RetryDate reached, switch back to IDLE state"),this.state=Pt);break;case Vt:var u=this.waitingData;if(u){var h=u.frag,d=u.part,c=u.cache,f=u.complete;if(void 0!==this.initPTS[h.cc]){this.waitingData=null,this.waitingVideoCC=-1,this.state=Ft;var g={frag:h,part:d,payload:c.flush(),networkDetails:null};this._handleFragmentLoadProgress(g),f&&t.prototype._handleFragmentLoadComplete.call(this,g)}else if(this.videoTrackCC!==this.waitingVideoCC)o.b.log("Waiting fragment cc ("+h.cc+") cancelled because video is at cc "+this.videoTrackCC),this.clearWaitingFragment();else{var v=this.getLoadPosition(),p=lt.bufferInfo(this.mediaBuffer,v,this.config.maxBufferHole);yt(p.end,this.config.maxFragLookUpTolerance,h)<0&&(o.b.log("Waiting fragment cc ("+h.cc+") @ "+h.start+" cancelled because another fragment at "+p.end+" is needed"),this.clearWaitingFragment())}}else this.state=Pt}this.onTickEnd()},l.clearWaitingFragment=function(){var t=this.waitingData;t&&(this.fragmentTracker.removeFragment(t.frag),this.waitingData=null,this.waitingVideoCC=-1,this.state=Pt)},l.onTickEnd=function(){var t=this.media;if(t&&t.readyState){var e=(this.mediaBuffer?this.mediaBuffer:t).buffered;!this.loadedmetadata&&e.length&&(this.loadedmetadata=!0),this.lastCurrentTime=t.currentTime}},l.doTickIdle=function(){var t,e,r=this.hls,i=this.levels,n=this.media,s=this.trackId,o=r.config;if(i&&i[s]&&(n||!this.startFragRequested&&o.startFragPrefetch)){var l=i[s].details;if(!l||l.live&&this.levelLastLoaded!==s||this.waitForCdnTuneIn(l))this.state=Ut;else{this.bufferFlushed&&(this.bufferFlushed=!1,this.afterBufferFlushed(this.mediaBuffer?this.mediaBuffer:this.media,u.a.AUDIO,k.b.AUDIO));var h=this.getFwdBufferInfo(this.mediaBuffer?this.mediaBuffer:this.media,k.b.AUDIO);if(null!==h){var d=h.len,c=this.getMaxBufferLength(),f=this.audioSwitch;if(!(d>=c)||f){if(!f&&this._streamEnded(h,l))return r.trigger(a.a.BUFFER_EOS,{type:"audio"}),void(this.state=jt);var g=l.fragments[0].start,v=h.end;if(f){var p=this.getLoadPosition();v=p,l.PTSKnown&&p<g&&(h.end>g||h.nextStart)&&(this.log("Alt audio track ahead of main track, seek to start of alt audio track"),n.currentTime=g+.05)}var m=this.getNextFragment(v,l);m?"identity"!==(null===(t=m.decryptdata)||void 0===t?void 0:t.keyFormat)||null!==(e=m.decryptdata)&&void 0!==e&&e.key?this.loadFragment(m,l,v):this.loadKey(m,l):this.bufferFlushed=!0}}}}},l.getMaxBufferLength=function(){var e=t.prototype.getMaxBufferLength.call(this),r=this.getFwdBufferInfo(this.videoBuffer?this.videoBuffer:this.media,k.b.MAIN);return null===r?e:Math.max(e,r.len)},l.onMediaDetaching=function(){this.videoBuffer=null,t.prototype.onMediaDetaching.call(this)},l.onAudioTracksUpdated=function(t,e){var r=e.audioTracks;this.resetTransmuxer(),this.levels=r.map((function(t){return new j(t)}))},l.onAudioTrackSwitching=function(t,e){var r=!!e.url;this.trackId=e.id;var i=this.fragCurrent;null!=i&&i.loader&&i.loader.abort(),this.fragCurrent=null,this.clearWaitingFragment(),r?this.setInterval(100):this.resetTransmuxer(),r?(this.audioSwitch=!0,this.state=Pt):this.state=xt,this.tick()},l.onManifestLoading=function(){this.mainDetails=null,this.fragmentTracker.removeAllFragments(),this.startPosition=this.lastCurrentTime=0,this.bufferFlushed=!1},l.onLevelLoaded=function(t,e){this.mainDetails=e.details},l.onAudioTrackLoaded=function(t,e){var r,i=this.levels,n=e.details,a=e.id;if(i){this.log("Track "+a+" loaded ["+n.startSN+","+n.endSN+"],duration:"+n.totalduration);var s=i[a],o=0;if(n.live||null!==(r=s.details)&&void 0!==r&&r.live){var l=this.mainDetails;if(n.fragments[0]||(n.deltaUpdateFailed=!0),n.deltaUpdateFailed||!l)return;!s.details&&n.hasProgramDateTime&&l.hasProgramDateTime?(gt(n,l),o=n.fragments[0].start):o=this.alignPlaylists(n,s.details)}s.details=n,this.levelLastLoaded=a,this.startFragRequested||!this.mainDetails&&n.live||this.setStartPosition(s.details,o),this.state!==Ut||this.waitForCdnTuneIn(n)||(this.state=Pt),this.tick()}else this.warn("Audio tracks were reset while loading level "+a)},l._handleFragmentLoadProgress=function(t){var e,r=t.frag,i=t.part,n=t.payload,a=this.config,s=this.trackId,l=this.levels;if(l){var u=l[s],h=u.details,d=a.defaultAudioCodec||u.audioCodec||"mp4a.40.2",c=this.transmuxer;c||(c=this.transmuxer=new Zt(this.hls,k.b.AUDIO,this._handleTransmuxComplete.bind(this),this._handleTransmuxerFlush.bind(this)));var f=this.initPTS[r.cc],g=null===(e=r.initSegment)||void 0===e?void 0:e.data;if(void 0!==f){var v=i?i.index:-1,p=-1!==v,m=new ut(r.level,r.sn,r.stats.chunkCount,n.byteLength,v,p);c.push(n,g,d,"",r,i,h.totalduration,!1,m,f)}else{o.b.log("Unknown video PTS for cc "+r.cc+", waiting for video PTS before demuxing audio frag "+r.sn+" of ["+h.startSN+" ,"+h.endSN+"],track "+s),(this.waitingData=this.waitingData||{frag:r,part:i,cache:new le.a,complete:!1}).cache.push(new Uint8Array(n)),this.waitingVideoCC=this.videoTrackCC,this.state=Vt}}else this.warn("Audio tracks were reset while fragment load was in progress. Fragment "+r.sn+" of level "+r.level+" will not be buffered")},l._handleFragmentLoadComplete=function(e){this.waitingData?this.waitingData.complete=!0:t.prototype._handleFragmentLoadComplete.call(this,e)},l.onBufferReset=function(){this.mediaBuffer=this.videoBuffer=null,this.loadedmetadata=!1},l.onBufferCreated=function(t,e){var r=e.tracks.audio;r&&(this.mediaBuffer=r.buffer),e.tracks.video&&(this.videoBuffer=e.tracks.video.buffer)},l.onFragBuffered=function(t,e){var r=e.frag,i=e.part;r.type===k.b.AUDIO&&(this.fragContextChanged(r)?this.warn("Fragment "+r.sn+(i?" p: "+i.index:"")+" of level "+r.level+" finished buffering, but was aborted. state: "+this.state+", audioSwitch: "+this.audioSwitch):("initSegment"!==r.sn&&(this.fragPrevious=r,this.audioSwitch&&(this.audioSwitch=!1,this.hls.trigger(a.a.AUDIO_TRACK_SWITCHED,{id:this.trackId}))),this.fragBufferedComplete(r,i)))},l.onError=function(e,r){switch(r.details){case s.a.FRAG_LOAD_ERROR:case s.a.FRAG_LOAD_TIMEOUT:case s.a.KEY_LOAD_ERROR:case s.a.KEY_LOAD_TIMEOUT:this.onFragmentOrKeyLoadError(k.b.AUDIO,r);break;case s.a.AUDIO_TRACK_LOAD_ERROR:case s.a.AUDIO_TRACK_LOAD_TIMEOUT:this.state!==Ht&&this.state!==xt&&(this.state=r.fatal?Ht:Pt,this.warn(r.details+" while loading frag, switching to "+this.state+" state"));break;case s.a.BUFFER_FULL_ERROR:if("audio"===r.parent&&(this.state===Bt||this.state===Gt)){var i=!0,n=this.getFwdBufferInfo(this.mediaBuffer,k.b.AUDIO);n&&n.len>.5&&(i=!this.reduceMaxBufferLength(n.len)),i&&(this.warn("Buffer full error also media.currentTime is not buffered, flush audio buffer"),this.fragCurrent=null,t.prototype.flushMainBuffer.call(this,0,Number.POSITIVE_INFINITY,"audio")),this.resetLoadingState()}}},l.onBufferFlushed=function(t,e){e.type===u.a.AUDIO&&(this.bufferFlushed=!0)},l._handleTransmuxComplete=function(t){var e,r="audio",i=this.hls,n=t.remuxResult,s=t.chunkMeta,o=this.getCurrentContext(s);if(!o)return this.warn("The loading context changed while buffering fragment "+s.sn+" of level "+s.level+". This chunk will not be buffered."),void this.resetLiveStartWhenNotLoaded(s.level);var l=o.frag,h=o.part,d=n.audio,c=n.text,f=n.id3,g=n.initSegment;if(!this.fragContextChanged(l)){if(this.state=Bt,this.audioSwitch&&d&&this.completeAudioSwitch(),null!=g&&g.tracks&&(this._bufferInitSegment(g.tracks,l,s),i.trigger(a.a.FRAG_PARSING_INIT_SEGMENT,{frag:l,id:r,tracks:g.tracks})),d){var v=d.startPTS,p=d.endPTS,m=d.startDTS,y=d.endDTS;h&&(h.elementaryStreams[u.a.AUDIO]={startPTS:v,endPTS:p,startDTS:m,endDTS:y}),l.setElementaryStreamInfo(u.a.AUDIO,v,p,m,y),this.bufferFragmentData(d,l,h,s)}if(null!=f&&null!==(e=f.samples)&&void 0!==e&&e.length){var T=ue({frag:l,id:r},f);i.trigger(a.a.FRAG_PARSING_METADATA,T)}if(c){var b=ue({frag:l,id:r},c);i.trigger(a.a.FRAG_PARSING_USERDATA,b)}}},l._bufferInitSegment=function(t,e,r){if(this.state===Bt){t.video&&delete t.video;var i=t.audio;if(i){i.levelCodec=i.codec,i.id="audio",this.log("Init audio buffer, container:"+i.container+", codecs[parsed]=["+i.codec+"]"),this.hls.trigger(a.a.BUFFER_CODECS,t);var n=i.initSegment;if(null!=n&&n.byteLength){var s={type:"audio",frag:e,part:null,chunkMeta:r,parent:e.type,data:n};this.hls.trigger(a.a.BUFFER_APPENDING,s)}this.tick()}}},l.loadFragment=function(e,r,i){var a=this.fragmentTracker.getState(e);this.fragCurrent=e,(this.audioSwitch||a===tt.NOT_LOADED||a===tt.PARTIAL)&&("initSegment"===e.sn?this._loadInitSegment(e):r.live&&!Object(n.a)(this.initPTS[e.cc])?(this.log("Waiting for video PTS in continuity counter "+e.cc+" of live stream before loading audio fragment "+e.sn+" of level "+this.trackId),this.state=Vt):(this.startFragRequested=!0,t.prototype.loadFragment.call(this,e,r,i)))},l.completeAudioSwitch=function(){var e=this.hls,r=this.media,i=this.trackId;r&&(this.log("Switching audio track : flushing all audio"),t.prototype.flushMainBuffer.call(this,0,Number.POSITIVE_INFINITY,"audio")),this.audioSwitch=!1,e.trigger(a.a.AUDIO_TRACK_SWITCHED,{id:i})},i}(Yt);function ce(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function fe(t,e){return(fe=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var ge=function(t){var e,r;function i(e){var r;return(r=t.call(this,e,"[audio-track-controller]")||this).tracks=[],r.groupId=null,r.tracksInGroup=[],r.trackId=-1,r.trackName="",r.selectDefaultTrack=!0,r.registerListeners(),r}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,fe(e,r);var n,o,l,u=i.prototype;return u.registerListeners=function(){var t=this.hls;t.on(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.on(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.on(a.a.LEVEL_LOADING,this.onLevelLoading,this),t.on(a.a.LEVEL_SWITCHING,this.onLevelSwitching,this),t.on(a.a.AUDIO_TRACK_LOADED,this.onAudioTrackLoaded,this),t.on(a.a.ERROR,this.onError,this)},u.unregisterListeners=function(){var t=this.hls;t.off(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.off(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.off(a.a.LEVEL_LOADING,this.onLevelLoading,this),t.off(a.a.LEVEL_SWITCHING,this.onLevelSwitching,this),t.off(a.a.AUDIO_TRACK_LOADED,this.onAudioTrackLoaded,this),t.off(a.a.ERROR,this.onError,this)},u.destroy=function(){this.unregisterListeners(),this.tracks.length=0,this.tracksInGroup.length=0,t.prototype.destroy.call(this)},u.onManifestLoading=function(){this.tracks=[],this.groupId=null,this.tracksInGroup=[],this.trackId=-1,this.trackName="",this.selectDefaultTrack=!0},u.onManifestParsed=function(t,e){this.tracks=e.audioTracks||[]},u.onAudioTrackLoaded=function(t,e){var r=e.id,i=e.details,n=this.tracksInGroup[r];if(n){var a=n.details;n.details=e.details,this.log("audioTrack "+r+" loaded ["+i.startSN+"-"+i.endSN+"]"),r===this.trackId&&(this.retryCount=0,this.playlistLoaded(r,e,a))}else this.warn("Invalid audio track id "+r)},u.onLevelLoading=function(t,e){this.switchLevel(e.level)},u.onLevelSwitching=function(t,e){this.switchLevel(e.level)},u.switchLevel=function(t){var e=this.hls.levels[t];if(null!=e&&e.audioGroupIds){var r=e.audioGroupIds[e.urlId];if(this.groupId!==r){this.groupId=r;var i=this.tracks.filter((function(t){return!r||t.groupId===r}));this.selectDefaultTrack&&!i.some((function(t){return t.default}))&&(this.selectDefaultTrack=!1),this.tracksInGroup=i;var n={audioTracks:i};this.log("Updating audio tracks, "+i.length+' track(s) found in "'+r+'" group-id'),this.hls.trigger(a.a.AUDIO_TRACKS_UPDATED,n),this.selectInitialTrack()}}},u.onError=function(e,r){t.prototype.onError.call(this,e,r),!r.fatal&&r.context&&r.context.type===k.a.AUDIO_TRACK&&r.context.id===this.trackId&&r.context.groupId===this.groupId&&this.retryLoadingOrFail(r)},u.setAudioTrack=function(t){var e=this.tracksInGroup;if(t<0||t>=e.length)this.warn("Invalid id passed to audio-track controller");else{this.clearTimer();var r=e[this.trackId];this.log("Now switching to audio-track index "+t);var i=e[t],n=i.id,s=i.groupId,o=void 0===s?"":s,l=i.name,u=i.type,h=i.url;if(this.trackId=t,this.trackName=l,this.selectDefaultTrack=!1,this.hls.trigger(a.a.AUDIO_TRACK_SWITCHING,{id:n,groupId:o,name:l,type:u,url:h}),!i.details||i.details.live){var d=this.switchParams(i.url,null==r?void 0:r.details);this.loadPlaylist(d)}}},u.selectInitialTrack=function(){this.tracksInGroup;var t=this.trackName,e=this.findTrackId(t)||this.findTrackId();-1!==e?this.setAudioTrack(e):(this.warn("No track found for running audio group-ID: "+this.groupId),this.hls.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.AUDIO_TRACK_LOAD_ERROR,fatal:!0}))},u.findTrackId=function(t){for(var e=this.tracksInGroup,r=0;r<e.length;r++){var i=e[r];if((!this.selectDefaultTrack||i.default)&&(!t||t===i.name))return i.id}return-1},u.loadPlaylist=function(t){var e=this.tracksInGroup[this.trackId];if(this.shouldLoadTrack(e)){var r=e.id,i=e.groupId,n=e.url;if(t)try{n=t.addDirectives(n)}catch(t){this.warn("Could not construct new URL with HLS Delivery Directives: "+t)}this.log("loading audio-track playlist for id: "+r),this.clearTimer(),this.hls.trigger(a.a.AUDIO_TRACK_LOADING,{url:n,id:r,groupId:i,deliveryDirectives:t||null})}},n=i,(o=[{key:"audioTracks",get:function(){return this.tracksInGroup}},{key:"audioTrack",get:function(){return this.trackId},set:function(t){this.selectDefaultTrack=!1,this.setAudioTrack(t)}}])&&ce(n.prototype,o),l&&ce(n,l),i}(Q);function ve(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function pe(t,e){return(pe=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var me=function(t){var e,r;function i(e,r){var i;return(i=t.call(this,e,r,"[subtitle-stream-controller]")||this).levels=[],i.currentTrackId=-1,i.tracksBuffered=[],i.mainDetails=null,i._registerListeners(),i}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,pe(e,r);var n,s,l,u=i.prototype;return u.onHandlerDestroying=function(){this._unregisterListeners(),this.mainDetails=null},u._registerListeners=function(){var t=this.hls;t.on(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.on(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.on(a.a.ERROR,this.onError,this),t.on(a.a.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),t.on(a.a.SUBTITLE_TRACK_SWITCH,this.onSubtitleTrackSwitch,this),t.on(a.a.SUBTITLE_TRACK_LOADED,this.onSubtitleTrackLoaded,this),t.on(a.a.SUBTITLE_FRAG_PROCESSED,this.onSubtitleFragProcessed,this),t.on(a.a.BUFFER_FLUSHING,this.onBufferFlushing,this)},u._unregisterListeners=function(){var t=this.hls;t.off(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.off(a.a.LEVEL_LOADED,this.onLevelLoaded,this),t.off(a.a.ERROR,this.onError,this),t.off(a.a.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),t.off(a.a.SUBTITLE_TRACK_SWITCH,this.onSubtitleTrackSwitch,this),t.off(a.a.SUBTITLE_TRACK_LOADED,this.onSubtitleTrackLoaded,this),t.off(a.a.SUBTITLE_FRAG_PROCESSED,this.onSubtitleFragProcessed,this),t.off(a.a.BUFFER_FLUSHING,this.onBufferFlushing,this)},u.startLoad=function(){this.stopLoad(),this.state=Pt,this.setInterval(500),this.tick()},u.onManifestLoading=function(){this.mainDetails=null,this.fragmentTracker.removeAllFragments()},u.onLevelLoaded=function(t,e){this.mainDetails=e.details},u.onSubtitleFragProcessed=function(t,e){var r=e.frag,i=e.success;if(this.fragPrevious=r,this.state=Pt,i){var n=this.tracksBuffered[this.currentTrackId];if(n){for(var a,s=r.start,o=0;o<n.length;o++)if(s>=n[o].start&&s<=n[o].end){a=n[o];break}var l=r.start+r.duration;a?a.end=l:(a={start:s,end:l},n.push(a)),this.fragmentTracker.fragBuffered(r)}}},u.onBufferFlushing=function(t,e){var r=e.startOffset,i=e.endOffset;if(0===r&&i!==Number.POSITIVE_INFINITY){var n=this.currentTrackId,a=this.levels;if(!a.length||!a[n]||!a[n].details)return;var s=i-a[n].details.targetduration;if(s<=0)return;e.endOffsetSubtitles=Math.max(0,s),this.tracksBuffered.forEach((function(t){for(var e=0;e<t.length;)if(t[e].end<=s)t.shift();else{if(!(t[e].start<s))break;t[e].start=s,e++}})),this.fragmentTracker.removeFragmentsInRange(r,s,k.b.SUBTITLE)}},u.onError=function(t,e){var r,i=e.frag;i&&i.type===k.b.SUBTITLE&&(null!==(r=this.fragCurrent)&&void 0!==r&&r.loader&&this.fragCurrent.loader.abort(),this.state=Pt)},u.onSubtitleTracksUpdated=function(t,e){var r=this,i=e.subtitleTracks;this.tracksBuffered=[],this.levels=i.map((function(t){return new j(t)})),this.fragmentTracker.removeAllFragments(),this.fragPrevious=null,this.levels.forEach((function(t){r.tracksBuffered[t.id]=[]})),this.mediaBuffer=null},u.onSubtitleTrackSwitch=function(t,e){if(this.currentTrackId=e.id,this.levels.length&&-1!==this.currentTrackId){var r=this.levels[this.currentTrackId];null!=r&&r.details?(this.mediaBuffer=this.mediaBufferTimeRanges,this.setInterval(500)):this.mediaBuffer=null}else this.clearInterval()},u.onSubtitleTrackLoaded=function(t,e){var r,i=e.details,n=e.id,a=this.currentTrackId,s=this.levels;if(s.length){var o=s[a];if(!(n>=s.length||n!==a)&&o){if(this.mediaBuffer=this.mediaBufferTimeRanges,i.live||null!==(r=o.details)&&void 0!==r&&r.live){var l=this.mainDetails;if(i.deltaUpdateFailed||!l)return;var u=l.fragments[0];if(o.details)0===this.alignPlaylists(i,o.details)&&u&&z(i,u.start);else i.hasProgramDateTime&&l.hasProgramDateTime?gt(i,l):u&&z(i,u.start)}if(o.details=i,this.levelLastLoaded=n,this.tick(),i.live&&!this.fragCurrent&&this.media&&this.state===Pt)mt(null,i.fragments,this.media.currentTime,0)||(this.warn("Subtitle playlist not aligned with playback"),o.details=void 0)}}},u._handleFragmentLoadComplete=function(t){var e=t.frag,r=t.payload,i=e.decryptdata,n=this.hls;if(!this.fragContextChanged(e)&&r&&r.byteLength>0&&i&&i.key&&i.iv&&"AES-128"===i.method){var s=performance.now();this.decrypter.webCryptoDecrypt(new Uint8Array(r),i.key.buffer,i.iv.buffer).then((function(t){var r=performance.now();n.trigger(a.a.FRAG_DECRYPTED,{frag:e,payload:t,stats:{tstart:s,tdecrypt:r}})}))}},u.doTick=function(){if(this.media){if(this.state===Pt){var t,e=this.currentTrackId,r=this.levels;if(!r.length||!r[e]||!r[e].details)return;var i=r[e].details,n=i.targetduration,s=this.config,l=this.media,u=lt.bufferedInfo(this.mediaBufferTimeRanges,l.currentTime-n,s.maxBufferHole),h=u.end;if(u.len>this.getMaxBufferLength()+n)return;var d,c=i.fragments,f=c.length,g=i.edge,v=this.fragPrevious;if(h<g){var p=s.maxFragLookUpTolerance;v&&i.hasProgramDateTime&&(d=pt(c,v.endProgramDateTime,p)),d||!(d=mt(v,c,h,p))&&v&&v.start<c[0].start&&(d=c[0])}else d=c[f-1];null!==(t=d)&&void 0!==t&&t.encrypted?(o.b.log("Loading key for "+d.sn),this.state=Mt,this.hls.trigger(a.a.KEY_LOADING,{frag:d})):d&&this.fragmentTracker.getState(d)===tt.NOT_LOADED&&this.loadFragment(d,i,h)}}else this.state=Pt},u.loadFragment=function(e,r,i){this.fragCurrent=e,t.prototype.loadFragment.call(this,e,r,i)},n=i,(s=[{key:"mediaBufferTimeRanges",get:function(){return this.tracksBuffered[this.currentTrackId]||[]}}])&&ve(n.prototype,s),l&&ve(n,l),i}(Yt);function ye(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function Te(t,e){return(Te=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function be(t){for(var e=[],r=0;r<t.length;r++){var i=t[r];"subtitles"===i.kind&&i.label&&e.push(t[r])}return e}var Ee,Se=function(t){var e,r;function i(e){var r;return(r=t.call(this,e,"[subtitle-track-controller]")||this).media=null,r.tracks=[],r.groupId=null,r.tracksInGroup=[],r.trackId=-1,r.selectDefaultTrack=!0,r.queuedDefaultTrack=-1,r.trackChangeListener=function(){return r.onTextTracksChanged()},r.asyncPollTrackChange=function(){return r.pollTrackChange(0)},r.useTextTrackPolling=!1,r.subtitlePollingInterval=-1,r.subtitleDisplay=!0,r.registerListeners(),r}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,Te(e,r);var n,s,o,l=i.prototype;return l.destroy=function(){this.unregisterListeners(),this.tracks.length=0,this.tracksInGroup.length=0,this.trackChangeListener=this.asyncPollTrackChange=null,t.prototype.destroy.call(this)},l.registerListeners=function(){var t=this.hls;t.on(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.on(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.on(a.a.LEVEL_LOADING,this.onLevelLoading,this),t.on(a.a.LEVEL_SWITCHING,this.onLevelSwitching,this),t.on(a.a.SUBTITLE_TRACK_LOADED,this.onSubtitleTrackLoaded,this),t.on(a.a.ERROR,this.onError,this)},l.unregisterListeners=function(){var t=this.hls;t.off(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.off(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.off(a.a.LEVEL_LOADING,this.onLevelLoading,this),t.off(a.a.LEVEL_SWITCHING,this.onLevelSwitching,this),t.off(a.a.SUBTITLE_TRACK_LOADED,this.onSubtitleTrackLoaded,this),t.off(a.a.ERROR,this.onError,this)},l.onMediaAttached=function(t,e){this.media=e.media,this.media&&(this.queuedDefaultTrack>-1&&(this.subtitleTrack=this.queuedDefaultTrack,this.queuedDefaultTrack=-1),this.useTextTrackPolling=!(this.media.textTracks&&"onchange"in this.media.textTracks),this.useTextTrackPolling?this.pollTrackChange(500):this.media.textTracks.addEventListener("change",this.asyncPollTrackChange))},l.pollTrackChange=function(t){self.clearInterval(this.subtitlePollingInterval),this.subtitlePollingInterval=self.setInterval(this.trackChangeListener,t)},l.onMediaDetaching=function(){this.media&&(self.clearInterval(this.subtitlePollingInterval),this.useTextTrackPolling||this.media.textTracks.removeEventListener("change",this.asyncPollTrackChange),this.trackId>-1&&(this.queuedDefaultTrack=this.trackId),be(this.media.textTracks).forEach((function(t){x(t)})),this.subtitleTrack=-1,this.media=null)},l.onManifestLoading=function(){this.tracks=[],this.groupId=null,this.tracksInGroup=[],this.trackId=-1,this.selectDefaultTrack=!0},l.onManifestParsed=function(t,e){this.tracks=e.subtitleTracks},l.onSubtitleTrackLoaded=function(t,e){var r=e.id,i=e.details,n=this.trackId,a=this.tracksInGroup[n];if(a){var s=a.details;a.details=e.details,this.log("subtitle track "+r+" loaded ["+i.startSN+"-"+i.endSN+"]"),r===this.trackId&&(this.retryCount=0,this.playlistLoaded(r,e,s))}else this.warn("Invalid subtitle track id "+r)},l.onLevelLoading=function(t,e){this.switchLevel(e.level)},l.onLevelSwitching=function(t,e){this.switchLevel(e.level)},l.switchLevel=function(t){var e=this.hls.levels[t];if(null!=e&&e.textGroupIds){var r=e.textGroupIds[e.urlId];if(this.groupId!==r){var i=this.tracksInGroup?this.tracksInGroup[this.trackId]:void 0,n=this.tracks.filter((function(t){return!r||t.groupId===r}));this.tracksInGroup=n;var s=this.findTrackId(null==i?void 0:i.name)||this.findTrackId();this.groupId=r;var o={subtitleTracks:n};this.log("Updating subtitle tracks, "+n.length+' track(s) found in "'+r+'" group-id'),this.hls.trigger(a.a.SUBTITLE_TRACKS_UPDATED,o),-1!==s&&this.setSubtitleTrack(s,i)}}},l.findTrackId=function(t){for(var e=this.tracksInGroup,r=0;r<e.length;r++){var i=e[r];if((!this.selectDefaultTrack||i.default)&&(!t||t===i.name))return i.id}return-1},l.onError=function(e,r){t.prototype.onError.call(this,e,r),!r.fatal&&r.context&&r.context.type===k.a.SUBTITLE_TRACK&&r.context.id===this.trackId&&r.context.groupId===this.groupId&&this.retryLoadingOrFail(r)},l.loadPlaylist=function(t){var e=this.tracksInGroup[this.trackId];if(this.shouldLoadTrack(e)){var r=e.id,i=e.groupId,n=e.url;if(t)try{n=t.addDirectives(n)}catch(t){this.warn("Could not construct new URL with HLS Delivery Directives: "+t)}this.log("Loading subtitle playlist for id "+r),this.hls.trigger(a.a.SUBTITLE_TRACK_LOADING,{url:n,id:r,groupId:i,deliveryDirectives:t||null})}},l.toggleTrackModes=function(t){var e=this,r=this.media,i=this.subtitleDisplay,n=this.trackId;if(r){var a=be(r.textTracks),s=a.filter((function(t){return t.groupId===e.groupId}));if(-1===t)[].slice.call(a).forEach((function(t){t.mode="disabled"}));else{var o=s[n];o&&(o.mode="disabled")}var l=s[t];l&&(l.mode=i?"showing":"hidden")}},l.setSubtitleTrack=function(t,e){var r,i=this.tracksInGroup;if(this.media){if(this.trackId!==t&&this.toggleTrackModes(t),!(this.trackId===t&&(-1===t||null!==(r=i[t])&&void 0!==r&&r.details)||t<-1||t>=i.length)){this.clearTimer();var n=i[t];if(this.log("Switching to subtitle track "+t),this.trackId=t,n){var s=n.id,o=n.groupId,l=void 0===o?"":o,u=n.name,h=n.type,d=n.url;this.hls.trigger(a.a.SUBTITLE_TRACK_SWITCH,{id:s,groupId:l,name:u,type:h,url:d});var c=this.switchParams(n.url,null==e?void 0:e.details);this.loadPlaylist(c)}else this.hls.trigger(a.a.SUBTITLE_TRACK_SWITCH,{id:t})}}else this.queuedDefaultTrack=t},l.onTextTracksChanged=function(){if(this.useTextTrackPolling||self.clearInterval(this.subtitlePollingInterval),this.media&&this.hls.config.renderTextTracksNatively){for(var t=-1,e=be(this.media.textTracks),r=0;r<e.length;r++)if("hidden"===e[r].mode)t=r;else if("showing"===e[r].mode){t=r;break}this.subtitleTrack!==t&&(this.subtitleTrack=t)}},n=i,(s=[{key:"subtitleTracks",get:function(){return this.tracksInGroup}},{key:"subtitleTrack",get:function(){return this.trackId},set:function(t){this.selectDefaultTrack=!1;var e=this.tracksInGroup?this.tracksInGroup[this.trackId]:void 0;this.setSubtitleTrack(t,e)}}])&&ye(n.prototype,s),o&&ye(n,o),i}(Q),Le=function(){function t(t){this.buffers=void 0,this.queues={video:[],audio:[],audiovideo:[]},this.buffers=t}var e=t.prototype;return e.append=function(t,e){var r=this.queues[e];r.push(t),1===r.length&&this.buffers[e]&&this.executeNext(e)},e.insertAbort=function(t,e){this.queues[e].unshift(t),this.executeNext(e)},e.appendBlocker=function(t){var e,r=new Promise((function(t){e=t})),i={execute:e,onStart:function(){},onComplete:function(){},onError:function(){}};return this.append(i,t),r},e.executeNext=function(t){var e=this.buffers,r=this.queues,i=e[t],n=r[t];if(n.length){var a=n[0];try{a.execute()}catch(e){o.b.warn("[buffer-operation-queue]: Unhandled exception executing the current operation"),a.onError(e),i&&i.updating||(n.shift(),this.executeNext(t))}}},e.shiftAndExecuteNext=function(t){this.queues[t].shift(),this.executeNext(t)},e.current=function(t){return this.queues[t][0]},t}(),Ae=qt(),Re=/([ha]vc.)(?:\.[^.,]+)+/,De=function(){function t(t){var e=this;this.details=null,this._objectUrl=null,this.operationQueue=void 0,this.listeners=void 0,this.hls=void 0,this.bufferCodecEventsExpected=0,this._bufferCodecEventsTotal=0,this.media=null,this.mediaSource=null,this.appendError=0,this.tracks={},this.pendingTracks={},this.sourceBuffer=void 0,this._onMediaSourceOpen=function(){var t=e.hls,r=e.media,i=e.mediaSource;o.b.log("[buffer-controller]: Media source opened"),r&&(e.updateMediaElementDuration(),t.trigger(a.a.MEDIA_ATTACHED,{media:r})),i&&i.removeEventListener("sourceopen",e._onMediaSourceOpen),e.checkPendingTracks()},this._onMediaSourceClose=function(){o.b.log("[buffer-controller]: Media source closed")},this._onMediaSourceEnded=function(){o.b.log("[buffer-controller]: Media source ended")},this.hls=t,this._initSourceBuffer(),this.registerListeners()}var e=t.prototype;return e.hasSourceTypes=function(){return this.getSourceBufferTypes().length>0||Object.keys(this.pendingTracks).length>0},e.destroy=function(){this.unregisterListeners(),this.details=null},e.registerListeners=function(){var t=this.hls;t.on(a.a.MEDIA_ATTACHING,this.onMediaAttaching,this),t.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.on(a.a.BUFFER_RESET,this.onBufferReset,this),t.on(a.a.BUFFER_APPENDING,this.onBufferAppending,this),t.on(a.a.BUFFER_CODECS,this.onBufferCodecs,this),t.on(a.a.BUFFER_EOS,this.onBufferEos,this),t.on(a.a.BUFFER_FLUSHING,this.onBufferFlushing,this),t.on(a.a.LEVEL_UPDATED,this.onLevelUpdated,this),t.on(a.a.FRAG_PARSED,this.onFragParsed,this),t.on(a.a.FRAG_CHANGED,this.onFragChanged,this)},e.unregisterListeners=function(){var t=this.hls;t.off(a.a.MEDIA_ATTACHING,this.onMediaAttaching,this),t.off(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.off(a.a.BUFFER_RESET,this.onBufferReset,this),t.off(a.a.BUFFER_APPENDING,this.onBufferAppending,this),t.off(a.a.BUFFER_CODECS,this.onBufferCodecs,this),t.off(a.a.BUFFER_EOS,this.onBufferEos,this),t.off(a.a.BUFFER_FLUSHING,this.onBufferFlushing,this),t.off(a.a.LEVEL_UPDATED,this.onLevelUpdated,this),t.off(a.a.FRAG_PARSED,this.onFragParsed,this),t.off(a.a.FRAG_CHANGED,this.onFragChanged,this)},e._initSourceBuffer=function(){this.sourceBuffer={},this.operationQueue=new Le(this.sourceBuffer),this.listeners={audio:[],video:[],audiovideo:[]}},e.onManifestParsed=function(t,e){var r=2;(e.audio&&!e.video||!e.altAudio)&&(r=1),this.bufferCodecEventsExpected=this._bufferCodecEventsTotal=r,this.details=null,o.b.log(this.bufferCodecEventsExpected+" bufferCodec event(s) expected")},e.onMediaAttaching=function(t,e){var r=this.media=e.media;if(r&&Ae){var i=this.mediaSource=new Ae;i.addEventListener("sourceopen",this._onMediaSourceOpen),i.addEventListener("sourceended",this._onMediaSourceEnded),i.addEventListener("sourceclose",this._onMediaSourceClose),r.src=self.URL.createObjectURL(i),this._objectUrl=r.src}},e.onMediaDetaching=function(){var t=this.media,e=this.mediaSource,r=this._objectUrl;if(e){if(o.b.log("[buffer-controller]: media source detaching"),"open"===e.readyState)try{e.endOfStream()}catch(t){o.b.warn("[buffer-controller]: onMediaDetaching: "+t.message+" while calling endOfStream")}this.onBufferReset(),e.removeEventListener("sourceopen",this._onMediaSourceOpen),e.removeEventListener("sourceended",this._onMediaSourceEnded),e.removeEventListener("sourceclose",this._onMediaSourceClose),t&&(r&&self.URL.revokeObjectURL(r),t.src===r?(t.removeAttribute("src"),t.load()):o.b.warn("[buffer-controller]: media.src was changed by a third party - skip cleanup")),this.mediaSource=null,this.media=null,this._objectUrl=null,this.bufferCodecEventsExpected=this._bufferCodecEventsTotal,this.pendingTracks={},this.tracks={}}this.hls.trigger(a.a.MEDIA_DETACHED,void 0)},e.onBufferReset=function(){var t=this;this.getSourceBufferTypes().forEach((function(e){var r=t.sourceBuffer[e];try{r&&(t.removeBufferListeners(e),t.mediaSource&&t.mediaSource.removeSourceBuffer(r),t.sourceBuffer[e]=void 0)}catch(t){o.b.warn("[buffer-controller]: Failed to reset the "+e+" buffer",t)}})),this._initSourceBuffer()},e.onBufferCodecs=function(t,e){var r=this,i=this.getSourceBufferTypes().length;Object.keys(e).forEach((function(t){if(i){var n=r.tracks[t];if(n&&"function"==typeof n.buffer.changeType){var a=e[t],s=a.codec,o=a.levelCodec,l=a.container;if((n.levelCodec||n.codec).replace(Re,"$1")!==(o||s).replace(Re,"$1")){var u=l+";codecs="+(o||s);r.appendChangeType(t,u)}}}else r.pendingTracks[t]=e[t]})),i||(this.bufferCodecEventsExpected=Math.max(this.bufferCodecEventsExpected-1,0),this.mediaSource&&"open"===this.mediaSource.readyState&&this.checkPendingTracks())},e.appendChangeType=function(t,e){var r=this,i=this.operationQueue,n={execute:function(){var n=r.sourceBuffer[t];n&&(o.b.log("[buffer-controller]: changing "+t+" sourceBuffer type to "+e),n.changeType(e)),i.shiftAndExecuteNext(t)},onStart:function(){},onComplete:function(){},onError:function(e){o.b.warn("[buffer-controller]: Failed to change "+t+" SourceBuffer type",e)}};i.append(n,t)},e.onBufferAppending=function(t,e){var r=this,i=this.hls,n=this.operationQueue,l=this.tracks,u=e.data,h=e.type,d=e.frag,c=e.part,f=e.chunkMeta,g=f.buffering[h],v=self.performance.now();g.start=v;var p=d.stats.buffering,m=c?c.stats.buffering:null;0===p.start&&(p.start=v),m&&0===m.start&&(m.start=v);var y=l.audio,T="audio"===h&&1===f.id&&"audio/mpeg"===(null==y?void 0:y.container),b={execute:function(){if(g.executeStart=self.performance.now(),T){var t=r.sourceBuffer[h];if(t){var e=d.start-t.timestampOffset;Math.abs(e)>=.1&&(o.b.log("[buffer-controller]: Updating audio SourceBuffer timestampOffset to "+d.start+" (delta: "+e+") sn: "+d.sn+")"),t.timestampOffset=d.start)}}r.appendExecutor(u,h)},onStart:function(){},onComplete:function(){var t=self.performance.now();g.executeEnd=g.end=t,0===p.first&&(p.first=t),m&&0===m.first&&(m.first=t);var e=r.sourceBuffer,i={};for(var n in e)i[n]=lt.getBuffered(e[n]);r.appendError=0,r.hls.trigger(a.a.BUFFER_APPENDED,{type:h,frag:d,part:c,chunkMeta:f,parent:d.type,timeRanges:i})},onError:function(t){o.b.error("[buffer-controller]: Error encountered while trying to append to the "+h+" SourceBuffer",t);var e={type:s.b.MEDIA_ERROR,parent:d.type,details:s.a.BUFFER_APPEND_ERROR,err:t,fatal:!1};t.code===DOMException.QUOTA_EXCEEDED_ERR?e.details=s.a.BUFFER_FULL_ERROR:(r.appendError++,e.details=s.a.BUFFER_APPEND_ERROR,r.appendError>i.config.appendErrorMaxRetry&&(o.b.error("[buffer-controller]: Failed "+i.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),e.fatal=!0)),i.trigger(a.a.ERROR,e)}};n.append(b,h)},e.onBufferFlushing=function(t,e){var r=this,i=this.operationQueue,n=function(t){return{execute:r.removeExecutor.bind(r,t,e.startOffset,e.endOffset),onStart:function(){},onComplete:function(){r.hls.trigger(a.a.BUFFER_FLUSHED,{type:t})},onError:function(e){o.b.warn("[buffer-controller]: Failed to remove from "+t+" SourceBuffer",e)}}};e.type?i.append(n(e.type),e.type):this.getSourceBufferTypes().forEach((function(t){i.append(n(t),t)}))},e.onFragParsed=function(t,e){var r=this,i=e.frag,n=e.part,s=[],l=n?n.elementaryStreams:i.elementaryStreams;l[u.a.AUDIOVIDEO]?s.push("audiovideo"):(l[u.a.AUDIO]&&s.push("audio"),l[u.a.VIDEO]&&s.push("video"));0===s.length&&o.b.warn("Fragments must have at least one ElementaryStreamType set. type: "+i.type+" level: "+i.level+" sn: "+i.sn),this.blockBuffers((function(){var t=self.performance.now();i.stats.buffering.end=t,n&&(n.stats.buffering.end=t);var e=n?n.stats:i.stats;r.hls.trigger(a.a.FRAG_BUFFERED,{frag:i,part:n,stats:e,id:i.type})}),s)},e.onFragChanged=function(t,e){this.flushBackBuffer()},e.onBufferEos=function(t,e){var r=this;this.getSourceBufferTypes().reduce((function(t,i){var n=r.sourceBuffer[i];return e.type&&e.type!==i||n&&!n.ended&&(n.ended=!0,o.b.log("[buffer-controller]: "+i+" sourceBuffer now EOS")),t&&!(n&&!n.ended)}),!0)&&this.blockBuffers((function(){var t=r.mediaSource;t&&"open"===t.readyState&&t.endOfStream()}))},e.onLevelUpdated=function(t,e){var r=e.details;r.fragments.length&&(this.details=r,this.getSourceBufferTypes().length?this.blockBuffers(this.updateMediaElementDuration.bind(this)):this.updateMediaElementDuration())},e.flushBackBuffer=function(){var t=this.hls,e=this.details,r=this.media,i=this.sourceBuffer;if(r&&null!==e){var s=this.getSourceBufferTypes();if(s.length){var o=e.live&&null!==t.config.liveBackBufferLength?t.config.liveBackBufferLength:t.config.backBufferLength;if(Object(n.a)(o)&&!(o<0)){var l=r.currentTime,u=e.levelTargetDuration,h=Math.max(o,u),d=Math.floor(l/u)*u-h;s.forEach((function(r){var n=i[r];if(n){var s=lt.getBuffered(n);s.length>0&&d>s.start(0)&&(t.trigger(a.a.BACK_BUFFER_REACHED,{bufferEnd:d}),e.live&&t.trigger(a.a.LIVE_BACK_BUFFER_REACHED,{bufferEnd:d}),t.trigger(a.a.BUFFER_FLUSHING,{startOffset:0,endOffset:d,type:r}))}}))}}}},e.updateMediaElementDuration=function(){if(this.details&&this.media&&this.mediaSource&&"open"===this.mediaSource.readyState){var t=this.details,e=this.hls,r=this.media,i=this.mediaSource,a=t.fragments[0].start+t.totalduration,s=r.duration,l=Object(n.a)(i.duration)?i.duration:0;t.live&&e.config.liveDurationInfinity?(o.b.log("[buffer-controller]: Media Source duration is set to Infinity"),i.duration=1/0,this.updateSeekableRange(t)):(a>l&&a>s||!Object(n.a)(s))&&(o.b.log("[buffer-controller]: Updating Media Source duration to "+a.toFixed(3)),i.duration=a)}},e.updateSeekableRange=function(t){var e=this.mediaSource,r=t.fragments;if(r.length&&t.live&&null!=e&&e.setLiveSeekableRange){var i=Math.max(0,r[0].start),n=Math.max(i,i+t.totalduration);e.setLiveSeekableRange(i,n)}},e.checkPendingTracks=function(){var t=this.bufferCodecEventsExpected,e=this.operationQueue,r=this.pendingTracks,i=Object.keys(r).length;if(i&&!t||2===i){this.createSourceBuffers(r),this.pendingTracks={};var n=this.getSourceBufferTypes();if(0===n.length)return void this.hls.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.BUFFER_INCOMPATIBLE_CODECS_ERROR,fatal:!0,reason:"could not create source buffer for media codec(s)"});n.forEach((function(t){e.executeNext(t)}))}},e.createSourceBuffers=function(t){var e=this.sourceBuffer,r=this.mediaSource;if(!r)throw Error("createSourceBuffers called when mediaSource was null");var i=0;for(var n in t)if(!e[n]){var l=t[n];if(!l)throw Error("source buffer exists for track "+n+", however track does not");var u=l.levelCodec||l.codec,h=l.container+";codecs="+u;o.b.log("[buffer-controller]: creating sourceBuffer("+h+")");try{var d=e[n]=r.addSourceBuffer(h),c=n;this.addBufferListener(c,"updatestart",this._onSBUpdateStart),this.addBufferListener(c,"updateend",this._onSBUpdateEnd),this.addBufferListener(c,"error",this._onSBUpdateError),this.tracks[n]={buffer:d,codec:u,container:l.container,levelCodec:l.levelCodec,id:l.id},i++}catch(t){o.b.error("[buffer-controller]: error while trying to add sourceBuffer: "+t.message),this.hls.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.BUFFER_ADD_CODEC_ERROR,fatal:!1,error:t,mimeType:h})}}i&&this.hls.trigger(a.a.BUFFER_CREATED,{tracks:this.tracks})},e._onSBUpdateStart=function(t){this.operationQueue.current(t).onStart()},e._onSBUpdateEnd=function(t){var e=this.operationQueue;e.current(t).onComplete(),e.shiftAndExecuteNext(t)},e._onSBUpdateError=function(t,e){o.b.error("[buffer-controller]: "+t+" SourceBuffer error",e),this.hls.trigger(a.a.ERROR,{type:s.b.MEDIA_ERROR,details:s.a.BUFFER_APPENDING_ERROR,fatal:!1});var r=this.operationQueue.current(t);r&&r.onError(e)},e.removeExecutor=function(t,e,r){var i=this.media,a=this.mediaSource,s=this.operationQueue,l=this.sourceBuffer[t];if(!i||!a||!l)return o.b.warn("[buffer-controller]: Attempting to remove from the "+t+" SourceBuffer, but it does not exist"),void s.shiftAndExecuteNext(t);var u=Object(n.a)(i.duration)?i.duration:1/0,h=Object(n.a)(a.duration)?a.duration:1/0,d=Math.max(0,e),c=Math.min(r,u,h);c>d?(o.b.log("[buffer-controller]: Removing ["+d+","+c+"] from the "+t+" SourceBuffer"),l.remove(d,c)):s.shiftAndExecuteNext(t)},e.appendExecutor=function(t,e){var r=this.operationQueue,i=this.sourceBuffer[e];if(!i)return o.b.warn("[buffer-controller]: Attempting to append to the "+e+" SourceBuffer, but it does not exist"),void r.shiftAndExecuteNext(e);i.ended=!1,i.appendBuffer(t)},e.blockBuffers=function(t,e){var r=this;if(void 0===e&&(e=this.getSourceBufferTypes()),!e.length)return o.b.log("[buffer-controller]: Blocking operation requested, but no SourceBuffers exist"),void Promise.resolve(t);var i=this.operationQueue,n=e.map((function(t){return i.appendBlocker(t)}));Promise.all(n).then((function(){t(),e.forEach((function(t){var e=r.sourceBuffer[t];e&&e.updating||i.shiftAndExecuteNext(t)}))}))},e.getSourceBufferTypes=function(){return Object.keys(this.sourceBuffer)},e.addBufferListener=function(t,e,r){var i=this.sourceBuffer[t];if(i){var n=r.bind(this,t);this.listeners[t].push({event:e,listener:n}),i.addEventListener(e,n)}},e.removeBufferListeners=function(t){var e=this.sourceBuffer[t];e&&this.listeners[t].forEach((function(t){e.removeEventListener(t.event,t.listener)}))},t}(),ke={42:225,92:233,94:237,95:243,96:250,123:231,124:247,125:209,126:241,127:9608,128:174,129:176,130:189,131:191,132:8482,133:162,134:163,135:9834,136:224,137:32,138:232,139:226,140:234,141:238,142:244,143:251,144:193,145:201,146:211,147:218,148:220,149:252,150:8216,151:161,152:42,153:8217,154:9473,155:169,156:8480,157:8226,158:8220,159:8221,160:192,161:194,162:199,163:200,164:202,165:203,166:235,167:206,168:207,169:239,170:212,171:217,172:249,173:219,174:171,175:187,176:195,177:227,178:205,179:204,180:236,181:210,182:242,183:213,184:245,185:123,186:125,187:92,188:94,189:95,190:124,191:8764,192:196,193:228,194:214,195:246,196:223,197:165,198:164,199:9475,200:197,201:229,202:216,203:248,204:9487,205:9491,206:9495,207:9499},_e=function(t){var e=t;return ke.hasOwnProperty(t)&&(e=ke[t]),String.fromCharCode(e)},Ie={17:1,18:3,21:5,22:7,23:9,16:11,19:12,20:14},Ce={17:2,18:4,21:6,22:8,23:10,19:13,20:15},we={25:1,26:3,29:5,30:7,31:9,24:11,27:12,28:14},Oe={25:2,26:4,29:6,30:8,31:10,27:13,28:15},xe=["white","green","blue","cyan","red","yellow","magenta","black","transparent"];!function(t){t[t.ERROR=0]="ERROR",t[t.TEXT=1]="TEXT",t[t.WARNING=2]="WARNING",t[t.INFO=2]="INFO",t[t.DEBUG=3]="DEBUG",t[t.DATA=3]="DATA"}(Ee||(Ee={}));var Pe=function(){function t(){this.time=null,this.verboseLevel=Ee.ERROR}return t.prototype.log=function(t,e){this.verboseLevel>=t&&o.b.log(this.time+" ["+t+"] "+e)},t}(),Me=function(t){for(var e=[],r=0;r<t.length;r++)e.push(t[r].toString(16));return e},Fe=function(){function t(t,e,r,i,n){this.foreground=void 0,this.underline=void 0,this.italics=void 0,this.background=void 0,this.flash=void 0,this.foreground=t||"white",this.underline=e||!1,this.italics=r||!1,this.background=i||"black",this.flash=n||!1}var e=t.prototype;return e.reset=function(){this.foreground="white",this.underline=!1,this.italics=!1,this.background="black",this.flash=!1},e.setStyles=function(t){for(var e=["foreground","underline","italics","background","flash"],r=0;r<e.length;r++){var i=e[r];t.hasOwnProperty(i)&&(this[i]=t[i])}},e.isDefault=function(){return"white"===this.foreground&&!this.underline&&!this.italics&&"black"===this.background&&!this.flash},e.equals=function(t){return this.foreground===t.foreground&&this.underline===t.underline&&this.italics===t.italics&&this.background===t.background&&this.flash===t.flash},e.copy=function(t){this.foreground=t.foreground,this.underline=t.underline,this.italics=t.italics,this.background=t.background,this.flash=t.flash},e.toString=function(){return"color="+this.foreground+", underline="+this.underline+", italics="+this.italics+", background="+this.background+", flash="+this.flash},t}(),Ne=function(){function t(t,e,r,i,n,a){this.uchar=void 0,this.penState=void 0,this.uchar=t||" ",this.penState=new Fe(e,r,i,n,a)}var e=t.prototype;return e.reset=function(){this.uchar=" ",this.penState.reset()},e.setChar=function(t,e){this.uchar=t,this.penState.copy(e)},e.setPenState=function(t){this.penState.copy(t)},e.equals=function(t){return this.uchar===t.uchar&&this.penState.equals(t.penState)},e.copy=function(t){this.uchar=t.uchar,this.penState.copy(t.penState)},e.isEmpty=function(){return" "===this.uchar&&this.penState.isDefault()},t}(),Ue=function(){function t(t){this.chars=void 0,this.pos=void 0,this.currPenState=void 0,this.cueStartTime=void 0,this.logger=void 0,this.chars=[];for(var e=0;e<100;e++)this.chars.push(new Ne);this.logger=t,this.pos=0,this.currPenState=new Fe}var e=t.prototype;return e.equals=function(t){for(var e=!0,r=0;r<100;r++)if(!this.chars[r].equals(t.chars[r])){e=!1;break}return e},e.copy=function(t){for(var e=0;e<100;e++)this.chars[e].copy(t.chars[e])},e.isEmpty=function(){for(var t=!0,e=0;e<100;e++)if(!this.chars[e].isEmpty()){t=!1;break}return t},e.setCursor=function(t){this.pos!==t&&(this.pos=t),this.pos<0?(this.logger.log(Ee.DEBUG,"Negative cursor position "+this.pos),this.pos=0):this.pos>100&&(this.logger.log(Ee.DEBUG,"Too large cursor position "+this.pos),this.pos=100)},e.moveCursor=function(t){var e=this.pos+t;if(t>1)for(var r=this.pos+1;r<e+1;r++)this.chars[r].setPenState(this.currPenState);this.setCursor(e)},e.backSpace=function(){this.moveCursor(-1),this.chars[this.pos].setChar(" ",this.currPenState)},e.insertChar=function(t){t>=144&&this.backSpace();var e=_e(t);this.pos>=100?this.logger.log(Ee.ERROR,"Cannot insert "+t.toString(16)+" ("+e+") at position "+this.pos+". Skipping it!"):(this.chars[this.pos].setChar(e,this.currPenState),this.moveCursor(1))},e.clearFromPos=function(t){var e;for(e=t;e<100;e++)this.chars[e].reset()},e.clear=function(){this.clearFromPos(0),this.pos=0,this.currPenState.reset()},e.clearToEndOfRow=function(){this.clearFromPos(this.pos)},e.getTextString=function(){for(var t=[],e=!0,r=0;r<100;r++){var i=this.chars[r].uchar;" "!==i&&(e=!1),t.push(i)}return e?"":t.join("")},e.setPenStyles=function(t){this.currPenState.setStyles(t),this.chars[this.pos].setPenState(this.currPenState)},t}(),Be=function(){function t(t){this.rows=void 0,this.currRow=void 0,this.nrRollUpRows=void 0,this.lastOutputScreen=void 0,this.logger=void 0,this.rows=[];for(var e=0;e<15;e++)this.rows.push(new Ue(t));this.logger=t,this.currRow=14,this.nrRollUpRows=null,this.lastOutputScreen=null,this.reset()}var e=t.prototype;return e.reset=function(){for(var t=0;t<15;t++)this.rows[t].clear();this.currRow=14},e.equals=function(t){for(var e=!0,r=0;r<15;r++)if(!this.rows[r].equals(t.rows[r])){e=!1;break}return e},e.copy=function(t){for(var e=0;e<15;e++)this.rows[e].copy(t.rows[e])},e.isEmpty=function(){for(var t=!0,e=0;e<15;e++)if(!this.rows[e].isEmpty()){t=!1;break}return t},e.backSpace=function(){this.rows[this.currRow].backSpace()},e.clearToEndOfRow=function(){this.rows[this.currRow].clearToEndOfRow()},e.insertChar=function(t){this.rows[this.currRow].insertChar(t)},e.setPen=function(t){this.rows[this.currRow].setPenStyles(t)},e.moveCursor=function(t){this.rows[this.currRow].moveCursor(t)},e.setCursor=function(t){this.logger.log(Ee.INFO,"setCursor: "+t),this.rows[this.currRow].setCursor(t)},e.setPAC=function(t){this.logger.log(Ee.INFO,"pacData = "+JSON.stringify(t));var e=t.row-1;if(this.nrRollUpRows&&e<this.nrRollUpRows-1&&(e=this.nrRollUpRows-1),this.nrRollUpRows&&this.currRow!==e){for(var r=0;r<15;r++)this.rows[r].clear();var i=this.currRow+1-this.nrRollUpRows,n=this.lastOutputScreen;if(n){var a=n.rows[i].cueStartTime,s=this.logger.time;if(a&&null!==s&&a<s)for(var o=0;o<this.nrRollUpRows;o++)this.rows[e-this.nrRollUpRows+o+1].copy(n.rows[i+o])}}this.currRow=e;var l=this.rows[this.currRow];if(null!==t.indent){var u=t.indent,h=Math.max(u-1,0);l.setCursor(t.indent),t.color=l.chars[h].penState.foreground}var d={foreground:t.color,underline:t.underline,italics:t.italics,background:"black",flash:!1};this.setPen(d)},e.setBkgData=function(t){this.logger.log(Ee.INFO,"bkgData = "+JSON.stringify(t)),this.backSpace(),this.setPen(t),this.insertChar(32)},e.setRollUpRows=function(t){this.nrRollUpRows=t},e.rollUp=function(){if(null!==this.nrRollUpRows){this.logger.log(Ee.TEXT,this.getDisplayText());var t=this.currRow+1-this.nrRollUpRows,e=this.rows.splice(t,1)[0];e.clear(),this.rows.splice(this.currRow,0,e),this.logger.log(Ee.INFO,"Rolling up")}else this.logger.log(Ee.DEBUG,"roll_up but nrRollUpRows not set yet")},e.getDisplayText=function(t){t=t||!1;for(var e=[],r="",i=-1,n=0;n<15;n++){var a=this.rows[n].getTextString();a&&(i=n+1,t?e.push("Row "+i+": '"+a+"'"):e.push(a.trim()))}return e.length>0&&(r=t?"["+e.join(" | ")+"]":e.join("\n")),r},e.getTextAndFormat=function(){return this.rows},t}(),Ge=function(){function t(t,e,r){this.chNr=void 0,this.outputFilter=void 0,this.mode=void 0,this.verbose=void 0,this.displayedMemory=void 0,this.nonDisplayedMemory=void 0,this.lastOutputScreen=void 0,this.currRollUpRow=void 0,this.writeScreen=void 0,this.cueStartTime=void 0,this.logger=void 0,this.chNr=t,this.outputFilter=e,this.mode=null,this.verbose=0,this.displayedMemory=new Be(r),this.nonDisplayedMemory=new Be(r),this.lastOutputScreen=new Be(r),this.currRollUpRow=this.displayedMemory.rows[14],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null,this.logger=r}var e=t.prototype;return e.reset=function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.outputFilter.reset(),this.currRollUpRow=this.displayedMemory.rows[14],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null},e.getHandler=function(){return this.outputFilter},e.setHandler=function(t){this.outputFilter=t},e.setPAC=function(t){this.writeScreen.setPAC(t)},e.setBkgData=function(t){this.writeScreen.setBkgData(t)},e.setMode=function(t){t!==this.mode&&(this.mode=t,this.logger.log(Ee.INFO,"MODE="+t),"MODE_POP-ON"===this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=t)},e.insertChars=function(t){for(var e=0;e<t.length;e++)this.writeScreen.insertChar(t[e]);var r=this.writeScreen===this.displayedMemory?"DISP":"NON_DISP";this.logger.log(Ee.INFO,r+": "+this.writeScreen.getDisplayText(!0)),"MODE_PAINT-ON"!==this.mode&&"MODE_ROLL-UP"!==this.mode||(this.logger.log(Ee.TEXT,"DISPLAYED: "+this.displayedMemory.getDisplayText(!0)),this.outputDataUpdate())},e.ccRCL=function(){this.logger.log(Ee.INFO,"RCL - Resume Caption Loading"),this.setMode("MODE_POP-ON")},e.ccBS=function(){this.logger.log(Ee.INFO,"BS - BackSpace"),"MODE_TEXT"!==this.mode&&(this.writeScreen.backSpace(),this.writeScreen===this.displayedMemory&&this.outputDataUpdate())},e.ccAOF=function(){},e.ccAON=function(){},e.ccDER=function(){this.logger.log(Ee.INFO,"DER- Delete to End of Row"),this.writeScreen.clearToEndOfRow(),this.outputDataUpdate()},e.ccRU=function(t){this.logger.log(Ee.INFO,"RU("+t+") - Roll Up"),this.writeScreen=this.displayedMemory,this.setMode("MODE_ROLL-UP"),this.writeScreen.setRollUpRows(t)},e.ccFON=function(){this.logger.log(Ee.INFO,"FON - Flash On"),this.writeScreen.setPen({flash:!0})},e.ccRDC=function(){this.logger.log(Ee.INFO,"RDC - Resume Direct Captioning"),this.setMode("MODE_PAINT-ON")},e.ccTR=function(){this.logger.log(Ee.INFO,"TR"),this.setMode("MODE_TEXT")},e.ccRTD=function(){this.logger.log(Ee.INFO,"RTD"),this.setMode("MODE_TEXT")},e.ccEDM=function(){this.logger.log(Ee.INFO,"EDM - Erase Displayed Memory"),this.displayedMemory.reset(),this.outputDataUpdate(!0)},e.ccCR=function(){this.logger.log(Ee.INFO,"CR - Carriage Return"),this.writeScreen.rollUp(),this.outputDataUpdate(!0)},e.ccENM=function(){this.logger.log(Ee.INFO,"ENM - Erase Non-displayed Memory"),this.nonDisplayedMemory.reset()},e.ccEOC=function(){if(this.logger.log(Ee.INFO,"EOC - End Of Caption"),"MODE_POP-ON"===this.mode){var t=this.displayedMemory;this.displayedMemory=this.nonDisplayedMemory,this.nonDisplayedMemory=t,this.writeScreen=this.nonDisplayedMemory,this.logger.log(Ee.TEXT,"DISP: "+this.displayedMemory.getDisplayText())}this.outputDataUpdate(!0)},e.ccTO=function(t){this.logger.log(Ee.INFO,"TO("+t+") - Tab Offset"),this.writeScreen.moveCursor(t)},e.ccMIDROW=function(t){var e={flash:!1};if(e.underline=t%2==1,e.italics=t>=46,e.italics)e.foreground="white";else{var r=Math.floor(t/2)-16;e.foreground=["white","green","blue","cyan","red","yellow","magenta"][r]}this.logger.log(Ee.INFO,"MIDROW: "+JSON.stringify(e)),this.writeScreen.setPen(e)},e.outputDataUpdate=function(t){void 0===t&&(t=!1);var e=this.logger.time;null!==e&&this.outputFilter&&(null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue(this.cueStartTime,e,this.lastOutputScreen),t&&this.outputFilter.dispatchCue&&this.outputFilter.dispatchCue(),this.cueStartTime=this.displayedMemory.isEmpty()?null:e):this.cueStartTime=e,this.lastOutputScreen.copy(this.displayedMemory))},e.cueSplitAtTime=function(t){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,t,this.displayedMemory),this.cueStartTime=t))},t}();function Ke(t,e,r){r.a=t,r.b=e}function je(t,e,r){return r.a===t&&r.b===e}var He=function(){function t(t,e,r){this.channels=void 0,this.currentChannel=0,this.cmdHistory=void 0,this.logger=void 0;var i=new Pe;this.channels=[null,new Ge(t,e,i),new Ge(t+1,r,i)],this.cmdHistory={a:null,b:null},this.logger=i}var e=t.prototype;return e.getHandler=function(t){return this.channels[t].getHandler()},e.setHandler=function(t,e){this.channels[t].setHandler(e)},e.addData=function(t,e){var r,i,n,a=!1;this.logger.time=t;for(var s=0;s<e.length;s+=2)if(i=127&e[s],n=127&e[s+1],0!==i||0!==n){if(this.logger.log(Ee.DATA,"["+Me([e[s],e[s+1]])+"] -> ("+Me([i,n])+")"),(r=this.parseCmd(i,n))||(r=this.parseMidrow(i,n)),r||(r=this.parsePAC(i,n)),r||(r=this.parseBackgroundAttributes(i,n)),!r&&(a=this.parseChars(i,n))){var o=this.currentChannel;if(o&&o>0)this.channels[o].insertChars(a);else this.logger.log(Ee.WARNING,"No channel found yet. TEXT-MODE?")}r||a||this.logger.log(Ee.WARNING,"Couldn't parse cleaned data "+Me([i,n])+" orig: "+Me([e[s],e[s+1]]))}},e.parseCmd=function(t,e){var r=this.cmdHistory;if(!((20===t||28===t||21===t||29===t)&&e>=32&&e<=47)&&!((23===t||31===t)&&e>=33&&e<=35))return!1;if(je(t,e,r))return Ke(null,null,r),this.logger.log(Ee.DEBUG,"Repeated command ("+Me([t,e])+") is dropped"),!0;var i=20===t||21===t||23===t?1:2,n=this.channels[i];return 20===t||21===t||28===t||29===t?32===e?n.ccRCL():33===e?n.ccBS():34===e?n.ccAOF():35===e?n.ccAON():36===e?n.ccDER():37===e?n.ccRU(2):38===e?n.ccRU(3):39===e?n.ccRU(4):40===e?n.ccFON():41===e?n.ccRDC():42===e?n.ccTR():43===e?n.ccRTD():44===e?n.ccEDM():45===e?n.ccCR():46===e?n.ccENM():47===e&&n.ccEOC():n.ccTO(e-32),Ke(t,e,r),this.currentChannel=i,!0},e.parseMidrow=function(t,e){var r=0;if((17===t||25===t)&&e>=32&&e<=47){if((r=17===t?1:2)!==this.currentChannel)return this.logger.log(Ee.ERROR,"Mismatch channel in midrow parsing"),!1;var i=this.channels[r];return!!i&&(i.ccMIDROW(e),this.logger.log(Ee.DEBUG,"MIDROW ("+Me([t,e])+")"),!0)}return!1},e.parsePAC=function(t,e){var r,i=this.cmdHistory;if(!((t>=17&&t<=23||t>=25&&t<=31)&&e>=64&&e<=127)&&!((16===t||24===t)&&e>=64&&e<=95))return!1;if(je(t,e,i))return Ke(null,null,i),!0;var n=t<=23?1:2;r=e>=64&&e<=95?1===n?Ie[t]:we[t]:1===n?Ce[t]:Oe[t];var a=this.channels[n];return!!a&&(a.setPAC(this.interpretPAC(r,e)),Ke(t,e,i),this.currentChannel=n,!0)},e.interpretPAC=function(t,e){var r,i={color:null,italics:!1,indent:null,underline:!1,row:t};return r=e>95?e-96:e-64,i.underline=1==(1&r),r<=13?i.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(r/2)]:r<=15?(i.italics=!0,i.color="white"):i.indent=4*Math.floor((r-16)/2),i},e.parseChars=function(t,e){var r,i,n=null,a=null;(t>=25?(r=2,a=t-8):(r=1,a=t),a>=17&&a<=19)?(i=17===a?e+80:18===a?e+112:e+144,this.logger.log(Ee.INFO,"Special char '"+_e(i)+"' in channel "+r),n=[i]):t>=32&&t<=127&&(n=0===e?[t]:[t,e]);if(n){var s=Me(n);this.logger.log(Ee.DEBUG,"Char codes = "+s.join(",")),Ke(t,e,this.cmdHistory)}return n},e.parseBackgroundAttributes=function(t,e){var r;if(!((16===t||24===t)&&e>=32&&e<=47)&&!((23===t||31===t)&&e>=45&&e<=47))return!1;var i={};16===t||24===t?(r=Math.floor((e-32)/2),i.background=xe[r],e%2==1&&(i.background=i.background+"_semi")):45===e?i.background="transparent":(i.foreground="black",47===e&&(i.underline=!0));var n=t<=23?1:2;return this.channels[n].setBkgData(i),Ke(t,e,this.cmdHistory),!0},e.reset=function(){for(var t=0;t<Object.keys(this.channels).length;t++){var e=this.channels[t];e&&e.reset()}this.cmdHistory={a:null,b:null}},e.cueSplitAtTime=function(t){for(var e=0;e<this.channels.length;e++){var r=this.channels[e];r&&r.cueSplitAtTime(t)}},t}(),Ve=function(){function t(t,e){this.timelineController=void 0,this.cueRanges=[],this.trackName=void 0,this.startTime=null,this.endTime=null,this.screen=null,this.timelineController=t,this.trackName=e}var e=t.prototype;return e.dispatchCue=function(){null!==this.startTime&&(this.timelineController.addCues(this.trackName,this.startTime,this.endTime,this.screen,this.cueRanges),this.startTime=null)},e.newCue=function(t,e,r){(null===this.startTime||this.startTime>t)&&(this.startTime=t),this.endTime=e,this.screen=r,this.timelineController.createCaptionsTrack(this.trackName)},e.reset=function(){this.cueRanges=[]},t}(),We=function(){if("undefined"!=typeof self&&self.VTTCue)return self.VTTCue;var t=["","lr","rl"],e=["start","middle","end","left","right"];function r(t,e){if("string"!=typeof e)return!1;if(!Array.isArray(t))return!1;var r=e.toLowerCase();return!!~t.indexOf(r)&&r}function i(t){return r(e,t)}function n(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;i<e;i++)r[i-1]=arguments[i];for(var n=1;n<arguments.length;n++){var a=arguments[n];for(var s in a)t[s]=a[s]}return t}function a(e,a,s){var o=this,l={enumerable:!0};o.hasBeenReset=!1;var u="",h=!1,d=e,c=a,f=s,g=null,v="",p=!0,m="auto",y="start",T=50,b="middle",E=50,S="middle";Object.defineProperty(o,"id",n({},l,{get:function(){return u},set:function(t){u=""+t}})),Object.defineProperty(o,"pauseOnExit",n({},l,{get:function(){return h},set:function(t){h=!!t}})),Object.defineProperty(o,"startTime",n({},l,{get:function(){return d},set:function(t){if("number"!=typeof t)throw new TypeError("Start time must be set to a number.");d=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"endTime",n({},l,{get:function(){return c},set:function(t){if("number"!=typeof t)throw new TypeError("End time must be set to a number.");c=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"text",n({},l,{get:function(){return f},set:function(t){f=""+t,this.hasBeenReset=!0}})),Object.defineProperty(o,"region",n({},l,{get:function(){return g},set:function(t){g=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"vertical",n({},l,{get:function(){return v},set:function(e){var i=function(e){return r(t,e)}(e);if(!1===i)throw new SyntaxError("An invalid or illegal string was specified.");v=i,this.hasBeenReset=!0}})),Object.defineProperty(o,"snapToLines",n({},l,{get:function(){return p},set:function(t){p=!!t,this.hasBeenReset=!0}})),Object.defineProperty(o,"line",n({},l,{get:function(){return m},set:function(t){if("number"!=typeof t&&"auto"!==t)throw new SyntaxError("An invalid number or illegal string was specified.");m=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"lineAlign",n({},l,{get:function(){return y},set:function(t){var e=i(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");y=e,this.hasBeenReset=!0}})),Object.defineProperty(o,"position",n({},l,{get:function(){return T},set:function(t){if(t<0||t>100)throw new Error("Position must be between 0 and 100.");T=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"positionAlign",n({},l,{get:function(){return b},set:function(t){var e=i(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");b=e,this.hasBeenReset=!0}})),Object.defineProperty(o,"size",n({},l,{get:function(){return E},set:function(t){if(t<0||t>100)throw new Error("Size must be between 0 and 100.");E=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"align",n({},l,{get:function(){return S},set:function(t){var e=i(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");S=e,this.hasBeenReset=!0}})),o.displayState=void 0}return a.prototype.getCueAsHTML=function(){return self.WebVTT.convertCueToDOMTree(self,this.text)},a}(),Ye=function(){function t(){}return t.prototype.decode=function(t,e){if(!t)return"";if("string"!=typeof t)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(t))},t}();function qe(t){function e(t,e,r,i){return 3600*(0|t)+60*(0|e)+(0|r)+parseFloat(i||0)}var r=t.match(/^(?:(\d+):)?(\d{2}):(\d{2})(\.\d+)?/);return r?parseFloat(r[2])>59?e(r[2],r[3],0,r[4]):e(r[1],r[2],r[3],r[4]):null}var Xe=function(){function t(){this.values=Object.create(null)}var e=t.prototype;return e.set=function(t,e){this.get(t)||""===e||(this.values[t]=e)},e.get=function(t,e,r){return r?this.has(t)?this.values[t]:e[r]:this.has(t)?this.values[t]:e},e.has=function(t){return t in this.values},e.alt=function(t,e,r){for(var i=0;i<r.length;++i)if(e===r[i]){this.set(t,e);break}},e.integer=function(t,e){/^-?\d+$/.test(e)&&this.set(t,parseInt(e,10))},e.percent=function(t,e){if(/^([\d]{1,3})(\.[\d]*)?%$/.test(e)){var r=parseFloat(e);if(r>=0&&r<=100)return this.set(t,r),!0}return!1},t}();function ze(t,e,r,i){var n=i?t.split(i):[t];for(var a in n)if("string"==typeof n[a]){var s=n[a].split(r);if(2===s.length)e(s[0],s[1])}}var Qe=new We(0,0,""),$e="middle"===Qe.align?"middle":"center";function Je(t,e,r){var i=t;function n(){var e=qe(t);if(null===e)throw new Error("Malformed timestamp: "+i);return t=t.replace(/^[^\sa-zA-Z-]+/,""),e}function a(){t=t.replace(/^\s+/,"")}if(a(),e.startTime=n(),a(),"--\x3e"!==t.substr(0,3))throw new Error("Malformed time stamp (time stamps must be separated by '--\x3e'): "+i);t=t.substr(3),a(),e.endTime=n(),a(),function(t,e){var i=new Xe;ze(t,(function(t,e){var n;switch(t){case"region":for(var a=r.length-1;a>=0;a--)if(r[a].id===e){i.set(t,r[a].region);break}break;case"vertical":i.alt(t,e,["rl","lr"]);break;case"line":n=e.split(","),i.integer(t,n[0]),i.percent(t,n[0])&&i.set("snapToLines",!1),i.alt(t,n[0],["auto"]),2===n.length&&i.alt("lineAlign",n[1],["start",$e,"end"]);break;case"position":n=e.split(","),i.percent(t,n[0]),2===n.length&&i.alt("positionAlign",n[1],["start",$e,"end","line-left","line-right","auto"]);break;case"size":i.percent(t,e);break;case"align":i.alt(t,e,["start",$e,"end","left","right"])}}),/:/,/\s/),e.region=i.get("region",null),e.vertical=i.get("vertical","");var n=i.get("line","auto");"auto"===n&&-1===Qe.line&&(n=-1),e.line=n,e.lineAlign=i.get("lineAlign","start"),e.snapToLines=i.get("snapToLines",!0),e.size=i.get("size",100),e.align=i.get("align",$e);var a=i.get("position","auto");"auto"===a&&50===Qe.position&&(a="start"===e.align||"left"===e.align?0:"end"===e.align||"right"===e.align?100:50),e.position=a}(t,e)}function Ze(t){return t.replace(/<br(?: \/)?>/gi,"\n")}var tr=function(){function t(){this.state="INITIAL",this.buffer="",this.decoder=new Ye,this.regionList=[],this.cue=null,this.oncue=void 0,this.onparsingerror=void 0,this.onflush=void 0}var e=t.prototype;return e.parse=function(t){var e=this;function r(){var t=e.buffer,r=0;for(t=Ze(t);r<t.length&&"\r"!==t[r]&&"\n"!==t[r];)++r;var i=t.substr(0,r);return"\r"===t[r]&&++r,"\n"===t[r]&&++r,e.buffer=t.substr(r),i}t&&(e.buffer+=e.decoder.decode(t,{stream:!0}));try{var i="";if("INITIAL"===e.state){if(!/\r\n|\n/.test(e.buffer))return this;var n=(i=r()).match(/^()?WEBVTT([ \t].*)?$/);if(!n||!n[0])throw new Error("Malformed WebVTT signature.");e.state="HEADER"}for(var a=!1;e.buffer;){if(!/\r\n|\n/.test(e.buffer))return this;switch(a?a=!1:i=r(),e.state){case"HEADER":/:/.test(i)?ze(i,(function(t,e){}),/:/):i||(e.state="ID");continue;case"NOTE":i||(e.state="ID");continue;case"ID":if(/^NOTE($|[ \t])/.test(i)){e.state="NOTE";break}if(!i)continue;if(e.cue=new We(0,0,""),e.state="CUE",-1===i.indexOf("--\x3e")){e.cue.id=i;continue}case"CUE":if(!e.cue){e.state="BADCUE";continue}try{Je(i,e.cue,e.regionList)}catch(t){e.cue=null,e.state="BADCUE";continue}e.state="CUETEXT";continue;case"CUETEXT":var s=-1!==i.indexOf("--\x3e");if(!i||s&&(a=!0)){e.oncue&&e.cue&&e.oncue(e.cue),e.cue=null,e.state="ID";continue}if(null===e.cue)continue;e.cue.text&&(e.cue.text+="\n"),e.cue.text+=i;continue;case"BADCUE":i||(e.state="ID")}}}catch(t){"CUETEXT"===e.state&&e.cue&&e.oncue&&e.oncue(e.cue),e.cue=null,e.state="INITIAL"===e.state?"BADWEBVTT":"BADCUE"}return this},e.flush=function(){try{if((this.cue||"HEADER"===this.state)&&(this.buffer+="\n\n",this.parse()),"INITIAL"===this.state||"BADWEBVTT"===this.state)throw new Error("Malformed WebVTT signature.")}catch(t){this.onparsingerror&&this.onparsingerror(t)}return this.onflush&&this.onflush(),this},t}(),er=r(8),rr=r(16),ir=/\r\n|\n\r|\n|\r/g,nr=function(t,e,r){return void 0===r&&(r=0),t.substr(r,e.length)===e},ar=function(t){for(var e=5381,r=t.length;r;)e=33*e^t.charCodeAt(--r);return(e>>>0).toString()};function sr(t,e,r){return ar(t.toString())+ar(e.toString())+ar(r)}function or(t,e,r,i,a,s,o,l){var u,h=new tr,d=Object(M.f)(new Uint8Array(t)).trim().replace(ir,"\n").split("\n"),c=[],f=Object(er.a)(e,r),g="00:00.000",v=0,p=0,m=!0,y=!1;h.oncue=function(t){var e=i[a],r=i.ccOffset,n=(v-f)/9e4;if(null!=e&&e.new&&(void 0!==p?r=i.ccOffset=e.start:function(t,e,r){var i=t[e],n=t[i.prevCC];if(!n||!n.new&&i.new)return t.ccOffset=t.presentationOffset=i.start,void(i.new=!1);for(;null!==(a=n)&&void 0!==a&&a.new;){var a;t.ccOffset+=i.start-n.start,i.new=!1,n=t[(i=n).prevCC]}t.presentationOffset=r}(i,a,n)),n&&(r=n-i.presentationOffset),y){var o=t.endTime-t.startTime,l=Object(rr.b)(9e4*(t.startTime+r-p),9e4*s)/9e4;t.startTime=l,t.endTime=l+o}var u=t.text.trim();t.text=decodeURIComponent(encodeURIComponent(u)),t.id||(t.id=sr(t.startTime,t.endTime,u)),t.endTime>0&&c.push(t)},h.onparsingerror=function(t){u=t},h.onflush=function(){u?l(u):o(c)},d.forEach((function(t){if(m){if(nr(t,"X-TIMESTAMP-MAP=")){m=!1,y=!0,t.substr(16).split(",").forEach((function(t){nr(t,"LOCAL:")?g=t.substr(6):nr(t,"MPEGTS:")&&(v=parseInt(t.substr(7)))}));try{p=function(t){var e=parseInt(t.substr(-3)),r=parseInt(t.substr(-6,2)),i=parseInt(t.substr(-9,2)),a=t.length>9?parseInt(t.substr(0,t.indexOf(":"))):0;if(!(Object(n.a)(e)&&Object(n.a)(r)&&Object(n.a)(i)&&Object(n.a)(a)))throw Error("Malformed X-TIMESTAMP-MAP: Local:"+t);return e+=1e3*r,e+=6e4*i,e+=36e5*a}(g)/1e3}catch(t){y=!1,u=t}return}""===t&&(m=!1)}h.parse(t+"\n")})),h.flush()}function lr(){return(lr=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t}).apply(this,arguments)}var ur=/^(\d{2,}):(\d{2}):(\d{2}):(\d{2})\.?(\d+)?$/,hr=/^(\d*(?:\.\d*)?)(h|m|s|ms|f|t)$/,dr={left:"start",center:"center",right:"end",start:"start",end:"end"};function cr(t,e,r,i,n){var a=Object(l.b)(new Uint8Array(t),["mdat"]);if(0!==a.length){var s=a[0],o=Object(M.f)(new Uint8Array(t,s.start,s.end-s.start)),u=Object(er.c)(e,1,r);try{i(function(t,e){var r=(new DOMParser).parseFromString(t,"text/xml").getElementsByTagName("tt")[0];if(!r)throw new Error("Invalid ttml");var i={frameRate:30,subFrameRate:1,frameRateMultiplier:0,tickRate:0},n=Object.keys(i).reduce((function(t,e){return t[e]=r.getAttribute("ttp:"+e)||i[e],t}),{}),a="preserve"!==r.getAttribute("xml:space"),s=gr(fr(r,"styling","style")),o=gr(fr(r,"layout","region")),l=fr(r,"body","[begin]");return[].map.call(l,(function(t){var r=function t(e,r){return[].slice.call(e.childNodes).reduce((function(e,i,n){var a;return"br"===i.nodeName&&n?e+"\n":null!==(a=i.childNodes)&&void 0!==a&&a.length?t(i,r):r?e+i.textContent.trim().replace(/\s+/g," "):e+i.textContent}),"")}(t,a);if(!r||!t.hasAttribute("begin"))return null;var i=mr(t.getAttribute("begin"),n),l=mr(t.getAttribute("dur"),n),u=mr(t.getAttribute("end"),n);if(null===i)throw pr(t);if(null===u){if(null===l)throw pr(t);u=i+l}var h=new We(i-e,u-e,r);h.id=sr(h.startTime,h.endTime,h.text);var d=o[t.getAttribute("region")],c=s[t.getAttribute("style")];h.position=10,h.size=80;var f=function(t,e){var r="http://www.w3.org/ns/ttml#styling";return["displayAlign","textAlign","color","backgroundColor","fontSize","fontFamily"].reduce((function(i,n){var a=vr(e,r,n)||vr(t,r,n);return a&&(i[n]=a),i}),{})}(d,c),g=f.textAlign;if(g){var v=dr[g];v&&(h.lineAlign=v),h.align=g}return lr(h,f),h})).filter((function(t){return null!==t}))}(o,u))}catch(t){n(t)}}else n(new Error("Could not parse IMSC1 mdat"))}function fr(t,e,r){var i=t.getElementsByTagName(e)[0];return i?[].slice.call(i.querySelectorAll(r)):[]}function gr(t){return t.reduce((function(t,e){var r=e.getAttribute("xml:id");return r&&(t[r]=e),t}),{})}function vr(t,e,r){return t.hasAttributeNS(e,r)?t.getAttributeNS(e,r):null}function pr(t){return new Error("Could not parse ttml timestamp "+t)}function mr(t,e){if(!t)return null;var r=qe(t);return null===r&&(ur.test(t)?r=function(t,e){var r=ur.exec(t),i=(0|r[4])+(0|r[5])/e.subFrameRate;return 3600*(0|r[1])+60*(0|r[2])+(0|r[3])+i/e.frameRate}(t,e):hr.test(t)&&(r=function(t,e){var r=hr.exec(t),i=Number(r[1]);switch(r[2]){case"h":return 3600*i;case"m":return 60*i;case"ms":return 1e3*i;case"f":return i/e.frameRate;case"t":return i/e.tickRate}return i}(t,e))),r}var yr=function(){function t(t){if(this.hls=void 0,this.media=null,this.config=void 0,this.enabled=!0,this.Cues=void 0,this.textTracks=[],this.tracks=[],this.initPTS=[],this.timescale=[],this.unparsedVttFrags=[],this.captionsTracks={},this.nonNativeCaptionsTracks={},this.cea608Parser1=void 0,this.cea608Parser2=void 0,this.lastSn=-1,this.prevCC=-1,this.vttCCs={ccOffset:0,presentationOffset:0,0:{start:0,prevCC:-1,new:!1}},this.captionsProperties=void 0,this.hls=t,this.config=t.config,this.Cues=t.config.cueHandler,this.captionsProperties={textTrack1:{label:this.config.captionsTextTrack1Label,languageCode:this.config.captionsTextTrack1LanguageCode},textTrack2:{label:this.config.captionsTextTrack2Label,languageCode:this.config.captionsTextTrack2LanguageCode},textTrack3:{label:this.config.captionsTextTrack3Label,languageCode:this.config.captionsTextTrack3LanguageCode},textTrack4:{label:this.config.captionsTextTrack4Label,languageCode:this.config.captionsTextTrack4LanguageCode}},this.config.enableCEA708Captions){var e=new Ve(this,"textTrack1"),r=new Ve(this,"textTrack2"),i=new Ve(this,"textTrack3"),n=new Ve(this,"textTrack4");this.cea608Parser1=new He(1,e,r),this.cea608Parser2=new He(3,i,n)}t.on(a.a.MEDIA_ATTACHING,this.onMediaAttaching,this),t.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.on(a.a.MANIFEST_LOADED,this.onManifestLoaded,this),t.on(a.a.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),t.on(a.a.FRAG_LOADING,this.onFragLoading,this),t.on(a.a.FRAG_LOADED,this.onFragLoaded,this),t.on(a.a.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),t.on(a.a.FRAG_DECRYPTED,this.onFragDecrypted,this),t.on(a.a.INIT_PTS_FOUND,this.onInitPtsFound,this),t.on(a.a.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),t.on(a.a.BUFFER_FLUSHING,this.onBufferFlushing,this)}var e=t.prototype;return e.destroy=function(){var t=this.hls;t.off(a.a.MEDIA_ATTACHING,this.onMediaAttaching,this),t.off(a.a.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(a.a.MANIFEST_LOADING,this.onManifestLoading,this),t.off(a.a.MANIFEST_LOADED,this.onManifestLoaded,this),t.off(a.a.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),t.off(a.a.FRAG_LOADING,this.onFragLoading,this),t.off(a.a.FRAG_LOADED,this.onFragLoaded,this),t.off(a.a.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),t.off(a.a.FRAG_DECRYPTED,this.onFragDecrypted,this),t.off(a.a.INIT_PTS_FOUND,this.onInitPtsFound,this),t.off(a.a.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),t.off(a.a.BUFFER_FLUSHING,this.onBufferFlushing,this),this.hls=this.config=this.cea608Parser1=this.cea608Parser2=null},e.addCues=function(t,e,r,i,n){for(var s,o,l,u,h=!1,d=n.length;d--;){var c=n[d],f=(s=c[0],o=c[1],l=e,u=r,Math.min(o,u)-Math.max(s,l));if(f>=0&&(c[0]=Math.min(c[0],e),c[1]=Math.max(c[1],r),h=!0,f/(r-e)>.5))return}if(h||n.push([e,r]),this.config.renderTextTracksNatively){var g=this.captionsTracks[t];this.Cues.newCue(g,e,r,i)}else{var v=this.Cues.newCue(null,e,r,i);this.hls.trigger(a.a.CUES_PARSED,{type:"captions",cues:v,track:t})}},e.onInitPtsFound=function(t,e){var r=this,i=e.frag,n=e.id,s=e.initPTS,o=e.timescale,l=this.unparsedVttFrags;"main"===n&&(this.initPTS[i.cc]=s,this.timescale[i.cc]=o),l.length&&(this.unparsedVttFrags=[],l.forEach((function(t){r.onFragLoaded(a.a.FRAG_LOADED,t)})))},e.getExistingTrack=function(t){var e=this.media;if(e)for(var r=0;r<e.textTracks.length;r++){var i=e.textTracks[r];if(i[t])return i}return null},e.createCaptionsTrack=function(t){this.config.renderTextTracksNatively?this.createNativeTrack(t):this.createNonNativeTrack(t)},e.createNativeTrack=function(t){if(!this.captionsTracks[t]){var e=this.captionsProperties,r=this.captionsTracks,i=this.media,n=e[t],a=n.label,s=n.languageCode,o=this.getExistingTrack(t);if(o)r[t]=o,x(r[t]),w(r[t],i);else{var l=this.createTextTrack("captions",a,s);l&&(l[t]=!0,r[t]=l)}}},e.createNonNativeTrack=function(t){if(!this.nonNativeCaptionsTracks[t]){var e=this.captionsProperties[t];if(e){var r={_id:t,label:e.label,kind:"captions",default:!!e.media&&!!e.media.default,closedCaptions:e.media};this.nonNativeCaptionsTracks[t]=r,this.hls.trigger(a.a.NON_NATIVE_TEXT_TRACKS_FOUND,{tracks:[r]})}}},e.createTextTrack=function(t,e,r){var i=this.media;if(i)return i.addTextTrack(t,e,r)},e.onMediaAttaching=function(t,e){this.media=e.media,this._cleanTracks()},e.onMediaDetaching=function(){var t=this.captionsTracks;Object.keys(t).forEach((function(e){x(t[e]),delete t[e]})),this.nonNativeCaptionsTracks={}},e.onManifestLoading=function(){this.lastSn=-1,this.prevCC=-1,this.vttCCs={ccOffset:0,presentationOffset:0,0:{start:0,prevCC:-1,new:!1}},this._cleanTracks(),this.tracks=[],this.captionsTracks={},this.nonNativeCaptionsTracks={},this.textTracks=[],this.unparsedVttFrags=this.unparsedVttFrags||[],this.initPTS=[],this.timescale=[],this.cea608Parser1&&this.cea608Parser2&&(this.cea608Parser1.reset(),this.cea608Parser2.reset())},e._cleanTracks=function(){var t=this.media;if(t){var e=t.textTracks;if(e)for(var r=0;r<e.length;r++)x(e[r])}},e.onSubtitleTracksUpdated=function(t,e){var r=this;this.textTracks=[];var i=e.subtitleTracks||[],n=i.some((function(t){return"stpp.ttml.im1t"===t.textCodec}));if(this.config.enableWebVTT||n&&this.config.enableIMSC1){var s=this.tracks&&i&&this.tracks.length===i.length;if(this.tracks=i||[],this.config.renderTextTracksNatively){var o=this.media?this.media.textTracks:[];this.tracks.forEach((function(t,e){var i;if(e<o.length){for(var n=null,a=0;a<o.length;a++)if(Tr(o[a],t)){n=o[a];break}n&&(i=n)}i?x(i):(i=r.createTextTrack("subtitles",t.name,t.lang))&&(i.mode="disabled"),i&&(i.groupId=t.groupId,r.textTracks.push(i))}))}else if(!s&&this.tracks&&this.tracks.length){var l=this.tracks.map((function(t){return{label:t.name,kind:t.type.toLowerCase(),default:t.default,subtitleTrack:t}}));this.hls.trigger(a.a.NON_NATIVE_TEXT_TRACKS_FOUND,{tracks:l})}}},e.onManifestLoaded=function(t,e){var r=this;this.config.enableCEA708Captions&&e.captions&&e.captions.forEach((function(t){var e=/(?:CC|SERVICE)([1-4])/.exec(t.instreamId);if(e){var i="textTrack"+e[1],n=r.captionsProperties[i];n&&(n.label=t.name,t.lang&&(n.languageCode=t.lang),n.media=t)}}))},e.onFragLoading=function(t,e){var r=this.cea608Parser1,i=this.cea608Parser2,n=this.lastSn;if(this.enabled&&r&&i&&e.frag.type===k.b.MAIN){var a=e.frag.sn;a!==n+1&&(r.reset(),i.reset()),this.lastSn=a}},e.onFragLoaded=function(t,e){var r=e.frag,i=e.payload,s=this.initPTS,o=this.unparsedVttFrags;if(r.type===k.b.SUBTITLE)if(i.byteLength){if(!Object(n.a)(s[r.cc]))return o.push(e),void(s.length&&this.hls.trigger(a.a.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:r,error:new Error("Missing initial subtitle PTS")}));var l=r.decryptdata;if(null==l||null==l.key||"AES-128"!==l.method){var u=this.tracks[r.level],h=this.vttCCs;h[r.cc]||(h[r.cc]={start:r.start,prevCC:this.prevCC,new:!0},this.prevCC=r.cc),u&&"stpp.ttml.im1t"===u.textCodec?this._parseIMSC1(r,i):this._parseVTTs(r,i,h)}}else this.hls.trigger(a.a.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:r,error:new Error("Empty subtitle payload")})},e._parseIMSC1=function(t,e){var r=this,i=this.hls;cr(e,this.initPTS[t.cc],this.timescale[t.cc],(function(e){r._appendCues(e,t.level),i.trigger(a.a.SUBTITLE_FRAG_PROCESSED,{success:!0,frag:t})}),(function(e){o.b.log("Failed to parse IMSC1: "+e),i.trigger(a.a.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:t,error:e})}))},e._parseVTTs=function(t,e,r){var i=this,n=this.hls;or(e,this.initPTS[t.cc],this.timescale[t.cc],r,t.cc,t.start,(function(e){i._appendCues(e,t.level),n.trigger(a.a.SUBTITLE_FRAG_PROCESSED,{success:!0,frag:t})}),(function(r){i._fallbackToIMSC1(t,e),o.b.log("Failed to parse VTT cue: "+r),n.trigger(a.a.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:t,error:r})}))},e._fallbackToIMSC1=function(t,e){var r=this,i=this.tracks[t.level];i.textCodec||cr(e,this.initPTS[t.cc],this.timescale[t.cc],(function(){i.textCodec="stpp.ttml.im1t",r._parseIMSC1(t,e)}),(function(){i.textCodec="wvtt"}))},e._appendCues=function(t,e){var r=this.hls;if(this.config.renderTextTracksNatively){var i=this.textTracks[e];if("disabled"===i.mode)return;t.forEach((function(t){return O(i,t)}))}else{var n=this.tracks[e].default?"default":"subtitles"+e;r.trigger(a.a.CUES_PARSED,{type:"subtitles",cues:t,track:n})}},e.onFragDecrypted=function(t,e){var r=e.frag;if(r.type===k.b.SUBTITLE){if(!Object(n.a)(this.initPTS[r.cc]))return void this.unparsedVttFrags.push(e);this.onFragLoaded(a.a.FRAG_LOADED,e)}},e.onSubtitleTracksCleared=function(){this.tracks=[],this.captionsTracks={}},e.onFragParsingUserdata=function(t,e){var r=this.cea608Parser1,i=this.cea608Parser2;if(this.enabled&&r&&i)for(var n=0;n<e.samples.length;n++){var a=e.samples[n].bytes;if(a){var s=this.extractCea608Data(a);r.addData(e.samples[n].pts,s[0]),i.addData(e.samples[n].pts,s[1])}}},e.onBufferFlushing=function(t,e){var r=e.startOffset,i=e.endOffset,n=e.endOffsetSubtitles,a=e.type,s=this.media;if(s&&!(s.currentTime<i)){if(!a||"video"===a){var o=this.captionsTracks;Object.keys(o).forEach((function(t){return P(o[t],r,i)}))}if(this.config.renderTextTracksNatively&&0===r&&void 0!==n){var l=this.textTracks;Object.keys(l).forEach((function(t){return P(l[t],r,n)}))}}},e.extractCea608Data=function(t){for(var e=31&t[0],r=2,i=[[],[]],n=0;n<e;n++){var a=t[r++],s=127&t[r++],o=127&t[r++],l=3&a;0===s&&0===o||0!=(4&a)&&(0!==l&&1!==l||(i[l].push(s),i[l].push(o)))}return i},t}();function Tr(t,e){return t&&t.label===e.name&&!(t.textTrack1||t.textTrack2)}function br(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var Er,Sr=function(){function t(t){this.autoLevelCapping=void 0,this.firstLevel=void 0,this.media=void 0,this.restrictedLevels=void 0,this.timer=void 0,this.hls=void 0,this.streamController=void 0,this.clientRect=void 0,this.hls=t,this.autoLevelCapping=Number.POSITIVE_INFINITY,this.firstLevel=-1,this.media=null,this.restrictedLevels=[],this.timer=void 0,this.clientRect=null,this.registerListeners()}var e,r,i,n=t.prototype;return n.setStreamController=function(t){this.streamController=t},n.destroy=function(){this.unregisterListener(),this.hls.config.capLevelToPlayerSize&&this.stopCapping(),this.media=null,this.clientRect=null,this.hls=this.streamController=null},n.registerListeners=function(){var t=this.hls;t.on(a.a.FPS_DROP_LEVEL_CAPPING,this.onFpsDropLevelCapping,this),t.on(a.a.MEDIA_ATTACHING,this.onMediaAttaching,this),t.on(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.on(a.a.BUFFER_CODECS,this.onBufferCodecs,this),t.on(a.a.MEDIA_DETACHING,this.onMediaDetaching,this)},n.unregisterListener=function(){var t=this.hls;t.off(a.a.FPS_DROP_LEVEL_CAPPING,this.onFpsDropLevelCapping,this),t.off(a.a.MEDIA_ATTACHING,this.onMediaAttaching,this),t.off(a.a.MANIFEST_PARSED,this.onManifestParsed,this),t.off(a.a.BUFFER_CODECS,this.onBufferCodecs,this),t.off(a.a.MEDIA_DETACHING,this.onMediaDetaching,this)},n.onFpsDropLevelCapping=function(e,r){t.isLevelAllowed(r.droppedLevel,this.restrictedLevels)&&this.restrictedLevels.push(r.droppedLevel)},n.onMediaAttaching=function(t,e){this.media=e.media instanceof HTMLVideoElement?e.media:null},n.onManifestParsed=function(t,e){var r=this.hls;this.restrictedLevels=[],this.firstLevel=e.firstLevel,r.config.capLevelToPlayerSize&&e.video&&this.startCapping()},n.onBufferCodecs=function(t,e){this.hls.config.capLevelToPlayerSize&&e.video&&this.startCapping()},n.onMediaDetaching=function(){this.stopCapping()},n.detectPlayerSize=function(){if(this.media&&this.mediaHeight>0&&this.mediaWidth>0){var t=this.hls.levels;if(t.length){var e=this.hls;e.autoLevelCapping=this.getMaxLevel(t.length-1),e.autoLevelCapping>this.autoLevelCapping&&this.streamController&&this.streamController.nextLevelSwitch(),this.autoLevelCapping=e.autoLevelCapping}}},n.getMaxLevel=function(e){var r=this,i=this.hls.levels;if(!i.length)return-1;var n=i.filter((function(i,n){return t.isLevelAllowed(n,r.restrictedLevels)&&n<=e}));return this.clientRect=null,t.getMaxLevelByMediaSize(n,this.mediaWidth,this.mediaHeight)},n.startCapping=function(){this.timer||(this.autoLevelCapping=Number.POSITIVE_INFINITY,this.hls.firstLevel=this.getMaxLevel(this.firstLevel),self.clearInterval(this.timer),this.timer=self.setInterval(this.detectPlayerSize.bind(this),1e3),this.detectPlayerSize())},n.stopCapping=function(){this.restrictedLevels=[],this.firstLevel=-1,this.autoLevelCapping=Number.POSITIVE_INFINITY,this.timer&&(self.clearInterval(this.timer),this.timer=void 0)},n.getDimensions=function(){if(this.clientRect)return this.clientRect;var t=this.media,e={width:0,height:0};if(t){var r=t.getBoundingClientRect();e.width=r.width,e.height=r.height,e.width||e.height||(e.width=r.right-r.left||t.width||0,e.height=r.bottom-r.top||t.height||0)}return this.clientRect=e,e},t.isLevelAllowed=function(t,e){return void 0===e&&(e=[]),-1===e.indexOf(t)},t.getMaxLevelByMediaSize=function(t,e,r){if(!t||!t.length)return-1;for(var i,n,a=t.length-1,s=0;s<t.length;s+=1){var o=t[s];if((o.width>=e||o.height>=r)&&(i=o,!(n=t[s+1])||i.width!==n.width||i.height!==n.height)){a=s;break}}return a},e=t,i=[{key:"contentScaleFactor",get:function(){var t=1;try{t=self.devicePixelRatio}catch(t){}return t}}],(r=[{key:"mediaWidth",get:function(){return this.getDimensions().width*t.contentScaleFactor}},{key:"mediaHeight",get:function(){return this.getDimensions().height*t.contentScaleFactor}}])&&br(e.prototype,r),i&&br(e,i),t}(),Lr=function(){function t(t){this.hls=void 0,this.isVideoPlaybackQualityAvailable=!1,this.timer=void 0,this.media=null,this.lastTime=void 0,this.lastDroppedFrames=0,this.lastDecodedFrames=0,this.streamController=void 0,this.hls=t,this.registerListeners()}var e=t.prototype;return e.setStreamController=function(t){this.streamController=t},e.registerListeners=function(){this.hls.on(a.a.MEDIA_ATTACHING,this.onMediaAttaching,this)},e.unregisterListeners=function(){this.hls.off(a.a.MEDIA_ATTACHING,this.onMediaAttaching)},e.destroy=function(){this.timer&&clearInterval(this.timer),this.unregisterListeners(),this.isVideoPlaybackQualityAvailable=!1,this.media=null},e.onMediaAttaching=function(t,e){var r=this.hls.config;if(r.capLevelOnFPSDrop){var i=e.media instanceof self.HTMLVideoElement?e.media:null;this.media=i,i&&"function"==typeof i.getVideoPlaybackQuality&&(this.isVideoPlaybackQualityAvailable=!0),self.clearInterval(this.timer),this.timer=self.setInterval(this.checkFPSInterval.bind(this),r.fpsDroppedMonitoringPeriod)}},e.checkFPS=function(t,e,r){var i=performance.now();if(e){if(this.lastTime){var n=i-this.lastTime,s=r-this.lastDroppedFrames,l=e-this.lastDecodedFrames,u=1e3*s/n,h=this.hls;if(h.trigger(a.a.FPS_DROP,{currentDropped:s,currentDecoded:l,totalDroppedFrames:r}),u>0&&s>h.config.fpsDroppedMonitoringThreshold*l){var d=h.currentLevel;o.b.warn("drop FPS ratio greater than max allowed value for currentLevel: "+d),d>0&&(-1===h.autoLevelCapping||h.autoLevelCapping>=d)&&(d-=1,h.trigger(a.a.FPS_DROP_LEVEL_CAPPING,{level:d,droppedLevel:h.currentLevel}),h.autoLevelCapping=d,this.streamController.nextLevelSwitch())}}this.lastTime=i,this.lastDroppedFrames=r,this.lastDecodedFrames=e}},e.checkFPSInterval=function(){var t=this.media;if(t)if(this.isVideoPlaybackQualityAvailable){var e=t.getVideoPlaybackQuality();this.checkFPS(t,e.totalVideoFrames,e.droppedVideoFrames)}else this.checkFPS(t,t.webkitDecodedFrameCount,t.webkitDroppedFrameCount)},t}();!function(t){t.WIDEVINE="com.widevine.alpha",t.PLAYREADY="com.microsoft.playready"}(Er||(Er={}));var Ar="undefined"!=typeof self&&self.navigator&&self.navigator.requestMediaKeySystemAccess?self.navigator.requestMediaKeySystemAccess.bind(self.navigator):null;function Rr(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var Dr,kr,_r,Ir=function(){function t(t){this.hls=void 0,this._widevineLicenseUrl=void 0,this._licenseXhrSetup=void 0,this._licenseResponseCallback=void 0,this._emeEnabled=void 0,this._requestMediaKeySystemAccess=void 0,this._drmSystemOptions=void 0,this._config=void 0,this._mediaKeysList=[],this._media=null,this._hasSetMediaKeys=!1,this._requestLicenseFailureCount=0,this.mediaKeysPromise=null,this._onMediaEncrypted=this.onMediaEncrypted.bind(this),this.hls=t,this._config=t.config,this._widevineLicenseUrl=this._config.widevineLicenseUrl,this._licenseXhrSetup=this._config.licenseXhrSetup,this._licenseResponseCallback=this._config.licenseResponseCallback,this._emeEnabled=this._config.emeEnabled,this._requestMediaKeySystemAccess=this._config.requestMediaKeySystemAccessFunc,this._drmSystemOptions=this._config.drmSystemOptions,this._registerListeners()}var e,r,i,n=t.prototype;return n.destroy=function(){this._unregisterListeners(),this.hls=this._onMediaEncrypted=null,this._requestMediaKeySystemAccess=null},n._registerListeners=function(){this.hls.on(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),this.hls.on(a.a.MEDIA_DETACHED,this.onMediaDetached,this),this.hls.on(a.a.MANIFEST_PARSED,this.onManifestParsed,this)},n._unregisterListeners=function(){this.hls.off(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),this.hls.off(a.a.MEDIA_DETACHED,this.onMediaDetached,this),this.hls.off(a.a.MANIFEST_PARSED,this.onManifestParsed,this)},n.getLicenseServerUrl=function(t){switch(t){case Er.WIDEVINE:if(!this._widevineLicenseUrl)break;return this._widevineLicenseUrl}throw new Error('no license server URL configured for key-system "'+t+'"')},n._attemptKeySystemAccess=function(t,e,r){var i=this,n=function(t,e,r,i){switch(t){case Er.WIDEVINE:return function(t,e,r){var i={audioCapabilities:[],videoCapabilities:[]};return t.forEach((function(t){i.audioCapabilities.push({contentType:'audio/mp4; codecs="'+t+'"',robustness:r.audioRobustness||""})})),e.forEach((function(t){i.videoCapabilities.push({contentType:'video/mp4; codecs="'+t+'"',robustness:r.videoRobustness||""})})),[i]}(e,r,i);default:throw new Error("Unknown key-system: "+t)}}(t,e,r,this._drmSystemOptions);o.b.log("Requesting encrypted media key-system access");var a=this.requestMediaKeySystemAccess(t,n);this.mediaKeysPromise=a.then((function(e){return i._onMediaKeySystemAccessObtained(t,e)})),a.catch((function(e){o.b.error('Failed to obtain key-system "'+t+'" access:',e)}))},n._onMediaKeySystemAccessObtained=function(t,e){var r=this;o.b.log('Access for key-system "'+t+'" obtained');var i={mediaKeysSessionInitialized:!1,mediaKeySystemAccess:e,mediaKeySystemDomain:t};this._mediaKeysList.push(i);var n=Promise.resolve().then((function(){return e.createMediaKeys()})).then((function(e){return i.mediaKeys=e,o.b.log('Media-keys created for key-system "'+t+'"'),r._onMediaKeysCreated(),e}));return n.catch((function(t){o.b.error("Failed to create media-keys:",t)})),n},n._onMediaKeysCreated=function(){var t=this;this._mediaKeysList.forEach((function(e){e.mediaKeysSession||(e.mediaKeysSession=e.mediaKeys.createSession(),t._onNewMediaKeySession(e.mediaKeysSession))}))},n._onNewMediaKeySession=function(t){var e=this;o.b.log("New key-system session "+t.sessionId),t.addEventListener("message",(function(r){e._onKeySessionMessage(t,r.message)}),!1)},n._onKeySessionMessage=function(t,e){o.b.log("Got EME message event, creating license request"),this._requestLicense(e,(function(e){o.b.log("Received license data (length: "+(e?e.byteLength:e)+"), updating key-session"),t.update(e)}))},n.onMediaEncrypted=function(t){var e=this;if(o.b.log('Media is encrypted using "'+t.initDataType+'" init data type'),!this.mediaKeysPromise)return o.b.error("Fatal: Media is encrypted but no CDM access or no keys have been requested"),void this.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_NO_KEYS,fatal:!0});var r=function(r){e._media&&(e._attemptSetMediaKeys(r),e._generateRequestWithPreferredKeySession(t.initDataType,t.initData))};this.mediaKeysPromise.then(r).catch(r)},n._attemptSetMediaKeys=function(t){if(!this._media)throw new Error("Attempted to set mediaKeys without first attaching a media element");if(!this._hasSetMediaKeys){var e=this._mediaKeysList[0];if(!e||!e.mediaKeys)return o.b.error("Fatal: Media is encrypted but no CDM access or no keys have been obtained yet"),void this.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_NO_KEYS,fatal:!0});o.b.log("Setting keys for encrypted media"),this._media.setMediaKeys(e.mediaKeys),this._hasSetMediaKeys=!0}},n._generateRequestWithPreferredKeySession=function(t,e){var r=this,i=this._mediaKeysList[0];if(!i)return o.b.error("Fatal: Media is encrypted but not any key-system access has been obtained yet"),void this.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_NO_ACCESS,fatal:!0});if(i.mediaKeysSessionInitialized)o.b.warn("Key-Session already initialized but requested again");else{var n=i.mediaKeysSession;if(!n)return o.b.error("Fatal: Media is encrypted but no key-session existing"),void this.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_NO_SESSION,fatal:!0});if(!e)return o.b.warn("Fatal: initData required for generating a key session is null"),void this.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_NO_INIT_DATA,fatal:!0});o.b.log('Generating key-session request for "'+t+'" init data type'),i.mediaKeysSessionInitialized=!0,n.generateRequest(t,e).then((function(){o.b.debug("Key-session generation succeeded")})).catch((function(t){o.b.error("Error generating key-session request:",t),r.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_NO_SESSION,fatal:!1})}))}},n._createLicenseXhr=function(t,e,r){var i=new XMLHttpRequest;i.responseType="arraybuffer",i.onreadystatechange=this._onLicenseRequestReadyStageChange.bind(this,i,t,e,r);var n=this._licenseXhrSetup;if(n)try{n.call(this.hls,i,t),n=void 0}catch(t){o.b.error(t)}try{i.readyState||i.open("POST",t,!0),n&&n.call(this.hls,i,t)}catch(t){throw new Error("issue setting up KeySystem license XHR "+t)}return i},n._onLicenseRequestReadyStageChange=function(t,e,r,i){switch(t.readyState){case 4:if(200===t.status){this._requestLicenseFailureCount=0,o.b.log("License request succeeded");var n=t.response,l=this._licenseResponseCallback;if(l)try{n=l.call(this.hls,t,e)}catch(t){o.b.error(t)}i(n)}else{if(o.b.error("License Request XHR failed ("+e+"). Status: "+t.status+" ("+t.statusText+")"),this._requestLicenseFailureCount++,this._requestLicenseFailureCount>3)return void this.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_LICENSE_REQUEST_FAILED,fatal:!0});var u=3-this._requestLicenseFailureCount+1;o.b.warn("Retrying license request, "+u+" attempts left"),this._requestLicense(r,i)}}},n._generateLicenseRequestChallenge=function(t,e){switch(t.mediaKeySystemDomain){case Er.WIDEVINE:return e}throw new Error("unsupported key-system: "+t.mediaKeySystemDomain)},n._requestLicense=function(t,e){o.b.log("Requesting content license for key-system");var r=this._mediaKeysList[0];if(!r)return o.b.error("Fatal error: Media is encrypted but no key-system access has been obtained yet"),void this.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_NO_ACCESS,fatal:!0});try{var i=this.getLicenseServerUrl(r.mediaKeySystemDomain),n=this._createLicenseXhr(i,t,e);o.b.log("Sending license request to URL: "+i);var l=this._generateLicenseRequestChallenge(r,t);n.send(l)}catch(t){o.b.error("Failure requesting DRM license: "+t),this.hls.trigger(a.a.ERROR,{type:s.b.KEY_SYSTEM_ERROR,details:s.a.KEY_SYSTEM_LICENSE_REQUEST_FAILED,fatal:!0})}},n.onMediaAttached=function(t,e){if(this._emeEnabled){var r=e.media;this._media=r,r.addEventListener("encrypted",this._onMediaEncrypted)}},n.onMediaDetached=function(){var t=this._media,e=this._mediaKeysList;t&&(t.removeEventListener("encrypted",this._onMediaEncrypted),this._media=null,this._mediaKeysList=[],Promise.all(e.map((function(t){if(t.mediaKeysSession)return t.mediaKeysSession.close().catch((function(){}))}))).then((function(){return t.setMediaKeys(null)})).catch((function(){})))},n.onManifestParsed=function(t,e){if(this._emeEnabled){var r=e.levels.map((function(t){return t.audioCodec})).filter((function(t){return!!t})),i=e.levels.map((function(t){return t.videoCodec})).filter((function(t){return!!t}));this._attemptKeySystemAccess(Er.WIDEVINE,r,i)}},e=t,(r=[{key:"requestMediaKeySystemAccess",get:function(){if(!this._requestMediaKeySystemAccess)throw new Error("No requestMediaKeySystemAccess function configured");return this._requestMediaKeySystemAccess}}])&&Rr(e.prototype,r),i&&Rr(e,i),t}();function Cr(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function wr(t,e,r){return e&&Cr(t.prototype,e),r&&Cr(t,r),t}function Or(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(!t)return;if("string"==typeof t)return xr(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return xr(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function xr(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,i=new Array(e);r<e;r++)i[r]=t[r];return i}function Pr(){return(Pr=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t}).apply(this,arguments)}!function(t){t.MANIFEST="m",t.AUDIO="a",t.VIDEO="v",t.MUXED="av",t.INIT="i",t.CAPTION="c",t.TIMED_TEXT="tt",t.KEY="k",t.OTHER="o"}(Dr||(Dr={})),function(t){t.DASH="d",t.HLS="h",t.SMOOTH="s",t.OTHER="o"}(kr||(kr={})),function(t){t.VOD="v",t.LIVE="l"}(_r||(_r={}));var Mr=function(){function t(e){var r=this;this.hls=void 0,this.config=void 0,this.media=void 0,this.sid=void 0,this.cid=void 0,this.useHeaders=!1,this.initialized=!1,this.starved=!1,this.buffering=!0,this.audioBuffer=void 0,this.videoBuffer=void 0,this.onWaiting=function(){r.initialized&&(r.starved=!0),r.buffering=!0},this.onPlaying=function(){r.initialized||(r.initialized=!0),r.buffering=!1},this.applyPlaylistData=function(t){try{r.apply(t,{ot:Dr.MANIFEST,su:!r.initialized})}catch(t){o.b.warn("Could not generate manifest CMCD data.",t)}},this.applyFragmentData=function(t){try{var e=t.frag,i=r.hls.levels[e.level],n=r.getObjectType(e),a={d:1e3*e.duration,ot:n};n!==Dr.VIDEO&&n!==Dr.AUDIO&&n!=Dr.MUXED||(a.br=i.bitrate/1e3,a.tb=r.getTopBandwidth(n),a.bl=r.getBufferLength(n)),r.apply(t,a)}catch(t){o.b.warn("Could not generate segment CMCD data.",t)}},this.hls=e;var i=this.config=e.config,n=i.cmcd;null!=n&&(i.pLoader=this.createPlaylistLoader(),i.fLoader=this.createFragmentLoader(),this.sid=n.sessionId||t.uuid(),this.cid=n.contentId,this.useHeaders=!0===n.useHeaders,this.registerListeners())}var e=t.prototype;return e.registerListeners=function(){var t=this.hls;t.on(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(a.a.MEDIA_DETACHED,this.onMediaDetached,this),t.on(a.a.BUFFER_CREATED,this.onBufferCreated,this)},e.unregisterListeners=function(){var t=this.hls;t.off(a.a.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(a.a.MEDIA_DETACHED,this.onMediaDetached,this),t.off(a.a.BUFFER_CREATED,this.onBufferCreated,this),this.onMediaDetached()},e.destroy=function(){this.unregisterListeners(),this.hls=this.config=this.audioBuffer=this.videoBuffer=null},e.onMediaAttached=function(t,e){this.media=e.media,this.media.addEventListener("waiting",this.onWaiting),this.media.addEventListener("playing",this.onPlaying)},e.onMediaDetached=function(){this.media&&(this.media.removeEventListener("waiting",this.onWaiting),this.media.removeEventListener("playing",this.onPlaying),this.media=null)},e.onBufferCreated=function(t,e){var r,i;this.audioBuffer=null===(r=e.tracks.audio)||void 0===r?void 0:r.buffer,this.videoBuffer=null===(i=e.tracks.video)||void 0===i?void 0:i.buffer},e.createData=function(){var t;return{v:1,sf:kr.HLS,sid:this.sid,cid:this.cid,pr:null===(t=this.media)||void 0===t?void 0:t.playbackRate,mtp:this.hls.bandwidthEstimate/1e3}},e.apply=function(e,r){void 0===r&&(r={}),Pr(r,this.createData());var i=r.ot===Dr.INIT||r.ot===Dr.VIDEO||r.ot===Dr.MUXED;if(this.starved&&i&&(r.bs=!0,r.su=!0,this.starved=!1),null==r.su&&(r.su=this.buffering),this.useHeaders){var n=t.toHeaders(r);if(!Object.keys(n).length)return;e.headers||(e.headers={}),Pr(e.headers,n)}else{var a=t.toQuery(r);if(!a)return;e.url=t.appendQueryToUri(e.url,a)}},e.getObjectType=function(t){var e=t.type;return"subtitle"===e?Dr.TIMED_TEXT:"initSegment"===t.sn?Dr.INIT:"audio"===e?Dr.AUDIO:"main"===e?this.hls.audioTracks.length?Dr.VIDEO:Dr.MUXED:void 0},e.getTopBandwidth=function(t){for(var e,r=0,i=Or(t===Dr.AUDIO?this.hls.audioTracks:this.hls.levels);!(e=i()).done;){var n=e.value;n.bitrate>r&&(r=n.bitrate)}return r>0?r:NaN},e.getBufferLength=function(t){var e=this.hls.media,r=t===Dr.AUDIO?this.audioBuffer:this.videoBuffer;return r&&e?1e3*lt.bufferInfo(r,e.currentTime,this.config.maxBufferHole).len:NaN},e.createPlaylistLoader=function(){var t=this.config.pLoader,e=this.applyPlaylistData,r=t||this.config.loader;return function(){function t(t){this.loader=void 0,this.loader=new r(t)}var i=t.prototype;return i.destroy=function(){this.loader.destroy()},i.abort=function(){this.loader.abort()},i.load=function(t,r,i){e(t),this.loader.load(t,r,i)},wr(t,[{key:"stats",get:function(){return this.loader.stats}},{key:"context",get:function(){return this.loader.context}}]),t}()},e.createFragmentLoader=function(){var t=this.config.fLoader,e=this.applyFragmentData,r=t||this.config.loader;return function(){function t(t){this.loader=void 0,this.loader=new r(t)}var i=t.prototype;return i.destroy=function(){this.loader.destroy()},i.abort=function(){this.loader.abort()},i.load=function(t,r,i){e(t),this.loader.load(t,r,i)},wr(t,[{key:"stats",get:function(){return this.loader.stats}},{key:"context",get:function(){return this.loader.context}}]),t}()},t.uuid=function(){var t=URL.createObjectURL(new Blob),e=t.toString();return URL.revokeObjectURL(t),e.substr(e.lastIndexOf("/")+1)},t.serialize=function(t){for(var e,r=[],i=function(t){return!Number.isNaN(t)&&null!=t&&""!==t&&!1!==t},n=function(t){return Math.round(t)},a=function(t){return 100*n(t/100)},s={br:n,d:n,bl:a,dl:a,mtp:a,nor:function(t){return encodeURIComponent(t)},rtp:a,tb:n},o=Or(Object.keys(t||{}).sort());!(e=o()).done;){var l=e.value,u=t[l];if(i(u)&&!("v"===l&&1===u||"pr"==l&&1===u)){var h=s[l];h&&(u=h(u));var d=typeof u,c=void 0;c="ot"===l||"sf"===l||"st"===l?l+"="+u:"boolean"===d?l:"number"===d?l+"="+u:l+"="+JSON.stringify(u),r.push(c)}}return r.join(",")},t.toHeaders=function(e){for(var r={},i=["Object","Request","Session","Status"],n=[{},{},{},{}],a={br:0,d:0,ot:0,tb:0,bl:1,dl:1,mtp:1,nor:1,nrr:1,su:1,cid:2,pr:2,sf:2,sid:2,st:2,v:2,bs:3,rtp:3},s=0,o=Object.keys(e);s<o.length;s++){var l=o[s];n[null!=a[l]?a[l]:1][l]=e[l]}for(var u=0;u<n.length;u++){var h=t.serialize(n[u]);h&&(r["CMCD-"+i[u]]=h)}return r},t.toQuery=function(e){return"CMCD="+encodeURIComponent(t.serialize(e))},t.appendQueryToUri=function(t,e){if(!e)return t;var r=t.includes("?")?"&":"?";return""+t+r+e},t}(),Fr=r(12),Nr=/^age:\s*[\d.]+\s*$/m,Ur=function(){function t(t){this.xhrSetup=void 0,this.requestTimeout=void 0,this.retryTimeout=void 0,this.retryDelay=void 0,this.config=null,this.callbacks=null,this.context=void 0,this.loader=null,this.stats=void 0,this.xhrSetup=t?t.xhrSetup:null,this.stats=new Fr.a,this.retryDelay=0}var e=t.prototype;return e.destroy=function(){this.callbacks=null,this.abortInternal(),this.loader=null,this.config=null},e.abortInternal=function(){var t=this.loader;self.clearTimeout(this.requestTimeout),self.clearTimeout(this.retryTimeout),t&&(t.onreadystatechange=null,t.onprogress=null,4!==t.readyState&&(this.stats.aborted=!0,t.abort()))},e.abort=function(){var t;this.abortInternal(),null!==(t=this.callbacks)&&void 0!==t&&t.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.loader)},e.load=function(t,e,r){if(this.stats.loading.start)throw new Error("Loader can only be used once.");this.stats.loading.start=self.performance.now(),this.context=t,this.config=e,this.callbacks=r,this.retryDelay=e.retryDelay,this.loadInternal()},e.loadInternal=function(){var t=this.config,e=this.context;if(t){var r=this.loader=new self.XMLHttpRequest,i=this.stats;i.loading.first=0,i.loaded=0;var n=this.xhrSetup;try{if(n)try{n(r,e.url)}catch(t){r.open("GET",e.url,!0),n(r,e.url)}r.readyState||r.open("GET",e.url,!0);var a=this.context.headers;if(a)for(var s in a)r.setRequestHeader(s,a[s])}catch(t){return void this.callbacks.onError({code:r.status,text:t.message},e,r)}e.rangeEnd&&r.setRequestHeader("Range","bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),r.onreadystatechange=this.readystatechange.bind(this),r.onprogress=this.loadprogress.bind(this),r.responseType=e.responseType,self.clearTimeout(this.requestTimeout),this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),t.timeout),r.send()}},e.readystatechange=function(){var t=this.context,e=this.loader,r=this.stats;if(t&&e){var i=e.readyState,n=this.config;if(!r.aborted&&i>=2)if(self.clearTimeout(this.requestTimeout),0===r.loading.first&&(r.loading.first=Math.max(self.performance.now(),r.loading.start)),4===i){e.onreadystatechange=null,e.onprogress=null;var a=e.status;if(a>=200&&a<300){var s,l;if(r.loading.end=Math.max(self.performance.now(),r.loading.first),l="arraybuffer"===t.responseType?(s=e.response).byteLength:(s=e.responseText).length,r.loaded=r.total=l,!this.callbacks)return;var u=this.callbacks.onProgress;if(u&&u(r,t,s,e),!this.callbacks)return;var h={url:e.responseURL,data:s};this.callbacks.onSuccess(h,r,t,e)}else r.retry>=n.maxRetry||a>=400&&a<499?(o.b.error(a+" while loading "+t.url),this.callbacks.onError({code:a,text:e.statusText},t,e)):(o.b.warn(a+" while loading "+t.url+", retrying in "+this.retryDelay+"..."),this.abortInternal(),this.loader=null,self.clearTimeout(this.retryTimeout),this.retryTimeout=self.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,n.maxRetryDelay),r.retry++)}else self.clearTimeout(this.requestTimeout),this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),n.timeout)}},e.loadtimeout=function(){o.b.warn("timeout while loading "+this.context.url);var t=this.callbacks;t&&(this.abortInternal(),t.onTimeout(this.stats,this.context,this.loader))},e.loadprogress=function(t){var e=this.stats;e.loaded=t.loaded,t.lengthComputable&&(e.total=t.total)},e.getCacheAge=function(){var t=null;if(this.loader&&Nr.test(this.loader.getAllResponseHeaders())){var e=this.loader.getResponseHeader("age");t=e?parseFloat(e):null}return t},t}();function Br(t){var e="function"==typeof Map?new Map:void 0;return(Br=function(t){if(null===t||(r=t,-1===Function.toString.call(r).indexOf("[native code]")))return t;var r;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,i)}function i(){return Gr(t,arguments,Hr(this).constructor)}return i.prototype=Object.create(t.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),jr(i,t)})(t)}function Gr(t,e,r){return(Gr=Kr()?Reflect.construct:function(t,e,r){var i=[null];i.push.apply(i,e);var n=new(Function.bind.apply(t,i));return r&&jr(n,r.prototype),n}).apply(null,arguments)}function Kr(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function jr(t,e){return(jr=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function Hr(t){return(Hr=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function Vr(){return(Vr=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t}).apply(this,arguments)}var Wr=function(){function t(t){this.fetchSetup=void 0,this.requestTimeout=void 0,this.request=void 0,this.response=void 0,this.controller=void 0,this.context=void 0,this.config=null,this.callbacks=null,this.stats=void 0,this.loader=null,this.fetchSetup=t.fetchSetup||Yr,this.controller=new self.AbortController,this.stats=new Fr.a}var e=t.prototype;return e.destroy=function(){this.loader=this.callbacks=null,this.abortInternal()},e.abortInternal=function(){var t=this.response;t&&t.ok||(this.stats.aborted=!0,this.controller.abort())},e.abort=function(){var t;this.abortInternal(),null!==(t=this.callbacks)&&void 0!==t&&t.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)},e.load=function(t,e,r){var i=this,a=this.stats;if(a.loading.start)throw new Error("Loader can only be used once.");a.loading.start=self.performance.now();var s=function(t,e){var r={method:"GET",mode:"cors",credentials:"same-origin",signal:e,headers:new self.Headers(Vr({},t.headers))};t.rangeEnd&&r.headers.set("Range","bytes="+t.rangeStart+"-"+String(t.rangeEnd-1));return r}(t,this.controller.signal),o=r.onProgress,l="arraybuffer"===t.responseType,u=l?"byteLength":"length";this.context=t,this.config=e,this.callbacks=r,this.request=this.fetchSetup(t,s),self.clearTimeout(this.requestTimeout),this.requestTimeout=self.setTimeout((function(){i.abortInternal(),r.onTimeout(a,t,i.response)}),e.timeout),self.fetch(this.request).then((function(r){if(i.response=i.loader=r,!r.ok){var s=r.status,u=r.statusText;throw new qr(u||"fetch, bad network response",s,r)}return a.loading.first=Math.max(self.performance.now(),a.loading.start),a.total=parseInt(r.headers.get("Content-Length")||"0"),o&&Object(n.a)(e.highWaterMark)?i.loadProgressively(r,a,t,e.highWaterMark,o):l?r.arrayBuffer():r.text()})).then((function(s){var l=i.response;self.clearTimeout(i.requestTimeout),a.loading.end=Math.max(self.performance.now(),a.loading.first),a.loaded=a.total=s[u];var h={url:l.url,data:s};o&&!Object(n.a)(e.highWaterMark)&&o(a,t,s,l),r.onSuccess(h,a,t,l)})).catch((function(e){if(self.clearTimeout(i.requestTimeout),!a.aborted){var n=e.code||0;r.onError({code:n,text:e.message},t,e.details)}}))},e.getCacheAge=function(){var t=null;if(this.response){var e=this.response.headers.get("age");t=e?parseFloat(e):null}return t},e.loadProgressively=function(t,e,r,i,n){void 0===i&&(i=0);var a=new le.a,s=t.body.getReader();return function o(){return s.read().then((function(s){if(s.done)return a.dataLength&&n(e,r,a.flush(),t),Promise.resolve(new ArrayBuffer(0));var l=s.value,u=l.length;return e.loaded+=u,u<i||a.dataLength?(a.push(l),a.dataLength>=i&&n(e,r,a.flush(),t)):n(e,r,l,t),o()})).catch((function(){return Promise.reject()}))}()},t}();function Yr(t,e){return new self.Request(t.url,e)}var qr=function(t){var e,r;function i(e,r,i){var n;return(n=t.call(this,e)||this).code=void 0,n.details=void 0,n.code=r,n.details=i,n}return r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,jr(e,r),i}(Br(Error)),Xr=Wr,zr=/\s/;function Qr(){return(Qr=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t}).apply(this,arguments)}function $r(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,i)}return r}function Jr(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?$r(Object(r),!0).forEach((function(e){Zr(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):$r(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function Zr(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var ti=Jr(Jr({autoStartLoad:!0,startPosition:-1,defaultAudioCodec:void 0,debug:!1,capLevelOnFPSDrop:!1,capLevelToPlayerSize:!1,initialLiveManifestSize:1,maxBufferLength:30,backBufferLength:1/0,maxBufferSize:6e7,maxBufferHole:.1,highBufferWatchdogPeriod:2,nudgeOffset:.1,nudgeMaxRetry:3,maxFragLookUpTolerance:.25,liveSyncDurationCount:3,liveMaxLatencyDurationCount:1/0,liveSyncDuration:void 0,liveMaxLatencyDuration:void 0,maxLiveSyncPlaybackRate:1,liveDurationInfinity:!1,liveBackBufferLength:null,maxMaxBufferLength:600,enableWorker:!0,enableSoftwareAES:!0,manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:1,manifestLoadingRetryDelay:1e3,manifestLoadingMaxRetryTimeout:64e3,startLevel:void 0,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,levelLoadingMaxRetryTimeout:64e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingMaxRetryTimeout:64e3,startFragPrefetch:!1,fpsDroppedMonitoringPeriod:5e3,fpsDroppedMonitoringThreshold:.2,appendErrorMaxRetry:3,loader:Ur,fLoader:void 0,pLoader:void 0,xhrSetup:void 0,licenseXhrSetup:void 0,licenseResponseCallback:void 0,abrController:oe,bufferController:De,capLevelController:Sr,fpsController:Lr,stretchShortVideoTrack:!1,maxAudioFramesDrift:1,forceKeyFrameOnDiscontinuity:!0,abrEwmaFastLive:3,abrEwmaSlowLive:9,abrEwmaFastVoD:3,abrEwmaSlowVoD:9,abrEwmaDefaultEstimate:5e5,abrBandWidthFactor:.95,abrBandWidthUpFactor:.7,abrMaxWithRealBitrate:!1,maxStarvationDelay:4,maxLoadingDelay:4,minAutoBitrate:0,emeEnabled:!1,widevineLicenseUrl:void 0,drmSystemOptions:{},requestMediaKeySystemAccessFunc:Ar,testBandwidth:!0,progressive:!1,lowLatencyMode:!0,cmcd:void 0},{cueHandler:{newCue:function(t,e,r,i){for(var n,a,s,o,l,u=[],h=self.VTTCue||self.TextTrackCue,d=0;d<i.rows.length;d++)if(s=!0,o=0,l="",!(n=i.rows[d]).isEmpty()){for(var c=0;c<n.chars.length;c++)zr.test(n.chars[c].uchar)&&s?o++:(l+=n.chars[c].uchar,s=!1);n.cueStartTime=e,e===r&&(r+=1e-4),o>=16?o--:o++;var f=Ze(l.trim()),g=sr(e,r,f);t&&t.cues&&t.cues.getCueById(g)||((a=new h(e,r,f)).id=g,a.line=d+1,a.align="left",a.position=10+Math.min(80,10*Math.floor(8*o/32)),u.push(a))}return t&&u.length&&(u.sort((function(t,e){return"auto"===t.line||"auto"===e.line?0:t.line>8&&e.line>8?e.line-t.line:t.line-e.line})),u.forEach((function(e){return O(t,e)}))),u}},enableCEA708Captions:!0,enableWebVTT:!0,enableIMSC1:!0,captionsTextTrack1Label:"English",captionsTextTrack1LanguageCode:"en",captionsTextTrack2Label:"Spanish",captionsTextTrack2LanguageCode:"es",captionsTextTrack3Label:"Unknown CC",captionsTextTrack3LanguageCode:"",captionsTextTrack4Label:"Unknown CC",captionsTextTrack4LanguageCode:"",renderTextTracksNatively:!0}),{},{subtitleStreamController:me,subtitleTrackController:Se,timelineController:yr,audioStreamController:de,audioTrackController:ge,emeController:Ir,cmcdController:Mr});function ei(t){var e=t.loader;e!==Xr&&e!==Ur?(o.b.log("[config]: Custom loader detected, cannot enable progressive streaming"),t.progressive=!1):function(){if(self.fetch&&self.AbortController&&self.ReadableStream&&self.Request)try{return new self.ReadableStream({}),!0}catch(t){}return!1}()&&(t.loader=Xr,t.progressive=!0,t.enableSoftwareAES=!0,o.b.log("[config]: Progressive streaming enabled, using FetchLoader"))}function ri(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var ii=function(){function t(e){void 0===e&&(e={}),this.config=void 0,this.userConfig=void 0,this.coreComponents=void 0,this.networkControllers=void 0,this._emitter=new $t.EventEmitter,this._autoLevelCapping=void 0,this.abrController=void 0,this.bufferController=void 0,this.capLevelController=void 0,this.latencyController=void 0,this.levelController=void 0,this.streamController=void 0,this.audioTrackController=void 0,this.subtitleTrackController=void 0,this.emeController=void 0,this.cmcdController=void 0,this._media=null,this.url=null;var r=this.config=function(t,e){if((e.liveSyncDurationCount||e.liveMaxLatencyDurationCount)&&(e.liveSyncDuration||e.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");if(void 0!==e.liveMaxLatencyDurationCount&&(void 0===e.liveSyncDurationCount||e.liveMaxLatencyDurationCount<=e.liveSyncDurationCount))throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"');if(void 0!==e.liveMaxLatencyDuration&&(void 0===e.liveSyncDuration||e.liveMaxLatencyDuration<=e.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"');return Qr({},t,e)}(t.DefaultConfig,e);this.userConfig=e,Object(o.a)(r.debug),this._autoLevelCapping=-1,r.progressive&&ei(r);var i=r.abrController,n=r.bufferController,a=r.capLevelController,s=r.fpsController,l=this.abrController=new i(this),u=this.bufferController=new n(this),h=this.capLevelController=new a(this),d=new s(this),c=new I(this),f=new C(this),g=new F(this),v=this.levelController=new rt(this),p=new it(this),m=this.streamController=new ie(this,p);h.setStreamController(m),d.setStreamController(m);var y=[v,m];this.networkControllers=y;var T=[c,f,l,u,h,d,g,p];this.audioTrackController=this.createController(r.audioTrackController,null,y),this.createController(r.audioStreamController,p,y),this.subtitleTrackController=this.createController(r.subtitleTrackController,null,y),this.createController(r.subtitleStreamController,p,y),this.createController(r.timelineController,null,T),this.emeController=this.createController(r.emeController,null,T),this.cmcdController=this.createController(r.cmcdController,null,T),this.latencyController=this.createController(B,null,T),this.coreComponents=T}t.isSupported=function(){return function(){var t=qt();if(!t)return!1;var e=Xt(),r=t&&"function"==typeof t.isTypeSupported&&t.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),i=!e||e.prototype&&"function"==typeof e.prototype.appendBuffer&&"function"==typeof e.prototype.remove;return!!r&&!!i}()};var e,r,n,l=t.prototype;return l.createController=function(t,e,r){if(t){var i=e?new t(this,e):new t(this);return r&&r.push(i),i}return null},l.on=function(t,e,r){void 0===r&&(r=this),this._emitter.on(t,e,r)},l.once=function(t,e,r){void 0===r&&(r=this),this._emitter.once(t,e,r)},l.removeAllListeners=function(t){this._emitter.removeAllListeners(t)},l.off=function(t,e,r,i){void 0===r&&(r=this),this._emitter.off(t,e,r,i)},l.listeners=function(t){return this._emitter.listeners(t)},l.emit=function(t,e,r){return this._emitter.emit(t,e,r)},l.trigger=function(t,e){if(this.config.debug)return this.emit(t,t,e);try{return this.emit(t,t,e)}catch(e){o.b.error("An internal error happened while handling event "+t+'. Error message: "'+e.message+'". Here is a stacktrace:',e),this.trigger(a.a.ERROR,{type:s.b.OTHER_ERROR,details:s.a.INTERNAL_EXCEPTION,fatal:!1,event:t,error:e})}return!1},l.listenerCount=function(t){return this._emitter.listenerCount(t)},l.destroy=function(){o.b.log("destroy"),this.trigger(a.a.DESTROYING,void 0),this.detachMedia(),this.removeAllListeners(),this._autoLevelCapping=-1,this.url=null,this.networkControllers.forEach((function(t){return t.destroy()})),this.networkControllers.length=0,this.coreComponents.forEach((function(t){return t.destroy()})),this.coreComponents.length=0},l.attachMedia=function(t){o.b.log("attachMedia"),this._media=t,this.trigger(a.a.MEDIA_ATTACHING,{media:t})},l.detachMedia=function(){o.b.log("detachMedia"),this.trigger(a.a.MEDIA_DETACHING,void 0),this._media=null},l.loadSource=function(t){this.stopLoad();var e=this.media,r=this.url,n=this.url=i.buildAbsoluteURL(self.location.href,t,{alwaysNormalize:!0});o.b.log("loadSource:"+n),e&&r&&r!==n&&this.bufferController.hasSourceTypes()&&(this.detachMedia(),this.attachMedia(e)),this.trigger(a.a.MANIFEST_LOADING,{url:t})},l.startLoad=function(t){void 0===t&&(t=-1),o.b.log("startLoad("+t+")"),this.networkControllers.forEach((function(e){e.startLoad(t)}))},l.stopLoad=function(){o.b.log("stopLoad"),this.networkControllers.forEach((function(t){t.stopLoad()}))},l.swapAudioCodec=function(){o.b.log("swapAudioCodec"),this.streamController.swapAudioCodec()},l.recoverMediaError=function(){o.b.log("recoverMediaError");var t=this._media;this.detachMedia(),t&&this.attachMedia(t)},l.removeLevel=function(t,e){void 0===e&&(e=0),this.levelController.removeLevel(t,e)},e=t,n=[{key:"version",get:function(){return"1.1.2-0.canary.8054"}},{key:"Events",get:function(){return a.a}},{key:"ErrorTypes",get:function(){return s.b}},{key:"ErrorDetails",get:function(){return s.a}},{key:"DefaultConfig",get:function(){return t.defaultConfig?t.defaultConfig:ti},set:function(e){t.defaultConfig=e}}],(r=[{key:"levels",get:function(){var t=this.levelController.levels;return t||[]}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(t){o.b.log("set currentLevel:"+t),this.loadLevel=t,this.abrController.clearTimer(),this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(t){o.b.log("set nextLevel:"+t),this.levelController.manualLevel=t,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(t){o.b.log("set loadLevel:"+t),this.levelController.manualLevel=t}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(t){this.levelController.nextLoadLevel=t}},{key:"firstLevel",get:function(){return Math.max(this.levelController.firstLevel,this.minAutoLevel)},set:function(t){o.b.log("set firstLevel:"+t),this.levelController.firstLevel=t}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(t){o.b.log("set startLevel:"+t),-1!==t&&(t=Math.max(t,this.minAutoLevel)),this.levelController.startLevel=t}},{key:"capLevelToPlayerSize",get:function(){return this.config.capLevelToPlayerSize},set:function(t){var e=!!t;e!==this.config.capLevelToPlayerSize&&(e?this.capLevelController.startCapping():(this.capLevelController.stopCapping(),this.autoLevelCapping=-1,this.streamController.nextLevelSwitch()),this.config.capLevelToPlayerSize=e)}},{key:"autoLevelCapping",get:function(){return this._autoLevelCapping},set:function(t){this._autoLevelCapping!==t&&(o.b.log("set autoLevelCapping:"+t),this._autoLevelCapping=t)}},{key:"bandwidthEstimate",get:function(){var t=this.abrController.bwEstimator;return t?t.getEstimate():NaN}},{key:"autoLevelEnabled",get:function(){return-1===this.levelController.manualLevel}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}},{key:"minAutoLevel",get:function(){var t=this.levels,e=this.config.minAutoBitrate;if(!t)return 0;for(var r=t.length,i=0;i<r;i++)if(t[i].maxBitrate>e)return i;return 0}},{key:"maxAutoLevel",get:function(){var t=this.levels,e=this.autoLevelCapping;return-1===e&&t&&t.length?t.length-1:e}},{key:"nextAutoLevel",get:function(){return Math.min(Math.max(this.abrController.nextAutoLevel,this.minAutoLevel),this.maxAutoLevel)},set:function(t){this.abrController.nextAutoLevel=Math.max(this.minAutoLevel,t)}},{key:"audioTracks",get:function(){var t=this.audioTrackController;return t?t.audioTracks:[]}},{key:"audioTrack",get:function(){var t=this.audioTrackController;return t?t.audioTrack:-1},set:function(t){var e=this.audioTrackController;e&&(e.audioTrack=t)}},{key:"subtitleTracks",get:function(){var t=this.subtitleTrackController;return t?t.subtitleTracks:[]}},{key:"subtitleTrack",get:function(){var t=this.subtitleTrackController;return t?t.subtitleTrack:-1},set:function(t){var e=this.subtitleTrackController;e&&(e.subtitleTrack=t)}},{key:"media",get:function(){return this._media}},{key:"subtitleDisplay",get:function(){var t=this.subtitleTrackController;return!!t&&t.subtitleDisplay},set:function(t){var e=this.subtitleTrackController;e&&(e.subtitleDisplay=t)}},{key:"lowLatencyMode",get:function(){return this.config.lowLatencyMode},set:function(t){this.config.lowLatencyMode=t}},{key:"liveSyncPosition",get:function(){return this.latencyController.liveSyncPosition}},{key:"latency",get:function(){return this.latencyController.latency}},{key:"maxLatency",get:function(){return this.latencyController.maxLatency}},{key:"targetLatency",get:function(){return this.latencyController.targetLatency}},{key:"drift",get:function(){return this.latencyController.drift}},{key:"forceStartLoad",get:function(){return this.streamController.forceStartLoad}}])&&ri(e.prototype,r),n&&ri(e,n),t}();ii.defaultConfig=void 0}]).default})); \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/js/ckplayer.js b/modules/core/src/main/resources/static/ckplayer/js/ckplayer.js new file mode 100644 index 00000000..26a1e8d1 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/js/ckplayer.js @@ -0,0 +1,7421 @@ +/* + * 软件名称:ckplayer + * 版本:X3 + * 版权:www.ckplayer.com + * 开源协议:MIT + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.ckplayer = factory()); +}(this, function () { 'use strict'; + /* + * language + * 功能:静态变量,包含播放器用到的默认语言包 + * 引入其它语言js后该变量将被替换成新引入的语言包 + */ + var language={ + play:'%E6%92%AD%E6%94%BE', + pause:'%E6%9A%82%E5%81%9C', + refresh:'%E9%87%8D%E6%92%AD', + full:'%E5%85%A8%E5%B1%8F', + exitFull:'%E9%80%80%E5%87%BA%E5%85%A8%E5%B1%8F', + webFull:'%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F', + exitWebFull:'%E9%80%80%E5%87%BA%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F', + theatre:'%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F', + exitTheatre:'%E9%80%80%E5%87%BA%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F', + volume:'%E9%9F%B3%E9%87%8F%EF%BC%9A', + muted:'%E9%9D%99%E9%9F%B3', + exitmuted:'%E6%81%A2%E5%A4%8D%E9%9F%B3%E9%87%8F', + seek:'seek%EF%BC%9A', + waiting:'%E7%BC%93%E5%86%B2', + live:'%E7%9B%B4%E6%92%AD%E4%B8%AD', + backLive:'%E8%BF%94%E5%9B%9E%E7%9B%B4%E6%92%AD', + lookBack:'%E5%9B%9E%E7%9C%8B%EF%BC%9A', + next:'%E4%B8%8B%E4%B8%80%E9%9B%86', + screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE', + smallwindows:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E6%92%AD%E6%94%BE%E5%8A%9F%E8%83%BD', + playbackrate:'%E5%80%8D%E9%80%9F', + playbackrateSuffix:'%E5%80%8D', + track:'%E5%AD%97%E5%B9%95', + noTrack:'%E6%97%A0%E5%AD%97%E5%B9%95', + definition:'%E6%B8%85%E6%99%B0%E5%BA%A6', + switchTo:'%E5%88%87%E6%8D%A2%E6%88%90%EF%BC%9A', + closeTime:'%7Bseconds%7D%E7%A7%92%E5%90%8E%E5%8F%AF%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A', + closeAd:'%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A', + second:'%E7%A7%92', + details:'%E6%9F%A5%E7%9C%8B%E8%AF%A6%E6%83%85', + copy:'%E5%A4%8D%E5%88%B6', + copySucceeded:'%E5%A4%8D%E5%88%B6%E6%88%90%E5%8A%9F%EF%BC%8C%E5%8F%AF%E8%B4%B4%E7%B2%98%EF%BC%81', + smallwindowsOpen:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%BC%80%E5%90%AF', + smallwindowsClose:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD', + screenshotStart:'%E6%88%AA%E5%9B%BE%E4%B8%AD%EF%BC%8C%E8%AF%B7%E7%A8%8D%E5%80%99...', + screenshotClose:'%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD', + loopOpen:'%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE', + loopClose:'%E5%B7%B2%E5%85%B3%E9%97%AD%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE', + close:'%E5%85%B3%E9%97%AD', + down:'%E4%B8%8B%E8%BD%BD', + p50:'50%25', + p75:'75%25', + p100:'100%25', + timeScheduleAdjust:{ + prohibit:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%8B%96%E5%8A%A8', + prohibitBackOff:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E9%87%8D%E5%A4%8D%E8%A7%82%E7%9C%8B', + prohibitForward:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E5%BF%AB%E8%BF%9B', + prohibitLookBack:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9', + prohibitForwardNotViewed:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E6%9C%AA%E8%A7%82%E7%9C%8B%E7%9A%84%E9%83%A8%E5%88%86' + }, + error:{ + noMessage:'%E6%9C%AA%E7%9F%A5%E9%94%99%E8%AF%AF', + supportVideoError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E7%89%88%E6%9C%AC%E5%A4%AA%E4%BD%8E%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8', + videoTypeError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E6%92%AD%E6%94%BE%E8%AF%A5%E8%A7%86%E9%A2%91%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8', + loadingFailed:'%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5', + emptied:'%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF', + screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE%E5%A4%B1%E8%B4%A5', + ajax:'Ajax%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E9%94%99%E8%AF%AF', + noVideoContainer:'%E6%9C%AA%E6%89%BE%E5%88%B0%E6%94%BE%E7%BD%AE%E8%A7%86%E9%A2%91%E7%9A%84%E5%AE%B9%E5%99%A8' + } + }; + /* + * videoObjectDefault + * 功能:静态变量,默认播放配置,当外部传递过来的配置有未包含在varsDefault里的,则使用varsDefault里的配置 + */ + var videoObjectDefault= { + container: '',//视频容器的ID + volume: 0.8,//默认音量,范围0-1 + poster: '',//封面图片地址 + autoplay: false,//是否自动播放 + loop: false,//是否需要循环播放 + live: false,//是否是直播 + rotate:0,//视频旋转角度 + zoom:0,//默认缩放比例 + ad:null,//广告 + backLive:false,//显示返回直播按钮 + seek: 0,//默认需要跳转的秒数 + next: null,//下一集按钮动作 + loaded: '',//加载播放器后调用的函数 + plug: '',//使用插件 + duration:0,//视频总时间 + preview: null,//预览图片对象 + prompt: null,//提示点功能 + crossOrigin:'',//跨域请求字符 + video: null,//视频地址 + type:'',//视频类型 + playbackrate: 1,//默认倍速 + ended:null,//结束显示的内容 + webFull:false,//页面全屏按钮事件 + theatre:null,//剧场模式 + controls:false,//是否显示自带控制栏 + rightBar:null,//是否开启右边控制栏 + smallWindows:null,//是否启用小窗口模式 + smallWindowsDrag:true,//当处于小窗口模式时是否可拖动播放器 + screenshot:false,//截图功能是否开启 + timeScheduleAdjust:1,//是否可调节播放进度,0不启用,1是启用,2是只能前进(向右拖动),3是只能后退,4是只能前进但能回到第一次拖动时的位置,5是看过的地方可以随意拖动 + logo:'',//logo + menu:null,//右键菜单 + information:{//关于 + 'Load:':'{loadTime} second', + 'Duration:':'{duration} second', + 'Size:':'{videoWidth}x{videoHeight}', + 'Volume:':'{volume}%', + 'Fps:':'{fps}fps', + 'Sudio decoded:':'{audioDecodedByteCount} Byte', + 'Video decoded:':'{videoDecodedByteCount} Byte' + }, + track:null,//字幕 + title:'',//视频标题 + language:'',//语言包文件 + barHideTime:1500,//控制栏隐藏时间 + playbackrateOpen:true,//是否开启控制栏倍速选项 + playbackrateList:[0.75,1,1.25,1.5,2,4],//倍速配置值 + cookie:null,//开启cookie功能 + domain:null,//指定cookie保存的域 + cookiePath:'/',//指定cookie保存路径 + documentFocusPause:false,//窗口失去焦点后暂停播放 + mouseWheelVolume:2,//是否启用鼠标滚轮调节音量功能,0=不启用,1=启用,2=全屏时才启用 + keyVolume:2,//是否启用键盘控制音量调节,0=不启用,1=启用,2=全屏时才启用 + errorShow:true//是否显示错误信息 + }; + function ckplayerEmbed(videoObj){ + /* + * rightMenu + * 功能:全局变量,右键内容 + * 初始化设置menu可替换该变量内容 + */ + var rightMenu=[ + { + title:'ckplayer', + link:'http://www.ckplayer.com' + }, + { + title:'version:X3', + underline:true + }, + { + title:'about', + click:'aboutShow' + } + ]; + var vars={},varsTemp={};//保存传递过来的videoObject + var video=null;//视频播放器对象 + var duration=0;//总时间 + var mutedState='';//默认静音状态 + var recoveryVolume=false;//是否需要在播放时恢复音量 + var waited=true;//是否缓冲结束 + var paused=true;//默认暂停状态 + var loadTime=0;//已加载部分 + var seekTime=0;//需要跳转的时间,初次播放以及切换清晰度后会用该变量记录需要seek的时间 + var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;//oldTime=记录上次播放时间,playTime=当前播放时间,firstSeekTime=记录第一次拖动的时间,maxSeeTime=看过的最大时间 + var isChangeDef=true;//是否需要重置清晰度 + var playType='';//播放类别,默认='',是通过api接口播放,='button'则判定是通过点击按钮播放 + var msgSetTime=null,tipSetTime=null,mouseSetTime=null;//用于显示提示后自动隐藏的计时器 + var adFrontSetTime=null,adPauseSetTime=null;//贴片广告和暂停广告的计时器 + var closeTipFun=null;//关闭提示的函数 + var closeTipMouseOut=null;//鼠标离开节点时执行的函数 + var waitingMessage=true;//显示缓冲提示 + var hidePreviewSetTime=null;//隐藏预览图的计时器 + var pSliderMouseDown=false;//判断是否在进度条上的滑块上按下 + var playbackTime=0;//记录回放时间 + var loadedmetadataNum=0;//记录元数据加载成功次数,记录视频播放数量 + var screenshotImg=null;//记录最新一张截图 + var ad=null;//广告对象 + var frontAdPlay=false,pauseAdPlay=false;//贴片广告是否播放,暂停广告是否播放 + var barShow=true,rightBarShow=true; + var EventTarget=null,newEvent=null,eventTargetList=null;//注册监听 + var loadedTrack=false;//默认未加载字幕 + var C={};//保存播放器界面上的所有节点 + var CT=null,CK=null,CM=null,CV=null;//CT=播放器容器,页面中已存的,CT>CK>CM>CV>video + var pugPlayer=null;//插件播放器 + var hls=null;//播放hls + var loadMeta=true;//第一次加载到元数据 + var app='';//平台类型 + var nowRotate=0;//当前视频旋转角度 + var nowZoom=100;//当前缩放比例 + var smallWindowsState=false;//当前是否处理小窗口状态 + var isDrag=false;//是否在播放器上按下并且拖动 + var ckplayerCookie='ckplayer-player-cookie'; + var cookieName='';//cookie名称 + var cookieTime=0;//cookie保存时间,单位:秒 + var cookieArray=[];//保存当前所有记录 + var focusPause=true;//失去焦点前是否是暂停状态 + var existenceObj=false;//是否使用源码里已有的dom + /* + * into + * 功能:初始化,调用播放器则首先调用该函数 + * @obj=初始化时的配置对象:videoObject + */ + var into=function(obj){ + /* + * 如果未传递初始化配置对象,则为player变量增加一个add函数,功能相当于into + */ + if(isUndefined(obj)){ + player.add=player.into=into; + return player; + } + /* + * 转码默认语言包 + */ + language=decodeURIString(language); + /* + * 检查是否在顶部引入了外部语言包文件,如果引入了,则使用外部语言包替换进language变量 + */ + if(!isUndefined(window.ckplayerLanguage)){ + language=mergeObj(language,window.ckplayerLanguage); + } + /* + * 初始化注册事件函数,该函数的作用是将所有相关的事件都注册进一个变量newEvent + * newEvent是提供给播放器外部监听函数使用的,如监听时间player.time(function(t){console.log('已播放:'+t);}); + */ + eventTarget(); + /* + * 监听页面标签状态(判断是否失去焦点) + */ + documentHidden(function(state){ + eventTarget('visibilityState',state); + }); + /* + * 判断平台类型,主要是判断是否是iphone类型的平台 + */ + app=getApp(); + /* + * 简单复制一下初始化时的默认配置 + */ + varsTemp={}; + for(var key in videoObjectDefault){ + varsTemp[key]=videoObjectDefault[key]; + } + /* + * 如果初始化配置是字符串并且是以website:开头或url:开头的,则认为需要请求一个json文件来获取配置 + */ + if(valType(obj)=='string' && (obj.substr(0,8)=='website:' || obj.substr(0,4)=='url:')){ + var ajaxUrl=''; + if(obj.substr(0,8)=='website:'){ + ajaxUrl=obj.substring(8); + } + if(obj.substr(0,4)=='url:'){ + ajaxUrl=obj.substring(4); + } + ajax({url:ajaxUrl,success:function(data){ + if(data){ + return into(data); + } + else{ + showWindowsError(language['error']['ajax']+',url:'+ajaxUrl); + return null; + } + }}); + } + /* + * 如果初始化配置是一个object,则进行下面的操作 + */ + else if(valType(obj)=='object'){ + varsTemp = standardization(varsTemp, obj);//将obj合并到varsTemp对象里 + if(!isUndefined(obj['container']) && obj['container']){ + CT=$(obj['container']); + if(CT){//如果播放容器存在,则调用语言判断函数 + return loadLanguage(obj); + } + else{//如果播放容器不存在,则则等页面加载完成后运行 + return bodyReady(obj); + } + } + else{//不存在播放容器配置则等页面加载完成后运行 + return bodyReady(obj); + } + } + else{ + showWindowsError(language['error']['noVideoContainer']); + return null; + } + }, + /* + * bodyReady + * 功能:页面加载完成后构建播放器 + * @obj=初始化时的配置对象 + */ + bodyReady=function (obj){ + documentReady(function(){ + if(!isUndefined(obj['container'])){ + CT=$(obj['container']); + if(CT){//如果播放容器存在,则调用语言判断函数 + return loadLanguage(obj); + } + else{ + showWindowsError(language['error']['noVideoContainer']); + return null; + } + } + else{//不存在播放容器则重新判断 + return ajaxWebsite(obj); + } + }); + return null; + }, + /* + * ajaxWebsite + * 功能:页面加载完成后重新初始化 + * @obj=初始化时的配置对象 + */ + ajaxWebsite=function (obj){ + if(valType(obj['video'])=='string' && (obj['video'].substr(0,8)=='website:' || obj['video'].substr(0,4)=='url:')){ + varsTemp = standardization(varsTemp, obj); + var ajaxUrl=''; + if(obj['video'].substr(0,8)=='website:'){ + ajaxUrl=obj['video'].substring(8); + } + if(obj['video'].substr(0,4)=='url:'){ + ajaxUrl=obj['video'].substring(4); + } + ajax({url:ajaxUrl,success:function(data){ + if(data){ + return into(data); + } + else{ + showWindowsError(language['error']['ajax']+',url:'+ajaxUrl); + return null; + } + }}); + } + else{ + showWindowsError(language['error']['noVideoContainer']); + return null; + } + }, + /* + * loadLanguage + * 功能:加载Language + * @obj=初始化时的配置对象 + */ + loadLanguage=function (obj){ + vars = standardization(varsTemp, obj); + if(vars['language']){ + var path=getPath('language')+vars['language']+'.js'; + loadJs(path,function(){ + if(!isUndefined(window['ckplayerLanguage'])){ + language=mergeObj(language,window['ckplayerLanguage']); + } + return embed(obj); + }); + } + else{ + return embed(obj); + } + }, + /* + * embed + * 功能:构建播放器 + * @obj=初始化时的配置对象 + */ + embed=function (obj){ + /* + * 判断静音状态 + */ + mutedState=vars['volume']>0?false:true; + if(!isUndefined(CT) && CT!=null){ + if(valType(CT)=='htmlarray'){ + CT=CT.eq(0); + } + } + else{ + return null; + } + /* + * 注册获取fps的函数 + */ + calculationFps(); + /* + * 如果video指向一个已存在的video标签对象 + */ + existenceObj=valType(vars['video'])=='string' && ((vars['video'].substr(0,1)=='.' && vars['video'].indexOf('/')==-1) || vars['video'].substr(0,1)=='#'); + /* + * 清空容器 + */ + if(existenceObj){ + CK=CT.find('.ckplayer-ckplayer')?CT.find('.ckplayer-ckplayer').eq(0):null; + if(CK){ + CM=CK.find('.ck-main')?CK.find('.ck-main').eq(0):null; + } + if(CM){ + CV=CM.find('.ck-video')?CM.find('.ck-video').eq(0):null; + } + } + if(!CK || !CM || !CV){ + CT.htm(''); + /* + * 在播放容器里新建一个总的容器 + */ + CK=createlDiv('ckplayer-ckplayer'); + CT.append(CK); + /* + * 在总容器里再新建一个容器 + */ + CM=createlDiv('ck-main'); + CK.append(CM); + /* + * 新建一个放置video标签的容器 + */ + CV=createlDiv('ck-video'); + CM.append(CV); + } + /* + * 如果已存在video.则先设置成空 + */ + if(video){ + video.remove(); + video=null; + } + /* + * 如果video指向一个已存在的video标签对象,则直接调用该对象 + */ + if(existenceObj){ + video=$(vars['video'])?$(vars['video']).eq(0):null; + } + /* + * 新建一个video标签 + */ + if(!video){ + video = createlVideo(); + video.attr('width','100%').attr('height','100%'); + CV.append(video); + } + video.volume=vars['volume']; + if(vars['autoplay']){ + player.volume(0); + player.muted(); + recoveryVolume=true; + video.attr('autoplay','autoplay'); + paused=false; + } + else{ + video.attr('preload','metadata'); + } + CT.loop=vars['loop']; + if(CT.loop){ + video.attr('loop','loop'); + } + if(vars['controls']){ + video.controls=true; + } + else{ + video.controls=false; + } + try{ + if(!existenceObj){ + video.attr('controlslist','nodownload'); + video.attr('x-webkit-airplay','true'); + video.attr('x5-video-orientation','portraint'); + video.attr('playsinline','true'); + video.attr('webkit-playsinline','true'); + video.attr('x5-playsinline','true'); + } + if(vars['crossOrigin']){ + video.useCORS=true;//解决跨域 + video.crossOrigin=vars['crossOrigin'];//解决跨域 + } + } + catch(event){} + /* + * 默认设置支持小窗口模式 + */ + CT.smallWindows=true; + /* + * 默认设置不显示页面全屏按钮 + */ + CT.webFull=false; + /* + * 默认设置不显示剧场模式按钮 + */ + CT.theatre=false; + /* + * 加载播放器界面 + */ + loadFace(); + /* + * 判断是否需要默认旋转视频 + */ + if(vars['rotate']>0){ + player.rotate(vars['rotate']); + } + /* + * 判断是否需要默认缩放视频 + */ + if(vars['zoom']>0){ + player.zoom(vars['zoom']); + } + /* + * 判断是否支持video标签 + */ + if(isUndefined(video.canPlayType)){ + CT.error={code:5,message:language['error']['supportVideoError']}; + eventTarget('error',CT.error);//注册监听error + showError(); + return player; + } + /* + * 注册视频播放器内部监听,监听到事件后注册给CT使用 + */ + addAllListener(); + /* + * 如果需要在视频播放器加载成功后调用相关函数,此时则开始调用 + */ + if(!isUndefined(vars['loaded'])){ + if(valType(vars['loaded'])=='function'){ + try{ + vars['loaded'](player); + } + catch(event){} + } + else if(valType(vars['loaded'])=='string'){ + try{ + eval(vars['loaded']+ '(player)'); + } + catch(event){} + } + } + /* + * 播放视频 + */ + if(!existenceObj){ + changeVideo(vars['video']); + } + else{ + changeVideo(video.attr('src')); + } + /* + * 返回 播放器 + */ + return player; + }, + /* + * changeVideo + * 功能:初始化视频地址或修改视频地址 + */ + changeVideo=function (vstr){ + var i=0; + if(video.attr('src') || video.htm()){ + player.pause(); + } + if(video.attr('src') && !existenceObj){ + video.attr('src',''); + video.removeAttr('src'); + } + if(!isUndefined(video.textTracks) && video.textTracks.length>0){ + for(i=video.find('track').length-1;i>-1;i--){ + video.find('track').eq(i).remove(); + } + } + if(!existenceObj){ + video.htm(''); + } + if(!isUndefined(vars['ad'])){ + ad=vars['ad']; + } + var source=''; + if(valType(vstr)=='string'){ + if(vstr.substr(0,8)=='website:' || vstr.substr(0,4)=='url:'){ + var ajaxUrl=''; + if(vstr.substr(0,8)=='website:'){ + ajaxUrl=vstr.substring(8); + } + if(vstr.substr(0,4)=='url:'){ + ajaxUrl=vstr.substring(4); + } + ajax({url:ajaxUrl,success:function(data){ + if(data!=null){ + vars = standardization(varsTemp, data); + changeVideo(vars['video']); + } + else{ + CT.error={code:8,message:language['error']['ajax']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + }}); + return; + } + else{ + if(vars['plug'] && !canPlay(vstr)){ + plugPlayer(vstr); + } + else{ + if(!existenceObj){ + video.attr('src',vstr); + } + } + loadTrack(); + } + } + else if(valType(vstr)=='array'){ + for(i=0;i<vstr.length;i++){ + if(valType(vstr[i])=='array'){ + if(vars['plug'] && !canPlay(vstr[i][0])){ + plugPlayer(vstr[i][0]); + } + else{ + var type=' type="'+ vstr[i][1]+'"'; + if(vstr[i].length>1){ + source += '<source src="' + decodeURIComponent(vstr[i][0]) + '"' +type + '>'; + } + } + } + } + if(source){ + video.htm(source); + } + loadTrack(); + } + else if(valType(vstr)=='object'){ + if(vars['plug']){ + plugPlayer(vstr); + } + else{ + CT.error={code:10,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + loadTrack(); + } + if(!isUndefined(video.find('source')) && video.find('source').length>0){ + video.find('source').eq(video.find('source').length-1).addListener('error',videoHandler.error); + } + checkBar(); + loadLogo(); + if(isChangeDef){ + checkDefinition(); + } + /* + * 对cookie进行相关分析 + */ + if(vars['cookie']){ + if(valType(vars['cookie'])=='array' && vars['cookie'].length>=2){ + if(vars['cookie'][0] && valType(vars['cookie'][0])=='string'){ + cookieName=vars['cookie'][0]; + } + if(vars['cookie'][1] && valType(vars['cookie'][1])=='number'){ + cookieTime=vars['cookie'][1]; + } + } + if(valType(vars['cookie'])=='object' && !isUndefined(vars['cookie']['name'])){ + cookieName=vars['cookie']['name']; + if(!isUndefined(vars['cookie']['hour']) && valType(vars['cookie']['hour'])=='number'){ + cookieTime=vars['cookie']['hour']; + } + } + if(valType(vars['cookie'])=='string'){ + cookieName=vars['cookie']; + } + if(cookieName){ + cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, ''); + } + } + if(!isUndefined(vars['seek']) && !seekTime){ + if(valType(vars['seek'])=='number' && vars['seek']>0){ + seekTime=vars['seek']; + } + if(valType(vars['seek'])=='string' && vars['seek']=='cookie' && cookieName){ + var cke=player.cookie(cookieName); + if(cke){ + seekTime=cke['time']; + } + + } + } + }, + /* + * plugPlayer + * 功能:使用插件进行播放 + */ + plugPlayer=function (url){ + switch(vars['plug']){ + case 'hls.js': + hlsPlayer(url); + break; + case 'flv.js': + flvPlayer(url); + break; + case 'mpegts.js': + mpegtsPlayer(url); + break; + case 'dash.js': + dashPlayer(url); + break; + default: + if(valType(vars['plug'])=='function'){ + vars['plug'](video,url); + } + else{ + CT.error={code:10,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + + break; + } + }, + /* + * hlsPlayer + * 功能:使用hls.js插件进行播放 + */ + hlsPlayer=function (url){ + var path=getPath('hls.js')+'hls.min.js'; + loadJs(path,function(){ + if (!isUndefined(Hls) && Hls.isSupported()) { + hls = new Hls(); + hls.loadSource(url); + hls.attachMedia(video); + hls.on(Hls.Events.ERROR, function(event, data){ + var code=9; + var message=language['error']['loadingFailed']; + var fatal=data.fatal; + if(!isUndefined(data.response)){ + if(!isUndefined(data.response.code)){ + code=data.response.code; + } + if(!isUndefined(data.response.text) && data.response.text){ + message=data.response.text; + } + else{ + if(!isUndefined(event)){ + message=event; + } + } + } + CT.error={code:code,message:message}; + eventTarget('error',CT.error);//注册监听error + if(fatal){ + showError(); + } + }); + } + else if(canPlay(url)){ + video.attr('src',url); + } + }); + }, + /* + * flvPlayer + * 功能:使用flv.js插件进行播放 + */ + flvPlayer=function (url){ + var path=getPath('flv.js')+'flv.min.js'; + loadJs(path,function(){ + if (typeof(flvjs)!='undefined' && !isUndefined(flvjs) && flvjs.isSupported()) { + var config={ + type: 'flv', + url: url + }; + if(valType(url)=='object'){ + config=url; + } + if(vars['live']){ + config['isLive']=true; + } + if(pugPlayer){ + pugPlayer.pause(); + pugPlayer.unload(); + pugPlayer.detachMediaElement(); + pugPlayer.destroy(); + pugPlayer=null; + } + pugPlayer = flvjs.createPlayer(config); + pugPlayer.attachMediaElement(video); + pugPlayer.load(); + pugPlayer.on(flvjs.Events.METADATA_ARRIVED, function(res){ + videoHandler.loadedMetaData(); + }); + pugPlayer.on(flvjs.Events.ERROR, function(errorType, errorDetail, errorInfo){ + CT.error={code:errorInfo['code'],message:errorInfo['msg']}; + eventTarget('error',CT.error);//注册监听error + showError(); + }); + } + }); + }, + /* + * mpegtsPlayer + * 功能:使用mpegts.js插件进行播放 + */ + mpegtsPlayer=function (url){ + var path=getPath('mpegts.js')+'mpegts.js'; + loadJs(path,function(){ + if (typeof(mpegts)!='undefined' && !isUndefined(mpegts) && mpegts.getFeatureList().mseLivePlayback) { + var config={ + type: 'mse', + url: url + }; + if(valType(url)=='object'){ + config=url; + } + if(vars['live']){ + config['isLive']=true; + } + if(pugPlayer){ + pugPlayer.pause(); + pugPlayer.unload(); + pugPlayer.detachMediaElement(); + pugPlayer.destroy(); + pugPlayer=null; + } + pugPlayer = mpegts.createPlayer(config); + pugPlayer.attachMediaElement(video); + pugPlayer.load(); + + pugPlayer.on(mpegts.Events.METADATA_ARRIVED, function(res){ + videoHandler.loadedMetaData(); + }); + pugPlayer.on(mpegts.Events.ERROR, function(errorType, errorDetail, errorInfo){ + CT.error={code:errorInfo['code'],message:errorInfo['msg']}; + eventTarget('error',CT.error);//注册监听error + showError(); + }); + } + }); + }, + /* + * canPlay + * 功能:判断是否能支持相关视频格式 + */ + canPlay=function(vStr,num){ + var vTypeArr=[ + {vidType:'video/ogg',codType:'theora, vorbis'}, + {vidType:'video/mp4',codType:'avc1.4D401E, mp4a.40.2'}, + {vidType:'video/mp4',codType:'avc1'}, + {vidType:'video/mp4',codType:'hevc'}, + {vidType:'video/webm',codType:'vp8.0, vorbis'}, + {vidType:'video/webm',codType:'vp9'}, + {vidType:'',codType:'application/x-mpegURL'}, + {vidType:'',codType:'application/vnd.apple.mpegurl'} + ]; + var vType={ + ogg:vTypeArr[0], + mp4:[vTypeArr[1],vTypeArr[2],vTypeArr[3]], + webm:[vTypeArr[4],vTypeArr[5]], + m3u8:[vTypeArr[6],vTypeArr[7]] + }; + var arr=[]; + var k=''; + var supportType=function(obj){ + var vType=obj['vidType']; + var str=''; + if(vType){ + str=vType+'; '+ 'codecs="' + obj['codType'] + '"'; + } + else{ + str=obj['codType']; + } + var sup = video.canPlayType(str); + if(sup == '') { + sup = 'no'; + } + return sup; + }; + var getExtension=function(filepath) { + return filepath.replace(/.+\./, ''); + }; + if(isUndefined(num)){ + if(valType(vStr)=='string'){ + if(vars['type']){ + for(k in vTypeArr){ + if(vTypeArr[k]['vidType']==vars['type']){ + arr.push(vTypeArr[k]); + } + } + } + else{ + if(getExtension(vStr) && getExtension(vStr) in vType){ + var temp=vType[getExtension(vStr)]; + if(valType(temp)=='array'){ + for(var i=0;i<temp.length;i++){ + arr.push(temp[i]); + } + } + else{ + arr.push(temp); + } + } + } + } + } + else{ + arr.push(vTypeArr[num]); + } + var is=false; + if(arr.length>0){ + for(var i=0;i<arr.length;i++){ + if(supportType(arr[i])!='no'){ + is=true; + } + } + } + if(!is && !vars['plug']){ + CT.error={code:6,message:language['error']['videoTypeError']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + return is; + }, + /* + * loadFace + * 功能:加载界面 + */ + loadFace=function(){ + //loading容器 + C['loading']=createlDiv('ck-loading'); + CM.append(C['loading']); + //默认控制栏容器 + C['bar']=createlDiv('ck-bar'); + CM.append(C['bar']); + //右侧控制栏容器 + C['rightBar']=createlDiv('ck-right-bar ck-right-bar-hide'); + CM.append(C['rightBar']); + //顶部容器 + C['topBar']=createlDiv('ck-top-bar ck-top-bar-hide'); + CM.append(C['topBar']); + //进度栏 + C['bar']['pbox']=createlDiv('ck-bar-progress'); + C['bar']['pbox']['bg']=createlDiv('ck-bar-progress-bg'); + C['bar']['pbox']['load']=createlDiv('ck-bar-progress-load'); + C['bar']['pbox']['bg'].append(C['bar']['pbox']['load']); + C['bar']['pbox']['play']=createlDiv('ck-bar-progress-play'); + C['bar']['pbox']['bg'].append(C['bar']['pbox']['play']); + C['bar']['pbox']['mouseLine']=createlDiv('ck-bar-progress-mouseline'); + C['bar']['pbox']['bg'].append(C['bar']['pbox']['mouseLine']); + C['bar']['pbox']['slider']=createlDiv('ck-bar-progress-slider'); + C['bar']['pbox'].append(C['bar']['pbox']['bg']).append(C['bar']['pbox']['slider']); + C['bar'].append(C['bar']['pbox']); + C['bar'].mouseout(barMouseOut).mouseover(barMouseOver); + if(valType(vars['live'])=='number'){ + C['bar']['pbox']['play'].css({'width':'100%'}); + C['bar']['pbox']['slider'].css({'left':(100-C['bar']['pbox']['slider'].getWidth()*100/C['bar']['pbox']['bg'].getWidth())+'%'}); + } + //播放暂停按钮组 + C['bar']['playAndPause']=createlDiv('ck-bar-playandpause'); + C['bar'].append(C['bar']['playAndPause']); + + C['bar']['playAndPause']['play']=createlButton('ck-bar-btn ck-btn-play'); + C['bar']['playAndPause']['play'].click(player.play); + C['bar']['playAndPause']['play'].mouseover(function(){tip(this,language['play']);}); + C['bar']['playAndPause'].append(C['bar']['playAndPause']['play']); + + C['bar']['playAndPause']['pause']=createlButton('ck-bar-btn ck-btn-pause'); + C['bar']['playAndPause']['pause'].click(player.pause); + C['bar']['playAndPause']['pause'].mouseover(function(){tip(this,language['pause']);}); + C['bar']['playAndPause'].append(C['bar']['playAndPause']['pause']); + C['bar']['playAndPause']['pause'].hide(); + C['bar']['playAndPause']['refresh']=createlButton('ck-bar-btn ck-btn-refresh'); + C['bar']['playAndPause']['refresh'].click(player.play); + C['bar']['playAndPause']['refresh'].mouseover(function(){tip(this,language['refresh']);}); + C['bar']['playAndPause'].append(C['bar']['playAndPause']['refresh']); + + //下一集按钮 + C['bar']['nextEpisode']=createlDiv('ck-bar-btn ck-bar-next'); + C['bar'].append(C['bar']['nextEpisode']); + C['bar']['nextEpisode'].click(nextClick).mouseover(showNextEpisode).mouseout(function(){ + if(!isUndefined(C['next'])){ + player.closeLayer(C['next']); + } + }); + if(isUndefined(vars['next'])){ + C['bar']['nextEpisode'].hide(); + } + //时间显示框 + var timeDefault=formatSeconds(player.time())+'/'+formatSeconds(duration); + if(vars['live']){ + timeDefault=language['live']; + } + C['time']=createlDiv('ck-bar-time',timeDefault); + C['bar'].append(C['time']); + + //返回直播按钮 + C['bar']['backLive']=createlButton('ck-btn-backlive',language['backLive']); + C['bar'].append(C['bar']['backLive']); + C['bar']['backLive'].mouseover(function(){tip(this,language['backLive']);}).click(function(){ + eventTarget('backLive'); + }); + C['bar']['backLive'].hide(); + + //全屏按钮组 + C['bar']['fullAndExit']=createlDiv('ck-bar-fullandexit'); + C['bar'].append(C['bar']['fullAndExit']); + + C['bar']['fullAndExit']['full']=createlButton('ck-bar-btn ck-btn-full'); + C['bar']['fullAndExit']['full'].click(player.fullOrExit); + C['bar']['fullAndExit']['full'].mouseover(function(){tip(this,language['full']);}); + C['bar']['fullAndExit'].append(C['bar']['fullAndExit']['full']); + + C['bar']['fullAndExit']['exitFull']=createlButton('ck-bar-btn ck-btn-exitfull'); + C['bar']['fullAndExit']['exitFull'].click(player.fullOrExit); + C['bar']['fullAndExit']['exitFull'].mouseover(function(){tip(this,language['exitFull']);}); + C['bar']['fullAndExit'].append(C['bar']['fullAndExit']['exitFull']); + + //网页全屏按钮 + C['bar']['webFullAndExit']=createlDiv('ck-bar-webfullandexit'); + C['bar'].append(C['bar']['webFullAndExit']); + + C['bar']['webFullAndExit']['webFull']=createlButton('ck-bar-btn ck-btn-webfull'); + C['bar']['webFullAndExit']['webFull'].click(player.webFull); + C['bar']['webFullAndExit']['webFull'].mouseover(function(){tip(this,language['webFull']);}); + C['bar']['webFullAndExit'].append(C['bar']['webFullAndExit']['webFull']); + + C['bar']['webFullAndExit']['exitWebFull']=createlButton('ck-bar-btn ck-btn-exitwebfull'); + C['bar']['webFullAndExit']['exitWebFull'].click(player.exitWebFull); + C['bar']['webFullAndExit']['exitWebFull'].mouseover(function(){tip(this,language['exitWebFull']);}); + C['bar']['webFullAndExit'].append(C['bar']['webFullAndExit']['exitWebFull']); + if(!vars['webFull']){ + C['bar']['webFullAndExit'].hide(); + } + //剧场模式按钮组 + C['bar']['theatreAndExit']=createlDiv('ck-bar-theatreandexit'); + C['bar'].append(C['bar']['theatreAndExit']); + + C['bar']['theatreAndExit']['theatre']=createlButton('ck-bar-btn ck-btn-theatre'); + C['bar']['theatreAndExit']['theatre'].click(player.theatre); + C['bar']['theatreAndExit']['theatre'].mouseover(function(){tip(this,language['theatre']);}); + C['bar']['theatreAndExit'].append(C['bar']['theatreAndExit']['theatre']); + + C['bar']['theatreAndExit']['exitTheatre']=createlButton('ck-bar-btn ck-btn-exittheatre'); + C['bar']['theatreAndExit']['exitTheatre'].click(player.exitTheatre); + C['bar']['theatreAndExit']['exitTheatre'].mouseover(function(){tip(this,language['exitTheatre']);}); + C['bar']['theatreAndExit'].append(C['bar']['theatreAndExit']['exitTheatre']); + + if(!vars['theatre']){ + C['bar']['theatreAndExit'].hide(); + } + //音量容器 + C['bar']['vbox']=createlDiv('ck-bar-volumebox'); + C['bar'].append(C['bar']['vbox']); + + C['bar']['vbox']['muted']=createlButton('ck-bar-btn ck-btn-muted'); + C['bar']['vbox']['muted'].click(player.muted); + C['bar']['vbox'].append(C['bar']['vbox']['muted']); + + C['bar']['vbox']['exitMuted']=createlButton('ck-bar-btn ck-btn-exitmuted'); + C['bar']['vbox']['exitMuted'].click(player.exitMuted); + C['bar']['vbox'].append(C['bar']['vbox']['exitMuted']); + + C['bar']['vbox']['volume']=createlDiv('ck-bar-volume'); + C['bar']['vbox'].append(C['bar']['vbox']['volume']); + C['bar']['vbox']['volume']['box']=createlDiv('ck-bar-volumex'); + C['bar']['vbox']['volume'].append(C['bar']['vbox']['volume']['box']); + C['bar']['vbox']['volume']['txt']=createlDiv('ck-bar-volume-txt','0'); + C['bar']['vbox']['volume']['box'].append(C['bar']['vbox']['volume']['txt']); + C['bar']['vbox']['volume']['bg']=createlDiv('ck-bar-volume-bg'); + C['bar']['vbox']['volume']['box'].append(C['bar']['vbox']['volume']['bg']); + C['bar']['vbox']['volume']['pp']=createlDiv('ck-bar-volume-pp'); + C['bar']['vbox']['volume']['bg'].append(C['bar']['vbox']['volume']['pp']); + C['bar']['vbox']['volume']['slider']=createlDiv('ck-bar-volume-slider'); + C['bar']['vbox']['volume']['box'].append(C['bar']['vbox']['volume']['slider']); + C['bar']['vbox']['mouseDown']=false; + C['bar']['vbox']['volume'].show(); + changeVolumeSlider(vars['volume']); + volumeDragY();//注册音量调节滑块动作 + C['bar']['vbox']['volume'].attr('style',''); + C['bar']['vbox'].mouseover(function(){changeVolumeSlider(video.muted?0:video.volume);}); + //播速容器 + C['bar']['playbackrate']=createlDiv('ck-bar-playbackrate-box'); + C['bar'].append(C['bar']['playbackrate']); + C['bar']['playbackrate']['button']=createlDiv('ck-bar-playbackrate',language['playbackrate']); + C['bar']['playbackrate'].append(C['bar']['playbackrate']['button']); + C['bar']['playbackrate']['bgbox']=createlDiv('ck-bar-playbackrate-bg-box ck-list-bg-box'); + C['bar']['playbackrate'].append(C['bar']['playbackrate']['bgbox']); + checkPlaybackrate(); + //字幕容器 + C['bar']['track']=createlDiv('ck-bar-track-box'); + C['bar'].append(C['bar']['track']); + C['bar']['track']['button']=createlDiv('ck-bar-track',language['track']); + C['bar']['track'].append(C['bar']['track']['button']); + C['bar']['track']['bgbox']=createlDiv('ck-bar-track-bg-box ck-list-bg-box'); + C['bar']['track'].append(C['bar']['track']['bgbox']); + C['bar']['track'].hide(); + //清晰度容器 + C['bar']['definition']=createlDiv('ck-bar-definition-box'); + C['bar'].append(C['bar']['definition']); + C['bar']['definition']['button']=createlDiv('ck-bar-definition',language['definition']); + C['bar']['definition'].append(C['bar']['definition']['button']); + C['bar']['definition']['bgbox']=createlDiv('ck-bar-definition-bg-box ck-list-bg-box'); + C['bar']['definition'].append(C['bar']['definition']['bgbox']); + C['bar']['definition'].hide(); + //截图按钮 + C['rightBar']['screenshot']=createlButton('ck-bar-btn ck-btn-screenshot'); + C['rightBar'].append(C['rightBar']['screenshot']); + C['rightBar']['screenshot'].mouseover(function(){tip(this,language['screenshot'],null,'left');}); + C['rightBar']['screenshot'].click(player.screenshot); + + //小窗口按钮组 + C['rightBar']['smallwindows']=createlDiv('ck-right-bar-smallwindows'); + C['rightBar'].append(C['rightBar']['smallwindows']); + + C['rightBar']['smallwindows']['open']=createlButton('ck-bar-btn ck-btn-smallwindows-open'); + C['rightBar']['smallwindows']['open'].click(function(){tip(this,language['smallwindowsClose'],null,'left');player.smallWindows(false);}); + C['rightBar']['smallwindows']['open'].mouseover(function(){tip(this,language['smallwindowsOpen'],null,'left');}); + C['rightBar']['smallwindows'].append(C['rightBar']['smallwindows']['open']); + + C['rightBar']['smallwindows']['close']=createlButton('ck-bar-btn ck-btn-smallwindows-close'); + C['rightBar']['smallwindows']['close'].click(function(){tip(this,language['smallwindowsOpen'],null,'left');player.smallWindows(true)}); + C['rightBar']['smallwindows']['close'].mouseover(function(){tip(this,language['smallwindowsClose'],null,'left');}); + C['rightBar']['smallwindows'].append(C['rightBar']['smallwindows']['close']); + //循环按钮组 + C['rightBar']['loop']=createlDiv('ck-right-bar-loop'); + C['rightBar'].append(C['rightBar']['loop']); + + C['rightBar']['loop']['open']=createlButton('ck-bar-btn ck-btn-loop-open'); + C['rightBar']['loop']['open'].click(function(){tip(this,language['loopClose'],null,'left');player.loop(false);}); + C['rightBar']['loop']['open'].mouseover(function(){tip(this,language['loopOpen'],null,'left');}); + C['rightBar']['loop'].append(C['rightBar']['loop']['open']); + + C['rightBar']['loop']['close']=createlButton('ck-bar-btn ck-btn-loop-close'); + C['rightBar']['loop']['close'].click(function(){tip(this,language['loopOpen'],null,'left');player.loop(true);}); + C['rightBar']['loop']['close'].mouseover(function(){tip(this,language['loopClose'],null,'left');}); + C['rightBar']['loop'].append(C['rightBar']['loop']['close']); + C['rightBar'].mouseout(rightBarMouseOut).mouseover(rightBarMouseOver); + //截图显示容器 + C['screenshot']=createlDiv('ck-screenshot'); + CM.append(C['screenshot']); + C['screenshot']['img']=createlDiv('ck-screenshot-img'); + C['screenshot'].append(C['screenshot']['img']); + + C['screenshot']['bar']=createlDiv('ck-screenshot-bar'); + C['screenshot'].append(C['screenshot']['bar']); + + C['screenshot']['bar']['down']=createlA(language['down'],'','ck-screenshot-btn ck-screenshot-down'); + C['screenshot']['bar'].append(C['screenshot']['bar']['down']); + + C['screenshot']['bar']['close']=createlButton('ck-screenshot-btn ck-screenshot-close',language['close']); + C['screenshot']['bar']['close'].click(player.closeScreenshot); + C['screenshot']['bar'].append(C['screenshot']['bar']['close']); + //顶部内容 + C['topBar']['zoomEle']=createlDiv('ck-top-bar-zoom'); + + C['topBar']['zoomEle']['zoom50']=createlDiv('ck-top-bar-zoom-container'); + C['topBar']['zoomEle'].append(C['topBar']['zoomEle']['zoom50']); + C['topBar']['zoomEle']['zoom50']['left']=createlDiv('ck-top-bar-zoom-left'); + C['topBar']['zoomEle']['zoom50'].append(C['topBar']['zoomEle']['zoom50']['left']); + C['topBar']['zoomEle']['zoom50']['left']['button']=createlDiv('ck-top-bar-zoom-button-50'); + C['topBar']['zoomEle']['zoom50']['left'].append(C['topBar']['zoomEle']['zoom50']['left']['button']); + C['topBar']['zoomEle']['zoom50']['right']=createlDiv('ck-top-bar-zoom-right',language['p50']); + C['topBar']['zoomEle']['zoom50'].append(C['topBar']['zoomEle']['zoom50']['right']); + C['topBar']['zoomEle']['zoom50'].click(function(){player.zoom(50);}); + + C['topBar']['zoomEle']['zoom75']=createlDiv('ck-top-bar-zoom-container'); + C['topBar']['zoomEle'].append(C['topBar']['zoomEle']['zoom75']); + C['topBar']['zoomEle']['zoom75']['left']=createlDiv('ck-top-bar-zoom-left'); + C['topBar']['zoomEle']['zoom75'].append(C['topBar']['zoomEle']['zoom75']['left']); + C['topBar']['zoomEle']['zoom75']['left']['button']=createlDiv('ck-top-bar-zoom-button-75'); + C['topBar']['zoomEle']['zoom75']['left'].append(C['topBar']['zoomEle']['zoom75']['left']['button']); + C['topBar']['zoomEle']['zoom75']['right']=createlDiv('ck-top-bar-zoom-right',language['p75']); + C['topBar']['zoomEle']['zoom75'].append(C['topBar']['zoomEle']['zoom75']['right']); + C['topBar']['zoomEle']['zoom75'].click(function(){player.zoom(75);}); + + C['topBar']['zoomEle']['zoom100']=createlDiv('ck-top-bar-zoom-container'); + C['topBar']['zoomEle'].append(C['topBar']['zoomEle']['zoom100']); + C['topBar']['zoomEle']['zoom100']['left']=createlDiv('ck-top-bar-zoom-left'); + C['topBar']['zoomEle']['zoom100'].append(C['topBar']['zoomEle']['zoom100']['left']); + C['topBar']['zoomEle']['zoom100']['left']['button']=createlDiv('ck-top-bar-zoom-button-100'); + C['topBar']['zoomEle']['zoom100']['left'].append(C['topBar']['zoomEle']['zoom100']['left']['button']); + C['topBar']['zoomEle']['zoom100']['right']=createlDiv('ck-top-bar-zoom-right',language['p100']); + C['topBar']['zoomEle']['zoom100'].append(C['topBar']['zoomEle']['zoom100']['right']); + C['topBar']['zoomEle']['zoom100'].click(function(){player.zoom(100);}); + C['topBar'].append(C['topBar']['zoomEle']); + C['topBar']['titleEle']=createlDiv('ck-top-bar-title',vars['title']); + C['topBar'].append(C['topBar']['titleEle']); + C['topBar']['timeEle']=createlDiv('ck-top-bar-time'); + C['topBar'].append(C['topBar']['timeEle']); + //中间播放按钮 + C['centerPlay']=createlDiv('ck-center-play'); + C['centerPlay'].click(player.play); + CM.append(C['centerPlay']); + //buff + C['buffer']=createlDiv('ck-buffer'); + CM.append(C['buffer']); + //消息提示框 + C['message']=createlDiv('ck-message'); + CM.append(C['message']); + //消息Tip框 + C['tip']=createlDiv('ck-tip'); + CM.append(C['tip']); + C['tip']['content']=createlDiv('ck-content ck-content-float-auto'); + C['tip'].append(C['tip']['content']); + C['tip']['triangle']=createlDiv('ck-triangle ck-triangle-auto'); + C['tip'].append(C['tip']['triangle']); + tip(video,'ckplayer');//初始化显示,为了获取高度 + C['tip'].minHeight=C['tip'].getHeight(); + tip(); + //贴片广告层 + C['ad']=createlDiv('ck-yytf'); + CM.append(C['ad']); + + C['ad']['link']=createlDiv('ck-yytf-front-link'); + C['ad'].append(C['ad']['link']); + C['ad']['link'].click(frontVideoClickHandler); + + C['ad']['picture']=createlDiv('ck-yytf-front-picture'); + C['ad'].append(C['ad']['picture']); + + C['ad']['top']=createlDiv('ck-yytf-top'); + C['ad'].append(C['ad']['top']); + + C['ad']['top']['countDown']=createlDiv('ck-yytf-countdown'); + C['ad']['top'].append(C['ad']['top']['countDown']); + + C['ad']['top']['closeTime']=createlDiv('ck-yytf-closetime'); + C['ad']['top'].append(C['ad']['top']['closeTime']); + + C['ad']['top']['closeAd']=createlDiv('ck-yytf-closead',language['closeAd']); + C['ad']['top'].append(C['ad']['top']['closeAd']); + C['ad']['top']['closeAd'].click(closeFrontAd); + + C['ad']['bottom']=createlDiv('ck-yytf-bottom'); + C['ad'].append(C['ad']['bottom']); + + C['ad']['bottom']['fullAndExit']=createlDiv('ck-yytf-fullandexit'); + C['ad']['bottom'].append(C['ad']['bottom']['fullAndExit']); + C['ad']['bottom']['fullAndExit']['full']=createlButton('ck-yytf-btn ck-yytf-fullandexit-full'); + C['ad']['bottom']['fullAndExit']['full'].click(player.full); + C['ad']['bottom']['fullAndExit'].append(C['ad']['bottom']['fullAndExit']['full']); + C['ad']['bottom']['fullAndExit']['exitFull']=createlButton('ck-yytf-btn ck-yytf-fullandexit-exitfull'); + C['ad']['bottom']['fullAndExit'].append(C['ad']['bottom']['fullAndExit']['exitFull']); + C['ad']['bottom']['fullAndExit']['exitFull'].click(player.exitFull); + + C['ad']['bottom']['mutedAndExit']=createlDiv('ck-yytf-mutedandexit'); + C['ad']['bottom'].append(C['ad']['bottom']['mutedAndExit']); + C['ad']['bottom']['mutedAndExit']['muted']=createlButton('ck-yytf-btn ck-yytf-mutedandexit-muted'); + C['ad']['bottom']['mutedAndExit'].append(C['ad']['bottom']['mutedAndExit']['muted']); + C['ad']['bottom']['mutedAndExit']['muted'].click(player.muted); + C['ad']['bottom']['mutedAndExit']['exitMuted']=createlButton('ck-yytf-btn ck-yytf-mutedandexit-exitmuted'); + C['ad']['bottom']['mutedAndExit'].append(C['ad']['bottom']['mutedAndExit']['exitMuted']); + C['ad']['bottom']['mutedAndExit']['exitMuted'].click(player.exitMuted); + + C['ad']['bottom']['details']=createlDiv('ck-yytf-details',language['details']); + C['ad']['bottom'].append(C['ad']['bottom']['details']); + + + + C['ad'].hide(); + //暂停广告层 + C['adPause']=createlDiv('ck-pause-yytf'); + CM.append(C['adPause']); + //关于视频 + C['about']=createlDiv('ck-about'); + CM.append(C['about']); + C['about']['bar']=createlDiv('ck-about-bar'); + C['about'].append(C['about']['bar']); + + C['about']['bar']['copy']=createlButton('ck-bar-btn ck-btn-about-copy'); + C['about']['bar'].append(C['about']['bar']['copy']); + C['about']['bar']['copy'].click(aboutCopy); + C['about']['bar']['copy'].mouseover(function(){tip(this,language['copy'],null,'left');}); + + C['about']['bar']['close']=createlButton('ck-bar-btn ck-btn-about-close'); + C['about']['bar']['close'].click(aboutHide); + C['about']['bar']['close'].mouseover(function(){tip(this,language['close'],null,'left');}); + C['about']['bar'].append(C['about']['bar']['close']); + + C['tempTime']=createlDiv('ck-tempTime'); + CM.append(C['tempTime']); + C['bar']['playAndPause']['refresh'].hide(); + if(vars['controls']){ + player.bar(false); + player.rightBar(false); + C['loading'].hide(); + C['centerPlay'].hide(); + } + else{ + loadLogo();//加载logo + loadAbout();//构建关于视频相关内容 + loadMenu();//构建右键 + } + if(app=='iphone'){ + C['loading'].hide(); + } + changeTopTime();//修改顶部时间 + CK.mouseout(function(){ + if(!paused){ + hideBar(); + } + }).mouseover(function(){ + if(!C['bar'].hasClass('ck-bar-out')){ + C['bar'].removeClass('ck-bar-out'); + CM.removeClass('ck-nocursor'); + } + if(C['rightBar'].css('display')=='block'){ + C['rightBar'].removeClass('ck-right-bar-hide'); + } + if(C['topBar'].css('display')=='block'){ + C['topBar'].removeClass('ck-top-bar-hide'); + } + }).mousemove(function(){ + if(C['bar'].hasClass('ck-bar-out')){ + C['bar'].removeClass('ck-bar-out'); + eventTarget('mouseActive',true); + CM.removeClass('ck-nocursor'); + hideBar(); + } + if(C['rightBar'].css('display')=='block'){ + C['rightBar'].removeClass('ck-right-bar-hide'); + } + if(C['topBar'].css('display')=='block'){ + C['topBar'].removeClass('ck-top-bar-hide'); + } + }); + }, + /* + * addAllListener + * 功能:注册播放器的全部监听 + */ + addAllListener=function(){ + video.addListener('stalled',videoHandler.stalled);//在浏览器不论何种原因未能取回媒介数据时运行的脚本 + video.addListener('suspend',videoHandler.suspend);//在媒介数据完全加载之前不论何种原因终止取回媒介数据时运行的脚本 + video.addListener('loadeddata',videoHandler.loadedData);//监听视频数据已加载 + video.addListener('loadstart',videoHandler.loadStart);//在文件开始加载且未实际加载任何数据前运行的脚本 + video.addListener('loadedmetadata',videoHandler.loadedMetaData);//监听视频元数据 + video.addListener('canplay',videoHandler.canPlay);//当文件就绪可以开始播放时运行的脚本(缓冲已足够开始时) + video.addListener('timeupdate',videoHandler.timeUpDate);//监听视频播放时间 + video.addListener('seeking',videoHandler.seeking);//监听视频跳转中 + video.addListener('seeked',videoHandler.seeked);//监听视频跳转 + video.addListener('waiting',videoHandler.waiting);//监听视频缓冲 + video.addListener('play',videoHandler.play);//监听视频播放事件 + video.addListener('pause',videoHandler.pause);//监听视频暂停事件 + video.addListener('volumechange',videoHandler.volumeChange);//监听音量改变 + video.addListener('ended',videoHandler.ended);//监听播放结束 + video.addListener('error',videoHandler.error);//监听发生故障并且文件突然不可用时运行的脚本(比如连接意外断开时) + if(!isUndefined(video.emptied)){ + video.addListener('emptied',videoHandler.emptied);//监听播放结束 + } + //CV.singleClick(player.playOrPause);//监听视频单击 + CV.singleClick(function(){ + if(!isDrag){ + player.playOrPause(); + } + else{ + isDrag=false; + } + }); + CM.doubleClick(player.fullOrExit);//监听视频双击 + $(document).addListener('keydown',videoHandler.keydown);//监听键盘按键 + addListener(window, 'resize', videoHandler.resize);//监听窗口尺寸变化 + if(!isUndefined(vars['smallWindows'])){ + if(valType(vars['smallWindows'])=='boolean' && vars['smallWindows']){ + addListener(window, 'scroll', windowScroll);//监听窗口滚动 + } + } + CT.mouseWheel(videoHandler.mouseWheel); + }, + /* + * eventTarget + * 功能:注册事件,将事件注册给CT对象供外部监听 + */ + eventTarget=function(name,obj){ + try{ + if(EventTarget!=null){ + if(isUndefined(obj)){ + obj=null; + } + newEvent.dispatchEvent(name,obj); + } + else{ + EventTarget = function() { + this.listeners = {}; + }; + EventTarget.prototype.listeners = null; + EventTarget.prototype.addEventListener = function(type, callback) { + if(!(type in this.listeners)) { + this.listeners[type] = []; + } + this.listeners[type].push(callback); + eventTargetList=this.listeners; + }; + EventTarget.prototype.removeEventListener = function(type, callback) { + if(!(type in this.listeners)) { + return; + } + var stack = this.listeners[type]; + for(var i = 0, l = stack.length; i < l; i++) { + if(stack[i] === callback) { + stack.splice(i, 1); + return this.removeEventListener(type, callback); + } + } + eventTargetList=stack; + }; + EventTarget.prototype.dispatchEvent = function(type,obj) { + if(!(type in this.listeners)) { + return; + } + var stack = this.listeners[type]; + for(var i = 0, l = stack.length; i < l; i++) { + stack[i].call(this, obj); + } + }; + newEvent = new EventTarget(); + } + } + catch(event){console.error(event)} + }, + /* + * changeCookie + * 功能:使用cookie记录时间 + */ + changeCookie=function(time){ + var arr=[]; + var cStr=cookie(ckplayerCookie); + var i=0,y=0; + var cTime=Math.floor(Date.now()*0.001); + time=Math.floor(time*100); + time=time*0.01; + if(!cookieTime){ + cookieTime=365*24; + } + if(!cStr){ + arr.push([cookieName,time,cTime+cookieTime*3600]); + } + else{ + arr=stringToArray(cStr); + var have=false; + var tempArr=[[cookieName,time,cTime+cookieTime*3600]]; + for(i=0;i<arr.length;i++){ + if(arr[i][2]>cTime && arr[i][0]!=cookieName && y<19){ + tempArr.push(arr[i]); + y++; + } + } + arr=tempArr; + } + if(arr.length>0){ + cookie(ckplayerCookie,'delete',vars['domain'],vars['cookiePath']); + cookie(ckplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']); + } + cookieArray=arr; + }, + /* + * loadTrack + * 功能:加载track + */ + loadTrack=function(){ + if(isUndefined(video.textTracks)){ + return; + } + var i=0; + if(!isUndefined(vars['track']) && valType(vars['track'])=='array' && !video.find('track')){ + var track=''; + var arr=vars['track']; + C['bar']['track'].show(); + for(i=0;i<arr.length;i++){ + var def=''; + if(!def && !isUndefined(arr[i]['default']) && arr[i]['default']){ + def=' default'; + } + track+='<track src="'+arr[i]['src']+'" srclang="'+arr[i]['srclang']+'" kind="'+arr[i]['kind']+'" label="'+arr[i]['label']+'"'+def+'>'; + } + if(video){ + var html=video.htm()+track; + video.htm(html); + } + if(video.find('track') && !loadedTrack){ + loadedTrack=true; + checkTrack(); + } + } + }, + /* + * loadedMetaData + * 功能:获取元数据后执行的函数 + */ + loadedMetaData=function(){ + eventTarget('loadedMetaData',{ + width:CK.getWidth(), + height:CK.getHeight(), + videoWidth:CT.videoWidth, + videoHeight:CT.videoHeight, + duration:duration, + volume:CT.volume + }); + eventTarget('duration',duration); + if('error' in C){ + C['error'].hide(); + } + replaceInformation('videoWidth',CT.videoWidth); + replaceInformation('videoHeight',CT.videoHeight); + replaceInformation('volume',parseInt(CT.volume*100)); + replaceInformation('duration',parseInt(duration)); + documentHidden(function(state){ + if(vars['documentFocusPause']){ + if(state=='show'){ + if(!focusPause && paused){ + player.play(); + } + } + else{ + focusPause=paused; + player.pause(); + } + } + }); + }; + /* + * videoHandler + * 功能:视频播放对象video注册内部监听调用函数 + */ + var videoHandler={ + loadStart:function(){ + if(!vars['controls'] && app!='iphone'){ + C['loading'].show(); + } + C['centerPlay'].hide(); + eventTarget('loadstart'); + + }, + canPlay:function(){ + C['loading'].hide(); + eventTarget('canplay'); + }, + loadedData:function(){ + eventTarget('loadeddata'); + }, + loadedMetaData:function(){ + duration=this.duration; + if(!isUndefined(this.duration) && vars['duration']){ + duration=vars['duration']; + } + if(!vars['live']){ + C['time'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration)); + C['tempTime'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration)); + } + C['loading'].hide(); + if(vars['poster']){ + video.attr('poster',vars['poster']); + } + if(!vars['autoplay'] && !vars['controls']){ + C['centerPlay'].show(); + C['buffer'].hide(); + } + + CT.duration=duration; + CT.videoWidth=this.videoWidth; + CT.videoHeight=this.videoHeight; + CT.volume=this.volume; + if(CT.videoWidth || CT.videoHeight || duration){ + loadedMetaData(); + } + var len = 0; + if(!isUndefined(this.buffered)){ + len=this.buffered.length; + } + if(len>0){ + changeLoad(); + } + if(!vars['live']){ + changePreview(vars['preview']);//修改预览图片 + } + else{ + changePreview();//修改预览图片 + } + if(!isUndefined(vars['prompt']) && valType(vars['prompt'])=='array' && !vars['live']){ + changePrompt(); + } + else{ + deletePrompt(); + } + if(isChangeDef){ + checkDefinition(); + isChangeDef=false; + } + pSliderMouseDown=false; + loadedmetadataNum++; + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay'] && loadedmetadataNum>1){//如果是贴片广告播放中,则进行播放和计算 + player.play(); + calculationAdFrontTime(duration);//计算贴片广告的时间 + } + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && !ad['frontPlay']){//如果广告播放结束则播放正片 + player.volume(vars['volume']); + player.play(); + } + if(!vars['autoplay'] && loadMeta){ + loadMeta=false; + player.pause(); + setTimeout(player.pause,300); + } + }, + timeUpDate:function(){//监听播放时间 + if(!waited){ + waited=true; + C['buffer'].hide(); + eventTarget('buffer','end'); + } + var len = this.buffered.length; + if(len>0){ + changeLoad(); + } + if(!duration && this.duration){ + duration=this.duration; + CT.duration=duration; + CT.videoWidth=this.videoWidth; + CT.videoHeight=this.videoHeight; + if(CT.videoWidth || CT.videoHeight || duration){ + loadedMetaData(); + } + } + oldTime=playTime; + playTime=this.currentTime; + if(maxSeeTime<oldTime){ + maxSeeTime=oldTime; + } + changeProgress(playTime); + eventTarget('time',playTime); + if(!vars['live']){ + C['time'].htm(formatSeconds(playTime)+'/'+formatSeconds(duration)); + C['tempTime'].htm(formatSeconds(playTime)+'/'+formatSeconds(duration)); + } + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay'] && loadedmetadataNum>1){//如果是贴片广告播放中,则进行播放 + calculationAdFrontTime(duration-playTime);//计算贴片广告的时间 + } + if(!isUndefined(C['error']) && C['error'].css('display')=='block'){ + C['error'].hide(); + } + if(cookieName){ + changeCookie(playTime); + } + replaceInformation('audioDecodedByteCount',this.webkitAudioDecodedByteCount || this.audioDecodedByteCount || 0); + replaceInformation('videoDecodedByteCount',this.webkitVideoDecodedByteCount || this.videoDecodedByteCount || 0); + }, + ended:function(){//监听播放结束 + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay']){//如果是贴片广告播放中,则用广告结束函数对此进行判断 + adFrontEnded(); + } + else{ + C['bar']['playAndPause']['pause'].hide(); + C['bar']['playAndPause']['play'].hide(); + C['bar']['playAndPause']['refresh'].show(); + eventTarget('ended'); + showEnded(); + message(); + } + }, + error:function(event){ + if(!isUndefined(event.type)){ + var errorInfo=this.error; + var errorBak=function(){ + var code=12; + var msg=language['error']['loadingFailed']; + if(!isUndefined(errorInfo)){ + if(!isUndefined(errorInfo.code)){ + code=errorInfo.code; + } + if(!isUndefined(errorInfo.message)){ + msg=errorInfo.message; + } + CT.error={code:code,message:msg}; + showError(); + } + else{ + CT.error={code:code,message:msg}; + if(event.target.attr('src')){ + showError(); + } + } + eventTarget('error',CT.error);//注册监听error + }; + if(event.type=='error'){ + try{ + if(video.currentSrc){ + ajax({url:video.currentSrc,error:function(info){ + if(info && valType(info)=='object' && 'code' in info && info['code']){ + CT.error=info; + eventTarget('error',CT.error);//注册监听error + showError(); + } + else{ + errorBak(); + } + },success:function(data){ + if(!data){ + errorBak(); + } + }}); + } + else{ + errorBak(); + } + } + catch(event){ + errorBak(); + } + } + } + }, + stalled:function(){ + eventTarget('stalled');//注册监听error + CT.error={code:13,message:'load:stalled'}; + eventTarget('error',CT.error);//注册监听error + }, + suspend:function(){ + eventTarget('suspend');//注册监听error + }, + emptied:function(){ + eventTarget('emptied');//注册监听error + CT.error={code:7,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + }, + seeked:function(){ + if(paused){ + player.play(); + } + pSliderMouseDown=false; + eventTarget('seek',{time:this.currentTime,state:'seeked'}); + eventTarget('seeked'); + }, + seeking:function(){ + if(paused){ + player.play(); + } + var seekingTime=this.currentTime; + if(firstSeekTime==-1){ + firstSeekTime=seekingTime;//记录第一次拖动的时间 + } + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + if(oldTime!=seekingTime){ + waitingMessage=false; + player.seek(oldTime); + message(language['timeScheduleAdjust']['prohibit']); + return; + } + break; + case 2://只能前进(向右拖动 + if(seekingTime<oldTime){ + waitingMessage=false; + player.seek(oldTime); + message(language['timeScheduleAdjust']['prohibitBackOff']); + return; + } + break; + case 3://是只能后退 + if(seekingTime>oldTime){ + waitingMessage=false; + player.seek(oldTime); + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(seekingTime<firstSeekTime){ + waitingMessage=false; + player.seek(firstSeekTime); + message(language['timeScheduleAdjust']['prohibitLookBack']); + return; + } + break; + case 5://看过的地方可以随意拖动 + if(seekingTime>maxSeeTime){ + waitingMessage=false; + player.seek(maxSeeTime); + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + eventTarget('seek',{time:seekingTime,state:'seeking'}); + eventTarget('seeking'); + if(!vars['live']){ + C['time'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration)); + C['tempTime'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration)); + } + + }, + waiting:function(){ + waited=false; + eventTarget('buffer','start');//注册监听视频缓冲 + C['centerPlay'].hide(); + if(!vars['controls']){ + C['buffer'].show(); + } + if(!waitingMessage){ + waitingMessage=true; + } + else{ + message(language['waiting']); + } + + }, + play:function(){ + paused=false; + C['bar']['playAndPause']['play'].hide(); + C['bar']['playAndPause']['pause'].show(); + C['bar']['playAndPause']['refresh'].hide(); + C['centerPlay'].hide(); + if(playType=='button'){ + C['bar']['pbox'].removeClass('ck-bar-progress-out'); + } + else{ + C['bar']['pbox'].addClass('ck-bar-progress-out'); + } + if(recoveryVolume){ + recoveryVolume=false; + player.exitMuted(); + } + hideBar(); + closePauseAd();//关闭暂停广告 + playType=''; + if(!isUndefined(C['ended'])){ + player.closeLayer(C['ended']); + } + if('error' in C){ + C['error'].hide(); + } + eventTarget('play'); + if(!isUndefined(ad)){//如果存在广告 + if(!isUndefined(ad['front'])){//如果存在贴片广告 + if(isUndefined(ad['frontPlay'])){//如果贴片广告还未播放 + ad['frontPlayI']=0; + ad['frontPlay']=true;//开始播放贴片广告 + player.pause();//暂停视频 + adFrontPlay(); + return; + } + } + } + if(seekTime && (isUndefined(vars['live']) || (!isUndefined(vars['live']) && valType(vars['live'])=='boolean' && !vars['live'])) && seekTime<parseInt(duration*100)*0.01){//如果默认需要跳转,则进行seek + player.seek(seekTime); + seekTime=0; + } + }, + pause:function(){ + paused=true; + if(isUndefined(ad) || isUndefined(ad['frontPlay']) || (!isUndefined(ad['frontPlay']) && !ad['frontPlay'])){//如果是贴片广告播放中,则进行播放和计算 + if(!isUndefined(ad) && !isUndefined(ad['pause'])){ + if(isUndefined(ad['pausePlayI'])){//如果贴片广告还未播放 + ad['pausePlayI']=0; + } + adPausePlay();//播放暂停广告 + } + else{ + if(!vars['controls']){ + C['centerPlay'].show(); + C['buffer'].hide(); + } + } + } + else{ + if(!vars['controls']){ + C['centerPlay'].show(); + C['buffer'].hide(); + } + } + C['bar']['playAndPause']['pause'].hide(); + C['bar']['playAndPause']['play'].show(); + C['bar']['playAndPause']['refresh'].hide(); + C['bar']['pbox'].removeClass('ck-bar-progress-out'); + checkProgressSlider(); + eventTarget('pause'); + C['bar'].removeClass('ck-bar-out'); + CM.removeClass('ck-nocursor'); + }, + volumeChange:function(){ + if(this.volume==0 && !mutedState){ + this.muted=true; + } + if(this.volume>0 && mutedState){ + this.muted=false; + } + if(mutedState!=this.muted){ + mutedState=this.muted; + changeMuted(this.muted); + CT.muted=this.muted; + eventTarget('muted',CT.muted);//注册静音事件 + } + CT.volume=this.volume; + eventTarget('volume',this.volume);//注册音量事件 + if(!isUndefined(C['bar']['vbox'])){ + var vol=parseInt(this.volume*100); + C['bar']['vbox']['volume']['txt'].htm(vol); + if(!C['bar']['vbox']['mouseDown']){ + changeVolumeSlider(this.muted?0:this.volume); + } + if(!this.muted){//如果非静音状态 + message(language['volume']+vol+'%'); + } + } + replaceInformation('volume',parseInt(this.volume*100)); + }, + resize:function(){ + var fullState = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement; + if(fullState) { + C['bar']['fullAndExit']['exitFull'].show(); + C['bar']['fullAndExit']['full'].hide(); + C['ad']['bottom']['fullAndExit']['exitFull'].show(); + C['ad']['bottom']['fullAndExit']['full'].hide(); + if(!CM.hasClass('ck-main-full')){ + CM.addClass('ck-main-full'); + } + message(language['full']); + C['bar']['webFullAndExit'].hide(); + C['bar']['theatreAndExit'].hide(); + if(!isUndefined(C['menu'])){ + CM.append(C['menu']); + } + } + else { + fullState=false; + C['bar']['fullAndExit']['full'].show(); + C['bar']['fullAndExit']['exitFull'].hide(); + C['ad']['bottom']['fullAndExit']['full'].show(); + C['ad']['bottom']['fullAndExit']['exitFull'].hide(); + if(CM.hasClass('ck-main-full')){ + CM.removeClass('ck-main-full'); + } + if(!isUndefined(vars['webFull']) && vars['webFull']){ + C['bar']['webFullAndExit'].show(); + } + if(!isUndefined(vars['theatre']) && !CT.webFull){ + C['bar']['theatreAndExit'].show(); + } + if(!isUndefined(C['menu'])){ + $('body').append(C['menu']); + } + if(CV.css('width')!=CM.css('width')){ + player.zoom(100); + } + } + if(CT.full!=fullState){ + CT.full=fullState; + eventTarget('full',fullState);//注册播放事件 + } + checkVideoRotate(); + changeProgress(player.time()); + }, + keydown:function(event){ + event=window.event || event; + var keycode = event.keyCode || event.which; + var v=player.volume(); + var pre=function(){ + if(event.preventDefault){ + event.preventDefault(); + } + else{ + event.returnValue = false; + } + }; + switch(keycode) { + case 32: + pre(); + player.playOrPause(); + break; + case 37: + player.fastBack(); + break; + case 39: + player.fastNext(); + break; + case 38: + if(valType(vars['keyVolume'])=='number' && (vars['keyVolume']==1 || (vars['keyVolume']==2 && CT.full))){ + pre(); + player.volume(v+.1<1?v+=.1:1); + } + break; + case 40: + if(valType(vars['keyVolume'])=='number' && (vars['keyVolume']==1 || (vars['keyVolume']==2 && CT.full))){ + pre(); + player.volume(v-.1>0?v-=.1:0); + } + break; + default: + break; + } + }, + mouseWheel:function(event){ + if(valType(vars['mouseWheelVolume'])=='number' && (vars['mouseWheelVolume']==1 || (vars['mouseWheelVolume']==2 && CT.full))){ + event=window.event || event; + var v=player.volume(); + if(event.preventDefault){ + event.preventDefault(); + } + else{ + event.returnValue = false; + } + if(event.wheelDelta) { + if(event.wheelDelta > 0) { + player.volume(v+.1<1?v+=.1:1); + } + if(event.wheelDelta < 0) { + player.volume(v-.1>0?v-=.1:0); + } + } else if(event.detail) { + if(event.detail > 0) { + player.volume(v-.1>0?v-=.1:0); + } + if(event.detail < 0) { + player.volume(v+.1<1?v+=.1:1); + } + } + } + + } + }; + /* + * adFrontPlay + * 功能:播放贴片广告 + */ + var adFrontPlay=function(){ + if(ad['frontPlayI']==0){//如果是播放第一个广告,则显示相关组件 + allBarHide(false); + C['ad'].show(); + ad['front']['video']=false;//初始化,不包含视频广告 + //判断是否需要启用固定时间后关闭广告按钮 + if(!isUndefined(ad['front']['closeTime'])){ + if(ad['front']['closeTime']>0){ + C['ad']['top']['closeTime'].show(); + adFrontCloseTime(); + } + else{ + C['ad']['top']['closeAd'].show(); + } + } + } + if(!isUndefined(ad['front']['node']) && ad['front']['node']!=null){ + CM.append(ad['front']['node']); + player.closeLayer(ad['front']['node']); + ad['front']['node']=null; + } + C['ad']['picture'].htm(''); + C['ad']['picture'].hide(); + C['ad']['link'].hide(); + if(!isUndefined(ad['front']['list'][ad['frontPlayI']])){ + var adv=ad['front']['list'][ad['frontPlayI']]; + frontAdPlay=true;//贴片广告播放状态 + eventTarget('frontAd',adv); + if(adv['type']=='picture'){ + adPicturePlay(adv); + } + else if(adv['type']=='node'){ + adNode(adv); + } + else{ + C['ad']['link'].attr('data-link',adv['link']); + adVideoPlay(adv['file']); + } + if(!isUndefined(adv['link'])){ + C['ad']['bottom']['details'].show(); + C['ad']['bottom']['details'].htm('<a href="'+adv['link']+'" target="blank">'+language['details']+'</a>'); + } + else{ + C['ad']['bottom']['details'].hide(); + } + } + }, + /* + * adFrontCloseTime + * 功能:播放贴片广告时按指定时间后显示关闭广告按钮 + */ + adFrontCloseTime=function(){ + if(!isUndefined(ad['front']['closeSetTime'])){ + clearTimeout(ad['front']['closeSetTime']); + ad['front']['closeSetTime']=null; + } + C['ad']['top']['closeTime'].htmReplace('{seconds}',ad['front']['closeTime'],language['closeTime']); + ad['front']['closeTime']--; + if(ad['front']['closeTime']>0){ + ad['front']['closeSetTime']=setTimeout(adFrontCloseTime,1000); + } + else{ + C['ad']['top']['closeAd'].show(); + C['ad']['top']['closeTime'].hide(); + } + }, + /* + * calculationAdFrontTime + * 功能:计算贴片广告倒计时时间以及广告是视频时用于倒计时 + */ + calculationAdFrontTime=function(t){ + if(!isUndefined(t)){ + ad['front']['list'][ad['frontPlayI']]['time']=t; + } + ad['front']['countDown']=0; + for(var i=ad['frontPlayI'];i<ad['front']['list'].length;i++){ + ad['front']['countDown']+=parseInt(ad['front']['list'][i]['time']); + } + C['ad']['top']['countDown'].htm(ad['front']['countDown']+language['second']); + }, + /* + * clearAdFrontSetTime + * 功能:关闭贴片广告倒计时的计时器 + */ + clearAdFrontSetTime=function(){ + if(adFrontSetTime){ + clearTimeout(adFrontSetTime); + adFrontSetTime=null; + } + }, + /* + * adFrontCountDown + * 功能:贴片广告倒计时 + */ + adFrontCountDown=function(){ + clearAdFrontSetTime(); + var adv=ad['front']['list'][ad['frontPlayI']]; + if(adv['time']>0){ + adv['time']--; + ad['front']['countDown']--; + C['ad']['top']['countDown'].htm(ad['front']['countDown']+language['second']); + adFrontSetTime=setTimeout(adFrontCountDown,1000); + } + else{ + adFrontEnded(); + } + }, + /* + * adFrontEnded + * 功能:贴片广告单个播放完成后进行判断是否需要播放下一个广告还是播放正片 + */ + adFrontEnded=function(){ + if(ad['frontPlayI']<ad['front']['list'].length-1){ + ad['frontPlayI']++; + adFrontPlay(); + } + else{//贴片广告播放完成 + if(!isUndefined(ad['front']['node']) && ad['front']['node']!=null){ + CM.append(ad['front']['node']); + player.closeLayer(ad['front']['node']); + ad['front']['node']=null; + } + C['ad']['picture'].htm(''); + C['ad']['picture'].hide(); + ad['frontPlay']=false; + C['ad'].hide(); + allBarShow(); + seekTime=vars['seek']; + if(ad['front']['video']){//如果包含视频广告 + changeVideo(vars['video']); + } + else{ + player.play(); + } + eventTarget('frontAdEnded',true); + frontAdPlay=false;//贴片广告播放状态 + } + }, + /* + * adVideoPlay + * 功能:贴片广告播放视频 + */ + adVideoPlay=function(vstr){ + if(isUndefined(vstr)) return; + C['ad']['picture'].hide(); + seekTime=0; + if(video.attr('src') || video.htm()){ + player.pause(); + } + if(video.attr('src')){ + video.attr('src',''); + video.removeAttr('src'); + } + video.htm(''); + if(vars['plug'] && !canPlay(vstr)){ + switch(vars['plug']){ + case 'hls.js': + hlsPlayer(vstr); + break; + case 'flv.js': + flvPlayer(vstr); + break; + case 'mpegts.js': + mpegtsPlayer(vstr); + break; + default: + CT.error={code:10,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + showError(); + break; + } + } + else{ + video.attr('src',vstr); + } + ad['front']['video']=true;//设置包含视频广告 + C['ad']['link'].show(); + C['ad']['bottom']['mutedAndExit'].show(); + }, + /* + * adPicturePlay + * 功能:贴片广告播放图片 + */ + adPicturePlay=function(adv){ + if(isUndefined(adv['file'])) return; + var img = null; + var imgloadNum=0; + var imgLoadHandler=function(){ + C['ad']['picture'].show(); + C['ad']['picture'].htm(''); + img = createlImg(adv['file']); + C['ad']['picture'].append(img); + img.addListener('load',function(){ + var w=this.getWidth(),h=this.getHeight(); + if(w>0 || h>0){ + if(adv['link']){ + var a=createlA('',adv['link']); + a.append(this); + C['ad']['picture'].append(a); + } + else{ + C['ad']['picture'].append(this) + } + img.unbind(); + img.click(function(){ + eventTarget('frontAdClick',adv); + }); + } + else{ + if(imgloadNum<10){ + imgloadNum++; + imgLoadHandler(); + } + } + }); + }; + imgLoadHandler(); + calculationAdFrontTime();//计算时间 + adFrontCountDown();//开启倒计时 + C['ad']['bottom']['mutedAndExit'].hide(); + }, + /* + * adNode + * 功能:贴片广告播放外部节点 + */ + adNode=function(adv){ + if(isUndefined(adv['content'])) return; + ad['front']['node']=player.layer(adv); + ad['front']['node'].css({'z-index':1}); + C['ad'].append(ad['front']['node']); + ad['front']['node'].unbind(); + ad['front']['node'].click(function(){ + eventTarget('frontAdClick',adv); + }); + calculationAdFrontTime();//计算时间 + adFrontCountDown();//开启倒计时 + C['ad']['bottom']['mutedAndExit'].hide(); + }, + /* + * frontVideoClickHandler + * 功能:视频广告上方层单击事件 + */ + frontVideoClickHandler=function(){ + var url=C['ad']['link'].attr('data-link'); + window.open(url,'_blank'); + }, + /* + * closeFrontAd + * 功能:关闭贴片广告 + */ + closeFrontAd=function(){ + if(!isUndefined(ad) && !isUndefined(ad['front']) && !isUndefined(ad['front']['closeButtonClick'])){ + if(valType(ad['front']['closeButtonClick'])=='function'){ + try{ + ad['front']['closeButtonClick'](); + } + catch(event){console.error(event);} + } + else if(valType(ad['front']['closeButtonClick'])=='string'){ + try{ + eval(ad['front']['closeButtonClick']+ '()'); + } + catch(event){console.error(event);} + } + } + else{ + player.closeFrontAd(); + } + }, + /* + * adPausePlay + * 功能:播放暂停广告 + */ + adPausePlay=function(){ + closePauseAd(); + if(!isUndefined(ad) && !isUndefined(ad['pause']) && !isUndefined(ad['pause']['list']) && ad['pause']['list'].length-1>=ad['pausePlayI']){ + var adv=ad['pause']['list'][ad['pausePlayI']]; + if(!isUndefined(ad['pause']['close']) && ad['pause']['close']){ + ad['pauseClose']=createlButton('ck-pause-close'); + ad['pauseClose'].click(function(){ + C['centerPlay'].show(); + C['buffer'].hide(); + closePauseAd(); + }); + } + if(!isUndefined(adv['file'])){//图片 + var img = null; + var imgloadNum=0; + var imgLoadHandler=function(){ + img = createlImg(adv['file']); + C['adPause'].show(); + C['adPause'].htm(''); + C['adPause'].append(img); + img.addListener('load',function(){ + var w=this.getWidth(),h=this.getHeight(); + if(w>0 || h>0){ + C['adPause'].htm(''); + if(adv['link']){ + var a=createlA('',adv['link']); + a.append(this); + C['adPause'].append(a); + } + else{ + C['adPause'].append(this) + } + + C['adPause'].css({ + 'width':w+'px', + 'height':h+'px' + }); + if(ad['pauseClose']){ + C['adPause'].append(ad['pauseClose']); + } + img.click(function(){ + eventTarget('pauseAdClick',adv); + }); + } + else{ + if(imgloadNum<10){ + imgloadNum++; + imgLoadHandler(); + } + } + }); + }; + imgLoadHandler(); + } + else if(!isUndefined(adv['content'])){ + ad['pause']['node']=player.layer(adv); + if(ad['pauseClose']){ + ad['pause']['node'].append(ad['pauseClose']); + } + ad['pause']['node'].click(function(){ + eventTarget('pauseAdClick',adv); + }); + } + eventTarget('pauseAd',adv); + if(!isUndefined(adv['time']) && adv['time']>0){ + adPauseSetTime=setTimeout(function(){ + ad['pausePlayI']++; + if(ad['pausePlayI']>ad['pause']['list'].length-1){ + ad['pausePlayI']=0; + } + adPausePlay(); + },adv['time']*1000) + } + } + }, + /* + * closePauseAd + * 功能:关闭暂停广告 + */ + closePauseAd=function(){ + if(adPauseSetTime){ + clearTimeout(adPauseSetTime); + adPauseSetTime=null; + } + C['adPause'].hide(); + if(!isUndefined(ad) && !isUndefined(ad['pauseClose']) && ad['pauseClose']!=null){ + ad['pauseClose'].remove(); + ad['pauseClose']=null; + } + if(!isUndefined(ad) && !isUndefined(ad['pause']) && !isUndefined(ad['pause']['node']) && ad['pause']['node']){ + ad['pause']['node'].unbind(); + player.closeLayer(ad['pause']['node']); + eventTarget('pauseAdClose'); + } + }; + /* + * player + * 功能:开放接口,向外部提供播放器的交互功能列表,包含获取,执行,监听这三种功能 + */ + var player={ + /* + * width + * 功能:获取或设置播放器宽度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器宽度,@value为空时则获取播放器宽度 + */ + width:function(value){ + if(!isUndefined(value)){ + if(valType(value)=='number'){ + value+='px'; + } + CT.css({'width':value}); + checkVideoRotate(); + } + return CK.getWidth(); + }, + /* + * height + * 功能:获取或设置播放器显示高度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器高度,@value为空时则获取播放器高度 + */ + height:function(value){ + if(!isUndefined(value)){ + if(valType(value)=='number'){ + value+='px'; + } + CT.css({'height':value}); + checkVideoRotate(); + } + return CK.getHeight(); + }, + /* + * videoWidth + * 功能:获取视频本身的宽度,这是一个固定值 + */ + videoWidth:function(){ + if(video){ + return video.videoWidth; + } + return null; + }, + /* + * videoHeight + * 功能:获取视频本身的高度,这是一个固定值 + */ + videoHeight:function(){ + if(video){ + return video.videoHeight; + } + return null; + }, + /* + * height + * 功能:获取或设置播放器显示高度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器高度,@value为空时则获取播放器高度 + */ + zoom:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('zoom',fn); + } + if(valType(fn)=='number'){ + var arr=[C['topBar']['zoomEle']['zoom50'],C['topBar']['zoomEle']['zoom75'],C['topBar']['zoomEle']['zoom100']]; + for(var i=0;i<arr.length;i++){ + arr[i].removeClass('ck-top-bar-zoom-container-focus') + } + switch(fn){ + case 50: + arr[0].addClass('ck-top-bar-zoom-container-focus'); + break; + case 75: + arr[1].addClass('ck-top-bar-zoom-container-focus'); + break; + case 100: + arr[2].addClass('ck-top-bar-zoom-container-focus'); + break; + } + if(fn==50 || fn==75 || fn==100){ + nowZoom=fn; + checkVideoRotate();//调整视频尺寸 + eventTarget('zoom',fn); + } + } + } + return player; + }, + /* + * rotate + * 提供给播放器外部使用 + * 进行旋转 + * @obj为新的播放配置对象 + */ + rotate:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('rotate',fn); + } + if(valType(fn)=='number'){ + var arr=[0,90,180,270]; + var rot=0; + if(arr.length>fn && fn>0){ + rot=arr[fn]; + } + else{ + if(arr.indexOf(fn)>-1){ + rot=fn; + } + } + if(rot!=nowRotate){ + eventTarget('rotate',rot); + nowRotate=rot; + checkVideoRotate();//调整视频尺寸 + } + } + } + }, + /* + * vars + * 提供给播放器外部使用 + * 修改vars,动态切换视频地址 + * @obj为新的播放配置对象 + */ + vars:function(obj,val){ + if(isUndefined(obj)){ + return; + } + if(valType(obj)=='string' && !isUndefined(val)){ + var temp={}; + temp[obj]=val; + obj=temp; + } + var isChange=false; + for(var k in obj){ + if(k in vars && obj[k]!=vars[k]){ + isChange=true; + break; + } + } + if(isChange){ + vars = standardization(vars, obj); + } + if(!isUndefined(obj['video'])){ + isChangeDef=true; + changeVideo(vars['video']); + } + if(!isUndefined(obj['title'])){ + C['topBar']['titleEle'].htm(obj['title']); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频准备加载 + */ + loadstart:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadstart',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频加载 + */ + loadeddata:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadeddata',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频元数据加载成功 + */ + loadedMetaData:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadedMetaData',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频可以播放 + */ + canplay:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('canplay',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:执行播放操作/监听播放 + * @fn为函数时则监听视频播放,@fn为空时,则控制视频播放 + */ + play:function(fn){ + if(valType(fn)=='object'){ + if(fn['target']==C['bar']['playAndPause']['play'] || fn['target']==C['bar']['playAndPause']['refresh']){ + playType='button'; + } + } + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('play',fn); + } + else{ + if(loadedmetadataNum>0 && video){ + try{video.play();}catch(event){console.error(event)} + } + } + return player; + }, + /* + * puase + * 功能:执行暂停操作/监听暂停 + * @fn为函数时则监听视频暂停,@fn为空时,则控制视频暂停 + */ + pause:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('pause',fn); + } + else{ + if(loadedmetadataNum>0 && video){ + try{video.pause();}catch(event){console.error(event)} + } + } + return player; + }, + /* + * playOrPause + * 功能:在播放和暂停动作之间进行切换 + */ + playOrPause:function(){ + if(paused){ + player.play(); + } + else{ + player.pause(); + } + return player; + }, + /* + * volume + * 功能:调节和监听以及获取音量 + * @fn为函数时,则进行音量变化的监听,@fn为数字时,则进行音量调节,@fn为空时,则获取当前音量 + */ + volume:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('volume', fn); + } + else if(valType(fn)=='number' && video){ + if(fn<0)fn=0; + if(fn>1)fn=1; + if(video.muted){ + video.volume=fn*.5; + } + video.volume=fn; + } + } + else if(video){ + return video.volume; + } + return player; + }, + /* + * muted + * 功能:执行静音操作/监听静音 + * @fn为函数时则监听视频静音,@fn为空时,则控制视频静音 + */ + muted:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('muted', fn); + } + else if(video){ + video.muted=true; + } + return player; + }, + /* + * exitMuted + * 功能:执行取消静音操作 + */ + exitMuted:function(){ + if(video){ + video.muted=false; + if(video.volume==0){ + player.volume(vars['volume']>0?vars['volume']:.8); + } + } + return player; + }, + /* + * time + * 功能:获取当前播放时间/监听播放时间 + * @fn为函数时监听当前播放时间,为空时获取当前播放时间 + */ + time:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('time',fn); + } + else if(video){ + return video.currentTime || 0; + } + }, + /* + * seek + * 功能:监听跳转/执行跳转操作 + * @fn为函数时则监听视频跳转动作,@fn为数字时执行跳转操作 + */ + seek:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('seek',fn); + } + if(valType(fn)=='number' && video){ + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + message(language['timeScheduleAdjust']['prohibit']); + return; + break; + case 1://可以拖动 + break; + case 2://只能前进(向右拖动 + if(fn<oldTime){ + message(language['timeScheduleAdjust']['prohibitBackOff']); + return; + } + break; + case 3://是只能后退 + if(fn>oldTime){ + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(fn<firstSeekTime){ + waitingMessage=false; + video.currentTime=firstSeekTime; + message(language['timeScheduleAdjust']['prohibitLookBack']); + return; + } + break; + case 5://看过的地方可以随意拖动 + if(fn>maxSeeTime){ + waitingMessage=false; + video.currentTime=maxSeeTime; + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + pSliderMouseDown=false; + video.currentTime=fn; + } + } + return player; + }, + /* + * buffer + * 功能:监听视频缓冲 + * @fn为监听执行的函数 + */ + buffer:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('buffer',fn); + } + return player; + }, + /* + * ended + * 功能:监听视频播放结束 + * @fn为监听执行的函数 + */ + ended:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('ended',fn); + } + return player; + }, + /* + * 提供给播放器外部使用 + * 功能:监听点击下一集按钮的动作 + */ + next:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('next',fn); + } + return player; + }, + /* + * error + * 功能,监听播放器在加载视频过程和播放视频过程中出现的错误 + * @fn为监听执行的函数 + */ + error:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('error',fn); + } + return player; + }, + /* + * emptied + * 功能,监听播放器播放的视频文件发生故障并且文件突然不可用时 + * @fn为监听执行的函数 + */ + emptied:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('emptied',fn); + } + return player; + }, + /* + * duration + * 功能:获取视频总时间/监听视频总时间 + * @fn为函数时执行监听视频总时间,为空时获取视频总时间 + */ + duration:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('duration',fn); + } + else{ + return duration || 0; + } + }, + /* + * playbackRate + * 功能:监听或返回视频播放速度 + * @fn为函数时执行监听视频播放速度,为数字时切换播放速度,为空时获取视频播放速度 + */ + playbackRate:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('playbackRate',fn); + } + else if(valType(fn)=='number' && video){ + video.playbackRate=fn; + CT.playbackRate=fn; + eventTarget('playbackRate',fn); + changePlaybackrateVal(fn); + } + + } + else{ + return video.playbackRate; + } + }, + /* + * track + * 功能:监听或返回视频的字幕 + * @fn为函数时执行监听视频字幕,为数字时切换字幕,为空时获取字幕 + */ + track:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('track',fn); + } + else if(valType(fn)=='number' && video){ + var track=null; + if(!isUndefined(video.textTracks)){ + track=video.textTracks; + } + if(track && valType(track)=='texttracklist'){ + var arr=vars['track']; + for(var i=track.length-1;i>-1;i--){ + video.find('track').eq(i).remove(); + } + for(var i=0;i<arr.length;i++){ + var def=''; + arr[i]['default']=false; + if(i==fn){ + def=' default'; + arr[i]['default']=true; + } + track+='<track src="'+arr[i]['src']+'" srclang="'+arr[i]['srclang']+'" kind="'+arr[i]['kind']+'" label="'+arr[i]['label']+'"'+def+'>'; + } + if(video){ + var html=video.htm()+track; + video.htm(html); + } + changeTrackVal(fn); + } + } + + } + else{ + return CT.track; + } + }, + /* + * fastBack + * 功能:快退 + * @num为数字时快退指定秒数,为空时快退20秒 + */ + fastBack:function(num){ + if(duration==0) return; + if(isUndefined(num) || valType(num)!='number'){ + num=20; + } + var time=player.time(); + if(time-num>0){ + time-=num; + } + else{ + time=0; + } + player.seek(time); + return player; + }, + /* + * fastNext + * 功能:快进 + * @num为数字时快进指定秒数,为空时快进20秒 + */ + fastNext:function(num){ + if(duration==0) return; + if(isUndefined(num) || valType(num)!='number'){ + num=20; + } + var time=player.time(); + if(time+num<duration){ + time+=num; + } + else{ + time=duration; + } + player.seek(time); + return player; + }, + /* + * definition + * 功能:监听清晰度切换/操作清晰度切换 + * @fn为一个函数时监听清晰度切换,为数字时执行清晰度切换,数字为清晰度的编号,从0开始 + */ + definition:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('definition',fn); + } + if(valType(fn)=='number'){ + changeDefinition(fn); + } + } + return player; + }, + /* + * fps + * 功能:监听Fps + * @fn为一个函数时监听fps,为空时获取fps + */ + fps:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('fps',fn); + } + return CT.fps; + }, + /* + * playback + * 功能:监听回放操作/返回需要回放的时间点 + */ + playback:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('playback',fn); + } + } + else{ + return playbackTime; + } + return player; + }, + /* + * backLive + * 功能:显示/隐藏回到直播的按钮 + */ + backLive:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('backLive',fn); + } + if(valType(fn)=='boolean'){ + if(bool){ + C['bar']['backLive'].show(); + } + else{ + C['bar']['backLive'].hide(); + } + } + } + return player; + }, + /* + * full + * 功能:监听全屏功能/执行全屏操作 + * @fn为函数时监听用户执行全屏操作,为空时执行全屏操作 + */ + full:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('full',fn); + } + else{ + if(smallWindowsState){ + return; + } + if(CT.theatre){ + player.exitTheatre(); + } + if(CT.webFull){ + player.exitWebFull(); + } + var requestMethod = CK.requestFullScreen || //W3C + CK.webkitRequestFullScreen || //Chrome等 + CK.mozRequestFullScreen || //FireFox + CK.oRequestFullscreen || + CK.msRequestFullscreen; //IE11 + if (!isUndefined(requestMethod)) { + requestMethod.call(CK); + } + else if (!isUndefined(window.ActiveXObject)) { //for Internet Explorer + var wscript = new ActiveXObject('WScript.Shell'); + if (wscript !== null) { + wscript.SendKeys('{F11}'); + } + } + else if(!isUndefined(video.webkitEnterFullscreen) || !isUndefined(video.webkitEnterFullScreen)){ + var fullScreen=video.webkitEnterFullscreen || video.webkitEnterFullScreen; + fullScreen.call(video); + } + player.zoom(100); + } + return player; + }, + /* + * exitFull + * 功能: 退出全屏 + */ + exitFull:function(){ + var exitFullFun = document.exitFullscreen || //W3C + document.mozCancelFullScreen || //FireFox + document.webkitExitFullscreen || //Chrome等 + document.oCancelFullScreen || //Chrome等 + document.msExitFullscreen; //IE11 + if (!isUndefined(exitFullFun)) { + exitFullFun.call(document); + } + else if (!isUndefined(window.ActiveXObject)) { //for Internet Explorer + var wscript = new ActiveXObject('WScript.Shell'); + if (wscript !== null) { + wscript.SendKeys('{F11}'); + } + } + return player; + }, + /* + * fullOrExit + * 功能:在全屏和退出全屏之间进行切换 + */ + fullOrExit:function(){ + var fullState = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement; + if(fullState){ + player.exitFull(); + } + else{ + player.full(); + } + return player; + }, + /* + * webFull + * 功能:监听网页全屏/执行网页全屏 + * @fn为函数时监听网页全屏,为空时执行网页全屏 + */ + webFull:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('webfull',fn); + } + else{ + exitSmallWindows(); + if(!isUndefined(vars['theatre'])){ + C['bar']['theatreAndExit'].hide(); + } + CK.css({ + 'position':'fixed', + 'top':0, + 'left':0, + 'height':'100%', + 'z-index':getMaxZIndex()+1 + }); + C['bar']['webFullAndExit']['webFull'].hide(); + C['bar']['webFullAndExit']['exitWebFull'].show(); + CT.webFull=true; + eventTarget('webfull',true); + checkVideoRotate(); + } + return player; + }, + /* + * exitWebFull + * 功能:退出网页全屏 + */ + exitWebFull:function(){ + CK.css({ + 'position':'relative' + }); + C['bar']['webFullAndExit']['webFull'].show(); + C['bar']['webFullAndExit']['exitWebFull'].hide(); + if(!isUndefined(vars['theatre'])){ + C['bar']['theatreAndExit'].show(); + C['bar']['theatreAndExit']['theatre'].show(); + C['bar']['theatreAndExit']['exitTheatre'].hide(); + } + CK.attr('style',''); + CT.webFull=false; + eventTarget('webfull',false); + checkVideoRotate(); + return player; + }, + /* + * theatre + * 功能:监听剧场模式/执行剧场模式 + * @fn为函数时执行监听剧场模式,为空时执行剧场模式操作 + */ + theatre:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('theatre',fn); + } + else{ + if(valType(vars['theatre'])=='array' && vars['theatre'].length==2){ + var fun=vars['theatre'][0]; + if(valType(fun)=='function'){ + fun(); + } + if(valType(fun)=='string'){ + eval(fun+ '()'); + } + } + else{ + exitSmallWindows(); + CK.css({ + 'position':'absolute', + 'top':CT.offset()['top'], + 'left':0, + 'height':CT.getHeight()+'px', + 'z-index':getMaxZIndex()+1 + }); + C['bar']['theatreAndExit']['theatre'].hide(); + C['bar']['theatreAndExit']['exitTheatre'].show(); + } + + CT.theatre=true; + eventTarget('theatre',true); + checkVideoRotate(); + } + return player; + }, + /* + * exitTheatre + * 功能:退出剧场模式 + */ + exitTheatre:function(){ + if(valType(vars['theatre'])=='array' && vars['theatre'].length==2){ + var fun=vars['theatre'][1]; + if(valType(fun)=='function'){ + fun(); + } + if(valType(fun)=='string'){ + eval(fun+ '()'); + } + } + else{ + CK.css({ + 'position':'relative' + }); + C['bar']['theatreAndExit']['theatre'].show(); + C['bar']['theatreAndExit']['exitTheatre'].hide(); + CK.attr('style',''); + CT.theatre=false; + } + eventTarget('theatre',false); + checkVideoRotate(); + return player; + }, + /* + * smallWindows + * 功能:监听小窗口模式开启关闭/执行开启关闭小窗口模式 + */ + smallWindows:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('smallWindows',fn); + } + if(valType(fn)=='boolean'){ + if(fn){ + C['rightBar']['smallwindows']['open'].show(); + C['rightBar']['smallwindows']['close'].hide(); + CT.smallWindows=true; + } + else{ + C['rightBar']['smallwindows']['open'].hide(); + C['rightBar']['smallwindows']['close'].show(); + CT.smallWindows=false; + } + eventTarget('smallWindows',CT.smallWindows); + checkVideoRotate(); + } + } + return CT.smallWindows; + }, + /* + * loop + * 功能:监听循环/执行开启关闭循环功能 + * @fn为函数时是监听循环,@fn为boolean类型时,为true开启循环,为false关闭循环,@fn为空时获取当前循环状态 + */ + loop:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('loop',fn); + } + if(valType(fn)=='boolean' && video){ + if(fn){ + C['rightBar']['loop']['open'].show(); + C['rightBar']['loop']['close'].hide(); + CT.loop=true; + video.attr('loop','loop'); + eventTarget('loop',true); + } + else{ + C['rightBar']['loop']['open'].hide(); + C['rightBar']['loop']['close'].show(); + CT.loop=false; + video.attr('loop',false); + video.removeAttr('loop'); + eventTarget('loop',false); + } + } + } + return CT.loop; + }, + /* + * screenshot + * 功能:截图 + * @fn为函数时监听截图功能,@fn为空时进行截图 + */ + screenshot:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('screenshot',fn); + } + else{ + if(!isUndefined(vars['screenshot']) && vars['screenshot'] && video){ + try { + message(language['screenshotStart'],true); + var newCanvas = $(document.createElement('canvas')); + newCanvas.width = video.videoWidth; + newCanvas.height = video.videoHeight; + newCanvas.getContext('2d').drawImage(video, 0, 0, video.videoWidth, video.videoHeight); + var base64 = newCanvas.toDataURL('image/png'); + eventTarget('screenshot',base64); + if(screenshotImg){ + screenshotImg.remove(); + screenshotImg=null; + } + screenshotImg=createlImg(base64); + screenshotImg.addListener('load',function(){ + C['screenshot']['img'].append(screenshotImg); + C['screenshot'].show().css({'width':this.getWidth()+'px'}); + }); + var newBlob=dataURLtoBlob(base64); + var url = URL.createObjectURL(newBlob); + var downName='video'; + if(vars['title']){ + downName=vars['title']; + } + C['screenshot']['bar']['down'].attr('href',url).attr('download',downName); + return base64; + }catch(error) { + message(language['error']['screenshot'],true); + } + } + else{ + message(language['screenshotClose'],true); + } + } + return player; + }, + /* + * closeScreenshot + * 功能:关闭截图显示容器 + */ + closeScreenshot:function(bool){ + if(!isUndefined(bool) && valType(bool)=='boolean' && !bool){ + C['screenshot'].show(); + } + else{ + C['screenshot'].hide(); + } + return player; + }, + /* + * layer + * 功能:在播放器中添加一个层 + */ + layer:function(obj,bar){ + if(isUndefined(obj)){ + return null; + } + var cBar=false; + if(!isUndefined(bar)){ + cBar=bar; + } + var ele=null; + if(valType(obj)=='object'){ + if('class' in obj && 'content' in obj){ + ele=createlDiv(obj['class']); + ele.htm(obj['content']); + } + else if('content' in obj){ + obj=obj['content']; + } + } + if(valType(obj)=='string'){ + if(obj.substr(0,1)=='.' || obj.substr(0,1)=='#'){ + ele=getElement(obj); + } + else{ + ele=createlDiv('ck-layer'); + ele.htm(obj); + } + } + if(ele){ + var zIndex=ele.css('z-index'); + if(zIndex=='auto'){ + zIndex=101; + } + if(zIndex<101) zIndex=101; + if(zIndex>200) zIndex=200; + if(isUndefined(ele.cssDisplay)){ + ele.cssPosition=ele.css('position'); + ele.cssDisplay=ele.css('display'); + } + ele.css({ + 'position': 'absolute', + 'z-index':zIndex + }); + if(!cBar){ + CM.append(ele); + } + else{ + C['bar'].append(ele); + } + ele.CK=CK; + ele.show(); + } + return ele; + }, + /* + * closeLayer + * 功能:关闭一个层 + */ + closeLayer:function(ele){ + if(valType(ele)=='string'){ + var temp=$(ele); + if(!isUndefined(temp)){ + if(temp.length>0){ + ele=temp.eq(0); + } + } + } + if(!isUndefined(ele) && valType(ele)=='htmlobject'){ + if(!isUndefined(ele.captureParentNode)){ + var eleP=ele.captureParentNode; + if (ele.nextElement) { + try { + eleP.insertBefore(ele, ele.nextElement); + } + catch (event) { + eleP.append(ele); + } + } + else if (ele.prevElement) { + try { + eleP.insertAfter(ele, ele.prevElement); + } + catch (event) { + eleP.append(ele); + } + } + else { + eleP.append(ele); + } + ele.css({'display':ele.cssDisplay}); + } + else{ + ele.remove(); + } + if(!isUndefined(ele.cssDisplay)){ + ele.css({ + 'display':ele.cssDisplay, + 'position':ele.cssPosition + }); + } + } + return player; + }, + /* + * message + * 在播放器内部显示一条提示信息 + */ + message:function(str){ + message(str); + return player; + }, + /* + * closeFrontAd + * 功能:关闭贴片广告 + */ + closeFrontAd:function(){ + if(frontAdPlay && !isUndefined(ad) && !isUndefined(ad['front']) && !isUndefined(ad['front']['list'])){ + ad['frontPlayI']=ad['front']['list'].length-1; + adFrontEnded(); + clearAdFrontSetTime(); + } + return player; + }, + /* + * addListener + * 功能:监听功能 + */ + addListener:function(name,fn){ + newEvent.addEventListener(name,fn); + }, + /* + * removeListener + * 功能:监听功能 + */ + removeListener:function(name,fn){ + newEvent.removeEventListener(name,fn); + }, + /* + * bar + * 功能:显示/关闭底部控制栏 + */ + bar:function(bool){ + barShow=bool; + if(bool){ + C['bar'].show(); + } + else{ + C['bar'].hide(); + } + }, + /* + * rightBar + * 功能:显示/关闭右边控制栏 + */ + rightBar:function(bool){ + rightBarShow=bool; + if(bool){ + C['rightBar'].show(); + } + else{ + C['rightBar'].hide(); + } + }, + /* + * mouseActive + * 功能,监听鼠标是否经过播放器 + */ + mouseActive:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('mouseActive',fn); + } + return this; + }, + /* + * cookie + * 功能,读取cookie + */ + cookie:function(name){ + if(name=='delete'){ + cookie(ckplayerCookie,'delete',vars['domain']); + return null; + } + if(!isUndefined(name) && name){ + name=name.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, ''); + } + var cStr=cookie(ckplayerCookie); + if(cStr){ + var arr=stringToArray(cStr); + var tempArr=[]; + var cTime=parseInt(Date.now()*0.001); + for(i=0;i<arr.length;i++){ + if(parseInt(arr[i][2])>cTime){ + tempArr.push(arr[i]); + } + } + arr=tempArr; + if(arr.length>0){ + cookie(ckplayerCookie,'delete',vars['domain'],vars['cookiePath']); + cookie(ckplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']); + for(var i=0;i<arr.length;i++){ + arr[i]={ + name:arr[i][0], + time:arr[i][1], + expirationTime:date('Y-m-d H:i:s',arr[i][2]), + expirationTimeStamp:arr[i][2] + }; + if(!isUndefined(name) && name==arr[i]['name']){ + return arr[i]; + } + } + return arr; + } + else{ + cookie(ckplayerCookie,'delete',vars['domain'],vars['cookiePath']); + } + } + return null; + }, + /* + * visibilityState + * 功能:监听当前文档是否处于焦点状态 + */ + visibilityState:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + if(!isUndefined(document.visibilityState)){ + fn(document.visibilityState === 'visible'?'show':'hidden'); + } + newEvent.addEventListener('visibilityState',fn); + } + return this; + }, + /* + * remove + * 功能:卸载播放器 + */ + remove:function(){ + var eventTemp={}; + if(eventTargetList!=null){ + for(var k in eventTargetList){ + eventTemp[k]=eventTargetList[k]; + } + for(var k in eventTemp){ + var temp=eventTemp[k]; + if(temp){ + for(var i=0;i<temp.length;i++){ + var eve=temp[i]; + newEvent.removeEventListener(k,eve); + } + } + + } + } + if(frontAdPlay){ + this.closeFrontAd(); + } + if(pugPlayer){ + pugPlayer.pause(); + pugPlayer.unload(); + pugPlayer.detachMediaElement(); + pugPlayer.destroy(); + pugPlayer=null; + } + if(hls){ + hls.stopLoad(); + hls.detachMedia(); + } + loadedmetadataNum=0; + loadedTrack=false; + isChangeDef=true; + if(video){ + video.unbind(); + video.remove(); + video=null; + } + + if(!isUndefined(C['menu'])){ + C['menu'].remove(); + } + if(CT){ + CT.unbind(); + CT.htm(''); + } + return null; + } + }; + /* + * checkBar + * 功能:完全获取vars值后判断控制栏上的按钮是否需要显示 + * 完全获取vars是指视频加载成功后 + */ + var checkBar=function(){ + //初始化判断 + if(vars['autoplay']){ + C['bar']['playAndPause']['play'].hide(); + C['bar']['playAndPause']['pause'].show(); + } + else{ + C['bar']['playAndPause']['play'].show(); + C['bar']['playAndPause']['pause'].hide(); + } + if(mutedState){ + C['bar']['vbox']['muted'].hide(); + } + else{ + C['bar']['vbox']['exitMuted'].hide(); + } + if(!isUndefined(vars['next'])){ + C['bar']['nextEpisode'].show(); + } + else{ + C['bar']['nextEpisode'].hide(); + } + if(!isUndefined(vars['webFull']) && vars['webFull'] && !CT.full){ + C['bar']['webFullAndExit'].show(); + } + else{ + C['bar']['webFullAndExit'].hide(); + } + if(!isUndefined(vars['theatre']) && !CT.full && !CT.webFull){ + C['bar']['theatreAndExit'].show(); + } + else{ + C['bar']['theatreAndExit'].hide(); + } + if(!isUndefined(vars['rightBar']) && vars['rightBar']){ + C['rightBar'].show(); + } + else{ + C['rightBar'].hide(); + } + if(!vars['live'] || valType(vars['live'])=='number'){ + pSliderMouseDown=false; + progressDragX();//注册进度滑块动作 + } + if(vars['live'] || valType(vars['live'])=='number'){ + C['time'].htm(language['live']); + C['tempTime'].htm(language['live']); + } + if(valType(vars['smallWindows'])=='boolean' && !vars['smallWindows']){ + CT.smallWindows=false; + C['rightBar']['smallwindows']['open'].hide(); + C['rightBar']['smallwindows']['close'].show(); + } + if(CT.loop){ + C['rightBar']['loop']['open'].show(); + C['rightBar']['loop']['close'].hide(); + } + else{ + C['rightBar']['loop']['open'].hide(); + C['rightBar']['loop']['close'].show(); + } + if(!isUndefined(vars['backLive']) && vars['backLive']){ + C['bar']['backLive'].show(); + } + if(vars['volume']==0){ + player.muted(); + } + }, + /* + * loadLogo + * 功能:加载logo + */ + loadLogo=function(){ + if(!isUndefined(vars['logo']) && isUndefined(C['logo'])){ + C['logo']=createlDiv('ck-logo'); + createlImg(vars['logo']).addListener('load',function(){ + CM.append(C['logo']); + C['logo'].append(this); + }).addListener('error',function(){C['logo'].remove()}); + } + }, + /* + * loadAbout + * 功能:加载loadAbout + */ + loadAbout=function(){ + if(!isUndefined(vars['information']) && !isUndefined(C['about']) && valType(vars['information'])=='object'){ + var obj=vars['information']; + var k=''; + var ul=$(document.createElement('ul')); + var temp=''; + for(k in obj){ + var title=createlDiv('div').attr('class','ck-about-title'); + var content=createlDiv('div').attr('class','ck-about-content'); + var li=$(document.createElement('li')); + title.htm(k); + content.htm(obj[k]); + li.append(title); + li.append(content); + ul.append(li); + temp+=k+':'+obj[k]+'\n'; + } + C['about'].append(ul); + C['about']['textareaText']=temp; + C['about']['textareaEle']=$(document.createElement('textarea')); + CM.append(C['about']['textareaEle']); + C['about']['textareaEle'].hide() + } + }, + /* + * loadMenu + * 功能:加载右键 + */ + loadMenu=function(){ + if(!isUndefined(vars['menu']) && vars['menu']){ + rightMenu=vars['menu']; + } + C['menu']=createlDiv('ckplayer-ckplayer-menu'); + for(var i=0;i<rightMenu.length;i++){ + var m=rightMenu[i]; + var li=createlDiv('ck-li'); + if(!isUndefined(m['underline'])){ + li.addClass('ck-underline'); + } + if(!isUndefined(m['link']) && !isUndefined(m['title'])){ + li.append(createlA(m['title'],m['link'])); + C['menu'].append(li); + } + else if(!isUndefined(m['javascript']) && !isUndefined(m['title'])){ + li.append(createlJsLink(m['title'],m['javascript'])); + C['menu'].append(li); + } + else if(!isUndefined(m['click']) && !isUndefined(m['title'])){ + var a=createlJsLink(m['title']); + a.attr('data-click',m['click'].toString()); + a.click(function(){ + eval($(this).attr('data-click')+'()'); + C['menu'].hide(); + }); + li.append(a); + C['menu'].append(li); + } + else if(!isUndefined(m['title'])){ + li.htm(m['title']); + C['menu'].append(li); + } + } + $('body').append(C['menu']); + CM.oncontextmenu = function(eve) { + var e = eve || window.event; + var client = getClient(e); + if (e.button == 2) { + e.returnvalue = false; + var x = client['x'] - 2; + var y = client['y'] - 2; + C['menu'].show(); + C['menu'].css({ + left: x + 'px', + top: y + 'px' + }); + return false; + } + return true; + }; + var menuSetTimeOut=null; + var clearTime=function(){ + if(menuSetTimeOut){ + clearTimeout(menuSetTimeOut); + menuSetTimeOut=null; + } + }; + var menuMouseOut=function(){ + clearTime(); + menuSetTimeOut=setTimeout(function(){ + C['menu'].hide(); + },200); + }; + C['menu'].mouseout(menuMouseOut); + C['menu'].mouseover(clearTime); + }, + /* + * aboutShow + * 功能:显示关于视频 + */ + aboutShow=function(){ + C['about'].show(); + C['menu'].hide(); + }, + /* + * aboutHide + * 功能:显示关于视频 + */ + aboutHide=function(){ + C['about'].hide(); + }, + /* + * aboutCopy + * 功能:拷贝关于视频内容 + */ + aboutCopy=function(){ + C['about']['textareaEle'].show(); + C['about']['textareaEle'].select(); + document.execCommand('Copy'); // 执行浏览器复制命令 + C['about']['textareaEle'].hide(); + message(language['copySucceeded'],true); + }, + /* + * getBarHeight + * 功能:获取控制栏的高 + */ + getBarHeight=function(){ + var h=C['bar'].getHeight(); + if(parseFloat(C['bar']['pbox'].css('top'))<0){ + h-=parseInt(C['bar']['pbox'].css('top')); + } + return h; + }, + /* + * hideBar + * 功能:隐藏控制栏,只在播放状态下有效 + */ + hideBar=function(){ + if(mouseSetTime){ + clearTimeout(mouseSetTime); + mouseSetTime=null; + } + mouseSetTime=setTimeout(function(){ + if(!paused){ + C['bar'].addClass('ck-bar-out'); + eventTarget('mouseActive',false); + if(CT.full){ + CM.addClass('ck-nocursor'); + } + if(C['rightBar'].css('display')=='block'){ + C['rightBar'].addClass('ck-right-bar-hide'); + } + if(C['topBar'].css('display')=='block'){ + C['topBar'].addClass('ck-top-bar-hide'); + } + } + mouseSetTime=null; + },vars['barHideTime']); + }, + /* + * barMouseOut + * 功能:鼠标离开控制栏修改播放进度框样式 + */ + barMouseOut=function(){ + if(!paused){ + C['bar']['pbox'].addClass('ck-bar-progress-out'); + hideBar(); + } + }, + /* + * barMouseOver + * 功能:鼠标经过控制栏修改播放进度框样式 + */ + barMouseOver=function(){ + if(!paused){ + C['bar']['pbox'].removeClass('ck-bar-progress-out'); + if(mouseSetTime){ + clearTimeout(mouseSetTime); + mouseSetTime=null; + } + } + }, + /* + * rightBarMouseOut + * 功能:鼠标离开右侧控制栏修改播放进度框样式 + */ + rightBarMouseOut=function(){ + if(!paused){ + hideBar(); + } + }, + /* + * rightBarMouseOver + * 功能:鼠标经过右侧控制栏修改播放进度框样式 + */ + rightBarMouseOver=function(){ + if(!paused){ + if(mouseSetTime){ + clearTimeout(mouseSetTime); + mouseSetTime=null; + } + } + }, + /* + * checkPlaybackrate + * 功能:初始化或重置倍速组件内容 + */ + checkPlaybackrate=function(){ + var playbackrate=vars['playbackrateList']; + var pbr=vars['playbackrate']; + C['bar']['playbackrate']['bg']=createlDiv('ck-list-bg'); + C['bar']['playbackrate']['bgbox'].append(C['bar']['playbackrate']['bg']); + C['bar']['playbackrate']['bg']['p']=[]; + for(var i=playbackrate.length-1;i>-1;i--){ + var pTemp=createlButton('ck-list-p',playbackrate[i]+language['playbackrateSuffix']); + pTemp.attr('data-i',i).attr('data-val',playbackrate[i]); + C['bar']['playbackrate']['bg']['p'].push(pTemp); + C['bar']['playbackrate']['bg'].append(pTemp); + pTemp.click(playbackrateClick); + } + C['bar']['playbackrate'].hide(); + if(!isUndefined(vars['playbackrateOpen']) && vars['playbackrateOpen']){ + C['bar']['playbackrate'].show(); + C['bar']['playbackrate']['bgbox'].show(); + var w=C['bar']['playbackrate']['bg'].getWidth(),h=C['bar']['playbackrate']['bg'].getHeight(); + var bw=C['bar']['playbackrate']['button'].getWidth(); + C['bar']['playbackrate']['bg'].css({'width':w+10+'px'}); + w=C['bar']['playbackrate']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['playbackrate']['bgbox'].attr('style',''); + C['bar']['playbackrate']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['playbackrate']['button'].mouseover(function(){ + w=C['bar']['playbackrate']['bg'].getWidth(); + bw=C['bar']['playbackrate']['button'].getWidth(); + C['bar']['playbackrate']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + changePlaybackrateVal(pbr); + } + }, + /* + * playbackrateClick + * 功能:选择播速 + */ + playbackrateClick=function(e){ + C['bar']['playbackrate']['bgbox'].hide(); + setTimeout(function(){C['bar']['playbackrate']['bgbox'].removeCss('display');},300); + message(language['switchTo']+$(this).htm()); + player.playbackRate(parseFloat($(this).attr('data-val'))); + }, + /* + * changePlaybackrateVal + * 功能:根据速度检查播速 + */ + changePlaybackrateVal=function(num){ + C['bar']['playbackrate']['bg'].find('button').each(function(index,ele){ + var val=parseFloat(ele.attr('data-val')); + ele.removeClass('ck-list-p-focus'); + if(num==val){ + ele.addClass('ck-list-p-focus'); + if(num!=1){ + C['bar']['playbackrate']['button'].htm(ele.htm()); + } + else{ + C['bar']['playbackrate']['button'].htm(language['playbackrate']); + } + } + else{ + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * checkTrack + * 功能:初始化或重置字幕组件内容 + */ + checkTrack=function(){ + var track=vars['track']; + var pbr=-1; + C['bar']['track']['bgbox'].htm(''); + C['bar']['track']['bg']=createlDiv('ck-list-bg'); + C['bar']['track']['bgbox'].append(C['bar']['track']['bg']); + C['bar']['track']['bg']['p']=[]; + var pTemp=null; + for(var i=track.length-1;i>-1;i--){ + pTemp=createlButton('ck-list-p',track[i]['label']); + pTemp.attr('data-i',i).attr('data-title',track[i]['label']); + C['bar']['track']['bg']['p'].push(pTemp); + C['bar']['track']['bg'].append(pTemp); + if(!isUndefined(track[i]['default']) && track[i]['default']){ + pbr=i; + } + pTemp.click(trackClick); + } + // + pTemp=createlButton('ck-list-p',language['noTrack']); + pTemp.attr('data-i',-1).attr('data-title',language['noTrack']); + C['bar']['track']['bg']['p'].push(pTemp); + C['bar']['track']['bg'].append(pTemp); + pTemp.click(trackClick); + // + C['bar']['track'].hide(); + C['bar']['track'].show(); + C['bar']['track']['bgbox'].show(); + var w=C['bar']['track']['bg'].getWidth(),h=C['bar']['track']['bg'].getHeight(); + var bw=C['bar']['track']['button'].getWidth(); + C['bar']['track']['bg'].css({'width':w+10+'px'}); + w=C['bar']['track']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['track']['bgbox'].attr('style',''); + C['bar']['track']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['track']['button'].mouseover(function(){ + w=C['bar']['track']['bg'].getWidth(); + bw=C['bar']['track']['button'].getWidth(); + C['bar']['track']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + changeTrackVal(pbr); + }, + /* + * trackClick + * 功能:选择字幕 + */ + trackClick=function(e){ + C['bar']['track']['bgbox'].hide(); + setTimeout(function(){C['bar']['track']['bgbox'].removeCss('display');},300); + message(language['switchTo']+$(this).attr('data-title')); + player.track(parseFloat($(this).attr('data-i'))); + }, + /* + * changeTrackVal + * 功能:根据字幕检查 + */ + changeTrackVal=function(num){ + C['bar']['track']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(num==i){ + C['bar']['track']['button'].htm(ele.attr('data-title')); + if(i>-1){ + CT.track=vars['track'][i]; + eventTarget('track',vars['track'][i]); + } + else{ + CT.track=null; + eventTarget('track',null); + } + ele.addClass('ck-list-p-focus'); + } + else{ + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * checkDefinition + * 功能:初始化或重置清晰度组件内容 + */ + checkDefinition=function(){ + var pi=-1; + var videoUrl=video['currentSrc']; + if(!isUndefined(C['bar']['definition']['bg'])){ + C['bar']['definition']['bgbox'].htm(''); + C['bar']['definition']['bgbox'].attr('style',''); + C['bar']['definition']['button'].htm(language['definition']); + } + if(valType(vars['video'])=='array'){ + var arr=vars['video']; + C['bar']['definition']['bg']=createlDiv('ck-list-bg'); + C['bar']['definition']['bgbox'].append(C['bar']['definition']['bg']); + C['bar']['definition']['bg']['p']=[]; + for(var i=arr.length-1;i>-1;i--){ + var pTemp=createlButton('ck-list-p',arr[i][2]); + pTemp.attr('data-i',i).attr('data-video',arr[i][0]).attr('data-type',arr[i][1]).attr('data-title',arr[i][2]); + C['bar']['definition']['bg']['p'].push(pTemp); + C['bar']['definition']['bg'].append(pTemp); + if(videoUrl && videoUrl.indexOf(arr[i][0])>-1){ + pi=i; + } + pTemp.click(definitionClick); + } + C['bar']['definition'].show(); + C['bar']['definition']['bgbox'].show(); + var w=C['bar']['definition']['bg'].getWidth(),h=C['bar']['definition']['bg'].getHeight(); + var bw=C['bar']['definition']['button'].getWidth(); + C['bar']['definition']['bg'].css({'width':w+10+'px'}); + w=C['bar']['definition']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['definition']['bgbox'].attr('style',''); + C['bar']['definition']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['definition']['button'].mouseover(function(){ + w=C['bar']['definition']['bg'].getWidth(); + bw=C['bar']['definition']['button'].getWidth(); + C['bar']['definition']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + } + if(pi>-1){ + C['bar']['definition']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(pi==i){ + ele.addClass('ck-list-p-focus'); + } + else{ + ele.removeClass('ck-list-p-focus'); + } + }); + } + }, + /* + * definitionClick + * 功能:选择清晰度 + */ + definitionClick=function(e){ + C['bar']['definition']['bgbox'].hide(); + setTimeout(function(){ + C['bar']['definition']['bgbox'].removeCss('display'); + },300); + changeDefinition(parseInt($(this).attr('data-i'))); + }, + /* + * changeDefinition + * 功能:检查清晰度 + */ + changeDefinition=function(num){ + C['bar']['definition']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(num==i){ + if(!isUndefined(video.textTracks) && video.textTracks.length>0){ + for(var y=video.find('track').length-1;y>-1;y--){ + video.find('track').eq(y).remove(); + } + } + seekTime=player.time(); + video.attr('autoplay','autoplay'); + changeVideo(ele.attr('data-video')); + message(language['switchTo']+ele.htm()); + C['bar']['definition']['button'].htm(ele.htm()); + ele.addClass('ck-list-p-focus'); + eventTarget('definition',{id:i,video:ele.attr('data-video'),title:ele.attr('data-title')}); + } + else{ + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * deletePrompt + * 功能:删除关键点 + */ + deletePrompt=function(){ + var i=0; + if(!isUndefined(C['prompt']) && valType(C['prompt'])=='array'){ + for(i=C['prompt'].length;i>-1;i--){ + if(!isUndefined(C['prompt'][i])){ + C['prompt'][i].remove(); + } + } + C['prompt']=null; + } + C['prompt']=[]; + }, + /* + * changePrompt + * 功能:构建关键点 + */ + changePrompt=function(){ + deletePrompt(); + for(var i=0;i<vars['prompt'].length;i++){ + var obj=vars['prompt'][i]; + if(!isUndefined(obj) && 'words' in obj && 'time' in obj && !isUndefined(obj['time']) && !isUndefined(obj['words']) && valType(obj['time'])=='number'){ + var ele=createlDiv('ck-bar-progress-prompt'); + ele.attr('data-words',obj['words']).attr('data-time',obj['time']); + C['bar']['pbox']['bg'].append(ele); + var bf=(ele.getWidth()*0.5/C['bar']['pbox']['bg'].getWidth())*50; + var left=obj['time']/duration*100-bf; + if(left<0) left=0; + if(left>100) left=100; + ele.css({'left':left+'%'}); + ele.mouseover(function(){ + if(this.attr('data-words')){ + showPromptWords(this); + } + }); + ele.mouseout(function(){ + if(this.attr('data-words')){ + showPromptWords(); + } + }); + C['prompt'].push(ele); + } + } + }, + /* + * showPromptWords + * 功能:显示关键点提示 + */ + showPromptWords=function(ele){ + if(isUndefined(C['promptWords'])){ + C['promptWords']=createlDiv('ck-prompt-words'); + CM.append(C['promptWords']); + C['promptWords']['content']=createlDiv('ck-prompt-content'); + C['promptWords'].append(C['promptWords']['content']); + } + if(isUndefined(ele)){ + C['promptWords']['content'].htm(''); + C['promptWords'].hide(); + return; + } + C['promptWords']['content'].htm(ele.attr('data-words')); + C['promptWords'].show(); + var pW=C['promptWords'].getWidth(),pH=C['promptWords'].getHeight(); + var bg=C['bar']['pbox']['bg']; + var time=parseFloat(ele.attr('data-time')); + var top=CK.getHeight()-getBarHeight(); + var left=ele.offset()['left']-CK.offset()['left']+ele.getWidth()*.5-pW*.5; + if(!isUndefined(C['preview'])){ + top=CK.getHeight()-parseFloat((getBarHeight()+C['preview']['smallHight']+parseInt(C['preview'].css('margin-bottom')))); + } + else{ + top=CK.getHeight()-parseFloat((getBarHeight()+C['tip']['minHeight']+parseInt(C['tip'].css('margin-bottom')))); + top-=(getBarHeight()-C['bar'].getHeight()); + } + top-=parseFloat(C['promptWords'].css('margin-bottom')); + top-=pH; + left-=parseFloat(C['promptWords'].css('margin-right')); + if(left<0)left=0; + if(left>CK.getWidth()-pW)left=CK.getWidth()-pW; + C['promptWords'].css({ + 'top':top+'px', + 'left':left+'px' + }); + }, + /* + * changePreview + * 功能:加载或重置预览图片 + */ + changePreview=function(preview){ + if(!isUndefined(C['preview'])){ + C['preview'].remove(); + C['preview']=null; + } + if(!isUndefined(preview)){ + C['preview']=createlDiv('ck-preview'); + CM.append(C['preview']); + if(isUndefined(vars['preview']['type'])){ + vars['preview']['type']=0; + } + if(vars['preview']['type']==1){ + C['preview']['bg']=createlDiv('ck-preview-bg'); + C['preview'].append(C['preview']['bg']); + } + var files=[]; + var loadImg=function(bigW,bigH,smallW,smallH){ + if(vars['preview']['type']==1){ + C['preview']['bg']['img']=[]; + for(var i=0;i<files.length;i++){ + for(var y=0;y<bigH/smallH;y++){ + var img=createlDiv('ck-preview-img'); + img.attr('data-img',files[i]).attr('data-i',y); + img.css({ + 'width':bigW+'px', + 'height':smallH+'px', + 'background-position':'left '+(-(y*smallH))+'px' + }); + C['preview']['bg'].append(img); + C['preview']['bg']['img'].push(img); + } + } + C['preview']['bg'].css({ + 'width':bigW*(bigH/smallH)*(files.length+1)+'px', + 'height':smallH+'px' + }); + } + C['preview']['bigWidth']=bigW; + C['preview']['bigHight']=bigH; + C['preview']['smallWidth']=smallW; + C['preview']['smallHight']=smallH; + if(vars['preview']['type']==1){ + C['preview']['frame']=createlDiv('ck-preview-frame'); + C['preview'].append(C['preview']['frame']); + C['preview']['frame'].css({ + 'width':smallW+'px', + 'height':(smallH-parseFloat(C['preview']['frame'].css('border-width'))*2)+'px', + }); + } + }; + if(valType(vars['preview'])=='object'){ + if(valType(vars['preview']['file'])=='array'){ + files=vars['preview']['file']; + var thumbnail=[10,10]; + if(valType(vars['preview']['thumbnail'])=='array' && vars['preview']['thumbnail'].length>1){ + if(valType(vars['preview']['thumbnail'][0])=='number'){ + thumbnail[0]=vars['preview']['thumbnail'][0]; + } + if(valType(vars['preview']['thumbnail'][1])=='number'){ + thumbnail[1]=vars['preview']['thumbnail'][1]; + } + vars['preview']['thumbnail']=thumbnail; + } + if(files[0]){ + var img = createlImg(files[0],'ck-preview-load-img').addListener('load',function(){ + loadImg(this.getWidth(),this.getHeight(),this.getWidth()/thumbnail[0],this.getHeight()/thumbnail[1]); + this.remove(); + }); + CM.append(img); + } + } + else{ + C['preview'].removeChild(); + C['preview']=null; + } + } + else{ + C['preview'].removeChild(); + C['preview']=null; + } + } + }, + /* + * showPreview + * 功能:显示预览图 + */ + showPreview=function(time){ + if(hidePreviewSetTime){ + clearTimeout(hidePreviewSetTime); + hidePreviewSetTime=null; + } + if(time<0){ + if(!isUndefined(C['preview'])){ + hidePreviewSetTime=setTimeout(function(){ + C['preview'].hide(); + hidePreviewSetTime=null; + },200); + return; + } + } + if(!isUndefined(C['preview']) && !isUndefined(vars['preview']['thumbnail']) && duration>0){ + if(isUndefined(vars['preview']['type'])){ + vars['preview']['type']=0; + } + var scale=2,thumbnail=vars['preview']['thumbnail']; + if(!isUndefined(vars['preview']['scale'])){ + scale=vars['preview']['scale']; + } + var divI=0,imgI=0; + var left=0,frameLeft=0; + var pW=0; + var smallW=C['preview']['smallWidth'],smallH=C['preview']['smallHight']; + var bgXw=time*C['bar']['pbox']['bg'].getWidth()/duration+(C['bar']['pbox']['bg'].offset()['left']-CK.offset()['left']); + if(C['preview'].css('display')=='none'){ + C['preview'].show(); + } + C['preview'].css({ + 'height':smallH+'px', + }); + if(vars['preview']['type']==1){ + divI=parseInt(time/(scale*thumbnail[0])); + imgI=parseInt(time/scale); + var minI=divI-5,maxI=divI+5; + if(minI<0) minI=0; + if(maxI>C['preview']['bg']['img'].length-1){ + maxI=C['preview']['bg']['img'].length-1; + } + for(var i=minI;i<maxI;i++){ + if(C['preview']['bg']['img'][i].attr('data-img')){ + var bgPosition=C['preview']['bg']['img'][i].css('background-position'); + C['preview']['bg']['img'][i].css({'background':'url('+C['preview']['bg']['img'][i].attr('data-img')+') no-repeat'}); + C['preview']['bg']['img'][i].attr('data-img',''); + C['preview']['bg']['img'][i].css('background-position',bgPosition); + } + } + pW=C['preview']['frame'].getWidth(); + frameLeft=bgXw-pW*.5; + left=-(imgI*smallW+smallW*.5)+bgXw; + if(frameLeft<0){ + frameLeft=0; + bgXw=(pW-smallW)*0.5; + left=-(imgI*smallW)+bgXw; + } + if(frameLeft>C['preview'].getWidth()-C['preview']['frame'].getWidth()){ + var xz=frameLeft-(C['preview'].getWidth()-C['preview']['frame'].getWidth()); + frameLeft=C['preview'].getWidth()-C['preview']['frame'].getWidth(); + left-=xz; + } + C['preview']['bg'].css({'left':left+'px'}); + C['preview']['frame'].css({'left':frameLeft+'px'}); + } + else{ + var temp=(time/scale)/(thumbnail[0]*thumbnail[1]); + imgI=parseInt(temp);//计算显示的图片编号 + var smallI=parseInt((temp-imgI)*100); + var rows=parseInt(smallI/thumbnail[0]); + var column=smallI%thumbnail[0]; + var files=vars['preview']['file']; + left=bgXw-smallW*.5; + if(left<0){ + left=0; + } + if(left>CK.getWidth()-smallW){ + left=CK.getWidth()-smallW; + } + C['preview'].css({ + 'width':C['preview']['smallWidth']+'px', + 'background':'url('+files[imgI]+') no-repeat', + 'background-position':'-'+column*smallW+'px -'+rows*smallH+'px', + 'left':left+'px' + }); + } + } + }, + /* + * showError + * 功能:显示错误信息 + */ + showError=function(){ + C['loading'].hide(); + if(vars['controls'] || !vars['errorShow']){ + return; + } + if(isUndefined(C['error'])){ + C['error']=createlDiv('ck-error'); + CM.append(C['error']); + } + var msg=CT.error['message']; + if(!msg) msg=language['error']['noMessage']; + var html=msg+'(code:'+CT.error['code']+')'; + C['error'].htm(html); + C['error'].show(); + }, + /* + * showWindowsError + * 功能:显示错误信息 + */ + showWindowsError=function(error){ + var ele=createlDiv('ckplayer-error',error); + $('body').append(ele); + }, + /* + * showNextEpisode + * 功能:鼠标经过下一集按钮的动作 + */ + showNextEpisode=function(){ + if(isUndefined(vars['next'])) return; + if(valType(vars['next'])=='object'){ + if('content' in vars['next']){ + C['next']=player.layer(vars['next']); + return; + } + if('title' in vars['next']){ + tip(C['bar']['nextEpisode'],vars['next']['title']); + return; + } + } + tip(C['bar']['nextEpisode'],language['next']); + }, + /* + * nextClick + * 功能:点击下一集按钮的动作 + */ + nextClick=function(){ + if(valType(vars['next'])=='object'){ + if('click' in vars['next']){ + if(valType(vars['next']['click'])=='function'){ + vars['next']['click'](); + } + else if(valType(vars['next']['click'])=='string'){ + eval(vars['next']['click']+'()'); + } + } + if('link' in vars['next']){ + window.location.href=vars['next']['link']; + } + eventTarget('next'); + } + }, + /* + * showEnded + * 功能:播放结束后的显示内容 + */ + showEnded=function() { + if(!CT.loop && !isUndefined(vars['ended'])){ + closePauseAd(); + C['ended']=player.layer(vars['ended']); + if(C['ended']){ + C['centerPlay'].hide(); + } + return; + } + }, + /* + * windowScroll + * 功能:监听页面滚动 + */ + windowScroll=function() { + if(!CT.smallWindows) return; + if(CT.webFull || CT.theatre || CT.full){ + exitSmallWindows(); + return; + } + var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; + if(scrollTop>CT.offset()['top']+CT.getHeight()){ + if(!CK.hasClass('ckplayer-ckplayer-smallwindow')){ + CK.addClass('ckplayer-ckplayer-smallwindow'); + eventTarget('smallWindows',true); + smallWindowsState=true; + if(vars['smallWindowsDrag']){ + drag(true); + } + allBarHide(); + checkVideoRotate(); + } + } + else{ + exitSmallWindows(); + } + }, + /* + * exitSmallWindows + * 退出小窗口模式 + */ + exitSmallWindows=function(){ + if(CK.hasClass('ckplayer-ckplayer-smallwindow')){ + CK.removeClass('ckplayer-ckplayer-smallwindow'); + if(vars['smallWindowsDrag']){ + drag(); + } + eventTarget('smallWindows',false); + smallWindowsState=false; + allBarShow(); + checkVideoRotate(); + } + }, + /* + * drag + * 功能,使节点可拖动 + * state:是否开启可拖动,默认=false,关闭状态 + */ + drag=function(state) { + var doc=$(document); + var posX = 0,posY = 0, + posXRecord = 0,posYRecord = 0; + var open=false; + if(!isUndefined(state)){ + open=state; + } + var mouseDown = function(e) { + e.preventDefault && e.preventDefault(); + e = e || window.event; + var client = getClient(e); + posXRecord = client['x']; + posYRecord = client['y']; + doc.mousemove(docMouseMove); + doc.mouseup(docMouseUp); + CK.css({ + 'cursor':'move' + }); + }; + var docMouseMove = function(e) { + e = e || window.event; + var client = getClient(e); + var eleOffset = CK.offset(); + posY = client['y']-posYRecord; + posX = client['x']-posXRecord; + posXRecord = client['x']; + posYRecord = client['y']; + var left=eleOffset['left']+posX; + var top=eleOffset['top']+posY; + CK.css({ + 'left':left+'px', + 'top':top+'px' + }); + if(CK.css('position')!='fixed'){ + CK.css({ + 'position':'fixed' + }); + } + isDrag=true; + }; + var docMouseUp = function() { + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + CK.css({ + 'cursor':'default' + }); + }; + if(open){ + CK.mousedown(mouseDown); + } + else{ + CK.unbind('mousedown'); + } + }, + /* + * checkVideoRotate + * 检查播放器尺寸 + */ + checkVideoRotate=function(){ + var ckW=CK.getWidth()*nowZoom*0.01,ckH=CK.getHeight()*nowZoom*0.01; + var vW=CV.getWidth(),vH=CV.getHeight(); + CV.css({ + 'transform':'rotate('+nowRotate+'deg)', + '-ms-transform':'rotate('+nowRotate+'deg)', + '-moz-transform':'rotate('+nowRotate+'deg)', + '-webkit-transform':'rotate('+nowRotate+'deg)', + '-o-transform':'rotate('+nowRotate+'deg)', + 'width':nowZoom+'%', + 'height':nowZoom+'%' + }); + if(nowRotate!=0 && nowRotate!=180){ + if(vH>ckW && vW>ckH){ + if(vH / ckW > vW / ckH) { + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + else { + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + } + return; + } + if(vH<ckW && vW<ckH){ + if(ckW>ckH){ + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + else{ + if(vH / vW >= ckW / ckH) { + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + } + else { + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + } + return; + } + if(vH>=ckW && vW<=ckH){ + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + return; + } + if(vW>=ckH && vH<ckW){ + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + } + }, + /* + * allBarShow + * 功能:控制栏显示 + */ + allBarShow=function(){ + if(barShow){ + C['bar'].show(); + C['topBar'].show(); + } + if(rightBarShow){ + C['rightBar'].show(); + } + + C['tempTime'].hide(); + if(!isUndefined(C['logo'])){ + C['logo'].show(); + } + }, + /* + * allBarHide + * 功能:控制栏隐藏 + */ + allBarHide=function(tempTime){ + if(isUndefined(tempTime)){ + tempTime=true; + } + C['bar'].hide(); + C['topBar'].hide(); + C['rightBar'].hide(); + if(tempTime){ + C['tempTime'].show(); + } + if(!isUndefined(C['logo'])){ + C['logo'].hide(); + } + }, + /* + * message + * 功能:显示提示 + */ + message=function(str,right){ + C['message'].htm(''); + var msgHide=function(){ + C['message'].removeClass('ck-message-right').removeClass('ck-animate-bouncein').removeClass('ck-animate'); + C['message'].hide(); + }; + if(str){ + C['message'].htm(str); + C['message'].show(); + if(!C['message'].hasClass('ck-animate')){ + C['message'].addClass('ck-animate ck-animate-bouncein'); + } + if(!isUndefined(right) && right){ + if(!C['message'].hasClass('ck-message-right')){ + C['message'].addClass('ck-message-right'); + } + } + if(msgSetTime){ + clearTimeout(msgSetTime); + msgSetTime=null; + } + msgSetTime=setTimeout(function(){ + msgHide(); + msgSetTime=null; + },1500); + } + else{ + msgHide(); + } + }, + /* + * tip + * 功能:显示Tip + * @ele:需要显示提示的对象,@str:提示文字,@cl:水平修正距离,@align:对齐方式,只有两种,一种默认对齐(箭头在提示文字下方),一种是左对齐(箭头在提示文字右边) + */ + tip=function(ele,str,cl,align){ + C['tip']['content'].htm(''); + if(str){ + C['tip']['content'].htm(str); + C['tip'].show(); + if(!C['tip'].hasClass('ck-animate')){ + C['tip'].addClass('ck-animate ck-animate-bouncein'); + } + if(isUndefined(align)){ + align='auto' + } + if(align=='left'){ + C['tip']['content'].removeClass('ck-content-float-auto').addClass('ck-content-float-left'); + C['tip']['triangle'].removeClass('ck-triangle-auto').addClass('ck-triangle-left'); + } + else{ + C['tip']['content'].removeClass('ck-content-float-left').addClass('ck-content-float-auto'); + C['tip']['triangle'].removeClass('ck-triangle-left').addClass('ck-triangle-auto'); + } + tipResize(ele,cl,align); + if(isUndefined(closeTipFun)){ + closeTipFun=function(){ + if(tipSetTime){ + clearTimeout(tipSetTime); + tipSetTime=null; + } + }; + closeTipMouseOut=function(ele){ + closeTipFun(); + tipSetTime=setTimeout(function(){ + tip(); + tipSetTime=null; + },100); + if(ele){ + ele.removeListener('mouseout',closeTipMouseOut); + } + }; + } + closeTipFun(); + ele.mouseout(function(){closeTipMouseOut(ele)}); + } + else{ + C['tip'].hide(); + C['tip'].removeClass('ck-animate'); + C['tip'].removeClass('ck-animate-bouncein'); + } + }, + /* + * tipResize + * 功能:设置tip坐标 + */ + tipResize=function(ele,cl,align){ + var offset=ele.offset(); + var ckOffset=CK.offset(); + var w=C['tip'].getWidth(),h=C['tip'].getHeight(); + var ew=ele.getWidth(); + var left=0,top=offset['top']-ckOffset['top']-h; + if(getBarHeight()>C['bar'].getHeight()){ + top-=(getBarHeight()-C['bar'].getHeight()); + } + if(w>ew){ + left=offset['left']-ckOffset['left']-(w-ew)*.5; + } + else{ + left=offset['left']-ckOffset['left']+(ew-w)*.5; + } + if(align=='left'){ + left=offset['left']-ckOffset['left']-w; + top=offset['top']-ckOffset['top']; + } + if(!isUndefined(cl)){ + left=cl['x']-ckOffset['left']-w*.5; + } + if(left<0){ + left=0; + } + if(top<0){ + top=0; + } + if(left>CM.getWidth()-w){ + left=CM.getWidth()-w; + } + if(top>CM.getHeight()-h){ + top=CM.getHeight()-h; + } + C['tip'].css({ + 'left':left+'px', + 'top':top-parseInt(C['tip'].css('margin-bottom'))+'px' + }); + }, + /* + * progressDragX + * 功能:制作进度调节框事件 + */ + progressDragX=function(){ + var bg=C['bar']['pbox']['bg'], + play=C['bar']['pbox']['play'], + slider=C['bar']['pbox']['slider'], + mouseLine=C['bar']['pbox']['mouseLine']; + slider.unbind(); + bg.unbind(); + var pos = 0, + posRecord = 0; + var doc=$(document); + var sliderDownTime=0; + var sliderMouseDown = function(e) { + e.preventDefault && e.preventDefault(); + if(!vars['timeScheduleAdjust']){//禁止拖动 + return; + } + e = e || window.event; + var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e); + pSliderMouseDown=true; + posRecord = client['x']; + //供比较 + var left = eleOffset['left']-bgOffset['left']; + sliderDownTime=left*duration/(bg.getWidth()-slider.getWidth()); + slider.removeListener('mousedown', sliderMouseDown); + slider.removeListener('touchstart', sliderMouseDown); + doc.mousemove(docMouseMove); + doc.mouseup(docMouseUp); + slider.touchmove(docMouseMove); + slider.touchend(docMouseUp); + noScrolling(true); + }; + var docMouseMove = function(e) { + e = e || window.event; + var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e); + pSliderMouseDown=true; + pos = posRecord - client['x']; + posRecord = client['x']; + var left = eleOffset['left'] - pos-bgOffset['left']; + if(left<0){ + left=0; + } + if(left>bg.getWidth()-slider.getWidth()){ + left=bg.getWidth()-slider.getWidth(); + } + C['bar']['pbox'].addClass('ck-bar-progress-slider-move'); + //预览时间 + var time=''; + if(!vars['live']){ + time=left*duration/(bg.getWidth()-slider.getWidth()); + switch(vars['timeScheduleAdjust']){ + case 2://只能前进(向右拖动 + if(time<sliderDownTime){ + left=-1000; + message(language['timeScheduleAdjust']['prohibitBackOff']); + } + break; + case 3://是只能后退 + if(time>sliderDownTime){ + left=-1000; + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(time<firstSeekTime){ + left=-1000; + player.seek(firstSeekTime); + message(language['timeScheduleAdjust']['prohibitLookBack']); + return; + } + break; + case 5://看过的地方可以随意拖动 + if(time>maxSeeTime){ + left=-1000; + player.seek(maxSeeTime); + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + time=formatSeconds(time); + } + else{ + time=formatLiveTime(left*getLiveTime()/(bg.getWidth()-slider.getWidth())); + } + tip(slider,time); + if(left>=0){ + slider.css({ + 'left': left + 'px' + }); + play.css({ + 'width': left+ slider.getWidth()*.5+ 'px' + }); + } + else{ + pSliderMouseDown=false; + } + + }; + var docMouseUp = function() { + noScrolling(); + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + slider.removeListener('touchmove', docMouseMove); + slider.removeListener('touchend', docMouseUp); + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + if(!vars['live']){ + var time=play.getWidth()*duration/(bg.getWidth()-slider.getWidth()*.5); + if(time>duration){ + time=duration; + } + seekTime=0; + player.seek(time); + } + else{ + var playbackTime=parseInt(vars['live']+play.getWidth()*getLiveTime()/(bg.getWidth()-slider.getWidth()*.5)); + eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)}); + eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)}); + } + C['bar']['pbox'].removeClass('ck-bar-progress-slider-move'); + if(isMouseLeave){ + tip(); + } + }; + var isMouseLeave=true;//默认鼠标离开了进度按钮上 + var sliderMouseOver=function(){ + var time=''; + if(!vars['live']){ + time=formatSeconds(parseInt(slider.css('left'))*duration/(bg.getWidth()-slider.getWidth())); + } + else{ + time=language['live']; + } + isMouseLeave=false; + tip(slider,time); + }; + + var sliderMouseLeave=function(){ + isMouseLeave=true; + }; + slider.mousedown(sliderMouseDown); + slider.mouseover(sliderMouseOver); + slider.mouseleave(sliderMouseLeave); + slider.touchstart(sliderMouseDown); + var bgMouseDown=function(e){ + e = e || window.event; + var client = getClient(e); + var bgOffset=bg.offset(); + var w=client['x']-bgOffset['left']; + if(CT.full){ + w+=CK.offset()['left']; + } + if(!vars['live']){ + var time=duration*w/bg.getWidth(); + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + message(language['timeScheduleAdjust']['prohibit']); + return; + break; + case 2://只能前进(向右拖动 + if(time<oldTime){ + message(language['timeScheduleAdjust']['prohibitBackOff']); + return; + } + break; + case 3://是只能后退 + if(time>oldTime){ + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(time<firstSeekTime){ + message(language['timeScheduleAdjust']['prohibitLookBack']); + return; + } + break; + case 5://看过的地方可以随意拖动 + if(time>maxSeeTime){ + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + seekTime=0; + player.seek(time); + } + else{ + var playbackTime=parseInt(vars['live']+getLiveTime()*w/bg.getWidth()); + eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)}); + eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)}); + } + if(w>bg.getWidth()-slider.getWidth()*.5){ + w=bg.getWidth()-slider.getWidth()*.5 + } + if(w<slider.getWidth()*.5){ + w=slider.getWidth()*.5; + } + pSliderMouseDown=true; + play.css({ + 'width': w+ 'px' + }); + slider.css({ + 'left': w-slider.getWidth()*.5 + 'px' + }); + }; + var moveTimer=null; + var bgMouseMove=function(e){ + e = e || window.event; + var client = getClient(e); + var bgOffset=bg.offset(); + var w=client['x']-bgOffset['left']; + clearTime(); + if(CT.full){ + w+=CK.offset()['left']; + } + var time=0; + if(!vars['live']){ + time=duration*w/bg.getWidth(); + showPreview(time); + time=formatSeconds(time); + } + else{ + time=formatLiveTime(getLiveTime()*w/bg.getWidth()); + } + tip(bg,time,client); + mouseLine.css({'left':w-(C['bar']['pbox']['mouseLine'].getWidth()*.5)+'px'}); + }; + var moveTimer=null; + var clearTime=function(){ + if(moveTimer){ + clearTimeout(moveTimer); + moveTimer=null; + } + closeTipFun(); + }; + var bgMouseOut=function(e){ + clearTime(); + moveTimer=setTimeout(function(){ + showPreview(-1); + },30); + }; + bg.mousedown(bgMouseDown); + bg.mousemove(bgMouseMove); + bg.mouseout(bgMouseOut); + mouseLine.mouseover(clearTime); + }, + /* + * volumeDragY + * 功能:制作音量调节框事件 + */ + volumeDragY=function() { + var box=C['bar']['vbox']['volume']['box'], + bg=C['bar']['vbox']['volume']['bg'], + pp=C['bar']['vbox']['volume']['pp'], + slider=C['bar']['vbox']['volume']['slider'], + doc=$(document); + var pos = 0, + posRecord = 0; + var sliderMouseDown = function(e) { + e.preventDefault && e.preventDefault(); + noScrolling(true); + e = e || window.event; + var client = getClient(e); + posRecord = client['y']; + slider.removeListener('mousedown', sliderMouseDown); + slider.removeListener('touchstart', sliderMouseDown); + C['bar']['vbox']['mouseDown']=true; + doc.mousemove(docMouseMove); + doc.mouseup(docMouseUp); + slider.touchmove(docMouseMove); + slider.touchend(docMouseUp); + }; + var docMouseMove = function(e) { + e = e || window.event; + var client = getClient(e); + var eleOffset = slider.offset(); + var boxOffset=box.offset(); + var bgOffset=bg.offset(); + pos = client['y']-posRecord; + posRecord = client['y']; + var sliderTop=eleOffset['top']-boxOffset['top']+pos; + var minTop=bgOffset['top']-boxOffset['top'],maxTop=bgOffset['top']+bg.getHeight()-boxOffset['top']-slider.getHeight(); + if(sliderTop<minTop){ + sliderTop=minTop; + } + if(sliderTop>maxTop){ + sliderTop=maxTop; + } + slider.css({ + 'top':sliderTop+'px' + }); + var ppMarginTop=sliderTop-minTop+slider.getHeight()*0.5; + pp.css({ + 'margin-top':ppMarginTop+'px' + }); + var vol=(bg.getHeight()-ppMarginTop-slider.getHeight()*0.5)/(bg.getHeight()-slider.getHeight()); + player.volume(vol); + }; + var docMouseUp = function() { + noScrolling(); + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + slider.removeListener('touchmove', docMouseMove); + slider.removeListener('touchend', docMouseUp); + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + C['bar']['vbox']['mouseDown']=false; + }; + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + var bgMouseDown=function(e){ + e = e || window.event; + var client = getClient(e); + var bgOffset=bg.offset(); + var h=client['y']-bgOffset['top']; + var max=bg.getHeight(); + var vol=1-h/max; + player.volume(vol); + }; + bg.mousedown(bgMouseDown); + }, + /* + * changeProgress + * 功能:根据时间调节播放进度 + */ + changeProgress=function(time){ + if((valType(vars['live'])=='boolean' && vars['live'])){ + return; + } + if(!pSliderMouseDown){ + var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider']; + var playW=(time/duration)*100; + + if(valType(vars['live'])=='number'){ + playW='100'; + } + C['bar']['pbox']['play'].css({'width':playW+'%'}); + var sliderW=(slider.getWidth()/bg.getWidth())*100; + var sliderLeft=playW-sliderW*.5; + if(sliderLeft<0){ + sliderLeft=0; + } + if(sliderLeft>100-sliderW){ + sliderLeft=100-sliderW; + } + C['bar']['pbox']['slider'].css({'left':sliderLeft+'%'}); + checkProgressSlider(); + } + }, + /* + * checkProgressSlider + * 功能:检查设置播放进度条位置 + */ + checkProgressSlider=function(){ + var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider']; + var st=0; + if(C['bar']['pbox'].css('transition-duration')){ + st=parseFloat(C['bar']['pbox'].css('transition-duration'))*1000+20; + } + var checkThis=function(){ + var sliderLeft=parseInt(C['bar']['pbox']['slider'].css('left')); + if(sliderLeft<0){ + sliderLeft=0; + C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'}); + } + if(sliderLeft>bg.getWidth()-slider.getWidth()){ + sliderLeft=bg.getWidth()-slider.getWidth(); + C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'}); + } + }; + setTimeout(checkThis,st); + }, + /* + * changeTopTime + * 功能:修改顶部右侧时间 + */ + changeTopTime=function(){ + C['topBar']['timeEle'].htm(date('H:i:s')); + setTimeout(changeTopTime,1000); + }, + /* + * changeVolumeSlider + * 功能:根据音量改变滑块位置 + */ + changeVolumeSlider=function(vol){ + if(!isUndefined(C['bar']['vbox'])){ + var box=C['bar']['vbox']['volume']['box'], + bg=C['bar']['vbox']['volume']['bg'], + pp=C['bar']['vbox']['volume']['pp'], + slider=C['bar']['vbox']['volume']['slider']; + C['bar']['vbox']['volume']['txt'].htm(parseInt(vol*100)); + var bgH=bg.getHeight(); + if(bgH){ + var ppMarginTop=bgH-vol*bgH; + pp.css({ + 'margin-top':ppMarginTop+'px' + }); + var sliderTop=bg.offset()['top']-box.offset()['top']+ppMarginTop-slider.getHeight()*0.5; + slider.css({ + 'top':sliderTop+'px' + }); + } + } + }, + /* + * changeLoad + * 功能:获取视频已加载部分并修改加载进度栏 + */ + changeLoad=function(){ + if(video){ + var len = video.buffered.length; + if(len>0){ + var bufferEnd = video.buffered.end(len-1); + if(loadTime<bufferEnd){ + loadTime=bufferEnd; + } + replaceInformation('loadTime',parseInt(loadTime*100)*0.01); + C['bar']['pbox']['load'].css('width',(loadTime/duration)*100+'%'); + } + } + }, + /* + * changeMuted + * 功能:修改静音和取消静音时按钮切换事件 + */ + changeMuted=function(b){ + if(b){ + C['bar']['vbox']['muted'].hide(); + C['bar']['vbox']['exitMuted'].show(); + C['ad']['bottom']['mutedAndExit']['muted'].hide(); + C['ad']['bottom']['mutedAndExit']['exitMuted'].show(); + message(language['muted']); + } + else{ + C['bar']['vbox']['muted'].show(); + C['bar']['vbox']['exitMuted'].hide(); + C['ad']['bottom']['mutedAndExit']['muted'].show(); + C['ad']['bottom']['mutedAndExit']['exitMuted'].hide() + } + }, + /* + * replaceInformation + * 功能:替换关于里的内容 + */ + replaceInformation=function(o , n){ + if(isUndefined(C['about']['sourceData']) && !isUndefined(C['about'].find('ul'))){ + C['about']['sourceData']=C['about'].find('ul').eq(0).htm(); + C['about']['objData']={}; + var reg=/{(.*?)}/g; + var res = C['about']['sourceData'].match(reg); + while( res = reg.exec(C['about']['sourceData'])){ + C['about']['objData'][res[1]]='0'; + } + } + if(!isUndefined(C['about'].find('ul'))){ + var reg=null; + var htm=C['about']['sourceData']; + var temp=C['about']['textareaText']; + if(C['about']['objData']){ + for(var k in C['about']['objData']){ + if(o!=k){ + reg = new RegExp('{'+k+'}' , 'g'); + var val=C['about']['objData'][k]; + if(isUndefined(val)){ + val='0'; + } + htm=htm.replace(reg , val); + temp=temp.replace(reg , val); + } + + } + } + reg = new RegExp('{'+o+'}' , 'g'); + htm=htm.replace(reg , n || ''); + temp=temp.replace(reg , n || ''); + C['about']['textareaEle'].htm(temp); + C['about']['objData'][o]=n; + return C['about'].find('ul').eq(0).htm(htm); + } + }, + /* + * calculationFps + * 功能:获取fps + */ + calculationFps=function() { + var requestAnimationFrame = + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + var e, pe, pid, fps, last, offset; + fps = 0; + last = Date.now(); + var step = function() { + offset = Date.now() - last; + fps += 1; + if(offset >= 1000) { + last += offset; + appendFps(fps); + fps = 0; + } + requestAnimationFrame(step); + }; + var appendFps = function(fps) { + if(fps!=CT.fps){ + CT.fps=fps; + replaceInformation('fps',fps); + eventTarget('fps',fps); + } + + }; + if(isUndefined(CT.fps)){ + CT.fps=0; + } + step(); + }, + /* + * getElement + * 功能:获取一个外部节点 + */ + getElement=function(content){ + var ele=$(content); + if(isUndefined(ele)) return; + if(valType(ele)=='htmlarray'){ + ele=ele[0]; + } + if(isUndefined(ele.captureParentNode)){ + ele.captureParentNode = ele.parentNode; + ele.prevElement=ele.prev(); + ele.nextElement=ele.next(); + } + return ele; + }, + /* + * $ + * 功能:根据ID或className或节点节点名称获取对象 + */ + $=function(obj, eL) { + var parent = null; + if (document) { + parent = document; + } + if (!isUndefined(eL)) { + parent = eL; + } + var res = []; + if (obj) { + if (valType(obj) == 'htmlobject' || valType(obj)=='object') { + res = obj; + if (!isUndefined(res.ckplayer)) { + return res; + } + } + else if (valType(obj) == 'string' && obj!='') { + switch (obj.substr(0, 1)) { + case '.': + obj = obj.substr(1, obj.length); + if (parent.getElementsByClassName) { + res = parent.getElementsByClassName(obj); + if (!res.length) { + return null; + } + } + else if (!parent && document.getElementsByClassName) { + res = document.getElementsByClassName(obj); + if (!res.length) { + return null; + } + } + else { + var reg = new RegExp(' ' + obj + ' ', 'i'); + var ele = null; + if (parent.getElementsByTagName) { + ele = parent.getElementsByTagName('*'); + } else { + ele = document.getElementsByTagName('*'); + } + for (var i = 0; i < ele.length; i++) { + if (reg.test(' ' + ele[i].className + ' ')) { + res.push(ele[i]); + } + } + } + if (res) { + if (res.length === 0) { + res = null; + } + } + break; + case '#': + obj = obj.substr(1, obj.length); + if (parent.getElementById) { + res = parent.getElementById(obj); + } else { + res=document.getElementById(obj); + } + break; + default: + var reg = new RegExp(' ' + obj + ' ', 'i'); + if (parent.getElementsByTagName) { + res = parent.getElementsByTagName(obj); + } else { + res = document.getElementsByTagName(obj); + } + if (res) { + if (obj == 'body' || obj == 'document' || obj == 'html') { + res = res[0]; + } else if (res.length === 0) { + res = null; + } + } else { + res = null; + } + break; + } + } + else { + res = obj; + } + } + else { + res = document; + } + + if (res) { + if (valType(res) == 'htmlobject' || valType(res) == 'object' || valType(res) == 'document') { + res.ckplayer = 'Thanks for using'; + /* + * find + * 功能:在当前节点中查找指定节点 + */ + res.find = function(obj) { + return $(obj, this); + }; + /* + * attr + * 功能:修改或获取节点的属性值 + * @key不能为空,指属性名称,$value不为空则设置属性值,为空则获取属性值 + */ + res.attr = function(key, value) { + if (isUndefined(value)) { + return this.getAttribute(key); + } + else { + this.setAttribute(key, value); + return this; + } + }; + /* + * removeAtt + * 功能:删除节点的属性值 + * @key不能为空,指属性名称 + */ + res.removeAttr = function(key) { + this.removeAttribute(key); + return this; + }; + /* + * css + * 功能:修改或获取节点的样式样式 + * @key不能为空,指属性名称,$value不为空则设置属性值,为空则获取属性值 + */ + res.css = function(key, value) { + // 拆解字符串并将第二单词首字母大写 + var keyNew = function(str) { + // 当属性名有横杠时 + if (str.indexOf('-') != -1) { + var arr = str.split('-'); + var a = arr[0]; + var b = '', + c = ''; + if (arr.length > 1) { + b = arr[1].substr(0, 1).toLocaleUpperCase() + arr[1].substr(1, arr[1].length - 1); + } + if (arr.length > 2) { + b = arr[2].substr(0, 1).toLocaleUpperCase() + arr[2].substr(1, arr[2].length - 1); + } + return a + b + c; + } + // 没有横杠就不进行字符串拆解 + return str; + }; + if (isUndefined(value)){ + if (!isUndefined(key) && valType(key) == 'string') { + if (this.currentStyle) { + return this.currentStyle[key]; + } else { + return document.defaultView.getComputedStyle(this, null)[key]; + } + } + if (isUndefined(key)) { + if (this.currentStyle) { + return this.currentStyle; + } else { + return document.defaultView.getComputedStyle(this, null); + } + } + } + // 当传进来的参数key不是一个对象,给节点添加css样式 + if (valType(key) != 'object') { + var newKey = keyNew(key); + if (this.length > 1) { + // 如果this有多个值,那给每个节点都添加样式 + for (var i = 0; i < this.length; i++) { + this[i].style[newKey] = value; + } + } else { + this.style[newKey] = value; + } + } else { + //如果第一个值是一个对象,遍历这个对象,并将属性名传进函数进行拆解 + for (var item in key) { + var objKey = keyNew(item); + if (valType(this) == 'htmlarray') { + for (var i = 0; i < this.length; i++) { + this[i].style[objKey] = key[item]; + } + } else { + this.style[objKey] = key[item]; + } + } + } + return this; + }; + res.hasClass = function(cName) { + if (isUndefined(cName)) return false; + var reg = new RegExp('(\\s|^)' + cName + '(\\s|$)'); + if (this.className && this.className.match(reg)) { + return true; + } + return false; + }; + res.addClass = function(cName) { + if (!this.hasClass(cName)) { + if (this.className && this.className.substr(this.className.length - 1, 1) != ' ') { + this.className += ' '; + } + this.className += cName; + }; + return this; + }; + res.removeClass = function(cName) { + if (this.hasClass(cName)) { + this.className = this.className.replace(new RegExp('(\\s|^)' + cName + '(\\s|$)'), ' '); + if (this.className.substr(this.className.length - 1, 1) == ' ') { + this.className = this.className.substr(0, this.className.length - 1); + } + if (!this.className) { + this.removeAttribute('class'); + } + }; + return this; + }; + res.searchClass = function(cName) { + var arr = this.className.split(' '); + for (var i = 0; i < arr.length; i++) { + if (arr[i].substr(0, cName.length) == cName) { + return arr[i]; + } + } + return this; + }; + res.removeCss=function(cName){ + var cs=this.attr('style'); + if(cs){ + var arr=cs.split(';'); + var obj={}; + for(var i=0;i<arr.length;i++){ + var arrT=arr[i].split(':'); + if(arrT.length==2 && arrT[0] && arrT[0].trim()!=cName){ + obj[arrT[0].trim()]=arrT[1].trim(); + } + } + this.attr('style',''); + this.css(obj); + } + }; + res.addListener = function(e, f, t) { + return addListener(this, e, f, t); + }; + res.removeListener = function(e, f, t) { + return removeListener(this, e, f, t); + }; + res.prev = function() { + return prev(this); + }; + res.next = function() { + return next(this); + }; + res.append =function(ele){ + this.appendChild(ele); + return this; + }; + res.remove = function() { + if(!isUndefined(this.parentNode)){ + this.parentNode.removeChild(this); + } + return null; + }; + res.bind=function(e, f, t) { + return addListener(this, e, f, t); + }; + res.unbind =function(e,f){ + var i=0;var arr=[]; + if(!isUndefined(f)){ + res.removeListener(e,f); + } + else if(!isUndefined(e)){ + if(!isUndefined(this.listenerList)){ + arr=this.listenerList; + for(i=0;i<arr.length;i++){ + if(arr[i][0]==e){ + res.removeListener(e,arr[i][1]); + } + } + } + } + else{ + if(!isUndefined(this.listenerList)){ + arr=this.listenerList; + for(i=0;i<arr.length;i++){ + res.removeListener(arr[i][0],arr[i][1]); + } + } + } + }; + /* + * htm + * 功能:设置或获取html + */ + res.htm=function(val){ + if(!isUndefined(val)){ + res.innerHTML=val; + } + else{ + return res.innerHTML; + } + }; + /* + * htmReplace + * 功能:将html中ar替换成val + */ + res.htmReplace=function(ar,val,html){ + if(!isUndefined(val) && !isUndefined(ar)){ + if(isUndefined(this.attr('data-htm'))){ + this.attr('data-htm',html); + } + var htm=this.attr('data-htm'); + var reg = new RegExp(ar , 'g'); + htm=htm.replace(reg , val); + this.htm(htm); + } + }; + /* + * offset + * 功能:获取节点的绝对坐标 + */ + res.offset = function() { + var par = this.offsetParent, + //获取当前节点的父参照物(不一定是父节点) + left = this.offsetLeft, + //获取当前节点相对父节点左偏离 + top = this.offsetTop; + //获取当前节点相对父节点上偏移 + while (par && par.tagName !== 'BODY') { + //判断是否已经到了最外一层 并且判断父参照物存不存在 + if (!/MSIE 8\.0/.test(navigator.userAgent)){ + //利用正则表达式判断 + left += par.clientLeft; + top += par.clientTop; + } + left += par.offsetLeft; + //获得节点距离父节点左偏移多少 + top += par.offsetTop; + //获得节点距离父节点上偏移多少 + par = par.offsetParent; + } + return { + top: top, + left: left + } + }; + /* + * fixed + * 功能:判断节点是否悬浮于页面 + */ + res.fixed = function() { + if (this.css('position') == 'fixed') { + return true; + } + if (!isUndefined(this.offsetParent)) { + return $(this.offsetParent).fixed(); + } + return false; + }; + /* + * getWidth + * 功能:获取节点的宽 + */ + res.getWidth = function() { + return this.offsetWidth; + }; + /* + * getHeight + * 功能:获取节点的高 + */ + res.getHeight = function() { + return this.offsetHeight; + }; + if(isUndefined(res.width)){ + res.width=function(){ + return this.offsetWidth; + } + } + if(isUndefined(res.height)){ + res.height=function(){ + return this.offsetWidth; + } + } + /* + * resize + * 功能:监听窗口尺寸变化 + * @fn:窗口变化时执行的函数 + */ + res.resize = function(fn) { + addListener(window, 'resize', fn); + }; + /* + * click + * 功能:节点单击时执行的函数 + * @fn:执行的函数 + */ + res.click =function(fn){ + addListener(this,'click',fn); + return this; + }; + /* + * singleClick + * 功能:节点单击事件,当使用该事件时会同时注册双击事件,此时不要使用click函数进行单击事件监听 + * @fn:执行的函数 + */ + res.singleClick=function(fn){ + if(isUndefined(this.dbClick)){ + doubleClickEvent(this); + this.dbClick=true; + } + this.addListener('sigClick',fn); + return this; + }; + /* + * doubleClick + * 功能:节点双击事件,当使用该事件时会同时注册双击事件,此时不要使用click函数进行单击事件监听 + * @fn:执行的函数 + */ + res.doubleClick=function(fn){ + if(isUndefined(this.dbClick)){ + doubleClickEvent(this); + this.dbClick=true; + } + this.addListener('dobClick',fn); + return this; + }; + /* + * mouseover + * 功能:鼠标经过节点时执行的函数 + * @fn:执行的函数 + */ + res.mouseover =function(fn){ + addListener(this,'mouseover',fn); + return this; + }; + /* + * mouseout + * 功能:鼠标离开节点时执行的函数 + * @fn:执行的函数 + */ + res.mouseout =function(fn){ + addListener(this,'mouseout',fn); + return this; + }; + /* + * mousedown + * 功能:鼠标在节点上按下时执行的函数 + * @fn:执行的函数 + */ + res.mousedown =function(fn){ + addListener(this,'mousedown',fn); + return this; + }; + /* + * mouseup + * 功能:节点上鼠标弹起时执行的函数 + * @fn:执行的函数 + */ + res.mouseup =function(fn){ + addListener(this,'mouseup',fn); + return this; + }; + /* + * mousemove + * 功能:鼠标在节点上划行时执行的函数 + * @fn:执行的函数 + */ + res.mousemove =function(fn){ + addListener(this,'mousemove',fn); + return this; + }; + /* + * mouseWheel + * 功能:鼠标滚轮在节点上划行时执行的函数 + * @fn:执行的函数 + */ + res.mouseWheel =function(fn){ + addListener(this,'mousewheel',fn); + addListener(this,'DOMMouseScroll',fn,false); + return this; + }; + /* + * mouseleave + * 功能:鼠标指针移出节点时执行的函数 + * @fn:执行的函数 + */ + res.mouseleave =function(fn){ + addListener(this,'mouseleave',fn); + return this; + }; + /* + * touchstart + * 功能:移动端鼠标在节点上按下时执行的函数 + * @fn:执行的函数 + */ + res.touchstart =function(fn){ + addListener(this,'touchstart',fn); + return this; + }; + /* + * touchmove + * 功能:移动端鼠标在节点上划行时执行的函数 + * @fn:执行的函数 + */ + res.touchmove =function(fn){ + addListener(this,'touchmove',fn); + return this; + }; + /* + * touchend + * 功能:移动端节点上鼠标弹起时执行的函数 + * @fn:执行的函数 + */ + res.touchend =function(fn){ + addListener(this,'touchend',fn); + return this; + }; + /* + * show + * 功能:显示节点 + */ + res.show=function(){ + this.css('display','block'); + return this; + }; + /* + * hide + * 功能:隐藏节点 + */ + res.hide=function(){ + this.css('display','none'); + return this; + }; + /* + animate + 功能:缓动效果 + parameter:String=需要改变的属性:left,top,width,height,alpha, + totalTime:Number=运动的总毫秒数 + easing:String=效果名称, + callBack:完成后的回调函数 + */ + res.animate=function(parameter,totalTime,easing,callBack) { + if(isUndefined(this.CK)){ + return res; + } + var thisTemp = this; + var parNode=this.CK; + var w =parNode.getWidth(),h = parNode.getHeight(); + var speed=10;//跳针时间 + this.timerTween=null; + this.tweenPlay=true; + if(isUndefined(parameter)){ + return this; + } + if (isUndefined(totalTime) || totalTime== 0) { + totalTime=1000; + } + if(isUndefined(easing) || easing==''){ + easing='None.easeIn'; + } + var effArr = easing.split('.'); + var tween = { + None: { //均速运动 + easeIn: function(t, b, c, d) { + return c * t / d + b; + }, + easeOut: function(t, b, c, d) { + return c * t / d + b; + }, + easeInOut: function(t, b, c, d) { + return c * t / d + b; + } + }, + Quadratic: { + easeIn: function(t, b, c, d) { + return c * (t /= d) * t + b; + }, + easeOut: function(t, b, c, d) { + return - c * (t /= d) * (t - 2) + b; + }, + easeInOut: function(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t + b; + return - c / 2 * ((--t) * (t - 2) - 1) + b; + } + }, + Cubic: { + easeIn: function(t, b, c, d) { + return c * (t /= d) * t * t + b; + }, + easeOut: function(t, b, c, d) { + return c * ((t = t / d - 1) * t * t + 1) + b; + }, + easeInOut: function(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; + return c / 2 * ((t -= 2) * t * t + 2) + b; + } + }, + Quartic: { + easeIn: function(t, b, c, d) { + return c * (t /= d) * t * t * t + b; + }, + easeOut: function(t, b, c, d) { + return - c * ((t = t / d - 1) * t * t * t - 1) + b; + }, + easeInOut: function(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; + return - c / 2 * ((t -= 2) * t * t * t - 2) + b; + } + }, + Quintic: { + easeIn: function(t, b, c, d) { + return c * (t /= d) * t * t * t * t + b; + }, + easeOut: function(t, b, c, d) { + return c * ((t = t / d - 1) * t * t * t * t + 1) + b; + }, + easeInOut: function(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; + return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; + } + }, + Sine: { + easeIn: function(t, b, c, d) { + return - c * Math.cos(t / d * (Math.PI / 2)) + c + b; + }, + easeOut: function(t, b, c, d) { + return c * Math.sin(t / d * (Math.PI / 2)) + b; + }, + easeInOut: function(t, b, c, d) { + return - c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; + } + }, + Exponential: { + easeIn: function(t, b, c, d) { + return (t == 0) ? b: c * Math.pow(2, 10 * (t / d - 1)) + b; + }, + easeOut: function(t, b, c, d) { + return (t == d) ? b + c: c * ( - Math.pow(2, -10 * t / d) + 1) + b; + }, + easeInOut: function(t, b, c, d) { + if (t == 0) return b; + if (t == d) return b + c; + if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; + return c / 2 * ( - Math.pow(2, -10 * --t) + 2) + b; + } + }, + Circular: { + easeIn: function(t, b, c, d) { + return - c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; + }, + easeOut: function(t, b, c, d) { + return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; + }, + easeInOut: function(t, b, c, d) { + if ((t /= d / 2) < 1) return - c / 2 * (Math.sqrt(1 - t * t) - 1) + b; + return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; + } + }, + Elastic: { + easeIn: function(t, b, c, d, a, p) { + if (t == 0) return b; + if ((t /= d) == 1) return b + c; + if (!p) p = d * .3; + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } else var s = p / (2 * Math.PI) * Math.asin(c / a); + return - (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; + }, + easeOut: function(t, b, c, d, a, p) { + if (t == 0) return b; + if ((t /= d) == 1) return b + c; + if (!p) p = d * .3; + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } else var s = p / (2 * Math.PI) * Math.asin(c / a); + return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b); + }, + easeInOut: function(t, b, c, d, a, p) { + if (t == 0) return b; + if ((t /= d / 2) == 2) return b + c; + if (!p) p = d * (.3 * 1.5); + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } else var s = p / (2 * Math.PI) * Math.asin(c / a); + if (t < 1) return - .5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b; + } + }, + Back: { + easeIn: function(t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c * (t /= d) * t * ((s + 1) * t - s) + b; + }, + easeOut: function(t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; + }, + easeInOut: function(t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; + return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; + } + }, + Bounce: { + easeIn: function(t, b, c, d) { + return c - tween.Bounce.easeOut(d - t, 0, c, d) + b; + }, + easeOut: function(t, b, c, d) { + if ((t /= d) < (1 / 2.75)) { + return c * (7.5625 * t * t) + b; + } else if (t < (2 / 2.75)) { + return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b; + } else if (t < (2.5 / 2.75)) { + return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b; + } else { + return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b; + } + }, + easeInOut: function(t, b, c, d) { + if (t < d / 2){ + return tween.Bounce.easeIn(t * 2, 0, c, d) * .5 + b; + } + else{ + return tween.Bounce.easeOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b; + } + } + } + }; + if(effArr.length!=2){ + return null; + } + if (!(effArr[0] in tween)) { + return null; + } + if (!(effArr[1] in tween[effArr[0]])) { + return null; + } + var tweenFun = tween[effArr[0]][effArr[1]]; + var getStartAndEnd=function(arr){//分析初始化位置和结束位置 + var vars=arr[1]; + var current=0,result=0; + switch (arr[0]) { + case 'width': + current = thisTemp.getWidth(); + if (vars.substring(vars.length - 1, vars.length) == '%') { + result = parseInt(vars) * h * 0.01; + } + else{ + result=parseInt(vars); + } + break; + case 'height': + current = thisTemp.getHeight(); + if (vars.substring(vars.length - 1, vars.length) == '%') { + result = parseInt(vars) * h * 0.01; + } + else{ + result=parseInt(vars); + } + break; + case 'left': + if(!isUndefined(thisTemp.css('left'))){ + current=parseInt(thisTemp.css('left')); + } + else{ + current = thisTemp.offset()['left']-parNode.offset()['left']; + } + if (vars.substring(vars.length - 1, vars.length) == '%') { + result = parseInt(vars) * w * 0.01; + } + else{ + result=parseInt(vars); + } + thisTemp.css('right','auto'); + break; + case 'right': + if(!isUndefined(thisTemp.css('right'))){ + current=parseInt(thisTemp.css('right')); + } + else{ + current = parNode.getWidth()-(thisTemp.offset()['left']-parNode.offset()['left']+thisTemp.getWidth()); + } + if (vars.substring(vars.length - 1, vars.length) == '%') { + result = parseInt(vars) * w * 0.01; + } + else{ + result=parseInt(vars); + } + thisTemp.css('left','auto'); + break; + case 'top': + if(!isUndefined(thisTemp.css('top'))){ + current=parseInt(thisTemp.css('top')); + } + else{ + current = thisTemp.offset()['top']-parNode.offset()['top']; + } + if (vars.substring(vars.length - 1, vars.length) == '%') { + result = parseInt(vars) * h * 0.01; + } + else{ + result=parseInt(vars); + } + thisTemp.css('bottom','auto'); + break; + case 'bottom': + if(!isUndefined(thisTemp.css('bottom'))){ + current=parseInt(thisTemp.css('bottom')); + } + else{ + current = parNode.getHeight()-(thisTemp.offset()['top']-parNode.offset()['top']+thisTemp.getHeight()); + } + if (vars.substring(vars.length - 1, vars.length) == '%') { + result = parseInt(vars) * h * 0.01; + } + else{ + result=parseInt(vars); + } + thisTemp.css('top','auto'); + break; + case 'alpha': + if(!isUndefined(thisTemp.css('filter')) && thisTemp.css('filter')!='none'){ + current=Number(thisTemp.css('filter'))*100; + } + else if(!isUndefined(thisTemp.css('opacity')) && thisTemp.css('opacity')!='none'){ + current=thisTemp.css('opacity')*100; + } + else{ + current = 100; + } + if (vars.substring(vars.length - 1, vars.length) == '%') { + result = parseInt(vars); + } + else{ + result=vars*100; + } + break; + } + result-=current; + if(current!=result){ + return { + 'type':arr[0], + 'current':current, + 'result':result + }; + } + return null; + }; + var stopTween = function() { + if (thisTemp.timerTween != null) { + clearInterval(thisTemp.timerTween); + thisTemp.timerTween = null; + } + }; + parameter=parameter.replace(/[ ]*,[ ]*|[ ]+/g, ';'); + var newCss=[]; + var parameterArr=parameter.split(';'); + for(var i=0;i<parameterArr.length;i++){ + var cssArr=parameterArr[i].split(':'); + if(cssArr.length==2){ + var temp=getStartAndEnd(cssArr); + if(temp){ + newCss.push(temp) + } + } + } + var funTime=0; + var timeFun=function(){ + var styleObj={}; + if(thisTemp.tweenPlay){ + if (funTime < totalTime) { + funTime += speed; + for(var i=0;i<newCss.length;i++){ + var ob=newCss[i]; + var ap =Math.ceil(tweenFun(funTime, ob['current'], ob['result'], totalTime)); + switch(ob['type']){ + case 'width': + styleObj['width']=ap + 'px'; + styleObj['overflow']='hidden'; + break; + case 'height': + styleObj['height']=ap + 'px'; + styleObj['overflow']='hidden'; + break; + case 'left': + styleObj['left']=ap + 'px'; + break; + case 'right': + styleObj['right']=ap + 'px'; + break; + case 'top': + styleObj['top']=ap + 'px'; + break; + case 'bottom': + styleObj['bottom']=ap + 'px'; + break; + case 'alpha': + styleObj['filter']='alpha(opacity:' + ap*0.01 + ')'; + styleObj['opacity']=ap*0.01; + break; + } + } + thisTemp.css(styleObj); + } + else{ + stopTween(); + if(!isUndefined(callBack)){ + callBack(thisTemp); + } + } + } + }; + stopTween(); + this.timerTween=setInterval(timeFun,speed); + return this; + }; + /* + * animatePlay + * 功能:播放缓动动画 + */ + res.animatePlay=function(){ + if(!isUndefined(this.timerTween)){ + this.tweenPlay=true; + } + return this; + }; + /* + * animatePause + * 功能:暂停缓动动画 + */ + res.animatePause=function(){ + if(!isUndefined(this.timerTween)){ + this.tweenPlay=false; + } + return this; + }; + } else { + /* + * each + * 功能:当相同节点数量大于0时,使用该函数可以进行循环节点 + * @fn:循环节点时执行的函数 + */ + res.each = function(fn) { + for (var i in this) { + if (this.hasOwnProperty(i)) { + if (valType(this[i]) == 'htmlobject') { + fn(i, this[i]); + } else { + try { + if (!this[0].nodeName) fn(i, this[i]); + } catch (e) { + fn(i, this[i]); + } + } + } + } + }; + /* + * eq + * 功能:根据索引返回指定节点 + * @m:为索引数字 + */ + res.eq = function(m) { + if (valType(this) == 'htmlarray') { + if (this.length >= m + 1) { + return this[m]; + } + return null; + } + return null; + }; + for (var i = 0; i < res.length; i++) { + if ($) { + try { + res[i] = $(res[i]); + } catch (event) {} + } + } + } + + } + return res; + }, + /* + * createlDiv + * 功能:新建一个DIV节点 + */ + createlDiv=function(className,html) { + var ele = document.createElement('div'); + var eleObject = $(ele); + if (className) { + eleObject.addClass(className); + } + if(html){ + eleObject.htm(html); + } + return eleObject; + }, + /* + * createlVideo + * 功能:新建一个video节点 + */ + createlVideo=function() { + var ele = document.createElement('video'); + var eleObject = $(ele); + return eleObject; + }, + /* + * createlButton + * 功能新建一个button节点 + */ + createlButton=function(className,html) { + var ele = document.createElement('button'); + var eleObject = $(ele); + eleObject.attr('type','button'); + if (className) { + eleObject.addClass(className); + } + if(html){ + eleObject.htm(html); + } + return eleObject; + }, + /* + * createlA + * 功能新建一个a节点 + */ + createlA=function(html,href,className) { + var ele = document.createElement('a'); + var eleObject = $(ele); + if(html){ + eleObject.htm(html); + } + if(!isUndefined(href) && href){ + eleObject.attr('href',href); + eleObject.attr('target','_blank'); + } + if (className) { + eleObject.addClass(className); + } + return eleObject; + }, + /* + * createlJsLink + * 功能新建一个a节点 + */ + createlJsLink=function(html,js) { + var ele = document.createElement('a'); + var eleObject = $(ele); + if(html){ + eleObject.htm(html); + } + if(!isUndefined(js) && js){ + eleObject.attr('href','javascript:'+js+'()'); + } + else{ + eleObject.attr('href','javascript:;'); + } + return eleObject; + }, + /* + * createlImg + * 功能新建一个img节点 + */ + createlImg=function(file,className) { + var ele = document.createElement('img'); + var eleObject = $(ele); + if (className) { + ele.className = className; + } + if(file){ + ele.src=file; + } + return eleObject; + }, + /* + * getClient + * 功能:获取clientX和clientY + */ + getClient=function(event) { + var eve = event || window.event; + if (isUndefined(eve)) { + eve = { + clientX: 0, + clientY: 0 + }; + } + var x=eve.clientX + (document.documentElement.scrollLeft || $('body').scrollLeft), + y=eve.clientY + (document.documentElement.scrollTop || $('body').scrollTop); + if(isUndefined(x.toString()) || x.toString()=='NaN'){ + x=eve.touches[0].clientX + } + if(isUndefined(y.toString()) || y.toString()=='NaN'){ + y=eve.touches[0].clientY + } + if(x.toString()=='NaN'){ + x=0; + } + if(y.toString()=='NaN'){ + y=0; + } + return { + x: x, + y: y + } + }, + /* + * getLiveTime + * 功能:获取直播回放时间 + */ + getLiveTime=function(){ + var notTime=Date.now(); + var varsTime=vars['live']; + if(varsTime.toString().length<13){ + varsTime=varsTime*1000; + } + return notTime-varsTime; + }, + /* + * formatLiveTime + * 功能:将直播的时间戳格式化成标准时间 + */ + formatLiveTime=function(time){ + var varsTime=vars['live']; + if(varsTime.toString().length<13){ + varsTime=varsTime*1000; + } + varsTime+=time; + return language['lookBack']+date('H:i:s',varsTime); + }, + /* + * loadJs + * 功能:加载js文件并在加载完成后执行callback函数 + * @file:js文件地址 + * @callback:加载完成后执行的函数 + */ + loadJs=function(file, callback) { + var fn =function() {}; + if(!isUndefined(callback)){ + fn=callback; + } + if(checkJs(file)){ + fn(); + return; + } + var script = document.createElement('script'); + script.type = 'text/javascript'; + var isReady = false; + var timer = null; + var doReady = function() { + if(timer){ + clearInterval(timer); + } + if(isReady) return; + isReady = true; + if(valType(fn) == 'function') { + fn(); + } + }; + var bodyLoad = function() { + timer = setInterval(function() { + try { + if(!isUndefined(script.readyState) && script.readyState == 'complete') { + doReady(); + } + } catch(event) {}; + }, 10); + }; + var w3c = function() { + if(valType(fn) == 'function') { + fn(); + } + removeListener(script, 'load', w3c); + removeListener(script, 'error', w3cError); + }; + var w3cError = function() { + if(valType(fn) == 'function') { + fn(); + } + removeListener(script, 'load', w3c); + removeListener(script, 'error', w3cError); + }; + try { + addListener(script, 'load', w3c); + addListener(script, 'error', w3cError); + } catch(event) { + bodyLoad(); + } + script.src = file; + $('head').eq(0).append(script); + }, + + /* + * doubleClickEvent + * 功能:注册对象双击功能 + * @ele:注册对象,可以是页面中的任意节点,不支持数组形式 + */ + doubleClickEvent=function(ele){ + var setTime=null;//注册延时函数 + var clickTime=0;//记录点击时间 + ele=$(ele); + ele.click(function(){ + if(!setTime){ + setTime=setTimeout(function(){ + try{ + ele.dispatchEvent(new Event('sigClick'));//注册单击,针对视频播放器使用 + } + catch(event){ + var e = document.createEvent('HTMLEvents'); + e.initEvent('sigClick', false, true); + ele.dispatchEvent(e); + } + clickTime=0; + setTime=null; + },260); + } + if(!clickTime){ + clickTime=new Date().getTime(); + } + else{ + if(new Date().getTime()-clickTime<230){//认为是双击 + try{ + ele.dispatchEvent(new Event('dobClick'));//注册双击 + } + catch(event){ + var e = document.createEvent('HTMLEvents'); + e.initEvent('dobClick', false, true); + ele.dispatchEvent(e); + } + clearTimeout(setTime); + clickTime=0; + setTime=null; + } + } + }); + }, + /* + * noScrolling + * 功能,禁止页面滚动操作 + */ + noScrolling=function(b){ + if(isUndefined(b)) b=false; + var bodyScroll=function (event){ + event.preventDefault(); + }; + if(b){ //禁止滚动 + $('body').addListener('touchmove', bodyScroll, {passive: false }); + } + else{ //开启滚动 + $('body').removeListener('touchmove',bodyScroll, {passive: false}); + } + }; + return into(videoObj); + } + /* + * ajax + * 功能:ajax功能 + * @cObj:传递的参数,包含请求地址,请求类型,编码等 + */ + function ajax(cObj) { + var callback = null; + var obj = { + method: 'get',//请求类型 + dataType: 'json',//请求的数据类型 + charset: 'utf-8', + async: true,//true表示异步,false表示同步 + url: '', + data: null, + success: null, + error:null + }; + obj = standardization(obj, cObj); + if (isUndefined(obj['url'])) { + return; + } + /* + * errorFun + *功能:执行error + */ + var errorFun=function(info){ + if(!isUndefined(obj['error']) && valType(obj['error'])=='function'){ + obj['error'](info); + } + else{ + obj['success'](null); + } + }; + /* + * successFun + *功能:执行success + */ + var successFun=function(success){ + if(!isUndefined(obj['success']) && valType(obj['success'])=='function'){ + obj['success'](success); + } + }; + /* + * createXHR + *功能:用来为ajax函数提供支持 + */ + var createXHR=function() { + if (window.XMLHttpRequest) { + return new XMLHttpRequest(); + } else if (window.ActiveXObject) { + try { + return new ActiveXObject('Microsoft.XMLHTTP'); + } catch(event) { + try { + return new ActiveXObject('Msxml2.XMLHTTP'); + } catch(event) {} + } + } + }; + /* + * formatParams + * 功能:将对象转成地址字符串,为ajax函数提供支持 + * @obj:传递一个对象 + */ + var formatParams=function(obj) { + var arr = []; + for (var key in obj) { + arr.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])); + } + return arr.join('&'); + }; + if (valType(cObj) != 'object') { + if(!isUndefined(obj['error'])){ + obj.error(event); + } + return; + } + + if (obj.dataType === 'json' || obj.dataType === 'text' || obj.dataType === 'html' || obj.dataType === 'xml') { + var xhr = createXHR(); + callback = function() { + //判断http的交互是否成功 + if (xhr.status === 200) { + if (obj.dataType === 'json') { + try { + successFun(eval('(' + xhr.responseText + ')')); //回调传递参数 + } + catch(event) { + successFun(null); + } + } else { + successFun(xhr.responseText); //回调传递参数 + } + } + else { + errorFun({code:xhr.status,message:xhr.statusText}); + } + }; + obj.data = formatParams(obj.data); //通过params()将名值对转换成字符串 + if (obj.method === 'get' && !isUndefined(obj.data)) { + if (obj.data != '') { + if (obj.url.indexOf('?') == -1) { + obj.url += '?' + obj.data + } else { + obj.url += '&' + obj.data; + } + } + } + if (obj.async === true) { //true表示异步,false表示同步 + addListener(xhr,'readystatechange',function(event){ + if (this.readyState === 4 && callback != null) { //判断对象的状态是否交互完成 + callback(); //回调 + } + }); + } + xhr.open(obj.method, obj.url, obj.async); + if (obj.method === 'post') { + try{ + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.setRequestHeader('charset', obj['charset']); + xhr.send(obj.data); + } + catch(event){ + callback(); + } + } + else { + try{ + xhr.send(null); //get方式则填null + } + catch(event){ + callback(); + } + } + if (obj.async === false) { //同步 + callback(); + } + + } + else if (obj.dataType === 'jsonp') { + var oHead = document.getElementsByTagName('head')[0]; + var oScript = document.createElement('script'); + var callbackName = 'callback' + new Date().getTime(); + var params = formatParams(obj.data) + '&callback=' + callbackName; //按时间戳拼接字符串 + //拼接好src + oScript.src = obj.url.split('?') + '?' + params; + //插入script标签 + oHead.insertBefore(oScript, oHead.firstChild); + //jsonp的回调函数 + window[callbackName] = function(json) { + if(!isUndefined(obj['success']) && valType(obj['success'])==='function'){ + obj['success'](json); + } + oHead.removeChild(oScript); + }; + } + } + /* + * documentReady + * 功能:判断页面加载完成 + * @fn:页面加载完成后执行的函数 + */ + function documentReady(fn) { + var isReady = false; + var timer = null; + var doReady = function() { + if(timer) clearInterval(timer); + if(isReady) return; + isReady = true; + if(valType(fn) == 'function') { + fn(); + } + }; + var bodyLoad = function() { + timer = setInterval(function() { + try { + if(!isUndefined(document.readyState) && document.readyState == 'complete') { + doReady(); + } + } catch(event) {}; + }, 10); + }; + var w3c = function() { + + if(valType(fn) == 'function') { + fn(); + } + removeListener(window, 'load', w3c); + }; + if(!isUndefined(document.body)){ + if(valType(fn) == 'function') { + fn(); + } + } + else{ + try { + addListener(window, 'load', w3c); + } catch(event) { + bodyLoad(); + } + } + + } + /* + * getPath + * 功能:获取该js文件所在路径 + */ + function getPath(siz) { + var scriptList = document.scripts, + thisPath = scriptList[scriptList.length - 1].src; + for (var i = 0; i < scriptList.length; i++) { + var scriptName = scriptList[i].getAttribute('name') || scriptList[i].getAttribute('data-name'); + var src = scriptList[i].src.slice(scriptList[i].src.lastIndexOf('/') + 1, scriptList[i].src.lastIndexOf('.')); + if ((scriptName && (scriptName == 'ckplayer' || scriptName == 'ckplayer.min')) || (scriptList[i].src && (src == 'ckplayer' || src == 'ckplayer.min'))) { + thisPath = scriptList[i].src; + break; + } + } + var path=thisPath.substring(0, thisPath.lastIndexOf('/js/') + 1); + if(!isUndefined(siz)){ + path+=siz+'/'; + } + return path; + } + /* + * checkJs + * 功能:判断js是否已加载 + * @file:js文件路径 + */ + function checkJs(file) { + var scriptList = document.scripts; + for (var i = 0; i < scriptList.length; i++) { + if(scriptList[i].src==file){ + return scriptList[i]; + } + } + return false; + } + /* + * getMaxZIndex + * 功能:获取当前页面最大深度 + */ + function getMaxZIndex() { + var arr = document.all || document.querySelectorAll('*'); + var maxZ = -1; + for (var i = 0; i < arr.length; i++) { + var temp = null; + try { + temp = window.getComputedStyle(arr[i], null).zIndex; + } catch (event) { + if (arr[i].style) { + temp = arr[i].style.zIndex; + } + } + if (temp != 'auto' && parseInt(temp) > maxZ) { + maxZ = parseInt(temp); + } + } + return maxZ; + } + /* + * getWindowSize + * 功能:获取window的宽和高 + */ + function getWindowSize() { + return { + width: window.innerWidth, + height: window.innerHeight + }; + } + /* + * standardization + * 功能:将对象Object标准化,将n对象替换进o对象 + * @o:标准化对象,@n:外部传递对象 + */ + function standardization(o, n) { //n替换进o + var h = {}; + var k; + for (k in o) { + h[k] = o[k]; + } + for (k in n) { + if(k in h){ + h[k] = n[k]; + } + } + return h; + } + /* + * mergeObj + * 功能:将新对象合并到原对象中,需要确保原对像里有对应的值并且类型一样 + * @o:原对象,@n:新对象 + */ + function mergeObj(o,n){ + var h = {}; + var k; + for (k in o) { + h[k] = o[k]; + } + for (k in n) { + if(k in h){ + switch(valType(h[k])){ + case 'object': + if(valType(n[k])=='object'){ + h[k] = mergeObj(h[k],n[k]); + } + break; + default: + if(valType(h[k])==valType(n[k])){ + h[k] = n[k]; + } + break; + } + } + } + return h; + } + /* + * valType + * 功能:判断变量类型 + */ + function valType(val) { + if(typeof val==='undefined') return 'undefined'; + var str=Object.prototype.toString.call(val).split(' ')[1].replace(']','').toLowerCase(); + if(str.substr(0,4)=='html' && (str.substr(-7)=='element' || str.substr(-8)=='document' || str=='window')){ + str='htmlobject'; + } + if(str=='htmlcollection' || str=='nodelist'){ + str='htmlarray'; + } + return str; + } + /* + * isUndefined + * 功能:判断变量是否存在或值是否为undefined + */ + function isUndefined(val) { + try { + return valType(val)==='undefined' || val === undefined || val === null || (valType(val)==='number' && isNaN(val)); + } catch (event) { + return true; + } + return false; + } + /* + * prev + * 功能:获取指定节点前一个同胞节点 + * @ele:要获取的节点 + */ + function prev(ele) { + var e = ele.previousSibling; + if (e == null) { //测试同胞节点是否存在,否则返回空 + return null; + } + if (e.nodeType == 3) { //如果同胞节点为文本节点 + var t = prev(e); + if (t && t.nodeType == 1) { + return t; + } + } else { + if (e.nodeType == 1) { //确认节点为节点节点才返回 + return e; + } else { + return false; + } + } + } + /* + * next + * 功能:获取指定节点下一个同胞节点 + * @ele:要获取的节点 + */ + function next(ele) { + var e = ele.nextSibling; + if (e == null) { //测试同胞节点是否存在,否则返回空 + return null; + } + if (e.nodeType == 3) { //如果同胞节点为文本节点 + var t = next(e); + if (t && t.nodeType == 1) { + return t; + } + } else { + if (e.nodeType == 1) { //确认节点为节点才返回 + return e; + } else { + return false; + } + } + } + /* + * addListener + * 功能:事件监听 + * @ele:监听对象,@e:事件名称,@f:返回事件函数 + */ + function addListener(ele, e, f, t) { + if (isUndefined(t)) { + t = false; + } + if (ele.addEventListener) { + try { + ele.addEventListener(e, f, t); + } catch (event) {} + } else if (ele.attachEvent) { + try { + ele.attachEvent('on' + e, f); + } catch (event) {} + } else { + ele['on' + e] = f; + } + if(isUndefined(ele.listenerList)){ + ele.listenerList=[]; + } + ele.listenerList.push([e,f]); + return ele; + }; + /* + * removeListener + * 功能:删除事件监听 + * @ele:监听对象,@e:事件名称,@f:返回事件函数 + */ + function removeListener(ele, e, f, t) { + if (isUndefined(t)) { + t = false; + } + if (ele.removeEventListener) { + try { + ele.removeEventListener(e, f, t); + } catch (e) {} + } else if (ele.detachEvent) { + try { + ele.detachEvent('on' + e, f); + } catch (e) {} + } else { + ele['on' + e] = null; + } + if(!isUndefined(ele.listenerList)){ + var temp=[]; + for(var i=0;i<ele.listenerList.length;i++){ + if(ele.listenerList[i][0]!=e || ele.listenerList[i][1]!=f){ + temp.push(ele.listenerList[i]); + } + } + ele.listenerList=temp; + } + return ele; + } + /* + * formatSeconds + * 功能:將秒转化成时分秒 + */ + function formatSeconds(val) { + if(isUndefined(val)) val=0; + var result = parseInt(val); + if(isUndefined(result)) result=0; + if(result<0) result=0; + var h = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600), + m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60)), + s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60)), + res = ''; + if(h !== '00') res += h+':'; + res += m+':'+s; + return res; + } + /* + * date + * 功能:格式化的时间字符串 + */ + function date(format, timestamp) { + if(isUndefined(timestamp)){ + timestamp=new Date(); + } + if(timestamp.toString().length<13) timestamp=timestamp*1000; + var a, jsdate = ((timestamp) ? new Date(timestamp) : new Date()); + var pad = function(n, c) { + if((n = n + '').length < c) { + return new Array(++c - n.length).join('0') + n; + } else { + return n; + } + }; + var txt_weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var txt_ordin = { + 1: 'st', + 2: 'nd', + 3: 'rd', + 21: 'st', + 22: 'nd', + 23: 'rd', + 31: 'st' + }; + var txt_months = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + var f = { + // Day + d: function() { + return pad(f.j(), 2) + }, + D: function() { + return f.l().substr(0, 3) + }, + j: function() { + return jsdate.getDate() + }, + l: function() { + return txt_weekdays[f.w()] + }, + N: function() { + return f.w() + 1 + }, + S: function() { + return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th' + }, + w: function() { + return jsdate.getDay() + }, + z: function() { + return(jsdate - new Date(jsdate.getFullYear() + '/1/1')) / 864e5 >> 0 + }, + + // Week + W: function() { + var a = f.z(), + b = 364 + f.L() - a; + var nd2, nd = (new Date(jsdate.getFullYear() + '/1/1').getDay() || 7) - 1; + if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) { + return 1; + } else { + if(a <= 2 && nd >= 4 && a >= (6 - nd)) { + nd2 = new Date(jsdate.getFullYear() - 1 + '/12/31'); + return date('W', Math.round(nd2.getTime() / 1000)); + } else { + return(1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0); + } + } + }, + + // Month + F: function() { + return txt_months[f.n()] + }, + m: function() { + return pad(f.n(), 2) + }, + M: function() { + return f.F().substr(0, 3) + }, + n: function() { + return jsdate.getMonth() + 1 + }, + t: function() { + var n; + if((n = jsdate.getMonth() + 1) == 2) { + return 28 + f.L(); + } else { + if(n & 1 && n < 8 || !(n & 1) && n > 7) { + return 31; + } else { + return 30; + } + } + }, + + // Year + L: function() { + var y = f.Y(); + return(!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0 + }, + //o not supported yet + Y: function() { + return jsdate.getFullYear() + }, + y: function() { + return(jsdate.getFullYear() + '').slice(2) + }, + + // Time + a: function() { + return jsdate.getHours() > 11 ? 'pm' : 'am' + }, + A: function() { + return f.a().toUpperCase() + }, + B: function() { + // peter paul koch: + var off = (jsdate.getTimezoneOffset() + 60) * 60; + var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off; + var beat = Math.floor(theSeconds / 86.4); + if(beat > 1000) beat -= 1000; + if(beat < 0) beat += 1000; + if((String(beat)).length == 1) beat = '00' + beat; + if((String(beat)).length == 2) beat = '0' + beat; + return beat; + }, + g: function() { + return jsdate.getHours() % 12 || 12 + }, + G: function() { + return jsdate.getHours() + }, + h: function() { + return pad(f.g(), 2) + }, + H: function() { + return pad(jsdate.getHours(), 2) + }, + i: function() { + return pad(jsdate.getMinutes(), 2) + }, + s: function() { + return pad(jsdate.getSeconds(), 2) + }, + //u not supported yet + + // Timezone + //e not supported yet + //I not supported yet + O: function() { + var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4); + if(jsdate.getTimezoneOffset() > 0) t = '-' + t; + else t = '+' + t; + return t; + }, + P: function() { + var O = f.O(); + return(O.substr(0, 3) + ':' + O.substr(3, 2)) + }, + //T not supported yet + //Z not supported yet + + // Full Date/Time + c: function() { + return f.Y() + '-' + f.m() + '-' + f.d() + 'T' + f.h() + ':' + f.i() + ':' + f.s() + f.P() + }, + //r not supported yet + U: function() { + return Math.round(jsdate.getTime() / 1000) + } + }; + + return format.replace(/([a-zA-Z])/g,function(t, s) { + var ret=''; + if(t != s) { + // escaped + ret = s; + } else if(f[s]) { + // a date function exists + ret = f[s](); + } else { + // nothing special + ret = s; + } + return ret; + }); + } + /* + * dataURLtoBlob + * 功能,base64转blob + */ + function dataURLtoBlob(dataurl) { + var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new Blob([u8arr], { type: mime }); + } + /* + * decodeURIString + * 功能,解码中文 + */ + function decodeURIString(obj){ + for(var k in obj){ + if(valType(obj[k])=='string' && obj[k]){ + try{ + obj[k]=decodeURI(obj[k]); + } + catch(event){} + } + if(valType(obj[k])=='object'){ + obj[k]=decodeURIString(obj[k]); + } + } + return obj; + } + /* + * getApp + * 功能,获取平台类型是否是iphone + */ + function getApp(){ + var u = navigator.userAgent.toLowerCase(); + if(u.indexOf('iphone')>-1){ + return 'iphone'; + } + } + /* + * cookie + * 功能,操作cookie + */ + function cookie(name,value,domain,path){ + if(isUndefined(domain)){ + domain=''; + } + if(isUndefined(path)){ + path='/'; + } + var ckStr=';domain='+domain+';path='+path; + if(location.protocol=='https'){ + ckStr+=';SameSite=None;Secure=true'; + } + var set=function(name,value){ + var time = 360*24*60*60*1000; + var exp = new Date(); + exp.setTime(exp.getTime() + time); + try{ + document.cookie = name + '='+ escape (value) + ';expires=' + exp.toGMTString()+ckStr; + } + catch(event){console.error(event)} + }, + get=function(name){ + var arr,reg=new RegExp('(^| )'+name+'=([^;]*)(;|$)'); + if(arr=document.cookie.match(reg)){ + return unescape(arr[2]); + } + else{ + return null; + } + }, + del=function(name){ + var exp = new Date(); + exp.setTime(exp.getTime() - 1); + var cval=get(name); + if(cval!=null){ + document.cookie= name + '='+cval+';expires='+exp.toGMTString()+ckStr; + } + }; + if(!isUndefined(name) && !isUndefined(value)){ + if(value=='delete'){ + del(name); + return null; + } + else{ + set(name,value); + return get(name); + } + + } + else if(!isUndefined(name) && isUndefined(value)){ + return get(name); + } + else if(!isUndefined(name)){ + + } + } + /* + * arrayToString + * 功能,二维数组传化成字符串 + */ + function arrayToString(arr) { + var str=''; + if(!isUndefined(arr)){ + for(var i=0;i<arr.length;i++){ + var temp=arr[i]; + if(i>0){ + str+=','; + } + for(var y=0;y<temp.length;y++){ + if(y>0){ + str+=';'; + } + if(valType(temp[y])=='number'){ + str+=parseInt(temp[y]*100); + } + else{ + str+=temp[y]; + } + + } + } + } + return str; + } + /* + * stringToArray + * 功能,字符串转化成二维数组 + */ + function stringToArray(str) { + var newArr=[]; + if(!isUndefined(str)){ + var arr=str.split(','); + for(var i=0;i<arr.length;i++){ + var temp=arr[i].split(';'); + temp[1]=parseInt(temp[1])*0.01; + temp[2]=parseInt(temp[2])*0.01; + newArr.push(temp); + } + } + return newArr; + } + /* + * documentHidden + * 功能,监听页面切换到其它标签,执行fn函数 + */ + function documentHidden(fn){ + if(!isUndefined(document.visibilityState)){ + fn(document.visibilityState === 'visible'?'show':'hidden'); + addListener(document,'visibilitychange',function(){ + fn(document.visibilityState === 'visible'?'show':'hidden'); + }); + } + } + return ckplayerEmbed; +})); \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/js/ckplayer.min.js b/modules/core/src/main/resources/static/ckplayer/js/ckplayer.min.js new file mode 100644 index 00000000..f9a53beb --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/js/ckplayer.min.js @@ -0,0 +1,7 @@ +/* + * 软件名称:ckplayer + * 版本:X3 + * 版权:www.ckplayer.com + * 开源协议:MIT + */ +(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?module.exports=factory():typeof define==='function'&&define.amd?define(factory):(global=global||self,global.ckplayer=factory())}(this,function(){'use strict';var language={play:'%E6%92%AD%E6%94%BE',pause:'%E6%9A%82%E5%81%9C',refresh:'%E9%87%8D%E6%92%AD',full:'%E5%85%A8%E5%B1%8F',exitFull:'%E9%80%80%E5%87%BA%E5%85%A8%E5%B1%8F',webFull:'%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F',exitWebFull:'%E9%80%80%E5%87%BA%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F',theatre:'%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F',exitTheatre:'%E9%80%80%E5%87%BA%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F',volume:'%E9%9F%B3%E9%87%8F%EF%BC%9A',muted:'%E9%9D%99%E9%9F%B3',exitmuted:'%E6%81%A2%E5%A4%8D%E9%9F%B3%E9%87%8F',seek:'seek%EF%BC%9A',waiting:'%E7%BC%93%E5%86%B2',live:'%E7%9B%B4%E6%92%AD%E4%B8%AD',backLive:'%E8%BF%94%E5%9B%9E%E7%9B%B4%E6%92%AD',lookBack:'%E5%9B%9E%E7%9C%8B%EF%BC%9A',next:'%E4%B8%8B%E4%B8%80%E9%9B%86',screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE',smallwindows:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E6%92%AD%E6%94%BE%E5%8A%9F%E8%83%BD',playbackrate:'%E5%80%8D%E9%80%9F',playbackrateSuffix:'%E5%80%8D',track:'%E5%AD%97%E5%B9%95',noTrack:'%E6%97%A0%E5%AD%97%E5%B9%95',definition:'%E6%B8%85%E6%99%B0%E5%BA%A6',switchTo:'%E5%88%87%E6%8D%A2%E6%88%90%EF%BC%9A',closeTime:'%7Bseconds%7D%E7%A7%92%E5%90%8E%E5%8F%AF%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A',closeAd:'%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A',second:'%E7%A7%92',details:'%E6%9F%A5%E7%9C%8B%E8%AF%A6%E6%83%85',copy:'%E5%A4%8D%E5%88%B6',copySucceeded:'%E5%A4%8D%E5%88%B6%E6%88%90%E5%8A%9F%EF%BC%8C%E5%8F%AF%E8%B4%B4%E7%B2%98%EF%BC%81',smallwindowsOpen:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%BC%80%E5%90%AF',smallwindowsClose:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD',screenshotStart:'%E6%88%AA%E5%9B%BE%E4%B8%AD%EF%BC%8C%E8%AF%B7%E7%A8%8D%E5%80%99...',screenshotClose:'%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD',loopOpen:'%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE',loopClose:'%E5%B7%B2%E5%85%B3%E9%97%AD%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE',close:'%E5%85%B3%E9%97%AD',down:'%E4%B8%8B%E8%BD%BD',p50:'50%25',p75:'75%25',p100:'100%25',timeScheduleAdjust:{prohibit:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%8B%96%E5%8A%A8',prohibitBackOff:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E9%87%8D%E5%A4%8D%E8%A7%82%E7%9C%8B',prohibitForward:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E5%BF%AB%E8%BF%9B',prohibitLookBack:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9',prohibitForwardNotViewed:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E6%9C%AA%E8%A7%82%E7%9C%8B%E7%9A%84%E9%83%A8%E5%88%86'},error:{noMessage:'%E6%9C%AA%E7%9F%A5%E9%94%99%E8%AF%AF',supportVideoError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E7%89%88%E6%9C%AC%E5%A4%AA%E4%BD%8E%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8',videoTypeError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E6%92%AD%E6%94%BE%E8%AF%A5%E8%A7%86%E9%A2%91%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8',loadingFailed:'%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5',emptied:'%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF',screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE%E5%A4%B1%E8%B4%A5',ajax:'Ajax%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E9%94%99%E8%AF%AF',noVideoContainer:'%E6%9C%AA%E6%89%BE%E5%88%B0%E6%94%BE%E7%BD%AE%E8%A7%86%E9%A2%91%E7%9A%84%E5%AE%B9%E5%99%A8'}};var videoObjectDefault={container:'',volume:0.8,poster:'',autoplay:false,loop:false,live:false,rotate:0,zoom:0,ad:null,backLive:false,seek:0,next:null,loaded:'',plug:'',duration:0,preview:null,prompt:null,crossOrigin:'',video:null,type:'',playbackrate:1,ended:null,webFull:false,theatre:null,controls:false,rightBar:null,smallWindows:null,smallWindowsDrag:true,screenshot:false,timeScheduleAdjust:1,logo:'',menu:null,information:{'Load:':'{loadTime} second','Duration:':'{duration} second','Size:':'{videoWidth}x{videoHeight}','Volume:':'{volume}%','Fps:':'{fps}fps','Sudio decoded:':'{audioDecodedByteCount} Byte','Video decoded:':'{videoDecodedByteCount} Byte'},track:null,title:'',language:'',barHideTime:1500,playbackrateOpen:true,playbackrateList:[0.75,1,1.25,1.5,2,4],cookie:null,domain:null,cookiePath:'/',documentFocusPause:false,mouseWheelVolume:2,keyVolume:2,errorShow:true};function ckplayerEmbed(videoObj){var rightMenu=[{title:'ckplayer',link:'http://www.ckplayer.com'},{title:'version:X3',underline:true},{title:'about',click:'aboutShow'}];var vars={},varsTemp={};var video=null;var duration=0;var mutedState='';var recoveryVolume=false;var waited=true;var paused=true;var loadTime=0;var seekTime=0;var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;var isChangeDef=true;var playType='';var msgSetTime=null,tipSetTime=null,mouseSetTime=null;var adFrontSetTime=null,adPauseSetTime=null;var closeTipFun=null;var closeTipMouseOut=null;var waitingMessage=true;var hidePreviewSetTime=null;var pSliderMouseDown=false;var playbackTime=0;var loadedmetadataNum=0;var screenshotImg=null;var ad=null;var frontAdPlay=false,pauseAdPlay=false;var barShow=true,rightBarShow=true;var EventTarget=null,newEvent=null,eventTargetList=null;var loadedTrack=false;var C={};var CT=null,CK=null,CM=null,CV=null;var pugPlayer=null;var hls=null;var loadMeta=true;var app='';var nowRotate=0;var nowZoom=100;var smallWindowsState=false;var isDrag=false;var ckplayerCookie='ckplayer-player-cookie';var cookieName='';var cookieTime=0;var cookieArray=[];var focusPause=true;var existenceObj=false;var into=function(obj){if(isUndefined(obj)){player.add=player.into=into;return player}language=decodeURIString(language);if(!isUndefined(window.ckplayerLanguage)){language=mergeObj(language,window.ckplayerLanguage)}eventTarget();documentHidden(function(state){eventTarget('visibilityState',state)});app=getApp();varsTemp={};for(var key in videoObjectDefault){varsTemp[key]=videoObjectDefault[key]}if(valType(obj)=='string'&&(obj.substr(0,8)=='website:'||obj.substr(0,4)=='url:')){var ajaxUrl='';if(obj.substr(0,8)=='website:'){ajaxUrl=obj.substring(8)}if(obj.substr(0,4)=='url:'){ajaxUrl=obj.substring(4)}ajax({url:ajaxUrl,success:function(data){if(data){return into(data)}else{showWindowsError(language['error']['ajax']+',url:'+ajaxUrl);return null}}})}else if(valType(obj)=='object'){varsTemp=standardization(varsTemp,obj);if(!isUndefined(obj['container'])&&obj['container']){CT=$(obj['container']);if(CT){return loadLanguage(obj)}else{return bodyReady(obj)}}else{return bodyReady(obj)}}else{showWindowsError(language['error']['noVideoContainer']);return null}},bodyReady=function(obj){documentReady(function(){if(!isUndefined(obj['container'])){CT=$(obj['container']);if(CT){return loadLanguage(obj)}else{showWindowsError(language['error']['noVideoContainer']);return null}}else{return ajaxWebsite(obj)}});return null},ajaxWebsite=function(obj){if(valType(obj['video'])=='string'&&(obj['video'].substr(0,8)=='website:'||obj['video'].substr(0,4)=='url:')){varsTemp=standardization(varsTemp,obj);var ajaxUrl='';if(obj['video'].substr(0,8)=='website:'){ajaxUrl=obj['video'].substring(8)}if(obj['video'].substr(0,4)=='url:'){ajaxUrl=obj['video'].substring(4)}ajax({url:ajaxUrl,success:function(data){if(data){return into(data)}else{showWindowsError(language['error']['ajax']+',url:'+ajaxUrl);return null}}})}else{showWindowsError(language['error']['noVideoContainer']);return null}},loadLanguage=function(obj){vars=standardization(varsTemp,obj);if(vars['language']){var path=getPath('language')+vars['language']+'.js';loadJs(path,function(){if(!isUndefined(window['ckplayerLanguage'])){language=mergeObj(language,window['ckplayerLanguage'])}return embed(obj)})}else{return embed(obj)}},embed=function(obj){mutedState=vars['volume']>0?false:true;if(!isUndefined(CT)&&CT!=null){if(valType(CT)=='htmlarray'){CT=CT.eq(0)}}else{return null}calculationFps();existenceObj=valType(vars['video'])=='string'&&((vars['video'].substr(0,1)=='.'&&vars['video'].indexOf('/')==-1)||vars['video'].substr(0,1)=='#');if(existenceObj){CK=CT.find('.ckplayer-ckplayer')?CT.find('.ckplayer-ckplayer').eq(0):null;if(CK){CM=CK.find('.ck-main')?CK.find('.ck-main').eq(0):null}if(CM){CV=CM.find('.ck-video')?CM.find('.ck-video').eq(0):null}}if(!CK||!CM||!CV){CT.htm('');CK=createlDiv('ckplayer-ckplayer');CT.append(CK);CM=createlDiv('ck-main');CK.append(CM);CV=createlDiv('ck-video');CM.append(CV)}if(video){video.remove();video=null}if(existenceObj){video=$(vars['video'])?$(vars['video']).eq(0):null}if(!video){video=createlVideo();video.attr('width','100%').attr('height','100%');CV.append(video)}video.volume=vars['volume'];if(vars['autoplay']){player.volume(0);player.muted();recoveryVolume=true;video.attr('autoplay','autoplay');paused=false}else{video.attr('preload','metadata')}CT.loop=vars['loop'];if(CT.loop){video.attr('loop','loop')}if(vars['controls']){video.controls=true}else{video.controls=false}try{if(!existenceObj){video.attr('controlslist','nodownload');video.attr('x-webkit-airplay','true');video.attr('x5-video-orientation','portraint');video.attr('playsinline','true');video.attr('webkit-playsinline','true');video.attr('x5-playsinline','true')}if(vars['crossOrigin']){video.useCORS=true;video.crossOrigin=vars['crossOrigin']}}catch(event){}CT.smallWindows=true;CT.webFull=false;CT.theatre=false;loadFace();if(vars['rotate']>0){player.rotate(vars['rotate'])}if(vars['zoom']>0){player.zoom(vars['zoom'])}if(isUndefined(video.canPlayType)){CT.error={code:5,message:language['error']['supportVideoError']};eventTarget('error',CT.error);showError();return player}addAllListener();if(!isUndefined(vars['loaded'])){if(valType(vars['loaded'])=='function'){try{vars['loaded'](player)}catch(event){}}else if(valType(vars['loaded'])=='string'){try{eval(vars['loaded']+'(player)')}catch(event){}}}if(!existenceObj){changeVideo(vars['video'])}else{changeVideo(video.attr('src'))}return player},changeVideo=function(vstr){var i=0;if(video.attr('src')||video.htm()){player.pause()}if(video.attr('src')&&!existenceObj){video.attr('src','');video.removeAttr('src')}if(!isUndefined(video.textTracks)&&video.textTracks.length>0){for(i=video.find('track').length-1;i>-1;i--){video.find('track').eq(i).remove()}}if(!existenceObj){video.htm('')}if(!isUndefined(vars['ad'])){ad=vars['ad']}var source='';if(valType(vstr)=='string'){if(vstr.substr(0,8)=='website:'||vstr.substr(0,4)=='url:'){var ajaxUrl='';if(vstr.substr(0,8)=='website:'){ajaxUrl=vstr.substring(8)}if(vstr.substr(0,4)=='url:'){ajaxUrl=vstr.substring(4)}ajax({url:ajaxUrl,success:function(data){if(data!=null){vars=standardization(varsTemp,data);changeVideo(vars['video'])}else{CT.error={code:8,message:language['error']['ajax']};eventTarget('error',CT.error);showError()}}});return}else{if(vars['plug']&&!canPlay(vstr)){plugPlayer(vstr)}else{if(!existenceObj){video.attr('src',vstr)}}loadTrack()}}else if(valType(vstr)=='array'){for(i=0;i<vstr.length;i++){if(valType(vstr[i])=='array'){if(vars['plug']&&!canPlay(vstr[i][0])){plugPlayer(vstr[i][0])}else{var type=' type="'+vstr[i][1]+'"';if(vstr[i].length>1){source+='<source src="'+decodeURIComponent(vstr[i][0])+'"'+type+'>'}}}}if(source){video.htm(source)}loadTrack()}else if(valType(vstr)=='object'){if(vars['plug']){plugPlayer(vstr)}else{CT.error={code:10,message:language['error']['emptied']};eventTarget('error',CT.error);showError()}loadTrack()}if(!isUndefined(video.find('source'))&&video.find('source').length>0){video.find('source').eq(video.find('source').length-1).addListener('error',videoHandler.error)}checkBar();loadLogo();if(isChangeDef){checkDefinition()}if(vars['cookie']){if(valType(vars['cookie'])=='array'&&vars['cookie'].length>=2){if(vars['cookie'][0]&&valType(vars['cookie'][0])=='string'){cookieName=vars['cookie'][0]}if(vars['cookie'][1]&&valType(vars['cookie'][1])=='number'){cookieTime=vars['cookie'][1]}}if(valType(vars['cookie'])=='object'&&!isUndefined(vars['cookie']['name'])){cookieName=vars['cookie']['name'];if(!isUndefined(vars['cookie']['hour'])&&valType(vars['cookie']['hour'])=='number'){cookieTime=vars['cookie']['hour']}}if(valType(vars['cookie'])=='string'){cookieName=vars['cookie']}if(cookieName){cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g,'').replace(/[ ]*;[ ]*|[ ]+/g,'')}}if(!isUndefined(vars['seek'])&&!seekTime){if(valType(vars['seek'])=='number'&&vars['seek']>0){seekTime=vars['seek']}if(valType(vars['seek'])=='string'&&vars['seek']=='cookie'&&cookieName){var cke=player.cookie(cookieName);if(cke){seekTime=cke['time']}}}},plugPlayer=function(url){switch(vars['plug']){case'hls.js':hlsPlayer(url);break;case'flv.js':flvPlayer(url);break;case'mpegts.js':mpegtsPlayer(url);break;case'dash.js':dashPlayer(url);break;default:if(valType(vars['plug'])=='function'){vars['plug'](video,url)}else{CT.error={code:10,message:language['error']['emptied']};eventTarget('error',CT.error);showError()}break}},hlsPlayer=function(url){var path=getPath('hls.js')+'hls.min.js';loadJs(path,function(){if(!isUndefined(Hls)&&Hls.isSupported()){hls=new Hls();hls.loadSource(url);hls.attachMedia(video);hls.on(Hls.Events.ERROR,function(event,data){var code=9;var message=language['error']['loadingFailed'];var fatal=data.fatal;if(!isUndefined(data.response)){if(!isUndefined(data.response.code)){code=data.response.code}if(!isUndefined(data.response.text)&&data.response.text){message=data.response.text}else{if(!isUndefined(event)){message=event}}}CT.error={code:code,message:message};eventTarget('error',CT.error);if(fatal){showError()}})}else if(canPlay(url)){video.attr('src',url)}})},flvPlayer=function(url){var path=getPath('flv.js')+'flv.min.js';loadJs(path,function(){if(typeof(flvjs)!='undefined'&&!isUndefined(flvjs)&&flvjs.isSupported()){var config={type:'flv',url:url};if(valType(url)=='object'){config=url}if(vars['live']){config['isLive']=true}if(pugPlayer){pugPlayer.pause();pugPlayer.unload();pugPlayer.detachMediaElement();pugPlayer.destroy();pugPlayer=null}pugPlayer=flvjs.createPlayer(config);pugPlayer.attachMediaElement(video);pugPlayer.load();pugPlayer.on(flvjs.Events.METADATA_ARRIVED,function(res){videoHandler.loadedMetaData()});pugPlayer.on(flvjs.Events.ERROR,function(errorType,errorDetail,errorInfo){CT.error={code:errorInfo['code'],message:errorInfo['msg']};eventTarget('error',CT.error);showError()})}})},mpegtsPlayer=function(url){var path=getPath('mpegts.js')+'mpegts.js';loadJs(path,function(){if(typeof(mpegts)!='undefined'&&!isUndefined(mpegts)&&mpegts.getFeatureList().mseLivePlayback){var config={type:'mse',url:url};if(valType(url)=='object'){config=url}if(vars['live']){config['isLive']=true}if(pugPlayer){pugPlayer.pause();pugPlayer.unload();pugPlayer.detachMediaElement();pugPlayer.destroy();pugPlayer=null}pugPlayer=mpegts.createPlayer(config);pugPlayer.attachMediaElement(video);pugPlayer.load();pugPlayer.on(mpegts.Events.METADATA_ARRIVED,function(res){videoHandler.loadedMetaData()});pugPlayer.on(mpegts.Events.ERROR,function(errorType,errorDetail,errorInfo){CT.error={code:errorInfo['code'],message:errorInfo['msg']};eventTarget('error',CT.error);showError()})}})},canPlay=function(vStr,num){var vTypeArr=[{vidType:'video/ogg',codType:'theora, vorbis'},{vidType:'video/mp4',codType:'avc1.4D401E, mp4a.40.2'},{vidType:'video/mp4',codType:'avc1'},{vidType:'video/mp4',codType:'hevc'},{vidType:'video/webm',codType:'vp8.0, vorbis'},{vidType:'video/webm',codType:'vp9'},{vidType:'',codType:'application/x-mpegURL'},{vidType:'',codType:'application/vnd.apple.mpegurl'}];var vType={ogg:vTypeArr[0],mp4:[vTypeArr[1],vTypeArr[2],vTypeArr[3]],webm:[vTypeArr[4],vTypeArr[5]],m3u8:[vTypeArr[6],vTypeArr[7]]};var arr=[];var k='';var supportType=function(obj){var vType=obj['vidType'];var str='';if(vType){str=vType+'; codecs="'+obj['codType']+'"'}else{str=obj['codType']}var sup=video.canPlayType(str);if(sup==''){sup='no'}return sup};var getExtension=function(filepath){return filepath.replace(/.+\./,'')};if(isUndefined(num)){if(valType(vStr)=='string'){if(vars['type']){for(k in vTypeArr){if(vTypeArr[k]['vidType']==vars['type']){arr.push(vTypeArr[k])}}}else{if(getExtension(vStr)&&getExtension(vStr)in vType){var temp=vType[getExtension(vStr)];if(valType(temp)=='array'){for(var i=0;i<temp.length;i++){arr.push(temp[i])}}else{arr.push(temp)}}}}}else{arr.push(vTypeArr[num])}var is=false;if(arr.length>0){for(var i=0;i<arr.length;i++){if(supportType(arr[i])!='no'){is=true}}}if(!is&&!vars['plug']){CT.error={code:6,message:language['error']['videoTypeError']};eventTarget('error',CT.error);showError()}return is},loadFace=function(){C['loading']=createlDiv('ck-loading');CM.append(C['loading']);C['bar']=createlDiv('ck-bar');CM.append(C['bar']);C['rightBar']=createlDiv('ck-right-bar ck-right-bar-hide');CM.append(C['rightBar']);C['topBar']=createlDiv('ck-top-bar ck-top-bar-hide');CM.append(C['topBar']);C['bar']['pbox']=createlDiv('ck-bar-progress');C['bar']['pbox']['bg']=createlDiv('ck-bar-progress-bg');C['bar']['pbox']['load']=createlDiv('ck-bar-progress-load');C['bar']['pbox']['bg'].append(C['bar']['pbox']['load']);C['bar']['pbox']['play']=createlDiv('ck-bar-progress-play');C['bar']['pbox']['bg'].append(C['bar']['pbox']['play']);C['bar']['pbox']['mouseLine']=createlDiv('ck-bar-progress-mouseline');C['bar']['pbox']['bg'].append(C['bar']['pbox']['mouseLine']);C['bar']['pbox']['slider']=createlDiv('ck-bar-progress-slider');C['bar']['pbox'].append(C['bar']['pbox']['bg']).append(C['bar']['pbox']['slider']);C['bar'].append(C['bar']['pbox']);C['bar'].mouseout(barMouseOut).mouseover(barMouseOver);if(valType(vars['live'])=='number'){C['bar']['pbox']['play'].css({'width':'100%'});C['bar']['pbox']['slider'].css({'left':(100-C['bar']['pbox']['slider'].getWidth()*100/C['bar']['pbox']['bg'].getWidth())+'%'})}C['bar']['playAndPause']=createlDiv('ck-bar-playandpause');C['bar'].append(C['bar']['playAndPause']);C['bar']['playAndPause']['play']=createlButton('ck-bar-btn ck-btn-play');C['bar']['playAndPause']['play'].click(player.play);C['bar']['playAndPause']['play'].mouseover(function(){tip(this,language['play'])});C['bar']['playAndPause'].append(C['bar']['playAndPause']['play']);C['bar']['playAndPause']['pause']=createlButton('ck-bar-btn ck-btn-pause');C['bar']['playAndPause']['pause'].click(player.pause);C['bar']['playAndPause']['pause'].mouseover(function(){tip(this,language['pause'])});C['bar']['playAndPause'].append(C['bar']['playAndPause']['pause']);C['bar']['playAndPause']['pause'].hide();C['bar']['playAndPause']['refresh']=createlButton('ck-bar-btn ck-btn-refresh');C['bar']['playAndPause']['refresh'].click(player.play);C['bar']['playAndPause']['refresh'].mouseover(function(){tip(this,language['refresh'])});C['bar']['playAndPause'].append(C['bar']['playAndPause']['refresh']);C['bar']['nextEpisode']=createlDiv('ck-bar-btn ck-bar-next');C['bar'].append(C['bar']['nextEpisode']);C['bar']['nextEpisode'].click(nextClick).mouseover(showNextEpisode).mouseout(function(){if(!isUndefined(C['next'])){player.closeLayer(C['next'])}});if(isUndefined(vars['next'])){C['bar']['nextEpisode'].hide()}var timeDefault=formatSeconds(player.time())+'/'+formatSeconds(duration);if(vars['live']){timeDefault=language['live']}C['time']=createlDiv('ck-bar-time',timeDefault);C['bar'].append(C['time']);C['bar']['backLive']=createlButton('ck-btn-backlive',language['backLive']);C['bar'].append(C['bar']['backLive']);C['bar']['backLive'].mouseover(function(){tip(this,language['backLive'])}).click(function(){eventTarget('backLive')});C['bar']['backLive'].hide();C['bar']['fullAndExit']=createlDiv('ck-bar-fullandexit');C['bar'].append(C['bar']['fullAndExit']);C['bar']['fullAndExit']['full']=createlButton('ck-bar-btn ck-btn-full');C['bar']['fullAndExit']['full'].click(player.fullOrExit);C['bar']['fullAndExit']['full'].mouseover(function(){tip(this,language['full'])});C['bar']['fullAndExit'].append(C['bar']['fullAndExit']['full']);C['bar']['fullAndExit']['exitFull']=createlButton('ck-bar-btn ck-btn-exitfull');C['bar']['fullAndExit']['exitFull'].click(player.fullOrExit);C['bar']['fullAndExit']['exitFull'].mouseover(function(){tip(this,language['exitFull'])});C['bar']['fullAndExit'].append(C['bar']['fullAndExit']['exitFull']);C['bar']['webFullAndExit']=createlDiv('ck-bar-webfullandexit');C['bar'].append(C['bar']['webFullAndExit']);C['bar']['webFullAndExit']['webFull']=createlButton('ck-bar-btn ck-btn-webfull');C['bar']['webFullAndExit']['webFull'].click(player.webFull);C['bar']['webFullAndExit']['webFull'].mouseover(function(){tip(this,language['webFull'])});C['bar']['webFullAndExit'].append(C['bar']['webFullAndExit']['webFull']);C['bar']['webFullAndExit']['exitWebFull']=createlButton('ck-bar-btn ck-btn-exitwebfull');C['bar']['webFullAndExit']['exitWebFull'].click(player.exitWebFull);C['bar']['webFullAndExit']['exitWebFull'].mouseover(function(){tip(this,language['exitWebFull'])});C['bar']['webFullAndExit'].append(C['bar']['webFullAndExit']['exitWebFull']);if(!vars['webFull']){C['bar']['webFullAndExit'].hide()}C['bar']['theatreAndExit']=createlDiv('ck-bar-theatreandexit');C['bar'].append(C['bar']['theatreAndExit']);C['bar']['theatreAndExit']['theatre']=createlButton('ck-bar-btn ck-btn-theatre');C['bar']['theatreAndExit']['theatre'].click(player.theatre);C['bar']['theatreAndExit']['theatre'].mouseover(function(){tip(this,language['theatre'])});C['bar']['theatreAndExit'].append(C['bar']['theatreAndExit']['theatre']);C['bar']['theatreAndExit']['exitTheatre']=createlButton('ck-bar-btn ck-btn-exittheatre');C['bar']['theatreAndExit']['exitTheatre'].click(player.exitTheatre);C['bar']['theatreAndExit']['exitTheatre'].mouseover(function(){tip(this,language['exitTheatre'])});C['bar']['theatreAndExit'].append(C['bar']['theatreAndExit']['exitTheatre']);if(!vars['theatre']){C['bar']['theatreAndExit'].hide()}C['bar']['vbox']=createlDiv('ck-bar-volumebox');C['bar'].append(C['bar']['vbox']);C['bar']['vbox']['muted']=createlButton('ck-bar-btn ck-btn-muted');C['bar']['vbox']['muted'].click(player.muted);C['bar']['vbox'].append(C['bar']['vbox']['muted']);C['bar']['vbox']['exitMuted']=createlButton('ck-bar-btn ck-btn-exitmuted');C['bar']['vbox']['exitMuted'].click(player.exitMuted);C['bar']['vbox'].append(C['bar']['vbox']['exitMuted']);C['bar']['vbox']['volume']=createlDiv('ck-bar-volume');C['bar']['vbox'].append(C['bar']['vbox']['volume']);C['bar']['vbox']['volume']['box']=createlDiv('ck-bar-volumex');C['bar']['vbox']['volume'].append(C['bar']['vbox']['volume']['box']);C['bar']['vbox']['volume']['txt']=createlDiv('ck-bar-volume-txt','0');C['bar']['vbox']['volume']['box'].append(C['bar']['vbox']['volume']['txt']);C['bar']['vbox']['volume']['bg']=createlDiv('ck-bar-volume-bg');C['bar']['vbox']['volume']['box'].append(C['bar']['vbox']['volume']['bg']);C['bar']['vbox']['volume']['pp']=createlDiv('ck-bar-volume-pp');C['bar']['vbox']['volume']['bg'].append(C['bar']['vbox']['volume']['pp']);C['bar']['vbox']['volume']['slider']=createlDiv('ck-bar-volume-slider');C['bar']['vbox']['volume']['box'].append(C['bar']['vbox']['volume']['slider']);C['bar']['vbox']['mouseDown']=false;C['bar']['vbox']['volume'].show();changeVolumeSlider(vars['volume']);volumeDragY();C['bar']['vbox']['volume'].attr('style','');C['bar']['vbox'].mouseover(function(){changeVolumeSlider(video.muted?0:video.volume)});C['bar']['playbackrate']=createlDiv('ck-bar-playbackrate-box');C['bar'].append(C['bar']['playbackrate']);C['bar']['playbackrate']['button']=createlDiv('ck-bar-playbackrate',language['playbackrate']);C['bar']['playbackrate'].append(C['bar']['playbackrate']['button']);C['bar']['playbackrate']['bgbox']=createlDiv('ck-bar-playbackrate-bg-box ck-list-bg-box');C['bar']['playbackrate'].append(C['bar']['playbackrate']['bgbox']);checkPlaybackrate();C['bar']['track']=createlDiv('ck-bar-track-box');C['bar'].append(C['bar']['track']);C['bar']['track']['button']=createlDiv('ck-bar-track',language['track']);C['bar']['track'].append(C['bar']['track']['button']);C['bar']['track']['bgbox']=createlDiv('ck-bar-track-bg-box ck-list-bg-box');C['bar']['track'].append(C['bar']['track']['bgbox']);C['bar']['track'].hide();C['bar']['definition']=createlDiv('ck-bar-definition-box');C['bar'].append(C['bar']['definition']);C['bar']['definition']['button']=createlDiv('ck-bar-definition',language['definition']);C['bar']['definition'].append(C['bar']['definition']['button']);C['bar']['definition']['bgbox']=createlDiv('ck-bar-definition-bg-box ck-list-bg-box');C['bar']['definition'].append(C['bar']['definition']['bgbox']);C['bar']['definition'].hide();C['rightBar']['screenshot']=createlButton('ck-bar-btn ck-btn-screenshot');C['rightBar'].append(C['rightBar']['screenshot']);C['rightBar']['screenshot'].mouseover(function(){tip(this,language['screenshot'],null,'left')});C['rightBar']['screenshot'].click(player.screenshot);C['rightBar']['smallwindows']=createlDiv('ck-right-bar-smallwindows');C['rightBar'].append(C['rightBar']['smallwindows']);C['rightBar']['smallwindows']['open']=createlButton('ck-bar-btn ck-btn-smallwindows-open');C['rightBar']['smallwindows']['open'].click(function(){tip(this,language['smallwindowsClose'],null,'left');player.smallWindows(false)});C['rightBar']['smallwindows']['open'].mouseover(function(){tip(this,language['smallwindowsOpen'],null,'left')});C['rightBar']['smallwindows'].append(C['rightBar']['smallwindows']['open']);C['rightBar']['smallwindows']['close']=createlButton('ck-bar-btn ck-btn-smallwindows-close');C['rightBar']['smallwindows']['close'].click(function(){tip(this,language['smallwindowsOpen'],null,'left');player.smallWindows(true)});C['rightBar']['smallwindows']['close'].mouseover(function(){tip(this,language['smallwindowsClose'],null,'left')});C['rightBar']['smallwindows'].append(C['rightBar']['smallwindows']['close']);C['rightBar']['loop']=createlDiv('ck-right-bar-loop');C['rightBar'].append(C['rightBar']['loop']);C['rightBar']['loop']['open']=createlButton('ck-bar-btn ck-btn-loop-open');C['rightBar']['loop']['open'].click(function(){tip(this,language['loopClose'],null,'left');player.loop(false)});C['rightBar']['loop']['open'].mouseover(function(){tip(this,language['loopOpen'],null,'left')});C['rightBar']['loop'].append(C['rightBar']['loop']['open']);C['rightBar']['loop']['close']=createlButton('ck-bar-btn ck-btn-loop-close');C['rightBar']['loop']['close'].click(function(){tip(this,language['loopOpen'],null,'left');player.loop(true)});C['rightBar']['loop']['close'].mouseover(function(){tip(this,language['loopClose'],null,'left')});C['rightBar']['loop'].append(C['rightBar']['loop']['close']);C['rightBar'].mouseout(rightBarMouseOut).mouseover(rightBarMouseOver);C['screenshot']=createlDiv('ck-screenshot');CM.append(C['screenshot']);C['screenshot']['img']=createlDiv('ck-screenshot-img');C['screenshot'].append(C['screenshot']['img']);C['screenshot']['bar']=createlDiv('ck-screenshot-bar');C['screenshot'].append(C['screenshot']['bar']);C['screenshot']['bar']['down']=createlA(language['down'],'','ck-screenshot-btn ck-screenshot-down');C['screenshot']['bar'].append(C['screenshot']['bar']['down']);C['screenshot']['bar']['close']=createlButton('ck-screenshot-btn ck-screenshot-close',language['close']);C['screenshot']['bar']['close'].click(player.closeScreenshot);C['screenshot']['bar'].append(C['screenshot']['bar']['close']);C['topBar']['zoomEle']=createlDiv('ck-top-bar-zoom');C['topBar']['zoomEle']['zoom50']=createlDiv('ck-top-bar-zoom-container');C['topBar']['zoomEle'].append(C['topBar']['zoomEle']['zoom50']);C['topBar']['zoomEle']['zoom50']['left']=createlDiv('ck-top-bar-zoom-left');C['topBar']['zoomEle']['zoom50'].append(C['topBar']['zoomEle']['zoom50']['left']);C['topBar']['zoomEle']['zoom50']['left']['button']=createlDiv('ck-top-bar-zoom-button-50');C['topBar']['zoomEle']['zoom50']['left'].append(C['topBar']['zoomEle']['zoom50']['left']['button']);C['topBar']['zoomEle']['zoom50']['right']=createlDiv('ck-top-bar-zoom-right',language['p50']);C['topBar']['zoomEle']['zoom50'].append(C['topBar']['zoomEle']['zoom50']['right']);C['topBar']['zoomEle']['zoom50'].click(function(){player.zoom(50)});C['topBar']['zoomEle']['zoom75']=createlDiv('ck-top-bar-zoom-container');C['topBar']['zoomEle'].append(C['topBar']['zoomEle']['zoom75']);C['topBar']['zoomEle']['zoom75']['left']=createlDiv('ck-top-bar-zoom-left');C['topBar']['zoomEle']['zoom75'].append(C['topBar']['zoomEle']['zoom75']['left']);C['topBar']['zoomEle']['zoom75']['left']['button']=createlDiv('ck-top-bar-zoom-button-75');C['topBar']['zoomEle']['zoom75']['left'].append(C['topBar']['zoomEle']['zoom75']['left']['button']);C['topBar']['zoomEle']['zoom75']['right']=createlDiv('ck-top-bar-zoom-right',language['p75']);C['topBar']['zoomEle']['zoom75'].append(C['topBar']['zoomEle']['zoom75']['right']);C['topBar']['zoomEle']['zoom75'].click(function(){player.zoom(75)});C['topBar']['zoomEle']['zoom100']=createlDiv('ck-top-bar-zoom-container');C['topBar']['zoomEle'].append(C['topBar']['zoomEle']['zoom100']);C['topBar']['zoomEle']['zoom100']['left']=createlDiv('ck-top-bar-zoom-left');C['topBar']['zoomEle']['zoom100'].append(C['topBar']['zoomEle']['zoom100']['left']);C['topBar']['zoomEle']['zoom100']['left']['button']=createlDiv('ck-top-bar-zoom-button-100');C['topBar']['zoomEle']['zoom100']['left'].append(C['topBar']['zoomEle']['zoom100']['left']['button']);C['topBar']['zoomEle']['zoom100']['right']=createlDiv('ck-top-bar-zoom-right',language['p100']);C['topBar']['zoomEle']['zoom100'].append(C['topBar']['zoomEle']['zoom100']['right']);C['topBar']['zoomEle']['zoom100'].click(function(){player.zoom(100)});C['topBar'].append(C['topBar']['zoomEle']);C['topBar']['titleEle']=createlDiv('ck-top-bar-title',vars['title']);C['topBar'].append(C['topBar']['titleEle']);C['topBar']['timeEle']=createlDiv('ck-top-bar-time');C['topBar'].append(C['topBar']['timeEle']);C['centerPlay']=createlDiv('ck-center-play');C['centerPlay'].click(player.play);CM.append(C['centerPlay']);C['buffer']=createlDiv('ck-buffer');CM.append(C['buffer']);C['message']=createlDiv('ck-message');CM.append(C['message']);C['tip']=createlDiv('ck-tip');CM.append(C['tip']);C['tip']['content']=createlDiv('ck-content ck-content-float-auto');C['tip'].append(C['tip']['content']);C['tip']['triangle']=createlDiv('ck-triangle ck-triangle-auto');C['tip'].append(C['tip']['triangle']);tip(video,'ckplayer');C['tip'].minHeight=C['tip'].getHeight();tip();C['ad']=createlDiv('ck-yytf');CM.append(C['ad']);C['ad']['link']=createlDiv('ck-yytf-front-link');C['ad'].append(C['ad']['link']);C['ad']['link'].click(frontVideoClickHandler);C['ad']['picture']=createlDiv('ck-yytf-front-picture');C['ad'].append(C['ad']['picture']);C['ad']['top']=createlDiv('ck-yytf-top');C['ad'].append(C['ad']['top']);C['ad']['top']['countDown']=createlDiv('ck-yytf-countdown');C['ad']['top'].append(C['ad']['top']['countDown']);C['ad']['top']['closeTime']=createlDiv('ck-yytf-closetime');C['ad']['top'].append(C['ad']['top']['closeTime']);C['ad']['top']['closeAd']=createlDiv('ck-yytf-closead',language['closeAd']);C['ad']['top'].append(C['ad']['top']['closeAd']);C['ad']['top']['closeAd'].click(closeFrontAd);C['ad']['bottom']=createlDiv('ck-yytf-bottom');C['ad'].append(C['ad']['bottom']);C['ad']['bottom']['fullAndExit']=createlDiv('ck-yytf-fullandexit');C['ad']['bottom'].append(C['ad']['bottom']['fullAndExit']);C['ad']['bottom']['fullAndExit']['full']=createlButton('ck-yytf-btn ck-yytf-fullandexit-full');C['ad']['bottom']['fullAndExit']['full'].click(player.full);C['ad']['bottom']['fullAndExit'].append(C['ad']['bottom']['fullAndExit']['full']);C['ad']['bottom']['fullAndExit']['exitFull']=createlButton('ck-yytf-btn ck-yytf-fullandexit-exitfull');C['ad']['bottom']['fullAndExit'].append(C['ad']['bottom']['fullAndExit']['exitFull']);C['ad']['bottom']['fullAndExit']['exitFull'].click(player.exitFull);C['ad']['bottom']['mutedAndExit']=createlDiv('ck-yytf-mutedandexit');C['ad']['bottom'].append(C['ad']['bottom']['mutedAndExit']);C['ad']['bottom']['mutedAndExit']['muted']=createlButton('ck-yytf-btn ck-yytf-mutedandexit-muted');C['ad']['bottom']['mutedAndExit'].append(C['ad']['bottom']['mutedAndExit']['muted']);C['ad']['bottom']['mutedAndExit']['muted'].click(player.muted);C['ad']['bottom']['mutedAndExit']['exitMuted']=createlButton('ck-yytf-btn ck-yytf-mutedandexit-exitmuted');C['ad']['bottom']['mutedAndExit'].append(C['ad']['bottom']['mutedAndExit']['exitMuted']);C['ad']['bottom']['mutedAndExit']['exitMuted'].click(player.exitMuted);C['ad']['bottom']['details']=createlDiv('ck-yytf-details',language['details']);C['ad']['bottom'].append(C['ad']['bottom']['details']);C['ad'].hide();C['adPause']=createlDiv('ck-pause-yytf');CM.append(C['adPause']);C['about']=createlDiv('ck-about');CM.append(C['about']);C['about']['bar']=createlDiv('ck-about-bar');C['about'].append(C['about']['bar']);C['about']['bar']['copy']=createlButton('ck-bar-btn ck-btn-about-copy');C['about']['bar'].append(C['about']['bar']['copy']);C['about']['bar']['copy'].click(aboutCopy);C['about']['bar']['copy'].mouseover(function(){tip(this,language['copy'],null,'left')});C['about']['bar']['close']=createlButton('ck-bar-btn ck-btn-about-close');C['about']['bar']['close'].click(aboutHide);C['about']['bar']['close'].mouseover(function(){tip(this,language['close'],null,'left')});C['about']['bar'].append(C['about']['bar']['close']);C['tempTime']=createlDiv('ck-tempTime');CM.append(C['tempTime']);C['bar']['playAndPause']['refresh'].hide();if(vars['controls']){player.bar(false);player.rightBar(false);C['loading'].hide();C['centerPlay'].hide()}else{loadLogo();loadAbout();loadMenu()}if(app=='iphone'){C['loading'].hide()}changeTopTime();CK.mouseout(function(){if(!paused){hideBar()}}).mouseover(function(){if(!C['bar'].hasClass('ck-bar-out')){C['bar'].removeClass('ck-bar-out');CM.removeClass('ck-nocursor')}if(C['rightBar'].css('display')=='block'){C['rightBar'].removeClass('ck-right-bar-hide')}if(C['topBar'].css('display')=='block'){C['topBar'].removeClass('ck-top-bar-hide')}}).mousemove(function(){if(C['bar'].hasClass('ck-bar-out')){C['bar'].removeClass('ck-bar-out');eventTarget('mouseActive',true);CM.removeClass('ck-nocursor');hideBar()}if(C['rightBar'].css('display')=='block'){C['rightBar'].removeClass('ck-right-bar-hide')}if(C['topBar'].css('display')=='block'){C['topBar'].removeClass('ck-top-bar-hide')}})},addAllListener=function(){video.addListener('stalled',videoHandler.stalled);video.addListener('suspend',videoHandler.suspend);video.addListener('loadeddata',videoHandler.loadedData);video.addListener('loadstart',videoHandler.loadStart);video.addListener('loadedmetadata',videoHandler.loadedMetaData);video.addListener('canplay',videoHandler.canPlay);video.addListener('timeupdate',videoHandler.timeUpDate);video.addListener('seeking',videoHandler.seeking);video.addListener('seeked',videoHandler.seeked);video.addListener('waiting',videoHandler.waiting);video.addListener('play',videoHandler.play);video.addListener('pause',videoHandler.pause);video.addListener('volumechange',videoHandler.volumeChange);video.addListener('ended',videoHandler.ended);video.addListener('error',videoHandler.error);if(!isUndefined(video.emptied)){video.addListener('emptied',videoHandler.emptied)}CV.singleClick(function(){if(!isDrag){player.playOrPause()}else{isDrag=false}});CM.doubleClick(player.fullOrExit);$(document).addListener('keydown',videoHandler.keydown);addListener(window,'resize',videoHandler.resize);if(!isUndefined(vars['smallWindows'])){if(valType(vars['smallWindows'])=='boolean'&&vars['smallWindows']){addListener(window,'scroll',windowScroll)}}CT.mouseWheel(videoHandler.mouseWheel)},eventTarget=function(name,obj){try{if(EventTarget!=null){if(isUndefined(obj)){obj=null}newEvent.dispatchEvent(name,obj)}else{EventTarget=function(){this.listeners={}};EventTarget.prototype.listeners=null;EventTarget.prototype.addEventListener=function(type,callback){if(!(type in this.listeners)){this.listeners[type]=[]}this.listeners[type].push(callback);eventTargetList=this.listeners};EventTarget.prototype.removeEventListener=function(type,callback){if(!(type in this.listeners)){return}var stack=this.listeners[type];for(var i=0,l=stack.length;i<l;i++){if(stack[i]===callback){stack.splice(i,1);return this.removeEventListener(type,callback)}}eventTargetList=stack};EventTarget.prototype.dispatchEvent=function(type,obj){if(!(type in this.listeners)){return}var stack=this.listeners[type];for(var i=0,l=stack.length;i<l;i++){stack[i].call(this,obj)}};newEvent=new EventTarget()}}catch(event){console.error(event)}},changeCookie=function(time){var arr=[];var cStr=cookie(ckplayerCookie);var i=0,y=0;var cTime=Math.floor(Date.now()*0.001);time=Math.floor(time*100);time=time*0.01;if(!cookieTime){cookieTime=365*24}if(!cStr){arr.push([cookieName,time,cTime+cookieTime*3600])}else{arr=stringToArray(cStr);var have=false;var tempArr=[[cookieName,time,cTime+cookieTime*3600]];for(i=0;i<arr.length;i++){if(arr[i][2]>cTime&&arr[i][0]!=cookieName&&y<19){tempArr.push(arr[i]);y++}}arr=tempArr}if(arr.length>0){cookie(ckplayerCookie,'delete',vars['domain'],vars['cookiePath']);cookie(ckplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath'])}cookieArray=arr},loadTrack=function(){if(isUndefined(video.textTracks)){return}var i=0;if(!isUndefined(vars['track'])&&valType(vars['track'])=='array'&&!video.find('track')){var track='';var arr=vars['track'];C['bar']['track'].show();for(i=0;i<arr.length;i++){var def='';if(!def&&!isUndefined(arr[i]['default'])&&arr[i]['default']){def=' default'}track+='<track src="'+arr[i]['src']+'" srclang="'+arr[i]['srclang']+'" kind="'+arr[i]['kind']+'" label="'+arr[i]['label']+'"'+def+'>'}if(video){var html=video.htm()+track;video.htm(html)}if(video.find('track')&&!loadedTrack){loadedTrack=true;checkTrack()}}},loadedMetaData=function(){eventTarget('loadedMetaData',{width:CK.getWidth(),height:CK.getHeight(),videoWidth:CT.videoWidth,videoHeight:CT.videoHeight,duration:duration,volume:CT.volume});eventTarget('duration',duration);if('error'in C){C['error'].hide()}replaceInformation('videoWidth',CT.videoWidth);replaceInformation('videoHeight',CT.videoHeight);replaceInformation('volume',parseInt(CT.volume*100));replaceInformation('duration',parseInt(duration));documentHidden(function(state){if(vars['documentFocusPause']){if(state=='show'){if(!focusPause&&paused){player.play()}}else{focusPause=paused;player.pause()}}})};var videoHandler={loadStart:function(){if(!vars['controls']&&app!='iphone'){C['loading'].show()}C['centerPlay'].hide();eventTarget('loadstart')},canPlay:function(){C['loading'].hide();eventTarget('canplay')},loadedData:function(){eventTarget('loadeddata')},loadedMetaData:function(){duration=this.duration;if(!isUndefined(this.duration)&&vars['duration']){duration=vars['duration']}if(!vars['live']){C['time'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration));C['tempTime'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration))}C['loading'].hide();if(vars['poster']){video.attr('poster',vars['poster'])}if(!vars['autoplay']&&!vars['controls']){C['centerPlay'].show();C['buffer'].hide()}CT.duration=duration;CT.videoWidth=this.videoWidth;CT.videoHeight=this.videoHeight;CT.volume=this.volume;if(CT.videoWidth||CT.videoHeight||duration){loadedMetaData()}var len=0;if(!isUndefined(this.buffered)){len=this.buffered.length}if(len>0){changeLoad()}if(!vars['live']){changePreview(vars['preview'])}else{changePreview()}if(!isUndefined(vars['prompt'])&&valType(vars['prompt'])=='array'&&!vars['live']){changePrompt()}else{deletePrompt()}if(isChangeDef){checkDefinition();isChangeDef=false}pSliderMouseDown=false;loadedmetadataNum++;if(!isUndefined(ad)&&!isUndefined(ad['frontPlay'])&&ad['frontPlay']&&loadedmetadataNum>1){player.play();calculationAdFrontTime(duration)}if(!isUndefined(ad)&&!isUndefined(ad['frontPlay'])&&!ad['frontPlay']){player.volume(vars['volume']);player.play()}if(!vars['autoplay']&&loadMeta){loadMeta=false;player.pause();setTimeout(player.pause,300)}},timeUpDate:function(){if(!waited){waited=true;C['buffer'].hide();eventTarget('buffer','end')}var len=this.buffered.length;if(len>0){changeLoad()}if(!duration&&this.duration){duration=this.duration;CT.duration=duration;CT.videoWidth=this.videoWidth;CT.videoHeight=this.videoHeight;if(CT.videoWidth||CT.videoHeight||duration){loadedMetaData()}}oldTime=playTime;playTime=this.currentTime;if(maxSeeTime<oldTime){maxSeeTime=oldTime}changeProgress(playTime);eventTarget('time',playTime);if(!vars['live']){C['time'].htm(formatSeconds(playTime)+'/'+formatSeconds(duration));C['tempTime'].htm(formatSeconds(playTime)+'/'+formatSeconds(duration))}if(!isUndefined(ad)&&!isUndefined(ad['frontPlay'])&&ad['frontPlay']&&loadedmetadataNum>1){calculationAdFrontTime(duration-playTime)}if(!isUndefined(C['error'])&&C['error'].css('display')=='block'){C['error'].hide()}if(cookieName){changeCookie(playTime)}replaceInformation('audioDecodedByteCount',this.webkitAudioDecodedByteCount||this.audioDecodedByteCount||0);replaceInformation('videoDecodedByteCount',this.webkitVideoDecodedByteCount||this.videoDecodedByteCount||0)},ended:function(){if(!isUndefined(ad)&&!isUndefined(ad['frontPlay'])&&ad['frontPlay']){adFrontEnded()}else{C['bar']['playAndPause']['pause'].hide();C['bar']['playAndPause']['play'].hide();C['bar']['playAndPause']['refresh'].show();eventTarget('ended');showEnded();message()}},error:function(event){if(!isUndefined(event.type)){var errorInfo=this.error;var errorBak=function(){var code=12;var msg=language['error']['loadingFailed'];if(!isUndefined(errorInfo)){if(!isUndefined(errorInfo.code)){code=errorInfo.code}if(!isUndefined(errorInfo.message)){msg=errorInfo.message}CT.error={code:code,message:msg};showError()}else{CT.error={code:code,message:msg};if(event.target.attr('src')){showError()}}eventTarget('error',CT.error)};if(event.type=='error'){try{if(video.currentSrc){ajax({url:video.currentSrc,error:function(info){if(info&&valType(info)=='object'&&'code'in info&&info['code']){CT.error=info;eventTarget('error',CT.error);showError()}else{errorBak()}},success:function(data){if(!data){errorBak()}}})}else{errorBak()}}catch(event){errorBak()}}}},stalled:function(){eventTarget('stalled');CT.error={code:13,message:'load:stalled'};eventTarget('error',CT.error)},suspend:function(){eventTarget('suspend')},emptied:function(){eventTarget('emptied');CT.error={code:7,message:language['error']['emptied']};eventTarget('error',CT.error)},seeked:function(){if(paused){player.play()}pSliderMouseDown=false;eventTarget('seek',{time:this.currentTime,state:'seeked'});eventTarget('seeked')},seeking:function(){if(paused){player.play()}var seekingTime=this.currentTime;if(firstSeekTime==-1){firstSeekTime=seekingTime}switch(vars['timeScheduleAdjust']){case 0:if(oldTime!=seekingTime){waitingMessage=false;player.seek(oldTime);message(language['timeScheduleAdjust']['prohibit']);return}break;case 2:if(seekingTime<oldTime){waitingMessage=false;player.seek(oldTime);message(language['timeScheduleAdjust']['prohibitBackOff']);return}break;case 3:if(seekingTime>oldTime){waitingMessage=false;player.seek(oldTime);message(language['timeScheduleAdjust']['prohibitForward']);return}break;case 4:if(seekingTime<firstSeekTime){waitingMessage=false;player.seek(firstSeekTime);message(language['timeScheduleAdjust']['prohibitLookBack']);return}break;case 5:if(seekingTime>maxSeeTime){waitingMessage=false;player.seek(maxSeeTime);message(language['timeScheduleAdjust']['prohibitForwardNotViewed']);return}break}eventTarget('seek',{time:seekingTime,state:'seeking'});eventTarget('seeking');if(!vars['live']){C['time'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration));C['tempTime'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration))}},waiting:function(){waited=false;eventTarget('buffer','start');C['centerPlay'].hide();if(!vars['controls']){C['buffer'].show()}if(!waitingMessage){waitingMessage=true}else{message(language['waiting'])}},play:function(){paused=false;C['bar']['playAndPause']['play'].hide();C['bar']['playAndPause']['pause'].show();C['bar']['playAndPause']['refresh'].hide();C['centerPlay'].hide();if(playType=='button'){C['bar']['pbox'].removeClass('ck-bar-progress-out')}else{C['bar']['pbox'].addClass('ck-bar-progress-out')}if(recoveryVolume){recoveryVolume=false;player.exitMuted()}hideBar();closePauseAd();playType='';if(!isUndefined(C['ended'])){player.closeLayer(C['ended'])}if('error'in C){C['error'].hide()}eventTarget('play');if(!isUndefined(ad)){if(!isUndefined(ad['front'])){if(isUndefined(ad['frontPlay'])){ad['frontPlayI']=0;ad['frontPlay']=true;player.pause();adFrontPlay();return}}}if(seekTime&&(isUndefined(vars['live'])||(!isUndefined(vars['live'])&&valType(vars['live'])=='boolean'&&!vars['live']))&&seekTime<parseInt(duration*100)*0.01){player.seek(seekTime);seekTime=0}},pause:function(){paused=true;if(isUndefined(ad)||isUndefined(ad['frontPlay'])||(!isUndefined(ad['frontPlay'])&&!ad['frontPlay'])){if(!isUndefined(ad)&&!isUndefined(ad['pause'])){if(isUndefined(ad['pausePlayI'])){ad['pausePlayI']=0}adPausePlay()}else{if(!vars['controls']){C['centerPlay'].show();C['buffer'].hide()}}}else{if(!vars['controls']){C['centerPlay'].show();C['buffer'].hide()}}C['bar']['playAndPause']['pause'].hide();C['bar']['playAndPause']['play'].show();C['bar']['playAndPause']['refresh'].hide();C['bar']['pbox'].removeClass('ck-bar-progress-out');checkProgressSlider();eventTarget('pause');C['bar'].removeClass('ck-bar-out');CM.removeClass('ck-nocursor')},volumeChange:function(){if(this.volume==0&&!mutedState){this.muted=true}if(this.volume>0&&mutedState){this.muted=false}if(mutedState!=this.muted){mutedState=this.muted;changeMuted(this.muted);CT.muted=this.muted;eventTarget('muted',CT.muted)}CT.volume=this.volume;eventTarget('volume',this.volume);if(!isUndefined(C['bar']['vbox'])){var vol=parseInt(this.volume*100);C['bar']['vbox']['volume']['txt'].htm(vol);if(!C['bar']['vbox']['mouseDown']){changeVolumeSlider(this.muted?0:this.volume)}if(!this.muted){message(language['volume']+vol+'%')}}replaceInformation('volume',parseInt(this.volume*100))},resize:function(){var fullState=document.fullScreen||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement;if(fullState){C['bar']['fullAndExit']['exitFull'].show();C['bar']['fullAndExit']['full'].hide();C['ad']['bottom']['fullAndExit']['exitFull'].show();C['ad']['bottom']['fullAndExit']['full'].hide();if(!CM.hasClass('ck-main-full')){CM.addClass('ck-main-full')}message(language['full']);C['bar']['webFullAndExit'].hide();C['bar']['theatreAndExit'].hide();if(!isUndefined(C['menu'])){CM.append(C['menu'])}}else{fullState=false;C['bar']['fullAndExit']['full'].show();C['bar']['fullAndExit']['exitFull'].hide();C['ad']['bottom']['fullAndExit']['full'].show();C['ad']['bottom']['fullAndExit']['exitFull'].hide();if(CM.hasClass('ck-main-full')){CM.removeClass('ck-main-full')}if(!isUndefined(vars['webFull'])&&vars['webFull']){C['bar']['webFullAndExit'].show()}if(!isUndefined(vars['theatre'])&&!CT.webFull){C['bar']['theatreAndExit'].show()}if(!isUndefined(C['menu'])){$('body').append(C['menu'])}if(CV.css('width')!=CM.css('width')){player.zoom(100)}}if(CT.full!=fullState){CT.full=fullState;eventTarget('full',fullState)}checkVideoRotate();changeProgress(player.time())},keydown:function(event){event=window.event||event;var keycode=event.keyCode||event.which;var v=player.volume();var pre=function(){if(event.preventDefault){event.preventDefault()}else{event.returnValue=false}};switch(keycode){case 32:pre();player.playOrPause();break;case 37:player.fastBack();break;case 39:player.fastNext();break;case 38:if(valType(vars['keyVolume'])=='number'&&(vars['keyVolume']==1||(vars['keyVolume']==2&&CT.full))){pre();player.volume(v+.1<1?v+=.1:1)}break;case 40:if(valType(vars['keyVolume'])=='number'&&(vars['keyVolume']==1||(vars['keyVolume']==2&&CT.full))){pre();player.volume(v-.1>0?v-=.1:0)}break;default:break}},mouseWheel:function(event){if(valType(vars['mouseWheelVolume'])=='number'&&(vars['mouseWheelVolume']==1||(vars['mouseWheelVolume']==2&&CT.full))){event=window.event||event;var v=player.volume();if(event.preventDefault){event.preventDefault()}else{event.returnValue=false}if(event.wheelDelta){if(event.wheelDelta>0){player.volume(v+.1<1?v+=.1:1)}if(event.wheelDelta<0){player.volume(v-.1>0?v-=.1:0)}}else if(event.detail){if(event.detail>0){player.volume(v-.1>0?v-=.1:0)}if(event.detail<0){player.volume(v+.1<1?v+=.1:1)}}}}};var adFrontPlay=function(){if(ad['frontPlayI']==0){allBarHide(false);C['ad'].show();ad['front']['video']=false;if(!isUndefined(ad['front']['closeTime'])){if(ad['front']['closeTime']>0){C['ad']['top']['closeTime'].show();adFrontCloseTime()}else{C['ad']['top']['closeAd'].show()}}}if(!isUndefined(ad['front']['node'])&&ad['front']['node']!=null){CM.append(ad['front']['node']);player.closeLayer(ad['front']['node']);ad['front']['node']=null}C['ad']['picture'].htm('');C['ad']['picture'].hide();C['ad']['link'].hide();if(!isUndefined(ad['front']['list'][ad['frontPlayI']])){var adv=ad['front']['list'][ad['frontPlayI']];frontAdPlay=true;eventTarget('frontAd',adv);if(adv['type']=='picture'){adPicturePlay(adv)}else if(adv['type']=='node'){adNode(adv)}else{C['ad']['link'].attr('data-link',adv['link']);adVideoPlay(adv['file'])}if(!isUndefined(adv['link'])){C['ad']['bottom']['details'].show();C['ad']['bottom']['details'].htm('<a href="'+adv['link']+'" target="blank">'+language['details']+'</a>')}else{C['ad']['bottom']['details'].hide()}}},adFrontCloseTime=function(){if(!isUndefined(ad['front']['closeSetTime'])){clearTimeout(ad['front']['closeSetTime']);ad['front']['closeSetTime']=null}C['ad']['top']['closeTime'].htmReplace('{seconds}',ad['front']['closeTime'],language['closeTime']);ad['front']['closeTime']--;if(ad['front']['closeTime']>0){ad['front']['closeSetTime']=setTimeout(adFrontCloseTime,1000)}else{C['ad']['top']['closeAd'].show();C['ad']['top']['closeTime'].hide()}},calculationAdFrontTime=function(t){if(!isUndefined(t)){ad['front']['list'][ad['frontPlayI']]['time']=t}ad['front']['countDown']=0;for(var i=ad['frontPlayI'];i<ad['front']['list'].length;i++){ad['front']['countDown']+=parseInt(ad['front']['list'][i]['time'])}C['ad']['top']['countDown'].htm(ad['front']['countDown']+language['second'])},clearAdFrontSetTime=function(){if(adFrontSetTime){clearTimeout(adFrontSetTime);adFrontSetTime=null}},adFrontCountDown=function(){clearAdFrontSetTime();var adv=ad['front']['list'][ad['frontPlayI']];if(adv['time']>0){adv['time']--;ad['front']['countDown']--;C['ad']['top']['countDown'].htm(ad['front']['countDown']+language['second']);adFrontSetTime=setTimeout(adFrontCountDown,1000)}else{adFrontEnded()}},adFrontEnded=function(){if(ad['frontPlayI']<ad['front']['list'].length-1){ad['frontPlayI']++;adFrontPlay()}else{if(!isUndefined(ad['front']['node'])&&ad['front']['node']!=null){CM.append(ad['front']['node']);player.closeLayer(ad['front']['node']);ad['front']['node']=null}C['ad']['picture'].htm('');C['ad']['picture'].hide();ad['frontPlay']=false;C['ad'].hide();allBarShow();seekTime=vars['seek'];if(ad['front']['video']){changeVideo(vars['video'])}else{player.play()}eventTarget('frontAdEnded',true);frontAdPlay=false}},adVideoPlay=function(vstr){if(isUndefined(vstr))return;C['ad']['picture'].hide();seekTime=0;if(video.attr('src')||video.htm()){player.pause()}if(video.attr('src')){video.attr('src','');video.removeAttr('src')}video.htm('');if(vars['plug']&&!canPlay(vstr)){switch(vars['plug']){case'hls.js':hlsPlayer(vstr);break;case'flv.js':flvPlayer(vstr);break;case'mpegts.js':mpegtsPlayer(vstr);break;default:CT.error={code:10,message:language['error']['emptied']};eventTarget('error',CT.error);showError();break}}else{video.attr('src',vstr)}ad['front']['video']=true;C['ad']['link'].show();C['ad']['bottom']['mutedAndExit'].show()},adPicturePlay=function(adv){if(isUndefined(adv['file']))return;var img=null;var imgloadNum=0;var imgLoadHandler=function(){C['ad']['picture'].show();C['ad']['picture'].htm('');img=createlImg(adv['file']);C['ad']['picture'].append(img);img.addListener('load',function(){var w=this.getWidth(),h=this.getHeight();if(w>0||h>0){if(adv['link']){var a=createlA('',adv['link']);a.append(this);C['ad']['picture'].append(a)}else{C['ad']['picture'].append(this)}img.unbind();img.click(function(){eventTarget('frontAdClick',adv)})}else{if(imgloadNum<10){imgloadNum++;imgLoadHandler()}}})};imgLoadHandler();calculationAdFrontTime();adFrontCountDown();C['ad']['bottom']['mutedAndExit'].hide()},adNode=function(adv){if(isUndefined(adv['content']))return;ad['front']['node']=player.layer(adv);ad['front']['node'].css({'z-index':1});C['ad'].append(ad['front']['node']);ad['front']['node'].unbind();ad['front']['node'].click(function(){eventTarget('frontAdClick',adv)});calculationAdFrontTime();adFrontCountDown();C['ad']['bottom']['mutedAndExit'].hide()},frontVideoClickHandler=function(){var url=C['ad']['link'].attr('data-link');window.open(url,'_blank')},closeFrontAd=function(){if(!isUndefined(ad)&&!isUndefined(ad['front'])&&!isUndefined(ad['front']['closeButtonClick'])){if(valType(ad['front']['closeButtonClick'])=='function'){try{ad['front']['closeButtonClick']()}catch(event){console.error(event)}}else if(valType(ad['front']['closeButtonClick'])=='string'){try{eval(ad['front']['closeButtonClick']+'()')}catch(event){console.error(event)}}}else{player.closeFrontAd()}},adPausePlay=function(){closePauseAd();if(!isUndefined(ad)&&!isUndefined(ad['pause'])&&!isUndefined(ad['pause']['list'])&&ad['pause']['list'].length-1>=ad['pausePlayI']){var adv=ad['pause']['list'][ad['pausePlayI']];if(!isUndefined(ad['pause']['close'])&&ad['pause']['close']){ad['pauseClose']=createlButton('ck-pause-close');ad['pauseClose'].click(function(){C['centerPlay'].show();C['buffer'].hide();closePauseAd()})}if(!isUndefined(adv['file'])){var img=null;var imgloadNum=0;var imgLoadHandler=function(){img=createlImg(adv['file']);C['adPause'].show();C['adPause'].htm('');C['adPause'].append(img);img.addListener('load',function(){var w=this.getWidth(),h=this.getHeight();if(w>0||h>0){C['adPause'].htm('');if(adv['link']){var a=createlA('',adv['link']);a.append(this);C['adPause'].append(a)}else{C['adPause'].append(this)}C['adPause'].css({'width':w+'px','height':h+'px'});if(ad['pauseClose']){C['adPause'].append(ad['pauseClose'])}img.click(function(){eventTarget('pauseAdClick',adv)})}else{if(imgloadNum<10){imgloadNum++;imgLoadHandler()}}})};imgLoadHandler()}else if(!isUndefined(adv['content'])){ad['pause']['node']=player.layer(adv);if(ad['pauseClose']){ad['pause']['node'].append(ad['pauseClose'])}ad['pause']['node'].click(function(){eventTarget('pauseAdClick',adv)})}eventTarget('pauseAd',adv);if(!isUndefined(adv['time'])&&adv['time']>0){adPauseSetTime=setTimeout(function(){ad['pausePlayI']++;if(ad['pausePlayI']>ad['pause']['list'].length-1){ad['pausePlayI']=0}adPausePlay()},adv['time']*1000)}}},closePauseAd=function(){if(adPauseSetTime){clearTimeout(adPauseSetTime);adPauseSetTime=null}C['adPause'].hide();if(!isUndefined(ad)&&!isUndefined(ad['pauseClose'])&&ad['pauseClose']!=null){ad['pauseClose'].remove();ad['pauseClose']=null}if(!isUndefined(ad)&&!isUndefined(ad['pause'])&&!isUndefined(ad['pause']['node'])&&ad['pause']['node']){ad['pause']['node'].unbind();player.closeLayer(ad['pause']['node']);eventTarget('pauseAdClose')}};var player={width:function(value){if(!isUndefined(value)){if(valType(value)=='number'){value+='px'}CT.css({'width':value});checkVideoRotate()}return CK.getWidth()},height:function(value){if(!isUndefined(value)){if(valType(value)=='number'){value+='px'}CT.css({'height':value});checkVideoRotate()}return CK.getHeight()},videoWidth:function(){if(video){return video.videoWidth}return null},videoHeight:function(){if(video){return video.videoHeight}return null},zoom:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('zoom',fn)}if(valType(fn)=='number'){var arr=[C['topBar']['zoomEle']['zoom50'],C['topBar']['zoomEle']['zoom75'],C['topBar']['zoomEle']['zoom100']];for(var i=0;i<arr.length;i++){arr[i].removeClass('ck-top-bar-zoom-container-focus')}switch(fn){case 50:arr[0].addClass('ck-top-bar-zoom-container-focus');break;case 75:arr[1].addClass('ck-top-bar-zoom-container-focus');break;case 100:arr[2].addClass('ck-top-bar-zoom-container-focus');break}if(fn==50||fn==75||fn==100){nowZoom=fn;checkVideoRotate();eventTarget('zoom',fn)}}}return player},rotate:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('rotate',fn)}if(valType(fn)=='number'){var arr=[0,90,180,270];var rot=0;if(arr.length>fn&&fn>0){rot=arr[fn]}else{if(arr.indexOf(fn)>-1){rot=fn}}if(rot!=nowRotate){eventTarget('rotate',rot);nowRotate=rot;checkVideoRotate()}}}},vars:function(obj,val){if(isUndefined(obj)){return}if(valType(obj)=='string'&&!isUndefined(val)){var temp={};temp[obj]=val;obj=temp}var isChange=false;for(var k in obj){if(k in vars&&obj[k]!=vars[k]){isChange=true;break}}if(isChange){vars=standardization(vars,obj)}if(!isUndefined(obj['video'])){isChangeDef=true;changeVideo(vars['video'])}if(!isUndefined(obj['title'])){C['topBar']['titleEle'].htm(obj['title'])}},loadstart:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('loadstart',fn)}},loadeddata:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('loadeddata',fn)}},loadedMetaData:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('loadedMetaData',fn)}},canplay:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('canplay',fn)}},play:function(fn){if(valType(fn)=='object'){if(fn['target']==C['bar']['playAndPause']['play']||fn['target']==C['bar']['playAndPause']['refresh']){playType='button'}}if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('play',fn)}else{if(loadedmetadataNum>0&&video){try{video.play()}catch(event){console.error(event)}}}return player},pause:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('pause',fn)}else{if(loadedmetadataNum>0&&video){try{video.pause()}catch(event){console.error(event)}}}return player},playOrPause:function(){if(paused){player.play()}else{player.pause()}return player},volume:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('volume',fn)}else if(valType(fn)=='number'&&video){if(fn<0)fn=0;if(fn>1)fn=1;if(video.muted){video.volume=fn*.5}video.volume=fn}}else if(video){return video.volume}return player},muted:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('muted',fn)}else if(video){video.muted=true}return player},exitMuted:function(){if(video){video.muted=false;if(video.volume==0){player.volume(vars['volume']>0?vars['volume']:.8)}}return player},time:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('time',fn)}else if(video){return video.currentTime||0}},seek:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('seek',fn)}if(valType(fn)=='number'&&video){switch(vars['timeScheduleAdjust']){case 0:message(language['timeScheduleAdjust']['prohibit']);return;break;case 1:break;case 2:if(fn<oldTime){message(language['timeScheduleAdjust']['prohibitBackOff']);return}break;case 3:if(fn>oldTime){message(language['timeScheduleAdjust']['prohibitForward']);return}break;case 4:if(fn<firstSeekTime){waitingMessage=false;video.currentTime=firstSeekTime;message(language['timeScheduleAdjust']['prohibitLookBack']);return}break;case 5:if(fn>maxSeeTime){waitingMessage=false;video.currentTime=maxSeeTime;message(language['timeScheduleAdjust']['prohibitForwardNotViewed']);return}break}pSliderMouseDown=false;video.currentTime=fn}}return player},buffer:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('buffer',fn)}return player},ended:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('ended',fn)}return player},next:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('next',fn)}return player},error:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('error',fn)}return player},emptied:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('emptied',fn)}return player},duration:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('duration',fn)}else{return duration||0}},playbackRate:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('playbackRate',fn)}else if(valType(fn)=='number'&&video){video.playbackRate=fn;CT.playbackRate=fn;eventTarget('playbackRate',fn);changePlaybackrateVal(fn)}}else{return video.playbackRate}},track:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('track',fn)}else if(valType(fn)=='number'&&video){var track=null;if(!isUndefined(video.textTracks)){track=video.textTracks}if(track&&valType(track)=='texttracklist'){var arr=vars['track'];for(var i=track.length-1;i>-1;i--){video.find('track').eq(i).remove()}for(var i=0;i<arr.length;i++){var def='';arr[i]['default']=false;if(i==fn){def=' default';arr[i]['default']=true}track+='<track src="'+arr[i]['src']+'" srclang="'+arr[i]['srclang']+'" kind="'+arr[i]['kind']+'" label="'+arr[i]['label']+'"'+def+'>'}if(video){var html=video.htm()+track;video.htm(html)}changeTrackVal(fn)}}}else{return CT.track}},fastBack:function(num){if(duration==0)return;if(isUndefined(num)||valType(num)!='number'){num=20}var time=player.time();if(time-num>0){time-=num}else{time=0}player.seek(time);return player},fastNext:function(num){if(duration==0)return;if(isUndefined(num)||valType(num)!='number'){num=20}var time=player.time();if(time+num<duration){time+=num}else{time=duration}player.seek(time);return player},definition:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('definition',fn)}if(valType(fn)=='number'){changeDefinition(fn)}}return player},fps:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('fps',fn)}return CT.fps},playback:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('playback',fn)}}else{return playbackTime}return player},backLive:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('backLive',fn)}if(valType(fn)=='boolean'){if(bool){C['bar']['backLive'].show()}else{C['bar']['backLive'].hide()}}}return player},full:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('full',fn)}else{if(smallWindowsState){return}if(CT.theatre){player.exitTheatre()}if(CT.webFull){player.exitWebFull()}var requestMethod=CK.requestFullScreen||CK.webkitRequestFullScreen||CK.mozRequestFullScreen||CK.oRequestFullscreen||CK.msRequestFullscreen;if(!isUndefined(requestMethod)){requestMethod.call(CK)}else if(!isUndefined(window.ActiveXObject)){var wscript=new ActiveXObject('WScript.Shell');if(wscript!==null){wscript.SendKeys('{F11}')}}else if(!isUndefined(video.webkitEnterFullscreen)||!isUndefined(video.webkitEnterFullScreen)){var fullScreen=video.webkitEnterFullscreen||video.webkitEnterFullScreen;fullScreen.call(video)}player.zoom(100)}return player},exitFull:function(){var exitFullFun=document.exitFullscreen||document.mozCancelFullScreen||document.webkitExitFullscreen||document.oCancelFullScreen||document.msExitFullscreen;if(!isUndefined(exitFullFun)){exitFullFun.call(document)}else if(!isUndefined(window.ActiveXObject)){var wscript=new ActiveXObject('WScript.Shell');if(wscript!==null){wscript.SendKeys('{F11}')}}return player},fullOrExit:function(){var fullState=document.fullScreen||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement;if(fullState){player.exitFull()}else{player.full()}return player},webFull:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('webfull',fn)}else{exitSmallWindows();if(!isUndefined(vars['theatre'])){C['bar']['theatreAndExit'].hide()}CK.css({'position':'fixed','top':0,'left':0,'height':'100%','z-index':getMaxZIndex()+1});C['bar']['webFullAndExit']['webFull'].hide();C['bar']['webFullAndExit']['exitWebFull'].show();CT.webFull=true;eventTarget('webfull',true);checkVideoRotate()}return player},exitWebFull:function(){CK.css({'position':'relative'});C['bar']['webFullAndExit']['webFull'].show();C['bar']['webFullAndExit']['exitWebFull'].hide();if(!isUndefined(vars['theatre'])){C['bar']['theatreAndExit'].show();C['bar']['theatreAndExit']['theatre'].show();C['bar']['theatreAndExit']['exitTheatre'].hide()}CK.attr('style','');CT.webFull=false;eventTarget('webfull',false);checkVideoRotate();return player},theatre:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('theatre',fn)}else{if(valType(vars['theatre'])=='array'&&vars['theatre'].length==2){var fun=vars['theatre'][0];if(valType(fun)=='function'){fun()}if(valType(fun)=='string'){eval(fun+'()')}}else{exitSmallWindows();CK.css({'position':'absolute','top':CT.offset()['top'],'left':0,'height':CT.getHeight()+'px','z-index':getMaxZIndex()+1});C['bar']['theatreAndExit']['theatre'].hide();C['bar']['theatreAndExit']['exitTheatre'].show()}CT.theatre=true;eventTarget('theatre',true);checkVideoRotate()}return player},exitTheatre:function(){if(valType(vars['theatre'])=='array'&&vars['theatre'].length==2){var fun=vars['theatre'][1];if(valType(fun)=='function'){fun()}if(valType(fun)=='string'){eval(fun+'()')}}else{CK.css({'position':'relative'});C['bar']['theatreAndExit']['theatre'].show();C['bar']['theatreAndExit']['exitTheatre'].hide();CK.attr('style','');CT.theatre=false}eventTarget('theatre',false);checkVideoRotate();return player},smallWindows:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('smallWindows',fn)}if(valType(fn)=='boolean'){if(fn){C['rightBar']['smallwindows']['open'].show();C['rightBar']['smallwindows']['close'].hide();CT.smallWindows=true}else{C['rightBar']['smallwindows']['open'].hide();C['rightBar']['smallwindows']['close'].show();CT.smallWindows=false}eventTarget('smallWindows',CT.smallWindows);checkVideoRotate()}}return CT.smallWindows},loop:function(fn){if(!isUndefined(fn)){if(valType(fn)=='function'){newEvent.addEventListener('loop',fn)}if(valType(fn)=='boolean'&&video){if(fn){C['rightBar']['loop']['open'].show();C['rightBar']['loop']['close'].hide();CT.loop=true;video.attr('loop','loop');eventTarget('loop',true)}else{C['rightBar']['loop']['open'].hide();C['rightBar']['loop']['close'].show();CT.loop=false;video.attr('loop',false);video.removeAttr('loop');eventTarget('loop',false)}}}return CT.loop},screenshot:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('screenshot',fn)}else{if(!isUndefined(vars['screenshot'])&&vars['screenshot']&&video){try{message(language['screenshotStart'],true);var newCanvas=$(document.createElement('canvas'));newCanvas.width=video.videoWidth;newCanvas.height=video.videoHeight;newCanvas.getContext('2d').drawImage(video,0,0,video.videoWidth,video.videoHeight);var base64=newCanvas.toDataURL('image/png');eventTarget('screenshot',base64);if(screenshotImg){screenshotImg.remove();screenshotImg=null}screenshotImg=createlImg(base64);screenshotImg.addListener('load',function(){C['screenshot']['img'].append(screenshotImg);C['screenshot'].show().css({'width':this.getWidth()+'px'})});var newBlob=dataURLtoBlob(base64);var url=URL.createObjectURL(newBlob);var downName='video';if(vars['title']){downName=vars['title']}C['screenshot']['bar']['down'].attr('href',url).attr('download',downName);return base64}catch(error){message(language['error']['screenshot'],true)}}else{message(language['screenshotClose'],true)}}return player},closeScreenshot:function(bool){if(!isUndefined(bool)&&valType(bool)=='boolean'&&!bool){C['screenshot'].show()}else{C['screenshot'].hide()}return player},layer:function(obj,bar){if(isUndefined(obj)){return null}var cBar=false;if(!isUndefined(bar)){cBar=bar}var ele=null;if(valType(obj)=='object'){if('class'in obj&&'content'in obj){ele=createlDiv(obj['class']);ele.htm(obj['content'])}else if('content'in obj){obj=obj['content']}}if(valType(obj)=='string'){if(obj.substr(0,1)=='.'||obj.substr(0,1)=='#'){ele=getElement(obj)}else{ele=createlDiv('ck-layer');ele.htm(obj)}}if(ele){var zIndex=ele.css('z-index');if(zIndex=='auto'){zIndex=101}if(zIndex<101)zIndex=101;if(zIndex>200)zIndex=200;if(isUndefined(ele.cssDisplay)){ele.cssPosition=ele.css('position');ele.cssDisplay=ele.css('display')}ele.css({'position':'absolute','z-index':zIndex});if(!cBar){CM.append(ele)}else{C['bar'].append(ele)}ele.CK=CK;ele.show()}return ele},closeLayer:function(ele){if(valType(ele)=='string'){var temp=$(ele);if(!isUndefined(temp)){if(temp.length>0){ele=temp.eq(0)}}}if(!isUndefined(ele)&&valType(ele)=='htmlobject'){if(!isUndefined(ele.captureParentNode)){var eleP=ele.captureParentNode;if(ele.nextElement){try{eleP.insertBefore(ele,ele.nextElement)}catch(event){eleP.append(ele)}}else if(ele.prevElement){try{eleP.insertAfter(ele,ele.prevElement)}catch(event){eleP.append(ele)}}else{eleP.append(ele)}ele.css({'display':ele.cssDisplay})}else{ele.remove()}if(!isUndefined(ele.cssDisplay)){ele.css({'display':ele.cssDisplay,'position':ele.cssPosition})}}return player},message:function(str){message(str);return player},closeFrontAd:function(){if(frontAdPlay&&!isUndefined(ad)&&!isUndefined(ad['front'])&&!isUndefined(ad['front']['list'])){ad['frontPlayI']=ad['front']['list'].length-1;adFrontEnded();clearAdFrontSetTime()}return player},addListener:function(name,fn){newEvent.addEventListener(name,fn)},removeListener:function(name,fn){newEvent.removeEventListener(name,fn)},bar:function(bool){barShow=bool;if(bool){C['bar'].show()}else{C['bar'].hide()}},rightBar:function(bool){rightBarShow=bool;if(bool){C['rightBar'].show()}else{C['rightBar'].hide()}},mouseActive:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){newEvent.addEventListener('mouseActive',fn)}return this},cookie:function(name){if(name=='delete'){cookie(ckplayerCookie,'delete',vars['domain']);return null}if(!isUndefined(name)&&name){name=name.replace(/[ ]*,[ ]*|[ ]+/g,'').replace(/[ ]*;[ ]*|[ ]+/g,'')}var cStr=cookie(ckplayerCookie);if(cStr){var arr=stringToArray(cStr);var tempArr=[];var cTime=parseInt(Date.now()*0.001);for(i=0;i<arr.length;i++){if(parseInt(arr[i][2])>cTime){tempArr.push(arr[i])}}arr=tempArr;if(arr.length>0){cookie(ckplayerCookie,'delete',vars['domain'],vars['cookiePath']);cookie(ckplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']);for(var i=0;i<arr.length;i++){arr[i]={name:arr[i][0],time:arr[i][1],expirationTime:date('Y-m-d H:i:s',arr[i][2]),expirationTimeStamp:arr[i][2]};if(!isUndefined(name)&&name==arr[i]['name']){return arr[i]}}return arr}else{cookie(ckplayerCookie,'delete',vars['domain'],vars['cookiePath'])}}return null},visibilityState:function(fn){if(!isUndefined(fn)&&valType(fn)=='function'){if(!isUndefined(document.visibilityState)){fn(document.visibilityState==='visible'?'show':'hidden')}newEvent.addEventListener('visibilityState',fn)}return this},remove:function(){var eventTemp={};if(eventTargetList!=null){for(var k in eventTargetList){eventTemp[k]=eventTargetList[k]}for(var k in eventTemp){var temp=eventTemp[k];if(temp){for(var i=0;i<temp.length;i++){var eve=temp[i];newEvent.removeEventListener(k,eve)}}}}if(frontAdPlay){this.closeFrontAd()}if(pugPlayer){pugPlayer.pause();pugPlayer.unload();pugPlayer.detachMediaElement();pugPlayer.destroy();pugPlayer=null}if(hls){hls.stopLoad();hls.detachMedia()}loadedmetadataNum=0;loadedTrack=false;isChangeDef=true;if(video){video.unbind();video.remove();video=null}if(!isUndefined(C['menu'])){C['menu'].remove()}if(CT){CT.unbind();CT.htm('')}return null}};var checkBar=function(){if(vars['autoplay']){C['bar']['playAndPause']['play'].hide();C['bar']['playAndPause']['pause'].show()}else{C['bar']['playAndPause']['play'].show();C['bar']['playAndPause']['pause'].hide()}if(mutedState){C['bar']['vbox']['muted'].hide()}else{C['bar']['vbox']['exitMuted'].hide()}if(!isUndefined(vars['next'])){C['bar']['nextEpisode'].show()}else{C['bar']['nextEpisode'].hide()}if(!isUndefined(vars['webFull'])&&vars['webFull']&&!CT.full){C['bar']['webFullAndExit'].show()}else{C['bar']['webFullAndExit'].hide()}if(!isUndefined(vars['theatre'])&&!CT.full&&!CT.webFull){C['bar']['theatreAndExit'].show()}else{C['bar']['theatreAndExit'].hide()}if(!isUndefined(vars['rightBar'])&&vars['rightBar']){C['rightBar'].show()}else{C['rightBar'].hide()}if(!vars['live']||valType(vars['live'])=='number'){pSliderMouseDown=false;progressDragX()}if(vars['live']||valType(vars['live'])=='number'){C['time'].htm(language['live']);C['tempTime'].htm(language['live'])}if(valType(vars['smallWindows'])=='boolean'&&!vars['smallWindows']){CT.smallWindows=false;C['rightBar']['smallwindows']['open'].hide();C['rightBar']['smallwindows']['close'].show()}if(CT.loop){C['rightBar']['loop']['open'].show();C['rightBar']['loop']['close'].hide()}else{C['rightBar']['loop']['open'].hide();C['rightBar']['loop']['close'].show()}if(!isUndefined(vars['backLive'])&&vars['backLive']){C['bar']['backLive'].show()}if(vars['volume']==0){player.muted()}},loadLogo=function(){if(!isUndefined(vars['logo'])&&isUndefined(C['logo'])){C['logo']=createlDiv('ck-logo');createlImg(vars['logo']).addListener('load',function(){CM.append(C['logo']);C['logo'].append(this)}).addListener('error',function(){C['logo'].remove()})}},loadAbout=function(){if(!isUndefined(vars['information'])&&!isUndefined(C['about'])&&valType(vars['information'])=='object'){var obj=vars['information'];var k='';var ul=$(document.createElement('ul'));var temp='';for(k in obj){var title=createlDiv('div').attr('class','ck-about-title');var content=createlDiv('div').attr('class','ck-about-content');var li=$(document.createElement('li'));title.htm(k);content.htm(obj[k]);li.append(title);li.append(content);ul.append(li);temp+=k+':'+obj[k]+'\n'}C['about'].append(ul);C['about']['textareaText']=temp;C['about']['textareaEle']=$(document.createElement('textarea'));CM.append(C['about']['textareaEle']);C['about']['textareaEle'].hide()}},loadMenu=function(){if(!isUndefined(vars['menu'])&&vars['menu']){rightMenu=vars['menu']}C['menu']=createlDiv('ckplayer-ckplayer-menu');for(var i=0;i<rightMenu.length;i++){var m=rightMenu[i];var li=createlDiv('ck-li');if(!isUndefined(m['underline'])){li.addClass('ck-underline')}if(!isUndefined(m['link'])&&!isUndefined(m['title'])){li.append(createlA(m['title'],m['link']));C['menu'].append(li)}else if(!isUndefined(m['javascript'])&&!isUndefined(m['title'])){li.append(createlJsLink(m['title'],m['javascript']));C['menu'].append(li)}else if(!isUndefined(m['click'])&&!isUndefined(m['title'])){var a=createlJsLink(m['title']);a.attr('data-click',m['click'].toString());a.click(function(){eval($(this).attr('data-click')+'()');C['menu'].hide()});li.append(a);C['menu'].append(li)}else if(!isUndefined(m['title'])){li.htm(m['title']);C['menu'].append(li)}}$('body').append(C['menu']);CM.oncontextmenu=function(eve){var e=eve||window.event;var client=getClient(e);if(e.button==2){e.returnvalue=false;var x=client['x']-2;var y=client['y']-2;C['menu'].show();C['menu'].css({left:x+'px',top:y+'px'});return false}return true};var menuSetTimeOut=null;var clearTime=function(){if(menuSetTimeOut){clearTimeout(menuSetTimeOut);menuSetTimeOut=null}};var menuMouseOut=function(){clearTime();menuSetTimeOut=setTimeout(function(){C['menu'].hide()},200)};C['menu'].mouseout(menuMouseOut);C['menu'].mouseover(clearTime)},aboutShow=function(){C['about'].show();C['menu'].hide()},aboutHide=function(){C['about'].hide()},aboutCopy=function(){C['about']['textareaEle'].show();C['about']['textareaEle'].select();document.execCommand('Copy');C['about']['textareaEle'].hide();message(language['copySucceeded'],true)},getBarHeight=function(){var h=C['bar'].getHeight();if(parseFloat(C['bar']['pbox'].css('top'))<0){h-=parseInt(C['bar']['pbox'].css('top'))}return h},hideBar=function(){if(mouseSetTime){clearTimeout(mouseSetTime);mouseSetTime=null}mouseSetTime=setTimeout(function(){if(!paused){C['bar'].addClass('ck-bar-out');eventTarget('mouseActive',false);if(CT.full){CM.addClass('ck-nocursor')}if(C['rightBar'].css('display')=='block'){C['rightBar'].addClass('ck-right-bar-hide')}if(C['topBar'].css('display')=='block'){C['topBar'].addClass('ck-top-bar-hide')}}mouseSetTime=null},vars['barHideTime'])},barMouseOut=function(){if(!paused){C['bar']['pbox'].addClass('ck-bar-progress-out');hideBar()}},barMouseOver=function(){if(!paused){C['bar']['pbox'].removeClass('ck-bar-progress-out');if(mouseSetTime){clearTimeout(mouseSetTime);mouseSetTime=null}}},rightBarMouseOut=function(){if(!paused){hideBar()}},rightBarMouseOver=function(){if(!paused){if(mouseSetTime){clearTimeout(mouseSetTime);mouseSetTime=null}}},checkPlaybackrate=function(){var playbackrate=vars['playbackrateList'];var pbr=vars['playbackrate'];C['bar']['playbackrate']['bg']=createlDiv('ck-list-bg');C['bar']['playbackrate']['bgbox'].append(C['bar']['playbackrate']['bg']);C['bar']['playbackrate']['bg']['p']=[];for(var i=playbackrate.length-1;i>-1;i--){var pTemp=createlButton('ck-list-p',playbackrate[i]+language['playbackrateSuffix']);pTemp.attr('data-i',i).attr('data-val',playbackrate[i]);C['bar']['playbackrate']['bg']['p'].push(pTemp);C['bar']['playbackrate']['bg'].append(pTemp);pTemp.click(playbackrateClick)}C['bar']['playbackrate'].hide();if(!isUndefined(vars['playbackrateOpen'])&&vars['playbackrateOpen']){C['bar']['playbackrate'].show();C['bar']['playbackrate']['bgbox'].show();var w=C['bar']['playbackrate']['bg'].getWidth(),h=C['bar']['playbackrate']['bg'].getHeight();var bw=C['bar']['playbackrate']['button'].getWidth();C['bar']['playbackrate']['bg'].css({'width':w+10+'px'});w=C['bar']['playbackrate']['bg'].getWidth();if(getBarHeight()>C['bar'].getHeight()){h+=(getBarHeight()-C['bar'].getHeight())}C['bar']['playbackrate']['bgbox'].attr('style','');C['bar']['playbackrate']['bgbox'].css({'width':w+'px','height':(h+2)+'px','left':-(w-bw)*0.5+'px'});C['bar']['playbackrate']['button'].mouseover(function(){w=C['bar']['playbackrate']['bg'].getWidth();bw=C['bar']['playbackrate']['button'].getWidth();C['bar']['playbackrate']['bgbox'].css({'left':-(w-bw)*0.5+'px'})});changePlaybackrateVal(pbr)}},playbackrateClick=function(e){C['bar']['playbackrate']['bgbox'].hide();setTimeout(function(){C['bar']['playbackrate']['bgbox'].removeCss('display')},300);message(language['switchTo']+$(this).htm());player.playbackRate(parseFloat($(this).attr('data-val')))},changePlaybackrateVal=function(num){C['bar']['playbackrate']['bg'].find('button').each(function(index,ele){var val=parseFloat(ele.attr('data-val'));ele.removeClass('ck-list-p-focus');if(num==val){ele.addClass('ck-list-p-focus');if(num!=1){C['bar']['playbackrate']['button'].htm(ele.htm())}else{C['bar']['playbackrate']['button'].htm(language['playbackrate'])}}else{ele.removeClass('ck-list-p-focus')}})},checkTrack=function(){var track=vars['track'];var pbr=-1;C['bar']['track']['bgbox'].htm('');C['bar']['track']['bg']=createlDiv('ck-list-bg');C['bar']['track']['bgbox'].append(C['bar']['track']['bg']);C['bar']['track']['bg']['p']=[];var pTemp=null;for(var i=track.length-1;i>-1;i--){pTemp=createlButton('ck-list-p',track[i]['label']);pTemp.attr('data-i',i).attr('data-title',track[i]['label']);C['bar']['track']['bg']['p'].push(pTemp);C['bar']['track']['bg'].append(pTemp);if(!isUndefined(track[i]['default'])&&track[i]['default']){pbr=i}pTemp.click(trackClick)}pTemp=createlButton('ck-list-p',language['noTrack']);pTemp.attr('data-i',-1).attr('data-title',language['noTrack']);C['bar']['track']['bg']['p'].push(pTemp);C['bar']['track']['bg'].append(pTemp);pTemp.click(trackClick);C['bar']['track'].hide();C['bar']['track'].show();C['bar']['track']['bgbox'].show();var w=C['bar']['track']['bg'].getWidth(),h=C['bar']['track']['bg'].getHeight();var bw=C['bar']['track']['button'].getWidth();C['bar']['track']['bg'].css({'width':w+10+'px'});w=C['bar']['track']['bg'].getWidth();if(getBarHeight()>C['bar'].getHeight()){h+=(getBarHeight()-C['bar'].getHeight())}C['bar']['track']['bgbox'].attr('style','');C['bar']['track']['bgbox'].css({'width':w+'px','height':(h+2)+'px','left':-(w-bw)*0.5+'px'});C['bar']['track']['button'].mouseover(function(){w=C['bar']['track']['bg'].getWidth();bw=C['bar']['track']['button'].getWidth();C['bar']['track']['bgbox'].css({'left':-(w-bw)*0.5+'px'})});changeTrackVal(pbr)},trackClick=function(e){C['bar']['track']['bgbox'].hide();setTimeout(function(){C['bar']['track']['bgbox'].removeCss('display')},300);message(language['switchTo']+$(this).attr('data-title'));player.track(parseFloat($(this).attr('data-i')))},changeTrackVal=function(num){C['bar']['track']['bg'].find('button').each(function(index,ele){var i=parseInt(ele.attr('data-i'));if(num==i){C['bar']['track']['button'].htm(ele.attr('data-title'));if(i>-1){CT.track=vars['track'][i];eventTarget('track',vars['track'][i])}else{CT.track=null;eventTarget('track',null)}ele.addClass('ck-list-p-focus')}else{ele.removeClass('ck-list-p-focus')}})},checkDefinition=function(){var pi=-1;var videoUrl=video['currentSrc'];if(!isUndefined(C['bar']['definition']['bg'])){C['bar']['definition']['bgbox'].htm('');C['bar']['definition']['bgbox'].attr('style','');C['bar']['definition']['button'].htm(language['definition'])}if(valType(vars['video'])=='array'){var arr=vars['video'];C['bar']['definition']['bg']=createlDiv('ck-list-bg');C['bar']['definition']['bgbox'].append(C['bar']['definition']['bg']);C['bar']['definition']['bg']['p']=[];for(var i=arr.length-1;i>-1;i--){var pTemp=createlButton('ck-list-p',arr[i][2]);pTemp.attr('data-i',i).attr('data-video',arr[i][0]).attr('data-type',arr[i][1]).attr('data-title',arr[i][2]);C['bar']['definition']['bg']['p'].push(pTemp);C['bar']['definition']['bg'].append(pTemp);if(videoUrl&&videoUrl.indexOf(arr[i][0])>-1){pi=i}pTemp.click(definitionClick)}C['bar']['definition'].show();C['bar']['definition']['bgbox'].show();var w=C['bar']['definition']['bg'].getWidth(),h=C['bar']['definition']['bg'].getHeight();var bw=C['bar']['definition']['button'].getWidth();C['bar']['definition']['bg'].css({'width':w+10+'px'});w=C['bar']['definition']['bg'].getWidth();if(getBarHeight()>C['bar'].getHeight()){h+=(getBarHeight()-C['bar'].getHeight())}C['bar']['definition']['bgbox'].attr('style','');C['bar']['definition']['bgbox'].css({'width':w+'px','height':(h+2)+'px','left':-(w-bw)*0.5+'px'});C['bar']['definition']['button'].mouseover(function(){w=C['bar']['definition']['bg'].getWidth();bw=C['bar']['definition']['button'].getWidth();C['bar']['definition']['bgbox'].css({'left':-(w-bw)*0.5+'px'})})}if(pi>-1){C['bar']['definition']['bg'].find('button').each(function(index,ele){var i=parseInt(ele.attr('data-i'));if(pi==i){ele.addClass('ck-list-p-focus')}else{ele.removeClass('ck-list-p-focus')}})}},definitionClick=function(e){C['bar']['definition']['bgbox'].hide();setTimeout(function(){C['bar']['definition']['bgbox'].removeCss('display')},300);changeDefinition(parseInt($(this).attr('data-i')))},changeDefinition=function(num){C['bar']['definition']['bg'].find('button').each(function(index,ele){var i=parseInt(ele.attr('data-i'));if(num==i){if(!isUndefined(video.textTracks)&&video.textTracks.length>0){for(var y=video.find('track').length-1;y>-1;y--){video.find('track').eq(y).remove()}}seekTime=player.time();video.attr('autoplay','autoplay');changeVideo(ele.attr('data-video'));message(language['switchTo']+ele.htm());C['bar']['definition']['button'].htm(ele.htm());ele.addClass('ck-list-p-focus');eventTarget('definition',{id:i,video:ele.attr('data-video'),title:ele.attr('data-title')})}else{ele.removeClass('ck-list-p-focus')}})},deletePrompt=function(){var i=0;if(!isUndefined(C['prompt'])&&valType(C['prompt'])=='array'){for(i=C['prompt'].length;i>-1;i--){if(!isUndefined(C['prompt'][i])){C['prompt'][i].remove()}}C['prompt']=null}C['prompt']=[]},changePrompt=function(){deletePrompt();for(var i=0;i<vars['prompt'].length;i++){var obj=vars['prompt'][i];if(!isUndefined(obj)&&'words'in obj&&'time'in obj&&!isUndefined(obj['time'])&&!isUndefined(obj['words'])&&valType(obj['time'])=='number'){var ele=createlDiv('ck-bar-progress-prompt');ele.attr('data-words',obj['words']).attr('data-time',obj['time']);C['bar']['pbox']['bg'].append(ele);var bf=(ele.getWidth()*0.5/C['bar']['pbox']['bg'].getWidth())*50;var left=obj['time']/duration*100-bf;if(left<0)left=0;if(left>100)left=100;ele.css({'left':left+'%'});ele.mouseover(function(){if(this.attr('data-words')){showPromptWords(this)}});ele.mouseout(function(){if(this.attr('data-words')){showPromptWords()}});C['prompt'].push(ele)}}},showPromptWords=function(ele){if(isUndefined(C['promptWords'])){C['promptWords']=createlDiv('ck-prompt-words');CM.append(C['promptWords']);C['promptWords']['content']=createlDiv('ck-prompt-content');C['promptWords'].append(C['promptWords']['content'])}if(isUndefined(ele)){C['promptWords']['content'].htm('');C['promptWords'].hide();return}C['promptWords']['content'].htm(ele.attr('data-words'));C['promptWords'].show();var pW=C['promptWords'].getWidth(),pH=C['promptWords'].getHeight();var bg=C['bar']['pbox']['bg'];var time=parseFloat(ele.attr('data-time'));var top=CK.getHeight()-getBarHeight();var left=ele.offset()['left']-CK.offset()['left']+ele.getWidth()*.5-pW*.5;if(!isUndefined(C['preview'])){top=CK.getHeight()-parseFloat((getBarHeight()+C['preview']['smallHight']+parseInt(C['preview'].css('margin-bottom'))))}else{top=CK.getHeight()-parseFloat((getBarHeight()+C['tip']['minHeight']+parseInt(C['tip'].css('margin-bottom'))));top-=(getBarHeight()-C['bar'].getHeight())}top-=parseFloat(C['promptWords'].css('margin-bottom'));top-=pH;left-=parseFloat(C['promptWords'].css('margin-right'));if(left<0)left=0;if(left>CK.getWidth()-pW)left=CK.getWidth()-pW;C['promptWords'].css({'top':top+'px','left':left+'px'})},changePreview=function(preview){if(!isUndefined(C['preview'])){C['preview'].remove();C['preview']=null}if(!isUndefined(preview)){C['preview']=createlDiv('ck-preview');CM.append(C['preview']);if(isUndefined(vars['preview']['type'])){vars['preview']['type']=0}if(vars['preview']['type']==1){C['preview']['bg']=createlDiv('ck-preview-bg');C['preview'].append(C['preview']['bg'])}var files=[];var loadImg=function(bigW,bigH,smallW,smallH){if(vars['preview']['type']==1){C['preview']['bg']['img']=[];for(var i=0;i<files.length;i++){for(var y=0;y<bigH/smallH;y++){var img=createlDiv('ck-preview-img');img.attr('data-img',files[i]).attr('data-i',y);img.css({'width':bigW+'px','height':smallH+'px','background-position':'left '+(-(y*smallH))+'px'});C['preview']['bg'].append(img);C['preview']['bg']['img'].push(img)}}C['preview']['bg'].css({'width':bigW*(bigH/smallH)*(files.length+1)+'px','height':smallH+'px'})}C['preview']['bigWidth']=bigW;C['preview']['bigHight']=bigH;C['preview']['smallWidth']=smallW;C['preview']['smallHight']=smallH;if(vars['preview']['type']==1){C['preview']['frame']=createlDiv('ck-preview-frame');C['preview'].append(C['preview']['frame']);C['preview']['frame'].css({'width':smallW+'px','height':(smallH-parseFloat(C['preview']['frame'].css('border-width'))*2)+'px',})}};if(valType(vars['preview'])=='object'){if(valType(vars['preview']['file'])=='array'){files=vars['preview']['file'];var thumbnail=[10,10];if(valType(vars['preview']['thumbnail'])=='array'&&vars['preview']['thumbnail'].length>1){if(valType(vars['preview']['thumbnail'][0])=='number'){thumbnail[0]=vars['preview']['thumbnail'][0]}if(valType(vars['preview']['thumbnail'][1])=='number'){thumbnail[1]=vars['preview']['thumbnail'][1]}vars['preview']['thumbnail']=thumbnail}if(files[0]){var img=createlImg(files[0],'ck-preview-load-img').addListener('load',function(){loadImg(this.getWidth(),this.getHeight(),this.getWidth()/thumbnail[0],this.getHeight()/thumbnail[1]);this.remove()});CM.append(img)}}else{C['preview'].removeChild();C['preview']=null}}else{C['preview'].removeChild();C['preview']=null}}},showPreview=function(time){if(hidePreviewSetTime){clearTimeout(hidePreviewSetTime);hidePreviewSetTime=null}if(time<0){if(!isUndefined(C['preview'])){hidePreviewSetTime=setTimeout(function(){C['preview'].hide();hidePreviewSetTime=null},200);return}}if(!isUndefined(C['preview'])&&!isUndefined(vars['preview']['thumbnail'])&&duration>0){if(isUndefined(vars['preview']['type'])){vars['preview']['type']=0}var scale=2,thumbnail=vars['preview']['thumbnail'];if(!isUndefined(vars['preview']['scale'])){scale=vars['preview']['scale']}var divI=0,imgI=0;var left=0,frameLeft=0;var pW=0;var smallW=C['preview']['smallWidth'],smallH=C['preview']['smallHight'];var bgXw=time*C['bar']['pbox']['bg'].getWidth()/duration+(C['bar']['pbox']['bg'].offset()['left']-CK.offset()['left']);if(C['preview'].css('display')=='none'){C['preview'].show()}C['preview'].css({'height':smallH+'px',});if(vars['preview']['type']==1){divI=parseInt(time/(scale*thumbnail[0]));imgI=parseInt(time/scale);var minI=divI-5,maxI=divI+5;if(minI<0)minI=0;if(maxI>C['preview']['bg']['img'].length-1){maxI=C['preview']['bg']['img'].length-1}for(var i=minI;i<maxI;i++){if(C['preview']['bg']['img'][i].attr('data-img')){var bgPosition=C['preview']['bg']['img'][i].css('background-position');C['preview']['bg']['img'][i].css({'background':'url('+C['preview']['bg']['img'][i].attr('data-img')+') no-repeat'});C['preview']['bg']['img'][i].attr('data-img','');C['preview']['bg']['img'][i].css('background-position',bgPosition)}}pW=C['preview']['frame'].getWidth();frameLeft=bgXw-pW*.5;left=-(imgI*smallW+smallW*.5)+bgXw;if(frameLeft<0){frameLeft=0;bgXw=(pW-smallW)*0.5;left=-(imgI*smallW)+bgXw}if(frameLeft>C['preview'].getWidth()-C['preview']['frame'].getWidth()){var xz=frameLeft-(C['preview'].getWidth()-C['preview']['frame'].getWidth());frameLeft=C['preview'].getWidth()-C['preview']['frame'].getWidth();left-=xz}C['preview']['bg'].css({'left':left+'px'});C['preview']['frame'].css({'left':frameLeft+'px'})}else{var temp=(time/scale)/(thumbnail[0]*thumbnail[1]);imgI=parseInt(temp);var smallI=parseInt((temp-imgI)*100);var rows=parseInt(smallI/thumbnail[0]);var column=smallI%thumbnail[0];var files=vars['preview']['file'];left=bgXw-smallW*.5;if(left<0){left=0}if(left>CK.getWidth()-smallW){left=CK.getWidth()-smallW}C['preview'].css({'width':C['preview']['smallWidth']+'px','background':'url('+files[imgI]+') no-repeat','background-position':'-'+column*smallW+'px -'+rows*smallH+'px','left':left+'px'})}}},showError=function(){C['loading'].hide();if(vars['controls']||!vars['errorShow']){return}if(isUndefined(C['error'])){C['error']=createlDiv('ck-error');CM.append(C['error'])}var msg=CT.error['message'];if(!msg)msg=language['error']['noMessage'];var html=msg+'(code:'+CT.error['code']+')';C['error'].htm(html);C['error'].show()},showWindowsError=function(error){var ele=createlDiv('ckplayer-error',error);$('body').append(ele)},showNextEpisode=function(){if(isUndefined(vars['next']))return;if(valType(vars['next'])=='object'){if('content'in vars['next']){C['next']=player.layer(vars['next']);return}if('title'in vars['next']){tip(C['bar']['nextEpisode'],vars['next']['title']);return}}tip(C['bar']['nextEpisode'],language['next'])},nextClick=function(){if(valType(vars['next'])=='object'){if('click'in vars['next']){if(valType(vars['next']['click'])=='function'){vars['next']['click']()}else if(valType(vars['next']['click'])=='string'){eval(vars['next']['click']+'()')}}if('link'in vars['next']){window.location.href=vars['next']['link']}eventTarget('next')}},showEnded=function(){if(!CT.loop&&!isUndefined(vars['ended'])){closePauseAd();C['ended']=player.layer(vars['ended']);if(C['ended']){C['centerPlay'].hide()}return}},windowScroll=function(){if(!CT.smallWindows)return;if(CT.webFull||CT.theatre||CT.full){exitSmallWindows();return}var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;if(scrollTop>CT.offset()['top']+CT.getHeight()){if(!CK.hasClass('ckplayer-ckplayer-smallwindow')){CK.addClass('ckplayer-ckplayer-smallwindow');eventTarget('smallWindows',true);smallWindowsState=true;if(vars['smallWindowsDrag']){drag(true)}allBarHide();checkVideoRotate()}}else{exitSmallWindows()}},exitSmallWindows=function(){if(CK.hasClass('ckplayer-ckplayer-smallwindow')){CK.removeClass('ckplayer-ckplayer-smallwindow');if(vars['smallWindowsDrag']){drag()}eventTarget('smallWindows',false);smallWindowsState=false;allBarShow();checkVideoRotate()}},drag=function(state){var doc=$(document);var posX=0,posY=0,posXRecord=0,posYRecord=0;var open=false;if(!isUndefined(state)){open=state}var mouseDown=function(e){e.preventDefault&&e.preventDefault();e=e||window.event;var client=getClient(e);posXRecord=client['x'];posYRecord=client['y'];doc.mousemove(docMouseMove);doc.mouseup(docMouseUp);CK.css({'cursor':'move'})};var docMouseMove=function(e){e=e||window.event;var client=getClient(e);var eleOffset=CK.offset();posY=client['y']-posYRecord;posX=client['x']-posXRecord;posXRecord=client['x'];posYRecord=client['y'];var left=eleOffset['left']+posX;var top=eleOffset['top']+posY;CK.css({'left':left+'px','top':top+'px'});if(CK.css('position')!='fixed'){CK.css({'position':'fixed'})}isDrag=true};var docMouseUp=function(){doc.removeListener('mousemove',docMouseMove);doc.removeListener('mouseup',docMouseUp);CK.css({'cursor':'default'})};if(open){CK.mousedown(mouseDown)}else{CK.unbind('mousedown')}},checkVideoRotate=function(){var ckW=CK.getWidth()*nowZoom*0.01,ckH=CK.getHeight()*nowZoom*0.01;var vW=CV.getWidth(),vH=CV.getHeight();CV.css({'transform':'rotate('+nowRotate+'deg)','-ms-transform':'rotate('+nowRotate+'deg)','-moz-transform':'rotate('+nowRotate+'deg)','-webkit-transform':'rotate('+nowRotate+'deg)','-o-transform':'rotate('+nowRotate+'deg)','width':nowZoom+'%','height':nowZoom+'%'});if(nowRotate!=0&&nowRotate!=180){if(vH>ckW&&vW>ckH){if(vH/ckW>vW/ckH){CV.css({'height':nowZoom+'%','width':ckH+'px'})}else{CV.css({'width':nowZoom+'%','height':ckW+'px'})}return}if(vH<ckW&&vW<ckH){if(ckW>ckH){CV.css({'height':nowZoom+'%','width':ckH+'px'})}else{if(vH/vW>=ckW/ckH){CV.css({'width':nowZoom+'%','height':ckW+'px'})}else{CV.css({'height':nowZoom+'%','width':ckH+'px'})}}return}if(vH>=ckW&&vW<=ckH){CV.css({'width':nowZoom+'%','height':ckW+'px'});return}if(vW>=ckH&&vH<ckW){CV.css({'height':nowZoom+'%','width':ckH+'px'})}}},allBarShow=function(){if(barShow){C['bar'].show();C['topBar'].show()}if(rightBarShow){C['rightBar'].show()}C['tempTime'].hide();if(!isUndefined(C['logo'])){C['logo'].show()}},allBarHide=function(tempTime){if(isUndefined(tempTime)){tempTime=true}C['bar'].hide();C['topBar'].hide();C['rightBar'].hide();if(tempTime){C['tempTime'].show()}if(!isUndefined(C['logo'])){C['logo'].hide()}},message=function(str,right){C['message'].htm('');var msgHide=function(){C['message'].removeClass('ck-message-right').removeClass('ck-animate-bouncein').removeClass('ck-animate');C['message'].hide()};if(str){C['message'].htm(str);C['message'].show();if(!C['message'].hasClass('ck-animate')){C['message'].addClass('ck-animate ck-animate-bouncein')}if(!isUndefined(right)&&right){if(!C['message'].hasClass('ck-message-right')){C['message'].addClass('ck-message-right')}}if(msgSetTime){clearTimeout(msgSetTime);msgSetTime=null}msgSetTime=setTimeout(function(){msgHide();msgSetTime=null},1500)}else{msgHide()}},tip=function(ele,str,cl,align){C['tip']['content'].htm('');if(str){C['tip']['content'].htm(str);C['tip'].show();if(!C['tip'].hasClass('ck-animate')){C['tip'].addClass('ck-animate ck-animate-bouncein')}if(isUndefined(align)){align='auto'}if(align=='left'){C['tip']['content'].removeClass('ck-content-float-auto').addClass('ck-content-float-left');C['tip']['triangle'].removeClass('ck-triangle-auto').addClass('ck-triangle-left')}else{C['tip']['content'].removeClass('ck-content-float-left').addClass('ck-content-float-auto');C['tip']['triangle'].removeClass('ck-triangle-left').addClass('ck-triangle-auto')}tipResize(ele,cl,align);if(isUndefined(closeTipFun)){closeTipFun=function(){if(tipSetTime){clearTimeout(tipSetTime);tipSetTime=null}};closeTipMouseOut=function(ele){closeTipFun();tipSetTime=setTimeout(function(){tip();tipSetTime=null},100);if(ele){ele.removeListener('mouseout',closeTipMouseOut)}}}closeTipFun();ele.mouseout(function(){closeTipMouseOut(ele)})}else{C['tip'].hide();C['tip'].removeClass('ck-animate');C['tip'].removeClass('ck-animate-bouncein')}},tipResize=function(ele,cl,align){var offset=ele.offset();var ckOffset=CK.offset();var w=C['tip'].getWidth(),h=C['tip'].getHeight();var ew=ele.getWidth();var left=0,top=offset['top']-ckOffset['top']-h;if(getBarHeight()>C['bar'].getHeight()){top-=(getBarHeight()-C['bar'].getHeight())}if(w>ew){left=offset['left']-ckOffset['left']-(w-ew)*.5}else{left=offset['left']-ckOffset['left']+(ew-w)*.5}if(align=='left'){left=offset['left']-ckOffset['left']-w;top=offset['top']-ckOffset['top']}if(!isUndefined(cl)){left=cl['x']-ckOffset['left']-w*.5}if(left<0){left=0}if(top<0){top=0}if(left>CM.getWidth()-w){left=CM.getWidth()-w}if(top>CM.getHeight()-h){top=CM.getHeight()-h}C['tip'].css({'left':left+'px','top':top-parseInt(C['tip'].css('margin-bottom'))+'px'})},progressDragX=function(){var bg=C['bar']['pbox']['bg'],play=C['bar']['pbox']['play'],slider=C['bar']['pbox']['slider'],mouseLine=C['bar']['pbox']['mouseLine'];slider.unbind();bg.unbind();var pos=0,posRecord=0;var doc=$(document);var sliderDownTime=0;var sliderMouseDown=function(e){e.preventDefault&&e.preventDefault();if(!vars['timeScheduleAdjust']){return}e=e||window.event;var eleOffset=slider.offset(),bgOffset=bg.offset(),client=getClient(e);pSliderMouseDown=true;posRecord=client['x'];var left=eleOffset['left']-bgOffset['left'];sliderDownTime=left*duration/(bg.getWidth()-slider.getWidth());slider.removeListener('mousedown',sliderMouseDown);slider.removeListener('touchstart',sliderMouseDown);doc.mousemove(docMouseMove);doc.mouseup(docMouseUp);slider.touchmove(docMouseMove);slider.touchend(docMouseUp);noScrolling(true)};var docMouseMove=function(e){e=e||window.event;var eleOffset=slider.offset(),bgOffset=bg.offset(),client=getClient(e);pSliderMouseDown=true;pos=posRecord-client['x'];posRecord=client['x'];var left=eleOffset['left']-pos-bgOffset['left'];if(left<0){left=0}if(left>bg.getWidth()-slider.getWidth()){left=bg.getWidth()-slider.getWidth()}C['bar']['pbox'].addClass('ck-bar-progress-slider-move');var time='';if(!vars['live']){time=left*duration/(bg.getWidth()-slider.getWidth());switch(vars['timeScheduleAdjust']){case 2:if(time<sliderDownTime){left=-1000;message(language['timeScheduleAdjust']['prohibitBackOff'])}break;case 3:if(time>sliderDownTime){left=-1000;message(language['timeScheduleAdjust']['prohibitForward']);return}break;case 4:if(time<firstSeekTime){left=-1000;player.seek(firstSeekTime);message(language['timeScheduleAdjust']['prohibitLookBack']);return}break;case 5:if(time>maxSeeTime){left=-1000;player.seek(maxSeeTime);message(language['timeScheduleAdjust']['prohibitForwardNotViewed']);return}break}time=formatSeconds(time)}else{time=formatLiveTime(left*getLiveTime()/(bg.getWidth()-slider.getWidth()))}tip(slider,time);if(left>=0){slider.css({'left':left+'px'});play.css({'width':left+slider.getWidth()*.5+'px'})}else{pSliderMouseDown=false}};var docMouseUp=function(){noScrolling();doc.removeListener('mousemove',docMouseMove);doc.removeListener('mouseup',docMouseUp);slider.removeListener('touchmove',docMouseMove);slider.removeListener('touchend',docMouseUp);slider.mousedown(sliderMouseDown);slider.touchstart(sliderMouseDown);if(!vars['live']){var time=play.getWidth()*duration/(bg.getWidth()-slider.getWidth()*.5);if(time>duration){time=duration}seekTime=0;player.seek(time)}else{var playbackTime=parseInt(vars['live']+play.getWidth()*getLiveTime()/(bg.getWidth()-slider.getWidth()*.5));eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)});eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)})}C['bar']['pbox'].removeClass('ck-bar-progress-slider-move');if(isMouseLeave){tip()}};var isMouseLeave=true;var sliderMouseOver=function(){var time='';if(!vars['live']){time=formatSeconds(parseInt(slider.css('left'))*duration/(bg.getWidth()-slider.getWidth()))}else{time=language['live']}isMouseLeave=false;tip(slider,time)};var sliderMouseLeave=function(){isMouseLeave=true};slider.mousedown(sliderMouseDown);slider.mouseover(sliderMouseOver);slider.mouseleave(sliderMouseLeave);slider.touchstart(sliderMouseDown);var bgMouseDown=function(e){e=e||window.event;var client=getClient(e);var bgOffset=bg.offset();var w=client['x']-bgOffset['left'];if(CT.full){w+=CK.offset()['left']}if(!vars['live']){var time=duration*w/bg.getWidth();switch(vars['timeScheduleAdjust']){case 0:message(language['timeScheduleAdjust']['prohibit']);return;break;case 2:if(time<oldTime){message(language['timeScheduleAdjust']['prohibitBackOff']);return}break;case 3:if(time>oldTime){message(language['timeScheduleAdjust']['prohibitForward']);return}break;case 4:if(time<firstSeekTime){message(language['timeScheduleAdjust']['prohibitLookBack']);return}break;case 5:if(time>maxSeeTime){message(language['timeScheduleAdjust']['prohibitForwardNotViewed']);return}break}seekTime=0;player.seek(time)}else{var playbackTime=parseInt(vars['live']+getLiveTime()*w/bg.getWidth());eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)});eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)})}if(w>bg.getWidth()-slider.getWidth()*.5){w=bg.getWidth()-slider.getWidth()*.5}if(w<slider.getWidth()*.5){w=slider.getWidth()*.5}pSliderMouseDown=true;play.css({'width':w+'px'});slider.css({'left':w-slider.getWidth()*.5+'px'})};var moveTimer=null;var bgMouseMove=function(e){e=e||window.event;var client=getClient(e);var bgOffset=bg.offset();var w=client['x']-bgOffset['left'];clearTime();if(CT.full){w+=CK.offset()['left']}var time=0;if(!vars['live']){time=duration*w/bg.getWidth();showPreview(time);time=formatSeconds(time)}else{time=formatLiveTime(getLiveTime()*w/bg.getWidth())}tip(bg,time,client);mouseLine.css({'left':w-(C['bar']['pbox']['mouseLine'].getWidth()*.5)+'px'})};var moveTimer=null;var clearTime=function(){if(moveTimer){clearTimeout(moveTimer);moveTimer=null}closeTipFun()};var bgMouseOut=function(e){clearTime();moveTimer=setTimeout(function(){showPreview(-1)},30)};bg.mousedown(bgMouseDown);bg.mousemove(bgMouseMove);bg.mouseout(bgMouseOut);mouseLine.mouseover(clearTime)},volumeDragY=function(){var box=C['bar']['vbox']['volume']['box'],bg=C['bar']['vbox']['volume']['bg'],pp=C['bar']['vbox']['volume']['pp'],slider=C['bar']['vbox']['volume']['slider'],doc=$(document);var pos=0,posRecord=0;var sliderMouseDown=function(e){e.preventDefault&&e.preventDefault();noScrolling(true);e=e||window.event;var client=getClient(e);posRecord=client['y'];slider.removeListener('mousedown',sliderMouseDown);slider.removeListener('touchstart',sliderMouseDown);C['bar']['vbox']['mouseDown']=true;doc.mousemove(docMouseMove);doc.mouseup(docMouseUp);slider.touchmove(docMouseMove);slider.touchend(docMouseUp)};var docMouseMove=function(e){e=e||window.event;var client=getClient(e);var eleOffset=slider.offset();var boxOffset=box.offset();var bgOffset=bg.offset();pos=client['y']-posRecord;posRecord=client['y'];var sliderTop=eleOffset['top']-boxOffset['top']+pos;var minTop=bgOffset['top']-boxOffset['top'],maxTop=bgOffset['top']+bg.getHeight()-boxOffset['top']-slider.getHeight();if(sliderTop<minTop){sliderTop=minTop}if(sliderTop>maxTop){sliderTop=maxTop}slider.css({'top':sliderTop+'px'});var ppMarginTop=sliderTop-minTop+slider.getHeight()*0.5;pp.css({'margin-top':ppMarginTop+'px'});var vol=(bg.getHeight()-ppMarginTop-slider.getHeight()*0.5)/(bg.getHeight()-slider.getHeight());player.volume(vol)};var docMouseUp=function(){noScrolling();doc.removeListener('mousemove',docMouseMove);doc.removeListener('mouseup',docMouseUp);slider.removeListener('touchmove',docMouseMove);slider.removeListener('touchend',docMouseUp);slider.mousedown(sliderMouseDown);slider.touchstart(sliderMouseDown);C['bar']['vbox']['mouseDown']=false};slider.mousedown(sliderMouseDown);slider.touchstart(sliderMouseDown);var bgMouseDown=function(e){e=e||window.event;var client=getClient(e);var bgOffset=bg.offset();var h=client['y']-bgOffset['top'];var max=bg.getHeight();var vol=1-h/max;player.volume(vol)};bg.mousedown(bgMouseDown)},changeProgress=function(time){if((valType(vars['live'])=='boolean'&&vars['live'])){return}if(!pSliderMouseDown){var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider'];var playW=(time/duration)*100;if(valType(vars['live'])=='number'){playW='100'}C['bar']['pbox']['play'].css({'width':playW+'%'});var sliderW=(slider.getWidth()/bg.getWidth())*100;var sliderLeft=playW-sliderW*.5;if(sliderLeft<0){sliderLeft=0}if(sliderLeft>100-sliderW){sliderLeft=100-sliderW}C['bar']['pbox']['slider'].css({'left':sliderLeft+'%'});checkProgressSlider()}},checkProgressSlider=function(){var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider'];var st=0;if(C['bar']['pbox'].css('transition-duration')){st=parseFloat(C['bar']['pbox'].css('transition-duration'))*1000+20}var checkThis=function(){var sliderLeft=parseInt(C['bar']['pbox']['slider'].css('left'));if(sliderLeft<0){sliderLeft=0;C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'})}if(sliderLeft>bg.getWidth()-slider.getWidth()){sliderLeft=bg.getWidth()-slider.getWidth();C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'})}};setTimeout(checkThis,st)},changeTopTime=function(){C['topBar']['timeEle'].htm(date('H:i:s'));setTimeout(changeTopTime,1000)},changeVolumeSlider=function(vol){if(!isUndefined(C['bar']['vbox'])){var box=C['bar']['vbox']['volume']['box'],bg=C['bar']['vbox']['volume']['bg'],pp=C['bar']['vbox']['volume']['pp'],slider=C['bar']['vbox']['volume']['slider'];C['bar']['vbox']['volume']['txt'].htm(parseInt(vol*100));var bgH=bg.getHeight();if(bgH){var ppMarginTop=bgH-vol*bgH;pp.css({'margin-top':ppMarginTop+'px'});var sliderTop=bg.offset()['top']-box.offset()['top']+ppMarginTop-slider.getHeight()*0.5;slider.css({'top':sliderTop+'px'})}}},changeLoad=function(){if(video){var len=video.buffered.length;if(len>0){var bufferEnd=video.buffered.end(len-1);if(loadTime<bufferEnd){loadTime=bufferEnd}replaceInformation('loadTime',parseInt(loadTime*100)*0.01);C['bar']['pbox']['load'].css('width',(loadTime/duration)*100+'%')}}},changeMuted=function(b){if(b){C['bar']['vbox']['muted'].hide();C['bar']['vbox']['exitMuted'].show();C['ad']['bottom']['mutedAndExit']['muted'].hide();C['ad']['bottom']['mutedAndExit']['exitMuted'].show();message(language['muted'])}else{C['bar']['vbox']['muted'].show();C['bar']['vbox']['exitMuted'].hide();C['ad']['bottom']['mutedAndExit']['muted'].show();C['ad']['bottom']['mutedAndExit']['exitMuted'].hide()}},replaceInformation=function(o,n){if(isUndefined(C['about']['sourceData'])&&!isUndefined(C['about'].find('ul'))){C['about']['sourceData']=C['about'].find('ul').eq(0).htm();C['about']['objData']={};var reg=/{(.*?)}/g;var res=C['about']['sourceData'].match(reg);while(res=reg.exec(C['about']['sourceData'])){C['about']['objData'][res[1]]='0'}}if(!isUndefined(C['about'].find('ul'))){var reg=null;var htm=C['about']['sourceData'];var temp=C['about']['textareaText'];if(C['about']['objData']){for(var k in C['about']['objData']){if(o!=k){reg=new RegExp('{'+k+'}','g');var val=C['about']['objData'][k];if(isUndefined(val)){val='0'}htm=htm.replace(reg,val);temp=temp.replace(reg,val)}}}reg=new RegExp('{'+o+'}','g');htm=htm.replace(reg,n||'');temp=temp.replace(reg,n||'');C['about']['textareaEle'].htm(temp);C['about']['objData'][o]=n;return C['about'].find('ul').eq(0).htm(htm)}},calculationFps=function(){var requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1000/60)};var e,pe,pid,fps,last,offset;fps=0;last=Date.now();var step=function(){offset=Date.now()-last;fps+=1;if(offset>=1000){last+=offset;appendFps(fps);fps=0}requestAnimationFrame(step)};var appendFps=function(fps){if(fps!=CT.fps){CT.fps=fps;replaceInformation('fps',fps);eventTarget('fps',fps)}};if(isUndefined(CT.fps)){CT.fps=0}step()},getElement=function(content){var ele=$(content);if(isUndefined(ele))return;if(valType(ele)=='htmlarray'){ele=ele[0]}if(isUndefined(ele.captureParentNode)){ele.captureParentNode=ele.parentNode;ele.prevElement=ele.prev();ele.nextElement=ele.next()}return ele},$=function(obj,eL){var parent=null;if(document){parent=document}if(!isUndefined(eL)){parent=eL}var res=[];if(obj){if(valType(obj)=='htmlobject'||valType(obj)=='object'){res=obj;if(!isUndefined(res.ckplayer)){return res}}else if(valType(obj)=='string'&&obj!=''){switch(obj.substr(0,1)){case'.':obj=obj.substr(1,obj.length);if(parent.getElementsByClassName){res=parent.getElementsByClassName(obj);if(!res.length){return null}}else if(!parent&&document.getElementsByClassName){res=document.getElementsByClassName(obj);if(!res.length){return null}}else{var reg=new RegExp(' '+obj+' ','i');var ele=null;if(parent.getElementsByTagName){ele=parent.getElementsByTagName('*')}else{ele=document.getElementsByTagName('*')}for(var i=0;i<ele.length;i++){if(reg.test(' '+ele[i].className+' ')){res.push(ele[i])}}}if(res){if(res.length===0){res=null}}break;case'#':obj=obj.substr(1,obj.length);if(parent.getElementById){res=parent.getElementById(obj)}else{res=document.getElementById(obj)}break;default:var reg=new RegExp(' '+obj+' ','i');if(parent.getElementsByTagName){res=parent.getElementsByTagName(obj)}else{res=document.getElementsByTagName(obj)}if(res){if(obj=='body'||obj=='document'||obj=='html'){res=res[0]}else if(res.length===0){res=null}}else{res=null}break}}else{res=obj}}else{res=document}if(res){if(valType(res)=='htmlobject'||valType(res)=='object'||valType(res)=='document'){res.ckplayer='Thanks for using';res.find=function(obj){return $(obj,this)};res.attr=function(key,value){if(isUndefined(value)){return this.getAttribute(key)}else{this.setAttribute(key,value);return this}};res.removeAttr=function(key){this.removeAttribute(key);return this};res.css=function(key,value){var keyNew=function(str){if(str.indexOf('-')!=-1){var arr=str.split('-');var a=arr[0];var b='',c='';if(arr.length>1){b=arr[1].substr(0,1).toLocaleUpperCase()+arr[1].substr(1,arr[1].length-1)}if(arr.length>2){b=arr[2].substr(0,1).toLocaleUpperCase()+arr[2].substr(1,arr[2].length-1)}return a+b+c}return str};if(isUndefined(value)){if(!isUndefined(key)&&valType(key)=='string'){if(this.currentStyle){return this.currentStyle[key]}else{return document.defaultView.getComputedStyle(this,null)[key]}}if(isUndefined(key)){if(this.currentStyle){return this.currentStyle}else{return document.defaultView.getComputedStyle(this,null)}}}if(valType(key)!='object'){var newKey=keyNew(key);if(this.length>1){for(var i=0;i<this.length;i++){this[i].style[newKey]=value}}else{this.style[newKey]=value}}else{for(var item in key){var objKey=keyNew(item);if(valType(this)=='htmlarray'){for(var i=0;i<this.length;i++){this[i].style[objKey]=key[item]}}else{this.style[objKey]=key[item]}}}return this};res.hasClass=function(cName){if(isUndefined(cName))return false;var reg=new RegExp('(\\s|^)'+cName+'(\\s|$)');if(this.className&&this.className.match(reg)){return true}return false};res.addClass=function(cName){if(!this.hasClass(cName)){if(this.className&&this.className.substr(this.className.length-1,1)!=' '){this.className+=' '}this.className+=cName};return this};res.removeClass=function(cName){if(this.hasClass(cName)){this.className=this.className.replace(new RegExp('(\\s|^)'+cName+'(\\s|$)'),' ');if(this.className.substr(this.className.length-1,1)==' '){this.className=this.className.substr(0,this.className.length-1)}if(!this.className){this.removeAttribute('class')}};return this};res.searchClass=function(cName){var arr=this.className.split(' ');for(var i=0;i<arr.length;i++){if(arr[i].substr(0,cName.length)==cName){return arr[i]}}return this};res.removeCss=function(cName){var cs=this.attr('style');if(cs){var arr=cs.split(';');var obj={};for(var i=0;i<arr.length;i++){var arrT=arr[i].split(':');if(arrT.length==2&&arrT[0]&&arrT[0].trim()!=cName){obj[arrT[0].trim()]=arrT[1].trim()}}this.attr('style','');this.css(obj)}};res.addListener=function(e,f,t){return addListener(this,e,f,t)};res.removeListener=function(e,f,t){return removeListener(this,e,f,t)};res.prev=function(){return prev(this)};res.next=function(){return next(this)};res.append=function(ele){this.appendChild(ele);return this};res.remove=function(){if(!isUndefined(this.parentNode)){this.parentNode.removeChild(this)}return null};res.bind=function(e,f,t){return addListener(this,e,f,t)};res.unbind=function(e,f){var i=0;var arr=[];if(!isUndefined(f)){res.removeListener(e,f)}else if(!isUndefined(e)){if(!isUndefined(this.listenerList)){arr=this.listenerList;for(i=0;i<arr.length;i++){if(arr[i][0]==e){res.removeListener(e,arr[i][1])}}}}else{if(!isUndefined(this.listenerList)){arr=this.listenerList;for(i=0;i<arr.length;i++){res.removeListener(arr[i][0],arr[i][1])}}}};res.htm=function(val){if(!isUndefined(val)){res.innerHTML=val}else{return res.innerHTML}};res.htmReplace=function(ar,val,html){if(!isUndefined(val)&&!isUndefined(ar)){if(isUndefined(this.attr('data-htm'))){this.attr('data-htm',html)}var htm=this.attr('data-htm');var reg=new RegExp(ar,'g');htm=htm.replace(reg,val);this.htm(htm)}};res.offset=function(){var par=this.offsetParent,left=this.offsetLeft,top=this.offsetTop;while(par&&par.tagName!=='BODY'){if(!/MSIE 8\.0/.test(navigator.userAgent)){left+=par.clientLeft;top+=par.clientTop}left+=par.offsetLeft;top+=par.offsetTop;par=par.offsetParent}return{top:top,left:left}};res.fixed=function(){if(this.css('position')=='fixed'){return true}if(!isUndefined(this.offsetParent)){return $(this.offsetParent).fixed()}return false};res.getWidth=function(){return this.offsetWidth};res.getHeight=function(){return this.offsetHeight};if(isUndefined(res.width)){res.width=function(){return this.offsetWidth}}if(isUndefined(res.height)){res.height=function(){return this.offsetWidth}}res.resize=function(fn){addListener(window,'resize',fn)};res.click=function(fn){addListener(this,'click',fn);return this};res.singleClick=function(fn){if(isUndefined(this.dbClick)){doubleClickEvent(this);this.dbClick=true}this.addListener('sigClick',fn);return this};res.doubleClick=function(fn){if(isUndefined(this.dbClick)){doubleClickEvent(this);this.dbClick=true}this.addListener('dobClick',fn);return this};res.mouseover=function(fn){addListener(this,'mouseover',fn);return this};res.mouseout=function(fn){addListener(this,'mouseout',fn);return this};res.mousedown=function(fn){addListener(this,'mousedown',fn);return this};res.mouseup=function(fn){addListener(this,'mouseup',fn);return this};res.mousemove=function(fn){addListener(this,'mousemove',fn);return this};res.mouseWheel=function(fn){addListener(this,'mousewheel',fn);addListener(this,'DOMMouseScroll',fn,false);return this};res.mouseleave=function(fn){addListener(this,'mouseleave',fn);return this};res.touchstart=function(fn){addListener(this,'touchstart',fn);return this};res.touchmove=function(fn){addListener(this,'touchmove',fn);return this};res.touchend=function(fn){addListener(this,'touchend',fn);return this};res.show=function(){this.css('display','block');return this};res.hide=function(){this.css('display','none');return this};res.animate=function(parameter,totalTime,easing,callBack){if(isUndefined(this.CK)){return res}var thisTemp=this;var parNode=this.CK;var w=parNode.getWidth(),h=parNode.getHeight();var speed=10;this.timerTween=null;this.tweenPlay=true;if(isUndefined(parameter)){return this}if(isUndefined(totalTime)||totalTime==0){totalTime=1000}if(isUndefined(easing)||easing==''){easing='None.easeIn'}var effArr=easing.split('.');var tween={None:{easeIn:function(t,b,c,d){return c*t/d+b},easeOut:function(t,b,c,d){return c*t/d+b},easeInOut:function(t,b,c,d){return c*t/d+b}},Quadratic:{easeIn:function(t,b,c,d){return c*(t/=d)*t+b},easeOut:function(t,b,c,d){return-c*(t/=d)*(t-2)+b},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t+b;return-c/2*((--t)*(t-2)-1)+b}},Cubic:{easeIn:function(t,b,c,d){return c*(t/=d)*t*t+b},easeOut:function(t,b,c,d){return c*((t=t/d-1)*t*t+1)+b},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t*t+b;return c/2*((t-=2)*t*t+2)+b}},Quartic:{easeIn:function(t,b,c,d){return c*(t/=d)*t*t*t+b},easeOut:function(t,b,c,d){return-c*((t=t/d-1)*t*t*t-1)+b},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t*t*t+b;return-c/2*((t-=2)*t*t*t-2)+b}},Quintic:{easeIn:function(t,b,c,d){return c*(t/=d)*t*t*t*t+b},easeOut:function(t,b,c,d){return c*((t=t/d-1)*t*t*t*t+1)+b},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t*t*t*t+b;return c/2*((t-=2)*t*t*t*t+2)+b}},Sine:{easeIn:function(t,b,c,d){return-c*Math.cos(t/d*(Math.PI/2))+c+b},easeOut:function(t,b,c,d){return c*Math.sin(t/d*(Math.PI/2))+b},easeInOut:function(t,b,c,d){return-c/2*(Math.cos(Math.PI*t/d)-1)+b}},Exponential:{easeIn:function(t,b,c,d){return(t==0)?b:c*Math.pow(2,10*(t/d-1))+b},easeOut:function(t,b,c,d){return(t==d)?b+c:c*(-Math.pow(2,-10*t/d)+1)+b},easeInOut:function(t,b,c,d){if(t==0)return b;if(t==d)return b+c;if((t/=d/2)<1)return c/2*Math.pow(2,10*(t-1))+b;return c/2*(-Math.pow(2,-10*--t)+2)+b}},Circular:{easeIn:function(t,b,c,d){return-c*(Math.sqrt(1-(t/=d)*t)-1)+b},easeOut:function(t,b,c,d){return c*Math.sqrt(1-(t=t/d-1)*t)+b},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return-c/2*(Math.sqrt(1-t*t)-1)+b;return c/2*(Math.sqrt(1-(t-=2)*t)+1)+b}},Elastic:{easeIn:function(t,b,c,d,a,p){if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(!a||a<Math.abs(c)){a=c;var s=p/4}else var s=p/(2*Math.PI)*Math.asin(c/a);return-(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b},easeOut:function(t,b,c,d,a,p){if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(!a||a<Math.abs(c)){a=c;var s=p/4}else var s=p/(2*Math.PI)*Math.asin(c/a);return(a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b)},easeInOut:function(t,b,c,d,a,p){if(t==0)return b;if((t/=d/2)==2)return b+c;if(!p)p=d*(.3*1.5);if(!a||a<Math.abs(c)){a=c;var s=p/4}else var s=p/(2*Math.PI)*Math.asin(c/a);if(t<1)return-.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*.5+c+b}},Back:{easeIn:function(t,b,c,d,s){if(s==undefined)s=1.70158;return c*(t/=d)*t*((s+1)*t-s)+b},easeOut:function(t,b,c,d,s){if(s==undefined)s=1.70158;return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},easeInOut:function(t,b,c,d,s){if(s==undefined)s=1.70158;if((t/=d/2)<1)return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b;return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b}},Bounce:{easeIn:function(t,b,c,d){return c-tween.Bounce.easeOut(d-t,0,c,d)+b},easeOut:function(t,b,c,d){if((t/=d)<(1/2.75)){return c*(7.5625*t*t)+b}else if(t<(2/2.75)){return c*(7.5625*(t-=(1.5/2.75))*t+.75)+b}else if(t<(2.5/2.75)){return c*(7.5625*(t-=(2.25/2.75))*t+.9375)+b}else{return c*(7.5625*(t-=(2.625/2.75))*t+.984375)+b}},easeInOut:function(t,b,c,d){if(t<d/2){return tween.Bounce.easeIn(t*2,0,c,d)*.5+b}else{return tween.Bounce.easeOut(t*2-d,0,c,d)*.5+c*.5+b}}}};if(effArr.length!=2){return null}if(!(effArr[0]in tween)){return null}if(!(effArr[1]in tween[effArr[0]])){return null}var tweenFun=tween[effArr[0]][effArr[1]];var getStartAndEnd=function(arr){var vars=arr[1];var current=0,result=0;switch(arr[0]){case'width':current=thisTemp.getWidth();if(vars.substring(vars.length-1,vars.length)=='%'){result=parseInt(vars)*h*0.01}else{result=parseInt(vars)}break;case'height':current=thisTemp.getHeight();if(vars.substring(vars.length-1,vars.length)=='%'){result=parseInt(vars)*h*0.01}else{result=parseInt(vars)}break;case'left':if(!isUndefined(thisTemp.css('left'))){current=parseInt(thisTemp.css('left'))}else{current=thisTemp.offset()['left']-parNode.offset()['left']}if(vars.substring(vars.length-1,vars.length)=='%'){result=parseInt(vars)*w*0.01}else{result=parseInt(vars)}thisTemp.css('right','auto');break;case'right':if(!isUndefined(thisTemp.css('right'))){current=parseInt(thisTemp.css('right'))}else{current=parNode.getWidth()-(thisTemp.offset()['left']-parNode.offset()['left']+thisTemp.getWidth())}if(vars.substring(vars.length-1,vars.length)=='%'){result=parseInt(vars)*w*0.01}else{result=parseInt(vars)}thisTemp.css('left','auto');break;case'top':if(!isUndefined(thisTemp.css('top'))){current=parseInt(thisTemp.css('top'))}else{current=thisTemp.offset()['top']-parNode.offset()['top']}if(vars.substring(vars.length-1,vars.length)=='%'){result=parseInt(vars)*h*0.01}else{result=parseInt(vars)}thisTemp.css('bottom','auto');break;case'bottom':if(!isUndefined(thisTemp.css('bottom'))){current=parseInt(thisTemp.css('bottom'))}else{current=parNode.getHeight()-(thisTemp.offset()['top']-parNode.offset()['top']+thisTemp.getHeight())}if(vars.substring(vars.length-1,vars.length)=='%'){result=parseInt(vars)*h*0.01}else{result=parseInt(vars)}thisTemp.css('top','auto');break;case'alpha':if(!isUndefined(thisTemp.css('filter'))&&thisTemp.css('filter')!='none'){current=Number(thisTemp.css('filter'))*100}else if(!isUndefined(thisTemp.css('opacity'))&&thisTemp.css('opacity')!='none'){current=thisTemp.css('opacity')*100}else{current=100}if(vars.substring(vars.length-1,vars.length)=='%'){result=parseInt(vars)}else{result=vars*100}break}result-=current;if(current!=result){return{'type':arr[0],'current':current,'result':result}}return null};var stopTween=function(){if(thisTemp.timerTween!=null){clearInterval(thisTemp.timerTween);thisTemp.timerTween=null}};parameter=parameter.replace(/[ ]*,[ ]*|[ ]+/g,';');var newCss=[];var parameterArr=parameter.split(';');for(var i=0;i<parameterArr.length;i++){var cssArr=parameterArr[i].split(':');if(cssArr.length==2){var temp=getStartAndEnd(cssArr);if(temp){newCss.push(temp)}}}var funTime=0;var timeFun=function(){var styleObj={};if(thisTemp.tweenPlay){if(funTime<totalTime){funTime+=speed;for(var i=0;i<newCss.length;i++){var ob=newCss[i];var ap=Math.ceil(tweenFun(funTime,ob['current'],ob['result'],totalTime));switch(ob['type']){case'width':styleObj['width']=ap+'px';styleObj['overflow']='hidden';break;case'height':styleObj['height']=ap+'px';styleObj['overflow']='hidden';break;case'left':styleObj['left']=ap+'px';break;case'right':styleObj['right']=ap+'px';break;case'top':styleObj['top']=ap+'px';break;case'bottom':styleObj['bottom']=ap+'px';break;case'alpha':styleObj['filter']='alpha(opacity:'+ap*0.01+')';styleObj['opacity']=ap*0.01;break}}thisTemp.css(styleObj)}else{stopTween();if(!isUndefined(callBack)){callBack(thisTemp)}}}};stopTween();this.timerTween=setInterval(timeFun,speed);return this};res.animatePlay=function(){if(!isUndefined(this.timerTween)){this.tweenPlay=true}return this};res.animatePause=function(){if(!isUndefined(this.timerTween)){this.tweenPlay=false}return this}}else{res.each=function(fn){for(var i in this){if(this.hasOwnProperty(i)){if(valType(this[i])=='htmlobject'){fn(i,this[i])}else{try{if(!this[0].nodeName)fn(i,this[i])}catch(e){fn(i,this[i])}}}}};res.eq=function(m){if(valType(this)=='htmlarray'){if(this.length>=m+1){return this[m]}return null}return null};for(var i=0;i<res.length;i++){if($){try{res[i]=$(res[i])}catch(event){}}}}}return res},createlDiv=function(className,html){var ele=document.createElement('div');var eleObject=$(ele);if(className){eleObject.addClass(className)}if(html){eleObject.htm(html)}return eleObject},createlVideo=function(){var ele=document.createElement('video');var eleObject=$(ele);return eleObject},createlButton=function(className,html){var ele=document.createElement('button');var eleObject=$(ele);eleObject.attr('type','button');if(className){eleObject.addClass(className)}if(html){eleObject.htm(html)}return eleObject},createlA=function(html,href,className){var ele=document.createElement('a');var eleObject=$(ele);if(html){eleObject.htm(html)}if(!isUndefined(href)&&href){eleObject.attr('href',href);eleObject.attr('target','_blank')}if(className){eleObject.addClass(className)}return eleObject},createlJsLink=function(html,js){var ele=document.createElement('a');var eleObject=$(ele);if(html){eleObject.htm(html)}if(!isUndefined(js)&&js){eleObject.attr('href','javascript:'+js+'()')}else{eleObject.attr('href','javascript:;')}return eleObject},createlImg=function(file,className){var ele=document.createElement('img');var eleObject=$(ele);if(className){ele.className=className}if(file){ele.src=file}return eleObject},getClient=function(event){var eve=event||window.event;if(isUndefined(eve)){eve={clientX:0,clientY:0}}var x=eve.clientX+(document.documentElement.scrollLeft||$('body').scrollLeft),y=eve.clientY+(document.documentElement.scrollTop||$('body').scrollTop);if(isUndefined(x.toString())||x.toString()=='NaN'){x=eve.touches[0].clientX}if(isUndefined(y.toString())||y.toString()=='NaN'){y=eve.touches[0].clientY}if(x.toString()=='NaN'){x=0}if(y.toString()=='NaN'){y=0}return{x:x,y:y}},getLiveTime=function(){var notTime=Date.now();var varsTime=vars['live'];if(varsTime.toString().length<13){varsTime=varsTime*1000}return notTime-varsTime},formatLiveTime=function(time){var varsTime=vars['live'];if(varsTime.toString().length<13){varsTime=varsTime*1000}varsTime+=time;return language['lookBack']+date('H:i:s',varsTime)},loadJs=function(file,callback){var fn=function(){};if(!isUndefined(callback)){fn=callback}if(checkJs(file)){fn();return}var script=document.createElement('script');script.type='text/javascript';var isReady=false;var timer=null;var doReady=function(){if(timer){clearInterval(timer)}if(isReady)return;isReady=true;if(valType(fn)=='function'){fn()}};var bodyLoad=function(){timer=setInterval(function(){try{if(!isUndefined(script.readyState)&&script.readyState=='complete'){doReady()}}catch(event){}},10)};var w3c=function(){if(valType(fn)=='function'){fn()}removeListener(script,'load',w3c);removeListener(script,'error',w3cError)};var w3cError=function(){if(valType(fn)=='function'){fn()}removeListener(script,'load',w3c);removeListener(script,'error',w3cError)};try{addListener(script,'load',w3c);addListener(script,'error',w3cError)}catch(event){bodyLoad()}script.src=file;$('head').eq(0).append(script)},doubleClickEvent=function(ele){var setTime=null;var clickTime=0;ele=$(ele);ele.click(function(){if(!setTime){setTime=setTimeout(function(){try{ele.dispatchEvent(new Event('sigClick'))}catch(event){var e=document.createEvent('HTMLEvents');e.initEvent('sigClick',false,true);ele.dispatchEvent(e)}clickTime=0;setTime=null},260)}if(!clickTime){clickTime=new Date().getTime()}else{if(new Date().getTime()-clickTime<230){try{ele.dispatchEvent(new Event('dobClick'))}catch(event){var e=document.createEvent('HTMLEvents');e.initEvent('dobClick',false,true);ele.dispatchEvent(e)}clearTimeout(setTime);clickTime=0;setTime=null}}})},noScrolling=function(b){if(isUndefined(b))b=false;var bodyScroll=function(event){event.preventDefault()};if(b){$('body').addListener('touchmove',bodyScroll,{passive:false})}else{$('body').removeListener('touchmove',bodyScroll,{passive:false})}};return into(videoObj)}function ajax(cObj){var callback=null;var obj={method:'get',dataType:'json',charset:'utf-8',async:true,url:'',data:null,success:null,error:null};obj=standardization(obj,cObj);if(isUndefined(obj['url'])){return}var errorFun=function(info){if(!isUndefined(obj['error'])&&valType(obj['error'])=='function'){obj['error'](info)}else{obj['success'](null)}};var successFun=function(success){if(!isUndefined(obj['success'])&&valType(obj['success'])=='function'){obj['success'](success)}};var createXHR=function(){if(window.XMLHttpRequest){return new XMLHttpRequest()}else if(window.ActiveXObject){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(event){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(event){}}}};var formatParams=function(obj){var arr=[];for(var key in obj){arr.push(encodeURIComponent(key)+'='+encodeURIComponent(obj[key]))}return arr.join('&')};if(valType(cObj)!='object'){if(!isUndefined(obj['error'])){obj.error(event)}return}if(obj.dataType==='json'||obj.dataType==='text'||obj.dataType==='html'||obj.dataType==='xml'){var xhr=createXHR();callback=function(){if(xhr.status===200){if(obj.dataType==='json'){try{successFun(eval('('+xhr.responseText+')'))}catch(event){successFun(null)}}else{successFun(xhr.responseText)}}else{errorFun({code:xhr.status,message:xhr.statusText})}};obj.data=formatParams(obj.data);if(obj.method==='get'&&!isUndefined(obj.data)){if(obj.data!=''){if(obj.url.indexOf('?')==-1){obj.url+='?'+obj.data}else{obj.url+='&'+obj.data}}}if(obj.async===true){addListener(xhr,'readystatechange',function(event){if(this.readyState===4&&callback!=null){callback()}})}xhr.open(obj.method,obj.url,obj.async);if(obj.method==='post'){try{xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.setRequestHeader('charset',obj['charset']);xhr.send(obj.data)}catch(event){callback()}}else{try{xhr.send(null)}catch(event){callback()}}if(obj.async===false){callback()}}else if(obj.dataType==='jsonp'){var oHead=document.getElementsByTagName('head')[0];var oScript=document.createElement('script');var callbackName='callback'+new Date().getTime();var params=formatParams(obj.data)+'&callback='+callbackName;oScript.src=obj.url.split('?')+'?'+params;oHead.insertBefore(oScript,oHead.firstChild);window[callbackName]=function(json){if(!isUndefined(obj['success'])&&valType(obj['success'])==='function'){obj['success'](json)}oHead.removeChild(oScript)}}}function documentReady(fn){var isReady=false;var timer=null;var doReady=function(){if(timer)clearInterval(timer);if(isReady)return;isReady=true;if(valType(fn)=='function'){fn()}};var bodyLoad=function(){timer=setInterval(function(){try{if(!isUndefined(document.readyState)&&document.readyState=='complete'){doReady()}}catch(event){}},10)};var w3c=function(){if(valType(fn)=='function'){fn()}removeListener(window,'load',w3c)};if(!isUndefined(document.body)){if(valType(fn)=='function'){fn()}}else{try{addListener(window,'load',w3c)}catch(event){bodyLoad()}}}function getPath(siz){var scriptList=document.scripts,thisPath=scriptList[scriptList.length-1].src;for(var i=0;i<scriptList.length;i++){var scriptName=scriptList[i].getAttribute('name')||scriptList[i].getAttribute('data-name');var src=scriptList[i].src.slice(scriptList[i].src.lastIndexOf('/')+1,scriptList[i].src.lastIndexOf('.'));if((scriptName&&(scriptName=='ckplayer'||scriptName=='ckplayer.min'))||(scriptList[i].src&&(src=='ckplayer'||src=='ckplayer.min'))){thisPath=scriptList[i].src;break}}var path=thisPath.substring(0,thisPath.lastIndexOf('/js/')+1);if(!isUndefined(siz)){path+=siz+'/'}return path}function checkJs(file){var scriptList=document.scripts;for(var i=0;i<scriptList.length;i++){if(scriptList[i].src==file){return scriptList[i]}}return false}function getMaxZIndex(){var arr=document.all||document.querySelectorAll('*');var maxZ=-1;for(var i=0;i<arr.length;i++){var temp=null;try{temp=window.getComputedStyle(arr[i],null).zIndex}catch(event){if(arr[i].style){temp=arr[i].style.zIndex}}if(temp!='auto'&&parseInt(temp)>maxZ){maxZ=parseInt(temp)}}return maxZ}function getWindowSize(){return{width:window.innerWidth,height:window.innerHeight}}function standardization(o,n){var h={};var k;for(k in o){h[k]=o[k]}for(k in n){if(k in h){h[k]=n[k]}}return h}function mergeObj(o,n){var h={};var k;for(k in o){h[k]=o[k]}for(k in n){if(k in h){switch(valType(h[k])){case'object':if(valType(n[k])=='object'){h[k]=mergeObj(h[k],n[k])}break;default:if(valType(h[k])==valType(n[k])){h[k]=n[k]}break}}}return h}function valType(val){if(typeof val==='undefined')return'undefined';var str=Object.prototype.toString.call(val).split(' ')[1].replace(']','').toLowerCase();if(str.substr(0,4)=='html'&&(str.substr(-7)=='element'||str.substr(-8)=='document'||str=='window')){str='htmlobject'}if(str=='htmlcollection'||str=='nodelist'){str='htmlarray'}return str}function isUndefined(val){try{return valType(val)==='undefined'||val===undefined||val===null||(valType(val)==='number'&&isNaN(val))}catch(event){return true}return false}function prev(ele){var e=ele.previousSibling;if(e==null){return null}if(e.nodeType==3){var t=prev(e);if(t&&t.nodeType==1){return t}}else{if(e.nodeType==1){return e}else{return false}}}function next(ele){var e=ele.nextSibling;if(e==null){return null}if(e.nodeType==3){var t=next(e);if(t&&t.nodeType==1){return t}}else{if(e.nodeType==1){return e}else{return false}}}function addListener(ele,e,f,t){if(isUndefined(t)){t=false}if(ele.addEventListener){try{ele.addEventListener(e,f,t)}catch(event){}}else if(ele.attachEvent){try{ele.attachEvent('on'+e,f)}catch(event){}}else{ele['on'+e]=f}if(isUndefined(ele.listenerList)){ele.listenerList=[]}ele.listenerList.push([e,f]);return ele};function removeListener(ele,e,f,t){if(isUndefined(t)){t=false}if(ele.removeEventListener){try{ele.removeEventListener(e,f,t)}catch(e){}}else if(ele.detachEvent){try{ele.detachEvent('on'+e,f)}catch(e){}}else{ele['on'+e]=null}if(!isUndefined(ele.listenerList)){var temp=[];for(var i=0;i<ele.listenerList.length;i++){if(ele.listenerList[i][0]!=e||ele.listenerList[i][1]!=f){temp.push(ele.listenerList[i])}}ele.listenerList=temp}return ele}function formatSeconds(val){if(isUndefined(val))val=0;var result=parseInt(val);if(isUndefined(result))result=0;if(result<0)result=0;var h=Math.floor(result/3600)<10?'0'+Math.floor(result/3600):Math.floor(result/3600),m=Math.floor((result/60%60))<10?'0'+Math.floor((result/60%60)):Math.floor((result/60%60)),s=Math.floor((result%60))<10?'0'+Math.floor((result%60)):Math.floor((result%60)),res='';if(h!=='00')res+=h+':';res+=m+':'+s;return res}function date(format,timestamp){if(isUndefined(timestamp)){timestamp=new Date()}if(timestamp.toString().length<13)timestamp=timestamp*1000;var a,jsdate=((timestamp)?new Date(timestamp):new Date());var pad=function(n,c){if((n=n+'').length<c){return new Array(++c-n.length).join('0')+n}else{return n}};var txt_weekdays=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];var txt_ordin={1:'st',2:'nd',3:'rd',21:'st',22:'nd',23:'rd',31:'st'};var txt_months=['','January','February','March','April','May','June','July','August','September','October','November','December'];var f={d:function(){return pad(f.j(),2)},D:function(){return f.l().substr(0,3)},j:function(){return jsdate.getDate()},l:function(){return txt_weekdays[f.w()]},N:function(){return f.w()+1},S:function(){return txt_ordin[f.j()]?txt_ordin[f.j()]:'th'},w:function(){return jsdate.getDay()},z:function(){return(jsdate-new Date(jsdate.getFullYear()+'/1/1'))/864e5>>0},W:function(){var a=f.z(),b=364+f.L()-a;var nd2,nd=(new Date(jsdate.getFullYear()+'/1/1').getDay()||7)-1;if(b<=2&&((jsdate.getDay()||7)-1)<=2-b){return 1}else{if(a<=2&&nd>=4&&a>=(6-nd)){nd2=new Date(jsdate.getFullYear()-1+'/12/31');return date('W',Math.round(nd2.getTime()/1000))}else{return(1+(nd<=3?((a+nd)/7):(a-(7-nd))/7)>>0)}}},F:function(){return txt_months[f.n()]},m:function(){return pad(f.n(),2)},M:function(){return f.F().substr(0,3)},n:function(){return jsdate.getMonth()+1},t:function(){var n;if((n=jsdate.getMonth()+1)==2){return 28+f.L()}else{if(n&1&&n<8||!(n&1)&&n>7){return 31}else{return 30}}},L:function(){var y=f.Y();return(!(y&3)&&(y%1e2||!(y%4e2)))?1:0},Y:function(){return jsdate.getFullYear()},y:function(){return(jsdate.getFullYear()+'').slice(2)},a:function(){return jsdate.getHours()>11?'pm':'am'},A:function(){return f.a().toUpperCase()},B:function(){var off=(jsdate.getTimezoneOffset()+60)*60;var theSeconds=(jsdate.getHours()*3600)+(jsdate.getMinutes()*60)+jsdate.getSeconds()+off;var beat=Math.floor(theSeconds/86.4);if(beat>1000)beat-=1000;if(beat<0)beat+=1000;if((String(beat)).length==1)beat='00'+beat;if((String(beat)).length==2)beat='0'+beat;return beat},g:function(){return jsdate.getHours()%12||12},G:function(){return jsdate.getHours()},h:function(){return pad(f.g(),2)},H:function(){return pad(jsdate.getHours(),2)},i:function(){return pad(jsdate.getMinutes(),2)},s:function(){return pad(jsdate.getSeconds(),2)},O:function(){var t=pad(Math.abs(jsdate.getTimezoneOffset()/60*100),4);if(jsdate.getTimezoneOffset()>0)t='-'+t;else t='+'+t;return t},P:function(){var O=f.O();return(O.substr(0,3)+':'+O.substr(3,2))},c:function(){return f.Y()+'-'+f.m()+'-'+f.d()+'T'+f.h()+':'+f.i()+':'+f.s()+f.P()},U:function(){return Math.round(jsdate.getTime()/1000)}};return format.replace(/([a-zA-Z])/g,function(t,s){var ret='';if(t!=s){ret=s}else if(f[s]){ret=f[s]()}else{ret=s}return ret})}function dataURLtoBlob(dataurl){var arr=dataurl.split(','),mime=arr[0].match(/:(.*?);/)[1],bstr=atob(arr[1]),n=bstr.length,u8arr=new Uint8Array(n);while(n--){u8arr[n]=bstr.charCodeAt(n)}return new Blob([u8arr],{type:mime})}function decodeURIString(obj){for(var k in obj){if(valType(obj[k])=='string'&&obj[k]){try{obj[k]=decodeURI(obj[k])}catch(event){}}if(valType(obj[k])=='object'){obj[k]=decodeURIString(obj[k])}}return obj}function getApp(){var u=navigator.userAgent.toLowerCase();if(u.indexOf('iphone')>-1){return'iphone'}}function cookie(name,value,domain,path){if(isUndefined(domain)){domain=''}if(isUndefined(path)){path='/'}var ckStr=';domain='+domain+';path='+path;if(location.protocol=='https'){ckStr+=';SameSite=None;Secure=true'}var set=function(name,value){var time=360*24*60*60*1000;var exp=new Date();exp.setTime(exp.getTime()+time);try{document.cookie=name+'='+escape(value)+';expires='+exp.toGMTString()+ckStr}catch(event){console.error(event)}},get=function(name){var arr,reg=new RegExp('(^| )'+name+'=([^;]*)(;|$)');if(arr=document.cookie.match(reg)){return unescape(arr[2])}else{return null}},del=function(name){var exp=new Date();exp.setTime(exp.getTime()-1);var cval=get(name);if(cval!=null){document.cookie=name+'='+cval+';expires='+exp.toGMTString()+ckStr}};if(!isUndefined(name)&&!isUndefined(value)){if(value=='delete'){del(name);return null}else{set(name,value);return get(name)}}else if(!isUndefined(name)&&isUndefined(value)){return get(name)}else if(!isUndefined(name)){}}function arrayToString(arr){var str='';if(!isUndefined(arr)){for(var i=0;i<arr.length;i++){var temp=arr[i];if(i>0){str+=','}for(var y=0;y<temp.length;y++){if(y>0){str+=';'}if(valType(temp[y])=='number'){str+=parseInt(temp[y]*100)}else{str+=temp[y]}}}}return str}function stringToArray(str){var newArr=[];if(!isUndefined(str)){var arr=str.split(',');for(var i=0;i<arr.length;i++){var temp=arr[i].split(';');temp[1]=parseInt(temp[1])*0.01;temp[2]=parseInt(temp[2])*0.01;newArr.push(temp)}}return newArr}function documentHidden(fn){if(!isUndefined(document.visibilityState)){fn(document.visibilityState==='visible'?'show':'hidden');addListener(document,'visibilitychange',function(){fn(document.visibilityState==='visible'?'show':'hidden')})}}return ckplayerEmbed})); \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/language/en.js b/modules/core/src/main/resources/static/ckplayer/language/en.js new file mode 100644 index 00000000..a939ed58 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/language/en.js @@ -0,0 +1,72 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.ckplayerLanguage = factory()); +}(this, function () { 'use strict'; + /* + * 功能:包含播放器用到的全部相关语言文字 + */ + var language={ + play:'Play', + pause:'Pause', + refresh:'Refresh', + full:'Fullscreen', + exitFull:'Non-Fullscreen', + webFull:'Web fullscreen', + exitWebFull:'Non-Web fullscreen', + theatre:'Theatre', + exitTheatre:'Non-theatre', + volume:'Volume:', + muted:'Mute', + exitmuted:'Unmute', + seek:'Seek:', + waiting:'Waiting', + live:'Liveing', + backLive:'Back live', + lookBack:'Look back:', + next:'Next episode', + screenshot:'Screenshot', + smallwindows:'Small windows', + playbackrate:'Speed', + playbackrateSuffix:' Speed', + track:'Subtitle', + noTrack:'No subtitle', + definition:'Definition', + switchTo:'Switched from:', + closeTime:'The advertisement can be closed in {seconds} seconds', + closeAd:'Close ad', + second:'seconds', + details:'View details', + copy:'Copy', + copySucceeded:'Copy succeeded, can be pasted!', + smallwindowsOpen:'The small window function is turned on', + screenshotStart:'Screenshot, please wait...', + smallwindowsClose:'The small window function is turned off', + screenshotClose:'Screenshot function is turned off', + loopOpen:'Loop open', + loopClose:'Loop close', + close:'Close', + down:'Down', + p50:'50%', + p75:'75%', + p100:'100%', + timeScheduleAdjust:{ + prohibit:'No dragging', + prohibitBackOff:'No repeat viewing', + prohibitForward:'Fast forward prohibited', + prohibitLookBack:'Some content is forbidden to play', + prohibitForwardNotViewed:'Disable playback of parts not viewed' + }, + error:{ + noMessage:'Unknown error', + supportVideoError:'The browser version is too low. It is recommended to replace it with another browser', + videoTypeError:'This browser does not support playing this video. It is recommended to replace it with another browser', + loadingFailed:'Loading failed', + emptied:'An error occurred while loading the frequency file', + screenshot:'Screenshot failed', + ajax:'Ajax data request error', + noVideoContainer:'No video container' + } + }; + return language; +})) \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/language/zh.cn.js b/modules/core/src/main/resources/static/ckplayer/language/zh.cn.js new file mode 100644 index 00000000..3fe53644 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/language/zh.cn.js @@ -0,0 +1,72 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.ckplayerLanguage = factory()); +}(this, function () { 'use strict'; + /* + * 功能:包含播放器用到的全部相关语言文字 + */ + var language={ + play:'播放', + pause:'暂停', + refresh:'重播', + full:'全屏', + exitFull:'退出全屏', + webFull:'页面全屏', + exitWebFull:'退出页面全屏', + theatre:'剧场模式', + exitTheatre:'退出剧场模式', + volume:'音量:', + muted:'静音', + exitmuted:'恢复音量', + seek:'seek:', + waiting:'缓冲', + live:'直播中', + backLive:'返回直播', + lookBack:'回看:', + next:'下一集', + screenshot:'视频截图', + smallwindows:'小窗口播放功能', + playbackrate:'倍速', + playbackrateSuffix:'倍', + track:'字幕', + noTrack:'无字幕', + definition:'清晰度', + switchTo:'切换成:', + closeTime:'{seconds}秒后可关闭广告', + closeAd:'关闭广告', + second:'秒', + details:'查看详情', + copy:'复制', + copySucceeded:'复制成功,可贴粘!', + smallwindowsOpen:'小窗口功能已开启', + smallwindowsClose:'小窗口功能已关闭', + screenshotStart:'截图中,请稍候...', + screenshotClose:'截图功能已关闭', + loopOpen:'循环播放', + loopClose:'已关闭循环播放', + close:'关闭', + down:'下载', + p50:'50%', + p75:'75%', + p100:'100%', + timeScheduleAdjust:{ + prohibit:'视频禁止拖动', + prohibitBackOff:'视频禁止重复观看', + prohibitForward:'视频禁止快进', + prohibitLookBack:'视频禁止播放部分内容', + prohibitForwardNotViewed:'视频禁止播放未观看的部分' + }, + error:{ + noMessage:'未知错误', + supportVideoError:'该浏览器版本太低,建议更换成其它浏览器', + videoTypeError:'该浏览器不支持播放该视频,建议更换成其它浏览器', + loadingFailed:'加载失败', + emptied:'视频文件加载过程中出现错误', + screenshot:'视频截图失败', + ajax:'Ajax数据请求错误', + noVideoContainer:'未找到放置视频的容器' + } + }; + return language; +})) \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/language/zh.hk.js b/modules/core/src/main/resources/static/ckplayer/language/zh.hk.js new file mode 100644 index 00000000..31f83951 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/language/zh.hk.js @@ -0,0 +1,72 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.ckplayerLanguage = factory()); +}(this, function () { 'use strict'; + /* + *功能:包含播放機用到的全部相關語言文字 + */ + var language = { + play: '播放', + pause: '暫停', + refresh: '重播', + full: '全屏', + exitFull: '退出全屏', + webFull: '頁面全屏', + exitWebFull: '退出頁面全屏', + theatre: '劇場模式', + exitTheatre: '退出劇場模式', + volume: '音量:', + muted: '靜音', + exitmuted: '恢復音量', + seek: 'seek:', + waiting: '緩衝', + live: '直播中', + backLive: '返回直播', + lookBack: '回看:', + next: '下一集', + screenshot: '視頻截圖', + smallwindows: '小視窗播放功能', + playbackrate: '倍速', + playbackrateSuffix: '倍', + track: '字幕', + noTrack: '無字幕', + definition: '清晰度', + switchTo: '切換成:', + closeTime: '{seconds}秒後可關閉廣告', + closeAd: '關閉廣告', + second: '秒', + details: '查看詳情', + copy: '複製', + copySucceeded: '複製成功,可貼粘!', + smallwindowsOpen: '小視窗功能已開啟', + smallwindowsClose: '小視窗功能已關閉', + screenshotStart: '截圖中,請稍候…', + screenshotClose: '截圖功能已關閉', + loopOpen: '迴圈播放', + loopClose: '已關閉迴圈播放', + close: '關閉', + down: '下載', + p50: '50%', + p75: '75%', + p100: '100%', + timeScheduleAdjust: { + prohibit: '視頻禁止拖動', + prohibitBackOff: '視頻禁止重複觀看', + prohibitForward: '視頻禁止快進', + prohibitLookBack: '視頻禁止播放部分內容', + prohibitForwardNotViewed: '視頻禁止播放未觀看的部分' + }, + error: { + noMessage: '未知錯誤', + supportVideoError: '該流覽器版本太低,建議更換成其它瀏覽器', + videoTypeError: '該瀏覽器不支持播放該視頻,建議更換成其它瀏覽器', + loadingFailed: '加載失敗', + emptied: '視頻檔案加載過程中出現錯誤', + screenshot: '視頻截圖失敗', + ajax: 'Ajax數據請求錯誤', + noVideoContainer: '未找到放置視頻的容器' + } + }; + return language; +})) \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/mpegts.js/LICENSE b/modules/core/src/main/resources/static/ckplayer/mpegts.js/LICENSE new file mode 100644 index 00000000..7a4a3ea2 --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/mpegts.js/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/mpegts.js/mpegts.js b/modules/core/src/main/resources/static/ckplayer/mpegts.js/mpegts.js new file mode 100644 index 00000000..ad02f72d --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/mpegts.js/mpegts.js @@ -0,0 +1,9 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mpegts=t():e.mpegts=t()}(window,(function(){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=14)}([function(e,t,i){"use strict";var n=i(6),r=i.n(n),s=function(){function e(){}return e.e=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","error",n),e.ENABLE_ERROR&&(console.error?console.error(n):console.warn?console.warn(n):console.log(n))},e.i=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","info",n),e.ENABLE_INFO&&(console.info?console.info(n):console.log(n))},e.w=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","warn",n),e.ENABLE_WARN&&(console.warn?console.warn(n):console.log(n))},e.d=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","debug",n),e.ENABLE_DEBUG&&(console.debug?console.debug(n):console.log(n))},e.v=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","verbose",n),e.ENABLE_VERBOSE&&console.log(n)},e}();s.GLOBAL_TAG="mpegts.js",s.FORCE_GLOBAL_TAG=!1,s.ENABLE_ERROR=!0,s.ENABLE_INFO=!0,s.ENABLE_WARN=!0,s.ENABLE_DEBUG=!0,s.ENABLE_VERBOSE=!0,s.ENABLE_CALLBACK=!1,s.emitter=new r.a,t.a=s},function(e,t,i){"use strict";t.a={IO_ERROR:"io_error",DEMUX_ERROR:"demux_error",INIT_SEGMENT:"init_segment",MEDIA_SEGMENT:"media_segment",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",TIMED_ID3_METADATA_ARRIVED:"timed_id3_metadata_arrived",PES_PRIVATE_DATA_DESCRIPTOR:"pes_private_data_descriptor",PES_PRIVATE_DATA_ARRIVED:"pes_private_data_arrived",STATISTICS_INFO:"statistics_info",RECOMMEND_SEEKPOINT:"recommend_seekpoint"}},function(e,t,i){"use strict";i.d(t,"c",(function(){return r})),i.d(t,"b",(function(){return s})),i.d(t,"a",(function(){return a}));var n=i(3),r={kIdle:0,kConnecting:1,kBuffering:2,kError:3,kComplete:4},s={OK:"OK",EXCEPTION:"Exception",HTTP_STATUS_CODE_INVALID:"HttpStatusCodeInvalid",CONNECTING_TIMEOUT:"ConnectingTimeout",EARLY_EOF:"EarlyEof",UNRECOVERABLE_EARLY_EOF:"UnrecoverableEarlyEof"},a=function(){function e(e){this._type=e||"undefined",this._status=r.kIdle,this._needStash=!1,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null}return e.prototype.destroy=function(){this._status=r.kIdle,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null},e.prototype.isWorking=function(){return this._status===r.kConnecting||this._status===r.kBuffering},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"status",{get:function(){return this._status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"needStashBuffer",{get:function(){return this._needStash},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onContentLengthKnown",{get:function(){return this._onContentLengthKnown},set:function(e){this._onContentLengthKnown=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onURLRedirect",{get:function(){return this._onURLRedirect},set:function(e){this._onURLRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),e.prototype.open=function(e,t){throw new n.c("Unimplemented abstract function!")},e.prototype.abort=function(){throw new n.c("Unimplemented abstract function!")},e}()},function(e,t,i){"use strict";i.d(t,"d",(function(){return s})),i.d(t,"a",(function(){return a})),i.d(t,"b",(function(){return o})),i.d(t,"c",(function(){return h}));var n,r=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),s=function(){function e(e){this._message=e}return Object.defineProperty(e.prototype,"name",{get:function(){return"RuntimeException"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this.name+": "+this.message},e}(),a=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"IllegalStateException"},enumerable:!1,configurable:!0}),t}(s),o=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"InvalidArgumentException"},enumerable:!1,configurable:!0}),t}(s),h=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"NotImplementedException"},enumerable:!1,configurable:!0}),t}(s)},function(e,t,i){"use strict";var n={};!function(){var e=self.navigator.userAgent.toLowerCase(),t=/(edge)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(chrome)[ \/]([\w.]+)/.exec(e)||/(iemobile)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(firefox)[ \/]([\w.]+)/.exec(e)||[],i=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(android)/.exec(e)||/(windows)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||[],r={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",majorVersion:t[4]||t[2]||"0",platform:i[0]||""},s={};if(r.browser){s[r.browser]=!0;var a=r.majorVersion.split(".");s.version={major:parseInt(r.majorVersion,10),string:r.version},a.length>1&&(s.version.minor=parseInt(a[1],10)),a.length>2&&(s.version.build=parseInt(a[2],10))}if(r.platform&&(s[r.platform]=!0),(s.chrome||s.opr||s.safari)&&(s.webkit=!0),s.rv||s.iemobile){s.rv&&delete s.rv;r.browser="msie",s.msie=!0}if(s.edge){delete s.edge;r.browser="msedge",s.msedge=!0}if(s.opr){r.browser="opera",s.opera=!0}if(s.safari&&s.android){r.browser="android",s.android=!0}for(var o in s.name=r.browser,s.platform=r.platform,n)n.hasOwnProperty(o)&&delete n[o];Object.assign(n,s)}(),t.a=n},function(e,t,i){"use strict";t.a={OK:"OK",FORMAT_ERROR:"FormatError",FORMAT_UNSUPPORTED:"FormatUnsupported",CODEC_UNSUPPORTED:"CodecUnsupported"}},function(e,t,i){"use strict";var n,r="object"==typeof Reflect?Reflect:null,s=r&&"function"==typeof r.apply?r.apply:function(e,t,i){return Function.prototype.apply.call(e,t,i)};n=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var a=Number.isNaN||function(e){return e!=e};function o(){o.init.call(this)}e.exports=o,e.exports.once=function(e,t){return new Promise((function(i,n){function r(i){e.removeListener(t,s),n(i)}function s(){"function"==typeof e.removeListener&&e.removeListener("error",r),i([].slice.call(arguments))}g(e,t,s,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&g(e,"error",t,i)}(e,r,{once:!0})}))},o.EventEmitter=o,o.prototype._events=void 0,o.prototype._eventsCount=0,o.prototype._maxListeners=void 0;var h=10;function d(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function u(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function _(e,t,i,n){var r,s,a,o;if(d(i),void 0===(s=e._events)?(s=e._events=Object.create(null),e._eventsCount=0):(void 0!==s.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),s=e._events),a=s[t]),void 0===a)a=s[t]=i,++e._eventsCount;else if("function"==typeof a?a=s[t]=n?[i,a]:[a,i]:n?a.unshift(i):a.push(i),(r=u(e))>0&&a.length>r&&!a.warned){a.warned=!0;var h=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");h.name="MaxListenersExceededWarning",h.emitter=e,h.type=t,h.count=a.length,o=h,console&&console.warn&&console.warn(o)}return e}function l(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function c(e,t,i){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},r=l.bind(n);return r.listener=i,n.wrapFn=r,r}function f(e,t,i){var n=e._events;if(void 0===n)return[];var r=n[t];return void 0===r?[]:"function"==typeof r?i?[r.listener||r]:[r]:i?function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(r):m(r,r.length)}function p(e){var t=this._events;if(void 0!==t){var i=t[e];if("function"==typeof i)return 1;if(void 0!==i)return i.length}return 0}function m(e,t){for(var i=new Array(t),n=0;n<t;++n)i[n]=e[n];return i}function g(e,t,i,n){if("function"==typeof e.on)n.once?e.once(t,i):e.on(t,i);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function r(s){n.once&&e.removeEventListener(t,r),i(s)}))}}Object.defineProperty(o,"defaultMaxListeners",{enumerable:!0,get:function(){return h},set:function(e){if("number"!=typeof e||e<0||a(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");h=e}}),o.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},o.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||a(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},o.prototype.getMaxListeners=function(){return u(this)},o.prototype.emit=function(e){for(var t=[],i=1;i<arguments.length;i++)t.push(arguments[i]);var n="error"===e,r=this._events;if(void 0!==r)n=n&&void 0===r.error;else if(!n)return!1;if(n){var a;if(t.length>0&&(a=t[0]),a instanceof Error)throw a;var o=new Error("Unhandled error."+(a?" ("+a.message+")":""));throw o.context=a,o}var h=r[e];if(void 0===h)return!1;if("function"==typeof h)s(h,this,t);else{var d=h.length,u=m(h,d);for(i=0;i<d;++i)s(u[i],this,t)}return!0},o.prototype.addListener=function(e,t){return _(this,e,t,!1)},o.prototype.on=o.prototype.addListener,o.prototype.prependListener=function(e,t){return _(this,e,t,!0)},o.prototype.once=function(e,t){return d(t),this.on(e,c(this,e,t)),this},o.prototype.prependOnceListener=function(e,t){return d(t),this.prependListener(e,c(this,e,t)),this},o.prototype.removeListener=function(e,t){var i,n,r,s,a;if(d(t),void 0===(n=this._events))return this;if(void 0===(i=n[e]))return this;if(i===t||i.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(r=-1,s=i.length-1;s>=0;s--)if(i[s]===t||i[s].listener===t){a=i[s].listener,r=s;break}if(r<0)return this;0===r?i.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(i,r),1===i.length&&(n[e]=i[0]),void 0!==n.removeListener&&this.emit("removeListener",e,a||t)}return this},o.prototype.off=o.prototype.removeListener,o.prototype.removeAllListeners=function(e){var t,i,n;if(void 0===(i=this._events))return this;if(void 0===i.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==i[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete i[e]),this;if(0===arguments.length){var r,s=Object.keys(i);for(n=0;n<s.length;++n)"removeListener"!==(r=s[n])&&this.removeAllListeners(r);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(void 0!==t)for(n=t.length-1;n>=0;n--)this.removeListener(e,t[n]);return this},o.prototype.listeners=function(e){return f(this,e,!0)},o.prototype.rawListeners=function(e){return f(this,e,!1)},o.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},o.prototype.listenerCount=p,o.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(e,t,i){"use strict";i.d(t,"d",(function(){return n})),i.d(t,"b",(function(){return r})),i.d(t,"a",(function(){return s})),i.d(t,"c",(function(){return a}));var n=function(e,t,i,n,r){this.dts=e,this.pts=t,this.duration=i,this.originalDts=n,this.isSyncPoint=r,this.fileposition=null},r=function(){function e(){this.beginDts=0,this.endDts=0,this.beginPts=0,this.endPts=0,this.originalBeginDts=0,this.originalEndDts=0,this.syncPoints=[],this.firstSample=null,this.lastSample=null}return e.prototype.appendSyncPoint=function(e){e.isSyncPoint=!0,this.syncPoints.push(e)},e}(),s=function(){function e(){this._list=[]}return e.prototype.clear=function(){this._list=[]},e.prototype.appendArray=function(e){var t=this._list;0!==e.length&&(t.length>0&&e[0].originalDts<t[t.length-1].originalDts&&this.clear(),Array.prototype.push.apply(t,e))},e.prototype.getLastSyncPointBeforeDts=function(e){if(0==this._list.length)return null;var t=this._list,i=0,n=t.length-1,r=0,s=0,a=n;for(e<t[0].dts&&(i=0,s=a+1);s<=a;){if((r=s+Math.floor((a-s)/2))===n||e>=t[r].dts&&e<t[r+1].dts){i=r;break}t[r].dts<e?s=r+1:a=r-1}return this._list[i]},e}(),a=function(){function e(e){this._type=e,this._list=[],this._lastAppendLocation=-1}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"length",{get:function(){return this._list.length},enumerable:!1,configurable:!0}),e.prototype.isEmpty=function(){return 0===this._list.length},e.prototype.clear=function(){this._list=[],this._lastAppendLocation=-1},e.prototype._searchNearestSegmentBefore=function(e){var t=this._list;if(0===t.length)return-2;var i=t.length-1,n=0,r=0,s=i,a=0;if(e<t[0].originalBeginDts)return a=-1;for(;r<=s;){if((n=r+Math.floor((s-r)/2))===i||e>t[n].lastSample.originalDts&&e<t[n+1].originalBeginDts){a=n;break}t[n].originalBeginDts<e?r=n+1:s=n-1}return a},e.prototype._searchNearestSegmentAfter=function(e){return this._searchNearestSegmentBefore(e)+1},e.prototype.append=function(e){var t=this._list,i=e,n=this._lastAppendLocation,r=0;-1!==n&&n<t.length&&i.originalBeginDts>=t[n].lastSample.originalDts&&(n===t.length-1||n<t.length-1&&i.originalBeginDts<t[n+1].originalBeginDts)?r=n+1:t.length>0&&(r=this._searchNearestSegmentBefore(i.originalBeginDts)+1),this._lastAppendLocation=r,this._list.splice(r,0,i)},e.prototype.getLastSegmentBefore=function(e){var t=this._searchNearestSegmentBefore(e);return t>=0?this._list[t]:null},e.prototype.getLastSampleBefore=function(e){var t=this.getLastSegmentBefore(e);return null!=t?t.lastSample:null},e.prototype.getLastSyncPointBefore=function(e){for(var t=this._searchNearestSegmentBefore(e),i=this._list[t].syncPoints;0===i.length&&t>0;)t--,i=this._list[t].syncPoints;return i.length>0?i[i.length-1]:null},e}()},function(e,t,i){"use strict";var n=function(){function e(){this.mimeType=null,this.duration=null,this.hasAudio=null,this.hasVideo=null,this.audioCodec=null,this.videoCodec=null,this.audioDataRate=null,this.videoDataRate=null,this.audioSampleRate=null,this.audioChannelCount=null,this.width=null,this.height=null,this.fps=null,this.profile=null,this.level=null,this.refFrames=null,this.chromaFormat=null,this.sarNum=null,this.sarDen=null,this.metadata=null,this.segments=null,this.segmentCount=null,this.hasKeyframesIndex=null,this.keyframesIndex=null}return e.prototype.isComplete=function(){var e=!1===this.hasAudio||!0===this.hasAudio&&null!=this.audioCodec&&null!=this.audioSampleRate&&null!=this.audioChannelCount,t=!1===this.hasVideo||!0===this.hasVideo&&null!=this.videoCodec&&null!=this.width&&null!=this.height&&null!=this.fps&&null!=this.profile&&null!=this.level&&null!=this.refFrames&&null!=this.chromaFormat&&null!=this.sarNum&&null!=this.sarDen;return null!=this.mimeType&&e&&t},e.prototype.isSeekable=function(){return!0===this.hasKeyframesIndex},e.prototype.getNearestKeyframe=function(e){if(null==this.keyframesIndex)return null;var t=this.keyframesIndex,i=this._search(t.times,e);return{index:i,milliseconds:t.times[i],fileposition:t.filepositions[i]}},e.prototype._search=function(e,t){var i=0,n=e.length-1,r=0,s=0,a=n;for(t<e[0]&&(i=0,s=a+1);s<=a;){if((r=s+Math.floor((a-s)/2))===n||t>=e[r]&&t<e[r+1]){i=r;break}e[r]<t?s=r+1:a=r-1}return i},e}();t.a=n},function(e,t,i){"use strict";var n=i(6),r=i.n(n),s=i(0),a=function(){function e(){}return Object.defineProperty(e,"forceGlobalTag",{get:function(){return s.a.FORCE_GLOBAL_TAG},set:function(t){s.a.FORCE_GLOBAL_TAG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"globalTag",{get:function(){return s.a.GLOBAL_TAG},set:function(t){s.a.GLOBAL_TAG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableAll",{get:function(){return s.a.ENABLE_VERBOSE&&s.a.ENABLE_DEBUG&&s.a.ENABLE_INFO&&s.a.ENABLE_WARN&&s.a.ENABLE_ERROR},set:function(t){s.a.ENABLE_VERBOSE=t,s.a.ENABLE_DEBUG=t,s.a.ENABLE_INFO=t,s.a.ENABLE_WARN=t,s.a.ENABLE_ERROR=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableDebug",{get:function(){return s.a.ENABLE_DEBUG},set:function(t){s.a.ENABLE_DEBUG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableVerbose",{get:function(){return s.a.ENABLE_VERBOSE},set:function(t){s.a.ENABLE_VERBOSE=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableInfo",{get:function(){return s.a.ENABLE_INFO},set:function(t){s.a.ENABLE_INFO=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableWarn",{get:function(){return s.a.ENABLE_WARN},set:function(t){s.a.ENABLE_WARN=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableError",{get:function(){return s.a.ENABLE_ERROR},set:function(t){s.a.ENABLE_ERROR=t,e._notifyChange()},enumerable:!1,configurable:!0}),e.getConfig=function(){return{globalTag:s.a.GLOBAL_TAG,forceGlobalTag:s.a.FORCE_GLOBAL_TAG,enableVerbose:s.a.ENABLE_VERBOSE,enableDebug:s.a.ENABLE_DEBUG,enableInfo:s.a.ENABLE_INFO,enableWarn:s.a.ENABLE_WARN,enableError:s.a.ENABLE_ERROR,enableCallback:s.a.ENABLE_CALLBACK}},e.applyConfig=function(e){s.a.GLOBAL_TAG=e.globalTag,s.a.FORCE_GLOBAL_TAG=e.forceGlobalTag,s.a.ENABLE_VERBOSE=e.enableVerbose,s.a.ENABLE_DEBUG=e.enableDebug,s.a.ENABLE_INFO=e.enableInfo,s.a.ENABLE_WARN=e.enableWarn,s.a.ENABLE_ERROR=e.enableError,s.a.ENABLE_CALLBACK=e.enableCallback},e._notifyChange=function(){var t=e.emitter;if(t.listenerCount("change")>0){var i=e.getConfig();t.emit("change",i)}},e.registerListener=function(t){e.emitter.addListener("change",t)},e.removeListener=function(t){e.emitter.removeListener("change",t)},e.addLogListener=function(t){s.a.emitter.addListener("log",t),s.a.emitter.listenerCount("log")>0&&(s.a.ENABLE_CALLBACK=!0,e._notifyChange())},e.removeLogListener=function(t){s.a.emitter.removeListener("log",t),0===s.a.emitter.listenerCount("log")&&(s.a.ENABLE_CALLBACK=!1,e._notifyChange())},e}();a.emitter=new r.a,t.a=a},function(e,t,i){"use strict";var n=i(6),r=i.n(n),s=i(0),a=i(4),o=i(8);function h(e,t,i){var n=e;if(t+i<n.length){for(;i--;)if(128!=(192&n[++t]))return!1;return!0}return!1}var d,u=function(e){for(var t=[],i=e,n=0,r=e.length;n<r;)if(i[n]<128)t.push(String.fromCharCode(i[n])),++n;else{if(i[n]<192);else if(i[n]<224){if(h(i,n,1))if((s=(31&i[n])<<6|63&i[n+1])>=128){t.push(String.fromCharCode(65535&s)),n+=2;continue}}else if(i[n]<240){if(h(i,n,2))if((s=(15&i[n])<<12|(63&i[n+1])<<6|63&i[n+2])>=2048&&55296!=(63488&s)){t.push(String.fromCharCode(65535&s)),n+=3;continue}}else if(i[n]<248){var s;if(h(i,n,3))if((s=(7&i[n])<<18|(63&i[n+1])<<12|(63&i[n+2])<<6|63&i[n+3])>65536&&s<1114112){s-=65536,t.push(String.fromCharCode(s>>>10|55296)),t.push(String.fromCharCode(1023&s|56320)),n+=4;continue}}t.push(String.fromCharCode(65533)),++n}return t.join("")},_=i(3),l=(d=new ArrayBuffer(2),new DataView(d).setInt16(0,256,!0),256===new Int16Array(d)[0]),c=function(){function e(){}return e.parseScriptData=function(t,i,n){var r={};try{var a=e.parseValue(t,i,n),o=e.parseValue(t,i+a.size,n-a.size);r[a.data]=o.data}catch(e){s.a.e("AMF",e.toString())}return r},e.parseObject=function(t,i,n){if(n<3)throw new _.a("Data not enough when parse ScriptDataObject");var r=e.parseString(t,i,n),s=e.parseValue(t,i+r.size,n-r.size),a=s.objectEnd;return{data:{name:r.data,value:s.data},size:r.size+s.size,objectEnd:a}},e.parseVariable=function(t,i,n){return e.parseObject(t,i,n)},e.parseString=function(e,t,i){if(i<2)throw new _.a("Data not enough when parse String");var n=new DataView(e,t,i).getUint16(0,!l);return{data:n>0?u(new Uint8Array(e,t+2,n)):"",size:2+n}},e.parseLongString=function(e,t,i){if(i<4)throw new _.a("Data not enough when parse LongString");var n=new DataView(e,t,i).getUint32(0,!l);return{data:n>0?u(new Uint8Array(e,t+4,n)):"",size:4+n}},e.parseDate=function(e,t,i){if(i<10)throw new _.a("Data size invalid when parse Date");var n=new DataView(e,t,i),r=n.getFloat64(0,!l),s=n.getInt16(8,!l);return{data:new Date(r+=60*s*1e3),size:10}},e.parseValue=function(t,i,n){if(n<1)throw new _.a("Data not enough when parse Value");var r,a=new DataView(t,i,n),o=1,h=a.getUint8(0),d=!1;try{switch(h){case 0:r=a.getFloat64(1,!l),o+=8;break;case 1:r=!!a.getUint8(1),o+=1;break;case 2:var u=e.parseString(t,i+1,n-1);r=u.data,o+=u.size;break;case 3:r={};var c=0;for(9==(16777215&a.getUint32(n-4,!l))&&(c=3);o<n-4;){var f=e.parseObject(t,i+o,n-o-c);if(f.objectEnd)break;r[f.data.name]=f.data.value,o+=f.size}if(o<=n-3)9===(16777215&a.getUint32(o-1,!l))&&(o+=3);break;case 8:r={},o+=4;c=0;for(9==(16777215&a.getUint32(n-4,!l))&&(c=3);o<n-8;){var p=e.parseVariable(t,i+o,n-o-c);if(p.objectEnd)break;r[p.data.name]=p.data.value,o+=p.size}if(o<=n-3)9===(16777215&a.getUint32(o-1,!l))&&(o+=3);break;case 9:r=void 0,o=1,d=!0;break;case 10:r=[];var m=a.getUint32(1,!l);o+=4;for(var g=0;g<m;g++){var v=e.parseValue(t,i+o,n-o);r.push(v.data),o+=v.size}break;case 11:var y=e.parseDate(t,i+1,n-1);r=y.data,o+=y.size;break;case 12:var b=e.parseString(t,i+1,n-1);r=b.data,o+=b.size;break;default:o=n,s.a.w("AMF","Unsupported AMF value type "+h)}}catch(e){s.a.e("AMF",e.toString())}return{data:r,size:o,objectEnd:d}},e}(),f=function(){function e(e){this.TAG="ExpGolomb",this._buffer=e,this._buffer_index=0,this._total_bytes=e.byteLength,this._total_bits=8*e.byteLength,this._current_word=0,this._current_word_bits_left=0}return e.prototype.destroy=function(){this._buffer=null},e.prototype._fillCurrentWord=function(){var e=this._total_bytes-this._buffer_index;if(e<=0)throw new _.a("ExpGolomb: _fillCurrentWord() but no bytes available");var t=Math.min(4,e),i=new Uint8Array(4);i.set(this._buffer.subarray(this._buffer_index,this._buffer_index+t)),this._current_word=new DataView(i.buffer).getUint32(0,!1),this._buffer_index+=t,this._current_word_bits_left=8*t},e.prototype.readBits=function(e){if(e>32)throw new _.b("ExpGolomb: readBits() bits exceeded max 32bits!");if(e<=this._current_word_bits_left){var t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}var i=this._current_word_bits_left?this._current_word:0;i>>>=32-this._current_word_bits_left;var n=e-this._current_word_bits_left;this._fillCurrentWord();var r=Math.min(n,this._current_word_bits_left),s=this._current_word>>>32-r;return this._current_word<<=r,this._current_word_bits_left-=r,i=i<<r|s},e.prototype.readBool=function(){return 1===this.readBits(1)},e.prototype.readByte=function(){return this.readBits(8)},e.prototype._skipLeadingZero=function(){var e;for(e=0;e<this._current_word_bits_left;e++)if(0!=(this._current_word&2147483648>>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()},e.prototype.readUEG=function(){var e=this._skipLeadingZero();return this.readBits(e+1)-1},e.prototype.readSEG=function(){var e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)},e}(),p=function(){function e(){}return e._ebsp2rbsp=function(e){for(var t=e,i=t.byteLength,n=new Uint8Array(i),r=0,s=0;s<i;s++)s>=2&&3===t[s]&&0===t[s-1]&&0===t[s-2]||(n[r]=t[s],r++);return new Uint8Array(n.buffer,0,r)},e.parseSPS=function(t){for(var i=t.subarray(1,4),n="avc1.",r=0;r<3;r++){var s=i[r].toString(16);s.length<2&&(s="0"+s),n+=s}var a=e._ebsp2rbsp(t),o=new f(a);o.readByte();var h=o.readByte();o.readByte();var d=o.readByte();o.readUEG();var u=e.getProfileString(h),_=e.getLevelString(d),l=1,c=420,p=8,m=8;if((100===h||110===h||122===h||244===h||44===h||83===h||86===h||118===h||128===h||138===h||144===h)&&(3===(l=o.readUEG())&&o.readBits(1),l<=3&&(c=[0,420,422,444][l]),p=o.readUEG()+8,m=o.readUEG()+8,o.readBits(1),o.readBool()))for(var g=3!==l?8:12,v=0;v<g;v++)o.readBool()&&(v<6?e._skipScalingList(o,16):e._skipScalingList(o,64));o.readUEG();var y=o.readUEG();if(0===y)o.readUEG();else if(1===y){o.readBits(1),o.readSEG(),o.readSEG();var b=o.readUEG();for(v=0;v<b;v++)o.readSEG()}var E=o.readUEG();o.readBits(1);var S=o.readUEG(),A=o.readUEG(),R=o.readBits(1);0===R&&o.readBits(1),o.readBits(1);var L=0,T=0,w=0,D=0;o.readBool()&&(L=o.readUEG(),T=o.readUEG(),w=o.readUEG(),D=o.readUEG());var k=1,C=1,I=0,O=!0,P=0,M=0;if(o.readBool()){if(o.readBool()){var x=o.readByte();x>0&&x<16?(k=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][x-1],C=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][x-1]):255===x&&(k=o.readByte()<<8|o.readByte(),C=o.readByte()<<8|o.readByte())}if(o.readBool()&&o.readBool(),o.readBool()&&(o.readBits(4),o.readBool()&&o.readBits(24)),o.readBool()&&(o.readUEG(),o.readUEG()),o.readBool()){var B=o.readBits(32),U=o.readBits(32);O=o.readBool(),I=(P=U)/(M=2*B)}}var N=1;1===k&&1===C||(N=k/C);var F=0,G=0;0===l?(F=1,G=2-R):(F=3===l?1:2,G=(1===l?2:1)*(2-R));var V=16*(S+1),j=16*(A+1)*(2-R);V-=(L+T)*F,j-=(w+D)*G;var z=Math.ceil(V*N);return o.destroy(),o=null,{codec_mimetype:n,profile_idc:h,level_idc:d,profile_string:u,level_string:_,chroma_format_idc:l,bit_depth:p,bit_depth_luma:p,bit_depth_chroma:m,ref_frames:E,chroma_format:c,chroma_format_string:e.getChromaFormatString(c),frame_rate:{fixed:O,fps:I,fps_den:M,fps_num:P},sar_ratio:{width:k,height:C},codec_size:{width:V,height:j},present_size:{width:z,height:j}}},e._skipScalingList=function(e,t){for(var i=8,n=8,r=0;r<t;r++)0!==n&&(n=(i+e.readSEG()+256)%256),i=0===n?i:n},e.getProfileString=function(e){switch(e){case 66:return"Baseline";case 77:return"Main";case 88:return"Extended";case 100:return"High";case 110:return"High10";case 122:return"High422";case 244:return"High444";default:return"Unknown"}},e.getLevelString=function(e){return(e/10).toFixed(1)},e.getChromaFormatString=function(e){switch(e){case 420:return"4:2:0";case 422:return"4:2:2";case 444:return"4:4:4";default:return"Unknown"}},e}(),m=i(5);var g,v=function(){function e(e,t){this.TAG="FLVDemuxer",this._config=t,this._onError=null,this._onMediaInfo=null,this._onMetaDataArrived=null,this._onScriptDataArrived=null,this._onTrackMetadata=null,this._onDataAvailable=null,this._dataOffset=e.dataOffset,this._firstParse=!0,this._dispatch=!1,this._hasAudio=e.hasAudioTrack,this._hasVideo=e.hasVideoTrack,this._hasAudioFlagOverrided=!1,this._hasVideoFlagOverrided=!1,this._audioInitialMetadataDispatched=!1,this._videoInitialMetadataDispatched=!1,this._mediaInfo=new o.a,this._mediaInfo.hasAudio=this._hasAudio,this._mediaInfo.hasVideo=this._hasVideo,this._metadata=null,this._audioMetadata=null,this._videoMetadata=null,this._naluLengthSize=4,this._timestampBase=0,this._timescale=1e3,this._duration=0,this._durationOverrided=!1,this._referenceFrameRate={fixed:!0,fps:23.976,fps_num:23976,fps_den:1e3},this._flvSoundRateTable=[5500,11025,22050,44100,48e3],this._mpegSamplingRates=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],this._mpegAudioV10SampleRateTable=[44100,48e3,32e3,0],this._mpegAudioV20SampleRateTable=[22050,24e3,16e3,0],this._mpegAudioV25SampleRateTable=[11025,12e3,8e3,0],this._mpegAudioL1BitRateTable=[0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1],this._mpegAudioL2BitRateTable=[0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1],this._mpegAudioL3BitRateTable=[0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1],this._videoTrack={type:"video",id:1,sequenceNumber:0,samples:[],length:0},this._audioTrack={type:"audio",id:2,sequenceNumber:0,samples:[],length:0},this._littleEndian=function(){var e=new ArrayBuffer(2);return new DataView(e).setInt16(0,256,!0),256===new Int16Array(e)[0]}()}return e.prototype.destroy=function(){this._mediaInfo=null,this._metadata=null,this._audioMetadata=null,this._videoMetadata=null,this._videoTrack=null,this._audioTrack=null,this._onError=null,this._onMediaInfo=null,this._onMetaDataArrived=null,this._onScriptDataArrived=null,this._onTrackMetadata=null,this._onDataAvailable=null},e.probe=function(e){var t=new Uint8Array(e),i={match:!1};if(70!==t[0]||76!==t[1]||86!==t[2]||1!==t[3])return i;var n,r,s=(4&t[4])>>>2!=0,a=0!=(1&t[4]),o=(n=t)[r=5]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3];return o<9?i:{match:!0,consumed:o,dataOffset:o,hasAudioTrack:s,hasVideoTrack:a}},e.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},Object.defineProperty(e.prototype,"onTrackMetadata",{get:function(){return this._onTrackMetadata},set:function(e){this._onTrackMetadata=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaInfo",{get:function(){return this._onMediaInfo},set:function(e){this._onMediaInfo=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMetaDataArrived",{get:function(){return this._onMetaDataArrived},set:function(e){this._onMetaDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onScriptDataArrived",{get:function(){return this._onScriptDataArrived},set:function(e){this._onScriptDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataAvailable",{get:function(){return this._onDataAvailable},set:function(e){this._onDataAvailable=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"timestampBase",{get:function(){return this._timestampBase},set:function(e){this._timestampBase=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedDuration",{get:function(){return this._duration},set:function(e){this._durationOverrided=!0,this._duration=e,this._mediaInfo.duration=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasAudio",{set:function(e){this._hasAudioFlagOverrided=!0,this._hasAudio=e,this._mediaInfo.hasAudio=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasVideo",{set:function(e){this._hasVideoFlagOverrided=!0,this._hasVideo=e,this._mediaInfo.hasVideo=e},enumerable:!1,configurable:!0}),e.prototype.resetMediaInfo=function(){this._mediaInfo=new o.a},e.prototype._isInitialMetadataDispatched=function(){return this._hasAudio&&this._hasVideo?this._audioInitialMetadataDispatched&&this._videoInitialMetadataDispatched:this._hasAudio&&!this._hasVideo?this._audioInitialMetadataDispatched:!(this._hasAudio||!this._hasVideo)&&this._videoInitialMetadataDispatched},e.prototype.parseChunks=function(t,i){if(!(this._onError&&this._onMediaInfo&&this._onTrackMetadata&&this._onDataAvailable))throw new _.a("Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var n=0,r=this._littleEndian;if(0===i){if(!(t.byteLength>13))return 0;n=e.probe(t).dataOffset}this._firstParse&&(this._firstParse=!1,i+n!==this._dataOffset&&s.a.w(this.TAG,"First time parsing but chunk byteStart invalid!"),0!==(a=new DataView(t,n)).getUint32(0,!r)&&s.a.w(this.TAG,"PrevTagSize0 !== 0 !!!"),n+=4);for(;n<t.byteLength;){this._dispatch=!0;var a=new DataView(t,n);if(n+11+4>t.byteLength)break;var o=a.getUint8(0),h=16777215&a.getUint32(0,!r);if(n+11+h+4>t.byteLength)break;if(8===o||9===o||18===o){var d=a.getUint8(4),u=a.getUint8(5),l=a.getUint8(6)|u<<8|d<<16|a.getUint8(7)<<24;0!==(16777215&a.getUint32(7,!r))&&s.a.w(this.TAG,"Meet tag which has StreamID != 0!");var c=n+11;switch(o){case 8:this._parseAudioData(t,c,h,l);break;case 9:this._parseVideoData(t,c,h,l,i+n);break;case 18:this._parseScriptData(t,c,h)}var f=a.getUint32(11+h,!r);f!==11+h&&s.a.w(this.TAG,"Invalid PrevTagSize "+f),n+=11+h+4}else s.a.w(this.TAG,"Unsupported tag type "+o+", skipped"),n+=11+h+4}return this._isInitialMetadataDispatched()&&this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack),n},e.prototype._parseScriptData=function(e,t,i){var n=c.parseScriptData(e,t,i);if(n.hasOwnProperty("onMetaData")){if(null==n.onMetaData||"object"!=typeof n.onMetaData)return void s.a.w(this.TAG,"Invalid onMetaData structure!");this._metadata&&s.a.w(this.TAG,"Found another onMetaData tag!"),this._metadata=n;var r=this._metadata.onMetaData;if(this._onMetaDataArrived&&this._onMetaDataArrived(Object.assign({},r)),"boolean"==typeof r.hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=r.hasAudio,this._mediaInfo.hasAudio=this._hasAudio),"boolean"==typeof r.hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=r.hasVideo,this._mediaInfo.hasVideo=this._hasVideo),"number"==typeof r.audiodatarate&&(this._mediaInfo.audioDataRate=r.audiodatarate),"number"==typeof r.videodatarate&&(this._mediaInfo.videoDataRate=r.videodatarate),"number"==typeof r.width&&(this._mediaInfo.width=r.width),"number"==typeof r.height&&(this._mediaInfo.height=r.height),"number"==typeof r.duration){if(!this._durationOverrided){var a=Math.floor(r.duration*this._timescale);this._duration=a,this._mediaInfo.duration=a}}else this._mediaInfo.duration=0;if("number"==typeof r.framerate){var o=Math.floor(1e3*r.framerate);if(o>0){var h=o/1e3;this._referenceFrameRate.fixed=!0,this._referenceFrameRate.fps=h,this._referenceFrameRate.fps_num=o,this._referenceFrameRate.fps_den=1e3,this._mediaInfo.fps=h}}if("object"==typeof r.keyframes){this._mediaInfo.hasKeyframesIndex=!0;var d=r.keyframes;this._mediaInfo.keyframesIndex=this._parseKeyframesIndex(d),r.keyframes=null}else this._mediaInfo.hasKeyframesIndex=!1;this._dispatch=!1,this._mediaInfo.metadata=r,s.a.v(this.TAG,"Parsed onMetaData"),this._mediaInfo.isComplete()&&this._onMediaInfo(this._mediaInfo)}Object.keys(n).length>0&&this._onScriptDataArrived&&this._onScriptDataArrived(Object.assign({},n))},e.prototype._parseKeyframesIndex=function(e){for(var t=[],i=[],n=1;n<e.times.length;n++){var r=this._timestampBase+Math.floor(1e3*e.times[n]);t.push(r),i.push(e.filepositions[n])}return{times:t,filepositions:i}},e.prototype._parseAudioData=function(e,t,i,n){if(i<=1)s.a.w(this.TAG,"Flv: Invalid audio packet, missing SoundData payload!");else if(!0!==this._hasAudioFlagOverrided||!1!==this._hasAudio){this._littleEndian;var r=new DataView(e,t,i).getUint8(0),a=r>>>4;if(2===a||10===a){var o=0,h=(12&r)>>>2;if(h>=0&&h<=4){o=this._flvSoundRateTable[h];var d=1&r,u=this._audioMetadata,_=this._audioTrack;if(u||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(u=this._audioMetadata={}).type="audio",u.id=_.id,u.timescale=this._timescale,u.duration=this._duration,u.audioSampleRate=o,u.channelCount=0===d?1:2),10===a){var l=this._parseAACAudioData(e,t+1,i-1);if(null==l)return;if(0===l.packetType){u.config&&s.a.w(this.TAG,"Found another AudioSpecificConfig!");var c=l.data;u.audioSampleRate=c.samplingRate,u.channelCount=c.channelCount,u.codec=c.codec,u.originalCodec=c.originalCodec,u.config=c.config,u.refSampleDuration=1024/u.audioSampleRate*u.timescale,s.a.v(this.TAG,"Parsed AudioSpecificConfig"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",u),(g=this._mediaInfo).audioCodec=u.originalCodec,g.audioSampleRate=u.audioSampleRate,g.audioChannelCount=u.channelCount,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}else if(1===l.packetType){var f=this._timestampBase+n,p={unit:l.data,length:l.data.byteLength,dts:f,pts:f};_.samples.push(p),_.length+=l.data.length}else s.a.e(this.TAG,"Flv: Unsupported AAC data type "+l.packetType)}else if(2===a){if(!u.codec){var g;if(null==(c=this._parseMP3AudioData(e,t+1,i-1,!0)))return;u.audioSampleRate=c.samplingRate,u.channelCount=c.channelCount,u.codec=c.codec,u.originalCodec=c.originalCodec,u.refSampleDuration=1152/u.audioSampleRate*u.timescale,s.a.v(this.TAG,"Parsed MPEG Audio Frame Header"),this._audioInitialMetadataDispatched=!0,this._onTrackMetadata("audio",u),(g=this._mediaInfo).audioCodec=u.codec,g.audioSampleRate=u.audioSampleRate,g.audioChannelCount=u.channelCount,g.audioDataRate=c.bitRate,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}var v=this._parseMP3AudioData(e,t+1,i-1,!1);if(null==v)return;f=this._timestampBase+n;var y={unit:v,length:v.byteLength,dts:f,pts:f};_.samples.push(y),_.length+=v.length}}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid audio sample rate idx: "+h)}else this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported audio codec idx: "+a)}},e.prototype._parseAACAudioData=function(e,t,i){if(!(i<=1)){var n={},r=new Uint8Array(e,t,i);return n.packetType=r[0],0===r[0]?n.data=this._parseAACAudioSpecificConfig(e,t+1,i-1):n.data=r.subarray(1),n}s.a.w(this.TAG,"Flv: Invalid AAC packet, missing AACPacketType or/and Data!")},e.prototype._parseAACAudioSpecificConfig=function(e,t,i){var n,r,s=new Uint8Array(e,t,i),a=null,o=0,h=null;if(o=n=s[0]>>>3,(r=(7&s[0])<<1|s[1]>>>7)<0||r>=this._mpegSamplingRates.length)this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid sampling frequency index!");else{var d=this._mpegSamplingRates[r],u=(120&s[1])>>>3;if(!(u<0||u>=8)){5===o&&(h=(7&s[1])<<1|s[2]>>>7,(124&s[2])>>>2);var _=self.navigator.userAgent.toLowerCase();return-1!==_.indexOf("firefox")?r>=6?(o=5,a=new Array(4),h=r-3):(o=2,a=new Array(2),h=r):-1!==_.indexOf("android")?(o=2,a=new Array(2),h=r):(o=5,h=r,a=new Array(4),r>=6?h=r-3:1===u&&(o=2,a=new Array(2),h=r)),a[0]=o<<3,a[0]|=(15&r)>>>1,a[1]=(15&r)<<7,a[1]|=(15&u)<<3,5===o&&(a[1]|=(15&h)>>>1,a[2]=(1&h)<<7,a[2]|=8,a[3]=0),{config:a,samplingRate:d,channelCount:u,codec:"mp4a.40."+o,originalCodec:"mp4a.40."+n}}this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid channel configuration")}},e.prototype._parseMP3AudioData=function(e,t,i,n){if(!(i<4)){this._littleEndian;var r=new Uint8Array(e,t,i),a=null;if(n){if(255!==r[0])return;var o=r[1]>>>3&3,h=(6&r[1])>>1,d=(240&r[2])>>>4,u=(12&r[2])>>>2,_=3!==(r[3]>>>6&3)?2:1,l=0,c=0;switch(o){case 0:l=this._mpegAudioV25SampleRateTable[u];break;case 2:l=this._mpegAudioV20SampleRateTable[u];break;case 3:l=this._mpegAudioV10SampleRateTable[u]}switch(h){case 1:34,d<this._mpegAudioL3BitRateTable.length&&(c=this._mpegAudioL3BitRateTable[d]);break;case 2:33,d<this._mpegAudioL2BitRateTable.length&&(c=this._mpegAudioL2BitRateTable[d]);break;case 3:32,d<this._mpegAudioL1BitRateTable.length&&(c=this._mpegAudioL1BitRateTable[d])}a={bitRate:c,samplingRate:l,channelCount:_,codec:"mp3",originalCodec:"mp3"}}else a=r;return a}s.a.w(this.TAG,"Flv: Invalid MP3 packet, header missing!")},e.prototype._parseVideoData=function(e,t,i,n,r){if(i<=1)s.a.w(this.TAG,"Flv: Invalid video packet, missing VideoData payload!");else if(!0!==this._hasVideoFlagOverrided||!1!==this._hasVideo){var a=new Uint8Array(e,t,i)[0],o=(240&a)>>>4,h=15&a;7===h?this._parseAVCVideoPacket(e,t+1,i-1,n,r,o):this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: "+h)}},e.prototype._parseAVCVideoPacket=function(e,t,i,n,r,a){if(i<4)s.a.w(this.TAG,"Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime");else{var o=this._littleEndian,h=new DataView(e,t,i),d=h.getUint8(0),u=(16777215&h.getUint32(0,!o))<<8>>8;if(0===d)this._parseAVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===d)this._parseAVCVideoData(e,t+4,i-4,n,r,a,u);else if(2!==d)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+d)}},e.prototype._parseAVCDecoderConfigurationRecord=function(e,t,i){if(i<7)s.a.w(this.TAG,"Flv: Invalid AVCDecoderConfigurationRecord, lack of data!");else{var n=this._videoMetadata,r=this._videoTrack,a=this._littleEndian,o=new DataView(e,t,i);n?void 0!==n.avcc&&s.a.w(this.TAG,"Found another AVCDecoderConfigurationRecord!"):(!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(n=this._videoMetadata={}).type="video",n.id=r.id,n.timescale=this._timescale,n.duration=this._duration);var h=o.getUint8(0),d=o.getUint8(1);o.getUint8(2),o.getUint8(3);if(1===h&&0!==d)if(this._naluLengthSize=1+(3&o.getUint8(4)),3===this._naluLengthSize||4===this._naluLengthSize){var u=31&o.getUint8(5);if(0!==u){u>1&&s.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: SPS Count = "+u);for(var _=6,l=0;l<u;l++){var c=o.getUint16(_,!a);if(_+=2,0!==c){var f=new Uint8Array(e,t+_,c);_+=c;var g=p.parseSPS(f);if(0===l){n.codecWidth=g.codec_size.width,n.codecHeight=g.codec_size.height,n.presentWidth=g.present_size.width,n.presentHeight=g.present_size.height,n.profile=g.profile_string,n.level=g.level_string,n.bitDepth=g.bit_depth,n.chromaFormat=g.chroma_format,n.sarRatio=g.sar_ratio,n.frameRate=g.frame_rate,!1!==g.frame_rate.fixed&&0!==g.frame_rate.fps_num&&0!==g.frame_rate.fps_den||(n.frameRate=this._referenceFrameRate);var v=n.frameRate.fps_den,y=n.frameRate.fps_num;n.refSampleDuration=n.timescale*(v/y);for(var b=f.subarray(1,4),E="avc1.",S=0;S<3;S++){var A=b[S].toString(16);A.length<2&&(A="0"+A),E+=A}n.codec=E;var R=this._mediaInfo;R.width=n.codecWidth,R.height=n.codecHeight,R.fps=n.frameRate.fps,R.profile=n.profile,R.level=n.level,R.refFrames=g.ref_frames,R.chromaFormat=g.chroma_format_string,R.sarNum=n.sarRatio.width,R.sarDen=n.sarRatio.height,R.videoCodec=E,R.hasAudio?null!=R.audioCodec&&(R.mimeType='video/x-flv; codecs="'+R.videoCodec+","+R.audioCodec+'"'):R.mimeType='video/x-flv; codecs="'+R.videoCodec+'"',R.isComplete()&&this._onMediaInfo(R)}}}var L=o.getUint8(_);if(0!==L){L>1&&s.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: PPS Count = "+L),_++;for(l=0;l<L;l++){c=o.getUint16(_,!a);_+=2,0!==c&&(_+=c)}n.avcc=new Uint8Array(i),n.avcc.set(new Uint8Array(e,t,i),0),s.a.v(this.TAG,"Parsed AVCDecoderConfigurationRecord"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._videoInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("video",n)}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord: No PPS")}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord: No SPS")}else this._onError(m.a.FORMAT_ERROR,"Flv: Strange NaluLengthSizeMinusOne: "+(this._naluLengthSize-1));else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord")}},e.prototype._parseAVCVideoData=function(e,t,i,n,r,a,o){for(var h=this._littleEndian,d=new DataView(e,t,i),u=[],_=0,l=0,c=this._naluLengthSize,f=this._timestampBase+n,p=1===a;l<i;){if(l+4>=i){s.a.w(this.TAG,"Malformed Nalu near timestamp "+f+", offset = "+l+", dataSize = "+i);break}var m=d.getUint32(l,!h);if(3===c&&(m>>>=8),m>i-c)return void s.a.w(this.TAG,"Malformed Nalus near timestamp "+f+", NaluSize > DataSize!");var g=31&d.getUint8(l+c);5===g&&(p=!0);var v=new Uint8Array(e,t+l,c+m),y={type:g,data:v};u.push(y),_+=v.byteLength,l+=c+m}if(u.length){var b=this._videoTrack,E={units:u,length:_,isKeyframe:p,dts:f,cts:o,pts:f+o};p&&(E.fileposition=r),b.samples.push(E),b.length+=_}},e}(),y=function(){function e(){}return e.prototype.destroy=function(){this.onError=null,this.onMediaInfo=null,this.onMetaDataArrived=null,this.onTrackMetadata=null,this.onDataAvailable=null,this.onTimedID3Metadata=null,this.onPESPrivateData=null,this.onPESPrivateDataDescriptor=null},e}(),b=function(){this.program_pmt_pid={}};!function(e){e[e.kMPEG1Audio=3]="kMPEG1Audio",e[e.kMPEG2Audio=4]="kMPEG2Audio",e[e.kPESPrivateData=6]="kPESPrivateData",e[e.kADTSAAC=15]="kADTSAAC",e[e.kID3=21]="kID3",e[e.kH264=27]="kH264",e[e.kH265=36]="kH265"}(g||(g={}));var E,S=function(){this.pid_stream_type={},this.common_pids={h264:void 0,adts_aac:void 0},this.pes_private_data_pids={},this.timed_id3_pids={}},A=function(){},R=function(){},L=function(){this.slices=[],this.total_length=0,this.expected_length=0,this.file_position=0};!function(e){e[e.kUnspecified=0]="kUnspecified",e[e.kSliceNonIDR=1]="kSliceNonIDR",e[e.kSliceDPA=2]="kSliceDPA",e[e.kSliceDPB=3]="kSliceDPB",e[e.kSliceDPC=4]="kSliceDPC",e[e.kSliceIDR=5]="kSliceIDR",e[e.kSliceSEI=6]="kSliceSEI",e[e.kSliceSPS=7]="kSliceSPS",e[e.kSlicePPS=8]="kSlicePPS",e[e.kSliceAUD=9]="kSliceAUD",e[e.kEndOfSequence=10]="kEndOfSequence",e[e.kEndOfStream=11]="kEndOfStream",e[e.kFiller=12]="kFiller",e[e.kSPSExt=13]="kSPSExt",e[e.kReserved0=14]="kReserved0"}(E||(E={}));var T,w,D=function(){},k=function(e){var t=e.data.byteLength;this.type=e.type,this.data=new Uint8Array(4+t),new DataView(this.data.buffer).setUint32(0,t),this.data.set(e.data,4)},C=function(){function e(e){this.TAG="H264AnnexBParser",this.current_startcode_offset_=0,this.eof_flag_=!1,this.data_=e,this.current_startcode_offset_=this.findNextStartCodeOffset(0),this.eof_flag_&&s.a.e(this.TAG,"Could not found H264 startcode until payload end!")}return e.prototype.findNextStartCodeOffset=function(e){for(var t=e,i=this.data_;;){if(t+3>=i.byteLength)return this.eof_flag_=!0,i.byteLength;var n=i[t+0]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3],r=i[t+0]<<16|i[t+1]<<8|i[t+2];if(1===n||1===r)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_startcode_offset_,n=31&e[i+=1===(e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3])?4:3],r=(128&e[i])>>>7,s=this.findNextStartCodeOffset(i);if(this.current_startcode_offset_=s,!(n>=E.kReserved0)&&0===r){var a=e.subarray(i,s);(t=new D).type=n,t.data=a}}return t},e}(),I=function(){function e(e,t,i){var n=8+e.byteLength+1+2+t.byteLength,r=!1;66!==e[3]&&77!==e[3]&&88!==e[3]&&(r=!0,n+=4);var s=this.data=new Uint8Array(n);s[0]=1,s[1]=e[1],s[2]=e[2],s[3]=e[3],s[4]=255,s[5]=225;var a=e.byteLength;s[6]=a>>>8,s[7]=255&a;var o=8;s.set(e,8),s[o+=a]=1;var h=t.byteLength;s[o+1]=h>>>8,s[o+2]=255&h,s.set(t,o+3),o+=3+h,r&&(s[o]=252|i.chroma_format_idc,s[o+1]=248|i.bit_depth_luma-8,s[o+2]=248|i.bit_depth_chroma-8,s[o+3]=0,o+=4)}return e.prototype.getData=function(){return this.data},e}();!function(e){e[e.kNull=0]="kNull",e[e.kAACMain=1]="kAACMain",e[e.kAAC_LC=2]="kAAC_LC",e[e.kAAC_SSR=3]="kAAC_SSR",e[e.kAAC_LTP=4]="kAAC_LTP",e[e.kAAC_SBR=5]="kAAC_SBR",e[e.kAAC_Scalable=6]="kAAC_Scalable",e[e.kLayer1=32]="kLayer1",e[e.kLayer2=33]="kLayer2",e[e.kLayer3=34]="kLayer3"}(T||(T={})),function(e){e[e.k96000Hz=0]="k96000Hz",e[e.k88200Hz=1]="k88200Hz",e[e.k64000Hz=2]="k64000Hz",e[e.k48000Hz=3]="k48000Hz",e[e.k44100Hz=4]="k44100Hz",e[e.k32000Hz=5]="k32000Hz",e[e.k24000Hz=6]="k24000Hz",e[e.k22050Hz=7]="k22050Hz",e[e.k16000Hz=8]="k16000Hz",e[e.k12000Hz=9]="k12000Hz",e[e.k11025Hz=10]="k11025Hz",e[e.k8000Hz=11]="k8000Hz",e[e.k7350Hz=12]="k7350Hz"}(w||(w={}));var O,P=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],M=function(){},x=function(){function e(e){this.TAG="AACADTSParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&s.a.e(this.TAG,"Could not found ADTS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+7>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(4095===(i[t+0]<<8|i[t+1])>>>4)return t;t++}},e.prototype.readNextAACFrame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_syncword_offset_,n=(8&e[i+1])>>>3,r=(6&e[i+1])>>>1,s=1&e[i+1],a=(192&e[i+2])>>>6,o=(60&e[i+2])>>>2,h=(1&e[i+2])<<2|(192&e[i+3])>>>6,d=(3&e[i+3])<<11|e[i+4]<<3|(224&e[i+5])>>>5;e[i+6];if(i+d>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var u=1===s?7:9,_=d-u;i+=u;var l=this.findNextSyncwordOffset(i+_);if(this.current_syncword_offset_=l,(0===n||1===n)&&0===r){var c=e.subarray(i,i+_);(t=new M).audio_object_type=a+1,t.sampling_freq_index=o,t.sampling_frequency=P[o],t.channel_config=h,t.data=c}}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),B=function(e){var t=null,i=e.audio_object_type,n=e.audio_object_type,r=e.sampling_freq_index,s=e.channel_config,a=0,o=navigator.userAgent.toLowerCase();-1!==o.indexOf("firefox")?r>=6?(n=5,t=new Array(4),a=r-3):(n=2,t=new Array(2),a=r):-1!==o.indexOf("android")?(n=2,t=new Array(2),a=r):(n=5,a=r,t=new Array(4),r>=6?a=r-3:1===s&&(n=2,t=new Array(2),a=r)),t[0]=n<<3,t[0]|=(15&r)>>>1,t[1]=(15&r)<<7,t[1]|=(15&s)<<3,5===n&&(t[1]|=(15&a)>>>1,t[2]=(1&a)<<7,t[2]|=8,t[3]=0),this.config=t,this.sampling_rate=P[r],this.channel_count=s,this.codec_mimetype="mp4a.40."+n,this.original_codec_mimetype="mp4a.40."+i},U=function(){},N=function(){},F=(O=function(e,t){return(O=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}O(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),G=function(e){function t(t,i){var n=e.call(this)||this;return n.TAG="TSDemuxer",n.first_parse_=!0,n.media_info_=new o.a,n.timescale_=90,n.duration_=0,n.current_pmt_pid_=-1,n.program_pmt_map_={},n.pes_slice_queues_={},n.section_slice_queues_={},n.video_metadata_={sps:void 0,pps:void 0,sps_details:void 0},n.audio_metadata_={audio_object_type:void 0,sampling_freq_index:void 0,sampling_frequency:void 0,channel_config:void 0},n.aac_last_sample_pts_=void 0,n.aac_last_incomplete_data_=null,n.has_video_=!1,n.has_audio_=!1,n.video_init_segment_dispatched_=!1,n.audio_init_segment_dispatched_=!1,n.video_metadata_changed_=!1,n.audio_metadata_changed_=!1,n.video_track_={type:"video",id:1,sequenceNumber:0,samples:[],length:0},n.audio_track_={type:"audio",id:2,sequenceNumber:0,samples:[],length:0},n.ts_packet_size_=t.ts_packet_size,n.sync_offset_=t.sync_offset,n.config_=i,n}return F(t,e),t.prototype.destroy=function(){this.media_info_=null,this.pes_slice_queues_=null,this.section_slice_queues_=null,this.video_metadata_=null,this.audio_metadata_=null,this.aac_last_incomplete_data_=null,this.video_track_=null,this.audio_track_=null,e.prototype.destroy.call(this)},t.probe=function(e){var t=new Uint8Array(e),i=-1,n=188;if(t.byteLength<=3*n)return s.a.e("TSDemuxer","Probe data "+t.byteLength+" bytes is too few for judging MPEG-TS stream format!"),{match:!1};for(;-1===i;){for(var r=Math.min(1e3,t.byteLength-3*n),a=0;a<r;){if(71===t[a]&&71===t[a+n]&&71===t[a+2*n]){i=a;break}a++}if(-1===i)if(188===n)n=192;else{if(192!==n)break;n=204}}return-1===i?{match:!1}:(192===n&&i>=4?(s.a.v("TSDemuxer","ts_packet_size = 192, m2ts mode"),i-=4):204===n&&s.a.v("TSDemuxer","ts_packet_size = 204, RS encoded MPEG2-TS stream"),{match:!0,consumed:0,ts_packet_size:n,sync_offset:i})},t.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},t.prototype.resetMediaInfo=function(){this.media_info_=new o.a},t.prototype.parseChunks=function(e,t){if(!(this.onError&&this.onMediaInfo&&this.onTrackMetadata&&this.onDataAvailable))throw new _.a("onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var i=0;for(this.first_parse_&&(this.first_parse_=!1,i=this.sync_offset_);i+this.ts_packet_size_<=e.byteLength;){var n=t+i;192===this.ts_packet_size_&&(i+=4);var r=new Uint8Array(e,i,188),a=r[0];if(71!==a){s.a.e(this.TAG,"sync_byte = "+a+", not 0x47");break}var o=(64&r[1])>>>6,h=(r[1],(31&r[1])<<8|r[2]),d=(48&r[3])>>>4,u=15&r[3],l={},c=4;if(2==d||3==d){var f=r[4];if(5+f===188){i+=188,204===this.ts_packet_size_&&(i+=16);continue}f>0&&(l=this.parseAdaptationField(e,i+4,1+f)),c=5+f}if(1==d||3==d)if(0===h||h===this.current_pmt_pid_){var p=188-c;this.handleSectionSlice(e,i+c,p,{pid:h,file_position:n,payload_unit_start_indicator:o,continuity_conunter:u,random_access_indicator:l.random_access_indicator})}else if(null!=this.pmt_&&null!=this.pmt_.pid_stream_type[h]){p=188-c;var m=this.pmt_.pid_stream_type[h];h!==this.pmt_.common_pids.h264&&h!==this.pmt_.common_pids.adts_aac&&!0!==this.pmt_.pes_private_data_pids[h]&&!0!==this.pmt_.timed_id3_pids[h]||this.handlePESSlice(e,i+c,p,{pid:h,stream_type:m,file_position:n,payload_unit_start_indicator:o,continuity_conunter:u,random_access_indicator:l.random_access_indicator})}i+=188,204===this.ts_packet_size_&&(i+=16)}return this.dispatchAudioVideoMediaSegment(),i},t.prototype.parseAdaptationField=function(e,t,i){var n=new Uint8Array(e,t,i),r=n[0];return r>0?r>183?(s.a.w(this.TAG,"Illegal adaptation_field_length: "+r),{}):{discontinuity_indicator:(128&n[1])>>>7,random_access_indicator:(64&n[1])>>>6,elementary_stream_priority_indicator:(32&n[1])>>>5}:{}},t.prototype.handleSectionSlice=function(e,t,i,n){var r=new Uint8Array(e,t,i),s=this.section_slice_queues_[n.pid];if(n.payload_unit_start_indicator){var a=r[0];if(null!=s&&0!==s.total_length){var o=new Uint8Array(e,t+1,Math.min(i,a));s.slices.push(o),s.total_length+=o.byteLength,s.total_length===s.expected_length?this.emitSectionSlices(s,n):this.clearSlices(s,n)}for(var h=1+a;h<r.byteLength;){if(255===r[h+0])break;var d=(15&r[h+1])<<8|r[h+2];this.section_slice_queues_[n.pid]=new L,(s=this.section_slice_queues_[n.pid]).expected_length=d+3,s.file_position=n.file_position,s.random_access_indicator=n.random_access_indicator;o=new Uint8Array(e,t+h,Math.min(i-h,s.expected_length-s.total_length));s.slices.push(o),s.total_length+=o.byteLength,s.total_length===s.expected_length?this.emitSectionSlices(s,n):s.total_length>=s.expected_length&&this.clearSlices(s,n),h+=o.byteLength}}else if(null!=s&&0!==s.total_length){o=new Uint8Array(e,t,Math.min(i,s.expected_length-s.total_length));s.slices.push(o),s.total_length+=o.byteLength,s.total_length===s.expected_length?this.emitSectionSlices(s,n):s.total_length>=s.expected_length&&this.clearSlices(s,n)}},t.prototype.handlePESSlice=function(e,t,i,n){var r=new Uint8Array(e,t,i),a=r[0]<<16|r[1]<<8|r[2],o=(r[3],r[4]<<8|r[5]);if(n.payload_unit_start_indicator){if(1!==a)return void s.a.e(this.TAG,"handlePESSlice: packet_start_code_prefix should be 1 but with value "+a);var h=this.pes_slice_queues_[n.pid];h&&(0===h.expected_length||h.expected_length===h.total_length?this.emitPESSlices(h,n):this.clearSlices(h,n)),this.pes_slice_queues_[n.pid]=new L,this.pes_slice_queues_[n.pid].file_position=n.file_position,this.pes_slice_queues_[n.pid].random_access_indicator=n.random_access_indicator}if(null!=this.pes_slice_queues_[n.pid]){var d=this.pes_slice_queues_[n.pid];d.slices.push(r),n.payload_unit_start_indicator&&(d.expected_length=0===o?0:o+6),d.total_length+=r.byteLength,d.expected_length>0&&d.expected_length===d.total_length?this.emitPESSlices(d,n):d.expected_length>0&&d.expected_length<d.total_length&&this.clearSlices(d,n)}},t.prototype.emitSectionSlices=function(e,t){for(var i=new Uint8Array(e.total_length),n=0,r=0;n<e.slices.length;n++){var s=e.slices[n];i.set(s,r),r+=s.byteLength}e.slices=[],e.expected_length=-1,e.total_length=0;var a=new R;a.pid=t.pid,a.data=i,a.file_position=e.file_position,a.random_access_indicator=e.random_access_indicator,this.parseSection(a)},t.prototype.emitPESSlices=function(e,t){for(var i=new Uint8Array(e.total_length),n=0,r=0;n<e.slices.length;n++){var s=e.slices[n];i.set(s,r),r+=s.byteLength}e.slices=[],e.expected_length=-1,e.total_length=0;var a=new A;a.pid=t.pid,a.data=i,a.stream_type=t.stream_type,a.file_position=e.file_position,a.random_access_indicator=e.random_access_indicator,this.parsePES(a)},t.prototype.clearSlices=function(e,t){e.slices=[],e.expected_length=-1,e.total_length=0},t.prototype.parseSection=function(e){var t=e.data,i=e.pid;0===i?this.parsePAT(t):i===this.current_pmt_pid_&&this.parsePMT(t)},t.prototype.parsePES=function(e){var t=e.data,i=t[0]<<16|t[1]<<8|t[2],n=t[3],r=t[4]<<8|t[5];if(1===i){if(188!==n&&190!==n&&191!==n&&240!==n&&241!==n&&255!==n&&242!==n&&248!==n){t[6];var a=(192&t[7])>>>6,o=t[8],h=void 0,d=void 0;2!==a&&3!==a||(h=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,d=3===a?536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2:h);var u=9+o,_=void 0;if(0!==r){if(r<3+o)return void s.a.v(this.TAG,"Malformed PES: PES_packet_length < 3 + PES_header_data_length");_=r-3-o}else _=t.byteLength-u;var l=t.subarray(u,u+_);switch(e.stream_type){case g.kMPEG1Audio:case g.kMPEG2Audio:break;case g.kPESPrivateData:this.parsePESPrivateDataPayload(l,h,d,e.pid,n);break;case g.kADTSAAC:this.parseAACPayload(l,h);break;case g.kID3:this.parseTimedID3MetadataPayload(l,h,d,e.pid,n);break;case g.kH264:this.parseH264Payload(l,h,d,e.file_position,e.random_access_indicator);break;case g.kH265:}}else if((188===n||191===n||240===n||241===n||255===n||242===n||248===n)&&e.stream_type===g.kPESPrivateData){u=6,_=void 0;_=0!==r?r:t.byteLength-u;l=t.subarray(u,u+_);this.parsePESPrivateDataPayload(l,void 0,void 0,e.pid,n)}}else s.a.e(this.TAG,"parsePES: packet_start_code_prefix should be 1 but with value "+i)},t.prototype.parsePAT=function(e){var t=e[0];if(0===t){var i=(15&e[1])<<8|e[2],n=(e[3],e[4],(62&e[5])>>>1),r=1&e[5],a=e[6],o=(e[7],null);if(1===r&&0===a)(o=new b).version_number=n;else if(null==(o=this.pat_))return;for(var h=i-5-4,d=-1,u=-1,_=8;_<8+h;_+=4){var l=e[_]<<8|e[_+1],c=(31&e[_+2])<<8|e[_+3];0===l?o.network_pid=c:(o.program_pmt_pid[l]=c,-1===d&&(d=l),-1===u&&(u=c))}1===r&&0===a&&(null==this.pat_&&s.a.v(this.TAG,"Parsed first PAT: "+JSON.stringify(o)),this.pat_=o,this.current_program_=d,this.current_pmt_pid_=u)}else s.a.e(this.TAG,"parsePAT: table_id "+t+" is not corresponded to PAT!")},t.prototype.parsePMT=function(e){var t=e[0];if(2===t){var i=(15&e[1])<<8|e[2],n=e[3]<<8|e[4],r=(62&e[5])>>>1,a=1&e[5],o=e[6],h=(e[7],null);if(1===a&&0===o)(h=new S).program_number=n,h.version_number=r,this.program_pmt_map_[n]=h;else if(null==(h=this.program_pmt_map_[n]))return;e[8],e[9];for(var d=(15&e[10])<<8|e[11],u=12+d,_=i-9-d-4,l=u;l<u+_;){var c=e[l],f=(31&e[l+1])<<8|e[l+2],p=(15&e[l+3])<<8|e[l+4];if(h.pid_stream_type[f]=c,c!==g.kH264||h.common_pids.h264)if(c!==g.kADTSAAC||h.common_pids.adts_aac)if(c===g.kPESPrivateData){if(h.pes_private_data_pids[f]=!0,p>0){var m=e.subarray(l+5,l+5+p);this.dispatchPESPrivateDataDescriptor(f,c,m)}}else c===g.kID3&&(h.timed_id3_pids[f]=!0);else h.common_pids.adts_aac=f;else h.common_pids.h264=f;l+=5+p}n===this.current_program_&&(null==this.pmt_&&s.a.v(this.TAG,"Parsed first PMT: "+JSON.stringify(h)),this.pmt_=h,h.common_pids.h264&&(this.has_video_=!0),h.common_pids.adts_aac&&(this.has_audio_=!0))}else s.a.e(this.TAG,"parsePMT: table_id "+t+" is not corresponded to PMT!")},t.prototype.parseH264Payload=function(e,t,i,n,r){for(var a=new C(e),o=null,h=[],d=0,u=!1;null!=(o=a.readNextNaluPayload());){var _=new k(o);if(_.type===E.kSliceSPS){var l=p.parseSPS(o.data);this.video_init_segment_dispatched_?!0===this.detectVideoMetadataChange(_,l)&&(s.a.v(this.TAG,"H264: Critical h264 metadata has been changed, attempt to re-generate InitSegment"),this.video_metadata_changed_=!0,this.video_metadata_={sps:_,pps:void 0,sps_details:l}):(this.video_metadata_.sps=_,this.video_metadata_.sps_details=l)}else _.type===E.kSlicePPS?this.video_init_segment_dispatched_&&!this.video_metadata_changed_||(this.video_metadata_.pps=_,this.video_metadata_.sps&&this.video_metadata_.pps&&(this.video_metadata_changed_&&this.dispatchVideoMediaSegment(),this.dispatchVideoInitSegment())):(_.type===E.kSliceIDR||_.type===E.kSliceNonIDR&&1===r)&&(u=!0);this.video_init_segment_dispatched_&&(h.push(_),d+=_.data.byteLength)}var c=Math.floor(t/this.timescale_),f=Math.floor(i/this.timescale_);if(h.length){var m=this.video_track_,g={units:h,length:d,isKeyframe:u,dts:f,pts:c,cts:c-f,file_position:n};m.samples.push(g),m.length+=d}},t.prototype.detectVideoMetadataChange=function(e,t){if(t.codec_mimetype!==this.video_metadata_.sps_details.codec_mimetype)return s.a.v(this.TAG,"H264: Codec mimeType changed from "+this.video_metadata_.sps_details.codec_mimetype+" to "+t.codec_mimetype),!0;if(t.codec_size.width!==this.video_metadata_.sps_details.codec_size.width||t.codec_size.height!==this.video_metadata_.sps_details.codec_size.height){var i=this.video_metadata_.sps_details.codec_size,n=t.codec_size;return s.a.v(this.TAG,"H264: Coded Resolution changed from "+i.width+"x"+i.height+" to "+n.width+"x"+n.height),!0}return t.present_size.width!==this.video_metadata_.sps_details.present_size.width&&(s.a.v(this.TAG,"H264: Present resolution width changed from "+this.video_metadata_.sps_details.present_size.width+" to "+t.present_size.width),!0)},t.prototype.isInitSegmentDispatched=function(){return this.has_video_&&this.has_audio_?this.video_init_segment_dispatched_&&this.audio_init_segment_dispatched_:this.has_video_&&!this.has_audio_?this.video_init_segment_dispatched_:!(this.has_video_||!this.has_audio_)&&this.audio_init_segment_dispatched_},t.prototype.dispatchVideoInitSegment=function(){var e=this.video_metadata_.sps_details,t={type:"video"};t.id=this.video_track_.id,t.timescale=1e3,t.duration=this.duration_,t.codecWidth=e.codec_size.width,t.codecHeight=e.codec_size.height,t.presentWidth=e.present_size.width,t.presentHeight=e.present_size.height,t.profile=e.profile_string,t.level=e.level_string,t.bitDepth=e.bit_depth,t.chromaFormat=e.chroma_format,t.sarRatio=e.sar_ratio,t.frameRate=e.frame_rate;var i=t.frameRate.fps_den,n=t.frameRate.fps_num;t.refSampleDuration=i/n*1e3,t.codec=e.codec_mimetype;var r=this.video_metadata_.sps.data.subarray(4),a=this.video_metadata_.pps.data.subarray(4),o=new I(r,a,e);t.avcc=o.getData(),0==this.video_init_segment_dispatched_&&s.a.v(this.TAG,"Generated first AVCDecoderConfigurationRecord for mimeType: "+t.codec),this.onTrackMetadata("video",t),this.video_init_segment_dispatched_=!0,this.video_metadata_changed_=!1;var h=this.media_info_;h.hasVideo=!0,h.width=t.codecWidth,h.height=t.codecHeight,h.fps=t.frameRate.fps,h.profile=t.profile,h.level=t.level,h.refFrames=e.ref_frames,h.chromaFormat=e.chroma_format_string,h.sarNum=t.sarRatio.width,h.sarDen=t.sarRatio.height,h.videoCodec=t.codec,h.hasAudio&&h.audioCodec?h.mimeType='video/mp2t; codecs="'+h.videoCodec+","+h.audioCodec+'"':h.mimeType='video/mp2t; codecs="'+h.videoCodec+'"',h.isComplete()&&this.onMediaInfo(h)},t.prototype.dispatchVideoMediaSegment=function(){this.isInitSegmentDispatched()&&this.video_track_.length&&this.onDataAvailable(null,this.video_track_)},t.prototype.dispatchAudioMediaSegment=function(){this.isInitSegmentDispatched()&&this.audio_track_.length&&this.onDataAvailable(this.audio_track_,null)},t.prototype.dispatchAudioVideoMediaSegment=function(){this.isInitSegmentDispatched()&&(this.audio_track_.length||this.video_track_.length)&&this.onDataAvailable(this.audio_track_,this.video_track_)},t.prototype.parseAACPayload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){if(this.aac_last_incomplete_data_){var i=new Uint8Array(e.byteLength+this.aac_last_incomplete_data_.byteLength);i.set(this.aac_last_incomplete_data_,0),i.set(e,this.aac_last_incomplete_data_.byteLength),e=i}var n,r;if(null!=t)r=t/this.timescale_;else{if(null==this.aac_last_sample_pts_)return void s.a.w(this.TAG,"AAC: Unknown pts");n=1024/this.audio_metadata_.sampling_frequency*1e3,r=this.aac_last_sample_pts_+n}if(this.aac_last_incomplete_data_&&this.aac_last_sample_pts_){n=1024/this.audio_metadata_.sampling_frequency*1e3;var a=this.aac_last_sample_pts_+n;Math.abs(a-r)>1&&(s.a.w(this.TAG,"AAC: Detected pts overlapped, expected: "+a+"ms, PES pts: "+r+"ms"),r=a)}for(var o,h=new x(e),d=null,u=r;null!=(d=h.readNextAACFrame());){n=1024/d.sampling_frequency*1e3,0==this.audio_init_segment_dispatched_?(this.audio_metadata_.audio_object_type=d.audio_object_type,this.audio_metadata_.sampling_freq_index=d.sampling_freq_index,this.audio_metadata_.sampling_frequency=d.sampling_frequency,this.audio_metadata_.channel_config=d.channel_config,this.dispatchAudioInitSegment(d)):this.detectAudioMetadataChange(d)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(d)),o=u;var _=Math.floor(u),l={unit:d.data,length:d.data.byteLength,pts:_,dts:_};this.audio_track_.samples.push(l),this.audio_track_.length+=d.data.byteLength,u+=n}h.hasIncompleteData()&&(this.aac_last_incomplete_data_=h.getIncompleteData()),o&&(this.aac_last_sample_pts_=o)}},t.prototype.detectAudioMetadataChange=function(e){return e.audio_object_type!==this.audio_metadata_.audio_object_type?(s.a.v(this.TAG,"AAC: AudioObjectType changed from "+this.audio_metadata_.audio_object_type+" to "+e.audio_object_type),!0):e.sampling_freq_index!==this.audio_metadata_.sampling_freq_index?(s.a.v(this.TAG,"AAC: SamplingFrequencyIndex changed from "+this.audio_metadata_.sampling_freq_index+" to "+e.sampling_freq_index),!0):e.channel_config!==this.audio_metadata_.channel_config&&(s.a.v(this.TAG,"AAC: Channel configuration changed from "+this.audio_metadata_.channel_config+" to "+e.channel_config),!0)},t.prototype.dispatchAudioInitSegment=function(e){var t=new B(e),i={type:"audio"};i.id=this.audio_track_.id,i.timescale=1e3,i.duration=this.duration_,i.audioSampleRate=t.sampling_rate,i.channelCount=t.channel_count,i.codec=t.codec_mimetype,i.originalCodec=t.original_codec_mimetype,i.config=t.config,i.refSampleDuration=1024/i.audioSampleRate*i.timescale,0==this.audio_init_segment_dispatched_&&s.a.v(this.TAG,"Generated first AudioSpecificConfig for mimeType: "+i.codec),this.onTrackMetadata("audio",i),this.audio_init_segment_dispatched_=!0,this.video_metadata_changed_=!1;var n=this.media_info_;n.hasAudio=!0,n.audioCodec=i.originalCodec,n.audioSampleRate=i.audioSampleRate,n.audioChannelCount=i.channelCount,n.hasVideo&&n.videoCodec?n.mimeType='video/mp2t; codecs="'+n.videoCodec+","+n.audioCodec+'"':n.mimeType='video/mp2t; codecs="'+n.audioCodec+'"',n.isComplete()&&this.onMediaInfo(n)},t.prototype.dispatchPESPrivateDataDescriptor=function(e,t,i){var n=new N;n.pid=e,n.stream_type=t,n.descriptor=i,this.onPESPrivateDataDescriptor&&this.onPESPrivateDataDescriptor(n)},t.prototype.parsePESPrivateDataPayload=function(e,t,i,n,r){var s=new U;if(s.pid=n,s.stream_id=r,s.len=e.byteLength,s.data=e,null!=t){var a=Math.floor(t/this.timescale_);s.pts=a}else s.nearest_pts=this.aac_last_sample_pts_;if(null!=i){var o=Math.floor(i/this.timescale_);s.dts=o}this.onPESPrivateData&&this.onPESPrivateData(s)},t.prototype.parseTimedID3MetadataPayload=function(e,t,i,n,r){var s=new U;if(s.pid=n,s.stream_id=r,s.len=e.byteLength,s.data=e,null!=t){var a=Math.floor(t/this.timescale_);s.pts=a}if(null!=i){var o=Math.floor(i/this.timescale_);s.dts=o}this.onTimedID3Metadata&&this.onTimedID3Metadata(s)},t}(y),V=function(){function e(){}return e.init=function(){for(var t in e.types={avc1:[],avcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],mvex:[],mvhd:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[],".mp3":[]},e.types)e.types.hasOwnProperty(t)&&(e.types[t]=[t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2),t.charCodeAt(3)]);var i=e.constants={};i.FTYP=new Uint8Array([105,115,111,109,0,0,0,1,105,115,111,109,97,118,99,49]),i.STSD_PREFIX=new Uint8Array([0,0,0,0,0,0,0,1]),i.STTS=new Uint8Array([0,0,0,0,0,0,0,0]),i.STSC=i.STCO=i.STTS,i.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),i.HDLR_VIDEO=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),i.HDLR_AUDIO=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),i.DREF=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),i.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),i.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0])},e.box=function(e){for(var t=8,i=null,n=Array.prototype.slice.call(arguments,1),r=n.length,s=0;s<r;s++)t+=n[s].byteLength;(i=new Uint8Array(t))[0]=t>>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);var a=8;for(s=0;s<r;s++)i.set(n[s],a),a+=n[s].byteLength;return i},e.generateInitSegment=function(t){var i=e.box(e.types.ftyp,e.constants.FTYP),n=e.moov(t),r=new Uint8Array(i.byteLength+n.byteLength);return r.set(i,0),r.set(n,i.byteLength),r},e.moov=function(t){var i=e.mvhd(t.timescale,t.duration),n=e.trak(t),r=e.mvex(t);return e.box(e.types.moov,i,n,r)},e.mvhd=function(t,i){return e.box(e.types.mvhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))},e.trak=function(t){return e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.tkhd=function(t){var i=t.id,n=t.duration,r=t.presentWidth,s=t.presentHeight;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,r>>>8&255,255&r,0,0,s>>>8&255,255&s,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t),e.hdlr(t),e.minf(t))},e.mdhd=function(t){var i=t.timescale,n=t.duration;return e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,85,196,0,0]))},e.hdlr=function(t){var i=null;return i="audio"===t.type?e.constants.HDLR_AUDIO:e.constants.HDLR_VIDEO,e.box(e.types.hdlr,i)},e.minf=function(t){var i=null;return i="audio"===t.type?e.box(e.types.smhd,e.constants.SMHD):e.box(e.types.vmhd,e.constants.VMHD),e.box(e.types.minf,i,e.dinf(),e.stbl(t))},e.dinf=function(){return e.box(e.types.dinf,e.box(e.types.dref,e.constants.DREF))},e.stbl=function(t){return e.box(e.types.stbl,e.stsd(t),e.box(e.types.stts,e.constants.STTS),e.box(e.types.stsc,e.constants.STSC),e.box(e.types.stsz,e.constants.STSZ),e.box(e.types.stco,e.constants.STCO))},e.stsd=function(t){return"audio"===t.type?"mp3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp3(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp4a(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.avc1(t))},e.mp3=function(t){var i=t.channelCount,n=t.audioSampleRate,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types[".mp3"],r)},e.mp4a=function(t){var i=t.channelCount,n=t.audioSampleRate,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types.mp4a,r,e.esds(t))},e.esds=function(t){var i=t.config||[],n=i.length,r=new Uint8Array([0,0,0,0,3,23+n,0,1,0,4,15+n,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([n]).concat(i).concat([6,1,2]));return e.box(e.types.esds,r)},e.avc1=function(t){var i=t.avcc,n=t.codecWidth,r=t.codecHeight,s=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,r>>>8&255,255&r,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.avc1,s,e.box(e.types.avcC,i))},e.mvex=function(t){return e.box(e.types.mvex,e.trex(t))},e.trex=function(t){var i=t.id,n=new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return e.box(e.types.trex,n)},e.moof=function(t,i){return e.box(e.types.moof,e.mfhd(t.sequenceNumber),e.traf(t,i))},e.mfhd=function(t){var i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t]);return e.box(e.types.mfhd,i)},e.traf=function(t,i){var n=t.id,r=e.box(e.types.tfhd,new Uint8Array([0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n])),s=e.box(e.types.tfdt,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),a=e.sdtp(t),o=e.trun(t,a.byteLength+16+16+8+16+8+8);return e.box(e.types.traf,r,s,o,a)},e.sdtp=function(t){for(var i=t.samples||[],n=i.length,r=new Uint8Array(4+n),s=0;s<n;s++){var a=i[s].flags;r[s+4]=a.isLeading<<6|a.dependsOn<<4|a.isDependedOn<<2|a.hasRedundancy}return e.box(e.types.sdtp,r)},e.trun=function(t,i){var n=t.samples||[],r=n.length,s=12+16*r,a=new Uint8Array(s);i+=8+s,a.set([0,0,15,1,r>>>24&255,r>>>16&255,r>>>8&255,255&r,i>>>24&255,i>>>16&255,i>>>8&255,255&i],0);for(var o=0;o<r;o++){var h=n[o].duration,d=n[o].size,u=n[o].flags,_=n[o].cts;a.set([h>>>24&255,h>>>16&255,h>>>8&255,255&h,d>>>24&255,d>>>16&255,d>>>8&255,255&d,u.isLeading<<2|u.dependsOn,u.isDependedOn<<6|u.hasRedundancy<<4|u.isNonSync,0,0,_>>>24&255,_>>>16&255,_>>>8&255,255&_],12+16*o)}return e.box(e.types.trun,a)},e.mdat=function(t){return e.box(e.types.mdat,t)},e}();V.init();var j=V,z=function(){function e(){}return e.getSilentFrame=function(e,t){if("mp4a.40.2"===e){if(1===t)return new Uint8Array([0,200,0,128,35,128]);if(2===t)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===t)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}return null},e}(),H=i(7),q=function(){function e(e){this.TAG="MP4Remuxer",this._config=e,this._isLive=!0===e.isLive,this._dtsBase=-1,this._dtsBaseInited=!1,this._audioDtsBase=1/0,this._videoDtsBase=1/0,this._audioNextDts=void 0,this._videoNextDts=void 0,this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList=new H.c("audio"),this._videoSegmentInfoList=new H.c("video"),this._onInitSegment=null,this._onMediaSegment=null,this._forceFirstIDR=!(!a.a.chrome||!(a.a.version.major<50||50===a.a.version.major&&a.a.version.build<2661)),this._fillSilentAfterSeek=a.a.msedge||a.a.msie,this._mp3UseMpegAudio=!a.a.firefox,this._fillAudioTimestampGap=this._config.fixAudioTimestampGap}return e.prototype.destroy=function(){this._dtsBase=-1,this._dtsBaseInited=!1,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList.clear(),this._audioSegmentInfoList=null,this._videoSegmentInfoList.clear(),this._videoSegmentInfoList=null,this._onInitSegment=null,this._onMediaSegment=null},e.prototype.bindDataSource=function(e){return e.onDataAvailable=this.remux.bind(this),e.onTrackMetadata=this._onTrackMetadataReceived.bind(this),this},Object.defineProperty(e.prototype,"onInitSegment",{get:function(){return this._onInitSegment},set:function(e){this._onInitSegment=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaSegment",{get:function(){return this._onMediaSegment},set:function(e){this._onMediaSegment=e},enumerable:!1,configurable:!0}),e.prototype.insertDiscontinuity=function(){this._audioNextDts=this._videoNextDts=void 0},e.prototype.seek=function(e){this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._videoSegmentInfoList.clear(),this._audioSegmentInfoList.clear()},e.prototype.remux=function(e,t){if(!this._onMediaSegment)throw new _.a("MP4Remuxer: onMediaSegment callback must be specificed!");this._dtsBaseInited||this._calculateDtsBase(e,t),t&&this._remuxVideo(t),e&&this._remuxAudio(e)},e.prototype._onTrackMetadataReceived=function(e,t){var i=null,n="mp4",r=t.codec;if("audio"===e)this._audioMeta=t,"mp3"===t.codec&&this._mp3UseMpegAudio?(n="mpeg",r="",i=new Uint8Array):i=j.generateInitSegment(t);else{if("video"!==e)return;this._videoMeta=t,i=j.generateInitSegment(t)}if(!this._onInitSegment)throw new _.a("MP4Remuxer: onInitSegment callback must be specified!");this._onInitSegment(e,{type:e,data:i.buffer,codec:r,container:e+"/"+n,mediaDuration:t.duration})},e.prototype._calculateDtsBase=function(e,t){this._dtsBaseInited||(e&&e.samples&&e.samples.length&&(this._audioDtsBase=e.samples[0].dts),t&&t.samples&&t.samples.length&&(this._videoDtsBase=t.samples[0].dts),this._dtsBase=Math.min(this._audioDtsBase,this._videoDtsBase),this._dtsBaseInited=!0)},e.prototype.getTimestampBase=function(){if(this._dtsBaseInited)return this._dtsBase},e.prototype.flushStashedSamples=function(){var e=this._videoStashedLastSample,t=this._audioStashedLastSample,i={type:"video",id:1,sequenceNumber:0,samples:[],length:0};null!=e&&(i.samples.push(e),i.length=e.length);var n={type:"audio",id:2,sequenceNumber:0,samples:[],length:0};null!=t&&(n.samples.push(t),n.length=t.length),this._videoStashedLastSample=null,this._audioStashedLastSample=null,this._remuxVideo(i,!0),this._remuxAudio(n,!0)},e.prototype._remuxAudio=function(e,t){if(null!=this._audioMeta){var i,n=e,r=n.samples,o=void 0,h=-1,d=this._audioMeta.refSampleDuration,u="mp3"===this._audioMeta.codec&&this._mp3UseMpegAudio,_=this._dtsBaseInited&&void 0===this._audioNextDts,l=!1;if(r&&0!==r.length&&(1!==r.length||t)){var c=0,f=null,p=0;u?(c=0,p=n.length):(c=8,p=8+n.length);var m=null;if(r.length>1&&(p-=(m=r.pop()).length),null!=this._audioStashedLastSample){var g=this._audioStashedLastSample;this._audioStashedLastSample=null,r.unshift(g),p+=g.length}null!=m&&(this._audioStashedLastSample=m);var v=r[0].dts-this._dtsBase;if(this._audioNextDts)o=v-this._audioNextDts;else if(this._audioSegmentInfoList.isEmpty())o=0,this._fillSilentAfterSeek&&!this._videoSegmentInfoList.isEmpty()&&"mp3"!==this._audioMeta.originalCodec&&(l=!0);else{var y=this._audioSegmentInfoList.getLastSampleBefore(v);if(null!=y){var b=v-(y.originalDts+y.duration);b<=3&&(b=0),o=v-(y.dts+y.duration+b)}else o=0}if(l){var E=v-o,S=this._videoSegmentInfoList.getLastSegmentBefore(v);if(null!=S&&S.beginDts<E){if(P=z.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount)){var A=S.beginDts,R=E-S.beginDts;s.a.v(this.TAG,"InsertPrefixSilentAudio: dts: "+A+", duration: "+R),r.unshift({unit:P,dts:A,pts:A}),p+=P.byteLength}}else l=!1}for(var L=[],T=0;T<r.length;T++){var w=(g=r[T]).unit,D=g.dts-this._dtsBase,k=(A=D,!1),C=null,I=0;if(!(D<-.001)){if("mp3"!==this._audioMeta.codec){var O=D;if(this._audioNextDts&&(O=this._audioNextDts),(o=D-O)<=-3*d){s.a.w(this.TAG,"Dropping 1 audio frame (originalDts: "+D+" ms ,curRefDts: "+O+" ms) due to dtsCorrection: "+o+" ms overlap.");continue}if(o>=3*d&&this._fillAudioTimestampGap&&!a.a.safari){k=!0;var P,M=Math.floor(o/d);s.a.w(this.TAG,"Large audio timestamp gap detected, may cause AV sync to drift. Silent frames will be generated to avoid unsync.\noriginalDts: "+D+" ms, curRefDts: "+O+" ms, dtsCorrection: "+Math.round(o)+" ms, generate: "+M+" frames"),A=Math.floor(O),I=Math.floor(O+d)-A,null==(P=z.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount))&&(s.a.w(this.TAG,"Unable to generate silent frame for "+this._audioMeta.originalCodec+" with "+this._audioMeta.channelCount+" channels, repeat last frame"),P=w),C=[];for(var x=0;x<M;x++){O+=d;var B=Math.floor(O),U=Math.floor(O+d)-B,N={dts:B,pts:B,cts:0,unit:P,size:P.byteLength,duration:U,originalDts:D,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}};C.push(N),p+=N.size}this._audioNextDts=O+d}else A=Math.floor(O),I=Math.floor(O+d)-A,this._audioNextDts=O+d}else{if(A=D-o,T!==r.length-1)I=r[T+1].dts-this._dtsBase-o-A;else if(null!=m)I=m.dts-this._dtsBase-o-A;else I=L.length>=1?L[L.length-1].duration:Math.floor(d);this._audioNextDts=A+I}-1===h&&(h=A),L.push({dts:A,pts:A,cts:0,unit:g.unit,size:g.unit.byteLength,duration:I,originalDts:D,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}}),k&&L.push.apply(L,C)}}if(0===L.length)return n.samples=[],void(n.length=0);u?f=new Uint8Array(p):((f=new Uint8Array(p))[0]=p>>>24&255,f[1]=p>>>16&255,f[2]=p>>>8&255,f[3]=255&p,f.set(j.types.mdat,4));for(T=0;T<L.length;T++){w=L[T].unit;f.set(w,c),c+=w.byteLength}var F=L[L.length-1];i=F.dts+F.duration;var G=new H.b;G.beginDts=h,G.endDts=i,G.beginPts=h,G.endPts=i,G.originalBeginDts=L[0].originalDts,G.originalEndDts=F.originalDts+F.duration,G.firstSample=new H.d(L[0].dts,L[0].pts,L[0].duration,L[0].originalDts,!1),G.lastSample=new H.d(F.dts,F.pts,F.duration,F.originalDts,!1),this._isLive||this._audioSegmentInfoList.append(G),n.samples=L,n.sequenceNumber++;var V=null;V=u?new Uint8Array:j.moof(n,h),n.samples=[],n.length=0;var q={type:"audio",data:this._mergeBoxes(V,f).buffer,sampleCount:L.length,info:G};u&&_&&(q.timestampOffset=h),this._onMediaSegment("audio",q)}}},e.prototype._remuxVideo=function(e,t){if(null!=this._videoMeta){var i,n,r=e,s=r.samples,a=void 0,o=-1,h=-1;if(s&&0!==s.length&&(1!==s.length||t)){var d=8,u=null,_=8+e.length,l=null;if(s.length>1&&(_-=(l=s.pop()).length),null!=this._videoStashedLastSample){var c=this._videoStashedLastSample;this._videoStashedLastSample=null,s.unshift(c),_+=c.length}null!=l&&(this._videoStashedLastSample=l);var f=s[0].dts-this._dtsBase;if(this._videoNextDts)a=f-this._videoNextDts;else if(this._videoSegmentInfoList.isEmpty())a=0;else{var p=this._videoSegmentInfoList.getLastSampleBefore(f);if(null!=p){var m=f-(p.originalDts+p.duration);m<=3&&(m=0),a=f-(p.dts+p.duration+m)}else a=0}for(var g=new H.b,v=[],y=0;y<s.length;y++){var b=(c=s[y]).dts-this._dtsBase,E=c.isKeyframe,S=b-a,A=c.cts,R=S+A;-1===o&&(o=S,h=R);var L=0;if(y!==s.length-1)L=s[y+1].dts-this._dtsBase-a-S;else if(null!=l)L=l.dts-this._dtsBase-a-S;else L=v.length>=1?v[v.length-1].duration:Math.floor(this._videoMeta.refSampleDuration);if(E){var T=new H.d(S,R,L,c.dts,!0);T.fileposition=c.fileposition,g.appendSyncPoint(T)}v.push({dts:S,pts:R,cts:A,units:c.units,size:c.length,isKeyframe:E,duration:L,originalDts:b,flags:{isLeading:0,dependsOn:E?2:1,isDependedOn:E?1:0,hasRedundancy:0,isNonSync:E?0:1}})}(u=new Uint8Array(_))[0]=_>>>24&255,u[1]=_>>>16&255,u[2]=_>>>8&255,u[3]=255&_,u.set(j.types.mdat,4);for(y=0;y<v.length;y++)for(var w=v[y].units;w.length;){var D=w.shift().data;u.set(D,d),d+=D.byteLength}var k=v[v.length-1];if(i=k.dts+k.duration,n=k.pts+k.duration,this._videoNextDts=i,g.beginDts=o,g.endDts=i,g.beginPts=h,g.endPts=n,g.originalBeginDts=v[0].originalDts,g.originalEndDts=k.originalDts+k.duration,g.firstSample=new H.d(v[0].dts,v[0].pts,v[0].duration,v[0].originalDts,v[0].isKeyframe),g.lastSample=new H.d(k.dts,k.pts,k.duration,k.originalDts,k.isKeyframe),this._isLive||this._videoSegmentInfoList.append(g),r.samples=v,r.sequenceNumber++,this._forceFirstIDR){var C=v[0].flags;C.dependsOn=2,C.isNonSync=0}var I=j.moof(r,o);r.samples=[],r.length=0,this._onMediaSegment("video",{type:"video",data:this._mergeBoxes(I,u).buffer,sampleCount:v.length,info:g})}}},e.prototype._mergeBoxes=function(e,t){var i=new Uint8Array(e.byteLength+t.byteLength);return i.set(e,0),i.set(t,e.byteLength),i},e}(),K=i(11),W=i(1),X=function(){function e(e,t){this.TAG="TransmuxingController",this._emitter=new r.a,this._config=t,e.segments||(e.segments=[{duration:e.duration,filesize:e.filesize,url:e.url}]),"boolean"!=typeof e.cors&&(e.cors=!0),"boolean"!=typeof e.withCredentials&&(e.withCredentials=!1),this._mediaDataSource=e,this._currentSegmentIndex=0;var i=0;this._mediaDataSource.segments.forEach((function(n){n.timestampBase=i,i+=n.duration,n.cors=e.cors,n.withCredentials=e.withCredentials,t.referrerPolicy&&(n.referrerPolicy=t.referrerPolicy)})),isNaN(i)||this._mediaDataSource.duration===i||(this._mediaDataSource.duration=i),this._mediaInfo=null,this._demuxer=null,this._remuxer=null,this._ioctl=null,this._pendingSeekTime=null,this._pendingResolveSeekPoint=null,this._statisticsReporter=null}return e.prototype.destroy=function(){this._mediaInfo=null,this._mediaDataSource=null,this._statisticsReporter&&this._disableStatisticsReporter(),this._ioctl&&(this._ioctl.destroy(),this._ioctl=null),this._demuxer&&(this._demuxer.destroy(),this._demuxer=null),this._remuxer&&(this._remuxer.destroy(),this._remuxer=null),this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.start=function(){this._loadSegment(0),this._enableStatisticsReporter()},e.prototype._loadSegment=function(e,t){this._currentSegmentIndex=e;var i=this._mediaDataSource.segments[e],n=this._ioctl=new K.a(i,this._config,e);n.onError=this._onIOException.bind(this),n.onSeeked=this._onIOSeeked.bind(this),n.onComplete=this._onIOComplete.bind(this),n.onRedirect=this._onIORedirect.bind(this),n.onRecoveredEarlyEof=this._onIORecoveredEarlyEof.bind(this),t?this._demuxer.bindDataSource(this._ioctl):n.onDataArrival=this._onInitChunkArrival.bind(this),n.open(t)},e.prototype.stop=function(){this._internalAbort(),this._disableStatisticsReporter()},e.prototype._internalAbort=function(){this._ioctl&&(this._ioctl.destroy(),this._ioctl=null)},e.prototype.pause=function(){this._ioctl&&this._ioctl.isWorking()&&(this._ioctl.pause(),this._disableStatisticsReporter())},e.prototype.resume=function(){this._ioctl&&this._ioctl.isPaused()&&(this._ioctl.resume(),this._enableStatisticsReporter())},e.prototype.seek=function(e){if(null!=this._mediaInfo&&this._mediaInfo.isSeekable()){var t=this._searchSegmentIndexContains(e);if(t===this._currentSegmentIndex){var i=this._mediaInfo.segments[t];if(null==i)this._pendingSeekTime=e;else{var n=i.getNearestKeyframe(e);this._remuxer.seek(n.milliseconds),this._ioctl.seek(n.fileposition),this._pendingResolveSeekPoint=n.milliseconds}}else{var r=this._mediaInfo.segments[t];if(null==r)this._pendingSeekTime=e,this._internalAbort(),this._remuxer.seek(),this._remuxer.insertDiscontinuity(),this._loadSegment(t);else{n=r.getNearestKeyframe(e);this._internalAbort(),this._remuxer.seek(e),this._remuxer.insertDiscontinuity(),this._demuxer.resetMediaInfo(),this._demuxer.timestampBase=this._mediaDataSource.segments[t].timestampBase,this._loadSegment(t,n.fileposition),this._pendingResolveSeekPoint=n.milliseconds,this._reportSegmentMediaInfo(t)}}this._enableStatisticsReporter()}},e.prototype._searchSegmentIndexContains=function(e){for(var t=this._mediaDataSource.segments,i=t.length-1,n=0;n<t.length;n++)if(e<t[n].timestampBase){i=n-1;break}return i},e.prototype._onInitChunkArrival=function(e,t){var i=this,n=null,r=0;if(t>0)this._demuxer.bindDataSource(this._ioctl),this._demuxer.timestampBase=this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase,r=this._demuxer.parseChunks(e,t);else if((n=G.probe(e)).match){var a=this._demuxer=new G(n,this._config);this._remuxer||(this._remuxer=new q(this._config)),a.onError=this._onDemuxException.bind(this),a.onMediaInfo=this._onMediaInfo.bind(this),a.onMetaDataArrived=this._onMetaDataArrived.bind(this),a.onTimedID3Metadata=this._onTimedID3Metadata.bind(this),a.onPESPrivateDataDescriptor=this._onPESPrivateDataDescriptor.bind(this),a.onPESPrivateData=this._onPESPrivateData.bind(this),this._remuxer.bindDataSource(this._demuxer),this._demuxer.bindDataSource(this._ioctl),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this),r=this._demuxer.parseChunks(e,t)}else if((n=v.probe(e)).match){this._demuxer=new v(n,this._config),this._remuxer||(this._remuxer=new q(this._config));var o=this._mediaDataSource;null==o.duration||isNaN(o.duration)||(this._demuxer.overridedDuration=o.duration),"boolean"==typeof o.hasAudio&&(this._demuxer.overridedHasAudio=o.hasAudio),"boolean"==typeof o.hasVideo&&(this._demuxer.overridedHasVideo=o.hasVideo),this._demuxer.timestampBase=o.segments[this._currentSegmentIndex].timestampBase,this._demuxer.onError=this._onDemuxException.bind(this),this._demuxer.onMediaInfo=this._onMediaInfo.bind(this),this._demuxer.onMetaDataArrived=this._onMetaDataArrived.bind(this),this._demuxer.onScriptDataArrived=this._onScriptDataArrived.bind(this),this._remuxer.bindDataSource(this._demuxer.bindDataSource(this._ioctl)),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this),r=this._demuxer.parseChunks(e,t)}else n=null,s.a.e(this.TAG,"Non MPEG-TS/FLV, Unsupported media type!"),Promise.resolve().then((function(){i._internalAbort()})),this._emitter.emit(W.a.DEMUX_ERROR,m.a.FORMAT_UNSUPPORTED,"Non MPEG-TS/FLV, Unsupported media type!"),r=0;return r},e.prototype._onMediaInfo=function(e){var t=this;null==this._mediaInfo&&(this._mediaInfo=Object.assign({},e),this._mediaInfo.keyframesIndex=null,this._mediaInfo.segments=[],this._mediaInfo.segmentCount=this._mediaDataSource.segments.length,Object.setPrototypeOf(this._mediaInfo,o.a.prototype));var i=Object.assign({},e);Object.setPrototypeOf(i,o.a.prototype),this._mediaInfo.segments[this._currentSegmentIndex]=i,this._reportSegmentMediaInfo(this._currentSegmentIndex),null!=this._pendingSeekTime&&Promise.resolve().then((function(){var e=t._pendingSeekTime;t._pendingSeekTime=null,t.seek(e)}))},e.prototype._onMetaDataArrived=function(e){this._emitter.emit(W.a.METADATA_ARRIVED,e)},e.prototype._onScriptDataArrived=function(e){this._emitter.emit(W.a.SCRIPTDATA_ARRIVED,e)},e.prototype._onTimedID3Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(W.a.TIMED_ID3_METADATA_ARRIVED,e))},e.prototype._onPESPrivateDataDescriptor=function(e){this._emitter.emit(W.a.PES_PRIVATE_DATA_DESCRIPTOR,e)},e.prototype._onPESPrivateData=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(W.a.PES_PRIVATE_DATA_ARRIVED,e))},e.prototype._onIOSeeked=function(){this._remuxer.insertDiscontinuity()},e.prototype._onIOComplete=function(e){var t=e+1;t<this._mediaDataSource.segments.length?(this._internalAbort(),this._remuxer&&this._remuxer.flushStashedSamples(),this._loadSegment(t)):(this._remuxer&&this._remuxer.flushStashedSamples(),this._emitter.emit(W.a.LOADING_COMPLETE),this._disableStatisticsReporter())},e.prototype._onIORedirect=function(e){var t=this._ioctl.extraData;this._mediaDataSource.segments[t].redirectedURL=e},e.prototype._onIORecoveredEarlyEof=function(){this._emitter.emit(W.a.RECOVERED_EARLY_EOF)},e.prototype._onIOException=function(e,t){s.a.e(this.TAG,"IOException: type = "+e+", code = "+t.code+", msg = "+t.msg),this._emitter.emit(W.a.IO_ERROR,e,t),this._disableStatisticsReporter()},e.prototype._onDemuxException=function(e,t){s.a.e(this.TAG,"DemuxException: type = "+e+", info = "+t),this._emitter.emit(W.a.DEMUX_ERROR,e,t)},e.prototype._onRemuxerInitSegmentArrival=function(e,t){this._emitter.emit(W.a.INIT_SEGMENT,e,t)},e.prototype._onRemuxerMediaSegmentArrival=function(e,t){if(null==this._pendingSeekTime&&(this._emitter.emit(W.a.MEDIA_SEGMENT,e,t),null!=this._pendingResolveSeekPoint&&"video"===e)){var i=t.info.syncPoints,n=this._pendingResolveSeekPoint;this._pendingResolveSeekPoint=null,a.a.safari&&i.length>0&&i[0].originalDts===n&&(n=i[0].pts),this._emitter.emit(W.a.RECOMMEND_SEEKPOINT,n)}},e.prototype._enableStatisticsReporter=function(){null==this._statisticsReporter&&(this._statisticsReporter=self.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval))},e.prototype._disableStatisticsReporter=function(){this._statisticsReporter&&(self.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype._reportSegmentMediaInfo=function(e){var t=this._mediaInfo.segments[e],i=Object.assign({},t);i.duration=this._mediaInfo.duration,i.segmentCount=this._mediaInfo.segmentCount,delete i.segments,delete i.keyframesIndex,this._emitter.emit(W.a.MEDIA_INFO,i)},e.prototype._reportStatisticsInfo=function(){var e={};e.url=this._ioctl.currentURL,e.hasRedirect=this._ioctl.hasRedirect,e.hasRedirect&&(e.redirectedURL=this._ioctl.currentRedirectedURL),e.speed=this._ioctl.currentSpeed,e.loaderType=this._ioctl.loaderType,e.currentSegmentIndex=this._currentSegmentIndex,e.totalSegmentCount=this._mediaDataSource.segments.length,this._emitter.emit(W.a.STATISTICS_INFO,e)},e}();t.a=X},function(e,t,i){"use strict";var n,r=i(0),s=function(){function e(){this._firstCheckpoint=0,this._lastCheckpoint=0,this._intervalBytes=0,this._totalBytes=0,this._lastSecondBytes=0,self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now}return e.prototype.reset=function(){this._firstCheckpoint=this._lastCheckpoint=0,this._totalBytes=this._intervalBytes=0,this._lastSecondBytes=0},e.prototype.addBytes=function(e){0===this._firstCheckpoint?(this._firstCheckpoint=this._now(),this._lastCheckpoint=this._firstCheckpoint,this._intervalBytes+=e,this._totalBytes+=e):this._now()-this._lastCheckpoint<1e3?(this._intervalBytes+=e,this._totalBytes+=e):(this._lastSecondBytes=this._intervalBytes,this._intervalBytes=e,this._totalBytes+=e,this._lastCheckpoint=this._now())},Object.defineProperty(e.prototype,"currentKBps",{get:function(){this.addBytes(0);var e=(this._now()-this._lastCheckpoint)/1e3;return 0==e&&(e=1),this._intervalBytes/e/1024},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastSecondKBps",{get:function(){return this.addBytes(0),0!==this._lastSecondBytes?this._lastSecondBytes/1024:this._now()-this._lastCheckpoint>=500?this.currentKBps:0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"averageKBps",{get:function(){var e=(this._now()-this._firstCheckpoint)/1e3;return this._totalBytes/e/1024},enumerable:!1,configurable:!0}),e}(),a=i(2),o=i(4),h=i(3),d=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),u=function(e){function t(t,i){var n=e.call(this,"fetch-stream-loader")||this;return n.TAG="FetchStreamLoader",n._seekHandler=t,n._config=i,n._needStash=!0,n._requestAbort=!1,n._abortController=null,n._contentLength=null,n._receivedLength=0,n}return d(t,e),t.isSupported=function(){try{var e=o.a.msedge&&o.a.version.minor>=15048,t=!o.a.msedge||e;return self.fetch&&self.ReadableStream&&t}catch(e){return!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){var i=this;this._dataSource=e,this._range=t;var n=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(n=e.redirectedURL);var r=this._seekHandler.getConfig(n,t),s=new self.Headers;if("object"==typeof r.headers){var o=r.headers;for(var d in o)o.hasOwnProperty(d)&&s.append(d,o[d])}var u={method:"GET",headers:s,mode:"cors",cache:"default",referrerPolicy:"no-referrer-when-downgrade"};if("object"==typeof this._config.headers)for(var d in this._config.headers)s.append(d,this._config.headers[d]);!1===e.cors&&(u.mode="same-origin"),e.withCredentials&&(u.credentials="include"),e.referrerPolicy&&(u.referrerPolicy=e.referrerPolicy),self.AbortController&&(this._abortController=new self.AbortController,u.signal=this._abortController.signal),this._status=a.c.kConnecting,self.fetch(r.url,u).then((function(e){if(i._requestAbort)return i._status=a.c.kIdle,void e.body.cancel();if(e.ok&&e.status>=200&&e.status<=299){if(e.url!==r.url&&i._onURLRedirect){var t=i._seekHandler.removeURLParameters(e.url);i._onURLRedirect(t)}var n=e.headers.get("Content-Length");return null!=n&&(i._contentLength=parseInt(n),0!==i._contentLength&&i._onContentLengthKnown&&i._onContentLengthKnown(i._contentLength)),i._pump.call(i,e.body.getReader())}if(i._status=a.c.kError,!i._onError)throw new h.d("FetchStreamLoader: Http code invalid, "+e.status+" "+e.statusText);i._onError(a.b.HTTP_STATUS_CODE_INVALID,{code:e.status,msg:e.statusText})})).catch((function(e){if(!i._abortController||!i._abortController.signal.aborted){if(i._status=a.c.kError,!i._onError)throw e;i._onError(a.b.EXCEPTION,{code:-1,msg:e.message})}}))},t.prototype.abort=function(){if(this._requestAbort=!0,(this._status!==a.c.kBuffering||!o.a.chrome)&&this._abortController)try{this._abortController.abort()}catch(e){}},t.prototype._pump=function(e){var t=this;return e.read().then((function(i){if(i.done)if(null!==t._contentLength&&t._receivedLength<t._contentLength){t._status=a.c.kError;var n=a.b.EARLY_EOF,r={code:-1,msg:"Fetch stream meet Early-EOF"};if(!t._onError)throw new h.d(r.msg);t._onError(n,r)}else t._status=a.c.kComplete,t._onComplete&&t._onComplete(t._range.from,t._range.from+t._receivedLength-1);else{if(t._abortController&&t._abortController.signal.aborted)return void(t._status=a.c.kComplete);if(!0===t._requestAbort)return t._status=a.c.kComplete,e.cancel();t._status=a.c.kBuffering;var s=i.value.buffer,o=t._range.from+t._receivedLength;t._receivedLength+=s.byteLength,t._onDataArrival&&t._onDataArrival(s,o,t._receivedLength),t._pump(e)}})).catch((function(e){if(t._abortController&&t._abortController.signal.aborted)t._status=a.c.kComplete;else if(11!==e.code||!o.a.msedge){t._status=a.c.kError;var i=0,n=null;if(19!==e.code&&"network error"!==e.message||!(null===t._contentLength||null!==t._contentLength&&t._receivedLength<t._contentLength)?(i=a.b.EXCEPTION,n={code:e.code,msg:e.message}):(i=a.b.EARLY_EOF,n={code:e.code,msg:"Fetch stream meet Early-EOF"}),!t._onError)throw new h.d(n.msg);t._onError(i,n)}}))},t}(a.a),_=function(){var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(t,i)};return function(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),l=function(e){function t(t,i){var n=e.call(this,"xhr-moz-chunked-loader")||this;return n.TAG="MozChunkedLoader",n._seekHandler=t,n._config=i,n._needStash=!0,n._xhr=null,n._requestAbort=!1,n._contentLength=null,n._receivedLength=0,n}return _(t,e),t.isSupported=function(){try{var e=new XMLHttpRequest;return e.open("GET","https://example.com",!0),e.responseType="moz-chunked-arraybuffer","moz-chunked-arraybuffer"===e.responseType}catch(e){return r.a.w("MozChunkedLoader",e.message),!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onloadend=null,this._xhr.onerror=null,this._xhr=null),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){this._dataSource=e,this._range=t;var i=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(i=e.redirectedURL);var n=this._seekHandler.getConfig(i,t);this._requestURL=n.url;var r=this._xhr=new XMLHttpRequest;if(r.open("GET",n.url,!0),r.responseType="moz-chunked-arraybuffer",r.onreadystatechange=this._onReadyStateChange.bind(this),r.onprogress=this._onProgress.bind(this),r.onloadend=this._onLoadEnd.bind(this),r.onerror=this._onXhrError.bind(this),e.withCredentials&&(r.withCredentials=!0),"object"==typeof n.headers){var s=n.headers;for(var o in s)s.hasOwnProperty(o)&&r.setRequestHeader(o,s[o])}if("object"==typeof this._config.headers){s=this._config.headers;for(var o in s)s.hasOwnProperty(o)&&r.setRequestHeader(o,s[o])}this._status=a.c.kConnecting,r.send()},t.prototype.abort=function(){this._requestAbort=!0,this._xhr&&this._xhr.abort(),this._status=a.c.kComplete},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL&&t.responseURL!==this._requestURL&&this._onURLRedirect){var i=this._seekHandler.removeURLParameters(t.responseURL);this._onURLRedirect(i)}if(0!==t.status&&(t.status<200||t.status>299)){if(this._status=a.c.kError,!this._onError)throw new h.d("MozChunkedLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(a.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}else this._status=a.c.kBuffering}},t.prototype._onProgress=function(e){if(this._status!==a.c.kError){null===this._contentLength&&null!==e.total&&0!==e.total&&(this._contentLength=e.total,this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength));var t=e.target.response,i=this._range.from+this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,i,this._receivedLength)}},t.prototype._onLoadEnd=function(e){!0!==this._requestAbort?this._status!==a.c.kError&&(this._status=a.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1)):this._requestAbort=!1},t.prototype._onXhrError=function(e){this._status=a.c.kError;var t=0,i=null;if(this._contentLength&&e.loaded<this._contentLength?(t=a.b.EARLY_EOF,i={code:-1,msg:"Moz-Chunked stream meet Early-Eof"}):(t=a.b.EXCEPTION,i={code:-1,msg:e.constructor.name+" "+e.type}),!this._onError)throw new h.d(i.msg);this._onError(t,i)},t}(a.a),c=function(){var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(t,i)};return function(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),f=function(e){function t(t,i){var n=e.call(this,"xhr-range-loader")||this;return n.TAG="RangeLoader",n._seekHandler=t,n._config=i,n._needStash=!1,n._chunkSizeKBList=[128,256,384,512,768,1024,1536,2048,3072,4096,5120,6144,7168,8192],n._currentChunkSizeKB=384,n._currentSpeedNormalized=0,n._zeroSpeedChunkCount=0,n._xhr=null,n._speedSampler=new s,n._requestAbort=!1,n._waitForTotalLength=!1,n._totalLengthReceived=!1,n._currentRequestURL=null,n._currentRedirectedURL=null,n._currentRequestRange=null,n._totalLength=null,n._contentLength=null,n._receivedLength=0,n._lastTimeLoaded=0,n}return c(t,e),t.isSupported=function(){try{var e=new XMLHttpRequest;return e.open("GET","https://example.com",!0),e.responseType="arraybuffer","arraybuffer"===e.responseType}catch(e){return r.a.w("RangeLoader",e.message),!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr=null),e.prototype.destroy.call(this)},Object.defineProperty(t.prototype,"currentSpeed",{get:function(){return this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),t.prototype.open=function(e,t){this._dataSource=e,this._range=t,this._status=a.c.kConnecting;var i=!1;null!=this._dataSource.filesize&&0!==this._dataSource.filesize&&(i=!0,this._totalLength=this._dataSource.filesize),this._totalLengthReceived||i?this._openSubRange():(this._waitForTotalLength=!0,this._internalOpen(this._dataSource,{from:0,to:-1}))},t.prototype._openSubRange=function(){var e=1024*this._currentChunkSizeKB,t=this._range.from+this._receivedLength,i=t+e;null!=this._contentLength&&i-this._range.from>=this._contentLength&&(i=this._range.from+this._contentLength-1),this._currentRequestRange={from:t,to:i},this._internalOpen(this._dataSource,this._currentRequestRange)},t.prototype._internalOpen=function(e,t){this._lastTimeLoaded=0;var i=e.url;this._config.reuseRedirectedURL&&(null!=this._currentRedirectedURL?i=this._currentRedirectedURL:null!=e.redirectedURL&&(i=e.redirectedURL));var n=this._seekHandler.getConfig(i,t);this._currentRequestURL=n.url;var r=this._xhr=new XMLHttpRequest;if(r.open("GET",n.url,!0),r.responseType="arraybuffer",r.onreadystatechange=this._onReadyStateChange.bind(this),r.onprogress=this._onProgress.bind(this),r.onload=this._onLoad.bind(this),r.onerror=this._onXhrError.bind(this),e.withCredentials&&(r.withCredentials=!0),"object"==typeof n.headers){var s=n.headers;for(var a in s)s.hasOwnProperty(a)&&r.setRequestHeader(a,s[a])}if("object"==typeof this._config.headers){s=this._config.headers;for(var a in s)s.hasOwnProperty(a)&&r.setRequestHeader(a,s[a])}r.send()},t.prototype.abort=function(){this._requestAbort=!0,this._internalAbort(),this._status=a.c.kComplete},t.prototype._internalAbort=function(){this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr.abort(),this._xhr=null)},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL){var i=this._seekHandler.removeURLParameters(t.responseURL);t.responseURL!==this._currentRequestURL&&i!==this._currentRedirectedURL&&(this._currentRedirectedURL=i,this._onURLRedirect&&this._onURLRedirect(i))}if(t.status>=200&&t.status<=299){if(this._waitForTotalLength)return;this._status=a.c.kBuffering}else{if(this._status=a.c.kError,!this._onError)throw new h.d("RangeLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(a.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}}},t.prototype._onProgress=function(e){if(this._status!==a.c.kError){if(null===this._contentLength){var t=!1;if(this._waitForTotalLength){this._waitForTotalLength=!1,this._totalLengthReceived=!0,t=!0;var i=e.total;this._internalAbort(),null!=i&0!==i&&(this._totalLength=i)}if(-1===this._range.to?this._contentLength=this._totalLength-this._range.from:this._contentLength=this._range.to-this._range.from+1,t)return void this._openSubRange();this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength)}var n=e.loaded-this._lastTimeLoaded;this._lastTimeLoaded=e.loaded,this._speedSampler.addBytes(n)}},t.prototype._normalizeSpeed=function(e){var t=this._chunkSizeKBList,i=t.length-1,n=0,r=0,s=i;if(e<t[0])return t[0];for(;r<=s;){if((n=r+Math.floor((s-r)/2))===i||e>=t[n]&&e<t[n+1])return t[n];t[n]<e?r=n+1:s=n-1}},t.prototype._onLoad=function(e){if(this._status!==a.c.kError)if(this._waitForTotalLength)this._waitForTotalLength=!1;else{this._lastTimeLoaded=0;var t=this._speedSampler.lastSecondKBps;if(0===t&&(this._zeroSpeedChunkCount++,this._zeroSpeedChunkCount>=3&&(t=this._speedSampler.currentKBps)),0!==t){var i=this._normalizeSpeed(t);this._currentSpeedNormalized!==i&&(this._currentSpeedNormalized=i,this._currentChunkSizeKB=i)}var n=e.target.response,r=this._range.from+this._receivedLength;this._receivedLength+=n.byteLength;var s=!1;null!=this._contentLength&&this._receivedLength<this._contentLength?this._openSubRange():s=!0,this._onDataArrival&&this._onDataArrival(n,r,this._receivedLength),s&&(this._status=a.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1))}},t.prototype._onXhrError=function(e){this._status=a.c.kError;var t=0,i=null;if(this._contentLength&&this._receivedLength>0&&this._receivedLength<this._contentLength?(t=a.b.EARLY_EOF,i={code:-1,msg:"RangeLoader meet Early-Eof"}):(t=a.b.EXCEPTION,i={code:-1,msg:e.constructor.name+" "+e.type}),!this._onError)throw new h.d(i.msg);this._onError(t,i)},t}(a.a),p=function(){var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(t,i)};return function(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),m=function(e){function t(){var t=e.call(this,"websocket-loader")||this;return t.TAG="WebSocketLoader",t._needStash=!0,t._ws=null,t._requestAbort=!1,t._receivedLength=0,t}return p(t,e),t.isSupported=function(){try{return void 0!==self.WebSocket}catch(e){return!1}},t.prototype.destroy=function(){this._ws&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e){try{var t=this._ws=new self.WebSocket(e.url);t.binaryType="arraybuffer",t.onopen=this._onWebSocketOpen.bind(this),t.onclose=this._onWebSocketClose.bind(this),t.onmessage=this._onWebSocketMessage.bind(this),t.onerror=this._onWebSocketError.bind(this),this._status=a.c.kConnecting}catch(e){this._status=a.c.kError;var i={code:e.code,msg:e.message};if(!this._onError)throw new h.d(i.msg);this._onError(a.b.EXCEPTION,i)}},t.prototype.abort=function(){var e=this._ws;!e||0!==e.readyState&&1!==e.readyState||(this._requestAbort=!0,e.close()),this._ws=null,this._status=a.c.kComplete},t.prototype._onWebSocketOpen=function(e){this._status=a.c.kBuffering},t.prototype._onWebSocketClose=function(e){!0!==this._requestAbort?(this._status=a.c.kComplete,this._onComplete&&this._onComplete(0,this._receivedLength-1)):this._requestAbort=!1},t.prototype._onWebSocketMessage=function(e){var t=this;if(e.data instanceof ArrayBuffer)this._dispatchArrayBuffer(e.data);else if(e.data instanceof Blob){var i=new FileReader;i.onload=function(){t._dispatchArrayBuffer(i.result)},i.readAsArrayBuffer(e.data)}else{this._status=a.c.kError;var n={code:-1,msg:"Unsupported WebSocket message type: "+e.data.constructor.name};if(!this._onError)throw new h.d(n.msg);this._onError(a.b.EXCEPTION,n)}},t.prototype._dispatchArrayBuffer=function(e){var t=e,i=this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,i,this._receivedLength)},t.prototype._onWebSocketError=function(e){this._status=a.c.kError;var t={code:e.code,msg:e.message};if(!this._onError)throw new h.d(t.msg);this._onError(a.b.EXCEPTION,t)},t}(a.a),g=function(){function e(e){this._zeroStart=e||!1}return e.prototype.getConfig=function(e,t){var i={};if(0!==t.from||-1!==t.to){var n=void 0;n=-1!==t.to?"bytes="+t.from.toString()+"-"+t.to.toString():"bytes="+t.from.toString()+"-",i.Range=n}else this._zeroStart&&(i.Range="bytes=0-");return{url:e,headers:i}},e.prototype.removeURLParameters=function(e){return e},e}(),v=function(){function e(e,t){this._startName=e,this._endName=t}return e.prototype.getConfig=function(e,t){var i=e;if(0!==t.from||-1!==t.to){var n=!0;-1===i.indexOf("?")&&(i+="?",n=!1),n&&(i+="&"),i+=this._startName+"="+t.from.toString(),-1!==t.to&&(i+="&"+this._endName+"="+t.to.toString())}return{url:i,headers:{}}},e.prototype.removeURLParameters=function(e){var t=e.split("?")[0],i=void 0,n=e.indexOf("?");-1!==n&&(i=e.substring(n+1));var r="";if(null!=i&&i.length>0)for(var s=i.split("&"),a=0;a<s.length;a++){var o=s[a].split("="),h=a>0;o[0]!==this._startName&&o[0]!==this._endName&&(h&&(r+="&"),r+=s[a])}return 0===r.length?t:t+"?"+r},e}(),y=function(){function e(e,t,i){this.TAG="IOController",this._config=t,this._extraData=i,this._stashInitialSize=65536,null!=t.stashInitialSize&&t.stashInitialSize>0&&(this._stashInitialSize=t.stashInitialSize),this._stashUsed=0,this._stashSize=this._stashInitialSize,this._bufferSize=3145728,this._stashBuffer=new ArrayBuffer(this._bufferSize),this._stashByteStart=0,this._enableStash=!0,!1===t.enableStashBuffer&&(this._enableStash=!1),this._loader=null,this._loaderClass=null,this._seekHandler=null,this._dataSource=e,this._isWebSocketURL=/wss?:\/\/(.+?)/.test(e.url),this._refTotalLength=e.filesize?e.filesize:null,this._totalLength=this._refTotalLength,this._fullRequestFlag=!1,this._currentRange=null,this._redirectedURL=null,this._speedNormalized=0,this._speedSampler=new s,this._speedNormalizeList=[32,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096],this._isEarlyEofReconnecting=!1,this._paused=!1,this._resumeFrom=0,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._selectSeekHandler(),this._selectLoader(),this._createLoader()}return e.prototype.destroy=function(){this._loader.isWorking()&&this._loader.abort(),this._loader.destroy(),this._loader=null,this._loaderClass=null,this._dataSource=null,this._stashBuffer=null,this._stashUsed=this._stashSize=this._bufferSize=this._stashByteStart=0,this._currentRange=null,this._speedSampler=null,this._isEarlyEofReconnecting=!1,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._extraData=null},e.prototype.isWorking=function(){return this._loader&&this._loader.isWorking()&&!this._paused},e.prototype.isPaused=function(){return this._paused},Object.defineProperty(e.prototype,"status",{get:function(){return this._loader.status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extraData",{get:function(){return this._extraData},set:function(e){this._extraData=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onSeeked",{get:function(){return this._onSeeked},set:function(e){this._onSeeked=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRedirect",{get:function(){return this._onRedirect},set:function(e){this._onRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRecoveredEarlyEof",{get:function(){return this._onRecoveredEarlyEof},set:function(e){this._onRecoveredEarlyEof=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentURL",{get:function(){return this._dataSource.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasRedirect",{get:function(){return null!=this._redirectedURL||null!=this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentRedirectedURL",{get:function(){return this._redirectedURL||this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentSpeed",{get:function(){return this._loaderClass===f?this._loader.currentSpeed:this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"loaderType",{get:function(){return this._loader.type},enumerable:!1,configurable:!0}),e.prototype._selectSeekHandler=function(){var e=this._config;if("range"===e.seekType)this._seekHandler=new g(this._config.rangeLoadZeroStart);else if("param"===e.seekType){var t=e.seekParamStart||"bstart",i=e.seekParamEnd||"bend";this._seekHandler=new v(t,i)}else{if("custom"!==e.seekType)throw new h.b("Invalid seekType in config: "+e.seekType);if("function"!=typeof e.customSeekHandler)throw new h.b("Custom seekType specified in config but invalid customSeekHandler!");this._seekHandler=new e.customSeekHandler}},e.prototype._selectLoader=function(){if(null!=this._config.customLoader)this._loaderClass=this._config.customLoader;else if(this._isWebSocketURL)this._loaderClass=m;else if(u.isSupported())this._loaderClass=u;else if(l.isSupported())this._loaderClass=l;else{if(!f.isSupported())throw new h.d("Your browser doesn't support xhr with arraybuffer responseType!");this._loaderClass=f}},e.prototype._createLoader=function(){this._loader=new this._loaderClass(this._seekHandler,this._config),!1===this._loader.needStashBuffer&&(this._enableStash=!1),this._loader.onContentLengthKnown=this._onContentLengthKnown.bind(this),this._loader.onURLRedirect=this._onURLRedirect.bind(this),this._loader.onDataArrival=this._onLoaderChunkArrival.bind(this),this._loader.onComplete=this._onLoaderComplete.bind(this),this._loader.onError=this._onLoaderError.bind(this)},e.prototype.open=function(e){this._currentRange={from:0,to:-1},e&&(this._currentRange.from=e),this._speedSampler.reset(),e||(this._fullRequestFlag=!0),this._loader.open(this._dataSource,Object.assign({},this._currentRange))},e.prototype.abort=function(){this._loader.abort(),this._paused&&(this._paused=!1,this._resumeFrom=0)},e.prototype.pause=function(){this.isWorking()&&(this._loader.abort(),0!==this._stashUsed?(this._resumeFrom=this._stashByteStart,this._currentRange.to=this._stashByteStart-1):this._resumeFrom=this._currentRange.to+1,this._stashUsed=0,this._stashByteStart=0,this._paused=!0)},e.prototype.resume=function(){if(this._paused){this._paused=!1;var e=this._resumeFrom;this._resumeFrom=0,this._internalSeek(e,!0)}},e.prototype.seek=function(e){this._paused=!1,this._stashUsed=0,this._stashByteStart=0,this._internalSeek(e,!0)},e.prototype._internalSeek=function(e,t){this._loader.isWorking()&&this._loader.abort(),this._flushStashBuffer(t),this._loader.destroy(),this._loader=null;var i={from:e,to:-1};this._currentRange={from:i.from,to:-1},this._speedSampler.reset(),this._stashSize=this._stashInitialSize,this._createLoader(),this._loader.open(this._dataSource,i),this._onSeeked&&this._onSeeked()},e.prototype.updateUrl=function(e){if(!e||"string"!=typeof e||0===e.length)throw new h.b("Url must be a non-empty string!");this._dataSource.url=e},e.prototype._expandBuffer=function(e){for(var t=this._stashSize;t+1048576<e;)t*=2;if((t+=1048576)!==this._bufferSize){var i=new ArrayBuffer(t);if(this._stashUsed>0){var n=new Uint8Array(this._stashBuffer,0,this._stashUsed);new Uint8Array(i,0,t).set(n,0)}this._stashBuffer=i,this._bufferSize=t}},e.prototype._normalizeSpeed=function(e){var t=this._speedNormalizeList,i=t.length-1,n=0,r=0,s=i;if(e<t[0])return t[0];for(;r<=s;){if((n=r+Math.floor((s-r)/2))===i||e>=t[n]&&e<t[n+1])return t[n];t[n]<e?r=n+1:s=n-1}},e.prototype._adjustStashSize=function(e){var t=0;(t=this._config.isLive?e/8:e<512?e:e>=512&&e<=1024?Math.floor(1.5*e):2*e)>8192&&(t=8192);var i=1024*t+1048576;this._bufferSize<i&&this._expandBuffer(i),this._stashSize=1024*t},e.prototype._dispatchChunks=function(e,t){return this._currentRange.to=t+e.byteLength-1,this._onDataArrival(e,t)},e.prototype._onURLRedirect=function(e){this._redirectedURL=e,this._onRedirect&&this._onRedirect(e)},e.prototype._onContentLengthKnown=function(e){e&&this._fullRequestFlag&&(this._totalLength=e,this._fullRequestFlag=!1)},e.prototype._onLoaderChunkArrival=function(e,t,i){if(!this._onDataArrival)throw new h.a("IOController: No existing consumer (onDataArrival) callback!");if(!this._paused){this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,this._onRecoveredEarlyEof&&this._onRecoveredEarlyEof()),this._speedSampler.addBytes(e.byteLength);var n=this._speedSampler.lastSecondKBps;if(0!==n){var r=this._normalizeSpeed(n);this._speedNormalized!==r&&(this._speedNormalized=r,this._adjustStashSize(r))}if(this._enableStash)if(0===this._stashUsed&&0===this._stashByteStart&&(this._stashByteStart=t),this._stashUsed+e.byteLength<=this._stashSize){(o=new Uint8Array(this._stashBuffer,0,this._stashSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else{o=new Uint8Array(this._stashBuffer,0,this._bufferSize);if(this._stashUsed>0){var s=this._stashBuffer.slice(0,this._stashUsed);if((d=this._dispatchChunks(s,this._stashByteStart))<s.byteLength){if(d>0){u=new Uint8Array(s,d);o.set(u,0),this._stashUsed=u.byteLength,this._stashByteStart+=d}}else this._stashUsed=0,this._stashByteStart+=d;this._stashUsed+e.byteLength>this._bufferSize&&(this._expandBuffer(this._stashUsed+e.byteLength),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else{if((d=this._dispatchChunks(e,t))<e.byteLength)(a=e.byteLength-d)>this._bufferSize&&(this._expandBuffer(a),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e,d),0),this._stashUsed+=a,this._stashByteStart=t+d}}else if(0===this._stashUsed){var a;if((d=this._dispatchChunks(e,t))<e.byteLength)(a=e.byteLength-d)>this._bufferSize&&this._expandBuffer(a),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e,d),0),this._stashUsed+=a,this._stashByteStart=t+d}else{var o,d;if(this._stashUsed+e.byteLength>this._bufferSize&&this._expandBuffer(this._stashUsed+e.byteLength),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength,(d=this._dispatchChunks(this._stashBuffer.slice(0,this._stashUsed),this._stashByteStart))<this._stashUsed&&d>0){var u=new Uint8Array(this._stashBuffer,d);o.set(u,0)}this._stashUsed-=d,this._stashByteStart+=d}}},e.prototype._flushStashBuffer=function(e){if(this._stashUsed>0){var t=this._stashBuffer.slice(0,this._stashUsed),i=this._dispatchChunks(t,this._stashByteStart),n=t.byteLength-i;if(i<t.byteLength){if(!e){if(i>0){var s=new Uint8Array(this._stashBuffer,0,this._bufferSize),a=new Uint8Array(t,i);s.set(a,0),this._stashUsed=a.byteLength,this._stashByteStart+=i}return 0}r.a.w(this.TAG,n+" bytes unconsumed data remain when flush buffer, dropped")}return this._stashUsed=0,this._stashByteStart=0,n}return 0},e.prototype._onLoaderComplete=function(e,t){this._flushStashBuffer(!0),this._onComplete&&this._onComplete(this._extraData)},e.prototype._onLoaderError=function(e,t){switch(r.a.e(this.TAG,"Loader error, code = "+t.code+", msg = "+t.msg),this._flushStashBuffer(!1),this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,e=a.b.UNRECOVERABLE_EARLY_EOF),e){case a.b.EARLY_EOF:if(!this._config.isLive&&this._totalLength){var i=this._currentRange.to+1;return void(i<this._totalLength&&(r.a.w(this.TAG,"Connection lost, trying reconnect..."),this._isEarlyEofReconnecting=!0,this._internalSeek(i,!1)))}e=a.b.UNRECOVERABLE_EARLY_EOF;break;case a.b.UNRECOVERABLE_EARLY_EOF:case a.b.CONNECTING_TIMEOUT:case a.b.HTTP_STATUS_CODE_INVALID:case a.b.EXCEPTION:}if(!this._onError)throw new h.d("IOException: "+t.msg);this._onError(e,t)},e}();t.a=y},function(e,t,i){"use strict";var n=function(){function e(){}return e.install=function(){Object.setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},Object.assign=Object.assign||function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),i=1;i<arguments.length;i++){var n=arguments[i];if(null!=n)for(var r in n)n.hasOwnProperty(r)&&(t[r]=n[r])}return t},"function"!=typeof self.Promise&&i(15).polyfill()},e}();n.install(),t.a=n},function(e,t,i){function n(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=t,i.i=function(e){return e},i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},i.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var n=i(i.s=ENTRY_MODULE);return n.default||n}function r(e){return(e+"").replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function s(e,t,n){var s={};s[n]=[];var a=t.toString(),o=a.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/);if(!o)return s;for(var h,d=o[1],u=new RegExp("(\\\\n|\\W)"+r(d)+"\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)","g");h=u.exec(a);)"dll-reference"!==h[3]&&s[n].push(h[3]);for(u=new RegExp("\\("+r(d)+'\\("(dll-reference\\s([\\.|\\-|\\+|\\w|/|@]+))"\\)\\)\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)',"g");h=u.exec(a);)e[h[2]]||(s[n].push(h[1]),e[h[2]]=i(h[1]).m),s[h[2]]=s[h[2]]||[],s[h[2]].push(h[4]);for(var _,l=Object.keys(s),c=0;c<l.length;c++)for(var f=0;f<s[l[c]].length;f++)_=s[l[c]][f],isNaN(1*_)||(s[l[c]][f]=1*s[l[c]][f]);return s}function a(e){return Object.keys(e).reduce((function(t,i){return t||e[i].length>0}),!1)}e.exports=function(e,t){t=t||{};var r={main:i.m},o=t.all?{main:Object.keys(r.main)}:function(e,t){for(var i={main:[t]},n={main:[]},r={main:{}};a(i);)for(var o=Object.keys(i),h=0;h<o.length;h++){var d=o[h],u=i[d].pop();if(r[d]=r[d]||{},!r[d][u]&&e[d][u]){r[d][u]=!0,n[d]=n[d]||[],n[d].push(u);for(var _=s(e,e[d][u],d),l=Object.keys(_),c=0;c<l.length;c++)i[l[c]]=i[l[c]]||[],i[l[c]]=i[l[c]].concat(_[l[c]])}}return n}(r,e),h="";Object.keys(o).filter((function(e){return"main"!==e})).forEach((function(e){for(var t=0;o[e][t];)t++;o[e].push(t),r[e][t]="(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })",h=h+"var "+e+" = ("+n.toString().replace("ENTRY_MODULE",JSON.stringify(t))+")({"+o[e].map((function(t){return JSON.stringify(t)+": "+r[e][t].toString()})).join(",")+"});\n"})),h=h+"new (("+n.toString().replace("ENTRY_MODULE",JSON.stringify(e))+")({"+o.main.map((function(e){return JSON.stringify(e)+": "+r.main[e].toString()})).join(",")+"}))(self);";var d=new window.Blob([h],{type:"text/javascript"});if(t.bare)return d;var u=(window.URL||window.webkitURL||window.mozURL||window.msURL).createObjectURL(d),_=new window.Worker(u);return _.objectURL=u,_}},function(e,t,i){e.exports=i(19).default},function(e,t,i){(function(t,i){ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.8+1e68dce6 + */var n;n=function(){"use strict";function e(e){return"function"==typeof e}var n=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},r=0,s=void 0,a=void 0,o=function(e,t){f[r]=e,f[r+1]=t,2===(r+=2)&&(a?a(p):b())},h="undefined"!=typeof window?window:void 0,d=h||{},u=d.MutationObserver||d.WebKitMutationObserver,_="undefined"==typeof self&&void 0!==t&&"[object process]"==={}.toString.call(t),l="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function c(){var e=setTimeout;return function(){return e(p,1)}}var f=new Array(1e3);function p(){for(var e=0;e<r;e+=2)(0,f[e])(f[e+1]),f[e]=void 0,f[e+1]=void 0;r=0}var m,g,v,y,b=void 0;function E(e,t){var i=this,n=new this.constructor(R);void 0===n[A]&&M(n);var r=i._state;if(r){var s=arguments[r-1];o((function(){return O(r,n,s,i._result)}))}else C(i,n,e,t);return n}function S(e){if(e&&"object"==typeof e&&e.constructor===this)return e;var t=new this(R);return T(t,e),t}_?b=function(){return t.nextTick(p)}:u?(g=0,v=new u(p),y=document.createTextNode(""),v.observe(y,{characterData:!0}),b=function(){y.data=g=++g%2}):l?((m=new MessageChannel).port1.onmessage=p,b=function(){return m.port2.postMessage(0)}):b=void 0===h?function(){try{var e=Function("return this")().require("vertx");return void 0!==(s=e.runOnLoop||e.runOnContext)?function(){s(p)}:c()}catch(e){return c()}}():c();var A=Math.random().toString(36).substring(2);function R(){}function L(t,i,n){i.constructor===t.constructor&&n===E&&i.constructor.resolve===S?function(e,t){1===t._state?D(e,t._result):2===t._state?k(e,t._result):C(t,void 0,(function(t){return T(e,t)}),(function(t){return k(e,t)}))}(t,i):void 0===n?D(t,i):e(n)?function(e,t,i){o((function(e){var n=!1,r=function(e,t,i,n){try{e.call(t,i,n)}catch(e){return e}}(i,t,(function(i){n||(n=!0,t!==i?T(e,i):D(e,i))}),(function(t){n||(n=!0,k(e,t))}),e._label);!n&&r&&(n=!0,k(e,r))}),e)}(t,i,n):D(t,i)}function T(e,t){if(e===t)k(e,new TypeError("You cannot resolve a promise with itself"));else if(r=typeof(n=t),null===n||"object"!==r&&"function"!==r)D(e,t);else{var i=void 0;try{i=t.then}catch(t){return void k(e,t)}L(e,t,i)}var n,r}function w(e){e._onerror&&e._onerror(e._result),I(e)}function D(e,t){void 0===e._state&&(e._result=t,e._state=1,0!==e._subscribers.length&&o(I,e))}function k(e,t){void 0===e._state&&(e._state=2,e._result=t,o(w,e))}function C(e,t,i,n){var r=e._subscribers,s=r.length;e._onerror=null,r[s]=t,r[s+1]=i,r[s+2]=n,0===s&&e._state&&o(I,e)}function I(e){var t=e._subscribers,i=e._state;if(0!==t.length){for(var n=void 0,r=void 0,s=e._result,a=0;a<t.length;a+=3)n=t[a],r=t[a+i],n?O(i,n,r,s):r(s);e._subscribers.length=0}}function O(t,i,n,r){var s=e(n),a=void 0,o=void 0,h=!0;if(s){try{a=n(r)}catch(e){h=!1,o=e}if(i===a)return void k(i,new TypeError("A promises callback cannot return that same promise."))}else a=r;void 0!==i._state||(s&&h?T(i,a):!1===h?k(i,o):1===t?D(i,a):2===t&&k(i,a))}var P=0;function M(e){e[A]=P++,e._state=void 0,e._result=void 0,e._subscribers=[]}var x=function(){function e(e,t){this._instanceConstructor=e,this.promise=new e(R),this.promise[A]||M(this.promise),n(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0===this.length?D(this.promise,this._result):(this.length=this.length||0,this._enumerate(t),0===this._remaining&&D(this.promise,this._result))):k(this.promise,new Error("Array Methods must be provided an Array"))}return e.prototype._enumerate=function(e){for(var t=0;void 0===this._state&&t<e.length;t++)this._eachEntry(e[t],t)},e.prototype._eachEntry=function(e,t){var i=this._instanceConstructor,n=i.resolve;if(n===S){var r=void 0,s=void 0,a=!1;try{r=e.then}catch(e){a=!0,s=e}if(r===E&&void 0!==e._state)this._settledAt(e._state,t,e._result);else if("function"!=typeof r)this._remaining--,this._result[t]=e;else if(i===B){var o=new i(R);a?k(o,s):L(o,e,r),this._willSettleAt(o,t)}else this._willSettleAt(new i((function(t){return t(e)})),t)}else this._willSettleAt(n(e),t)},e.prototype._settledAt=function(e,t,i){var n=this.promise;void 0===n._state&&(this._remaining--,2===e?k(n,i):this._result[t]=i),0===this._remaining&&D(n,this._result)},e.prototype._willSettleAt=function(e,t){var i=this;C(e,void 0,(function(e){return i._settledAt(1,t,e)}),(function(e){return i._settledAt(2,t,e)}))},e}(),B=function(){function t(e){this[A]=P++,this._result=this._state=void 0,this._subscribers=[],R!==e&&("function"!=typeof e&&function(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}(),this instanceof t?function(e,t){try{t((function(t){T(e,t)}),(function(t){k(e,t)}))}catch(t){k(e,t)}}(this,e):function(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}())}return t.prototype.catch=function(e){return this.then(null,e)},t.prototype.finally=function(t){var i=this.constructor;return e(t)?this.then((function(e){return i.resolve(t()).then((function(){return e}))}),(function(e){return i.resolve(t()).then((function(){throw e}))})):this.then(t,t)},t}();return B.prototype.then=E,B.all=function(e){return new x(this,e).promise},B.race=function(e){var t=this;return n(e)?new t((function(i,n){for(var r=e.length,s=0;s<r;s++)t.resolve(e[s]).then(i,n)})):new t((function(e,t){return t(new TypeError("You must pass an array to race."))}))},B.resolve=S,B.reject=function(e){var t=new this(R);return k(t,e),t},B._setScheduler=function(e){a=e},B._setAsap=function(e){o=e},B._asap=o,B.polyfill=function(){var e=void 0;if(void 0!==i)e=i;else if("undefined"!=typeof self)e=self;else try{e=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var t=e.Promise;if(t){var n=null;try{n=Object.prototype.toString.call(t.resolve())}catch(e){}if("[object Promise]"===n&&!t.cast)return}e.Promise=B},B.Promise=B,B},e.exports=n()}).call(this,i(16),i(17))},function(e,t){var i,n,r=e.exports={};function s(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function o(e){if(i===setTimeout)return setTimeout(e,0);if((i===s||!i)&&setTimeout)return i=setTimeout,setTimeout(e,0);try{return i(e,0)}catch(t){try{return i.call(null,e,0)}catch(t){return i.call(this,e,0)}}}!function(){try{i="function"==typeof setTimeout?setTimeout:s}catch(e){i=s}try{n="function"==typeof clearTimeout?clearTimeout:a}catch(e){n=a}}();var h,d=[],u=!1,_=-1;function l(){u&&h&&(u=!1,h.length?d=h.concat(d):_=-1,d.length&&c())}function c(){if(!u){var e=o(l);u=!0;for(var t=d.length;t;){for(h=d,d=[];++_<t;)h&&h[_].run();_=-1,t=d.length}h=null,u=!1,function(e){if(n===clearTimeout)return clearTimeout(e);if((n===a||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(e);try{n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}(e)}}function f(e,t){this.fun=e,this.array=t}function p(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)t[i-1]=arguments[i];d.push(new f(e,t)),1!==d.length||u||o(c)},f.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=p,r.addListener=p,r.once=p,r.off=p,r.removeListener=p,r.removeAllListeners=p,r.emit=p,r.prependListener=p,r.prependOnceListener=p,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i},function(e,t,i){"use strict";i.r(t);var n=i(9),r=i(12),s=i(10),a=i(1);t.default=function(e){var t=null,i=function(t,i){e.postMessage({msg:"logcat_callback",data:{type:t,logcat:i}})}.bind(this);function o(t,i){var n={msg:a.a.INIT_SEGMENT,data:{type:t,data:i}};e.postMessage(n,[i.data])}function h(t,i){var n={msg:a.a.MEDIA_SEGMENT,data:{type:t,data:i}};e.postMessage(n,[i.data])}function d(){var t={msg:a.a.LOADING_COMPLETE};e.postMessage(t)}function u(){var t={msg:a.a.RECOVERED_EARLY_EOF};e.postMessage(t)}function _(t){var i={msg:a.a.MEDIA_INFO,data:t};e.postMessage(i)}function l(t){var i={msg:a.a.METADATA_ARRIVED,data:t};e.postMessage(i)}function c(t){var i={msg:a.a.SCRIPTDATA_ARRIVED,data:t};e.postMessage(i)}function f(t){var i={msg:a.a.TIMED_ID3_METADATA_ARRIVED,data:t};e.postMessage(i)}function p(t){var i={msg:a.a.PES_PRIVATE_DATA_DESCRIPTOR,data:t};e.postMessage(i)}function m(t){var i={msg:a.a.PES_PRIVATE_DATA_ARRIVED,data:t};e.postMessage(i)}function g(t){var i={msg:a.a.STATISTICS_INFO,data:t};e.postMessage(i)}function v(t,i){e.postMessage({msg:a.a.IO_ERROR,data:{type:t,info:i}})}function y(t,i){e.postMessage({msg:a.a.DEMUX_ERROR,data:{type:t,info:i}})}function b(t){e.postMessage({msg:a.a.RECOMMEND_SEEKPOINT,data:t})}r.a.install(),e.addEventListener("message",(function(r){switch(r.data.cmd){case"init":(t=new s.a(r.data.param[0],r.data.param[1])).on(a.a.IO_ERROR,v.bind(this)),t.on(a.a.DEMUX_ERROR,y.bind(this)),t.on(a.a.INIT_SEGMENT,o.bind(this)),t.on(a.a.MEDIA_SEGMENT,h.bind(this)),t.on(a.a.LOADING_COMPLETE,d.bind(this)),t.on(a.a.RECOVERED_EARLY_EOF,u.bind(this)),t.on(a.a.MEDIA_INFO,_.bind(this)),t.on(a.a.METADATA_ARRIVED,l.bind(this)),t.on(a.a.SCRIPTDATA_ARRIVED,c.bind(this)),t.on(a.a.TIMED_ID3_METADATA_ARRIVED,f.bind(this)),t.on(a.a.PES_PRIVATE_DATA_DESCRIPTOR,p.bind(this)),t.on(a.a.PES_PRIVATE_DATA_ARRIVED,m.bind(this)),t.on(a.a.STATISTICS_INFO,g.bind(this)),t.on(a.a.RECOMMEND_SEEKPOINT,b.bind(this));break;case"destroy":t&&(t.destroy(),t=null),e.postMessage({msg:"destroyed"});break;case"start":t.start();break;case"stop":t.stop();break;case"seek":t.seek(r.data.param);break;case"pause":t.pause();break;case"resume":t.resume();break;case"logging_config":var E=r.data.param;n.a.applyConfig(E),!0===E.enableCallback?n.a.addLogListener(i):n.a.removeLogListener(i)}}))}},function(e,t,i){"use strict";i.r(t);var n=i(12),r=i(11),s={enableWorker:!1,enableStashBuffer:!0,stashInitialSize:void 0,isLive:!1,liveBufferLatencyChasing:!1,liveBufferLatencyMaxLatency:1.5,liveBufferLatencyMinRemain:.5,lazyLoad:!0,lazyLoadMaxDuration:180,lazyLoadRecoverDuration:30,deferLoadAfterSourceOpen:!0,autoCleanupMaxBackwardDuration:180,autoCleanupMinBackwardDuration:120,statisticsInfoReportInterval:600,fixAudioTimestampGap:!0,accurateSeek:!1,seekType:"range",seekParamStart:"bstart",seekParamEnd:"bend",rangeLoadZeroStart:!1,customSeekHandler:void 0,reuseRedirectedURL:!1,headers:void 0,customLoader:void 0};function a(){return Object.assign({},s)}var o=function(){function e(){}return e.supportMSEH264Playback=function(){return window.MediaSource&&window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')},e.supportNetworkStreamIO=function(){var e=new r.a({},a()),t=e.loaderType;return e.destroy(),"fetch-stream-loader"==t||"xhr-moz-chunked-loader"==t},e.getNetworkLoaderTypeName=function(){var e=new r.a({},a()),t=e.loaderType;return e.destroy(),t},e.supportNativeMediaPlayback=function(t){null==e.videoElement&&(e.videoElement=window.document.createElement("video"));var i=e.videoElement.canPlayType(t);return"probably"===i||"maybe"==i},e.getFeatureList=function(){var t={msePlayback:!1,mseLivePlayback:!1,networkStreamIO:!1,networkLoaderName:"",nativeMP4H264Playback:!1,nativeWebmVP8Playback:!1,nativeWebmVP9Playback:!1};return t.msePlayback=e.supportMSEH264Playback(),t.networkStreamIO=e.supportNetworkStreamIO(),t.networkLoaderName=e.getNetworkLoaderTypeName(),t.mseLivePlayback=t.msePlayback&&t.networkStreamIO,t.nativeMP4H264Playback=e.supportNativeMediaPlayback('video/mp4; codecs="avc1.42001E, mp4a.40.2"'),t.nativeWebmVP8Playback=e.supportNativeMediaPlayback('video/webm; codecs="vp8.0, vorbis"'),t.nativeWebmVP9Playback=e.supportNativeMediaPlayback('video/webm; codecs="vp9"'),t},e}(),h=i(2),d=i(6),u=i.n(d),_=i(0),l=i(4),c={ERROR:"error",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",TIMED_ID3_METADATA_ARRIVED:"timed_id3_metadata_arrived",PES_PRIVATE_DATA_DESCRIPTOR:"pes_private_data_descriptor",PES_PRIVATE_DATA_ARRIVED:"pes_private_data_arrived",STATISTICS_INFO:"statistics_info"},f=i(13),p=i.n(f),m=i(9),g=i(10),v=i(1),y=i(8),b=function(){function e(e,t){if(this.TAG="Transmuxer",this._emitter=new u.a,t.enableWorker&&"undefined"!=typeof Worker)try{this._worker=p()(18),this._workerDestroying=!1,this._worker.addEventListener("message",this._onWorkerMessage.bind(this)),this._worker.postMessage({cmd:"init",param:[e,t]}),this.e={onLoggingConfigChanged:this._onLoggingConfigChanged.bind(this)},m.a.registerListener(this.e.onLoggingConfigChanged),this._worker.postMessage({cmd:"logging_config",param:m.a.getConfig()})}catch(i){_.a.e(this.TAG,"Error while initialize transmuxing worker, fallback to inline transmuxing"),this._worker=null,this._controller=new g.a(e,t)}else this._controller=new g.a(e,t);if(this._controller){var i=this._controller;i.on(v.a.IO_ERROR,this._onIOError.bind(this)),i.on(v.a.DEMUX_ERROR,this._onDemuxError.bind(this)),i.on(v.a.INIT_SEGMENT,this._onInitSegment.bind(this)),i.on(v.a.MEDIA_SEGMENT,this._onMediaSegment.bind(this)),i.on(v.a.LOADING_COMPLETE,this._onLoadingComplete.bind(this)),i.on(v.a.RECOVERED_EARLY_EOF,this._onRecoveredEarlyEof.bind(this)),i.on(v.a.MEDIA_INFO,this._onMediaInfo.bind(this)),i.on(v.a.METADATA_ARRIVED,this._onMetaDataArrived.bind(this)),i.on(v.a.SCRIPTDATA_ARRIVED,this._onScriptDataArrived.bind(this)),i.on(v.a.TIMED_ID3_METADATA_ARRIVED,this._onTimedID3MetadataArrived.bind(this)),i.on(v.a.PES_PRIVATE_DATA_DESCRIPTOR,this._onPESPrivateDataDescriptor.bind(this)),i.on(v.a.PES_PRIVATE_DATA_ARRIVED,this._onPESPrivateDataArrived.bind(this)),i.on(v.a.STATISTICS_INFO,this._onStatisticsInfo.bind(this)),i.on(v.a.RECOMMEND_SEEKPOINT,this._onRecommendSeekpoint.bind(this))}}return e.prototype.destroy=function(){this._worker?this._workerDestroying||(this._workerDestroying=!0,this._worker.postMessage({cmd:"destroy"}),m.a.removeListener(this.e.onLoggingConfigChanged),this.e=null):(this._controller.destroy(),this._controller=null),this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.hasWorker=function(){return null!=this._worker},e.prototype.open=function(){this._worker?this._worker.postMessage({cmd:"start"}):this._controller.start()},e.prototype.close=function(){this._worker?this._worker.postMessage({cmd:"stop"}):this._controller.stop()},e.prototype.seek=function(e){this._worker?this._worker.postMessage({cmd:"seek",param:e}):this._controller.seek(e)},e.prototype.pause=function(){this._worker?this._worker.postMessage({cmd:"pause"}):this._controller.pause()},e.prototype.resume=function(){this._worker?this._worker.postMessage({cmd:"resume"}):this._controller.resume()},e.prototype._onInitSegment=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.a.INIT_SEGMENT,e,t)}))},e.prototype._onMediaSegment=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.a.MEDIA_SEGMENT,e,t)}))},e.prototype._onLoadingComplete=function(){var e=this;Promise.resolve().then((function(){e._emitter.emit(v.a.LOADING_COMPLETE)}))},e.prototype._onRecoveredEarlyEof=function(){var e=this;Promise.resolve().then((function(){e._emitter.emit(v.a.RECOVERED_EARLY_EOF)}))},e.prototype._onMediaInfo=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.MEDIA_INFO,e)}))},e.prototype._onMetaDataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.METADATA_ARRIVED,e)}))},e.prototype._onScriptDataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.SCRIPTDATA_ARRIVED,e)}))},e.prototype._onTimedID3MetadataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.TIMED_ID3_METADATA_ARRIVED,e)}))},e.prototype._onPESPrivateDataDescriptor=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.PES_PRIVATE_DATA_DESCRIPTOR,e)}))},e.prototype._onPESPrivateDataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.PES_PRIVATE_DATA_ARRIVED,e)}))},e.prototype._onStatisticsInfo=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.STATISTICS_INFO,e)}))},e.prototype._onIOError=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.a.IO_ERROR,e,t)}))},e.prototype._onDemuxError=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.a.DEMUX_ERROR,e,t)}))},e.prototype._onRecommendSeekpoint=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.RECOMMEND_SEEKPOINT,e)}))},e.prototype._onLoggingConfigChanged=function(e){this._worker&&this._worker.postMessage({cmd:"logging_config",param:e})},e.prototype._onWorkerMessage=function(e){var t=e.data,i=t.data;if("destroyed"===t.msg||this._workerDestroying)return this._workerDestroying=!1,this._worker.terminate(),void(this._worker=null);switch(t.msg){case v.a.INIT_SEGMENT:case v.a.MEDIA_SEGMENT:this._emitter.emit(t.msg,i.type,i.data);break;case v.a.LOADING_COMPLETE:case v.a.RECOVERED_EARLY_EOF:this._emitter.emit(t.msg);break;case v.a.MEDIA_INFO:Object.setPrototypeOf(i,y.a.prototype),this._emitter.emit(t.msg,i);break;case v.a.METADATA_ARRIVED:case v.a.SCRIPTDATA_ARRIVED:case v.a.TIMED_ID3_METADATA_ARRIVED:case v.a.PES_PRIVATE_DATA_DESCRIPTOR:case v.a.PES_PRIVATE_DATA_ARRIVED:case v.a.STATISTICS_INFO:this._emitter.emit(t.msg,i);break;case v.a.IO_ERROR:case v.a.DEMUX_ERROR:this._emitter.emit(t.msg,i.type,i.info);break;case v.a.RECOMMEND_SEEKPOINT:this._emitter.emit(t.msg,i);break;case"logcat_callback":_.a.emitter.emit("log",i.type,i.logcat)}},e}(),E={ERROR:"error",SOURCE_OPEN:"source_open",UPDATE_END:"update_end",BUFFER_FULL:"buffer_full"},S=i(7),A=i(3),R=function(){function e(e){this.TAG="MSEController",this._config=e,this._emitter=new u.a,this._config.isLive&&null==this._config.autoCleanupSourceBuffer&&(this._config.autoCleanupSourceBuffer=!0),this.e={onSourceOpen:this._onSourceOpen.bind(this),onSourceEnded:this._onSourceEnded.bind(this),onSourceClose:this._onSourceClose.bind(this),onSourceBufferError:this._onSourceBufferError.bind(this),onSourceBufferUpdateEnd:this._onSourceBufferUpdateEnd.bind(this)},this._mediaSource=null,this._mediaSourceObjectURL=null,this._mediaElement=null,this._isBufferFull=!1,this._hasPendingEos=!1,this._requireSetMediaDuration=!1,this._pendingMediaDuration=0,this._pendingSourceBufferInit=[],this._mimeTypes={video:null,audio:null},this._sourceBuffers={video:null,audio:null},this._lastInitSegments={video:null,audio:null},this._pendingSegments={video:[],audio:[]},this._pendingRemoveRanges={video:[],audio:[]},this._idrList=new S.a}return e.prototype.destroy=function(){(this._mediaElement||this._mediaSource)&&this.detachMediaElement(),this.e=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){if(this._mediaSource)throw new A.a("MediaSource has been attached to an HTMLMediaElement!");var t=this._mediaSource=new window.MediaSource;t.addEventListener("sourceopen",this.e.onSourceOpen),t.addEventListener("sourceended",this.e.onSourceEnded),t.addEventListener("sourceclose",this.e.onSourceClose),this._mediaElement=e,this._mediaSourceObjectURL=window.URL.createObjectURL(this._mediaSource),e.src=this._mediaSourceObjectURL},e.prototype.detachMediaElement=function(){if(this._mediaSource){var e=this._mediaSource;for(var t in this._sourceBuffers){var i=this._pendingSegments[t];i.splice(0,i.length),this._pendingSegments[t]=null,this._pendingRemoveRanges[t]=null,this._lastInitSegments[t]=null;var n=this._sourceBuffers[t];if(n){if("closed"!==e.readyState){try{e.removeSourceBuffer(n)}catch(e){_.a.e(this.TAG,e.message)}n.removeEventListener("error",this.e.onSourceBufferError),n.removeEventListener("updateend",this.e.onSourceBufferUpdateEnd)}this._mimeTypes[t]=null,this._sourceBuffers[t]=null}}if("open"===e.readyState)try{e.endOfStream()}catch(e){_.a.e(this.TAG,e.message)}e.removeEventListener("sourceopen",this.e.onSourceOpen),e.removeEventListener("sourceended",this.e.onSourceEnded),e.removeEventListener("sourceclose",this.e.onSourceClose),this._pendingSourceBufferInit=[],this._isBufferFull=!1,this._idrList.clear(),this._mediaSource=null}this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src"),this._mediaElement=null),this._mediaSourceObjectURL&&(window.URL.revokeObjectURL(this._mediaSourceObjectURL),this._mediaSourceObjectURL=null)},e.prototype.appendInitSegment=function(e,t){if(!this._mediaSource||"open"!==this._mediaSource.readyState)return this._pendingSourceBufferInit.push(e),void this._pendingSegments[e.type].push(e);var i=e,n=""+i.container;i.codec&&i.codec.length>0&&(n+=";codecs="+i.codec);var r=!1;if(_.a.v(this.TAG,"Received Initialization Segment, mimeType: "+n),this._lastInitSegments[i.type]=i,n!==this._mimeTypes[i.type]){if(this._mimeTypes[i.type])_.a.v(this.TAG,"Notice: "+i.type+" mimeType changed, origin: "+this._mimeTypes[i.type]+", target: "+n);else{r=!0;try{var s=this._sourceBuffers[i.type]=this._mediaSource.addSourceBuffer(n);s.addEventListener("error",this.e.onSourceBufferError),s.addEventListener("updateend",this.e.onSourceBufferUpdateEnd)}catch(e){return _.a.e(this.TAG,e.message),void this._emitter.emit(E.ERROR,{code:e.code,msg:e.message})}}this._mimeTypes[i.type]=n}t||this._pendingSegments[i.type].push(i),r||this._sourceBuffers[i.type]&&!this._sourceBuffers[i.type].updating&&this._doAppendSegments(),l.a.safari&&"audio/mpeg"===i.container&&i.mediaDuration>0&&(this._requireSetMediaDuration=!0,this._pendingMediaDuration=i.mediaDuration/1e3,this._updateMediaSourceDuration())},e.prototype.appendMediaSegment=function(e){var t=e;this._pendingSegments[t.type].push(t),this._config.autoCleanupSourceBuffer&&this._needCleanupSourceBuffer()&&this._doCleanupSourceBuffer();var i=this._sourceBuffers[t.type];!i||i.updating||this._hasPendingRemoveRanges()||this._doAppendSegments()},e.prototype.seek=function(e){for(var t in this._sourceBuffers)if(this._sourceBuffers[t]){var i=this._sourceBuffers[t];if("open"===this._mediaSource.readyState)try{i.abort()}catch(e){_.a.e(this.TAG,e.message)}this._idrList.clear();var n=this._pendingSegments[t];if(n.splice(0,n.length),"closed"!==this._mediaSource.readyState){for(var r=0;r<i.buffered.length;r++){var s=i.buffered.start(r),a=i.buffered.end(r);this._pendingRemoveRanges[t].push({start:s,end:a})}if(i.updating||this._doRemoveRanges(),l.a.safari){var o=this._lastInitSegments[t];o&&(this._pendingSegments[t].push(o),i.updating||this._doAppendSegments())}}}},e.prototype.endOfStream=function(){var e=this._mediaSource,t=this._sourceBuffers;e&&"open"===e.readyState?t.video&&t.video.updating||t.audio&&t.audio.updating?this._hasPendingEos=!0:(this._hasPendingEos=!1,e.endOfStream()):e&&"closed"===e.readyState&&this._hasPendingSegments()&&(this._hasPendingEos=!0)},e.prototype.getNearestKeyframe=function(e){return this._idrList.getLastSyncPointBeforeDts(e)},e.prototype._needCleanupSourceBuffer=function(){if(!this._config.autoCleanupSourceBuffer)return!1;var e=this._mediaElement.currentTime;for(var t in this._sourceBuffers){var i=this._sourceBuffers[t];if(i){var n=i.buffered;if(n.length>=1&&e-n.start(0)>=this._config.autoCleanupMaxBackwardDuration)return!0}}return!1},e.prototype._doCleanupSourceBuffer=function(){var e=this._mediaElement.currentTime;for(var t in this._sourceBuffers){var i=this._sourceBuffers[t];if(i){for(var n=i.buffered,r=!1,s=0;s<n.length;s++){var a=n.start(s),o=n.end(s);if(a<=e&&e<o+3){if(e-a>=this._config.autoCleanupMaxBackwardDuration){r=!0;var h=e-this._config.autoCleanupMinBackwardDuration;this._pendingRemoveRanges[t].push({start:a,end:h})}}else o<e&&(r=!0,this._pendingRemoveRanges[t].push({start:a,end:o}))}r&&!i.updating&&this._doRemoveRanges()}}},e.prototype._updateMediaSourceDuration=function(){var e=this._sourceBuffers;if(0!==this._mediaElement.readyState&&"open"===this._mediaSource.readyState&&!(e.video&&e.video.updating||e.audio&&e.audio.updating)){var t=this._mediaSource.duration,i=this._pendingMediaDuration;i>0&&(isNaN(t)||i>t)&&(_.a.v(this.TAG,"Update MediaSource duration from "+t+" to "+i),this._mediaSource.duration=i),this._requireSetMediaDuration=!1,this._pendingMediaDuration=0}},e.prototype._doRemoveRanges=function(){for(var e in this._pendingRemoveRanges)if(this._sourceBuffers[e]&&!this._sourceBuffers[e].updating)for(var t=this._sourceBuffers[e],i=this._pendingRemoveRanges[e];i.length&&!t.updating;){var n=i.shift();t.remove(n.start,n.end)}},e.prototype._doAppendSegments=function(){var e=this._pendingSegments;for(var t in e)if(this._sourceBuffers[t]&&!this._sourceBuffers[t].updating&&e[t].length>0){var i=e[t].shift();if(i.timestampOffset){var n=this._sourceBuffers[t].timestampOffset,r=i.timestampOffset/1e3;Math.abs(n-r)>.1&&(_.a.v(this.TAG,"Update MPEG audio timestampOffset from "+n+" to "+r),this._sourceBuffers[t].timestampOffset=r),delete i.timestampOffset}if(!i.data||0===i.data.byteLength)continue;try{this._sourceBuffers[t].appendBuffer(i.data),this._isBufferFull=!1,"video"===t&&i.hasOwnProperty("info")&&this._idrList.appendArray(i.info.syncPoints)}catch(e){this._pendingSegments[t].unshift(i),22===e.code?(this._isBufferFull||this._emitter.emit(E.BUFFER_FULL),this._isBufferFull=!0):(_.a.e(this.TAG,e.message),this._emitter.emit(E.ERROR,{code:e.code,msg:e.message}))}}},e.prototype._onSourceOpen=function(){if(_.a.v(this.TAG,"MediaSource onSourceOpen"),this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._pendingSourceBufferInit.length>0)for(var e=this._pendingSourceBufferInit;e.length;){var t=e.shift();this.appendInitSegment(t,!0)}this._hasPendingSegments()&&this._doAppendSegments(),this._emitter.emit(E.SOURCE_OPEN)},e.prototype._onSourceEnded=function(){_.a.v(this.TAG,"MediaSource onSourceEnded")},e.prototype._onSourceClose=function(){_.a.v(this.TAG,"MediaSource onSourceClose"),this._mediaSource&&null!=this.e&&(this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._mediaSource.removeEventListener("sourceended",this.e.onSourceEnded),this._mediaSource.removeEventListener("sourceclose",this.e.onSourceClose))},e.prototype._hasPendingSegments=function(){var e=this._pendingSegments;return e.video.length>0||e.audio.length>0},e.prototype._hasPendingRemoveRanges=function(){var e=this._pendingRemoveRanges;return e.video.length>0||e.audio.length>0},e.prototype._onSourceBufferUpdateEnd=function(){this._requireSetMediaDuration?this._updateMediaSourceDuration():this._hasPendingRemoveRanges()?this._doRemoveRanges():this._hasPendingSegments()?this._doAppendSegments():this._hasPendingEos&&this.endOfStream(),this._emitter.emit(E.UPDATE_END)},e.prototype._onSourceBufferError=function(e){_.a.e(this.TAG,"SourceBuffer Error: "+e)},e}(),L=i(5),T={NETWORK_ERROR:"NetworkError",MEDIA_ERROR:"MediaError",OTHER_ERROR:"OtherError"},w={NETWORK_EXCEPTION:h.b.EXCEPTION,NETWORK_STATUS_CODE_INVALID:h.b.HTTP_STATUS_CODE_INVALID,NETWORK_TIMEOUT:h.b.CONNECTING_TIMEOUT,NETWORK_UNRECOVERABLE_EARLY_EOF:h.b.UNRECOVERABLE_EARLY_EOF,MEDIA_MSE_ERROR:"MediaMSEError",MEDIA_FORMAT_ERROR:L.a.FORMAT_ERROR,MEDIA_FORMAT_UNSUPPORTED:L.a.FORMAT_UNSUPPORTED,MEDIA_CODEC_UNSUPPORTED:L.a.CODEC_UNSUPPORTED},D=function(){function e(e,t){this.TAG="MSEPlayer",this._type="MSEPlayer",this._emitter=new u.a,this._config=a(),"object"==typeof t&&Object.assign(this._config,t);var i=e.type.toLowerCase();if("mse"!==i&&"mpegts"!==i&&"m2ts"!==i&&"flv"!==i)throw new A.b("MSEPlayer requires an mpegts/m2ts/flv MediaDataSource input!");!0===e.isLive&&(this._config.isLive=!0),this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this),onvSeeking:this._onvSeeking.bind(this),onvCanPlay:this._onvCanPlay.bind(this),onvStalled:this._onvStalled.bind(this),onvProgress:this._onvProgress.bind(this)},self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now,this._pendingSeekTime=null,this._requestSetTime=!1,this._seekpointRecord=null,this._progressChecker=null,this._mediaDataSource=e,this._mediaElement=null,this._msectl=null,this._transmuxer=null,this._mseSourceOpened=!1,this._hasPendingLoad=!1,this._receivedCanPlay=!1,this._mediaInfo=null,this._statisticsInfo=null;var n=l.a.chrome&&(l.a.version.major<50||50===l.a.version.major&&l.a.version.build<2661);this._alwaysSeekKeyframe=!!(n||l.a.msedge||l.a.msie),this._alwaysSeekKeyframe&&(this._config.accurateSeek=!1)}return e.prototype.destroy=function(){null!=this._progressChecker&&(window.clearInterval(this._progressChecker),this._progressChecker=null),this._transmuxer&&this.unload(),this._mediaElement&&this.detachMediaElement(),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var i=this;e===c.MEDIA_INFO?null!=this._mediaInfo&&Promise.resolve().then((function(){i._emitter.emit(c.MEDIA_INFO,i.mediaInfo)})):e===c.STATISTICS_INFO&&null!=this._statisticsInfo&&Promise.resolve().then((function(){i._emitter.emit(c.STATISTICS_INFO,i.statisticsInfo)})),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){var t=this;if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),e.addEventListener("seeking",this.e.onvSeeking),e.addEventListener("canplay",this.e.onvCanPlay),e.addEventListener("stalled",this.e.onvStalled),e.addEventListener("progress",this.e.onvProgress),this._msectl=new R(this._config),this._msectl.on(E.UPDATE_END,this._onmseUpdateEnd.bind(this)),this._msectl.on(E.BUFFER_FULL,this._onmseBufferFull.bind(this)),this._msectl.on(E.SOURCE_OPEN,(function(){t._mseSourceOpened=!0,t._hasPendingLoad&&(t._hasPendingLoad=!1,t.load())})),this._msectl.on(E.ERROR,(function(e){t._emitter.emit(c.ERROR,T.MEDIA_ERROR,w.MEDIA_MSE_ERROR,e)})),this._msectl.attachMediaElement(e),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._msectl.detachMediaElement(),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement.removeEventListener("seeking",this.e.onvSeeking),this._mediaElement.removeEventListener("canplay",this.e.onvCanPlay),this._mediaElement.removeEventListener("stalled",this.e.onvStalled),this._mediaElement.removeEventListener("progress",this.e.onvProgress),this._mediaElement=null),this._msectl&&(this._msectl.destroy(),this._msectl=null)},e.prototype.load=function(){var e=this;if(!this._mediaElement)throw new A.a("HTMLMediaElement must be attached before load()!");if(this._transmuxer)throw new A.a("MSEPlayer.load() has been called, please call unload() first!");this._hasPendingLoad||(this._config.deferLoadAfterSourceOpen&&!1===this._mseSourceOpened?this._hasPendingLoad=!0:(this._mediaElement.readyState>0&&(this._requestSetTime=!0,this._mediaElement.currentTime=0),this._transmuxer=new b(this._mediaDataSource,this._config),this._transmuxer.on(v.a.INIT_SEGMENT,(function(t,i){e._msectl.appendInitSegment(i)})),this._transmuxer.on(v.a.MEDIA_SEGMENT,(function(t,i){if(e._msectl.appendMediaSegment(i),e._config.lazyLoad&&!e._config.isLive){var n=e._mediaElement.currentTime;i.info.endDts>=1e3*(n+e._config.lazyLoadMaxDuration)&&null==e._progressChecker&&(_.a.v(e.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),e._suspendTransmuxer())}})),this._transmuxer.on(v.a.LOADING_COMPLETE,(function(){e._msectl.endOfStream(),e._emitter.emit(c.LOADING_COMPLETE)})),this._transmuxer.on(v.a.RECOVERED_EARLY_EOF,(function(){e._emitter.emit(c.RECOVERED_EARLY_EOF)})),this._transmuxer.on(v.a.IO_ERROR,(function(t,i){e._emitter.emit(c.ERROR,T.NETWORK_ERROR,t,i)})),this._transmuxer.on(v.a.DEMUX_ERROR,(function(t,i){e._emitter.emit(c.ERROR,T.MEDIA_ERROR,t,{code:-1,msg:i})})),this._transmuxer.on(v.a.MEDIA_INFO,(function(t){e._mediaInfo=t,e._emitter.emit(c.MEDIA_INFO,Object.assign({},t))})),this._transmuxer.on(v.a.METADATA_ARRIVED,(function(t){e._emitter.emit(c.METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SCRIPTDATA_ARRIVED,(function(t){e._emitter.emit(c.SCRIPTDATA_ARRIVED,t)})),this._transmuxer.on(v.a.TIMED_ID3_METADATA_ARRIVED,(function(t){e._emitter.emit(c.TIMED_ID3_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_DESCRIPTOR,(function(t){e._emitter.emit(c.PES_PRIVATE_DATA_DESCRIPTOR,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_ARRIVED,(function(t){e._emitter.emit(c.PES_PRIVATE_DATA_ARRIVED,t)})),this._transmuxer.on(v.a.STATISTICS_INFO,(function(t){e._statisticsInfo=e._fillStatisticsInfo(t),e._emitter.emit(c.STATISTICS_INFO,Object.assign({},e._statisticsInfo))})),this._transmuxer.on(v.a.RECOMMEND_SEEKPOINT,(function(t){e._mediaElement&&!e._config.accurateSeek&&(e._requestSetTime=!0,e._mediaElement.currentTime=t/1e3)})),this._transmuxer.open()))},e.prototype.unload=function(){this._mediaElement&&this._mediaElement.pause(),this._msectl&&this._msectl.seek(0),this._transmuxer&&(this._transmuxer.close(),this._transmuxer.destroy(),this._transmuxer=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._internalSeek(e):this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return Object.assign({},this._mediaInfo)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return null==this._statisticsInfo&&(this._statisticsInfo={}),this._statisticsInfo=this._fillStatisticsInfo(this._statisticsInfo),Object.assign({},this._statisticsInfo)},enumerable:!1,configurable:!0}),e.prototype._fillStatisticsInfo=function(e){if(e.playerType=this._type,!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var r=this._mediaElement.getVideoPlaybackQuality();i=r.totalVideoFrames,n=r.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},e.prototype._onmseUpdateEnd=function(){var e=this._mediaElement.buffered,t=this._mediaElement.currentTime;if(this._config.isLive&&this._config.liveBufferLatencyChasing&&e.length>0&&!this._mediaElement.paused){var i=e.end(e.length-1);if(i>this._config.liveBufferLatencyMaxLatency&&i-t>this._config.liveBufferLatencyMaxLatency){var n=i-this._config.liveBufferLatencyMinRemain;this.currentTime=n}}if(this._config.lazyLoad&&!this._config.isLive){for(var r=0,s=0;s<e.length;s++){var a=e.start(s),o=e.end(s);if(a<=t&&t<o){a,r=o;break}}r>=t+this._config.lazyLoadMaxDuration&&null==this._progressChecker&&(_.a.v(this.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),this._suspendTransmuxer())}},e.prototype._onmseBufferFull=function(){_.a.v(this.TAG,"MSE SourceBuffer is full, suspend transmuxing task"),null==this._progressChecker&&this._suspendTransmuxer()},e.prototype._suspendTransmuxer=function(){this._transmuxer&&(this._transmuxer.pause(),null==this._progressChecker&&(this._progressChecker=window.setInterval(this._checkProgressAndResume.bind(this),1e3)))},e.prototype._checkProgressAndResume=function(){for(var e=this._mediaElement.currentTime,t=this._mediaElement.buffered,i=!1,n=0;n<t.length;n++){var r=t.start(n),s=t.end(n);if(e>=r&&e<s){e>=s-this._config.lazyLoadRecoverDuration&&(i=!0);break}}i&&(window.clearInterval(this._progressChecker),this._progressChecker=null,i&&(_.a.v(this.TAG,"Continue loading from paused position"),this._transmuxer.resume()))},e.prototype._isTimepointBuffered=function(e){for(var t=this._mediaElement.buffered,i=0;i<t.length;i++){var n=t.start(i),r=t.end(i);if(e>=n&&e<r)return!0}return!1},e.prototype._internalSeek=function(e){var t=this._isTimepointBuffered(e),i=!1,n=0;if(e<1&&this._mediaElement.buffered.length>0){var r=this._mediaElement.buffered.start(0);(r<1&&e<r||l.a.safari)&&(i=!0,n=l.a.safari?.1:r)}if(i)this._requestSetTime=!0,this._mediaElement.currentTime=n;else if(t){if(this._alwaysSeekKeyframe){var s=this._msectl.getNearestKeyframe(Math.floor(1e3*e));this._requestSetTime=!0,this._mediaElement.currentTime=null!=s?s.dts/1e3:e}else this._requestSetTime=!0,this._mediaElement.currentTime=e;null!=this._progressChecker&&this._checkProgressAndResume()}else null!=this._progressChecker&&(window.clearInterval(this._progressChecker),this._progressChecker=null),this._msectl.seek(e),this._transmuxer.seek(Math.floor(1e3*e)),this._config.accurateSeek&&(this._requestSetTime=!0,this._mediaElement.currentTime=e)},e.prototype._checkAndApplyUnbufferedSeekpoint=function(){if(this._seekpointRecord)if(this._seekpointRecord.recordTime<=this._now()-100){var e=this._mediaElement.currentTime;this._seekpointRecord=null,this._isTimepointBuffered(e)||(null!=this._progressChecker&&(window.clearTimeout(this._progressChecker),this._progressChecker=null),this._msectl.seek(e),this._transmuxer.seek(Math.floor(1e3*e)),this._config.accurateSeek&&(this._requestSetTime=!0,this._mediaElement.currentTime=e))}else window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this),50)},e.prototype._checkAndResumeStuckPlayback=function(e){var t=this._mediaElement;if(e||!this._receivedCanPlay||t.readyState<2){var i=t.buffered;i.length>0&&t.currentTime<i.start(0)&&(_.a.w(this.TAG,"Playback seems stuck at "+t.currentTime+", seek to "+i.start(0)),this._requestSetTime=!0,this._mediaElement.currentTime=i.start(0),this._mediaElement.removeEventListener("progress",this.e.onvProgress))}else this._mediaElement.removeEventListener("progress",this.e.onvProgress)},e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null)},e.prototype._onvSeeking=function(e){var t=this._mediaElement.currentTime,i=this._mediaElement.buffered;if(this._requestSetTime)this._requestSetTime=!1;else{if(t<1&&i.length>0){var n=i.start(0);if(n<1&&t<n||l.a.safari)return this._requestSetTime=!0,void(this._mediaElement.currentTime=l.a.safari?.1:n)}if(this._isTimepointBuffered(t)){if(this._alwaysSeekKeyframe){var r=this._msectl.getNearestKeyframe(Math.floor(1e3*t));null!=r&&(this._requestSetTime=!0,this._mediaElement.currentTime=r.dts/1e3)}null!=this._progressChecker&&this._checkProgressAndResume()}else this._seekpointRecord={seekPoint:t,recordTime:this._now()},window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this),50)}},e.prototype._onvCanPlay=function(e){this._receivedCanPlay=!0,this._mediaElement.removeEventListener("canplay",this.e.onvCanPlay)},e.prototype._onvStalled=function(e){this._checkAndResumeStuckPlayback(!0)},e.prototype._onvProgress=function(e){this._checkAndResumeStuckPlayback()},e}(),k=function(){function e(e,t){this.TAG="NativePlayer",this._type="NativePlayer",this._emitter=new u.a,this._config=a(),"object"==typeof t&&Object.assign(this._config,t);var i=e.type.toLowerCase();if("mse"===i||"mpegts"===i||"m2ts"===i||"flv"===i)throw new A.b("NativePlayer does't support mse/mpegts/m2ts/flv MediaDataSource input!");if(e.hasOwnProperty("segments"))throw new A.b("NativePlayer("+e.type+") doesn't support multipart playback!");this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this)},this._pendingSeekTime=null,this._statisticsReporter=null,this._mediaDataSource=e,this._mediaElement=null}return e.prototype.destroy=function(){this._mediaElement&&(this.unload(),this.detachMediaElement()),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var i=this;e===c.MEDIA_INFO?null!=this._mediaElement&&0!==this._mediaElement.readyState&&Promise.resolve().then((function(){i._emitter.emit(c.MEDIA_INFO,i.mediaInfo)})):e===c.STATISTICS_INFO&&null!=this._mediaElement&&0!==this._mediaElement.readyState&&Promise.resolve().then((function(){i._emitter.emit(c.STATISTICS_INFO,i.statisticsInfo)})),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src"),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement=null),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.load=function(){if(!this._mediaElement)throw new A.a("HTMLMediaElement must be attached before load()!");this._mediaElement.src=this._mediaDataSource.url,this._mediaElement.readyState>0&&(this._mediaElement.currentTime=0),this._mediaElement.preload="auto",this._mediaElement.load(),this._statisticsReporter=window.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval)},e.prototype.unload=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src")),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._mediaElement.currentTime=e:this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){var e={mimeType:(this._mediaElement instanceof HTMLAudioElement?"audio/":"video/")+this._mediaDataSource.type};return this._mediaElement&&(e.duration=Math.floor(1e3*this._mediaElement.duration),this._mediaElement instanceof HTMLVideoElement&&(e.width=this._mediaElement.videoWidth,e.height=this._mediaElement.videoHeight)),e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){var e={playerType:this._type,url:this._mediaDataSource.url};if(!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var r=this._mediaElement.getVideoPlaybackQuality();i=r.totalVideoFrames,n=r.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},enumerable:!1,configurable:!0}),e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null),this._emitter.emit(c.MEDIA_INFO,this.mediaInfo)},e.prototype._reportStatisticsInfo=function(){this._emitter.emit(c.STATISTICS_INFO,this.statisticsInfo)},e}();n.a.install();var C={createPlayer:function(e,t){var i=e;if(null==i||"object"!=typeof i)throw new A.b("MediaDataSource must be an javascript object!");if(!i.hasOwnProperty("type"))throw new A.b("MediaDataSource must has type field to indicate video file type!");switch(i.type){case"mse":case"mpegts":case"m2ts":case"flv":return new D(i,t);default:return new k(i,t)}},isSupported:function(){return o.supportMSEH264Playback()},getFeatureList:function(){return o.getFeatureList()}};C.BaseLoader=h.a,C.LoaderStatus=h.c,C.LoaderErrors=h.b,C.Events=c,C.ErrorTypes=T,C.ErrorDetails=w,C.MSEPlayer=D,C.NativePlayer=k,C.LoggingControl=m.a,Object.defineProperty(C,"version",{enumerable:!0,get:function(){return"1.6.10"}});t.default=C}])})); +//# sourceMappingURL=mpegts.js.map \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ckplayer/mpegts.js/mpegts.min.js b/modules/core/src/main/resources/static/ckplayer/mpegts.js/mpegts.min.js new file mode 100644 index 00000000..0c8536db --- /dev/null +++ b/modules/core/src/main/resources/static/ckplayer/mpegts.js/mpegts.min.js @@ -0,0 +1,8 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mpegts=t():e.mpegts=t()}(window,(function(){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=14)}([function(e,t,i){"use strict";var n=i(6),r=i.n(n),s=function(){function e(){}return e.e=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","error",n),e.ENABLE_ERROR&&(console.error?console.error(n):console.warn?console.warn(n):console.log(n))},e.i=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","info",n),e.ENABLE_INFO&&(console.info?console.info(n):console.log(n))},e.w=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","warn",n),e.ENABLE_WARN&&(console.warn?console.warn(n):console.log(n))},e.d=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","debug",n),e.ENABLE_DEBUG&&(console.debug?console.debug(n):console.log(n))},e.v=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","verbose",n),e.ENABLE_VERBOSE&&console.log(n)},e}();s.GLOBAL_TAG="mpegts.js",s.FORCE_GLOBAL_TAG=!1,s.ENABLE_ERROR=!0,s.ENABLE_INFO=!0,s.ENABLE_WARN=!0,s.ENABLE_DEBUG=!0,s.ENABLE_VERBOSE=!0,s.ENABLE_CALLBACK=!1,s.emitter=new r.a,t.a=s},function(e,t,i){"use strict";t.a={IO_ERROR:"io_error",DEMUX_ERROR:"demux_error",INIT_SEGMENT:"init_segment",MEDIA_SEGMENT:"media_segment",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",TIMED_ID3_METADATA_ARRIVED:"timed_id3_metadata_arrived",PES_PRIVATE_DATA_DESCRIPTOR:"pes_private_data_descriptor",PES_PRIVATE_DATA_ARRIVED:"pes_private_data_arrived",STATISTICS_INFO:"statistics_info",RECOMMEND_SEEKPOINT:"recommend_seekpoint"}},function(e,t,i){"use strict";i.d(t,"c",(function(){return r})),i.d(t,"b",(function(){return s})),i.d(t,"a",(function(){return a}));var n=i(3),r={kIdle:0,kConnecting:1,kBuffering:2,kError:3,kComplete:4},s={OK:"OK",EXCEPTION:"Exception",HTTP_STATUS_CODE_INVALID:"HttpStatusCodeInvalid",CONNECTING_TIMEOUT:"ConnectingTimeout",EARLY_EOF:"EarlyEof",UNRECOVERABLE_EARLY_EOF:"UnrecoverableEarlyEof"},a=function(){function e(e){this._type=e||"undefined",this._status=r.kIdle,this._needStash=!1,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null}return e.prototype.destroy=function(){this._status=r.kIdle,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null},e.prototype.isWorking=function(){return this._status===r.kConnecting||this._status===r.kBuffering},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"status",{get:function(){return this._status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"needStashBuffer",{get:function(){return this._needStash},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onContentLengthKnown",{get:function(){return this._onContentLengthKnown},set:function(e){this._onContentLengthKnown=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onURLRedirect",{get:function(){return this._onURLRedirect},set:function(e){this._onURLRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),e.prototype.open=function(e,t){throw new n.c("Unimplemented abstract function!")},e.prototype.abort=function(){throw new n.c("Unimplemented abstract function!")},e}()},function(e,t,i){"use strict";i.d(t,"d",(function(){return s})),i.d(t,"a",(function(){return a})),i.d(t,"b",(function(){return o})),i.d(t,"c",(function(){return h}));var n,r=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),s=function(){function e(e){this._message=e}return Object.defineProperty(e.prototype,"name",{get:function(){return"RuntimeException"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this.name+": "+this.message},e}(),a=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"IllegalStateException"},enumerable:!1,configurable:!0}),t}(s),o=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"InvalidArgumentException"},enumerable:!1,configurable:!0}),t}(s),h=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"NotImplementedException"},enumerable:!1,configurable:!0}),t}(s)},function(e,t,i){"use strict";var n={};!function(){var e=self.navigator.userAgent.toLowerCase(),t=/(edge)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(chrome)[ \/]([\w.]+)/.exec(e)||/(iemobile)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(firefox)[ \/]([\w.]+)/.exec(e)||[],i=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(android)/.exec(e)||/(windows)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||[],r={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",majorVersion:t[4]||t[2]||"0",platform:i[0]||""},s={};if(r.browser){s[r.browser]=!0;var a=r.majorVersion.split(".");s.version={major:parseInt(r.majorVersion,10),string:r.version},a.length>1&&(s.version.minor=parseInt(a[1],10)),a.length>2&&(s.version.build=parseInt(a[2],10))}if(r.platform&&(s[r.platform]=!0),(s.chrome||s.opr||s.safari)&&(s.webkit=!0),s.rv||s.iemobile){s.rv&&delete s.rv;r.browser="msie",s.msie=!0}if(s.edge){delete s.edge;r.browser="msedge",s.msedge=!0}if(s.opr){r.browser="opera",s.opera=!0}if(s.safari&&s.android){r.browser="android",s.android=!0}for(var o in s.name=r.browser,s.platform=r.platform,n)n.hasOwnProperty(o)&&delete n[o];Object.assign(n,s)}(),t.a=n},function(e,t,i){"use strict";t.a={OK:"OK",FORMAT_ERROR:"FormatError",FORMAT_UNSUPPORTED:"FormatUnsupported",CODEC_UNSUPPORTED:"CodecUnsupported"}},function(e,t,i){"use strict";var n,r="object"==typeof Reflect?Reflect:null,s=r&&"function"==typeof r.apply?r.apply:function(e,t,i){return Function.prototype.apply.call(e,t,i)};n=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var a=Number.isNaN||function(e){return e!=e};function o(){o.init.call(this)}e.exports=o,e.exports.once=function(e,t){return new Promise((function(i,n){function r(i){e.removeListener(t,s),n(i)}function s(){"function"==typeof e.removeListener&&e.removeListener("error",r),i([].slice.call(arguments))}g(e,t,s,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&g(e,"error",t,i)}(e,r,{once:!0})}))},o.EventEmitter=o,o.prototype._events=void 0,o.prototype._eventsCount=0,o.prototype._maxListeners=void 0;var h=10;function d(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function u(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function _(e,t,i,n){var r,s,a,o;if(d(i),void 0===(s=e._events)?(s=e._events=Object.create(null),e._eventsCount=0):(void 0!==s.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),s=e._events),a=s[t]),void 0===a)a=s[t]=i,++e._eventsCount;else if("function"==typeof a?a=s[t]=n?[i,a]:[a,i]:n?a.unshift(i):a.push(i),(r=u(e))>0&&a.length>r&&!a.warned){a.warned=!0;var h=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");h.name="MaxListenersExceededWarning",h.emitter=e,h.type=t,h.count=a.length,o=h,console&&console.warn&&console.warn(o)}return e}function l(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function c(e,t,i){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},r=l.bind(n);return r.listener=i,n.wrapFn=r,r}function f(e,t,i){var n=e._events;if(void 0===n)return[];var r=n[t];return void 0===r?[]:"function"==typeof r?i?[r.listener||r]:[r]:i?function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(r):m(r,r.length)}function p(e){var t=this._events;if(void 0!==t){var i=t[e];if("function"==typeof i)return 1;if(void 0!==i)return i.length}return 0}function m(e,t){for(var i=new Array(t),n=0;n<t;++n)i[n]=e[n];return i}function g(e,t,i,n){if("function"==typeof e.on)n.once?e.once(t,i):e.on(t,i);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function r(s){n.once&&e.removeEventListener(t,r),i(s)}))}}Object.defineProperty(o,"defaultMaxListeners",{enumerable:!0,get:function(){return h},set:function(e){if("number"!=typeof e||e<0||a(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");h=e}}),o.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},o.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||a(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},o.prototype.getMaxListeners=function(){return u(this)},o.prototype.emit=function(e){for(var t=[],i=1;i<arguments.length;i++)t.push(arguments[i]);var n="error"===e,r=this._events;if(void 0!==r)n=n&&void 0===r.error;else if(!n)return!1;if(n){var a;if(t.length>0&&(a=t[0]),a instanceof Error)throw a;var o=new Error("Unhandled error."+(a?" ("+a.message+")":""));throw o.context=a,o}var h=r[e];if(void 0===h)return!1;if("function"==typeof h)s(h,this,t);else{var d=h.length,u=m(h,d);for(i=0;i<d;++i)s(u[i],this,t)}return!0},o.prototype.addListener=function(e,t){return _(this,e,t,!1)},o.prototype.on=o.prototype.addListener,o.prototype.prependListener=function(e,t){return _(this,e,t,!0)},o.prototype.once=function(e,t){return d(t),this.on(e,c(this,e,t)),this},o.prototype.prependOnceListener=function(e,t){return d(t),this.prependListener(e,c(this,e,t)),this},o.prototype.removeListener=function(e,t){var i,n,r,s,a;if(d(t),void 0===(n=this._events))return this;if(void 0===(i=n[e]))return this;if(i===t||i.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(r=-1,s=i.length-1;s>=0;s--)if(i[s]===t||i[s].listener===t){a=i[s].listener,r=s;break}if(r<0)return this;0===r?i.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(i,r),1===i.length&&(n[e]=i[0]),void 0!==n.removeListener&&this.emit("removeListener",e,a||t)}return this},o.prototype.off=o.prototype.removeListener,o.prototype.removeAllListeners=function(e){var t,i,n;if(void 0===(i=this._events))return this;if(void 0===i.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==i[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete i[e]),this;if(0===arguments.length){var r,s=Object.keys(i);for(n=0;n<s.length;++n)"removeListener"!==(r=s[n])&&this.removeAllListeners(r);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(void 0!==t)for(n=t.length-1;n>=0;n--)this.removeListener(e,t[n]);return this},o.prototype.listeners=function(e){return f(this,e,!0)},o.prototype.rawListeners=function(e){return f(this,e,!1)},o.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},o.prototype.listenerCount=p,o.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(e,t,i){"use strict";i.d(t,"d",(function(){return n})),i.d(t,"b",(function(){return r})),i.d(t,"a",(function(){return s})),i.d(t,"c",(function(){return a}));var n=function(e,t,i,n,r){this.dts=e,this.pts=t,this.duration=i,this.originalDts=n,this.isSyncPoint=r,this.fileposition=null},r=function(){function e(){this.beginDts=0,this.endDts=0,this.beginPts=0,this.endPts=0,this.originalBeginDts=0,this.originalEndDts=0,this.syncPoints=[],this.firstSample=null,this.lastSample=null}return e.prototype.appendSyncPoint=function(e){e.isSyncPoint=!0,this.syncPoints.push(e)},e}(),s=function(){function e(){this._list=[]}return e.prototype.clear=function(){this._list=[]},e.prototype.appendArray=function(e){var t=this._list;0!==e.length&&(t.length>0&&e[0].originalDts<t[t.length-1].originalDts&&this.clear(),Array.prototype.push.apply(t,e))},e.prototype.getLastSyncPointBeforeDts=function(e){if(0==this._list.length)return null;var t=this._list,i=0,n=t.length-1,r=0,s=0,a=n;for(e<t[0].dts&&(i=0,s=a+1);s<=a;){if((r=s+Math.floor((a-s)/2))===n||e>=t[r].dts&&e<t[r+1].dts){i=r;break}t[r].dts<e?s=r+1:a=r-1}return this._list[i]},e}(),a=function(){function e(e){this._type=e,this._list=[],this._lastAppendLocation=-1}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"length",{get:function(){return this._list.length},enumerable:!1,configurable:!0}),e.prototype.isEmpty=function(){return 0===this._list.length},e.prototype.clear=function(){this._list=[],this._lastAppendLocation=-1},e.prototype._searchNearestSegmentBefore=function(e){var t=this._list;if(0===t.length)return-2;var i=t.length-1,n=0,r=0,s=i,a=0;if(e<t[0].originalBeginDts)return a=-1;for(;r<=s;){if((n=r+Math.floor((s-r)/2))===i||e>t[n].lastSample.originalDts&&e<t[n+1].originalBeginDts){a=n;break}t[n].originalBeginDts<e?r=n+1:s=n-1}return a},e.prototype._searchNearestSegmentAfter=function(e){return this._searchNearestSegmentBefore(e)+1},e.prototype.append=function(e){var t=this._list,i=e,n=this._lastAppendLocation,r=0;-1!==n&&n<t.length&&i.originalBeginDts>=t[n].lastSample.originalDts&&(n===t.length-1||n<t.length-1&&i.originalBeginDts<t[n+1].originalBeginDts)?r=n+1:t.length>0&&(r=this._searchNearestSegmentBefore(i.originalBeginDts)+1),this._lastAppendLocation=r,this._list.splice(r,0,i)},e.prototype.getLastSegmentBefore=function(e){var t=this._searchNearestSegmentBefore(e);return t>=0?this._list[t]:null},e.prototype.getLastSampleBefore=function(e){var t=this.getLastSegmentBefore(e);return null!=t?t.lastSample:null},e.prototype.getLastSyncPointBefore=function(e){for(var t=this._searchNearestSegmentBefore(e),i=this._list[t].syncPoints;0===i.length&&t>0;)t--,i=this._list[t].syncPoints;return i.length>0?i[i.length-1]:null},e}()},function(e,t,i){"use strict";var n=function(){function e(){this.mimeType=null,this.duration=null,this.hasAudio=null,this.hasVideo=null,this.audioCodec=null,this.videoCodec=null,this.audioDataRate=null,this.videoDataRate=null,this.audioSampleRate=null,this.audioChannelCount=null,this.width=null,this.height=null,this.fps=null,this.profile=null,this.level=null,this.refFrames=null,this.chromaFormat=null,this.sarNum=null,this.sarDen=null,this.metadata=null,this.segments=null,this.segmentCount=null,this.hasKeyframesIndex=null,this.keyframesIndex=null}return e.prototype.isComplete=function(){var e=!1===this.hasAudio||!0===this.hasAudio&&null!=this.audioCodec&&null!=this.audioSampleRate&&null!=this.audioChannelCount,t=!1===this.hasVideo||!0===this.hasVideo&&null!=this.videoCodec&&null!=this.width&&null!=this.height&&null!=this.fps&&null!=this.profile&&null!=this.level&&null!=this.refFrames&&null!=this.chromaFormat&&null!=this.sarNum&&null!=this.sarDen;return null!=this.mimeType&&e&&t},e.prototype.isSeekable=function(){return!0===this.hasKeyframesIndex},e.prototype.getNearestKeyframe=function(e){if(null==this.keyframesIndex)return null;var t=this.keyframesIndex,i=this._search(t.times,e);return{index:i,milliseconds:t.times[i],fileposition:t.filepositions[i]}},e.prototype._search=function(e,t){var i=0,n=e.length-1,r=0,s=0,a=n;for(t<e[0]&&(i=0,s=a+1);s<=a;){if((r=s+Math.floor((a-s)/2))===n||t>=e[r]&&t<e[r+1]){i=r;break}e[r]<t?s=r+1:a=r-1}return i},e}();t.a=n},function(e,t,i){"use strict";var n=i(6),r=i.n(n),s=i(0),a=function(){function e(){}return Object.defineProperty(e,"forceGlobalTag",{get:function(){return s.a.FORCE_GLOBAL_TAG},set:function(t){s.a.FORCE_GLOBAL_TAG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"globalTag",{get:function(){return s.a.GLOBAL_TAG},set:function(t){s.a.GLOBAL_TAG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableAll",{get:function(){return s.a.ENABLE_VERBOSE&&s.a.ENABLE_DEBUG&&s.a.ENABLE_INFO&&s.a.ENABLE_WARN&&s.a.ENABLE_ERROR},set:function(t){s.a.ENABLE_VERBOSE=t,s.a.ENABLE_DEBUG=t,s.a.ENABLE_INFO=t,s.a.ENABLE_WARN=t,s.a.ENABLE_ERROR=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableDebug",{get:function(){return s.a.ENABLE_DEBUG},set:function(t){s.a.ENABLE_DEBUG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableVerbose",{get:function(){return s.a.ENABLE_VERBOSE},set:function(t){s.a.ENABLE_VERBOSE=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableInfo",{get:function(){return s.a.ENABLE_INFO},set:function(t){s.a.ENABLE_INFO=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableWarn",{get:function(){return s.a.ENABLE_WARN},set:function(t){s.a.ENABLE_WARN=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableError",{get:function(){return s.a.ENABLE_ERROR},set:function(t){s.a.ENABLE_ERROR=t,e._notifyChange()},enumerable:!1,configurable:!0}),e.getConfig=function(){return{globalTag:s.a.GLOBAL_TAG,forceGlobalTag:s.a.FORCE_GLOBAL_TAG,enableVerbose:s.a.ENABLE_VERBOSE,enableDebug:s.a.ENABLE_DEBUG,enableInfo:s.a.ENABLE_INFO,enableWarn:s.a.ENABLE_WARN,enableError:s.a.ENABLE_ERROR,enableCallback:s.a.ENABLE_CALLBACK}},e.applyConfig=function(e){s.a.GLOBAL_TAG=e.globalTag,s.a.FORCE_GLOBAL_TAG=e.forceGlobalTag,s.a.ENABLE_VERBOSE=e.enableVerbose,s.a.ENABLE_DEBUG=e.enableDebug,s.a.ENABLE_INFO=e.enableInfo,s.a.ENABLE_WARN=e.enableWarn,s.a.ENABLE_ERROR=e.enableError,s.a.ENABLE_CALLBACK=e.enableCallback},e._notifyChange=function(){var t=e.emitter;if(t.listenerCount("change")>0){var i=e.getConfig();t.emit("change",i)}},e.registerListener=function(t){e.emitter.addListener("change",t)},e.removeListener=function(t){e.emitter.removeListener("change",t)},e.addLogListener=function(t){s.a.emitter.addListener("log",t),s.a.emitter.listenerCount("log")>0&&(s.a.ENABLE_CALLBACK=!0,e._notifyChange())},e.removeLogListener=function(t){s.a.emitter.removeListener("log",t),0===s.a.emitter.listenerCount("log")&&(s.a.ENABLE_CALLBACK=!1,e._notifyChange())},e}();a.emitter=new r.a,t.a=a},function(e,t,i){"use strict";var n=i(6),r=i.n(n),s=i(0),a=i(4),o=i(8);function h(e,t,i){var n=e;if(t+i<n.length){for(;i--;)if(128!=(192&n[++t]))return!1;return!0}return!1}var d,u=function(e){for(var t=[],i=e,n=0,r=e.length;n<r;)if(i[n]<128)t.push(String.fromCharCode(i[n])),++n;else{if(i[n]<192);else if(i[n]<224){if(h(i,n,1))if((s=(31&i[n])<<6|63&i[n+1])>=128){t.push(String.fromCharCode(65535&s)),n+=2;continue}}else if(i[n]<240){if(h(i,n,2))if((s=(15&i[n])<<12|(63&i[n+1])<<6|63&i[n+2])>=2048&&55296!=(63488&s)){t.push(String.fromCharCode(65535&s)),n+=3;continue}}else if(i[n]<248){var s;if(h(i,n,3))if((s=(7&i[n])<<18|(63&i[n+1])<<12|(63&i[n+2])<<6|63&i[n+3])>65536&&s<1114112){s-=65536,t.push(String.fromCharCode(s>>>10|55296)),t.push(String.fromCharCode(1023&s|56320)),n+=4;continue}}t.push(String.fromCharCode(65533)),++n}return t.join("")},_=i(3),l=(d=new ArrayBuffer(2),new DataView(d).setInt16(0,256,!0),256===new Int16Array(d)[0]),c=function(){function e(){}return e.parseScriptData=function(t,i,n){var r={};try{var a=e.parseValue(t,i,n),o=e.parseValue(t,i+a.size,n-a.size);r[a.data]=o.data}catch(e){s.a.e("AMF",e.toString())}return r},e.parseObject=function(t,i,n){if(n<3)throw new _.a("Data not enough when parse ScriptDataObject");var r=e.parseString(t,i,n),s=e.parseValue(t,i+r.size,n-r.size),a=s.objectEnd;return{data:{name:r.data,value:s.data},size:r.size+s.size,objectEnd:a}},e.parseVariable=function(t,i,n){return e.parseObject(t,i,n)},e.parseString=function(e,t,i){if(i<2)throw new _.a("Data not enough when parse String");var n=new DataView(e,t,i).getUint16(0,!l);return{data:n>0?u(new Uint8Array(e,t+2,n)):"",size:2+n}},e.parseLongString=function(e,t,i){if(i<4)throw new _.a("Data not enough when parse LongString");var n=new DataView(e,t,i).getUint32(0,!l);return{data:n>0?u(new Uint8Array(e,t+4,n)):"",size:4+n}},e.parseDate=function(e,t,i){if(i<10)throw new _.a("Data size invalid when parse Date");var n=new DataView(e,t,i),r=n.getFloat64(0,!l),s=n.getInt16(8,!l);return{data:new Date(r+=60*s*1e3),size:10}},e.parseValue=function(t,i,n){if(n<1)throw new _.a("Data not enough when parse Value");var r,a=new DataView(t,i,n),o=1,h=a.getUint8(0),d=!1;try{switch(h){case 0:r=a.getFloat64(1,!l),o+=8;break;case 1:r=!!a.getUint8(1),o+=1;break;case 2:var u=e.parseString(t,i+1,n-1);r=u.data,o+=u.size;break;case 3:r={};var c=0;for(9==(16777215&a.getUint32(n-4,!l))&&(c=3);o<n-4;){var f=e.parseObject(t,i+o,n-o-c);if(f.objectEnd)break;r[f.data.name]=f.data.value,o+=f.size}if(o<=n-3)9===(16777215&a.getUint32(o-1,!l))&&(o+=3);break;case 8:r={},o+=4;c=0;for(9==(16777215&a.getUint32(n-4,!l))&&(c=3);o<n-8;){var p=e.parseVariable(t,i+o,n-o-c);if(p.objectEnd)break;r[p.data.name]=p.data.value,o+=p.size}if(o<=n-3)9===(16777215&a.getUint32(o-1,!l))&&(o+=3);break;case 9:r=void 0,o=1,d=!0;break;case 10:r=[];var m=a.getUint32(1,!l);o+=4;for(var g=0;g<m;g++){var v=e.parseValue(t,i+o,n-o);r.push(v.data),o+=v.size}break;case 11:var y=e.parseDate(t,i+1,n-1);r=y.data,o+=y.size;break;case 12:var b=e.parseString(t,i+1,n-1);r=b.data,o+=b.size;break;default:o=n,s.a.w("AMF","Unsupported AMF value type "+h)}}catch(e){s.a.e("AMF",e.toString())}return{data:r,size:o,objectEnd:d}},e}(),f=function(){function e(e){this.TAG="ExpGolomb",this._buffer=e,this._buffer_index=0,this._total_bytes=e.byteLength,this._total_bits=8*e.byteLength,this._current_word=0,this._current_word_bits_left=0}return e.prototype.destroy=function(){this._buffer=null},e.prototype._fillCurrentWord=function(){var e=this._total_bytes-this._buffer_index;if(e<=0)throw new _.a("ExpGolomb: _fillCurrentWord() but no bytes available");var t=Math.min(4,e),i=new Uint8Array(4);i.set(this._buffer.subarray(this._buffer_index,this._buffer_index+t)),this._current_word=new DataView(i.buffer).getUint32(0,!1),this._buffer_index+=t,this._current_word_bits_left=8*t},e.prototype.readBits=function(e){if(e>32)throw new _.b("ExpGolomb: readBits() bits exceeded max 32bits!");if(e<=this._current_word_bits_left){var t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}var i=this._current_word_bits_left?this._current_word:0;i>>>=32-this._current_word_bits_left;var n=e-this._current_word_bits_left;this._fillCurrentWord();var r=Math.min(n,this._current_word_bits_left),s=this._current_word>>>32-r;return this._current_word<<=r,this._current_word_bits_left-=r,i=i<<r|s},e.prototype.readBool=function(){return 1===this.readBits(1)},e.prototype.readByte=function(){return this.readBits(8)},e.prototype._skipLeadingZero=function(){var e;for(e=0;e<this._current_word_bits_left;e++)if(0!=(this._current_word&2147483648>>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()},e.prototype.readUEG=function(){var e=this._skipLeadingZero();return this.readBits(e+1)-1},e.prototype.readSEG=function(){var e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)},e}(),p=function(){function e(){}return e._ebsp2rbsp=function(e){for(var t=e,i=t.byteLength,n=new Uint8Array(i),r=0,s=0;s<i;s++)s>=2&&3===t[s]&&0===t[s-1]&&0===t[s-2]||(n[r]=t[s],r++);return new Uint8Array(n.buffer,0,r)},e.parseSPS=function(t){for(var i=t.subarray(1,4),n="avc1.",r=0;r<3;r++){var s=i[r].toString(16);s.length<2&&(s="0"+s),n+=s}var a=e._ebsp2rbsp(t),o=new f(a);o.readByte();var h=o.readByte();o.readByte();var d=o.readByte();o.readUEG();var u=e.getProfileString(h),_=e.getLevelString(d),l=1,c=420,p=8,m=8;if((100===h||110===h||122===h||244===h||44===h||83===h||86===h||118===h||128===h||138===h||144===h)&&(3===(l=o.readUEG())&&o.readBits(1),l<=3&&(c=[0,420,422,444][l]),p=o.readUEG()+8,m=o.readUEG()+8,o.readBits(1),o.readBool()))for(var g=3!==l?8:12,v=0;v<g;v++)o.readBool()&&(v<6?e._skipScalingList(o,16):e._skipScalingList(o,64));o.readUEG();var y=o.readUEG();if(0===y)o.readUEG();else if(1===y){o.readBits(1),o.readSEG(),o.readSEG();var b=o.readUEG();for(v=0;v<b;v++)o.readSEG()}var E=o.readUEG();o.readBits(1);var S=o.readUEG(),A=o.readUEG(),R=o.readBits(1);0===R&&o.readBits(1),o.readBits(1);var L=0,T=0,w=0,D=0;o.readBool()&&(L=o.readUEG(),T=o.readUEG(),w=o.readUEG(),D=o.readUEG());var k=1,C=1,I=0,O=!0,P=0,M=0;if(o.readBool()){if(o.readBool()){var x=o.readByte();x>0&&x<16?(k=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][x-1],C=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][x-1]):255===x&&(k=o.readByte()<<8|o.readByte(),C=o.readByte()<<8|o.readByte())}if(o.readBool()&&o.readBool(),o.readBool()&&(o.readBits(4),o.readBool()&&o.readBits(24)),o.readBool()&&(o.readUEG(),o.readUEG()),o.readBool()){var B=o.readBits(32),U=o.readBits(32);O=o.readBool(),I=(P=U)/(M=2*B)}}var N=1;1===k&&1===C||(N=k/C);var F=0,G=0;0===l?(F=1,G=2-R):(F=3===l?1:2,G=(1===l?2:1)*(2-R));var V=16*(S+1),j=16*(A+1)*(2-R);V-=(L+T)*F,j-=(w+D)*G;var z=Math.ceil(V*N);return o.destroy(),o=null,{codec_mimetype:n,profile_idc:h,level_idc:d,profile_string:u,level_string:_,chroma_format_idc:l,bit_depth:p,bit_depth_luma:p,bit_depth_chroma:m,ref_frames:E,chroma_format:c,chroma_format_string:e.getChromaFormatString(c),frame_rate:{fixed:O,fps:I,fps_den:M,fps_num:P},sar_ratio:{width:k,height:C},codec_size:{width:V,height:j},present_size:{width:z,height:j}}},e._skipScalingList=function(e,t){for(var i=8,n=8,r=0;r<t;r++)0!==n&&(n=(i+e.readSEG()+256)%256),i=0===n?i:n},e.getProfileString=function(e){switch(e){case 66:return"Baseline";case 77:return"Main";case 88:return"Extended";case 100:return"High";case 110:return"High10";case 122:return"High422";case 244:return"High444";default:return"Unknown"}},e.getLevelString=function(e){return(e/10).toFixed(1)},e.getChromaFormatString=function(e){switch(e){case 420:return"4:2:0";case 422:return"4:2:2";case 444:return"4:4:4";default:return"Unknown"}},e}(),m=i(5);var g,v=function(){function e(e,t){this.TAG="FLVDemuxer",this._config=t,this._onError=null,this._onMediaInfo=null,this._onMetaDataArrived=null,this._onScriptDataArrived=null,this._onTrackMetadata=null,this._onDataAvailable=null,this._dataOffset=e.dataOffset,this._firstParse=!0,this._dispatch=!1,this._hasAudio=e.hasAudioTrack,this._hasVideo=e.hasVideoTrack,this._hasAudioFlagOverrided=!1,this._hasVideoFlagOverrided=!1,this._audioInitialMetadataDispatched=!1,this._videoInitialMetadataDispatched=!1,this._mediaInfo=new o.a,this._mediaInfo.hasAudio=this._hasAudio,this._mediaInfo.hasVideo=this._hasVideo,this._metadata=null,this._audioMetadata=null,this._videoMetadata=null,this._naluLengthSize=4,this._timestampBase=0,this._timescale=1e3,this._duration=0,this._durationOverrided=!1,this._referenceFrameRate={fixed:!0,fps:23.976,fps_num:23976,fps_den:1e3},this._flvSoundRateTable=[5500,11025,22050,44100,48e3],this._mpegSamplingRates=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],this._mpegAudioV10SampleRateTable=[44100,48e3,32e3,0],this._mpegAudioV20SampleRateTable=[22050,24e3,16e3,0],this._mpegAudioV25SampleRateTable=[11025,12e3,8e3,0],this._mpegAudioL1BitRateTable=[0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1],this._mpegAudioL2BitRateTable=[0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1],this._mpegAudioL3BitRateTable=[0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1],this._videoTrack={type:"video",id:1,sequenceNumber:0,samples:[],length:0},this._audioTrack={type:"audio",id:2,sequenceNumber:0,samples:[],length:0},this._littleEndian=function(){var e=new ArrayBuffer(2);return new DataView(e).setInt16(0,256,!0),256===new Int16Array(e)[0]}()}return e.prototype.destroy=function(){this._mediaInfo=null,this._metadata=null,this._audioMetadata=null,this._videoMetadata=null,this._videoTrack=null,this._audioTrack=null,this._onError=null,this._onMediaInfo=null,this._onMetaDataArrived=null,this._onScriptDataArrived=null,this._onTrackMetadata=null,this._onDataAvailable=null},e.probe=function(e){var t=new Uint8Array(e),i={match:!1};if(70!==t[0]||76!==t[1]||86!==t[2]||1!==t[3])return i;var n,r,s=(4&t[4])>>>2!=0,a=0!=(1&t[4]),o=(n=t)[r=5]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3];return o<9?i:{match:!0,consumed:o,dataOffset:o,hasAudioTrack:s,hasVideoTrack:a}},e.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},Object.defineProperty(e.prototype,"onTrackMetadata",{get:function(){return this._onTrackMetadata},set:function(e){this._onTrackMetadata=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaInfo",{get:function(){return this._onMediaInfo},set:function(e){this._onMediaInfo=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMetaDataArrived",{get:function(){return this._onMetaDataArrived},set:function(e){this._onMetaDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onScriptDataArrived",{get:function(){return this._onScriptDataArrived},set:function(e){this._onScriptDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataAvailable",{get:function(){return this._onDataAvailable},set:function(e){this._onDataAvailable=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"timestampBase",{get:function(){return this._timestampBase},set:function(e){this._timestampBase=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedDuration",{get:function(){return this._duration},set:function(e){this._durationOverrided=!0,this._duration=e,this._mediaInfo.duration=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasAudio",{set:function(e){this._hasAudioFlagOverrided=!0,this._hasAudio=e,this._mediaInfo.hasAudio=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasVideo",{set:function(e){this._hasVideoFlagOverrided=!0,this._hasVideo=e,this._mediaInfo.hasVideo=e},enumerable:!1,configurable:!0}),e.prototype.resetMediaInfo=function(){this._mediaInfo=new o.a},e.prototype._isInitialMetadataDispatched=function(){return this._hasAudio&&this._hasVideo?this._audioInitialMetadataDispatched&&this._videoInitialMetadataDispatched:this._hasAudio&&!this._hasVideo?this._audioInitialMetadataDispatched:!(this._hasAudio||!this._hasVideo)&&this._videoInitialMetadataDispatched},e.prototype.parseChunks=function(t,i){if(!(this._onError&&this._onMediaInfo&&this._onTrackMetadata&&this._onDataAvailable))throw new _.a("Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var n=0,r=this._littleEndian;if(0===i){if(!(t.byteLength>13))return 0;n=e.probe(t).dataOffset}this._firstParse&&(this._firstParse=!1,i+n!==this._dataOffset&&s.a.w(this.TAG,"First time parsing but chunk byteStart invalid!"),0!==(a=new DataView(t,n)).getUint32(0,!r)&&s.a.w(this.TAG,"PrevTagSize0 !== 0 !!!"),n+=4);for(;n<t.byteLength;){this._dispatch=!0;var a=new DataView(t,n);if(n+11+4>t.byteLength)break;var o=a.getUint8(0),h=16777215&a.getUint32(0,!r);if(n+11+h+4>t.byteLength)break;if(8===o||9===o||18===o){var d=a.getUint8(4),u=a.getUint8(5),l=a.getUint8(6)|u<<8|d<<16|a.getUint8(7)<<24;0!==(16777215&a.getUint32(7,!r))&&s.a.w(this.TAG,"Meet tag which has StreamID != 0!");var c=n+11;switch(o){case 8:this._parseAudioData(t,c,h,l);break;case 9:this._parseVideoData(t,c,h,l,i+n);break;case 18:this._parseScriptData(t,c,h)}var f=a.getUint32(11+h,!r);f!==11+h&&s.a.w(this.TAG,"Invalid PrevTagSize "+f),n+=11+h+4}else s.a.w(this.TAG,"Unsupported tag type "+o+", skipped"),n+=11+h+4}return this._isInitialMetadataDispatched()&&this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack),n},e.prototype._parseScriptData=function(e,t,i){var n=c.parseScriptData(e,t,i);if(n.hasOwnProperty("onMetaData")){if(null==n.onMetaData||"object"!=typeof n.onMetaData)return void s.a.w(this.TAG,"Invalid onMetaData structure!");this._metadata&&s.a.w(this.TAG,"Found another onMetaData tag!"),this._metadata=n;var r=this._metadata.onMetaData;if(this._onMetaDataArrived&&this._onMetaDataArrived(Object.assign({},r)),"boolean"==typeof r.hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=r.hasAudio,this._mediaInfo.hasAudio=this._hasAudio),"boolean"==typeof r.hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=r.hasVideo,this._mediaInfo.hasVideo=this._hasVideo),"number"==typeof r.audiodatarate&&(this._mediaInfo.audioDataRate=r.audiodatarate),"number"==typeof r.videodatarate&&(this._mediaInfo.videoDataRate=r.videodatarate),"number"==typeof r.width&&(this._mediaInfo.width=r.width),"number"==typeof r.height&&(this._mediaInfo.height=r.height),"number"==typeof r.duration){if(!this._durationOverrided){var a=Math.floor(r.duration*this._timescale);this._duration=a,this._mediaInfo.duration=a}}else this._mediaInfo.duration=0;if("number"==typeof r.framerate){var o=Math.floor(1e3*r.framerate);if(o>0){var h=o/1e3;this._referenceFrameRate.fixed=!0,this._referenceFrameRate.fps=h,this._referenceFrameRate.fps_num=o,this._referenceFrameRate.fps_den=1e3,this._mediaInfo.fps=h}}if("object"==typeof r.keyframes){this._mediaInfo.hasKeyframesIndex=!0;var d=r.keyframes;this._mediaInfo.keyframesIndex=this._parseKeyframesIndex(d),r.keyframes=null}else this._mediaInfo.hasKeyframesIndex=!1;this._dispatch=!1,this._mediaInfo.metadata=r,s.a.v(this.TAG,"Parsed onMetaData"),this._mediaInfo.isComplete()&&this._onMediaInfo(this._mediaInfo)}Object.keys(n).length>0&&this._onScriptDataArrived&&this._onScriptDataArrived(Object.assign({},n))},e.prototype._parseKeyframesIndex=function(e){for(var t=[],i=[],n=1;n<e.times.length;n++){var r=this._timestampBase+Math.floor(1e3*e.times[n]);t.push(r),i.push(e.filepositions[n])}return{times:t,filepositions:i}},e.prototype._parseAudioData=function(e,t,i,n){if(i<=1)s.a.w(this.TAG,"Flv: Invalid audio packet, missing SoundData payload!");else if(!0!==this._hasAudioFlagOverrided||!1!==this._hasAudio){this._littleEndian;var r=new DataView(e,t,i).getUint8(0),a=r>>>4;if(2===a||10===a){var o=0,h=(12&r)>>>2;if(h>=0&&h<=4){o=this._flvSoundRateTable[h];var d=1&r,u=this._audioMetadata,_=this._audioTrack;if(u||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(u=this._audioMetadata={}).type="audio",u.id=_.id,u.timescale=this._timescale,u.duration=this._duration,u.audioSampleRate=o,u.channelCount=0===d?1:2),10===a){var l=this._parseAACAudioData(e,t+1,i-1);if(null==l)return;if(0===l.packetType){u.config&&s.a.w(this.TAG,"Found another AudioSpecificConfig!");var c=l.data;u.audioSampleRate=c.samplingRate,u.channelCount=c.channelCount,u.codec=c.codec,u.originalCodec=c.originalCodec,u.config=c.config,u.refSampleDuration=1024/u.audioSampleRate*u.timescale,s.a.v(this.TAG,"Parsed AudioSpecificConfig"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",u),(g=this._mediaInfo).audioCodec=u.originalCodec,g.audioSampleRate=u.audioSampleRate,g.audioChannelCount=u.channelCount,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}else if(1===l.packetType){var f=this._timestampBase+n,p={unit:l.data,length:l.data.byteLength,dts:f,pts:f};_.samples.push(p),_.length+=l.data.length}else s.a.e(this.TAG,"Flv: Unsupported AAC data type "+l.packetType)}else if(2===a){if(!u.codec){var g;if(null==(c=this._parseMP3AudioData(e,t+1,i-1,!0)))return;u.audioSampleRate=c.samplingRate,u.channelCount=c.channelCount,u.codec=c.codec,u.originalCodec=c.originalCodec,u.refSampleDuration=1152/u.audioSampleRate*u.timescale,s.a.v(this.TAG,"Parsed MPEG Audio Frame Header"),this._audioInitialMetadataDispatched=!0,this._onTrackMetadata("audio",u),(g=this._mediaInfo).audioCodec=u.codec,g.audioSampleRate=u.audioSampleRate,g.audioChannelCount=u.channelCount,g.audioDataRate=c.bitRate,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}var v=this._parseMP3AudioData(e,t+1,i-1,!1);if(null==v)return;f=this._timestampBase+n;var y={unit:v,length:v.byteLength,dts:f,pts:f};_.samples.push(y),_.length+=v.length}}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid audio sample rate idx: "+h)}else this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported audio codec idx: "+a)}},e.prototype._parseAACAudioData=function(e,t,i){if(!(i<=1)){var n={},r=new Uint8Array(e,t,i);return n.packetType=r[0],0===r[0]?n.data=this._parseAACAudioSpecificConfig(e,t+1,i-1):n.data=r.subarray(1),n}s.a.w(this.TAG,"Flv: Invalid AAC packet, missing AACPacketType or/and Data!")},e.prototype._parseAACAudioSpecificConfig=function(e,t,i){var n,r,s=new Uint8Array(e,t,i),a=null,o=0,h=null;if(o=n=s[0]>>>3,(r=(7&s[0])<<1|s[1]>>>7)<0||r>=this._mpegSamplingRates.length)this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid sampling frequency index!");else{var d=this._mpegSamplingRates[r],u=(120&s[1])>>>3;if(!(u<0||u>=8)){5===o&&(h=(7&s[1])<<1|s[2]>>>7,(124&s[2])>>>2);var _=self.navigator.userAgent.toLowerCase();return-1!==_.indexOf("firefox")?r>=6?(o=5,a=new Array(4),h=r-3):(o=2,a=new Array(2),h=r):-1!==_.indexOf("android")?(o=2,a=new Array(2),h=r):(o=5,h=r,a=new Array(4),r>=6?h=r-3:1===u&&(o=2,a=new Array(2),h=r)),a[0]=o<<3,a[0]|=(15&r)>>>1,a[1]=(15&r)<<7,a[1]|=(15&u)<<3,5===o&&(a[1]|=(15&h)>>>1,a[2]=(1&h)<<7,a[2]|=8,a[3]=0),{config:a,samplingRate:d,channelCount:u,codec:"mp4a.40."+o,originalCodec:"mp4a.40."+n}}this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid channel configuration")}},e.prototype._parseMP3AudioData=function(e,t,i,n){if(!(i<4)){this._littleEndian;var r=new Uint8Array(e,t,i),a=null;if(n){if(255!==r[0])return;var o=r[1]>>>3&3,h=(6&r[1])>>1,d=(240&r[2])>>>4,u=(12&r[2])>>>2,_=3!==(r[3]>>>6&3)?2:1,l=0,c=0;switch(o){case 0:l=this._mpegAudioV25SampleRateTable[u];break;case 2:l=this._mpegAudioV20SampleRateTable[u];break;case 3:l=this._mpegAudioV10SampleRateTable[u]}switch(h){case 1:34,d<this._mpegAudioL3BitRateTable.length&&(c=this._mpegAudioL3BitRateTable[d]);break;case 2:33,d<this._mpegAudioL2BitRateTable.length&&(c=this._mpegAudioL2BitRateTable[d]);break;case 3:32,d<this._mpegAudioL1BitRateTable.length&&(c=this._mpegAudioL1BitRateTable[d])}a={bitRate:c,samplingRate:l,channelCount:_,codec:"mp3",originalCodec:"mp3"}}else a=r;return a}s.a.w(this.TAG,"Flv: Invalid MP3 packet, header missing!")},e.prototype._parseVideoData=function(e,t,i,n,r){if(i<=1)s.a.w(this.TAG,"Flv: Invalid video packet, missing VideoData payload!");else if(!0!==this._hasVideoFlagOverrided||!1!==this._hasVideo){var a=new Uint8Array(e,t,i)[0],o=(240&a)>>>4,h=15&a;7===h?this._parseAVCVideoPacket(e,t+1,i-1,n,r,o):this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: "+h)}},e.prototype._parseAVCVideoPacket=function(e,t,i,n,r,a){if(i<4)s.a.w(this.TAG,"Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime");else{var o=this._littleEndian,h=new DataView(e,t,i),d=h.getUint8(0),u=(16777215&h.getUint32(0,!o))<<8>>8;if(0===d)this._parseAVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===d)this._parseAVCVideoData(e,t+4,i-4,n,r,a,u);else if(2!==d)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+d)}},e.prototype._parseAVCDecoderConfigurationRecord=function(e,t,i){if(i<7)s.a.w(this.TAG,"Flv: Invalid AVCDecoderConfigurationRecord, lack of data!");else{var n=this._videoMetadata,r=this._videoTrack,a=this._littleEndian,o=new DataView(e,t,i);n?void 0!==n.avcc&&s.a.w(this.TAG,"Found another AVCDecoderConfigurationRecord!"):(!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(n=this._videoMetadata={}).type="video",n.id=r.id,n.timescale=this._timescale,n.duration=this._duration);var h=o.getUint8(0),d=o.getUint8(1);o.getUint8(2),o.getUint8(3);if(1===h&&0!==d)if(this._naluLengthSize=1+(3&o.getUint8(4)),3===this._naluLengthSize||4===this._naluLengthSize){var u=31&o.getUint8(5);if(0!==u){u>1&&s.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: SPS Count = "+u);for(var _=6,l=0;l<u;l++){var c=o.getUint16(_,!a);if(_+=2,0!==c){var f=new Uint8Array(e,t+_,c);_+=c;var g=p.parseSPS(f);if(0===l){n.codecWidth=g.codec_size.width,n.codecHeight=g.codec_size.height,n.presentWidth=g.present_size.width,n.presentHeight=g.present_size.height,n.profile=g.profile_string,n.level=g.level_string,n.bitDepth=g.bit_depth,n.chromaFormat=g.chroma_format,n.sarRatio=g.sar_ratio,n.frameRate=g.frame_rate,!1!==g.frame_rate.fixed&&0!==g.frame_rate.fps_num&&0!==g.frame_rate.fps_den||(n.frameRate=this._referenceFrameRate);var v=n.frameRate.fps_den,y=n.frameRate.fps_num;n.refSampleDuration=n.timescale*(v/y);for(var b=f.subarray(1,4),E="avc1.",S=0;S<3;S++){var A=b[S].toString(16);A.length<2&&(A="0"+A),E+=A}n.codec=E;var R=this._mediaInfo;R.width=n.codecWidth,R.height=n.codecHeight,R.fps=n.frameRate.fps,R.profile=n.profile,R.level=n.level,R.refFrames=g.ref_frames,R.chromaFormat=g.chroma_format_string,R.sarNum=n.sarRatio.width,R.sarDen=n.sarRatio.height,R.videoCodec=E,R.hasAudio?null!=R.audioCodec&&(R.mimeType='video/x-flv; codecs="'+R.videoCodec+","+R.audioCodec+'"'):R.mimeType='video/x-flv; codecs="'+R.videoCodec+'"',R.isComplete()&&this._onMediaInfo(R)}}}var L=o.getUint8(_);if(0!==L){L>1&&s.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: PPS Count = "+L),_++;for(l=0;l<L;l++){c=o.getUint16(_,!a);_+=2,0!==c&&(_+=c)}n.avcc=new Uint8Array(i),n.avcc.set(new Uint8Array(e,t,i),0),s.a.v(this.TAG,"Parsed AVCDecoderConfigurationRecord"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._videoInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("video",n)}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord: No PPS")}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord: No SPS")}else this._onError(m.a.FORMAT_ERROR,"Flv: Strange NaluLengthSizeMinusOne: "+(this._naluLengthSize-1));else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord")}},e.prototype._parseAVCVideoData=function(e,t,i,n,r,a,o){for(var h=this._littleEndian,d=new DataView(e,t,i),u=[],_=0,l=0,c=this._naluLengthSize,f=this._timestampBase+n,p=1===a;l<i;){if(l+4>=i){s.a.w(this.TAG,"Malformed Nalu near timestamp "+f+", offset = "+l+", dataSize = "+i);break}var m=d.getUint32(l,!h);if(3===c&&(m>>>=8),m>i-c)return void s.a.w(this.TAG,"Malformed Nalus near timestamp "+f+", NaluSize > DataSize!");var g=31&d.getUint8(l+c);5===g&&(p=!0);var v=new Uint8Array(e,t+l,c+m),y={type:g,data:v};u.push(y),_+=v.byteLength,l+=c+m}if(u.length){var b=this._videoTrack,E={units:u,length:_,isKeyframe:p,dts:f,cts:o,pts:f+o};p&&(E.fileposition=r),b.samples.push(E),b.length+=_}},e}(),y=function(){function e(){}return e.prototype.destroy=function(){this.onError=null,this.onMediaInfo=null,this.onMetaDataArrived=null,this.onTrackMetadata=null,this.onDataAvailable=null,this.onTimedID3Metadata=null,this.onPESPrivateData=null,this.onPESPrivateDataDescriptor=null},e}(),b=function(){this.program_pmt_pid={}};!function(e){e[e.kMPEG1Audio=3]="kMPEG1Audio",e[e.kMPEG2Audio=4]="kMPEG2Audio",e[e.kPESPrivateData=6]="kPESPrivateData",e[e.kADTSAAC=15]="kADTSAAC",e[e.kID3=21]="kID3",e[e.kH264=27]="kH264",e[e.kH265=36]="kH265"}(g||(g={}));var E,S=function(){this.pid_stream_type={},this.common_pids={h264:void 0,adts_aac:void 0},this.pes_private_data_pids={},this.timed_id3_pids={}},A=function(){},R=function(){},L=function(){this.slices=[],this.total_length=0,this.expected_length=0,this.file_position=0};!function(e){e[e.kUnspecified=0]="kUnspecified",e[e.kSliceNonIDR=1]="kSliceNonIDR",e[e.kSliceDPA=2]="kSliceDPA",e[e.kSliceDPB=3]="kSliceDPB",e[e.kSliceDPC=4]="kSliceDPC",e[e.kSliceIDR=5]="kSliceIDR",e[e.kSliceSEI=6]="kSliceSEI",e[e.kSliceSPS=7]="kSliceSPS",e[e.kSlicePPS=8]="kSlicePPS",e[e.kSliceAUD=9]="kSliceAUD",e[e.kEndOfSequence=10]="kEndOfSequence",e[e.kEndOfStream=11]="kEndOfStream",e[e.kFiller=12]="kFiller",e[e.kSPSExt=13]="kSPSExt",e[e.kReserved0=14]="kReserved0"}(E||(E={}));var T,w,D=function(){},k=function(e){var t=e.data.byteLength;this.type=e.type,this.data=new Uint8Array(4+t),new DataView(this.data.buffer).setUint32(0,t),this.data.set(e.data,4)},C=function(){function e(e){this.TAG="H264AnnexBParser",this.current_startcode_offset_=0,this.eof_flag_=!1,this.data_=e,this.current_startcode_offset_=this.findNextStartCodeOffset(0),this.eof_flag_&&s.a.e(this.TAG,"Could not found H264 startcode until payload end!")}return e.prototype.findNextStartCodeOffset=function(e){for(var t=e,i=this.data_;;){if(t+3>=i.byteLength)return this.eof_flag_=!0,i.byteLength;var n=i[t+0]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3],r=i[t+0]<<16|i[t+1]<<8|i[t+2];if(1===n||1===r)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_startcode_offset_,n=31&e[i+=1===(e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3])?4:3],r=(128&e[i])>>>7,s=this.findNextStartCodeOffset(i);if(this.current_startcode_offset_=s,!(n>=E.kReserved0)&&0===r){var a=e.subarray(i,s);(t=new D).type=n,t.data=a}}return t},e}(),I=function(){function e(e,t,i){var n=8+e.byteLength+1+2+t.byteLength,r=!1;66!==e[3]&&77!==e[3]&&88!==e[3]&&(r=!0,n+=4);var s=this.data=new Uint8Array(n);s[0]=1,s[1]=e[1],s[2]=e[2],s[3]=e[3],s[4]=255,s[5]=225;var a=e.byteLength;s[6]=a>>>8,s[7]=255&a;var o=8;s.set(e,8),s[o+=a]=1;var h=t.byteLength;s[o+1]=h>>>8,s[o+2]=255&h,s.set(t,o+3),o+=3+h,r&&(s[o]=252|i.chroma_format_idc,s[o+1]=248|i.bit_depth_luma-8,s[o+2]=248|i.bit_depth_chroma-8,s[o+3]=0,o+=4)}return e.prototype.getData=function(){return this.data},e}();!function(e){e[e.kNull=0]="kNull",e[e.kAACMain=1]="kAACMain",e[e.kAAC_LC=2]="kAAC_LC",e[e.kAAC_SSR=3]="kAAC_SSR",e[e.kAAC_LTP=4]="kAAC_LTP",e[e.kAAC_SBR=5]="kAAC_SBR",e[e.kAAC_Scalable=6]="kAAC_Scalable",e[e.kLayer1=32]="kLayer1",e[e.kLayer2=33]="kLayer2",e[e.kLayer3=34]="kLayer3"}(T||(T={})),function(e){e[e.k96000Hz=0]="k96000Hz",e[e.k88200Hz=1]="k88200Hz",e[e.k64000Hz=2]="k64000Hz",e[e.k48000Hz=3]="k48000Hz",e[e.k44100Hz=4]="k44100Hz",e[e.k32000Hz=5]="k32000Hz",e[e.k24000Hz=6]="k24000Hz",e[e.k22050Hz=7]="k22050Hz",e[e.k16000Hz=8]="k16000Hz",e[e.k12000Hz=9]="k12000Hz",e[e.k11025Hz=10]="k11025Hz",e[e.k8000Hz=11]="k8000Hz",e[e.k7350Hz=12]="k7350Hz"}(w||(w={}));var O,P=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],M=function(){},x=function(){function e(e){this.TAG="AACADTSParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&s.a.e(this.TAG,"Could not found ADTS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+7>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(4095===(i[t+0]<<8|i[t+1])>>>4)return t;t++}},e.prototype.readNextAACFrame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_syncword_offset_,n=(8&e[i+1])>>>3,r=(6&e[i+1])>>>1,s=1&e[i+1],a=(192&e[i+2])>>>6,o=(60&e[i+2])>>>2,h=(1&e[i+2])<<2|(192&e[i+3])>>>6,d=(3&e[i+3])<<11|e[i+4]<<3|(224&e[i+5])>>>5;e[i+6];if(i+d>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var u=1===s?7:9,_=d-u;i+=u;var l=this.findNextSyncwordOffset(i+_);if(this.current_syncword_offset_=l,(0===n||1===n)&&0===r){var c=e.subarray(i,i+_);(t=new M).audio_object_type=a+1,t.sampling_freq_index=o,t.sampling_frequency=P[o],t.channel_config=h,t.data=c}}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),B=function(e){var t=null,i=e.audio_object_type,n=e.audio_object_type,r=e.sampling_freq_index,s=e.channel_config,a=0,o=navigator.userAgent.toLowerCase();-1!==o.indexOf("firefox")?r>=6?(n=5,t=new Array(4),a=r-3):(n=2,t=new Array(2),a=r):-1!==o.indexOf("android")?(n=2,t=new Array(2),a=r):(n=5,a=r,t=new Array(4),r>=6?a=r-3:1===s&&(n=2,t=new Array(2),a=r)),t[0]=n<<3,t[0]|=(15&r)>>>1,t[1]=(15&r)<<7,t[1]|=(15&s)<<3,5===n&&(t[1]|=(15&a)>>>1,t[2]=(1&a)<<7,t[2]|=8,t[3]=0),this.config=t,this.sampling_rate=P[r],this.channel_count=s,this.codec_mimetype="mp4a.40."+n,this.original_codec_mimetype="mp4a.40."+i},U=function(){},N=function(){},F=(O=function(e,t){return(O=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}O(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),G=function(e){function t(t,i){var n=e.call(this)||this;return n.TAG="TSDemuxer",n.first_parse_=!0,n.media_info_=new o.a,n.timescale_=90,n.duration_=0,n.current_pmt_pid_=-1,n.program_pmt_map_={},n.pes_slice_queues_={},n.section_slice_queues_={},n.video_metadata_={sps:void 0,pps:void 0,sps_details:void 0},n.audio_metadata_={audio_object_type:void 0,sampling_freq_index:void 0,sampling_frequency:void 0,channel_config:void 0},n.aac_last_sample_pts_=void 0,n.aac_last_incomplete_data_=null,n.has_video_=!1,n.has_audio_=!1,n.video_init_segment_dispatched_=!1,n.audio_init_segment_dispatched_=!1,n.video_metadata_changed_=!1,n.audio_metadata_changed_=!1,n.video_track_={type:"video",id:1,sequenceNumber:0,samples:[],length:0},n.audio_track_={type:"audio",id:2,sequenceNumber:0,samples:[],length:0},n.ts_packet_size_=t.ts_packet_size,n.sync_offset_=t.sync_offset,n.config_=i,n}return F(t,e),t.prototype.destroy=function(){this.media_info_=null,this.pes_slice_queues_=null,this.section_slice_queues_=null,this.video_metadata_=null,this.audio_metadata_=null,this.aac_last_incomplete_data_=null,this.video_track_=null,this.audio_track_=null,e.prototype.destroy.call(this)},t.probe=function(e){var t=new Uint8Array(e),i=-1,n=188;if(t.byteLength<=3*n)return s.a.e("TSDemuxer","Probe data "+t.byteLength+" bytes is too few for judging MPEG-TS stream format!"),{match:!1};for(;-1===i;){for(var r=Math.min(1e3,t.byteLength-3*n),a=0;a<r;){if(71===t[a]&&71===t[a+n]&&71===t[a+2*n]){i=a;break}a++}if(-1===i)if(188===n)n=192;else{if(192!==n)break;n=204}}return-1===i?{match:!1}:(192===n&&i>=4?(s.a.v("TSDemuxer","ts_packet_size = 192, m2ts mode"),i-=4):204===n&&s.a.v("TSDemuxer","ts_packet_size = 204, RS encoded MPEG2-TS stream"),{match:!0,consumed:0,ts_packet_size:n,sync_offset:i})},t.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},t.prototype.resetMediaInfo=function(){this.media_info_=new o.a},t.prototype.parseChunks=function(e,t){if(!(this.onError&&this.onMediaInfo&&this.onTrackMetadata&&this.onDataAvailable))throw new _.a("onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var i=0;for(this.first_parse_&&(this.first_parse_=!1,i=this.sync_offset_);i+this.ts_packet_size_<=e.byteLength;){var n=t+i;192===this.ts_packet_size_&&(i+=4);var r=new Uint8Array(e,i,188),a=r[0];if(71!==a){s.a.e(this.TAG,"sync_byte = "+a+", not 0x47");break}var o=(64&r[1])>>>6,h=(r[1],(31&r[1])<<8|r[2]),d=(48&r[3])>>>4,u=15&r[3],l={},c=4;if(2==d||3==d){var f=r[4];if(5+f===188){i+=188,204===this.ts_packet_size_&&(i+=16);continue}f>0&&(l=this.parseAdaptationField(e,i+4,1+f)),c=5+f}if(1==d||3==d)if(0===h||h===this.current_pmt_pid_){var p=188-c;this.handleSectionSlice(e,i+c,p,{pid:h,file_position:n,payload_unit_start_indicator:o,continuity_conunter:u,random_access_indicator:l.random_access_indicator})}else if(null!=this.pmt_&&null!=this.pmt_.pid_stream_type[h]){p=188-c;var m=this.pmt_.pid_stream_type[h];h!==this.pmt_.common_pids.h264&&h!==this.pmt_.common_pids.adts_aac&&!0!==this.pmt_.pes_private_data_pids[h]&&!0!==this.pmt_.timed_id3_pids[h]||this.handlePESSlice(e,i+c,p,{pid:h,stream_type:m,file_position:n,payload_unit_start_indicator:o,continuity_conunter:u,random_access_indicator:l.random_access_indicator})}i+=188,204===this.ts_packet_size_&&(i+=16)}return this.dispatchAudioVideoMediaSegment(),i},t.prototype.parseAdaptationField=function(e,t,i){var n=new Uint8Array(e,t,i),r=n[0];return r>0?r>183?(s.a.w(this.TAG,"Illegal adaptation_field_length: "+r),{}):{discontinuity_indicator:(128&n[1])>>>7,random_access_indicator:(64&n[1])>>>6,elementary_stream_priority_indicator:(32&n[1])>>>5}:{}},t.prototype.handleSectionSlice=function(e,t,i,n){var r=new Uint8Array(e,t,i),s=this.section_slice_queues_[n.pid];if(n.payload_unit_start_indicator){var a=r[0];if(null!=s&&0!==s.total_length){var o=new Uint8Array(e,t+1,Math.min(i,a));s.slices.push(o),s.total_length+=o.byteLength,s.total_length===s.expected_length?this.emitSectionSlices(s,n):this.clearSlices(s,n)}for(var h=1+a;h<r.byteLength;){if(255===r[h+0])break;var d=(15&r[h+1])<<8|r[h+2];this.section_slice_queues_[n.pid]=new L,(s=this.section_slice_queues_[n.pid]).expected_length=d+3,s.file_position=n.file_position,s.random_access_indicator=n.random_access_indicator;o=new Uint8Array(e,t+h,Math.min(i-h,s.expected_length-s.total_length));s.slices.push(o),s.total_length+=o.byteLength,s.total_length===s.expected_length?this.emitSectionSlices(s,n):s.total_length>=s.expected_length&&this.clearSlices(s,n),h+=o.byteLength}}else if(null!=s&&0!==s.total_length){o=new Uint8Array(e,t,Math.min(i,s.expected_length-s.total_length));s.slices.push(o),s.total_length+=o.byteLength,s.total_length===s.expected_length?this.emitSectionSlices(s,n):s.total_length>=s.expected_length&&this.clearSlices(s,n)}},t.prototype.handlePESSlice=function(e,t,i,n){var r=new Uint8Array(e,t,i),a=r[0]<<16|r[1]<<8|r[2],o=(r[3],r[4]<<8|r[5]);if(n.payload_unit_start_indicator){if(1!==a)return void s.a.e(this.TAG,"handlePESSlice: packet_start_code_prefix should be 1 but with value "+a);var h=this.pes_slice_queues_[n.pid];h&&(0===h.expected_length||h.expected_length===h.total_length?this.emitPESSlices(h,n):this.clearSlices(h,n)),this.pes_slice_queues_[n.pid]=new L,this.pes_slice_queues_[n.pid].file_position=n.file_position,this.pes_slice_queues_[n.pid].random_access_indicator=n.random_access_indicator}if(null!=this.pes_slice_queues_[n.pid]){var d=this.pes_slice_queues_[n.pid];d.slices.push(r),n.payload_unit_start_indicator&&(d.expected_length=0===o?0:o+6),d.total_length+=r.byteLength,d.expected_length>0&&d.expected_length===d.total_length?this.emitPESSlices(d,n):d.expected_length>0&&d.expected_length<d.total_length&&this.clearSlices(d,n)}},t.prototype.emitSectionSlices=function(e,t){for(var i=new Uint8Array(e.total_length),n=0,r=0;n<e.slices.length;n++){var s=e.slices[n];i.set(s,r),r+=s.byteLength}e.slices=[],e.expected_length=-1,e.total_length=0;var a=new R;a.pid=t.pid,a.data=i,a.file_position=e.file_position,a.random_access_indicator=e.random_access_indicator,this.parseSection(a)},t.prototype.emitPESSlices=function(e,t){for(var i=new Uint8Array(e.total_length),n=0,r=0;n<e.slices.length;n++){var s=e.slices[n];i.set(s,r),r+=s.byteLength}e.slices=[],e.expected_length=-1,e.total_length=0;var a=new A;a.pid=t.pid,a.data=i,a.stream_type=t.stream_type,a.file_position=e.file_position,a.random_access_indicator=e.random_access_indicator,this.parsePES(a)},t.prototype.clearSlices=function(e,t){e.slices=[],e.expected_length=-1,e.total_length=0},t.prototype.parseSection=function(e){var t=e.data,i=e.pid;0===i?this.parsePAT(t):i===this.current_pmt_pid_&&this.parsePMT(t)},t.prototype.parsePES=function(e){var t=e.data,i=t[0]<<16|t[1]<<8|t[2],n=t[3],r=t[4]<<8|t[5];if(1===i){if(188!==n&&190!==n&&191!==n&&240!==n&&241!==n&&255!==n&&242!==n&&248!==n){t[6];var a=(192&t[7])>>>6,o=t[8],h=void 0,d=void 0;2!==a&&3!==a||(h=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,d=3===a?536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2:h);var u=9+o,_=void 0;if(0!==r){if(r<3+o)return void s.a.v(this.TAG,"Malformed PES: PES_packet_length < 3 + PES_header_data_length");_=r-3-o}else _=t.byteLength-u;var l=t.subarray(u,u+_);switch(e.stream_type){case g.kMPEG1Audio:case g.kMPEG2Audio:break;case g.kPESPrivateData:this.parsePESPrivateDataPayload(l,h,d,e.pid,n);break;case g.kADTSAAC:this.parseAACPayload(l,h);break;case g.kID3:this.parseTimedID3MetadataPayload(l,h,d,e.pid,n);break;case g.kH264:this.parseH264Payload(l,h,d,e.file_position,e.random_access_indicator);break;case g.kH265:}}else if((188===n||191===n||240===n||241===n||255===n||242===n||248===n)&&e.stream_type===g.kPESPrivateData){u=6,_=void 0;_=0!==r?r:t.byteLength-u;l=t.subarray(u,u+_);this.parsePESPrivateDataPayload(l,void 0,void 0,e.pid,n)}}else s.a.e(this.TAG,"parsePES: packet_start_code_prefix should be 1 but with value "+i)},t.prototype.parsePAT=function(e){var t=e[0];if(0===t){var i=(15&e[1])<<8|e[2],n=(e[3],e[4],(62&e[5])>>>1),r=1&e[5],a=e[6],o=(e[7],null);if(1===r&&0===a)(o=new b).version_number=n;else if(null==(o=this.pat_))return;for(var h=i-5-4,d=-1,u=-1,_=8;_<8+h;_+=4){var l=e[_]<<8|e[_+1],c=(31&e[_+2])<<8|e[_+3];0===l?o.network_pid=c:(o.program_pmt_pid[l]=c,-1===d&&(d=l),-1===u&&(u=c))}1===r&&0===a&&(null==this.pat_&&s.a.v(this.TAG,"Parsed first PAT: "+JSON.stringify(o)),this.pat_=o,this.current_program_=d,this.current_pmt_pid_=u)}else s.a.e(this.TAG,"parsePAT: table_id "+t+" is not corresponded to PAT!")},t.prototype.parsePMT=function(e){var t=e[0];if(2===t){var i=(15&e[1])<<8|e[2],n=e[3]<<8|e[4],r=(62&e[5])>>>1,a=1&e[5],o=e[6],h=(e[7],null);if(1===a&&0===o)(h=new S).program_number=n,h.version_number=r,this.program_pmt_map_[n]=h;else if(null==(h=this.program_pmt_map_[n]))return;e[8],e[9];for(var d=(15&e[10])<<8|e[11],u=12+d,_=i-9-d-4,l=u;l<u+_;){var c=e[l],f=(31&e[l+1])<<8|e[l+2],p=(15&e[l+3])<<8|e[l+4];if(h.pid_stream_type[f]=c,c!==g.kH264||h.common_pids.h264)if(c!==g.kADTSAAC||h.common_pids.adts_aac)if(c===g.kPESPrivateData){if(h.pes_private_data_pids[f]=!0,p>0){var m=e.subarray(l+5,l+5+p);this.dispatchPESPrivateDataDescriptor(f,c,m)}}else c===g.kID3&&(h.timed_id3_pids[f]=!0);else h.common_pids.adts_aac=f;else h.common_pids.h264=f;l+=5+p}n===this.current_program_&&(null==this.pmt_&&s.a.v(this.TAG,"Parsed first PMT: "+JSON.stringify(h)),this.pmt_=h,h.common_pids.h264&&(this.has_video_=!0),h.common_pids.adts_aac&&(this.has_audio_=!0))}else s.a.e(this.TAG,"parsePMT: table_id "+t+" is not corresponded to PMT!")},t.prototype.parseH264Payload=function(e,t,i,n,r){for(var a=new C(e),o=null,h=[],d=0,u=!1;null!=(o=a.readNextNaluPayload());){var _=new k(o);if(_.type===E.kSliceSPS){var l=p.parseSPS(o.data);this.video_init_segment_dispatched_?!0===this.detectVideoMetadataChange(_,l)&&(s.a.v(this.TAG,"H264: Critical h264 metadata has been changed, attempt to re-generate InitSegment"),this.video_metadata_changed_=!0,this.video_metadata_={sps:_,pps:void 0,sps_details:l}):(this.video_metadata_.sps=_,this.video_metadata_.sps_details=l)}else _.type===E.kSlicePPS?this.video_init_segment_dispatched_&&!this.video_metadata_changed_||(this.video_metadata_.pps=_,this.video_metadata_.sps&&this.video_metadata_.pps&&(this.video_metadata_changed_&&this.dispatchVideoMediaSegment(),this.dispatchVideoInitSegment())):(_.type===E.kSliceIDR||_.type===E.kSliceNonIDR&&1===r)&&(u=!0);this.video_init_segment_dispatched_&&(h.push(_),d+=_.data.byteLength)}var c=Math.floor(t/this.timescale_),f=Math.floor(i/this.timescale_);if(h.length){var m=this.video_track_,g={units:h,length:d,isKeyframe:u,dts:f,pts:c,cts:c-f,file_position:n};m.samples.push(g),m.length+=d}},t.prototype.detectVideoMetadataChange=function(e,t){if(t.codec_mimetype!==this.video_metadata_.sps_details.codec_mimetype)return s.a.v(this.TAG,"H264: Codec mimeType changed from "+this.video_metadata_.sps_details.codec_mimetype+" to "+t.codec_mimetype),!0;if(t.codec_size.width!==this.video_metadata_.sps_details.codec_size.width||t.codec_size.height!==this.video_metadata_.sps_details.codec_size.height){var i=this.video_metadata_.sps_details.codec_size,n=t.codec_size;return s.a.v(this.TAG,"H264: Coded Resolution changed from "+i.width+"x"+i.height+" to "+n.width+"x"+n.height),!0}return t.present_size.width!==this.video_metadata_.sps_details.present_size.width&&(s.a.v(this.TAG,"H264: Present resolution width changed from "+this.video_metadata_.sps_details.present_size.width+" to "+t.present_size.width),!0)},t.prototype.isInitSegmentDispatched=function(){return this.has_video_&&this.has_audio_?this.video_init_segment_dispatched_&&this.audio_init_segment_dispatched_:this.has_video_&&!this.has_audio_?this.video_init_segment_dispatched_:!(this.has_video_||!this.has_audio_)&&this.audio_init_segment_dispatched_},t.prototype.dispatchVideoInitSegment=function(){var e=this.video_metadata_.sps_details,t={type:"video"};t.id=this.video_track_.id,t.timescale=1e3,t.duration=this.duration_,t.codecWidth=e.codec_size.width,t.codecHeight=e.codec_size.height,t.presentWidth=e.present_size.width,t.presentHeight=e.present_size.height,t.profile=e.profile_string,t.level=e.level_string,t.bitDepth=e.bit_depth,t.chromaFormat=e.chroma_format,t.sarRatio=e.sar_ratio,t.frameRate=e.frame_rate;var i=t.frameRate.fps_den,n=t.frameRate.fps_num;t.refSampleDuration=i/n*1e3,t.codec=e.codec_mimetype;var r=this.video_metadata_.sps.data.subarray(4),a=this.video_metadata_.pps.data.subarray(4),o=new I(r,a,e);t.avcc=o.getData(),0==this.video_init_segment_dispatched_&&s.a.v(this.TAG,"Generated first AVCDecoderConfigurationRecord for mimeType: "+t.codec),this.onTrackMetadata("video",t),this.video_init_segment_dispatched_=!0,this.video_metadata_changed_=!1;var h=this.media_info_;h.hasVideo=!0,h.width=t.codecWidth,h.height=t.codecHeight,h.fps=t.frameRate.fps,h.profile=t.profile,h.level=t.level,h.refFrames=e.ref_frames,h.chromaFormat=e.chroma_format_string,h.sarNum=t.sarRatio.width,h.sarDen=t.sarRatio.height,h.videoCodec=t.codec,h.hasAudio&&h.audioCodec?h.mimeType='video/mp2t; codecs="'+h.videoCodec+","+h.audioCodec+'"':h.mimeType='video/mp2t; codecs="'+h.videoCodec+'"',h.isComplete()&&this.onMediaInfo(h)},t.prototype.dispatchVideoMediaSegment=function(){this.isInitSegmentDispatched()&&this.video_track_.length&&this.onDataAvailable(null,this.video_track_)},t.prototype.dispatchAudioMediaSegment=function(){this.isInitSegmentDispatched()&&this.audio_track_.length&&this.onDataAvailable(this.audio_track_,null)},t.prototype.dispatchAudioVideoMediaSegment=function(){this.isInitSegmentDispatched()&&(this.audio_track_.length||this.video_track_.length)&&this.onDataAvailable(this.audio_track_,this.video_track_)},t.prototype.parseAACPayload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){if(this.aac_last_incomplete_data_){var i=new Uint8Array(e.byteLength+this.aac_last_incomplete_data_.byteLength);i.set(this.aac_last_incomplete_data_,0),i.set(e,this.aac_last_incomplete_data_.byteLength),e=i}var n,r;if(null!=t)r=t/this.timescale_;else{if(null==this.aac_last_sample_pts_)return void s.a.w(this.TAG,"AAC: Unknown pts");n=1024/this.audio_metadata_.sampling_frequency*1e3,r=this.aac_last_sample_pts_+n}if(this.aac_last_incomplete_data_&&this.aac_last_sample_pts_){n=1024/this.audio_metadata_.sampling_frequency*1e3;var a=this.aac_last_sample_pts_+n;Math.abs(a-r)>1&&(s.a.w(this.TAG,"AAC: Detected pts overlapped, expected: "+a+"ms, PES pts: "+r+"ms"),r=a)}for(var o,h=new x(e),d=null,u=r;null!=(d=h.readNextAACFrame());){n=1024/d.sampling_frequency*1e3,0==this.audio_init_segment_dispatched_?(this.audio_metadata_.audio_object_type=d.audio_object_type,this.audio_metadata_.sampling_freq_index=d.sampling_freq_index,this.audio_metadata_.sampling_frequency=d.sampling_frequency,this.audio_metadata_.channel_config=d.channel_config,this.dispatchAudioInitSegment(d)):this.detectAudioMetadataChange(d)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(d)),o=u;var _=Math.floor(u),l={unit:d.data,length:d.data.byteLength,pts:_,dts:_};this.audio_track_.samples.push(l),this.audio_track_.length+=d.data.byteLength,u+=n}h.hasIncompleteData()&&(this.aac_last_incomplete_data_=h.getIncompleteData()),o&&(this.aac_last_sample_pts_=o)}},t.prototype.detectAudioMetadataChange=function(e){return e.audio_object_type!==this.audio_metadata_.audio_object_type?(s.a.v(this.TAG,"AAC: AudioObjectType changed from "+this.audio_metadata_.audio_object_type+" to "+e.audio_object_type),!0):e.sampling_freq_index!==this.audio_metadata_.sampling_freq_index?(s.a.v(this.TAG,"AAC: SamplingFrequencyIndex changed from "+this.audio_metadata_.sampling_freq_index+" to "+e.sampling_freq_index),!0):e.channel_config!==this.audio_metadata_.channel_config&&(s.a.v(this.TAG,"AAC: Channel configuration changed from "+this.audio_metadata_.channel_config+" to "+e.channel_config),!0)},t.prototype.dispatchAudioInitSegment=function(e){var t=new B(e),i={type:"audio"};i.id=this.audio_track_.id,i.timescale=1e3,i.duration=this.duration_,i.audioSampleRate=t.sampling_rate,i.channelCount=t.channel_count,i.codec=t.codec_mimetype,i.originalCodec=t.original_codec_mimetype,i.config=t.config,i.refSampleDuration=1024/i.audioSampleRate*i.timescale,0==this.audio_init_segment_dispatched_&&s.a.v(this.TAG,"Generated first AudioSpecificConfig for mimeType: "+i.codec),this.onTrackMetadata("audio",i),this.audio_init_segment_dispatched_=!0,this.video_metadata_changed_=!1;var n=this.media_info_;n.hasAudio=!0,n.audioCodec=i.originalCodec,n.audioSampleRate=i.audioSampleRate,n.audioChannelCount=i.channelCount,n.hasVideo&&n.videoCodec?n.mimeType='video/mp2t; codecs="'+n.videoCodec+","+n.audioCodec+'"':n.mimeType='video/mp2t; codecs="'+n.audioCodec+'"',n.isComplete()&&this.onMediaInfo(n)},t.prototype.dispatchPESPrivateDataDescriptor=function(e,t,i){var n=new N;n.pid=e,n.stream_type=t,n.descriptor=i,this.onPESPrivateDataDescriptor&&this.onPESPrivateDataDescriptor(n)},t.prototype.parsePESPrivateDataPayload=function(e,t,i,n,r){var s=new U;if(s.pid=n,s.stream_id=r,s.len=e.byteLength,s.data=e,null!=t){var a=Math.floor(t/this.timescale_);s.pts=a}else s.nearest_pts=this.aac_last_sample_pts_;if(null!=i){var o=Math.floor(i/this.timescale_);s.dts=o}this.onPESPrivateData&&this.onPESPrivateData(s)},t.prototype.parseTimedID3MetadataPayload=function(e,t,i,n,r){var s=new U;if(s.pid=n,s.stream_id=r,s.len=e.byteLength,s.data=e,null!=t){var a=Math.floor(t/this.timescale_);s.pts=a}if(null!=i){var o=Math.floor(i/this.timescale_);s.dts=o}this.onTimedID3Metadata&&this.onTimedID3Metadata(s)},t}(y),V=function(){function e(){}return e.init=function(){for(var t in e.types={avc1:[],avcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],mvex:[],mvhd:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[],".mp3":[]},e.types)e.types.hasOwnProperty(t)&&(e.types[t]=[t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2),t.charCodeAt(3)]);var i=e.constants={};i.FTYP=new Uint8Array([105,115,111,109,0,0,0,1,105,115,111,109,97,118,99,49]),i.STSD_PREFIX=new Uint8Array([0,0,0,0,0,0,0,1]),i.STTS=new Uint8Array([0,0,0,0,0,0,0,0]),i.STSC=i.STCO=i.STTS,i.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),i.HDLR_VIDEO=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),i.HDLR_AUDIO=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),i.DREF=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),i.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),i.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0])},e.box=function(e){for(var t=8,i=null,n=Array.prototype.slice.call(arguments,1),r=n.length,s=0;s<r;s++)t+=n[s].byteLength;(i=new Uint8Array(t))[0]=t>>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);var a=8;for(s=0;s<r;s++)i.set(n[s],a),a+=n[s].byteLength;return i},e.generateInitSegment=function(t){var i=e.box(e.types.ftyp,e.constants.FTYP),n=e.moov(t),r=new Uint8Array(i.byteLength+n.byteLength);return r.set(i,0),r.set(n,i.byteLength),r},e.moov=function(t){var i=e.mvhd(t.timescale,t.duration),n=e.trak(t),r=e.mvex(t);return e.box(e.types.moov,i,n,r)},e.mvhd=function(t,i){return e.box(e.types.mvhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))},e.trak=function(t){return e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.tkhd=function(t){var i=t.id,n=t.duration,r=t.presentWidth,s=t.presentHeight;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,r>>>8&255,255&r,0,0,s>>>8&255,255&s,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t),e.hdlr(t),e.minf(t))},e.mdhd=function(t){var i=t.timescale,n=t.duration;return e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,85,196,0,0]))},e.hdlr=function(t){var i=null;return i="audio"===t.type?e.constants.HDLR_AUDIO:e.constants.HDLR_VIDEO,e.box(e.types.hdlr,i)},e.minf=function(t){var i=null;return i="audio"===t.type?e.box(e.types.smhd,e.constants.SMHD):e.box(e.types.vmhd,e.constants.VMHD),e.box(e.types.minf,i,e.dinf(),e.stbl(t))},e.dinf=function(){return e.box(e.types.dinf,e.box(e.types.dref,e.constants.DREF))},e.stbl=function(t){return e.box(e.types.stbl,e.stsd(t),e.box(e.types.stts,e.constants.STTS),e.box(e.types.stsc,e.constants.STSC),e.box(e.types.stsz,e.constants.STSZ),e.box(e.types.stco,e.constants.STCO))},e.stsd=function(t){return"audio"===t.type?"mp3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp3(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp4a(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.avc1(t))},e.mp3=function(t){var i=t.channelCount,n=t.audioSampleRate,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types[".mp3"],r)},e.mp4a=function(t){var i=t.channelCount,n=t.audioSampleRate,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types.mp4a,r,e.esds(t))},e.esds=function(t){var i=t.config||[],n=i.length,r=new Uint8Array([0,0,0,0,3,23+n,0,1,0,4,15+n,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([n]).concat(i).concat([6,1,2]));return e.box(e.types.esds,r)},e.avc1=function(t){var i=t.avcc,n=t.codecWidth,r=t.codecHeight,s=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,r>>>8&255,255&r,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.avc1,s,e.box(e.types.avcC,i))},e.mvex=function(t){return e.box(e.types.mvex,e.trex(t))},e.trex=function(t){var i=t.id,n=new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return e.box(e.types.trex,n)},e.moof=function(t,i){return e.box(e.types.moof,e.mfhd(t.sequenceNumber),e.traf(t,i))},e.mfhd=function(t){var i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t]);return e.box(e.types.mfhd,i)},e.traf=function(t,i){var n=t.id,r=e.box(e.types.tfhd,new Uint8Array([0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n])),s=e.box(e.types.tfdt,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),a=e.sdtp(t),o=e.trun(t,a.byteLength+16+16+8+16+8+8);return e.box(e.types.traf,r,s,o,a)},e.sdtp=function(t){for(var i=t.samples||[],n=i.length,r=new Uint8Array(4+n),s=0;s<n;s++){var a=i[s].flags;r[s+4]=a.isLeading<<6|a.dependsOn<<4|a.isDependedOn<<2|a.hasRedundancy}return e.box(e.types.sdtp,r)},e.trun=function(t,i){var n=t.samples||[],r=n.length,s=12+16*r,a=new Uint8Array(s);i+=8+s,a.set([0,0,15,1,r>>>24&255,r>>>16&255,r>>>8&255,255&r,i>>>24&255,i>>>16&255,i>>>8&255,255&i],0);for(var o=0;o<r;o++){var h=n[o].duration,d=n[o].size,u=n[o].flags,_=n[o].cts;a.set([h>>>24&255,h>>>16&255,h>>>8&255,255&h,d>>>24&255,d>>>16&255,d>>>8&255,255&d,u.isLeading<<2|u.dependsOn,u.isDependedOn<<6|u.hasRedundancy<<4|u.isNonSync,0,0,_>>>24&255,_>>>16&255,_>>>8&255,255&_],12+16*o)}return e.box(e.types.trun,a)},e.mdat=function(t){return e.box(e.types.mdat,t)},e}();V.init();var j=V,z=function(){function e(){}return e.getSilentFrame=function(e,t){if("mp4a.40.2"===e){if(1===t)return new Uint8Array([0,200,0,128,35,128]);if(2===t)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===t)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}return null},e}(),H=i(7),q=function(){function e(e){this.TAG="MP4Remuxer",this._config=e,this._isLive=!0===e.isLive,this._dtsBase=-1,this._dtsBaseInited=!1,this._audioDtsBase=1/0,this._videoDtsBase=1/0,this._audioNextDts=void 0,this._videoNextDts=void 0,this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList=new H.c("audio"),this._videoSegmentInfoList=new H.c("video"),this._onInitSegment=null,this._onMediaSegment=null,this._forceFirstIDR=!(!a.a.chrome||!(a.a.version.major<50||50===a.a.version.major&&a.a.version.build<2661)),this._fillSilentAfterSeek=a.a.msedge||a.a.msie,this._mp3UseMpegAudio=!a.a.firefox,this._fillAudioTimestampGap=this._config.fixAudioTimestampGap}return e.prototype.destroy=function(){this._dtsBase=-1,this._dtsBaseInited=!1,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList.clear(),this._audioSegmentInfoList=null,this._videoSegmentInfoList.clear(),this._videoSegmentInfoList=null,this._onInitSegment=null,this._onMediaSegment=null},e.prototype.bindDataSource=function(e){return e.onDataAvailable=this.remux.bind(this),e.onTrackMetadata=this._onTrackMetadataReceived.bind(this),this},Object.defineProperty(e.prototype,"onInitSegment",{get:function(){return this._onInitSegment},set:function(e){this._onInitSegment=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaSegment",{get:function(){return this._onMediaSegment},set:function(e){this._onMediaSegment=e},enumerable:!1,configurable:!0}),e.prototype.insertDiscontinuity=function(){this._audioNextDts=this._videoNextDts=void 0},e.prototype.seek=function(e){this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._videoSegmentInfoList.clear(),this._audioSegmentInfoList.clear()},e.prototype.remux=function(e,t){if(!this._onMediaSegment)throw new _.a("MP4Remuxer: onMediaSegment callback must be specificed!");this._dtsBaseInited||this._calculateDtsBase(e,t),t&&this._remuxVideo(t),e&&this._remuxAudio(e)},e.prototype._onTrackMetadataReceived=function(e,t){var i=null,n="mp4",r=t.codec;if("audio"===e)this._audioMeta=t,"mp3"===t.codec&&this._mp3UseMpegAudio?(n="mpeg",r="",i=new Uint8Array):i=j.generateInitSegment(t);else{if("video"!==e)return;this._videoMeta=t,i=j.generateInitSegment(t)}if(!this._onInitSegment)throw new _.a("MP4Remuxer: onInitSegment callback must be specified!");this._onInitSegment(e,{type:e,data:i.buffer,codec:r,container:e+"/"+n,mediaDuration:t.duration})},e.prototype._calculateDtsBase=function(e,t){this._dtsBaseInited||(e&&e.samples&&e.samples.length&&(this._audioDtsBase=e.samples[0].dts),t&&t.samples&&t.samples.length&&(this._videoDtsBase=t.samples[0].dts),this._dtsBase=Math.min(this._audioDtsBase,this._videoDtsBase),this._dtsBaseInited=!0)},e.prototype.getTimestampBase=function(){if(this._dtsBaseInited)return this._dtsBase},e.prototype.flushStashedSamples=function(){var e=this._videoStashedLastSample,t=this._audioStashedLastSample,i={type:"video",id:1,sequenceNumber:0,samples:[],length:0};null!=e&&(i.samples.push(e),i.length=e.length);var n={type:"audio",id:2,sequenceNumber:0,samples:[],length:0};null!=t&&(n.samples.push(t),n.length=t.length),this._videoStashedLastSample=null,this._audioStashedLastSample=null,this._remuxVideo(i,!0),this._remuxAudio(n,!0)},e.prototype._remuxAudio=function(e,t){if(null!=this._audioMeta){var i,n=e,r=n.samples,o=void 0,h=-1,d=this._audioMeta.refSampleDuration,u="mp3"===this._audioMeta.codec&&this._mp3UseMpegAudio,_=this._dtsBaseInited&&void 0===this._audioNextDts,l=!1;if(r&&0!==r.length&&(1!==r.length||t)){var c=0,f=null,p=0;u?(c=0,p=n.length):(c=8,p=8+n.length);var m=null;if(r.length>1&&(p-=(m=r.pop()).length),null!=this._audioStashedLastSample){var g=this._audioStashedLastSample;this._audioStashedLastSample=null,r.unshift(g),p+=g.length}null!=m&&(this._audioStashedLastSample=m);var v=r[0].dts-this._dtsBase;if(this._audioNextDts)o=v-this._audioNextDts;else if(this._audioSegmentInfoList.isEmpty())o=0,this._fillSilentAfterSeek&&!this._videoSegmentInfoList.isEmpty()&&"mp3"!==this._audioMeta.originalCodec&&(l=!0);else{var y=this._audioSegmentInfoList.getLastSampleBefore(v);if(null!=y){var b=v-(y.originalDts+y.duration);b<=3&&(b=0),o=v-(y.dts+y.duration+b)}else o=0}if(l){var E=v-o,S=this._videoSegmentInfoList.getLastSegmentBefore(v);if(null!=S&&S.beginDts<E){if(P=z.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount)){var A=S.beginDts,R=E-S.beginDts;s.a.v(this.TAG,"InsertPrefixSilentAudio: dts: "+A+", duration: "+R),r.unshift({unit:P,dts:A,pts:A}),p+=P.byteLength}}else l=!1}for(var L=[],T=0;T<r.length;T++){var w=(g=r[T]).unit,D=g.dts-this._dtsBase,k=(A=D,!1),C=null,I=0;if(!(D<-.001)){if("mp3"!==this._audioMeta.codec){var O=D;if(this._audioNextDts&&(O=this._audioNextDts),(o=D-O)<=-3*d){s.a.w(this.TAG,"Dropping 1 audio frame (originalDts: "+D+" ms ,curRefDts: "+O+" ms) due to dtsCorrection: "+o+" ms overlap.");continue}if(o>=3*d&&this._fillAudioTimestampGap&&!a.a.safari){k=!0;var P,M=Math.floor(o/d);s.a.w(this.TAG,"Large audio timestamp gap detected, may cause AV sync to drift. Silent frames will be generated to avoid unsync.\noriginalDts: "+D+" ms, curRefDts: "+O+" ms, dtsCorrection: "+Math.round(o)+" ms, generate: "+M+" frames"),A=Math.floor(O),I=Math.floor(O+d)-A,null==(P=z.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount))&&(s.a.w(this.TAG,"Unable to generate silent frame for "+this._audioMeta.originalCodec+" with "+this._audioMeta.channelCount+" channels, repeat last frame"),P=w),C=[];for(var x=0;x<M;x++){O+=d;var B=Math.floor(O),U=Math.floor(O+d)-B,N={dts:B,pts:B,cts:0,unit:P,size:P.byteLength,duration:U,originalDts:D,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}};C.push(N),p+=N.size}this._audioNextDts=O+d}else A=Math.floor(O),I=Math.floor(O+d)-A,this._audioNextDts=O+d}else{if(A=D-o,T!==r.length-1)I=r[T+1].dts-this._dtsBase-o-A;else if(null!=m)I=m.dts-this._dtsBase-o-A;else I=L.length>=1?L[L.length-1].duration:Math.floor(d);this._audioNextDts=A+I}-1===h&&(h=A),L.push({dts:A,pts:A,cts:0,unit:g.unit,size:g.unit.byteLength,duration:I,originalDts:D,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}}),k&&L.push.apply(L,C)}}if(0===L.length)return n.samples=[],void(n.length=0);u?f=new Uint8Array(p):((f=new Uint8Array(p))[0]=p>>>24&255,f[1]=p>>>16&255,f[2]=p>>>8&255,f[3]=255&p,f.set(j.types.mdat,4));for(T=0;T<L.length;T++){w=L[T].unit;f.set(w,c),c+=w.byteLength}var F=L[L.length-1];i=F.dts+F.duration;var G=new H.b;G.beginDts=h,G.endDts=i,G.beginPts=h,G.endPts=i,G.originalBeginDts=L[0].originalDts,G.originalEndDts=F.originalDts+F.duration,G.firstSample=new H.d(L[0].dts,L[0].pts,L[0].duration,L[0].originalDts,!1),G.lastSample=new H.d(F.dts,F.pts,F.duration,F.originalDts,!1),this._isLive||this._audioSegmentInfoList.append(G),n.samples=L,n.sequenceNumber++;var V=null;V=u?new Uint8Array:j.moof(n,h),n.samples=[],n.length=0;var q={type:"audio",data:this._mergeBoxes(V,f).buffer,sampleCount:L.length,info:G};u&&_&&(q.timestampOffset=h),this._onMediaSegment("audio",q)}}},e.prototype._remuxVideo=function(e,t){if(null!=this._videoMeta){var i,n,r=e,s=r.samples,a=void 0,o=-1,h=-1;if(s&&0!==s.length&&(1!==s.length||t)){var d=8,u=null,_=8+e.length,l=null;if(s.length>1&&(_-=(l=s.pop()).length),null!=this._videoStashedLastSample){var c=this._videoStashedLastSample;this._videoStashedLastSample=null,s.unshift(c),_+=c.length}null!=l&&(this._videoStashedLastSample=l);var f=s[0].dts-this._dtsBase;if(this._videoNextDts)a=f-this._videoNextDts;else if(this._videoSegmentInfoList.isEmpty())a=0;else{var p=this._videoSegmentInfoList.getLastSampleBefore(f);if(null!=p){var m=f-(p.originalDts+p.duration);m<=3&&(m=0),a=f-(p.dts+p.duration+m)}else a=0}for(var g=new H.b,v=[],y=0;y<s.length;y++){var b=(c=s[y]).dts-this._dtsBase,E=c.isKeyframe,S=b-a,A=c.cts,R=S+A;-1===o&&(o=S,h=R);var L=0;if(y!==s.length-1)L=s[y+1].dts-this._dtsBase-a-S;else if(null!=l)L=l.dts-this._dtsBase-a-S;else L=v.length>=1?v[v.length-1].duration:Math.floor(this._videoMeta.refSampleDuration);if(E){var T=new H.d(S,R,L,c.dts,!0);T.fileposition=c.fileposition,g.appendSyncPoint(T)}v.push({dts:S,pts:R,cts:A,units:c.units,size:c.length,isKeyframe:E,duration:L,originalDts:b,flags:{isLeading:0,dependsOn:E?2:1,isDependedOn:E?1:0,hasRedundancy:0,isNonSync:E?0:1}})}(u=new Uint8Array(_))[0]=_>>>24&255,u[1]=_>>>16&255,u[2]=_>>>8&255,u[3]=255&_,u.set(j.types.mdat,4);for(y=0;y<v.length;y++)for(var w=v[y].units;w.length;){var D=w.shift().data;u.set(D,d),d+=D.byteLength}var k=v[v.length-1];if(i=k.dts+k.duration,n=k.pts+k.duration,this._videoNextDts=i,g.beginDts=o,g.endDts=i,g.beginPts=h,g.endPts=n,g.originalBeginDts=v[0].originalDts,g.originalEndDts=k.originalDts+k.duration,g.firstSample=new H.d(v[0].dts,v[0].pts,v[0].duration,v[0].originalDts,v[0].isKeyframe),g.lastSample=new H.d(k.dts,k.pts,k.duration,k.originalDts,k.isKeyframe),this._isLive||this._videoSegmentInfoList.append(g),r.samples=v,r.sequenceNumber++,this._forceFirstIDR){var C=v[0].flags;C.dependsOn=2,C.isNonSync=0}var I=j.moof(r,o);r.samples=[],r.length=0,this._onMediaSegment("video",{type:"video",data:this._mergeBoxes(I,u).buffer,sampleCount:v.length,info:g})}}},e.prototype._mergeBoxes=function(e,t){var i=new Uint8Array(e.byteLength+t.byteLength);return i.set(e,0),i.set(t,e.byteLength),i},e}(),K=i(11),W=i(1),X=function(){function e(e,t){this.TAG="TransmuxingController",this._emitter=new r.a,this._config=t,e.segments||(e.segments=[{duration:e.duration,filesize:e.filesize,url:e.url}]),"boolean"!=typeof e.cors&&(e.cors=!0),"boolean"!=typeof e.withCredentials&&(e.withCredentials=!1),this._mediaDataSource=e,this._currentSegmentIndex=0;var i=0;this._mediaDataSource.segments.forEach((function(n){n.timestampBase=i,i+=n.duration,n.cors=e.cors,n.withCredentials=e.withCredentials,t.referrerPolicy&&(n.referrerPolicy=t.referrerPolicy)})),isNaN(i)||this._mediaDataSource.duration===i||(this._mediaDataSource.duration=i),this._mediaInfo=null,this._demuxer=null,this._remuxer=null,this._ioctl=null,this._pendingSeekTime=null,this._pendingResolveSeekPoint=null,this._statisticsReporter=null}return e.prototype.destroy=function(){this._mediaInfo=null,this._mediaDataSource=null,this._statisticsReporter&&this._disableStatisticsReporter(),this._ioctl&&(this._ioctl.destroy(),this._ioctl=null),this._demuxer&&(this._demuxer.destroy(),this._demuxer=null),this._remuxer&&(this._remuxer.destroy(),this._remuxer=null),this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.start=function(){this._loadSegment(0),this._enableStatisticsReporter()},e.prototype._loadSegment=function(e,t){this._currentSegmentIndex=e;var i=this._mediaDataSource.segments[e],n=this._ioctl=new K.a(i,this._config,e);n.onError=this._onIOException.bind(this),n.onSeeked=this._onIOSeeked.bind(this),n.onComplete=this._onIOComplete.bind(this),n.onRedirect=this._onIORedirect.bind(this),n.onRecoveredEarlyEof=this._onIORecoveredEarlyEof.bind(this),t?this._demuxer.bindDataSource(this._ioctl):n.onDataArrival=this._onInitChunkArrival.bind(this),n.open(t)},e.prototype.stop=function(){this._internalAbort(),this._disableStatisticsReporter()},e.prototype._internalAbort=function(){this._ioctl&&(this._ioctl.destroy(),this._ioctl=null)},e.prototype.pause=function(){this._ioctl&&this._ioctl.isWorking()&&(this._ioctl.pause(),this._disableStatisticsReporter())},e.prototype.resume=function(){this._ioctl&&this._ioctl.isPaused()&&(this._ioctl.resume(),this._enableStatisticsReporter())},e.prototype.seek=function(e){if(null!=this._mediaInfo&&this._mediaInfo.isSeekable()){var t=this._searchSegmentIndexContains(e);if(t===this._currentSegmentIndex){var i=this._mediaInfo.segments[t];if(null==i)this._pendingSeekTime=e;else{var n=i.getNearestKeyframe(e);this._remuxer.seek(n.milliseconds),this._ioctl.seek(n.fileposition),this._pendingResolveSeekPoint=n.milliseconds}}else{var r=this._mediaInfo.segments[t];if(null==r)this._pendingSeekTime=e,this._internalAbort(),this._remuxer.seek(),this._remuxer.insertDiscontinuity(),this._loadSegment(t);else{n=r.getNearestKeyframe(e);this._internalAbort(),this._remuxer.seek(e),this._remuxer.insertDiscontinuity(),this._demuxer.resetMediaInfo(),this._demuxer.timestampBase=this._mediaDataSource.segments[t].timestampBase,this._loadSegment(t,n.fileposition),this._pendingResolveSeekPoint=n.milliseconds,this._reportSegmentMediaInfo(t)}}this._enableStatisticsReporter()}},e.prototype._searchSegmentIndexContains=function(e){for(var t=this._mediaDataSource.segments,i=t.length-1,n=0;n<t.length;n++)if(e<t[n].timestampBase){i=n-1;break}return i},e.prototype._onInitChunkArrival=function(e,t){var i=this,n=null,r=0;if(t>0)this._demuxer.bindDataSource(this._ioctl),this._demuxer.timestampBase=this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase,r=this._demuxer.parseChunks(e,t);else if((n=G.probe(e)).match){var a=this._demuxer=new G(n,this._config);this._remuxer||(this._remuxer=new q(this._config)),a.onError=this._onDemuxException.bind(this),a.onMediaInfo=this._onMediaInfo.bind(this),a.onMetaDataArrived=this._onMetaDataArrived.bind(this),a.onTimedID3Metadata=this._onTimedID3Metadata.bind(this),a.onPESPrivateDataDescriptor=this._onPESPrivateDataDescriptor.bind(this),a.onPESPrivateData=this._onPESPrivateData.bind(this),this._remuxer.bindDataSource(this._demuxer),this._demuxer.bindDataSource(this._ioctl),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this),r=this._demuxer.parseChunks(e,t)}else if((n=v.probe(e)).match){this._demuxer=new v(n,this._config),this._remuxer||(this._remuxer=new q(this._config));var o=this._mediaDataSource;null==o.duration||isNaN(o.duration)||(this._demuxer.overridedDuration=o.duration),"boolean"==typeof o.hasAudio&&(this._demuxer.overridedHasAudio=o.hasAudio),"boolean"==typeof o.hasVideo&&(this._demuxer.overridedHasVideo=o.hasVideo),this._demuxer.timestampBase=o.segments[this._currentSegmentIndex].timestampBase,this._demuxer.onError=this._onDemuxException.bind(this),this._demuxer.onMediaInfo=this._onMediaInfo.bind(this),this._demuxer.onMetaDataArrived=this._onMetaDataArrived.bind(this),this._demuxer.onScriptDataArrived=this._onScriptDataArrived.bind(this),this._remuxer.bindDataSource(this._demuxer.bindDataSource(this._ioctl)),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this),r=this._demuxer.parseChunks(e,t)}else n=null,s.a.e(this.TAG,"Non MPEG-TS/FLV, Unsupported media type!"),Promise.resolve().then((function(){i._internalAbort()})),this._emitter.emit(W.a.DEMUX_ERROR,m.a.FORMAT_UNSUPPORTED,"Non MPEG-TS/FLV, Unsupported media type!"),r=0;return r},e.prototype._onMediaInfo=function(e){var t=this;null==this._mediaInfo&&(this._mediaInfo=Object.assign({},e),this._mediaInfo.keyframesIndex=null,this._mediaInfo.segments=[],this._mediaInfo.segmentCount=this._mediaDataSource.segments.length,Object.setPrototypeOf(this._mediaInfo,o.a.prototype));var i=Object.assign({},e);Object.setPrototypeOf(i,o.a.prototype),this._mediaInfo.segments[this._currentSegmentIndex]=i,this._reportSegmentMediaInfo(this._currentSegmentIndex),null!=this._pendingSeekTime&&Promise.resolve().then((function(){var e=t._pendingSeekTime;t._pendingSeekTime=null,t.seek(e)}))},e.prototype._onMetaDataArrived=function(e){this._emitter.emit(W.a.METADATA_ARRIVED,e)},e.prototype._onScriptDataArrived=function(e){this._emitter.emit(W.a.SCRIPTDATA_ARRIVED,e)},e.prototype._onTimedID3Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(W.a.TIMED_ID3_METADATA_ARRIVED,e))},e.prototype._onPESPrivateDataDescriptor=function(e){this._emitter.emit(W.a.PES_PRIVATE_DATA_DESCRIPTOR,e)},e.prototype._onPESPrivateData=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(W.a.PES_PRIVATE_DATA_ARRIVED,e))},e.prototype._onIOSeeked=function(){this._remuxer.insertDiscontinuity()},e.prototype._onIOComplete=function(e){var t=e+1;t<this._mediaDataSource.segments.length?(this._internalAbort(),this._remuxer&&this._remuxer.flushStashedSamples(),this._loadSegment(t)):(this._remuxer&&this._remuxer.flushStashedSamples(),this._emitter.emit(W.a.LOADING_COMPLETE),this._disableStatisticsReporter())},e.prototype._onIORedirect=function(e){var t=this._ioctl.extraData;this._mediaDataSource.segments[t].redirectedURL=e},e.prototype._onIORecoveredEarlyEof=function(){this._emitter.emit(W.a.RECOVERED_EARLY_EOF)},e.prototype._onIOException=function(e,t){s.a.e(this.TAG,"IOException: type = "+e+", code = "+t.code+", msg = "+t.msg),this._emitter.emit(W.a.IO_ERROR,e,t),this._disableStatisticsReporter()},e.prototype._onDemuxException=function(e,t){s.a.e(this.TAG,"DemuxException: type = "+e+", info = "+t),this._emitter.emit(W.a.DEMUX_ERROR,e,t)},e.prototype._onRemuxerInitSegmentArrival=function(e,t){this._emitter.emit(W.a.INIT_SEGMENT,e,t)},e.prototype._onRemuxerMediaSegmentArrival=function(e,t){if(null==this._pendingSeekTime&&(this._emitter.emit(W.a.MEDIA_SEGMENT,e,t),null!=this._pendingResolveSeekPoint&&"video"===e)){var i=t.info.syncPoints,n=this._pendingResolveSeekPoint;this._pendingResolveSeekPoint=null,a.a.safari&&i.length>0&&i[0].originalDts===n&&(n=i[0].pts),this._emitter.emit(W.a.RECOMMEND_SEEKPOINT,n)}},e.prototype._enableStatisticsReporter=function(){null==this._statisticsReporter&&(this._statisticsReporter=self.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval))},e.prototype._disableStatisticsReporter=function(){this._statisticsReporter&&(self.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype._reportSegmentMediaInfo=function(e){var t=this._mediaInfo.segments[e],i=Object.assign({},t);i.duration=this._mediaInfo.duration,i.segmentCount=this._mediaInfo.segmentCount,delete i.segments,delete i.keyframesIndex,this._emitter.emit(W.a.MEDIA_INFO,i)},e.prototype._reportStatisticsInfo=function(){var e={};e.url=this._ioctl.currentURL,e.hasRedirect=this._ioctl.hasRedirect,e.hasRedirect&&(e.redirectedURL=this._ioctl.currentRedirectedURL),e.speed=this._ioctl.currentSpeed,e.loaderType=this._ioctl.loaderType,e.currentSegmentIndex=this._currentSegmentIndex,e.totalSegmentCount=this._mediaDataSource.segments.length,this._emitter.emit(W.a.STATISTICS_INFO,e)},e}();t.a=X},function(e,t,i){"use strict";var n,r=i(0),s=function(){function e(){this._firstCheckpoint=0,this._lastCheckpoint=0,this._intervalBytes=0,this._totalBytes=0,this._lastSecondBytes=0,self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now}return e.prototype.reset=function(){this._firstCheckpoint=this._lastCheckpoint=0,this._totalBytes=this._intervalBytes=0,this._lastSecondBytes=0},e.prototype.addBytes=function(e){0===this._firstCheckpoint?(this._firstCheckpoint=this._now(),this._lastCheckpoint=this._firstCheckpoint,this._intervalBytes+=e,this._totalBytes+=e):this._now()-this._lastCheckpoint<1e3?(this._intervalBytes+=e,this._totalBytes+=e):(this._lastSecondBytes=this._intervalBytes,this._intervalBytes=e,this._totalBytes+=e,this._lastCheckpoint=this._now())},Object.defineProperty(e.prototype,"currentKBps",{get:function(){this.addBytes(0);var e=(this._now()-this._lastCheckpoint)/1e3;return 0==e&&(e=1),this._intervalBytes/e/1024},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastSecondKBps",{get:function(){return this.addBytes(0),0!==this._lastSecondBytes?this._lastSecondBytes/1024:this._now()-this._lastCheckpoint>=500?this.currentKBps:0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"averageKBps",{get:function(){var e=(this._now()-this._firstCheckpoint)/1e3;return this._totalBytes/e/1024},enumerable:!1,configurable:!0}),e}(),a=i(2),o=i(4),h=i(3),d=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),u=function(e){function t(t,i){var n=e.call(this,"fetch-stream-loader")||this;return n.TAG="FetchStreamLoader",n._seekHandler=t,n._config=i,n._needStash=!0,n._requestAbort=!1,n._abortController=null,n._contentLength=null,n._receivedLength=0,n}return d(t,e),t.isSupported=function(){try{var e=o.a.msedge&&o.a.version.minor>=15048,t=!o.a.msedge||e;return self.fetch&&self.ReadableStream&&t}catch(e){return!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){var i=this;this._dataSource=e,this._range=t;var n=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(n=e.redirectedURL);var r=this._seekHandler.getConfig(n,t),s=new self.Headers;if("object"==typeof r.headers){var o=r.headers;for(var d in o)o.hasOwnProperty(d)&&s.append(d,o[d])}var u={method:"GET",headers:s,mode:"cors",cache:"default",referrerPolicy:"no-referrer-when-downgrade"};if("object"==typeof this._config.headers)for(var d in this._config.headers)s.append(d,this._config.headers[d]);!1===e.cors&&(u.mode="same-origin"),e.withCredentials&&(u.credentials="include"),e.referrerPolicy&&(u.referrerPolicy=e.referrerPolicy),self.AbortController&&(this._abortController=new self.AbortController,u.signal=this._abortController.signal),this._status=a.c.kConnecting,self.fetch(r.url,u).then((function(e){if(i._requestAbort)return i._status=a.c.kIdle,void e.body.cancel();if(e.ok&&e.status>=200&&e.status<=299){if(e.url!==r.url&&i._onURLRedirect){var t=i._seekHandler.removeURLParameters(e.url);i._onURLRedirect(t)}var n=e.headers.get("Content-Length");return null!=n&&(i._contentLength=parseInt(n),0!==i._contentLength&&i._onContentLengthKnown&&i._onContentLengthKnown(i._contentLength)),i._pump.call(i,e.body.getReader())}if(i._status=a.c.kError,!i._onError)throw new h.d("FetchStreamLoader: Http code invalid, "+e.status+" "+e.statusText);i._onError(a.b.HTTP_STATUS_CODE_INVALID,{code:e.status,msg:e.statusText})})).catch((function(e){if(!i._abortController||!i._abortController.signal.aborted){if(i._status=a.c.kError,!i._onError)throw e;i._onError(a.b.EXCEPTION,{code:-1,msg:e.message})}}))},t.prototype.abort=function(){if(this._requestAbort=!0,(this._status!==a.c.kBuffering||!o.a.chrome)&&this._abortController)try{this._abortController.abort()}catch(e){}},t.prototype._pump=function(e){var t=this;return e.read().then((function(i){if(i.done)if(null!==t._contentLength&&t._receivedLength<t._contentLength){t._status=a.c.kError;var n=a.b.EARLY_EOF,r={code:-1,msg:"Fetch stream meet Early-EOF"};if(!t._onError)throw new h.d(r.msg);t._onError(n,r)}else t._status=a.c.kComplete,t._onComplete&&t._onComplete(t._range.from,t._range.from+t._receivedLength-1);else{if(t._abortController&&t._abortController.signal.aborted)return void(t._status=a.c.kComplete);if(!0===t._requestAbort)return t._status=a.c.kComplete,e.cancel();t._status=a.c.kBuffering;var s=i.value.buffer,o=t._range.from+t._receivedLength;t._receivedLength+=s.byteLength,t._onDataArrival&&t._onDataArrival(s,o,t._receivedLength),t._pump(e)}})).catch((function(e){if(t._abortController&&t._abortController.signal.aborted)t._status=a.c.kComplete;else if(11!==e.code||!o.a.msedge){t._status=a.c.kError;var i=0,n=null;if(19!==e.code&&"network error"!==e.message||!(null===t._contentLength||null!==t._contentLength&&t._receivedLength<t._contentLength)?(i=a.b.EXCEPTION,n={code:e.code,msg:e.message}):(i=a.b.EARLY_EOF,n={code:e.code,msg:"Fetch stream meet Early-EOF"}),!t._onError)throw new h.d(n.msg);t._onError(i,n)}}))},t}(a.a),_=function(){var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(t,i)};return function(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),l=function(e){function t(t,i){var n=e.call(this,"xhr-moz-chunked-loader")||this;return n.TAG="MozChunkedLoader",n._seekHandler=t,n._config=i,n._needStash=!0,n._xhr=null,n._requestAbort=!1,n._contentLength=null,n._receivedLength=0,n}return _(t,e),t.isSupported=function(){try{var e=new XMLHttpRequest;return e.open("GET","https://example.com",!0),e.responseType="moz-chunked-arraybuffer","moz-chunked-arraybuffer"===e.responseType}catch(e){return r.a.w("MozChunkedLoader",e.message),!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onloadend=null,this._xhr.onerror=null,this._xhr=null),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){this._dataSource=e,this._range=t;var i=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(i=e.redirectedURL);var n=this._seekHandler.getConfig(i,t);this._requestURL=n.url;var r=this._xhr=new XMLHttpRequest;if(r.open("GET",n.url,!0),r.responseType="moz-chunked-arraybuffer",r.onreadystatechange=this._onReadyStateChange.bind(this),r.onprogress=this._onProgress.bind(this),r.onloadend=this._onLoadEnd.bind(this),r.onerror=this._onXhrError.bind(this),e.withCredentials&&(r.withCredentials=!0),"object"==typeof n.headers){var s=n.headers;for(var o in s)s.hasOwnProperty(o)&&r.setRequestHeader(o,s[o])}if("object"==typeof this._config.headers){s=this._config.headers;for(var o in s)s.hasOwnProperty(o)&&r.setRequestHeader(o,s[o])}this._status=a.c.kConnecting,r.send()},t.prototype.abort=function(){this._requestAbort=!0,this._xhr&&this._xhr.abort(),this._status=a.c.kComplete},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL&&t.responseURL!==this._requestURL&&this._onURLRedirect){var i=this._seekHandler.removeURLParameters(t.responseURL);this._onURLRedirect(i)}if(0!==t.status&&(t.status<200||t.status>299)){if(this._status=a.c.kError,!this._onError)throw new h.d("MozChunkedLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(a.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}else this._status=a.c.kBuffering}},t.prototype._onProgress=function(e){if(this._status!==a.c.kError){null===this._contentLength&&null!==e.total&&0!==e.total&&(this._contentLength=e.total,this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength));var t=e.target.response,i=this._range.from+this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,i,this._receivedLength)}},t.prototype._onLoadEnd=function(e){!0!==this._requestAbort?this._status!==a.c.kError&&(this._status=a.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1)):this._requestAbort=!1},t.prototype._onXhrError=function(e){this._status=a.c.kError;var t=0,i=null;if(this._contentLength&&e.loaded<this._contentLength?(t=a.b.EARLY_EOF,i={code:-1,msg:"Moz-Chunked stream meet Early-Eof"}):(t=a.b.EXCEPTION,i={code:-1,msg:e.constructor.name+" "+e.type}),!this._onError)throw new h.d(i.msg);this._onError(t,i)},t}(a.a),c=function(){var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(t,i)};return function(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),f=function(e){function t(t,i){var n=e.call(this,"xhr-range-loader")||this;return n.TAG="RangeLoader",n._seekHandler=t,n._config=i,n._needStash=!1,n._chunkSizeKBList=[128,256,384,512,768,1024,1536,2048,3072,4096,5120,6144,7168,8192],n._currentChunkSizeKB=384,n._currentSpeedNormalized=0,n._zeroSpeedChunkCount=0,n._xhr=null,n._speedSampler=new s,n._requestAbort=!1,n._waitForTotalLength=!1,n._totalLengthReceived=!1,n._currentRequestURL=null,n._currentRedirectedURL=null,n._currentRequestRange=null,n._totalLength=null,n._contentLength=null,n._receivedLength=0,n._lastTimeLoaded=0,n}return c(t,e),t.isSupported=function(){try{var e=new XMLHttpRequest;return e.open("GET","https://example.com",!0),e.responseType="arraybuffer","arraybuffer"===e.responseType}catch(e){return r.a.w("RangeLoader",e.message),!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr=null),e.prototype.destroy.call(this)},Object.defineProperty(t.prototype,"currentSpeed",{get:function(){return this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),t.prototype.open=function(e,t){this._dataSource=e,this._range=t,this._status=a.c.kConnecting;var i=!1;null!=this._dataSource.filesize&&0!==this._dataSource.filesize&&(i=!0,this._totalLength=this._dataSource.filesize),this._totalLengthReceived||i?this._openSubRange():(this._waitForTotalLength=!0,this._internalOpen(this._dataSource,{from:0,to:-1}))},t.prototype._openSubRange=function(){var e=1024*this._currentChunkSizeKB,t=this._range.from+this._receivedLength,i=t+e;null!=this._contentLength&&i-this._range.from>=this._contentLength&&(i=this._range.from+this._contentLength-1),this._currentRequestRange={from:t,to:i},this._internalOpen(this._dataSource,this._currentRequestRange)},t.prototype._internalOpen=function(e,t){this._lastTimeLoaded=0;var i=e.url;this._config.reuseRedirectedURL&&(null!=this._currentRedirectedURL?i=this._currentRedirectedURL:null!=e.redirectedURL&&(i=e.redirectedURL));var n=this._seekHandler.getConfig(i,t);this._currentRequestURL=n.url;var r=this._xhr=new XMLHttpRequest;if(r.open("GET",n.url,!0),r.responseType="arraybuffer",r.onreadystatechange=this._onReadyStateChange.bind(this),r.onprogress=this._onProgress.bind(this),r.onload=this._onLoad.bind(this),r.onerror=this._onXhrError.bind(this),e.withCredentials&&(r.withCredentials=!0),"object"==typeof n.headers){var s=n.headers;for(var a in s)s.hasOwnProperty(a)&&r.setRequestHeader(a,s[a])}if("object"==typeof this._config.headers){s=this._config.headers;for(var a in s)s.hasOwnProperty(a)&&r.setRequestHeader(a,s[a])}r.send()},t.prototype.abort=function(){this._requestAbort=!0,this._internalAbort(),this._status=a.c.kComplete},t.prototype._internalAbort=function(){this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr.abort(),this._xhr=null)},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL){var i=this._seekHandler.removeURLParameters(t.responseURL);t.responseURL!==this._currentRequestURL&&i!==this._currentRedirectedURL&&(this._currentRedirectedURL=i,this._onURLRedirect&&this._onURLRedirect(i))}if(t.status>=200&&t.status<=299){if(this._waitForTotalLength)return;this._status=a.c.kBuffering}else{if(this._status=a.c.kError,!this._onError)throw new h.d("RangeLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(a.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}}},t.prototype._onProgress=function(e){if(this._status!==a.c.kError){if(null===this._contentLength){var t=!1;if(this._waitForTotalLength){this._waitForTotalLength=!1,this._totalLengthReceived=!0,t=!0;var i=e.total;this._internalAbort(),null!=i&0!==i&&(this._totalLength=i)}if(-1===this._range.to?this._contentLength=this._totalLength-this._range.from:this._contentLength=this._range.to-this._range.from+1,t)return void this._openSubRange();this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength)}var n=e.loaded-this._lastTimeLoaded;this._lastTimeLoaded=e.loaded,this._speedSampler.addBytes(n)}},t.prototype._normalizeSpeed=function(e){var t=this._chunkSizeKBList,i=t.length-1,n=0,r=0,s=i;if(e<t[0])return t[0];for(;r<=s;){if((n=r+Math.floor((s-r)/2))===i||e>=t[n]&&e<t[n+1])return t[n];t[n]<e?r=n+1:s=n-1}},t.prototype._onLoad=function(e){if(this._status!==a.c.kError)if(this._waitForTotalLength)this._waitForTotalLength=!1;else{this._lastTimeLoaded=0;var t=this._speedSampler.lastSecondKBps;if(0===t&&(this._zeroSpeedChunkCount++,this._zeroSpeedChunkCount>=3&&(t=this._speedSampler.currentKBps)),0!==t){var i=this._normalizeSpeed(t);this._currentSpeedNormalized!==i&&(this._currentSpeedNormalized=i,this._currentChunkSizeKB=i)}var n=e.target.response,r=this._range.from+this._receivedLength;this._receivedLength+=n.byteLength;var s=!1;null!=this._contentLength&&this._receivedLength<this._contentLength?this._openSubRange():s=!0,this._onDataArrival&&this._onDataArrival(n,r,this._receivedLength),s&&(this._status=a.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1))}},t.prototype._onXhrError=function(e){this._status=a.c.kError;var t=0,i=null;if(this._contentLength&&this._receivedLength>0&&this._receivedLength<this._contentLength?(t=a.b.EARLY_EOF,i={code:-1,msg:"RangeLoader meet Early-Eof"}):(t=a.b.EXCEPTION,i={code:-1,msg:e.constructor.name+" "+e.type}),!this._onError)throw new h.d(i.msg);this._onError(t,i)},t}(a.a),p=function(){var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(t,i)};return function(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),m=function(e){function t(){var t=e.call(this,"websocket-loader")||this;return t.TAG="WebSocketLoader",t._needStash=!0,t._ws=null,t._requestAbort=!1,t._receivedLength=0,t}return p(t,e),t.isSupported=function(){try{return void 0!==self.WebSocket}catch(e){return!1}},t.prototype.destroy=function(){this._ws&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e){try{var t=this._ws=new self.WebSocket(e.url);t.binaryType="arraybuffer",t.onopen=this._onWebSocketOpen.bind(this),t.onclose=this._onWebSocketClose.bind(this),t.onmessage=this._onWebSocketMessage.bind(this),t.onerror=this._onWebSocketError.bind(this),this._status=a.c.kConnecting}catch(e){this._status=a.c.kError;var i={code:e.code,msg:e.message};if(!this._onError)throw new h.d(i.msg);this._onError(a.b.EXCEPTION,i)}},t.prototype.abort=function(){var e=this._ws;!e||0!==e.readyState&&1!==e.readyState||(this._requestAbort=!0,e.close()),this._ws=null,this._status=a.c.kComplete},t.prototype._onWebSocketOpen=function(e){this._status=a.c.kBuffering},t.prototype._onWebSocketClose=function(e){!0!==this._requestAbort?(this._status=a.c.kComplete,this._onComplete&&this._onComplete(0,this._receivedLength-1)):this._requestAbort=!1},t.prototype._onWebSocketMessage=function(e){var t=this;if(e.data instanceof ArrayBuffer)this._dispatchArrayBuffer(e.data);else if(e.data instanceof Blob){var i=new FileReader;i.onload=function(){t._dispatchArrayBuffer(i.result)},i.readAsArrayBuffer(e.data)}else{this._status=a.c.kError;var n={code:-1,msg:"Unsupported WebSocket message type: "+e.data.constructor.name};if(!this._onError)throw new h.d(n.msg);this._onError(a.b.EXCEPTION,n)}},t.prototype._dispatchArrayBuffer=function(e){var t=e,i=this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,i,this._receivedLength)},t.prototype._onWebSocketError=function(e){this._status=a.c.kError;var t={code:e.code,msg:e.message};if(!this._onError)throw new h.d(t.msg);this._onError(a.b.EXCEPTION,t)},t}(a.a),g=function(){function e(e){this._zeroStart=e||!1}return e.prototype.getConfig=function(e,t){var i={};if(0!==t.from||-1!==t.to){var n=void 0;n=-1!==t.to?"bytes="+t.from.toString()+"-"+t.to.toString():"bytes="+t.from.toString()+"-",i.Range=n}else this._zeroStart&&(i.Range="bytes=0-");return{url:e,headers:i}},e.prototype.removeURLParameters=function(e){return e},e}(),v=function(){function e(e,t){this._startName=e,this._endName=t}return e.prototype.getConfig=function(e,t){var i=e;if(0!==t.from||-1!==t.to){var n=!0;-1===i.indexOf("?")&&(i+="?",n=!1),n&&(i+="&"),i+=this._startName+"="+t.from.toString(),-1!==t.to&&(i+="&"+this._endName+"="+t.to.toString())}return{url:i,headers:{}}},e.prototype.removeURLParameters=function(e){var t=e.split("?")[0],i=void 0,n=e.indexOf("?");-1!==n&&(i=e.substring(n+1));var r="";if(null!=i&&i.length>0)for(var s=i.split("&"),a=0;a<s.length;a++){var o=s[a].split("="),h=a>0;o[0]!==this._startName&&o[0]!==this._endName&&(h&&(r+="&"),r+=s[a])}return 0===r.length?t:t+"?"+r},e}(),y=function(){function e(e,t,i){this.TAG="IOController",this._config=t,this._extraData=i,this._stashInitialSize=65536,null!=t.stashInitialSize&&t.stashInitialSize>0&&(this._stashInitialSize=t.stashInitialSize),this._stashUsed=0,this._stashSize=this._stashInitialSize,this._bufferSize=3145728,this._stashBuffer=new ArrayBuffer(this._bufferSize),this._stashByteStart=0,this._enableStash=!0,!1===t.enableStashBuffer&&(this._enableStash=!1),this._loader=null,this._loaderClass=null,this._seekHandler=null,this._dataSource=e,this._isWebSocketURL=/wss?:\/\/(.+?)/.test(e.url),this._refTotalLength=e.filesize?e.filesize:null,this._totalLength=this._refTotalLength,this._fullRequestFlag=!1,this._currentRange=null,this._redirectedURL=null,this._speedNormalized=0,this._speedSampler=new s,this._speedNormalizeList=[32,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096],this._isEarlyEofReconnecting=!1,this._paused=!1,this._resumeFrom=0,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._selectSeekHandler(),this._selectLoader(),this._createLoader()}return e.prototype.destroy=function(){this._loader.isWorking()&&this._loader.abort(),this._loader.destroy(),this._loader=null,this._loaderClass=null,this._dataSource=null,this._stashBuffer=null,this._stashUsed=this._stashSize=this._bufferSize=this._stashByteStart=0,this._currentRange=null,this._speedSampler=null,this._isEarlyEofReconnecting=!1,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._extraData=null},e.prototype.isWorking=function(){return this._loader&&this._loader.isWorking()&&!this._paused},e.prototype.isPaused=function(){return this._paused},Object.defineProperty(e.prototype,"status",{get:function(){return this._loader.status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extraData",{get:function(){return this._extraData},set:function(e){this._extraData=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onSeeked",{get:function(){return this._onSeeked},set:function(e){this._onSeeked=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRedirect",{get:function(){return this._onRedirect},set:function(e){this._onRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRecoveredEarlyEof",{get:function(){return this._onRecoveredEarlyEof},set:function(e){this._onRecoveredEarlyEof=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentURL",{get:function(){return this._dataSource.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasRedirect",{get:function(){return null!=this._redirectedURL||null!=this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentRedirectedURL",{get:function(){return this._redirectedURL||this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentSpeed",{get:function(){return this._loaderClass===f?this._loader.currentSpeed:this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"loaderType",{get:function(){return this._loader.type},enumerable:!1,configurable:!0}),e.prototype._selectSeekHandler=function(){var e=this._config;if("range"===e.seekType)this._seekHandler=new g(this._config.rangeLoadZeroStart);else if("param"===e.seekType){var t=e.seekParamStart||"bstart",i=e.seekParamEnd||"bend";this._seekHandler=new v(t,i)}else{if("custom"!==e.seekType)throw new h.b("Invalid seekType in config: "+e.seekType);if("function"!=typeof e.customSeekHandler)throw new h.b("Custom seekType specified in config but invalid customSeekHandler!");this._seekHandler=new e.customSeekHandler}},e.prototype._selectLoader=function(){if(null!=this._config.customLoader)this._loaderClass=this._config.customLoader;else if(this._isWebSocketURL)this._loaderClass=m;else if(u.isSupported())this._loaderClass=u;else if(l.isSupported())this._loaderClass=l;else{if(!f.isSupported())throw new h.d("Your browser doesn't support xhr with arraybuffer responseType!");this._loaderClass=f}},e.prototype._createLoader=function(){this._loader=new this._loaderClass(this._seekHandler,this._config),!1===this._loader.needStashBuffer&&(this._enableStash=!1),this._loader.onContentLengthKnown=this._onContentLengthKnown.bind(this),this._loader.onURLRedirect=this._onURLRedirect.bind(this),this._loader.onDataArrival=this._onLoaderChunkArrival.bind(this),this._loader.onComplete=this._onLoaderComplete.bind(this),this._loader.onError=this._onLoaderError.bind(this)},e.prototype.open=function(e){this._currentRange={from:0,to:-1},e&&(this._currentRange.from=e),this._speedSampler.reset(),e||(this._fullRequestFlag=!0),this._loader.open(this._dataSource,Object.assign({},this._currentRange))},e.prototype.abort=function(){this._loader.abort(),this._paused&&(this._paused=!1,this._resumeFrom=0)},e.prototype.pause=function(){this.isWorking()&&(this._loader.abort(),0!==this._stashUsed?(this._resumeFrom=this._stashByteStart,this._currentRange.to=this._stashByteStart-1):this._resumeFrom=this._currentRange.to+1,this._stashUsed=0,this._stashByteStart=0,this._paused=!0)},e.prototype.resume=function(){if(this._paused){this._paused=!1;var e=this._resumeFrom;this._resumeFrom=0,this._internalSeek(e,!0)}},e.prototype.seek=function(e){this._paused=!1,this._stashUsed=0,this._stashByteStart=0,this._internalSeek(e,!0)},e.prototype._internalSeek=function(e,t){this._loader.isWorking()&&this._loader.abort(),this._flushStashBuffer(t),this._loader.destroy(),this._loader=null;var i={from:e,to:-1};this._currentRange={from:i.from,to:-1},this._speedSampler.reset(),this._stashSize=this._stashInitialSize,this._createLoader(),this._loader.open(this._dataSource,i),this._onSeeked&&this._onSeeked()},e.prototype.updateUrl=function(e){if(!e||"string"!=typeof e||0===e.length)throw new h.b("Url must be a non-empty string!");this._dataSource.url=e},e.prototype._expandBuffer=function(e){for(var t=this._stashSize;t+1048576<e;)t*=2;if((t+=1048576)!==this._bufferSize){var i=new ArrayBuffer(t);if(this._stashUsed>0){var n=new Uint8Array(this._stashBuffer,0,this._stashUsed);new Uint8Array(i,0,t).set(n,0)}this._stashBuffer=i,this._bufferSize=t}},e.prototype._normalizeSpeed=function(e){var t=this._speedNormalizeList,i=t.length-1,n=0,r=0,s=i;if(e<t[0])return t[0];for(;r<=s;){if((n=r+Math.floor((s-r)/2))===i||e>=t[n]&&e<t[n+1])return t[n];t[n]<e?r=n+1:s=n-1}},e.prototype._adjustStashSize=function(e){var t=0;(t=this._config.isLive?e/8:e<512?e:e>=512&&e<=1024?Math.floor(1.5*e):2*e)>8192&&(t=8192);var i=1024*t+1048576;this._bufferSize<i&&this._expandBuffer(i),this._stashSize=1024*t},e.prototype._dispatchChunks=function(e,t){return this._currentRange.to=t+e.byteLength-1,this._onDataArrival(e,t)},e.prototype._onURLRedirect=function(e){this._redirectedURL=e,this._onRedirect&&this._onRedirect(e)},e.prototype._onContentLengthKnown=function(e){e&&this._fullRequestFlag&&(this._totalLength=e,this._fullRequestFlag=!1)},e.prototype._onLoaderChunkArrival=function(e,t,i){if(!this._onDataArrival)throw new h.a("IOController: No existing consumer (onDataArrival) callback!");if(!this._paused){this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,this._onRecoveredEarlyEof&&this._onRecoveredEarlyEof()),this._speedSampler.addBytes(e.byteLength);var n=this._speedSampler.lastSecondKBps;if(0!==n){var r=this._normalizeSpeed(n);this._speedNormalized!==r&&(this._speedNormalized=r,this._adjustStashSize(r))}if(this._enableStash)if(0===this._stashUsed&&0===this._stashByteStart&&(this._stashByteStart=t),this._stashUsed+e.byteLength<=this._stashSize){(o=new Uint8Array(this._stashBuffer,0,this._stashSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else{o=new Uint8Array(this._stashBuffer,0,this._bufferSize);if(this._stashUsed>0){var s=this._stashBuffer.slice(0,this._stashUsed);if((d=this._dispatchChunks(s,this._stashByteStart))<s.byteLength){if(d>0){u=new Uint8Array(s,d);o.set(u,0),this._stashUsed=u.byteLength,this._stashByteStart+=d}}else this._stashUsed=0,this._stashByteStart+=d;this._stashUsed+e.byteLength>this._bufferSize&&(this._expandBuffer(this._stashUsed+e.byteLength),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else{if((d=this._dispatchChunks(e,t))<e.byteLength)(a=e.byteLength-d)>this._bufferSize&&(this._expandBuffer(a),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e,d),0),this._stashUsed+=a,this._stashByteStart=t+d}}else if(0===this._stashUsed){var a;if((d=this._dispatchChunks(e,t))<e.byteLength)(a=e.byteLength-d)>this._bufferSize&&this._expandBuffer(a),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e,d),0),this._stashUsed+=a,this._stashByteStart=t+d}else{var o,d;if(this._stashUsed+e.byteLength>this._bufferSize&&this._expandBuffer(this._stashUsed+e.byteLength),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength,(d=this._dispatchChunks(this._stashBuffer.slice(0,this._stashUsed),this._stashByteStart))<this._stashUsed&&d>0){var u=new Uint8Array(this._stashBuffer,d);o.set(u,0)}this._stashUsed-=d,this._stashByteStart+=d}}},e.prototype._flushStashBuffer=function(e){if(this._stashUsed>0){var t=this._stashBuffer.slice(0,this._stashUsed),i=this._dispatchChunks(t,this._stashByteStart),n=t.byteLength-i;if(i<t.byteLength){if(!e){if(i>0){var s=new Uint8Array(this._stashBuffer,0,this._bufferSize),a=new Uint8Array(t,i);s.set(a,0),this._stashUsed=a.byteLength,this._stashByteStart+=i}return 0}r.a.w(this.TAG,n+" bytes unconsumed data remain when flush buffer, dropped")}return this._stashUsed=0,this._stashByteStart=0,n}return 0},e.prototype._onLoaderComplete=function(e,t){this._flushStashBuffer(!0),this._onComplete&&this._onComplete(this._extraData)},e.prototype._onLoaderError=function(e,t){switch(r.a.e(this.TAG,"Loader error, code = "+t.code+", msg = "+t.msg),this._flushStashBuffer(!1),this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,e=a.b.UNRECOVERABLE_EARLY_EOF),e){case a.b.EARLY_EOF:if(!this._config.isLive&&this._totalLength){var i=this._currentRange.to+1;return void(i<this._totalLength&&(r.a.w(this.TAG,"Connection lost, trying reconnect..."),this._isEarlyEofReconnecting=!0,this._internalSeek(i,!1)))}e=a.b.UNRECOVERABLE_EARLY_EOF;break;case a.b.UNRECOVERABLE_EARLY_EOF:case a.b.CONNECTING_TIMEOUT:case a.b.HTTP_STATUS_CODE_INVALID:case a.b.EXCEPTION:}if(!this._onError)throw new h.d("IOException: "+t.msg);this._onError(e,t)},e}();t.a=y},function(e,t,i){"use strict";var n=function(){function e(){}return e.install=function(){Object.setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},Object.assign=Object.assign||function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),i=1;i<arguments.length;i++){var n=arguments[i];if(null!=n)for(var r in n)n.hasOwnProperty(r)&&(t[r]=n[r])}return t},"function"!=typeof self.Promise&&i(15).polyfill()},e}();n.install(),t.a=n},function(e,t,i){function n(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=t,i.i=function(e){return e},i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},i.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var n=i(i.s=ENTRY_MODULE);return n.default||n}function r(e){return(e+"").replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function s(e,t,n){var s={};s[n]=[];var a=t.toString(),o=a.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/);if(!o)return s;for(var h,d=o[1],u=new RegExp("(\\\\n|\\W)"+r(d)+"\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)","g");h=u.exec(a);)"dll-reference"!==h[3]&&s[n].push(h[3]);for(u=new RegExp("\\("+r(d)+'\\("(dll-reference\\s([\\.|\\-|\\+|\\w|/|@]+))"\\)\\)\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)',"g");h=u.exec(a);)e[h[2]]||(s[n].push(h[1]),e[h[2]]=i(h[1]).m),s[h[2]]=s[h[2]]||[],s[h[2]].push(h[4]);for(var _,l=Object.keys(s),c=0;c<l.length;c++)for(var f=0;f<s[l[c]].length;f++)_=s[l[c]][f],isNaN(1*_)||(s[l[c]][f]=1*s[l[c]][f]);return s}function a(e){return Object.keys(e).reduce((function(t,i){return t||e[i].length>0}),!1)}e.exports=function(e,t){t=t||{};var r={main:i.m},o=t.all?{main:Object.keys(r.main)}:function(e,t){for(var i={main:[t]},n={main:[]},r={main:{}};a(i);)for(var o=Object.keys(i),h=0;h<o.length;h++){var d=o[h],u=i[d].pop();if(r[d]=r[d]||{},!r[d][u]&&e[d][u]){r[d][u]=!0,n[d]=n[d]||[],n[d].push(u);for(var _=s(e,e[d][u],d),l=Object.keys(_),c=0;c<l.length;c++)i[l[c]]=i[l[c]]||[],i[l[c]]=i[l[c]].concat(_[l[c]])}}return n}(r,e),h="";Object.keys(o).filter((function(e){return"main"!==e})).forEach((function(e){for(var t=0;o[e][t];)t++;o[e].push(t),r[e][t]="(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })",h=h+"var "+e+" = ("+n.toString().replace("ENTRY_MODULE",JSON.stringify(t))+")({"+o[e].map((function(t){return JSON.stringify(t)+": "+r[e][t].toString()})).join(",")+"});\n"})),h=h+"new (("+n.toString().replace("ENTRY_MODULE",JSON.stringify(e))+")({"+o.main.map((function(e){return JSON.stringify(e)+": "+r.main[e].toString()})).join(",")+"}))(self);";var d=new window.Blob([h],{type:"text/javascript"});if(t.bare)return d;var u=(window.URL||window.webkitURL||window.mozURL||window.msURL).createObjectURL(d),_=new window.Worker(u);return _.objectURL=u,_}},function(e,t,i){e.exports=i(19).default},function(e,t,i){(function(t,i){ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.8+1e68dce6 + */var n;n=function(){"use strict";function e(e){return"function"==typeof e}var n=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},r=0,s=void 0,a=void 0,o=function(e,t){f[r]=e,f[r+1]=t,2===(r+=2)&&(a?a(p):b())},h="undefined"!=typeof window?window:void 0,d=h||{},u=d.MutationObserver||d.WebKitMutationObserver,_="undefined"==typeof self&&void 0!==t&&"[object process]"==={}.toString.call(t),l="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function c(){var e=setTimeout;return function(){return e(p,1)}}var f=new Array(1e3);function p(){for(var e=0;e<r;e+=2)(0,f[e])(f[e+1]),f[e]=void 0,f[e+1]=void 0;r=0}var m,g,v,y,b=void 0;function E(e,t){var i=this,n=new this.constructor(R);void 0===n[A]&&M(n);var r=i._state;if(r){var s=arguments[r-1];o((function(){return O(r,n,s,i._result)}))}else C(i,n,e,t);return n}function S(e){if(e&&"object"==typeof e&&e.constructor===this)return e;var t=new this(R);return T(t,e),t}_?b=function(){return t.nextTick(p)}:u?(g=0,v=new u(p),y=document.createTextNode(""),v.observe(y,{characterData:!0}),b=function(){y.data=g=++g%2}):l?((m=new MessageChannel).port1.onmessage=p,b=function(){return m.port2.postMessage(0)}):b=void 0===h?function(){try{var e=Function("return this")().require("vertx");return void 0!==(s=e.runOnLoop||e.runOnContext)?function(){s(p)}:c()}catch(e){return c()}}():c();var A=Math.random().toString(36).substring(2);function R(){}function L(t,i,n){i.constructor===t.constructor&&n===E&&i.constructor.resolve===S?function(e,t){1===t._state?D(e,t._result):2===t._state?k(e,t._result):C(t,void 0,(function(t){return T(e,t)}),(function(t){return k(e,t)}))}(t,i):void 0===n?D(t,i):e(n)?function(e,t,i){o((function(e){var n=!1,r=function(e,t,i,n){try{e.call(t,i,n)}catch(e){return e}}(i,t,(function(i){n||(n=!0,t!==i?T(e,i):D(e,i))}),(function(t){n||(n=!0,k(e,t))}),e._label);!n&&r&&(n=!0,k(e,r))}),e)}(t,i,n):D(t,i)}function T(e,t){if(e===t)k(e,new TypeError("You cannot resolve a promise with itself"));else if(r=typeof(n=t),null===n||"object"!==r&&"function"!==r)D(e,t);else{var i=void 0;try{i=t.then}catch(t){return void k(e,t)}L(e,t,i)}var n,r}function w(e){e._onerror&&e._onerror(e._result),I(e)}function D(e,t){void 0===e._state&&(e._result=t,e._state=1,0!==e._subscribers.length&&o(I,e))}function k(e,t){void 0===e._state&&(e._state=2,e._result=t,o(w,e))}function C(e,t,i,n){var r=e._subscribers,s=r.length;e._onerror=null,r[s]=t,r[s+1]=i,r[s+2]=n,0===s&&e._state&&o(I,e)}function I(e){var t=e._subscribers,i=e._state;if(0!==t.length){for(var n=void 0,r=void 0,s=e._result,a=0;a<t.length;a+=3)n=t[a],r=t[a+i],n?O(i,n,r,s):r(s);e._subscribers.length=0}}function O(t,i,n,r){var s=e(n),a=void 0,o=void 0,h=!0;if(s){try{a=n(r)}catch(e){h=!1,o=e}if(i===a)return void k(i,new TypeError("A promises callback cannot return that same promise."))}else a=r;void 0!==i._state||(s&&h?T(i,a):!1===h?k(i,o):1===t?D(i,a):2===t&&k(i,a))}var P=0;function M(e){e[A]=P++,e._state=void 0,e._result=void 0,e._subscribers=[]}var x=function(){function e(e,t){this._instanceConstructor=e,this.promise=new e(R),this.promise[A]||M(this.promise),n(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0===this.length?D(this.promise,this._result):(this.length=this.length||0,this._enumerate(t),0===this._remaining&&D(this.promise,this._result))):k(this.promise,new Error("Array Methods must be provided an Array"))}return e.prototype._enumerate=function(e){for(var t=0;void 0===this._state&&t<e.length;t++)this._eachEntry(e[t],t)},e.prototype._eachEntry=function(e,t){var i=this._instanceConstructor,n=i.resolve;if(n===S){var r=void 0,s=void 0,a=!1;try{r=e.then}catch(e){a=!0,s=e}if(r===E&&void 0!==e._state)this._settledAt(e._state,t,e._result);else if("function"!=typeof r)this._remaining--,this._result[t]=e;else if(i===B){var o=new i(R);a?k(o,s):L(o,e,r),this._willSettleAt(o,t)}else this._willSettleAt(new i((function(t){return t(e)})),t)}else this._willSettleAt(n(e),t)},e.prototype._settledAt=function(e,t,i){var n=this.promise;void 0===n._state&&(this._remaining--,2===e?k(n,i):this._result[t]=i),0===this._remaining&&D(n,this._result)},e.prototype._willSettleAt=function(e,t){var i=this;C(e,void 0,(function(e){return i._settledAt(1,t,e)}),(function(e){return i._settledAt(2,t,e)}))},e}(),B=function(){function t(e){this[A]=P++,this._result=this._state=void 0,this._subscribers=[],R!==e&&("function"!=typeof e&&function(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}(),this instanceof t?function(e,t){try{t((function(t){T(e,t)}),(function(t){k(e,t)}))}catch(t){k(e,t)}}(this,e):function(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}())}return t.prototype.catch=function(e){return this.then(null,e)},t.prototype.finally=function(t){var i=this.constructor;return e(t)?this.then((function(e){return i.resolve(t()).then((function(){return e}))}),(function(e){return i.resolve(t()).then((function(){throw e}))})):this.then(t,t)},t}();return B.prototype.then=E,B.all=function(e){return new x(this,e).promise},B.race=function(e){var t=this;return n(e)?new t((function(i,n){for(var r=e.length,s=0;s<r;s++)t.resolve(e[s]).then(i,n)})):new t((function(e,t){return t(new TypeError("You must pass an array to race."))}))},B.resolve=S,B.reject=function(e){var t=new this(R);return k(t,e),t},B._setScheduler=function(e){a=e},B._setAsap=function(e){o=e},B._asap=o,B.polyfill=function(){var e=void 0;if(void 0!==i)e=i;else if("undefined"!=typeof self)e=self;else try{e=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var t=e.Promise;if(t){var n=null;try{n=Object.prototype.toString.call(t.resolve())}catch(e){}if("[object Promise]"===n&&!t.cast)return}e.Promise=B},B.Promise=B,B},e.exports=n()}).call(this,i(16),i(17))},function(e,t){var i,n,r=e.exports={};function s(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function o(e){if(i===setTimeout)return setTimeout(e,0);if((i===s||!i)&&setTimeout)return i=setTimeout,setTimeout(e,0);try{return i(e,0)}catch(t){try{return i.call(null,e,0)}catch(t){return i.call(this,e,0)}}}!function(){try{i="function"==typeof setTimeout?setTimeout:s}catch(e){i=s}try{n="function"==typeof clearTimeout?clearTimeout:a}catch(e){n=a}}();var h,d=[],u=!1,_=-1;function l(){u&&h&&(u=!1,h.length?d=h.concat(d):_=-1,d.length&&c())}function c(){if(!u){var e=o(l);u=!0;for(var t=d.length;t;){for(h=d,d=[];++_<t;)h&&h[_].run();_=-1,t=d.length}h=null,u=!1,function(e){if(n===clearTimeout)return clearTimeout(e);if((n===a||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(e);try{n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}(e)}}function f(e,t){this.fun=e,this.array=t}function p(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)t[i-1]=arguments[i];d.push(new f(e,t)),1!==d.length||u||o(c)},f.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=p,r.addListener=p,r.once=p,r.off=p,r.removeListener=p,r.removeAllListeners=p,r.emit=p,r.prependListener=p,r.prependOnceListener=p,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i},function(e,t,i){"use strict";i.r(t);var n=i(9),r=i(12),s=i(10),a=i(1);t.default=function(e){var t=null,i=function(t,i){e.postMessage({msg:"logcat_callback",data:{type:t,logcat:i}})}.bind(this);function o(t,i){var n={msg:a.a.INIT_SEGMENT,data:{type:t,data:i}};e.postMessage(n,[i.data])}function h(t,i){var n={msg:a.a.MEDIA_SEGMENT,data:{type:t,data:i}};e.postMessage(n,[i.data])}function d(){var t={msg:a.a.LOADING_COMPLETE};e.postMessage(t)}function u(){var t={msg:a.a.RECOVERED_EARLY_EOF};e.postMessage(t)}function _(t){var i={msg:a.a.MEDIA_INFO,data:t};e.postMessage(i)}function l(t){var i={msg:a.a.METADATA_ARRIVED,data:t};e.postMessage(i)}function c(t){var i={msg:a.a.SCRIPTDATA_ARRIVED,data:t};e.postMessage(i)}function f(t){var i={msg:a.a.TIMED_ID3_METADATA_ARRIVED,data:t};e.postMessage(i)}function p(t){var i={msg:a.a.PES_PRIVATE_DATA_DESCRIPTOR,data:t};e.postMessage(i)}function m(t){var i={msg:a.a.PES_PRIVATE_DATA_ARRIVED,data:t};e.postMessage(i)}function g(t){var i={msg:a.a.STATISTICS_INFO,data:t};e.postMessage(i)}function v(t,i){e.postMessage({msg:a.a.IO_ERROR,data:{type:t,info:i}})}function y(t,i){e.postMessage({msg:a.a.DEMUX_ERROR,data:{type:t,info:i}})}function b(t){e.postMessage({msg:a.a.RECOMMEND_SEEKPOINT,data:t})}r.a.install(),e.addEventListener("message",(function(r){switch(r.data.cmd){case"init":(t=new s.a(r.data.param[0],r.data.param[1])).on(a.a.IO_ERROR,v.bind(this)),t.on(a.a.DEMUX_ERROR,y.bind(this)),t.on(a.a.INIT_SEGMENT,o.bind(this)),t.on(a.a.MEDIA_SEGMENT,h.bind(this)),t.on(a.a.LOADING_COMPLETE,d.bind(this)),t.on(a.a.RECOVERED_EARLY_EOF,u.bind(this)),t.on(a.a.MEDIA_INFO,_.bind(this)),t.on(a.a.METADATA_ARRIVED,l.bind(this)),t.on(a.a.SCRIPTDATA_ARRIVED,c.bind(this)),t.on(a.a.TIMED_ID3_METADATA_ARRIVED,f.bind(this)),t.on(a.a.PES_PRIVATE_DATA_DESCRIPTOR,p.bind(this)),t.on(a.a.PES_PRIVATE_DATA_ARRIVED,m.bind(this)),t.on(a.a.STATISTICS_INFO,g.bind(this)),t.on(a.a.RECOMMEND_SEEKPOINT,b.bind(this));break;case"destroy":t&&(t.destroy(),t=null),e.postMessage({msg:"destroyed"});break;case"start":t.start();break;case"stop":t.stop();break;case"seek":t.seek(r.data.param);break;case"pause":t.pause();break;case"resume":t.resume();break;case"logging_config":var E=r.data.param;n.a.applyConfig(E),!0===E.enableCallback?n.a.addLogListener(i):n.a.removeLogListener(i)}}))}},function(e,t,i){"use strict";i.r(t);var n=i(12),r=i(11),s={enableWorker:!1,enableStashBuffer:!0,stashInitialSize:void 0,isLive:!1,liveBufferLatencyChasing:!1,liveBufferLatencyMaxLatency:1.5,liveBufferLatencyMinRemain:.5,lazyLoad:!0,lazyLoadMaxDuration:180,lazyLoadRecoverDuration:30,deferLoadAfterSourceOpen:!0,autoCleanupMaxBackwardDuration:180,autoCleanupMinBackwardDuration:120,statisticsInfoReportInterval:600,fixAudioTimestampGap:!0,accurateSeek:!1,seekType:"range",seekParamStart:"bstart",seekParamEnd:"bend",rangeLoadZeroStart:!1,customSeekHandler:void 0,reuseRedirectedURL:!1,headers:void 0,customLoader:void 0};function a(){return Object.assign({},s)}var o=function(){function e(){}return e.supportMSEH264Playback=function(){return window.MediaSource&&window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')},e.supportNetworkStreamIO=function(){var e=new r.a({},a()),t=e.loaderType;return e.destroy(),"fetch-stream-loader"==t||"xhr-moz-chunked-loader"==t},e.getNetworkLoaderTypeName=function(){var e=new r.a({},a()),t=e.loaderType;return e.destroy(),t},e.supportNativeMediaPlayback=function(t){null==e.videoElement&&(e.videoElement=window.document.createElement("video"));var i=e.videoElement.canPlayType(t);return"probably"===i||"maybe"==i},e.getFeatureList=function(){var t={msePlayback:!1,mseLivePlayback:!1,networkStreamIO:!1,networkLoaderName:"",nativeMP4H264Playback:!1,nativeWebmVP8Playback:!1,nativeWebmVP9Playback:!1};return t.msePlayback=e.supportMSEH264Playback(),t.networkStreamIO=e.supportNetworkStreamIO(),t.networkLoaderName=e.getNetworkLoaderTypeName(),t.mseLivePlayback=t.msePlayback&&t.networkStreamIO,t.nativeMP4H264Playback=e.supportNativeMediaPlayback('video/mp4; codecs="avc1.42001E, mp4a.40.2"'),t.nativeWebmVP8Playback=e.supportNativeMediaPlayback('video/webm; codecs="vp8.0, vorbis"'),t.nativeWebmVP9Playback=e.supportNativeMediaPlayback('video/webm; codecs="vp9"'),t},e}(),h=i(2),d=i(6),u=i.n(d),_=i(0),l=i(4),c={ERROR:"error",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",TIMED_ID3_METADATA_ARRIVED:"timed_id3_metadata_arrived",PES_PRIVATE_DATA_DESCRIPTOR:"pes_private_data_descriptor",PES_PRIVATE_DATA_ARRIVED:"pes_private_data_arrived",STATISTICS_INFO:"statistics_info"},f=i(13),p=i.n(f),m=i(9),g=i(10),v=i(1),y=i(8),b=function(){function e(e,t){if(this.TAG="Transmuxer",this._emitter=new u.a,t.enableWorker&&"undefined"!=typeof Worker)try{this._worker=p()(18),this._workerDestroying=!1,this._worker.addEventListener("message",this._onWorkerMessage.bind(this)),this._worker.postMessage({cmd:"init",param:[e,t]}),this.e={onLoggingConfigChanged:this._onLoggingConfigChanged.bind(this)},m.a.registerListener(this.e.onLoggingConfigChanged),this._worker.postMessage({cmd:"logging_config",param:m.a.getConfig()})}catch(i){_.a.e(this.TAG,"Error while initialize transmuxing worker, fallback to inline transmuxing"),this._worker=null,this._controller=new g.a(e,t)}else this._controller=new g.a(e,t);if(this._controller){var i=this._controller;i.on(v.a.IO_ERROR,this._onIOError.bind(this)),i.on(v.a.DEMUX_ERROR,this._onDemuxError.bind(this)),i.on(v.a.INIT_SEGMENT,this._onInitSegment.bind(this)),i.on(v.a.MEDIA_SEGMENT,this._onMediaSegment.bind(this)),i.on(v.a.LOADING_COMPLETE,this._onLoadingComplete.bind(this)),i.on(v.a.RECOVERED_EARLY_EOF,this._onRecoveredEarlyEof.bind(this)),i.on(v.a.MEDIA_INFO,this._onMediaInfo.bind(this)),i.on(v.a.METADATA_ARRIVED,this._onMetaDataArrived.bind(this)),i.on(v.a.SCRIPTDATA_ARRIVED,this._onScriptDataArrived.bind(this)),i.on(v.a.TIMED_ID3_METADATA_ARRIVED,this._onTimedID3MetadataArrived.bind(this)),i.on(v.a.PES_PRIVATE_DATA_DESCRIPTOR,this._onPESPrivateDataDescriptor.bind(this)),i.on(v.a.PES_PRIVATE_DATA_ARRIVED,this._onPESPrivateDataArrived.bind(this)),i.on(v.a.STATISTICS_INFO,this._onStatisticsInfo.bind(this)),i.on(v.a.RECOMMEND_SEEKPOINT,this._onRecommendSeekpoint.bind(this))}}return e.prototype.destroy=function(){this._worker?this._workerDestroying||(this._workerDestroying=!0,this._worker.postMessage({cmd:"destroy"}),m.a.removeListener(this.e.onLoggingConfigChanged),this.e=null):(this._controller.destroy(),this._controller=null),this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.hasWorker=function(){return null!=this._worker},e.prototype.open=function(){this._worker?this._worker.postMessage({cmd:"start"}):this._controller.start()},e.prototype.close=function(){this._worker?this._worker.postMessage({cmd:"stop"}):this._controller.stop()},e.prototype.seek=function(e){this._worker?this._worker.postMessage({cmd:"seek",param:e}):this._controller.seek(e)},e.prototype.pause=function(){this._worker?this._worker.postMessage({cmd:"pause"}):this._controller.pause()},e.prototype.resume=function(){this._worker?this._worker.postMessage({cmd:"resume"}):this._controller.resume()},e.prototype._onInitSegment=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.a.INIT_SEGMENT,e,t)}))},e.prototype._onMediaSegment=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.a.MEDIA_SEGMENT,e,t)}))},e.prototype._onLoadingComplete=function(){var e=this;Promise.resolve().then((function(){e._emitter.emit(v.a.LOADING_COMPLETE)}))},e.prototype._onRecoveredEarlyEof=function(){var e=this;Promise.resolve().then((function(){e._emitter.emit(v.a.RECOVERED_EARLY_EOF)}))},e.prototype._onMediaInfo=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.MEDIA_INFO,e)}))},e.prototype._onMetaDataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.METADATA_ARRIVED,e)}))},e.prototype._onScriptDataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.SCRIPTDATA_ARRIVED,e)}))},e.prototype._onTimedID3MetadataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.TIMED_ID3_METADATA_ARRIVED,e)}))},e.prototype._onPESPrivateDataDescriptor=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.PES_PRIVATE_DATA_DESCRIPTOR,e)}))},e.prototype._onPESPrivateDataArrived=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.PES_PRIVATE_DATA_ARRIVED,e)}))},e.prototype._onStatisticsInfo=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.STATISTICS_INFO,e)}))},e.prototype._onIOError=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.a.IO_ERROR,e,t)}))},e.prototype._onDemuxError=function(e,t){var i=this;Promise.resolve().then((function(){i._emitter.emit(v.a.DEMUX_ERROR,e,t)}))},e.prototype._onRecommendSeekpoint=function(e){var t=this;Promise.resolve().then((function(){t._emitter.emit(v.a.RECOMMEND_SEEKPOINT,e)}))},e.prototype._onLoggingConfigChanged=function(e){this._worker&&this._worker.postMessage({cmd:"logging_config",param:e})},e.prototype._onWorkerMessage=function(e){var t=e.data,i=t.data;if("destroyed"===t.msg||this._workerDestroying)return this._workerDestroying=!1,this._worker.terminate(),void(this._worker=null);switch(t.msg){case v.a.INIT_SEGMENT:case v.a.MEDIA_SEGMENT:this._emitter.emit(t.msg,i.type,i.data);break;case v.a.LOADING_COMPLETE:case v.a.RECOVERED_EARLY_EOF:this._emitter.emit(t.msg);break;case v.a.MEDIA_INFO:Object.setPrototypeOf(i,y.a.prototype),this._emitter.emit(t.msg,i);break;case v.a.METADATA_ARRIVED:case v.a.SCRIPTDATA_ARRIVED:case v.a.TIMED_ID3_METADATA_ARRIVED:case v.a.PES_PRIVATE_DATA_DESCRIPTOR:case v.a.PES_PRIVATE_DATA_ARRIVED:case v.a.STATISTICS_INFO:this._emitter.emit(t.msg,i);break;case v.a.IO_ERROR:case v.a.DEMUX_ERROR:this._emitter.emit(t.msg,i.type,i.info);break;case v.a.RECOMMEND_SEEKPOINT:this._emitter.emit(t.msg,i);break;case"logcat_callback":_.a.emitter.emit("log",i.type,i.logcat)}},e}(),E={ERROR:"error",SOURCE_OPEN:"source_open",UPDATE_END:"update_end",BUFFER_FULL:"buffer_full"},S=i(7),A=i(3),R=function(){function e(e){this.TAG="MSEController",this._config=e,this._emitter=new u.a,this._config.isLive&&null==this._config.autoCleanupSourceBuffer&&(this._config.autoCleanupSourceBuffer=!0),this.e={onSourceOpen:this._onSourceOpen.bind(this),onSourceEnded:this._onSourceEnded.bind(this),onSourceClose:this._onSourceClose.bind(this),onSourceBufferError:this._onSourceBufferError.bind(this),onSourceBufferUpdateEnd:this._onSourceBufferUpdateEnd.bind(this)},this._mediaSource=null,this._mediaSourceObjectURL=null,this._mediaElement=null,this._isBufferFull=!1,this._hasPendingEos=!1,this._requireSetMediaDuration=!1,this._pendingMediaDuration=0,this._pendingSourceBufferInit=[],this._mimeTypes={video:null,audio:null},this._sourceBuffers={video:null,audio:null},this._lastInitSegments={video:null,audio:null},this._pendingSegments={video:[],audio:[]},this._pendingRemoveRanges={video:[],audio:[]},this._idrList=new S.a}return e.prototype.destroy=function(){(this._mediaElement||this._mediaSource)&&this.detachMediaElement(),this.e=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){if(this._mediaSource)throw new A.a("MediaSource has been attached to an HTMLMediaElement!");var t=this._mediaSource=new window.MediaSource;t.addEventListener("sourceopen",this.e.onSourceOpen),t.addEventListener("sourceended",this.e.onSourceEnded),t.addEventListener("sourceclose",this.e.onSourceClose),this._mediaElement=e,this._mediaSourceObjectURL=window.URL.createObjectURL(this._mediaSource),e.src=this._mediaSourceObjectURL},e.prototype.detachMediaElement=function(){if(this._mediaSource){var e=this._mediaSource;for(var t in this._sourceBuffers){var i=this._pendingSegments[t];i.splice(0,i.length),this._pendingSegments[t]=null,this._pendingRemoveRanges[t]=null,this._lastInitSegments[t]=null;var n=this._sourceBuffers[t];if(n){if("closed"!==e.readyState){try{e.removeSourceBuffer(n)}catch(e){_.a.e(this.TAG,e.message)}n.removeEventListener("error",this.e.onSourceBufferError),n.removeEventListener("updateend",this.e.onSourceBufferUpdateEnd)}this._mimeTypes[t]=null,this._sourceBuffers[t]=null}}if("open"===e.readyState)try{e.endOfStream()}catch(e){_.a.e(this.TAG,e.message)}e.removeEventListener("sourceopen",this.e.onSourceOpen),e.removeEventListener("sourceended",this.e.onSourceEnded),e.removeEventListener("sourceclose",this.e.onSourceClose),this._pendingSourceBufferInit=[],this._isBufferFull=!1,this._idrList.clear(),this._mediaSource=null}this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src"),this._mediaElement=null),this._mediaSourceObjectURL&&(window.URL.revokeObjectURL(this._mediaSourceObjectURL),this._mediaSourceObjectURL=null)},e.prototype.appendInitSegment=function(e,t){if(!this._mediaSource||"open"!==this._mediaSource.readyState)return this._pendingSourceBufferInit.push(e),void this._pendingSegments[e.type].push(e);var i=e,n=""+i.container;i.codec&&i.codec.length>0&&(n+=";codecs="+i.codec);var r=!1;if(_.a.v(this.TAG,"Received Initialization Segment, mimeType: "+n),this._lastInitSegments[i.type]=i,n!==this._mimeTypes[i.type]){if(this._mimeTypes[i.type])_.a.v(this.TAG,"Notice: "+i.type+" mimeType changed, origin: "+this._mimeTypes[i.type]+", target: "+n);else{r=!0;try{var s=this._sourceBuffers[i.type]=this._mediaSource.addSourceBuffer(n);s.addEventListener("error",this.e.onSourceBufferError),s.addEventListener("updateend",this.e.onSourceBufferUpdateEnd)}catch(e){return _.a.e(this.TAG,e.message),void this._emitter.emit(E.ERROR,{code:e.code,msg:e.message})}}this._mimeTypes[i.type]=n}t||this._pendingSegments[i.type].push(i),r||this._sourceBuffers[i.type]&&!this._sourceBuffers[i.type].updating&&this._doAppendSegments(),l.a.safari&&"audio/mpeg"===i.container&&i.mediaDuration>0&&(this._requireSetMediaDuration=!0,this._pendingMediaDuration=i.mediaDuration/1e3,this._updateMediaSourceDuration())},e.prototype.appendMediaSegment=function(e){var t=e;this._pendingSegments[t.type].push(t),this._config.autoCleanupSourceBuffer&&this._needCleanupSourceBuffer()&&this._doCleanupSourceBuffer();var i=this._sourceBuffers[t.type];!i||i.updating||this._hasPendingRemoveRanges()||this._doAppendSegments()},e.prototype.seek=function(e){for(var t in this._sourceBuffers)if(this._sourceBuffers[t]){var i=this._sourceBuffers[t];if("open"===this._mediaSource.readyState)try{i.abort()}catch(e){_.a.e(this.TAG,e.message)}this._idrList.clear();var n=this._pendingSegments[t];if(n.splice(0,n.length),"closed"!==this._mediaSource.readyState){for(var r=0;r<i.buffered.length;r++){var s=i.buffered.start(r),a=i.buffered.end(r);this._pendingRemoveRanges[t].push({start:s,end:a})}if(i.updating||this._doRemoveRanges(),l.a.safari){var o=this._lastInitSegments[t];o&&(this._pendingSegments[t].push(o),i.updating||this._doAppendSegments())}}}},e.prototype.endOfStream=function(){var e=this._mediaSource,t=this._sourceBuffers;e&&"open"===e.readyState?t.video&&t.video.updating||t.audio&&t.audio.updating?this._hasPendingEos=!0:(this._hasPendingEos=!1,e.endOfStream()):e&&"closed"===e.readyState&&this._hasPendingSegments()&&(this._hasPendingEos=!0)},e.prototype.getNearestKeyframe=function(e){return this._idrList.getLastSyncPointBeforeDts(e)},e.prototype._needCleanupSourceBuffer=function(){if(!this._config.autoCleanupSourceBuffer)return!1;var e=this._mediaElement.currentTime;for(var t in this._sourceBuffers){var i=this._sourceBuffers[t];if(i){var n=i.buffered;if(n.length>=1&&e-n.start(0)>=this._config.autoCleanupMaxBackwardDuration)return!0}}return!1},e.prototype._doCleanupSourceBuffer=function(){var e=this._mediaElement.currentTime;for(var t in this._sourceBuffers){var i=this._sourceBuffers[t];if(i){for(var n=i.buffered,r=!1,s=0;s<n.length;s++){var a=n.start(s),o=n.end(s);if(a<=e&&e<o+3){if(e-a>=this._config.autoCleanupMaxBackwardDuration){r=!0;var h=e-this._config.autoCleanupMinBackwardDuration;this._pendingRemoveRanges[t].push({start:a,end:h})}}else o<e&&(r=!0,this._pendingRemoveRanges[t].push({start:a,end:o}))}r&&!i.updating&&this._doRemoveRanges()}}},e.prototype._updateMediaSourceDuration=function(){var e=this._sourceBuffers;if(0!==this._mediaElement.readyState&&"open"===this._mediaSource.readyState&&!(e.video&&e.video.updating||e.audio&&e.audio.updating)){var t=this._mediaSource.duration,i=this._pendingMediaDuration;i>0&&(isNaN(t)||i>t)&&(_.a.v(this.TAG,"Update MediaSource duration from "+t+" to "+i),this._mediaSource.duration=i),this._requireSetMediaDuration=!1,this._pendingMediaDuration=0}},e.prototype._doRemoveRanges=function(){for(var e in this._pendingRemoveRanges)if(this._sourceBuffers[e]&&!this._sourceBuffers[e].updating)for(var t=this._sourceBuffers[e],i=this._pendingRemoveRanges[e];i.length&&!t.updating;){var n=i.shift();t.remove(n.start,n.end)}},e.prototype._doAppendSegments=function(){var e=this._pendingSegments;for(var t in e)if(this._sourceBuffers[t]&&!this._sourceBuffers[t].updating&&e[t].length>0){var i=e[t].shift();if(i.timestampOffset){var n=this._sourceBuffers[t].timestampOffset,r=i.timestampOffset/1e3;Math.abs(n-r)>.1&&(_.a.v(this.TAG,"Update MPEG audio timestampOffset from "+n+" to "+r),this._sourceBuffers[t].timestampOffset=r),delete i.timestampOffset}if(!i.data||0===i.data.byteLength)continue;try{this._sourceBuffers[t].appendBuffer(i.data),this._isBufferFull=!1,"video"===t&&i.hasOwnProperty("info")&&this._idrList.appendArray(i.info.syncPoints)}catch(e){this._pendingSegments[t].unshift(i),22===e.code?(this._isBufferFull||this._emitter.emit(E.BUFFER_FULL),this._isBufferFull=!0):(_.a.e(this.TAG,e.message),this._emitter.emit(E.ERROR,{code:e.code,msg:e.message}))}}},e.prototype._onSourceOpen=function(){if(_.a.v(this.TAG,"MediaSource onSourceOpen"),this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._pendingSourceBufferInit.length>0)for(var e=this._pendingSourceBufferInit;e.length;){var t=e.shift();this.appendInitSegment(t,!0)}this._hasPendingSegments()&&this._doAppendSegments(),this._emitter.emit(E.SOURCE_OPEN)},e.prototype._onSourceEnded=function(){_.a.v(this.TAG,"MediaSource onSourceEnded")},e.prototype._onSourceClose=function(){_.a.v(this.TAG,"MediaSource onSourceClose"),this._mediaSource&&null!=this.e&&(this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._mediaSource.removeEventListener("sourceended",this.e.onSourceEnded),this._mediaSource.removeEventListener("sourceclose",this.e.onSourceClose))},e.prototype._hasPendingSegments=function(){var e=this._pendingSegments;return e.video.length>0||e.audio.length>0},e.prototype._hasPendingRemoveRanges=function(){var e=this._pendingRemoveRanges;return e.video.length>0||e.audio.length>0},e.prototype._onSourceBufferUpdateEnd=function(){this._requireSetMediaDuration?this._updateMediaSourceDuration():this._hasPendingRemoveRanges()?this._doRemoveRanges():this._hasPendingSegments()?this._doAppendSegments():this._hasPendingEos&&this.endOfStream(),this._emitter.emit(E.UPDATE_END)},e.prototype._onSourceBufferError=function(e){_.a.e(this.TAG,"SourceBuffer Error: "+e)},e}(),L=i(5),T={NETWORK_ERROR:"NetworkError",MEDIA_ERROR:"MediaError",OTHER_ERROR:"OtherError"},w={NETWORK_EXCEPTION:h.b.EXCEPTION,NETWORK_STATUS_CODE_INVALID:h.b.HTTP_STATUS_CODE_INVALID,NETWORK_TIMEOUT:h.b.CONNECTING_TIMEOUT,NETWORK_UNRECOVERABLE_EARLY_EOF:h.b.UNRECOVERABLE_EARLY_EOF,MEDIA_MSE_ERROR:"MediaMSEError",MEDIA_FORMAT_ERROR:L.a.FORMAT_ERROR,MEDIA_FORMAT_UNSUPPORTED:L.a.FORMAT_UNSUPPORTED,MEDIA_CODEC_UNSUPPORTED:L.a.CODEC_UNSUPPORTED},D=function(){function e(e,t){this.TAG="MSEPlayer",this._type="MSEPlayer",this._emitter=new u.a,this._config=a(),"object"==typeof t&&Object.assign(this._config,t);var i=e.type.toLowerCase();if("mse"!==i&&"mpegts"!==i&&"m2ts"!==i&&"flv"!==i)throw new A.b("MSEPlayer requires an mpegts/m2ts/flv MediaDataSource input!");!0===e.isLive&&(this._config.isLive=!0),this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this),onvSeeking:this._onvSeeking.bind(this),onvCanPlay:this._onvCanPlay.bind(this),onvStalled:this._onvStalled.bind(this),onvProgress:this._onvProgress.bind(this)},self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now,this._pendingSeekTime=null,this._requestSetTime=!1,this._seekpointRecord=null,this._progressChecker=null,this._mediaDataSource=e,this._mediaElement=null,this._msectl=null,this._transmuxer=null,this._mseSourceOpened=!1,this._hasPendingLoad=!1,this._receivedCanPlay=!1,this._mediaInfo=null,this._statisticsInfo=null;var n=l.a.chrome&&(l.a.version.major<50||50===l.a.version.major&&l.a.version.build<2661);this._alwaysSeekKeyframe=!!(n||l.a.msedge||l.a.msie),this._alwaysSeekKeyframe&&(this._config.accurateSeek=!1)}return e.prototype.destroy=function(){null!=this._progressChecker&&(window.clearInterval(this._progressChecker),this._progressChecker=null),this._transmuxer&&this.unload(),this._mediaElement&&this.detachMediaElement(),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var i=this;e===c.MEDIA_INFO?null!=this._mediaInfo&&Promise.resolve().then((function(){i._emitter.emit(c.MEDIA_INFO,i.mediaInfo)})):e===c.STATISTICS_INFO&&null!=this._statisticsInfo&&Promise.resolve().then((function(){i._emitter.emit(c.STATISTICS_INFO,i.statisticsInfo)})),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){var t=this;if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),e.addEventListener("seeking",this.e.onvSeeking),e.addEventListener("canplay",this.e.onvCanPlay),e.addEventListener("stalled",this.e.onvStalled),e.addEventListener("progress",this.e.onvProgress),this._msectl=new R(this._config),this._msectl.on(E.UPDATE_END,this._onmseUpdateEnd.bind(this)),this._msectl.on(E.BUFFER_FULL,this._onmseBufferFull.bind(this)),this._msectl.on(E.SOURCE_OPEN,(function(){t._mseSourceOpened=!0,t._hasPendingLoad&&(t._hasPendingLoad=!1,t.load())})),this._msectl.on(E.ERROR,(function(e){t._emitter.emit(c.ERROR,T.MEDIA_ERROR,w.MEDIA_MSE_ERROR,e)})),this._msectl.attachMediaElement(e),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._msectl.detachMediaElement(),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement.removeEventListener("seeking",this.e.onvSeeking),this._mediaElement.removeEventListener("canplay",this.e.onvCanPlay),this._mediaElement.removeEventListener("stalled",this.e.onvStalled),this._mediaElement.removeEventListener("progress",this.e.onvProgress),this._mediaElement=null),this._msectl&&(this._msectl.destroy(),this._msectl=null)},e.prototype.load=function(){var e=this;if(!this._mediaElement)throw new A.a("HTMLMediaElement must be attached before load()!");if(this._transmuxer)throw new A.a("MSEPlayer.load() has been called, please call unload() first!");this._hasPendingLoad||(this._config.deferLoadAfterSourceOpen&&!1===this._mseSourceOpened?this._hasPendingLoad=!0:(this._mediaElement.readyState>0&&(this._requestSetTime=!0,this._mediaElement.currentTime=0),this._transmuxer=new b(this._mediaDataSource,this._config),this._transmuxer.on(v.a.INIT_SEGMENT,(function(t,i){e._msectl.appendInitSegment(i)})),this._transmuxer.on(v.a.MEDIA_SEGMENT,(function(t,i){if(e._msectl.appendMediaSegment(i),e._config.lazyLoad&&!e._config.isLive){var n=e._mediaElement.currentTime;i.info.endDts>=1e3*(n+e._config.lazyLoadMaxDuration)&&null==e._progressChecker&&(_.a.v(e.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),e._suspendTransmuxer())}})),this._transmuxer.on(v.a.LOADING_COMPLETE,(function(){e._msectl.endOfStream(),e._emitter.emit(c.LOADING_COMPLETE)})),this._transmuxer.on(v.a.RECOVERED_EARLY_EOF,(function(){e._emitter.emit(c.RECOVERED_EARLY_EOF)})),this._transmuxer.on(v.a.IO_ERROR,(function(t,i){e._emitter.emit(c.ERROR,T.NETWORK_ERROR,t,i)})),this._transmuxer.on(v.a.DEMUX_ERROR,(function(t,i){e._emitter.emit(c.ERROR,T.MEDIA_ERROR,t,{code:-1,msg:i})})),this._transmuxer.on(v.a.MEDIA_INFO,(function(t){e._mediaInfo=t,e._emitter.emit(c.MEDIA_INFO,Object.assign({},t))})),this._transmuxer.on(v.a.METADATA_ARRIVED,(function(t){e._emitter.emit(c.METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SCRIPTDATA_ARRIVED,(function(t){e._emitter.emit(c.SCRIPTDATA_ARRIVED,t)})),this._transmuxer.on(v.a.TIMED_ID3_METADATA_ARRIVED,(function(t){e._emitter.emit(c.TIMED_ID3_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_DESCRIPTOR,(function(t){e._emitter.emit(c.PES_PRIVATE_DATA_DESCRIPTOR,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_ARRIVED,(function(t){e._emitter.emit(c.PES_PRIVATE_DATA_ARRIVED,t)})),this._transmuxer.on(v.a.STATISTICS_INFO,(function(t){e._statisticsInfo=e._fillStatisticsInfo(t),e._emitter.emit(c.STATISTICS_INFO,Object.assign({},e._statisticsInfo))})),this._transmuxer.on(v.a.RECOMMEND_SEEKPOINT,(function(t){e._mediaElement&&!e._config.accurateSeek&&(e._requestSetTime=!0,e._mediaElement.currentTime=t/1e3)})),this._transmuxer.open()))},e.prototype.unload=function(){this._mediaElement&&this._mediaElement.pause(),this._msectl&&this._msectl.seek(0),this._transmuxer&&(this._transmuxer.close(),this._transmuxer.destroy(),this._transmuxer=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._internalSeek(e):this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return Object.assign({},this._mediaInfo)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return null==this._statisticsInfo&&(this._statisticsInfo={}),this._statisticsInfo=this._fillStatisticsInfo(this._statisticsInfo),Object.assign({},this._statisticsInfo)},enumerable:!1,configurable:!0}),e.prototype._fillStatisticsInfo=function(e){if(e.playerType=this._type,!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var r=this._mediaElement.getVideoPlaybackQuality();i=r.totalVideoFrames,n=r.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},e.prototype._onmseUpdateEnd=function(){var e=this._mediaElement.buffered,t=this._mediaElement.currentTime;if(this._config.isLive&&this._config.liveBufferLatencyChasing&&e.length>0&&!this._mediaElement.paused){var i=e.end(e.length-1);if(i>this._config.liveBufferLatencyMaxLatency&&i-t>this._config.liveBufferLatencyMaxLatency){var n=i-this._config.liveBufferLatencyMinRemain;this.currentTime=n}}if(this._config.lazyLoad&&!this._config.isLive){for(var r=0,s=0;s<e.length;s++){var a=e.start(s),o=e.end(s);if(a<=t&&t<o){a,r=o;break}}r>=t+this._config.lazyLoadMaxDuration&&null==this._progressChecker&&(_.a.v(this.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),this._suspendTransmuxer())}},e.prototype._onmseBufferFull=function(){_.a.v(this.TAG,"MSE SourceBuffer is full, suspend transmuxing task"),null==this._progressChecker&&this._suspendTransmuxer()},e.prototype._suspendTransmuxer=function(){this._transmuxer&&(this._transmuxer.pause(),null==this._progressChecker&&(this._progressChecker=window.setInterval(this._checkProgressAndResume.bind(this),1e3)))},e.prototype._checkProgressAndResume=function(){for(var e=this._mediaElement.currentTime,t=this._mediaElement.buffered,i=!1,n=0;n<t.length;n++){var r=t.start(n),s=t.end(n);if(e>=r&&e<s){e>=s-this._config.lazyLoadRecoverDuration&&(i=!0);break}}i&&(window.clearInterval(this._progressChecker),this._progressChecker=null,i&&(_.a.v(this.TAG,"Continue loading from paused position"),this._transmuxer.resume()))},e.prototype._isTimepointBuffered=function(e){for(var t=this._mediaElement.buffered,i=0;i<t.length;i++){var n=t.start(i),r=t.end(i);if(e>=n&&e<r)return!0}return!1},e.prototype._internalSeek=function(e){var t=this._isTimepointBuffered(e),i=!1,n=0;if(e<1&&this._mediaElement.buffered.length>0){var r=this._mediaElement.buffered.start(0);(r<1&&e<r||l.a.safari)&&(i=!0,n=l.a.safari?.1:r)}if(i)this._requestSetTime=!0,this._mediaElement.currentTime=n;else if(t){if(this._alwaysSeekKeyframe){var s=this._msectl.getNearestKeyframe(Math.floor(1e3*e));this._requestSetTime=!0,this._mediaElement.currentTime=null!=s?s.dts/1e3:e}else this._requestSetTime=!0,this._mediaElement.currentTime=e;null!=this._progressChecker&&this._checkProgressAndResume()}else null!=this._progressChecker&&(window.clearInterval(this._progressChecker),this._progressChecker=null),this._msectl.seek(e),this._transmuxer.seek(Math.floor(1e3*e)),this._config.accurateSeek&&(this._requestSetTime=!0,this._mediaElement.currentTime=e)},e.prototype._checkAndApplyUnbufferedSeekpoint=function(){if(this._seekpointRecord)if(this._seekpointRecord.recordTime<=this._now()-100){var e=this._mediaElement.currentTime;this._seekpointRecord=null,this._isTimepointBuffered(e)||(null!=this._progressChecker&&(window.clearTimeout(this._progressChecker),this._progressChecker=null),this._msectl.seek(e),this._transmuxer.seek(Math.floor(1e3*e)),this._config.accurateSeek&&(this._requestSetTime=!0,this._mediaElement.currentTime=e))}else window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this),50)},e.prototype._checkAndResumeStuckPlayback=function(e){var t=this._mediaElement;if(e||!this._receivedCanPlay||t.readyState<2){var i=t.buffered;i.length>0&&t.currentTime<i.start(0)&&(_.a.w(this.TAG,"Playback seems stuck at "+t.currentTime+", seek to "+i.start(0)),this._requestSetTime=!0,this._mediaElement.currentTime=i.start(0),this._mediaElement.removeEventListener("progress",this.e.onvProgress))}else this._mediaElement.removeEventListener("progress",this.e.onvProgress)},e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null)},e.prototype._onvSeeking=function(e){var t=this._mediaElement.currentTime,i=this._mediaElement.buffered;if(this._requestSetTime)this._requestSetTime=!1;else{if(t<1&&i.length>0){var n=i.start(0);if(n<1&&t<n||l.a.safari)return this._requestSetTime=!0,void(this._mediaElement.currentTime=l.a.safari?.1:n)}if(this._isTimepointBuffered(t)){if(this._alwaysSeekKeyframe){var r=this._msectl.getNearestKeyframe(Math.floor(1e3*t));null!=r&&(this._requestSetTime=!0,this._mediaElement.currentTime=r.dts/1e3)}null!=this._progressChecker&&this._checkProgressAndResume()}else this._seekpointRecord={seekPoint:t,recordTime:this._now()},window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this),50)}},e.prototype._onvCanPlay=function(e){this._receivedCanPlay=!0,this._mediaElement.removeEventListener("canplay",this.e.onvCanPlay)},e.prototype._onvStalled=function(e){this._checkAndResumeStuckPlayback(!0)},e.prototype._onvProgress=function(e){this._checkAndResumeStuckPlayback()},e}(),k=function(){function e(e,t){this.TAG="NativePlayer",this._type="NativePlayer",this._emitter=new u.a,this._config=a(),"object"==typeof t&&Object.assign(this._config,t);var i=e.type.toLowerCase();if("mse"===i||"mpegts"===i||"m2ts"===i||"flv"===i)throw new A.b("NativePlayer does't support mse/mpegts/m2ts/flv MediaDataSource input!");if(e.hasOwnProperty("segments"))throw new A.b("NativePlayer("+e.type+") doesn't support multipart playback!");this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this)},this._pendingSeekTime=null,this._statisticsReporter=null,this._mediaDataSource=e,this._mediaElement=null}return e.prototype.destroy=function(){this._mediaElement&&(this.unload(),this.detachMediaElement()),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var i=this;e===c.MEDIA_INFO?null!=this._mediaElement&&0!==this._mediaElement.readyState&&Promise.resolve().then((function(){i._emitter.emit(c.MEDIA_INFO,i.mediaInfo)})):e===c.STATISTICS_INFO&&null!=this._mediaElement&&0!==this._mediaElement.readyState&&Promise.resolve().then((function(){i._emitter.emit(c.STATISTICS_INFO,i.statisticsInfo)})),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src"),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement=null),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.load=function(){if(!this._mediaElement)throw new A.a("HTMLMediaElement must be attached before load()!");this._mediaElement.src=this._mediaDataSource.url,this._mediaElement.readyState>0&&(this._mediaElement.currentTime=0),this._mediaElement.preload="auto",this._mediaElement.load(),this._statisticsReporter=window.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval)},e.prototype.unload=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src")),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._mediaElement.currentTime=e:this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){var e={mimeType:(this._mediaElement instanceof HTMLAudioElement?"audio/":"video/")+this._mediaDataSource.type};return this._mediaElement&&(e.duration=Math.floor(1e3*this._mediaElement.duration),this._mediaElement instanceof HTMLVideoElement&&(e.width=this._mediaElement.videoWidth,e.height=this._mediaElement.videoHeight)),e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){var e={playerType:this._type,url:this._mediaDataSource.url};if(!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var r=this._mediaElement.getVideoPlaybackQuality();i=r.totalVideoFrames,n=r.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},enumerable:!1,configurable:!0}),e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null),this._emitter.emit(c.MEDIA_INFO,this.mediaInfo)},e.prototype._reportStatisticsInfo=function(){this._emitter.emit(c.STATISTICS_INFO,this.statisticsInfo)},e}();n.a.install();var C={createPlayer:function(e,t){var i=e;if(null==i||"object"!=typeof i)throw new A.b("MediaDataSource must be an javascript object!");if(!i.hasOwnProperty("type"))throw new A.b("MediaDataSource must has type field to indicate video file type!");switch(i.type){case"mse":case"mpegts":case"m2ts":case"flv":return new D(i,t);default:return new k(i,t)}},isSupported:function(){return o.supportMSEH264Playback()},getFeatureList:function(){return o.getFeatureList()}};C.BaseLoader=h.a,C.LoaderStatus=h.c,C.LoaderErrors=h.b,C.Events=c,C.ErrorTypes=T,C.ErrorDetails=w,C.MSEPlayer=D,C.NativePlayer=k,C.LoggingControl=m.a,Object.defineProperty(C,"version",{enumerable:!0,get:function(){return"1.6.10"}});t.default=C}])})); \ No newline at end of file diff --git a/modules/core/src/main/resources/static/ueditor/1.4/ueditor.parse.js b/modules/core/src/main/resources/static/ueditor/1.4/ueditor.parse.js index 305d8d16..2f633fdb 100644 --- a/modules/core/src/main/resources/static/ueditor/1.4/ueditor.parse.js +++ b/modules/core/src/main/resources/static/ueditor/1.4/ueditor.parse.js @@ -11,286 +11,284 @@ var isIE = !!window.ActiveXObject; //定义utils工具 var utils = { - removeLastbs : function(url){ - return url.replace(/\/$/,'') - }, - extend : function(t,s){ - var a = arguments, - notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, - len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; - for (var i = 1; i < len; i++) { - var x = a[i]; - for (var k in x) { - if (!notCover || !t.hasOwnProperty(k)) { - t[k] = x[k]; + removeLastbs : function(url){ + return url.replace(/\/$/,''); + }, + extend : function(t,s){ + var a = arguments, + notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, + len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; + for (var i = 1; i < len; i++) { + var x = a[i]; + for (var k in x) { + if (!notCover || !t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } + } + return t; + }, + isIE : isIE, + cssRule : isIE ? function(key,style,doc){ + var indexList,index; + doc = doc || document; + if(doc.indexList){ + indexList = doc.indexList; + }else{ + indexList = doc.indexList = {}; + } + var sheetStyle; + if(!indexList[key]){ + if(style === undefined){ + return ''; + } + sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length); + indexList[key] = index; + }else{ + sheetStyle = doc.styleSheets[indexList[key]]; + } + if(style === undefined){ + return sheetStyle.cssText; + } + sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || ''); + } : function(key,style,doc){ + doc = doc || document; + var head = doc.getElementsByTagName('head')[0],node; + if(!(node = doc.getElementById(key))){ + if(style === undefined){ + return '' + } + node = doc.createElement('style'); + node.id = key; + head.appendChild(node) + } + if(style === undefined){ + return node.innerHTML + } + if(style !== ''){ + node.innerHTML = node.innerHTML + '\n' + style; + }else{ + head.removeChild(node) + } + }, + domReady : function (onready) { + var doc = window.document; + if (doc.readyState === "complete") { + onready(); + }else{ + if (isIE) { + (function () { + if (doc.isReady) return; + try { + doc.documentElement.doScroll("left"); + } catch (error) { + setTimeout(arguments.callee, 0); + return; } - } - } - return t; - }, - isIE : isIE, - cssRule : isIE ? function(key,style,doc){ - var indexList,index; - doc = doc || document; - if(doc.indexList){ - indexList = doc.indexList; - }else{ - indexList = doc.indexList = {}; - } - var sheetStyle; - if(!indexList[key]){ - if(style === undefined){ - return '' - } - sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length); - indexList[key] = index; - }else{ - sheetStyle = doc.styleSheets[indexList[key]]; - } - if(style === undefined){ - return sheetStyle.cssText - } - sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '') - } : function(key,style,doc){ - doc = doc || document; - var head = doc.getElementsByTagName('head')[0],node; - if(!(node = doc.getElementById(key))){ - if(style === undefined){ - return '' - } - node = doc.createElement('style'); - node.id = key; - head.appendChild(node) - } - if(style === undefined){ - return node.innerHTML - } - if(style !== ''){ - node.innerHTML = node.innerHTML + '\n' + style; - }else{ - head.removeChild(node) - } - }, - domReady : function (onready) { - var doc = window.document; - if (doc.readyState === "complete") { - onready(); - }else{ - if (isIE) { - (function () { - if (doc.isReady) return; - try { - doc.documentElement.doScroll("left"); - } catch (error) { - setTimeout(arguments.callee, 0); - return; - } - onready(); - })(); - window.attachEvent('onload', function(){ - onready() - }); - } else { - doc.addEventListener("DOMContentLoaded", function () { - doc.removeEventListener("DOMContentLoaded", arguments.callee, false); - onready(); - }, false); - window.addEventListener('load', function(){onready()}, false); - } + onready(); + })(); + window.attachEvent('onload', function(){ + onready() + }); + } else { + doc.addEventListener("DOMContentLoaded", function () { + doc.removeEventListener("DOMContentLoaded", arguments.callee, false); + onready(); + }, false); + window.addEventListener('load', function(){onready()}, false); } + } - }, - each : function(obj, iterator, context) { - if (obj == null) return; - if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if(iterator.call(context, obj[i], i, obj) === false) + }, + each : function(obj, iterator, context) { + if (obj == null) return; + if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + if(iterator.call(context, obj[i], i, obj) === false) + return false; + } + } else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if(iterator.call(context, obj[key], key, obj) === false) return false; } + } + } + }, + inArray : function(arr,item){ + var index = -1; + this.each(arr,function(v,i){ + if(v === item){ + index = i; + return false; + } + }); + return index; + }, + pushItem : function(arr,item){ + if(this.inArray(arr,item)==-1){ + arr.push(item) + } + }, + trim: function (str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ''); + }, + indexOf: function (array, item, start) { + var index = -1; + start = this.isNumber(start) ? start : 0; + this.each(array, function (v, i) { + if (i >= start && v === item) { + index = i; + return false; + } + }); + return index; + }, + hasClass: function (element, className) { + className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = element.className; ci = className[i++];) { + if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) { + return false; + } + } + return i - 1 == className.length; + }, + addClass:function (elm, classNames) { + if(!elm)return; + classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + if(!new RegExp('\\b' + ci + '\\b').test(cls)){ + cls += ' ' + ci; + } + } + elm.className = utils.trim(cls); + }, + removeClass:function (elm, classNames) { + classNames = this.isArray(classNames) ? classNames : + this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + cls = cls.replace(new RegExp('\\b' + ci + '\\b'),''); + } + cls = this.trim(cls).replace(/[ ]{2,}/g,' '); + elm.className = cls; + !cls && elm.removeAttribute('className'); + }, + on: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); } else { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - if(iterator.call(context, obj[key], key, obj) === false) - return false; + if (!handler._d) { + handler._d = { + els : [] + }; + } + var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); + if (!handler._d[key] || index == -1) { + if(index == -1){ + handler._d.els.push(element); } - } - } - }, - inArray : function(arr,item){ - var index = -1; - this.each(arr,function(v,i){ - if(v === item){ - index = i; - return false; - } - }); - return index; - }, - pushItem : function(arr,item){ - if(this.inArray(arr,item)==-1){ - arr.push(item) - } - }, - trim: function (str) { - return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ''); - }, - indexOf: function (array, item, start) { - var index = -1; - start = this.isNumber(start) ? start : 0; - this.each(array, function (v, i) { - if (i >= start && v === item) { - index = i; - return false; - } - }); - return index; - }, - hasClass: function (element, className) { - className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' '); - for (var i = 0, ci, cls = element.className; ci = className[i++];) { - if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) { - return false; - } - } - return i - 1 == className.length; - }, - addClass:function (elm, classNames) { - if(!elm)return; - classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); - for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ - if(!new RegExp('\\b' + ci + '\\b').test(cls)){ - cls += ' ' + ci; - } - } - elm.className = utils.trim(cls); - }, - removeClass:function (elm, classNames) { - classNames = this.isArray(classNames) ? classNames : - this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); - for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ - cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') - } - cls = this.trim(cls).replace(/[ ]{2,}/g,' '); - elm.className = cls; - !cls && elm.removeAttribute('className'); - }, - on: function (element, type, handler) { - var types = this.isArray(type) ? type : type.split(/\s+/), - k = types.length; - if (k) while (k--) { - type = types[k]; - if (element.addEventListener) { - element.addEventListener(type, handler, false); - } else { - if (!handler._d) { - handler._d = { - els : [] + if(!handler._d[key]){ + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); }; } - var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); - if (!handler._d[key] || index == -1) { - if(index == -1){ - handler._d.els.push(element); - } - if(!handler._d[key]){ - handler._d[key] = function (evt) { - return handler.call(evt.srcElement, evt || window.event); - }; - } - - - element.attachEvent('on' + type, handler._d[key]); - } + element.attachEvent('on' + type, handler._d[key]); } } - element = null; - }, - off: function (element, type, handler) { - var types = this.isArray(type) ? type : type.split(/\s+/), - k = types.length; - if (k) while (k--) { - type = types[k]; - if (element.removeEventListener) { - element.removeEventListener(type, handler, false); - } else { - var key = type + handler.toString(); - try{ - element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); - }catch(e){} - if (handler._d && handler._d[key]) { - var index = utils.indexOf(handler._d.els,element); - if(index!=-1){ - handler._d.els.splice(index,1); - } - handler._d.els.length == 0 && delete handler._d[key]; - } - } - } - }, - loadFile : function () { - var tmpList = []; - function getItem(doc,obj){ + } + element = null; + }, + off: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); try{ - for(var i= 0,ci;ci=tmpList[i++];){ - if(ci.doc === doc && ci.url == (obj.src || obj.href)){ - return ci; - } + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + }catch(e){} + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els,element); + if(index!=-1){ + handler._d.els.splice(index,1); } - }catch(e){ - return null; + handler._d.els.length == 0 && delete handler._d[key]; } + } + } + }, + loadFile : function () { + var tmpList = []; + function getItem(doc,obj){ + try{ + for(var i= 0,ci;ci=tmpList[i++];){ + if(ci.doc === doc && ci.url == (obj.src || obj.href)){ + return ci; + } + } + }catch(e){ + return null; + } + } + return function (doc, obj, fn) { + var item = getItem(doc,obj); + if (item) { + if(item.ready){ + fn && fn(); + }else{ + item.funs.push(fn); + } + return; } - return function (doc, obj, fn) { - var item = getItem(doc,obj); - if (item) { - if(item.ready){ - fn && fn(); - }else{ - item.funs.push(fn) - } - return; + tmpList.push({ + doc:doc, + url:obj.src||obj.href, + funs:[fn] + }); + if (!doc.body) { + var html = []; + for(var p in obj){ + if(p == 'tag')continue; + html.push(p + '="' + obj[p] + '"'); } - tmpList.push({ - doc:doc, - url:obj.src||obj.href, - funs:[fn] - }); - if (!doc.body) { - var html = []; - for(var p in obj){ - if(p == 'tag')continue; - html.push(p + '="' + obj[p] + '"') - } - doc.write('<' + obj.tag + ' ' + html.join(' ') + ' ></'+obj.tag+'>'); - return; - } - if (obj.id && doc.getElementById(obj.id)) { - return; - } - var element = doc.createElement(obj.tag); - delete obj.tag; - for (var p in obj) { - element.setAttribute(p, obj[p]); - } - element.onload = element.onreadystatechange = function () { - if (!this.readyState || /loaded|complete/.test(this.readyState)) { - item = getItem(doc,obj); - if (item.funs.length > 0) { - item.ready = 1; - for (var fi; fi = item.funs.pop();) { - fi(); - } + doc.write('<' + obj.tag + ' ' + html.join(' ') + ' ></'+obj.tag+'>'); + return; + } + if (obj.id && doc.getElementById(obj.id)) { + return; + } + var element = doc.createElement(obj.tag); + delete obj.tag; + for (var p in obj) { + element.setAttribute(p, obj[p]); + } + element.onload = element.onreadystatechange = function () { + if (!this.readyState || /loaded|complete/.test(this.readyState)) { + item = getItem(doc,obj); + if (item.funs.length > 0) { + item.ready = 1; + for (var fi; fi = item.funs.pop();) { + fi(); } - element.onload = element.onreadystatechange = null; } - }; - element.onerror = function(){ - throw Error('The load '+(obj.href||obj.src)+' fails,check the url') - }; - doc.getElementsByTagName("head")[0].appendChild(element); - } - }() + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function(){ + throw Error('The load '+(obj.href||obj.src)+' fails,check the url'); + }; + doc.getElementsByTagName("head")[0].appendChild(element); + } + }() }; utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object','Boolean'], function (v) { utils['is' + v] = function (obj) { @@ -312,10 +310,10 @@ utils.domReady(function(){ var contents; if(document.querySelectorAll){ - contents = document.querySelectorAll(selector) + contents = document.querySelectorAll(selector); }else{ if(/^#/.test(selector)){ - contents = [document.getElementById(selector.replace(/^#/,''))] + contents = [document.getElementById(selector.replace(/^#/,''))]; }else if(/^\./.test(selector)){ var contents = []; utils.each(document.getElementsByTagName('*'),function(node){ @@ -400,7 +398,6 @@ UE.parse.register('table', function (utils) { selector + ' td p{margin:0;padding:0;}', document); //填充空的单元格 - utils.each('td th caption'.split(' '), function (tag) { var cells = root.getElementsByTagName(tag); cells.length && utils.each(cells, function (node) { @@ -550,18 +547,13 @@ UE.parse.register('charts',function( utils ){ } if ( sources = parseSources() ) { - loadResources(); - } - function parseSources () { - if ( !containers ) { return null; } - return extractChartData( containers ); } @@ -570,22 +562,14 @@ UE.parse.register('charts',function( utils ){ * 提取数据 */ function extractChartData ( rootNode ) { - var data = [], tables = rootNode.getElementsByTagName( "table" ); - for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) { - if ( tableNode.getAttribute( "data-chart" ) !== null ) { - data.push( formatData( tableNode ) ); - } - } - return data.length ? data : null; - } function formatData ( tableNode ) { @@ -596,130 +580,90 @@ UE.parse.register('charts',function( utils ){ //提取table数据 for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) { - var rowData = []; - for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { - var value = ( cell.innerText || cell.textContent || '' ); rowData.push( cell.tagName == 'TH' ? value:(value | 0) ); - } - data.push( rowData ); - } //解析元信息 meta = meta.split( ";" ); for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) { - metaData = metaData.split( ":" ); metaConfig[ metaData[ 0 ] ] = metaData[ 1 ]; - } - return { table: tableNode, meta: metaConfig, data: data }; - } //加载资源 function loadResources () { - // loadJQuery(); loadHighcharts(); - } // function loadJQuery () { // // //不存在jquery, 则加载jquery // if ( !window.jQuery ) { -// // utils.loadFile(document,{ // src : resourceRoot + "/third-party/jquery.min.js", // tag : "script", // type : "text/javascript", // defer : "defer" // },function(){ -// // loadHighcharts(); -// // }); -// // } else { -// // loadHighcharts(); -// // } -// // } function loadHighcharts () { - //不存在Highcharts, 则加载Highcharts if ( !window.Highcharts ) { - utils.loadFile(document,{ src : resourceRoot + "/third-party/highcharts/highcharts.js", tag : "script", type : "text/javascript", defer : "defer" },function(){ - loadTypeConfig(); - }); - } else { - loadTypeConfig(); - } - } //加载图表差异化配置文件 function loadTypeConfig () { - utils.loadFile(document,{ src : resourceRoot + "/dialogs/charts/chart.config.js", tag : "script", type : "text/javascript", defer : "defer" },function(){ - render(); - }); - } //渲染图表 function render () { - var config = null, chartConfig = null, container = null; - for ( var i = 0, len = sources.length; i < len; i++ ) { - config = sources[ i ]; - chartConfig = analysisConfig( config ); - container = createContainer( config.table ); - renderChart( container, typeConfig[ config.meta.chartType ], chartConfig ); - } - - } /** @@ -729,10 +673,7 @@ UE.parse.register('charts',function( utils ){ * @param config 图表通用配置 * */ function renderChart ( container, typeConfig, config ) { - - $( container ).highcharts( $.extend( {}, typeConfig, { - credits: { enabled: false }, @@ -774,9 +715,7 @@ UE.parse.register('charts',function( utils ){ borderWidth: 1 }, series: config.series - } )); - } /** @@ -808,21 +747,14 @@ UE.parse.register('charts',function( utils ){ if ( meta.dataFormat != "1" ) { for ( var i = 0, len = data.length; i < len ; i++ ) { - for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) { - if ( !result[ j ] ) { result[ j ] = []; } - result[ j ][ i ] = data[ i ][ j ]; - } - } - data = result; - } result = {}; @@ -850,11 +782,8 @@ UE.parse.register('charts',function( utils ){ } else { var curData = []; - for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) { - curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] ); - } //饼图 @@ -867,11 +796,8 @@ UE.parse.register('charts',function( utils ){ result.series = series; result.title = meta.title; result.suffix = meta.suffix; - } - return result; - } }); @@ -985,45 +911,34 @@ UE.parse.register('list',function(utils){ }); -UE.parse.register('vedio',function(utils){ +UE.parse.register('video',function(utils){ var video = this.root.getElementsByTagName('video'), audio = this.root.getElementsByTagName('audio'); - - document.createElement('video');document.createElement('audio'); - if(video.length || audio.length){ -// var sourcePath = utils.removeLastbs(this.rootPath), -// jsurl = sourcePath + '/third-party/video-js/video.js', -// cssurl = sourcePath + '/third-party/video-js/video-js.min.css', -// swfUrl = sourcePath + '/third-party/video-js/video-js.swf'; -// -// if(window.videojs) { -// videojs.autoSetup(); -// } else { -// utils.loadFile(document,{ -// id : "video_css", -// tag : "link", -// rel : "stylesheet", -// type : "text/css", -// href : cssurl -// }); -// utils.loadFile(document,{ -// id : "video_js", -// src : jsurl, -// tag : "script", -// type : "text/javascript" -// },function(){ -// videojs.options.flash.swf = swfUrl; -// videojs.autoSetup(); -// }); -// } - var ctxStatic = utils.removeLastbs(this.ctxStatic); + if(video && video.length || audio && audio.length){ + var ctxStatic = utils.removeLastbs(this.rootPath) + '/../..'; utils.loadFile(document,{ - id : "ckplayer_js", - src : ctxStatic + "/ckplayer/6.7/ckplayer.js", - tag : "script", - type : "text/javascript" + id : "ckplayer_css", tag : "link", rel : "stylesheet", type : "text/css", + href : ctxStatic + "/ckplayer/css/ckplayer.css", + }); + utils.loadFile(document,{ + id : "ckplayer_js", tag : "script", type : "text/javascript", + src : ctxStatic + "/ckplayer/js/ckplayer.min.js" },function(){ - CKobject.init(ctxStatic + "/ckplayer/6.7/"); + var ckplayerInit = function(idx) { + var $this = $(this), src = $this.attr('src'); + $this.attr('id', 'video_element'+idx); + if ($('#video_container'+idx).length <= 0){ + $('#video_element'+idx).before('<div id="video_container'+idx+'" style="width:' + +$this.attr('width')+'px;height:'+$this.attr('height') + +'px;display:inline-block"></div>').remove(); + } + new ckplayer({ + container: '#video_container'+idx, video: src, + menu: [{ title:'JeeSite', link:'https://jeesite.com' }] + }) + } + $.each(video, ckplayerInit); + $.each(audio, ckplayerInit); }); } });