From 004db56191d9a9731236774736c16d0656cd3c40 Mon Sep 17 00:00:00 2001 From: <> Date: Mon, 1 Apr 2024 17:14:47 +0000 Subject: [PATCH] Deployed e86b8b5 with MkDocs version: 1.5.3 --- blog/Mkdocs/mkdocs1/index.html | 4 +- ckplayer/LICENSE | 202 - ckplayer/css/ckplayer.css | 1609 - ckplayer/css/ckplayer.ixigua.css | 1707 - ckplayer/css/ckplayer.red.css | 1609 - ckplayer/css/images/adclose.png | Bin 3314 -> 0 bytes ckplayer/css/images/buffer.png | Bin 3500 -> 0 bytes ckplayer/css/images/ckplayer.48.png | Bin 11132 -> 0 bytes ckplayer/css/images/ckplayer.png | Bin 10869 -> 0 bytes ckplayer/css/images/ckplayer_ixigua.48.png | Bin 10091 -> 0 bytes ckplayer/css/images/ckplayer_ixigua.png | Bin 11294 -> 0 bytes ckplayer/css/images/ckplayer_red.48.png | Bin 11238 -> 0 bytes ckplayer/css/images/ckplayer_red.png | Bin 11320 -> 0 bytes ckplayer/css/images/loading.png | Bin 4194 -> 0 bytes ckplayer/css/images/logo.png | Bin 5128 -> 0 bytes ckplayer/css/images/play.png | Bin 2427 -> 0 bytes ckplayer/flv.js/LICENSE | 202 - ckplayer/flv.js/flv.js | 10585 ----- ckplayer/flv.js/flv.js.map | 1 - ckplayer/flv.js/flv.min.js | 10 - ckplayer/flv.js/flv.min.js.map | 1 - ckplayer/hls.js/LICENSE | 28 - ckplayer/hls.js/hls-demo.js | 42195 ------------------- ckplayer/hls.js/hls-demo.js.map | 1 - ckplayer/hls.js/hls.js | 27804 ------------ ckplayer/hls.js/hls.js.d.ts | 2837 -- ckplayer/hls.js/hls.js.map | 1 - ckplayer/hls.js/hls.light.js | 20929 --------- ckplayer/hls.js/hls.light.js.map | 1 - ckplayer/hls.js/hls.light.min.js | 2 - ckplayer/hls.js/hls.light.min.js.map | 1 - ckplayer/hls.js/hls.min.js | 2 - ckplayer/hls.js/hls.min.js.map | 1 - ckplayer/js/ckplayer.js | 7421 ---- ckplayer/js/ckplayer.min.js | 7 - ckplayer/language/en.js | 72 - ckplayer/language/zh.cn.js | 72 - ckplayer/language/zh.hk.js | 72 - ckplayer/mpegts.js/LICENSE | 202 - ckplayer/mpegts.js/mpegts.js | 9 - ckplayer/mpegts.js/mpegts.js.map | 1 - ckplayer/mpegts.js/mpegts.min.js | 9 - search/search_index.json | 2 +- sitemap.xml.gz | Bin 512 -> 512 bytes 44 files changed, 3 insertions(+), 117596 deletions(-) delete mode 100644 ckplayer/LICENSE delete mode 100644 ckplayer/css/ckplayer.css delete mode 100644 ckplayer/css/ckplayer.ixigua.css delete mode 100644 ckplayer/css/ckplayer.red.css delete mode 100644 ckplayer/css/images/adclose.png delete mode 100644 ckplayer/css/images/buffer.png delete mode 100644 ckplayer/css/images/ckplayer.48.png delete mode 100644 ckplayer/css/images/ckplayer.png delete mode 100644 ckplayer/css/images/ckplayer_ixigua.48.png delete mode 100644 ckplayer/css/images/ckplayer_ixigua.png delete mode 100644 ckplayer/css/images/ckplayer_red.48.png delete mode 100644 ckplayer/css/images/ckplayer_red.png delete mode 100644 ckplayer/css/images/loading.png delete mode 100644 ckplayer/css/images/logo.png delete mode 100644 ckplayer/css/images/play.png delete mode 100644 ckplayer/flv.js/LICENSE delete mode 100644 ckplayer/flv.js/flv.js delete mode 100644 ckplayer/flv.js/flv.js.map delete mode 100644 ckplayer/flv.js/flv.min.js delete mode 100644 ckplayer/flv.js/flv.min.js.map delete mode 100644 ckplayer/hls.js/LICENSE delete mode 100644 ckplayer/hls.js/hls-demo.js delete mode 100644 ckplayer/hls.js/hls-demo.js.map delete mode 100644 ckplayer/hls.js/hls.js delete mode 100644 ckplayer/hls.js/hls.js.d.ts delete mode 100644 ckplayer/hls.js/hls.js.map delete mode 100644 ckplayer/hls.js/hls.light.js delete mode 100644 ckplayer/hls.js/hls.light.js.map delete mode 100644 ckplayer/hls.js/hls.light.min.js delete mode 100644 ckplayer/hls.js/hls.light.min.js.map delete mode 100644 ckplayer/hls.js/hls.min.js delete mode 100644 ckplayer/hls.js/hls.min.js.map delete mode 100644 ckplayer/js/ckplayer.js delete mode 100644 ckplayer/js/ckplayer.min.js delete mode 100644 ckplayer/language/en.js delete mode 100644 ckplayer/language/zh.cn.js delete mode 100644 ckplayer/language/zh.hk.js delete mode 100644 ckplayer/mpegts.js/LICENSE delete mode 100644 ckplayer/mpegts.js/mpegts.js delete mode 100644 ckplayer/mpegts.js/mpegts.js.map delete mode 100644 ckplayer/mpegts.js/mpegts.min.js diff --git a/blog/Mkdocs/mkdocs1/index.html b/blog/Mkdocs/mkdocs1/index.html index 9d48fc5..82c903d 100644 --- a/blog/Mkdocs/mkdocs1/index.html +++ b/blog/Mkdocs/mkdocs1/index.html @@ -2089,7 +2089,7 @@
  1. -

    于2023.3.24重写此文 

    +

    于2024.4.24重写此文 

@@ -2160,7 +2160,7 @@ - 2024-02-02 + 2024-04-01 diff --git a/ckplayer/LICENSE b/ckplayer/LICENSE deleted file mode 100644 index 7a4a3ea..0000000 --- a/ckplayer/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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/ckplayer/css/ckplayer.css b/ckplayer/css/ckplayer.css deleted file mode 100644 index c7571cb..0000000 --- a/ckplayer/css/ckplayer.css +++ /dev/null @@ -1,1609 +0,0 @@ -.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/ckplayer/css/ckplayer.ixigua.css b/ckplayer/css/ckplayer.ixigua.css deleted file mode 100644 index 91531e7..0000000 --- a/ckplayer/css/ckplayer.ixigua.css +++ /dev/null @@ -1,1707 +0,0 @@ -.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/ckplayer/css/ckplayer.red.css b/ckplayer/css/ckplayer.red.css deleted file mode 100644 index 9359590..0000000 --- a/ckplayer/css/ckplayer.red.css +++ /dev/null @@ -1,1609 +0,0 @@ -.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/ckplayer/css/images/adclose.png b/ckplayer/css/images/adclose.png deleted file mode 100644 index b3c0b7b008f7094a8a205e9860a23f5b3fe7bb63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3314 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 diff --git a/ckplayer/css/images/buffer.png b/ckplayer/css/images/buffer.png deleted file mode 100644 index 198d4a14d5231daa699c085b65ff6eaed1dba7ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3500 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 diff --git a/ckplayer/css/images/ckplayer_ixigua.48.png b/ckplayer/css/images/ckplayer_ixigua.48.png deleted file mode 100644 index 7301e36b574b88cbedcb24dcafa66301dc471c9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10091 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 M)$~fW!M)i31=Y03nE(I) diff --git a/ckplayer/css/images/ckplayer_ixigua.png b/ckplayer/css/images/ckplayer_ixigua.png deleted file mode 100644 index 818c2611a20ee516bb35f502e6399c36423d0b26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11294 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 LVOVtO=Dq&~CGT49 diff --git a/ckplayer/css/images/ckplayer_red.48.png b/ckplayer/css/images/ckplayer_red.48.png deleted file mode 100644 index 5f226ac3bf554eb94abb16af9700fbd415b82cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11238 zcmd6N_g7O-w?2x3AfZT;E+QaJnsgxoq9RQ}sz4CLPz^}05l}#?6{H4~BGRSTNLPUn z={*pH&;tYlA>~{?@B97Ub?^HZ+#k-IefHWjXRVntXZG{#=kT&L(VvoF%o$s`)y z(tQ}5y_LiC>564W9jvp8DgL}$wOY#MmP^Rvu5&2~OIK5n=S!onpYFUAJ$U(Q-p|Vl zdFP~;emZ~2L(75&&AyzAe*qc>VNb7LqQ7h;wXSeEM*S{IBLMj|At7NPY2as4n0)qO z2wFnxdMM*kl^y>p7^_&2%!(|hGLgVwA6>~HwF z!}Na*c+%_EJGUx}|NR=hb8oNwpBr+Nf77dBM$V08nq`_UbiOJ{r6ag>EV?&uFwgp? zAxScx)QnCm%B7KVXUP-Zoi1wZgn)cG6KyI%yXlbe5W%=>&uqtG7lpg+2Bt;_UprfV zuKb6eSS>dxN+0BIvnsx(P+XQahoNn~ihN z?@m`4;=5C3Fb~S0N{1c z`znbqiB!)sv#Dv}5zY0TPbXI9;WZJr+1WQf15MnjSt}SFv5Q348WsOH1e$zY`>D3e z1(n|>(+9`dsgTtR1Wc4Ix*-p*eaSF>6lFfCT{x@-{(;Qw~Nr-ghOuBtoK zo5*Sq$k&Kp{2dY5TT)N8&OeCttdvxyh{Z~gAPYs)P5}WXFH~3WQ`P1e>Vh4VyMf2L z?`a&B8d9V?tvHrHp7L8-UH}jN2~~{`PJX0c`0Ho}!>wfO}vqka+Jh5UVb3|1Pa zxpxP6TX(?Ab|vGt`tz3Zo5VE*LOHpX|N08JMe_OIxZZFJst@B&b=zwJ%_9~lyPf2p z_$e332*zU@_8RfYg@}20#vWjCoi-EsXOcD09&tWrq_}a=9WA^?mk8>mey$eUY}Db^ zEH?Aa8p&(8*{`+*XJ2Oxd~OA7z8_HQpChG%-vLn2;cI8Su?kv*!{f z_n~7p{U06_j)()fSfYsqg{);YDbWZQoRQHb-&9+iz-WQL5<=X9+_c=nR$sHuJRhIh z;8%WhI%Vr)UPRt!crUUPo)y3|3YTP`Sk9lo_8H}X8$wKuXR0c`b;*O`$(IZPZ{)iz z`lDUb)iD$~HB{A2xSK{ouO01P!7;KQ2~`=}Sl1nK?kns&nIfZeV`;tJx@B(sJ7>)g z&4MX@s@Q@%*E=Z|HtW1jk2x6QYLoQpXn zTUFY=myaR`v8EmHafX)0qF|jkx30o%Fgc5Dd?)wyb?wOkWcoW`lK|t3#+Wv{z625} z{XmuN6L={K=q3PuN2rSD7_iqWVj^#vwv}7%t^@?6WL(5TX5e{8W-lho8GQGqfw=a+ z;Vns9OE@je)29Nd-rDnQBJ>e6B&HPk#K#Ma)sH~y{or|kTi_z|HUC1 zDtRmKKE0GSHMMTWfx0w1$(rDO$xRJs-Rw2KksMDwh0eMIE0JFX5-XzN-88zZsz8e# zLgvN<>*FUkQ+(TZ54@t3i-V+BZEyn8Qg51pq+fnNtbB9NwvFc=H)gGWP5NjE)F&v{ z0^dEED_;@vzD$n|59_$5x_bY3Ffs-N*VWdFQq5kdqD%w+o)$TDTiSehC!b2dvpp6$ za{zuBfxc2amK>B$^|9lmZS=PEN4j+*u_D)Lg@DDk3AoEb1orX{V((DikVKv^*AqUQ zbBYQH%Y5I5n<8XWXpdI~SBr_7jHdHU5gnx0(H&JE-ozZ?UflNqnvQCa^&&tx{2z0~ zEG+s-D<>jGuyJaH6#2oJlGDe+cnibZ?Esq$`j`oykHLTjdk(S>Pbc21RVQmS z2-O@3@%Qdsm!K|%qQasK#O<=F*)!J|fb2`1hQAs0{1`^#vhhRH^^fsSY-sW^^TSn# zQD3ztr%J@KO6An`#j^}*LI;r}*Wc5;c}zTLJ?EU!*VcJT@HN>(;MXpe8)ivlFL)CdY!8Kt4d#OYU3eAKjp)>CP0cY%_4l!Yo z>~L1S15V(hgZ*wX;*P_?k=Zd!lNN7%-cCewY}i*R88;QYHiC9QPjKKdAL7NMCZRt! z0BdipXMn-#oJsk2gH}8AF}frz<-PljHF){}7)#B%U~=3?MtaQnlI8XAthK+>BC3I< zr^LlTEF1BsPQ@1vf>DOM4_B|Wc|X`WQcxL`^23_D5qmtLo}C*tO`kyB8L;PZ{=WAT zE;uoiw0l|o(<(4=ZF|7uJ&TJgRQ{7oM(J0*BBS!Im+sts zB~z5^#6KwudUzp;oGDRqTnsV2yI|Z1+H4}Bh7ydTMkzHe3l{|muosT((*tzIM}3Nb z$5jKME&emg3S_=#R!Ok8%Owa3~5DiAA_F zB#6`Y2_S22+6YBW5KaU~uph@0-0xz%v1cO2EyEl8>&u#sv~bp{epvvH^4pO3SjCdL z@I3(dyB}53TWAwzsqbHB$ON5R{|Zi^HSwzz0Md!(nMX-);8}>bw}|Z$3|f%C;gaG| z-`46Vq?*^sE;kZ40G!X%M(FxGdL@FA$@!4LseMVb9yufVqyAP6zw0b-fk-UyezWE_ zE4Eg4KN3fH$y;ZTI;iorhq5|gi&WxAW{Y=^mD@}8a@`k`r=+OMogX8n4%zS}V+H{F z3Q>RuUbK6a0Avc!TMHi7i(vCv7!%_~2;};9ziSP^n{>t%>%Zz3IU_Pkv!u3N+ zk(DRx%Y)EL`ok=O3QtgA3Y~ zb&-j@Pt+Rv_d@TXRXS#F%Jd3rh=UNltddg}gUciLiy4rQEQs>AjlrDDUc(MQSyTA- zl^>ua<_wmQ&cFAts>voSn+81}mV3NE@5*=kan1KBA6#W*Zd%_^x97oc)Sq(1yL(vrylkkz>O z3SKJ(=}zLFv%2cnpu@sg#akO?$eH{be$b(r|vt8xDXVS^^)#vRp;H<*_2Qbk0 zRye9`sww|Et1;rp702jKa8B;8fQ$G-o6i(UFZUdCg>9#@`ynxF6z1&*%2n|0h*nP zs1Au$`1iLW1I|Qxju73ycIoODWi2WWanJn;$`tK2B&#(t=c<_4e0il3a_HoN zs7gC_j)fNynLJA_7zYh-&lvd#Z+={mHhXIFX(yH7RLNx>f>npJH>+EmAS~y)C)ZG1 z)2Z?2i~PH~)*_5YouN~ws#$`S3I&8s`&=M2my0{MSVAJeT@t@7_gpxQ%sQ6Rz64AN zbo+E7P0~vLVkFXXqx%+UuY#{dd-gS>Flu{|f2~&CvfIG}Z73!=*vn_i-UyT5KghW+ z)X~o?2vUL?hK+w%pV(_XJ-Rcq64x}Lk-wab_Ac70G2{!zaJsa!=qdo>yI@ff;F$sq z#irWF1#o&@s*y}Wp5H*oh=qs*=NB@y|L8_c#r>q#+}OY8<{3HkTu%!DZQ^lz{7j&t z2=~O#bQ03y4x~vOogUG1>jV>r_Ruo<VUT*0bHGR4Sq!TQYv<+pR6Vtu z)=Lu``OBS68z3w#Fm3I3rsaB112<-g5S6H?(t7TtP$Erm_GG)T(J%y@I4YAV@Q2uj|3=e$clV5~`uBr+) zxI3M_F9+1W^XPS+B>3I_#_}P@w z^qKUKoRJeD_{mlCJrf?q_S4`MXxqmpUCO%g@;i4Qom6!|{A+c>Gd)^I(KvV6m6p457 z@fIp1LobVuZhSjCU8Ei542OugTOVJ3ui@uhRhjaAV(Zm`7S5+=khDDF` z!O*s;dp0|cP&FJf##*SnEq8wzBN1tG46T3rXPQ&*!wx)KzF4=yUnk5!c)r1BPf;?~ zCmO$qGP^j?b!x~Lhrg3`&2`_4fPranwnJ!)U%aJrvSCtDY=Q0Vu4zQFa&WuFifp~8 zI_sZ@bDb45Iq@A9AXtY7p#IRQZzGufRZ6USDr+<%E7ECW@bqZNmFM*!nA~ma5yN@$ zQ-D|3=2;oh9;VBw8em)SZO!9`3+B~iykUHYsc_!rLhgBo3mu?4NMk~!Knm`PJyY7) zwHDTic`Z>^b;X0(=mdoCM*{CfD8kY;V5;iV%E>9#&iNTQY;2^0m)6y!SF>bn*=qK4 zUzXZxpzBQrhqim}Q>;CJ{`=*bPyvw~jalkEf3 zC{305k}*v3w1hrYWr=9-A@POVpK29>T2Ff#adU|&Q~Ux8+tQ+e%lp52$#?vmalS(- zsJnNkz><hkfu_`x>sMex#&HhF}CV9=ZyS- zS0{0Di(Ac=Ij~+={WY%YPvZt?WVhudRiG@Q59K@`2)}l=@(7nV|Q=N5SYRnV_;ODKct36r40e{89)eIFbonUCK4jwMo6|SXagL>P)XT}5sKKn zfZhmYN&CTZrQWKkUJ)(K+lejU?i})B5^qb%$0RT+_lXG|`Ep4o%(!RBGuj+TD-t~m z(7S+Kif$~*t_=|28CK_)OQpvZOvjNY3knHpM|DV`CUn)MK90qrhP;|Zrst=m)r=$s z#cr6Y8@&y1HW1`~xOZt9Mdpb-57yLfYP1yE+=J+D?qguNQo*tUL z4_r$ph&*ViSw7y_PyQA&S%`;ppY`nb#p=~7ZCaubH6?GF;T*ApIj}5;)$n`9rb*Z< zuEY!l6Iw;g=;X80MkBK$z$KM>fmjt;Tj|943=MB(a!w+XBSI#u({T zBfcp*%Uwd|r2rrxWR?^Px9!ub$I5@?e<4LK9-`z~rZHUMUe(TeZHP~v(7qXS@MQI} z8{yrA>I>FdOV;d;P#%99Uj;rSz%$J_&3qi`vNCt;3-O(AT=KnH&vG$ZUSTO=UY(^yBsR?GiTgL;2Wq zl`1(E;DXIe&S4mbqo<|={O**BWC0}R{pk$8Cp@(`ob6Ox&Wxb6AA|j>q(_|=uLJS! z9<-c**E8Nz#ZPVufrtxhs0h5ppD$Z%}dt$a3b;4*M z{`upJSwe<$z;z$T8&lh;_xaj^^thh)_gfM_6Y=3iGNueojLltQ>BUzPp0C?&Cj?vHXr#hk@2@yO;shd zg$JZQ6==#>l<{70$G?qXq%PhS=ObOPiojUdzwPVzR^vl~+55J{DPtqwvilmVH~k;_mVbT;H^B8ESh1to+&dNF>!QAiQ+U z?sS{TbX)X1;~?vn#*j@*+nG>sZP?j1woIYvn)pmFC0WU9veqY*_Q{vf`9tTb>Fr(Hr~Lhc5{5m0wGvwd} zqPn@{D8%H=Hz0BZH2A}+i%P!_vJd-yd$6}i{9yB-pdS7Rq_!wBky}7{G#FcxV}>Mi zxWRE+GejR9m8GvG%OcenAvRbHj}}C2lZPB3-#Y$;A6LBT`#ccr+~50?8x7V(VxyD0 zZ5WZzqdOGyy&+o|X5e*+PULJrV&mO8;L^?~mnEu*?;P%TQjz4uW>rMkUiJ|*<=9~KIHAjYZn!|2>7toW{kU`Jfu#3;%RC@>jPZ`HhmEv z4ZuzL74ZbIu-dE5XFU?{AD!yw!C+4&H3v?PO%)Tit#!c?aB`@!}rPz!1sT$h@oB3*MTD{n3Hey$!{33*yr<4R`wY$ zPR^;xJB$W7Z<+cc?f{!#Y94kOUU05@zow_&g1`P~JBy!_W^2@&Moz#9lR`gMcAfQF zKBW^=qBkx}YL)o3BEnnskOEz^+xU^Omi;l;>{V}vK5H4}>k9PHd6ia;w<%T*1=R1T z>+he#d7`MS%?!=IN&LC?VURm;N_-v#$<3uElZI&?`^b;t3-7#&> zu2z(#K0?ame5u0*mCm@Idwi-|?qKMl(xQF9@>QHbRE7?&6Z&g4Zj{P)8Y;P+yvU(m1pDQYUu46^-M24iD>vG`p8xy@L1C4E!th!})r{J5ZnaFd zYfHl{7w9re7cozfGNS_HZH%h=sKdmiKHc_`9hp99zhdN+6)$>|| zQ62d_m-B95HG=JGD{c;bv0KwkEoH!6V@MUCnm$}2FT;;y6|3c+mS>{yMBQ3<+SZWPp_3dJif?qU$ zYN@=g07LC0x8TMIrRE=} zBWC=jt?40)Y*CKRW^z?SUI~0O-~7@|5jB)o+vAlb<@~7*3UhtIZNAiuKr!-mZ9@a5P)-?INlJs|3jrcKk9_@?%{7pqYWALmd zN3&vV#HDUOkiD8s^eesxjo)%q22=F2poy~^+2OTx&4QUQu(G%qS=8#K`uzi4ob`}` z5qj)|rVDV1h1Z7E|7=73x^q6SKc7S-yo9&H3|1H3(2TI~Cpxq_CkiQ&*P4=At5cV& zK)Y52m^vYEyo`efwu9qsxzrWkAIk4j7H4mbTY{C+_7ajSU zp!^c`Yyl6-8l@(Rx|9@udan3rszq(TS9-?I#j`#u)1+^x@$)Z#tF%y$OThSK=2j7f z@HyCkbFEBPg`V+zkhB|Q6{oEVg`OT-qV8%OPWlOc#imO!mRE?p!re&A%&&)so6dtP zjgpTVj^Mo~yn}ov9ACY~iPqcLBpYs%;_{606Z5oA3auxk61?JBa6w-^IIf*ZZh)74Z%zm?E)qDpYMTig?u<0hJ zf0@}LhR&&08E%U_kE~iJ5%)t-#lEmiK3dP!pYYB6Hr~)JgGkx-Arzl@wGlrzyB^vA2rw$8>Y){s)j2A)|v>bI*t>tF?3xT;)caf6zWqduNN|S z#y@ib`|WkM7NsnSDt5sw`gY$efd0tjAmV?#zOUBwr_xkdqJ)e;Be3144t{;L$DBR` z5V&ylqmP{%y^7%+oNww%?nA?W=J+MHggGIDi{d99Zp9oIAzIcJcE4rrnh60~m_mF> z^wmjZZW3zNyzen&4lI>hmB3{JK9C@Txw$(cSL>kjU`E>UYq;wDi$;{SI8K4mUU(*O za~B_o2nPG}`7`*l?sGofTi??V-PR!QrC#h?f!um2w{rBL!AmrFi_KE`$8`{SE>9$& zpC@{Pc3*|wIB8U9b5pfzoe?GPfKfxflN6PpxZt+W7p_8**jJVU+iO1cw@=wT@puQz ze-Mz#4TjeLST=Sc3Tln7=#`oLG>sU)m*s*OyE@S4fCcVd|7Kc)#kruL7b%8S3;>Hn z+m4%*+$SE=lp}ZRHX;bB{5`+_!?(lK0sFJ;NXd-M-ywkINRa7KUm&CYzr3<)+R%<_ z9;eZ>v;9uG{x>%9;T{=zea{iCf_A@1u^P}z6;Yl8y;d?VLT+nS#89O!aD}44qw=JH zysK2PiVZ#EHu5!`r=(Jwe;R| z@~GuA=?vPSmxW$3?*?vuEcEi^{*VMH$%b|Iv|;!p)1*~w0ljk^%=TpKs5Ja%%aeLP zLj|?;W`EEFAD})IcTzIFWkdc%f1goTZE=3#a(szpPz*6n{p}mhOz=kdpfa(c3gapt zjtV|^5?(wC-UeNZ{$v-R<_7<|ia6oqac6c@3Q9 z0W;$K)8&MVE) z!1qycjvB9DeqcYHB|6V>tCEhEB<)zYvY><12#ywjX=e;vnKJuOnsOWn()TN%39IyY%ZrJg3{LmuiuM1JQFsV2jJkRrQM^&kN>$LIHb!&r|hmcy;`B~BoIt~k4=Tsz|g!4@6L z-Q#UT2sq0tQM$kaH0BOPkC%QO0G3Ws0S-GPiqQ!yn;KW=pv-5LI7&>V-UJ4i`8Epn z+($u5TCR=jZ)Hw5UXJC3jK7_UDJ}e@`F#bKnh9x^0_@*jUqh4@Uif4?WWRN&iE;mB zdjV5fH8@CgqzxT5RgvZsX{7@zDZOCp6rVNC$nZDxny`*I_GwBzetnx=E zev36qn5F6XCH)Qi=ItU11}A;o7Z`W*&nWYyw0kdlrfo};lldLr3$O3YBW;8a+^Qa) z7Noz z&!~q947{iB1%z?^L-tFQwmz6g{7g*}7h^?58ql7B54S4Q&k<2C zlP2c-(dBUdMvgXaNUa}3Aud;eY@Z*sQ$c!(jBg2tJDV{~5AL~k0>PyLlC{C?82~Z{ z#j=2eok&G=PH$}$d6aFwlz(%!8g$uz@tXBc>i@H&rMm4=Eu~htr_((=&d)+O z$wU}}gUjeu$A^l2|4)RR42n4wHlj@wgt*L830>-PeddqRVC%FiION^M*1HuF)+a3r zIY)7&;bH?uL{ulM5LtV0n9ZF+u1bc!3W zo~GgcdB={KHsm*w`Z4t}_{J~}D(E(&6mcLQ_b-``3%KAf@;B*`?WyTJ{R51@K&^fY zvVy-$!e4v|x!kYDG6O62d%U{U#?jL<(xl)IB)}(+(iO`*(O0n!ubeSmc^=a923$bZ zuKWpIJSl{oQ^hJ+xAl#3R2Q4geab zl+7Km;Y71EVJ+XA)!>|nZK%p-4og4yaIQgssKZ{zpcN7o&7+^LZ> zdo8Xa>fN3hJ3%Xtgyu$fanA$sZRun$Lr&qAs85(vgK-sKk7##}9A}^%RA_DZTxUz3 za=t^}K|Z(1#*AP1R=d@w=v9Zsb>UJ-fJE*2TAkX@?h#=rm2+x5MVCS$mwLffp2PI{ zZ7ipqDfFw-R}FzchkHu2c#;J=C?9rEJ^W3PeFQ(Lf_xwBjpRxA9x3g7EYz|RbfI!< zLhr%x9ecRvF4g6iC$cKye)DB52KEVzT{!fp&+o*+UJe(Ys81j;hi#H$8E0laISD-J zEHqJ$X@F>4-lg|jcI{T{RYct-KFzXn zjj{-Z=YW1vfOYb3fZb)z^2=W3QC#wWYw8}`$LJl4^akC$3zYOB@AgBFv27g}R%g(z z=#S{nX)u`TwCP5=B4RD^kijSqrk}2Bt(Vvv9;WO8Bp`z;qFjy@wc2^>!{IZX%+37G z<(As#hkyQ1q<#{@oF}8l(B7g$jJ+slbxehFOgxoMt>H9_x>%r@9Sd$I;3<1Gu!yR@ z#lsl;lUw$GibDUT{H*)qRQ#W6&&!6_C#C)~^6mvtAoG7}K;PYp$@xzKY5bM{b3^`x bpPFmDeZQgGum41=OJ`_cdaFXuDf+(v5x(+Z diff --git a/ckplayer/css/images/ckplayer_red.png b/ckplayer/css/images/ckplayer_red.png deleted file mode 100644 index d872a0a4be254de9fca161be0df0eb876b93cdaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11320 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 I;_Z9?2lm{DdH?_b diff --git a/ckplayer/css/images/loading.png b/ckplayer/css/images/loading.png deleted file mode 100644 index fe16ca36509291d06a78f886d1ca3a7317cb9f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4194 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 D$U#vH diff --git a/ckplayer/css/images/play.png b/ckplayer/css/images/play.png deleted file mode 100644 index f9e111bb643652031c3ea2644f5f0b3f139e56ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 zcmaJ@X;>5I7XAVh2^vLQpoo$i6$FJOtVv2(!@i0jP*e=b1R`cJ8O#t7gK()8P`o0b zqEL}V1p=s#Eh@6uQZFi&3MeXT6%Z)VDC=Y7w4&+=ow4G#3e z=^E(*0B}Cuj1cscsb3v!^xN#jY(X5N;Ph z3J|(Oaa?by2-+qM3}s2$YOC(dNR3gcmXl-qYA}qy;e3*$?^2O^H zA}}B^OT-nzTmc`ij>wD=B*1h6s`RfCc*1~yPl5U3`9`5FBO**8k!(dG@_6dH=Fnm| z1p2Rx&!WYli9(1N0*M6)A{IIi&iVy1+Pl9`qz0mDXbb@>fd}zn9|oO(daT%7HqFD+ zhHC9WCfVB9+mgv1?rv@rD#e}T=|&>ky1A3=7PvlqG0fz%pam}X6PM)qw_KXL2x7tl zQK&$$cVT+LaROK%juQy+?(XVoIp8;ibNOt6L~O2Z@4Q+_#N7|EJw*Z@ey%?>?q@W( z+LNs*R5x@3?Cj_CGaOtQwiHhfI}+8FLGdKabJ?G%eV%Lmf4M|d3{gGY{~7jz3*8{K z`Du00%ctds_~^!q(ABQAI9dR}7o$E5*HEN;?A%O7SlG&zuHSMrU1tYU%dupxQFS$E zQ;9d%P)gdkHElykIlU-4EqR2fbM!*ZP@M9ZufNosUSZg7oLTc&KfZil_1yyFFD(yH z6KATFM#j=?@kHX7xN~Z8v}g8#2`9-x<<$8D4|_&C!z@<$cuxu!I~wp0m%ShVcqmQM zd{AMJm^l(ct1kQL$et=fkk^!T#V&i(yBamOc#tvWsd)|mi8pT9k7Ui3=xQ~r6?z>W ze5xgB{3haz3KN%_S3)wi{Gf}hZ(TtIC;MCa(^s~1vgG9Z)+J>pFDE^3%E^$QVS)Rs z(*wRTAB6?tmOl7AhGfjX_clnT%*>G2X(cbIKfJNk83UWzzoNX_rP_)ddD&`)F%qv6 zUnz0@sx>c2tW`8Cl5?K~X=HYMk*mGdU$YRDzYDqEQ+dn4DYZnosG*$GeXl=Z&Trau zqj9P+ws!0TFbunT&Un{^;t5tZvJ$B&X^hlrkUvb#Yj*HfN*u5*46bl(hMsY>l zAE+`Fa9zN$Q8u#tJ#fqds*WY9e;_GoF9Nk1zPqNVQ%t%dG!#0b-PlxHiosB7Y$JA? zEFRJWcg}FQ)jtOsVrA|D)$*g~lpQAk<0dI^mjcdpMo@sVlIuppjY|-s$4jM;v`{r~RMhb@(uYQhPK7_YspT zOwQ5VGV)WlVTs_~GsRT}(H|6Yg;{C1%~$h*f2yQEwy*FsaQd~+!Y?&L?V0K?>szk| z6^-++{o=8Cg>2fzZB2b)K5**baE0U*ve)V1zHyapTEg-~{b}omOpRa@pWzG1`PjZ~ zc~M3?e8KzIuxg!3d2x>yIC?1_mnPNd3zxtH`*0=Y0cx(7VSB)OYxTB)`1#K?G2rV1!XrZo>i(U_7dWn$2kK$)_xmolk%q zuiK7`6qPvCGu_{&gZANakJXGHFn+xXF_3Gj9-C^q=*XNWy@z)uRpgpo8k&jl9(h#| zc71grSQ+$9pIP7WlTtU0VB?ZnyG(Fb&csGFN!t;ThTe_3jW5UhweW#!a~^FNIC(Al z2)JA3A9YtxhS+ZSj<-XQOY{YA!>f1$Ixh9ojhxxCM4Sx#<}g|ux5^LHb`_;5-#m*k zT!Q&|f2UWM)p@`!p4j-l=m&@M&8LQqt}B+r>Jdy!xdYZPY+^>;@`r& z9;e)A2B1ziJbbWfsA6hS!_u>pGm$aTVEEXY7lNs!vA3N8EI;@A4{O+wDCK5+VS4YN z8n+!gGrFug2Mrl$)V-CZ>6cFjbxZ5XE##^03X_;W-ePvIPZBR>byP(LHJQ}zy?5yh zzu)L)WH0T7M(>XUEhm7qsRMTdA~}s`|IohcxUXx%Dc`W(0#m=?=x5mjPo!gZ>5-)> zpywxp%rkwWF379JIEw*!N_RV~{rp59^3E){Zi$A)TP@Y-8-+fSoHh7lsl4V+XbLdw z*o&AuCKQ+ 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__; -/******/ })() -; -}); -//# sourceMappingURL=flv.js.map \ No newline at end of file diff --git a/ckplayer/flv.js/flv.js.map b/ckplayer/flv.js/flv.js.map deleted file mode 100644 index 097adc6..0000000 --- a/ckplayer/flv.js/flv.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://flvjs/webpack/universalModuleDefinition","webpack://flvjs/./node_modules/es6-promise/dist/es6-promise.js","webpack://flvjs/./node_modules/events/events.js","webpack://flvjs/./node_modules/webworkify-webpack/index.js","webpack://flvjs/./src/config.js","webpack://flvjs/./src/core/features.js","webpack://flvjs/./src/core/media-info.js","webpack://flvjs/./src/core/media-segment-info.js","webpack://flvjs/./src/core/mse-controller.js","webpack://flvjs/./src/core/mse-events.js","webpack://flvjs/./src/core/transmuxer.js","webpack://flvjs/./src/core/transmuxing-controller.js","webpack://flvjs/./src/core/transmuxing-events.js","webpack://flvjs/./src/core/transmuxing-worker.js","webpack://flvjs/./src/demux/amf-parser.js","webpack://flvjs/./src/demux/demux-errors.js","webpack://flvjs/./src/demux/exp-golomb.js","webpack://flvjs/./src/demux/flv-demuxer.js","webpack://flvjs/./src/demux/sps-parser.js","webpack://flvjs/./src/flv.js","webpack://flvjs/./src/index.js","webpack://flvjs/./src/io/fetch-stream-loader.js","webpack://flvjs/./src/io/io-controller.js","webpack://flvjs/./src/io/loader.js","webpack://flvjs/./src/io/param-seek-handler.js","webpack://flvjs/./src/io/range-seek-handler.js","webpack://flvjs/./src/io/speed-sampler.js","webpack://flvjs/./src/io/websocket-loader.js","webpack://flvjs/./src/io/xhr-moz-chunked-loader.js","webpack://flvjs/./src/io/xhr-range-loader.js","webpack://flvjs/./src/player/flv-player.js","webpack://flvjs/./src/player/native-player.js","webpack://flvjs/./src/player/player-errors.js","webpack://flvjs/./src/player/player-events.js","webpack://flvjs/./src/remux/aac-silent.js","webpack://flvjs/./src/remux/mp4-generator.js","webpack://flvjs/./src/remux/mp4-remuxer.js","webpack://flvjs/./src/utils/browser.js","webpack://flvjs/./src/utils/exception.js","webpack://flvjs/./src/utils/logger.js","webpack://flvjs/./src/utils/logging-control.js","webpack://flvjs/./src/utils/polyfill.js","webpack://flvjs/./src/utils/utf8-conv.js","webpack://flvjs/webpack/bootstrap","webpack://flvjs/webpack/runtime/compat get default export","webpack://flvjs/webpack/runtime/define property getters","webpack://flvjs/webpack/runtime/global","webpack://flvjs/webpack/runtime/hasOwnProperty shorthand","webpack://flvjs/webpack/runtime/make namespace object","webpack://flvjs/webpack/startup"],"names":[],"mappings":"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","file":"flv.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"flvjs\"] = factory();\n\telse\n\t\troot[\"flvjs\"] = factory();\n})(self, function() {\nreturn ","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.8+1e68dce6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var vertx = Function('return this')().require('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n var then$$1 = void 0;\n try {\n then$$1 = value.then;\n } catch (error) {\n reject(promise, error);\n return;\n }\n handleMaybeThenable(promise, value, then$$1);\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = true;\n\n if (hasCallback) {\n try {\n value = callback(detail);\n } catch (e) {\n succeeded = false;\n error = e;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (succeeded === false) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = void 0;\n var error = void 0;\n var didError = false;\n try {\n _then = entry.then;\n } catch (e) {\n didError = true;\n error = e;\n }\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n if (didError) {\n reject(promise, error);\n } else {\n handleMaybeThenable(promise, entry, _then);\n }\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n if (isFunction(callback)) {\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n }\n\n return promise.then(callback, callback);\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","function webpackBootstrapFunc (modules) {\n/******/ // The module cache\n/******/ var installedModules = {};\n\n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n\n/******/ // Check if module is in cache\n/******/ if(installedModules[moduleId])\n/******/ return installedModules[moduleId].exports;\n\n/******/ // Create a new module (and put it into the cache)\n/******/ var module = installedModules[moduleId] = {\n/******/ i: moduleId,\n/******/ l: false,\n/******/ exports: {}\n/******/ };\n\n/******/ // Execute the module function\n/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ // Flag the module as loaded\n/******/ module.l = true;\n\n/******/ // Return the exports of the module\n/******/ return module.exports;\n/******/ }\n\n/******/ // expose the modules object (__webpack_modules__)\n/******/ __webpack_require__.m = modules;\n\n/******/ // expose the module cache\n/******/ __webpack_require__.c = installedModules;\n\n/******/ // identity function for calling harmony imports with the correct context\n/******/ __webpack_require__.i = function(value) { return value; };\n\n/******/ // define getter function for harmony exports\n/******/ __webpack_require__.d = function(exports, name, getter) {\n/******/ if(!__webpack_require__.o(exports, name)) {\n/******/ Object.defineProperty(exports, name, {\n/******/ configurable: false,\n/******/ enumerable: true,\n/******/ get: getter\n/******/ });\n/******/ }\n/******/ };\n\n/******/ // define __esModule on exports\n/******/ __webpack_require__.r = function(exports) {\n/******/ Object.defineProperty(exports, '__esModule', { value: true });\n/******/ };\n\n/******/ // getDefaultExport function for compatibility with non-harmony modules\n/******/ __webpack_require__.n = function(module) {\n/******/ var getter = module && module.__esModule ?\n/******/ function getDefault() { return module['default']; } :\n/******/ function getModuleExports() { return module; };\n/******/ __webpack_require__.d(getter, 'a', getter);\n/******/ return getter;\n/******/ };\n\n/******/ // Object.prototype.hasOwnProperty.call\n/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n/******/ // __webpack_public_path__\n/******/ __webpack_require__.p = \"/\";\n\n/******/ // on error function for async loading\n/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n var f = __webpack_require__(__webpack_require__.s = ENTRY_MODULE)\n return f.default || f // try to call default if defined to also support babel esmodule exports\n}\n\nvar moduleNameReqExp = '[\\\\.|\\\\-|\\\\+|\\\\w|\\/|@]+'\nvar dependencyRegExp = '\\\\(\\\\s*(\\/\\\\*.*?\\\\*\\/)?\\\\s*.*?(' + moduleNameReqExp + ').*?\\\\)' // additional chars when output.pathinfo is true\n\n// http://stackoverflow.com/a/2593661/130442\nfunction quoteRegExp (str) {\n return (str + '').replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&')\n}\n\nfunction isNumeric(n) {\n return !isNaN(1 * n); // 1 * n converts integers, integers as string (\"123\"), 1e3 and \"1e3\" to integers and strings to NaN\n}\n\nfunction getModuleDependencies (sources, module, queueName) {\n var retval = {}\n retval[queueName] = []\n\n var fnString = module.toString()\n var wrapperSignature = fnString.match(/^function\\s?\\w*\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/)\n if (!wrapperSignature) return retval\n var webpackRequireName = wrapperSignature[1]\n\n // main bundle deps\n var re = new RegExp('(\\\\\\\\n|\\\\W)' + quoteRegExp(webpackRequireName) + dependencyRegExp, 'g')\n var match\n while ((match = re.exec(fnString))) {\n if (match[3] === 'dll-reference') continue\n retval[queueName].push(match[3])\n }\n\n // dll deps\n re = new RegExp('\\\\(' + quoteRegExp(webpackRequireName) + '\\\\(\"(dll-reference\\\\s(' + moduleNameReqExp + '))\"\\\\)\\\\)' + dependencyRegExp, 'g')\n while ((match = re.exec(fnString))) {\n if (!sources[match[2]]) {\n retval[queueName].push(match[1])\n sources[match[2]] = __webpack_require__(match[1]).m\n }\n retval[match[2]] = retval[match[2]] || []\n retval[match[2]].push(match[4])\n }\n\n // convert 1e3 back to 1000 - this can be important after uglify-js converted 1000 to 1e3\n var keys = Object.keys(retval);\n for (var i = 0; i < keys.length; i++) {\n for (var j = 0; j < retval[keys[i]].length; j++) {\n if (isNumeric(retval[keys[i]][j])) {\n retval[keys[i]][j] = 1 * retval[keys[i]][j];\n }\n }\n }\n\n return retval\n}\n\nfunction hasValuesInQueues (queues) {\n var keys = Object.keys(queues)\n return keys.reduce(function (hasValues, key) {\n return hasValues || queues[key].length > 0\n }, false)\n}\n\nfunction getRequiredModules (sources, moduleId) {\n var modulesQueue = {\n main: [moduleId]\n }\n var requiredModules = {\n main: []\n }\n var seenModules = {\n main: {}\n }\n\n while (hasValuesInQueues(modulesQueue)) {\n var queues = Object.keys(modulesQueue)\n for (var i = 0; i < queues.length; i++) {\n var queueName = queues[i]\n var queue = modulesQueue[queueName]\n var moduleToCheck = queue.pop()\n seenModules[queueName] = seenModules[queueName] || {}\n if (seenModules[queueName][moduleToCheck] || !sources[queueName][moduleToCheck]) continue\n seenModules[queueName][moduleToCheck] = true\n requiredModules[queueName] = requiredModules[queueName] || []\n requiredModules[queueName].push(moduleToCheck)\n var newModules = getModuleDependencies(sources, sources[queueName][moduleToCheck], queueName)\n var newModulesKeys = Object.keys(newModules)\n for (var j = 0; j < newModulesKeys.length; j++) {\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]] || []\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]].concat(newModules[newModulesKeys[j]])\n }\n }\n }\n\n return requiredModules\n}\n\nmodule.exports = function (moduleId, options) {\n options = options || {}\n var sources = {\n main: __webpack_modules__\n }\n\n var requiredModules = options.all ? { main: Object.keys(sources.main) } : getRequiredModules(sources, moduleId)\n\n var src = ''\n\n Object.keys(requiredModules).filter(function (m) { return m !== 'main' }).forEach(function (module) {\n var entryModule = 0\n while (requiredModules[module][entryModule]) {\n entryModule++\n }\n requiredModules[module].push(entryModule)\n sources[module][entryModule] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })'\n 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'\n })\n\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);'\n\n var blob = new window.Blob([src], { type: 'text/javascript' })\n if (options.bare) { return blob }\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL\n\n var workerUrl = URL.createObjectURL(blob)\n var worker = new window.Worker(workerUrl)\n worker.objectURL = workerUrl\n\n return worker\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const defaultConfig = {\n enableWorker: false,\n enableStashBuffer: true,\n stashInitialSize: undefined,\n\n isLive: false,\n\n lazyLoad: true,\n lazyLoadMaxDuration: 3 * 60,\n lazyLoadRecoverDuration: 30,\n deferLoadAfterSourceOpen: true,\n\n // autoCleanupSourceBuffer: default as false, leave unspecified\n autoCleanupMaxBackwardDuration: 3 * 60,\n autoCleanupMinBackwardDuration: 2 * 60,\n\n statisticsInfoReportInterval: 600,\n\n fixAudioTimestampGap: true,\n\n accurateSeek: false,\n seekType: 'range', // [range, param, custom]\n seekParamStart: 'bstart',\n seekParamEnd: 'bend',\n rangeLoadZeroStart: false,\n customSeekHandler: undefined,\n reuseRedirectedURL: false,\n // referrerPolicy: leave as unspecified\n\n headers: undefined,\n customLoader: undefined\n};\n\nexport function createDefaultConfig() {\n return Object.assign({}, defaultConfig);\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IOController from '../io/io-controller.js';\nimport {createDefaultConfig} from '../config.js';\n\nclass Features {\n\n static supportMSEH264Playback() {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n\n static supportNetworkStreamIO() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';\n }\n\n static getNetworkLoaderTypeName() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType;\n }\n\n static supportNativeMediaPlayback(mimeType) {\n if (Features.videoElement == undefined) {\n Features.videoElement = window.document.createElement('video');\n }\n let canPlay = Features.videoElement.canPlayType(mimeType);\n return canPlay === 'probably' || canPlay == 'maybe';\n }\n\n static getFeatureList() {\n let features = {\n mseFlvPlayback: false,\n mseLiveFlvPlayback: false,\n networkStreamIO: false,\n networkLoaderName: '',\n nativeMP4H264Playback: false,\n nativeWebmVP8Playback: false,\n nativeWebmVP9Playback: false\n };\n\n features.mseFlvPlayback = Features.supportMSEH264Playback();\n features.networkStreamIO = Features.supportNetworkStreamIO();\n features.networkLoaderName = Features.getNetworkLoaderTypeName();\n features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO;\n features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"');\n features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp8.0, vorbis\"');\n features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp9\"');\n\n return features;\n }\n\n}\n\nexport default Features;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass MediaInfo {\n\n constructor() {\n this.mimeType = null;\n this.duration = null;\n\n this.hasAudio = null;\n this.hasVideo = null;\n this.audioCodec = null;\n this.videoCodec = null;\n this.audioDataRate = null;\n this.videoDataRate = null;\n\n this.audioSampleRate = null;\n this.audioChannelCount = null;\n\n this.width = null;\n this.height = null;\n this.fps = null;\n this.profile = null;\n this.level = null;\n this.refFrames = null;\n this.chromaFormat = null;\n this.sarNum = null;\n this.sarDen = null;\n\n this.metadata = null;\n this.segments = null; // MediaInfo[]\n this.segmentCount = null;\n this.hasKeyframesIndex = null;\n this.keyframesIndex = null;\n }\n\n isComplete() {\n let audioInfoComplete = (this.hasAudio === false) ||\n (this.hasAudio === true &&\n this.audioCodec != null &&\n this.audioSampleRate != null &&\n this.audioChannelCount != null);\n\n let videoInfoComplete = (this.hasVideo === false) ||\n (this.hasVideo === true &&\n this.videoCodec != null &&\n this.width != null &&\n this.height != null &&\n this.fps != null &&\n this.profile != null &&\n this.level != null &&\n this.refFrames != null &&\n this.chromaFormat != null &&\n this.sarNum != null &&\n this.sarDen != null);\n\n // keyframesIndex may not be present\n return this.mimeType != null &&\n this.duration != null &&\n this.metadata != null &&\n this.hasKeyframesIndex != null &&\n audioInfoComplete &&\n videoInfoComplete;\n }\n\n isSeekable() {\n return this.hasKeyframesIndex === true;\n }\n\n getNearestKeyframe(milliseconds) {\n if (this.keyframesIndex == null) {\n return null;\n }\n\n let table = this.keyframesIndex;\n let keyframeIdx = this._search(table.times, milliseconds);\n\n return {\n index: keyframeIdx,\n milliseconds: table.times[keyframeIdx],\n fileposition: table.filepositions[keyframeIdx]\n };\n }\n\n _search(list, value) {\n let idx = 0;\n\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (value < list[0]) {\n idx = 0;\n lbound = ubound + 1; // skip search\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (value >= list[mid] && value < list[mid + 1])) {\n idx = mid;\n break;\n } else if (list[mid] < value) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n\n return idx;\n }\n\n}\n\nexport default MediaInfo;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Represents an media sample (audio / video)\nexport class SampleInfo {\n\n constructor(dts, pts, duration, originalDts, isSync) {\n this.dts = dts;\n this.pts = pts;\n this.duration = duration;\n this.originalDts = originalDts;\n this.isSyncPoint = isSync;\n this.fileposition = null;\n }\n\n}\n\n// Media Segment concept is defined in Media Source Extensions spec.\n// Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box.\nexport class MediaSegmentInfo {\n\n constructor() {\n this.beginDts = 0;\n this.endDts = 0;\n this.beginPts = 0;\n this.endPts = 0;\n this.originalBeginDts = 0;\n this.originalEndDts = 0;\n this.syncPoints = []; // SampleInfo[n], for video IDR frames only\n this.firstSample = null; // SampleInfo\n this.lastSample = null; // SampleInfo\n }\n\n appendSyncPoint(sampleInfo) { // also called Random Access Point\n sampleInfo.isSyncPoint = true;\n this.syncPoints.push(sampleInfo);\n }\n\n}\n\n// Ordered list for recording video IDR frames, sorted by originalDts\nexport class IDRSampleList {\n\n constructor() {\n this._list = [];\n }\n\n clear() {\n this._list = [];\n }\n\n appendArray(syncPoints) {\n let list = this._list;\n\n if (syncPoints.length === 0) {\n return;\n }\n\n if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) {\n this.clear();\n }\n\n Array.prototype.push.apply(list, syncPoints);\n }\n\n getLastSyncPointBeforeDts(dts) {\n if (this._list.length == 0) {\n return null;\n }\n\n let list = this._list;\n let idx = 0;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (dts < list[0].dts) {\n idx = 0;\n lbound = ubound + 1;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (dts >= list[mid].dts && dts < list[mid + 1].dts)) {\n idx = mid;\n break;\n } else if (list[mid].dts < dts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return this._list[idx];\n }\n\n}\n\n// Data structure for recording information of media segments in single track.\nexport class MediaSegmentInfoList {\n\n constructor(type) {\n this._type = type;\n this._list = [];\n this._lastAppendLocation = -1; // cached last insert location\n }\n\n get type() {\n return this._type;\n }\n\n get length() {\n return this._list.length;\n }\n\n isEmpty() {\n return this._list.length === 0;\n }\n\n clear() {\n this._list = [];\n this._lastAppendLocation = -1;\n }\n\n _searchNearestSegmentBefore(originalBeginDts) {\n let list = this._list;\n if (list.length === 0) {\n return -2;\n }\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n let idx = 0;\n\n if (originalBeginDts < list[0].originalBeginDts) {\n idx = -1;\n return idx;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (originalBeginDts > list[mid].lastSample.originalDts &&\n (originalBeginDts < list[mid + 1].originalBeginDts))) {\n idx = mid;\n break;\n } else if (list[mid].originalBeginDts < originalBeginDts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return idx;\n }\n\n _searchNearestSegmentAfter(originalBeginDts) {\n return this._searchNearestSegmentBefore(originalBeginDts) + 1;\n }\n\n append(mediaSegmentInfo) {\n let list = this._list;\n let msi = mediaSegmentInfo;\n let lastAppendIdx = this._lastAppendLocation;\n let insertIdx = 0;\n\n if (lastAppendIdx !== -1 && lastAppendIdx < list.length &&\n msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts &&\n ((lastAppendIdx === list.length - 1) ||\n (lastAppendIdx < list.length - 1 &&\n msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts))) {\n insertIdx = lastAppendIdx + 1; // use cached location idx\n } else {\n if (list.length > 0) {\n insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1;\n }\n }\n\n this._lastAppendLocation = insertIdx;\n this._list.splice(insertIdx, 0, msi);\n }\n\n getLastSegmentBefore(originalBeginDts) {\n let idx = this._searchNearestSegmentBefore(originalBeginDts);\n if (idx >= 0) {\n return this._list[idx];\n } else { // -1\n return null;\n }\n }\n\n getLastSampleBefore(originalBeginDts) {\n let segment = this.getLastSegmentBefore(originalBeginDts);\n if (segment != null) {\n return segment.lastSample;\n } else {\n return null;\n }\n }\n\n getLastSyncPointBefore(originalBeginDts) {\n let segmentIdx = this._searchNearestSegmentBefore(originalBeginDts);\n let syncPoints = this._list[segmentIdx].syncPoints;\n while (syncPoints.length === 0 && segmentIdx > 0) {\n segmentIdx--;\n syncPoints = this._list[segmentIdx].syncPoints;\n }\n if (syncPoints.length > 0) {\n return syncPoints[syncPoints.length - 1];\n } else {\n return null;\n }\n }\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MSEEvents from './mse-events.js';\nimport {SampleInfo, IDRSampleList} from './media-segment-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\n// Media Source Extensions controller\nclass MSEController {\n\n constructor(config) {\n this.TAG = 'MSEController';\n\n this._config = config;\n this._emitter = new EventEmitter();\n\n if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) {\n // For live stream, do auto cleanup by default\n this._config.autoCleanupSourceBuffer = true;\n }\n\n this.e = {\n onSourceOpen: this._onSourceOpen.bind(this),\n onSourceEnded: this._onSourceEnded.bind(this),\n onSourceClose: this._onSourceClose.bind(this),\n onSourceBufferError: this._onSourceBufferError.bind(this),\n onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this)\n };\n\n this._mediaSource = null;\n this._mediaSourceObjectURL = null;\n this._mediaElement = null;\n\n this._isBufferFull = false;\n this._hasPendingEos = false;\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n\n this._pendingSourceBufferInit = [];\n this._mimeTypes = {\n video: null,\n audio: null\n };\n this._sourceBuffers = {\n video: null,\n audio: null\n };\n this._lastInitSegments = {\n video: null,\n audio: null\n };\n this._pendingSegments = {\n video: [],\n audio: []\n };\n this._pendingRemoveRanges = {\n video: [],\n audio: []\n };\n this._idrList = new IDRSampleList();\n }\n\n destroy() {\n if (this._mediaElement || this._mediaSource) {\n this.detachMediaElement();\n }\n this.e = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n if (this._mediaSource) {\n throw new IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');\n }\n let ms = this._mediaSource = new window.MediaSource();\n ms.addEventListener('sourceopen', this.e.onSourceOpen);\n ms.addEventListener('sourceended', this.e.onSourceEnded);\n ms.addEventListener('sourceclose', this.e.onSourceClose);\n\n this._mediaElement = mediaElement;\n this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource);\n mediaElement.src = this._mediaSourceObjectURL;\n }\n\n detachMediaElement() {\n if (this._mediaSource) {\n let ms = this._mediaSource;\n for (let type in this._sourceBuffers) {\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n this._pendingSegments[type] = null;\n this._pendingRemoveRanges[type] = null;\n this._lastInitSegments[type] = null;\n\n // remove all sourcebuffers\n let sb = this._sourceBuffers[type];\n if (sb) {\n if (ms.readyState !== 'closed') {\n // ms edge can throw an error: Unexpected call to method or property access\n try {\n ms.removeSourceBuffer(sb);\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n sb.removeEventListener('error', this.e.onSourceBufferError);\n sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n }\n this._mimeTypes[type] = null;\n this._sourceBuffers[type] = null;\n }\n }\n if (ms.readyState === 'open') {\n try {\n ms.endOfStream();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n ms.removeEventListener('sourceopen', this.e.onSourceOpen);\n ms.removeEventListener('sourceended', this.e.onSourceEnded);\n ms.removeEventListener('sourceclose', this.e.onSourceClose);\n this._pendingSourceBufferInit = [];\n this._isBufferFull = false;\n this._idrList.clear();\n this._mediaSource = null;\n }\n\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement = null;\n }\n if (this._mediaSourceObjectURL) {\n window.URL.revokeObjectURL(this._mediaSourceObjectURL);\n this._mediaSourceObjectURL = null;\n }\n }\n\n appendInitSegment(initSegment, deferred) {\n if (!this._mediaSource || this._mediaSource.readyState !== 'open') {\n // sourcebuffer creation requires mediaSource.readyState === 'open'\n // so we defer the sourcebuffer creation, until sourceopen event triggered\n this._pendingSourceBufferInit.push(initSegment);\n // make sure that this InitSegment is in the front of pending segments queue\n this._pendingSegments[initSegment.type].push(initSegment);\n return;\n }\n\n let is = initSegment;\n let mimeType = `${is.container}`;\n if (is.codec && is.codec.length > 0) {\n mimeType += `;codecs=${is.codec}`;\n }\n\n let firstInitSegment = false;\n\n Log.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType);\n this._lastInitSegments[is.type] = is;\n\n if (mimeType !== this._mimeTypes[is.type]) {\n if (!this._mimeTypes[is.type]) { // empty, first chance create sourcebuffer\n firstInitSegment = true;\n try {\n let sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType);\n sb.addEventListener('error', this.e.onSourceBufferError);\n sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n } catch (error) {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n return;\n }\n } else {\n Log.v(this.TAG, `Notice: ${is.type} mimeType changed, origin: ${this._mimeTypes[is.type]}, target: ${mimeType}`);\n }\n this._mimeTypes[is.type] = mimeType;\n }\n\n if (!deferred) {\n // deferred means this InitSegment has been pushed to pendingSegments queue\n this._pendingSegments[is.type].push(is);\n }\n if (!firstInitSegment) { // append immediately only if init segment in subsequence\n if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) {\n this._doAppendSegments();\n }\n }\n if (Browser.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) {\n // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN\n // Manually correct MediaSource.duration to make progress bar seekable, and report right duration\n this._requireSetMediaDuration = true;\n this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds\n this._updateMediaSourceDuration();\n }\n }\n\n appendMediaSegment(mediaSegment) {\n let ms = mediaSegment;\n this._pendingSegments[ms.type].push(ms);\n\n if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) {\n this._doCleanupSourceBuffer();\n }\n\n let sb = this._sourceBuffers[ms.type];\n if (sb && !sb.updating && !this._hasPendingRemoveRanges()) {\n this._doAppendSegments();\n }\n }\n\n seek(seconds) {\n // remove all appended buffers\n for (let type in this._sourceBuffers) {\n if (!this._sourceBuffers[type]) {\n continue;\n }\n\n // abort current buffer append algorithm\n let sb = this._sourceBuffers[type];\n if (this._mediaSource.readyState === 'open') {\n try {\n // If range removal algorithm is running, InvalidStateError will be throwed\n // Ignore it.\n sb.abort();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n\n // IDRList should be clear\n this._idrList.clear();\n\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n\n if (this._mediaSource.readyState === 'closed') {\n // Parent MediaSource object has been detached from HTMLMediaElement\n continue;\n }\n\n // record ranges to be remove from SourceBuffer\n for (let i = 0; i < sb.buffered.length; i++) {\n let start = sb.buffered.start(i);\n let end = sb.buffered.end(i);\n this._pendingRemoveRanges[type].push({start, end});\n }\n\n // if sb is not updating, let's remove ranges now!\n if (!sb.updating) {\n this._doRemoveRanges();\n }\n\n // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call\n // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround.\n // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230\n if (Browser.safari) {\n let lastInitSegment = this._lastInitSegments[type];\n if (lastInitSegment) {\n this._pendingSegments[type].push(lastInitSegment);\n if (!sb.updating) {\n this._doAppendSegments();\n }\n }\n }\n }\n }\n\n endOfStream() {\n let ms = this._mediaSource;\n let sb = this._sourceBuffers;\n if (!ms || ms.readyState !== 'open') {\n if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) {\n // If MediaSource hasn't turned into open state, and there're pending segments\n // Mark pending endOfStream, defer call until all pending segments appended complete\n this._hasPendingEos = true;\n }\n return;\n }\n if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {\n // If any sourcebuffer is updating, defer endOfStream operation\n // See _onSourceBufferUpdateEnd()\n this._hasPendingEos = true;\n } else {\n this._hasPendingEos = false;\n // Notify media data loading complete\n // This is helpful for correcting total duration to match last media segment\n // Otherwise MediaElement's ended event may not be triggered\n ms.endOfStream();\n }\n }\n\n getNearestKeyframe(dts) {\n return this._idrList.getLastSyncPointBeforeDts(dts);\n }\n\n _needCleanupSourceBuffer() {\n if (!this._config.autoCleanupSourceBuffer) {\n return false;\n }\n\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n if (buffered.length >= 1) {\n if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n _doCleanupSourceBuffer() {\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n let doRemove = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n\n if (start <= currentTime && currentTime < end + 3) { // padding 3 seconds\n if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) {\n doRemove = true;\n let removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration;\n this._pendingRemoveRanges[type].push({start: start, end: removeEnd});\n }\n } else if (end < currentTime) {\n doRemove = true;\n this._pendingRemoveRanges[type].push({start: start, end: end});\n }\n }\n\n if (doRemove && !sb.updating) {\n this._doRemoveRanges();\n }\n }\n }\n }\n\n _updateMediaSourceDuration() {\n let sb = this._sourceBuffers;\n if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') {\n return;\n }\n if ((sb.video && sb.video.updating) || (sb.audio && sb.audio.updating)) {\n return;\n }\n\n let current = this._mediaSource.duration;\n let target = this._pendingMediaDuration;\n\n if (target > 0 && (isNaN(current) || target > current)) {\n Log.v(this.TAG, `Update MediaSource duration from ${current} to ${target}`);\n this._mediaSource.duration = target;\n }\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n }\n\n _doRemoveRanges() {\n for (let type in this._pendingRemoveRanges) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n let sb = this._sourceBuffers[type];\n let ranges = this._pendingRemoveRanges[type];\n while (ranges.length && !sb.updating) {\n let range = ranges.shift();\n sb.remove(range.start, range.end);\n }\n }\n }\n\n _doAppendSegments() {\n let pendingSegments = this._pendingSegments;\n\n for (let type in pendingSegments) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n\n if (pendingSegments[type].length > 0) {\n let segment = pendingSegments[type].shift();\n\n if (segment.timestampOffset) {\n // For MPEG audio stream in MSE, if unbuffered-seeking occurred\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n let currentOffset = this._sourceBuffers[type].timestampOffset;\n let targetOffset = segment.timestampOffset / 1000; // in seconds\n\n let delta = Math.abs(currentOffset - targetOffset);\n if (delta > 0.1) { // If time delta > 100ms\n Log.v(this.TAG, `Update MPEG audio timestampOffset from ${currentOffset} to ${targetOffset}`);\n this._sourceBuffers[type].timestampOffset = targetOffset;\n }\n delete segment.timestampOffset;\n }\n\n if (!segment.data || segment.data.byteLength === 0) {\n // Ignore empty buffer\n continue;\n }\n\n try {\n this._sourceBuffers[type].appendBuffer(segment.data);\n this._isBufferFull = false;\n if (type === 'video' && segment.hasOwnProperty('info')) {\n this._idrList.appendArray(segment.info.syncPoints);\n }\n } catch (error) {\n this._pendingSegments[type].unshift(segment);\n if (error.code === 22) { // QuotaExceededError\n /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full\n * Currently we can only do lazy-load to avoid SourceBuffer become scattered.\n * SourceBuffer eviction policy may be changed in future version of FireFox.\n *\n * Related issues:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023\n */\n\n // report buffer full, abort network IO\n if (!this._isBufferFull) {\n this._emitter.emit(MSEEvents.BUFFER_FULL);\n }\n this._isBufferFull = true;\n } else {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n }\n }\n }\n }\n }\n\n _onSourceOpen() {\n Log.v(this.TAG, 'MediaSource onSourceOpen');\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n // deferred sourcebuffer creation / initialization\n if (this._pendingSourceBufferInit.length > 0) {\n let pendings = this._pendingSourceBufferInit;\n while (pendings.length) {\n let segment = pendings.shift();\n this.appendInitSegment(segment, true);\n }\n }\n // there may be some pending media segments, append them\n if (this._hasPendingSegments()) {\n this._doAppendSegments();\n }\n this._emitter.emit(MSEEvents.SOURCE_OPEN);\n }\n\n _onSourceEnded() {\n // fired on endOfStream\n Log.v(this.TAG, 'MediaSource onSourceEnded');\n }\n\n _onSourceClose() {\n // fired on detaching from media element\n Log.v(this.TAG, 'MediaSource onSourceClose');\n if (this._mediaSource && this.e != null) {\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded);\n this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose);\n }\n }\n\n _hasPendingSegments() {\n let ps = this._pendingSegments;\n return ps.video.length > 0 || ps.audio.length > 0;\n }\n\n _hasPendingRemoveRanges() {\n let prr = this._pendingRemoveRanges;\n return prr.video.length > 0 || prr.audio.length > 0;\n }\n\n _onSourceBufferUpdateEnd() {\n if (this._requireSetMediaDuration) {\n this._updateMediaSourceDuration();\n } else if (this._hasPendingRemoveRanges()) {\n this._doRemoveRanges();\n } else if (this._hasPendingSegments()) {\n this._doAppendSegments();\n } else if (this._hasPendingEos) {\n this.endOfStream();\n }\n this._emitter.emit(MSEEvents.UPDATE_END);\n }\n\n _onSourceBufferError(e) {\n Log.e(this.TAG, `SourceBuffer Error: ${e}`);\n // this error might not always be fatal, just ignore it\n }\n\n}\n\nexport default MSEController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst MSEEvents = {\n ERROR: 'error',\n SOURCE_OPEN: 'source_open',\n UPDATE_END: 'update_end',\n BUFFER_FULL: 'buffer_full'\n};\n\nexport default MSEEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport work from 'webworkify-webpack';\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport TransmuxingWorker from './transmuxing-worker.js';\nimport MediaInfo from './media-info.js';\n\nclass Transmuxer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'Transmuxer';\n this._emitter = new EventEmitter();\n\n if (config.enableWorker && typeof (Worker) !== 'undefined') {\n try {\n this._worker = work(require.resolve('./transmuxing-worker'));\n this._workerDestroying = false;\n this._worker.addEventListener('message', this._onWorkerMessage.bind(this));\n this._worker.postMessage({cmd: 'init', param: [mediaDataSource, config]});\n this.e = {\n onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this)\n };\n LoggingControl.registerListener(this.e.onLoggingConfigChanged);\n this._worker.postMessage({cmd: 'logging_config', param: LoggingControl.getConfig()});\n } catch (error) {\n Log.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing');\n this._worker = null;\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n } else {\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n\n if (this._controller) {\n let ctl = this._controller;\n ctl.on(TransmuxingEvents.IO_ERROR, this._onIOError.bind(this));\n ctl.on(TransmuxingEvents.DEMUX_ERROR, this._onDemuxError.bind(this));\n ctl.on(TransmuxingEvents.INIT_SEGMENT, this._onInitSegment.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_SEGMENT, this._onMediaSegment.bind(this));\n ctl.on(TransmuxingEvents.LOADING_COMPLETE, this._onLoadingComplete.bind(this));\n ctl.on(TransmuxingEvents.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_INFO, this._onMediaInfo.bind(this));\n ctl.on(TransmuxingEvents.METADATA_ARRIVED, this._onMetaDataArrived.bind(this));\n ctl.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, this._onScriptDataArrived.bind(this));\n ctl.on(TransmuxingEvents.STATISTICS_INFO, this._onStatisticsInfo.bind(this));\n ctl.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this));\n }\n }\n\n destroy() {\n if (this._worker) {\n if (!this._workerDestroying) {\n this._workerDestroying = true;\n this._worker.postMessage({cmd: 'destroy'});\n LoggingControl.removeListener(this.e.onLoggingConfigChanged);\n this.e = null;\n }\n } else {\n this._controller.destroy();\n this._controller = null;\n }\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n hasWorker() {\n return this._worker != null;\n }\n\n open() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'start'});\n } else {\n this._controller.start();\n }\n }\n\n close() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'stop'});\n } else {\n this._controller.stop();\n }\n }\n\n seek(milliseconds) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'seek', param: milliseconds});\n } else {\n this._controller.seek(milliseconds);\n }\n }\n\n pause() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'pause'});\n } else {\n this._controller.pause();\n }\n }\n\n resume() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'resume'});\n } else {\n this._controller.resume();\n }\n }\n\n _onInitSegment(type, initSegment) {\n // do async invoke\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n });\n }\n\n _onMediaSegment(type, mediaSegment) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n });\n }\n\n _onLoadingComplete() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n });\n }\n\n _onRecoveredEarlyEof() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n });\n }\n\n _onMediaInfo(mediaInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, mediaInfo);\n });\n }\n\n _onMetaDataArrived(metadata) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n });\n }\n\n _onScriptDataArrived(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n });\n }\n\n _onStatisticsInfo(statisticsInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, statisticsInfo);\n });\n }\n\n _onIOError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n });\n }\n\n _onDemuxError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n });\n }\n\n _onRecommendSeekpoint(milliseconds) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, milliseconds);\n });\n }\n\n _onLoggingConfigChanged(config) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'logging_config', param: config});\n }\n }\n\n _onWorkerMessage(e) {\n let message = e.data;\n let data = message.data;\n\n if (message.msg === 'destroyed' || this._workerDestroying) {\n this._workerDestroying = false;\n this._worker.terminate();\n this._worker = null;\n return;\n }\n\n switch (message.msg) {\n case TransmuxingEvents.INIT_SEGMENT:\n case TransmuxingEvents.MEDIA_SEGMENT:\n this._emitter.emit(message.msg, data.type, data.data);\n break;\n case TransmuxingEvents.LOADING_COMPLETE:\n case TransmuxingEvents.RECOVERED_EARLY_EOF:\n this._emitter.emit(message.msg);\n break;\n case TransmuxingEvents.MEDIA_INFO:\n Object.setPrototypeOf(data, MediaInfo.prototype);\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.METADATA_ARRIVED:\n case TransmuxingEvents.SCRIPTDATA_ARRIVED:\n case TransmuxingEvents.STATISTICS_INFO:\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.IO_ERROR:\n case TransmuxingEvents.DEMUX_ERROR:\n this._emitter.emit(message.msg, data.type, data.info);\n break;\n case TransmuxingEvents.RECOMMEND_SEEKPOINT:\n this._emitter.emit(message.msg, data);\n break;\n case 'logcat_callback':\n Log.emitter.emit('log', data.type, data.logcat);\n break;\n default:\n break;\n }\n }\n\n}\n\nexport default Transmuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MediaInfo from './media-info.js';\nimport FLVDemuxer from '../demux/flv-demuxer.js';\nimport MP4Remuxer from '../remux/mp4-remuxer.js';\nimport DemuxErrors from '../demux/demux-errors.js';\nimport IOController from '../io/io-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport {LoaderStatus, LoaderErrors} from '../io/loader.js';\n\n// Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support\nclass TransmuxingController {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'TransmuxingController';\n this._emitter = new EventEmitter();\n\n this._config = config;\n\n // treat single part media as multipart media, which has only one segment\n if (!mediaDataSource.segments) {\n mediaDataSource.segments = [{\n duration: mediaDataSource.duration,\n filesize: mediaDataSource.filesize,\n url: mediaDataSource.url\n }];\n }\n\n // fill in default IO params if not exists\n if (typeof mediaDataSource.cors !== 'boolean') {\n mediaDataSource.cors = true;\n }\n if (typeof mediaDataSource.withCredentials !== 'boolean') {\n mediaDataSource.withCredentials = false;\n }\n\n this._mediaDataSource = mediaDataSource;\n this._currentSegmentIndex = 0;\n let totalDuration = 0;\n\n this._mediaDataSource.segments.forEach((segment) => {\n // timestampBase for each segment, and calculate total duration\n segment.timestampBase = totalDuration;\n totalDuration += segment.duration;\n // params needed by IOController\n segment.cors = mediaDataSource.cors;\n segment.withCredentials = mediaDataSource.withCredentials;\n // referrer policy control, if exist\n if (config.referrerPolicy) {\n segment.referrerPolicy = config.referrerPolicy;\n }\n });\n\n if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) {\n this._mediaDataSource.duration = totalDuration;\n }\n\n this._mediaInfo = null;\n this._demuxer = null;\n this._remuxer = null;\n this._ioctl = null;\n\n this._pendingSeekTime = null;\n this._pendingResolveSeekPoint = null;\n\n this._statisticsReporter = null;\n }\n\n destroy() {\n this._mediaInfo = null;\n this._mediaDataSource = null;\n\n if (this._statisticsReporter) {\n this._disableStatisticsReporter();\n }\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n if (this._demuxer) {\n this._demuxer.destroy();\n this._demuxer = null;\n }\n if (this._remuxer) {\n this._remuxer.destroy();\n this._remuxer = null;\n }\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n start() {\n this._loadSegment(0);\n this._enableStatisticsReporter();\n }\n\n _loadSegment(segmentIndex, optionalFrom) {\n this._currentSegmentIndex = segmentIndex;\n let dataSource = this._mediaDataSource.segments[segmentIndex];\n\n let ioctl = this._ioctl = new IOController(dataSource, this._config, segmentIndex);\n ioctl.onError = this._onIOException.bind(this);\n ioctl.onSeeked = this._onIOSeeked.bind(this);\n ioctl.onComplete = this._onIOComplete.bind(this);\n ioctl.onRedirect = this._onIORedirect.bind(this);\n ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this);\n\n if (optionalFrom) {\n this._demuxer.bindDataSource(this._ioctl);\n } else {\n ioctl.onDataArrival = this._onInitChunkArrival.bind(this);\n }\n\n ioctl.open(optionalFrom);\n }\n\n stop() {\n this._internalAbort();\n this._disableStatisticsReporter();\n }\n\n _internalAbort() {\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n }\n\n pause() { // take a rest\n if (this._ioctl && this._ioctl.isWorking()) {\n this._ioctl.pause();\n this._disableStatisticsReporter();\n }\n }\n\n resume() {\n if (this._ioctl && this._ioctl.isPaused()) {\n this._ioctl.resume();\n this._enableStatisticsReporter();\n }\n }\n\n seek(milliseconds) {\n if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) {\n return;\n }\n\n let targetSegmentIndex = this._searchSegmentIndexContains(milliseconds);\n\n if (targetSegmentIndex === this._currentSegmentIndex) {\n // intra-segment seeking\n let segmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (segmentInfo == undefined) {\n // current segment loading started, but mediainfo hasn't received yet\n // wait for the metadata loaded, then seek to expected position\n this._pendingSeekTime = milliseconds;\n } else {\n let keyframe = segmentInfo.getNearestKeyframe(milliseconds);\n this._remuxer.seek(keyframe.milliseconds);\n this._ioctl.seek(keyframe.fileposition);\n // Will be resolved in _onRemuxerMediaSegmentArrival()\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n }\n } else {\n // cross-segment seeking\n let targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (targetSegmentInfo == undefined) {\n // target segment hasn't been loaded. We need metadata then seek to expected time\n this._pendingSeekTime = milliseconds;\n this._internalAbort();\n this._remuxer.seek();\n this._remuxer.insertDiscontinuity();\n this._loadSegment(targetSegmentIndex);\n // Here we wait for the metadata loaded, then seek to expected position\n } else {\n // We have target segment's metadata, direct seek to target position\n let keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds);\n this._internalAbort();\n this._remuxer.seek(milliseconds);\n this._remuxer.insertDiscontinuity();\n this._demuxer.resetMediaInfo();\n this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase;\n this._loadSegment(targetSegmentIndex, keyframe.fileposition);\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n this._reportSegmentMediaInfo(targetSegmentIndex);\n }\n }\n\n this._enableStatisticsReporter();\n }\n\n _searchSegmentIndexContains(milliseconds) {\n let segments = this._mediaDataSource.segments;\n let idx = segments.length - 1;\n\n for (let i = 0; i < segments.length; i++) {\n if (milliseconds < segments[i].timestampBase) {\n idx = i - 1;\n break;\n }\n }\n return idx;\n }\n\n _onInitChunkArrival(data, byteStart) {\n let probeData = null;\n let consumed = 0;\n\n if (byteStart > 0) {\n // IOController seeked immediately after opened, byteStart > 0 callback may received\n this._demuxer.bindDataSource(this._ioctl);\n this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase;\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else if ((probeData = FLVDemuxer.probe(data)).match) {\n // Always create new FLVDemuxer\n this._demuxer = new FLVDemuxer(probeData, this._config);\n\n if (!this._remuxer) {\n this._remuxer = new MP4Remuxer(this._config);\n }\n\n let mds = this._mediaDataSource;\n if (mds.duration != undefined && !isNaN(mds.duration)) {\n this._demuxer.overridedDuration = mds.duration;\n }\n if (typeof mds.hasAudio === 'boolean') {\n this._demuxer.overridedHasAudio = mds.hasAudio;\n }\n if (typeof mds.hasVideo === 'boolean') {\n this._demuxer.overridedHasVideo = mds.hasVideo;\n }\n\n this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase;\n\n this._demuxer.onError = this._onDemuxException.bind(this);\n this._demuxer.onMediaInfo = this._onMediaInfo.bind(this);\n this._demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);\n this._demuxer.onScriptDataArrived = this._onScriptDataArrived.bind(this);\n\n this._remuxer.bindDataSource(this._demuxer\n .bindDataSource(this._ioctl\n ));\n\n this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);\n this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else {\n probeData = null;\n Log.e(this.TAG, 'Non-FLV, Unsupported media type!');\n Promise.resolve().then(() => {\n this._internalAbort();\n });\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, DemuxErrors.FORMAT_UNSUPPORTED, 'Non-FLV, Unsupported media type');\n\n consumed = 0;\n }\n\n return consumed;\n }\n\n _onMediaInfo(mediaInfo) {\n if (this._mediaInfo == null) {\n // Store first segment's mediainfo as global mediaInfo\n this._mediaInfo = Object.assign({}, mediaInfo);\n this._mediaInfo.keyframesIndex = null;\n this._mediaInfo.segments = [];\n this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;\n Object.setPrototypeOf(this._mediaInfo, MediaInfo.prototype);\n }\n\n let segmentInfo = Object.assign({}, mediaInfo);\n Object.setPrototypeOf(segmentInfo, MediaInfo.prototype);\n this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;\n\n // notify mediaInfo update\n this._reportSegmentMediaInfo(this._currentSegmentIndex);\n\n if (this._pendingSeekTime != null) {\n Promise.resolve().then(() => {\n let target = this._pendingSeekTime;\n this._pendingSeekTime = null;\n this.seek(target);\n });\n }\n }\n\n _onMetaDataArrived(metadata) {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n }\n\n _onScriptDataArrived(data) {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n }\n\n _onIOSeeked() {\n this._remuxer.insertDiscontinuity();\n }\n\n _onIOComplete(extraData) {\n let segmentIndex = extraData;\n let nextSegmentIndex = segmentIndex + 1;\n\n if (nextSegmentIndex < this._mediaDataSource.segments.length) {\n this._internalAbort();\n this._remuxer.flushStashedSamples();\n this._loadSegment(nextSegmentIndex);\n } else {\n this._remuxer.flushStashedSamples();\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n this._disableStatisticsReporter();\n }\n }\n\n _onIORedirect(redirectedURL) {\n let segmentIndex = this._ioctl.extraData;\n this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL;\n }\n\n _onIORecoveredEarlyEof() {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n }\n\n _onIOException(type, info) {\n Log.e(this.TAG, `IOException: type = ${type}, code = ${info.code}, msg = ${info.msg}`);\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n this._disableStatisticsReporter();\n }\n\n _onDemuxException(type, info) {\n Log.e(this.TAG, `DemuxException: type = ${type}, info = ${info}`);\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n }\n\n _onRemuxerInitSegmentArrival(type, initSegment) {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n }\n\n _onRemuxerMediaSegmentArrival(type, mediaSegment) {\n if (this._pendingSeekTime != null) {\n // Media segments after new-segment cross-seeking should be dropped.\n return;\n }\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n\n // Resolve pending seekPoint\n if (this._pendingResolveSeekPoint != null && type === 'video') {\n let syncPoints = mediaSegment.info.syncPoints;\n let seekpoint = this._pendingResolveSeekPoint;\n this._pendingResolveSeekPoint = null;\n\n // Safari: Pass PTS for recommend_seekpoint\n if (Browser.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) {\n seekpoint = syncPoints[0].pts;\n }\n // else: use original DTS (keyframe.milliseconds)\n\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, seekpoint);\n }\n }\n\n _enableStatisticsReporter() {\n if (this._statisticsReporter == null) {\n this._statisticsReporter = self.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n }\n\n _disableStatisticsReporter() {\n if (this._statisticsReporter) {\n self.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n _reportSegmentMediaInfo(segmentIndex) {\n let segmentInfo = this._mediaInfo.segments[segmentIndex];\n let exportInfo = Object.assign({}, segmentInfo);\n\n exportInfo.duration = this._mediaInfo.duration;\n exportInfo.segmentCount = this._mediaInfo.segmentCount;\n delete exportInfo.segments;\n delete exportInfo.keyframesIndex;\n\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, exportInfo);\n }\n\n _reportStatisticsInfo() {\n let info = {};\n\n info.url = this._ioctl.currentURL;\n info.hasRedirect = this._ioctl.hasRedirect;\n if (info.hasRedirect) {\n info.redirectedURL = this._ioctl.currentRedirectedURL;\n }\n\n info.speed = this._ioctl.currentSpeed;\n info.loaderType = this._ioctl.loaderType;\n info.currentSegmentIndex = this._currentSegmentIndex;\n info.totalSegmentCount = this._mediaDataSource.segments.length;\n\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, info);\n }\n\n}\n\nexport default TransmuxingController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst TransmuxingEvents = {\n IO_ERROR: 'io_error',\n DEMUX_ERROR: 'demux_error',\n INIT_SEGMENT: 'init_segment',\n MEDIA_SEGMENT: 'media_segment',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n STATISTICS_INFO: 'statistics_info',\n RECOMMEND_SEEKPOINT: 'recommend_seekpoint'\n};\n\nexport default TransmuxingEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport Polyfill from '../utils/polyfill.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\n\n/* post message to worker:\n data: {\n cmd: string\n param: any\n }\n\n receive message from worker:\n data: {\n msg: string,\n data: any\n }\n */\n\nlet TransmuxingWorker = function (self) {\n\n let TAG = 'TransmuxingWorker';\n let controller = null;\n let logcatListener = onLogcatCallback.bind(this);\n\n Polyfill.install();\n\n self.addEventListener('message', function (e) {\n switch (e.data.cmd) {\n case 'init':\n controller = new TransmuxingController(e.data.param[0], e.data.param[1]);\n controller.on(TransmuxingEvents.IO_ERROR, onIOError.bind(this));\n controller.on(TransmuxingEvents.DEMUX_ERROR, onDemuxError.bind(this));\n controller.on(TransmuxingEvents.INIT_SEGMENT, onInitSegment.bind(this));\n controller.on(TransmuxingEvents.MEDIA_SEGMENT, onMediaSegment.bind(this));\n controller.on(TransmuxingEvents.LOADING_COMPLETE, onLoadingComplete.bind(this));\n controller.on(TransmuxingEvents.RECOVERED_EARLY_EOF, onRecoveredEarlyEof.bind(this));\n controller.on(TransmuxingEvents.MEDIA_INFO, onMediaInfo.bind(this));\n controller.on(TransmuxingEvents.METADATA_ARRIVED, onMetaDataArrived.bind(this));\n controller.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, onScriptDataArrived.bind(this));\n controller.on(TransmuxingEvents.STATISTICS_INFO, onStatisticsInfo.bind(this));\n controller.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, onRecommendSeekpoint.bind(this));\n break;\n case 'destroy':\n if (controller) {\n controller.destroy();\n controller = null;\n }\n self.postMessage({msg: 'destroyed'});\n break;\n case 'start':\n controller.start();\n break;\n case 'stop':\n controller.stop();\n break;\n case 'seek':\n controller.seek(e.data.param);\n break;\n case 'pause':\n controller.pause();\n break;\n case 'resume':\n controller.resume();\n break;\n case 'logging_config': {\n let config = e.data.param;\n LoggingControl.applyConfig(config);\n\n if (config.enableCallback === true) {\n LoggingControl.addLogListener(logcatListener);\n } else {\n LoggingControl.removeLogListener(logcatListener);\n }\n break;\n }\n }\n });\n\n function onInitSegment(type, initSegment) {\n let obj = {\n msg: TransmuxingEvents.INIT_SEGMENT,\n data: {\n type: type,\n data: initSegment\n }\n };\n self.postMessage(obj, [initSegment.data]); // data: ArrayBuffer\n }\n\n function onMediaSegment(type, mediaSegment) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_SEGMENT,\n data: {\n type: type,\n data: mediaSegment\n }\n };\n self.postMessage(obj, [mediaSegment.data]); // data: ArrayBuffer\n }\n\n function onLoadingComplete() {\n let obj = {\n msg: TransmuxingEvents.LOADING_COMPLETE\n };\n self.postMessage(obj);\n }\n\n function onRecoveredEarlyEof() {\n let obj = {\n msg: TransmuxingEvents.RECOVERED_EARLY_EOF\n };\n self.postMessage(obj);\n }\n\n function onMediaInfo(mediaInfo) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_INFO,\n data: mediaInfo\n };\n self.postMessage(obj);\n }\n\n function onMetaDataArrived(metadata) {\n let obj = {\n msg: TransmuxingEvents.METADATA_ARRIVED,\n data: metadata\n };\n self.postMessage(obj);\n }\n\n function onScriptDataArrived(data) {\n let obj = {\n msg: TransmuxingEvents.SCRIPTDATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onStatisticsInfo(statInfo) {\n let obj = {\n msg: TransmuxingEvents.STATISTICS_INFO,\n data: statInfo\n };\n self.postMessage(obj);\n }\n\n function onIOError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.IO_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onDemuxError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.DEMUX_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onRecommendSeekpoint(milliseconds) {\n self.postMessage({\n msg: TransmuxingEvents.RECOMMEND_SEEKPOINT,\n data: milliseconds\n });\n }\n\n function onLogcatCallback(type, str) {\n self.postMessage({\n msg: 'logcat_callback',\n data: {\n type: type,\n logcat: str\n }\n });\n }\n\n};\n\nexport default TransmuxingWorker;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport decodeUTF8 from '../utils/utf8-conv.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nlet le = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n})();\n\nclass AMF {\n\n static parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let data = {};\n\n try {\n let name = AMF.parseValue(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n\n data[name.data] = value.data;\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return data;\n }\n\n static parseObject(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 3) {\n throw new IllegalStateException('Data not enough when parse ScriptDataObject');\n }\n let name = AMF.parseString(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n let isObjectEnd = value.objectEnd;\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n objectEnd: isObjectEnd\n };\n }\n\n static parseVariable(arrayBuffer, dataOffset, dataSize) {\n return AMF.parseObject(arrayBuffer, dataOffset, dataSize);\n }\n\n static parseString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 2) {\n throw new IllegalStateException('Data not enough when parse String');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint16(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 2, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 2 + length\n };\n }\n\n static parseLongString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 4) {\n throw new IllegalStateException('Data not enough when parse LongString');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint32(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 4, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 4 + length\n };\n }\n\n static parseDate(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 10) {\n throw new IllegalStateException('Data size invalid when parse Date');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let timestamp = v.getFloat64(0, !le);\n let localTimeOffset = v.getInt16(8, !le);\n timestamp += localTimeOffset * 60 * 1000; // get UTC time\n\n return {\n data: new Date(timestamp),\n size: 8 + 2\n };\n }\n\n static parseValue(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 1) {\n throw new IllegalStateException('Data not enough when parse Value');\n }\n\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let offset = 1;\n let type = v.getUint8(0);\n let value;\n let objectEnd = false;\n\n try {\n switch (type) {\n case 0: // Number(Double) type\n value = v.getFloat64(1, !le);\n offset += 8;\n break;\n case 1: { // Boolean type\n let b = v.getUint8(1);\n value = b ? true : false;\n offset += 1;\n break;\n }\n case 2: { // String type\n let amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfstr.data;\n offset += amfstr.size;\n break;\n }\n case 3: { // Object(s) type\n value = {};\n let terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n let amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfobj.objectEnd)\n break;\n value[amfobj.data.name] = amfobj.data.value;\n offset += amfobj.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 8: { // ECMA array type (Mixed array)\n value = {};\n offset += 4; // ECMAArrayLength(UI32)\n let terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n let amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfvar.objectEnd)\n break;\n value[amfvar.data.name] = amfvar.data.value;\n offset += amfvar.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 9: // ScriptDataObjectEnd\n value = undefined;\n offset = 1;\n objectEnd = true;\n break;\n case 10: { // Strict array type\n // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf\n value = [];\n let strictArrayLength = v.getUint32(1, !le);\n offset += 4;\n for (let i = 0; i < strictArrayLength; i++) {\n let val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset);\n value.push(val.data);\n offset += val.size;\n }\n break;\n }\n case 11: { // Date type\n let date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = date.data;\n offset += date.size;\n break;\n }\n case 12: { // Long string type\n let amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfLongStr.data;\n offset += amfLongStr.size;\n break;\n }\n default:\n // ignore and skip\n offset = dataSize;\n Log.w('AMF', 'Unsupported AMF value type ' + type);\n }\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return {\n data: value,\n size: offset,\n objectEnd: objectEnd\n };\n }\n\n}\n\nexport default AMF;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DemuxErrors = {\n OK: 'OK',\n FORMAT_ERROR: 'FormatError',\n FORMAT_UNSUPPORTED: 'FormatUnsupported',\n CODEC_UNSUPPORTED: 'CodecUnsupported'\n};\n\nexport default DemuxErrors;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n\n constructor(uint8array) {\n this.TAG = 'ExpGolomb';\n\n this._buffer = uint8array;\n this._buffer_index = 0;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n this._current_word = 0;\n this._current_word_bits_left = 0;\n }\n\n destroy() {\n this._buffer = null;\n }\n\n _fillCurrentWord() {\n let buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0)\n throw new IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');\n\n let bytes_read = Math.min(4, buffer_bytes_left);\n let word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32)\n throw new InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');\n\n if (bits <= this._current_word_bits_left) {\n let result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n let bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);\n\n let result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() { // unsigned exponential golomb\n let leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() { // signed exponential golomb\n let value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n\n}\n\nexport default ExpGolomb;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport AMF from './amf-parser.js';\nimport SPSParser from './sps-parser.js';\nimport DemuxErrors from './demux-errors.js';\nimport MediaInfo from '../core/media-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nfunction Swap16(src) {\n return (((src >>> 8) & 0xFF) |\n ((src & 0xFF) << 8));\n}\n\nfunction Swap32(src) {\n return (((src & 0xFF000000) >>> 24) |\n ((src & 0x00FF0000) >>> 8) |\n ((src & 0x0000FF00) << 8) |\n ((src & 0x000000FF) << 24));\n}\n\nfunction ReadBig32(array, index) {\n return ((array[index] << 24) |\n (array[index + 1] << 16) |\n (array[index + 2] << 8) |\n (array[index + 3]));\n}\n\n\nclass FLVDemuxer {\n\n constructor(probeData, config) {\n this.TAG = 'FLVDemuxer';\n\n this._config = config;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n\n this._dataOffset = probeData.dataOffset;\n this._firstParse = true;\n this._dispatch = false;\n\n this._hasAudio = probeData.hasAudioTrack;\n this._hasVideo = probeData.hasVideoTrack;\n\n this._hasAudioFlagOverrided = false;\n this._hasVideoFlagOverrided = false;\n\n this._audioInitialMetadataDispatched = false;\n this._videoInitialMetadataDispatched = false;\n\n this._mediaInfo = new MediaInfo();\n this._mediaInfo.hasAudio = this._hasAudio;\n this._mediaInfo.hasVideo = this._hasVideo;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n\n this._naluLengthSize = 4;\n this._timestampBase = 0; // int32, in milliseconds\n this._timescale = 1000;\n this._duration = 0; // int32, in milliseconds\n this._durationOverrided = false;\n this._referenceFrameRate = {\n fixed: true,\n fps: 23.976,\n fps_num: 23976,\n fps_den: 1000\n };\n\n this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000];\n\n this._mpegSamplingRates = [\n 96000, 88200, 64000, 48000, 44100, 32000,\n 24000, 22050, 16000, 12000, 11025, 8000, 7350\n ];\n\n this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];\n this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];\n this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];\n\n this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];\n this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];\n this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];\n\n this._videoTrack = {type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0};\n this._audioTrack = {type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0};\n\n this._littleEndian = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n })();\n }\n\n destroy() {\n this._mediaInfo = null;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n this._videoTrack = null;\n this._audioTrack = null;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n }\n\n static probe(buffer) {\n let data = new Uint8Array(buffer);\n let mismatch = {match: false};\n\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return mismatch;\n }\n\n let hasAudio = ((data[4] & 4) >>> 2) !== 0;\n let hasVideo = (data[4] & 1) !== 0;\n\n let offset = ReadBig32(data, 5);\n\n if (offset < 9) {\n return mismatch;\n }\n\n return {\n match: true,\n consumed: offset,\n dataOffset: offset,\n hasAudioTrack: hasAudio,\n hasVideoTrack: hasVideo\n };\n }\n\n bindDataSource(loader) {\n loader.onDataArrival = this.parseChunks.bind(this);\n return this;\n }\n\n // prototype: function(type: string, metadata: any): void\n get onTrackMetadata() {\n return this._onTrackMetadata;\n }\n\n set onTrackMetadata(callback) {\n this._onTrackMetadata = callback;\n }\n\n // prototype: function(mediaInfo: MediaInfo): void\n get onMediaInfo() {\n return this._onMediaInfo;\n }\n\n set onMediaInfo(callback) {\n this._onMediaInfo = callback;\n }\n\n get onMetaDataArrived() {\n return this._onMetaDataArrived;\n }\n\n set onMetaDataArrived(callback) {\n this._onMetaDataArrived = callback;\n }\n\n get onScriptDataArrived() {\n return this._onScriptDataArrived;\n }\n\n set onScriptDataArrived(callback) {\n this._onScriptDataArrived = callback;\n }\n\n // prototype: function(type: number, info: string): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n // prototype: function(videoTrack: any, audioTrack: any): void\n get onDataAvailable() {\n return this._onDataAvailable;\n }\n\n set onDataAvailable(callback) {\n this._onDataAvailable = callback;\n }\n\n // timestamp base for output samples, must be in milliseconds\n get timestampBase() {\n return this._timestampBase;\n }\n\n set timestampBase(base) {\n this._timestampBase = base;\n }\n\n get overridedDuration() {\n return this._duration;\n }\n\n // Force-override media duration. Must be in milliseconds, int32\n set overridedDuration(duration) {\n this._durationOverrided = true;\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n\n // Force-override audio track present flag, boolean\n set overridedHasAudio(hasAudio) {\n this._hasAudioFlagOverrided = true;\n this._hasAudio = hasAudio;\n this._mediaInfo.hasAudio = hasAudio;\n }\n\n // Force-override video track present flag, boolean\n set overridedHasVideo(hasVideo) {\n this._hasVideoFlagOverrided = true;\n this._hasVideo = hasVideo;\n this._mediaInfo.hasVideo = hasVideo;\n }\n\n resetMediaInfo() {\n this._mediaInfo = new MediaInfo();\n }\n\n _isInitialMetadataDispatched() {\n if (this._hasAudio && this._hasVideo) { // both audio & video\n return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched;\n }\n if (this._hasAudio && !this._hasVideo) { // audio only\n return this._audioInitialMetadataDispatched;\n }\n if (!this._hasAudio && this._hasVideo) { // video only\n return this._videoInitialMetadataDispatched;\n }\n return false;\n }\n\n // function parseChunks(chunk: ArrayBuffer, byteStart: number): number;\n parseChunks(chunk, byteStart) {\n if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) {\n throw new IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');\n }\n\n let offset = 0;\n let le = this._littleEndian;\n\n if (byteStart === 0) { // buffer with FLV header\n if (chunk.byteLength > 13) {\n let probeData = FLVDemuxer.probe(chunk);\n offset = probeData.dataOffset;\n } else {\n return 0;\n }\n }\n\n if (this._firstParse) { // handle PreviousTagSize0 before Tag1\n this._firstParse = false;\n if (byteStart + offset !== this._dataOffset) {\n Log.w(this.TAG, 'First time parsing but chunk byteStart invalid!');\n }\n\n let v = new DataView(chunk, offset);\n let prevTagSize0 = v.getUint32(0, !le);\n if (prevTagSize0 !== 0) {\n Log.w(this.TAG, 'PrevTagSize0 !== 0 !!!');\n }\n offset += 4;\n }\n\n while (offset < chunk.byteLength) {\n this._dispatch = true;\n\n let v = new DataView(chunk, offset);\n\n if (offset + 11 + 4 > chunk.byteLength) {\n // data not enough for parsing an flv tag\n break;\n }\n\n let tagType = v.getUint8(0);\n let dataSize = v.getUint32(0, !le) & 0x00FFFFFF;\n\n if (offset + 11 + dataSize + 4 > chunk.byteLength) {\n // data not enough for parsing actual data body\n break;\n }\n\n if (tagType !== 8 && tagType !== 9 && tagType !== 18) {\n Log.w(this.TAG, `Unsupported tag type ${tagType}, skipped`);\n // consume the whole tag (skip it)\n offset += 11 + dataSize + 4;\n continue;\n }\n\n let ts2 = v.getUint8(4);\n let ts1 = v.getUint8(5);\n let ts0 = v.getUint8(6);\n let ts3 = v.getUint8(7);\n\n let timestamp = ts0 | (ts1 << 8) | (ts2 << 16) | (ts3 << 24);\n\n let streamId = v.getUint32(7, !le) & 0x00FFFFFF;\n if (streamId !== 0) {\n Log.w(this.TAG, 'Meet tag which has StreamID != 0!');\n }\n\n let dataOffset = offset + 11;\n\n switch (tagType) {\n case 8: // Audio\n this._parseAudioData(chunk, dataOffset, dataSize, timestamp);\n break;\n case 9: // Video\n this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset);\n break;\n case 18: // ScriptDataObject\n this._parseScriptData(chunk, dataOffset, dataSize);\n break;\n }\n\n let prevTagSize = v.getUint32(11 + dataSize, !le);\n if (prevTagSize !== 11 + dataSize) {\n Log.w(this.TAG, `Invalid PrevTagSize ${prevTagSize}`);\n }\n\n offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize\n }\n\n // dispatch parsed frames to consumer (typically, the remuxer)\n if (this._isInitialMetadataDispatched()) {\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n }\n\n return offset; // consumed bytes, just equals latest offset index\n }\n\n _parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let scriptData = AMF.parseScriptData(arrayBuffer, dataOffset, dataSize);\n\n if (scriptData.hasOwnProperty('onMetaData')) {\n if (scriptData.onMetaData == null || typeof scriptData.onMetaData !== 'object') {\n Log.w(this.TAG, 'Invalid onMetaData structure!');\n return;\n }\n if (this._metadata) {\n Log.w(this.TAG, 'Found another onMetaData tag!');\n }\n this._metadata = scriptData;\n let onMetaData = this._metadata.onMetaData;\n\n if (this._onMetaDataArrived) {\n this._onMetaDataArrived(Object.assign({}, onMetaData));\n }\n\n if (typeof onMetaData.hasAudio === 'boolean') { // hasAudio\n if (this._hasAudioFlagOverrided === false) {\n this._hasAudio = onMetaData.hasAudio;\n this._mediaInfo.hasAudio = this._hasAudio;\n }\n }\n if (typeof onMetaData.hasVideo === 'boolean') { // hasVideo\n if (this._hasVideoFlagOverrided === false) {\n this._hasVideo = onMetaData.hasVideo;\n this._mediaInfo.hasVideo = this._hasVideo;\n }\n }\n if (typeof onMetaData.audiodatarate === 'number') { // audiodatarate\n this._mediaInfo.audioDataRate = onMetaData.audiodatarate;\n }\n if (typeof onMetaData.videodatarate === 'number') { // videodatarate\n this._mediaInfo.videoDataRate = onMetaData.videodatarate;\n }\n if (typeof onMetaData.width === 'number') { // width\n this._mediaInfo.width = onMetaData.width;\n }\n if (typeof onMetaData.height === 'number') { // height\n this._mediaInfo.height = onMetaData.height;\n }\n if (typeof onMetaData.duration === 'number') { // duration\n if (!this._durationOverrided) {\n let duration = Math.floor(onMetaData.duration * this._timescale);\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n } else {\n this._mediaInfo.duration = 0;\n }\n if (typeof onMetaData.framerate === 'number') { // framerate\n let fps_num = Math.floor(onMetaData.framerate * 1000);\n if (fps_num > 0) {\n let fps = fps_num / 1000;\n this._referenceFrameRate.fixed = true;\n this._referenceFrameRate.fps = fps;\n this._referenceFrameRate.fps_num = fps_num;\n this._referenceFrameRate.fps_den = 1000;\n this._mediaInfo.fps = fps;\n }\n }\n if (typeof onMetaData.keyframes === 'object') { // keyframes\n this._mediaInfo.hasKeyframesIndex = true;\n let keyframes = onMetaData.keyframes;\n this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes);\n onMetaData.keyframes = null; // keyframes has been extracted, remove it\n } else {\n this._mediaInfo.hasKeyframesIndex = false;\n }\n this._dispatch = false;\n this._mediaInfo.metadata = onMetaData;\n Log.v(this.TAG, 'Parsed onMetaData');\n if (this._mediaInfo.isComplete()) {\n this._onMediaInfo(this._mediaInfo);\n }\n }\n\n if (Object.keys(scriptData).length > 0) {\n if (this._onScriptDataArrived) {\n this._onScriptDataArrived(Object.assign({}, scriptData));\n }\n }\n }\n\n _parseKeyframesIndex(keyframes) {\n let times = [];\n let filepositions = [];\n\n // ignore first keyframe which is actually AVC Sequence Header (AVCDecoderConfigurationRecord)\n for (let i = 1; i < keyframes.times.length; i++) {\n let time = this._timestampBase + Math.floor(keyframes.times[i] * 1000);\n times.push(time);\n filepositions.push(keyframes.filepositions[i]);\n }\n\n return {\n times: times,\n filepositions: filepositions\n };\n }\n\n _parseAudioData(arrayBuffer, dataOffset, dataSize, tagTimestamp) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!');\n return;\n }\n\n if (this._hasAudioFlagOverrided === true && this._hasAudio === false) {\n // If hasAudio: false indicated explicitly in MediaDataSource,\n // Ignore all the audio packets\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let soundSpec = v.getUint8(0);\n\n let soundFormat = soundSpec >>> 4;\n if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);\n return;\n }\n\n let soundRate = 0;\n let soundRateIndex = (soundSpec & 12) >>> 2;\n if (soundRateIndex >= 0 && soundRateIndex <= 4) {\n soundRate = this._flvSoundRateTable[soundRateIndex];\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex);\n return;\n }\n\n let soundSize = (soundSpec & 2) >>> 1; // unused\n let soundType = (soundSpec & 1);\n\n\n let meta = this._audioMetadata;\n let track = this._audioTrack;\n\n if (!meta) {\n if (this._hasAudio === false && this._hasAudioFlagOverrided === false) {\n this._hasAudio = true;\n this._mediaInfo.hasAudio = true;\n }\n\n // initial metadata\n meta = this._audioMetadata = {};\n meta.type = 'audio';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n meta.audioSampleRate = soundRate;\n meta.channelCount = (soundType === 0 ? 1 : 2);\n }\n\n if (soundFormat === 10) { // AAC\n let aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1);\n if (aacData == undefined) {\n return;\n }\n\n if (aacData.packetType === 0) { // AAC sequence header (AudioSpecificConfig)\n if (meta.config) {\n Log.w(this.TAG, 'Found another AudioSpecificConfig!');\n }\n let misc = aacData.data;\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n meta.config = misc.config;\n // The decode result of an aac sample is 1024 PCM samples\n meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed AudioSpecificConfig');\n\n if (this._isInitialMetadataDispatched()) {\n // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._audioInitialMetadataDispatched = true;\n }\n // then notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.originalCodec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n } else if (aacData.packetType === 1) { // AAC raw frame data\n let dts = this._timestampBase + tagTimestamp;\n let aacSample = {unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts};\n track.samples.push(aacSample);\n track.length += aacData.data.length;\n } else {\n Log.e(this.TAG, `Flv: Unsupported AAC data type ${aacData.packetType}`);\n }\n } else if (soundFormat === 2) { // MP3\n if (!meta.codec) {\n // We need metadata for mp3 audio track, extract info from frame header\n let misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true);\n if (misc == undefined) {\n return;\n }\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n // The decode result of an mp3 sample is 1152 PCM samples\n meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed MPEG Audio Frame Header');\n\n this._audioInitialMetadataDispatched = true;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.codec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n mi.audioDataRate = misc.bitRate;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n // This packet is always a valid audio packet, extract it\n let data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false);\n if (data == undefined) {\n return;\n }\n let dts = this._timestampBase + tagTimestamp;\n let mp3Sample = {unit: data, length: data.byteLength, dts: dts, pts: dts};\n track.samples.push(mp3Sample);\n track.length += data.length;\n }\n }\n\n _parseAACAudioData(arrayBuffer, dataOffset, dataSize) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!');\n return;\n }\n\n let result = {};\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n\n result.packetType = array[0];\n\n if (array[0] === 0) {\n result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1);\n } else {\n result.data = array.subarray(1);\n }\n\n return result;\n }\n\n _parseAACAudioSpecificConfig(arrayBuffer, dataOffset, dataSize) {\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let config = null;\n\n /* Audio Object Type:\n 0: Null\n 1: AAC Main\n 2: AAC LC\n 3: AAC SSR (Scalable Sample Rate)\n 4: AAC LTP (Long Term Prediction)\n 5: HE-AAC / SBR (Spectral Band Replication)\n 6: AAC Scalable\n */\n\n let audioObjectType = 0;\n let originalAudioObjectType = 0;\n let audioExtensionObjectType = null;\n let samplingIndex = 0;\n let extensionSamplingIndex = null;\n\n // 5 bits\n audioObjectType = originalAudioObjectType = array[0] >>> 3;\n // 4 bits\n samplingIndex = ((array[0] & 0x07) << 1) | (array[1] >>> 7);\n if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!');\n return;\n }\n\n let samplingFrequence = this._mpegSamplingRates[samplingIndex];\n\n // 4 bits\n let channelConfig = (array[1] & 0x78) >>> 3;\n if (channelConfig < 0 || channelConfig >= 8) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid channel configuration');\n return;\n }\n\n if (audioObjectType === 5) { // HE-AAC?\n // 4 bits\n extensionSamplingIndex = ((array[1] & 0x07) << 1) | (array[2] >>> 7);\n // 5 bits\n audioExtensionObjectType = (array[2] & 0x7C) >>> 2;\n }\n\n // workarounds for various browsers\n let userAgent = self.navigator.userAgent.toLowerCase();\n\n if (userAgent.indexOf('firefox') !== -1) {\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (samplingIndex >= 6) {\n audioObjectType = 5;\n config = new Array(4);\n extensionSamplingIndex = samplingIndex - 3;\n } else { // use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n } else if (userAgent.indexOf('android') !== -1) {\n // android: always use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n audioObjectType = 5;\n extensionSamplingIndex = samplingIndex;\n config = new Array(4);\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3;\n } else if (channelConfig === 1) { // Mono channel\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n }\n\n config[0] = audioObjectType << 3;\n config[0] |= (samplingIndex & 0x0F) >>> 1;\n config[1] = (samplingIndex & 0x0F) << 7;\n config[1] |= (channelConfig & 0x0F) << 3;\n if (audioObjectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0F) >>> 1);\n config[2] = (extensionSamplingIndex & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= (2 << 2);\n config[3] = 0;\n }\n\n return {\n config: config,\n samplingRate: samplingFrequence,\n channelCount: channelConfig,\n codec: 'mp4a.40.' + audioObjectType,\n originalCodec: 'mp4a.40.' + originalAudioObjectType\n };\n }\n\n _parseMP3AudioData(arrayBuffer, dataOffset, dataSize, requestHeader) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!');\n return;\n }\n\n let le = this._littleEndian;\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let result = null;\n\n if (requestHeader) {\n if (array[0] !== 0xFF) {\n return;\n }\n let ver = (array[1] >>> 3) & 0x03;\n let layer = (array[1] & 0x06) >> 1;\n\n let bitrate_index = (array[2] & 0xF0) >>> 4;\n let sampling_freq_index = (array[2] & 0x0C) >>> 2;\n\n let channel_mode = (array[3] >>> 6) & 0x03;\n let channel_count = channel_mode !== 3 ? 2 : 1;\n\n let sample_rate = 0;\n let bit_rate = 0;\n let object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types\n\n let codec = 'mp3';\n\n switch (ver) {\n case 0: // MPEG 2.5\n sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index];\n break;\n case 2: // MPEG 2\n sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index];\n break;\n case 3: // MPEG 1\n sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index];\n break;\n }\n\n switch (layer) {\n case 1: // Layer 3\n object_type = 34;\n if (bitrate_index < this._mpegAudioL3BitRateTable.length) {\n bit_rate = this._mpegAudioL3BitRateTable[bitrate_index];\n }\n break;\n case 2: // Layer 2\n object_type = 33;\n if (bitrate_index < this._mpegAudioL2BitRateTable.length) {\n bit_rate = this._mpegAudioL2BitRateTable[bitrate_index];\n }\n break;\n case 3: // Layer 1\n object_type = 32;\n if (bitrate_index < this._mpegAudioL1BitRateTable.length) {\n bit_rate = this._mpegAudioL1BitRateTable[bitrate_index];\n }\n break;\n }\n\n result = {\n bitRate: bit_rate,\n samplingRate: sample_rate,\n channelCount: channel_count,\n codec: codec,\n originalCodec: codec\n };\n } else {\n result = array;\n }\n\n return result;\n }\n\n _parseVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!');\n return;\n }\n\n if (this._hasVideoFlagOverrided === true && this._hasVideo === false) {\n // If hasVideo: false indicated explicitly in MediaDataSource,\n // Ignore all the video packets\n return;\n }\n\n let spec = (new Uint8Array(arrayBuffer, dataOffset, dataSize))[0];\n\n let frameType = (spec & 240) >>> 4;\n let codecId = spec & 15;\n\n if (codecId !== 7) {\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, `Flv: Unsupported codec in video frame: ${codecId}`);\n return;\n }\n\n this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\n }\n\n _parseAVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let packetType = v.getUint8(0);\n let cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;\n let cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int\n\n if (packetType === 0) { // AVCDecoderConfigurationRecord\n this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);\n } else if (packetType === 1) { // One or more Nalus\n this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 2) {\n // empty, AVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 7) {\n Log.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!');\n return;\n }\n\n let meta = this._videoMetadata;\n let track = this._videoTrack;\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (!meta) {\n if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {\n this._hasVideo = true;\n this._mediaInfo.hasVideo = true;\n }\n\n meta = this._videoMetadata = {};\n meta.type = 'video';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n } else {\n if (typeof meta.avcc !== 'undefined') {\n Log.w(this.TAG, 'Found another AVCDecoderConfigurationRecord!');\n }\n }\n\n let version = v.getUint8(0); // configurationVersion\n let avcProfile = v.getUint8(1); // avcProfileIndication\n let profileCompatibility = v.getUint8(2); // profile_compatibility\n let avcLevel = v.getUint8(3); // AVCLevelIndication\n\n if (version !== 1 || avcProfile === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');\n return;\n }\n\n this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne\n if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${this._naluLengthSize - 1}`);\n return;\n }\n\n let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets\n if (spsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');\n return;\n } else if (spsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ${spsCount}`);\n }\n\n let offset = 6;\n\n for (let i = 0; i < spsCount; i++) {\n let len = v.getUint16(offset, !le); // sequenceParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // Notice: Nalu without startcode header (00 00 00 01)\n let sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);\n offset += len;\n\n let config = SPSParser.parseSPS(sps);\n if (i !== 0) {\n // ignore other sps's config\n continue;\n }\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = this._referenceFrameRate;\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n\n let codecArray = sps.subarray(1, 4);\n let codecString = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n meta.codec = codecString;\n\n let mi = this._mediaInfo;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = config.ref_frames;\n mi.chromaFormat = config.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = codecString;\n\n if (mi.hasAudio) {\n if (mi.audioCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n let ppsCount = v.getUint8(offset); // numOfPictureParameterSets\n if (ppsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');\n return;\n } else if (ppsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ${ppsCount}`);\n }\n\n offset++;\n\n for (let i = 0; i < ppsCount; i++) {\n let len = v.getUint16(offset, !le); // pictureParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // pps is useless for extracting video information\n offset += len;\n }\n\n meta.avcc = new Uint8Array(dataSize);\n meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);\n Log.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord');\n\n if (this._isInitialMetadataDispatched()) {\n // flush parsed frames\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._videoInitialMetadataDispatched = true;\n }\n // notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('video', meta);\n }\n\n _parseAVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let units = [], length = 0;\n\n let offset = 0;\n const lengthSize = this._naluLengthSize;\n let dts = this._timestampBase + tagTimestamp;\n let keyframe = (frameType === 1); // from FLV Frame Type constants\n\n while (offset < dataSize) {\n if (offset + 4 >= dataSize) {\n Log.w(this.TAG, `Malformed Nalu near timestamp ${dts}, offset = ${offset}, dataSize = ${dataSize}`);\n break; // data not enough for next Nalu\n }\n // Nalu with length-header (AVC1)\n let naluSize = v.getUint32(offset, !le); // Big-Endian read\n if (lengthSize === 3) {\n naluSize >>>= 8;\n }\n if (naluSize > dataSize - lengthSize) {\n Log.w(this.TAG, `Malformed Nalus near timestamp ${dts}, NaluSize > DataSize!`);\n return;\n }\n\n let unitType = v.getUint8(offset + lengthSize) & 0x1F;\n\n if (unitType === 5) { // IDR\n keyframe = true;\n }\n\n let data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);\n let unit = {type: unitType, data: data};\n units.push(unit);\n length += data.byteLength;\n\n offset += lengthSize + naluSize;\n }\n\n if (units.length) {\n let track = this._videoTrack;\n let avcSample = {\n units: units,\n length: length,\n isKeyframe: keyframe,\n dts: dts,\n cts: cts,\n pts: (dts + cts)\n };\n if (keyframe) {\n avcSample.fileposition = tagPosition;\n }\n track.samples.push(avcSample);\n track.length += length;\n }\n }\n\n}\n\nexport default FLVDemuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass SPSParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n static parseSPS(uint8array) {\n let rbsp = SPSParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n gb.readByte();\n let profile_idc = gb.readByte(); // profile_idc\n gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]\n let level_idc = gb.readByte(); // level_idc\n gb.readUEG(); // seq_parameter_set_id\n\n let profile_string = SPSParser.getProfileString(profile_idc);\n let level_string = SPSParser.getLevelString(level_idc);\n let chroma_format_idc = 1;\n let chroma_format = 420;\n let chroma_format_table = [0, 420, 422, 444];\n let bit_depth = 8;\n\n if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||\n profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||\n profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||\n profile_idc === 138 || profile_idc === 144) {\n\n chroma_format_idc = gb.readUEG();\n if (chroma_format_idc === 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8\n gb.readUEG(); // bit_depth_chroma_minus8\n gb.readBits(1); // qpprime_y_zero_transform_bypass_flag\n if (gb.readBool()) { // seq_scaling_matrix_present_flag\n let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;\n for (let i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) { // seq_scaling_list_present_flag\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n gb.readUEG(); // log2_max_frame_num_minus4\n let pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1); // delta_pic_order_always_zero_flag\n gb.readSEG(); // offset_for_non_ref_pic\n gb.readSEG(); // offset_for_top_to_bottom_field\n let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n gb.readSEG(); // offset_for_ref_frame\n }\n }\n let ref_frames = gb.readUEG(); // max_num_ref_frames\n gb.readBits(1); // gaps_in_frame_num_value_allowed_flag\n\n let pic_width_in_mbs_minus1 = gb.readUEG();\n let pic_height_in_map_units_minus1 = gb.readUEG();\n\n let frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n gb.readBits(1); // mb_adaptive_frame_field_flag\n }\n gb.readBits(1); // direct_8x8_inference_flag\n\n let frame_crop_left_offset = 0;\n let frame_crop_right_offset = 0;\n let frame_crop_top_offset = 0;\n let frame_crop_bottom_offset = 0;\n\n let frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n let sar_width = 1, sar_height = 1;\n let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;\n\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) { // aspect_ratio_info_present_flag\n let aspect_ratio_idc = gb.readByte();\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readByte() << 8 | gb.readByte();\n sar_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) { // overscan_info_present_flag\n gb.readBool(); // overscan_appropriate_flag\n }\n if (gb.readBool()) { // video_signal_type_present_flag\n gb.readBits(4); // video_format & video_full_range_flag\n if (gb.readBool()) { // colour_description_present_flag\n gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients\n }\n }\n if (gb.readBool()) { // chroma_loc_info_present_flag\n gb.readUEG(); // chroma_sample_loc_type_top_field\n gb.readUEG(); // chroma_sample_loc_type_bottom_field\n }\n if (gb.readBool()) { // timing_info_present_flag\n let num_units_in_tick = gb.readBits(32);\n let time_scale = gb.readBits(32);\n fps_fixed = gb.readBool(); // fixed_frame_rate_flag\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n let sarScale = 1;\n if (sar_width !== 1 || sar_height !== 1) {\n sarScale = sar_width / sar_height;\n }\n\n let crop_unit_x = 0, crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n let sub_wc = (chroma_format_idc === 3) ? 1 : 2;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n let present_width = Math.ceil(codec_width * sarScale);\n\n gb.destroy();\n gb = null;\n\n return {\n profile_string: profile_string, // baseline, high, high10, ...\n level_string: level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n bit_depth: bit_depth, // 8bit, 10bit, ...\n ref_frames: ref_frames,\n chroma_format: chroma_format, // 4:2:0, 4:2:2, ...\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n\n static _skipScalingList(gb, count) {\n let last_scale = 8, next_scale = 8;\n let delta_scale = 0;\n for (let i = 0; i < count; i++) {\n if (next_scale !== 0) {\n delta_scale = gb.readSEG();\n next_scale = (last_scale + delta_scale + 256) % 256;\n }\n last_scale = (next_scale === 0) ? last_scale : next_scale;\n }\n }\n\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 10).toFixed(1);\n }\n\n static getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n}\n\nexport default SPSParser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Polyfill from './utils/polyfill.js';\nimport Features from './core/features.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './io/loader.js';\nimport FlvPlayer from './player/flv-player.js';\nimport NativePlayer from './player/native-player.js';\nimport PlayerEvents from './player/player-events.js';\nimport {ErrorTypes, ErrorDetails} from './player/player-errors.js';\nimport LoggingControl from './utils/logging-control.js';\nimport {InvalidArgumentException} from './utils/exception.js';\n\n// here are all the interfaces\n\n// install polyfills\nPolyfill.install();\n\n\n// factory method\nfunction createPlayer(mediaDataSource, optionalConfig) {\n let mds = mediaDataSource;\n if (mds == null || typeof mds !== 'object') {\n throw new InvalidArgumentException('MediaDataSource must be an javascript object!');\n }\n\n if (!mds.hasOwnProperty('type')) {\n throw new InvalidArgumentException('MediaDataSource must has type field to indicate video file type!');\n }\n\n switch (mds.type) {\n case 'flv':\n return new FlvPlayer(mds, optionalConfig);\n default:\n return new NativePlayer(mds, optionalConfig);\n }\n}\n\n\n// feature detection\nfunction isSupported() {\n return Features.supportMSEH264Playback();\n}\n\nfunction getFeatureList() {\n return Features.getFeatureList();\n}\n\n\n// interfaces\nlet flvjs = {};\n\nflvjs.createPlayer = createPlayer;\nflvjs.isSupported = isSupported;\nflvjs.getFeatureList = getFeatureList;\n\nflvjs.BaseLoader = BaseLoader;\nflvjs.LoaderStatus = LoaderStatus;\nflvjs.LoaderErrors = LoaderErrors;\n\nflvjs.Events = PlayerEvents;\nflvjs.ErrorTypes = ErrorTypes;\nflvjs.ErrorDetails = ErrorDetails;\n\nflvjs.FlvPlayer = FlvPlayer;\nflvjs.NativePlayer = NativePlayer;\nflvjs.LoggingControl = LoggingControl;\n\nObject.defineProperty(flvjs, 'version', {\n enumerable: true,\n get: function () {\n // replace by webpack.DefinePlugin\n return __VERSION__;\n }\n});\n\nexport default flvjs;","// entry/index file\n\n// make it compatible with browserify's umd wrapper\nmodule.exports = require('./flv.js').default;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* fetch + stream IO loader. Currently working on chrome 43+.\n * fetch provides a better alternative http API to XMLHttpRequest\n *\n * fetch spec https://fetch.spec.whatwg.org/\n * stream spec https://streams.spec.whatwg.org/\n */\nclass FetchStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n // fetch + stream is broken on Microsoft Edge. Disable before build 15048.\n // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/\n // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist.\n let isWorkWellEdge = Browser.msedge && Browser.version.minor >= 15048;\n let browserNotBlacklisted = Browser.msedge ? isWorkWellEdge : true;\n return (self.fetch && self.ReadableStream && browserNotBlacklisted);\n } catch (e) {\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('fetch-stream-loader');\n this.TAG = 'FetchStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n\n let headers = new self.Headers();\n\n if (typeof seekConfig.headers === 'object') {\n let configHeaders = seekConfig.headers;\n for (let key in configHeaders) {\n if (configHeaders.hasOwnProperty(key)) {\n headers.append(key, configHeaders[key]);\n }\n }\n }\n\n let params = {\n method: 'GET',\n headers: headers,\n mode: 'cors',\n cache: 'default',\n // The default policy of Fetch API in the whatwg standard\n // Safari incorrectly indicates 'no-referrer' as default policy, fuck it\n referrerPolicy: 'no-referrer-when-downgrade'\n };\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n for (let key in this._config.headers) {\n headers.append(key, this._config.headers[key]);\n }\n }\n\n // cors is enabled by default\n if (dataSource.cors === false) {\n // no-cors means 'disregard cors policy', which can only be used in ServiceWorker\n params.mode = 'same-origin';\n }\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n params.credentials = 'include';\n }\n\n // referrerPolicy from config\n if (dataSource.referrerPolicy) {\n params.referrerPolicy = dataSource.referrerPolicy;\n }\n\n // add abort controller, by wmlgl 2019-5-10 12:21:27\n if (self.AbortController) {\n this._abortController = new self.AbortController();\n params.signal = this._abortController.signal; \n }\n\n this._status = LoaderStatus.kConnecting;\n self.fetch(seekConfig.url, params).then((res) => {\n if (this._requestAbort) {\n this._status = LoaderStatus.kIdle;\n res.body.cancel();\n return;\n }\n if (res.ok && (res.status >= 200 && res.status <= 299)) {\n if (res.url !== seekConfig.url) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(res.url);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n let lengthHeader = res.headers.get('Content-Length');\n if (lengthHeader != null) {\n this._contentLength = parseInt(lengthHeader);\n if (this._contentLength !== 0) {\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n return this._pump.call(this, res.body.getReader());\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: res.status, msg: res.statusText});\n } else {\n throw new RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText);\n }\n }\n }).catch((e) => {\n if (this._abortController && this._abortController.signal.aborted) {\n return;\n }\n\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, {code: -1, msg: e.message});\n } else {\n throw e;\n }\n });\n }\n\n abort() {\n this._requestAbort = true;\n\n if (this._status !== LoaderStatus.kBuffering || !Browser.chrome) {\n // Chrome may throw Exception-like things here, avoid using if is buffering\n if (this._abortController) {\n try {\n this._abortController.abort();\n } catch (e) {}\n }\n }\n }\n\n _pump(reader) { // ReadableStreamReader\n return reader.read().then((result) => {\n if (result.done) {\n // First check received length\n if (this._contentLength !== null && this._receivedLength < this._contentLength) {\n // Report Early-EOF\n this._status = LoaderStatus.kError;\n let type = LoaderErrors.EARLY_EOF;\n let info = {code: -1, msg: 'Fetch stream meet Early-EOF'};\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n } else {\n // OK. Download complete\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n } else {\n if (this._abortController && this._abortController.signal.aborted) {\n this._status = LoaderStatus.kComplete;\n return;\n } else if (this._requestAbort === true) {\n this._status = LoaderStatus.kComplete;\n return reader.cancel();\n }\n\n this._status = LoaderStatus.kBuffering;\n\n let chunk = result.value.buffer;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n this._pump(reader);\n }\n }).catch((e) => {\n if (this._abortController && this._abortController.signal.aborted) {\n this._status = LoaderStatus.kComplete;\n return;\n }\n\n if (e.code === 11 && Browser.msedge) { // InvalidStateError on Microsoft Edge\n // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call\n // Ignore the unknown exception.\n // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/\n return;\n }\n\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if ((e.code === 19 || e.message === 'network error') && // NETWORK_ERR\n (this._contentLength === null ||\n (this._contentLength !== null && this._receivedLength < this._contentLength))) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: e.code, msg: 'Fetch stream meet Early-EOF'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: e.code, msg: e.message};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n });\n }\n\n}\n\nexport default FetchStreamLoader;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {LoaderStatus, LoaderErrors} from './loader.js';\nimport FetchStreamLoader from './fetch-stream-loader.js';\nimport MozChunkedLoader from './xhr-moz-chunked-loader.js';\nimport MSStreamLoader from './xhr-msstream-loader.js';\nimport RangeLoader from './xhr-range-loader.js';\nimport WebSocketLoader from './websocket-loader.js';\nimport RangeSeekHandler from './range-seek-handler.js';\nimport ParamSeekHandler from './param-seek-handler.js';\nimport {RuntimeException, IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n/**\n * DataSource: {\n * url: string,\n * filesize: number,\n * cors: boolean,\n * withCredentials: boolean\n * }\n * \n */\n\n// Manage IO Loaders\nclass IOController {\n\n constructor(dataSource, config, extraData) {\n this.TAG = 'IOController';\n\n this._config = config;\n this._extraData = extraData;\n\n this._stashInitialSize = 1024 * 384; // default initial size: 384KB\n if (config.stashInitialSize != undefined && config.stashInitialSize > 0) {\n // apply from config\n this._stashInitialSize = config.stashInitialSize;\n }\n\n this._stashUsed = 0;\n this._stashSize = this._stashInitialSize;\n this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB\n this._stashBuffer = new ArrayBuffer(this._bufferSize);\n this._stashByteStart = 0;\n this._enableStash = true;\n if (config.enableStashBuffer === false) {\n this._enableStash = false;\n }\n\n this._loader = null;\n this._loaderClass = null;\n this._seekHandler = null;\n\n this._dataSource = dataSource;\n this._isWebSocketURL = /wss?:\\/\\/(.+?)/.test(dataSource.url);\n this._refTotalLength = dataSource.filesize ? dataSource.filesize : null;\n this._totalLength = this._refTotalLength;\n this._fullRequestFlag = false;\n this._currentRange = null;\n this._redirectedURL = null;\n\n this._speedNormalized = 0;\n this._speedSampler = new SpeedSampler();\n this._speedNormalizeList = [64, 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096];\n\n this._isEarlyEofReconnecting = false;\n\n this._paused = false;\n this._resumeFrom = 0;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._selectSeekHandler();\n this._selectLoader();\n this._createLoader();\n }\n\n destroy() {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n this._loader.destroy();\n this._loader = null;\n this._loaderClass = null;\n this._dataSource = null;\n this._stashBuffer = null;\n this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0;\n this._currentRange = null;\n this._speedSampler = null;\n\n this._isEarlyEofReconnecting = false;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._extraData = null;\n }\n\n isWorking() {\n return this._loader && this._loader.isWorking() && !this._paused;\n }\n\n isPaused() {\n return this._paused;\n }\n\n get status() {\n return this._loader.status;\n }\n\n get extraData() {\n return this._extraData;\n }\n\n set extraData(data) {\n this._extraData = data;\n }\n\n // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onSeeked() {\n return this._onSeeked;\n }\n\n set onSeeked(callback) {\n this._onSeeked = callback;\n }\n\n // prototype: function onError(type: number, info: {code: number, msg: string}): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n get onRedirect() {\n return this._onRedirect;\n }\n\n set onRedirect(callback) {\n this._onRedirect = callback;\n }\n\n get onRecoveredEarlyEof() {\n return this._onRecoveredEarlyEof;\n }\n\n set onRecoveredEarlyEof(callback) {\n this._onRecoveredEarlyEof = callback;\n }\n\n get currentURL() {\n return this._dataSource.url;\n }\n\n get hasRedirect() {\n return (this._redirectedURL != null || this._dataSource.redirectedURL != undefined);\n }\n\n get currentRedirectedURL() {\n return this._redirectedURL || this._dataSource.redirectedURL;\n }\n\n // in KB/s\n get currentSpeed() {\n if (this._loaderClass === RangeLoader) {\n // SpeedSampler is inaccuracy if loader is RangeLoader\n return this._loader.currentSpeed;\n }\n return this._speedSampler.lastSecondKBps;\n }\n\n get loaderType() {\n return this._loader.type;\n }\n\n _selectSeekHandler() {\n let config = this._config;\n\n if (config.seekType === 'range') {\n this._seekHandler = new RangeSeekHandler(this._config.rangeLoadZeroStart);\n } else if (config.seekType === 'param') {\n let paramStart = config.seekParamStart || 'bstart';\n let paramEnd = config.seekParamEnd || 'bend';\n\n this._seekHandler = new ParamSeekHandler(paramStart, paramEnd);\n } else if (config.seekType === 'custom') {\n if (typeof config.customSeekHandler !== 'function') {\n throw new InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!');\n }\n this._seekHandler = new config.customSeekHandler();\n } else {\n throw new InvalidArgumentException(`Invalid seekType in config: ${config.seekType}`);\n }\n }\n\n _selectLoader() {\n if (this._config.customLoader != null) {\n this._loaderClass = this._config.customLoader;\n } else if (this._isWebSocketURL) {\n this._loaderClass = WebSocketLoader;\n } else if (FetchStreamLoader.isSupported()) {\n this._loaderClass = FetchStreamLoader;\n } else if (MozChunkedLoader.isSupported()) {\n this._loaderClass = MozChunkedLoader;\n } else if (RangeLoader.isSupported()) {\n this._loaderClass = RangeLoader;\n } else {\n throw new RuntimeException('Your browser doesn\\'t support xhr with arraybuffer responseType!');\n }\n }\n\n _createLoader() {\n this._loader = new this._loaderClass(this._seekHandler, this._config);\n if (this._loader.needStashBuffer === false) {\n this._enableStash = false;\n }\n this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this);\n this._loader.onURLRedirect = this._onURLRedirect.bind(this);\n this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this);\n this._loader.onComplete = this._onLoaderComplete.bind(this);\n this._loader.onError = this._onLoaderError.bind(this);\n }\n\n open(optionalFrom) {\n this._currentRange = {from: 0, to: -1};\n if (optionalFrom) {\n this._currentRange.from = optionalFrom;\n }\n\n this._speedSampler.reset();\n if (!optionalFrom) {\n this._fullRequestFlag = true;\n }\n\n this._loader.open(this._dataSource, Object.assign({}, this._currentRange));\n }\n\n abort() {\n this._loader.abort();\n\n if (this._paused) {\n this._paused = false;\n this._resumeFrom = 0;\n }\n }\n\n pause() {\n if (this.isWorking()) {\n this._loader.abort();\n\n if (this._stashUsed !== 0) {\n this._resumeFrom = this._stashByteStart;\n this._currentRange.to = this._stashByteStart - 1;\n } else {\n this._resumeFrom = this._currentRange.to + 1;\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._paused = true;\n }\n }\n\n resume() {\n if (this._paused) {\n this._paused = false;\n let bytes = this._resumeFrom;\n this._resumeFrom = 0;\n this._internalSeek(bytes, true);\n }\n }\n\n seek(bytes) {\n this._paused = false;\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._internalSeek(bytes, true);\n }\n\n /**\n * When seeking request is from media seeking, unconsumed stash data should be dropped\n * However, stash data shouldn't be dropped if seeking requested from http reconnection\n *\n * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer\n */\n _internalSeek(bytes, dropUnconsumed) {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n\n // dispatch & flush stash buffer before seek\n this._flushStashBuffer(dropUnconsumed);\n\n this._loader.destroy();\n this._loader = null;\n\n let requestRange = {from: bytes, to: -1};\n this._currentRange = {from: requestRange.from, to: -1};\n\n this._speedSampler.reset();\n this._stashSize = this._stashInitialSize;\n this._createLoader();\n this._loader.open(this._dataSource, requestRange);\n\n if (this._onSeeked) {\n this._onSeeked();\n }\n }\n\n updateUrl(url) {\n if (!url || typeof url !== 'string' || url.length === 0) {\n throw new InvalidArgumentException('Url must be a non-empty string!');\n }\n\n this._dataSource.url = url;\n\n // TODO: replace with new url\n }\n\n _expandBuffer(expectedBytes) {\n let bufferNewSize = this._stashSize;\n while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) {\n bufferNewSize *= 2;\n }\n\n bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB\n if (bufferNewSize === this._bufferSize) {\n return;\n }\n\n let newBuffer = new ArrayBuffer(bufferNewSize);\n\n if (this._stashUsed > 0) { // copy existing data into new buffer\n let stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed);\n let stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize);\n stashNewArray.set(stashOldArray, 0);\n }\n\n this._stashBuffer = newBuffer;\n this._bufferSize = bufferNewSize;\n }\n\n _normalizeSpeed(input) {\n let list = this._speedNormalizeList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n // binary search\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _adjustStashSize(normalized) {\n let stashSizeKB = 0;\n\n if (this._config.isLive) {\n // live stream: always use single normalized speed for size of stashSizeKB\n stashSizeKB = normalized;\n } else {\n if (normalized < 512) {\n stashSizeKB = normalized;\n } else if (normalized >= 512 && normalized <= 1024) {\n stashSizeKB = Math.floor(normalized * 1.5);\n } else {\n stashSizeKB = normalized * 2;\n }\n }\n\n if (stashSizeKB > 8192) {\n stashSizeKB = 8192;\n }\n\n let bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB\n if (this._bufferSize < bufferSize) {\n this._expandBuffer(bufferSize);\n }\n this._stashSize = stashSizeKB * 1024;\n }\n\n _dispatchChunks(chunks, byteStart) {\n this._currentRange.to = byteStart + chunks.byteLength - 1;\n return this._onDataArrival(chunks, byteStart);\n }\n\n _onURLRedirect(redirectedURL) {\n this._redirectedURL = redirectedURL;\n if (this._onRedirect) {\n this._onRedirect(redirectedURL);\n }\n }\n\n _onContentLengthKnown(contentLength) {\n if (contentLength && this._fullRequestFlag) {\n this._totalLength = contentLength;\n this._fullRequestFlag = false;\n }\n }\n\n _onLoaderChunkArrival(chunk, byteStart, receivedLength) {\n if (!this._onDataArrival) {\n throw new IllegalStateException('IOController: No existing consumer (onDataArrival) callback!');\n }\n if (this._paused) {\n return;\n }\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback\n this._isEarlyEofReconnecting = false;\n if (this._onRecoveredEarlyEof) {\n this._onRecoveredEarlyEof();\n }\n }\n\n this._speedSampler.addBytes(chunk.byteLength);\n\n // adjust stash buffer size according to network speed dynamically\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._speedNormalized !== normalized) {\n this._speedNormalized = normalized;\n this._adjustStashSize(normalized);\n }\n }\n\n if (!this._enableStash) { // disable stash\n if (this._stashUsed === 0) {\n // dispatch chunk directly to consumer;\n // check ret value (consumed bytes) and stash unconsumed to stashBuffer\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) { // unconsumed data remain.\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n } else {\n // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer.\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n let consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart);\n if (consumed < this._stashUsed && consumed > 0) { // unconsumed data remain\n let remainArray = new Uint8Array(this._stashBuffer, consumed);\n stashArray.set(remainArray, 0);\n }\n this._stashUsed -= consumed;\n this._stashByteStart += consumed;\n }\n } else { // enable stash\n if (this._stashUsed === 0 && this._stashByteStart === 0) { // seeked? or init chunk?\n // This is the first chunk after seek action\n this._stashByteStart = byteStart;\n }\n if (this._stashUsed + chunk.byteLength <= this._stashSize) {\n // just stash\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._stashSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stashUsed + chunkSize > stashSize, size limit exceeded\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n if (this._stashUsed > 0) { // There're stash datas in buffer\n // dispatch the whole stashBuffer, and stash remain data\n // then append chunk to stashBuffer (stash)\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n if (consumed < buffer.byteLength) {\n if (consumed > 0) {\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n } else {\n this._stashUsed = 0;\n this._stashByteStart += consumed;\n }\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stash buffer empty, but chunkSize > stashSize (oh, holy shit)\n // dispatch chunk directly and stash remain data\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) {\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n }\n }\n }\n }\n\n _flushStashBuffer(dropUnconsumed) {\n if (this._stashUsed > 0) {\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n let remain = buffer.byteLength - consumed;\n\n if (consumed < buffer.byteLength) {\n if (dropUnconsumed) {\n Log.w(this.TAG, `${remain} bytes unconsumed data remain when flush buffer, dropped`);\n } else {\n if (consumed > 0) {\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n return 0;\n }\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n return remain;\n }\n return 0;\n }\n\n _onLoaderComplete(from, to) {\n // Force-flush stash buffer, and drop unconsumed data\n this._flushStashBuffer(true);\n\n if (this._onComplete) {\n this._onComplete(this._extraData);\n }\n }\n\n _onLoaderError(type, data) {\n Log.e(this.TAG, `Loader error, code = ${data.code}, msg = ${data.msg}`);\n\n this._flushStashBuffer(false);\n\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer\n this._isEarlyEofReconnecting = false;\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n }\n\n switch (type) {\n case LoaderErrors.EARLY_EOF: {\n if (!this._config.isLive) {\n // Do internal http reconnect if not live stream\n if (this._totalLength) {\n let nextFrom = this._currentRange.to + 1;\n if (nextFrom < this._totalLength) {\n Log.w(this.TAG, 'Connection lost, trying reconnect...');\n this._isEarlyEofReconnecting = true;\n this._internalSeek(nextFrom, false);\n }\n return;\n }\n // else: We don't know totalLength, throw UnrecoverableEarlyEof\n }\n // live stream: throw UnrecoverableEarlyEof error to upper-layer\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n break;\n }\n case LoaderErrors.UNRECOVERABLE_EARLY_EOF:\n case LoaderErrors.CONNECTING_TIMEOUT:\n case LoaderErrors.HTTP_STATUS_CODE_INVALID:\n case LoaderErrors.EXCEPTION:\n break;\n }\n\n if (this._onError) {\n this._onError(type, data);\n } else {\n throw new RuntimeException('IOException: ' + data.msg);\n }\n }\n\n}\n\nexport default IOController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {NotImplementedException} from '../utils/exception.js';\n\nexport const LoaderStatus = {\n kIdle: 0,\n kConnecting: 1,\n kBuffering: 2,\n kError: 3,\n kComplete: 4\n};\n\nexport const LoaderErrors = {\n OK: 'OK',\n EXCEPTION: 'Exception',\n HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid',\n CONNECTING_TIMEOUT: 'ConnectingTimeout',\n EARLY_EOF: 'EarlyEof',\n UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof'\n};\n\n/* Loader has callbacks which have following prototypes:\n * function onContentLengthKnown(contentLength: number): void\n * function onURLRedirect(url: string): void\n * function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void\n * function onError(errorType: number, errorInfo: {code: number, msg: string}): void\n * function onComplete(rangeFrom: number, rangeTo: number): void\n */\nexport class BaseLoader {\n\n constructor(typeName) {\n this._type = typeName || 'undefined';\n this._status = LoaderStatus.kIdle;\n this._needStash = false;\n // callbacks\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n destroy() {\n this._status = LoaderStatus.kIdle;\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n isWorking() {\n return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering;\n }\n\n get type() {\n return this._type;\n }\n\n get status() {\n return this._status;\n }\n\n get needStashBuffer() {\n return this._needStash;\n }\n\n get onContentLengthKnown() {\n return this._onContentLengthKnown;\n }\n\n set onContentLengthKnown(callback) {\n this._onContentLengthKnown = callback;\n }\n\n get onURLRedirect() {\n return this._onURLRedirect;\n }\n\n set onURLRedirect(callback) {\n this._onURLRedirect = callback;\n }\n\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n // pure virtual\n open(dataSource, range) {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n abort() {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass ParamSeekHandler {\n\n constructor(paramStart, paramEnd) {\n this._startName = paramStart;\n this._endName = paramEnd;\n }\n\n getConfig(baseUrl, range) {\n let url = baseUrl;\n\n if (range.from !== 0 || range.to !== -1) {\n let needAnd = true;\n if (url.indexOf('?') === -1) {\n url += '?';\n needAnd = false;\n }\n\n if (needAnd) {\n url += '&';\n }\n\n url += `${this._startName}=${range.from.toString()}`;\n\n if (range.to !== -1) {\n url += `&${this._endName}=${range.to.toString()}`;\n }\n }\n\n return {\n url: url,\n headers: {}\n };\n }\n\n removeURLParameters(seekedURL) {\n let baseURL = seekedURL.split('?')[0];\n let params = undefined;\n\n let queryIndex = seekedURL.indexOf('?');\n if (queryIndex !== -1) {\n params = seekedURL.substring(queryIndex + 1);\n }\n\n let resultParams = '';\n\n if (params != undefined && params.length > 0) {\n let pairs = params.split('&');\n\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split('=');\n let requireAnd = (i > 0);\n\n if (pair[0] !== this._startName && pair[0] !== this._endName) {\n if (requireAnd) {\n resultParams += '&';\n }\n resultParams += pairs[i];\n }\n }\n }\n\n return (resultParams.length === 0) ? baseURL : baseURL + '?' + resultParams;\n }\n\n}\n\nexport default ParamSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass RangeSeekHandler {\n\n constructor(zeroStart) {\n this._zeroStart = zeroStart || false;\n }\n\n getConfig(url, range) {\n let headers = {};\n\n if (range.from !== 0 || range.to !== -1) {\n let param;\n if (range.to !== -1) {\n param = `bytes=${range.from.toString()}-${range.to.toString()}`;\n } else {\n param = `bytes=${range.from.toString()}-`;\n }\n headers['Range'] = param;\n } else if (this._zeroStart) {\n headers['Range'] = 'bytes=0-';\n }\n\n return {\n url: url,\n headers: headers\n };\n }\n\n removeURLParameters(seekedURL) {\n return seekedURL;\n }\n\n}\n\nexport default RangeSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Utility class to calculate realtime network I/O speed\nclass SpeedSampler {\n\n constructor() {\n // milliseconds\n this._firstCheckpoint = 0;\n this._lastCheckpoint = 0;\n this._intervalBytes = 0;\n this._totalBytes = 0;\n this._lastSecondBytes = 0;\n\n // compatibility detection\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n }\n\n reset() {\n this._firstCheckpoint = this._lastCheckpoint = 0;\n this._totalBytes = this._intervalBytes = 0;\n this._lastSecondBytes = 0;\n }\n\n addBytes(bytes) {\n if (this._firstCheckpoint === 0) {\n this._firstCheckpoint = this._now();\n this._lastCheckpoint = this._firstCheckpoint;\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else if (this._now() - this._lastCheckpoint < 1000) {\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else { // duration >= 1000\n this._lastSecondBytes = this._intervalBytes;\n this._intervalBytes = bytes;\n this._totalBytes += bytes;\n this._lastCheckpoint = this._now();\n }\n }\n\n get currentKBps() {\n this.addBytes(0);\n\n let durationSeconds = (this._now() - this._lastCheckpoint) / 1000;\n if (durationSeconds == 0) durationSeconds = 1;\n return (this._intervalBytes / durationSeconds) / 1024;\n }\n\n get lastSecondKBps() {\n this.addBytes(0);\n\n if (this._lastSecondBytes !== 0) {\n return this._lastSecondBytes / 1024;\n } else { // lastSecondBytes === 0\n if (this._now() - this._lastCheckpoint >= 500) {\n // if time interval since last checkpoint has exceeded 500ms\n // the speed is nearly accurate\n return this.currentKBps;\n } else {\n // We don't know\n return 0;\n }\n }\n }\n\n get averageKBps() {\n let durationSeconds = (this._now() - this._firstCheckpoint) / 1000;\n return (this._totalBytes / durationSeconds) / 1024;\n }\n\n}\n\nexport default SpeedSampler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FLV over WebSocket live stream\nclass WebSocketLoader extends BaseLoader {\n\n static isSupported() {\n try {\n return (typeof self.WebSocket !== 'undefined');\n } catch (e) {\n return false;\n }\n }\n\n constructor() {\n super('websocket-loader');\n this.TAG = 'WebSocketLoader';\n\n this._needStash = true;\n\n this._ws = null;\n this._requestAbort = false;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this._ws) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource) {\n try {\n let ws = this._ws = new self.WebSocket(dataSource.url);\n ws.binaryType = 'arraybuffer';\n ws.onopen = this._onWebSocketOpen.bind(this);\n ws.onclose = this._onWebSocketClose.bind(this);\n ws.onmessage = this._onWebSocketMessage.bind(this);\n ws.onerror = this._onWebSocketError.bind(this);\n\n this._status = LoaderStatus.kConnecting;\n } catch (e) {\n this._status = LoaderStatus.kError;\n\n let info = {code: e.code, msg: e.message};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n abort() {\n let ws = this._ws;\n if (ws && (ws.readyState === 0 || ws.readyState === 1)) { // CONNECTING || OPEN\n this._requestAbort = true;\n ws.close();\n }\n\n this._ws = null;\n this._status = LoaderStatus.kComplete;\n }\n\n _onWebSocketOpen(e) {\n this._status = LoaderStatus.kBuffering;\n }\n\n _onWebSocketClose(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n\n if (this._onComplete) {\n this._onComplete(0, this._receivedLength - 1);\n }\n }\n\n _onWebSocketMessage(e) {\n if (e.data instanceof ArrayBuffer) {\n this._dispatchArrayBuffer(e.data);\n } else if (e.data instanceof Blob) {\n let reader = new FileReader();\n reader.onload = () => {\n this._dispatchArrayBuffer(reader.result);\n };\n reader.readAsArrayBuffer(e.data);\n } else {\n this._status = LoaderStatus.kError;\n let info = {code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n _dispatchArrayBuffer(arraybuffer) {\n let chunk = arraybuffer;\n let byteStart = this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onWebSocketError(e) {\n this._status = LoaderStatus.kError;\n\n let info = {\n code: e.code,\n msg: e.message\n };\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default WebSocketLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'`\nclass MozChunkedLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n // Firefox 37- requires .open() to be called before setting responseType\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n return (xhr.responseType === 'moz-chunked-arraybuffer');\n } catch (e) {\n Log.w('MozChunkedLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-moz-chunked-loader');\n this.TAG = 'MozChunkedLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onloadend = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._requestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onloadend = this._onLoadEnd.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n // cors is auto detected and enabled by xhr\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n this._status = LoaderStatus.kConnecting;\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n if (this._xhr) {\n this._xhr.abort();\n }\n this._status = LoaderStatus.kComplete;\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n } else {\n this._status = LoaderStatus.kBuffering;\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n if (e.total !== null && e.total !== 0) {\n this._contentLength = e.total;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onLoadEnd(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n } else if (this._status === LoaderStatus.kError) {\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && e.loaded < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'Moz-Chunked stream meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default MozChunkedLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// Universal IO Loader, implemented by adding Range header in xhr's request header\nclass RangeLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'arraybuffer';\n return (xhr.responseType === 'arraybuffer');\n } catch (e) {\n Log.w('RangeLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-range-loader');\n this.TAG = 'RangeLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = false;\n\n this._chunkSizeKBList = [\n 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n ];\n this._currentChunkSizeKB = 384;\n this._currentSpeedNormalized = 0;\n this._zeroSpeedChunkCount = 0;\n\n this._xhr = null;\n this._speedSampler = new SpeedSampler();\n\n this._requestAbort = false;\n this._waitForTotalLength = false;\n this._totalLengthReceived = false;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n this._currentRequestRange = null;\n this._totalLength = null; // size of the entire file\n this._contentLength = null; // Content-Length of entire request range\n this._receivedLength = 0; // total received bytes\n this._lastTimeLoaded = 0; // received bytes of current request sub-range\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n get currentSpeed() {\n return this._speedSampler.lastSecondKBps;\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n this._status = LoaderStatus.kConnecting;\n\n let useRefTotalLength = false;\n if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) {\n useRefTotalLength = true;\n this._totalLength = this._dataSource.filesize;\n }\n\n if (!this._totalLengthReceived && !useRefTotalLength) {\n // We need total filesize\n this._waitForTotalLength = true;\n this._internalOpen(this._dataSource, {from: 0, to: -1});\n } else {\n // We have filesize, start loading\n this._openSubRange();\n }\n }\n\n _openSubRange() {\n let chunkSize = this._currentChunkSizeKB * 1024;\n\n let from = this._range.from + this._receivedLength;\n let to = from + chunkSize;\n\n if (this._contentLength != null) {\n if (to - this._range.from >= this._contentLength) {\n to = this._range.from + this._contentLength - 1;\n }\n }\n\n this._currentRequestRange = {from, to};\n this._internalOpen(this._dataSource, this._currentRequestRange);\n }\n\n _internalOpen(dataSource, range) {\n this._lastTimeLoaded = 0;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL) {\n if (this._currentRedirectedURL != undefined) {\n sourceURL = this._currentRedirectedURL;\n } else if (dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._currentRequestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onload = this._onLoad.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr.abort();\n this._xhr = null;\n }\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined) { // if the browser support this property\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {\n this._currentRedirectedURL = redirectedURL;\n if (this._onURLRedirect) {\n this._onURLRedirect(redirectedURL);\n }\n }\n }\n\n if ((xhr.status >= 200 && xhr.status <= 299)) {\n if (this._waitForTotalLength) {\n return;\n }\n this._status = LoaderStatus.kBuffering;\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n let openNextRange = false;\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n this._totalLengthReceived = true;\n openNextRange = true;\n\n let total = e.total;\n this._internalAbort();\n if (total != null & total !== 0) {\n this._totalLength = total;\n }\n }\n\n // calculate currrent request range's contentLength\n if (this._range.to === -1) {\n this._contentLength = this._totalLength - this._range.from;\n } else { // to !== -1\n this._contentLength = this._range.to - this._range.from + 1;\n }\n\n if (openNextRange) {\n this._openSubRange();\n return;\n }\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n\n let delta = e.loaded - this._lastTimeLoaded;\n this._lastTimeLoaded = e.loaded;\n this._speedSampler.addBytes(delta);\n }\n\n _normalizeSpeed(input) {\n let list = this._chunkSizeKBList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _onLoad(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n return;\n }\n\n this._lastTimeLoaded = 0;\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps === 0) {\n this._zeroSpeedChunkCount++;\n if (this._zeroSpeedChunkCount >= 3) {\n // Try get currentKBps after 3 chunks\n KBps = this._speedSampler.currentKBps;\n }\n }\n\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._currentSpeedNormalized !== normalized) {\n this._currentSpeedNormalized = normalized;\n this._currentChunkSizeKB = normalized;\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n let reportComplete = false;\n\n if (this._contentLength != null && this._receivedLength < this._contentLength) {\n // continue load next chunk\n this._openSubRange();\n } else {\n reportComplete = true;\n }\n\n // dispatch received chunk\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n if (reportComplete) {\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength > 0\n && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'RangeLoader meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default RangeLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport PlayerEvents from './player-events.js';\nimport Transmuxer from '../core/transmuxer.js';\nimport TransmuxingEvents from '../core/transmuxing-events.js';\nimport MSEController from '../core/mse-controller.js';\nimport MSEEvents from '../core/mse-events.js';\nimport {ErrorTypes, ErrorDetails} from './player-errors.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\nclass FlvPlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'FlvPlayer';\n this._type = 'FlvPlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() !== 'flv') {\n throw new InvalidArgumentException('FlvPlayer requires an flv MediaDataSource input!');\n }\n\n if (mediaDataSource.isLive === true) {\n this._config.isLive = true;\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this),\n onvSeeking: this._onvSeeking.bind(this),\n onvCanPlay: this._onvCanPlay.bind(this),\n onvStalled: this._onvStalled.bind(this),\n onvProgress: this._onvProgress.bind(this)\n };\n\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n\n this._pendingSeekTime = null; // in seconds\n this._requestSetTime = false;\n this._seekpointRecord = null;\n this._progressChecker = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n this._msectl = null;\n this._transmuxer = null;\n\n this._mseSourceOpened = false;\n this._hasPendingLoad = false;\n this._receivedCanPlay = false;\n\n this._mediaInfo = null;\n this._statisticsInfo = null;\n\n let chromeNeedIDRFix = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661)));\n this._alwaysSeekKeyframe = (chromeNeedIDRFix || Browser.msedge || Browser.msie) ? true : false;\n\n if (this._alwaysSeekKeyframe) {\n this._config.accurateSeek = false;\n }\n }\n\n destroy() {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n if (this._transmuxer) {\n this.unload();\n }\n if (this._mediaElement) {\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._statisticsInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n mediaElement.addEventListener('seeking', this.e.onvSeeking);\n mediaElement.addEventListener('canplay', this.e.onvCanPlay);\n mediaElement.addEventListener('stalled', this.e.onvStalled);\n mediaElement.addEventListener('progress', this.e.onvProgress);\n\n this._msectl = new MSEController(this._config);\n\n this._msectl.on(MSEEvents.UPDATE_END, this._onmseUpdateEnd.bind(this));\n this._msectl.on(MSEEvents.BUFFER_FULL, this._onmseBufferFull.bind(this));\n this._msectl.on(MSEEvents.SOURCE_OPEN, () => {\n this._mseSourceOpened = true;\n if (this._hasPendingLoad) {\n this._hasPendingLoad = false;\n this.load();\n }\n });\n this._msectl.on(MSEEvents.ERROR, (info) => {\n this._emitter.emit(PlayerEvents.ERROR,\n ErrorTypes.MEDIA_ERROR,\n ErrorDetails.MEDIA_MSE_ERROR,\n info\n );\n });\n\n this._msectl.attachMediaElement(mediaElement);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // We can defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._msectl.detachMediaElement();\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement.removeEventListener('seeking', this.e.onvSeeking);\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n this._mediaElement.removeEventListener('stalled', this.e.onvStalled);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n this._mediaElement = null;\n }\n if (this._msectl) {\n this._msectl.destroy();\n this._msectl = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n if (this._transmuxer) {\n throw new IllegalStateException('FlvPlayer.load() has been called, please call unload() first!');\n }\n if (this._hasPendingLoad) {\n return;\n }\n\n if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) {\n this._hasPendingLoad = true;\n return;\n }\n\n if (this._mediaElement.readyState > 0) {\n this._requestSetTime = true;\n // IE11 may throw InvalidStateError if readyState === 0\n this._mediaElement.currentTime = 0;\n }\n\n this._transmuxer = new Transmuxer(this._mediaDataSource, this._config);\n\n this._transmuxer.on(TransmuxingEvents.INIT_SEGMENT, (type, is) => {\n this._msectl.appendInitSegment(is);\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_SEGMENT, (type, ms) => {\n this._msectl.appendMediaSegment(ms);\n\n // lazyLoad check\n if (this._config.lazyLoad && !this._config.isLive) {\n let currentTime = this._mediaElement.currentTime;\n if (ms.info.endDts >= (currentTime + this._config.lazyLoadMaxDuration) * 1000) {\n if (this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n }\n });\n this._transmuxer.on(TransmuxingEvents.LOADING_COMPLETE, () => {\n this._msectl.endOfStream();\n this._emitter.emit(PlayerEvents.LOADING_COMPLETE);\n });\n this._transmuxer.on(TransmuxingEvents.RECOVERED_EARLY_EOF, () => {\n this._emitter.emit(PlayerEvents.RECOVERED_EARLY_EOF);\n });\n this._transmuxer.on(TransmuxingEvents.IO_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.NETWORK_ERROR, detail, info);\n });\n this._transmuxer.on(TransmuxingEvents.DEMUX_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.MEDIA_ERROR, detail, {code: -1, msg: info});\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_INFO, (mediaInfo) => {\n this._mediaInfo = mediaInfo;\n this._emitter.emit(PlayerEvents.MEDIA_INFO, Object.assign({}, mediaInfo));\n });\n this._transmuxer.on(TransmuxingEvents.METADATA_ARRIVED, (metadata) => {\n this._emitter.emit(PlayerEvents.METADATA_ARRIVED, metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, (data) => {\n this._emitter.emit(PlayerEvents.SCRIPTDATA_ARRIVED, data);\n });\n this._transmuxer.on(TransmuxingEvents.STATISTICS_INFO, (statInfo) => {\n this._statisticsInfo = this._fillStatisticsInfo(statInfo);\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, Object.assign({}, this._statisticsInfo));\n });\n this._transmuxer.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, (milliseconds) => {\n if (this._mediaElement && !this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = milliseconds / 1000;\n }\n });\n\n this._transmuxer.open();\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.pause();\n }\n if (this._msectl) {\n this._msectl.seek(0);\n }\n if (this._transmuxer) {\n this._transmuxer.close();\n this._transmuxer.destroy();\n this._transmuxer = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._internalSeek(seconds);\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n return Object.assign({}, this._mediaInfo);\n }\n\n get statisticsInfo() {\n if (this._statisticsInfo == null) {\n this._statisticsInfo = {};\n }\n this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo);\n return Object.assign({}, this._statisticsInfo);\n }\n\n _fillStatisticsInfo(statInfo) {\n statInfo.playerType = this._type;\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return statInfo;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n statInfo.decodedFrames = decoded;\n statInfo.droppedFrames = dropped;\n }\n\n return statInfo;\n }\n\n _onmseUpdateEnd() {\n if (!this._config.lazyLoad || this._config.isLive) {\n return;\n }\n\n let buffered = this._mediaElement.buffered;\n let currentTime = this._mediaElement.currentTime;\n let currentRangeStart = 0;\n let currentRangeEnd = 0;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n if (start <= currentTime && currentTime < end) {\n currentRangeStart = start;\n currentRangeEnd = end;\n break;\n }\n }\n\n if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n\n _onmseBufferFull() {\n Log.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task');\n if (this._progressChecker == null) {\n this._suspendTransmuxer();\n }\n }\n\n _suspendTransmuxer() {\n if (this._transmuxer) {\n this._transmuxer.pause();\n\n if (this._progressChecker == null) {\n this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000);\n }\n }\n }\n\n _checkProgressAndResume() {\n let currentTime = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n let needResume = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (currentTime >= from && currentTime < to) {\n if (currentTime >= to - this._config.lazyLoadRecoverDuration) {\n needResume = true;\n }\n break;\n }\n }\n\n if (needResume) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n if (needResume) {\n Log.v(this.TAG, 'Continue loading from paused position');\n this._transmuxer.resume();\n }\n }\n }\n\n _isTimepointBuffered(seconds) {\n let buffered = this._mediaElement.buffered;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (seconds >= from && seconds < to) {\n return true;\n }\n }\n return false;\n }\n\n _internalSeek(seconds) {\n let directSeek = this._isTimepointBuffered(seconds);\n\n let directSeekBegin = false;\n let directSeekBeginTime = 0;\n\n if (seconds < 1.0 && this._mediaElement.buffered.length > 0) {\n let videoBeginTime = this._mediaElement.buffered.start(0);\n if ((videoBeginTime < 1.0 && seconds < videoBeginTime) || Browser.safari) {\n directSeekBegin = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n directSeekBeginTime = Browser.safari ? 0.1 : videoBeginTime;\n }\n }\n\n if (directSeekBegin) { // seek to video begin, set currentTime directly if beginPTS buffered\n this._requestSetTime = true;\n this._mediaElement.currentTime = directSeekBeginTime;\n } else if (directSeek) { // buffered position\n if (!this._alwaysSeekKeyframe) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n } else {\n let idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000));\n this._requestSetTime = true;\n if (idr != null) {\n this._mediaElement.currentTime = idr.dts / 1000;\n } else {\n this._mediaElement.currentTime = seconds;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n } else {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n this._msectl.seek(seconds);\n this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds\n // no need to set mediaElement.currentTime if non-accurateSeek,\n // just wait for the recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n }\n }\n }\n\n _checkAndApplyUnbufferedSeekpoint() {\n if (this._seekpointRecord) {\n if (this._seekpointRecord.recordTime <= this._now() - 100) {\n let target = this._mediaElement.currentTime;\n this._seekpointRecord = null;\n if (!this._isTimepointBuffered(target)) {\n if (this._progressChecker != null) {\n window.clearTimeout(this._progressChecker);\n this._progressChecker = null;\n }\n // .currentTime is consists with .buffered timestamp\n // Chrome/Edge use DTS, while FireFox/Safari use PTS\n this._msectl.seek(target);\n this._transmuxer.seek(Math.floor(target * 1000));\n // set currentTime if accurateSeek, or wait for recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = target;\n }\n }\n } else {\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n }\n }\n\n _checkAndResumeStuckPlayback(stalled) {\n let media = this._mediaElement;\n if (stalled || !this._receivedCanPlay || media.readyState < 2) { // HAVE_CURRENT_DATA\n let buffered = media.buffered;\n if (buffered.length > 0 && media.currentTime < buffered.start(0)) {\n Log.w(this.TAG, `Playback seems stuck at ${media.currentTime}, seek to ${buffered.start(0)}`);\n this._requestSetTime = true;\n this._mediaElement.currentTime = buffered.start(0);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n } else {\n // Playback didn't stuck, remove progress event listener\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n }\n\n _onvSeeking(e) { // handle seeking request from browser's progress bar\n let target = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n if (this._requestSetTime) {\n this._requestSetTime = false;\n return;\n }\n\n if (target < 1.0 && buffered.length > 0) {\n // seek to video begin, set currentTime directly if beginPTS buffered\n let videoBeginTime = buffered.start(0);\n if ((videoBeginTime < 1.0 && target < videoBeginTime) || Browser.safari) {\n this._requestSetTime = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n this._mediaElement.currentTime = Browser.safari ? 0.1 : videoBeginTime;\n return;\n }\n }\n\n if (this._isTimepointBuffered(target)) {\n if (this._alwaysSeekKeyframe) {\n let idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000));\n if (idr != null) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = idr.dts / 1000;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n return;\n }\n\n this._seekpointRecord = {\n seekPoint: target,\n recordTime: this._now()\n };\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n\n _onvCanPlay(e) {\n this._receivedCanPlay = true;\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n }\n\n _onvStalled(e) {\n this._checkAndResumeStuckPlayback(true);\n }\n\n _onvProgress(e) {\n this._checkAndResumeStuckPlayback();\n }\n\n}\n\nexport default FlvPlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport PlayerEvents from './player-events.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\n// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. \nclass NativePlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'NativePlayer';\n this._type = 'NativePlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() === 'flv') {\n throw new InvalidArgumentException('NativePlayer does\\'t support flv MediaDataSource input!');\n }\n if (mediaDataSource.hasOwnProperty('segments')) {\n throw new InvalidArgumentException(`NativePlayer(${mediaDataSource.type}) doesn't support multipart playback!`);\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this)\n };\n\n this._pendingSeekTime = null;\n this._statisticsReporter = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n }\n\n destroy() {\n if (this._mediaElement) {\n this.unload();\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) { // HAVE_NOTHING\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // Defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement = null;\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n this._mediaElement.src = this._mediaDataSource.url;\n\n if (this._mediaElement.readyState > 0) {\n this._mediaElement.currentTime = 0;\n }\n\n this._mediaElement.preload = 'auto';\n this._mediaElement.load();\n this._statisticsReporter = window.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._mediaElement.currentTime = seconds;\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n let mediaPrefix = (this._mediaElement instanceof HTMLAudioElement) ? 'audio/' : 'video/';\n let info = {\n mimeType: mediaPrefix + this._mediaDataSource.type\n };\n if (this._mediaElement) {\n info.duration = Math.floor(this._mediaElement.duration * 1000);\n if (this._mediaElement instanceof HTMLVideoElement) {\n info.width = this._mediaElement.videoWidth;\n info.height = this._mediaElement.videoHeight;\n }\n }\n return info;\n }\n\n get statisticsInfo() {\n let info = {\n playerType: this._type,\n url: this._mediaDataSource.url\n };\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return info;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n info.decodedFrames = decoded;\n info.droppedFrames = dropped;\n }\n \n return info;\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n }\n\n _reportStatisticsInfo() {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n }\n\n}\n\nexport default NativePlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {LoaderErrors} from '../io/loader.js';\nimport DemuxErrors from '../demux/demux-errors.js';\n\nexport const ErrorTypes = {\n NETWORK_ERROR: 'NetworkError',\n MEDIA_ERROR: 'MediaError',\n OTHER_ERROR: 'OtherError'\n};\n\nexport const ErrorDetails = {\n NETWORK_EXCEPTION: LoaderErrors.EXCEPTION,\n NETWORK_STATUS_CODE_INVALID: LoaderErrors.HTTP_STATUS_CODE_INVALID,\n NETWORK_TIMEOUT: LoaderErrors.CONNECTING_TIMEOUT,\n NETWORK_UNRECOVERABLE_EARLY_EOF: LoaderErrors.UNRECOVERABLE_EARLY_EOF,\n\n MEDIA_MSE_ERROR: 'MediaMSEError',\n\n MEDIA_FORMAT_ERROR: DemuxErrors.FORMAT_ERROR,\n MEDIA_FORMAT_UNSUPPORTED: DemuxErrors.FORMAT_UNSUPPORTED,\n MEDIA_CODEC_UNSUPPORTED: DemuxErrors.CODEC_UNSUPPORTED\n};","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst PlayerEvents = {\n ERROR: 'error',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n STATISTICS_INFO: 'statistics_info'\n};\n\nexport default PlayerEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass AAC {\n\n static getSilentFrame(codec, channelCount) {\n if (codec === 'mp4a.40.2') {\n // handle LC-AAC\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);\n } else if (channelCount === 3) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);\n } else if (channelCount === 4) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);\n } else if (channelCount === 5) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);\n } else if (channelCount === 6) {\n 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]);\n }\n } else {\n // handle HE-AAC (mp4a.40.5 / mp4a.40.29)\n if (channelCount === 1) {\n // 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\n 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]);\n } else if (channelCount === 2) {\n // 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\n 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]);\n } else if (channelCount === 3) {\n // 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\n 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]);\n }\n }\n return null;\n }\n\n}\n\nexport default AAC;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12)\nclass MP4 {\n\n static init() {\n MP4.types = {\n avc1: [], avcC: [], btrt: [], dinf: [],\n dref: [], esds: [], ftyp: [], hdlr: [],\n mdat: [], mdhd: [], mdia: [], mfhd: [],\n minf: [], moof: [], moov: [], mp4a: [],\n mvex: [], mvhd: [], sdtp: [], stbl: [],\n stco: [], stsc: [], stsd: [], stsz: [],\n stts: [], tfdt: [], tfhd: [], traf: [],\n trak: [], trun: [], trex: [], tkhd: [],\n vmhd: [], smhd: [], '.mp3': []\n };\n\n for (let name in MP4.types) {\n if (MP4.types.hasOwnProperty(name)) {\n MP4.types[name] = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ];\n }\n }\n\n let constants = MP4.constants = {};\n\n constants.FTYP = new Uint8Array([\n 0x69, 0x73, 0x6F, 0x6D, // major_brand: isom\n 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]);\n\n constants.STSD_PREFIX = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]);\n\n constants.STTS = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n constants.STSC = constants.STCO = constants.STTS;\n\n constants.STSZ = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n constants.HDLR_VIDEO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x56, 0x69, 0x64, 0x65,\n 0x6F, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler\n ]);\n\n constants.HDLR_AUDIO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x53, 0x6F, 0x75, 0x6E,\n 0x64, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler\n ]);\n\n constants.DREF = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0C, // entry_size\n 0x75, 0x72, 0x6C, 0x20, // type 'url '\n 0x00, 0x00, 0x00, 0x01 // version(0) + flags\n ]);\n\n // Sound media header\n constants.SMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)\n ]);\n\n // video media header\n constants.VMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x01, // version(0) + flags\n 0x00, 0x00, // graphicsmode: 2 bytes\n 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes\n 0x00, 0x00\n ]);\n }\n\n // Generate a box\n static box(type) {\n let size = 8;\n let result = null;\n let datas = Array.prototype.slice.call(arguments, 1);\n let arrayCount = datas.length;\n\n for (let i = 0; i < arrayCount; i++) {\n size += datas[i].byteLength;\n }\n\n result = new Uint8Array(size);\n result[0] = (size >>> 24) & 0xFF; // size\n result[1] = (size >>> 16) & 0xFF;\n result[2] = (size >>> 8) & 0xFF;\n result[3] = (size) & 0xFF;\n\n result.set(type, 4); // type\n\n let offset = 8;\n for (let i = 0; i < arrayCount; i++) { // data body\n result.set(datas[i], offset);\n offset += datas[i].byteLength;\n }\n\n return result;\n }\n\n // emit ftyp & moov\n static generateInitSegment(meta) {\n let ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);\n let moov = MP4.moov(meta);\n\n let result = new Uint8Array(ftyp.byteLength + moov.byteLength);\n result.set(ftyp, 0);\n result.set(moov, ftyp.byteLength);\n return result;\n }\n\n // Movie metadata box\n static moov(meta) {\n let mvhd = MP4.mvhd(meta.timescale, meta.duration);\n let trak = MP4.trak(meta);\n let mvex = MP4.mvex(meta);\n return MP4.box(MP4.types.moov, mvhd, trak, mvex);\n }\n\n // Movie header box\n static mvhd(timescale, duration) {\n return MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0\n 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID\n ]));\n }\n\n // Track box\n static trak(meta) {\n return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));\n }\n\n // Track header box\n static tkhd(meta) {\n let trackId = meta.id, duration = meta.duration;\n let width = meta.presentWidth, height = meta.presentHeight;\n\n return MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x07, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (trackId >>> 24) & 0xFF, // track_ID: 4 bytes\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n (width >>> 8) & 0xFF, // width and height\n (width) & 0xFF,\n 0x00, 0x00,\n (height >>> 8) & 0xFF,\n (height) & 0xFF,\n 0x00, 0x00\n ]));\n }\n\n // Media Box\n static mdia(meta) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta));\n }\n\n // Media header box\n static mdhd(meta) {\n let timescale = meta.timescale;\n let duration = meta.duration;\n return MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x55, 0xC4, // language: und (undetermined)\n 0x00, 0x00 // pre_defined = 0\n ]));\n }\n\n // Media handler reference box\n static hdlr(meta) {\n let data = null;\n if (meta.type === 'audio') {\n data = MP4.constants.HDLR_AUDIO;\n } else {\n data = MP4.constants.HDLR_VIDEO;\n }\n return MP4.box(MP4.types.hdlr, data);\n }\n\n // Media infomation box\n static minf(meta) {\n let xmhd = null;\n if (meta.type === 'audio') {\n xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);\n } else {\n xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);\n }\n return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));\n }\n\n // Data infomation box\n static dinf() {\n let result = MP4.box(MP4.types.dinf,\n MP4.box(MP4.types.dref, MP4.constants.DREF)\n );\n return result;\n }\n\n // Sample table box\n static stbl(meta) {\n let result = MP4.box(MP4.types.stbl, // type: stbl\n MP4.stsd(meta), // Sample Description Table\n MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample\n MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk\n MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size\n MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset\n ); \n return result; \n }\n\n // Sample description box\n static stsd(meta) {\n if (meta.type === 'audio') {\n if (meta.codec === 'mp3') {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta));\n }\n // else: aac -> mp4a\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));\n } else {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));\n }\n }\n\n static mp3(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types['.mp3'], data);\n }\n\n static mp4a(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));\n }\n\n static esds(meta) {\n let config = meta.config || [];\n let configSize = config.length;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version 0 + flags\n\n 0x03, // descriptor_type\n 0x17 + configSize, // length3\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0F + configSize, // length\n 0x40, // codec: mpeg4_audio\n 0x15, // stream_type: Audio\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([\n configSize\n ]).concat(\n config\n ).concat([\n 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n return MP4.box(MP4.types.esds, data);\n }\n\n static avc1(meta) {\n let avcc = meta.avcc;\n let width = meta.codecWidth, height = meta.codecHeight;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n (width >>> 8) & 0xFF, // width: 2 bytes\n (width) & 0xFF,\n (height >>> 8) & 0xFF, // height: 2 bytes\n (height) & 0xFF,\n 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes\n 0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n 0x00, 0x01, // frame_count\n 0x0A, // strlen\n 0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes\n 0x66, 0x6C, 0x76, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00,\n 0x00, 0x18, // depth\n 0xFF, 0xFF // pre_defined = -1\n ]);\n return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc));\n }\n\n // Movie Extends box\n static mvex(meta) {\n return MP4.box(MP4.types.mvex, MP4.trex(meta));\n }\n\n // Track Extends box\n static trex(meta) {\n let trackId = meta.id;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return MP4.box(MP4.types.trex, data);\n }\n\n // Movie fragment box\n static moof(track, baseMediaDecodeTime) {\n return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime));\n }\n\n static mfhd(sequenceNumber) {\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n (sequenceNumber >>> 24) & 0xFF, // sequence_number: int32\n (sequenceNumber >>> 16) & 0xFF,\n (sequenceNumber >>> 8) & 0xFF,\n (sequenceNumber) & 0xFF\n ]);\n return MP4.box(MP4.types.mfhd, data);\n }\n\n // Track fragment box\n static traf(track, baseMediaDecodeTime) {\n let trackId = track.id;\n\n // Track fragment header box\n let tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF\n ]));\n // Track Fragment Decode Time\n let tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (baseMediaDecodeTime >>> 24) & 0xFF, // baseMediaDecodeTime: int32\n (baseMediaDecodeTime >>> 16) & 0xFF,\n (baseMediaDecodeTime >>> 8) & 0xFF,\n (baseMediaDecodeTime) & 0xFF\n ]));\n let sdtp = MP4.sdtp(track);\n let trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);\n\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);\n }\n\n // Sample Dependency Type box\n static sdtp(track) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let data = new Uint8Array(4 + sampleCount);\n // 0~4 bytes: version(0) & flags\n for (let i = 0; i < sampleCount; i++) {\n let flags = samples[i].flags;\n data[i + 4] = (flags.isLeading << 6) // is_leading: 2 (bit)\n | (flags.dependsOn << 4) // sample_depends_on\n | (flags.isDependedOn << 2) // sample_is_depended_on\n | (flags.hasRedundancy); // sample_has_redundancy\n }\n return MP4.box(MP4.types.sdtp, data);\n }\n\n // Track fragment run box\n static trun(track, offset) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let dataSize = 12 + 16 * sampleCount;\n let data = new Uint8Array(dataSize);\n offset += 8 + dataSize;\n\n data.set([\n 0x00, 0x00, 0x0F, 0x01, // version(0) & flags\n (sampleCount >>> 24) & 0xFF, // sample_count\n (sampleCount >>> 16) & 0xFF,\n (sampleCount >>> 8) & 0xFF,\n (sampleCount) & 0xFF,\n (offset >>> 24) & 0xFF, // data_offset\n (offset >>> 16) & 0xFF,\n (offset >>> 8) & 0xFF,\n (offset) & 0xFF\n ], 0);\n\n for (let i = 0; i < sampleCount; i++) {\n let duration = samples[i].duration;\n let size = samples[i].size;\n let flags = samples[i].flags;\n let cts = samples[i].cts;\n data.set([\n (duration >>> 24) & 0xFF, // sample_duration\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n (size >>> 24) & 0xFF, // sample_size\n (size >>> 16) & 0xFF,\n (size >>> 8) & 0xFF,\n (size) & 0xFF,\n (flags.isLeading << 2) | flags.dependsOn, // sample_flags\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,\n 0x00, 0x00, // sample_degradation_priority\n (cts >>> 24) & 0xFF, // sample_composition_time_offset\n (cts >>> 16) & 0xFF,\n (cts >>> 8) & 0xFF,\n (cts) & 0xFF\n ], 12 + 16 * i);\n }\n return MP4.box(MP4.types.trun, data);\n }\n\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data);\n }\n\n}\n\nMP4.init();\n\nexport default MP4;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport MP4 from './mp4-generator.js';\nimport AAC from './aac-silent.js';\nimport Browser from '../utils/browser.js';\nimport { SampleInfo, MediaSegmentInfo, MediaSegmentInfoList } from '../core/media-segment-info.js';\nimport { IllegalStateException } from '../utils/exception.js';\n\n\n// Fragmented mp4 remuxer\nclass MP4Remuxer {\n\n constructor(config) {\n this.TAG = 'MP4Remuxer';\n\n this._config = config;\n this._isLive = (config.isLive === true) ? true : false;\n\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioDtsBase = Infinity;\n this._videoDtsBase = Infinity;\n this._audioNextDts = undefined;\n this._videoNextDts = undefined;\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n\n this._audioMeta = null;\n this._videoMeta = null;\n\n this._audioSegmentInfoList = new MediaSegmentInfoList('audio');\n this._videoSegmentInfoList = new MediaSegmentInfoList('video');\n\n this._onInitSegment = null;\n this._onMediaSegment = null;\n\n // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n this._forceFirstIDR = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661))) ? true : false;\n\n // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking\n // Make audio beginDts equals with video beginDts, in order to fix seek freeze\n this._fillSilentAfterSeek = (Browser.msedge || Browser.msie);\n\n // While only FireFox supports 'audio/mp4, codecs=\"mp3\"', use 'audio/mpeg' for chrome, safari, ...\n this._mp3UseMpegAudio = !Browser.firefox;\n\n this._fillAudioTimestampGap = this._config.fixAudioTimestampGap;\n }\n\n destroy() {\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioMeta = null;\n this._videoMeta = null;\n this._audioSegmentInfoList.clear();\n this._audioSegmentInfoList = null;\n this._videoSegmentInfoList.clear();\n this._videoSegmentInfoList = null;\n this._onInitSegment = null;\n this._onMediaSegment = null;\n }\n\n bindDataSource(producer) {\n producer.onDataAvailable = this.remux.bind(this);\n producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this);\n return this;\n }\n\n /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void\n InitSegment: {\n type: string,\n data: ArrayBuffer,\n codec: string,\n container: string\n }\n */\n get onInitSegment() {\n return this._onInitSegment;\n }\n\n set onInitSegment(callback) {\n this._onInitSegment = callback;\n }\n\n /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void\n MediaSegment: {\n type: string,\n data: ArrayBuffer,\n sampleCount: int32\n info: MediaSegmentInfo\n }\n */\n get onMediaSegment() {\n return this._onMediaSegment;\n }\n\n set onMediaSegment(callback) {\n this._onMediaSegment = callback;\n }\n\n insertDiscontinuity() {\n this._audioNextDts = this._videoNextDts = undefined;\n }\n\n seek(originalDts) {\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n this._videoSegmentInfoList.clear();\n this._audioSegmentInfoList.clear();\n }\n\n remux(audioTrack, videoTrack) {\n if (!this._onMediaSegment) {\n throw new IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!');\n }\n if (!this._dtsBaseInited) {\n this._calculateDtsBase(audioTrack, videoTrack);\n }\n this._remuxVideo(videoTrack);\n this._remuxAudio(audioTrack);\n }\n\n _onTrackMetadataReceived(type, metadata) {\n let metabox = null;\n\n let container = 'mp4';\n let codec = metadata.codec;\n\n if (type === 'audio') {\n this._audioMeta = metadata;\n if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) {\n // 'audio/mpeg' for MP3 audio track\n container = 'mpeg';\n codec = '';\n metabox = new Uint8Array();\n } else {\n // 'audio/mp4, codecs=\"codec\"'\n metabox = MP4.generateInitSegment(metadata);\n }\n } else if (type === 'video') {\n this._videoMeta = metadata;\n metabox = MP4.generateInitSegment(metadata);\n } else {\n return;\n }\n\n // dispatch metabox (Initialization Segment)\n if (!this._onInitSegment) {\n throw new IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!');\n }\n this._onInitSegment(type, {\n type: type,\n data: metabox.buffer,\n codec: codec,\n container: `${type}/${container}`,\n mediaDuration: metadata.duration // in timescale 1000 (milliseconds)\n });\n }\n\n _calculateDtsBase(audioTrack, videoTrack) {\n if (this._dtsBaseInited) {\n return;\n }\n\n if (audioTrack.samples && audioTrack.samples.length) {\n this._audioDtsBase = audioTrack.samples[0].dts;\n }\n if (videoTrack.samples && videoTrack.samples.length) {\n this._videoDtsBase = videoTrack.samples[0].dts;\n }\n\n this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase);\n this._dtsBaseInited = true;\n }\n\n flushStashedSamples() {\n let videoSample = this._videoStashedLastSample;\n let audioSample = this._audioStashedLastSample;\n\n let videoTrack = {\n type: 'video',\n id: 1,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (videoSample != null) {\n videoTrack.samples.push(videoSample);\n videoTrack.length = videoSample.length;\n }\n\n let audioTrack = {\n type: 'audio',\n id: 2,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (audioSample != null) {\n audioTrack.samples.push(audioSample);\n audioTrack.length = audioSample.length;\n }\n\n this._videoStashedLastSample = null;\n this._audioStashedLastSample = null;\n\n this._remuxVideo(videoTrack, true);\n this._remuxAudio(audioTrack, true);\n }\n\n _remuxAudio(audioTrack, force) {\n if (this._audioMeta == null) {\n return;\n }\n\n let track = audioTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1, lastPts = -1;\n let refSampleDuration = this._audioMeta.refSampleDuration;\n\n let mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio;\n let firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined;\n\n let insertPrefixSilentFrame = false;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 0;\n let mdatbox = null;\n let mdatBytes = 0;\n\n // calculate initial mdat size\n if (mpegRawTrack) {\n // for raw mpeg buffer\n offset = 0;\n mdatBytes = track.length;\n } else {\n // for fmp4 mdat box\n offset = 8; // size + type\n mdatBytes = 8 + track.length;\n }\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._audioStashedLastSample != null) {\n let sample = this._audioStashedLastSample;\n this._audioStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._audioStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._audioNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._audioNextDts;\n } else { // this._audioNextDts == undefined\n if (this._audioSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) {\n if (this._audioMeta.originalCodec !== 'mp3') {\n insertPrefixSilentFrame = true;\n }\n }\n } else {\n let lastSample = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n if (insertPrefixSilentFrame) {\n // align audio segment beginDts to match with current video segment's beginDts\n let firstSampleDts = firstSampleOriginalDts - dtsCorrection;\n let videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts);\n if (videoSegment != null && videoSegment.beginDts < firstSampleDts) {\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit) {\n let dts = videoSegment.beginDts;\n let silentFrameDuration = firstSampleDts - videoSegment.beginDts;\n Log.v(this.TAG, `InsertPrefixSilentAudio: dts: ${dts}, duration: ${silentFrameDuration}`);\n samples.unshift({ unit: silentUnit, dts: dts, pts: dts });\n mdatBytes += silentUnit.byteLength;\n } // silentUnit == null: Cannot generate, skip\n } else {\n insertPrefixSilentFrame = false;\n }\n }\n\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let unit = sample.unit;\n let originalDts = sample.dts - this._dtsBase;\n let dts = originalDts;\n let needFillSilentFrames = false;\n let silentFrames = null;\n let sampleDuration = 0;\n\n if (originalDts < -0.001) {\n continue; //pass the first sample with the invalid dts\n }\n\n if (this._audioMeta.codec !== 'mp3') {\n // for AAC codec, we need to keep dts increase based on refSampleDuration\n let curRefDts = originalDts;\n const maxAudioFramesDrift = 3;\n if (this._audioNextDts) {\n curRefDts = this._audioNextDts;\n }\n\n dtsCorrection = originalDts - curRefDts;\n if (dtsCorrection <= -maxAudioFramesDrift * refSampleDuration) {\n // If we're overlapping by more than maxAudioFramesDrift number of frame, drop this sample\n Log.w(this.TAG, `Dropping 1 audio frame (originalDts: ${originalDts} ms ,curRefDts: ${curRefDts} ms) due to dtsCorrection: ${dtsCorrection} ms overlap.`);\n continue;\n }\n else if (dtsCorrection >= maxAudioFramesDrift * refSampleDuration && this._fillAudioTimestampGap && !Browser.safari) {\n // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap\n needFillSilentFrames = true;\n // We need to insert silent frames to fill timestamp gap\n let frameCount = Math.floor(dtsCorrection / refSampleDuration);\n Log.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' +\n 'Silent frames will be generated to avoid unsync.\\n' +\n `originalDts: ${originalDts} ms, curRefDts: ${curRefDts} ms, ` +\n `dtsCorrection: ${Math.round(dtsCorrection)} ms, generate: ${frameCount} frames`);\n\n\n dts = Math.floor(curRefDts);\n sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;\n\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit == null) {\n Log.w(this.TAG, 'Unable to generate silent frame for ' +\n `${this._audioMeta.originalCodec} with ${this._audioMeta.channelCount} channels, repeat last frame`);\n // Repeat last frame\n silentUnit = unit;\n }\n silentFrames = [];\n\n for (let j = 0; j < frameCount; j++) {\n curRefDts = curRefDts + refSampleDuration;\n let intDts = Math.floor(curRefDts); // change to integer\n let intDuration = Math.floor(curRefDts + refSampleDuration) - intDts;\n let frame = {\n dts: intDts,\n pts: intDts,\n cts: 0,\n unit: silentUnit,\n size: silentUnit.byteLength,\n duration: intDuration, // wait for next sample\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n };\n silentFrames.push(frame);\n mdatBytes += frame.size;;\n\n }\n\n this._audioNextDts = curRefDts + refSampleDuration;\n\n } else {\n\n dts = Math.floor(curRefDts);\n sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;\n this._audioNextDts = curRefDts + refSampleDuration;\n\n }\n } else {\n // keep the original dts calculate algorithm for mp3\n dts = originalDts - dtsCorrection;\n\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(refSampleDuration);\n }\n }\n this._audioNextDts = dts + sampleDuration;\n }\n\n if (firstDts === -1) {\n firstDts = dts;\n }\n mp4Samples.push({\n dts: dts,\n pts: dts,\n cts: 0,\n unit: sample.unit,\n size: sample.unit.byteLength,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n });\n\n if (needFillSilentFrames) {\n // Silent frames should be inserted after wrong-duration frame\n mp4Samples.push.apply(mp4Samples, silentFrames);\n }\n }\n\n if (mp4Samples.length === 0) {\n //no samples need to remux\n track.samples = [];\n track.length = 0;\n return;\n }\n\n // allocate mdatbox\n if (mpegRawTrack) {\n // allocate for raw mpeg buffer\n mdatbox = new Uint8Array(mdatBytes);\n } else {\n // allocate for fmp4 mdat box\n mdatbox = new Uint8Array(mdatBytes);\n // size field\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n // type field (fourCC)\n mdatbox.set(MP4.types.mdat, 4);\n }\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let unit = mp4Samples[i].unit;\n mdatbox.set(unit, offset);\n offset += unit.byteLength;\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n //this._audioNextDts = lastDts;\n\n // fill media segment info & add to info list\n let info = new MediaSegmentInfo();\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstDts;\n info.endPts = lastDts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n false);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n false);\n if (!this._isLive) {\n this._audioSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n let moofbox = null;\n\n if (mpegRawTrack) {\n // Generate empty buffer, because useless for raw mpeg\n moofbox = new Uint8Array();\n } else {\n // Generate moof for fmp4 segment\n moofbox = MP4.moof(track, firstDts);\n }\n\n track.samples = [];\n track.length = 0;\n\n let segment = {\n type: 'audio',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n };\n\n if (mpegRawTrack && firstSegmentAfterSeek) {\n // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n segment.timestampOffset = firstDts;\n }\n\n this._onMediaSegment('audio', segment);\n }\n\n _remuxVideo(videoTrack, force) {\n if (this._videoMeta == null) {\n return;\n }\n\n let track = videoTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1;\n let firstPts = -1, lastPts = -1;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 8;\n let mdatbox = null;\n let mdatBytes = 8 + videoTrack.length;\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._videoStashedLastSample != null) {\n let sample = this._videoStashedLastSample;\n this._videoStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._videoStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._videoNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._videoNextDts;\n } else { // this._videoNextDts == undefined\n if (this._videoSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n } else {\n let lastSample = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n let info = new MediaSegmentInfo();\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let originalDts = sample.dts - this._dtsBase;\n let isKeyframe = sample.isKeyframe;\n let dts = originalDts - dtsCorrection;\n let cts = sample.cts;\n let pts = dts + cts;\n\n if (firstDts === -1) {\n firstDts = dts;\n firstPts = pts;\n }\n\n let sampleDuration = 0;\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(this._videoMeta.refSampleDuration);\n }\n }\n\n if (isKeyframe) {\n let syncPoint = new SampleInfo(dts, pts, sampleDuration, sample.dts, true);\n syncPoint.fileposition = sample.fileposition;\n info.appendSyncPoint(syncPoint);\n }\n\n mp4Samples.push({\n dts: dts,\n pts: pts,\n cts: cts,\n units: sample.units,\n size: sample.length,\n isKeyframe: isKeyframe,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: isKeyframe ? 2 : 1,\n isDependedOn: isKeyframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isKeyframe ? 0 : 1\n }\n });\n }\n\n // allocate mdatbox\n mdatbox = new Uint8Array(mdatBytes);\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n mdatbox.set(MP4.types.mdat, 4);\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let units = mp4Samples[i].units;\n while (units.length) {\n let unit = units.shift();\n let data = unit.data;\n mdatbox.set(data, offset);\n offset += data.byteLength;\n }\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n lastPts = latest.pts + latest.duration;\n this._videoNextDts = lastDts;\n\n // fill media segment info & add to info list\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstPts;\n info.endPts = lastPts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n mp4Samples[0].isKeyframe);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n latest.isKeyframe);\n if (!this._isLive) {\n this._videoSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n // workaround for chrome < 50: force first sample as a random access point\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n if (this._forceFirstIDR) {\n let flags = mp4Samples[0].flags;\n flags.dependsOn = 2;\n flags.isNonSync = 0;\n }\n\n let moofbox = MP4.moof(track, firstDts);\n track.samples = [];\n track.length = 0;\n\n this._onMediaSegment('video', {\n type: 'video',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n });\n }\n\n _mergeBoxes(moof, mdat) {\n let result = new Uint8Array(moof.byteLength + mdat.byteLength);\n result.set(moof, 0);\n result.set(mdat, moof.byteLength);\n return result;\n }\n\n}\n\nexport default MP4Remuxer;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet Browser = {};\n\nfunction detect() {\n // modified from jquery-browser-plugin\n\n let ua = self.navigator.userAgent.toLowerCase();\n\n let match = /(edge)\\/([\\w.]+)/.exec(ua) ||\n /(opr)[\\/]([\\w.]+)/.exec(ua) ||\n /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n /(iemobile)[\\/]([\\w.]+)/.exec(ua) ||\n /(version)(applewebkit)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+).*(version)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n /(msie) ([\\w.]+)/.exec(ua) ||\n ua.indexOf('trident') >= 0 && /(rv)(?::| )([\\w.]+)/.exec(ua) ||\n ua.indexOf('compatible') < 0 && /(firefox)[ \\/]([\\w.]+)/.exec(ua) ||\n [];\n\n let platform_match = /(ipad)/.exec(ua) ||\n /(ipod)/.exec(ua) ||\n /(windows phone)/.exec(ua) ||\n /(iphone)/.exec(ua) ||\n /(kindle)/.exec(ua) ||\n /(android)/.exec(ua) ||\n /(windows)/.exec(ua) ||\n /(mac)/.exec(ua) ||\n /(linux)/.exec(ua) ||\n /(cros)/.exec(ua) ||\n [];\n\n let matched = {\n browser: match[5] || match[3] || match[1] || '',\n version: match[2] || match[4] || '0',\n majorVersion: match[4] || match[2] || '0',\n platform: platform_match[0] || ''\n };\n\n let browser = {};\n if (matched.browser) {\n browser[matched.browser] = true;\n\n let versionArray = matched.majorVersion.split('.');\n browser.version = {\n major: parseInt(matched.majorVersion, 10),\n string: matched.version\n };\n if (versionArray.length > 1) {\n browser.version.minor = parseInt(versionArray[1], 10);\n }\n if (versionArray.length > 2) {\n browser.version.build = parseInt(versionArray[2], 10);\n }\n }\n\n if (matched.platform) {\n browser[matched.platform] = true;\n }\n\n if (browser.chrome || browser.opr || browser.safari) {\n browser.webkit = true;\n }\n\n // MSIE. IE11 has 'rv' identifer\n if (browser.rv || browser.iemobile) {\n if (browser.rv) {\n delete browser.rv;\n }\n let msie = 'msie';\n matched.browser = msie;\n browser[msie] = true;\n }\n\n // Microsoft Edge\n if (browser.edge) {\n delete browser.edge;\n let msedge = 'msedge';\n matched.browser = msedge;\n browser[msedge] = true;\n }\n\n // Opera 15+\n if (browser.opr) {\n let opera = 'opera';\n matched.browser = opera;\n browser[opera] = true;\n }\n\n // Stock android browsers are marked as Safari\n if (browser.safari && browser.android) {\n let android = 'android';\n matched.browser = android;\n browser[android] = true;\n }\n\n browser.name = matched.browser;\n browser.platform = matched.platform;\n\n for (let key in Browser) {\n if (Browser.hasOwnProperty(key)) {\n delete Browser[key];\n }\n }\n Object.assign(Browser, browser);\n}\n\ndetect();\n\nexport default Browser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class RuntimeException {\n\n constructor(message) {\n this._message = message;\n }\n\n get name() {\n return 'RuntimeException';\n }\n\n get message() {\n return this._message;\n }\n\n toString() {\n return this.name + ': ' + this.message;\n }\n\n}\n\nexport class IllegalStateException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'IllegalStateException';\n }\n\n}\n\nexport class InvalidArgumentException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'InvalidArgumentException';\n }\n\n}\n\nexport class NotImplementedException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'NotImplementedException';\n }\n\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\n\nclass Log {\n\n static e(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'error', str);\n }\n\n if (!Log.ENABLE_ERROR) {\n return;\n }\n\n if (console.error) {\n console.error(str);\n } else if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static i(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'info', str);\n }\n\n if (!Log.ENABLE_INFO) {\n return;\n }\n\n if (console.info) {\n console.info(str);\n } else {\n console.log(str);\n }\n }\n\n static w(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'warn', str);\n }\n\n if (!Log.ENABLE_WARN) {\n return;\n }\n\n if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static d(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'debug', str);\n }\n\n if (!Log.ENABLE_DEBUG) {\n return;\n }\n\n if (console.debug) {\n console.debug(str);\n } else {\n console.log(str);\n }\n }\n\n static v(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'verbose', str);\n }\n\n if (!Log.ENABLE_VERBOSE) {\n return;\n }\n\n console.log(str);\n }\n\n}\n\nLog.GLOBAL_TAG = 'flv.js';\nLog.FORCE_GLOBAL_TAG = false;\nLog.ENABLE_ERROR = true;\nLog.ENABLE_INFO = true;\nLog.ENABLE_WARN = true;\nLog.ENABLE_DEBUG = true;\nLog.ENABLE_VERBOSE = true;\n\nLog.ENABLE_CALLBACK = false;\n\nLog.emitter = new EventEmitter();\n\nexport default Log;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from './logger.js';\n\nclass LoggingControl {\n\n static get forceGlobalTag() {\n return Log.FORCE_GLOBAL_TAG;\n }\n\n static set forceGlobalTag(enable) {\n Log.FORCE_GLOBAL_TAG = enable;\n LoggingControl._notifyChange();\n }\n\n static get globalTag() {\n return Log.GLOBAL_TAG;\n }\n\n static set globalTag(tag) {\n Log.GLOBAL_TAG = tag;\n LoggingControl._notifyChange();\n }\n\n static get enableAll() {\n return Log.ENABLE_VERBOSE\n && Log.ENABLE_DEBUG\n && Log.ENABLE_INFO\n && Log.ENABLE_WARN\n && Log.ENABLE_ERROR;\n }\n\n static set enableAll(enable) {\n Log.ENABLE_VERBOSE = enable;\n Log.ENABLE_DEBUG = enable;\n Log.ENABLE_INFO = enable;\n Log.ENABLE_WARN = enable;\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableDebug() {\n return Log.ENABLE_DEBUG;\n }\n\n static set enableDebug(enable) {\n Log.ENABLE_DEBUG = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableVerbose() {\n return Log.ENABLE_VERBOSE;\n }\n\n static set enableVerbose(enable) {\n Log.ENABLE_VERBOSE = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableInfo() {\n return Log.ENABLE_INFO;\n }\n\n static set enableInfo(enable) {\n Log.ENABLE_INFO = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableWarn() {\n return Log.ENABLE_WARN;\n }\n\n static set enableWarn(enable) {\n Log.ENABLE_WARN = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableError() {\n return Log.ENABLE_ERROR;\n }\n\n static set enableError(enable) {\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static getConfig() {\n return {\n globalTag: Log.GLOBAL_TAG,\n forceGlobalTag: Log.FORCE_GLOBAL_TAG,\n enableVerbose: Log.ENABLE_VERBOSE,\n enableDebug: Log.ENABLE_DEBUG,\n enableInfo: Log.ENABLE_INFO,\n enableWarn: Log.ENABLE_WARN,\n enableError: Log.ENABLE_ERROR,\n enableCallback: Log.ENABLE_CALLBACK\n };\n }\n\n static applyConfig(config) {\n Log.GLOBAL_TAG = config.globalTag;\n Log.FORCE_GLOBAL_TAG = config.forceGlobalTag;\n Log.ENABLE_VERBOSE = config.enableVerbose;\n Log.ENABLE_DEBUG = config.enableDebug;\n Log.ENABLE_INFO = config.enableInfo;\n Log.ENABLE_WARN = config.enableWarn;\n Log.ENABLE_ERROR = config.enableError;\n Log.ENABLE_CALLBACK = config.enableCallback;\n }\n\n static _notifyChange() {\n let emitter = LoggingControl.emitter;\n\n if (emitter.listenerCount('change') > 0) {\n let config = LoggingControl.getConfig();\n emitter.emit('change', config);\n }\n }\n\n static registerListener(listener) {\n LoggingControl.emitter.addListener('change', listener);\n }\n\n static removeListener(listener) {\n LoggingControl.emitter.removeListener('change', listener);\n }\n\n static addLogListener(listener) {\n Log.emitter.addListener('log', listener);\n if (Log.emitter.listenerCount('log') > 0) {\n Log.ENABLE_CALLBACK = true;\n LoggingControl._notifyChange();\n }\n }\n\n static removeLogListener(listener) {\n Log.emitter.removeListener('log', listener);\n if (Log.emitter.listenerCount('log') === 0) {\n Log.ENABLE_CALLBACK = false;\n LoggingControl._notifyChange();\n }\n }\n\n}\n\nLoggingControl.emitter = new EventEmitter();\n\nexport default LoggingControl;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass Polyfill {\n\n static install() {\n // ES6 Object.setPrototypeOf\n Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {\n obj.__proto__ = proto;\n return obj;\n };\n\n // ES6 Object.assign\n Object.assign = Object.assign || function (target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n let output = Object(target);\n for (let i = 1; i < arguments.length; i++) {\n let source = arguments[i];\n if (source !== undefined && source !== null) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n output[key] = source[key];\n }\n }\n }\n }\n return output;\n };\n\n // ES6 Promise (missing support in IE11)\n if (typeof self.Promise !== 'function') {\n require('es6-promise').polyfill();\n }\n }\n\n}\n\nPolyfill.install();\n\nexport default Polyfill;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction checkContinuation(uint8array, start, checkLength) {\n let array = uint8array;\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80)\n return false;\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction decodeUTF8(uint8array) {\n let out = [];\n let input = uint8array;\n let i = 0;\n let length = uint8array.length;\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]));\n ++i;\n continue;\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (checkContinuation(input, i, 1)) {\n let ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F);\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 2;\n continue;\n }\n }\n } else if (input[i] < 0xF0) {\n if (checkContinuation(input, i, 2)) {\n let ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 3;\n continue;\n }\n }\n } else if (input[i] < 0xF8) {\n if (checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12\n | (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F);\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000;\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800));\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00));\n i += 4;\n continue;\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD));\n ++i;\n }\n\n return out.join('');\n}\n\nexport default decodeUTF8;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// module factories are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(\"./src/index.js\");\n"],"sourceRoot":""} \ No newline at end of file diff --git a/ckplayer/flv.js/flv.min.js b/ckplayer/flv.js/flv.min.js deleted file mode 100644 index c5010fb..0000000 --- a/ckplayer/flv.js/flv.min.js +++ /dev/null @@ -1,10 +0,0 @@ -!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 postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n if (isFunction(callback)) {\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n }\n\n return promise.then(callback, callback);\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","function webpackBootstrapFunc (modules) {\n/******/ // The module cache\n/******/ var installedModules = {};\n\n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n\n/******/ // Check if module is in cache\n/******/ if(installedModules[moduleId])\n/******/ return installedModules[moduleId].exports;\n\n/******/ // Create a new module (and put it into the cache)\n/******/ var module = installedModules[moduleId] = {\n/******/ i: moduleId,\n/******/ l: false,\n/******/ exports: {}\n/******/ };\n\n/******/ // Execute the module function\n/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ // Flag the module as loaded\n/******/ module.l = true;\n\n/******/ // Return the exports of the module\n/******/ return module.exports;\n/******/ }\n\n/******/ // expose the modules object (__webpack_modules__)\n/******/ __webpack_require__.m = modules;\n\n/******/ // expose the module cache\n/******/ __webpack_require__.c = installedModules;\n\n/******/ // identity function for calling harmony imports with the correct context\n/******/ __webpack_require__.i = function(value) { return value; };\n\n/******/ // define getter function for harmony exports\n/******/ __webpack_require__.d = function(exports, name, getter) {\n/******/ if(!__webpack_require__.o(exports, name)) {\n/******/ Object.defineProperty(exports, name, {\n/******/ configurable: false,\n/******/ enumerable: true,\n/******/ get: getter\n/******/ });\n/******/ }\n/******/ };\n\n/******/ // define __esModule on exports\n/******/ __webpack_require__.r = function(exports) {\n/******/ Object.defineProperty(exports, '__esModule', { value: true });\n/******/ };\n\n/******/ // getDefaultExport function for compatibility with non-harmony modules\n/******/ __webpack_require__.n = function(module) {\n/******/ var getter = module && module.__esModule ?\n/******/ function getDefault() { return module['default']; } :\n/******/ function getModuleExports() { return module; };\n/******/ __webpack_require__.d(getter, 'a', getter);\n/******/ return getter;\n/******/ };\n\n/******/ // Object.prototype.hasOwnProperty.call\n/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n/******/ // __webpack_public_path__\n/******/ __webpack_require__.p = \"/\";\n\n/******/ // on error function for async loading\n/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n var f = __webpack_require__(__webpack_require__.s = ENTRY_MODULE)\n return f.default || f // try to call default if defined to also support babel esmodule exports\n}\n\nvar moduleNameReqExp = '[\\\\.|\\\\-|\\\\+|\\\\w|\\/|@]+'\nvar dependencyRegExp = '\\\\(\\\\s*(\\/\\\\*.*?\\\\*\\/)?\\\\s*.*?(' + moduleNameReqExp + ').*?\\\\)' // additional chars when output.pathinfo is true\n\n// http://stackoverflow.com/a/2593661/130442\nfunction quoteRegExp (str) {\n return (str + '').replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&')\n}\n\nfunction isNumeric(n) {\n return !isNaN(1 * n); // 1 * n converts integers, integers as string (\"123\"), 1e3 and \"1e3\" to integers and strings to NaN\n}\n\nfunction getModuleDependencies (sources, module, queueName) {\n var retval = {}\n retval[queueName] = []\n\n var fnString = module.toString()\n var wrapperSignature = fnString.match(/^function\\s?\\w*\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/)\n if (!wrapperSignature) return retval\n var webpackRequireName = wrapperSignature[1]\n\n // main bundle deps\n var re = new RegExp('(\\\\\\\\n|\\\\W)' + quoteRegExp(webpackRequireName) + dependencyRegExp, 'g')\n var match\n while ((match = re.exec(fnString))) {\n if (match[3] === 'dll-reference') continue\n retval[queueName].push(match[3])\n }\n\n // dll deps\n re = new RegExp('\\\\(' + quoteRegExp(webpackRequireName) + '\\\\(\"(dll-reference\\\\s(' + moduleNameReqExp + '))\"\\\\)\\\\)' + dependencyRegExp, 'g')\n while ((match = re.exec(fnString))) {\n if (!sources[match[2]]) {\n retval[queueName].push(match[1])\n sources[match[2]] = __webpack_require__(match[1]).m\n }\n retval[match[2]] = retval[match[2]] || []\n retval[match[2]].push(match[4])\n }\n\n // convert 1e3 back to 1000 - this can be important after uglify-js converted 1000 to 1e3\n var keys = Object.keys(retval);\n for (var i = 0; i < keys.length; i++) {\n for (var j = 0; j < retval[keys[i]].length; j++) {\n if (isNumeric(retval[keys[i]][j])) {\n retval[keys[i]][j] = 1 * retval[keys[i]][j];\n }\n }\n }\n\n return retval\n}\n\nfunction hasValuesInQueues (queues) {\n var keys = Object.keys(queues)\n return keys.reduce(function (hasValues, key) {\n return hasValues || queues[key].length > 0\n }, false)\n}\n\nfunction getRequiredModules (sources, moduleId) {\n var modulesQueue = {\n main: [moduleId]\n }\n var requiredModules = {\n main: []\n }\n var seenModules = {\n main: {}\n }\n\n while (hasValuesInQueues(modulesQueue)) {\n var queues = Object.keys(modulesQueue)\n for (var i = 0; i < queues.length; i++) {\n var queueName = queues[i]\n var queue = modulesQueue[queueName]\n var moduleToCheck = queue.pop()\n seenModules[queueName] = seenModules[queueName] || {}\n if (seenModules[queueName][moduleToCheck] || !sources[queueName][moduleToCheck]) continue\n seenModules[queueName][moduleToCheck] = true\n requiredModules[queueName] = requiredModules[queueName] || []\n requiredModules[queueName].push(moduleToCheck)\n var newModules = getModuleDependencies(sources, sources[queueName][moduleToCheck], queueName)\n var newModulesKeys = Object.keys(newModules)\n for (var j = 0; j < newModulesKeys.length; j++) {\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]] || []\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]].concat(newModules[newModulesKeys[j]])\n }\n }\n }\n\n return requiredModules\n}\n\nmodule.exports = function (moduleId, options) {\n options = options || {}\n var sources = {\n main: __webpack_modules__\n }\n\n var requiredModules = options.all ? { main: Object.keys(sources.main) } : getRequiredModules(sources, moduleId)\n\n var src = ''\n\n Object.keys(requiredModules).filter(function (m) { return m !== 'main' }).forEach(function (module) {\n var entryModule = 0\n while (requiredModules[module][entryModule]) {\n entryModule++\n }\n requiredModules[module].push(entryModule)\n sources[module][entryModule] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })'\n 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'\n })\n\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);'\n\n var blob = new window.Blob([src], { type: 'text/javascript' })\n if (options.bare) { return blob }\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL\n\n var workerUrl = URL.createObjectURL(blob)\n var worker = new window.Worker(workerUrl)\n worker.objectURL = workerUrl\n\n return worker\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass MediaInfo {\n\n constructor() {\n this.mimeType = null;\n this.duration = null;\n\n this.hasAudio = null;\n this.hasVideo = null;\n this.audioCodec = null;\n this.videoCodec = null;\n this.audioDataRate = null;\n this.videoDataRate = null;\n\n this.audioSampleRate = null;\n this.audioChannelCount = null;\n\n this.width = null;\n this.height = null;\n this.fps = null;\n this.profile = null;\n this.level = null;\n this.refFrames = null;\n this.chromaFormat = null;\n this.sarNum = null;\n this.sarDen = null;\n\n this.metadata = null;\n this.segments = null; // MediaInfo[]\n this.segmentCount = null;\n this.hasKeyframesIndex = null;\n this.keyframesIndex = null;\n }\n\n isComplete() {\n let audioInfoComplete = (this.hasAudio === false) ||\n (this.hasAudio === true &&\n this.audioCodec != null &&\n this.audioSampleRate != null &&\n this.audioChannelCount != null);\n\n let videoInfoComplete = (this.hasVideo === false) ||\n (this.hasVideo === true &&\n this.videoCodec != null &&\n this.width != null &&\n this.height != null &&\n this.fps != null &&\n this.profile != null &&\n this.level != null &&\n this.refFrames != null &&\n this.chromaFormat != null &&\n this.sarNum != null &&\n this.sarDen != null);\n\n // keyframesIndex may not be present\n return this.mimeType != null &&\n this.duration != null &&\n this.metadata != null &&\n this.hasKeyframesIndex != null &&\n audioInfoComplete &&\n videoInfoComplete;\n }\n\n isSeekable() {\n return this.hasKeyframesIndex === true;\n }\n\n getNearestKeyframe(milliseconds) {\n if (this.keyframesIndex == null) {\n return null;\n }\n\n let table = this.keyframesIndex;\n let keyframeIdx = this._search(table.times, milliseconds);\n\n return {\n index: keyframeIdx,\n milliseconds: table.times[keyframeIdx],\n fileposition: table.filepositions[keyframeIdx]\n };\n }\n\n _search(list, value) {\n let idx = 0;\n\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (value < list[0]) {\n idx = 0;\n lbound = ubound + 1; // skip search\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (value >= list[mid] && value < list[mid + 1])) {\n idx = mid;\n break;\n } else if (list[mid] < value) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n\n return idx;\n }\n\n}\n\nexport default MediaInfo;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Represents an media sample (audio / video)\nexport class SampleInfo {\n\n constructor(dts, pts, duration, originalDts, isSync) {\n this.dts = dts;\n this.pts = pts;\n this.duration = duration;\n this.originalDts = originalDts;\n this.isSyncPoint = isSync;\n this.fileposition = null;\n }\n\n}\n\n// Media Segment concept is defined in Media Source Extensions spec.\n// Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box.\nexport class MediaSegmentInfo {\n\n constructor() {\n this.beginDts = 0;\n this.endDts = 0;\n this.beginPts = 0;\n this.endPts = 0;\n this.originalBeginDts = 0;\n this.originalEndDts = 0;\n this.syncPoints = []; // SampleInfo[n], for video IDR frames only\n this.firstSample = null; // SampleInfo\n this.lastSample = null; // SampleInfo\n }\n\n appendSyncPoint(sampleInfo) { // also called Random Access Point\n sampleInfo.isSyncPoint = true;\n this.syncPoints.push(sampleInfo);\n }\n\n}\n\n// Ordered list for recording video IDR frames, sorted by originalDts\nexport class IDRSampleList {\n\n constructor() {\n this._list = [];\n }\n\n clear() {\n this._list = [];\n }\n\n appendArray(syncPoints) {\n let list = this._list;\n\n if (syncPoints.length === 0) {\n return;\n }\n\n if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) {\n this.clear();\n }\n\n Array.prototype.push.apply(list, syncPoints);\n }\n\n getLastSyncPointBeforeDts(dts) {\n if (this._list.length == 0) {\n return null;\n }\n\n let list = this._list;\n let idx = 0;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (dts < list[0].dts) {\n idx = 0;\n lbound = ubound + 1;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (dts >= list[mid].dts && dts < list[mid + 1].dts)) {\n idx = mid;\n break;\n } else if (list[mid].dts < dts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return this._list[idx];\n }\n\n}\n\n// Data structure for recording information of media segments in single track.\nexport class MediaSegmentInfoList {\n\n constructor(type) {\n this._type = type;\n this._list = [];\n this._lastAppendLocation = -1; // cached last insert location\n }\n\n get type() {\n return this._type;\n }\n\n get length() {\n return this._list.length;\n }\n\n isEmpty() {\n return this._list.length === 0;\n }\n\n clear() {\n this._list = [];\n this._lastAppendLocation = -1;\n }\n\n _searchNearestSegmentBefore(originalBeginDts) {\n let list = this._list;\n if (list.length === 0) {\n return -2;\n }\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n let idx = 0;\n\n if (originalBeginDts < list[0].originalBeginDts) {\n idx = -1;\n return idx;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (originalBeginDts > list[mid].lastSample.originalDts &&\n (originalBeginDts < list[mid + 1].originalBeginDts))) {\n idx = mid;\n break;\n } else if (list[mid].originalBeginDts < originalBeginDts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return idx;\n }\n\n _searchNearestSegmentAfter(originalBeginDts) {\n return this._searchNearestSegmentBefore(originalBeginDts) + 1;\n }\n\n append(mediaSegmentInfo) {\n let list = this._list;\n let msi = mediaSegmentInfo;\n let lastAppendIdx = this._lastAppendLocation;\n let insertIdx = 0;\n\n if (lastAppendIdx !== -1 && lastAppendIdx < list.length &&\n msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts &&\n ((lastAppendIdx === list.length - 1) ||\n (lastAppendIdx < list.length - 1 &&\n msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts))) {\n insertIdx = lastAppendIdx + 1; // use cached location idx\n } else {\n if (list.length > 0) {\n insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1;\n }\n }\n\n this._lastAppendLocation = insertIdx;\n this._list.splice(insertIdx, 0, msi);\n }\n\n getLastSegmentBefore(originalBeginDts) {\n let idx = this._searchNearestSegmentBefore(originalBeginDts);\n if (idx >= 0) {\n return this._list[idx];\n } else { // -1\n return null;\n }\n }\n\n getLastSampleBefore(originalBeginDts) {\n let segment = this.getLastSegmentBefore(originalBeginDts);\n if (segment != null) {\n return segment.lastSample;\n } else {\n return null;\n }\n }\n\n getLastSyncPointBefore(originalBeginDts) {\n let segmentIdx = this._searchNearestSegmentBefore(originalBeginDts);\n let syncPoints = this._list[segmentIdx].syncPoints;\n while (syncPoints.length === 0 && segmentIdx > 0) {\n segmentIdx--;\n syncPoints = this._list[segmentIdx].syncPoints;\n }\n if (syncPoints.length > 0) {\n return syncPoints[syncPoints.length - 1];\n } else {\n return null;\n }\n }\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction checkContinuation(uint8array, start, checkLength) {\n let array = uint8array;\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80)\n return false;\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction decodeUTF8(uint8array) {\n let out = [];\n let input = uint8array;\n let i = 0;\n let length = uint8array.length;\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]));\n ++i;\n continue;\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (checkContinuation(input, i, 1)) {\n let ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F);\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 2;\n continue;\n }\n }\n } else if (input[i] < 0xF0) {\n if (checkContinuation(input, i, 2)) {\n let ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 3;\n continue;\n }\n }\n } else if (input[i] < 0xF8) {\n if (checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12\n | (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F);\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000;\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800));\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00));\n i += 4;\n continue;\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD));\n ++i;\n }\n\n return out.join('');\n}\n\nexport default decodeUTF8;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport decodeUTF8 from '../utils/utf8-conv.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nlet le = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n})();\n\nclass AMF {\n\n static parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let data = {};\n\n try {\n let name = AMF.parseValue(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n\n data[name.data] = value.data;\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return data;\n }\n\n static parseObject(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 3) {\n throw new IllegalStateException('Data not enough when parse ScriptDataObject');\n }\n let name = AMF.parseString(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n let isObjectEnd = value.objectEnd;\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n objectEnd: isObjectEnd\n };\n }\n\n static parseVariable(arrayBuffer, dataOffset, dataSize) {\n return AMF.parseObject(arrayBuffer, dataOffset, dataSize);\n }\n\n static parseString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 2) {\n throw new IllegalStateException('Data not enough when parse String');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint16(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 2, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 2 + length\n };\n }\n\n static parseLongString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 4) {\n throw new IllegalStateException('Data not enough when parse LongString');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint32(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 4, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 4 + length\n };\n }\n\n static parseDate(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 10) {\n throw new IllegalStateException('Data size invalid when parse Date');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let timestamp = v.getFloat64(0, !le);\n let localTimeOffset = v.getInt16(8, !le);\n timestamp += localTimeOffset * 60 * 1000; // get UTC time\n\n return {\n data: new Date(timestamp),\n size: 8 + 2\n };\n }\n\n static parseValue(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 1) {\n throw new IllegalStateException('Data not enough when parse Value');\n }\n\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let offset = 1;\n let type = v.getUint8(0);\n let value;\n let objectEnd = false;\n\n try {\n switch (type) {\n case 0: // Number(Double) type\n value = v.getFloat64(1, !le);\n offset += 8;\n break;\n case 1: { // Boolean type\n let b = v.getUint8(1);\n value = b ? true : false;\n offset += 1;\n break;\n }\n case 2: { // String type\n let amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfstr.data;\n offset += amfstr.size;\n break;\n }\n case 3: { // Object(s) type\n value = {};\n let terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n let amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfobj.objectEnd)\n break;\n value[amfobj.data.name] = amfobj.data.value;\n offset += amfobj.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 8: { // ECMA array type (Mixed array)\n value = {};\n offset += 4; // ECMAArrayLength(UI32)\n let terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n let amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfvar.objectEnd)\n break;\n value[amfvar.data.name] = amfvar.data.value;\n offset += amfvar.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 9: // ScriptDataObjectEnd\n value = undefined;\n offset = 1;\n objectEnd = true;\n break;\n case 10: { // Strict array type\n // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf\n value = [];\n let strictArrayLength = v.getUint32(1, !le);\n offset += 4;\n for (let i = 0; i < strictArrayLength; i++) {\n let val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset);\n value.push(val.data);\n offset += val.size;\n }\n break;\n }\n case 11: { // Date type\n let date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = date.data;\n offset += date.size;\n break;\n }\n case 12: { // Long string type\n let amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfLongStr.data;\n offset += amfLongStr.size;\n break;\n }\n default:\n // ignore and skip\n offset = dataSize;\n Log.w('AMF', 'Unsupported AMF value type ' + type);\n }\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return {\n data: value,\n size: offset,\n objectEnd: objectEnd\n };\n }\n\n}\n\nexport default AMF;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n\n constructor(uint8array) {\n this.TAG = 'ExpGolomb';\n\n this._buffer = uint8array;\n this._buffer_index = 0;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n this._current_word = 0;\n this._current_word_bits_left = 0;\n }\n\n destroy() {\n this._buffer = null;\n }\n\n _fillCurrentWord() {\n let buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0)\n throw new IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');\n\n let bytes_read = Math.min(4, buffer_bytes_left);\n let word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32)\n throw new InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');\n\n if (bits <= this._current_word_bits_left) {\n let result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n let bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);\n\n let result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() { // unsigned exponential golomb\n let leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() { // signed exponential golomb\n let value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n\n}\n\nexport default ExpGolomb;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass SPSParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n static parseSPS(uint8array) {\n let rbsp = SPSParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n gb.readByte();\n let profile_idc = gb.readByte(); // profile_idc\n gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]\n let level_idc = gb.readByte(); // level_idc\n gb.readUEG(); // seq_parameter_set_id\n\n let profile_string = SPSParser.getProfileString(profile_idc);\n let level_string = SPSParser.getLevelString(level_idc);\n let chroma_format_idc = 1;\n let chroma_format = 420;\n let chroma_format_table = [0, 420, 422, 444];\n let bit_depth = 8;\n\n if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||\n profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||\n profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||\n profile_idc === 138 || profile_idc === 144) {\n\n chroma_format_idc = gb.readUEG();\n if (chroma_format_idc === 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8\n gb.readUEG(); // bit_depth_chroma_minus8\n gb.readBits(1); // qpprime_y_zero_transform_bypass_flag\n if (gb.readBool()) { // seq_scaling_matrix_present_flag\n let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;\n for (let i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) { // seq_scaling_list_present_flag\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n gb.readUEG(); // log2_max_frame_num_minus4\n let pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1); // delta_pic_order_always_zero_flag\n gb.readSEG(); // offset_for_non_ref_pic\n gb.readSEG(); // offset_for_top_to_bottom_field\n let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n gb.readSEG(); // offset_for_ref_frame\n }\n }\n let ref_frames = gb.readUEG(); // max_num_ref_frames\n gb.readBits(1); // gaps_in_frame_num_value_allowed_flag\n\n let pic_width_in_mbs_minus1 = gb.readUEG();\n let pic_height_in_map_units_minus1 = gb.readUEG();\n\n let frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n gb.readBits(1); // mb_adaptive_frame_field_flag\n }\n gb.readBits(1); // direct_8x8_inference_flag\n\n let frame_crop_left_offset = 0;\n let frame_crop_right_offset = 0;\n let frame_crop_top_offset = 0;\n let frame_crop_bottom_offset = 0;\n\n let frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n let sar_width = 1, sar_height = 1;\n let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;\n\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) { // aspect_ratio_info_present_flag\n let aspect_ratio_idc = gb.readByte();\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readByte() << 8 | gb.readByte();\n sar_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) { // overscan_info_present_flag\n gb.readBool(); // overscan_appropriate_flag\n }\n if (gb.readBool()) { // video_signal_type_present_flag\n gb.readBits(4); // video_format & video_full_range_flag\n if (gb.readBool()) { // colour_description_present_flag\n gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients\n }\n }\n if (gb.readBool()) { // chroma_loc_info_present_flag\n gb.readUEG(); // chroma_sample_loc_type_top_field\n gb.readUEG(); // chroma_sample_loc_type_bottom_field\n }\n if (gb.readBool()) { // timing_info_present_flag\n let num_units_in_tick = gb.readBits(32);\n let time_scale = gb.readBits(32);\n fps_fixed = gb.readBool(); // fixed_frame_rate_flag\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n let sarScale = 1;\n if (sar_width !== 1 || sar_height !== 1) {\n sarScale = sar_width / sar_height;\n }\n\n let crop_unit_x = 0, crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n let sub_wc = (chroma_format_idc === 3) ? 1 : 2;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n let present_width = Math.ceil(codec_width * sarScale);\n\n gb.destroy();\n gb = null;\n\n return {\n profile_string: profile_string, // baseline, high, high10, ...\n level_string: level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n bit_depth: bit_depth, // 8bit, 10bit, ...\n ref_frames: ref_frames,\n chroma_format: chroma_format, // 4:2:0, 4:2:2, ...\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n\n static _skipScalingList(gb, count) {\n let last_scale = 8, next_scale = 8;\n let delta_scale = 0;\n for (let i = 0; i < count; i++) {\n if (next_scale !== 0) {\n delta_scale = gb.readSEG();\n next_scale = (last_scale + delta_scale + 256) % 256;\n }\n last_scale = (next_scale === 0) ? last_scale : next_scale;\n }\n }\n\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 10).toFixed(1);\n }\n\n static getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n}\n\nexport default SPSParser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport AMF from './amf-parser.js';\nimport SPSParser from './sps-parser.js';\nimport DemuxErrors from './demux-errors.js';\nimport MediaInfo from '../core/media-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nfunction Swap16(src) {\n return (((src >>> 8) & 0xFF) |\n ((src & 0xFF) << 8));\n}\n\nfunction Swap32(src) {\n return (((src & 0xFF000000) >>> 24) |\n ((src & 0x00FF0000) >>> 8) |\n ((src & 0x0000FF00) << 8) |\n ((src & 0x000000FF) << 24));\n}\n\nfunction ReadBig32(array, index) {\n return ((array[index] << 24) |\n (array[index + 1] << 16) |\n (array[index + 2] << 8) |\n (array[index + 3]));\n}\n\n\nclass FLVDemuxer {\n\n constructor(probeData, config) {\n this.TAG = 'FLVDemuxer';\n\n this._config = config;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n\n this._dataOffset = probeData.dataOffset;\n this._firstParse = true;\n this._dispatch = false;\n\n this._hasAudio = probeData.hasAudioTrack;\n this._hasVideo = probeData.hasVideoTrack;\n\n this._hasAudioFlagOverrided = false;\n this._hasVideoFlagOverrided = false;\n\n this._audioInitialMetadataDispatched = false;\n this._videoInitialMetadataDispatched = false;\n\n this._mediaInfo = new MediaInfo();\n this._mediaInfo.hasAudio = this._hasAudio;\n this._mediaInfo.hasVideo = this._hasVideo;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n\n this._naluLengthSize = 4;\n this._timestampBase = 0; // int32, in milliseconds\n this._timescale = 1000;\n this._duration = 0; // int32, in milliseconds\n this._durationOverrided = false;\n this._referenceFrameRate = {\n fixed: true,\n fps: 23.976,\n fps_num: 23976,\n fps_den: 1000\n };\n\n this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000];\n\n this._mpegSamplingRates = [\n 96000, 88200, 64000, 48000, 44100, 32000,\n 24000, 22050, 16000, 12000, 11025, 8000, 7350\n ];\n\n this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];\n this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];\n this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];\n\n this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];\n this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];\n this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];\n\n this._videoTrack = {type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0};\n this._audioTrack = {type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0};\n\n this._littleEndian = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n })();\n }\n\n destroy() {\n this._mediaInfo = null;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n this._videoTrack = null;\n this._audioTrack = null;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n }\n\n static probe(buffer) {\n let data = new Uint8Array(buffer);\n let mismatch = {match: false};\n\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return mismatch;\n }\n\n let hasAudio = ((data[4] & 4) >>> 2) !== 0;\n let hasVideo = (data[4] & 1) !== 0;\n\n let offset = ReadBig32(data, 5);\n\n if (offset < 9) {\n return mismatch;\n }\n\n return {\n match: true,\n consumed: offset,\n dataOffset: offset,\n hasAudioTrack: hasAudio,\n hasVideoTrack: hasVideo\n };\n }\n\n bindDataSource(loader) {\n loader.onDataArrival = this.parseChunks.bind(this);\n return this;\n }\n\n // prototype: function(type: string, metadata: any): void\n get onTrackMetadata() {\n return this._onTrackMetadata;\n }\n\n set onTrackMetadata(callback) {\n this._onTrackMetadata = callback;\n }\n\n // prototype: function(mediaInfo: MediaInfo): void\n get onMediaInfo() {\n return this._onMediaInfo;\n }\n\n set onMediaInfo(callback) {\n this._onMediaInfo = callback;\n }\n\n get onMetaDataArrived() {\n return this._onMetaDataArrived;\n }\n\n set onMetaDataArrived(callback) {\n this._onMetaDataArrived = callback;\n }\n\n get onScriptDataArrived() {\n return this._onScriptDataArrived;\n }\n\n set onScriptDataArrived(callback) {\n this._onScriptDataArrived = callback;\n }\n\n // prototype: function(type: number, info: string): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n // prototype: function(videoTrack: any, audioTrack: any): void\n get onDataAvailable() {\n return this._onDataAvailable;\n }\n\n set onDataAvailable(callback) {\n this._onDataAvailable = callback;\n }\n\n // timestamp base for output samples, must be in milliseconds\n get timestampBase() {\n return this._timestampBase;\n }\n\n set timestampBase(base) {\n this._timestampBase = base;\n }\n\n get overridedDuration() {\n return this._duration;\n }\n\n // Force-override media duration. Must be in milliseconds, int32\n set overridedDuration(duration) {\n this._durationOverrided = true;\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n\n // Force-override audio track present flag, boolean\n set overridedHasAudio(hasAudio) {\n this._hasAudioFlagOverrided = true;\n this._hasAudio = hasAudio;\n this._mediaInfo.hasAudio = hasAudio;\n }\n\n // Force-override video track present flag, boolean\n set overridedHasVideo(hasVideo) {\n this._hasVideoFlagOverrided = true;\n this._hasVideo = hasVideo;\n this._mediaInfo.hasVideo = hasVideo;\n }\n\n resetMediaInfo() {\n this._mediaInfo = new MediaInfo();\n }\n\n _isInitialMetadataDispatched() {\n if (this._hasAudio && this._hasVideo) { // both audio & video\n return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched;\n }\n if (this._hasAudio && !this._hasVideo) { // audio only\n return this._audioInitialMetadataDispatched;\n }\n if (!this._hasAudio && this._hasVideo) { // video only\n return this._videoInitialMetadataDispatched;\n }\n return false;\n }\n\n // function parseChunks(chunk: ArrayBuffer, byteStart: number): number;\n parseChunks(chunk, byteStart) {\n if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) {\n throw new IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');\n }\n\n let offset = 0;\n let le = this._littleEndian;\n\n if (byteStart === 0) { // buffer with FLV header\n if (chunk.byteLength > 13) {\n let probeData = FLVDemuxer.probe(chunk);\n offset = probeData.dataOffset;\n } else {\n return 0;\n }\n }\n\n if (this._firstParse) { // handle PreviousTagSize0 before Tag1\n this._firstParse = false;\n if (byteStart + offset !== this._dataOffset) {\n Log.w(this.TAG, 'First time parsing but chunk byteStart invalid!');\n }\n\n let v = new DataView(chunk, offset);\n let prevTagSize0 = v.getUint32(0, !le);\n if (prevTagSize0 !== 0) {\n Log.w(this.TAG, 'PrevTagSize0 !== 0 !!!');\n }\n offset += 4;\n }\n\n while (offset < chunk.byteLength) {\n this._dispatch = true;\n\n let v = new DataView(chunk, offset);\n\n if (offset + 11 + 4 > chunk.byteLength) {\n // data not enough for parsing an flv tag\n break;\n }\n\n let tagType = v.getUint8(0);\n let dataSize = v.getUint32(0, !le) & 0x00FFFFFF;\n\n if (offset + 11 + dataSize + 4 > chunk.byteLength) {\n // data not enough for parsing actual data body\n break;\n }\n\n if (tagType !== 8 && tagType !== 9 && tagType !== 18) {\n Log.w(this.TAG, `Unsupported tag type ${tagType}, skipped`);\n // consume the whole tag (skip it)\n offset += 11 + dataSize + 4;\n continue;\n }\n\n let ts2 = v.getUint8(4);\n let ts1 = v.getUint8(5);\n let ts0 = v.getUint8(6);\n let ts3 = v.getUint8(7);\n\n let timestamp = ts0 | (ts1 << 8) | (ts2 << 16) | (ts3 << 24);\n\n let streamId = v.getUint32(7, !le) & 0x00FFFFFF;\n if (streamId !== 0) {\n Log.w(this.TAG, 'Meet tag which has StreamID != 0!');\n }\n\n let dataOffset = offset + 11;\n\n switch (tagType) {\n case 8: // Audio\n this._parseAudioData(chunk, dataOffset, dataSize, timestamp);\n break;\n case 9: // Video\n this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset);\n break;\n case 18: // ScriptDataObject\n this._parseScriptData(chunk, dataOffset, dataSize);\n break;\n }\n\n let prevTagSize = v.getUint32(11 + dataSize, !le);\n if (prevTagSize !== 11 + dataSize) {\n Log.w(this.TAG, `Invalid PrevTagSize ${prevTagSize}`);\n }\n\n offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize\n }\n\n // dispatch parsed frames to consumer (typically, the remuxer)\n if (this._isInitialMetadataDispatched()) {\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n }\n\n return offset; // consumed bytes, just equals latest offset index\n }\n\n _parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let scriptData = AMF.parseScriptData(arrayBuffer, dataOffset, dataSize);\n\n if (scriptData.hasOwnProperty('onMetaData')) {\n if (scriptData.onMetaData == null || typeof scriptData.onMetaData !== 'object') {\n Log.w(this.TAG, 'Invalid onMetaData structure!');\n return;\n }\n if (this._metadata) {\n Log.w(this.TAG, 'Found another onMetaData tag!');\n }\n this._metadata = scriptData;\n let onMetaData = this._metadata.onMetaData;\n\n if (this._onMetaDataArrived) {\n this._onMetaDataArrived(Object.assign({}, onMetaData));\n }\n\n if (typeof onMetaData.hasAudio === 'boolean') { // hasAudio\n if (this._hasAudioFlagOverrided === false) {\n this._hasAudio = onMetaData.hasAudio;\n this._mediaInfo.hasAudio = this._hasAudio;\n }\n }\n if (typeof onMetaData.hasVideo === 'boolean') { // hasVideo\n if (this._hasVideoFlagOverrided === false) {\n this._hasVideo = onMetaData.hasVideo;\n this._mediaInfo.hasVideo = this._hasVideo;\n }\n }\n if (typeof onMetaData.audiodatarate === 'number') { // audiodatarate\n this._mediaInfo.audioDataRate = onMetaData.audiodatarate;\n }\n if (typeof onMetaData.videodatarate === 'number') { // videodatarate\n this._mediaInfo.videoDataRate = onMetaData.videodatarate;\n }\n if (typeof onMetaData.width === 'number') { // width\n this._mediaInfo.width = onMetaData.width;\n }\n if (typeof onMetaData.height === 'number') { // height\n this._mediaInfo.height = onMetaData.height;\n }\n if (typeof onMetaData.duration === 'number') { // duration\n if (!this._durationOverrided) {\n let duration = Math.floor(onMetaData.duration * this._timescale);\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n } else {\n this._mediaInfo.duration = 0;\n }\n if (typeof onMetaData.framerate === 'number') { // framerate\n let fps_num = Math.floor(onMetaData.framerate * 1000);\n if (fps_num > 0) {\n let fps = fps_num / 1000;\n this._referenceFrameRate.fixed = true;\n this._referenceFrameRate.fps = fps;\n this._referenceFrameRate.fps_num = fps_num;\n this._referenceFrameRate.fps_den = 1000;\n this._mediaInfo.fps = fps;\n }\n }\n if (typeof onMetaData.keyframes === 'object') { // keyframes\n this._mediaInfo.hasKeyframesIndex = true;\n let keyframes = onMetaData.keyframes;\n this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes);\n onMetaData.keyframes = null; // keyframes has been extracted, remove it\n } else {\n this._mediaInfo.hasKeyframesIndex = false;\n }\n this._dispatch = false;\n this._mediaInfo.metadata = onMetaData;\n Log.v(this.TAG, 'Parsed onMetaData');\n if (this._mediaInfo.isComplete()) {\n this._onMediaInfo(this._mediaInfo);\n }\n }\n\n if (Object.keys(scriptData).length > 0) {\n if (this._onScriptDataArrived) {\n this._onScriptDataArrived(Object.assign({}, scriptData));\n }\n }\n }\n\n _parseKeyframesIndex(keyframes) {\n let times = [];\n let filepositions = [];\n\n // ignore first keyframe which is actually AVC Sequence Header (AVCDecoderConfigurationRecord)\n for (let i = 1; i < keyframes.times.length; i++) {\n let time = this._timestampBase + Math.floor(keyframes.times[i] * 1000);\n times.push(time);\n filepositions.push(keyframes.filepositions[i]);\n }\n\n return {\n times: times,\n filepositions: filepositions\n };\n }\n\n _parseAudioData(arrayBuffer, dataOffset, dataSize, tagTimestamp) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!');\n return;\n }\n\n if (this._hasAudioFlagOverrided === true && this._hasAudio === false) {\n // If hasAudio: false indicated explicitly in MediaDataSource,\n // Ignore all the audio packets\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let soundSpec = v.getUint8(0);\n\n let soundFormat = soundSpec >>> 4;\n if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);\n return;\n }\n\n let soundRate = 0;\n let soundRateIndex = (soundSpec & 12) >>> 2;\n if (soundRateIndex >= 0 && soundRateIndex <= 4) {\n soundRate = this._flvSoundRateTable[soundRateIndex];\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex);\n return;\n }\n\n let soundSize = (soundSpec & 2) >>> 1; // unused\n let soundType = (soundSpec & 1);\n\n\n let meta = this._audioMetadata;\n let track = this._audioTrack;\n\n if (!meta) {\n if (this._hasAudio === false && this._hasAudioFlagOverrided === false) {\n this._hasAudio = true;\n this._mediaInfo.hasAudio = true;\n }\n\n // initial metadata\n meta = this._audioMetadata = {};\n meta.type = 'audio';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n meta.audioSampleRate = soundRate;\n meta.channelCount = (soundType === 0 ? 1 : 2);\n }\n\n if (soundFormat === 10) { // AAC\n let aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1);\n if (aacData == undefined) {\n return;\n }\n\n if (aacData.packetType === 0) { // AAC sequence header (AudioSpecificConfig)\n if (meta.config) {\n Log.w(this.TAG, 'Found another AudioSpecificConfig!');\n }\n let misc = aacData.data;\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n meta.config = misc.config;\n // The decode result of an aac sample is 1024 PCM samples\n meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed AudioSpecificConfig');\n\n if (this._isInitialMetadataDispatched()) {\n // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._audioInitialMetadataDispatched = true;\n }\n // then notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.originalCodec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n } else if (aacData.packetType === 1) { // AAC raw frame data\n let dts = this._timestampBase + tagTimestamp;\n let aacSample = {unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts};\n track.samples.push(aacSample);\n track.length += aacData.data.length;\n } else {\n Log.e(this.TAG, `Flv: Unsupported AAC data type ${aacData.packetType}`);\n }\n } else if (soundFormat === 2) { // MP3\n if (!meta.codec) {\n // We need metadata for mp3 audio track, extract info from frame header\n let misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true);\n if (misc == undefined) {\n return;\n }\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n // The decode result of an mp3 sample is 1152 PCM samples\n meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed MPEG Audio Frame Header');\n\n this._audioInitialMetadataDispatched = true;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.codec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n mi.audioDataRate = misc.bitRate;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n // This packet is always a valid audio packet, extract it\n let data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false);\n if (data == undefined) {\n return;\n }\n let dts = this._timestampBase + tagTimestamp;\n let mp3Sample = {unit: data, length: data.byteLength, dts: dts, pts: dts};\n track.samples.push(mp3Sample);\n track.length += data.length;\n }\n }\n\n _parseAACAudioData(arrayBuffer, dataOffset, dataSize) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!');\n return;\n }\n\n let result = {};\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n\n result.packetType = array[0];\n\n if (array[0] === 0) {\n result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1);\n } else {\n result.data = array.subarray(1);\n }\n\n return result;\n }\n\n _parseAACAudioSpecificConfig(arrayBuffer, dataOffset, dataSize) {\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let config = null;\n\n /* Audio Object Type:\n 0: Null\n 1: AAC Main\n 2: AAC LC\n 3: AAC SSR (Scalable Sample Rate)\n 4: AAC LTP (Long Term Prediction)\n 5: HE-AAC / SBR (Spectral Band Replication)\n 6: AAC Scalable\n */\n\n let audioObjectType = 0;\n let originalAudioObjectType = 0;\n let audioExtensionObjectType = null;\n let samplingIndex = 0;\n let extensionSamplingIndex = null;\n\n // 5 bits\n audioObjectType = originalAudioObjectType = array[0] >>> 3;\n // 4 bits\n samplingIndex = ((array[0] & 0x07) << 1) | (array[1] >>> 7);\n if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!');\n return;\n }\n\n let samplingFrequence = this._mpegSamplingRates[samplingIndex];\n\n // 4 bits\n let channelConfig = (array[1] & 0x78) >>> 3;\n if (channelConfig < 0 || channelConfig >= 8) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid channel configuration');\n return;\n }\n\n if (audioObjectType === 5) { // HE-AAC?\n // 4 bits\n extensionSamplingIndex = ((array[1] & 0x07) << 1) | (array[2] >>> 7);\n // 5 bits\n audioExtensionObjectType = (array[2] & 0x7C) >>> 2;\n }\n\n // workarounds for various browsers\n let userAgent = self.navigator.userAgent.toLowerCase();\n\n if (userAgent.indexOf('firefox') !== -1) {\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (samplingIndex >= 6) {\n audioObjectType = 5;\n config = new Array(4);\n extensionSamplingIndex = samplingIndex - 3;\n } else { // use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n } else if (userAgent.indexOf('android') !== -1) {\n // android: always use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n audioObjectType = 5;\n extensionSamplingIndex = samplingIndex;\n config = new Array(4);\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3;\n } else if (channelConfig === 1) { // Mono channel\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n }\n\n config[0] = audioObjectType << 3;\n config[0] |= (samplingIndex & 0x0F) >>> 1;\n config[1] = (samplingIndex & 0x0F) << 7;\n config[1] |= (channelConfig & 0x0F) << 3;\n if (audioObjectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0F) >>> 1);\n config[2] = (extensionSamplingIndex & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= (2 << 2);\n config[3] = 0;\n }\n\n return {\n config: config,\n samplingRate: samplingFrequence,\n channelCount: channelConfig,\n codec: 'mp4a.40.' + audioObjectType,\n originalCodec: 'mp4a.40.' + originalAudioObjectType\n };\n }\n\n _parseMP3AudioData(arrayBuffer, dataOffset, dataSize, requestHeader) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!');\n return;\n }\n\n let le = this._littleEndian;\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let result = null;\n\n if (requestHeader) {\n if (array[0] !== 0xFF) {\n return;\n }\n let ver = (array[1] >>> 3) & 0x03;\n let layer = (array[1] & 0x06) >> 1;\n\n let bitrate_index = (array[2] & 0xF0) >>> 4;\n let sampling_freq_index = (array[2] & 0x0C) >>> 2;\n\n let channel_mode = (array[3] >>> 6) & 0x03;\n let channel_count = channel_mode !== 3 ? 2 : 1;\n\n let sample_rate = 0;\n let bit_rate = 0;\n let object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types\n\n let codec = 'mp3';\n\n switch (ver) {\n case 0: // MPEG 2.5\n sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index];\n break;\n case 2: // MPEG 2\n sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index];\n break;\n case 3: // MPEG 1\n sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index];\n break;\n }\n\n switch (layer) {\n case 1: // Layer 3\n object_type = 34;\n if (bitrate_index < this._mpegAudioL3BitRateTable.length) {\n bit_rate = this._mpegAudioL3BitRateTable[bitrate_index];\n }\n break;\n case 2: // Layer 2\n object_type = 33;\n if (bitrate_index < this._mpegAudioL2BitRateTable.length) {\n bit_rate = this._mpegAudioL2BitRateTable[bitrate_index];\n }\n break;\n case 3: // Layer 1\n object_type = 32;\n if (bitrate_index < this._mpegAudioL1BitRateTable.length) {\n bit_rate = this._mpegAudioL1BitRateTable[bitrate_index];\n }\n break;\n }\n\n result = {\n bitRate: bit_rate,\n samplingRate: sample_rate,\n channelCount: channel_count,\n codec: codec,\n originalCodec: codec\n };\n } else {\n result = array;\n }\n\n return result;\n }\n\n _parseVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!');\n return;\n }\n\n if (this._hasVideoFlagOverrided === true && this._hasVideo === false) {\n // If hasVideo: false indicated explicitly in MediaDataSource,\n // Ignore all the video packets\n return;\n }\n\n let spec = (new Uint8Array(arrayBuffer, dataOffset, dataSize))[0];\n\n let frameType = (spec & 240) >>> 4;\n let codecId = spec & 15;\n\n if (codecId !== 7) {\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, `Flv: Unsupported codec in video frame: ${codecId}`);\n return;\n }\n\n this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\n }\n\n _parseAVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let packetType = v.getUint8(0);\n let cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;\n let cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int\n\n if (packetType === 0) { // AVCDecoderConfigurationRecord\n this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);\n } else if (packetType === 1) { // One or more Nalus\n this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 2) {\n // empty, AVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 7) {\n Log.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!');\n return;\n }\n\n let meta = this._videoMetadata;\n let track = this._videoTrack;\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (!meta) {\n if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {\n this._hasVideo = true;\n this._mediaInfo.hasVideo = true;\n }\n\n meta = this._videoMetadata = {};\n meta.type = 'video';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n } else {\n if (typeof meta.avcc !== 'undefined') {\n Log.w(this.TAG, 'Found another AVCDecoderConfigurationRecord!');\n }\n }\n\n let version = v.getUint8(0); // configurationVersion\n let avcProfile = v.getUint8(1); // avcProfileIndication\n let profileCompatibility = v.getUint8(2); // profile_compatibility\n let avcLevel = v.getUint8(3); // AVCLevelIndication\n\n if (version !== 1 || avcProfile === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');\n return;\n }\n\n this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne\n if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${this._naluLengthSize - 1}`);\n return;\n }\n\n let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets\n if (spsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');\n return;\n } else if (spsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ${spsCount}`);\n }\n\n let offset = 6;\n\n for (let i = 0; i < spsCount; i++) {\n let len = v.getUint16(offset, !le); // sequenceParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // Notice: Nalu without startcode header (00 00 00 01)\n let sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);\n offset += len;\n\n let config = SPSParser.parseSPS(sps);\n if (i !== 0) {\n // ignore other sps's config\n continue;\n }\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = this._referenceFrameRate;\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n\n let codecArray = sps.subarray(1, 4);\n let codecString = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n meta.codec = codecString;\n\n let mi = this._mediaInfo;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = config.ref_frames;\n mi.chromaFormat = config.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = codecString;\n\n if (mi.hasAudio) {\n if (mi.audioCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n let ppsCount = v.getUint8(offset); // numOfPictureParameterSets\n if (ppsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');\n return;\n } else if (ppsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ${ppsCount}`);\n }\n\n offset++;\n\n for (let i = 0; i < ppsCount; i++) {\n let len = v.getUint16(offset, !le); // pictureParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // pps is useless for extracting video information\n offset += len;\n }\n\n meta.avcc = new Uint8Array(dataSize);\n meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);\n Log.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord');\n\n if (this._isInitialMetadataDispatched()) {\n // flush parsed frames\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._videoInitialMetadataDispatched = true;\n }\n // notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('video', meta);\n }\n\n _parseAVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let units = [], length = 0;\n\n let offset = 0;\n const lengthSize = this._naluLengthSize;\n let dts = this._timestampBase + tagTimestamp;\n let keyframe = (frameType === 1); // from FLV Frame Type constants\n\n while (offset < dataSize) {\n if (offset + 4 >= dataSize) {\n Log.w(this.TAG, `Malformed Nalu near timestamp ${dts}, offset = ${offset}, dataSize = ${dataSize}`);\n break; // data not enough for next Nalu\n }\n // Nalu with length-header (AVC1)\n let naluSize = v.getUint32(offset, !le); // Big-Endian read\n if (lengthSize === 3) {\n naluSize >>>= 8;\n }\n if (naluSize > dataSize - lengthSize) {\n Log.w(this.TAG, `Malformed Nalus near timestamp ${dts}, NaluSize > DataSize!`);\n return;\n }\n\n let unitType = v.getUint8(offset + lengthSize) & 0x1F;\n\n if (unitType === 5) { // IDR\n keyframe = true;\n }\n\n let data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);\n let unit = {type: unitType, data: data};\n units.push(unit);\n length += data.byteLength;\n\n offset += lengthSize + naluSize;\n }\n\n if (units.length) {\n let track = this._videoTrack;\n let avcSample = {\n units: units,\n length: length,\n isKeyframe: keyframe,\n dts: dts,\n cts: cts,\n pts: (dts + cts)\n };\n if (keyframe) {\n avcSample.fileposition = tagPosition;\n }\n track.samples.push(avcSample);\n track.length += length;\n }\n }\n\n}\n\nexport default FLVDemuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12)\nclass MP4 {\n\n static init() {\n MP4.types = {\n avc1: [], avcC: [], btrt: [], dinf: [],\n dref: [], esds: [], ftyp: [], hdlr: [],\n mdat: [], mdhd: [], mdia: [], mfhd: [],\n minf: [], moof: [], moov: [], mp4a: [],\n mvex: [], mvhd: [], sdtp: [], stbl: [],\n stco: [], stsc: [], stsd: [], stsz: [],\n stts: [], tfdt: [], tfhd: [], traf: [],\n trak: [], trun: [], trex: [], tkhd: [],\n vmhd: [], smhd: [], '.mp3': []\n };\n\n for (let name in MP4.types) {\n if (MP4.types.hasOwnProperty(name)) {\n MP4.types[name] = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ];\n }\n }\n\n let constants = MP4.constants = {};\n\n constants.FTYP = new Uint8Array([\n 0x69, 0x73, 0x6F, 0x6D, // major_brand: isom\n 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]);\n\n constants.STSD_PREFIX = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]);\n\n constants.STTS = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n constants.STSC = constants.STCO = constants.STTS;\n\n constants.STSZ = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n constants.HDLR_VIDEO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x56, 0x69, 0x64, 0x65,\n 0x6F, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler\n ]);\n\n constants.HDLR_AUDIO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x53, 0x6F, 0x75, 0x6E,\n 0x64, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler\n ]);\n\n constants.DREF = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0C, // entry_size\n 0x75, 0x72, 0x6C, 0x20, // type 'url '\n 0x00, 0x00, 0x00, 0x01 // version(0) + flags\n ]);\n\n // Sound media header\n constants.SMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)\n ]);\n\n // video media header\n constants.VMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x01, // version(0) + flags\n 0x00, 0x00, // graphicsmode: 2 bytes\n 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes\n 0x00, 0x00\n ]);\n }\n\n // Generate a box\n static box(type) {\n let size = 8;\n let result = null;\n let datas = Array.prototype.slice.call(arguments, 1);\n let arrayCount = datas.length;\n\n for (let i = 0; i < arrayCount; i++) {\n size += datas[i].byteLength;\n }\n\n result = new Uint8Array(size);\n result[0] = (size >>> 24) & 0xFF; // size\n result[1] = (size >>> 16) & 0xFF;\n result[2] = (size >>> 8) & 0xFF;\n result[3] = (size) & 0xFF;\n\n result.set(type, 4); // type\n\n let offset = 8;\n for (let i = 0; i < arrayCount; i++) { // data body\n result.set(datas[i], offset);\n offset += datas[i].byteLength;\n }\n\n return result;\n }\n\n // emit ftyp & moov\n static generateInitSegment(meta) {\n let ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);\n let moov = MP4.moov(meta);\n\n let result = new Uint8Array(ftyp.byteLength + moov.byteLength);\n result.set(ftyp, 0);\n result.set(moov, ftyp.byteLength);\n return result;\n }\n\n // Movie metadata box\n static moov(meta) {\n let mvhd = MP4.mvhd(meta.timescale, meta.duration);\n let trak = MP4.trak(meta);\n let mvex = MP4.mvex(meta);\n return MP4.box(MP4.types.moov, mvhd, trak, mvex);\n }\n\n // Movie header box\n static mvhd(timescale, duration) {\n return MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0\n 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID\n ]));\n }\n\n // Track box\n static trak(meta) {\n return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));\n }\n\n // Track header box\n static tkhd(meta) {\n let trackId = meta.id, duration = meta.duration;\n let width = meta.presentWidth, height = meta.presentHeight;\n\n return MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x07, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (trackId >>> 24) & 0xFF, // track_ID: 4 bytes\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n (width >>> 8) & 0xFF, // width and height\n (width) & 0xFF,\n 0x00, 0x00,\n (height >>> 8) & 0xFF,\n (height) & 0xFF,\n 0x00, 0x00\n ]));\n }\n\n // Media Box\n static mdia(meta) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta));\n }\n\n // Media header box\n static mdhd(meta) {\n let timescale = meta.timescale;\n let duration = meta.duration;\n return MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x55, 0xC4, // language: und (undetermined)\n 0x00, 0x00 // pre_defined = 0\n ]));\n }\n\n // Media handler reference box\n static hdlr(meta) {\n let data = null;\n if (meta.type === 'audio') {\n data = MP4.constants.HDLR_AUDIO;\n } else {\n data = MP4.constants.HDLR_VIDEO;\n }\n return MP4.box(MP4.types.hdlr, data);\n }\n\n // Media infomation box\n static minf(meta) {\n let xmhd = null;\n if (meta.type === 'audio') {\n xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);\n } else {\n xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);\n }\n return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));\n }\n\n // Data infomation box\n static dinf() {\n let result = MP4.box(MP4.types.dinf,\n MP4.box(MP4.types.dref, MP4.constants.DREF)\n );\n return result;\n }\n\n // Sample table box\n static stbl(meta) {\n let result = MP4.box(MP4.types.stbl, // type: stbl\n MP4.stsd(meta), // Sample Description Table\n MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample\n MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk\n MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size\n MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset\n ); \n return result; \n }\n\n // Sample description box\n static stsd(meta) {\n if (meta.type === 'audio') {\n if (meta.codec === 'mp3') {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta));\n }\n // else: aac -> mp4a\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));\n } else {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));\n }\n }\n\n static mp3(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types['.mp3'], data);\n }\n\n static mp4a(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));\n }\n\n static esds(meta) {\n let config = meta.config || [];\n let configSize = config.length;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version 0 + flags\n\n 0x03, // descriptor_type\n 0x17 + configSize, // length3\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0F + configSize, // length\n 0x40, // codec: mpeg4_audio\n 0x15, // stream_type: Audio\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([\n configSize\n ]).concat(\n config\n ).concat([\n 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n return MP4.box(MP4.types.esds, data);\n }\n\n static avc1(meta) {\n let avcc = meta.avcc;\n let width = meta.codecWidth, height = meta.codecHeight;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n (width >>> 8) & 0xFF, // width: 2 bytes\n (width) & 0xFF,\n (height >>> 8) & 0xFF, // height: 2 bytes\n (height) & 0xFF,\n 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes\n 0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n 0x00, 0x01, // frame_count\n 0x0A, // strlen\n 0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes\n 0x66, 0x6C, 0x76, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00,\n 0x00, 0x18, // depth\n 0xFF, 0xFF // pre_defined = -1\n ]);\n return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc));\n }\n\n // Movie Extends box\n static mvex(meta) {\n return MP4.box(MP4.types.mvex, MP4.trex(meta));\n }\n\n // Track Extends box\n static trex(meta) {\n let trackId = meta.id;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return MP4.box(MP4.types.trex, data);\n }\n\n // Movie fragment box\n static moof(track, baseMediaDecodeTime) {\n return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime));\n }\n\n static mfhd(sequenceNumber) {\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n (sequenceNumber >>> 24) & 0xFF, // sequence_number: int32\n (sequenceNumber >>> 16) & 0xFF,\n (sequenceNumber >>> 8) & 0xFF,\n (sequenceNumber) & 0xFF\n ]);\n return MP4.box(MP4.types.mfhd, data);\n }\n\n // Track fragment box\n static traf(track, baseMediaDecodeTime) {\n let trackId = track.id;\n\n // Track fragment header box\n let tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF\n ]));\n // Track Fragment Decode Time\n let tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (baseMediaDecodeTime >>> 24) & 0xFF, // baseMediaDecodeTime: int32\n (baseMediaDecodeTime >>> 16) & 0xFF,\n (baseMediaDecodeTime >>> 8) & 0xFF,\n (baseMediaDecodeTime) & 0xFF\n ]));\n let sdtp = MP4.sdtp(track);\n let trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);\n\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);\n }\n\n // Sample Dependency Type box\n static sdtp(track) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let data = new Uint8Array(4 + sampleCount);\n // 0~4 bytes: version(0) & flags\n for (let i = 0; i < sampleCount; i++) {\n let flags = samples[i].flags;\n data[i + 4] = (flags.isLeading << 6) // is_leading: 2 (bit)\n | (flags.dependsOn << 4) // sample_depends_on\n | (flags.isDependedOn << 2) // sample_is_depended_on\n | (flags.hasRedundancy); // sample_has_redundancy\n }\n return MP4.box(MP4.types.sdtp, data);\n }\n\n // Track fragment run box\n static trun(track, offset) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let dataSize = 12 + 16 * sampleCount;\n let data = new Uint8Array(dataSize);\n offset += 8 + dataSize;\n\n data.set([\n 0x00, 0x00, 0x0F, 0x01, // version(0) & flags\n (sampleCount >>> 24) & 0xFF, // sample_count\n (sampleCount >>> 16) & 0xFF,\n (sampleCount >>> 8) & 0xFF,\n (sampleCount) & 0xFF,\n (offset >>> 24) & 0xFF, // data_offset\n (offset >>> 16) & 0xFF,\n (offset >>> 8) & 0xFF,\n (offset) & 0xFF\n ], 0);\n\n for (let i = 0; i < sampleCount; i++) {\n let duration = samples[i].duration;\n let size = samples[i].size;\n let flags = samples[i].flags;\n let cts = samples[i].cts;\n data.set([\n (duration >>> 24) & 0xFF, // sample_duration\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n (size >>> 24) & 0xFF, // sample_size\n (size >>> 16) & 0xFF,\n (size >>> 8) & 0xFF,\n (size) & 0xFF,\n (flags.isLeading << 2) | flags.dependsOn, // sample_flags\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,\n 0x00, 0x00, // sample_degradation_priority\n (cts >>> 24) & 0xFF, // sample_composition_time_offset\n (cts >>> 16) & 0xFF,\n (cts >>> 8) & 0xFF,\n (cts) & 0xFF\n ], 12 + 16 * i);\n }\n return MP4.box(MP4.types.trun, data);\n }\n\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data);\n }\n\n}\n\nMP4.init();\n\nexport default MP4;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass AAC {\n\n static getSilentFrame(codec, channelCount) {\n if (codec === 'mp4a.40.2') {\n // handle LC-AAC\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);\n } else if (channelCount === 3) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);\n } else if (channelCount === 4) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);\n } else if (channelCount === 5) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);\n } else if (channelCount === 6) {\n 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]);\n }\n } else {\n // handle HE-AAC (mp4a.40.5 / mp4a.40.29)\n if (channelCount === 1) {\n // 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\n 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]);\n } else if (channelCount === 2) {\n // 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\n 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]);\n } else if (channelCount === 3) {\n // 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\n 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]);\n }\n }\n return null;\n }\n\n}\n\nexport default AAC;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport MP4 from './mp4-generator.js';\nimport AAC from './aac-silent.js';\nimport Browser from '../utils/browser.js';\nimport { SampleInfo, MediaSegmentInfo, MediaSegmentInfoList } from '../core/media-segment-info.js';\nimport { IllegalStateException } from '../utils/exception.js';\n\n\n// Fragmented mp4 remuxer\nclass MP4Remuxer {\n\n constructor(config) {\n this.TAG = 'MP4Remuxer';\n\n this._config = config;\n this._isLive = (config.isLive === true) ? true : false;\n\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioDtsBase = Infinity;\n this._videoDtsBase = Infinity;\n this._audioNextDts = undefined;\n this._videoNextDts = undefined;\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n\n this._audioMeta = null;\n this._videoMeta = null;\n\n this._audioSegmentInfoList = new MediaSegmentInfoList('audio');\n this._videoSegmentInfoList = new MediaSegmentInfoList('video');\n\n this._onInitSegment = null;\n this._onMediaSegment = null;\n\n // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n this._forceFirstIDR = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661))) ? true : false;\n\n // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking\n // Make audio beginDts equals with video beginDts, in order to fix seek freeze\n this._fillSilentAfterSeek = (Browser.msedge || Browser.msie);\n\n // While only FireFox supports 'audio/mp4, codecs=\"mp3\"', use 'audio/mpeg' for chrome, safari, ...\n this._mp3UseMpegAudio = !Browser.firefox;\n\n this._fillAudioTimestampGap = this._config.fixAudioTimestampGap;\n }\n\n destroy() {\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioMeta = null;\n this._videoMeta = null;\n this._audioSegmentInfoList.clear();\n this._audioSegmentInfoList = null;\n this._videoSegmentInfoList.clear();\n this._videoSegmentInfoList = null;\n this._onInitSegment = null;\n this._onMediaSegment = null;\n }\n\n bindDataSource(producer) {\n producer.onDataAvailable = this.remux.bind(this);\n producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this);\n return this;\n }\n\n /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void\n InitSegment: {\n type: string,\n data: ArrayBuffer,\n codec: string,\n container: string\n }\n */\n get onInitSegment() {\n return this._onInitSegment;\n }\n\n set onInitSegment(callback) {\n this._onInitSegment = callback;\n }\n\n /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void\n MediaSegment: {\n type: string,\n data: ArrayBuffer,\n sampleCount: int32\n info: MediaSegmentInfo\n }\n */\n get onMediaSegment() {\n return this._onMediaSegment;\n }\n\n set onMediaSegment(callback) {\n this._onMediaSegment = callback;\n }\n\n insertDiscontinuity() {\n this._audioNextDts = this._videoNextDts = undefined;\n }\n\n seek(originalDts) {\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n this._videoSegmentInfoList.clear();\n this._audioSegmentInfoList.clear();\n }\n\n remux(audioTrack, videoTrack) {\n if (!this._onMediaSegment) {\n throw new IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!');\n }\n if (!this._dtsBaseInited) {\n this._calculateDtsBase(audioTrack, videoTrack);\n }\n this._remuxVideo(videoTrack);\n this._remuxAudio(audioTrack);\n }\n\n _onTrackMetadataReceived(type, metadata) {\n let metabox = null;\n\n let container = 'mp4';\n let codec = metadata.codec;\n\n if (type === 'audio') {\n this._audioMeta = metadata;\n if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) {\n // 'audio/mpeg' for MP3 audio track\n container = 'mpeg';\n codec = '';\n metabox = new Uint8Array();\n } else {\n // 'audio/mp4, codecs=\"codec\"'\n metabox = MP4.generateInitSegment(metadata);\n }\n } else if (type === 'video') {\n this._videoMeta = metadata;\n metabox = MP4.generateInitSegment(metadata);\n } else {\n return;\n }\n\n // dispatch metabox (Initialization Segment)\n if (!this._onInitSegment) {\n throw new IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!');\n }\n this._onInitSegment(type, {\n type: type,\n data: metabox.buffer,\n codec: codec,\n container: `${type}/${container}`,\n mediaDuration: metadata.duration // in timescale 1000 (milliseconds)\n });\n }\n\n _calculateDtsBase(audioTrack, videoTrack) {\n if (this._dtsBaseInited) {\n return;\n }\n\n if (audioTrack.samples && audioTrack.samples.length) {\n this._audioDtsBase = audioTrack.samples[0].dts;\n }\n if (videoTrack.samples && videoTrack.samples.length) {\n this._videoDtsBase = videoTrack.samples[0].dts;\n }\n\n this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase);\n this._dtsBaseInited = true;\n }\n\n flushStashedSamples() {\n let videoSample = this._videoStashedLastSample;\n let audioSample = this._audioStashedLastSample;\n\n let videoTrack = {\n type: 'video',\n id: 1,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (videoSample != null) {\n videoTrack.samples.push(videoSample);\n videoTrack.length = videoSample.length;\n }\n\n let audioTrack = {\n type: 'audio',\n id: 2,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (audioSample != null) {\n audioTrack.samples.push(audioSample);\n audioTrack.length = audioSample.length;\n }\n\n this._videoStashedLastSample = null;\n this._audioStashedLastSample = null;\n\n this._remuxVideo(videoTrack, true);\n this._remuxAudio(audioTrack, true);\n }\n\n _remuxAudio(audioTrack, force) {\n if (this._audioMeta == null) {\n return;\n }\n\n let track = audioTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1, lastPts = -1;\n let refSampleDuration = this._audioMeta.refSampleDuration;\n\n let mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio;\n let firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined;\n\n let insertPrefixSilentFrame = false;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 0;\n let mdatbox = null;\n let mdatBytes = 0;\n\n // calculate initial mdat size\n if (mpegRawTrack) {\n // for raw mpeg buffer\n offset = 0;\n mdatBytes = track.length;\n } else {\n // for fmp4 mdat box\n offset = 8; // size + type\n mdatBytes = 8 + track.length;\n }\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._audioStashedLastSample != null) {\n let sample = this._audioStashedLastSample;\n this._audioStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._audioStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._audioNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._audioNextDts;\n } else { // this._audioNextDts == undefined\n if (this._audioSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) {\n if (this._audioMeta.originalCodec !== 'mp3') {\n insertPrefixSilentFrame = true;\n }\n }\n } else {\n let lastSample = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n if (insertPrefixSilentFrame) {\n // align audio segment beginDts to match with current video segment's beginDts\n let firstSampleDts = firstSampleOriginalDts - dtsCorrection;\n let videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts);\n if (videoSegment != null && videoSegment.beginDts < firstSampleDts) {\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit) {\n let dts = videoSegment.beginDts;\n let silentFrameDuration = firstSampleDts - videoSegment.beginDts;\n Log.v(this.TAG, `InsertPrefixSilentAudio: dts: ${dts}, duration: ${silentFrameDuration}`);\n samples.unshift({ unit: silentUnit, dts: dts, pts: dts });\n mdatBytes += silentUnit.byteLength;\n } // silentUnit == null: Cannot generate, skip\n } else {\n insertPrefixSilentFrame = false;\n }\n }\n\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let unit = sample.unit;\n let originalDts = sample.dts - this._dtsBase;\n let dts = originalDts;\n let needFillSilentFrames = false;\n let silentFrames = null;\n let sampleDuration = 0;\n\n if (originalDts < -0.001) {\n continue; //pass the first sample with the invalid dts\n }\n\n if (this._audioMeta.codec !== 'mp3') {\n // for AAC codec, we need to keep dts increase based on refSampleDuration\n let curRefDts = originalDts;\n const maxAudioFramesDrift = 3;\n if (this._audioNextDts) {\n curRefDts = this._audioNextDts;\n }\n\n dtsCorrection = originalDts - curRefDts;\n if (dtsCorrection <= -maxAudioFramesDrift * refSampleDuration) {\n // If we're overlapping by more than maxAudioFramesDrift number of frame, drop this sample\n Log.w(this.TAG, `Dropping 1 audio frame (originalDts: ${originalDts} ms ,curRefDts: ${curRefDts} ms) due to dtsCorrection: ${dtsCorrection} ms overlap.`);\n continue;\n }\n else if (dtsCorrection >= maxAudioFramesDrift * refSampleDuration && this._fillAudioTimestampGap && !Browser.safari) {\n // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap\n needFillSilentFrames = true;\n // We need to insert silent frames to fill timestamp gap\n let frameCount = Math.floor(dtsCorrection / refSampleDuration);\n Log.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' +\n 'Silent frames will be generated to avoid unsync.\\n' +\n `originalDts: ${originalDts} ms, curRefDts: ${curRefDts} ms, ` +\n `dtsCorrection: ${Math.round(dtsCorrection)} ms, generate: ${frameCount} frames`);\n\n\n dts = Math.floor(curRefDts);\n sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;\n\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit == null) {\n Log.w(this.TAG, 'Unable to generate silent frame for ' +\n `${this._audioMeta.originalCodec} with ${this._audioMeta.channelCount} channels, repeat last frame`);\n // Repeat last frame\n silentUnit = unit;\n }\n silentFrames = [];\n\n for (let j = 0; j < frameCount; j++) {\n curRefDts = curRefDts + refSampleDuration;\n let intDts = Math.floor(curRefDts); // change to integer\n let intDuration = Math.floor(curRefDts + refSampleDuration) - intDts;\n let frame = {\n dts: intDts,\n pts: intDts,\n cts: 0,\n unit: silentUnit,\n size: silentUnit.byteLength,\n duration: intDuration, // wait for next sample\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n };\n silentFrames.push(frame);\n mdatBytes += frame.size;;\n\n }\n\n this._audioNextDts = curRefDts + refSampleDuration;\n\n } else {\n\n dts = Math.floor(curRefDts);\n sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;\n this._audioNextDts = curRefDts + refSampleDuration;\n\n }\n } else {\n // keep the original dts calculate algorithm for mp3\n dts = originalDts - dtsCorrection;\n\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(refSampleDuration);\n }\n }\n this._audioNextDts = dts + sampleDuration;\n }\n\n if (firstDts === -1) {\n firstDts = dts;\n }\n mp4Samples.push({\n dts: dts,\n pts: dts,\n cts: 0,\n unit: sample.unit,\n size: sample.unit.byteLength,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n });\n\n if (needFillSilentFrames) {\n // Silent frames should be inserted after wrong-duration frame\n mp4Samples.push.apply(mp4Samples, silentFrames);\n }\n }\n\n if (mp4Samples.length === 0) {\n //no samples need to remux\n track.samples = [];\n track.length = 0;\n return;\n }\n\n // allocate mdatbox\n if (mpegRawTrack) {\n // allocate for raw mpeg buffer\n mdatbox = new Uint8Array(mdatBytes);\n } else {\n // allocate for fmp4 mdat box\n mdatbox = new Uint8Array(mdatBytes);\n // size field\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n // type field (fourCC)\n mdatbox.set(MP4.types.mdat, 4);\n }\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let unit = mp4Samples[i].unit;\n mdatbox.set(unit, offset);\n offset += unit.byteLength;\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n //this._audioNextDts = lastDts;\n\n // fill media segment info & add to info list\n let info = new MediaSegmentInfo();\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstDts;\n info.endPts = lastDts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n false);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n false);\n if (!this._isLive) {\n this._audioSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n let moofbox = null;\n\n if (mpegRawTrack) {\n // Generate empty buffer, because useless for raw mpeg\n moofbox = new Uint8Array();\n } else {\n // Generate moof for fmp4 segment\n moofbox = MP4.moof(track, firstDts);\n }\n\n track.samples = [];\n track.length = 0;\n\n let segment = {\n type: 'audio',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n };\n\n if (mpegRawTrack && firstSegmentAfterSeek) {\n // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n segment.timestampOffset = firstDts;\n }\n\n this._onMediaSegment('audio', segment);\n }\n\n _remuxVideo(videoTrack, force) {\n if (this._videoMeta == null) {\n return;\n }\n\n let track = videoTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1;\n let firstPts = -1, lastPts = -1;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 8;\n let mdatbox = null;\n let mdatBytes = 8 + videoTrack.length;\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._videoStashedLastSample != null) {\n let sample = this._videoStashedLastSample;\n this._videoStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._videoStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._videoNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._videoNextDts;\n } else { // this._videoNextDts == undefined\n if (this._videoSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n } else {\n let lastSample = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n let info = new MediaSegmentInfo();\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let originalDts = sample.dts - this._dtsBase;\n let isKeyframe = sample.isKeyframe;\n let dts = originalDts - dtsCorrection;\n let cts = sample.cts;\n let pts = dts + cts;\n\n if (firstDts === -1) {\n firstDts = dts;\n firstPts = pts;\n }\n\n let sampleDuration = 0;\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(this._videoMeta.refSampleDuration);\n }\n }\n\n if (isKeyframe) {\n let syncPoint = new SampleInfo(dts, pts, sampleDuration, sample.dts, true);\n syncPoint.fileposition = sample.fileposition;\n info.appendSyncPoint(syncPoint);\n }\n\n mp4Samples.push({\n dts: dts,\n pts: pts,\n cts: cts,\n units: sample.units,\n size: sample.length,\n isKeyframe: isKeyframe,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: isKeyframe ? 2 : 1,\n isDependedOn: isKeyframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isKeyframe ? 0 : 1\n }\n });\n }\n\n // allocate mdatbox\n mdatbox = new Uint8Array(mdatBytes);\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n mdatbox.set(MP4.types.mdat, 4);\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let units = mp4Samples[i].units;\n while (units.length) {\n let unit = units.shift();\n let data = unit.data;\n mdatbox.set(data, offset);\n offset += data.byteLength;\n }\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n lastPts = latest.pts + latest.duration;\n this._videoNextDts = lastDts;\n\n // fill media segment info & add to info list\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstPts;\n info.endPts = lastPts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n mp4Samples[0].isKeyframe);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n latest.isKeyframe);\n if (!this._isLive) {\n this._videoSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n // workaround for chrome < 50: force first sample as a random access point\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n if (this._forceFirstIDR) {\n let flags = mp4Samples[0].flags;\n flags.dependsOn = 2;\n flags.isNonSync = 0;\n }\n\n let moofbox = MP4.moof(track, firstDts);\n track.samples = [];\n track.length = 0;\n\n this._onMediaSegment('video', {\n type: 'video',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n });\n }\n\n _mergeBoxes(moof, mdat) {\n let result = new Uint8Array(moof.byteLength + mdat.byteLength);\n result.set(moof, 0);\n result.set(mdat, moof.byteLength);\n return result;\n }\n\n}\n\nexport default MP4Remuxer;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MediaInfo from './media-info.js';\nimport FLVDemuxer from '../demux/flv-demuxer.js';\nimport MP4Remuxer from '../remux/mp4-remuxer.js';\nimport DemuxErrors from '../demux/demux-errors.js';\nimport IOController from '../io/io-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport {LoaderStatus, LoaderErrors} from '../io/loader.js';\n\n// Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support\nclass TransmuxingController {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'TransmuxingController';\n this._emitter = new EventEmitter();\n\n this._config = config;\n\n // treat single part media as multipart media, which has only one segment\n if (!mediaDataSource.segments) {\n mediaDataSource.segments = [{\n duration: mediaDataSource.duration,\n filesize: mediaDataSource.filesize,\n url: mediaDataSource.url\n }];\n }\n\n // fill in default IO params if not exists\n if (typeof mediaDataSource.cors !== 'boolean') {\n mediaDataSource.cors = true;\n }\n if (typeof mediaDataSource.withCredentials !== 'boolean') {\n mediaDataSource.withCredentials = false;\n }\n\n this._mediaDataSource = mediaDataSource;\n this._currentSegmentIndex = 0;\n let totalDuration = 0;\n\n this._mediaDataSource.segments.forEach((segment) => {\n // timestampBase for each segment, and calculate total duration\n segment.timestampBase = totalDuration;\n totalDuration += segment.duration;\n // params needed by IOController\n segment.cors = mediaDataSource.cors;\n segment.withCredentials = mediaDataSource.withCredentials;\n // referrer policy control, if exist\n if (config.referrerPolicy) {\n segment.referrerPolicy = config.referrerPolicy;\n }\n });\n\n if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) {\n this._mediaDataSource.duration = totalDuration;\n }\n\n this._mediaInfo = null;\n this._demuxer = null;\n this._remuxer = null;\n this._ioctl = null;\n\n this._pendingSeekTime = null;\n this._pendingResolveSeekPoint = null;\n\n this._statisticsReporter = null;\n }\n\n destroy() {\n this._mediaInfo = null;\n this._mediaDataSource = null;\n\n if (this._statisticsReporter) {\n this._disableStatisticsReporter();\n }\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n if (this._demuxer) {\n this._demuxer.destroy();\n this._demuxer = null;\n }\n if (this._remuxer) {\n this._remuxer.destroy();\n this._remuxer = null;\n }\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n start() {\n this._loadSegment(0);\n this._enableStatisticsReporter();\n }\n\n _loadSegment(segmentIndex, optionalFrom) {\n this._currentSegmentIndex = segmentIndex;\n let dataSource = this._mediaDataSource.segments[segmentIndex];\n\n let ioctl = this._ioctl = new IOController(dataSource, this._config, segmentIndex);\n ioctl.onError = this._onIOException.bind(this);\n ioctl.onSeeked = this._onIOSeeked.bind(this);\n ioctl.onComplete = this._onIOComplete.bind(this);\n ioctl.onRedirect = this._onIORedirect.bind(this);\n ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this);\n\n if (optionalFrom) {\n this._demuxer.bindDataSource(this._ioctl);\n } else {\n ioctl.onDataArrival = this._onInitChunkArrival.bind(this);\n }\n\n ioctl.open(optionalFrom);\n }\n\n stop() {\n this._internalAbort();\n this._disableStatisticsReporter();\n }\n\n _internalAbort() {\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n }\n\n pause() { // take a rest\n if (this._ioctl && this._ioctl.isWorking()) {\n this._ioctl.pause();\n this._disableStatisticsReporter();\n }\n }\n\n resume() {\n if (this._ioctl && this._ioctl.isPaused()) {\n this._ioctl.resume();\n this._enableStatisticsReporter();\n }\n }\n\n seek(milliseconds) {\n if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) {\n return;\n }\n\n let targetSegmentIndex = this._searchSegmentIndexContains(milliseconds);\n\n if (targetSegmentIndex === this._currentSegmentIndex) {\n // intra-segment seeking\n let segmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (segmentInfo == undefined) {\n // current segment loading started, but mediainfo hasn't received yet\n // wait for the metadata loaded, then seek to expected position\n this._pendingSeekTime = milliseconds;\n } else {\n let keyframe = segmentInfo.getNearestKeyframe(milliseconds);\n this._remuxer.seek(keyframe.milliseconds);\n this._ioctl.seek(keyframe.fileposition);\n // Will be resolved in _onRemuxerMediaSegmentArrival()\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n }\n } else {\n // cross-segment seeking\n let targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (targetSegmentInfo == undefined) {\n // target segment hasn't been loaded. We need metadata then seek to expected time\n this._pendingSeekTime = milliseconds;\n this._internalAbort();\n this._remuxer.seek();\n this._remuxer.insertDiscontinuity();\n this._loadSegment(targetSegmentIndex);\n // Here we wait for the metadata loaded, then seek to expected position\n } else {\n // We have target segment's metadata, direct seek to target position\n let keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds);\n this._internalAbort();\n this._remuxer.seek(milliseconds);\n this._remuxer.insertDiscontinuity();\n this._demuxer.resetMediaInfo();\n this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase;\n this._loadSegment(targetSegmentIndex, keyframe.fileposition);\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n this._reportSegmentMediaInfo(targetSegmentIndex);\n }\n }\n\n this._enableStatisticsReporter();\n }\n\n _searchSegmentIndexContains(milliseconds) {\n let segments = this._mediaDataSource.segments;\n let idx = segments.length - 1;\n\n for (let i = 0; i < segments.length; i++) {\n if (milliseconds < segments[i].timestampBase) {\n idx = i - 1;\n break;\n }\n }\n return idx;\n }\n\n _onInitChunkArrival(data, byteStart) {\n let probeData = null;\n let consumed = 0;\n\n if (byteStart > 0) {\n // IOController seeked immediately after opened, byteStart > 0 callback may received\n this._demuxer.bindDataSource(this._ioctl);\n this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase;\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else if ((probeData = FLVDemuxer.probe(data)).match) {\n // Always create new FLVDemuxer\n this._demuxer = new FLVDemuxer(probeData, this._config);\n\n if (!this._remuxer) {\n this._remuxer = new MP4Remuxer(this._config);\n }\n\n let mds = this._mediaDataSource;\n if (mds.duration != undefined && !isNaN(mds.duration)) {\n this._demuxer.overridedDuration = mds.duration;\n }\n if (typeof mds.hasAudio === 'boolean') {\n this._demuxer.overridedHasAudio = mds.hasAudio;\n }\n if (typeof mds.hasVideo === 'boolean') {\n this._demuxer.overridedHasVideo = mds.hasVideo;\n }\n\n this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase;\n\n this._demuxer.onError = this._onDemuxException.bind(this);\n this._demuxer.onMediaInfo = this._onMediaInfo.bind(this);\n this._demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);\n this._demuxer.onScriptDataArrived = this._onScriptDataArrived.bind(this);\n\n this._remuxer.bindDataSource(this._demuxer\n .bindDataSource(this._ioctl\n ));\n\n this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);\n this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else {\n probeData = null;\n Log.e(this.TAG, 'Non-FLV, Unsupported media type!');\n Promise.resolve().then(() => {\n this._internalAbort();\n });\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, DemuxErrors.FORMAT_UNSUPPORTED, 'Non-FLV, Unsupported media type');\n\n consumed = 0;\n }\n\n return consumed;\n }\n\n _onMediaInfo(mediaInfo) {\n if (this._mediaInfo == null) {\n // Store first segment's mediainfo as global mediaInfo\n this._mediaInfo = Object.assign({}, mediaInfo);\n this._mediaInfo.keyframesIndex = null;\n this._mediaInfo.segments = [];\n this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;\n Object.setPrototypeOf(this._mediaInfo, MediaInfo.prototype);\n }\n\n let segmentInfo = Object.assign({}, mediaInfo);\n Object.setPrototypeOf(segmentInfo, MediaInfo.prototype);\n this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;\n\n // notify mediaInfo update\n this._reportSegmentMediaInfo(this._currentSegmentIndex);\n\n if (this._pendingSeekTime != null) {\n Promise.resolve().then(() => {\n let target = this._pendingSeekTime;\n this._pendingSeekTime = null;\n this.seek(target);\n });\n }\n }\n\n _onMetaDataArrived(metadata) {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n }\n\n _onScriptDataArrived(data) {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n }\n\n _onIOSeeked() {\n this._remuxer.insertDiscontinuity();\n }\n\n _onIOComplete(extraData) {\n let segmentIndex = extraData;\n let nextSegmentIndex = segmentIndex + 1;\n\n if (nextSegmentIndex < this._mediaDataSource.segments.length) {\n this._internalAbort();\n this._remuxer.flushStashedSamples();\n this._loadSegment(nextSegmentIndex);\n } else {\n this._remuxer.flushStashedSamples();\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n this._disableStatisticsReporter();\n }\n }\n\n _onIORedirect(redirectedURL) {\n let segmentIndex = this._ioctl.extraData;\n this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL;\n }\n\n _onIORecoveredEarlyEof() {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n }\n\n _onIOException(type, info) {\n Log.e(this.TAG, `IOException: type = ${type}, code = ${info.code}, msg = ${info.msg}`);\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n this._disableStatisticsReporter();\n }\n\n _onDemuxException(type, info) {\n Log.e(this.TAG, `DemuxException: type = ${type}, info = ${info}`);\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n }\n\n _onRemuxerInitSegmentArrival(type, initSegment) {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n }\n\n _onRemuxerMediaSegmentArrival(type, mediaSegment) {\n if (this._pendingSeekTime != null) {\n // Media segments after new-segment cross-seeking should be dropped.\n return;\n }\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n\n // Resolve pending seekPoint\n if (this._pendingResolveSeekPoint != null && type === 'video') {\n let syncPoints = mediaSegment.info.syncPoints;\n let seekpoint = this._pendingResolveSeekPoint;\n this._pendingResolveSeekPoint = null;\n\n // Safari: Pass PTS for recommend_seekpoint\n if (Browser.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) {\n seekpoint = syncPoints[0].pts;\n }\n // else: use original DTS (keyframe.milliseconds)\n\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, seekpoint);\n }\n }\n\n _enableStatisticsReporter() {\n if (this._statisticsReporter == null) {\n this._statisticsReporter = self.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n }\n\n _disableStatisticsReporter() {\n if (this._statisticsReporter) {\n self.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n _reportSegmentMediaInfo(segmentIndex) {\n let segmentInfo = this._mediaInfo.segments[segmentIndex];\n let exportInfo = Object.assign({}, segmentInfo);\n\n exportInfo.duration = this._mediaInfo.duration;\n exportInfo.segmentCount = this._mediaInfo.segmentCount;\n delete exportInfo.segments;\n delete exportInfo.keyframesIndex;\n\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, exportInfo);\n }\n\n _reportStatisticsInfo() {\n let info = {};\n\n info.url = this._ioctl.currentURL;\n info.hasRedirect = this._ioctl.hasRedirect;\n if (info.hasRedirect) {\n info.redirectedURL = this._ioctl.currentRedirectedURL;\n }\n\n info.speed = this._ioctl.currentSpeed;\n info.loaderType = this._ioctl.loaderType;\n info.currentSegmentIndex = this._currentSegmentIndex;\n info.totalSegmentCount = this._mediaDataSource.segments.length;\n\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, info);\n }\n\n}\n\nexport default TransmuxingController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst TransmuxingEvents = {\n IO_ERROR: 'io_error',\n DEMUX_ERROR: 'demux_error',\n INIT_SEGMENT: 'init_segment',\n MEDIA_SEGMENT: 'media_segment',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n STATISTICS_INFO: 'statistics_info',\n RECOMMEND_SEEKPOINT: 'recommend_seekpoint'\n};\n\nexport default TransmuxingEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DemuxErrors = {\n OK: 'OK',\n FORMAT_ERROR: 'FormatError',\n FORMAT_UNSUPPORTED: 'FormatUnsupported',\n CODEC_UNSUPPORTED: 'CodecUnsupported'\n};\n\nexport default DemuxErrors;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const defaultConfig = {\n enableWorker: false,\n enableStashBuffer: true,\n stashInitialSize: undefined,\n\n isLive: false,\n\n lazyLoad: true,\n lazyLoadMaxDuration: 3 * 60,\n lazyLoadRecoverDuration: 30,\n deferLoadAfterSourceOpen: true,\n\n // autoCleanupSourceBuffer: default as false, leave unspecified\n autoCleanupMaxBackwardDuration: 3 * 60,\n autoCleanupMinBackwardDuration: 2 * 60,\n\n statisticsInfoReportInterval: 600,\n\n fixAudioTimestampGap: true,\n\n accurateSeek: false,\n seekType: 'range', // [range, param, custom]\n seekParamStart: 'bstart',\n seekParamEnd: 'bend',\n rangeLoadZeroStart: false,\n customSeekHandler: undefined,\n reuseRedirectedURL: false,\n // referrerPolicy: leave as unspecified\n\n headers: undefined,\n customLoader: undefined\n};\n\nexport function createDefaultConfig() {\n return Object.assign({}, defaultConfig);\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IOController from '../io/io-controller.js';\nimport {createDefaultConfig} from '../config.js';\n\nclass Features {\n\n static supportMSEH264Playback() {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n\n static supportNetworkStreamIO() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';\n }\n\n static getNetworkLoaderTypeName() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType;\n }\n\n static supportNativeMediaPlayback(mimeType) {\n if (Features.videoElement == undefined) {\n Features.videoElement = window.document.createElement('video');\n }\n let canPlay = Features.videoElement.canPlayType(mimeType);\n return canPlay === 'probably' || canPlay == 'maybe';\n }\n\n static getFeatureList() {\n let features = {\n mseFlvPlayback: false,\n mseLiveFlvPlayback: false,\n networkStreamIO: false,\n networkLoaderName: '',\n nativeMP4H264Playback: false,\n nativeWebmVP8Playback: false,\n nativeWebmVP9Playback: false\n };\n\n features.mseFlvPlayback = Features.supportMSEH264Playback();\n features.networkStreamIO = Features.supportNetworkStreamIO();\n features.networkLoaderName = Features.getNetworkLoaderTypeName();\n features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO;\n features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"');\n features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp8.0, vorbis\"');\n features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp9\"');\n\n return features;\n }\n\n}\n\nexport default Features;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst PlayerEvents = {\n ERROR: 'error',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n STATISTICS_INFO: 'statistics_info'\n};\n\nexport default PlayerEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport work from 'webworkify-webpack';\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport TransmuxingWorker from './transmuxing-worker.js';\nimport MediaInfo from './media-info.js';\n\nclass Transmuxer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'Transmuxer';\n this._emitter = new EventEmitter();\n\n if (config.enableWorker && typeof (Worker) !== 'undefined') {\n try {\n this._worker = work(require.resolve('./transmuxing-worker'));\n this._workerDestroying = false;\n this._worker.addEventListener('message', this._onWorkerMessage.bind(this));\n this._worker.postMessage({cmd: 'init', param: [mediaDataSource, config]});\n this.e = {\n onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this)\n };\n LoggingControl.registerListener(this.e.onLoggingConfigChanged);\n this._worker.postMessage({cmd: 'logging_config', param: LoggingControl.getConfig()});\n } catch (error) {\n Log.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing');\n this._worker = null;\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n } else {\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n\n if (this._controller) {\n let ctl = this._controller;\n ctl.on(TransmuxingEvents.IO_ERROR, this._onIOError.bind(this));\n ctl.on(TransmuxingEvents.DEMUX_ERROR, this._onDemuxError.bind(this));\n ctl.on(TransmuxingEvents.INIT_SEGMENT, this._onInitSegment.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_SEGMENT, this._onMediaSegment.bind(this));\n ctl.on(TransmuxingEvents.LOADING_COMPLETE, this._onLoadingComplete.bind(this));\n ctl.on(TransmuxingEvents.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_INFO, this._onMediaInfo.bind(this));\n ctl.on(TransmuxingEvents.METADATA_ARRIVED, this._onMetaDataArrived.bind(this));\n ctl.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, this._onScriptDataArrived.bind(this));\n ctl.on(TransmuxingEvents.STATISTICS_INFO, this._onStatisticsInfo.bind(this));\n ctl.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this));\n }\n }\n\n destroy() {\n if (this._worker) {\n if (!this._workerDestroying) {\n this._workerDestroying = true;\n this._worker.postMessage({cmd: 'destroy'});\n LoggingControl.removeListener(this.e.onLoggingConfigChanged);\n this.e = null;\n }\n } else {\n this._controller.destroy();\n this._controller = null;\n }\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n hasWorker() {\n return this._worker != null;\n }\n\n open() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'start'});\n } else {\n this._controller.start();\n }\n }\n\n close() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'stop'});\n } else {\n this._controller.stop();\n }\n }\n\n seek(milliseconds) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'seek', param: milliseconds});\n } else {\n this._controller.seek(milliseconds);\n }\n }\n\n pause() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'pause'});\n } else {\n this._controller.pause();\n }\n }\n\n resume() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'resume'});\n } else {\n this._controller.resume();\n }\n }\n\n _onInitSegment(type, initSegment) {\n // do async invoke\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n });\n }\n\n _onMediaSegment(type, mediaSegment) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n });\n }\n\n _onLoadingComplete() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n });\n }\n\n _onRecoveredEarlyEof() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n });\n }\n\n _onMediaInfo(mediaInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, mediaInfo);\n });\n }\n\n _onMetaDataArrived(metadata) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n });\n }\n\n _onScriptDataArrived(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n });\n }\n\n _onStatisticsInfo(statisticsInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, statisticsInfo);\n });\n }\n\n _onIOError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n });\n }\n\n _onDemuxError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n });\n }\n\n _onRecommendSeekpoint(milliseconds) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, milliseconds);\n });\n }\n\n _onLoggingConfigChanged(config) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'logging_config', param: config});\n }\n }\n\n _onWorkerMessage(e) {\n let message = e.data;\n let data = message.data;\n\n if (message.msg === 'destroyed' || this._workerDestroying) {\n this._workerDestroying = false;\n this._worker.terminate();\n this._worker = null;\n return;\n }\n\n switch (message.msg) {\n case TransmuxingEvents.INIT_SEGMENT:\n case TransmuxingEvents.MEDIA_SEGMENT:\n this._emitter.emit(message.msg, data.type, data.data);\n break;\n case TransmuxingEvents.LOADING_COMPLETE:\n case TransmuxingEvents.RECOVERED_EARLY_EOF:\n this._emitter.emit(message.msg);\n break;\n case TransmuxingEvents.MEDIA_INFO:\n Object.setPrototypeOf(data, MediaInfo.prototype);\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.METADATA_ARRIVED:\n case TransmuxingEvents.SCRIPTDATA_ARRIVED:\n case TransmuxingEvents.STATISTICS_INFO:\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.IO_ERROR:\n case TransmuxingEvents.DEMUX_ERROR:\n this._emitter.emit(message.msg, data.type, data.info);\n break;\n case TransmuxingEvents.RECOMMEND_SEEKPOINT:\n this._emitter.emit(message.msg, data);\n break;\n case 'logcat_callback':\n Log.emitter.emit('log', data.type, data.logcat);\n break;\n default:\n break;\n }\n }\n\n}\n\nexport default Transmuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst MSEEvents = {\n ERROR: 'error',\n SOURCE_OPEN: 'source_open',\n UPDATE_END: 'update_end',\n BUFFER_FULL: 'buffer_full'\n};\n\nexport default MSEEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MSEEvents from './mse-events.js';\nimport {SampleInfo, IDRSampleList} from './media-segment-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\n// Media Source Extensions controller\nclass MSEController {\n\n constructor(config) {\n this.TAG = 'MSEController';\n\n this._config = config;\n this._emitter = new EventEmitter();\n\n if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) {\n // For live stream, do auto cleanup by default\n this._config.autoCleanupSourceBuffer = true;\n }\n\n this.e = {\n onSourceOpen: this._onSourceOpen.bind(this),\n onSourceEnded: this._onSourceEnded.bind(this),\n onSourceClose: this._onSourceClose.bind(this),\n onSourceBufferError: this._onSourceBufferError.bind(this),\n onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this)\n };\n\n this._mediaSource = null;\n this._mediaSourceObjectURL = null;\n this._mediaElement = null;\n\n this._isBufferFull = false;\n this._hasPendingEos = false;\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n\n this._pendingSourceBufferInit = [];\n this._mimeTypes = {\n video: null,\n audio: null\n };\n this._sourceBuffers = {\n video: null,\n audio: null\n };\n this._lastInitSegments = {\n video: null,\n audio: null\n };\n this._pendingSegments = {\n video: [],\n audio: []\n };\n this._pendingRemoveRanges = {\n video: [],\n audio: []\n };\n this._idrList = new IDRSampleList();\n }\n\n destroy() {\n if (this._mediaElement || this._mediaSource) {\n this.detachMediaElement();\n }\n this.e = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n if (this._mediaSource) {\n throw new IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');\n }\n let ms = this._mediaSource = new window.MediaSource();\n ms.addEventListener('sourceopen', this.e.onSourceOpen);\n ms.addEventListener('sourceended', this.e.onSourceEnded);\n ms.addEventListener('sourceclose', this.e.onSourceClose);\n\n this._mediaElement = mediaElement;\n this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource);\n mediaElement.src = this._mediaSourceObjectURL;\n }\n\n detachMediaElement() {\n if (this._mediaSource) {\n let ms = this._mediaSource;\n for (let type in this._sourceBuffers) {\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n this._pendingSegments[type] = null;\n this._pendingRemoveRanges[type] = null;\n this._lastInitSegments[type] = null;\n\n // remove all sourcebuffers\n let sb = this._sourceBuffers[type];\n if (sb) {\n if (ms.readyState !== 'closed') {\n // ms edge can throw an error: Unexpected call to method or property access\n try {\n ms.removeSourceBuffer(sb);\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n sb.removeEventListener('error', this.e.onSourceBufferError);\n sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n }\n this._mimeTypes[type] = null;\n this._sourceBuffers[type] = null;\n }\n }\n if (ms.readyState === 'open') {\n try {\n ms.endOfStream();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n ms.removeEventListener('sourceopen', this.e.onSourceOpen);\n ms.removeEventListener('sourceended', this.e.onSourceEnded);\n ms.removeEventListener('sourceclose', this.e.onSourceClose);\n this._pendingSourceBufferInit = [];\n this._isBufferFull = false;\n this._idrList.clear();\n this._mediaSource = null;\n }\n\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement = null;\n }\n if (this._mediaSourceObjectURL) {\n window.URL.revokeObjectURL(this._mediaSourceObjectURL);\n this._mediaSourceObjectURL = null;\n }\n }\n\n appendInitSegment(initSegment, deferred) {\n if (!this._mediaSource || this._mediaSource.readyState !== 'open') {\n // sourcebuffer creation requires mediaSource.readyState === 'open'\n // so we defer the sourcebuffer creation, until sourceopen event triggered\n this._pendingSourceBufferInit.push(initSegment);\n // make sure that this InitSegment is in the front of pending segments queue\n this._pendingSegments[initSegment.type].push(initSegment);\n return;\n }\n\n let is = initSegment;\n let mimeType = `${is.container}`;\n if (is.codec && is.codec.length > 0) {\n mimeType += `;codecs=${is.codec}`;\n }\n\n let firstInitSegment = false;\n\n Log.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType);\n this._lastInitSegments[is.type] = is;\n\n if (mimeType !== this._mimeTypes[is.type]) {\n if (!this._mimeTypes[is.type]) { // empty, first chance create sourcebuffer\n firstInitSegment = true;\n try {\n let sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType);\n sb.addEventListener('error', this.e.onSourceBufferError);\n sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n } catch (error) {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n return;\n }\n } else {\n Log.v(this.TAG, `Notice: ${is.type} mimeType changed, origin: ${this._mimeTypes[is.type]}, target: ${mimeType}`);\n }\n this._mimeTypes[is.type] = mimeType;\n }\n\n if (!deferred) {\n // deferred means this InitSegment has been pushed to pendingSegments queue\n this._pendingSegments[is.type].push(is);\n }\n if (!firstInitSegment) { // append immediately only if init segment in subsequence\n if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) {\n this._doAppendSegments();\n }\n }\n if (Browser.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) {\n // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN\n // Manually correct MediaSource.duration to make progress bar seekable, and report right duration\n this._requireSetMediaDuration = true;\n this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds\n this._updateMediaSourceDuration();\n }\n }\n\n appendMediaSegment(mediaSegment) {\n let ms = mediaSegment;\n this._pendingSegments[ms.type].push(ms);\n\n if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) {\n this._doCleanupSourceBuffer();\n }\n\n let sb = this._sourceBuffers[ms.type];\n if (sb && !sb.updating && !this._hasPendingRemoveRanges()) {\n this._doAppendSegments();\n }\n }\n\n seek(seconds) {\n // remove all appended buffers\n for (let type in this._sourceBuffers) {\n if (!this._sourceBuffers[type]) {\n continue;\n }\n\n // abort current buffer append algorithm\n let sb = this._sourceBuffers[type];\n if (this._mediaSource.readyState === 'open') {\n try {\n // If range removal algorithm is running, InvalidStateError will be throwed\n // Ignore it.\n sb.abort();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n\n // IDRList should be clear\n this._idrList.clear();\n\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n\n if (this._mediaSource.readyState === 'closed') {\n // Parent MediaSource object has been detached from HTMLMediaElement\n continue;\n }\n\n // record ranges to be remove from SourceBuffer\n for (let i = 0; i < sb.buffered.length; i++) {\n let start = sb.buffered.start(i);\n let end = sb.buffered.end(i);\n this._pendingRemoveRanges[type].push({start, end});\n }\n\n // if sb is not updating, let's remove ranges now!\n if (!sb.updating) {\n this._doRemoveRanges();\n }\n\n // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call\n // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround.\n // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230\n if (Browser.safari) {\n let lastInitSegment = this._lastInitSegments[type];\n if (lastInitSegment) {\n this._pendingSegments[type].push(lastInitSegment);\n if (!sb.updating) {\n this._doAppendSegments();\n }\n }\n }\n }\n }\n\n endOfStream() {\n let ms = this._mediaSource;\n let sb = this._sourceBuffers;\n if (!ms || ms.readyState !== 'open') {\n if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) {\n // If MediaSource hasn't turned into open state, and there're pending segments\n // Mark pending endOfStream, defer call until all pending segments appended complete\n this._hasPendingEos = true;\n }\n return;\n }\n if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {\n // If any sourcebuffer is updating, defer endOfStream operation\n // See _onSourceBufferUpdateEnd()\n this._hasPendingEos = true;\n } else {\n this._hasPendingEos = false;\n // Notify media data loading complete\n // This is helpful for correcting total duration to match last media segment\n // Otherwise MediaElement's ended event may not be triggered\n ms.endOfStream();\n }\n }\n\n getNearestKeyframe(dts) {\n return this._idrList.getLastSyncPointBeforeDts(dts);\n }\n\n _needCleanupSourceBuffer() {\n if (!this._config.autoCleanupSourceBuffer) {\n return false;\n }\n\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n if (buffered.length >= 1) {\n if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n _doCleanupSourceBuffer() {\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n let doRemove = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n\n if (start <= currentTime && currentTime < end + 3) { // padding 3 seconds\n if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) {\n doRemove = true;\n let removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration;\n this._pendingRemoveRanges[type].push({start: start, end: removeEnd});\n }\n } else if (end < currentTime) {\n doRemove = true;\n this._pendingRemoveRanges[type].push({start: start, end: end});\n }\n }\n\n if (doRemove && !sb.updating) {\n this._doRemoveRanges();\n }\n }\n }\n }\n\n _updateMediaSourceDuration() {\n let sb = this._sourceBuffers;\n if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') {\n return;\n }\n if ((sb.video && sb.video.updating) || (sb.audio && sb.audio.updating)) {\n return;\n }\n\n let current = this._mediaSource.duration;\n let target = this._pendingMediaDuration;\n\n if (target > 0 && (isNaN(current) || target > current)) {\n Log.v(this.TAG, `Update MediaSource duration from ${current} to ${target}`);\n this._mediaSource.duration = target;\n }\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n }\n\n _doRemoveRanges() {\n for (let type in this._pendingRemoveRanges) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n let sb = this._sourceBuffers[type];\n let ranges = this._pendingRemoveRanges[type];\n while (ranges.length && !sb.updating) {\n let range = ranges.shift();\n sb.remove(range.start, range.end);\n }\n }\n }\n\n _doAppendSegments() {\n let pendingSegments = this._pendingSegments;\n\n for (let type in pendingSegments) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n\n if (pendingSegments[type].length > 0) {\n let segment = pendingSegments[type].shift();\n\n if (segment.timestampOffset) {\n // For MPEG audio stream in MSE, if unbuffered-seeking occurred\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n let currentOffset = this._sourceBuffers[type].timestampOffset;\n let targetOffset = segment.timestampOffset / 1000; // in seconds\n\n let delta = Math.abs(currentOffset - targetOffset);\n if (delta > 0.1) { // If time delta > 100ms\n Log.v(this.TAG, `Update MPEG audio timestampOffset from ${currentOffset} to ${targetOffset}`);\n this._sourceBuffers[type].timestampOffset = targetOffset;\n }\n delete segment.timestampOffset;\n }\n\n if (!segment.data || segment.data.byteLength === 0) {\n // Ignore empty buffer\n continue;\n }\n\n try {\n this._sourceBuffers[type].appendBuffer(segment.data);\n this._isBufferFull = false;\n if (type === 'video' && segment.hasOwnProperty('info')) {\n this._idrList.appendArray(segment.info.syncPoints);\n }\n } catch (error) {\n this._pendingSegments[type].unshift(segment);\n if (error.code === 22) { // QuotaExceededError\n /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full\n * Currently we can only do lazy-load to avoid SourceBuffer become scattered.\n * SourceBuffer eviction policy may be changed in future version of FireFox.\n *\n * Related issues:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023\n */\n\n // report buffer full, abort network IO\n if (!this._isBufferFull) {\n this._emitter.emit(MSEEvents.BUFFER_FULL);\n }\n this._isBufferFull = true;\n } else {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n }\n }\n }\n }\n }\n\n _onSourceOpen() {\n Log.v(this.TAG, 'MediaSource onSourceOpen');\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n // deferred sourcebuffer creation / initialization\n if (this._pendingSourceBufferInit.length > 0) {\n let pendings = this._pendingSourceBufferInit;\n while (pendings.length) {\n let segment = pendings.shift();\n this.appendInitSegment(segment, true);\n }\n }\n // there may be some pending media segments, append them\n if (this._hasPendingSegments()) {\n this._doAppendSegments();\n }\n this._emitter.emit(MSEEvents.SOURCE_OPEN);\n }\n\n _onSourceEnded() {\n // fired on endOfStream\n Log.v(this.TAG, 'MediaSource onSourceEnded');\n }\n\n _onSourceClose() {\n // fired on detaching from media element\n Log.v(this.TAG, 'MediaSource onSourceClose');\n if (this._mediaSource && this.e != null) {\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded);\n this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose);\n }\n }\n\n _hasPendingSegments() {\n let ps = this._pendingSegments;\n return ps.video.length > 0 || ps.audio.length > 0;\n }\n\n _hasPendingRemoveRanges() {\n let prr = this._pendingRemoveRanges;\n return prr.video.length > 0 || prr.audio.length > 0;\n }\n\n _onSourceBufferUpdateEnd() {\n if (this._requireSetMediaDuration) {\n this._updateMediaSourceDuration();\n } else if (this._hasPendingRemoveRanges()) {\n this._doRemoveRanges();\n } else if (this._hasPendingSegments()) {\n this._doAppendSegments();\n } else if (this._hasPendingEos) {\n this.endOfStream();\n }\n this._emitter.emit(MSEEvents.UPDATE_END);\n }\n\n _onSourceBufferError(e) {\n Log.e(this.TAG, `SourceBuffer Error: ${e}`);\n // this error might not always be fatal, just ignore it\n }\n\n}\n\nexport default MSEController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {LoaderErrors} from '../io/loader.js';\nimport DemuxErrors from '../demux/demux-errors.js';\n\nexport const ErrorTypes = {\n NETWORK_ERROR: 'NetworkError',\n MEDIA_ERROR: 'MediaError',\n OTHER_ERROR: 'OtherError'\n};\n\nexport const ErrorDetails = {\n NETWORK_EXCEPTION: LoaderErrors.EXCEPTION,\n NETWORK_STATUS_CODE_INVALID: LoaderErrors.HTTP_STATUS_CODE_INVALID,\n NETWORK_TIMEOUT: LoaderErrors.CONNECTING_TIMEOUT,\n NETWORK_UNRECOVERABLE_EARLY_EOF: LoaderErrors.UNRECOVERABLE_EARLY_EOF,\n\n MEDIA_MSE_ERROR: 'MediaMSEError',\n\n MEDIA_FORMAT_ERROR: DemuxErrors.FORMAT_ERROR,\n MEDIA_FORMAT_UNSUPPORTED: DemuxErrors.FORMAT_UNSUPPORTED,\n MEDIA_CODEC_UNSUPPORTED: DemuxErrors.CODEC_UNSUPPORTED\n};","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport PlayerEvents from './player-events.js';\nimport Transmuxer from '../core/transmuxer.js';\nimport TransmuxingEvents from '../core/transmuxing-events.js';\nimport MSEController from '../core/mse-controller.js';\nimport MSEEvents from '../core/mse-events.js';\nimport {ErrorTypes, ErrorDetails} from './player-errors.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\nclass FlvPlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'FlvPlayer';\n this._type = 'FlvPlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() !== 'flv') {\n throw new InvalidArgumentException('FlvPlayer requires an flv MediaDataSource input!');\n }\n\n if (mediaDataSource.isLive === true) {\n this._config.isLive = true;\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this),\n onvSeeking: this._onvSeeking.bind(this),\n onvCanPlay: this._onvCanPlay.bind(this),\n onvStalled: this._onvStalled.bind(this),\n onvProgress: this._onvProgress.bind(this)\n };\n\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n\n this._pendingSeekTime = null; // in seconds\n this._requestSetTime = false;\n this._seekpointRecord = null;\n this._progressChecker = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n this._msectl = null;\n this._transmuxer = null;\n\n this._mseSourceOpened = false;\n this._hasPendingLoad = false;\n this._receivedCanPlay = false;\n\n this._mediaInfo = null;\n this._statisticsInfo = null;\n\n let chromeNeedIDRFix = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661)));\n this._alwaysSeekKeyframe = (chromeNeedIDRFix || Browser.msedge || Browser.msie) ? true : false;\n\n if (this._alwaysSeekKeyframe) {\n this._config.accurateSeek = false;\n }\n }\n\n destroy() {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n if (this._transmuxer) {\n this.unload();\n }\n if (this._mediaElement) {\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._statisticsInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n mediaElement.addEventListener('seeking', this.e.onvSeeking);\n mediaElement.addEventListener('canplay', this.e.onvCanPlay);\n mediaElement.addEventListener('stalled', this.e.onvStalled);\n mediaElement.addEventListener('progress', this.e.onvProgress);\n\n this._msectl = new MSEController(this._config);\n\n this._msectl.on(MSEEvents.UPDATE_END, this._onmseUpdateEnd.bind(this));\n this._msectl.on(MSEEvents.BUFFER_FULL, this._onmseBufferFull.bind(this));\n this._msectl.on(MSEEvents.SOURCE_OPEN, () => {\n this._mseSourceOpened = true;\n if (this._hasPendingLoad) {\n this._hasPendingLoad = false;\n this.load();\n }\n });\n this._msectl.on(MSEEvents.ERROR, (info) => {\n this._emitter.emit(PlayerEvents.ERROR,\n ErrorTypes.MEDIA_ERROR,\n ErrorDetails.MEDIA_MSE_ERROR,\n info\n );\n });\n\n this._msectl.attachMediaElement(mediaElement);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // We can defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._msectl.detachMediaElement();\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement.removeEventListener('seeking', this.e.onvSeeking);\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n this._mediaElement.removeEventListener('stalled', this.e.onvStalled);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n this._mediaElement = null;\n }\n if (this._msectl) {\n this._msectl.destroy();\n this._msectl = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n if (this._transmuxer) {\n throw new IllegalStateException('FlvPlayer.load() has been called, please call unload() first!');\n }\n if (this._hasPendingLoad) {\n return;\n }\n\n if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) {\n this._hasPendingLoad = true;\n return;\n }\n\n if (this._mediaElement.readyState > 0) {\n this._requestSetTime = true;\n // IE11 may throw InvalidStateError if readyState === 0\n this._mediaElement.currentTime = 0;\n }\n\n this._transmuxer = new Transmuxer(this._mediaDataSource, this._config);\n\n this._transmuxer.on(TransmuxingEvents.INIT_SEGMENT, (type, is) => {\n this._msectl.appendInitSegment(is);\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_SEGMENT, (type, ms) => {\n this._msectl.appendMediaSegment(ms);\n\n // lazyLoad check\n if (this._config.lazyLoad && !this._config.isLive) {\n let currentTime = this._mediaElement.currentTime;\n if (ms.info.endDts >= (currentTime + this._config.lazyLoadMaxDuration) * 1000) {\n if (this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n }\n });\n this._transmuxer.on(TransmuxingEvents.LOADING_COMPLETE, () => {\n this._msectl.endOfStream();\n this._emitter.emit(PlayerEvents.LOADING_COMPLETE);\n });\n this._transmuxer.on(TransmuxingEvents.RECOVERED_EARLY_EOF, () => {\n this._emitter.emit(PlayerEvents.RECOVERED_EARLY_EOF);\n });\n this._transmuxer.on(TransmuxingEvents.IO_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.NETWORK_ERROR, detail, info);\n });\n this._transmuxer.on(TransmuxingEvents.DEMUX_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.MEDIA_ERROR, detail, {code: -1, msg: info});\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_INFO, (mediaInfo) => {\n this._mediaInfo = mediaInfo;\n this._emitter.emit(PlayerEvents.MEDIA_INFO, Object.assign({}, mediaInfo));\n });\n this._transmuxer.on(TransmuxingEvents.METADATA_ARRIVED, (metadata) => {\n this._emitter.emit(PlayerEvents.METADATA_ARRIVED, metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, (data) => {\n this._emitter.emit(PlayerEvents.SCRIPTDATA_ARRIVED, data);\n });\n this._transmuxer.on(TransmuxingEvents.STATISTICS_INFO, (statInfo) => {\n this._statisticsInfo = this._fillStatisticsInfo(statInfo);\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, Object.assign({}, this._statisticsInfo));\n });\n this._transmuxer.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, (milliseconds) => {\n if (this._mediaElement && !this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = milliseconds / 1000;\n }\n });\n\n this._transmuxer.open();\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.pause();\n }\n if (this._msectl) {\n this._msectl.seek(0);\n }\n if (this._transmuxer) {\n this._transmuxer.close();\n this._transmuxer.destroy();\n this._transmuxer = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._internalSeek(seconds);\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n return Object.assign({}, this._mediaInfo);\n }\n\n get statisticsInfo() {\n if (this._statisticsInfo == null) {\n this._statisticsInfo = {};\n }\n this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo);\n return Object.assign({}, this._statisticsInfo);\n }\n\n _fillStatisticsInfo(statInfo) {\n statInfo.playerType = this._type;\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return statInfo;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n statInfo.decodedFrames = decoded;\n statInfo.droppedFrames = dropped;\n }\n\n return statInfo;\n }\n\n _onmseUpdateEnd() {\n if (!this._config.lazyLoad || this._config.isLive) {\n return;\n }\n\n let buffered = this._mediaElement.buffered;\n let currentTime = this._mediaElement.currentTime;\n let currentRangeStart = 0;\n let currentRangeEnd = 0;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n if (start <= currentTime && currentTime < end) {\n currentRangeStart = start;\n currentRangeEnd = end;\n break;\n }\n }\n\n if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n\n _onmseBufferFull() {\n Log.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task');\n if (this._progressChecker == null) {\n this._suspendTransmuxer();\n }\n }\n\n _suspendTransmuxer() {\n if (this._transmuxer) {\n this._transmuxer.pause();\n\n if (this._progressChecker == null) {\n this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000);\n }\n }\n }\n\n _checkProgressAndResume() {\n let currentTime = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n let needResume = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (currentTime >= from && currentTime < to) {\n if (currentTime >= to - this._config.lazyLoadRecoverDuration) {\n needResume = true;\n }\n break;\n }\n }\n\n if (needResume) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n if (needResume) {\n Log.v(this.TAG, 'Continue loading from paused position');\n this._transmuxer.resume();\n }\n }\n }\n\n _isTimepointBuffered(seconds) {\n let buffered = this._mediaElement.buffered;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (seconds >= from && seconds < to) {\n return true;\n }\n }\n return false;\n }\n\n _internalSeek(seconds) {\n let directSeek = this._isTimepointBuffered(seconds);\n\n let directSeekBegin = false;\n let directSeekBeginTime = 0;\n\n if (seconds < 1.0 && this._mediaElement.buffered.length > 0) {\n let videoBeginTime = this._mediaElement.buffered.start(0);\n if ((videoBeginTime < 1.0 && seconds < videoBeginTime) || Browser.safari) {\n directSeekBegin = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n directSeekBeginTime = Browser.safari ? 0.1 : videoBeginTime;\n }\n }\n\n if (directSeekBegin) { // seek to video begin, set currentTime directly if beginPTS buffered\n this._requestSetTime = true;\n this._mediaElement.currentTime = directSeekBeginTime;\n } else if (directSeek) { // buffered position\n if (!this._alwaysSeekKeyframe) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n } else {\n let idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000));\n this._requestSetTime = true;\n if (idr != null) {\n this._mediaElement.currentTime = idr.dts / 1000;\n } else {\n this._mediaElement.currentTime = seconds;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n } else {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n this._msectl.seek(seconds);\n this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds\n // no need to set mediaElement.currentTime if non-accurateSeek,\n // just wait for the recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n }\n }\n }\n\n _checkAndApplyUnbufferedSeekpoint() {\n if (this._seekpointRecord) {\n if (this._seekpointRecord.recordTime <= this._now() - 100) {\n let target = this._mediaElement.currentTime;\n this._seekpointRecord = null;\n if (!this._isTimepointBuffered(target)) {\n if (this._progressChecker != null) {\n window.clearTimeout(this._progressChecker);\n this._progressChecker = null;\n }\n // .currentTime is consists with .buffered timestamp\n // Chrome/Edge use DTS, while FireFox/Safari use PTS\n this._msectl.seek(target);\n this._transmuxer.seek(Math.floor(target * 1000));\n // set currentTime if accurateSeek, or wait for recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = target;\n }\n }\n } else {\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n }\n }\n\n _checkAndResumeStuckPlayback(stalled) {\n let media = this._mediaElement;\n if (stalled || !this._receivedCanPlay || media.readyState < 2) { // HAVE_CURRENT_DATA\n let buffered = media.buffered;\n if (buffered.length > 0 && media.currentTime < buffered.start(0)) {\n Log.w(this.TAG, `Playback seems stuck at ${media.currentTime}, seek to ${buffered.start(0)}`);\n this._requestSetTime = true;\n this._mediaElement.currentTime = buffered.start(0);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n } else {\n // Playback didn't stuck, remove progress event listener\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n }\n\n _onvSeeking(e) { // handle seeking request from browser's progress bar\n let target = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n if (this._requestSetTime) {\n this._requestSetTime = false;\n return;\n }\n\n if (target < 1.0 && buffered.length > 0) {\n // seek to video begin, set currentTime directly if beginPTS buffered\n let videoBeginTime = buffered.start(0);\n if ((videoBeginTime < 1.0 && target < videoBeginTime) || Browser.safari) {\n this._requestSetTime = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n this._mediaElement.currentTime = Browser.safari ? 0.1 : videoBeginTime;\n return;\n }\n }\n\n if (this._isTimepointBuffered(target)) {\n if (this._alwaysSeekKeyframe) {\n let idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000));\n if (idr != null) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = idr.dts / 1000;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n return;\n }\n\n this._seekpointRecord = {\n seekPoint: target,\n recordTime: this._now()\n };\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n\n _onvCanPlay(e) {\n this._receivedCanPlay = true;\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n }\n\n _onvStalled(e) {\n this._checkAndResumeStuckPlayback(true);\n }\n\n _onvProgress(e) {\n this._checkAndResumeStuckPlayback();\n }\n\n}\n\nexport default FlvPlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport PlayerEvents from './player-events.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\n// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. \nclass NativePlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'NativePlayer';\n this._type = 'NativePlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() === 'flv') {\n throw new InvalidArgumentException('NativePlayer does\\'t support flv MediaDataSource input!');\n }\n if (mediaDataSource.hasOwnProperty('segments')) {\n throw new InvalidArgumentException(`NativePlayer(${mediaDataSource.type}) doesn't support multipart playback!`);\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this)\n };\n\n this._pendingSeekTime = null;\n this._statisticsReporter = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n }\n\n destroy() {\n if (this._mediaElement) {\n this.unload();\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) { // HAVE_NOTHING\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // Defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement = null;\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n this._mediaElement.src = this._mediaDataSource.url;\n\n if (this._mediaElement.readyState > 0) {\n this._mediaElement.currentTime = 0;\n }\n\n this._mediaElement.preload = 'auto';\n this._mediaElement.load();\n this._statisticsReporter = window.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._mediaElement.currentTime = seconds;\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n let mediaPrefix = (this._mediaElement instanceof HTMLAudioElement) ? 'audio/' : 'video/';\n let info = {\n mimeType: mediaPrefix + this._mediaDataSource.type\n };\n if (this._mediaElement) {\n info.duration = Math.floor(this._mediaElement.duration * 1000);\n if (this._mediaElement instanceof HTMLVideoElement) {\n info.width = this._mediaElement.videoWidth;\n info.height = this._mediaElement.videoHeight;\n }\n }\n return info;\n }\n\n get statisticsInfo() {\n let info = {\n playerType: this._type,\n url: this._mediaDataSource.url\n };\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return info;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n info.decodedFrames = decoded;\n info.droppedFrames = dropped;\n }\n \n return info;\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n }\n\n _reportStatisticsInfo() {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n }\n\n}\n\nexport default NativePlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Polyfill from './utils/polyfill.js';\nimport Features from './core/features.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './io/loader.js';\nimport FlvPlayer from './player/flv-player.js';\nimport NativePlayer from './player/native-player.js';\nimport PlayerEvents from './player/player-events.js';\nimport {ErrorTypes, ErrorDetails} from './player/player-errors.js';\nimport LoggingControl from './utils/logging-control.js';\nimport {InvalidArgumentException} from './utils/exception.js';\n\n// here are all the interfaces\n\n// install polyfills\nPolyfill.install();\n\n\n// factory method\nfunction createPlayer(mediaDataSource, optionalConfig) {\n let mds = mediaDataSource;\n if (mds == null || typeof mds !== 'object') {\n throw new InvalidArgumentException('MediaDataSource must be an javascript object!');\n }\n\n if (!mds.hasOwnProperty('type')) {\n throw new InvalidArgumentException('MediaDataSource must has type field to indicate video file type!');\n }\n\n switch (mds.type) {\n case 'flv':\n return new FlvPlayer(mds, optionalConfig);\n default:\n return new NativePlayer(mds, optionalConfig);\n }\n}\n\n\n// feature detection\nfunction isSupported() {\n return Features.supportMSEH264Playback();\n}\n\nfunction getFeatureList() {\n return Features.getFeatureList();\n}\n\n\n// interfaces\nlet flvjs = {};\n\nflvjs.createPlayer = createPlayer;\nflvjs.isSupported = isSupported;\nflvjs.getFeatureList = getFeatureList;\n\nflvjs.BaseLoader = BaseLoader;\nflvjs.LoaderStatus = LoaderStatus;\nflvjs.LoaderErrors = LoaderErrors;\n\nflvjs.Events = PlayerEvents;\nflvjs.ErrorTypes = ErrorTypes;\nflvjs.ErrorDetails = ErrorDetails;\n\nflvjs.FlvPlayer = FlvPlayer;\nflvjs.NativePlayer = NativePlayer;\nflvjs.LoggingControl = LoggingControl;\n\nObject.defineProperty(flvjs, 'version', {\n enumerable: true,\n get: function () {\n // replace by webpack.DefinePlugin\n return __VERSION__;\n }\n});\n\nexport default flvjs;","// entry/index file\n\n// make it compatible with browserify's umd wrapper\nmodule.exports = require('./flv.js').default;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Utility class to calculate realtime network I/O speed\nclass SpeedSampler {\n\n constructor() {\n // milliseconds\n this._firstCheckpoint = 0;\n this._lastCheckpoint = 0;\n this._intervalBytes = 0;\n this._totalBytes = 0;\n this._lastSecondBytes = 0;\n\n // compatibility detection\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n }\n\n reset() {\n this._firstCheckpoint = this._lastCheckpoint = 0;\n this._totalBytes = this._intervalBytes = 0;\n this._lastSecondBytes = 0;\n }\n\n addBytes(bytes) {\n if (this._firstCheckpoint === 0) {\n this._firstCheckpoint = this._now();\n this._lastCheckpoint = this._firstCheckpoint;\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else if (this._now() - this._lastCheckpoint < 1000) {\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else { // duration >= 1000\n this._lastSecondBytes = this._intervalBytes;\n this._intervalBytes = bytes;\n this._totalBytes += bytes;\n this._lastCheckpoint = this._now();\n }\n }\n\n get currentKBps() {\n this.addBytes(0);\n\n let durationSeconds = (this._now() - this._lastCheckpoint) / 1000;\n if (durationSeconds == 0) durationSeconds = 1;\n return (this._intervalBytes / durationSeconds) / 1024;\n }\n\n get lastSecondKBps() {\n this.addBytes(0);\n\n if (this._lastSecondBytes !== 0) {\n return this._lastSecondBytes / 1024;\n } else { // lastSecondBytes === 0\n if (this._now() - this._lastCheckpoint >= 500) {\n // if time interval since last checkpoint has exceeded 500ms\n // the speed is nearly accurate\n return this.currentKBps;\n } else {\n // We don't know\n return 0;\n }\n }\n }\n\n get averageKBps() {\n let durationSeconds = (this._now() - this._firstCheckpoint) / 1000;\n return (this._totalBytes / durationSeconds) / 1024;\n }\n\n}\n\nexport default SpeedSampler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* fetch + stream IO loader. Currently working on chrome 43+.\n * fetch provides a better alternative http API to XMLHttpRequest\n *\n * fetch spec https://fetch.spec.whatwg.org/\n * stream spec https://streams.spec.whatwg.org/\n */\nclass FetchStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n // fetch + stream is broken on Microsoft Edge. Disable before build 15048.\n // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/\n // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist.\n let isWorkWellEdge = Browser.msedge && Browser.version.minor >= 15048;\n let browserNotBlacklisted = Browser.msedge ? isWorkWellEdge : true;\n return (self.fetch && self.ReadableStream && browserNotBlacklisted);\n } catch (e) {\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('fetch-stream-loader');\n this.TAG = 'FetchStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n\n let headers = new self.Headers();\n\n if (typeof seekConfig.headers === 'object') {\n let configHeaders = seekConfig.headers;\n for (let key in configHeaders) {\n if (configHeaders.hasOwnProperty(key)) {\n headers.append(key, configHeaders[key]);\n }\n }\n }\n\n let params = {\n method: 'GET',\n headers: headers,\n mode: 'cors',\n cache: 'default',\n // The default policy of Fetch API in the whatwg standard\n // Safari incorrectly indicates 'no-referrer' as default policy, fuck it\n referrerPolicy: 'no-referrer-when-downgrade'\n };\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n for (let key in this._config.headers) {\n headers.append(key, this._config.headers[key]);\n }\n }\n\n // cors is enabled by default\n if (dataSource.cors === false) {\n // no-cors means 'disregard cors policy', which can only be used in ServiceWorker\n params.mode = 'same-origin';\n }\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n params.credentials = 'include';\n }\n\n // referrerPolicy from config\n if (dataSource.referrerPolicy) {\n params.referrerPolicy = dataSource.referrerPolicy;\n }\n\n // add abort controller, by wmlgl 2019-5-10 12:21:27\n if (self.AbortController) {\n this._abortController = new self.AbortController();\n params.signal = this._abortController.signal; \n }\n\n this._status = LoaderStatus.kConnecting;\n self.fetch(seekConfig.url, params).then((res) => {\n if (this._requestAbort) {\n this._status = LoaderStatus.kIdle;\n res.body.cancel();\n return;\n }\n if (res.ok && (res.status >= 200 && res.status <= 299)) {\n if (res.url !== seekConfig.url) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(res.url);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n let lengthHeader = res.headers.get('Content-Length');\n if (lengthHeader != null) {\n this._contentLength = parseInt(lengthHeader);\n if (this._contentLength !== 0) {\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n return this._pump.call(this, res.body.getReader());\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: res.status, msg: res.statusText});\n } else {\n throw new RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText);\n }\n }\n }).catch((e) => {\n if (this._abortController && this._abortController.signal.aborted) {\n return;\n }\n\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, {code: -1, msg: e.message});\n } else {\n throw e;\n }\n });\n }\n\n abort() {\n this._requestAbort = true;\n\n if (this._status !== LoaderStatus.kBuffering || !Browser.chrome) {\n // Chrome may throw Exception-like things here, avoid using if is buffering\n if (this._abortController) {\n try {\n this._abortController.abort();\n } catch (e) {}\n }\n }\n }\n\n _pump(reader) { // ReadableStreamReader\n return reader.read().then((result) => {\n if (result.done) {\n // First check received length\n if (this._contentLength !== null && this._receivedLength < this._contentLength) {\n // Report Early-EOF\n this._status = LoaderStatus.kError;\n let type = LoaderErrors.EARLY_EOF;\n let info = {code: -1, msg: 'Fetch stream meet Early-EOF'};\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n } else {\n // OK. Download complete\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n } else {\n if (this._abortController && this._abortController.signal.aborted) {\n this._status = LoaderStatus.kComplete;\n return;\n } else if (this._requestAbort === true) {\n this._status = LoaderStatus.kComplete;\n return reader.cancel();\n }\n\n this._status = LoaderStatus.kBuffering;\n\n let chunk = result.value.buffer;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n this._pump(reader);\n }\n }).catch((e) => {\n if (this._abortController && this._abortController.signal.aborted) {\n this._status = LoaderStatus.kComplete;\n return;\n }\n\n if (e.code === 11 && Browser.msedge) { // InvalidStateError on Microsoft Edge\n // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call\n // Ignore the unknown exception.\n // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/\n return;\n }\n\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if ((e.code === 19 || e.message === 'network error') && // NETWORK_ERR\n (this._contentLength === null ||\n (this._contentLength !== null && this._receivedLength < this._contentLength))) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: e.code, msg: 'Fetch stream meet Early-EOF'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: e.code, msg: e.message};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n });\n }\n\n}\n\nexport default FetchStreamLoader;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'`\nclass MozChunkedLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n // Firefox 37- requires .open() to be called before setting responseType\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n return (xhr.responseType === 'moz-chunked-arraybuffer');\n } catch (e) {\n Log.w('MozChunkedLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-moz-chunked-loader');\n this.TAG = 'MozChunkedLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onloadend = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._requestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onloadend = this._onLoadEnd.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n // cors is auto detected and enabled by xhr\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n this._status = LoaderStatus.kConnecting;\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n if (this._xhr) {\n this._xhr.abort();\n }\n this._status = LoaderStatus.kComplete;\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n } else {\n this._status = LoaderStatus.kBuffering;\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n if (e.total !== null && e.total !== 0) {\n this._contentLength = e.total;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onLoadEnd(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n } else if (this._status === LoaderStatus.kError) {\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && e.loaded < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'Moz-Chunked stream meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default MozChunkedLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// Universal IO Loader, implemented by adding Range header in xhr's request header\nclass RangeLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'arraybuffer';\n return (xhr.responseType === 'arraybuffer');\n } catch (e) {\n Log.w('RangeLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-range-loader');\n this.TAG = 'RangeLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = false;\n\n this._chunkSizeKBList = [\n 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n ];\n this._currentChunkSizeKB = 384;\n this._currentSpeedNormalized = 0;\n this._zeroSpeedChunkCount = 0;\n\n this._xhr = null;\n this._speedSampler = new SpeedSampler();\n\n this._requestAbort = false;\n this._waitForTotalLength = false;\n this._totalLengthReceived = false;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n this._currentRequestRange = null;\n this._totalLength = null; // size of the entire file\n this._contentLength = null; // Content-Length of entire request range\n this._receivedLength = 0; // total received bytes\n this._lastTimeLoaded = 0; // received bytes of current request sub-range\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n get currentSpeed() {\n return this._speedSampler.lastSecondKBps;\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n this._status = LoaderStatus.kConnecting;\n\n let useRefTotalLength = false;\n if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) {\n useRefTotalLength = true;\n this._totalLength = this._dataSource.filesize;\n }\n\n if (!this._totalLengthReceived && !useRefTotalLength) {\n // We need total filesize\n this._waitForTotalLength = true;\n this._internalOpen(this._dataSource, {from: 0, to: -1});\n } else {\n // We have filesize, start loading\n this._openSubRange();\n }\n }\n\n _openSubRange() {\n let chunkSize = this._currentChunkSizeKB * 1024;\n\n let from = this._range.from + this._receivedLength;\n let to = from + chunkSize;\n\n if (this._contentLength != null) {\n if (to - this._range.from >= this._contentLength) {\n to = this._range.from + this._contentLength - 1;\n }\n }\n\n this._currentRequestRange = {from, to};\n this._internalOpen(this._dataSource, this._currentRequestRange);\n }\n\n _internalOpen(dataSource, range) {\n this._lastTimeLoaded = 0;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL) {\n if (this._currentRedirectedURL != undefined) {\n sourceURL = this._currentRedirectedURL;\n } else if (dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._currentRequestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onload = this._onLoad.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr.abort();\n this._xhr = null;\n }\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined) { // if the browser support this property\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {\n this._currentRedirectedURL = redirectedURL;\n if (this._onURLRedirect) {\n this._onURLRedirect(redirectedURL);\n }\n }\n }\n\n if ((xhr.status >= 200 && xhr.status <= 299)) {\n if (this._waitForTotalLength) {\n return;\n }\n this._status = LoaderStatus.kBuffering;\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n let openNextRange = false;\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n this._totalLengthReceived = true;\n openNextRange = true;\n\n let total = e.total;\n this._internalAbort();\n if (total != null & total !== 0) {\n this._totalLength = total;\n }\n }\n\n // calculate currrent request range's contentLength\n if (this._range.to === -1) {\n this._contentLength = this._totalLength - this._range.from;\n } else { // to !== -1\n this._contentLength = this._range.to - this._range.from + 1;\n }\n\n if (openNextRange) {\n this._openSubRange();\n return;\n }\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n\n let delta = e.loaded - this._lastTimeLoaded;\n this._lastTimeLoaded = e.loaded;\n this._speedSampler.addBytes(delta);\n }\n\n _normalizeSpeed(input) {\n let list = this._chunkSizeKBList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _onLoad(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n return;\n }\n\n this._lastTimeLoaded = 0;\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps === 0) {\n this._zeroSpeedChunkCount++;\n if (this._zeroSpeedChunkCount >= 3) {\n // Try get currentKBps after 3 chunks\n KBps = this._speedSampler.currentKBps;\n }\n }\n\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._currentSpeedNormalized !== normalized) {\n this._currentSpeedNormalized = normalized;\n this._currentChunkSizeKB = normalized;\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n let reportComplete = false;\n\n if (this._contentLength != null && this._receivedLength < this._contentLength) {\n // continue load next chunk\n this._openSubRange();\n } else {\n reportComplete = true;\n }\n\n // dispatch received chunk\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n if (reportComplete) {\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength > 0\n && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'RangeLoader meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default RangeLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FLV over WebSocket live stream\nclass WebSocketLoader extends BaseLoader {\n\n static isSupported() {\n try {\n return (typeof self.WebSocket !== 'undefined');\n } catch (e) {\n return false;\n }\n }\n\n constructor() {\n super('websocket-loader');\n this.TAG = 'WebSocketLoader';\n\n this._needStash = true;\n\n this._ws = null;\n this._requestAbort = false;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this._ws) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource) {\n try {\n let ws = this._ws = new self.WebSocket(dataSource.url);\n ws.binaryType = 'arraybuffer';\n ws.onopen = this._onWebSocketOpen.bind(this);\n ws.onclose = this._onWebSocketClose.bind(this);\n ws.onmessage = this._onWebSocketMessage.bind(this);\n ws.onerror = this._onWebSocketError.bind(this);\n\n this._status = LoaderStatus.kConnecting;\n } catch (e) {\n this._status = LoaderStatus.kError;\n\n let info = {code: e.code, msg: e.message};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n abort() {\n let ws = this._ws;\n if (ws && (ws.readyState === 0 || ws.readyState === 1)) { // CONNECTING || OPEN\n this._requestAbort = true;\n ws.close();\n }\n\n this._ws = null;\n this._status = LoaderStatus.kComplete;\n }\n\n _onWebSocketOpen(e) {\n this._status = LoaderStatus.kBuffering;\n }\n\n _onWebSocketClose(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n\n if (this._onComplete) {\n this._onComplete(0, this._receivedLength - 1);\n }\n }\n\n _onWebSocketMessage(e) {\n if (e.data instanceof ArrayBuffer) {\n this._dispatchArrayBuffer(e.data);\n } else if (e.data instanceof Blob) {\n let reader = new FileReader();\n reader.onload = () => {\n this._dispatchArrayBuffer(reader.result);\n };\n reader.readAsArrayBuffer(e.data);\n } else {\n this._status = LoaderStatus.kError;\n let info = {code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n _dispatchArrayBuffer(arraybuffer) {\n let chunk = arraybuffer;\n let byteStart = this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onWebSocketError(e) {\n this._status = LoaderStatus.kError;\n\n let info = {\n code: e.code,\n msg: e.message\n };\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default WebSocketLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass RangeSeekHandler {\n\n constructor(zeroStart) {\n this._zeroStart = zeroStart || false;\n }\n\n getConfig(url, range) {\n let headers = {};\n\n if (range.from !== 0 || range.to !== -1) {\n let param;\n if (range.to !== -1) {\n param = `bytes=${range.from.toString()}-${range.to.toString()}`;\n } else {\n param = `bytes=${range.from.toString()}-`;\n }\n headers['Range'] = param;\n } else if (this._zeroStart) {\n headers['Range'] = 'bytes=0-';\n }\n\n return {\n url: url,\n headers: headers\n };\n }\n\n removeURLParameters(seekedURL) {\n return seekedURL;\n }\n\n}\n\nexport default RangeSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass ParamSeekHandler {\n\n constructor(paramStart, paramEnd) {\n this._startName = paramStart;\n this._endName = paramEnd;\n }\n\n getConfig(baseUrl, range) {\n let url = baseUrl;\n\n if (range.from !== 0 || range.to !== -1) {\n let needAnd = true;\n if (url.indexOf('?') === -1) {\n url += '?';\n needAnd = false;\n }\n\n if (needAnd) {\n url += '&';\n }\n\n url += `${this._startName}=${range.from.toString()}`;\n\n if (range.to !== -1) {\n url += `&${this._endName}=${range.to.toString()}`;\n }\n }\n\n return {\n url: url,\n headers: {}\n };\n }\n\n removeURLParameters(seekedURL) {\n let baseURL = seekedURL.split('?')[0];\n let params = undefined;\n\n let queryIndex = seekedURL.indexOf('?');\n if (queryIndex !== -1) {\n params = seekedURL.substring(queryIndex + 1);\n }\n\n let resultParams = '';\n\n if (params != undefined && params.length > 0) {\n let pairs = params.split('&');\n\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split('=');\n let requireAnd = (i > 0);\n\n if (pair[0] !== this._startName && pair[0] !== this._endName) {\n if (requireAnd) {\n resultParams += '&';\n }\n resultParams += pairs[i];\n }\n }\n }\n\n return (resultParams.length === 0) ? baseURL : baseURL + '?' + resultParams;\n }\n\n}\n\nexport default ParamSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {LoaderStatus, LoaderErrors} from './loader.js';\nimport FetchStreamLoader from './fetch-stream-loader.js';\nimport MozChunkedLoader from './xhr-moz-chunked-loader.js';\nimport MSStreamLoader from './xhr-msstream-loader.js';\nimport RangeLoader from './xhr-range-loader.js';\nimport WebSocketLoader from './websocket-loader.js';\nimport RangeSeekHandler from './range-seek-handler.js';\nimport ParamSeekHandler from './param-seek-handler.js';\nimport {RuntimeException, IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n/**\n * DataSource: {\n * url: string,\n * filesize: number,\n * cors: boolean,\n * withCredentials: boolean\n * }\n * \n */\n\n// Manage IO Loaders\nclass IOController {\n\n constructor(dataSource, config, extraData) {\n this.TAG = 'IOController';\n\n this._config = config;\n this._extraData = extraData;\n\n this._stashInitialSize = 1024 * 384; // default initial size: 384KB\n if (config.stashInitialSize != undefined && config.stashInitialSize > 0) {\n // apply from config\n this._stashInitialSize = config.stashInitialSize;\n }\n\n this._stashUsed = 0;\n this._stashSize = this._stashInitialSize;\n this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB\n this._stashBuffer = new ArrayBuffer(this._bufferSize);\n this._stashByteStart = 0;\n this._enableStash = true;\n if (config.enableStashBuffer === false) {\n this._enableStash = false;\n }\n\n this._loader = null;\n this._loaderClass = null;\n this._seekHandler = null;\n\n this._dataSource = dataSource;\n this._isWebSocketURL = /wss?:\\/\\/(.+?)/.test(dataSource.url);\n this._refTotalLength = dataSource.filesize ? dataSource.filesize : null;\n this._totalLength = this._refTotalLength;\n this._fullRequestFlag = false;\n this._currentRange = null;\n this._redirectedURL = null;\n\n this._speedNormalized = 0;\n this._speedSampler = new SpeedSampler();\n this._speedNormalizeList = [64, 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096];\n\n this._isEarlyEofReconnecting = false;\n\n this._paused = false;\n this._resumeFrom = 0;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._selectSeekHandler();\n this._selectLoader();\n this._createLoader();\n }\n\n destroy() {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n this._loader.destroy();\n this._loader = null;\n this._loaderClass = null;\n this._dataSource = null;\n this._stashBuffer = null;\n this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0;\n this._currentRange = null;\n this._speedSampler = null;\n\n this._isEarlyEofReconnecting = false;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._extraData = null;\n }\n\n isWorking() {\n return this._loader && this._loader.isWorking() && !this._paused;\n }\n\n isPaused() {\n return this._paused;\n }\n\n get status() {\n return this._loader.status;\n }\n\n get extraData() {\n return this._extraData;\n }\n\n set extraData(data) {\n this._extraData = data;\n }\n\n // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onSeeked() {\n return this._onSeeked;\n }\n\n set onSeeked(callback) {\n this._onSeeked = callback;\n }\n\n // prototype: function onError(type: number, info: {code: number, msg: string}): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n get onRedirect() {\n return this._onRedirect;\n }\n\n set onRedirect(callback) {\n this._onRedirect = callback;\n }\n\n get onRecoveredEarlyEof() {\n return this._onRecoveredEarlyEof;\n }\n\n set onRecoveredEarlyEof(callback) {\n this._onRecoveredEarlyEof = callback;\n }\n\n get currentURL() {\n return this._dataSource.url;\n }\n\n get hasRedirect() {\n return (this._redirectedURL != null || this._dataSource.redirectedURL != undefined);\n }\n\n get currentRedirectedURL() {\n return this._redirectedURL || this._dataSource.redirectedURL;\n }\n\n // in KB/s\n get currentSpeed() {\n if (this._loaderClass === RangeLoader) {\n // SpeedSampler is inaccuracy if loader is RangeLoader\n return this._loader.currentSpeed;\n }\n return this._speedSampler.lastSecondKBps;\n }\n\n get loaderType() {\n return this._loader.type;\n }\n\n _selectSeekHandler() {\n let config = this._config;\n\n if (config.seekType === 'range') {\n this._seekHandler = new RangeSeekHandler(this._config.rangeLoadZeroStart);\n } else if (config.seekType === 'param') {\n let paramStart = config.seekParamStart || 'bstart';\n let paramEnd = config.seekParamEnd || 'bend';\n\n this._seekHandler = new ParamSeekHandler(paramStart, paramEnd);\n } else if (config.seekType === 'custom') {\n if (typeof config.customSeekHandler !== 'function') {\n throw new InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!');\n }\n this._seekHandler = new config.customSeekHandler();\n } else {\n throw new InvalidArgumentException(`Invalid seekType in config: ${config.seekType}`);\n }\n }\n\n _selectLoader() {\n if (this._config.customLoader != null) {\n this._loaderClass = this._config.customLoader;\n } else if (this._isWebSocketURL) {\n this._loaderClass = WebSocketLoader;\n } else if (FetchStreamLoader.isSupported()) {\n this._loaderClass = FetchStreamLoader;\n } else if (MozChunkedLoader.isSupported()) {\n this._loaderClass = MozChunkedLoader;\n } else if (RangeLoader.isSupported()) {\n this._loaderClass = RangeLoader;\n } else {\n throw new RuntimeException('Your browser doesn\\'t support xhr with arraybuffer responseType!');\n }\n }\n\n _createLoader() {\n this._loader = new this._loaderClass(this._seekHandler, this._config);\n if (this._loader.needStashBuffer === false) {\n this._enableStash = false;\n }\n this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this);\n this._loader.onURLRedirect = this._onURLRedirect.bind(this);\n this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this);\n this._loader.onComplete = this._onLoaderComplete.bind(this);\n this._loader.onError = this._onLoaderError.bind(this);\n }\n\n open(optionalFrom) {\n this._currentRange = {from: 0, to: -1};\n if (optionalFrom) {\n this._currentRange.from = optionalFrom;\n }\n\n this._speedSampler.reset();\n if (!optionalFrom) {\n this._fullRequestFlag = true;\n }\n\n this._loader.open(this._dataSource, Object.assign({}, this._currentRange));\n }\n\n abort() {\n this._loader.abort();\n\n if (this._paused) {\n this._paused = false;\n this._resumeFrom = 0;\n }\n }\n\n pause() {\n if (this.isWorking()) {\n this._loader.abort();\n\n if (this._stashUsed !== 0) {\n this._resumeFrom = this._stashByteStart;\n this._currentRange.to = this._stashByteStart - 1;\n } else {\n this._resumeFrom = this._currentRange.to + 1;\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._paused = true;\n }\n }\n\n resume() {\n if (this._paused) {\n this._paused = false;\n let bytes = this._resumeFrom;\n this._resumeFrom = 0;\n this._internalSeek(bytes, true);\n }\n }\n\n seek(bytes) {\n this._paused = false;\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._internalSeek(bytes, true);\n }\n\n /**\n * When seeking request is from media seeking, unconsumed stash data should be dropped\n * However, stash data shouldn't be dropped if seeking requested from http reconnection\n *\n * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer\n */\n _internalSeek(bytes, dropUnconsumed) {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n\n // dispatch & flush stash buffer before seek\n this._flushStashBuffer(dropUnconsumed);\n\n this._loader.destroy();\n this._loader = null;\n\n let requestRange = {from: bytes, to: -1};\n this._currentRange = {from: requestRange.from, to: -1};\n\n this._speedSampler.reset();\n this._stashSize = this._stashInitialSize;\n this._createLoader();\n this._loader.open(this._dataSource, requestRange);\n\n if (this._onSeeked) {\n this._onSeeked();\n }\n }\n\n updateUrl(url) {\n if (!url || typeof url !== 'string' || url.length === 0) {\n throw new InvalidArgumentException('Url must be a non-empty string!');\n }\n\n this._dataSource.url = url;\n\n // TODO: replace with new url\n }\n\n _expandBuffer(expectedBytes) {\n let bufferNewSize = this._stashSize;\n while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) {\n bufferNewSize *= 2;\n }\n\n bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB\n if (bufferNewSize === this._bufferSize) {\n return;\n }\n\n let newBuffer = new ArrayBuffer(bufferNewSize);\n\n if (this._stashUsed > 0) { // copy existing data into new buffer\n let stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed);\n let stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize);\n stashNewArray.set(stashOldArray, 0);\n }\n\n this._stashBuffer = newBuffer;\n this._bufferSize = bufferNewSize;\n }\n\n _normalizeSpeed(input) {\n let list = this._speedNormalizeList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n // binary search\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _adjustStashSize(normalized) {\n let stashSizeKB = 0;\n\n if (this._config.isLive) {\n // live stream: always use single normalized speed for size of stashSizeKB\n stashSizeKB = normalized;\n } else {\n if (normalized < 512) {\n stashSizeKB = normalized;\n } else if (normalized >= 512 && normalized <= 1024) {\n stashSizeKB = Math.floor(normalized * 1.5);\n } else {\n stashSizeKB = normalized * 2;\n }\n }\n\n if (stashSizeKB > 8192) {\n stashSizeKB = 8192;\n }\n\n let bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB\n if (this._bufferSize < bufferSize) {\n this._expandBuffer(bufferSize);\n }\n this._stashSize = stashSizeKB * 1024;\n }\n\n _dispatchChunks(chunks, byteStart) {\n this._currentRange.to = byteStart + chunks.byteLength - 1;\n return this._onDataArrival(chunks, byteStart);\n }\n\n _onURLRedirect(redirectedURL) {\n this._redirectedURL = redirectedURL;\n if (this._onRedirect) {\n this._onRedirect(redirectedURL);\n }\n }\n\n _onContentLengthKnown(contentLength) {\n if (contentLength && this._fullRequestFlag) {\n this._totalLength = contentLength;\n this._fullRequestFlag = false;\n }\n }\n\n _onLoaderChunkArrival(chunk, byteStart, receivedLength) {\n if (!this._onDataArrival) {\n throw new IllegalStateException('IOController: No existing consumer (onDataArrival) callback!');\n }\n if (this._paused) {\n return;\n }\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback\n this._isEarlyEofReconnecting = false;\n if (this._onRecoveredEarlyEof) {\n this._onRecoveredEarlyEof();\n }\n }\n\n this._speedSampler.addBytes(chunk.byteLength);\n\n // adjust stash buffer size according to network speed dynamically\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._speedNormalized !== normalized) {\n this._speedNormalized = normalized;\n this._adjustStashSize(normalized);\n }\n }\n\n if (!this._enableStash) { // disable stash\n if (this._stashUsed === 0) {\n // dispatch chunk directly to consumer;\n // check ret value (consumed bytes) and stash unconsumed to stashBuffer\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) { // unconsumed data remain.\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n } else {\n // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer.\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n let consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart);\n if (consumed < this._stashUsed && consumed > 0) { // unconsumed data remain\n let remainArray = new Uint8Array(this._stashBuffer, consumed);\n stashArray.set(remainArray, 0);\n }\n this._stashUsed -= consumed;\n this._stashByteStart += consumed;\n }\n } else { // enable stash\n if (this._stashUsed === 0 && this._stashByteStart === 0) { // seeked? or init chunk?\n // This is the first chunk after seek action\n this._stashByteStart = byteStart;\n }\n if (this._stashUsed + chunk.byteLength <= this._stashSize) {\n // just stash\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._stashSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stashUsed + chunkSize > stashSize, size limit exceeded\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n if (this._stashUsed > 0) { // There're stash datas in buffer\n // dispatch the whole stashBuffer, and stash remain data\n // then append chunk to stashBuffer (stash)\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n if (consumed < buffer.byteLength) {\n if (consumed > 0) {\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n } else {\n this._stashUsed = 0;\n this._stashByteStart += consumed;\n }\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stash buffer empty, but chunkSize > stashSize (oh, holy shit)\n // dispatch chunk directly and stash remain data\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) {\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n }\n }\n }\n }\n\n _flushStashBuffer(dropUnconsumed) {\n if (this._stashUsed > 0) {\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n let remain = buffer.byteLength - consumed;\n\n if (consumed < buffer.byteLength) {\n if (dropUnconsumed) {\n Log.w(this.TAG, `${remain} bytes unconsumed data remain when flush buffer, dropped`);\n } else {\n if (consumed > 0) {\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n return 0;\n }\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n return remain;\n }\n return 0;\n }\n\n _onLoaderComplete(from, to) {\n // Force-flush stash buffer, and drop unconsumed data\n this._flushStashBuffer(true);\n\n if (this._onComplete) {\n this._onComplete(this._extraData);\n }\n }\n\n _onLoaderError(type, data) {\n Log.e(this.TAG, `Loader error, code = ${data.code}, msg = ${data.msg}`);\n\n this._flushStashBuffer(false);\n\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer\n this._isEarlyEofReconnecting = false;\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n }\n\n switch (type) {\n case LoaderErrors.EARLY_EOF: {\n if (!this._config.isLive) {\n // Do internal http reconnect if not live stream\n if (this._totalLength) {\n let nextFrom = this._currentRange.to + 1;\n if (nextFrom < this._totalLength) {\n Log.w(this.TAG, 'Connection lost, trying reconnect...');\n this._isEarlyEofReconnecting = true;\n this._internalSeek(nextFrom, false);\n }\n return;\n }\n // else: We don't know totalLength, throw UnrecoverableEarlyEof\n }\n // live stream: throw UnrecoverableEarlyEof error to upper-layer\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n break;\n }\n case LoaderErrors.UNRECOVERABLE_EARLY_EOF:\n case LoaderErrors.CONNECTING_TIMEOUT:\n case LoaderErrors.HTTP_STATUS_CODE_INVALID:\n case LoaderErrors.EXCEPTION:\n break;\n }\n\n if (this._onError) {\n this._onError(type, data);\n } else {\n throw new RuntimeException('IOException: ' + data.msg);\n }\n }\n\n}\n\nexport default IOController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {NotImplementedException} from '../utils/exception.js';\n\nexport const LoaderStatus = {\n kIdle: 0,\n kConnecting: 1,\n kBuffering: 2,\n kError: 3,\n kComplete: 4\n};\n\nexport const LoaderErrors = {\n OK: 'OK',\n EXCEPTION: 'Exception',\n HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid',\n CONNECTING_TIMEOUT: 'ConnectingTimeout',\n EARLY_EOF: 'EarlyEof',\n UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof'\n};\n\n/* Loader has callbacks which have following prototypes:\n * function onContentLengthKnown(contentLength: number): void\n * function onURLRedirect(url: string): void\n * function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void\n * function onError(errorType: number, errorInfo: {code: number, msg: string}): void\n * function onComplete(rangeFrom: number, rangeTo: number): void\n */\nexport class BaseLoader {\n\n constructor(typeName) {\n this._type = typeName || 'undefined';\n this._status = LoaderStatus.kIdle;\n this._needStash = false;\n // callbacks\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n destroy() {\n this._status = LoaderStatus.kIdle;\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n isWorking() {\n return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering;\n }\n\n get type() {\n return this._type;\n }\n\n get status() {\n return this._status;\n }\n\n get needStashBuffer() {\n return this._needStash;\n }\n\n get onContentLengthKnown() {\n return this._onContentLengthKnown;\n }\n\n set onContentLengthKnown(callback) {\n this._onContentLengthKnown = callback;\n }\n\n get onURLRedirect() {\n return this._onURLRedirect;\n }\n\n set onURLRedirect(callback) {\n this._onURLRedirect = callback;\n }\n\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n // pure virtual\n open(dataSource, range) {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n abort() {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet Browser = {};\n\nfunction detect() {\n // modified from jquery-browser-plugin\n\n let ua = self.navigator.userAgent.toLowerCase();\n\n let match = /(edge)\\/([\\w.]+)/.exec(ua) ||\n /(opr)[\\/]([\\w.]+)/.exec(ua) ||\n /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n /(iemobile)[\\/]([\\w.]+)/.exec(ua) ||\n /(version)(applewebkit)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+).*(version)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n /(msie) ([\\w.]+)/.exec(ua) ||\n ua.indexOf('trident') >= 0 && /(rv)(?::| )([\\w.]+)/.exec(ua) ||\n ua.indexOf('compatible') < 0 && /(firefox)[ \\/]([\\w.]+)/.exec(ua) ||\n [];\n\n let platform_match = /(ipad)/.exec(ua) ||\n /(ipod)/.exec(ua) ||\n /(windows phone)/.exec(ua) ||\n /(iphone)/.exec(ua) ||\n /(kindle)/.exec(ua) ||\n /(android)/.exec(ua) ||\n /(windows)/.exec(ua) ||\n /(mac)/.exec(ua) ||\n /(linux)/.exec(ua) ||\n /(cros)/.exec(ua) ||\n [];\n\n let matched = {\n browser: match[5] || match[3] || match[1] || '',\n version: match[2] || match[4] || '0',\n majorVersion: match[4] || match[2] || '0',\n platform: platform_match[0] || ''\n };\n\n let browser = {};\n if (matched.browser) {\n browser[matched.browser] = true;\n\n let versionArray = matched.majorVersion.split('.');\n browser.version = {\n major: parseInt(matched.majorVersion, 10),\n string: matched.version\n };\n if (versionArray.length > 1) {\n browser.version.minor = parseInt(versionArray[1], 10);\n }\n if (versionArray.length > 2) {\n browser.version.build = parseInt(versionArray[2], 10);\n }\n }\n\n if (matched.platform) {\n browser[matched.platform] = true;\n }\n\n if (browser.chrome || browser.opr || browser.safari) {\n browser.webkit = true;\n }\n\n // MSIE. IE11 has 'rv' identifer\n if (browser.rv || browser.iemobile) {\n if (browser.rv) {\n delete browser.rv;\n }\n let msie = 'msie';\n matched.browser = msie;\n browser[msie] = true;\n }\n\n // Microsoft Edge\n if (browser.edge) {\n delete browser.edge;\n let msedge = 'msedge';\n matched.browser = msedge;\n browser[msedge] = true;\n }\n\n // Opera 15+\n if (browser.opr) {\n let opera = 'opera';\n matched.browser = opera;\n browser[opera] = true;\n }\n\n // Stock android browsers are marked as Safari\n if (browser.safari && browser.android) {\n let android = 'android';\n matched.browser = android;\n browser[android] = true;\n }\n\n browser.name = matched.browser;\n browser.platform = matched.platform;\n\n for (let key in Browser) {\n if (Browser.hasOwnProperty(key)) {\n delete Browser[key];\n }\n }\n Object.assign(Browser, browser);\n}\n\ndetect();\n\nexport default Browser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class RuntimeException {\n\n constructor(message) {\n this._message = message;\n }\n\n get name() {\n return 'RuntimeException';\n }\n\n get message() {\n return this._message;\n }\n\n toString() {\n return this.name + ': ' + this.message;\n }\n\n}\n\nexport class IllegalStateException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'IllegalStateException';\n }\n\n}\n\nexport class InvalidArgumentException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'InvalidArgumentException';\n }\n\n}\n\nexport class NotImplementedException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'NotImplementedException';\n }\n\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\n\nclass Log {\n\n static e(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'error', str);\n }\n\n if (!Log.ENABLE_ERROR) {\n return;\n }\n\n if (console.error) {\n console.error(str);\n } else if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static i(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'info', str);\n }\n\n if (!Log.ENABLE_INFO) {\n return;\n }\n\n if (console.info) {\n console.info(str);\n } else {\n console.log(str);\n }\n }\n\n static w(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'warn', str);\n }\n\n if (!Log.ENABLE_WARN) {\n return;\n }\n\n if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static d(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'debug', str);\n }\n\n if (!Log.ENABLE_DEBUG) {\n return;\n }\n\n if (console.debug) {\n console.debug(str);\n } else {\n console.log(str);\n }\n }\n\n static v(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'verbose', str);\n }\n\n if (!Log.ENABLE_VERBOSE) {\n return;\n }\n\n console.log(str);\n }\n\n}\n\nLog.GLOBAL_TAG = 'flv.js';\nLog.FORCE_GLOBAL_TAG = false;\nLog.ENABLE_ERROR = true;\nLog.ENABLE_INFO = true;\nLog.ENABLE_WARN = true;\nLog.ENABLE_DEBUG = true;\nLog.ENABLE_VERBOSE = true;\n\nLog.ENABLE_CALLBACK = false;\n\nLog.emitter = new EventEmitter();\n\nexport default Log;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from './logger.js';\n\nclass LoggingControl {\n\n static get forceGlobalTag() {\n return Log.FORCE_GLOBAL_TAG;\n }\n\n static set forceGlobalTag(enable) {\n Log.FORCE_GLOBAL_TAG = enable;\n LoggingControl._notifyChange();\n }\n\n static get globalTag() {\n return Log.GLOBAL_TAG;\n }\n\n static set globalTag(tag) {\n Log.GLOBAL_TAG = tag;\n LoggingControl._notifyChange();\n }\n\n static get enableAll() {\n return Log.ENABLE_VERBOSE\n && Log.ENABLE_DEBUG\n && Log.ENABLE_INFO\n && Log.ENABLE_WARN\n && Log.ENABLE_ERROR;\n }\n\n static set enableAll(enable) {\n Log.ENABLE_VERBOSE = enable;\n Log.ENABLE_DEBUG = enable;\n Log.ENABLE_INFO = enable;\n Log.ENABLE_WARN = enable;\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableDebug() {\n return Log.ENABLE_DEBUG;\n }\n\n static set enableDebug(enable) {\n Log.ENABLE_DEBUG = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableVerbose() {\n return Log.ENABLE_VERBOSE;\n }\n\n static set enableVerbose(enable) {\n Log.ENABLE_VERBOSE = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableInfo() {\n return Log.ENABLE_INFO;\n }\n\n static set enableInfo(enable) {\n Log.ENABLE_INFO = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableWarn() {\n return Log.ENABLE_WARN;\n }\n\n static set enableWarn(enable) {\n Log.ENABLE_WARN = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableError() {\n return Log.ENABLE_ERROR;\n }\n\n static set enableError(enable) {\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static getConfig() {\n return {\n globalTag: Log.GLOBAL_TAG,\n forceGlobalTag: Log.FORCE_GLOBAL_TAG,\n enableVerbose: Log.ENABLE_VERBOSE,\n enableDebug: Log.ENABLE_DEBUG,\n enableInfo: Log.ENABLE_INFO,\n enableWarn: Log.ENABLE_WARN,\n enableError: Log.ENABLE_ERROR,\n enableCallback: Log.ENABLE_CALLBACK\n };\n }\n\n static applyConfig(config) {\n Log.GLOBAL_TAG = config.globalTag;\n Log.FORCE_GLOBAL_TAG = config.forceGlobalTag;\n Log.ENABLE_VERBOSE = config.enableVerbose;\n Log.ENABLE_DEBUG = config.enableDebug;\n Log.ENABLE_INFO = config.enableInfo;\n Log.ENABLE_WARN = config.enableWarn;\n Log.ENABLE_ERROR = config.enableError;\n Log.ENABLE_CALLBACK = config.enableCallback;\n }\n\n static _notifyChange() {\n let emitter = LoggingControl.emitter;\n\n if (emitter.listenerCount('change') > 0) {\n let config = LoggingControl.getConfig();\n emitter.emit('change', config);\n }\n }\n\n static registerListener(listener) {\n LoggingControl.emitter.addListener('change', listener);\n }\n\n static removeListener(listener) {\n LoggingControl.emitter.removeListener('change', listener);\n }\n\n static addLogListener(listener) {\n Log.emitter.addListener('log', listener);\n if (Log.emitter.listenerCount('log') > 0) {\n Log.ENABLE_CALLBACK = true;\n LoggingControl._notifyChange();\n }\n }\n\n static removeLogListener(listener) {\n Log.emitter.removeListener('log', listener);\n if (Log.emitter.listenerCount('log') === 0) {\n Log.ENABLE_CALLBACK = false;\n LoggingControl._notifyChange();\n }\n }\n\n}\n\nLoggingControl.emitter = new EventEmitter();\n\nexport default LoggingControl;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass Polyfill {\n\n static install() {\n // ES6 Object.setPrototypeOf\n Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {\n obj.__proto__ = proto;\n return obj;\n };\n\n // ES6 Object.assign\n Object.assign = Object.assign || function (target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n let output = Object(target);\n for (let i = 1; i < arguments.length; i++) {\n let source = arguments[i];\n if (source !== undefined && source !== null) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n output[key] = source[key];\n }\n }\n }\n }\n return output;\n };\n\n // ES6 Promise (missing support in IE11)\n if (typeof self.Promise !== 'function') {\n require('es6-promise').polyfill();\n }\n }\n\n}\n\nPolyfill.install();\n\nexport default Polyfill;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// module factories are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(324);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/ckplayer/hls.js/LICENSE b/ckplayer/hls.js/LICENSE deleted file mode 100644 index 5123bda..0000000 --- a/ckplayer/hls.js/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2017 Dailymotion (http://www.dailymotion.com) - -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. - -src/remux/mp4-generator.js and src/demux/exp-golomb.ts implementation in this project -are derived from the HLS library for video.js (https://github.com/videojs/videojs-contrib-hls) - -That work is also covered by the Apache 2 License, following copyright: -Copyright (c) 2013-2015 Brightcove - - -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. diff --git a/ckplayer/hls.js/hls-demo.js b/ckplayer/hls.js/hls-demo.js deleted file mode 100644 index 34c86ef..0000000 --- a/ckplayer/hls.js/hls-demo.js +++ /dev/null @@ -1,42195 +0,0 @@ -typeof window !== "undefined" && -(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["HlsDemo"] = factory(); - else - root["HlsDemo"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // 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; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // 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 }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // 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 = "/dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./demo/main.js"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./demo/chart/chartjs-horizontal-bar.ts": -/*!**********************************************!*\ - !*** ./demo/chart/chartjs-horizontal-bar.ts ***! - \**********************************************/ -/*! exports provided: applyChartInstanceOverrides, hhmmss */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "applyChartInstanceOverrides", function() { return applyChartInstanceOverrides; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hhmmss", function() { return hhmmss; }); -/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! chart.js */ "./node_modules/chart.js/dist/Chart.js"); -/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chart_js__WEBPACK_IMPORTED_MODULE_0__); -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); } - - // Modify horizontalBar so that each dataset (fragments, timeRanges) draws on the same row (level, track or buffer) - -chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.controllers.horizontalBar.prototype.calculateBarValuePixels = function (datasetIndex, index, options) { - var chart = this.chart; - - var scale = this._getValueScale(); - - var datasets = chart.data.datasets; - - if (!datasets) { - throw new Error("Chart datasets are " + datasets); - } - - scale._parseValue = scaleParseValue; - var obj = datasets[datasetIndex].data[index]; - - var value = scale._parseValue(obj); - - var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max; - var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max; - var base = scale.getPixelForValue(start); - var head = scale.getPixelForValue(start + length); - var size = head - base; - return { - size: size, - base: base, - head: head, - center: head + size / 2 - }; -}; - -chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.controllers.horizontalBar.prototype.calculateBarIndexPixels = function (datasetIndex, index, ruler, options) { - var rowHeight = options.barThickness; - var size = rowHeight * options.categoryPercentage; - var center = ruler.start + (datasetIndex * rowHeight + rowHeight / 2); - return { - base: center - size / 2, - head: center + size / 2, - center: center, - size: size - }; -}; - -chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.controllers.horizontalBar.prototype.draw = function () { - var rects = this.getMeta().data; - var len = rects.length; - var dataset = this.getDataset(); - - if (len !== dataset.data.length) { - // View does not match dataset (wait for redraw) - return; - } - - var chart = this.chart; - - var scale = this._getValueScale(); - - scale._parseValue = scaleParseValue; - var ctx = chart.ctx; - var chartArea = chart.chartArea; - chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.helpers.canvas.clipArea(ctx, chartArea); - - if (!this.lineHeight) { - this.lineHeight = Math.ceil(ctx.measureText('0').actualBoundingBoxAscent) + 2; - } - - var lineHeight = this.lineHeight; - var range = 0; - - for (var i = 0; i < len; ++i) { - var rect = rects[i]; - var view = rect._view; - - if (!intersects(view.base, view.x, chartArea.left, chartArea.right)) { - // Do not draw elements outside of the chart's viewport - continue; - } - - var obj = dataset.data[i]; - - var val = scale._parseValue(obj); - - if (!isNaN(val.min) && !isNaN(val.max)) { - var dataType = obj.dataType; - var stats = obj.stats; - var isPart = dataType === 'part'; - var isFragmentHint = dataType === 'fragmentHint'; - var isFragment = dataType === 'fragment' || isPart || isFragmentHint; - var isCue = dataType === 'cue'; - - if (isCue) { - view.y += view.height * 0.5 * (i % 2) - view.height * 0.25; - } else if (isPart) { - view.height -= 22; - } - - var bounds = boundingRects(view); - var drawText = bounds.w > lineHeight * 1.5 && !isFragmentHint; - - if (isFragment || isCue) { - if (drawText) { - view.borderWidth = 1; - - if (i === 0) { - view.borderSkipped = false; - } - } else { - range = range || scale.getValueForPixel(chartArea.right) - scale.getValueForPixel(chartArea.left); - - if (range > 300 || isCue) { - view.borderWidth = 0; - } - } - - if (isFragmentHint) { - view.borderWidth = 0; - view.backgroundColor = 'rgba(0, 0, 0, 0.1)'; - } else { - view.backgroundColor = "rgba(0, 0, 0, " + (0.05 + i % 2 / 12) + ")"; - } - } - - rect.draw(); - - if (isFragment) { - if (!stats) { - stats = {}; - } - - if (isPart) { - ctx.fillStyle = 'rgba(255, 255, 255, 0.5)'; - ctx.fillRect(bounds.x, bounds.y, bounds.w, bounds.h); - } - - if (stats.aborted) { - ctx.fillStyle = 'rgba(100, 0, 0, 0.3)'; - ctx.fillRect(bounds.x, bounds.y, bounds.w, bounds.h); - } - - if (stats.loaded && stats.total) { - ctx.fillStyle = 'rgba(50, 20, 100, 0.3)'; - ctx.fillRect(bounds.x, bounds.y, bounds.w * stats.loaded / stats.total, bounds.h); - } - } else if (isCue) { - if (obj.active) { - ctx.fillStyle = 'rgba(100, 100, 10, 0.4)'; - ctx.fillRect(bounds.x, bounds.y, bounds.w, bounds.h); - } - } - - if (drawText) { - var start = val.start; // obj.start; - - ctx.fillStyle = 'rgb(0, 0, 0)'; - - if (stats) { - var snBounds = _extends({}, bounds); - - if (obj.cc) { - var ccLabel = "cc:" + obj.cc; - var ccWidth = Math.min(ctx.measureText(ccLabel).width + 2, snBounds.w / 2 - 2); - - if (ccWidth) { - ctx.fillText(ccLabel, snBounds.x + 2, snBounds.y + lineHeight, snBounds.w / 2 - 4); - snBounds.x += ccWidth; - snBounds.w -= ccWidth; - } - } - - var snLabel = isPart ? "part: " + obj.index : "sn: " + obj.sn; - var textWidth = Math.min(ctx.measureText(snLabel).width + 2, snBounds.w - 2); - ctx.fillText(snLabel, snBounds.x + snBounds.w - textWidth, snBounds.y + lineHeight, snBounds.w - 4); - } - - if (isCue) { - var strLength = Math.min(30, Math.ceil(bounds.w / (lineHeight / 3))); - ctx.fillText(('' + obj.content).substr(0, strLength), bounds.x + 2, bounds.y + bounds.h - 3, bounds.w - 5); - } else if (!isPart) { - var _float = start !== (start | 0); - - var fixedDigits = _float ? Math.min(5, Math.max(1, Math.floor(bounds.w / 10 - 1))) : 0; - var startString = hhmmss(start, fixedDigits); - ctx.fillText(startString, bounds.x + 2, bounds.y + bounds.h - 3, bounds.w - 5); - } - } - } - } - - chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.helpers.canvas.unclipArea(chart.ctx); -}; - -function applyChartInstanceOverrides(chart) { - Object.keys(chart.scales).forEach(function (axis) { - var scale = chart.scales[axis]; - scale._parseValue = scaleParseValue; - }); -} - -function scaleParseValue(value) { - if (value === undefined) { - console.warn('Chart values undefined (update chart)'); - return {}; - } - - var start; - var end; - var min; - var max; - - if (Array.isArray(value)) { - start = +this.getRightValue(value[0]); - end = +this.getRightValue(value[1]); - min = Math.min(start, end); - max = Math.max(start, end); - } else { - start = +this.getRightValue(value.start); - - if ('end' in value) { - end = +this.getRightValue(value.end); - } else { - end = +this.getRightValue(value.start + value.duration); - } - - min = Math.min(start, end); - max = Math.max(start, end); - } - - return { - min: min, - max: max, - start: start, - end: end - }; -} - -function intersects(x1, x2, x3, x4) { - return x2 > x3 && x1 < x4; -} - -function boundingRects(vm) { - var half = vm.height / 2; - var left = Math.min(vm.x, vm.base); - var right = Math.max(vm.x, vm.base); - var top = vm.y - half; - var bottom = vm.y + half; - return { - x: left, - y: top, - w: right - left, - h: bottom - top - }; -} - -function hhmmss(value, fixedDigits) { - var h = value / 3600 | 0; - var m = (value / 60 | 0) % 60; - var s = value % 60; - return (h + ":" + pad(m, 2) + ":" + pad(s.toFixed(fixedDigits), fixedDigits ? fixedDigits + 3 : 2)).replace(/^(?:0+:?)*(\d.*?)(?:\.0*)?$/, '$1'); -} - -function pad(str, length) { - str = '' + str; - - while (str.length < length) { - str = '0' + str; - } - - return str; -} - -/***/ }), - -/***/ "./demo/chart/timeline-chart.ts": -/*!**************************************!*\ - !*** ./demo/chart/timeline-chart.ts ***! - \**************************************/ -/*! exports provided: TimelineChart */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineChart", function() { return TimelineChart; }); -/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! chart.js */ "./node_modules/chart.js/dist/Chart.js"); -/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chart_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _chartjs_horizontal_bar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chartjs-horizontal-bar */ "./demo/chart/chartjs-horizontal-bar.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; } - - - -var X_AXIS_SECONDS = 'x-axis-seconds'; -var TimelineChart = /*#__PURE__*/function () { - function TimelineChart(canvas, chartJsOptions) { - var _this = this; - - this.chart = void 0; - this.rafDebounceRequestId = -1; - this.imageDataBuffer = null; - this.media = null; - this.tracksChangeHandler = void 0; - this.cuesChangeHandler = void 0; - this.hidden = true; - this.zoom100 = 60; - var ctx = canvas.getContext('2d'); - - if (!ctx) { - throw new Error("Could not get CanvasRenderingContext2D from canvas: " + canvas); - } - - var chart = this.chart = self.chart = new chart_js__WEBPACK_IMPORTED_MODULE_0___default.a(ctx, { - type: 'horizontalBar', - data: { - labels: [], - datasets: [] - }, - options: _extends(getChartOptions(), chartJsOptions), - plugins: [{ - afterRender: function afterRender(chart) { - _this.imageDataBuffer = null; - - _this.drawCurrentTime(); - } - }] - }); - Object(_chartjs_horizontal_bar__WEBPACK_IMPORTED_MODULE_1__["applyChartInstanceOverrides"])(chart); - - canvas.ondblclick = function (event) { - var chart = _this.chart; - var chartArea = chart.chartArea; - var element = chart.getElementAtEvent(event); - var pos = chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.helpers.getRelativePosition(event, chart); - var scale = _this.chartScales[X_AXIS_SECONDS]; // zoom in when double clicking near elements in chart area - - if (element.length || pos.x > chartArea.left) { - var amount = event.getModifierState('Shift') ? -1.0 : 0.5; - - _this.zoom(scale, pos, amount); - } else { - scale.options.ticks.min = 0; - scale.options.ticks.max = _this.zoom100; - } - - _this.update(); - }; - - canvas.onwheel = function (event) { - if (event.deltaMode) { - // exit if wheel is in page or line scrolling mode - return; - } - - var chart = _this.chart; - var chartArea = chart.chartArea; - var pos = chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.helpers.getRelativePosition(event, chart); // zoom when scrolling over chart elements - - if (pos.x > chartArea.left - 11) { - var scale = _this.chartScales[X_AXIS_SECONDS]; - - if (event.deltaY) { - var direction = -event.deltaY / Math.abs(event.deltaY); - var normal = Math.min(333, Math.abs(event.deltaY)) / 1000; - var ease = 1 - (1 - normal) * (1 - normal); - - _this.zoom(scale, pos, ease * direction); - } else if (event.deltaX) { - _this.pan(scale, event.deltaX / 10, scale.min, scale.max); - } - - event.preventDefault(); - } - }; - - var moved = false; - var gestureScale = 1; - - canvas.onpointerdown = function (downEvent) { - if (!downEvent.isPrimary || gestureScale !== 1) { - return; - } - - var chart = _this.chart; - var chartArea = chart.chartArea; - var pos = chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.helpers.getRelativePosition(downEvent, chart); // pan when dragging over chart elements - - if (pos.x > chartArea.left) { - var scale = _this.chartScales[X_AXIS_SECONDS]; - var startX = downEvent.clientX; - var min = scale.min, - max = scale.max; - var xToVal = (max - min) / scale.width; - moved = false; - canvas.setPointerCapture(downEvent.pointerId); - - canvas.onpointermove = function (moveEvent) { - if (!downEvent.isPrimary || gestureScale !== 1) { - return; - } - - var movedX = startX - moveEvent.clientX; - var movedValue = movedX * xToVal; - moved = moved || Math.abs(movedX) > 8; - - _this.pan(scale, movedValue, min, max); - }; - } - }; - - canvas.onpointerup = canvas.onpointercancel = function (upEvent) { - if (canvas.onpointermove) { - canvas.onpointermove = null; - canvas.releasePointerCapture(upEvent.pointerId); - } - - if (!moved && upEvent.isPrimary) { - _this.click(upEvent); - } - }; // Gesture events are for iOS and easier to implement than pinch-zoom with multiple pointers for all browsers - // @ts-ignore - - - canvas.ongesturestart = function (event) { - gestureScale = 1; - event.preventDefault(); - }; // @ts-ignore - - - canvas.ongestureend = function (event) { - gestureScale = 1; - }; // @ts-ignore - - - canvas.ongesturechange = function (event) { - var chart = _this.chart; - var chartArea = chart.chartArea; - var pos = chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.helpers.getRelativePosition(event, chart); // zoom when scrolling over chart elements - - if (pos.x > chartArea.left) { - var scale = _this.chartScales[X_AXIS_SECONDS]; - var amount = event.scale - gestureScale; - - _this.zoom(scale, pos, amount); - - gestureScale = event.scale; - } - }; - } - - var _proto = TimelineChart.prototype; - - _proto.click = function click(event) { - // Log object on click and seek to position - var chart = this.chart; - var element = chart.getElementAtEvent(event); - - if (element.length && chart.data.datasets) { - var _self$hls; - - var dataset = chart.data.datasets[element[0]._datasetIndex]; - var obj = dataset.data[element[0]._index]; // eslint-disable-next-line no-console - - console.log(obj); - - if ((_self$hls = self.hls) !== null && _self$hls !== void 0 && _self$hls.media) { - var scale = this.chartScales[X_AXIS_SECONDS]; - var pos = chart_js__WEBPACK_IMPORTED_MODULE_0___default.a.helpers.getRelativePosition(event, chart); - self.hls.media.currentTime = scale.getValueForPixel(pos.x); - } - } - }; - - _proto.pan = function pan(scale, amount, min, max) { - if (amount === 0) { - return; - } - - var pan = amount; - - if (amount > 0) { - pan = Math.min(this.zoom100 + 10 - max, amount); - } else { - pan = Math.max(-10 - min, amount); - } - - scale.options.ticks.min = min + pan; - scale.options.ticks.max = max + pan; - this.updateOnRepaint(); - }; - - _proto.zoom = function zoom(scale, pos, amount) { - var range = scale.max - scale.min; - var diff = range * amount; - var minPercent = (scale.getValueForPixel(pos.x) - scale.min) / range; - var maxPercent = 1 - minPercent; - var minDelta = diff * minPercent; - var maxDelta = diff * maxPercent; - scale.options.ticks.min = Math.max(-10, scale.min + minDelta); - scale.options.ticks.max = Math.min(this.zoom100 + 10, scale.max - maxDelta); - this.updateOnRepaint(); - }; - - _proto.reset = function reset() { - var scale = this.chartScales[X_AXIS_SECONDS]; - scale.options.ticks.min = 0; - scale.options.ticks.max = 60; - var _this$chart$data = this.chart.data, - labels = _this$chart$data.labels, - datasets = _this$chart$data.datasets; - - if (labels && datasets) { - labels.length = 0; - datasets.length = 0; - this.resize(datasets); - } - }; - - _proto.update = function update() { - var _this$chart$ctx; - - if (this.hidden || !((_this$chart$ctx = this.chart.ctx) !== null && _this$chart$ctx !== void 0 && _this$chart$ctx.canvas.width)) { - return; - } - - self.cancelAnimationFrame(this.rafDebounceRequestId); - this.chart.update({ - duration: 0, - lazy: true - }); - }; - - _proto.updateOnRepaint = function updateOnRepaint() { - var _this2 = this; - - if (this.hidden) { - return; - } - - self.cancelAnimationFrame(this.rafDebounceRequestId); - this.rafDebounceRequestId = self.requestAnimationFrame(function () { - return _this2.update(); - }); - }; - - _proto.resize = function resize(datasets) { - var _this3 = this; - - if (this.hidden) { - return; - } - - if (datasets !== null && datasets !== void 0 && datasets.length) { - var _this$chart$canvas; - - var scale = this.chartScales[X_AXIS_SECONDS]; - var top = this.chart.chartArea.top; - var height = top + datasets.reduce(function (val, dataset) { - return val + dataset.barThickness; - }, 0) + scale.height + 5; - var container = (_this$chart$canvas = this.chart.canvas) === null || _this$chart$canvas === void 0 ? void 0 : _this$chart$canvas.parentElement; - - if (container) { - container.style.height = height + "px"; - } - } - - self.cancelAnimationFrame(this.rafDebounceRequestId); - this.rafDebounceRequestId = self.requestAnimationFrame(function () { - _this3.chart.resize(); - }); - }; - - _proto.show = function show() { - this.hidden = false; - }; - - _proto.hide = function hide() { - this.hidden = true; - }; - - _proto.updateLevels = function updateLevels(levels, levelSwitched) { - var _this4 = this; - - var _this$chart$data2 = this.chart.data, - labels = _this$chart$data2.labels, - datasets = _this$chart$data2.datasets; - - if (!labels || !datasets) { - return; - } - - var _self$hls2 = self.hls, - loadLevel = _self$hls2.loadLevel, - nextLoadLevel = _self$hls2.nextLoadLevel, - nextAutoLevel = _self$hls2.nextAutoLevel; // eslint-disable-next-line no-undefined - - var currentLevel = levelSwitched !== undefined ? levelSwitched : self.hls.currentLevel; - levels.forEach(function (level, i) { - var index = level.id || i; - labels.push(getLevelName(level, index)); - var borderColor = null; - - if (currentLevel === i) { - borderColor = 'rgba(32, 32, 240, 1.0)'; - } else if (loadLevel === i) { - borderColor = 'rgba(255, 128, 0, 1.0)'; - } else if (nextLoadLevel === i) { - borderColor = 'rgba(200, 200, 64, 1.0)'; - } else if (nextAutoLevel === i) { - borderColor = 'rgba(160, 0, 160, 1.0)'; - } - - datasets.push(datasetWithDefaults({ - url: Array.isArray(level.url) ? level.url[level.urlId || 0] : level.url, - trackType: 'level', - borderColor: borderColor, - level: index - })); - - if (level.details) { - _this4.updateLevelOrTrack(level.details); - } - }); - this.resize(datasets); - }; - - _proto.updateAudioTracks = function updateAudioTracks(audioTracks) { - var _this5 = this; - - var _this$chart$data3 = this.chart.data, - labels = _this$chart$data3.labels, - datasets = _this$chart$data3.datasets; - - if (!labels || !datasets) { - return; - } - - var audioTrack = self.hls.audioTrack; - audioTracks.forEach(function (track, i) { - labels.push(getAudioTrackName(track, i)); - datasets.push(datasetWithDefaults({ - url: track.url, - trackType: 'audioTrack', - borderColor: audioTrack === i ? 'rgba(32, 32, 240, 1.0)' : null, - audioTrack: i - })); - - if (track.details) { - _this5.updateLevelOrTrack(track.details); - } - }); - this.resize(datasets); - }; - - _proto.updateSubtitleTracks = function updateSubtitleTracks(subtitles) { - var _this6 = this; - - var _this$chart$data4 = this.chart.data, - labels = _this$chart$data4.labels, - datasets = _this$chart$data4.datasets; - - if (!labels || !datasets) { - return; - } - - var subtitleTrack = self.hls.subtitleTrack; - subtitles.forEach(function (track, i) { - labels.push(getSubtitlesName(track, i)); - datasets.push(datasetWithDefaults({ - url: track.url, - trackType: 'subtitleTrack', - borderColor: subtitleTrack === i ? 'rgba(32, 32, 240, 1.0)' : null, - subtitleTrack: i - })); - - if (track.details) { - _this6.updateLevelOrTrack(track.details); - } - }); - this.resize(datasets); - }; - - _proto.removeType = function removeType(trackType) { - var _this$chart$data5 = this.chart.data, - labels = _this$chart$data5.labels, - datasets = _this$chart$data5.datasets; - - if (!labels || !datasets) { - return; - } - - var i = datasets.length; - - while (i--) { - if (datasets[i].trackType === trackType) { - datasets.splice(i, 1); - labels.splice(i, 1); - } - } - }; - - _proto.updateLevelOrTrack = function updateLevelOrTrack(details) { - var targetduration = details.targetduration, - totalduration = details.totalduration, - url = details.url; - var datasets = this.chart.data.datasets; - var levelDataSet = arrayFind(datasets, function (dataset) { - return stripDeliveryDirectives(url) === stripDeliveryDirectives(dataset.url || ''); - }); - - if (!levelDataSet) { - levelDataSet = arrayFind(datasets, function (dataset) { - var _details$fragments$; - - return ((_details$fragments$ = details.fragments[0]) === null || _details$fragments$ === void 0 ? void 0 : _details$fragments$.level) === dataset.level; - }); - } - - if (!levelDataSet) { - return; - } - - var data = levelDataSet.data; - data.length = 0; - - if (details.fragments) { - details.fragments.forEach(function (fragment) { - // TODO: keep track of initial playlist start and duration so that we can show drift and pts offset - // (Make that a feature of hls.js v1.0.0 fragments) - var chartFragment = _extends({ - dataType: 'fragment' - }, fragment, // Remove loader references for GC - { - loader: null - }); - - data.push(chartFragment); - }); - } - - if (details.partList) { - details.partList.forEach(function (part) { - var chartPart = _extends({ - dataType: 'part', - start: part.fragment.start + part.fragOffset - }, part, { - fragment: _extends({}, part.fragment, { - loader: null - }) - }); - - data.push(chartPart); - }); - - if (details.fragmentHint) { - var chartFragment = _extends({ - dataType: 'fragmentHint' - }, details.fragmentHint, // Remove loader references for GC - { - loader: null - }); - - data.push(chartFragment); - } - } - - var start = getPlaylistStart(details); - this.maxZoom = this.zoom100 = Math.max(start + totalduration + targetduration * 3, this.zoom100); - this.updateOnRepaint(); - } // @ts-ignore - ; - - _proto.updateFragment = function updateFragment(data) { - var datasets = this.chart.data.datasets; - var frag = data.frag; - var levelDataSet = arrayFind(datasets, function (dataset) { - return frag.baseurl === dataset.url; - }); - - if (!levelDataSet) { - levelDataSet = arrayFind(datasets, function (dataset) { - return frag.level === dataset.level; - }); - } - - if (!levelDataSet) { - return; - } // eslint-disable-next-line no-restricted-properties - - - var fragData = arrayFind(levelDataSet.data, function (fragData) { - return fragData.relurl === frag.relurl && fragData.sn === frag.sn; - }); - - if (fragData && fragData !== frag) { - _extends(fragData, frag); - } - - this.updateOnRepaint(); - }; - - _proto.updateSourceBuffers = function updateSourceBuffers(tracks, media) { - var _this7 = this; - - var _this$chart$data6 = this.chart.data, - labels = _this$chart$data6.labels, - datasets = _this$chart$data6.datasets; - - if (!labels || !datasets) { - return; - } - - var trackTypes = Object.keys(tracks).sort(function (type) { - return type === 'video' ? 1 : -1; - }); - var mediaBufferData = []; - this.removeSourceBuffers(); - this.media = media; - trackTypes.forEach(function (type) { - var track = tracks[type]; - var data = []; - var sourceBuffer = track.buffer; - var backgroundColor = { - video: 'rgba(0, 0, 255, 0.2)', - audio: 'rgba(128, 128, 0, 0.2)', - audiovideo: 'rgba(128, 128, 255, 0.2)' - }[type]; - labels.unshift(type + " buffer (" + track.id + ")"); - datasets.unshift(datasetWithDefaults({ - data: data, - categoryPercentage: 0.5, - backgroundColor: backgroundColor, - sourceBuffer: sourceBuffer - })); - sourceBuffer.addEventListener('update', function () { - try { - replaceTimeRangeTuples(sourceBuffer.buffered, data); - } catch (error) { - // eslint-disable-next-line no-console - console.warn(error); - return; - } - - replaceTimeRangeTuples(media.buffered, mediaBufferData); - - _this7.update(); - }); - }); - - if (trackTypes.length === 0) { - media.onprogress = function () { - replaceTimeRangeTuples(media.buffered, mediaBufferData); - - _this7.update(); - }; - } - - labels.unshift('media buffer'); - datasets.unshift(datasetWithDefaults({ - data: mediaBufferData, - categoryPercentage: 0.5, - backgroundColor: 'rgba(0, 255, 0, 0.2)', - media: media - })); - - media.ontimeupdate = function () { - return _this7.drawCurrentTime(); - }; // TextTrackList - - - var textTracks = media.textTracks; - - this.tracksChangeHandler = this.tracksChangeHandler || function (e) { - return _this7.setTextTracks(e.currentTarget); - }; - - textTracks.removeEventListener('addtrack', this.tracksChangeHandler); - textTracks.removeEventListener('removetrack', this.tracksChangeHandler); - textTracks.removeEventListener('change', this.tracksChangeHandler); - textTracks.addEventListener('addtrack', this.tracksChangeHandler); - textTracks.addEventListener('removetrack', this.tracksChangeHandler); - textTracks.addEventListener('change', this.tracksChangeHandler); - this.setTextTracks(textTracks); - this.resize(datasets); - }; - - _proto.removeSourceBuffers = function removeSourceBuffers() { - var _this$chart$data7 = this.chart.data, - labels = _this$chart$data7.labels, - datasets = _this$chart$data7.datasets; - - if (!labels || !datasets) { - return; - } - - var i = datasets.length; - - while (i--) { - if ((labels[0] || '').toString().indexOf('buffer') > -1) { - datasets.splice(i, 1); - labels.splice(i, 1); - } - } - }; - - _proto.setTextTracks = function setTextTracks(textTracks) { - var _this8 = this; - - var _this$chart$data8 = this.chart.data, - labels = _this$chart$data8.labels, - datasets = _this$chart$data8.datasets; - - if (!labels || !datasets) { - return; - } - - this.removeType('textTrack'); - [].forEach.call(textTracks, function (textTrack, i) { - // Uncomment to disable rending of subtitle/caption cues in the timeline - // if (textTrack.kind === 'subtitles' || textTrack.kind === 'captions') { - // return; - // } - var data = []; - labels.push((textTrack.name || textTrack.label) + " " + textTrack.kind + " (" + textTrack.mode + ")"); - datasets.push(datasetWithDefaults({ - data: data, - categoryPercentage: 0.5, - url: '', - trackType: 'textTrack', - borderColor: textTrack.mode !== 'hidden' === i ? 'rgba(32, 32, 240, 1.0)' : null, - textTrack: i - })); - - _this8.cuesChangeHandler = _this8.cuesChangeHandler || function (e) { - return _this8.updateTextTrackCues(e.currentTarget); - }; - - textTrack._data = data; - textTrack.removeEventListener('cuechange', _this8.cuesChangeHandler); - textTrack.addEventListener('cuechange', _this8.cuesChangeHandler); - - _this8.updateTextTrackCues(textTrack); - }); - this.resize(datasets); - }; - - _proto.updateTextTrackCues = function updateTextTrackCues(textTrack) { - var data = textTrack._data; - - if (!data) { - return; - } - - var activeCues = textTrack.activeCues, - cues = textTrack.cues; - data.length = 0; - - if (!cues) { - return; - } - - var length = cues.length; - var activeLength = 0; - var activeMin = Infinity; - var activeMax = 0; - - if (activeCues) { - activeLength = activeCues.length; - - for (var i = 0; i < activeLength; i++) { - var cue = activeCues[i]; - - if (!cue && activeCues.item) { - cue = activeCues.item(i); - } - - if (cue) { - activeMin = Math.min(activeMin, cue.startTime); - activeMax = cue.endTime ? Math.max(activeMax, cue.endTime) : activeMax; - } else { - activeLength--; - } - } - } - - var _loop = function _loop(_i) { - var cue = cues[_i]; - - if (!cue && cues.item) { - cue = cues.item(_i); - } - - if (!cue) { - return "continue"; - } - - var start = cue.startTime; - var end = cue.endTime; - var content = getCueLabel(cue); - var active = false; - - if (activeLength && end >= activeMin && start <= activeMax) { - active = [].some.call(activeCues, function (activeCue) { - return cuesMatch(activeCue, cue); - }); - } - - data.push({ - start: start, - end: end, - content: content, - active: active, - dataType: 'cue' - }); - }; - - for (var _i = 0; _i < length; _i++) { - var _ret = _loop(_i); - - if (_ret === "continue") continue; - } - - this.updateOnRepaint(); - }; - - _proto.drawCurrentTime = function drawCurrentTime() { - var _self$hls3; - - var chart = this.chart; - - if ((_self$hls3 = self.hls) !== null && _self$hls3 !== void 0 && _self$hls3.media && chart.data.datasets.length) { - var currentTime = self.hls.media.currentTime; - var scale = this.chartScales[X_AXIS_SECONDS]; - var ctx = chart.ctx; - - if (this.hidden || !ctx || !ctx.canvas.width) { - return; - } - - var chartArea = chart.chartArea; - var x = scale.getPixelForValue(currentTime); - ctx.restore(); - ctx.save(); - this.drawLineX(ctx, x, chartArea); - - if (x > chartArea.left && x < chartArea.right) { - ctx.fillStyle = this.getCurrentTimeColor(self.hls.media); - var y = chartArea.top + chart.data.datasets[0].barThickness + 1; - ctx.fillText(Object(_chartjs_horizontal_bar__WEBPACK_IMPORTED_MODULE_1__["hhmmss"])(currentTime, 5), x + 2, y, 100); - } - - ctx.restore(); - } - }; - - _proto.getCurrentTimeColor = function getCurrentTimeColor(video) { - if (!video.readyState || video.ended) { - return 'rgba(0, 0, 0, 0.9)'; - } - - if (video.seeking || video.readyState < 3) { - return 'rgba(255, 128, 0, 0.9)'; - } - - if (video.paused) { - return 'rgba(128, 0, 255, 0.9)'; - } - - return 'rgba(0, 0, 255, 0.9)'; - }; - - _proto.drawLineX = function drawLineX(ctx, x, chartArea) { - if (!this.imageDataBuffer) { - var devicePixelRatio = self.devicePixelRatio || 1; - this.imageDataBuffer = ctx.getImageData(0, 0, chartArea.right * devicePixelRatio, chartArea.bottom * devicePixelRatio); - } else { - ctx.fillStyle = '#ffffff'; - ctx.fillRect(0, 0, chartArea.right, chartArea.bottom); - ctx.putImageData(this.imageDataBuffer, 0, 0); - } - - if (x > chartArea.left && x < chartArea.right) { - ctx.lineWidth = 1; - ctx.strokeStyle = this.getCurrentTimeColor(self.hls.media); // alpha '0.5' - - ctx.beginPath(); - ctx.moveTo(x, chartArea.top); - ctx.lineTo(x, chartArea.bottom); - ctx.stroke(); - } - }; - - _createClass(TimelineChart, [{ - key: "chartScales", - get: function get() { - return this.chart.scales; - } - }, { - key: "minZoom", - get: function get() { - var scale = this.chartScales[X_AXIS_SECONDS]; - - if (scale) { - return scale.options.ticks.min; - } - - return 1; - } // @ts-ignore - - }, { - key: "maxZoom", - get: function get() { - var scale = this.chartScales[X_AXIS_SECONDS]; - - if (scale) { - return scale.options.ticks.max; - } - - return this.zoom100; - } // @ts-ignore - , - set: function set(x) { - var currentZoom = this.maxZoom; - var newZoom = Math.max(x, currentZoom); - - if (currentZoom === 60 && newZoom !== currentZoom) { - var scale = this.chartScales[X_AXIS_SECONDS]; - scale.options.ticks.max = newZoom; - } - } - }]); - - return TimelineChart; -}(); - -function stripDeliveryDirectives(url) { - if (url === '') { - return url; - } - - try { - var webUrl = new self.URL(url); - webUrl.searchParams.delete('_HLS_msn'); - webUrl.searchParams.delete('_HLS_part'); - webUrl.searchParams.delete('_HLS_skip'); - webUrl.searchParams.sort(); - return webUrl.href; - } catch (e) { - return url.replace(/[?&]_HLS_(?:msn|part|skip)=[^?&]+/g, ''); - } -} - -function datasetWithDefaults(options) { - return _extends({ - data: [], - xAxisID: X_AXIS_SECONDS, - barThickness: 35, - categoryPercentage: 1 - }, options); -} - -function getPlaylistStart(details) { - var _details$fragments; - - return (_details$fragments = details.fragments) !== null && _details$fragments !== void 0 && _details$fragments.length ? details.fragments[0].start : 0; -} - -function getLevelName(level, index) { - var _level$attrs; - - var label = '(main playlist)'; - - if ((_level$attrs = level.attrs) !== null && _level$attrs !== void 0 && _level$attrs.BANDWIDTH) { - label = getMainLevelAttribute(level) + "@" + level.attrs.BANDWIDTH; - - if (level.name) { - label = label + " (" + level.name + ")"; - } - } else if (level.name) { - label = level.name; - } - - return label + " L-" + index; -} - -function getMainLevelAttribute(level) { - return level.attrs.RESOLUTION || level.attrs.CODECS || level.attrs.AUDIO; -} - -function getAudioTrackName(track, index) { - var label = track.lang ? track.name + "/" + track.lang : track.name; - return label + " (" + (track.groupId || track.attrs['GROUP-ID']) + ") A-" + index; -} - -function getSubtitlesName(track, index) { - var label = track.lang ? track.name + "/" + track.lang : track.name; - return label + " (" + (track.groupId || track.attrs['GROUP-ID']) + ") S-" + index; -} - -function replaceTimeRangeTuples(timeRanges, data) { - data.length = 0; - var length = timeRanges.length; - - for (var i = 0; i < length; i++) { - data.push([timeRanges.start(i), timeRanges.end(i)]); - } -} - -function cuesMatch(cue1, cue2) { - return cue1.startTime === cue2.startTime && cue1.endTime === cue2.endTime && cue1.text === cue2.text && cue1.data === cue2.data && JSON.stringify(cue1.value) === JSON.stringify(cue2.value); -} - -function getCueLabel(cue) { - if (cue.text) { - return cue.text; - } - - var result = parseDataCue(cue); - return JSON.stringify(result); -} - -function parseDataCue(cue) { - var data = {}; - var value = cue.value; - - if (value) { - if (value.info) { - var collection = data[value.key]; - - if (collection !== Object(collection)) { - collection = {}; - data[value.key] = collection; - } - - collection[value.info] = value.data; - } else { - data[value.key] = value.data; - } - } - - return data; -} - -function getChartOptions() { - return { - animation: { - duration: 0 - }, - elements: { - rectangle: { - borderWidth: 1, - borderColor: 'rgba(20, 20, 20, 1)' - } - }, - events: ['click', 'touchstart'], - hover: { - mode: null, - animationDuration: 0 - }, - legend: { - display: false - }, - maintainAspectRatio: false, - responsiveAnimationDuration: 0, - scales: { - // TODO: additional xAxes for PTS and PDT - xAxes: [{ - id: X_AXIS_SECONDS, - ticks: { - beginAtZero: true, - sampleSize: 0, - maxRotation: 0, - callback: function callback(tickValue, i, ticks) { - if (i === 0 || i === ticks.length - 1) { - return tickValue ? '' : '0'; - } else { - return Object(_chartjs_horizontal_bar__WEBPACK_IMPORTED_MODULE_1__["hhmmss"])(tickValue, 2); - } - } - } - }], - yAxes: [{ - gridLines: { - display: false - } - }] - }, - tooltips: { - enabled: false - } - }; -} - -function arrayFind(array, predicate) { - var len = array.length >>> 0; - - if (typeof predicate !== 'function') { - throw TypeError('predicate must be a function'); - } - - var thisArg = arguments[2]; - var k = 0; - - while (k < len) { - var kValue = array[k]; - - if (predicate.call(thisArg, kValue, k, array)) { - return kValue; - } - - k++; - } // eslint-disable-next-line no-undefined - - - return undefined; -} - -/***/ }), - -/***/ "./demo/demo-utils.js": -/*!****************************!*\ - !*** ./demo/demo-utils.js ***! - \****************************/ -/*! exports provided: sortObject, copyTextToClipboard */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sortObject", function() { return sortObject; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyTextToClipboard", function() { return copyTextToClipboard; }); -function sortObject(obj) { - if (typeof obj !== 'object') { - return obj; - } - - var temp = {}; - var keys = []; - - for (var key in obj) { - keys.push(key); - } - - keys.sort(); - - for (var index in keys) { - temp[keys[index]] = sortObject(obj[keys[index]]); - } - - return temp; -} -function copyTextToClipboard(text) { - var textArea = document.createElement('textarea'); - textArea.value = text; - document.body.appendChild(textArea); - textArea.select(); - - try { - var successful = document.execCommand('copy'); - var msg = successful ? 'successful' : 'unsuccessful'; - console.log('Copying text command was ' + msg); - } catch (err) { - console.log('Oops, unable to copy'); - } - - document.body.removeChild(textArea); -} - -/***/ }), - -/***/ "./demo/main.js": -/*!**********************!*\ - !*** ./demo/main.js ***! - \**********************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var jsonpack__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jsonpack */ "./node_modules/jsonpack/main.js"); -/* harmony import */ var jsonpack__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jsonpack__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var promise_polyfill_src_polyfill__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! promise-polyfill/src/polyfill */ "./node_modules/promise-polyfill/src/polyfill.js"); -/* harmony import */ var _demo_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./demo-utils */ "./demo/demo-utils.js"); -/* harmony import */ var _chart_timeline_chart__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./chart/timeline-chart */ "./demo/chart/timeline-chart.ts"); -/* global $, Hls, __NETLIFY__ */ - -/* eslint camelcase: 0 */ - - - - -var NETLIFY = {}; // replaced in build - -var STORAGE_KEYS = { - Editor_Persistence: 'hlsjs:config-editor-persist', - Hls_Config: 'hlsjs:config', - volume: 'hlsjs:volume', - demo_tabs: 'hlsjs:demo-tabs' -}; - -var testStreams = __webpack_require__(/*! ../tests/test-streams */ "./tests/test-streams.js"); - -var defaultTestStreamUrl = testStreams[Object.keys(testStreams)[0]].url; -var sourceURL = decodeURIComponent(getURLParam('src', defaultTestStreamUrl)); -var demoConfig = getURLParam('demoConfig', null); - -if (demoConfig) { - demoConfig = JSON.parse(atob(demoConfig)); -} else { - demoConfig = {}; -} - -var hlsjsDefaults = { - debug: true, - enableWorker: true, - lowLatencyMode: true, - backBufferLength: 60 * 1.5 -}; -var enableStreaming = getDemoConfigPropOrDefault('enableStreaming', true); -var autoRecoverError = getDemoConfigPropOrDefault('autoRecoverError', true); -var levelCapping = getDemoConfigPropOrDefault('levelCapping', -1); -var limitMetrics = getDemoConfigPropOrDefault('limitMetrics', -1); -var dumpfMP4 = getDemoConfigPropOrDefault('dumpfMP4', false); -var stopOnStall = getDemoConfigPropOrDefault('stopOnStall', false); -var bufferingIdx = -1; -var selectedTestStream = null; -var video = document.querySelector('#video'); -var startTime = Date.now(); -var lastSeekingIdx; -var lastStartPosition; -var lastDuration; -var lastAudioTrackSwitchingIdx; -var hls; -var url; -var events; -var stats; -var tracks; -var fmp4Data; -var configPersistenceEnabled = false; -var configEditor = null; -var chart; -var resizeAsyncCallbackId = -1; -var requestAnimationFrame = self.requestAnimationFrame || self.setTimeout; -var cancelAnimationFrame = self.cancelAnimationFrame || self.clearTimeout; -var resizeHandlers = []; - -var resize = function resize() { - cancelAnimationFrame(resizeAsyncCallbackId); - resizeAsyncCallbackId = requestAnimationFrame(function () { - resizeHandlers.forEach(function (handler) { - handler(); - }); - }); -}; - -self.onresize = resize; - -if (self.screen && self.screen.orientation) { - self.screen.orientation.onchange = resize; -} - -var playerResize = function playerResize() { - var bounds = video.getBoundingClientRect(); - $('#currentSize').html(Math.round(bounds.width * 10) / 10 + " x " + Math.round(bounds.height * 10) / 10); - - if (video.videoWidth && video.videoHeight) { - $('#currentResolution').html(video.videoWidth + " x " + video.videoHeight); - } -}; - -resizeHandlers.push(playerResize); -$(document).ready(function () { - setupConfigEditor(); - chart = setupTimelineChart(); - Object.keys(testStreams).forEach(function (key, index) { - var stream = testStreams[key]; - var option = new Option(stream.description, key); - $('#streamSelect').append(option); - - if (stream.url === sourceURL) { - document.querySelector('#streamSelect').selectedIndex = index + 1; - } - }); - var videoWidth = video.style.width; - - if (videoWidth) { - $('#videoSize option').each(function (i, option) { - if (option.value === videoWidth) { - document.querySelector('#videoSize').selectedIndex = i; - $('#bufferedCanvas').width(videoWidth); - resize(); - return false; - } - }); - } - - $('#streamSelect').change(function () { - var key = $('#streamSelect').val() || Object.keys(testStreams)[0]; - selectedTestStream = testStreams[key]; - var streamUrl = selectedTestStream.url; - $('#streamURL').val(streamUrl); - loadSelectedStream(); - }); - $('#streamURL').change(function () { - selectedTestStream = null; - loadSelectedStream(); - }); - $('#videoSize').change(function () { - $('#video').width($('#videoSize').val()); - $('#bufferedCanvas').width($('#videoSize').val()); - checkBuffer(); - resize(); - }); - $('#enableStreaming').click(function () { - enableStreaming = this.checked; - loadSelectedStream(); - }); - $('#autoRecoverError').click(function () { - autoRecoverError = this.checked; - onDemoConfigChanged(); - }); - $('#stopOnStall').click(function () { - stopOnStall = this.checked; - onDemoConfigChanged(); - }); - $('#dumpfMP4').click(function () { - dumpfMP4 = this.checked; - $('.btn-dump').toggle(dumpfMP4); - onDemoConfigChanged(); - }); - $('#limitMetrics').change(function () { - limitMetrics = this.value; - onDemoConfigChanged(); - }); - $('#levelCapping').change(function () { - levelCapping = this.value; - onDemoConfigChanged(); - }); - $('#limitMetrics').val(limitMetrics); - $('#enableStreaming').prop('checked', enableStreaming); - $('#autoRecoverError').prop('checked', autoRecoverError); - $('#stopOnStall').prop('checked', stopOnStall); - $('#dumpfMP4').prop('checked', dumpfMP4); - $('#levelCapping').val(levelCapping); // link to version on npm if canary - // github branch for a branch version - // github tag for a normal tag - // github PR for a pr - - function getVersionLink(version) { - var alphaRegex = /[-.]0\.alpha\./; - - if (alphaRegex.test(version)) { - return "https://www.npmjs.com/package/hls.js/v/" + encodeURIComponent(version); - } else if (NETLIFY.reviewID) { - return "https://github.com/video-dev/hls.js/pull/" + NETLIFY.reviewID; - } else if (NETLIFY.branch) { - return "https://github.com/video-dev/hls.js/tree/" + encodeURIComponent(NETLIFY.branch); - } - - return "https://github.com/video-dev/hls.js/releases/tag/v" + encodeURIComponent(version); - } - - var version = Hls.version; - - if (version) { - var $a = $('').attr('target', '_blank').attr('rel', 'noopener noreferrer').attr('href', getVersionLink(version)).text('v' + version); - $('.title').append(' ').append($a); - } - - $('#streamURL').val(sourceURL); - var volumeSettings = JSON.parse(localStorage.getItem(STORAGE_KEYS.volume)) || { - volume: 0.05, - muted: false - }; - video.volume = volumeSettings.volume; - video.muted = volumeSettings.muted; - $('.btn-dump').toggle(dumpfMP4); - $('#toggleButtons').show(); - $('#metricsButtonWindow').toggle(self.windowSliding); - $('#metricsButtonFixed').toggle(!self.windowSliding); - loadSelectedStream(); - var tabIndexesCSV = localStorage.getItem(STORAGE_KEYS.demo_tabs); - - if (tabIndexesCSV === null) { - tabIndexesCSV = '0,1,2'; - } - - if (tabIndexesCSV) { - tabIndexesCSV.split(',').forEach(function (indexString) { - toggleTab($('.demo-tab-btn')[parseInt(indexString) || 0], true); - }); - } - - $(window).on('popstate', function () { - window.location.reload(); - }); -}); - -function setupGlobals() { - self.events = events = { - url: url, - t0: self.performance.now(), - load: [], - buffer: [], - video: [], - level: [], - bitrate: [] - }; - lastAudioTrackSwitchingIdx = undefined; - lastSeekingIdx = undefined; - bufferingIdx = -1; // actual values, only on window - - self.recoverDecodingErrorDate = null; - self.recoverSwapAudioCodecDate = null; - self.fmp4Data = fmp4Data = { - audio: [], - video: [] - }; - self.onClickBufferedRange = onClickBufferedRange; - self.updateLevelInfo = updateLevelInfo; - self.onDemoConfigChanged = onDemoConfigChanged; - self.createfMP4 = createfMP4; - self.goToMetricsPermaLink = goToMetricsPermaLink; - self.toggleTab = toggleTab; - self.toggleTabClick = toggleTabClick; - self.applyConfigEditorValue = applyConfigEditorValue; -} - -function trimArray(target, limit) { - if (limit < 0) { - return; - } - - while (target.length > limit) { - target.shift(); - } -} - -function trimEventHistory() { - var x = limitMetrics; - - if (x < 0) { - return; - } - - trimArray(events.load, x); - trimArray(events.buffer, x); - trimArray(events.video, x); - trimArray(events.level, x); - trimArray(events.bitrate, x); -} - -function loadSelectedStream() { - $('#statusOut,#errorOut').empty(); - - if (!Hls.isSupported()) { - handleUnsupported(); - return; - } - - url = $('#streamURL').val(); - setupGlobals(); - hideCanvas(); - - if (hls) { - hls.destroy(); - clearInterval(hls.bufferTimer); - hls = null; - } - - if (!enableStreaming) { - logStatus('Streaming disabled'); - return; - } - - logStatus('Loading ' + url); // Extending both a demo-specific config and the user config which can override all - - var hlsConfig = $.extend({}, hlsjsDefaults, getEditorValue({ - parse: true - })); - - if (selectedTestStream && selectedTestStream.config) { - console.info('[loadSelectedStream] extending hls config with stream-specific config: ', selectedTestStream.config); - $.extend(hlsConfig, selectedTestStream.config); - updateConfigEditorValue(hlsConfig); - } - - onDemoConfigChanged(true); - console.log('Using Hls.js config:', hlsConfig); - self.hls = hls = new Hls(hlsConfig); - logStatus('Loading manifest and attaching video element...'); - var expiredTracks = [].filter.call(video.textTracks, function (track) { - return track.kind !== 'metadata'; - }); - - if (expiredTracks.length) { - var kinds = expiredTracks.map(function (track) { - return track.kind; - }).filter(function (kind, index, self) { - return self.indexOf(kind) === index; - }); - logStatus("Replacing video element to remove " + kinds.join(' and ') + " text tracks"); - var videoWithExpiredTextTracks = video; - video = videoWithExpiredTextTracks.cloneNode(false); - video.removeAttribute('src'); - video.volume = videoWithExpiredTextTracks.volume; - video.muted = videoWithExpiredTextTracks.muted; - videoWithExpiredTextTracks.parentNode.insertBefore(video, videoWithExpiredTextTracks); - videoWithExpiredTextTracks.parentNode.removeChild(videoWithExpiredTextTracks); - } - - addChartEventListeners(hls); - addVideoEventListeners(video); - hls.loadSource(url); - hls.autoLevelCapping = levelCapping; - hls.attachMedia(video); - hls.on(Hls.Events.MEDIA_ATTACHED, function () { - logStatus('Media element attached'); - bufferingIdx = -1; - events.video.push({ - time: self.performance.now() - events.t0, - type: 'Media attached' - }); - trimEventHistory(); - }); - hls.on(Hls.Events.MEDIA_DETACHED, function () { - logStatus('Media element detached'); - clearInterval(hls.bufferTimer); - bufferingIdx = -1; - tracks = []; - events.video.push({ - time: self.performance.now() - events.t0, - type: 'Media detached' - }); - trimEventHistory(); - }); - hls.on(Hls.Events.DESTROYING, function () { - clearInterval(hls.bufferTimer); - }); - hls.on(Hls.Events.BUFFER_RESET, function () { - clearInterval(hls.bufferTimer); - }); - hls.on(Hls.Events.FRAG_PARSING_INIT_SEGMENT, function (eventName, data) { - showCanvas(); - events.video.push({ - time: self.performance.now() - events.t0, - type: data.id + ' init segment' - }); - trimEventHistory(); - }); - hls.on(Hls.Events.FRAG_PARSING_METADATA, function (eventName, data) {// console.log("Id3 samples ", data.samples); - }); - hls.on(Hls.Events.LEVEL_SWITCHING, function (eventName, data) { - events.level.push({ - time: self.performance.now() - events.t0, - id: data.level, - bitrate: Math.round(hls.levels[data.level].bitrate / 1000) - }); - trimEventHistory(); - updateLevelInfo(); - }); - hls.on(Hls.Events.MANIFEST_PARSED, function (eventName, data) { - events.load.push({ - type: 'manifest', - name: '', - start: 0, - end: data.levels.length, - time: data.stats.loading.start - events.t0, - latency: data.stats.loading.first - data.stats.loading.start, - load: data.stats.loading.end - data.stats.loading.first, - duration: data.stats.loading.end - data.stats.loading.first - }); - trimEventHistory(); - self.refreshCanvas(); - }); - hls.on(Hls.Events.MANIFEST_PARSED, function (eventName, data) { - logStatus(hls.levels.length + " quality levels found"); - logStatus('Manifest successfully loaded'); - stats = { - levelNb: data.levels.length, - levelParsed: 0 - }; - trimEventHistory(); - updateLevelInfo(); - }); - hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, function (eventName, data) { - logStatus('No of audio tracks found: ' + data.audioTracks.length); - updateAudioTrackInfo(); - }); - hls.on(Hls.Events.AUDIO_TRACK_SWITCHING, function (eventName, data) { - logStatus('Audio track switching...'); - updateAudioTrackInfo(); - events.video.push({ - time: self.performance.now() - events.t0, - type: 'audio switching', - name: '@' + data.id - }); - trimEventHistory(); - lastAudioTrackSwitchingIdx = events.video.length - 1; - }); - hls.on(Hls.Events.AUDIO_TRACK_SWITCHED, function (eventName, data) { - logStatus('Audio track switched'); - updateAudioTrackInfo(); - var event = { - time: self.performance.now() - events.t0, - type: 'audio switched', - name: '@' + data.id - }; - - if (lastAudioTrackSwitchingIdx !== undefined) { - events.video[lastAudioTrackSwitchingIdx].duration = event.time - events.video[lastAudioTrackSwitchingIdx].time; - lastAudioTrackSwitchingIdx = undefined; - } - - events.video.push(event); - trimEventHistory(); - }); - hls.on(Hls.Events.LEVEL_LOADED, function (eventName, data) { - events.isLive = data.details.live; - var event = { - type: 'level', - id: data.level, - start: data.details.startSN, - end: data.details.endSN, - time: data.stats.loading.start - events.t0, - latency: data.stats.loading.first - data.stats.loading.start, - load: data.stats.loading.end - data.stats.loading.first, - parsing: data.stats.parsing.end - data.stats.loading.end, - duration: data.stats.loading.end - data.stats.loading.first - }; - var parsingDuration = data.stats.parsing.end - data.stats.loading.end; - - if (stats.levelParsed) { - this.sumLevelParsingMs += parsingDuration; - } else { - this.sumLevelParsingMs = parsingDuration; - } - - stats.levelParsed++; - stats.levelParsingUs = Math.round(1000 * this.sumLevelParsingMs / stats.levelParsed); // console.log('parsing level duration :' + stats.levelParsingUs + 'us,count:' + stats.levelParsed); - - events.load.push(event); - trimEventHistory(); - self.refreshCanvas(); - }); - hls.on(Hls.Events.AUDIO_TRACK_LOADED, function (eventName, data) { - events.isLive = data.details.live; - var event = { - type: 'audio track', - id: data.id, - start: data.details.startSN, - end: data.details.endSN, - time: data.stats.loading.start - events.t0, - latency: data.stats.loading.first - data.stats.loading.start, - load: data.stats.loading.end - data.stats.loading.first, - parsing: data.stats.parsing.end - data.stats.loading.end, - duration: data.stats.loading.end - data.stats.loading.first - }; - events.load.push(event); - trimEventHistory(); - self.refreshCanvas(); - }); - hls.on(Hls.Events.FRAG_BUFFERED, function (eventName, data) { - var event = { - type: data.frag.type + (data.part ? ' part' : ' fragment'), - id: data.frag.level, - id2: data.frag.sn, - id3: data.part ? data.part.index : undefined, - time: data.stats.loading.start - events.t0, - latency: data.stats.loading.first - data.stats.loading.start, - load: data.stats.loading.end - data.stats.loading.first, - parsing: data.stats.parsing.end - data.stats.loading.end, - buffer: data.stats.buffering.end - data.stats.parsing.end, - duration: data.stats.buffering.end - data.stats.loading.first, - bw: Math.round(8 * data.stats.total / (data.stats.buffering.end - data.stats.loading.start)), - size: data.stats.total - }; - events.load.push(event); - events.bitrate.push({ - time: self.performance.now() - events.t0, - bitrate: event.bw, - duration: data.frag.duration, - level: event.id - }); - - if (events.buffer.length === 0) { - events.buffer.push({ - time: 0, - buffer: 0, - pos: 0 - }); - } - - clearInterval(hls.bufferTimer); - hls.bufferTimer = self.setInterval(checkBuffer, 100); - trimEventHistory(); - self.refreshCanvas(); - updateLevelInfo(); - var latency = data.stats.loading.first - data.stats.loading.start; - var parsing = data.stats.parsing.end - data.stats.loading.end; - var process = data.stats.buffering.end - data.stats.loading.start; - var bitrate = Math.round(8 * data.stats.total / (data.stats.buffering.end - data.stats.loading.first)); - - if (stats.fragBuffered) { - stats.fragMinLatency = Math.min(stats.fragMinLatency, latency); - stats.fragMaxLatency = Math.max(stats.fragMaxLatency, latency); - stats.fragMinProcess = Math.min(stats.fragMinProcess, process); - stats.fragMaxProcess = Math.max(stats.fragMaxProcess, process); - stats.fragMinKbps = Math.min(stats.fragMinKbps, bitrate); - stats.fragMaxKbps = Math.max(stats.fragMaxKbps, bitrate); - stats.autoLevelCappingMin = Math.min(stats.autoLevelCappingMin, hls.autoLevelCapping); - stats.autoLevelCappingMax = Math.max(stats.autoLevelCappingMax, hls.autoLevelCapping); - stats.fragBuffered++; - } else { - stats.fragMinLatency = stats.fragMaxLatency = latency; - stats.fragMinProcess = stats.fragMaxProcess = process; - stats.fragMinKbps = stats.fragMaxKbps = bitrate; - stats.fragBuffered = 1; - stats.fragBufferedBytes = 0; - stats.autoLevelCappingMin = stats.autoLevelCappingMax = hls.autoLevelCapping; - this.sumLatency = 0; - this.sumKbps = 0; - this.sumProcess = 0; - this.sumParsing = 0; - } - - stats.fraglastLatency = latency; - this.sumLatency += latency; - stats.fragAvgLatency = Math.round(this.sumLatency / stats.fragBuffered); - stats.fragLastProcess = process; - this.sumProcess += process; - this.sumParsing += parsing; - stats.fragAvgProcess = Math.round(this.sumProcess / stats.fragBuffered); - stats.fragLastKbps = bitrate; - this.sumKbps += bitrate; - stats.fragAvgKbps = Math.round(this.sumKbps / stats.fragBuffered); - stats.fragBufferedBytes += data.stats.total; - stats.fragparsingKbps = Math.round(8 * stats.fragBufferedBytes / this.sumParsing); - stats.fragparsingMs = Math.round(this.sumParsing); - stats.autoLevelCappingLast = hls.autoLevelCapping; - }); - hls.on(Hls.Events.LEVEL_SWITCHED, function (eventName, data) { - var event = { - time: self.performance.now() - events.t0, - type: 'level switched', - name: data.level - }; - events.video.push(event); - trimEventHistory(); - self.refreshCanvas(); - updateLevelInfo(); - }); - hls.on(Hls.Events.FRAG_CHANGED, function (eventName, data) { - var event = { - time: self.performance.now() - events.t0, - type: 'frag changed', - name: data.frag.sn + ' @ ' + data.frag.level - }; - events.video.push(event); - trimEventHistory(); - self.refreshCanvas(); - updateLevelInfo(); - stats.tagList = data.frag.tagList; - var level = data.frag.level; - var autoLevel = hls.autoLevelEnabled; - - if (stats.levelStart === undefined) { - stats.levelStart = level; - } - - stats.fragProgramDateTime = data.frag.programDateTime; - stats.fragStart = data.frag.start; - - if (autoLevel) { - if (stats.fragChangedAuto) { - stats.autoLevelMin = Math.min(stats.autoLevelMin, level); - stats.autoLevelMax = Math.max(stats.autoLevelMax, level); - stats.fragChangedAuto++; - - if (this.levelLastAuto && level !== stats.autoLevelLast) { - stats.autoLevelSwitch++; - } - } else { - stats.autoLevelMin = stats.autoLevelMax = level; - stats.autoLevelSwitch = 0; - stats.fragChangedAuto = 1; - this.sumAutoLevel = 0; - } - - this.sumAutoLevel += level; - stats.autoLevelAvg = Math.round(1000 * this.sumAutoLevel / stats.fragChangedAuto) / 1000; - stats.autoLevelLast = level; - } else { - if (stats.fragChangedManual) { - stats.manualLevelMin = Math.min(stats.manualLevelMin, level); - stats.manualLevelMax = Math.max(stats.manualLevelMax, level); - stats.fragChangedManual++; - - if (!this.levelLastAuto && level !== stats.manualLevelLast) { - stats.manualLevelSwitch++; - } - } else { - stats.manualLevelMin = stats.manualLevelMax = level; - stats.manualLevelSwitch = 0; - stats.fragChangedManual = 1; - } - - stats.manualLevelLast = level; - } - - this.levelLastAuto = autoLevel; - }); - hls.on(Hls.Events.FRAG_LOAD_EMERGENCY_ABORTED, function (eventName, data) { - if (stats) { - if (stats.fragLoadEmergencyAborted === undefined) { - stats.fragLoadEmergencyAborted = 1; - } else { - stats.fragLoadEmergencyAborted++; - } - } - }); - hls.on(Hls.Events.FRAG_DECRYPTED, function (eventName, data) { - if (!stats.fragDecrypted) { - stats.fragDecrypted = 0; - this.totalDecryptTime = 0; - stats.fragAvgDecryptTime = 0; - } - - stats.fragDecrypted++; - this.totalDecryptTime += data.stats.tdecrypt - data.stats.tstart; - stats.fragAvgDecryptTime = this.totalDecryptTime / stats.fragDecrypted; - }); - hls.on(Hls.Events.ERROR, function (eventName, data) { - console.warn('Error event:', data); - - switch (data.details) { - case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: - try { - $('#errorOut').html('Cannot load ' + url + '
HTTP response code:' + data.response.code + '
' + data.response.text); - - if (data.response.code === 0) { - $('#errorOut').append('This might be a CORS issue, consider installing Allow-Control-Allow-Origin Chrome Extension'); - } - } catch (err) { - $('#errorOut').html('Cannot load ' + url + '
Response body: ' + data.response.text); - } - - break; - - case Hls.ErrorDetails.MANIFEST_LOAD_TIMEOUT: - logError('Timeout while loading manifest'); - break; - - case Hls.ErrorDetails.MANIFEST_PARSING_ERROR: - logError('Error while parsing manifest:' + data.reason); - break; - - case Hls.ErrorDetails.LEVEL_EMPTY_ERROR: - logError('Loaded level contains no fragments ' + data.level + ' ' + data.url); // handleLevelError demonstrates how to remove a level that errors followed by a downswitch - // handleLevelError(data); - - break; - - case Hls.ErrorDetails.LEVEL_LOAD_ERROR: - logError('Error while loading level playlist ' + data.context.level + ' ' + data.url); // handleLevelError demonstrates how to remove a level that errors followed by a downswitch - // handleLevelError(data); - - break; - - case Hls.ErrorDetails.LEVEL_LOAD_TIMEOUT: - logError('Timeout while loading level playlist ' + data.context.level + ' ' + data.url); // handleLevelError demonstrates how to remove a level that errors followed by a downswitch - // handleLevelError(data); - - break; - - case Hls.ErrorDetails.LEVEL_SWITCH_ERROR: - logError('Error while trying to switch to level ' + data.level); - break; - - case Hls.ErrorDetails.FRAG_LOAD_ERROR: - logError('Error while loading fragment ' + data.frag.url); - break; - - case Hls.ErrorDetails.FRAG_LOAD_TIMEOUT: - logError('Timeout while loading fragment ' + data.frag.url); - break; - - case Hls.ErrorDetails.FRAG_LOOP_LOADING_ERROR: - logError('Fragment-loop loading error'); - break; - - case Hls.ErrorDetails.FRAG_DECRYPT_ERROR: - logError('Decrypting error:' + data.reason); - break; - - case Hls.ErrorDetails.FRAG_PARSING_ERROR: - logError('Parsing error:' + data.reason); - break; - - case Hls.ErrorDetails.KEY_LOAD_ERROR: - logError('Error while loading key ' + data.frag.decryptdata.uri); - break; - - case Hls.ErrorDetails.KEY_LOAD_TIMEOUT: - logError('Timeout while loading key ' + data.frag.decryptdata.uri); - break; - - case Hls.ErrorDetails.BUFFER_APPEND_ERROR: - logError('Buffer append error'); - break; - - case Hls.ErrorDetails.BUFFER_ADD_CODEC_ERROR: - logError('Buffer add codec error for ' + data.mimeType + ':' + data.error.message); - break; - - case Hls.ErrorDetails.BUFFER_APPENDING_ERROR: - logError('Buffer appending error'); - break; - - case Hls.ErrorDetails.BUFFER_STALLED_ERROR: - logError('Buffer stalled error'); - - if (stopOnStall) { - hls.stopLoad(); - video.pause(); - } - - break; - - default: - break; - } - - if (data.fatal) { - console.error("Fatal error : " + data.details); - - switch (data.type) { - case Hls.ErrorTypes.MEDIA_ERROR: - logError("A media error occurred: " + data.details); - handleMediaError(); - break; - - case Hls.ErrorTypes.NETWORK_ERROR: - logError("A network error occurred: " + data.details); - break; - - default: - logError("An unrecoverable error occurred: " + data.details); - hls.destroy(); - break; - } - } - - if (!stats) { - stats = {}; - } // track all errors independently - - - if (stats[data.details] === undefined) { - stats[data.details] = 1; - } else { - stats[data.details] += 1; - } // track fatal error - - - if (data.fatal) { - if (stats.fatalError === undefined) { - stats.fatalError = 1; - } else { - stats.fatalError += 1; - } - } - - $('#statisticsOut').text(JSON.stringify(Object(_demo_utils__WEBPACK_IMPORTED_MODULE_2__["sortObject"])(stats), null, '\t')); - }); - hls.on(Hls.Events.BUFFER_CREATED, function (eventName, data) { - tracks = data.tracks; - }); - hls.on(Hls.Events.BUFFER_APPENDING, function (eventName, data) { - if (dumpfMP4) { - fmp4Data[data.type].push(data.data); - } - }); - hls.on(Hls.Events.FPS_DROP, function (eventName, data) { - var event = { - time: self.performance.now() - events.t0, - type: 'frame drop', - name: data.currentDropped + '/' + data.currentDecoded - }; - events.video.push(event); - trimEventHistory(); - - if (stats) { - if (stats.fpsDropEvent === undefined) { - stats.fpsDropEvent = 1; - } else { - stats.fpsDropEvent++; - } - - stats.fpsTotalDroppedFrames = data.totalDroppedFrames; - } - }); -} - -function addVideoEventListeners(video) { - video.removeEventListener('resize', handleVideoEvent); - video.removeEventListener('seeking', handleVideoEvent); - video.removeEventListener('seeked', handleVideoEvent); - video.removeEventListener('pause', handleVideoEvent); - video.removeEventListener('play', handleVideoEvent); - video.removeEventListener('canplay', handleVideoEvent); - video.removeEventListener('canplaythrough', handleVideoEvent); - video.removeEventListener('ended', handleVideoEvent); - video.removeEventListener('playing', handleVideoEvent); - video.removeEventListener('error', handleVideoEvent); - video.removeEventListener('loadedmetadata', handleVideoEvent); - video.removeEventListener('loadeddata', handleVideoEvent); - video.removeEventListener('durationchange', handleVideoEvent); - video.removeEventListener('volumechange', handleVolumeEvent); - video.addEventListener('resize', handleVideoEvent); - video.addEventListener('seeking', handleVideoEvent); - video.addEventListener('seeked', handleVideoEvent); - video.addEventListener('pause', handleVideoEvent); - video.addEventListener('play', handleVideoEvent); - video.addEventListener('canplay', handleVideoEvent); - video.addEventListener('canplaythrough', handleVideoEvent); - video.addEventListener('ended', handleVideoEvent); - video.addEventListener('playing', handleVideoEvent); - video.addEventListener('error', handleVideoEvent); - video.addEventListener('loadedmetadata', handleVideoEvent); - video.addEventListener('loadeddata', handleVideoEvent); - video.addEventListener('durationchange', handleVideoEvent); - video.addEventListener('volumechange', handleVolumeEvent); -} - -function handleUnsupported() { - if (navigator.userAgent.toLowerCase().indexOf('firefox') !== -1) { - logStatus('You are using Firefox, it looks like MediaSource is not enabled,
please ensure the following keys are set appropriately in about:config
media.mediasource.enabled=true
media.mediasource.mp4.enabled=true
media.mediasource.whitelist=false'); - } else { - logStatus('Your Browser does not support MediaSourceExtension / MP4 mediasource'); - } -} - -function handleVideoEvent(evt) { - var data = ''; - - switch (evt.type) { - case 'durationchange': - if (evt.target.duration - lastDuration <= 0.5) { - // some browsers report several duration change events with almost the same value ... avoid spamming video events - return; - } - - lastDuration = evt.target.duration; - data = Math.round(evt.target.duration * 1000); - break; - - case 'resize': - data = evt.target.videoWidth + '/' + evt.target.videoHeight; - playerResize(); - break; - - case 'loadedmetadata': - case 'loadeddata': - case 'canplay': - case 'canplaythrough': - case 'ended': - case 'seeking': - case 'seeked': - case 'play': - case 'playing': - lastStartPosition = evt.target.currentTime; - - case 'pause': - case 'waiting': - case 'stalled': - case 'error': - data = Math.round(evt.target.currentTime * 1000); - - if (evt.type === 'error') { - var errorTxt; - var mediaError = evt.currentTarget.error; - - switch (mediaError.code) { - case mediaError.MEDIA_ERR_ABORTED: - errorTxt = 'You aborted the video playback'; - break; - - case mediaError.MEDIA_ERR_DECODE: - errorTxt = 'The video playback was aborted due to a corruption problem or because the video used features your browser did not support'; - handleMediaError(); - break; - - case mediaError.MEDIA_ERR_NETWORK: - errorTxt = 'A network error caused the video download to fail part-way'; - break; - - case mediaError.MEDIA_ERR_SRC_NOT_SUPPORTED: - errorTxt = 'The video could not be loaded, either because the server or network failed or because the format is not supported'; - break; - } - - if (mediaError.message) { - errorTxt += ' - ' + mediaError.message; - } - - logStatus(errorTxt); - console.error(errorTxt); - } - - break; - - default: - break; - } - - var event = { - time: self.performance.now() - events.t0, - type: evt.type, - name: data - }; - events.video.push(event); - - if (evt.type === 'seeking') { - lastSeekingIdx = events.video.length - 1; - } - - if (evt.type === 'seeked') { - events.video[lastSeekingIdx].duration = event.time - events.video[lastSeekingIdx].time; - } - - trimEventHistory(); -} - -function handleVolumeEvent() { - localStorage.setItem(STORAGE_KEYS.volume, JSON.stringify({ - muted: video.muted, - volume: video.volume - })); -} - -function handleLevelError(data) { - var levelObj = data.context || data; - hls.removeLevel(levelObj.level, levelObj.urlId || 0); - - if (!hls.levels.length) { - logError('All levels have been removed'); - hls.destroy(); - return; - } // Trigger an immediate downswitch to the first level - // This is to handle the case where we start at an empty level, where switching to auto causes hlsjs to stall - - - hls.currentLevel = 0; // Set the quality back to auto so that we return to optimal quality - - hls.currentLevel = -1; -} - -function handleMediaError() { - if (autoRecoverError) { - var now = self.performance.now(); - - if (!self.recoverDecodingErrorDate || now - self.recoverDecodingErrorDate > 3000) { - self.recoverDecodingErrorDate = self.performance.now(); - $('#statusOut').append(', trying to recover media error.'); - hls.recoverMediaError(); - } else { - if (!self.recoverSwapAudioCodecDate || now - self.recoverSwapAudioCodecDate > 3000) { - self.recoverSwapAudioCodecDate = self.performance.now(); - $('#statusOut').append(', trying to swap audio codec and recover media error.'); - hls.swapAudioCodec(); - hls.recoverMediaError(); - } else { - $('#statusOut').append(', cannot recover. Last media error recovery failed.'); - } - } - } -} - -function timeRangesToString(r) { - var log = ''; - - for (var i = 0; i < r.length; i++) { - log += '[' + r.start(i) + ', ' + r.end(i) + ']'; - log += ' '; - } - - return log; -} - -function checkBuffer() { - var canvas = document.querySelector('#bufferedCanvas'); - var ctx = canvas.getContext('2d'); - var r = video.buffered; - var seekableEnd = getSeekableEnd(); - var bufferingDuration; - - if (r) { - ctx.fillStyle = 'black'; - - if (!canvas.width || canvas.width !== video.clientWidth) { - canvas.width = video.clientWidth; - } - - ctx.fillRect(0, 0, canvas.width, canvas.height); - var pos = video.currentTime; - var bufferLen = 0; - ctx.fillStyle = 'gray'; - - for (var i = 0; i < r.length; i++) { - var start = r.start(i) / seekableEnd * canvas.width; - var end = r.end(i) / seekableEnd * canvas.width; - ctx.fillRect(start, 2, Math.max(2, end - start), 11); - - if (pos >= r.start(i) && pos < r.end(i)) { - // play position is inside this buffer TimeRange, retrieve end of buffer position and buffer length - bufferLen = r.end(i) - pos; - } - } // check if we are in buffering / or playback ended state - - - if (bufferLen <= 0.1 && video.paused === false && pos - lastStartPosition > 0.5) { - if (lastDuration - pos <= 0.5 && events.isLive === false) {// don't create buffering event if we are at the end of the playlist, don't report ended for live playlist - } else { - // we are not at the end of the playlist ... real buffering - if (bufferingIdx !== -1) { - bufferingDuration = self.performance.now() - events.t0 - events.video[bufferingIdx].time; - events.video[bufferingIdx].duration = bufferingDuration; - events.video[bufferingIdx].name = bufferingDuration; - } else { - events.video.push({ - type: 'buffering', - time: self.performance.now() - events.t0 - }); - trimEventHistory(); // we are in buffering state - - bufferingIdx = events.video.length - 1; - } - } - } - - if (bufferLen > 0.1 && bufferingIdx !== -1) { - bufferingDuration = self.performance.now() - events.t0 - events.video[bufferingIdx].time; - events.video[bufferingIdx].duration = bufferingDuration; - events.video[bufferingIdx].name = bufferingDuration; // we are out of buffering state - - bufferingIdx = -1; - } // update buffer/position for current Time - - - var event = { - time: self.performance.now() - events.t0, - buffer: Math.round(bufferLen * 1000), - pos: Math.round(pos * 1000) - }; - var bufEvents = events.buffer; - var bufEventLen = bufEvents.length; - - if (bufEventLen > 1) { - var event0 = bufEvents[bufEventLen - 2]; - var event1 = bufEvents[bufEventLen - 1]; - var slopeBuf0 = (event0.buffer - event1.buffer) / (event0.time - event1.time); - var slopeBuf1 = (event1.buffer - event.buffer) / (event1.time - event.time); - var slopePos0 = (event0.pos - event1.pos) / (event0.time - event1.time); - var slopePos1 = (event1.pos - event.pos) / (event1.time - event.time); // compute slopes. if less than 30% difference, remove event1 - - if ((slopeBuf0 === slopeBuf1 || Math.abs(slopeBuf0 / slopeBuf1 - 1) <= 0.3) && (slopePos0 === slopePos1 || Math.abs(slopePos0 / slopePos1 - 1) <= 0.3)) { - bufEvents.pop(); - } - } - - events.buffer.push(event); - trimEventHistory(); - self.refreshCanvas(); - - if ($('#statsDisplayTab').is(':visible')) { - var log = "Duration: " + video.duration + "\nBuffered: " + timeRangesToString(video.buffered) + "\nSeekable: " + timeRangesToString(video.seekable) + "\nPlayed: " + timeRangesToString(video.played) + "\n"; - - if (hls.media) { - for (var type in tracks) { - log += "Buffer for " + type + " contains:" + timeRangesToString(tracks[type].buffer.buffered) + "\n"; - } - - var videoPlaybackQuality = video.getVideoPlaybackQuality; - - if (videoPlaybackQuality && typeof videoPlaybackQuality === typeof Function) { - log += "Dropped frames: " + video.getVideoPlaybackQuality().droppedVideoFrames + "\n"; - log += "Corrupted frames: " + video.getVideoPlaybackQuality().corruptedVideoFrames + "\n"; - } else if (video.webkitDroppedFrameCount) { - log += "Dropped frames: " + video.webkitDroppedFrameCount + "\n"; - } - } - - log += "Bandwidth Estimate: " + hls.bandwidthEstimate.toFixed(3) + "\n"; - - if (events.isLive) { - log += 'Live Stats:\n' + (" Max Latency: " + hls.maxLatency + "\n") + (" Target Latency: " + hls.targetLatency.toFixed(3) + "\n") + (" Latency: " + hls.latency.toFixed(3) + "\n") + (" Drift: " + hls.drift.toFixed(3) + " (edge advance rate)\n") + (" Edge Stall: " + hls.latencyController.edgeStalled.toFixed(3) + " (playlist refresh over target duration/part)\n") + (" Playback rate: " + video.playbackRate.toFixed(2) + "\n"); - - if (stats.fragProgramDateTime) { - var currentPDT = stats.fragProgramDateTime + (video.currentTime - stats.fragStart) * 1000; - log += " Program Date Time: " + new Date(currentPDT).toISOString(); - var pdtLatency = (Date.now() - currentPDT) / 1000; - - if (pdtLatency > 0) { - log += " (" + pdtLatency.toFixed(3) + " seconds ago)"; - } - } - } - - $('#bufferedOut').text(log); - $('#statisticsOut').text(JSON.stringify(Object(_demo_utils__WEBPACK_IMPORTED_MODULE_2__["sortObject"])(stats), null, '\t')); - } - - ctx.fillStyle = 'blue'; - var x = video.currentTime / seekableEnd * canvas.width; - ctx.fillRect(x, 0, 2, 15); - } else if (ctx.fillStyle !== 'black') { - ctx.fillStyle = 'black'; - ctx.fillRect(0, 0, canvas.width, canvas.height); - } -} - -function showCanvas() { - self.showMetrics(); - $('#bufferedOut').show(); - $('#bufferedCanvas').show(); -} - -function hideCanvas() { - self.hideMetrics(); - $('#bufferedOut').hide(); - $('#bufferedCanvas').hide(); -} - -function getMetrics() { - var json = JSON.stringify(events); - var jsonpacked = Object(jsonpack__WEBPACK_IMPORTED_MODULE_0__["pack"])(json); // console.log('packing JSON from ' + json.length + ' to ' + jsonpacked.length + ' bytes'); - - return btoa(jsonpacked); -} - -self.copyMetricsToClipBoard = function () { - Object(_demo_utils__WEBPACK_IMPORTED_MODULE_2__["copyTextToClipboard"])(getMetrics()); -}; - -self.goToMetrics = function () { - var url = document.URL; - url = url.substr(0, url.lastIndexOf('/') + 1) + 'metrics.html'; - self.open(url, '_blank'); -}; - -function goToMetricsPermaLink() { - var url = document.URL; - var b64 = getMetrics(); - url = url.substr(0, url.lastIndexOf('/') + 1) + 'metrics.html#data=' + b64; - self.open(url, '_blank'); -} - -function onClickBufferedRange(event) { - var canvas = document.querySelector('#bufferedCanvas'); - var target = (event.clientX - canvas.offsetLeft) / canvas.width * getSeekableEnd(); - video.currentTime = target; -} - -function getSeekableEnd() { - if (isFinite(video.duration)) { - return video.duration; - } - - if (video.seekable.length) { - return video.seekable.end(video.seekable.length - 1); - } - - return 0; -} - -function getLevelButtonHtml(key, levels, onclickReplace, autoEnabled) { - var onclickAuto = (key + "=-1").replace(/^(\w+)=([^=]+)$/, onclickReplace); - var codecs = levels.reduce(function (uniqueCodecs, level) { - var levelCodecs = codecs2label(level.attrs.CODECS); - - if (levelCodecs && uniqueCodecs.indexOf(levelCodecs) === -1) { - uniqueCodecs.push(levelCodecs); - } - - return uniqueCodecs; - }, []); - return "" + levels.map(function (level, i) { - var enabled = hls[key] === i; - var onclick = (key + "=" + i).replace(/^(\w+)=(\w+)$/, onclickReplace); - var label = level2label(levels[i], i, codecs); - return ""; - }).join(''); -} - -function updateLevelInfo() { - var levels = hls.levels; - - if (!levels) { - return; - } - - var htmlCurrentLevel = getLevelButtonHtml('currentLevel', levels, 'hls.$1=$2', hls.autoLevelEnabled); - var htmlNextLevel = getLevelButtonHtml('nextLevel', levels, 'hls.$1=$2', hls.autoLevelEnabled); - var htmlLoadLevel = getLevelButtonHtml('loadLevel', levels, 'hls.$1=$2', hls.autoLevelEnabled); - var htmlCapLevel = getLevelButtonHtml('autoLevelCapping', levels, 'levelCapping=hls.$1=$2;updateLevelInfo();onDemoConfigChanged();', hls.autoLevelCapping === -1); - - if ($('#currentLevelControl').html() !== htmlCurrentLevel) { - $('#currentLevelControl').html(htmlCurrentLevel); - } - - if ($('#nextLevelControl').html() !== htmlNextLevel) { - $('#nextLevelControl').html(htmlNextLevel); - } - - if ($('#loadLevelControl').html() !== htmlLoadLevel) { - $('#loadLevelControl').html(htmlLoadLevel); - } - - if ($('#levelCappingControl').html() !== htmlCapLevel) { - $('#levelCappingControl').html(htmlCapLevel); - } -} - -function updateAudioTrackInfo() { - var buttonTemplate = ''; - } - - $('#audioTrackLabel').text(track ? track.lang || track.name : 'None selected'); - $('#audioTrackControl').html(html1); -} - -function codecs2label(levelCodecs) { - if (levelCodecs) { - return levelCodecs.replace(/([ah]vc.)[^,;]+/, '$1').replace('mp4a.40.2', 'mp4a'); - } - - return ''; -} - -function level2label(level, i, manifestCodecs) { - var levelCodecs = codecs2label(level.attrs.CODECS); - var levelNameInfo = level.name ? "\"" + level.name + "\": " : ''; - var codecInfo = levelCodecs && manifestCodecs.length > 1 ? " / " + levelCodecs : ''; - - if (level.height) { - return i + " (" + levelNameInfo + level.height + "p / " + Math.round(level.bitrate / 1024) + "kb" + codecInfo + ")"; - } - - if (level.bitrate) { - return i + " (" + levelNameInfo + Math.round(level.bitrate / 1024) + "kb" + codecInfo + ")"; - } - - if (codecInfo) { - return i + " (" + levelNameInfo + levelCodecs + ")"; - } - - if (level.name) { - return i + " (" + level.name + ")"; - } - - return "" + i; -} - -function getDemoConfigPropOrDefault(propName, defaultVal) { - return typeof demoConfig[propName] !== 'undefined' ? demoConfig[propName] : defaultVal; -} - -function getURLParam(sParam, defaultValue) { - var sPageURL = self.location.search.substring(1); - var sURLVariables = sPageURL.split('&'); - - for (var i = 0; i < sURLVariables.length; i++) { - var sParameterName = sURLVariables[i].split('='); - - if (sParameterName[0] === sParam) { - return sParameterName[1] === 'undefined' ? undefined : sParameterName[1] === 'false' ? false : sParameterName[1]; - } - } - - return defaultValue; -} - -function onDemoConfigChanged(firstLoad) { - demoConfig = { - enableStreaming: enableStreaming, - autoRecoverError: autoRecoverError, - stopOnStall: stopOnStall, - dumpfMP4: dumpfMP4, - levelCapping: levelCapping, - limitMetrics: limitMetrics - }; - - if (configPersistenceEnabled) { - persistEditorValue(); - } - - var serializedDemoConfig = btoa(JSON.stringify(demoConfig)); - var baseURL = document.URL.split('?')[0]; - var streamURL = $('#streamURL').val(); - var permalinkURL = baseURL + "?src=" + encodeURIComponent(streamURL) + "&demoConfig=" + serializedDemoConfig; - $('#StreamPermalink').html("" + permalinkURL + ""); - - if (!firstLoad && window.location.href !== permalinkURL) { - window.history.pushState(null, null, permalinkURL); - } -} - -function onConfigPersistenceChanged(event) { - configPersistenceEnabled = event.target.checked; - localStorage.setItem(STORAGE_KEYS.Editor_Persistence, JSON.stringify(configPersistenceEnabled)); - - if (configPersistenceEnabled) { - persistEditorValue(); - } else { - localStorage.removeItem(STORAGE_KEYS.Hls_Config); - } -} - -function getEditorValue(options) { - options = $.extend({ - parse: false - }, options || {}); - var value = configEditor.session.getValue(); - - if (options.parse) { - try { - value = JSON.parse(value); - } catch (e) { - console.warn('[getEditorValue] could not parse editor value', e); - value = {}; - } - } - - return value; -} - -function getPersistedHlsConfig() { - var value = localStorage.getItem(STORAGE_KEYS.Hls_Config); - - if (value === null) { - return value; - } - - try { - value = JSON.parse(value); - } catch (e) { - console.warn('[getPersistedHlsConfig] could not hls config json', e); - value = {}; - } - - return value; -} - -function persistEditorValue() { - localStorage.setItem(STORAGE_KEYS.Hls_Config, getEditorValue()); -} - -function setupConfigEditor() { - configEditor = self.ace.edit('config-editor'); - configEditor.setTheme('ace/theme/github'); - configEditor.session.setMode('ace/mode/json'); - var contents = hlsjsDefaults; - var shouldRestorePersisted = JSON.parse(localStorage.getItem(STORAGE_KEYS.Editor_Persistence)) === true; - - if (shouldRestorePersisted) { - $.extend(contents, getPersistedHlsConfig()); - } - - var elPersistence = document.querySelector('#config-persistence'); - elPersistence.addEventListener('change', onConfigPersistenceChanged); - elPersistence.checked = shouldRestorePersisted; - configPersistenceEnabled = shouldRestorePersisted; - updateConfigEditorValue(contents); -} - -function setupTimelineChart() { - var canvas = document.querySelector('#timeline-chart'); - var chart = new _chart_timeline_chart__WEBPACK_IMPORTED_MODULE_3__["TimelineChart"](canvas, { - responsive: false - }); - resizeHandlers.push(function () { - chart.resize(); - }); - chart.resize(); - return chart; -} - -function addChartEventListeners(hls) { - var updateLevelOrTrack = function updateLevelOrTrack(eventName, data) { - chart.updateLevelOrTrack(data.details); - }; - - var updateFragment = function updateFragment(eventName, data) { - if (data.stats) { - // Convert 0.x stats to partial v1 stats - var _data$stats = data.stats, - retry = _data$stats.retry, - loaded = _data$stats.loaded, - total = _data$stats.total, - trequest = _data$stats.trequest, - tfirst = _data$stats.tfirst, - tload = _data$stats.tload; - - if (trequest && tload) { - data.frag.stats = { - loaded: loaded, - retry: retry, - total: total, - loading: { - start: trequest, - first: tfirst, - end: tload - } - }; - } - } - - chart.updateFragment(data); - }; - - var updateChart = function updateChart() { - chart.update(); - }; - - hls.on(Hls.Events.MANIFEST_LOADING, function () { - chart.reset(); - }, chart); - hls.on(Hls.Events.MANIFEST_PARSED, function (eventName, data) { - var levels = data.levels; - chart.removeType('level'); - chart.removeType('audioTrack'); - chart.removeType('subtitleTrack'); - chart.updateLevels(levels); - }, chart); - hls.on(Hls.Events.BUFFER_CREATED, function (eventName, _ref) { - var tracks = _ref.tracks; - chart.updateSourceBuffers(tracks, hls.media); - }, chart); - hls.on(Hls.Events.BUFFER_RESET, function () { - chart.removeSourceBuffers(); - }, chart); - hls.on(Hls.Events.LEVELS_UPDATED, function (eventName, _ref2) { - var levels = _ref2.levels; - chart.removeType('level'); - chart.updateLevels(levels); - }); - hls.on(Hls.Events.LEVEL_SWITCHED, function (eventName, _ref3) { - var level = _ref3.level; - chart.removeType('level'); - chart.updateLevels(hls.levels, level); - }, chart); - hls.on(Hls.Events.LEVEL_LOADING, function () { - // TODO: mutate level datasets - // Update loadLevel - chart.removeType('level'); - chart.updateLevels(hls.levels); - }, chart); - hls.on(Hls.Events.LEVEL_UPDATED, function (eventName, _ref4) { - var details = _ref4.details; - chart.updateLevelOrTrack(details); - }, chart); - hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, function (eventName, _ref5) { - var audioTracks = _ref5.audioTracks; - chart.removeType('audioTrack'); - chart.updateAudioTracks(audioTracks); - }, chart); - hls.on(Hls.Events.SUBTITLE_TRACKS_UPDATED, function (eventName, _ref6) { - var subtitleTracks = _ref6.subtitleTracks; - chart.removeType('subtitleTrack'); - chart.updateSubtitleTracks(subtitleTracks); - }, chart); - hls.on(Hls.Events.AUDIO_TRACK_SWITCHED, function (eventName) { - // TODO: mutate level datasets - chart.removeType('audioTrack'); - chart.updateAudioTracks(hls.audioTracks); - }, chart); - hls.on(Hls.Events.SUBTITLE_TRACK_SWITCH, function (eventName) { - // TODO: mutate level datasets - chart.removeType('subtitleTrack'); - chart.updateSubtitleTracks(hls.subtitleTracks); - }, chart); - hls.on(Hls.Events.AUDIO_TRACK_LOADED, updateLevelOrTrack, chart); - hls.on(Hls.Events.SUBTITLE_TRACK_LOADED, updateLevelOrTrack, chart); - hls.on(Hls.Events.LEVEL_PTS_UPDATED, updateLevelOrTrack, chart); - hls.on(Hls.Events.FRAG_LOADED, updateFragment, chart); - hls.on(Hls.Events.FRAG_PARSED, updateFragment, chart); - hls.on(Hls.Events.FRAG_CHANGED, updateFragment, chart); - hls.on(Hls.Events.BUFFER_APPENDING, updateChart, chart); - hls.on(Hls.Events.BUFFER_APPENDED, updateChart, chart); - hls.on(Hls.Events.BUFFER_FLUSHED, updateChart, chart); -} - -function updateConfigEditorValue(obj) { - var json = JSON.stringify(obj, null, 2); - configEditor.session.setValue(json); -} - -function applyConfigEditorValue() { - onDemoConfigChanged(); - loadSelectedStream(); -} - -function createfMP4(type) { - if (fmp4Data[type].length) { - var blob = new Blob([arrayConcat(fmp4Data[type])], { - type: 'application/octet-stream' - }); - var filename = type + '-' + new Date().toISOString() + '.mp4'; - self.saveAs(blob, filename); // $('body').append('Download ' + filename + ' track
'); - } else if (!dumpfMP4) { - console.error('Check "Dump transmuxed fMP4 data" first to make appended media available for saving.'); - } -} - -function arrayConcat(inputArray) { - var totalLength = inputArray.reduce(function (prev, cur) { - return prev + cur.length; - }, 0); - var result = new Uint8Array(totalLength); - var offset = 0; - inputArray.forEach(function (element) { - result.set(element, offset); - offset += element.length; - }); - return result; -} - -function hideAllTabs() { - $('.demo-tab-btn').css('background-color', ''); - $('.demo-tab').hide(); -} - -function toggleTabClick(btn) { - toggleTab(btn); - var tabIndexes = $('.demo-tab-btn').toArray().map(function (el, i) { - return $('#' + $(el).data('tab')).is(':visible') ? i : null; - }).filter(function (i) { - return i !== null; - }); - localStorage.setItem(STORAGE_KEYS.demo_tabs, tabIndexes.join(',')); -} - -function toggleTab(btn, dontHideOpenTabs) { - var tabElId = $(btn).data('tab'); // eslint-disable-next-line no-restricted-globals - - var modifierPressed = dontHideOpenTabs || self.event && (self.event.metaKey || self.event.shiftKey); - - if (!modifierPressed) { - hideAllTabs(); - } - - if (modifierPressed) { - $("#" + tabElId).toggle(); - } else { - $("#" + tabElId).show(); - } - - $(btn).css('background-color', $("#" + tabElId).is(':visible') ? 'orange' : ''); - - if (!$('#statsDisplayTab').is(':visible')) { - self.hideMetrics(); - } - - if (hls) { - if ($('#timelineTab').is(':visible')) { - chart.show(); - chart.resize(chart.chart.data ? chart.chart.data.datasets : null); - } else { - chart.hide(); - } - } -} - -function appendLog(textElId, message) { - var el = $('#' + textElId); - var logText = el.text(); - - if (logText.length) { - logText += '\n'; - } - - var timestamp = (Date.now() - startTime) / 1000; - var newMessage = timestamp + ' | ' + message; - logText += newMessage; // update - - el.text(logText); - var element = el[0]; - element.scrollTop = element.scrollHeight - element.clientHeight; -} - -function logStatus(message) { - appendLog('statusOut', message); -} - -function logError(message) { - appendLog('errorOut', message); -} - -/***/ }), - -/***/ "./node_modules/chart.js/dist/Chart.js": -/*!*********************************************!*\ - !*** ./node_modules/chart.js/dist/Chart.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -/*! - * Chart.js v2.9.4 - * https://www.chartjs.org - * (c) 2020 Chart.js Contributors - * Released under the MIT License - */ -(function (global, factory) { - true ? module.exports = factory(function() { try { return __webpack_require__(/*! moment */ "./node_modules/moment/moment.js"); } catch(e) { } }()) : -undefined; -}(this, (function (moment) { 'use strict'; - -moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; - -function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; -} - -function getCjsExportFromNamespace (n) { - return n && n['default'] || n; -} - -var colorName = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; - -var conversions = createCommonjsModule(function (module) { -/* MIT license */ - - -// NOTE: conversions should only return primitive values (i.e. arrays, or -// values that give correct `typeof` results). -// do not use box values types (i.e. Number(), String(), etc.) - -var reverseKeywords = {}; -for (var key in colorName) { - if (colorName.hasOwnProperty(key)) { - reverseKeywords[colorName[key]] = key; - } -} - -var convert = module.exports = { - rgb: {channels: 3, labels: 'rgb'}, - hsl: {channels: 3, labels: 'hsl'}, - hsv: {channels: 3, labels: 'hsv'}, - hwb: {channels: 3, labels: 'hwb'}, - cmyk: {channels: 4, labels: 'cmyk'}, - xyz: {channels: 3, labels: 'xyz'}, - lab: {channels: 3, labels: 'lab'}, - lch: {channels: 3, labels: 'lch'}, - hex: {channels: 1, labels: ['hex']}, - keyword: {channels: 1, labels: ['keyword']}, - ansi16: {channels: 1, labels: ['ansi16']}, - ansi256: {channels: 1, labels: ['ansi256']}, - hcg: {channels: 3, labels: ['h', 'c', 'g']}, - apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, - gray: {channels: 1, labels: ['gray']} -}; - -// hide .channels and .labels properties -for (var model in convert) { - if (convert.hasOwnProperty(model)) { - if (!('channels' in convert[model])) { - throw new Error('missing channels property: ' + model); - } - - if (!('labels' in convert[model])) { - throw new Error('missing channel labels property: ' + model); - } - - if (convert[model].labels.length !== convert[model].channels) { - throw new Error('channel and label counts mismatch: ' + model); - } - - var channels = convert[model].channels; - var labels = convert[model].labels; - delete convert[model].channels; - delete convert[model].labels; - Object.defineProperty(convert[model], 'channels', {value: channels}); - Object.defineProperty(convert[model], 'labels', {value: labels}); - } -} - -convert.rgb.hsl = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var l; - - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } - - h = Math.min(h * 60, 360); - - if (h < 0) { - h += 360; - } - - l = (min + max) / 2; - - if (max === min) { - s = 0; - } else if (l <= 0.5) { - s = delta / (max + min); - } else { - s = delta / (2 - max - min); - } - - return [h, s * 100, l * 100]; -}; - -convert.rgb.hsv = function (rgb) { - var rdif; - var gdif; - var bdif; - var h; - var s; - - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var v = Math.max(r, g, b); - var diff = v - Math.min(r, g, b); - var diffc = function (c) { - return (v - c) / 6 / diff + 1 / 2; - }; - - if (diff === 0) { - h = s = 0; - } else { - s = diff / v; - rdif = diffc(r); - gdif = diffc(g); - bdif = diffc(b); - - if (r === v) { - h = bdif - gdif; - } else if (g === v) { - h = (1 / 3) + rdif - bdif; - } else if (b === v) { - h = (2 / 3) + gdif - rdif; - } - if (h < 0) { - h += 1; - } else if (h > 1) { - h -= 1; - } - } - - return [ - h * 360, - s * 100, - v * 100 - ]; -}; - -convert.rgb.hwb = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var h = convert.rgb.hsl(rgb)[0]; - var w = 1 / 255 * Math.min(r, Math.min(g, b)); - - b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); - - return [h, w * 100, b * 100]; -}; - -convert.rgb.cmyk = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var c; - var m; - var y; - var k; - - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; - - return [c * 100, m * 100, y * 100, k * 100]; -}; - -/** - * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance - * */ -function comparativeDistance(x, y) { - return ( - Math.pow(x[0] - y[0], 2) + - Math.pow(x[1] - y[1], 2) + - Math.pow(x[2] - y[2], 2) - ); -} - -convert.rgb.keyword = function (rgb) { - var reversed = reverseKeywords[rgb]; - if (reversed) { - return reversed; - } - - var currentClosestDistance = Infinity; - var currentClosestKeyword; - - for (var keyword in colorName) { - if (colorName.hasOwnProperty(keyword)) { - var value = colorName[keyword]; - - // Compute comparative distance - var distance = comparativeDistance(rgb, value); - - // Check if its less, if so set as closest - if (distance < currentClosestDistance) { - currentClosestDistance = distance; - currentClosestKeyword = keyword; - } - } - } - - return currentClosestKeyword; -}; - -convert.keyword.rgb = function (keyword) { - return colorName[keyword]; -}; - -convert.rgb.xyz = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); - - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); - - return [x * 100, y * 100, z * 100]; -}; - -convert.rgb.lab = function (rgb) { - var xyz = convert.rgb.xyz(rgb); - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -}; - -convert.hsl.rgb = function (hsl) { - var h = hsl[0] / 360; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var t1; - var t2; - var t3; - var rgb; - var val; - - if (s === 0) { - val = l * 255; - return [val, val, val]; - } - - if (l < 0.5) { - t2 = l * (1 + s); - } else { - t2 = l + s - l * s; - } - - t1 = 2 * l - t2; - - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + 1 / 3 * -(i - 1); - if (t3 < 0) { - t3++; - } - if (t3 > 1) { - t3--; - } - - if (6 * t3 < 1) { - val = t1 + (t2 - t1) * 6 * t3; - } else if (2 * t3 < 1) { - val = t2; - } else if (3 * t3 < 2) { - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - } else { - val = t1; - } - - rgb[i] = val * 255; - } - - return rgb; -}; - -convert.hsl.hsv = function (hsl) { - var h = hsl[0]; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var smin = s; - var lmin = Math.max(l, 0.01); - var sv; - var v; - - l *= 2; - s *= (l <= 1) ? l : 2 - l; - smin *= lmin <= 1 ? lmin : 2 - lmin; - v = (l + s) / 2; - sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); - - return [h, sv * 100, v * 100]; -}; - -convert.hsv.rgb = function (hsv) { - var h = hsv[0] / 60; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var hi = Math.floor(h) % 6; - - var f = h - Math.floor(h); - var p = 255 * v * (1 - s); - var q = 255 * v * (1 - (s * f)); - var t = 255 * v * (1 - (s * (1 - f))); - v *= 255; - - switch (hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } -}; - -convert.hsv.hsl = function (hsv) { - var h = hsv[0]; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var vmin = Math.max(v, 0.01); - var lmin; - var sl; - var l; - - l = (2 - s) * v; - lmin = (2 - s) * vmin; - sl = s * vmin; - sl /= (lmin <= 1) ? lmin : 2 - lmin; - sl = sl || 0; - l /= 2; - - return [h, sl * 100, l * 100]; -}; - -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb -convert.hwb.rgb = function (hwb) { - var h = hwb[0] / 360; - var wh = hwb[1] / 100; - var bl = hwb[2] / 100; - var ratio = wh + bl; - var i; - var v; - var f; - var n; - - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } - - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; - - if ((i & 0x01) !== 0) { - f = 1 - f; - } - - n = wh + f * (v - wh); // linear interpolation - - var r; - var g; - var b; - switch (i) { - default: - case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; - } - - return [r * 255, g * 255, b * 255]; -}; - -convert.cmyk.rgb = function (cmyk) { - var c = cmyk[0] / 100; - var m = cmyk[1] / 100; - var y = cmyk[2] / 100; - var k = cmyk[3] / 100; - var r; - var g; - var b; - - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); - - return [r * 255, g * 255, b * 255]; -}; - -convert.xyz.rgb = function (xyz) { - var x = xyz[0] / 100; - var y = xyz[1] / 100; - var z = xyz[2] / 100; - var r; - var g; - var b; - - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - - // assume sRGB - r = r > 0.0031308 - ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) - : r * 12.92; - - g = g > 0.0031308 - ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) - : g * 12.92; - - b = b > 0.0031308 - ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) - : b * 12.92; - - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); - - return [r * 255, g * 255, b * 255]; -}; - -convert.xyz.lab = function (xyz) { - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -}; - -convert.lab.xyz = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var x; - var y; - var z; - - y = (l + 16) / 116; - x = a / 500 + y; - z = y - b / 200; - - var y2 = Math.pow(y, 3); - var x2 = Math.pow(x, 3); - var z2 = Math.pow(z, 3); - y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; - x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; - z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; - - x *= 95.047; - y *= 100; - z *= 108.883; - - return [x, y, z]; -}; - -convert.lab.lch = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var hr; - var h; - var c; - - hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; - - if (h < 0) { - h += 360; - } - - c = Math.sqrt(a * a + b * b); - - return [l, c, h]; -}; - -convert.lch.lab = function (lch) { - var l = lch[0]; - var c = lch[1]; - var h = lch[2]; - var a; - var b; - var hr; - - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); - - return [l, a, b]; -}; - -convert.rgb.ansi16 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; - var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization - - value = Math.round(value / 50); - - if (value === 0) { - return 30; - } - - var ansi = 30 - + ((Math.round(b / 255) << 2) - | (Math.round(g / 255) << 1) - | Math.round(r / 255)); - - if (value === 2) { - ansi += 60; - } - - return ansi; -}; - -convert.hsv.ansi16 = function (args) { - // optimization here; we already know the value and don't need to get - // it converted for us. - return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); -}; - -convert.rgb.ansi256 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; - - // we use the extended greyscale palette here, with the exception of - // black and white. normal palette only has 4 greyscale shades. - if (r === g && g === b) { - if (r < 8) { - return 16; - } - - if (r > 248) { - return 231; - } - - return Math.round(((r - 8) / 247) * 24) + 232; - } - - var ansi = 16 - + (36 * Math.round(r / 255 * 5)) - + (6 * Math.round(g / 255 * 5)) - + Math.round(b / 255 * 5); - - return ansi; -}; - -convert.ansi16.rgb = function (args) { - var color = args % 10; - - // handle greyscale - if (color === 0 || color === 7) { - if (args > 50) { - color += 3.5; - } - - color = color / 10.5 * 255; - - return [color, color, color]; - } - - var mult = (~~(args > 50) + 1) * 0.5; - var r = ((color & 1) * mult) * 255; - var g = (((color >> 1) & 1) * mult) * 255; - var b = (((color >> 2) & 1) * mult) * 255; - - return [r, g, b]; -}; - -convert.ansi256.rgb = function (args) { - // handle greyscale - if (args >= 232) { - var c = (args - 232) * 10 + 8; - return [c, c, c]; - } - - args -= 16; - - var rem; - var r = Math.floor(args / 36) / 5 * 255; - var g = Math.floor((rem = args % 36) / 6) / 5 * 255; - var b = (rem % 6) / 5 * 255; - - return [r, g, b]; -}; - -convert.rgb.hex = function (args) { - var integer = ((Math.round(args[0]) & 0xFF) << 16) - + ((Math.round(args[1]) & 0xFF) << 8) - + (Math.round(args[2]) & 0xFF); - - var string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; - -convert.hex.rgb = function (args) { - var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); - if (!match) { - return [0, 0, 0]; - } - - var colorString = match[0]; - - if (match[0].length === 3) { - colorString = colorString.split('').map(function (char) { - return char + char; - }).join(''); - } - - var integer = parseInt(colorString, 16); - var r = (integer >> 16) & 0xFF; - var g = (integer >> 8) & 0xFF; - var b = integer & 0xFF; - - return [r, g, b]; -}; - -convert.rgb.hcg = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var max = Math.max(Math.max(r, g), b); - var min = Math.min(Math.min(r, g), b); - var chroma = (max - min); - var grayscale; - var hue; - - if (chroma < 1) { - grayscale = min / (1 - chroma); - } else { - grayscale = 0; - } - - if (chroma <= 0) { - hue = 0; - } else - if (max === r) { - hue = ((g - b) / chroma) % 6; - } else - if (max === g) { - hue = 2 + (b - r) / chroma; - } else { - hue = 4 + (r - g) / chroma + 4; - } - - hue /= 6; - hue %= 1; - - return [hue * 360, chroma * 100, grayscale * 100]; -}; - -convert.hsl.hcg = function (hsl) { - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var c = 1; - var f = 0; - - if (l < 0.5) { - c = 2.0 * s * l; - } else { - c = 2.0 * s * (1.0 - l); - } - - if (c < 1.0) { - f = (l - 0.5 * c) / (1.0 - c); - } - - return [hsl[0], c * 100, f * 100]; -}; - -convert.hsv.hcg = function (hsv) { - var s = hsv[1] / 100; - var v = hsv[2] / 100; - - var c = s * v; - var f = 0; - - if (c < 1.0) { - f = (v - c) / (1 - c); - } - - return [hsv[0], c * 100, f * 100]; -}; - -convert.hcg.rgb = function (hcg) { - var h = hcg[0] / 360; - var c = hcg[1] / 100; - var g = hcg[2] / 100; - - if (c === 0.0) { - return [g * 255, g * 255, g * 255]; - } - - var pure = [0, 0, 0]; - var hi = (h % 1) * 6; - var v = hi % 1; - var w = 1 - v; - var mg = 0; - - switch (Math.floor(hi)) { - case 0: - pure[0] = 1; pure[1] = v; pure[2] = 0; break; - case 1: - pure[0] = w; pure[1] = 1; pure[2] = 0; break; - case 2: - pure[0] = 0; pure[1] = 1; pure[2] = v; break; - case 3: - pure[0] = 0; pure[1] = w; pure[2] = 1; break; - case 4: - pure[0] = v; pure[1] = 0; pure[2] = 1; break; - default: - pure[0] = 1; pure[1] = 0; pure[2] = w; - } - - mg = (1.0 - c) * g; - - return [ - (c * pure[0] + mg) * 255, - (c * pure[1] + mg) * 255, - (c * pure[2] + mg) * 255 - ]; -}; - -convert.hcg.hsv = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - - var v = c + g * (1.0 - c); - var f = 0; - - if (v > 0.0) { - f = c / v; - } - - return [hcg[0], f * 100, v * 100]; -}; - -convert.hcg.hsl = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - - var l = g * (1.0 - c) + 0.5 * c; - var s = 0; - - if (l > 0.0 && l < 0.5) { - s = c / (2 * l); - } else - if (l >= 0.5 && l < 1.0) { - s = c / (2 * (1 - l)); - } - - return [hcg[0], s * 100, l * 100]; -}; - -convert.hcg.hwb = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - var v = c + g * (1.0 - c); - return [hcg[0], (v - c) * 100, (1 - v) * 100]; -}; - -convert.hwb.hcg = function (hwb) { - var w = hwb[1] / 100; - var b = hwb[2] / 100; - var v = 1 - b; - var c = v - w; - var g = 0; - - if (c < 1) { - g = (v - c) / (1 - c); - } - - return [hwb[0], c * 100, g * 100]; -}; - -convert.apple.rgb = function (apple) { - return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; -}; - -convert.rgb.apple = function (rgb) { - return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; -}; - -convert.gray.rgb = function (args) { - return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; -}; - -convert.gray.hsl = convert.gray.hsv = function (args) { - return [0, 0, args[0]]; -}; - -convert.gray.hwb = function (gray) { - return [0, 100, gray[0]]; -}; - -convert.gray.cmyk = function (gray) { - return [0, 0, 0, gray[0]]; -}; - -convert.gray.lab = function (gray) { - return [gray[0], 0, 0]; -}; - -convert.gray.hex = function (gray) { - var val = Math.round(gray[0] / 100 * 255) & 0xFF; - var integer = (val << 16) + (val << 8) + val; - - var string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; - -convert.rgb.gray = function (rgb) { - var val = (rgb[0] + rgb[1] + rgb[2]) / 3; - return [val / 255 * 100]; -}; -}); -var conversions_1 = conversions.rgb; -var conversions_2 = conversions.hsl; -var conversions_3 = conversions.hsv; -var conversions_4 = conversions.hwb; -var conversions_5 = conversions.cmyk; -var conversions_6 = conversions.xyz; -var conversions_7 = conversions.lab; -var conversions_8 = conversions.lch; -var conversions_9 = conversions.hex; -var conversions_10 = conversions.keyword; -var conversions_11 = conversions.ansi16; -var conversions_12 = conversions.ansi256; -var conversions_13 = conversions.hcg; -var conversions_14 = conversions.apple; -var conversions_15 = conversions.gray; - -/* - this function routes a model to all other models. - - all functions that are routed have a property `.conversion` attached - to the returned synthetic function. This property is an array - of strings, each with the steps in between the 'from' and 'to' - color models (inclusive). - - conversions that are not possible simply are not included. -*/ - -function buildGraph() { - var graph = {}; - // https://jsperf.com/object-keys-vs-for-in-with-closure/3 - var models = Object.keys(conversions); - - for (var len = models.length, i = 0; i < len; i++) { - graph[models[i]] = { - // http://jsperf.com/1-vs-infinity - // micro-opt, but this is simple. - distance: -1, - parent: null - }; - } - - return graph; -} - -// https://en.wikipedia.org/wiki/Breadth-first_search -function deriveBFS(fromModel) { - var graph = buildGraph(); - var queue = [fromModel]; // unshift -> queue -> pop - - graph[fromModel].distance = 0; - - while (queue.length) { - var current = queue.pop(); - var adjacents = Object.keys(conversions[current]); - - for (var len = adjacents.length, i = 0; i < len; i++) { - var adjacent = adjacents[i]; - var node = graph[adjacent]; - - if (node.distance === -1) { - node.distance = graph[current].distance + 1; - node.parent = current; - queue.unshift(adjacent); - } - } - } - - return graph; -} - -function link(from, to) { - return function (args) { - return to(from(args)); - }; -} - -function wrapConversion(toModel, graph) { - var path = [graph[toModel].parent, toModel]; - var fn = conversions[graph[toModel].parent][toModel]; - - var cur = graph[toModel].parent; - while (graph[cur].parent) { - path.unshift(graph[cur].parent); - fn = link(conversions[graph[cur].parent][cur], fn); - cur = graph[cur].parent; - } - - fn.conversion = path; - return fn; -} - -var route = function (fromModel) { - var graph = deriveBFS(fromModel); - var conversion = {}; - - var models = Object.keys(graph); - for (var len = models.length, i = 0; i < len; i++) { - var toModel = models[i]; - var node = graph[toModel]; - - if (node.parent === null) { - // no possible conversion, or this node is the source model. - continue; - } - - conversion[toModel] = wrapConversion(toModel, graph); - } - - return conversion; -}; - -var convert = {}; - -var models = Object.keys(conversions); - -function wrapRaw(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; - } - - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); - } - - return fn(args); - }; - - // preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } - - return wrappedFn; -} - -function wrapRounded(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; - } - - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); - } - - var result = fn(args); - - // we're assuming the result is an array here. - // see notice in conversions.js; don't use box types - // in conversion functions. - if (typeof result === 'object') { - for (var len = result.length, i = 0; i < len; i++) { - result[i] = Math.round(result[i]); - } - } - - return result; - }; - - // preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } - - return wrappedFn; -} - -models.forEach(function (fromModel) { - convert[fromModel] = {}; - - Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); - Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - - var routes = route(fromModel); - var routeModels = Object.keys(routes); - - routeModels.forEach(function (toModel) { - var fn = routes[toModel]; - - convert[fromModel][toModel] = wrapRounded(fn); - convert[fromModel][toModel].raw = wrapRaw(fn); - }); -}); - -var colorConvert = convert; - -var colorName$1 = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; - -/* MIT license */ - - -var colorString = { - getRgba: getRgba, - getHsla: getHsla, - getRgb: getRgb, - getHsl: getHsl, - getHwb: getHwb, - getAlpha: getAlpha, - - hexString: hexString, - rgbString: rgbString, - rgbaString: rgbaString, - percentString: percentString, - percentaString: percentaString, - hslString: hslString, - hslaString: hslaString, - hwbString: hwbString, - keyword: keyword -}; - -function getRgba(string) { - if (!string) { - return; - } - var abbr = /^#([a-fA-F0-9]{3,4})$/i, - hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, - rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - keyword = /(\w+)/; - - var rgb = [0, 0, 0], - a = 1, - match = string.match(abbr), - hexAlpha = ""; - if (match) { - match = match[1]; - hexAlpha = match[3]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i] + match[i], 16); - } - if (hexAlpha) { - a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; - } - } - else if (match = string.match(hex)) { - hexAlpha = match[2]; - match = match[1]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); - } - if (hexAlpha) { - a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; - } - } - else if (match = string.match(rgba)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i + 1]); - } - a = parseFloat(match[4]); - } - else if (match = string.match(per)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); - } - a = parseFloat(match[4]); - } - else if (match = string.match(keyword)) { - if (match[1] == "transparent") { - return [0, 0, 0, 0]; - } - rgb = colorName$1[match[1]]; - if (!rgb) { - return; - } - } - - for (var i = 0; i < rgb.length; i++) { - rgb[i] = scale(rgb[i], 0, 255); - } - if (!a && a != 0) { - a = 1; - } - else { - a = scale(a, 0, 1); - } - rgb[3] = a; - return rgb; -} - -function getHsla(string) { - if (!string) { - return; - } - var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hsl); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - s = scale(parseFloat(match[2]), 0, 100), - l = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, s, l, a]; - } -} - -function getHwb(string) { - if (!string) { - return; - } - var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hwb); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - w = scale(parseFloat(match[2]), 0, 100), - b = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, w, b, a]; - } -} - -function getRgb(string) { - var rgba = getRgba(string); - return rgba && rgba.slice(0, 3); -} - -function getHsl(string) { - var hsla = getHsla(string); - return hsla && hsla.slice(0, 3); -} - -function getAlpha(string) { - var vals = getRgba(string); - if (vals) { - return vals[3]; - } - else if (vals = getHsla(string)) { - return vals[3]; - } - else if (vals = getHwb(string)) { - return vals[3]; - } -} - -// generators -function hexString(rgba, a) { - var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; - return "#" + hexDouble(rgba[0]) - + hexDouble(rgba[1]) - + hexDouble(rgba[2]) - + ( - (a >= 0 && a < 1) - ? hexDouble(Math.round(a * 255)) - : "" - ); -} - -function rgbString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return rgbaString(rgba, alpha); - } - return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; -} - -function rgbaString(rgba, alpha) { - if (alpha === undefined) { - alpha = (rgba[3] !== undefined ? rgba[3] : 1); - } - return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] - + ", " + alpha + ")"; -} - -function percentString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return percentaString(rgba, alpha); - } - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - - return "rgb(" + r + "%, " + g + "%, " + b + "%)"; -} - -function percentaString(rgba, alpha) { - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; -} - -function hslString(hsla, alpha) { - if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { - return hslaString(hsla, alpha); - } - return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; -} - -function hslaString(hsla, alpha) { - if (alpha === undefined) { - alpha = (hsla[3] !== undefined ? hsla[3] : 1); - } - return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " - + alpha + ")"; -} - -// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax -// (hwb have alpha optional & 1 is default value) -function hwbString(hwb, alpha) { - if (alpha === undefined) { - alpha = (hwb[3] !== undefined ? hwb[3] : 1); - } - return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" - + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; -} - -function keyword(rgb) { - return reverseNames[rgb.slice(0, 3)]; -} - -// helpers -function scale(num, min, max) { - return Math.min(Math.max(min, num), max); -} - -function hexDouble(num) { - var str = num.toString(16).toUpperCase(); - return (str.length < 2) ? "0" + str : str; -} - - -//create a list of reverse color names -var reverseNames = {}; -for (var name in colorName$1) { - reverseNames[colorName$1[name]] = name; -} - -/* MIT license */ - - - -var Color = function (obj) { - if (obj instanceof Color) { - return obj; - } - if (!(this instanceof Color)) { - return new Color(obj); - } - - this.valid = false; - this.values = { - rgb: [0, 0, 0], - hsl: [0, 0, 0], - hsv: [0, 0, 0], - hwb: [0, 0, 0], - cmyk: [0, 0, 0, 0], - alpha: 1 - }; - - // parse Color() argument - var vals; - if (typeof obj === 'string') { - vals = colorString.getRgba(obj); - if (vals) { - this.setValues('rgb', vals); - } else if (vals = colorString.getHsla(obj)) { - this.setValues('hsl', vals); - } else if (vals = colorString.getHwb(obj)) { - this.setValues('hwb', vals); - } - } else if (typeof obj === 'object') { - vals = obj; - if (vals.r !== undefined || vals.red !== undefined) { - this.setValues('rgb', vals); - } else if (vals.l !== undefined || vals.lightness !== undefined) { - this.setValues('hsl', vals); - } else if (vals.v !== undefined || vals.value !== undefined) { - this.setValues('hsv', vals); - } else if (vals.w !== undefined || vals.whiteness !== undefined) { - this.setValues('hwb', vals); - } else if (vals.c !== undefined || vals.cyan !== undefined) { - this.setValues('cmyk', vals); - } - } -}; - -Color.prototype = { - isValid: function () { - return this.valid; - }, - rgb: function () { - return this.setSpace('rgb', arguments); - }, - hsl: function () { - return this.setSpace('hsl', arguments); - }, - hsv: function () { - return this.setSpace('hsv', arguments); - }, - hwb: function () { - return this.setSpace('hwb', arguments); - }, - cmyk: function () { - return this.setSpace('cmyk', arguments); - }, - - rgbArray: function () { - return this.values.rgb; - }, - hslArray: function () { - return this.values.hsl; - }, - hsvArray: function () { - return this.values.hsv; - }, - hwbArray: function () { - var values = this.values; - if (values.alpha !== 1) { - return values.hwb.concat([values.alpha]); - } - return values.hwb; - }, - cmykArray: function () { - return this.values.cmyk; - }, - rgbaArray: function () { - var values = this.values; - return values.rgb.concat([values.alpha]); - }, - hslaArray: function () { - var values = this.values; - return values.hsl.concat([values.alpha]); - }, - alpha: function (val) { - if (val === undefined) { - return this.values.alpha; - } - this.setValues('alpha', val); - return this; - }, - - red: function (val) { - return this.setChannel('rgb', 0, val); - }, - green: function (val) { - return this.setChannel('rgb', 1, val); - }, - blue: function (val) { - return this.setChannel('rgb', 2, val); - }, - hue: function (val) { - if (val) { - val %= 360; - val = val < 0 ? 360 + val : val; - } - return this.setChannel('hsl', 0, val); - }, - saturation: function (val) { - return this.setChannel('hsl', 1, val); - }, - lightness: function (val) { - return this.setChannel('hsl', 2, val); - }, - saturationv: function (val) { - return this.setChannel('hsv', 1, val); - }, - whiteness: function (val) { - return this.setChannel('hwb', 1, val); - }, - blackness: function (val) { - return this.setChannel('hwb', 2, val); - }, - value: function (val) { - return this.setChannel('hsv', 2, val); - }, - cyan: function (val) { - return this.setChannel('cmyk', 0, val); - }, - magenta: function (val) { - return this.setChannel('cmyk', 1, val); - }, - yellow: function (val) { - return this.setChannel('cmyk', 2, val); - }, - black: function (val) { - return this.setChannel('cmyk', 3, val); - }, - - hexString: function () { - return colorString.hexString(this.values.rgb); - }, - rgbString: function () { - return colorString.rgbString(this.values.rgb, this.values.alpha); - }, - rgbaString: function () { - return colorString.rgbaString(this.values.rgb, this.values.alpha); - }, - percentString: function () { - return colorString.percentString(this.values.rgb, this.values.alpha); - }, - hslString: function () { - return colorString.hslString(this.values.hsl, this.values.alpha); - }, - hslaString: function () { - return colorString.hslaString(this.values.hsl, this.values.alpha); - }, - hwbString: function () { - return colorString.hwbString(this.values.hwb, this.values.alpha); - }, - keyword: function () { - return colorString.keyword(this.values.rgb, this.values.alpha); - }, - - rgbNumber: function () { - var rgb = this.values.rgb; - return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; - }, - - luminosity: function () { - // http://www.w3.org/TR/WCAG20/#relativeluminancedef - var rgb = this.values.rgb; - var lum = []; - for (var i = 0; i < rgb.length; i++) { - var chan = rgb[i] / 255; - lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); - } - return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; - }, - - contrast: function (color2) { - // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - var lum1 = this.luminosity(); - var lum2 = color2.luminosity(); - if (lum1 > lum2) { - return (lum1 + 0.05) / (lum2 + 0.05); - } - return (lum2 + 0.05) / (lum1 + 0.05); - }, - - level: function (color2) { - var contrastRatio = this.contrast(color2); - if (contrastRatio >= 7.1) { - return 'AAA'; - } - - return (contrastRatio >= 4.5) ? 'AA' : ''; - }, - - dark: function () { - // YIQ equation from http://24ways.org/2010/calculating-color-contrast - var rgb = this.values.rgb; - var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; - return yiq < 128; - }, - - light: function () { - return !this.dark(); - }, - - negate: function () { - var rgb = []; - for (var i = 0; i < 3; i++) { - rgb[i] = 255 - this.values.rgb[i]; - } - this.setValues('rgb', rgb); - return this; - }, - - lighten: function (ratio) { - var hsl = this.values.hsl; - hsl[2] += hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - darken: function (ratio) { - var hsl = this.values.hsl; - hsl[2] -= hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - saturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] += hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - desaturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] -= hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - whiten: function (ratio) { - var hwb = this.values.hwb; - hwb[1] += hwb[1] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - blacken: function (ratio) { - var hwb = this.values.hwb; - hwb[2] += hwb[2] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - greyscale: function () { - var rgb = this.values.rgb; - // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale - var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; - this.setValues('rgb', [val, val, val]); - return this; - }, - - clearer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha - (alpha * ratio)); - return this; - }, - - opaquer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha + (alpha * ratio)); - return this; - }, - - rotate: function (degrees) { - var hsl = this.values.hsl; - var hue = (hsl[0] + degrees) % 360; - hsl[0] = hue < 0 ? 360 + hue : hue; - this.setValues('hsl', hsl); - return this; - }, - - /** - * Ported from sass implementation in C - * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 - */ - mix: function (mixinColor, weight) { - var color1 = this; - var color2 = mixinColor; - var p = weight === undefined ? 0.5 : weight; - - var w = 2 * p - 1; - var a = color1.alpha() - color2.alpha(); - - var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - - return this - .rgb( - w1 * color1.red() + w2 * color2.red(), - w1 * color1.green() + w2 * color2.green(), - w1 * color1.blue() + w2 * color2.blue() - ) - .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); - }, - - toJSON: function () { - return this.rgb(); - }, - - clone: function () { - // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, - // making the final build way to big to embed in Chart.js. So let's do it manually, - // assuming that values to clone are 1 dimension arrays containing only numbers, - // except 'alpha' which is a number. - var result = new Color(); - var source = this.values; - var target = result.values; - var value, type; - - for (var prop in source) { - if (source.hasOwnProperty(prop)) { - value = source[prop]; - type = ({}).toString.call(value); - if (type === '[object Array]') { - target[prop] = value.slice(0); - } else if (type === '[object Number]') { - target[prop] = value; - } else { - console.error('unexpected color value:', value); - } - } - } - - return result; - } -}; - -Color.prototype.spaces = { - rgb: ['red', 'green', 'blue'], - hsl: ['hue', 'saturation', 'lightness'], - hsv: ['hue', 'saturation', 'value'], - hwb: ['hue', 'whiteness', 'blackness'], - cmyk: ['cyan', 'magenta', 'yellow', 'black'] -}; - -Color.prototype.maxes = { - rgb: [255, 255, 255], - hsl: [360, 100, 100], - hsv: [360, 100, 100], - hwb: [360, 100, 100], - cmyk: [100, 100, 100, 100] -}; - -Color.prototype.getValues = function (space) { - var values = this.values; - var vals = {}; - - for (var i = 0; i < space.length; i++) { - vals[space.charAt(i)] = values[space][i]; - } - - if (values.alpha !== 1) { - vals.a = values.alpha; - } - - // {r: 255, g: 255, b: 255, a: 0.4} - return vals; -}; - -Color.prototype.setValues = function (space, vals) { - var values = this.values; - var spaces = this.spaces; - var maxes = this.maxes; - var alpha = 1; - var i; - - this.valid = true; - - if (space === 'alpha') { - alpha = vals; - } else if (vals.length) { - // [10, 10, 10] - values[space] = vals.slice(0, space.length); - alpha = vals[space.length]; - } else if (vals[space.charAt(0)] !== undefined) { - // {r: 10, g: 10, b: 10} - for (i = 0; i < space.length; i++) { - values[space][i] = vals[space.charAt(i)]; - } - - alpha = vals.a; - } else if (vals[spaces[space][0]] !== undefined) { - // {red: 10, green: 10, blue: 10} - var chans = spaces[space]; - - for (i = 0; i < space.length; i++) { - values[space][i] = vals[chans[i]]; - } - - alpha = vals.alpha; - } - - values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); - - if (space === 'alpha') { - return false; - } - - var capped; - - // cap values of the space prior converting all values - for (i = 0; i < space.length; i++) { - capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); - values[space][i] = Math.round(capped); - } - - // convert to all the other color spaces - for (var sname in spaces) { - if (sname !== space) { - values[sname] = colorConvert[space][sname](values[space]); - } - } - - return true; -}; - -Color.prototype.setSpace = function (space, args) { - var vals = args[0]; - - if (vals === undefined) { - // color.rgb() - return this.getValues(space); - } - - // color.rgb(10, 10, 10) - if (typeof vals === 'number') { - vals = Array.prototype.slice.call(args); - } - - this.setValues(space, vals); - return this; -}; - -Color.prototype.setChannel = function (space, index, val) { - var svalues = this.values[space]; - if (val === undefined) { - // color.red() - return svalues[index]; - } else if (val === svalues[index]) { - // color.red(color.red()) - return this; - } - - // color.red(100) - svalues[index] = val; - this.setValues(space, svalues); - - return this; -}; - -if (typeof window !== 'undefined') { - window.Color = Color; -} - -var chartjsColor = Color; - -function isValidKey(key) { - return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1; -} - -/** - * @namespace Chart.helpers - */ -var helpers = { - /** - * An empty function that can be used, for example, for optional callback. - */ - noop: function() {}, - - /** - * Returns a unique id, sequentially generated from a global variable. - * @returns {number} - * @function - */ - uid: (function() { - var id = 0; - return function() { - return id++; - }; - }()), - - /** - * Returns true if `value` is neither null nor undefined, else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @since 2.7.0 - */ - isNullOrUndef: function(value) { - return value === null || typeof value === 'undefined'; - }, - - /** - * Returns true if `value` is an array (including typed arrays), else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @function - */ - isArray: function(value) { - if (Array.isArray && Array.isArray(value)) { - return true; - } - var type = Object.prototype.toString.call(value); - if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { - return true; - } - return false; - }, - - /** - * Returns true if `value` is an object (excluding null), else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @since 2.7.0 - */ - isObject: function(value) { - return value !== null && Object.prototype.toString.call(value) === '[object Object]'; - }, - - /** - * Returns true if `value` is a finite number, else returns false - * @param {*} value - The value to test. - * @returns {boolean} - */ - isFinite: function(value) { - return (typeof value === 'number' || value instanceof Number) && isFinite(value); - }, - - /** - * Returns `value` if defined, else returns `defaultValue`. - * @param {*} value - The value to return if defined. - * @param {*} defaultValue - The value to return if `value` is undefined. - * @returns {*} - */ - valueOrDefault: function(value, defaultValue) { - return typeof value === 'undefined' ? defaultValue : value; - }, - - /** - * Returns value at the given `index` in array if defined, else returns `defaultValue`. - * @param {Array} value - The array to lookup for value at `index`. - * @param {number} index - The index in `value` to lookup for value. - * @param {*} defaultValue - The value to return if `value[index]` is undefined. - * @returns {*} - */ - valueAtIndexOrDefault: function(value, index, defaultValue) { - return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); - }, - - /** - * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the - * value returned by `fn`. If `fn` is not a function, this method returns undefined. - * @param {function} fn - The function to call. - * @param {Array|undefined|null} args - The arguments with which `fn` should be called. - * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. - * @returns {*} - */ - callback: function(fn, args, thisArg) { - if (fn && typeof fn.call === 'function') { - return fn.apply(thisArg, args); - } - }, - - /** - * Note(SB) for performance sake, this method should only be used when loopable type - * is unknown or in none intensive code (not called often and small loopable). Else - * it's preferable to use a regular for() loop and save extra function calls. - * @param {object|Array} loopable - The object or array to be iterated. - * @param {function} fn - The function to call for each item. - * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. - * @param {boolean} [reverse] - If true, iterates backward on the loopable. - */ - each: function(loopable, fn, thisArg, reverse) { - var i, len, keys; - if (helpers.isArray(loopable)) { - len = loopable.length; - if (reverse) { - for (i = len - 1; i >= 0; i--) { - fn.call(thisArg, loopable[i], i); - } - } else { - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[i], i); - } - } - } else if (helpers.isObject(loopable)) { - keys = Object.keys(loopable); - len = keys.length; - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[keys[i]], keys[i]); - } - } - }, - - /** - * Returns true if the `a0` and `a1` arrays have the same content, else returns false. - * @see https://stackoverflow.com/a/14853974 - * @param {Array} a0 - The array to compare - * @param {Array} a1 - The array to compare - * @returns {boolean} - */ - arrayEquals: function(a0, a1) { - var i, ilen, v0, v1; - - if (!a0 || !a1 || a0.length !== a1.length) { - return false; - } - - for (i = 0, ilen = a0.length; i < ilen; ++i) { - v0 = a0[i]; - v1 = a1[i]; - - if (v0 instanceof Array && v1 instanceof Array) { - if (!helpers.arrayEquals(v0, v1)) { - return false; - } - } else if (v0 !== v1) { - // NOTE: two different object instances will never be equal: {x:20} != {x:20} - return false; - } - } - - return true; - }, - - /** - * Returns a deep copy of `source` without keeping references on objects and arrays. - * @param {*} source - The value to clone. - * @returns {*} - */ - clone: function(source) { - if (helpers.isArray(source)) { - return source.map(helpers.clone); - } - - if (helpers.isObject(source)) { - var target = Object.create(source); - var keys = Object.keys(source); - var klen = keys.length; - var k = 0; - - for (; k < klen; ++k) { - target[keys[k]] = helpers.clone(source[keys[k]]); - } - - return target; - } - - return source; - }, - - /** - * The default merger when Chart.helpers.merge is called without merger option. - * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. - * @private - */ - _merger: function(key, target, source, options) { - if (!isValidKey(key)) { - // We want to ensure we do not copy prototypes over - // as this can pollute global namespaces - return; - } - - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.merge(tval, sval, options); - } else { - target[key] = helpers.clone(sval); - } - }, - - /** - * Merges source[key] in target[key] only if target[key] is undefined. - * @private - */ - _mergerIf: function(key, target, source) { - if (!isValidKey(key)) { - // We want to ensure we do not copy prototypes over - // as this can pollute global namespaces - return; - } - - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.mergeIf(tval, sval); - } else if (!target.hasOwnProperty(key)) { - target[key] = helpers.clone(sval); - } - }, - - /** - * Recursively deep copies `source` properties into `target` with the given `options`. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {object} target - The target object in which all sources are merged into. - * @param {object|object[]} source - Object(s) to merge into `target`. - * @param {object} [options] - Merging options: - * @param {function} [options.merger] - The merge method (key, target, source, options) - * @returns {object} The `target` object. - */ - merge: function(target, source, options) { - var sources = helpers.isArray(source) ? source : [source]; - var ilen = sources.length; - var merge, i, keys, klen, k; - - if (!helpers.isObject(target)) { - return target; - } - - options = options || {}; - merge = options.merger || helpers._merger; - - for (i = 0; i < ilen; ++i) { - source = sources[i]; - if (!helpers.isObject(source)) { - continue; - } - - keys = Object.keys(source); - for (k = 0, klen = keys.length; k < klen; ++k) { - merge(keys[k], target, source, options); - } - } - - return target; - }, - - /** - * Recursively deep copies `source` properties into `target` *only* if not defined in target. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {object} target - The target object in which all sources are merged into. - * @param {object|object[]} source - Object(s) to merge into `target`. - * @returns {object} The `target` object. - */ - mergeIf: function(target, source) { - return helpers.merge(target, source, {merger: helpers._mergerIf}); - }, - - /** - * Applies the contents of two or more objects together into the first object. - * @param {object} target - The target object in which all objects are merged into. - * @param {object} arg1 - Object containing additional properties to merge in target. - * @param {object} argN - Additional objects containing properties to merge in target. - * @returns {object} The `target` object. - */ - extend: Object.assign || function(target) { - return helpers.merge(target, [].slice.call(arguments, 1), { - merger: function(key, dst, src) { - dst[key] = src[key]; - } - }); - }, - - /** - * Basic javascript inheritance based on the model created in Backbone.js - */ - inherits: function(extensions) { - var me = this; - var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { - return me.apply(this, arguments); - }; - - var Surrogate = function() { - this.constructor = ChartElement; - }; - - Surrogate.prototype = me.prototype; - ChartElement.prototype = new Surrogate(); - ChartElement.extend = helpers.inherits; - - if (extensions) { - helpers.extend(ChartElement.prototype, extensions); - } - - ChartElement.__super__ = me.prototype; - return ChartElement; - }, - - _deprecated: function(scope, value, previous, current) { - if (value !== undefined) { - console.warn(scope + ': "' + previous + - '" is deprecated. Please use "' + current + '" instead'); - } - } -}; - -var helpers_core = helpers; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.callback instead. - * @function Chart.helpers.callCallback - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ -helpers.callCallback = helpers.callback; - -/** - * Provided for backward compatibility, use Array.prototype.indexOf instead. - * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ - * @function Chart.helpers.indexOf - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.indexOf = function(array, item, fromIndex) { - return Array.prototype.indexOf.call(array, item, fromIndex); -}; - -/** - * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. - * @function Chart.helpers.getValueOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.getValueOrDefault = helpers.valueOrDefault; - -/** - * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. - * @function Chart.helpers.getValueAtIndexOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; - -/** - * Easing functions adapted from Robert Penner's easing equations. - * @namespace Chart.helpers.easingEffects - * @see http://www.robertpenner.com/easing/ - */ -var effects = { - linear: function(t) { - return t; - }, - - easeInQuad: function(t) { - return t * t; - }, - - easeOutQuad: function(t) { - return -t * (t - 2); - }, - - easeInOutQuad: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t; - } - return -0.5 * ((--t) * (t - 2) - 1); - }, - - easeInCubic: function(t) { - return t * t * t; - }, - - easeOutCubic: function(t) { - return (t = t - 1) * t * t + 1; - }, - - easeInOutCubic: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t; - } - return 0.5 * ((t -= 2) * t * t + 2); - }, - - easeInQuart: function(t) { - return t * t * t * t; - }, - - easeOutQuart: function(t) { - return -((t = t - 1) * t * t * t - 1); - }, - - easeInOutQuart: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t; - } - return -0.5 * ((t -= 2) * t * t * t - 2); - }, - - easeInQuint: function(t) { - return t * t * t * t * t; - }, - - easeOutQuint: function(t) { - return (t = t - 1) * t * t * t * t + 1; - }, - - easeInOutQuint: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t * t; - } - return 0.5 * ((t -= 2) * t * t * t * t + 2); - }, - - easeInSine: function(t) { - return -Math.cos(t * (Math.PI / 2)) + 1; - }, - - easeOutSine: function(t) { - return Math.sin(t * (Math.PI / 2)); - }, - - easeInOutSine: function(t) { - return -0.5 * (Math.cos(Math.PI * t) - 1); - }, - - easeInExpo: function(t) { - return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); - }, - - easeOutExpo: function(t) { - return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; - }, - - easeInOutExpo: function(t) { - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if ((t /= 0.5) < 1) { - return 0.5 * Math.pow(2, 10 * (t - 1)); - } - return 0.5 * (-Math.pow(2, -10 * --t) + 2); - }, - - easeInCirc: function(t) { - if (t >= 1) { - return t; - } - return -(Math.sqrt(1 - t * t) - 1); - }, - - easeOutCirc: function(t) { - return Math.sqrt(1 - (t = t - 1) * t); - }, - - easeInOutCirc: function(t) { - if ((t /= 0.5) < 1) { - return -0.5 * (Math.sqrt(1 - t * t) - 1); - } - return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); - }, - - easeInElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - }, - - easeOutElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; - }, - - easeInOutElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if ((t /= 0.5) === 2) { - return 1; - } - if (!p) { - p = 0.45; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - if (t < 1) { - return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - } - return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; - }, - easeInBack: function(t) { - var s = 1.70158; - return t * t * ((s + 1) * t - s); - }, - - easeOutBack: function(t) { - var s = 1.70158; - return (t = t - 1) * t * ((s + 1) * t + s) + 1; - }, - - easeInOutBack: function(t) { - var s = 1.70158; - if ((t /= 0.5) < 1) { - return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); - } - return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); - }, - - easeInBounce: function(t) { - return 1 - effects.easeOutBounce(1 - t); - }, - - easeOutBounce: function(t) { - if (t < (1 / 2.75)) { - return 7.5625 * t * t; - } - if (t < (2 / 2.75)) { - return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; - } - if (t < (2.5 / 2.75)) { - return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; - } - return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; - }, - - easeInOutBounce: function(t) { - if (t < 0.5) { - return effects.easeInBounce(t * 2) * 0.5; - } - return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; - } -}; - -var helpers_easing = { - effects: effects -}; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.easing.effects instead. - * @function Chart.helpers.easingEffects - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.easingEffects = effects; - -var PI = Math.PI; -var RAD_PER_DEG = PI / 180; -var DOUBLE_PI = PI * 2; -var HALF_PI = PI / 2; -var QUARTER_PI = PI / 4; -var TWO_THIRDS_PI = PI * 2 / 3; - -/** - * @namespace Chart.helpers.canvas - */ -var exports$1 = { - /** - * Clears the entire canvas associated to the given `chart`. - * @param {Chart} chart - The chart for which to clear the canvas. - */ - clear: function(chart) { - chart.ctx.clearRect(0, 0, chart.width, chart.height); - }, - - /** - * Creates a "path" for a rectangle with rounded corners at position (x, y) with a - * given size (width, height) and the same `radius` for all corners. - * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. - * @param {number} x - The x axis of the coordinate for the rectangle starting point. - * @param {number} y - The y axis of the coordinate for the rectangle starting point. - * @param {number} width - The rectangle's width. - * @param {number} height - The rectangle's height. - * @param {number} radius - The rounded amount (in pixels) for the four corners. - * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? - */ - roundedRect: function(ctx, x, y, width, height, radius) { - if (radius) { - var r = Math.min(radius, height / 2, width / 2); - var left = x + r; - var top = y + r; - var right = x + width - r; - var bottom = y + height - r; - - ctx.moveTo(x, top); - if (left < right && top < bottom) { - ctx.arc(left, top, r, -PI, -HALF_PI); - ctx.arc(right, top, r, -HALF_PI, 0); - ctx.arc(right, bottom, r, 0, HALF_PI); - ctx.arc(left, bottom, r, HALF_PI, PI); - } else if (left < right) { - ctx.moveTo(left, y); - ctx.arc(right, top, r, -HALF_PI, HALF_PI); - ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); - } else if (top < bottom) { - ctx.arc(left, top, r, -PI, 0); - ctx.arc(left, bottom, r, 0, PI); - } else { - ctx.arc(left, top, r, -PI, PI); - } - ctx.closePath(); - ctx.moveTo(x, y); - } else { - ctx.rect(x, y, width, height); - } - }, - - drawPoint: function(ctx, style, radius, x, y, rotation) { - var type, xOffset, yOffset, size, cornerRadius; - var rad = (rotation || 0) * RAD_PER_DEG; - - if (style && typeof style === 'object') { - type = style.toString(); - if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { - ctx.save(); - ctx.translate(x, y); - ctx.rotate(rad); - ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); - ctx.restore(); - return; - } - } - - if (isNaN(radius) || radius <= 0) { - return; - } - - ctx.beginPath(); - - switch (style) { - // Default includes circle - default: - ctx.arc(x, y, radius, 0, DOUBLE_PI); - ctx.closePath(); - break; - case 'triangle': - ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - ctx.closePath(); - break; - case 'rectRounded': - // NOTE: the rounded rect implementation changed to use `arc` instead of - // `quadraticCurveTo` since it generates better results when rect is - // almost a circle. 0.516 (instead of 0.5) produces results with visually - // closer proportion to the previous impl and it is inscribed in the - // circle with `radius`. For more details, see the following PRs: - // https://github.com/chartjs/Chart.js/issues/5597 - // https://github.com/chartjs/Chart.js/issues/5858 - cornerRadius = radius * 0.516; - size = radius - cornerRadius; - xOffset = Math.cos(rad + QUARTER_PI) * size; - yOffset = Math.sin(rad + QUARTER_PI) * size; - ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); - ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); - ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); - ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); - ctx.closePath(); - break; - case 'rect': - if (!rotation) { - size = Math.SQRT1_2 * radius; - ctx.rect(x - size, y - size, 2 * size, 2 * size); - break; - } - rad += QUARTER_PI; - /* falls through */ - case 'rectRot': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + yOffset, y - xOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.lineTo(x - yOffset, y + xOffset); - ctx.closePath(); - break; - case 'crossRot': - rad += QUARTER_PI; - /* falls through */ - case 'cross': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - break; - case 'star': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - rad += QUARTER_PI; - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - break; - case 'line': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - break; - case 'dash': - ctx.moveTo(x, y); - ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); - break; - } - - ctx.fill(); - ctx.stroke(); - }, - - /** - * Returns true if the point is inside the rectangle - * @param {object} point - The point to test - * @param {object} area - The rectangle - * @returns {boolean} - * @private - */ - _isPointInArea: function(point, area) { - var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. - - return point.x > area.left - epsilon && point.x < area.right + epsilon && - point.y > area.top - epsilon && point.y < area.bottom + epsilon; - }, - - clipArea: function(ctx, area) { - ctx.save(); - ctx.beginPath(); - ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); - ctx.clip(); - }, - - unclipArea: function(ctx) { - ctx.restore(); - }, - - lineTo: function(ctx, previous, target, flip) { - var stepped = target.steppedLine; - if (stepped) { - if (stepped === 'middle') { - var midpoint = (previous.x + target.x) / 2.0; - ctx.lineTo(midpoint, flip ? target.y : previous.y); - ctx.lineTo(midpoint, flip ? previous.y : target.y); - } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { - ctx.lineTo(previous.x, target.y); - } else { - ctx.lineTo(target.x, previous.y); - } - ctx.lineTo(target.x, target.y); - return; - } - - if (!target.tension) { - ctx.lineTo(target.x, target.y); - return; - } - - ctx.bezierCurveTo( - flip ? previous.controlPointPreviousX : previous.controlPointNextX, - flip ? previous.controlPointPreviousY : previous.controlPointNextY, - flip ? target.controlPointNextX : target.controlPointPreviousX, - flip ? target.controlPointNextY : target.controlPointPreviousY, - target.x, - target.y); - } -}; - -var helpers_canvas = exports$1; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. - * @namespace Chart.helpers.clear - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.clear = exports$1.clear; - -/** - * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. - * @namespace Chart.helpers.drawRoundedRectangle - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.drawRoundedRectangle = function(ctx) { - ctx.beginPath(); - exports$1.roundedRect.apply(exports$1, arguments); -}; - -var defaults = { - /** - * @private - */ - _set: function(scope, values) { - return helpers_core.merge(this[scope] || (this[scope] = {}), values); - } -}; - -// TODO(v3): remove 'global' from namespace. all default are global and -// there's inconsistency around which options are under 'global' -defaults._set('global', { - defaultColor: 'rgba(0,0,0,0.1)', - defaultFontColor: '#666', - defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", - defaultFontSize: 12, - defaultFontStyle: 'normal', - defaultLineHeight: 1.2, - showLines: true -}); - -var core_defaults = defaults; - -var valueOrDefault = helpers_core.valueOrDefault; - -/** - * Converts the given font object into a CSS font string. - * @param {object} font - A font object. - * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font - * @private - */ -function toFontString(font) { - if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { - return null; - } - - return (font.style ? font.style + ' ' : '') - + (font.weight ? font.weight + ' ' : '') - + font.size + 'px ' - + font.family; -} - -/** - * @alias Chart.helpers.options - * @namespace - */ -var helpers_options = { - /** - * Converts the given line height `value` in pixels for a specific font `size`. - * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). - * @param {number} size - The font size (in pixels) used to resolve relative `value`. - * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height - * @since 2.7.0 - */ - toLineHeight: function(value, size) { - var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); - if (!matches || matches[1] === 'normal') { - return size * 1.2; - } - - value = +matches[2]; - - switch (matches[3]) { - case 'px': - return value; - case '%': - value /= 100; - break; - } - - return size * value; - }, - - /** - * Converts the given value into a padding object with pre-computed width/height. - * @param {number|object} value - If a number, set the value to all TRBL component, - * else, if and object, use defined properties and sets undefined ones to 0. - * @returns {object} The padding values (top, right, bottom, left, width, height) - * @since 2.7.0 - */ - toPadding: function(value) { - var t, r, b, l; - - if (helpers_core.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - top: t, - right: r, - bottom: b, - left: l, - height: t + b, - width: l + r - }; - }, - - /** - * Parses font options and returns the font object. - * @param {object} options - A object that contains font options to be parsed. - * @return {object} The font object. - * @todo Support font.* options and renamed to toFont(). - * @private - */ - _parseFont: function(options) { - var globalDefaults = core_defaults.global; - var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); - var font = { - family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), - lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), - size: size, - style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), - weight: null, - string: '' - }; - - font.string = toFontString(font); - return font; - }, - - /** - * Evaluates the given `inputs` sequentially and returns the first defined value. - * @param {Array} inputs - An array of values, falling back to the last value. - * @param {object} [context] - If defined and the current value is a function, the value - * is called with `context` as first argument and the result becomes the new input. - * @param {number} [index] - If defined and the current value is an array, the value - * at `index` become the new input. - * @param {object} [info] - object to return information about resolution in - * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable. - * @since 2.7.0 - */ - resolve: function(inputs, context, index, info) { - var cacheable = true; - var i, ilen, value; - - for (i = 0, ilen = inputs.length; i < ilen; ++i) { - value = inputs[i]; - if (value === undefined) { - continue; - } - if (context !== undefined && typeof value === 'function') { - value = value(context); - cacheable = false; - } - if (index !== undefined && helpers_core.isArray(value)) { - value = value[index]; - cacheable = false; - } - if (value !== undefined) { - if (info && !cacheable) { - info.cacheable = false; - } - return value; - } - } - } -}; - -/** - * @alias Chart.helpers.math - * @namespace - */ -var exports$2 = { - /** - * Returns an array of factors sorted from 1 to sqrt(value) - * @private - */ - _factorize: function(value) { - var result = []; - var sqrt = Math.sqrt(value); - var i; - - for (i = 1; i < sqrt; i++) { - if (value % i === 0) { - result.push(i); - result.push(value / i); - } - } - if (sqrt === (sqrt | 0)) { // if value is a square number - result.push(sqrt); - } - - result.sort(function(a, b) { - return a - b; - }).pop(); - return result; - }, - - log10: Math.log10 || function(x) { - var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. - // Check for whole powers of 10, - // which due to floating point rounding error should be corrected. - var powerOf10 = Math.round(exponent); - var isPowerOf10 = x === Math.pow(10, powerOf10); - - return isPowerOf10 ? powerOf10 : exponent; - } -}; - -var helpers_math = exports$2; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.math.log10 instead. - * @namespace Chart.helpers.log10 - * @deprecated since version 2.9.0 - * @todo remove at version 3 - * @private - */ -helpers_core.log10 = exports$2.log10; - -var getRtlAdapter = function(rectX, width) { - return { - x: function(x) { - return rectX + rectX + width - x; - }, - setWidth: function(w) { - width = w; - }, - textAlign: function(align) { - if (align === 'center') { - return align; - } - return align === 'right' ? 'left' : 'right'; - }, - xPlus: function(x, value) { - return x - value; - }, - leftForLtr: function(x, itemWidth) { - return x - itemWidth; - }, - }; -}; - -var getLtrAdapter = function() { - return { - x: function(x) { - return x; - }, - setWidth: function(w) { // eslint-disable-line no-unused-vars - }, - textAlign: function(align) { - return align; - }, - xPlus: function(x, value) { - return x + value; - }, - leftForLtr: function(x, _itemWidth) { // eslint-disable-line no-unused-vars - return x; - }, - }; -}; - -var getAdapter = function(rtl, rectX, width) { - return rtl ? getRtlAdapter(rectX, width) : getLtrAdapter(); -}; - -var overrideTextDirection = function(ctx, direction) { - var style, original; - if (direction === 'ltr' || direction === 'rtl') { - style = ctx.canvas.style; - original = [ - style.getPropertyValue('direction'), - style.getPropertyPriority('direction'), - ]; - - style.setProperty('direction', direction, 'important'); - ctx.prevTextDirection = original; - } -}; - -var restoreTextDirection = function(ctx) { - var original = ctx.prevTextDirection; - if (original !== undefined) { - delete ctx.prevTextDirection; - ctx.canvas.style.setProperty('direction', original[0], original[1]); - } -}; - -var helpers_rtl = { - getRtlAdapter: getAdapter, - overrideTextDirection: overrideTextDirection, - restoreTextDirection: restoreTextDirection, -}; - -var helpers$1 = helpers_core; -var easing = helpers_easing; -var canvas = helpers_canvas; -var options = helpers_options; -var math = helpers_math; -var rtl = helpers_rtl; -helpers$1.easing = easing; -helpers$1.canvas = canvas; -helpers$1.options = options; -helpers$1.math = math; -helpers$1.rtl = rtl; - -function interpolate(start, view, model, ease) { - var keys = Object.keys(model); - var i, ilen, key, actual, origin, target, type, c0, c1; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - - target = model[key]; - - // if a value is added to the model after pivot() has been called, the view - // doesn't contain it, so let's initialize the view to the target value. - if (!view.hasOwnProperty(key)) { - view[key] = target; - } - - actual = view[key]; - - if (actual === target || key[0] === '_') { - continue; - } - - if (!start.hasOwnProperty(key)) { - start[key] = actual; - } - - origin = start[key]; - - type = typeof target; - - if (type === typeof origin) { - if (type === 'string') { - c0 = chartjsColor(origin); - if (c0.valid) { - c1 = chartjsColor(target); - if (c1.valid) { - view[key] = c1.mix(c0, ease).rgbString(); - continue; - } - } - } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { - view[key] = origin + (target - origin) * ease; - continue; - } - } - - view[key] = target; - } -} - -var Element = function(configuration) { - helpers$1.extend(this, configuration); - this.initialize.apply(this, arguments); -}; - -helpers$1.extend(Element.prototype, { - _type: undefined, - - initialize: function() { - this.hidden = false; - }, - - pivot: function() { - var me = this; - if (!me._view) { - me._view = helpers$1.extend({}, me._model); - } - me._start = {}; - return me; - }, - - transition: function(ease) { - var me = this; - var model = me._model; - var start = me._start; - var view = me._view; - - // No animation -> No Transition - if (!model || ease === 1) { - me._view = helpers$1.extend({}, model); - me._start = null; - return me; - } - - if (!view) { - view = me._view = {}; - } - - if (!start) { - start = me._start = {}; - } - - interpolate(start, view, model, ease); - - return me; - }, - - tooltipPosition: function() { - return { - x: this._model.x, - y: this._model.y - }; - }, - - hasValue: function() { - return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); - } -}); - -Element.extend = helpers$1.inherits; - -var core_element = Element; - -var exports$3 = core_element.extend({ - chart: null, // the animation associated chart instance - currentStep: 0, // the current animation step - numSteps: 60, // default number of steps - easing: '', // the easing to use for this animation - render: null, // render function used by the animation service - - onAnimationProgress: null, // user specified callback to fire on each step of the animation - onAnimationComplete: null, // user specified callback to fire when the animation finishes -}); - -var core_animation = exports$3; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.Animation instead - * @prop Chart.Animation#animationObject - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ -Object.defineProperty(exports$3.prototype, 'animationObject', { - get: function() { - return this; - } -}); - -/** - * Provided for backward compatibility, use Chart.Animation#chart instead - * @prop Chart.Animation#chartInstance - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ -Object.defineProperty(exports$3.prototype, 'chartInstance', { - get: function() { - return this.chart; - }, - set: function(value) { - this.chart = value; - } -}); - -core_defaults._set('global', { - animation: { - duration: 1000, - easing: 'easeOutQuart', - onProgress: helpers$1.noop, - onComplete: helpers$1.noop - } -}); - -var core_animations = { - animations: [], - request: null, - - /** - * @param {Chart} chart - The chart to animate. - * @param {Chart.Animation} animation - The animation that we will animate. - * @param {number} duration - The animation duration in ms. - * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions - */ - addAnimation: function(chart, animation, duration, lazy) { - var animations = this.animations; - var i, ilen; - - animation.chart = chart; - animation.startTime = Date.now(); - animation.duration = duration; - - if (!lazy) { - chart.animating = true; - } - - for (i = 0, ilen = animations.length; i < ilen; ++i) { - if (animations[i].chart === chart) { - animations[i] = animation; - return; - } - } - - animations.push(animation); - - // If there are no animations queued, manually kickstart a digest, for lack of a better word - if (animations.length === 1) { - this.requestAnimationFrame(); - } - }, - - cancelAnimation: function(chart) { - var index = helpers$1.findIndex(this.animations, function(animation) { - return animation.chart === chart; - }); - - if (index !== -1) { - this.animations.splice(index, 1); - chart.animating = false; - } - }, - - requestAnimationFrame: function() { - var me = this; - if (me.request === null) { - // Skip animation frame requests until the active one is executed. - // This can happen when processing mouse events, e.g. 'mousemove' - // and 'mouseout' events will trigger multiple renders. - me.request = helpers$1.requestAnimFrame.call(window, function() { - me.request = null; - me.startDigest(); - }); - } - }, - - /** - * @private - */ - startDigest: function() { - var me = this; - - me.advance(); - - // Do we have more stuff to animate? - if (me.animations.length > 0) { - me.requestAnimationFrame(); - } - }, - - /** - * @private - */ - advance: function() { - var animations = this.animations; - var animation, chart, numSteps, nextStep; - var i = 0; - - // 1 animation per chart, so we are looping charts here - while (i < animations.length) { - animation = animations[i]; - chart = animation.chart; - numSteps = animation.numSteps; - - // Make sure that currentStep starts at 1 - // https://github.com/chartjs/Chart.js/issues/6104 - nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; - animation.currentStep = Math.min(nextStep, numSteps); - - helpers$1.callback(animation.render, [chart, animation], chart); - helpers$1.callback(animation.onAnimationProgress, [animation], chart); - - if (animation.currentStep >= numSteps) { - helpers$1.callback(animation.onAnimationComplete, [animation], chart); - chart.animating = false; - animations.splice(i, 1); - } else { - ++i; - } - } - } -}; - -var resolve = helpers$1.options.resolve; - -var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; - -/** - * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', - * 'unshift') and notify the listener AFTER the array has been altered. Listeners are - * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. - */ -function listenArrayEvents(array, listener) { - if (array._chartjs) { - array._chartjs.listeners.push(listener); - return; - } - - Object.defineProperty(array, '_chartjs', { - configurable: true, - enumerable: false, - value: { - listeners: [listener] - } - }); - - arrayEvents.forEach(function(key) { - var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); - var base = array[key]; - - Object.defineProperty(array, key, { - configurable: true, - enumerable: false, - value: function() { - var args = Array.prototype.slice.call(arguments); - var res = base.apply(this, args); - - helpers$1.each(array._chartjs.listeners, function(object) { - if (typeof object[method] === 'function') { - object[method].apply(object, args); - } - }); - - return res; - } - }); - }); -} - -/** - * Removes the given array event listener and cleanup extra attached properties (such as - * the _chartjs stub and overridden methods) if array doesn't have any more listeners. - */ -function unlistenArrayEvents(array, listener) { - var stub = array._chartjs; - if (!stub) { - return; - } - - var listeners = stub.listeners; - var index = listeners.indexOf(listener); - if (index !== -1) { - listeners.splice(index, 1); - } - - if (listeners.length > 0) { - return; - } - - arrayEvents.forEach(function(key) { - delete array[key]; - }); - - delete array._chartjs; -} - -// Base class for all dataset controllers (line, bar, etc) -var DatasetController = function(chart, datasetIndex) { - this.initialize(chart, datasetIndex); -}; - -helpers$1.extend(DatasetController.prototype, { - - /** - * Element type used to generate a meta dataset (e.g. Chart.element.Line). - * @type {Chart.core.element} - */ - datasetElementType: null, - - /** - * Element type used to generate a meta data (e.g. Chart.element.Point). - * @type {Chart.core.element} - */ - dataElementType: null, - - /** - * Dataset element option keys to be resolved in _resolveDatasetElementOptions. - * A derived controller may override this to resolve controller-specific options. - * The keys defined here are for backward compatibility for legend styles. - * @private - */ - _datasetElementOptions: [ - 'backgroundColor', - 'borderCapStyle', - 'borderColor', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'borderWidth' - ], - - /** - * Data element option keys to be resolved in _resolveDataElementOptions. - * A derived controller may override this to resolve controller-specific options. - * The keys defined here are for backward compatibility for legend styles. - * @private - */ - _dataElementOptions: [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'pointStyle' - ], - - initialize: function(chart, datasetIndex) { - var me = this; - me.chart = chart; - me.index = datasetIndex; - me.linkScales(); - me.addElements(); - me._type = me.getMeta().type; - }, - - updateIndex: function(datasetIndex) { - this.index = datasetIndex; - }, - - linkScales: function() { - var me = this; - var meta = me.getMeta(); - var chart = me.chart; - var scales = chart.scales; - var dataset = me.getDataset(); - var scalesOpts = chart.options.scales; - - if (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) { - meta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id; - } - if (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) { - meta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id; - } - }, - - getDataset: function() { - return this.chart.data.datasets[this.index]; - }, - - getMeta: function() { - return this.chart.getDatasetMeta(this.index); - }, - - getScaleForId: function(scaleID) { - return this.chart.scales[scaleID]; - }, - - /** - * @private - */ - _getValueScaleId: function() { - return this.getMeta().yAxisID; - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - _getValueScale: function() { - return this.getScaleForId(this._getValueScaleId()); - }, - - /** - * @private - */ - _getIndexScale: function() { - return this.getScaleForId(this._getIndexScaleId()); - }, - - reset: function() { - this._update(true); - }, - - /** - * @private - */ - destroy: function() { - if (this._data) { - unlistenArrayEvents(this._data, this); - } - }, - - createMetaDataset: function() { - var me = this; - var type = me.datasetElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index - }); - }, - - createMetaData: function(index) { - var me = this; - var type = me.dataElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index, - _index: index - }); - }, - - addElements: function() { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data || []; - var metaData = meta.data; - var i, ilen; - - for (i = 0, ilen = data.length; i < ilen; ++i) { - metaData[i] = metaData[i] || me.createMetaData(i); - } - - meta.dataset = meta.dataset || me.createMetaDataset(); - }, - - addElementAndReset: function(index) { - var element = this.createMetaData(index); - this.getMeta().data.splice(index, 0, element); - this.updateElement(element, index, true); - }, - - buildOrUpdateElements: function() { - var me = this; - var dataset = me.getDataset(); - var data = dataset.data || (dataset.data = []); - - // In order to correctly handle data addition/deletion animation (an thus simulate - // real-time charts), we need to monitor these data modifications and synchronize - // the internal meta data accordingly. - if (me._data !== data) { - if (me._data) { - // This case happens when the user replaced the data array instance. - unlistenArrayEvents(me._data, me); - } - - if (data && Object.isExtensible(data)) { - listenArrayEvents(data, me); - } - me._data = data; - } - - // Re-sync meta data in case the user replaced the data array or if we missed - // any updates and so make sure that we handle number of datapoints changing. - me.resyncElements(); - }, - - /** - * Returns the merged user-supplied and default dataset-level options - * @private - */ - _configure: function() { - var me = this; - me._config = helpers$1.merge(Object.create(null), [ - me.chart.options.datasets[me._type], - me.getDataset(), - ], { - merger: function(key, target, source) { - if (key !== '_meta' && key !== 'data') { - helpers$1._merger(key, target, source); - } - } - }); - }, - - _update: function(reset) { - var me = this; - me._configure(); - me._cachedDataOpts = null; - me.update(reset); - }, - - update: helpers$1.noop, - - transition: function(easingValue) { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - for (; i < ilen; ++i) { - elements[i].transition(easingValue); - } - - if (meta.dataset) { - meta.dataset.transition(easingValue); - } - }, - - draw: function() { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - if (meta.dataset) { - meta.dataset.draw(); - } - - for (; i < ilen; ++i) { - elements[i].draw(); - } - }, - - /** - * Returns a set of predefined style properties that should be used to represent the dataset - * or the data if the index is specified - * @param {number} index - data index - * @return {IStyleInterface} style object - */ - getStyle: function(index) { - var me = this; - var meta = me.getMeta(); - var dataset = meta.dataset; - var style; - - me._configure(); - if (dataset && index === undefined) { - style = me._resolveDatasetElementOptions(dataset || {}); - } else { - index = index || 0; - style = me._resolveDataElementOptions(meta.data[index] || {}, index); - } - - if (style.fill === false || style.fill === null) { - style.backgroundColor = style.borderColor; - } - - return style; - }, - - /** - * @private - */ - _resolveDatasetElementOptions: function(element, hover) { - var me = this; - var chart = me.chart; - var datasetOpts = me._config; - var custom = element.custom || {}; - var options = chart.options.elements[me.datasetElementType.prototype._type] || {}; - var elementOptions = me._datasetElementOptions; - var values = {}; - var i, ilen, key, readKey; - - // Scriptable options - var context = { - chart: chart, - dataset: me.getDataset(), - datasetIndex: me.index, - hover: hover - }; - - for (i = 0, ilen = elementOptions.length; i < ilen; ++i) { - key = elementOptions[i]; - readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key; - values[key] = resolve([ - custom[readKey], - datasetOpts[readKey], - options[readKey] - ], context); - } - - return values; - }, - - /** - * @private - */ - _resolveDataElementOptions: function(element, index) { - var me = this; - var custom = element && element.custom; - var cached = me._cachedDataOpts; - if (cached && !custom) { - return cached; - } - var chart = me.chart; - var datasetOpts = me._config; - var options = chart.options.elements[me.dataElementType.prototype._type] || {}; - var elementOptions = me._dataElementOptions; - var values = {}; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: me.getDataset(), - datasetIndex: me.index - }; - - // `resolve` sets cacheable to `false` if any option is indexed or scripted - var info = {cacheable: !custom}; - - var keys, i, ilen, key; - - custom = custom || {}; - - if (helpers$1.isArray(elementOptions)) { - for (i = 0, ilen = elementOptions.length; i < ilen; ++i) { - key = elementOptions[i]; - values[key] = resolve([ - custom[key], - datasetOpts[key], - options[key] - ], context, index, info); - } - } else { - keys = Object.keys(elementOptions); - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve([ - custom[key], - datasetOpts[elementOptions[key]], - datasetOpts[key], - options[key] - ], context, index, info); - } - } - - if (info.cacheable) { - me._cachedDataOpts = Object.freeze(values); - } - - return values; - }, - - removeHoverStyle: function(element) { - helpers$1.merge(element._model, element.$previousStyle || {}); - delete element.$previousStyle; - }, - - setHoverStyle: function(element) { - var dataset = this.chart.data.datasets[element._datasetIndex]; - var index = element._index; - var custom = element.custom || {}; - var model = element._model; - var getHoverColor = helpers$1.getHoverColor; - - element.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth - }; - - model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); - model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); - model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); - }, - - /** - * @private - */ - _removeDatasetHoverStyle: function() { - var element = this.getMeta().dataset; - - if (element) { - this.removeHoverStyle(element); - } - }, - - /** - * @private - */ - _setDatasetHoverStyle: function() { - var element = this.getMeta().dataset; - var prev = {}; - var i, ilen, key, keys, hoverOptions, model; - - if (!element) { - return; - } - - model = element._model; - hoverOptions = this._resolveDatasetElementOptions(element, true); - - keys = Object.keys(hoverOptions); - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - prev[key] = model[key]; - model[key] = hoverOptions[key]; - } - - element.$previousStyle = prev; - }, - - /** - * @private - */ - resyncElements: function() { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data; - var numMeta = meta.data.length; - var numData = data.length; - - if (numData < numMeta) { - meta.data.splice(numData, numMeta - numData); - } else if (numData > numMeta) { - me.insertElements(numMeta, numData - numMeta); - } - }, - - /** - * @private - */ - insertElements: function(start, count) { - for (var i = 0; i < count; ++i) { - this.addElementAndReset(start + i); - } - }, - - /** - * @private - */ - onDataPush: function() { - var count = arguments.length; - this.insertElements(this.getDataset().data.length - count, count); - }, - - /** - * @private - */ - onDataPop: function() { - this.getMeta().data.pop(); - }, - - /** - * @private - */ - onDataShift: function() { - this.getMeta().data.shift(); - }, - - /** - * @private - */ - onDataSplice: function(start, count) { - this.getMeta().data.splice(start, count); - this.insertElements(start, arguments.length - 2); - }, - - /** - * @private - */ - onDataUnshift: function() { - this.insertElements(0, arguments.length); - } -}); - -DatasetController.extend = helpers$1.inherits; - -var core_datasetController = DatasetController; - -var TAU = Math.PI * 2; - -core_defaults._set('global', { - elements: { - arc: { - backgroundColor: core_defaults.global.defaultColor, - borderColor: '#fff', - borderWidth: 2, - borderAlign: 'center' - } - } -}); - -function clipArc(ctx, arc) { - var startAngle = arc.startAngle; - var endAngle = arc.endAngle; - var pixelMargin = arc.pixelMargin; - var angleMargin = pixelMargin / arc.outerRadius; - var x = arc.x; - var y = arc.y; - - // Draw an inner border by cliping the arc and drawing a double-width border - // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders - ctx.beginPath(); - ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin); - if (arc.innerRadius > pixelMargin) { - angleMargin = pixelMargin / arc.innerRadius; - ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true); - } else { - ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2); - } - ctx.closePath(); - ctx.clip(); -} - -function drawFullCircleBorders(ctx, vm, arc, inner) { - var endAngle = arc.endAngle; - var i; - - if (inner) { - arc.endAngle = arc.startAngle + TAU; - clipArc(ctx, arc); - arc.endAngle = endAngle; - if (arc.endAngle === arc.startAngle && arc.fullCircles) { - arc.endAngle += TAU; - arc.fullCircles--; - } - } - - ctx.beginPath(); - ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true); - for (i = 0; i < arc.fullCircles; ++i) { - ctx.stroke(); - } - - ctx.beginPath(); - ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU); - for (i = 0; i < arc.fullCircles; ++i) { - ctx.stroke(); - } -} - -function drawBorder(ctx, vm, arc) { - var inner = vm.borderAlign === 'inner'; - - if (inner) { - ctx.lineWidth = vm.borderWidth * 2; - ctx.lineJoin = 'round'; - } else { - ctx.lineWidth = vm.borderWidth; - ctx.lineJoin = 'bevel'; - } - - if (arc.fullCircles) { - drawFullCircleBorders(ctx, vm, arc, inner); - } - - if (inner) { - clipArc(ctx, arc); - } - - ctx.beginPath(); - ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle); - ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); - ctx.closePath(); - ctx.stroke(); -} - -var element_arc = core_element.extend({ - _type: 'arc', - - inLabelRange: function(mouseX) { - var vm = this._view; - - if (vm) { - return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); - } - return false; - }, - - inRange: function(chartX, chartY) { - var vm = this._view; - - if (vm) { - var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); - var angle = pointRelativePosition.angle; - var distance = pointRelativePosition.distance; - - // Sanitise angle range - var startAngle = vm.startAngle; - var endAngle = vm.endAngle; - while (endAngle < startAngle) { - endAngle += TAU; - } - while (angle > endAngle) { - angle -= TAU; - } - while (angle < startAngle) { - angle += TAU; - } - - // Check if within the range of the open/close angle - var betweenAngles = (angle >= startAngle && angle <= endAngle); - var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); - - return (betweenAngles && withinRadius); - } - return false; - }, - - getCenterPoint: function() { - var vm = this._view; - var halfAngle = (vm.startAngle + vm.endAngle) / 2; - var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; - return { - x: vm.x + Math.cos(halfAngle) * halfRadius, - y: vm.y + Math.sin(halfAngle) * halfRadius - }; - }, - - getArea: function() { - var vm = this._view; - return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); - }, - - tooltipPosition: function() { - var vm = this._view; - var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); - var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; - - return { - x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), - y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) - }; - }, - - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; - var arc = { - x: vm.x, - y: vm.y, - innerRadius: vm.innerRadius, - outerRadius: Math.max(vm.outerRadius - pixelMargin, 0), - pixelMargin: pixelMargin, - startAngle: vm.startAngle, - endAngle: vm.endAngle, - fullCircles: Math.floor(vm.circumference / TAU) - }; - var i; - - ctx.save(); - - ctx.fillStyle = vm.backgroundColor; - ctx.strokeStyle = vm.borderColor; - - if (arc.fullCircles) { - arc.endAngle = arc.startAngle + TAU; - ctx.beginPath(); - ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle); - ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); - ctx.closePath(); - for (i = 0; i < arc.fullCircles; ++i) { - ctx.fill(); - } - arc.endAngle = arc.startAngle + vm.circumference % TAU; - } - - ctx.beginPath(); - ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle); - ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); - ctx.closePath(); - ctx.fill(); - - if (vm.borderWidth) { - drawBorder(ctx, vm, arc); - } - - ctx.restore(); - } -}); - -var valueOrDefault$1 = helpers$1.valueOrDefault; - -var defaultColor = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - line: { - tension: 0.4, - backgroundColor: defaultColor, - borderWidth: 3, - borderColor: defaultColor, - borderCapStyle: 'butt', - borderDash: [], - borderDashOffset: 0.0, - borderJoinStyle: 'miter', - capBezierPoints: true, - fill: true, // do we fill in the area between the line and its base axis - } - } -}); - -var element_line = core_element.extend({ - _type: 'line', - - draw: function() { - var me = this; - var vm = me._view; - var ctx = me._chart.ctx; - var spanGaps = vm.spanGaps; - var points = me._children.slice(); // clone array - var globalDefaults = core_defaults.global; - var globalOptionLineElements = globalDefaults.elements.line; - var lastDrawnIndex = -1; - var closePath = me._loop; - var index, previous, currentVM; - - if (!points.length) { - return; - } - - if (me._loop) { - for (index = 0; index < points.length; ++index) { - previous = helpers$1.previousItem(points, index); - // If the line has an open path, shift the point array - if (!points[index]._view.skip && previous._view.skip) { - points = points.slice(index).concat(points.slice(0, index)); - closePath = spanGaps; - break; - } - } - // If the line has a close path, add the first point again - if (closePath) { - points.push(points[0]); - } - } - - ctx.save(); - - // Stroke Line Options - ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; - - // IE 9 and 10 do not support line dash - if (ctx.setLineDash) { - ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); - } - - ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); - ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; - ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); - ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; - - // Stroke Line - ctx.beginPath(); - - // First point moves to it's starting position no matter what - currentVM = points[0]._view; - if (!currentVM.skip) { - ctx.moveTo(currentVM.x, currentVM.y); - lastDrawnIndex = 0; - } - - for (index = 1; index < points.length; ++index) { - currentVM = points[index]._view; - previous = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex]; - - if (!currentVM.skip) { - if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { - // There was a gap and this is the first point after the gap - ctx.moveTo(currentVM.x, currentVM.y); - } else { - // Line to next point - helpers$1.canvas.lineTo(ctx, previous._view, currentVM); - } - lastDrawnIndex = index; - } - } - - if (closePath) { - ctx.closePath(); - } - - ctx.stroke(); - ctx.restore(); - } -}); - -var valueOrDefault$2 = helpers$1.valueOrDefault; - -var defaultColor$1 = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - point: { - radius: 3, - pointStyle: 'circle', - backgroundColor: defaultColor$1, - borderColor: defaultColor$1, - borderWidth: 1, - // Hover - hitRadius: 1, - hoverRadius: 4, - hoverBorderWidth: 1 - } - } -}); - -function xRange(mouseX) { - var vm = this._view; - return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; -} - -function yRange(mouseY) { - var vm = this._view; - return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; -} - -var element_point = core_element.extend({ - _type: 'point', - - inRange: function(mouseX, mouseY) { - var vm = this._view; - return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; - }, - - inLabelRange: xRange, - inXRange: xRange, - inYRange: yRange, - - getCenterPoint: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - }, - - getArea: function() { - return Math.PI * Math.pow(this._view.radius, 2); - }, - - tooltipPosition: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y, - padding: vm.radius + vm.borderWidth - }; - }, - - draw: function(chartArea) { - var vm = this._view; - var ctx = this._chart.ctx; - var pointStyle = vm.pointStyle; - var rotation = vm.rotation; - var radius = vm.radius; - var x = vm.x; - var y = vm.y; - var globalDefaults = core_defaults.global; - var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow - - if (vm.skip) { - return; - } - - // Clipping for Points. - if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { - ctx.strokeStyle = vm.borderColor || defaultColor; - ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); - ctx.fillStyle = vm.backgroundColor || defaultColor; - helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); - } - } -}); - -var defaultColor$2 = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - rectangle: { - backgroundColor: defaultColor$2, - borderColor: defaultColor$2, - borderSkipped: 'bottom', - borderWidth: 0 - } - } -}); - -function isVertical(vm) { - return vm && vm.width !== undefined; -} - -/** - * Helper function to get the bounds of the bar regardless of the orientation - * @param bar {Chart.Element.Rectangle} the bar - * @return {Bounds} bounds of the bar - * @private - */ -function getBarBounds(vm) { - var x1, x2, y1, y2, half; - - if (isVertical(vm)) { - half = vm.width / 2; - x1 = vm.x - half; - x2 = vm.x + half; - y1 = Math.min(vm.y, vm.base); - y2 = Math.max(vm.y, vm.base); - } else { - half = vm.height / 2; - x1 = Math.min(vm.x, vm.base); - x2 = Math.max(vm.x, vm.base); - y1 = vm.y - half; - y2 = vm.y + half; - } - - return { - left: x1, - top: y1, - right: x2, - bottom: y2 - }; -} - -function swap(orig, v1, v2) { - return orig === v1 ? v2 : orig === v2 ? v1 : orig; -} - -function parseBorderSkipped(vm) { - var edge = vm.borderSkipped; - var res = {}; - - if (!edge) { - return res; - } - - if (vm.horizontal) { - if (vm.base > vm.x) { - edge = swap(edge, 'left', 'right'); - } - } else if (vm.base < vm.y) { - edge = swap(edge, 'bottom', 'top'); - } - - res[edge] = true; - return res; -} - -function parseBorderWidth(vm, maxW, maxH) { - var value = vm.borderWidth; - var skip = parseBorderSkipped(vm); - var t, r, b, l; - - if (helpers$1.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, - r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, - b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, - l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l - }; -} - -function boundingRects(vm) { - var bounds = getBarBounds(vm); - var width = bounds.right - bounds.left; - var height = bounds.bottom - bounds.top; - var border = parseBorderWidth(vm, width / 2, height / 2); - - return { - outer: { - x: bounds.left, - y: bounds.top, - w: width, - h: height - }, - inner: { - x: bounds.left + border.l, - y: bounds.top + border.t, - w: width - border.l - border.r, - h: height - border.t - border.b - } - }; -} - -function inRange(vm, x, y) { - var skipX = x === null; - var skipY = y === null; - var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); - - return bounds - && (skipX || x >= bounds.left && x <= bounds.right) - && (skipY || y >= bounds.top && y <= bounds.bottom); -} - -var element_rectangle = core_element.extend({ - _type: 'rectangle', - - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - var rects = boundingRects(vm); - var outer = rects.outer; - var inner = rects.inner; - - ctx.fillStyle = vm.backgroundColor; - ctx.fillRect(outer.x, outer.y, outer.w, outer.h); - - if (outer.w === inner.w && outer.h === inner.h) { - return; - } - - ctx.save(); - ctx.beginPath(); - ctx.rect(outer.x, outer.y, outer.w, outer.h); - ctx.clip(); - ctx.fillStyle = vm.borderColor; - ctx.rect(inner.x, inner.y, inner.w, inner.h); - ctx.fill('evenodd'); - ctx.restore(); - }, - - height: function() { - var vm = this._view; - return vm.base - vm.y; - }, - - inRange: function(mouseX, mouseY) { - return inRange(this._view, mouseX, mouseY); - }, - - inLabelRange: function(mouseX, mouseY) { - var vm = this._view; - return isVertical(vm) - ? inRange(vm, mouseX, null) - : inRange(vm, null, mouseY); - }, - - inXRange: function(mouseX) { - return inRange(this._view, mouseX, null); - }, - - inYRange: function(mouseY) { - return inRange(this._view, null, mouseY); - }, - - getCenterPoint: function() { - var vm = this._view; - var x, y; - if (isVertical(vm)) { - x = vm.x; - y = (vm.y + vm.base) / 2; - } else { - x = (vm.x + vm.base) / 2; - y = vm.y; - } - - return {x: x, y: y}; - }, - - getArea: function() { - var vm = this._view; - - return isVertical(vm) - ? vm.width * Math.abs(vm.y - vm.base) - : vm.height * Math.abs(vm.x - vm.base); - }, - - tooltipPosition: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - } -}); - -var elements = {}; -var Arc = element_arc; -var Line = element_line; -var Point = element_point; -var Rectangle = element_rectangle; -elements.Arc = Arc; -elements.Line = Line; -elements.Point = Point; -elements.Rectangle = Rectangle; - -var deprecated = helpers$1._deprecated; -var valueOrDefault$3 = helpers$1.valueOrDefault; - -core_defaults._set('bar', { - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - offset: true, - gridLines: { - offsetGridLines: true - } - }], - - yAxes: [{ - type: 'linear' - }] - } -}); - -core_defaults._set('global', { - datasets: { - bar: { - categoryPercentage: 0.8, - barPercentage: 0.9 - } - } -}); - -/** - * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. - * @private - */ -function computeMinSampleSize(scale, pixels) { - var min = scale._length; - var prev, curr, i, ilen; - - for (i = 1, ilen = pixels.length; i < ilen; ++i) { - min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); - } - - for (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) { - curr = scale.getPixelForTick(i); - min = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min; - prev = curr; - } - - return min; -} - -/** - * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, - * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This - * mode currently always generates bars equally sized (until we introduce scriptable options?). - * @private - */ -function computeFitCategoryTraits(index, ruler, options) { - var thickness = options.barThickness; - var count = ruler.stackCount; - var curr = ruler.pixels[index]; - var min = helpers$1.isNullOrUndef(thickness) - ? computeMinSampleSize(ruler.scale, ruler.pixels) - : -1; - var size, ratio; - - if (helpers$1.isNullOrUndef(thickness)) { - size = min * options.categoryPercentage; - ratio = options.barPercentage; - } else { - // When bar thickness is enforced, category and bar percentages are ignored. - // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') - // and deprecate barPercentage since this value is ignored when thickness is absolute. - size = thickness * count; - ratio = 1; - } - - return { - chunk: size / count, - ratio: ratio, - start: curr - (size / 2) - }; -} - -/** - * Computes an "optimal" category that globally arranges bars side by side (no gap when - * percentage options are 1), based on the previous and following categories. This mode - * generates bars with different widths when data are not evenly spaced. - * @private - */ -function computeFlexCategoryTraits(index, ruler, options) { - var pixels = ruler.pixels; - var curr = pixels[index]; - var prev = index > 0 ? pixels[index - 1] : null; - var next = index < pixels.length - 1 ? pixels[index + 1] : null; - var percent = options.categoryPercentage; - var start, size; - - if (prev === null) { - // first data: its size is double based on the next point or, - // if it's also the last data, we use the scale size. - prev = curr - (next === null ? ruler.end - ruler.start : next - curr); - } - - if (next === null) { - // last data: its size is also double based on the previous point. - next = curr + curr - prev; - } - - start = curr - (curr - Math.min(prev, next)) / 2 * percent; - size = Math.abs(next - prev) / 2 * percent; - - return { - chunk: size / ruler.stackCount, - ratio: options.barPercentage, - start: start - }; -} - -var controller_bar = core_datasetController.extend({ - - dataElementType: elements.Rectangle, - - /** - * @private - */ - _dataElementOptions: [ - 'backgroundColor', - 'borderColor', - 'borderSkipped', - 'borderWidth', - 'barPercentage', - 'barThickness', - 'categoryPercentage', - 'maxBarThickness', - 'minBarLength' - ], - - initialize: function() { - var me = this; - var meta, scaleOpts; - - core_datasetController.prototype.initialize.apply(me, arguments); - - meta = me.getMeta(); - meta.stack = me.getDataset().stack; - meta.bar = true; - - scaleOpts = me._getIndexScale().options; - deprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage'); - deprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness'); - deprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage'); - deprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength'); - deprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness'); - }, - - update: function(reset) { - var me = this; - var rects = me.getMeta().data; - var i, ilen; - - me._ruler = me.getRuler(); - - for (i = 0, ilen = rects.length; i < ilen; ++i) { - me.updateElement(rects[i], i, reset); - } - }, - - updateElement: function(rectangle, index, reset) { - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - var options = me._resolveDataElementOptions(rectangle, index); - - rectangle._xScale = me.getScaleForId(meta.xAxisID); - rectangle._yScale = me.getScaleForId(meta.yAxisID); - rectangle._datasetIndex = me.index; - rectangle._index = index; - rectangle._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderSkipped: options.borderSkipped, - borderWidth: options.borderWidth, - datasetLabel: dataset.label, - label: me.chart.data.labels[index] - }; - - if (helpers$1.isArray(dataset.data[index])) { - rectangle._model.borderSkipped = null; - } - - me._updateElementGeometry(rectangle, index, reset, options); - - rectangle.pivot(); - }, - - /** - * @private - */ - _updateElementGeometry: function(rectangle, index, reset, options) { - var me = this; - var model = rectangle._model; - var vscale = me._getValueScale(); - var base = vscale.getBasePixel(); - var horizontal = vscale.isHorizontal(); - var ruler = me._ruler || me.getRuler(); - var vpixels = me.calculateBarValuePixels(me.index, index, options); - var ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options); - - model.horizontal = horizontal; - model.base = reset ? base : vpixels.base; - model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; - model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; - model.height = horizontal ? ipixels.size : undefined; - model.width = horizontal ? undefined : ipixels.size; - }, - - /** - * Returns the stacks based on groups and bar visibility. - * @param {number} [last] - The dataset index - * @returns {string[]} The list of stack IDs - * @private - */ - _getStacks: function(last) { - var me = this; - var scale = me._getIndexScale(); - var metasets = scale._getMatchingVisibleMetas(me._type); - var stacked = scale.options.stacked; - var ilen = metasets.length; - var stacks = []; - var i, meta; - - for (i = 0; i < ilen; ++i) { - meta = metasets[i]; - // stacked | meta.stack - // | found | not found | undefined - // false | x | x | x - // true | | x | - // undefined | | x | x - if (stacked === false || stacks.indexOf(meta.stack) === -1 || - (stacked === undefined && meta.stack === undefined)) { - stacks.push(meta.stack); - } - if (meta.index === last) { - break; - } - } - - return stacks; - }, - - /** - * Returns the effective number of stacks based on groups and bar visibility. - * @private - */ - getStackCount: function() { - return this._getStacks().length; - }, - - /** - * Returns the stack index for the given dataset based on groups and bar visibility. - * @param {number} [datasetIndex] - The dataset index - * @param {string} [name] - The stack name to find - * @returns {number} The stack index - * @private - */ - getStackIndex: function(datasetIndex, name) { - var stacks = this._getStacks(datasetIndex); - var index = (name !== undefined) - ? stacks.indexOf(name) - : -1; // indexOf returns -1 if element is not present - - return (index === -1) - ? stacks.length - 1 - : index; - }, - - /** - * @private - */ - getRuler: function() { - var me = this; - var scale = me._getIndexScale(); - var pixels = []; - var i, ilen; - - for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { - pixels.push(scale.getPixelForValue(null, i, me.index)); - } - - return { - pixels: pixels, - start: scale._startPixel, - end: scale._endPixel, - stackCount: me.getStackCount(), - scale: scale - }; - }, - - /** - * Note: pixel values are not clamped to the scale area. - * @private - */ - calculateBarValuePixels: function(datasetIndex, index, options) { - var me = this; - var chart = me.chart; - var scale = me._getValueScale(); - var isHorizontal = scale.isHorizontal(); - var datasets = chart.data.datasets; - var metasets = scale._getMatchingVisibleMetas(me._type); - var value = scale._parseValue(datasets[datasetIndex].data[index]); - var minBarLength = options.minBarLength; - var stacked = scale.options.stacked; - var stack = me.getMeta().stack; - var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max; - var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max; - var ilen = metasets.length; - var i, imeta, ivalue, base, head, size, stackLength; - - if (stacked || (stacked === undefined && stack !== undefined)) { - for (i = 0; i < ilen; ++i) { - imeta = metasets[i]; - - if (imeta.index === datasetIndex) { - break; - } - - if (imeta.stack === stack) { - stackLength = scale._parseValue(datasets[imeta.index].data[index]); - ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min; - - if ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) { - start += ivalue; - } - } - } - } - - base = scale.getPixelForValue(start); - head = scale.getPixelForValue(start + length); - size = head - base; - - if (minBarLength !== undefined && Math.abs(size) < minBarLength) { - size = minBarLength; - if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) { - head = base - minBarLength; - } else { - head = base + minBarLength; - } - } - - return { - size: size, - base: base, - head: head, - center: head + size / 2 - }; - }, - - /** - * @private - */ - calculateBarIndexPixels: function(datasetIndex, index, ruler, options) { - var me = this; - var range = options.barThickness === 'flex' - ? computeFlexCategoryTraits(index, ruler, options) - : computeFitCategoryTraits(index, ruler, options); - - var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); - var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); - var size = Math.min( - valueOrDefault$3(options.maxBarThickness, Infinity), - range.chunk * range.ratio); - - return { - base: center - size / 2, - head: center + size / 2, - center: center, - size: size - }; - }, - - draw: function() { - var me = this; - var chart = me.chart; - var scale = me._getValueScale(); - var rects = me.getMeta().data; - var dataset = me.getDataset(); - var ilen = rects.length; - var i = 0; - - helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); - - for (; i < ilen; ++i) { - var val = scale._parseValue(dataset.data[i]); - if (!isNaN(val.min) && !isNaN(val.max)) { - rects[i].draw(); - } - } - - helpers$1.canvas.unclipArea(chart.ctx); - }, - - /** - * @private - */ - _resolveDataElementOptions: function() { - var me = this; - var values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments)); - var indexOpts = me._getIndexScale().options; - var valueOpts = me._getValueScale().options; - - values.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage); - values.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness); - values.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage); - values.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness); - values.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength); - - return values; - } - -}); - -var valueOrDefault$4 = helpers$1.valueOrDefault; -var resolve$1 = helpers$1.options.resolve; - -core_defaults._set('bubble', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - type: 'linear', // bubble should probably use a linear scale by default - position: 'bottom', - id: 'x-axis-0' // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: 'linear', - position: 'left', - id: 'y-axis-0' - }] - }, - - tooltips: { - callbacks: { - title: function() { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function(item, data) { - var datasetLabel = data.datasets[item.datasetIndex].label || ''; - var dataPoint = data.datasets[item.datasetIndex].data[item.index]; - return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; - } - } - } -}); - -var controller_bubble = core_datasetController.extend({ - /** - * @protected - */ - dataElementType: elements.Point, - - /** - * @private - */ - _dataElementOptions: [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - 'hoverRadius', - 'hitRadius', - 'pointStyle', - 'rotation' - ], - - /** - * @protected - */ - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var points = meta.data; - - // Update Points - helpers$1.each(points, function(point, index) { - me.updateElement(point, index, reset); - }); - }, - - /** - * @protected - */ - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var xScale = me.getScaleForId(meta.xAxisID); - var yScale = me.getScaleForId(meta.yAxisID); - var options = me._resolveDataElementOptions(point, index); - var data = me.getDataset().data[index]; - var dsIndex = me.index; - - var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); - var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); - - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = dsIndex; - point._index = index; - point._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - hitRadius: options.hitRadius, - pointStyle: options.pointStyle, - rotation: options.rotation, - radius: reset ? 0 : options.radius, - skip: custom.skip || isNaN(x) || isNaN(y), - x: x, - y: y, - }; - - point.pivot(); - }, - - /** - * @protected - */ - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); - model.radius = options.radius + options.hoverRadius; - }, - - /** - * @private - */ - _resolveDataElementOptions: function(point, index) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var custom = point.custom || {}; - var data = dataset.data[index] || {}; - var values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments); - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - // In case values were cached (and thus frozen), we need to clone the values - if (me._cachedDataOpts === values) { - values = helpers$1.extend({}, values); - } - - // Custom radius resolution - values.radius = resolve$1([ - custom.radius, - data.r, - me._config.radius, - chart.options.elements.point.radius - ], context, index); - - return values; - } -}); - -var valueOrDefault$5 = helpers$1.valueOrDefault; - -var PI$1 = Math.PI; -var DOUBLE_PI$1 = PI$1 * 2; -var HALF_PI$1 = PI$1 / 2; - -core_defaults._set('doughnut', { - animation: { - // Boolean - Whether we animate the rotation of the Doughnut - animateRotate: true, - // Boolean - Whether we animate scaling the Doughnut from the centre - animateScale: false - }, - hover: { - mode: 'single' - }, - legendCallback: function(chart) { - var list = document.createElement('ul'); - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - var i, ilen, listItem, listItemSpan; - - list.setAttribute('class', chart.id + '-legend'); - if (datasets.length) { - for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) { - listItem = list.appendChild(document.createElement('li')); - listItemSpan = listItem.appendChild(document.createElement('span')); - listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i]; - if (labels[i]) { - listItem.appendChild(document.createTextNode(labels[i])); - } - } - } - - return list.outerHTML; - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var style = meta.controller.getStyle(i); - - return { - text: label, - fillStyle: style.backgroundColor, - strokeStyle: style.borderColor, - lineWidth: style.borderWidth, - hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - // toggle visibility of index if exists - if (meta.data[index]) { - meta.data[index].hidden = !meta.data[index].hidden; - } - } - - chart.update(); - } - }, - - // The percentage of the chart that we cut out of the middle. - cutoutPercentage: 50, - - // The rotation of the chart, where the first data arc begins. - rotation: -HALF_PI$1, - - // The total circumference of the chart. - circumference: DOUBLE_PI$1, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(tooltipItem, data) { - var dataLabel = data.labels[tooltipItem.index]; - var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - - if (helpers$1.isArray(dataLabel)) { - // show value on first line of multiline label - // need to clone because we are changing the value - dataLabel = dataLabel.slice(); - dataLabel[0] += value; - } else { - dataLabel += value; - } - - return dataLabel; - } - } - } -}); - -var controller_doughnut = core_datasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers$1.noop, - - /** - * @private - */ - _dataElementOptions: [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'borderAlign', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - ], - - // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly - getRingIndex: function(datasetIndex) { - var ringIndex = 0; - - for (var j = 0; j < datasetIndex; ++j) { - if (this.chart.isDatasetVisible(j)) { - ++ringIndex; - } - } - - return ringIndex; - }, - - update: function(reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var ratioX = 1; - var ratioY = 1; - var offsetX = 0; - var offsetY = 0; - var meta = me.getMeta(); - var arcs = meta.data; - var cutout = opts.cutoutPercentage / 100 || 0; - var circumference = opts.circumference; - var chartWeight = me._getRingWeight(me.index); - var maxWidth, maxHeight, i, ilen; - - // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc - if (circumference < DOUBLE_PI$1) { - var startAngle = opts.rotation % DOUBLE_PI$1; - startAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0; - var endAngle = startAngle + circumference; - var startX = Math.cos(startAngle); - var startY = Math.sin(startAngle); - var endX = Math.cos(endAngle); - var endY = Math.sin(endAngle); - var contains0 = (startAngle <= 0 && endAngle >= 0) || endAngle >= DOUBLE_PI$1; - var contains90 = (startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1) || endAngle >= DOUBLE_PI$1 + HALF_PI$1; - var contains180 = startAngle === -PI$1 || endAngle >= PI$1; - var contains270 = (startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1) || endAngle >= PI$1 + HALF_PI$1; - var minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout); - var minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout); - var maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout); - var maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout); - ratioX = (maxX - minX) / 2; - ratioY = (maxY - minY) / 2; - offsetX = -(maxX + minX) / 2; - offsetY = -(maxY + minY) / 2; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arcs[i]._options = me._resolveDataElementOptions(arcs[i], i); - } - - chart.borderWidth = me.getMaxBorderWidth(); - maxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX; - maxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY; - chart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); - chart.innerRadius = Math.max(chart.outerRadius * cutout, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); - chart.offsetX = offsetX * chart.outerRadius; - chart.offsetY = offsetY * chart.outerRadius; - - meta.total = me.calculateTotal(); - - me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); - me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - me.updateElement(arcs[i], i, reset); - } - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var animationOpts = opts.animation; - var centerX = (chartArea.left + chartArea.right) / 2; - var centerY = (chartArea.top + chartArea.bottom) / 2; - var startAngle = opts.rotation; // non reset case handled later - var endAngle = opts.rotation; // non reset case handled later - var dataset = me.getDataset(); - var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1); - var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; - var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; - var options = arc._options || {}; - - helpers$1.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - - // Desired view properties - _model: { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - borderAlign: options.borderAlign, - x: centerX + chart.offsetX, - y: centerY + chart.offsetY, - startAngle: startAngle, - endAngle: endAngle, - circumference: circumference, - outerRadius: outerRadius, - innerRadius: innerRadius, - label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) - } - }); - - var model = arc._model; - - // Set correct angles if not resetting - if (!reset || !animationOpts.animateRotate) { - if (index === 0) { - model.startAngle = opts.rotation; - } else { - model.startAngle = me.getMeta().data[index - 1]._model.endAngle; - } - - model.endAngle = model.startAngle + model.circumference; - } - - arc.pivot(); - }, - - calculateTotal: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var total = 0; - var value; - - helpers$1.each(meta.data, function(element, index) { - value = dataset.data[index]; - if (!isNaN(value) && !element.hidden) { - total += Math.abs(value); - } - }); - - /* if (total === 0) { - total = NaN; - }*/ - - return total; - }, - - calculateCircumference: function(value) { - var total = this.getMeta().total; - if (total > 0 && !isNaN(value)) { - return DOUBLE_PI$1 * (Math.abs(value) / total); - } - return 0; - }, - - // gets the max border or hover width to properly scale pie charts - getMaxBorderWidth: function(arcs) { - var me = this; - var max = 0; - var chart = me.chart; - var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; - - if (!arcs) { - // Find the outmost visible dataset - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - meta = chart.getDatasetMeta(i); - arcs = meta.data; - if (i !== me.index) { - controller = meta.controller; - } - break; - } - } - } - - if (!arcs) { - return 0; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arc = arcs[i]; - if (controller) { - controller._configure(); - options = controller._resolveDataElementOptions(arc, i); - } else { - options = arc._options; - } - if (options.borderAlign !== 'inner') { - borderWidth = options.borderWidth; - hoverWidth = options.hoverBorderWidth; - - max = borderWidth > max ? borderWidth : max; - max = hoverWidth > max ? hoverWidth : max; - } - } - return max; - }, - - /** - * @protected - */ - setHoverStyle: function(arc) { - var model = arc._model; - var options = arc._options; - var getHoverColor = helpers$1.getHoverColor; - - arc.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - }; - - model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); - }, - - /** - * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly - * @private - */ - _getRingWeightOffset: function(datasetIndex) { - var ringWeightOffset = 0; - - for (var i = 0; i < datasetIndex; ++i) { - if (this.chart.isDatasetVisible(i)) { - ringWeightOffset += this._getRingWeight(i); - } - } - - return ringWeightOffset; - }, - - /** - * @private - */ - _getRingWeight: function(dataSetIndex) { - return Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0); - }, - - /** - * Returns the sum of all visibile data set weights. This value can be 0. - * @private - */ - _getVisibleDatasetWeightTotal: function() { - return this._getRingWeightOffset(this.chart.data.datasets.length); - } -}); - -core_defaults._set('horizontalBar', { - hover: { - mode: 'index', - axis: 'y' - }, - - scales: { - xAxes: [{ - type: 'linear', - position: 'bottom' - }], - - yAxes: [{ - type: 'category', - position: 'left', - offset: true, - gridLines: { - offsetGridLines: true - } - }] - }, - - elements: { - rectangle: { - borderSkipped: 'left' - } - }, - - tooltips: { - mode: 'index', - axis: 'y' - } -}); - -core_defaults._set('global', { - datasets: { - horizontalBar: { - categoryPercentage: 0.8, - barPercentage: 0.9 - } - } -}); - -var controller_horizontalBar = controller_bar.extend({ - /** - * @private - */ - _getValueScaleId: function() { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.getMeta().yAxisID; - } -}); - -var valueOrDefault$6 = helpers$1.valueOrDefault; -var resolve$2 = helpers$1.options.resolve; -var isPointInArea = helpers$1.canvas._isPointInArea; - -core_defaults._set('line', { - showLines: true, - spanGaps: false, - - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - id: 'x-axis-0' - }], - yAxes: [{ - type: 'linear', - id: 'y-axis-0' - }] - } -}); - -function scaleClip(scale, halfBorderWidth) { - var tickOpts = scale && scale.options.ticks || {}; - var reverse = tickOpts.reverse; - var min = tickOpts.min === undefined ? halfBorderWidth : 0; - var max = tickOpts.max === undefined ? halfBorderWidth : 0; - return { - start: reverse ? max : min, - end: reverse ? min : max - }; -} - -function defaultClip(xScale, yScale, borderWidth) { - var halfBorderWidth = borderWidth / 2; - var x = scaleClip(xScale, halfBorderWidth); - var y = scaleClip(yScale, halfBorderWidth); - - return { - top: y.end, - right: x.end, - bottom: y.start, - left: x.start - }; -} - -function toClip(value) { - var t, r, b, l; - - if (helpers$1.isObject(value)) { - t = value.top; - r = value.right; - b = value.bottom; - l = value.left; - } else { - t = r = b = l = value; - } - - return { - top: t, - right: r, - bottom: b, - left: l - }; -} - - -var controller_line = core_datasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - /** - * @private - */ - _datasetElementOptions: [ - 'backgroundColor', - 'borderCapStyle', - 'borderColor', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'borderWidth', - 'cubicInterpolationMode', - 'fill' - ], - - /** - * @private - */ - _dataElementOptions: { - backgroundColor: 'pointBackgroundColor', - borderColor: 'pointBorderColor', - borderWidth: 'pointBorderWidth', - hitRadius: 'pointHitRadius', - hoverBackgroundColor: 'pointHoverBackgroundColor', - hoverBorderColor: 'pointHoverBorderColor', - hoverBorderWidth: 'pointHoverBorderWidth', - hoverRadius: 'pointHoverRadius', - pointStyle: 'pointStyle', - radius: 'pointRadius', - rotation: 'pointRotation' - }, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var options = me.chart.options; - var config = me._config; - var showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines); - var i, ilen; - - me._xScale = me.getScaleForId(meta.xAxisID); - me._yScale = me.getScaleForId(meta.yAxisID); - - // Update Line - if (showLine) { - // Compatibility: If the properties are defined with only the old name, use those values - if (config.tension !== undefined && config.lineTension === undefined) { - config.lineTension = config.tension; - } - - // Utility - line._scale = me._yScale; - line._datasetIndex = me.index; - // Data - line._children = points; - // Model - line._model = me._resolveDatasetElementOptions(line); - - line.pivot(); - } - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - if (showLine && line._model.tension !== 0) { - me.updateBezierControlPoints(); - } - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var dataset = me.getDataset(); - var datasetIndex = me.index; - var value = dataset.data[index]; - var xScale = me._xScale; - var yScale = me._yScale; - var lineModel = meta.dataset._model; - var x, y; - - var options = me._resolveDataElementOptions(point, index); - - x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); - y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); - - // Utility - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = datasetIndex; - point._index = index; - - // Desired view properties - point._model = { - x: x, - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: options.radius, - pointStyle: options.pointStyle, - rotation: options.rotation, - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), - steppedLine: lineModel ? lineModel.steppedLine : false, - // Tooltip - hitRadius: options.hitRadius - }; - }, - - /** - * @private - */ - _resolveDatasetElementOptions: function(element) { - var me = this; - var config = me._config; - var custom = element.custom || {}; - var options = me.chart.options; - var lineOptions = options.elements.line; - var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments); - - // The default behavior of lines is to break at null values, according - // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 - // This option gives lines the ability to span gaps - values.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps); - values.tension = valueOrDefault$6(config.lineTension, lineOptions.tension); - values.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]); - values.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth))); - - return values; - }, - - calculatePointY: function(value, index, datasetIndex) { - var me = this; - var chart = me.chart; - var yScale = me._yScale; - var sumPos = 0; - var sumNeg = 0; - var i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen; - - if (yScale.options.stacked) { - rightValue = +yScale.getRightValue(value); - metasets = chart._getSortedVisibleDatasetMetas(); - ilen = metasets.length; - - for (i = 0; i < ilen; ++i) { - dsMeta = metasets[i]; - if (dsMeta.index === datasetIndex) { - break; - } - - ds = chart.data.datasets[dsMeta.index]; - if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) { - stackedRightValue = +yScale.getRightValue(ds.data[index]); - if (stackedRightValue < 0) { - sumNeg += stackedRightValue || 0; - } else { - sumPos += stackedRightValue || 0; - } - } - } - - if (rightValue < 0) { - return yScale.getPixelForValue(sumNeg + rightValue); - } - return yScale.getPixelForValue(sumPos + rightValue); - } - return yScale.getPixelForValue(value); - }, - - updateBezierControlPoints: function() { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var lineModel = meta.dataset._model; - var area = chart.chartArea; - var points = meta.data || []; - var i, ilen, model, controlPoints; - - // Only consider points that are drawn in case the spanGaps option is used - if (lineModel.spanGaps) { - points = points.filter(function(pt) { - return !pt._model.skip; - }); - } - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - if (lineModel.cubicInterpolationMode === 'monotone') { - helpers$1.splineCurveMonotone(points); - } else { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - controlPoints = helpers$1.splineCurve( - helpers$1.previousItem(points, i)._model, - model, - helpers$1.nextItem(points, i)._model, - lineModel.tension - ); - model.controlPointPreviousX = controlPoints.previous.x; - model.controlPointPreviousY = controlPoints.previous.y; - model.controlPointNextX = controlPoints.next.x; - model.controlPointNextY = controlPoints.next.y; - } - } - - if (chart.options.elements.line.capBezierPoints) { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - if (isPointInArea(model, area)) { - if (i > 0 && isPointInArea(points[i - 1]._model, area)) { - model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); - model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); - } - if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { - model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); - model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); - } - } - } - } - }, - - draw: function() { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var points = meta.data || []; - var area = chart.chartArea; - var canvas = chart.canvas; - var i = 0; - var ilen = points.length; - var clip; - - if (me._showLine) { - clip = meta.dataset._model.clip; - - helpers$1.canvas.clipArea(chart.ctx, { - left: clip.left === false ? 0 : area.left - clip.left, - right: clip.right === false ? canvas.width : area.right + clip.right, - top: clip.top === false ? 0 : area.top - clip.top, - bottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom - }); - - meta.dataset.draw(); - - helpers$1.canvas.unclipArea(chart.ctx); - } - - // Draw the points - for (; i < ilen; ++i) { - points[i].draw(area); - } - }, - - /** - * @protected - */ - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); - model.radius = valueOrDefault$6(options.hoverRadius, options.radius); - }, -}); - -var resolve$3 = helpers$1.options.resolve; - -core_defaults._set('polarArea', { - scale: { - type: 'radialLinear', - angleLines: { - display: false - }, - gridLines: { - circular: true - }, - pointLabels: { - display: false - }, - ticks: { - beginAtZero: true - } - }, - - // Boolean - Whether to animate the rotation of the chart - animation: { - animateRotate: true, - animateScale: true - }, - - startAngle: -0.5 * Math.PI, - legendCallback: function(chart) { - var list = document.createElement('ul'); - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - var i, ilen, listItem, listItemSpan; - - list.setAttribute('class', chart.id + '-legend'); - if (datasets.length) { - for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) { - listItem = list.appendChild(document.createElement('li')); - listItemSpan = listItem.appendChild(document.createElement('span')); - listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i]; - if (labels[i]) { - listItem.appendChild(document.createTextNode(labels[i])); - } - } - } - - return list.outerHTML; - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var style = meta.controller.getStyle(i); - - return { - text: label, - fillStyle: style.backgroundColor, - strokeStyle: style.borderColor, - lineWidth: style.borderWidth, - hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - meta.data[index].hidden = !meta.data[index].hidden; - } - - chart.update(); - } - }, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(item, data) { - return data.labels[item.index] + ': ' + item.yLabel; - } - } - } -}); - -var controller_polarArea = core_datasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers$1.noop, - - /** - * @private - */ - _dataElementOptions: [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'borderAlign', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - ], - - /** - * @private - */ - _getIndexScaleId: function() { - return this.chart.scale.id; - }, - - /** - * @private - */ - _getValueScaleId: function() { - return this.chart.scale.id; - }, - - update: function(reset) { - var me = this; - var dataset = me.getDataset(); - var meta = me.getMeta(); - var start = me.chart.options.startAngle || 0; - var starts = me._starts = []; - var angles = me._angles = []; - var arcs = meta.data; - var i, ilen, angle; - - me._updateRadius(); - - meta.count = me.countVisibleElements(); - - for (i = 0, ilen = dataset.data.length; i < ilen; i++) { - starts[i] = start; - angle = me._computeAngle(i); - angles[i] = angle; - start += angle; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arcs[i]._options = me._resolveDataElementOptions(arcs[i], i); - me.updateElement(arcs[i], i, reset); - } - }, - - /** - * @private - */ - _updateRadius: function() { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); - - chart.outerRadius = Math.max(minSize / 2, 0); - chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); - - me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); - me.innerRadius = me.outerRadius - chart.radiusLength; - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var opts = chart.options; - var animationOpts = opts.animation; - var scale = chart.scale; - var labels = chart.data.labels; - - var centerX = scale.xCenter; - var centerY = scale.yCenter; - - // var negHalfPI = -0.5 * Math.PI; - var datasetStartAngle = opts.startAngle; - var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var startAngle = me._starts[index]; - var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); - - var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var options = arc._options || {}; - - helpers$1.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - _scale: scale, - - // Desired view properties - _model: { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - borderAlign: options.borderAlign, - x: centerX, - y: centerY, - innerRadius: 0, - outerRadius: reset ? resetRadius : distance, - startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, - endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, - label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) - } - }); - - arc.pivot(); - }, - - countVisibleElements: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var count = 0; - - helpers$1.each(meta.data, function(element, index) { - if (!isNaN(dataset.data[index]) && !element.hidden) { - count++; - } - }); - - return count; - }, - - /** - * @protected - */ - setHoverStyle: function(arc) { - var model = arc._model; - var options = arc._options; - var getHoverColor = helpers$1.getHoverColor; - var valueOrDefault = helpers$1.valueOrDefault; - - arc.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - }; - - model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); - }, - - /** - * @private - */ - _computeAngle: function(index) { - var me = this; - var count = this.getMeta().count; - var dataset = me.getDataset(); - var meta = me.getMeta(); - - if (isNaN(dataset.data[index]) || meta.data[index].hidden) { - return 0; - } - - // Scriptable options - var context = { - chart: me.chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - return resolve$3([ - me.chart.options.elements.arc.angle, - (2 * Math.PI) / count - ], context, index); - } -}); - -core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); -core_defaults._set('pie', { - cutoutPercentage: 0 -}); - -// Pie charts are Doughnut chart with different defaults -var controller_pie = controller_doughnut; - -var valueOrDefault$7 = helpers$1.valueOrDefault; - -core_defaults._set('radar', { - spanGaps: false, - scale: { - type: 'radialLinear' - }, - elements: { - line: { - fill: 'start', - tension: 0 // no bezier in radar - } - } -}); - -var controller_radar = core_datasetController.extend({ - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - linkScales: helpers$1.noop, - - /** - * @private - */ - _datasetElementOptions: [ - 'backgroundColor', - 'borderWidth', - 'borderColor', - 'borderCapStyle', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'fill' - ], - - /** - * @private - */ - _dataElementOptions: { - backgroundColor: 'pointBackgroundColor', - borderColor: 'pointBorderColor', - borderWidth: 'pointBorderWidth', - hitRadius: 'pointHitRadius', - hoverBackgroundColor: 'pointHoverBackgroundColor', - hoverBorderColor: 'pointHoverBorderColor', - hoverBorderWidth: 'pointHoverBorderWidth', - hoverRadius: 'pointHoverRadius', - pointStyle: 'pointStyle', - radius: 'pointRadius', - rotation: 'pointRotation' - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.chart.scale.id; - }, - - /** - * @private - */ - _getValueScaleId: function() { - return this.chart.scale.id; - }, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var scale = me.chart.scale; - var config = me._config; - var i, ilen; - - // Compatibility: If the properties are defined with only the old name, use those values - if (config.tension !== undefined && config.lineTension === undefined) { - config.lineTension = config.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - line._loop = true; - // Model - line._model = me._resolveDatasetElementOptions(line); - - line.pivot(); - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - // Update bezier control points - me.updateBezierControlPoints(); - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - updateElement: function(point, index, reset) { - var me = this; - var custom = point.custom || {}; - var dataset = me.getDataset(); - var scale = me.chart.scale; - var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); - var options = me._resolveDataElementOptions(point, index); - var lineModel = me.getMeta().dataset._model; - var x = reset ? scale.xCenter : pointPosition.x; - var y = reset ? scale.yCenter : pointPosition.y; - - // Utility - point._scale = scale; - point._options = options; - point._datasetIndex = me.index; - point._index = index; - - // Desired view properties - point._model = { - x: x, // value not used in dataset scale, but we want a consistent API between scales - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: options.radius, - pointStyle: options.pointStyle, - rotation: options.rotation, - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - tension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0), - - // Tooltip - hitRadius: options.hitRadius - }; - }, - - /** - * @private - */ - _resolveDatasetElementOptions: function() { - var me = this; - var config = me._config; - var options = me.chart.options; - var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments); - - values.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps); - values.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension); - - return values; - }, - - updateBezierControlPoints: function() { - var me = this; - var meta = me.getMeta(); - var area = me.chart.chartArea; - var points = meta.data || []; - var i, ilen, model, controlPoints; - - // Only consider points that are drawn in case the spanGaps option is used - if (meta.dataset._model.spanGaps) { - points = points.filter(function(pt) { - return !pt._model.skip; - }); - } - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - controlPoints = helpers$1.splineCurve( - helpers$1.previousItem(points, i, true)._model, - model, - helpers$1.nextItem(points, i, true)._model, - model.tension - ); - - // Prevent the bezier going outside of the bounds of the graph - model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); - model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); - model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); - model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); - } - }, - - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth); - model.radius = valueOrDefault$7(options.hoverRadius, options.radius); - } -}); - -core_defaults._set('scatter', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - id: 'x-axis-1', // need an ID so datasets can reference the scale - type: 'linear', // scatter should not use a category axis - position: 'bottom' - }], - yAxes: [{ - id: 'y-axis-1', - type: 'linear', - position: 'left' - }] - }, - - tooltips: { - callbacks: { - title: function() { - return ''; // doesn't make sense for scatter since data are formatted as a point - }, - label: function(item) { - return '(' + item.xLabel + ', ' + item.yLabel + ')'; - } - } - } -}); - -core_defaults._set('global', { - datasets: { - scatter: { - showLine: false - } - } -}); - -// Scatter charts use line controllers -var controller_scatter = controller_line; - -// NOTE export a map in which the key represents the controller type, not -// the class, and so must be CamelCase in order to be correctly retrieved -// by the controller in core.controller.js (`controllers[meta.type]`). - -var controllers = { - bar: controller_bar, - bubble: controller_bubble, - doughnut: controller_doughnut, - horizontalBar: controller_horizontalBar, - line: controller_line, - polarArea: controller_polarArea, - pie: controller_pie, - radar: controller_radar, - scatter: controller_scatter -}; - -/** - * Helper function to get relative position for an event - * @param {Event|IEvent} event - The event to get the position for - * @param {Chart} chart - The chart - * @returns {object} the event position - */ -function getRelativePosition(e, chart) { - if (e.native) { - return { - x: e.x, - y: e.y - }; - } - - return helpers$1.getRelativePosition(e, chart); -} - -/** - * Helper function to traverse all of the visible elements in the chart - * @param {Chart} chart - the chart - * @param {function} handler - the callback to execute for each visible item - */ -function parseVisibleItems(chart, handler) { - var metasets = chart._getSortedVisibleDatasetMetas(); - var metadata, i, j, ilen, jlen, element; - - for (i = 0, ilen = metasets.length; i < ilen; ++i) { - metadata = metasets[i].data; - for (j = 0, jlen = metadata.length; j < jlen; ++j) { - element = metadata[j]; - if (!element._view.skip) { - handler(element); - } - } - } -} - -/** - * Helper function to get the items that intersect the event position - * @param {ChartElement[]} items - elements to filter - * @param {object} position - the point to be nearest to - * @return {ChartElement[]} the nearest items - */ -function getIntersectItems(chart, position) { - var elements = []; - - parseVisibleItems(chart, function(element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - } - }); - - return elements; -} - -/** - * Helper function to get the items nearest to the event position considering all visible items in teh chart - * @param {Chart} chart - the chart to look at elements from - * @param {object} position - the point to be nearest to - * @param {boolean} intersect - if true, only consider items that intersect the position - * @param {function} distanceMetric - function to provide the distance between points - * @return {ChartElement[]} the nearest items - */ -function getNearestItems(chart, position, intersect, distanceMetric) { - var minDistance = Number.POSITIVE_INFINITY; - var nearestItems = []; - - parseVisibleItems(chart, function(element) { - if (intersect && !element.inRange(position.x, position.y)) { - return; - } - - var center = element.getCenterPoint(); - var distance = distanceMetric(position, center); - if (distance < minDistance) { - nearestItems = [element]; - minDistance = distance; - } else if (distance === minDistance) { - // Can have multiple items at the same distance in which case we sort by size - nearestItems.push(element); - } - }); - - return nearestItems; -} - -/** - * Get a distance metric function for two points based on the - * axis mode setting - * @param {string} axis - the axis mode. x|y|xy - */ -function getDistanceMetricForAxis(axis) { - var useX = axis.indexOf('x') !== -1; - var useY = axis.indexOf('y') !== -1; - - return function(pt1, pt2) { - var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; - var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; - return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); - }; -} - -function indexMode(chart, e, options) { - var position = getRelativePosition(e, chart); - // Default axis for index mode is 'x' to match old behaviour - options.axis = options.axis || 'x'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - var elements = []; - - if (!items.length) { - return []; - } - - chart._getSortedVisibleDatasetMetas().forEach(function(meta) { - var element = meta.data[items[0]._index]; - - // don't count items that are skipped (null data) - if (element && !element._view.skip) { - elements.push(element); - } - }); - - return elements; -} - -/** - * @interface IInteractionOptions - */ -/** - * If true, only consider items that intersect the point - * @name IInterfaceOptions#boolean - * @type Boolean - */ - -/** - * Contains interaction related functions - * @namespace Chart.Interaction - */ -var core_interaction = { - // Helper function for different modes - modes: { - single: function(chart, e) { - var position = getRelativePosition(e, chart); - var elements = []; - - parseVisibleItems(chart, function(element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - return elements; - } - }); - - return elements.slice(0, 1); - }, - - /** - * @function Chart.Interaction.modes.label - * @deprecated since version 2.4.0 - * @todo remove at version 3 - * @private - */ - label: indexMode, - - /** - * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item - * @function Chart.Interaction.modes.index - * @since v2.4.0 - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - index: indexMode, - - /** - * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect is false, we find the nearest item and return the items in that dataset - * @function Chart.Interaction.modes.dataset - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - dataset: function(chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - - if (items.length > 0) { - items = chart.getDatasetMeta(items[0]._datasetIndex).data; - } - - return items; - }, - - /** - * @function Chart.Interaction.modes.x-axis - * @deprecated since version 2.4.0. Use index mode and intersect == true - * @todo remove at version 3 - * @private - */ - 'x-axis': function(chart, e) { - return indexMode(chart, e, {intersect: false}); - }, - - /** - * Point mode returns all elements that hit test based on the event position - * of the event - * @function Chart.Interaction.modes.intersect - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - point: function(chart, e) { - var position = getRelativePosition(e, chart); - return getIntersectItems(chart, position); - }, - - /** - * nearest mode returns the element closest to the point - * @function Chart.Interaction.modes.intersect - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - nearest: function(chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - return getNearestItems(chart, position, options.intersect, distanceMetric); - }, - - /** - * x mode returns the elements that hit-test at the current x coordinate - * @function Chart.Interaction.modes.x - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - x: function(chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function(element) { - if (element.inXRange(position.x)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - }, - - /** - * y mode returns the elements that hit-test at the current y coordinate - * @function Chart.Interaction.modes.y - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - y: function(chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function(element) { - if (element.inYRange(position.y)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - } - } -}; - -var extend = helpers$1.extend; - -function filterByPosition(array, position) { - return helpers$1.where(array, function(v) { - return v.pos === position; - }); -} - -function sortByWeight(array, reverse) { - return array.sort(function(a, b) { - var v0 = reverse ? b : a; - var v1 = reverse ? a : b; - return v0.weight === v1.weight ? - v0.index - v1.index : - v0.weight - v1.weight; - }); -} - -function wrapBoxes(boxes) { - var layoutBoxes = []; - var i, ilen, box; - - for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) { - box = boxes[i]; - layoutBoxes.push({ - index: i, - box: box, - pos: box.position, - horizontal: box.isHorizontal(), - weight: box.weight - }); - } - return layoutBoxes; -} - -function setLayoutDims(layouts, params) { - var i, ilen, layout; - for (i = 0, ilen = layouts.length; i < ilen; ++i) { - layout = layouts[i]; - // store width used instead of chartArea.w in fitBoxes - layout.width = layout.horizontal - ? layout.box.fullWidth && params.availableWidth - : params.vBoxMaxWidth; - // store height used instead of chartArea.h in fitBoxes - layout.height = layout.horizontal && params.hBoxMaxHeight; - } -} - -function buildLayoutBoxes(boxes) { - var layoutBoxes = wrapBoxes(boxes); - var left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true); - var right = sortByWeight(filterByPosition(layoutBoxes, 'right')); - var top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true); - var bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom')); - - return { - leftAndTop: left.concat(top), - rightAndBottom: right.concat(bottom), - chartArea: filterByPosition(layoutBoxes, 'chartArea'), - vertical: left.concat(right), - horizontal: top.concat(bottom) - }; -} - -function getCombinedMax(maxPadding, chartArea, a, b) { - return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]); -} - -function updateDims(chartArea, params, layout) { - var box = layout.box; - var maxPadding = chartArea.maxPadding; - var newWidth, newHeight; - - if (layout.size) { - // this layout was already counted for, lets first reduce old size - chartArea[layout.pos] -= layout.size; - } - layout.size = layout.horizontal ? box.height : box.width; - chartArea[layout.pos] += layout.size; - - if (box.getPadding) { - var boxPadding = box.getPadding(); - maxPadding.top = Math.max(maxPadding.top, boxPadding.top); - maxPadding.left = Math.max(maxPadding.left, boxPadding.left); - maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom); - maxPadding.right = Math.max(maxPadding.right, boxPadding.right); - } - - newWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'); - newHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'); - - if (newWidth !== chartArea.w || newHeight !== chartArea.h) { - chartArea.w = newWidth; - chartArea.h = newHeight; - - // return true if chart area changed in layout's direction - var sizes = layout.horizontal ? [newWidth, chartArea.w] : [newHeight, chartArea.h]; - return sizes[0] !== sizes[1] && (!isNaN(sizes[0]) || !isNaN(sizes[1])); - } -} - -function handleMaxPadding(chartArea) { - var maxPadding = chartArea.maxPadding; - - function updatePos(pos) { - var change = Math.max(maxPadding[pos] - chartArea[pos], 0); - chartArea[pos] += change; - return change; - } - chartArea.y += updatePos('top'); - chartArea.x += updatePos('left'); - updatePos('right'); - updatePos('bottom'); -} - -function getMargins(horizontal, chartArea) { - var maxPadding = chartArea.maxPadding; - - function marginForPositions(positions) { - var margin = {left: 0, top: 0, right: 0, bottom: 0}; - positions.forEach(function(pos) { - margin[pos] = Math.max(chartArea[pos], maxPadding[pos]); - }); - return margin; - } - - return horizontal - ? marginForPositions(['left', 'right']) - : marginForPositions(['top', 'bottom']); -} - -function fitBoxes(boxes, chartArea, params) { - var refitBoxes = []; - var i, ilen, layout, box, refit, changed; - - for (i = 0, ilen = boxes.length; i < ilen; ++i) { - layout = boxes[i]; - box = layout.box; - - box.update( - layout.width || chartArea.w, - layout.height || chartArea.h, - getMargins(layout.horizontal, chartArea) - ); - if (updateDims(chartArea, params, layout)) { - changed = true; - if (refitBoxes.length) { - // Dimensions changed and there were non full width boxes before this - // -> we have to refit those - refit = true; - } - } - if (!box.fullWidth) { // fullWidth boxes don't need to be re-fitted in any case - refitBoxes.push(layout); - } - } - - return refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed; -} - -function placeBoxes(boxes, chartArea, params) { - var userPadding = params.padding; - var x = chartArea.x; - var y = chartArea.y; - var i, ilen, layout, box; - - for (i = 0, ilen = boxes.length; i < ilen; ++i) { - layout = boxes[i]; - box = layout.box; - if (layout.horizontal) { - box.left = box.fullWidth ? userPadding.left : chartArea.left; - box.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w; - box.top = y; - box.bottom = y + box.height; - box.width = box.right - box.left; - y = box.bottom; - } else { - box.left = x; - box.right = x + box.width; - box.top = chartArea.top; - box.bottom = chartArea.top + chartArea.h; - box.height = box.bottom - box.top; - x = box.right; - } - } - - chartArea.x = x; - chartArea.y = y; -} - -core_defaults._set('global', { - layout: { - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - } - } -}); - -/** - * @interface ILayoutItem - * @prop {string} position - The position of the item in the chart layout. Possible values are - * 'left', 'top', 'right', 'bottom', and 'chartArea' - * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area - * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down - * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) - * @prop {function} update - Takes two parameters: width and height. Returns size of item - * @prop {function} getPadding - Returns an object with padding on the edges - * @prop {number} width - Width of item. Must be valid after update() - * @prop {number} height - Height of item. Must be valid after update() - * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update - * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update - * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update - * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update - */ - -// The layout service is very self explanatory. It's responsible for the layout within a chart. -// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need -// It is this service's responsibility of carrying out that layout. -var core_layouts = { - defaults: {}, - - /** - * Register a box to a chart. - * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. - * @param {Chart} chart - the chart to use - * @param {ILayoutItem} item - the item to add to be layed out - */ - addBox: function(chart, item) { - if (!chart.boxes) { - chart.boxes = []; - } - - // initialize item with default values - item.fullWidth = item.fullWidth || false; - item.position = item.position || 'top'; - item.weight = item.weight || 0; - item._layers = item._layers || function() { - return [{ - z: 0, - draw: function() { - item.draw.apply(item, arguments); - } - }]; - }; - - chart.boxes.push(item); - }, - - /** - * Remove a layoutItem from a chart - * @param {Chart} chart - the chart to remove the box from - * @param {ILayoutItem} layoutItem - the item to remove from the layout - */ - removeBox: function(chart, layoutItem) { - var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; - if (index !== -1) { - chart.boxes.splice(index, 1); - } - }, - - /** - * Sets (or updates) options on the given `item`. - * @param {Chart} chart - the chart in which the item lives (or will be added to) - * @param {ILayoutItem} item - the item to configure with the given options - * @param {object} options - the new item options. - */ - configure: function(chart, item, options) { - var props = ['fullWidth', 'position', 'weight']; - var ilen = props.length; - var i = 0; - var prop; - - for (; i < ilen; ++i) { - prop = props[i]; - if (options.hasOwnProperty(prop)) { - item[prop] = options[prop]; - } - } - }, - - /** - * Fits boxes of the given chart into the given size by having each box measure itself - * then running a fitting algorithm - * @param {Chart} chart - the chart - * @param {number} width - the width to fit into - * @param {number} height - the height to fit into - */ - update: function(chart, width, height) { - if (!chart) { - return; - } - - var layoutOptions = chart.options.layout || {}; - var padding = helpers$1.options.toPadding(layoutOptions.padding); - - var availableWidth = width - padding.width; - var availableHeight = height - padding.height; - var boxes = buildLayoutBoxes(chart.boxes); - var verticalBoxes = boxes.vertical; - var horizontalBoxes = boxes.horizontal; - - // Essentially we now have any number of boxes on each of the 4 sides. - // Our canvas looks like the following. - // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and - // B1 is the bottom axis - // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays - // These locations are single-box locations only, when trying to register a chartArea location that is already taken, - // an error will be thrown. - // - // |----------------------------------------------------| - // | T1 (Full Width) | - // |----------------------------------------------------| - // | | | T2 | | - // | |----|-------------------------------------|----| - // | | | C1 | | C2 | | - // | | |----| |----| | - // | | | | | - // | L1 | L2 | ChartArea (C0) | R1 | - // | | | | | - // | | |----| |----| | - // | | | C3 | | C4 | | - // | |----|-------------------------------------|----| - // | | | B1 | | - // |----------------------------------------------------| - // | B2 (Full Width) | - // |----------------------------------------------------| - // - - var params = Object.freeze({ - outerWidth: width, - outerHeight: height, - padding: padding, - availableWidth: availableWidth, - vBoxMaxWidth: availableWidth / 2 / verticalBoxes.length, - hBoxMaxHeight: availableHeight / 2 - }); - var chartArea = extend({ - maxPadding: extend({}, padding), - w: availableWidth, - h: availableHeight, - x: padding.left, - y: padding.top - }, padding); - - setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); - - // First fit vertical boxes - fitBoxes(verticalBoxes, chartArea, params); - - // Then fit horizontal boxes - if (fitBoxes(horizontalBoxes, chartArea, params)) { - // if the area changed, re-fit vertical boxes - fitBoxes(verticalBoxes, chartArea, params); - } - - handleMaxPadding(chartArea); - - // Finally place the boxes to correct coordinates - placeBoxes(boxes.leftAndTop, chartArea, params); - - // Move to opposite side of chart - chartArea.x += chartArea.w; - chartArea.y += chartArea.h; - - placeBoxes(boxes.rightAndBottom, chartArea, params); - - chart.chartArea = { - left: chartArea.left, - top: chartArea.top, - right: chartArea.left + chartArea.w, - bottom: chartArea.top + chartArea.h - }; - - // Finally update boxes in chartArea (radial scale for example) - helpers$1.each(boxes.chartArea, function(layout) { - var box = layout.box; - extend(box, chart.chartArea); - box.update(chartArea.w, chartArea.h); - }); - } -}; - -/** - * Platform fallback implementation (minimal). - * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 - */ - -var platform_basic = { - acquireContext: function(item) { - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - return item && item.getContext('2d') || null; - } -}; - -var platform_dom = "/*\r\n * DOM element rendering detection\r\n * https://davidwalsh.name/detect-node-insertion\r\n */\r\n@keyframes chartjs-render-animation {\r\n\tfrom { opacity: 0.99; }\r\n\tto { opacity: 1; }\r\n}\r\n\r\n.chartjs-render-monitor {\r\n\tanimation: chartjs-render-animation 0.001s;\r\n}\r\n\r\n/*\r\n * DOM element resizing detection\r\n * https://github.com/marcj/css-element-queries\r\n */\r\n.chartjs-size-monitor,\r\n.chartjs-size-monitor-expand,\r\n.chartjs-size-monitor-shrink {\r\n\tposition: absolute;\r\n\tdirection: ltr;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\tvisibility: hidden;\r\n\tz-index: -1;\r\n}\r\n\r\n.chartjs-size-monitor-expand > div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n"; - -var platform_dom$1 = /*#__PURE__*/Object.freeze({ -__proto__: null, -'default': platform_dom -}); - -var stylesheet = getCjsExportFromNamespace(platform_dom$1); - -var EXPANDO_KEY = '$chartjs'; -var CSS_PREFIX = 'chartjs-'; -var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; -var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; -var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; -var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; - -/** - * DOM event types -> Chart.js event types. - * Note: only events with different types are mapped. - * @see https://developer.mozilla.org/en-US/docs/Web/Events - */ -var EVENT_TYPES = { - touchstart: 'mousedown', - touchmove: 'mousemove', - touchend: 'mouseup', - pointerenter: 'mouseenter', - pointerdown: 'mousedown', - pointermove: 'mousemove', - pointerup: 'mouseup', - pointerleave: 'mouseout', - pointerout: 'mouseout' -}; - -/** - * The "used" size is the final value of a dimension property after all calculations have - * been performed. This method uses the computed style of `element` but returns undefined - * if the computed style is not expressed in pixels. That can happen in some cases where - * `element` has a size relative to its parent and this last one is not yet displayed, - * for example because of `display: none` on a parent node. - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value - * @returns {number} Size in pixels or undefined if unknown. - */ -function readUsedSize(element, property) { - var value = helpers$1.getStyle(element, property); - var matches = value && value.match(/^(\d+)(\.\d+)?px$/); - return matches ? Number(matches[1]) : undefined; -} - -/** - * Initializes the canvas style and render size without modifying the canvas display size, - * since responsiveness is handled by the controller.resize() method. The config is used - * to determine the aspect ratio to apply in case no explicit height has been specified. - */ -function initCanvas(canvas, config) { - var style = canvas.style; - - // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it - // returns null or '' if no explicit value has been set to the canvas attribute. - var renderHeight = canvas.getAttribute('height'); - var renderWidth = canvas.getAttribute('width'); - - // Chart.js modifies some canvas values that we want to restore on destroy - canvas[EXPANDO_KEY] = { - initial: { - height: renderHeight, - width: renderWidth, - style: { - display: style.display, - height: style.height, - width: style.width - } - } - }; - - // Force canvas to display as block to avoid extra space caused by inline - // elements, which would interfere with the responsive resize process. - // https://github.com/chartjs/Chart.js/issues/2538 - style.display = style.display || 'block'; - - if (renderWidth === null || renderWidth === '') { - var displayWidth = readUsedSize(canvas, 'width'); - if (displayWidth !== undefined) { - canvas.width = displayWidth; - } - } - - if (renderHeight === null || renderHeight === '') { - if (canvas.style.height === '') { - // If no explicit render height and style height, let's apply the aspect ratio, - // which one can be specified by the user but also by charts as default option - // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. - canvas.height = canvas.width / (config.options.aspectRatio || 2); - } else { - var displayHeight = readUsedSize(canvas, 'height'); - if (displayWidth !== undefined) { - canvas.height = displayHeight; - } - } - } - - return canvas; -} - -/** - * Detects support for options object argument in addEventListener. - * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support - * @private - */ -var supportsEventListenerOptions = (function() { - var supports = false; - try { - var options = Object.defineProperty({}, 'passive', { - // eslint-disable-next-line getter-return - get: function() { - supports = true; - } - }); - window.addEventListener('e', null, options); - } catch (e) { - // continue regardless of error - } - return supports; -}()); - -// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. -// https://github.com/chartjs/Chart.js/issues/4287 -var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; - -function addListener(node, type, listener) { - node.addEventListener(type, listener, eventListenerOptions); -} - -function removeListener(node, type, listener) { - node.removeEventListener(type, listener, eventListenerOptions); -} - -function createEvent(type, chart, x, y, nativeEvent) { - return { - type: type, - chart: chart, - native: nativeEvent || null, - x: x !== undefined ? x : null, - y: y !== undefined ? y : null, - }; -} - -function fromNativeEvent(event, chart) { - var type = EVENT_TYPES[event.type] || event.type; - var pos = helpers$1.getRelativePosition(event, chart); - return createEvent(type, chart, pos.x, pos.y, event); -} - -function throttled(fn, thisArg) { - var ticking = false; - var args = []; - - return function() { - args = Array.prototype.slice.call(arguments); - thisArg = thisArg || this; - - if (!ticking) { - ticking = true; - helpers$1.requestAnimFrame.call(window, function() { - ticking = false; - fn.apply(thisArg, args); - }); - } - }; -} - -function createDiv(cls) { - var el = document.createElement('div'); - el.className = cls || ''; - return el; -} - -// Implementation based on https://github.com/marcj/css-element-queries -function createResizer(handler) { - var maxSize = 1000000; - - // NOTE(SB) Don't use innerHTML because it could be considered unsafe. - // https://github.com/chartjs/Chart.js/issues/5902 - var resizer = createDiv(CSS_SIZE_MONITOR); - var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); - var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); - - expand.appendChild(createDiv()); - shrink.appendChild(createDiv()); - - resizer.appendChild(expand); - resizer.appendChild(shrink); - resizer._reset = function() { - expand.scrollLeft = maxSize; - expand.scrollTop = maxSize; - shrink.scrollLeft = maxSize; - shrink.scrollTop = maxSize; - }; - - var onScroll = function() { - resizer._reset(); - handler(); - }; - - addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); - addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); - - return resizer; -} - -// https://davidwalsh.name/detect-node-insertion -function watchForRender(node, handler) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - var proxy = expando.renderProxy = function(e) { - if (e.animationName === CSS_RENDER_ANIMATION) { - handler(); - } - }; - - helpers$1.each(ANIMATION_START_EVENTS, function(type) { - addListener(node, type, proxy); - }); - - // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class - // is removed then added back immediately (same animation frame?). Accessing the - // `offsetParent` property will force a reflow and re-evaluate the CSS animation. - // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics - // https://github.com/chartjs/Chart.js/issues/4737 - expando.reflow = !!node.offsetParent; - - node.classList.add(CSS_RENDER_MONITOR); -} - -function unwatchForRender(node) { - var expando = node[EXPANDO_KEY] || {}; - var proxy = expando.renderProxy; - - if (proxy) { - helpers$1.each(ANIMATION_START_EVENTS, function(type) { - removeListener(node, type, proxy); - }); - - delete expando.renderProxy; - } - - node.classList.remove(CSS_RENDER_MONITOR); -} - -function addResizeListener(node, listener, chart) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - - // Let's keep track of this added resizer and thus avoid DOM query when removing it. - var resizer = expando.resizer = createResizer(throttled(function() { - if (expando.resizer) { - var container = chart.options.maintainAspectRatio && node.parentNode; - var w = container ? container.clientWidth : 0; - listener(createEvent('resize', chart)); - if (container && container.clientWidth < w && chart.canvas) { - // If the container size shrank during chart resize, let's assume - // scrollbar appeared. So we resize again with the scrollbar visible - - // effectively making chart smaller and the scrollbar hidden again. - // Because we are inside `throttled`, and currently `ticking`, scroll - // events are ignored during this whole 2 resize process. - // If we assumed wrong and something else happened, we are resizing - // twice in a frame (potential performance issue) - listener(createEvent('resize', chart)); - } - } - })); - - // The resizer needs to be attached to the node parent, so we first need to be - // sure that `node` is attached to the DOM before injecting the resizer element. - watchForRender(node, function() { - if (expando.resizer) { - var container = node.parentNode; - if (container && container !== resizer.parentNode) { - container.insertBefore(resizer, container.firstChild); - } - - // The container size might have changed, let's reset the resizer state. - resizer._reset(); - } - }); -} - -function removeResizeListener(node) { - var expando = node[EXPANDO_KEY] || {}; - var resizer = expando.resizer; - - delete expando.resizer; - unwatchForRender(node); - - if (resizer && resizer.parentNode) { - resizer.parentNode.removeChild(resizer); - } -} - -/** - * Injects CSS styles inline if the styles are not already present. - * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the