aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--web/stream.gathering.org/resources/images/logo.svg5585
-rw-r--r--web/stream.gathering.org/resources/images/thegathering.pngbin0 -> 37462 bytes
-rw-r--r--web/stream.gathering.org/resources/js/videojs-contrib-hls.js11691
3 files changed, 17276 insertions, 0 deletions
diff --git a/web/stream.gathering.org/resources/images/logo.svg b/web/stream.gathering.org/resources/images/logo.svg
new file mode 100644
index 0000000..3030740
--- /dev/null
+++ b/web/stream.gathering.org/resources/images/logo.svg
@@ -0,0 +1,5585 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 400 90"
+ enable-background="new 0 0 400 90" xml:space="preserve">
+<switch>
+ <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </foreignObject>
+ <g i:extraneous="self">
+ <g>
+ <g>
+ <g>
+ <polygon fill="#FF7000" points="65.05,0.02 0,88.54 16.08,88.54 39.37,56.85 47.04,46.41 "/>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="65.2503" y1="24.2554" x2="56.0571" y2="16.0561">
+ <stop offset="0" style="stop-color:#FF7000"/>
+ <stop offset="1" style="stop-color:#FFA502"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_1_)" points="81.13,0.02 65.05,0.02 47.04,46.41 "/>
+ <polygon fill="#FF7000" points="39.37,56.85 82.5,88.54 104.37,88.54 "/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="105.4888" y1="87.0281" x2="43.4011" y2="51.7447">
+ <stop offset="0" style="stop-color:#FF7000"/>
+ <stop offset="1" style="stop-color:#FFA502"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_2_)" points="47.04,46.41 39.37,56.85 104.37,88.54 "/>
+ </g>
+ <g>
+ <polygon fill="#05CCFF" points="135.02,12.97 135.02,0.02 87.54,0.02 94.07,12.97 "/>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="92.4191" y1="3.3546" x2="72.7261" y2="41.6465">
+ <stop offset="0" style="stop-color:#05CCFF"/>
+ <stop offset="1" style="stop-color:#13A7CC"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_3_)" points="94.07,12.97 87.54,0.02 72.33,42.54 "/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="86.3412" y1="38.3736" x2="104.1196" y2="51.7758">
+ <stop offset="0" style="stop-color:#05CCFF"/>
+ <stop offset="1" style="stop-color:#13A7CC"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_4_)" points="106.93,61.59 97.63,38.68 79.53,41.45 "/>
+ <polygon fill="#05CCFF" points="106.93,45.51 97.63,38.68 106.93,61.59 "/>
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="128.3716" y1="100.5334" x2="129.1922" y2="21.7612">
+ <stop offset="0" style="stop-color:#05CCFF"/>
+ <stop offset="1" style="stop-color:#13A7CC"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_5_)" points="135.02,88.54 135.02,18.12 122.07,79.09 "/>
+ <polygon fill="#05CCFF" points="72.33,42.54 87.54,0.02 87.52,0 54.24,45.32 113.06,88.54 134.94,88.54 135.02,88.54
+ 122.07,79.09 "/>
+ <polygon fill="#05CCFF" points="135.02,18.12 132.37,18.12 122.07,18.12 96.66,18.12 96.66,18.15 96.65,18.14 79.53,41.44
+ 79.54,41.44 79.53,41.45 97.63,38.68 103.22,31.08 122.07,31.08 122.07,79.09 "/>
+ </g>
+ </g>
+ <g>
+ <g>
+ <g>
+ <path fill="#363636" d="M163.26,65.17v-7.14h11.98v30.51h-15.42c-6.07,0-9.1-3.31-9.1-9.93V39.74c0-6.73,3.03-10.09,9.1-10.09
+ h5.41c6.67,0,10.01,3.42,10.01,10.25v6.4h-7.87v-5.25c0-2.84-1.12-4.27-3.36-4.27h-1.97c-2.3,0-3.44,1.42-3.44,4.27v36.09
+ c0,2.84,1.15,4.27,3.44,4.27h5.33V65.17H163.26z"/>
+ <path fill="#363636" d="M189.1,88.54h-7.87v-48.8c0-6.73,3.14-10.09,9.43-10.09h5.91c6.29,0,9.43,3.36,9.43,10.09v48.8h-7.87
+ V65.17h-9.02V88.54z M198.12,58.03v-17.8c0-2.3-1.15-3.45-3.45-3.45h-2.13c-2.3,0-3.44,1.15-3.44,3.45v17.8H198.12z"/>
+ <path fill="#363636" d="M225.51,36.79v51.76h-7.87V36.79h-7.55v-7.14h22.97v7.14H225.51z"/>
+ <path fill="#363636" d="M255.12,88.54V65.17h-9.68v23.38h-7.87V29.65h7.87v28.38h9.68V29.65H263v58.89H255.12z"/>
+ <path fill="#363636" d="M270.38,88.54V29.65h19.52v7.14h-11.65v21.24h10.34v7.14h-10.34v16.24h11.65v7.14H270.38z"/>
+ <path fill="#363636" d="M295.56,29.65h15.42c6.01,0,9.02,3.36,9.02,10.09v14.52c0,5.14-1.56,8.39-4.68,9.76l5.5,24.53h-7.46
+ l-5.17-23.79h-4.76v23.79h-7.87V29.65z M303.43,58.03h5.17c2.35,0,3.53-1.42,3.53-4.27V41.05c0-2.84-1.18-4.27-3.53-4.27
+ h-5.17V58.03z"/>
+ <polygon fill="#363636" points="361.04,29.65 361.04,67.46 349.69,29.65 343.37,29.65 341.82,29.65 341.82,88.54
+ 349.69,88.54 349.69,50.73 361.04,88.54 367.37,88.54 368.92,88.54 368.92,29.65 "/>
+ <path fill="#363636" d="M388.03,65.17v-7.14H400v30.51h-15.42c-6.07,0-9.1-3.31-9.1-9.93V39.74c0-6.73,3.03-10.09,9.1-10.09
+ h5.41c6.67,0,10.01,3.42,10.01,10.25v6.4h-7.87v-5.25c0-2.84-1.12-4.27-3.36-4.27h-1.97c-2.3,0-3.45,1.42-3.45,4.27v36.09
+ c0,2.84,1.15,4.27,3.45,4.27h5.33V65.17H388.03z"/>
+ <g>
+ <polygon fill="#363636" points="334.44,29.65 326.56,29.65 326.56,42.92 334.44,36.1 "/>
+ <polygon fill="#363636" points="326.56,45.42 326.56,88.54 334.44,88.54 334.44,38.6 "/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <path fill="#363636" d="M156.68,2.76v20.03h-3.05V2.76h-2.92V0h8.89v2.76H156.68z"/>
+ <path fill="#363636" d="M168.13,22.79v-9.05h-3.75v9.05h-3.05V0h3.05v10.98h3.75V0h3.05v22.79H168.13z"/>
+ <path fill="#363636" d="M174.04,22.79V0h7.55v2.76h-4.51v8.22h4v2.76h-4v6.28h4.51v2.76H174.04z"/>
+ </g>
+ </g>
+ </g>
+</switch>
+<i:pgf id="adobe_illustrator_pgf">
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+/c/f/c2vfvPb77758Xf//bsf//G7v/r1b/7w73//47/87ifnu9/+7N+9/f1/+vkz97c//+vf/uH9
+iTnRj7/X//vV//NP3/sHvv3xH777377/7z73uN7+/O++/9U/feWv/qff/PDd337/+3/4/rd/ePUv
+Uh8H34+Y+Jnlf+6v/4/fnN/7T7/59R/+a/zh59vOnj/+7rtz8//z73/87R/yR34qm/Rv/sb/8v1v
+/st/jT8cP/cE/vb33/+333z/r9/93Y//+s//P7t+8+M//fMfu3Qe0Xmmv/n+n989oZ/t/e33//iH
+D3f64dX+1S/+h7/46/bdX/321/Gn/Hvw7+/+w4+//dsz5v5wht0vf+nmv/z+v5yzvTvwi//wO45s
+H/nL3//LP//XPM+f/Z+//e2vfvj+12/r3/3ievuL839//6+/kIrLv7z+X3mpq1xv/+v5j//3NP3r
+W3/7m7f/6/++3n7NX/3dL37ZhXrH4hLFly96RT+c5jO/EsC8b/72p83sh7AF/vanJ/mZ5tdJfvu6
+xv/9F+xQFznQjbsrbJBLwhoVMNa+ZL8ALhLIwgnWr4YeNv5mlEqUjJLtEIVELDFuJWgRv4Iw8l6c
+Rg3vOpx57e9/9eE+yeOcIPe5fbw91Eye+i0aUfFV48UGyI1gGd1YKM99EyfAp87NnY3Lt1//uW9/
+8Y86UF1uPE/wPrc3d1wHc22pbqbg++ZGtIriJ1me3IhFQPzgbnkdlLRH/GDBTyEa2aH47ohT3Vgg
+Wumn7nK/TgBSKK5gX3nTN05KfhJgtqMxzomO3vMcbhjG8cxqi54IN8fv12giVRn9Sn39+ZbvsB4L
+ULG4pPU0kiCIe/ID5/KHMi3RPNrIy+/P/RMw+ASv+//wBr7xqwH4SY1IB8QV+yGaUe6O5un3S+PK
+94Wa01ucIP96Pi0/PWX8FqWmki8B8X//Vm85HNVcdJKuzVd8dPe9X41XiUYCz2/yBGs9faNnJ/bz
+OREP/+rv54WdDas80jgB7M24sNOcjUjuRBO6qdF4Po1ovPywtpUgv8k/R6fDzdMPp0fNxY0nHnz7
+6u//0bczIOerWUJ1+X4EtYzefcbb6B7N9OXi/q1XBIrv1gFifkRpf8hmeB9uZscVjc/kIBtHGvGh
+HdGz93gUErqrOWGw5c+T7uwKYCQad37S7750EbajmXxEtuU0NnCA+uoN5KMk7VJykAwByKJZRVU3
+lzsepdjI8e7u4i+LxrnjFFIbjEZ0Yt1YFOR99edyLmTo5WC5oZP/EM3lyqENlu4tGgES+90xf0Uj
+EpR+d/fzhBgJObjRNou+F/YybqwxQemLyBFxCagRzX6dfB287eybH8HN6/jqLbxGD6oRPgWJ1Rw8
+E91It57FLlaL7tyHm+edr181GzfmhPzxtPlKgY6vuA5wZ/FKm+Ud3Nw9IdBISiJeU8u2UeMdrbvE
+dPKT5o0aVP597dE4Xif96QX4ygSEmho+S8IGXnjd3GPEK1WVjTm0ESt9Gmd8Wygw69KMvtJV6AT1
+6bvX82P13QneX0Fe2iuaIe1XdlxaQ0AqRhXFoSfIqXvE+8AG/C0br3gfkDU+N7ZYYb/yc/EdaMvU
+4oUoQv8hm0FARvPy/EjjKl9prCMb7xjGqhbP6Fsh9kXjyh/TN/PVK4hxpZkn5wRSkr40LectzrzQ
+InZjhAAabD3aRnw0fHUtxhXNI9dgpbHcWMbuP11lPl/A6wOTvapnR1bF/MJeU+OIT6Y+MQyWCdn4
+zM1Mojm11tqfuf3KuR1qb3a986Qffv31wD7c8A9fafYk+qFxjLf/nM98zRg+5ZmH9UMtJ7B+Pc/3
+ynVORMKfeei6OMA3NRdXrSg/ZDOFLz/j5rcpbFCPMTWWn4U28Veu49Dyv/lFNteWfT0oh4zP8qzd
+4d/nK8i4g2ln5ky1WwZEzKo91wLgzN9G854lTrNx8YnGmp8GgkZvXz1vPgvRvOu73j9Ec8YISiT5
+VrDJeyY3vi83jvaceeRqJ0rpPZ5Le/rWZx7dr8ZScx72lBk/xnwY520tr6DnZ7BZy796C3lvUp9a
+737uh2y+XotV01NDGujOJULbgWhc+RSkS/tNnECYhGiuM/vWJ+TEISYaAaRGYyvPCT5cmKdAWzRc
+EasonvghmstVYrOhuDAaW4sPel2KoNToyYP0bYmRqeaaMRBG6tG3x4Igc8n69tUreB8H5s8puM6J
+RrvAJ7qLtrreR2w/M1VEc8tNJgW67OvIRSd45pqfiwNX3nGH0ZKNMwJBURK+egevb0DBplfGe/Xn
+G9h9ZjObsW+jOdb9JfPzHJjzyvyBTvHV88YPbgG84lZ23TEw93y3T91sHr/N5quvd68kThHnptFh
+0efz5h2itHF9vkMlz2O3mluqsd4F1jdcEzfKxc6N17uBLICmm+vIE0gLME7wfF/1ytd/o4v6zdcv
+7PUlCCkeAzkWkI/jWwvIVwb9f/63+/7kvP/x/KByNP/jv+iveJPe2Ee5/4doPitTyea939yI/Unc
+lCcNKWkIfOnvMnbmks/oPZ618L/ui0RAPpU72q6645ewzHv+HoxwPCkvRDSOcxPxW81x12kEOx6N
+PR61mntmLPY1e/YteQKNmGgc+U3eV2zZaH59VIj6x/McNfeB6IBEY71KxgqOVuLZrycEAbQRjTOH
+0Nijfv0t5QlqKflZe461KYyb6uvX84/L9W4OfM1s1337YVfv5ZwvWXVHY2RhOEHp+evV28FX6isa
+M7N09ZyYL28gadzPH2/VBZzEGv62bZmT16q1MU4wZwxcCumfGseoz2ljE6O8253X1GaLO1Xk5Eac
+G+Kk4/lzYHf58GNhgUOT64JGUp4zB5VSF6/fv5/N9ZzPbfXna1FMFI9qt2eqv7NRksqvnnneeuVm
+pSxNQrqFnuNy33GzGGlkJu3OdYXmd+PyijujvLVzySzPCcbM6VVcF5/gemZ/6PTxafETd1xW2/Fo
+CFRLfi7sM/MEZ5/zrM9jRt9KIdlvYTnBhzwLLisZmtfnBFdrOe8zJWs5uLXtyp+LOQ==
+ ]]>
+ <![CDATA[
+ F9mskX1bBEanMXeG425+5TS29kwZ3fsTCWjlFSg0iR8aT885+3OCWvwQkV11FMhZCSv8Y31n4zWv
+8q4xT3Bdz6uhYuf7IhLucYqM7W6hvddPBiiNr1sYlN983vVu2KMaGn2VXYoZ0vEFPV+Dw2k/mtFS
+XivHuGNAkBLPO/Ayi/7BfAKDHWP2wh7gXk+Utnfc15MgpDlO+iQ19A4dtNDx+ZZAtjyn7ev5lvIR
+/MxJr+f+VyYd+fu+snk46Xj3d4l5bSiip+rXHshtPid4pepyQ3o/m6Ul7IdPgFDws/SV+BJo1joY
+F3se97fR3EpOyHdxxAwYa+RDKHleycg8ecESoR8wrPlaZlp+ICUTZ7ph7xBvZenj0lpsPQDE3VlE
+2FVWAW5uM7+GjB43SA/fcHn26kCIdsbV4OPiBHB28s4Q2Ym+tZUnOHPCSUohO5MyJYfyltJGNlO2
+d2N9JutMFJ/G1ySBXt5zggwiLuFdMpJc5VmAWe2yeTxho0jhT9z59XC01wx6Ir/BGUq+tVWdXNjy
+cs6Bh3LIN/H3ZT0v83Y5Y49362Bm6NR45dpwrRjQwow9o4y05LfR/JpFczOMo1g838tICTeWnh/K
+bTqGT5BfxFklav7586Vnmgmg23omwJqzB3/+VKRuz+x0HbmRyc9MQLnXbi43MuDr+s63MO/se137
+CRCLr0o+TXnWu+agISHZ43GRzv02WgtC5W4dniqQbrv682RjMEM56Ot53Hlf1diniAZ3nuB6ZtAB
+1ihO8OxIB8gkn4Dy13xm2yvHEeZHOQ5yut6i8eVAYtKIEzzhZJ/Xes6bQUbsKN042nhWkRgFJffx
+mtiyWIY70XomdwDveWHtWbZycubHWr7JO1J9NPadT8yOUnGCOvK8t7Nc+7LrkPpqqnBjLtvvoh81
+N+/L2ALceWHXE4ATFHleWvjHr9ivXMNvYuXKz+yRKz+NNaszsKmi5/V8uZoCaVRCO9/unTmd09yf
+ZPXcfjmIvdaMdnN4LODiz15j98x3SqswV62IPRaQwQyrJ/GdG9uVg67nrMbfPzuQXMyRu3q6rlLy
+71+VJGyd4wQzc4o0DyWvaWxlPx+pL2p8kWZgzF3xhaGcvvoT7XoKR6z+mZaVpI3GZ2d9Po/6nGDs
+HBnaY7mxl/18Ns8J8BF993XkCfp6HtaIbcQF2H9mEFxdqFkNnnrEDbmKoY8+8g7wB4/TnubXQsiI
+/TaaW71yz8rGOpuvUp84KVKw1dfuU1yOAEXdzSXknvnhWYQ8dz0xezCmIxMU0+ovncPtP4lWM3F+
+ubTAqeioVN4zfTtcv5TvHzM/mHyNJPfrM6OxAn0bzeV5iLlA01g/JnZAfbgkoYvOtztfn0LJv92v
+nMfOEyppFJ9GpjsRGK45p4MooW08OZ5ixhaN4Mbu9yATLV5TtrsxN7RYQGdzzPyToAfjnv6k/a4M
+66dsmnJyaVlBnsHNiBfgncHkBbWaa4oHgAxF8+PeLp5E84PIiASBG/NDviPBN6/3yaSd8e+4DQnX
+j9UaSSpqgY4ByvPvZ1xf+eMYT9b1zG4u3NH3CQXxRInGOnJ61tjKE1wtZ9daXaZGlf41jUWZelAJ
+KDkPlxbvZbwiRFnFZNf5dL29Ro1tPfNYvbN4xd/P11ht+VtXBGy8qzvPWvYT/8xcS1Cvf3Zbkm5y
+Y38iZ0ESfvnzOT6sSNqzGHjOHFLtqD+9rTO59tyrzUybqHnlYnbF0CaJuueznN7RNh5IwWu/SWr1
+ySY/6XrgCjksc9VR0eLJJdzvShF5X+8ed382lhHsRON4Nior9wNQ7mPSLN7m/lIlnNdnpGtx44xn
+VaBv5wlIKGWaL/L3NL6S+iwgtEnv7j2qwn8PjGo/T+uq+fdPMmPM/jT2Z7pquZ8Y70OlPcqOH1NW
+O8Iqg0MGKZ+cMsbK2GEoB/Ksh5HoZWm+noDizsYXMGv3rI3hNfK8sFwzgDyjShFzoeFeEO6fhL4C
+ZZ+AD+nZ1W3HT1Du+nzyFgG+4UvKvYRypq8TvLYNvlqsrp7Bpdg0Gp+U0oxcmf7+CYowD3tqcC9w
+l/zs3Hg969417qfRzxvI1lVe11WfbzGLHfCin82AXO3cuNb7TX+Wt3F5iNbRshQuP46IEwJphMTl
+E58/o6svF17cnBdLVJYh84wphrM+t7Xu8bqC137qeTUIj2XfPh3VoKhyZQQZLKVsfhJgkVKi8ckH
+Ka3gs76izQWgKU+g2f0ngRk07prpwtYCIzCp9ufTJrjPE0TlXy/BawJ916cHA0XhiQFHfmFIV1zt
+SeQGyADq14Pyi9qv8F5Zuak1RwFTz5Pxzu/jfXq/ZX1Xmhfvg+g8gbKU8cJa7Io7CmX5ZPpTRe/d
+uLpofsB06/mey57ZOF6R7JVJPPq23NQpw/ZtNL9CHilaZfMrs1THq+/9oCpHPLKWdzdjYxM9WwKc
+XjFTb7mdMITTI6R+kdFl9HWI3WuCt9a7koCb1/vmz41ncviP0TciUX4ssG1Q3p2Y4sdmy8ayan7n
+MB/yx0p54LRr5I/VJ/ZvUduj55MdfBBzvT6hCABgP5jyLoHVZsnG9uQMXvmJXp4I8SlfqPFZcHL6
+K5Dbsq0nWAW9mSd/dT05JeQA7qdY4ky9GtdTbCjZdM+cJ+fzCpgxnlxbqXkHEbYJBhyNV4In+f1n
+s03zMyeVErfFTPhkEYeXq369L8HcuRuA6/Vgn40C04/mAwwgSEO8MqfpwtRoaNid6CTNPM6kcIKW
+s690ndw4n09jPOENHm5PAi+zGE1UhSw+FA9MeFr5CV0580HWehIxKrB/G80rcEUz4DCNnGLefo+6
+QWOfnPOAou88aynZV8yoaHym+R4JKhofZIGwtD7BTDjFeiX50DbtucepCTsdT6a0ZKGP5vnkCPUA
+E87an/xlzodtOIPlxkClNIm0Z+MzY7QHYajzjuzbn5mzQi1y43gCVFU5HiTgMwoyoddqIlynpEln
+NNZnpcrbIuOd46IFMAstqZaX2gN5Qs+niCwRjwdD+qRw8Cl5sKnrwZwnMHWXfCgy5nXj3fOzwuPg
+Oek2spCvLdbJd3DXOyvLNL6bnFvm4fVjI1H7+/mx8dx/cb2bxv7EvPX9Cfqz+S2x+KHpsXI7oipL
+NN6ZhhOKO0+ArvC7VT36tsTNj27Uvlwr77zWmrukpq1FPhosWr6N5tVyKk/AEnKzK+O4VePRsNzV
+fDSEeXneV11Me+Y8wQukfz1nfeAtLwyuNGnz+75cHqfxeq5ABnS/FAZ390Rw7/kOxBtVa3lUOWeG
+QrhBDmqMMSNV0vrx2XKCmcAFFOXjx+6WQWeNTF6FnpCrbL37C4eMs01+9pmvP82tPkO8ZpKz3u8+
+BwyKszUWTz6xHsQQaOBPMbUYyF7lCpy8BjN7o+981ZUCb34C/ZIXnJwAGiOpy8vLp7DfFUPa/VwA
+XOuc5QJouX0tnudXrlNo5JXyRKMBvMbkpn3YQaEo+WSI+lNFk9BkTpUPAPN9zTMH/mnsT9H0qdXT
+XPoDhI9dKH1XfSbq+TQ+ZYu2+usEr2KKlg0aMZd8UgmR5MJ54wHit/o8xPEu4V6a90oIG+7Ebip1
+80thtXaAfnnfuawIIb4fJstMsJcc1D2YWWv+c/Z9oqhMklREDJ7grtTEq6HmEff1HgV7tyfemfXp
++sxUY7+gbfv9AuITQHyoz2JTs29EcYpZHdqcns/8PTIwQIa5JqXqoTJhw507isw6/AzD4lUOItds
+CGdtiYnVej/zpPLEiDvdrwuQX3UE7Q+b41X9a5Gt56xPjqm/yEhSv8vtS0L367uVKSJOJJ+fnAGi
+zvH38IJzRrtfpDKsPJPCkACI+j7FUuZDErsfIHMt+3VdZWTaQTNPXOyTIilOx9A2X5F0VsSQPnc6
+ZmpujMVCj7HGdbX76682hkvNgak14TVccmUSmDBJEa0+U/WoL65Ev5LOtB+mTGR5ElkfI3bnfKii
+TI7u0XI7056/f6GoZ9TeoVqUFr/f5zvcZpSoBO6vDy2jZtCQwfxXuBrx0fa8/vG61x10y5+c9A4g
+8ItRRs+Hpqf7ywmmzrxZsdDdmFBkVsudjfN+mGsvNOlwVcXN7El9YTOzw7qH+OxHQpc478zZMHKN
+GpuZXmCSnFeC1uczkp+yOfeLQsDT/CJOJDdqGuSbbIoRjXPlz7WHaoR+8ZXT5Ii0N32d1eIEw0lE
+zroSTX/W1fGa6WcOuoeJs7Ka8G5rjqjYyFdeH8ZMXVkU0xUEBPgsVqs9t3tlY1T+tVfJSJ0TrHw0
+5dq5Xl8PXyIjL1bmmtOBUje53tag9wBYKvlj90NeaaPnCarr0+LOtdeK30teWCalFHLkfSUK5N+g
+T9UcND1JtXeCIjTA6hO67eQ76hHlCfbD1apP5IZuXPzWahk7RoimYZ9sUppfOHWeTO4WonqjT38/
+wfKdZLG6vLCIybZyRhu55S2OwIJsMZ5w33UiXYLLf8T1rwsY1yvc/xmGXcSJnCIeOHuLnmOmtJJ7
+q+t5iK+6nvY3SccRPvDb2HVFEfI9cw+N35nPNgo7qOq5AjEfOmg0r/KM8ZE7tNe0tuJFWt/6+fzb
+6wTlobLIhTca75xYR1/JH3txfbUr/Yc8QckdQ8Z+yGA/M/OM7BWNd63PWd9dwcMFFLPp22huV86X
+gtbmeZ957do7GtszI/T97rzt2TvWiCmR4X59Zf25sO7SyJSd2XhOEPHEfBEaOWt9Lsu1Ga7qmdpf
+2Rv+vj9/HwEZNkkjX24Gql+j5kVzyf3RFbyod31vJ3vcuJ+zlv283Cfxqgt7+t4vsucr0RAMvGCG
+5d/Xvt5/pW7MBWM7a5WNz7BvGZaTqpj9+R7rK3+RXKQ7eBWkP15s6TJeJ1h3TghXbpQHCOuVH2nN
+xtpyyNVXDgvBw/tZTHOHR/OdROPk2HGKaz0fk8uJNJbs+coBRfipts+9Pvd5/d2rV17J2v3ZMMeP
+TsKRj89tZh5ec27WSNSc7HdlKDLN9iLRnwHz5OleU3wO35Xlwly+fV40WpOaH/jtS4rJuVLrGqKx
+ZdBZnrIYmcL7CVgCaohdwMN1R0QoGtedWZqz693PCV78rTv2sG07jxPLXMnLisrevN/VFuk7X5N8
+DJT97Mn42Z5p0XrnQ8RW9MmAaifisV5K5mADQcQJ8gO63zG39rOtJDW7HhrlI95BwnXUXBXzG7rf
+bSyvoIi32+CU18eS59076XXzVeO4EjAOviTrFuXdDN1GyZz3NCBOLP4n41yMj/DPRcbOcu5JmMtq
+VXn3Il+gAFSA27sHmVWDaz5Ewyym1uQXq/Fd4WM8rMbEBtE4cywGaP+SeHGSZzWC8wT32OPTFdzP
+niThJhRpeoa+3c5Fbg4IEM2RIu/tPYcussYSbngmout6nSAgsprOo2CGp+kzmIOE9/MaEVF6Ud/x
+3K6zcOIS9myszqfkWHxOMFK4QZ/AU+u65sjeLa8hag80hrCHamhJL1ShL8+b6eTQfg==
+ ]]>
+ <![CDATA[
+ +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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+duvPS6mjb1imvS0puK2xyfvxrganNxeRLjxT6fT2cin3y4PCta8OVkS2V9TX3UuorrqXXO/3qKWR
+f3elkH5+P9Hz+d7a5Pa8upQHOdU19xLKdt6OKYHP3lsxpd+heTp9Pbrs1OX46uOX4yr2Xo0rq76W
+Uu71dFs5+/FRLvO0PU1/53Y6c/aJD3f1Xjh75WE4d+NONKyNssvpSK5zKrJvZFcm3yiqTrhdVN1w
+OaUq90ZOPfnidYLdD50O9m2dXh5IP+Vfz6qtvphWueliSkXM/XIkXw0NRTczG7zQsxHvP8SvutC5
+yuaHzlXajt/8oW+ftj0bCm/nbcu7k7/N7/GuZrcXByvphzcimRvXg5LvFW2BeYLP6VtRpTvvxJZu
+upFQuu9udOnFh+HFGx7GVrq/2ltF/P4q0fZ1p6fd2//nY/9bZ6jutx/jnd4dLYi9XVqdeyuzqvZq
+cvmWiynl0bfKK/0fNJYHPGiq9OpoLdO/Pl/g8up4Gf+6rZB/1pbHdzzOZo78vpbY+e8VzInfXV3a
+r5UHtLds8O1orXN/trdqzZuT5WtfH69kPj7N1L3+WwT15lUS++vtfPfnuytc3h4psw==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ VWDgwPrmMFO4yniYQ4V9KMSptSftgP0GcQBhogCDB8cSYB8g1oR9J8AChvEFNRbADIbrDYw6iEPY
+hqPz+cbLyyBWhPsqwI4HLgpwftja4/PI2AS2TCbxRdP4ttuOMD65njeecL9O0fPAJ7jvLs9h+wlc
+OpEf8BMj1AkHuqhzIr++dBTc04c+YeKzdOG+FFN3egG97cYSYGcpB54wsh0vHYGdxW7ZNwNqPrji
+3ZO5nO7xoGXNkDXnMzMIOwtYIbCeVYHHZ2kPbhNuL7CzCofZWXzj54vZlgtLwUeQ9Vbs85U5LVYk
+1sR2H5gtEA8zzafs+Brc7tKuSXxx9yTCmi/um6qoP7mYaz6/lHBt4Z5LUomRKgfnB8DwK+u35ToG
+nfiuu2501+BKejv+rOqjs4BnB5wP4D0pyo/PVaZvs2AiYrX46n2zYE1Dsfc+DXERWdvofeZItV1a
+QvhOOMciuUb5kdl86/VVfNNlB4iTRJJgRKuSNbngVG1Y81GsyzcEDqoiOk1XmVJuynXecgnsviMm
+LJmNNWYQC9A4HwoQ43xdhsc2o0TAMIJ1Y+DRwLoGicEI5zRTV5ndMh7YXZDz8bkdVsDc4It3TYYa
+E7LOVNBvw8J4hfXL+Gxdfl2uPsRhhAGDx5K88sAsuJ9BGO9x+QZsWCqJ9yEGk5ccms42X3eANRF5
+cc9kYH6D/2axjQO2EFxXyEeJXSxoHg/MalLnUnt5MeEFpVcSBqoyrWIMYTDjvoE4lK/FfhvnaBDv
+E44NxEXFXdYsvvYkNwIebjpuJx6nvzPdDbgth2fDmobi0GOF8tCQiu2+68wFxmnKJDyC+1eEUZNb
+N44wvoDzBnFYbKE+WU/4EzuLrT+7iORt+S3j+ZrjCyAel7XfWwb5uywiXVuGY3w2tdUMWGny0t9Z
+nDjvw/N4IvcHO6uoYxKwjTiYU9vOEMa6onCnzfDndk+A8UByQeBQV+6eztUcnsO2nLPHY2wZV3+W
+xCxkzaqyfwZ8BmHDleBxj/8exALEtgF3Cs9Rtgrn8t33Vsv336Pp/V/5UB2DDrDHDu65KyqOzyX7
+JtNyR/H770uDj19bG3HsZELogasRql1DAUzvHWecDznBOYMtUmS3W+G+xG3A135Tz1TY68ZF5oyU
+l+yfRnLmlnMO8vQ6M6lqrTqDY2rCsM7vtQbuFovHD4xxGRulLpMF4thQiqQSFWIi0kdAfAztYpqv
+LIZ1CZxPjpBSSjXC8sR/S76pxwb4VrB/iTCJKk/OpZtuLgbmCDDlSJ0DzmVhLYqNjNEC1hZcT3n1
+5/PYqs9mwVo++Gg2KluHUq7TBI4y3EOXlxyYTvgo5F4vMKnaJgJnDda2oZaMrzlrB/esCPMQ1jBh
+XJQen6ko2jMVONTKvE5r2H/DNZwbji3JPOqbpqz4bA6Me9LXsN4EPK6C1gmwds33PPDG9nsul5hn
+wEdl6LAhiVrylNoxsK+H3fvKX3ngsVy+87GIbRlaTpg9sIZAuNNH57PtN1dybTdXKTbtnk6Y5sC8
+xTEfiVkrD8yA/YVgA+R5zZbAwGIbTy2idz5zoVquLob7u3C/mdQ6xhTpEZ9UsW8m2HmIpeRpRUYk
+TslqHKcsbLcm94Swfadbzi2mGk/Mg+sDnHXI56XyWHXgVxCmCvYrxOaVtMMelumEGwTtxvEj8RF4
+3rNV+2xZHJ/jvGURxBMSDtsnHIcykZkj4Lxh7xm767knMABpWLfefmcF23B+EcwF8F9sea8N2/nE
+GfZ6KvY9ZtjaC3bEVmduNYOYFT6X2Bjcl7D3EnhPsC+A+D1Yu4K8v/2aE9hUcm86OFwD8l7wsfD5
+THi8FuzJgLVw4BSxQeu1pJLAYSZiRtNYYKpAm+DeGBOxVtPP2wvHtHLEr8fjAu4xp24xGeaZfz5X
+XrF3Bqyhwj1IiBnliQWGhImFfTTESHBuypL+6fL6M0tgfUZegscfPj9F6eEZXFrdGNgTwcZm68rT
+gGOJPx/sV1bbOPCTcmDZx2fpwfolX3d6MTCPCD8IWFvAhstoHgt5NrmPnI37FxhkwMurOTgH4hHC
+rQZme/EOG5yjED4H3DsHW05YPO03HIBdBO8h+R7kqnjcQgwEDAi649kqevu95WDz5BU4lgCuEvja
+LYfm0N1PnRS770mBEwP36gnrK7nMmOw9gbVG2ANUts+WK8FxLfCN4WewT8Bd7r63UtZ+cyndcG4h
+uaeTin0HjB08x4b5xq2W5D4grEfA3uHMRovhGLl1AuwjoNqvktiJL+2bQoWmacmU6zUglwBuFcQc
+wIRjM7ZiP9NgzuP4k4f9VmW7pyryGyzJvbKGYwvYjhuruIbz9nCfngnN0hZxa9WoNdiXFe2wplqv
+2sPnk/s1WXg85LZbwhzjinut6a37bKmO6w5Uy+UlVPNFO6hFZWMydYCPycam6cg37ZhK+HCwhyR/
+92R+Lfahsfl6irQmc2AVyoGljeNRrnIHtqH7Z8GYxDmXPtx7A/sCvCl5Qroeu77UUJ5SacIX9GAb
+1T6erPPhnInkG/h9cI2ALy3ykaAAKYUgjobcBPJduO4QJ8H9Vg6PWS4uXYeMbWBM42smL+iYAHt5
++LhMXQX48/oTiyFeAZ4W5IOwZ0tR3GsDezdgXsF5wP1ieWqzGeTOYL8hjiTc9A3lxmTPEbDgU7eY
+Yj9mSvw88F6xTeHS682A6Ux4wrBfMbuVMLsVEPsA5xbWaDeWmRBWE7HBny8gnFdYM8FxKMxxbuvx
+YXsE7FNs4wjnClixsM6O55g8BV+7AjzOcH4CcRGMQZwDLWLqTy+AfoSYkGk9vYSvxp+B20l4YsAP
+Bf4wrPPAOnlqqRG5V4pjIuCzyXc88oM6OiYVx9uwl7YEX7fNA9OARUd4ZXCfLqPcFPIkYNfB3CbX
+AezDliOzyH7g8r1TYL8rcBOBQQj7BWF+kRgBX1uwV8rc9gnEL1UemkOY4LjN3ObOyWSclu2yobec
+nEVXHp/BptabQjxH2gb7XtpuOsB8IoytyAQt4IRL+r9cJfvsK3+u/ys/ru+FD129bzoTmaIN9SEQ
+/+G+mwqcHuwHZpD5COzB+FJDct5kXh+bJ3w6Ph2fjk/Hp+PT8en4dHw6Ph2fjk/Hp+PT8en4dHw6
+Ph2fjk/Hp+PT8en4dHw6Ph2fjk/Hp+PT8en4dHw6Ph2fjk/Hp+PT8en4dPz/fEyd6hYX5hqcFGzA
+ehpMdfJaHIh/lgSvTwpPNPA3mBo4zykxyTUqNCkqPi44Mc3aAT81f+5CO+t5kvDgGGvb4Vda4xdZ
+ixKjIqPi8JPS0OCY8BnWs+HdrJ8v5eVq7WBt6xucFp4YOD/QLnCG9XJrWyevBfMD8dvwb4dfuhw/
+DCg4haVwCs6JG9avEQcn4U+PG37SORx//H942paKiwuODQ+zJs9a46etF88wmG/thB9sCnwTbrAB
+f1lgPZ/8Y9PwD974m7X4qRTrBfOt/azlyvnWYfB6icEc+2VLl1gvXWBnZx0LP9gtnrtk6fDPvn/+
+ef4i+Or7b6//zz+T18f9+5/HX9YNX1r3qJhwh+FvSWt+v862M/D5sB4G81zDk6NCw138OB9r1t9A
+bj2HXGpy8vDNn85h0YK5i+bb21srrRfgn5cshNat+SffAb/9/V2/f1lqbYfPYMFScqXsrMkHGEyd
+Ss4RxoaDtd2CJUvsDVgvXU8vBrm5+CEvPwb5ScPUxEykOjz8+BB1ERWs5h8QquYnilDz9OGRu6sE
+efvIkUS2Rk0anqMNdZOyiCxtWUSmtiQsWUusWKfu5iRCq1d4Ii93DvnT0Wr+qnXq/rJodXdvFrk6
+BSBPdzECTTWxco26JHy9VkBwggYVm68rW1usKwpP1/KRBCI/UQgCHSlpaJKmLLxwhCQoVdMnIJD8
+be8AJf4MKXJb7YW/SlAAF6kOdRSw593XN4i8JoCLUqMj0rRBG0WZXjkGNJBUua0ToDYfameJ7m9M
+nh7UUJNamfUVRlCvCvXGsJcZ6juVhS0ToXYF6ivpkHWacqi3Bg2VmAxd0JolNZvVh+dDnSfUpPGx
+WbpE0wJ/la9N15EngOZJrTnoUxGtE3g91DStSR3JR6zXVsUVGSoT8d/fUG4MGidMQpYe0VoIT9eW
+Qo0yrVKj5KHqoG8EWgVM2DotqFGEOmQuPFEbtLclFIeo4BgNLnGLEdTn0FEbtOnIRKJJA5peXHSm
+DtRfgiarVBakJuVD1Fio74/G7Y9P11VkVpsrygZmKHO7J0Jtc4AiSo0J3aAFWg2k7aW7piqhbncN
+/hyoM4XrmbjZiGgiZbdbyQt2TeKyW8cxG0oM2aRq/HyNCZdWY8pE5o4MUMZpgA4sl5CjTzQ4spot
+yL5yooFTbESuCdQi5DaPg9oo2I9P9r+D9gP+O3RgtAbNBamD3qJYGakOutyg6ywKiFATS4LVfMQK
+BBpOUqh14GKIPqSfrxz5AR/BU4agHlUqj9WQ4fbQofia4p9BW9PN1RdBvSroxDJRxbpUVKmuLCRV
+C7TARaCHKgpGMtVaDdDS9PaXIqjHZtdXGwWErtPw9uORs4cI+UG9bHCaNh9XNYpL2mLExhbpy9h4
+dWA+BKiSNLzw67xcQOs3SA20j+A8QONIGpisySgTNJmIVG3F2lw9ZWyOvnxDyejA7BoYcxPlGTVm
+sH9dhtuLz0FdnrrVVJG13VKZ12UN2gjKlEpT0Hsk+lhpZaYwfriYFB06KkVbsbF1HL6+lnLQuchu
+Hq9oOLdMXnPSTpldZQGv4fDY4eJSdaBGgWidFLSTuvthjYPWiTDmA9NrLVTrMg2Uial6ytRyU9BA
+IBoP6/MNQYOCCV6vBXqGoCtDB0ZpMKFxWkRnMjpHl03M1of6TFVW03ioG+aTCgzlEVk6RHMot9ES
+argUqVWmfEyWLrNmvTbofJHaHjz26cg4TTZ8nRZoSMhT8dhILjGCGnxl2b5Z8qrDc5UpjWZ8bLYe
+G5+lC+Mc6gJB3whqS0jdX1q9GambiCnUh7GpyO2aSHS0Gi8t5VsGV0BdJJc9rD3BrCvQlypxX+Dx
+QGqZk/B4hnre4p7JoM1A+HBxmbqkdiW9yFiZ1z6R21A6mlubMpLUpkAdLe43Ut8XEaPFZXZacrEF
+emI+XN3d0RvbSHckYfB8UyZrSvgEDRkfjfsySZPCDwm/Vt3Pn0f+PuwwE0cVp0E0aMJT8JwPVRNT
+KgT6rXB+oP/KhmWPgHoeJrZEHzT94HPEVJhaABOpRnSZcRugBppLrjPhIvN1pMpEDfgboHMBNc3y
+6Dw90Jkg/bMWav+Ga7VBvxL4SWx02kj52iI9mSJBQ6rAdjQwXlO+Nl9Pkbp1jDKxwlgRm6mniE7T
+gdpWVXqVGRcKtRPp2lA3y2VuIbVnoMEBtfe4f3QJawP3A9H7Sa0wVSSVGUMtI9HmS64fQ/ops2Es
+X3ViHtROQm031LbK0/B1BU0LbHuh/kRZssdWueX4QuXmPTMURBtixzRlJtTY5+oTGw==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ mQotX4orSdwW4E9iic8luYzgk041/7DfSl7ZtlLY3b6ZameBI93Zp4/5v7SzvD9rZ3n2UVHtrAOz
+xfRzC6UdMQPNZVYaOHfobWOtVOmfOUJK2TfTIrJsosWOcKpvTfNx/+wRlI+94PYyqldA4hB0aSiX
+PfQKqDZ51gjBL41gr70TEQe5gjs/CKUNa9niOz8p8q8shgY8rYVhfw7NZUr1cV185vn54JLHvkcp
+/vhM6JJKu5uNBPX5RRY7o4Zw1s49VI7+OiRfG83n1f4ADMaTXLZbX7JbO4ul2lnNPwmVLzaJe9pN
+sQcZ+QHVwnAL7aewC+plZu+tLXcI7/1FOwv1JWgOUH2l2LJJUvLBWVJY2iga38MK9Pm0/TPEzAsL
+lfFHZkK7UnQL6oe9YpjjqJsoQ0v0uexT87v1OS4spLox0YX6eC1ihwg9ruQTc5Vxh6dLwWkj4YtF
+/P0Whx7Q34LOPZ9/bglX8nAF6mt0zR1agqHpxPeqR0g70odSDWfnMKp1rwor1hfiyydg/YJF7nLo
+sRz3lIsu1+ec/PuYc7aaMgsbTcROin/B6e+bPHTTOo4xNduiwVn79VS6xPRHfqv0TxsBzRP4ZD71
+8Ayp4qEh5UHGWsXWwN7w+bxHTH/EQrnSVcvEfIuGCfb8kNgDLIU4pgwq/pbGSBLXqM4uap4kb8P+
+NNRLu/VLqiewaWfArb8EORebdWYudAiUvtkjqD5YcMEYxB2L6ALqH6Sk43NEkqtCAwf1zW5N4eTB
+3TpUJIYCp2acXQjtN+AAqokCDR6CJeAfgDWx7wRawLAv9FhAMxj3Gxp1wCGc+sRcIfvGUmBFrKtA
+Ox66KND54TJOzaG2CW2ZABqLJguF91fAPvmKVxuwXidVNG+yqm4UeOI/oUtnbAj9RDtNqgMdWTpW
+2B4zAGv6GBPWNVAH61Js5oV5irzaxdDOUu5tYWWVT1ZAO4tLPTANPR98VM14Prh8NLisWVpzvjiN
+amdBKwT1rERinzEV5JrI9UI7K6JbO0vIPr2Iy7/6HWIErbeSmK8Mzh9DsSbx+9BsAR5mc88tFNLJ
+dceUjROiysdRrfmo6klS1tlFfO6V76iuLdZcdkQPUgWT/AAafvF7pvIldSuFssa1irK6HxVF5L1S
+TsyAnh10PqD3JCWcmq30zRvJ2rloCykHZqCmIe1/oAAuorWNXW0r5IXXF1N9J5Jj0Vwj4fhMoeDO
+T0LOjWXAScZmVoxC5dWDt/LuiZqP5B7WHzqokpOPjnJnwlC+9N5qi/J6E6ol45euByygIPmQqQnJ
+12XEtlklAw0j1I2hR4O6BsVgVOc0QEcZlD8a2l3I+YSQkjHQ3BCiqsajx4TWmcL3TOBgr6hfugbp
+CO4h/YDDqAYMsSUx6dAMrGdQjfdtYbqcjTfF+8BgYvSRKVzunWWoiYhRFeOh+Y34zREfB20h3Ffk
+o9QvhueOhmY17XPJuLGI6gX5JlENVKVP4jCqwUzGBjhUyCBxm+RowPtUxwa4KKpMnyP3nuZG0MP1
+JddJ7PSzprsun3p0Jmoa0pHHkvJIg4orb1zFW2zrITMTGKxfUY2akMxvqMYXdN6Aw1wi+tF6wp+0
+s7isSwto3haWP1pIPzUPeFxW3LQU+bvMzrenjGB8zrtAD1ppYsxnLU6S95F5PJb/op0VWTIO2kY8
+5lTeRaqxLkXsntD9vuXfwh5oLggd6qSaKXz60Vlc/uUlxMaW8lmXKGahNaukPdPwHlQbLprYPfk8
+YAHq26A7ReYol0xy+fKm5eLBJoXi4PNN8pK6ZdhjhzV3KfHUbLpv0idkgHDwgbnVqduOdifPulkf
+umWnqmowZXfVryL50EqcM3yRFFQ8howluQZy72MrJmGvG28f3FuMPjiZ5sz5l5eJvpl65ipHTZZg
+aqphHbZLH7pbHLEf2LiMc9CUySwINjRnzM1UDGvn2wv4GNfF5t5chLoEySd7mcuVGlTLk3yWGFsx
+AfpW2L9ENYmSzs5W5NxdBM0RaMrRPgeSy6IWxdk7a0NrC/dTTDk9h0s+NgO1fMRoziGoj1zp3gM6
+ylhDF6MPTaH6KHStF5pUhWOhs4baNnrJhPRLC7FmRTUPUcOEXcScmi5F7psEHWplaKk+9t/w6svd
+2JLOo+rJysRjs2D3dKxRb4IeV3jBt6hdCxXNBsR/z+Y9QnUFB/8+3BYPbXFnxjDs6+H2PzVSHnos
+irsfG3P5Dd9TzR7UEKju9Im5XPHdH/nCuz9JsTVTqKY5NG8J5qOYNenQNOwvhA8QQ3NHQQOLyz63
+QLG7bbU8/9YirO9ivZn2OjpH9qUxKfHAdPh5YCnRJ3IQxSmB2d8oI4r16ZoQ8e+K/MuL5Nln5uD+
+QGcd+by56KIJ/QqqqULiCvV50cXYwzKF6gbhugl+pDGCzHsu+cBUjuBzkrcsAJ4w44l/IjiUtQ/o
+hfPG3jOuqn0DNAAVqFsX1f/Aqa8swFxA/OISdk3gSltWYa+ndOAxy2VcXUh9dUCaHjAr3pf6GDKW
+2HsJvSfsC6BxD7Ur5P3Ft1fCp9K1aStbLeS9iLF4f9bWVRt7MlALh04RZ7ld29zMolsT0T9nBDRV
+cE1YG2PtHHsYGmwkmFZkhO3ELrDG7J06pFvP/PRsMXH/NNRQsQYJzCh6hPenmlgkRgMj4dyU0Xum
+iFkXF6M+I0YT+yPnJ8Ucncb7ZA7DngjOJUhH9IGOJXl/+K/Awm8QJ0Vo2bsG9kX9Usi8sAiaR1Q/
+CFpb0Ibzzx2BPJuuIweR8YUGGfTy0g/PAh6hutXQbI+qnEByFKrPgbVz+HKqxVNcuwzaRfgbmu8h
+VyV2CwwEDQhFSdtPiqKm7+HzxESCJaCrhFibemSWorx1pVTTZA6dGKzVU60vr/jBdO8Jao3YAxR/
+YCofTXAt9I3xM/wTdJfLm36UFd/9TqG+PJ+u6XiT2AHbIXOsW9+4YBRdB0Q9AnuHA7JHdmPkgm+x
+j0BefItiJyGmeqLc2kdbptyuhVwCulXAHNCE4/zTSJxRDxcI/hSw3yq+ZpIUph5F18rUJ+dxJbU/
+8eorS7BOz1oH9jTmHTXkW0ksi6zUlxfcWoL3p+s1gcQeQopHYY7xUbv0FWkHpspL7iyT599YLM+9
+thC9qJxzQB/oY3IuPn3E2MpJVB8Oe0jCasYLjiSGuoT1lXxyhkOrUISWNsGjfFIl8aEHZ8AmSc7V
+D2tv8C/QmxLdfPty22P6izuThgjhFcRHFY+mdT6SM9F8g/wd7hH0pY03mTGm5nIGOBq5CfJd3Hfg
+JKy38sRm+W2+fahtQ2Oa3DMxvORb7OURtgXoSIjnWWcWAa9ATwv5IPZsSVG7JmDvBuYVzgPrxaJ3
+rh5yZ/hv4Eiqm+6ZMJjuOYIWvHfqUBLHhtI4D71X4lN43yw9aDpTPWHsVwwqoJrdErAPdG5Ro/WL
+H0K1mqgPPj2P6ryiZkJwKOY4n3aq2x9B+5T4OKpzBa1Y1NnJHBN3knsXTuyM5CfARbBBkgMtYLMu
+zMM4AhOyBRcWCynkPch1Uj0x6IdCfxh1HtTJvWMG0bVSgomgzyZWPjJEHx3rTfA29tJGk/sWt3cy
+tOioXhnW6fwThiJPgnYd5ja9D/APqcdn0P3ACfsnYr8rdBOhQYj9gphfFCOQewt/pQwp/pbGpaQj
+s6gmOLlmPq50PLXT+KoJitSzMxRJp6Zx3llDgefotWHfS+HdZZhPVGPL3k0bOuFme579JDv23Ijf
+89yQr+7YpEg5MIW139kT/SHAf2TsJkGnh8SBaXQ+QnvQNaY/PW86r0/O6fp6fD2+Hl+Pr8fX4+vx
+9fh6fD2+Hl+Pr8fX4+vx9fh6fD2+Hl+Pr8fX4+vx9fh6fD2+Hl+Pr8fX4+vx9fh6fD2+Hl+Pr8fX
+4+vx9fj/+Zg0ae02mzVWO6x0uQ26k1ZuXGRBfjaz2r7D1kPXSHeSxZyVHjvWOFjvcHDdZuXho7+M
+PDV39vyF+nPMbK2c9ad2v1KfvEjf2MPB3mEbedLc2srZdpr+TPw1Z7hZvnGN/jL9qZutfGw9LOZa
+LLWYpv+9/tSVG+fNtSB/Rn7b/dLvyUN31pKlSxbMXjB3yWL97+YtXDB70fyFS/Rd/vPT8xbPXjh/
+yRJ9Zzy96Dv8gKcXzMML/tvTX97E+X9+b2fdrbqs7jZdU92l+lOn6XOsrvxP35H78R3uxyoPz+1b
+Tax2kEvd1v3kKltyrf/p6anybdusXGxt9Omz+uRp/cXTdOfqryQPbie+sdX1JF/m6c+l/zgf8oMB
++caRPLVTf95cfUN9UTlX3wavN8PZfkdPdGH39S9cNHvxd90/b/7zz3MX4Ovmf73+v/5MX7/tPz6e
+fHHvHud1Ds62y7q/pVfzedDJtc/T59brzllj6+VgbbvakN+kzxnpiuRMZ9GR7/6f/ETv5/xF8xd0
+f4xSfx755MXzcW1b/49ej9vw+W8+f/lOfyH59Hnf0bu0UB9/Nld30iR6fjDSZfoL5y1evESX26iz
+YSPLrF1tyGw0ZBlDcxsNE9ZeEw9DYYumsdxKw8jUWsPQ2E5jwyaBWbfGjDHYJDJmsq0a5rbBPdHA
+KbML7CmzC+hpZuOlbSK5a65dacws/2EDs3EdzxgpnDSMVO6aRjInzXUGHLNmpSmzYZ0JA3I3E+VW
+TTPb7dqmVm5acpcwHZljlI6xra/2JjMLxtB4CwNCK3PrHT1kthG9zCy9e2wytaCfbWCqJO9hzqxd
+vpF8NWNMeXtNNHRg8/3mzZb0Naa8g4bCzqcnSFqUvknDQMakCin4FiQBaOKlBMTOoX3RzE2bdrYn
+DkLjLBqfsakajabKiPyxaKJBo6dii3sPEY3fIHNx9tcB6S1tHk05OhcNp2iOE1wCdSi5BvkqOvr2
+Ed1AvpIxHERZlHQFr0dz1Vbv3oLd9p6qbZH9lR7k8z0TBoNshXUL7EtJH2x9e5qjWVqh0pCL1pog
+WgJpAmvjro1mSTRE87YePUECbibnGbmVsxbvkToIjUIKB8+eCnsPSo4DcjHeKaAPGkFBDmsus9Qw
+F7ZocCAacCLX7+qrIwWkDJfi905ThpSPRZO1qeSgwVp7aoM0gl57TNUkJRqIt5L3QcMr7qdH3CBK
+zhRUPEYMrxrHBxV8w3pG9+d2pJDn04fwPulDWfuQ3qbKbVogpOXdgvtRMpDA3JF0gzsl44kaRO8J
+miJCcr9BkxYaA+hGfJBQkM9RWDhpKXhLTRA/mijtNUEQDoJpY1M7DRMzK41NJhIDMilzNF3wzpSo
+0nCzyBhCqGGDjEFjrLnooiUj16OwJveU/AySz7VrNjNonAVhLesQpSN3iNGRbfHWBim5MYhZja0Y
+mcpRC6SeBkbmDBrDue0pg0yt3bUMDAVm1XpjxhCNu1Y+PYVtyQP4HamDOJfIfjLOVRPiE6aqHVob
+yes2rgbpsKUGSJhwHiBbMrfw6sEq3Xqwdt49JceQvkqX4H6iZ/RAi6B02NxY0T9dDw==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ o+l/VbSr1QBFO5jDJGcM6kfYFgkzvP/VJUT1Ccd/mDsE9SGikOR5bR7MCIByIGcfrkTs3//JSrFD
+0kywC/AHkJux6U06nO/VRUS90ePaXFCKpq0jJtMOoVOg1gKzMIxtxBThvjNDoGcmxrEccJQkrUFf
+jLEi1J4o8X4FmIcF3EfUGnGcAyUzUDWGeiZ3GGMPqMeDTZ4ZmFUjNXBQ/Qy8v4LUKbC/ADVUsWPo
+wMwH5CmA2XGeQWZ0YZbRL2cFqA2Q+SDoN0AfZc+5IdCngv4e9IagRgGzClL3JBUyVw7KDdCDA5Uw
+b4yjzgdMYo6eHkZmZHA8hLyGMJSDD4GcES6H2Jmg+ga1Wplr+Cypz9WlMN/LgnojYGaw1bRKPVA+
+FaW3qZEZhWPuo2HGEGZUSN0xrnwL1EyAfZ74dsiJ4XxduLaIzPyB34d81h9UK3DuAbMrztHK5KyC
+omRw7kpQSJa4pQysyTVtDhtyZyWVWrmDiiveyFy6voCxiZgCMxEDSkT4a6LU9Hw9UQ1yCFYC1nzy
+b4OSDtRnfG4voaNfbKAin68hdRNQjzp+aSzUkYnCpO+95aAELvO+tpTM9MEcOMwuwtm5eHMBnda1
+S5zRYyj2vLeIzNeAchbgsotZC3DOsAYUXAhTPvhgnFfgs7gB8As5G9BHhZwS8m67KCW4yEx/CMY3
+gHVB/cYpfib0PaHnx+63JXEf9pg5cn44mW11TFKGHi3kPvRpUD2OnMqcvDAGVLshTwJ1UeoQxtIu
+mSriwKL1gDvEDqnKJDYfdxtD+vGyI4oEhx2zGyXF8ZAwwZN5CXdS7yV/B/JWqKVevLGI5Bv+OcuI
+aokrzIHj/b8Es1Y4zkJ+Ayo62D6kAblrJL45K2BvoWcNvXqiGgF1TOhfQr0QZnyhzu+eMZfUhaBn
+in0v6eVDDQv+P4wzuPMXJhA/CupI0GsGGw26v5ooBUA9HfpcHinziDIZ+OvgR+slIffWQB43UE+M
+nQ0K8GzWez0qtVEN1BvFZwMmsscdR8FrxjhmOyi+iiGmnQ2eTNYK68G5Adgu+BeobdPYn1LJFWpQ
+VyFrcsavDZTfA7H9hD5bTxSwA+4tx99bAjkbzIeBMg2T3ryLymzWhFoo63F5NueepgJzVlDroeJL
+N4v9X6whdWl8NmBeD/JtgnP9ri+GXjFRZo9/uxl8A9g2PO8B8yL431guvnidzMtCfwH6vFDTgHkc
+JqJgPZPVpStKqN4sPu0/gbY8SGYloaYIvWs47+KLtxZL7BNmElUW27BpUCvCZ2AB6QM5hJDnRkjv
+/3zIZKLijP2b1PvKEhL7Sf4Rp0x+fth9FHfIk1xkRv2gy0iYRYE6msjs0MBMveXxwVBbEpodV4Sa
+MXXMcSS132YoKIiDQgnnkjyLDc5by0SVboSzAMpjOK9XEGIfC7gYZnOJ+hz0y+wDp4KqE8ylcEHP
+1wzcg4jpEFPJa4YZJL/HK5nwso2gGkvyeexbwa5hTtTMPWkeyUsB/4PiB86JJZdyl0FPcaAecHk+
+qGFJfXJXcGEFqgSzAg6zCVUiF5mTu7eM4CCoC+N4SfyCS+JPYC9c8PN1oMJF6pfY7vF9XQzKoKCo
+A2okoC7GhD1aS3oocL/90haQmiD0hKDvCDVjz+TZBD/heEYnl+5gop9tIH2r415jQeUM+vySwDur
+oJ7GhjxfB2qqRI0+pkCVKPeF5awGv0zHYj9NYh2OgZcyccy+toRgWlCYAKUgn1tLSOzPaN8tSm9Q
+Yy9kzIHfhfqhKLFpG/SkmKCCNZC/UHGVm8UZzUZMRtduOqF+G7H7wPug9qZKJ5RtxTFLFfww9FFx
+frweat4Szyvzwf9AzJF6313GhdxfRWqgoDB9td6Eji/bwlzKmEtUHqBWdejYEBLvQL0ltWMnndKl
+zoYUb4D7CP4RZljZkDfrmPMRk1m7hGmc19V5TErrTkl6oyEoo5N6IzzXBTkI9DwBD0O9wO2yCvQB
+2QPuI8mzKi7X5kqd0mbDDBlR/QF1DphJBh8ckINxxJPVBHO4XVPh3K/PZf1yllCR+O8CZrWJmUqd
+CZlAOyROY1yzZ1PhJeuoq592M9d7jIRXv2qJcn4Y0S+/mdF5H/cwub0cc+WTPpX5aRed0afF3ewU
+Sh837pe9rD0pfdVwjH3QLmXTu3S46LdbzS4kLpAftRsFdQkyu4rvGag94nO6SBzwZDWX3KApv1JL
+W2SVSfakllEWKSUCSUyhGlEmPhM4We4YT+4x5JV0QtU2qM9IAp+tg7kMOrFqG6j+kJwTY3su870B
+m/VBn03t0WKTWndC3wQuUCoifi61SY0BNdCUxh1UdAmpS3OBD1eB/6Qz2rTAt7CJTeqg8AgKOWBn
+Uu8bS0ktlcyL3l4Cfgw+cl7XFjAhj1cxke9UqfT3O+nUxp1MRuNuSVajsTij3gAUHqmkuu3wGqF+
+A6+diq/YAnYCdk2ntKnD7Ahz5YMee6NJACrR7J33lDC1e4cormULlfVdm33SZSYpfP8z97r9qPRJ
+0372XgsrvoEv/Luy29Vm3K1GkeRWI/7/WihJToM5d6+DpYOL19DBb1dT0fWbBFmf1ZjcDk72pPqw
+LLfKErCMLLuaYjI+6IoyWzQgVwIVJJg1YCMLN0vjy3eJ77WIuVtdIjamYsuAwmjmQjapeaco/M1q
++uSlMZB3M0lNamZ3K/aa3a7ax6R/1WaCXq8GBVyJz9OVRH0tvlaN9LQuPVwO8ZjUO/fZDIV8kAsp
+VIUYSnBIZPEmifejFTD/Ik+tNZGkdulCDYq9cHchzp+mMS6Zsxi3K7Mpz9y5JrG1a0zu8lqiJz9E
+9ItvMur1bxZM/jcr0bu/7RGW8ZZMyxd7cdf7i2zzJ0em/MNJrqDnCNw7eVmJm7S82lH8rNuKedQn
+YZ70SqXP6o7IH9ccNbtTZSlPrxbI4iq1ZIm1u9nkxl3Y92yFfaWDHi9nE1vUpZebTM0v19KSxFZt
+ie/jlZArmrvFz5U5BE43/9lropl7xgJxKPSOnxOlJlDwhD4dxEf2Wpsxe73XlMtp5bicZjH3pG2P
+5HHtfvHzVivJ1TaazuzTphPqtorSO9S5a20C7k4ry+I9pO70GVO3vxqx1z+a0rf7TLnbbQxzp1PI
+PWiWSO42SWW51XvNnxf9LLlfYc6mtWmLkmu2UWmdGvhSB5tjg16tBrsEG2Mud2iL01v0oF8rzmoD
+2zSSX6mm5dfLxWx6tTad0qgOvo9Lxf4vsVENehZU6ns1KuPDTmF2/y7mSo8uc73TkLrVZ0Df+GhI
+3/pozD7slXNPurEf6OLoZx9l3MsPByS5HXskN/Eab7fS4tw6ufR+0x7ufrOUudMhgBqz8N5XQ1HO
+VyPq0WeGy/u4X/T67+bUs69icUnLGWlJhb35y7dnzR+/PSa7XSFnrzQZspkfdOG1caF56yEWkLiC
+8RH9/KNMnNMl41J6tTnsC/ZcLTLnEls1BXuOKppanhkM6pPQCzXLf20tf1p2QnKny0yc0y2X3miT
+yLJaaNmVOkac2qQnyewy4jK69Difh8tAzYq7dGcRE16kShREQ/M2AH6RXMTnPLhogyStTU+S+l6X
+SenSFGZ90RDF9W4WpH3bLsj6oWbymqcEjfxh0Yc/zkt7a/zFvR2XqOovx+mmL9Zsz0d3puebq6y/
+KHDvh7vhh1qvR0v7agMkXe995e11geYdpeEHWp/Hy2orPPF9lDKvvu4R53UdkhbV2cpf1J+S3G6W
+yW9Vm1vklh7d8yLP2uJB0Unp3So5lflFS5TQskV8tUMoz60+wN3opuiYqs1Q/4OasTiz2Qj7IRP5
+5SqRxc2KfWbXq+SQbzKpbVoc2EJ6uw5zq1kgzWk0lzyvOSR7Xn9UdPt3A+rBFxHzuFcuft16UpzX
+eYh90i1nHvRw4qdtllx+6yE279M+5nXvfra46yT7rvsE++bzQbrg9330q29mohdfxHTBJwu2tPOE
+rLXkkqztnbekotSeffregrn9QcRk9etSSa3bqfRPu+A8sHfbGe5+m1Sa22jB3a3n2KwWfSqjXVOc
+2WIsf1C+H+xb/rj0sPhWM8vc7DRlrrYbim+1MtJ7DRbiJ60W9PWvetTtj4bcjVaKzmkTUg86afp5
+j5zJ+7qPe9t1gitt/5l913mcLX9/mq1oP0U/65OyuZ0sxCb6WbeEvvteRD3oEYnvNomZ/Ma9bF3z
+GXFHo5dZ77tQaX99gKiJPyGo5q3o+s9n2bp2W/ZV9z46+5MuE4JjqF3UNMjLoKdJfDnGpRAfoF4l
+CKlaIbj6d01xTrtM9rrsnNXD5+dkcTXabOCD5cIb33Wom9/0RS8+s9SjPkaY9auGKLpbVZjwbYsk
+qV9XntlMWdypPCR/XWhjVlLouufda3fzvGI76bPqI7KbjRJJVpspwSqXu3UgT2NwnOPSenUxJlSV
+2l+eJYqt3ijK/cWEKvpmyXR/dpZ+eucv7S/2F39678P90ukt/lTvw33tucj29XhI+0oCD7VkhR9v
+So30KvOPDS29EH2g/UYk3febi7SnMXD/+3sx5l3vwqUfmv1lbY2+TE37OXw/T7Cv+q24F/37RJnf
+d1Kpfeqy5w0nzAtKneQPmw+JX37Yz9zrp9nHnVLpuwZr8+aiAGlJk734VdNRSVHLz7LCChtZcaWj
+eWX+Bcm7pjOyFzUnJG9qTkjzGk5xL9qtmFcde6TP67A9lh+V5ReflBZUnMQ+z8w0vXOL0PfeAkFM
+9VrBrX9oCR7zpnRhz35Ja52XvLM0SN5TGSTpbLgk7mm6JO1q8GNa3tsJi/9mISz+w5wq/sVKVP7l
+IPP+o724v95b9qky2KrzfrT0U2MAU/7+FPOiS85e6zamQt6sZoJerqIjalTpqx/14XuSp/VWZi/K
+zsqfl56Q55Tvk92uN5Pfq7Q0u11pwT5olXKP3supJ50c96LZSpJff1z6vPaY9FHLQcnDNkvq9ndD
+6n6fgMXxl3vRYiUtL7eX1FS5yBsrLll0FoYden874WjL1YQDHfdi9/W8iJb0VXlLm8u9JCXV1szL
+HnPuXctJrqnKxbzrTdje7udRh1tvxJ9oSo09U5cQe7YmNvJUQ1LM4ZasSLO+vCC2/4OHqPqXI4L7
+vxtC/Uf6c/AkiXPGbDr5vRpzpU+Pu9yrB74NYpfI5elsk+SPqmxB/wHztjdBlq154RY1Bb772p9E
+7W1/GSWubLQTFX63MLrHawg9n84V7LUbaqhnhhjGSkHidH2ONKfW0rL9ZeTR1puJZxrS0g42308w
+qyvyhrjG3WyiJVcaTCU5+D69enfWvDbPR/6y/GfuaqOJ7GazBPwM19bgdqQ1KxrbXHT8O89In2Lf
+KLDBfV13Isz680Nkn14HWX64H25fG05sMqvYJeJOsXNE2jv3yBNNyVEybLf7OnMiDrbeiJb1VgRK
+e5v89na8iGTr+2wEubwBnfVdR5TQuZX1eLSQufxlt/nj6tOyR+0HqYw/dlGB71YKwg==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 1hYGhhE5+WSIZWNpg1dua9ftaedtUmy0Omoqo/8FhBFt1zE21/UL0o51aIk72qQdZdPout+VZxPH
+VP04BonJQEnJWVKQ2fxKdUI29OWatGRycVuk1budf8Fy5GGhGv2WPD/evn0FOaXw70lH6Vttme11
+Ou3sAMjtu97ArWvyGB0Et/G2GipibbCg1YtGfPI2rcjYXDFKWmXVATrMFRdIP1VigTnRk65XZwRe
+DBut7uR3925Ja09kSlqa6NR+FDg1wyBorWA381IdDibEijgbtDsqNtV649T6Ww+LsfZBuA6mk163
+31mfgJiSp2MLNNfp9ard/1j0KOh6bIB8WG/0ug25hnmA5qKg83Tldb4yR8Vpr6dICfm8GDyVXjAL
+jFhmBI4n+bgPDnenV25M4N3TAdAdHjYak+fyu9ZtATWd0VFe31L/uIZ11xGqiktHXI3JGUd5epyK
++ARJM4amOMmrKaBg8vv6aee3Ts9tNSXJZ1hOWzrBRcgNpgpNM/a9lkG2/2fQL3ek23E8cYDKfXw8
+EacdBF9WJyE0bInr1elwOOqMx+skSLOOims4UgVZ7Pbs9Bxo0lIxwIr8+7vXh8cRQOOo2wTtP55Z
+1j+6ixX0r2vV+uj22iOF+xXxqDzFPxNVNAY+JpPhXizWH0cbeLoy2hp8x6qN3zrFwQj8ghgdpWKz
+Sez6vn7T5Db5fezcHBMhVWaQ24f/mwthiyjaEVGaJLGb/LjXbXXmmL0rbf6JVDEZ4bS8LnuTKHCi
+HkZdMM3moIDZV1fEsovOPEF5n/eHLOU8z/ZDJxb/xDlylBAVvU/zX902udfF6yzl9n/yJCMJJsp6
+n+Tvc0zw9z99cswcMnkeeTyPLP5jBWl1MB21OlnMZ5lTpv5x43r71z9Dum/3xy+/NUbj/aD7pBWV
+/l/W5X8idprdfhumSntADiCx2pmcEzS4Y0jf+k+WH/1B327I+vn1Bq0vNM7d56a0/GeYcr/hVVPg
+nnkh/H8Uo+/95pnVsemfTMU4vdZ0DAbknyvJ/jg63Bs3MKEJY5wgOryS4x/OF1WMlv5lhvKno+W7
+M2m0YYlWZKcklhzOZlsOcnkhdl3jsAUDK5Gm1qAnR8pYQYn9DBttLWwqhWPGw4HckajwbnvYjZpa
+fZNyVYafGr2uxnKZo/XMdDJYrzTGk87IMvhHryvjXv/qg+4ZTCfr79LupUPT7njQa0w6601MQZTv
+3zNHo2uDoS4UbXxG4qW6p2rArNQbNBu9Smc47SlpqLAQD2eddnf6vV7pANypnEinLgkZmrprAXQ8
+HSrBvM5o/XLUwSs1NWuB1oJuGPY764w/VASR2L0OjLxSlOGNi+lkCFhyfsc4X/TLjcggS5obDYa4
+vSRlsM9qdhMNkV1NPJ5jDupXpr3OSO/3a9dckksSz+QbYQCVmdGkOWiM2uv0LJPpcKSGJTMV6ReO
+km7b0yBXOr3aoCJBJaO4HIy76t4HowzE+yu0ClsiuaOxMlh5j/F8lvGVFrrYMKUF02fI4rTRf582
+3jvrl4OhQuJ4cDeuiwM3FAy1yFY+A+yg7gC4tm1qJO3WdKSYebRtK6PyxueTUaM/HjZAxLV+h4F1
+2+tjK7ZOrA8bQyD+cfd72mtoVKnfwLEYFK0NyrWlNlPXpjoE4kEAVm2rrE6u0f+tMdZ2J2iD1CEc
+PPqts467seuFdnfSaHZ7arTdcavpstfod0hCNnkDd+dUbEV4inLbHlMuJCXx9Xqj3x1/AKvodvfs
+thtave4QEIBGx78Bq++wBLJcFjVcGd4YEXkS+Q2gA9ZACmpbguSYdJylBdfhqnPGnQb99pndOIcK
+cgdKsF8eJtnxFBPuO54o2whIEPg6xGC26zrpxMP7Vpj1PABt0sYR2BKGJi2P+u3Ov6ud1qDf1gH1
+ss+rzlradNVPHJOCvCyW2oV5rTwPQpv5zCi8Tr7YHY0VsJjp42XFZO09u2R2QAn3OLGi/VaV/VsB
+KeeRotaVDzqboFovkd317ODft3eKzojpbl8waVfz5QwGaYrbOGegf7rAzIrCGZtk7sy++sfgX+Wu
+soHrAivw//7v/51VxzHNU4p1+1+98SQ6bo3eRj9GrFk0a2lbjPuyED3qf63jgZB1w06pKrNNenKI
+Z1gUi4FcFnKZL8qmVPRz0BwMJ5JA0xthzPrxoLl+IT3SGVyiqBd5xlYWMn8Gk/2GrKlj2a6CwUw1
+d3QU5/MdRBg+5A4vth9CyZuDnf3GbfiY3b6IZNOj0vfH3nvfd1z0hQM7uW4jOt4SrssFYXMvfV1K
+nXGHe6ePO2fp0bQlFgvMWdwPxtUmRY3zn/n3MLWV3n+O7qaT4eE4PT5hYmv+9P6pb6Q0Op5k38tX
+p+kk16nmugepVj4a3XmfAXXavgN4Yr7o3xPvS5P851OWu4+EM9+D0zHQ1uQjlBI2p8U8t3WT/ezt
+3Kz582/UcdOysy0x8SbWrx4eM7VctG4PVN9u7ymd/Co+pffG0e9QPuyfFgOl9tuanyCr+PpyMc2/
+Pd2I2V66d7v3lv2Y5D7Ee9qAjtftfIs+/UknD3dupH5gyOPc8/vzAD5t/+SP2ke+bCT+uZWpRjb7
+0hhuG+3pmj/xGQi1Ci3+KpD74F72kxk/ux3KnodfQ+ncznUx15nupurHmx/7rVbjCz91Q4W30w8J
+Mk3FGuKou/W6130+bmd7/sOdyCj0OM2cVrd/cPzB9P7xB7vmF/brT+lMv7XzHTo424+J348HXVGM
+jd/YzKh1RIe+9mi1x1b+eFwHtIk7HfGGpdp73VysAetLnx0EIuFOtidefkszuDv1p3NHyc2bQjjB
+j2Fdjh6EzZSYGzyHkvX2wx7T3Hwi3ab6fphQStjdxCV5EG6Eqz7iKZX9CgoRmTTr7VOKfto8y8ca
+ye2iL3Q/QigCPngmvZAma36quXHEkc+hVDEpf0reFE6k5rlw4VXqjLljjoB0b6lQKlUIM/nD9wO5
+n5uD5H778/yZrKQ6YOjvIsvLUKBR9lgdwJM2ADpwUMFGHY78xvuy+ReC6nxnfMgJ98JnK1PLf4by
+b7GTn0KjsbOVFZrXV4lL/+115iKXvcy/Vbs/6Z+nvfc1f5a7q71IyLwX2veFFzpUz3K3mYti/vPm
+Jdf9FGL7b9/+92LubZcGBKZeRbHSHmjw4tWf75PMxenuSTEfbJ9IuFEQLdE+rP5kGL0KHdYbP9KE
+UkK8kd6vTTYytePJdHZqJszq8KAsxO3Ip3RVBc65yIEiLNy3/e/Ma/IwTxUf0ywhgeRrspgH6tgN
+h7KDxLN5rYyY1S+sshAS5Rx+jKcESzAXPZ6OT0uZl2OaUEwyNNx/LQbeTqIZKlm7Z4Jbz0lpIEZ0
+CNNKolMMbA+DuQ+h8lUInUaLGqUCA9wNUMJUC22k0DQw1fc2TG0zmHv/KIzF/dZ1JSPeMzfmNbgs
+9+qGvjdKhUi4mbBaksRX5yS35s/UztohkDCpRD57evdlNVrSUteudCe+AdMUGIopcWezlDO5LAYv
+e/vFPH/PhFKl18iaX5sXzKr1VizkeTErRC7qROBE6XI9TIDmY6/D3eznpP2d7fXrg0zt43YLujgJ
+qR0MC+HBOVPcjogPmcrbxw689rSdFUKnH5K0DObfdsoCjHbwIUnBQv22rIhwAHDyVGOL6feDWxTw
+r/km93GTufa3xsZ225lK7aEX/+xFkkSiaYoAoGjPB8dUMvsVGHaLyRId0Mn2+8puQ48T0CU6YU1T
+zWkhcPBzo2ka01Og5MBEfIfhdaozz+Ovof2j8RtI7NYmn6WnvYdM9fU4Jz9NZF7TyXIuCk1e6yAF
+Trez9P30JVOd1jjtKWkMcgx++E6PWnvb0mrp+TN2lzy8yPXFytt7gG4+X2fYbd9WAWk6R5dyp2n8
+lKKOS/QB1WnuHdLhQO5Q/S2lvbHm11qSX/FrFkVhjrxIvgrVU+YKnx5IbysAcvhbVuosk4wURT6S
+rzAv98MCNkmSxvg1v+ZXh5fFRudaPxIUhGfsIq0OPqW+sU+a4GguyZDU6WbIQNb8ZJrShHFQ4mX5
+rIa/7ZPONCikCzOKlCGbgZKvan9VGYr6NnlnH5+TaRxqqCTNyfAkLPbf969UFFQJPlUoSdPSweob
+F8piaRdYCNMyyFCkdxBZWt9kGgRPRnQckFlpX0lnKuSSxRjSlnNJuS+JNGTySe1RAmr8KpEFSH47
+wrAlC2x8qs5KIxVLZJEHQMmzyDqQ5ko4R0HHgTZnbHxhhVQTp6oIPJAwZpomwcmesYtD42hyKmSJ
+pk1ASWON64CStdUyrGpKo1rSHDGRsWCVfXWEl6rwkIiUPJB5n3Q7P6qd6YWgnGCR9CzTmJUAJFNT
+WXM+MpSWROUhSVqSMVaEOB28IJ8k9OM0yODxz73R9NvN1Oon/WJ6p1MDS/+N0SuMRKYPuvL9tPh6
+drdX9O1GQYvhvOKKto9sgeWS/0rfbF6/57rPL+lC6+tnW1JlOnOCn1zauzN6syN0Q9wZ8MWMDg0Z
+aP49EjyUTL/Lo+CjpuMM3ha1ma7vBBK5j2nlPn9y8pPVTyj70slU+vmLdPV51AQLtpf+po1QQsR3
+2Dunei/JyGtxYH4a2wg+gBNaHxZa4VosK4SZiM5vpLPN93xnt1DWbCu0lI6nCQ0xshX2GL/QuW56
+IwJcU/RtE73i4E0yz2Y6uOXgtcggdlZ5zOC4wFICa52/X8Y58eCaoKW0pHPiwTWRrT6VQiM4Ncll
+Nvi+z1+ahxLvRUdleQ2u/V+yfXR7nCVmrIYnrat/lmdBHGnFnyo/5k+ywg4ACDazV+mH3eyV/2lC
+zGEUFaIFnvS+CCH7lHASzR99ig0NbeBZIOJk9Gf6ZbHeO61lLq5PgNyBOyXi1AZi51RI+EwJwq7K
+AKVsT3h/INb/ml+z/2cH2rnIl778HWCvqyQGNVrwKTwpDTeaiURonzs3dntq46QkdyQJU8pUe+kQ
+vP3+Q7cqhxdM+tqXkD3V2m4HkPXFuTj9zP3XZu7j0bcHA355UVb/KQrTjQLvZ7/OQuCIXL5xKoPs
+oWPwnP1iDnzaA5XYqb32d4/CZTo2+MhCtpgsPEbVXsTi89PuZrHQnwJXMv7Ed1yirPBW7CEutk6P
+s1eXadAWd9/n8kCnd/7M1Xm1jr628uDmk5VxPNimxK9p85I6HUZ7pfFFZ2SCLHOlCfaqIa/5VZIs
+pkejj2tu7+zmkADYpw73X9G7y1FvidyRru+LYbac5aZZig5fj32GNXh4ziT2TyLqgxr3E+1miC9W
+CKdHG8fl4m4wzIG4ugH/Jtzug3aqFIsvQd8HzpRNJ5vP/fTNVWh77yNU7YLyS3wSOtdJ55kARjmS
+Px7tvko0NksxvkJKaqnyr6Ezb9zLCJltogExDuPGv6wWdHTmXt1AkHvBFRy85brjroBRhchDhTou
+/ORMPXrw8nXdXvlAcyvcy4L5ctIjTfbouA9s/mLw7nKSObmj29IyHpyct/Pt70RYIQ==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+revnXNVvobuhLOr6OYfL7PIr563r51zVzwslezqy6FjVz/KW5gXq+i2bybWK04pyJteKEpHsqvrN
+V7/Svq7fHHHLJer6GdfcY3WGuev6zX9CdZG6flbpiO5n4eat6+dGyaup6+es6NZctta81vXzkJW2
+grp+Sv6WdVU/c5x/0bp+89PYInX9rNIRV5Hzbqzr59yLez2+ZUvZKvX4VlHXzznxXd2xWrKun/Mx
+N+tbaOav6+fsqc2etV6srp81RytV/dzzXr3V9XNGpbaTuFxdP+cD12szbspidf3myUpbVd6Duaqf
+rW05Z12/ZXjfe10/xzTJkC4jdal+nG/xmKMe3wrqWHWWrOun9WK1baV6SUvW9XOu6ifx/vJ1/Zxj
+BWv+1dT1syN2qaqfY8bQHHX9nPebLeXYAnX95jlFsHhdP/0J6tmqfovX45unuKZTPb4l2FDXCzLh
+krc3qHX9HOJfmn5xNu091PWb70adRev6OTvUqoRZsq6fmr9lmWCi9169hqSt6vo5mznkvOUK6vo5
+V/VbTT0+tyxcr/X4lotmafX4lqvrp/RinYU715kri7p+3pLhLWPjC9T1c06Gl+olLQ==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ nWInprXciqRRSKuJ6kpag2a5lFYvuAoS6303amm1FBrBZk3UiG1HYM9iuAlYWScnHZUcKSGSbOk/
+YGUCQQduyCVbNt40korIkQRpxJJRHWd0iSWq6RCxyknOCiSpwfomURNvGxN6Oc6TklS6lTG2ufQG
++FXzjaFB84geJXnLQJfTbRYsr2joDJUT4c8noWoQndY0ujY7l/7/3iqSAE8OnSuttCkikmO51rJL
+gumQRW0aRFAlcdjeS0YUZv2bwHoy4Rr8M2OJlqdrtV7GEKlZ+R5ZYqFIrRyBq5+1BzuVC8uVa8IN
+XJrUkjEIOSdQ7Xa3QaSlY2QtWkbg60wpS5Jk2IS8g2GZeN9xRC3mEt1YbM8rcVQllxxBpFrDNx9O
+S66qwUmtLPnosLBqiyOI1KyhRVYRnSNgy3IerPWwvYVTeb8srejkqLPCfq2ckW5La5lIzZoGhUJJ
+pOly+2FTp/BE0s5zBKnkvW2dqola7GM6SZKTkdMY1owlaqhRPd0YIkn3h24gsVXKqc2CUUQNaZ4u
+m5k0T4DbjfXhNtLdveflutB0Ollbe7D1Yuc/9rdevdnZn7z4sPU/O93W3t7bg62DnXe8073Y3/lw
+8HZ/p/vw8u3v8oSPHJKvrd29/93k/wCIBNbC
+ ]]>
+</i:pgf>
+</svg>
diff --git a/web/stream.gathering.org/resources/images/thegathering.png b/web/stream.gathering.org/resources/images/thegathering.png
new file mode 100644
index 0000000..da1752e
--- /dev/null
+++ b/web/stream.gathering.org/resources/images/thegathering.png
Binary files differ
diff --git a/web/stream.gathering.org/resources/js/videojs-contrib-hls.js b/web/stream.gathering.org/resources/js/videojs-contrib-hls.js
new file mode 100644
index 0000000..d36bd99
--- /dev/null
+++ b/web/stream.gathering.org/resources/js/videojs-contrib-hls.js
@@ -0,0 +1,11691 @@
+/**
+ * videojs-contrib-hls
+ * @version 2.0.1
+ * @copyright 2016 Brightcove, Inc
+ * @license Apache-2.0
+ */
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.videojsContribHls = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+var textRange = function textRange(range, i) {
+ return range.start(i) + '-' + range.end(i);
+};
+
+var formatHexString = function formatHexString(e, i) {
+ var value = e.toString(16);
+
+ return '00'.substring(0, 2 - value.length) + value + (i % 2 ? ' ' : '');
+};
+var formatAsciiString = function formatAsciiString(e) {
+ if (e >= 0x20 && e < 0x7e) {
+ return String.fromCharCode(e);
+ }
+ return '.';
+};
+
+var utils = {
+ hexDump: function hexDump(data) {
+ var bytes = Array.prototype.slice.call(data);
+ var step = 16;
+ var result = '';
+ var hex = undefined;
+ var ascii = undefined;
+
+ for (var j = 0; j < bytes.length / step; j++) {
+ hex = bytes.slice(j * step, j * step + step).map(formatHexString).join('');
+ ascii = bytes.slice(j * step, j * step + step).map(formatAsciiString).join('');
+ result += hex + ' ' + ascii + '\n';
+ }
+ return result;
+ },
+ tagDump: function tagDump(tag) {
+ return utils.hexDump(tag.bytes);
+ },
+ textRanges: function textRanges(ranges) {
+ var result = '';
+ var i = undefined;
+
+ for (i = 0; i < ranges.length; i++) {
+ result += textRange(ranges, i) + ' ';
+ }
+ return result;
+ }
+};
+
+exports['default'] = utils;
+module.exports = exports['default'];
+},{}],2:[function(require,module,exports){
+/*
+ * aes.js
+ *
+ * This file contains an adaptation of the AES decryption algorithm
+ * from the Standford Javascript Cryptography Library. That work is
+ * covered by the following copyright and permissions notice:
+ *
+ * Copyright 2009-2010 Emily Stark, Mike Hamburg, Dan Boneh.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * official policies, either expressed or implied, of the authors.
+ */
+
+/**
+ * Expand the S-box tables.
+ *
+ * @private
+ */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+var precompute = function precompute() {
+ var tables = [[[], [], [], [], []], [[], [], [], [], []]];
+ var encTable = tables[0];
+ var decTable = tables[1];
+ var sbox = encTable[4];
+ var sboxInv = decTable[4];
+ var i = undefined;
+ var x = undefined;
+ var xInv = undefined;
+ var d = [];
+ var th = [];
+ var x2 = undefined;
+ var x4 = undefined;
+ var x8 = undefined;
+ var s = undefined;
+ var tEnc = undefined;
+ var tDec = undefined;
+
+ // Compute double and third tables
+ for (i = 0; i < 256; i++) {
+ th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
+ }
+
+ for (x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
+ // Compute sbox
+ s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
+ s = s >> 8 ^ s & 255 ^ 99;
+ sbox[x] = s;
+ sboxInv[s] = x;
+
+ // Compute MixColumns
+ x8 = d[x4 = d[x2 = d[x]]];
+ tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
+ tEnc = d[s] * 0x101 ^ s * 0x1010100;
+
+ for (i = 0; i < 4; i++) {
+ encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
+ decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
+ }
+ }
+
+ // Compactify. Considerable speedup on Firefox.
+ for (i = 0; i < 5; i++) {
+ encTable[i] = encTable[i].slice(0);
+ decTable[i] = decTable[i].slice(0);
+ }
+ return tables;
+};
+var aesTables = null;
+
+/**
+ * Schedule out an AES key for both encryption and decryption. This
+ * is a low-level class. Use a cipher mode to do bulk encryption.
+ *
+ * @constructor
+ * @param key {Array} The key as an array of 4, 6 or 8 words.
+ */
+
+var AES = (function () {
+ function AES(key) {
+ _classCallCheck(this, AES);
+
+ /**
+ * The expanded S-box and inverse S-box tables. These will be computed
+ * on the client so that we don't have to send them down the wire.
+ *
+ * There are two tables, _tables[0] is for encryption and
+ * _tables[1] is for decryption.
+ *
+ * The first 4 sub-tables are the expanded S-box with MixColumns. The
+ * last (_tables[01][4]) is the S-box itself.
+ *
+ * @private
+ */
+ // if we have yet to precompute the S-box tables
+ // do so now
+ if (!aesTables) {
+ aesTables = precompute();
+ }
+ // then make a copy of that object for use
+ this._tables = [[aesTables[0][0].slice(), aesTables[0][1].slice(), aesTables[0][2].slice(), aesTables[0][3].slice(), aesTables[0][4].slice()], [aesTables[1][0].slice(), aesTables[1][1].slice(), aesTables[1][2].slice(), aesTables[1][3].slice(), aesTables[1][4].slice()]];
+ var i = undefined;
+ var j = undefined;
+ var tmp = undefined;
+ var encKey = undefined;
+ var decKey = undefined;
+ var sbox = this._tables[0][4];
+ var decTable = this._tables[1];
+ var keyLen = key.length;
+ var rcon = 1;
+
+ if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
+ throw new Error('Invalid aes key size');
+ }
+
+ encKey = key.slice(0);
+ decKey = [];
+ this._key = [encKey, decKey];
+
+ // schedule encryption keys
+ for (i = keyLen; i < 4 * keyLen + 28; i++) {
+ tmp = encKey[i - 1];
+
+ // apply sbox
+ if (i % keyLen === 0 || keyLen === 8 && i % keyLen === 4) {
+ tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
+
+ // shift rows and add rcon
+ if (i % keyLen === 0) {
+ tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
+ rcon = rcon << 1 ^ (rcon >> 7) * 283;
+ }
+ }
+
+ encKey[i] = encKey[i - keyLen] ^ tmp;
+ }
+
+ // schedule decryption keys
+ for (j = 0; i; j++, i--) {
+ tmp = encKey[j & 3 ? i : i - 4];
+ if (i <= 4 || j < 4) {
+ decKey[j] = tmp;
+ } else {
+ decKey[j] = decTable[0][sbox[tmp >>> 24]] ^ decTable[1][sbox[tmp >> 16 & 255]] ^ decTable[2][sbox[tmp >> 8 & 255]] ^ decTable[3][sbox[tmp & 255]];
+ }
+ }
+ }
+
+ /**
+ * Decrypt 16 bytes, specified as four 32-bit words.
+ * @param encrypted0 {number} the first word to decrypt
+ * @param encrypted1 {number} the second word to decrypt
+ * @param encrypted2 {number} the third word to decrypt
+ * @param encrypted3 {number} the fourth word to decrypt
+ * @param out {Int32Array} the array to write the decrypted words
+ * into
+ * @param offset {number} the offset into the output array to start
+ * writing results
+ * @return {Array} The plaintext.
+ */
+
+ _createClass(AES, [{
+ key: 'decrypt',
+ value: function decrypt(encrypted0, encrypted1, encrypted2, encrypted3, out, offset) {
+ var key = this._key[1];
+ // state variables a,b,c,d are loaded with pre-whitened data
+ var a = encrypted0 ^ key[0];
+ var b = encrypted3 ^ key[1];
+ var c = encrypted2 ^ key[2];
+ var d = encrypted1 ^ key[3];
+ var a2 = undefined;
+ var b2 = undefined;
+ var c2 = undefined;
+
+ // key.length === 2 ?
+ var nInnerRounds = key.length / 4 - 2;
+ var i = undefined;
+ var kIndex = 4;
+ var table = this._tables[1];
+
+ // load up the tables
+ var table0 = table[0];
+ var table1 = table[1];
+ var table2 = table[2];
+ var table3 = table[3];
+ var sbox = table[4];
+
+ // Inner rounds. Cribbed from OpenSSL.
+ for (i = 0; i < nInnerRounds; i++) {
+ a2 = table0[a >>> 24] ^ table1[b >> 16 & 255] ^ table2[c >> 8 & 255] ^ table3[d & 255] ^ key[kIndex];
+ b2 = table0[b >>> 24] ^ table1[c >> 16 & 255] ^ table2[d >> 8 & 255] ^ table3[a & 255] ^ key[kIndex + 1];
+ c2 = table0[c >>> 24] ^ table1[d >> 16 & 255] ^ table2[a >> 8 & 255] ^ table3[b & 255] ^ key[kIndex + 2];
+ d = table0[d >>> 24] ^ table1[a >> 16 & 255] ^ table2[b >> 8 & 255] ^ table3[c & 255] ^ key[kIndex + 3];
+ kIndex += 4;
+ a = a2;b = b2;c = c2;
+ }
+
+ // Last round.
+ for (i = 0; i < 4; i++) {
+ out[(3 & -i) + offset] = sbox[a >>> 24] << 24 ^ sbox[b >> 16 & 255] << 16 ^ sbox[c >> 8 & 255] << 8 ^ sbox[d & 255] ^ key[kIndex++];
+ a2 = a;a = b;b = c;c = d;d = a2;
+ }
+ }
+ }]);
+
+ return AES;
+})();
+
+exports['default'] = AES;
+module.exports = exports['default'];
+},{}],3:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _stream = require('../stream');
+
+var _stream2 = _interopRequireDefault(_stream);
+
+/**
+ * A wrapper around the Stream class to use setTiemout
+ * and run stream "jobs" Asynchronously
+ */
+
+var AsyncStream = (function (_Stream) {
+ _inherits(AsyncStream, _Stream);
+
+ function AsyncStream() {
+ _classCallCheck(this, AsyncStream);
+
+ _get(Object.getPrototypeOf(AsyncStream.prototype), 'constructor', this).call(this, _stream2['default']);
+ this.jobs = [];
+ this.delay = 1;
+ this.timeout_ = null;
+ }
+
+ _createClass(AsyncStream, [{
+ key: 'processJob_',
+ value: function processJob_() {
+ this.jobs.shift()();
+ if (this.jobs.length) {
+ this.timeout_ = setTimeout(this.processJob_.bind(this), this.delay);
+ } else {
+ this.timeout_ = null;
+ }
+ }
+ }, {
+ key: 'push',
+ value: function push(job) {
+ this.jobs.push(job);
+ if (!this.timeout_) {
+ this.timeout_ = setTimeout(this.processJob_.bind(this), this.delay);
+ }
+ }
+ }]);
+
+ return AsyncStream;
+})(_stream2['default']);
+
+exports['default'] = AsyncStream;
+module.exports = exports['default'];
+},{"../stream":13}],4:[function(require,module,exports){
+/*
+ * decrypter.js
+ *
+ * An asynchronous implementation of AES-128 CBC decryption with
+ * PKCS#7 padding.
+ */
+
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+var _aes = require('./aes');
+
+var _aes2 = _interopRequireDefault(_aes);
+
+var _asyncStream = require('./async-stream');
+
+var _asyncStream2 = _interopRequireDefault(_asyncStream);
+
+var _pkcs7 = require('pkcs7');
+
+/**
+ * Convert network-order (big-endian) bytes into their little-endian
+ * representation.
+ */
+var ntoh = function ntoh(word) {
+ return word << 24 | (word & 0xff00) << 8 | (word & 0xff0000) >> 8 | word >>> 24;
+};
+
+/* eslint-disable max-len */
+/**
+ * Decrypt bytes using AES-128 with CBC and PKCS#7 padding.
+ * @param encrypted {Uint8Array} the encrypted bytes
+ * @param key {Uint32Array} the bytes of the decryption key
+ * @param initVector {Uint32Array} the initialization vector (IV) to
+ * use for the first round of CBC.
+ * @return {Uint8Array} the decrypted bytes
+ *
+ * @see http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
+ * @see http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Block_Chaining_.28CBC.29
+ * @see https://tools.ietf.org/html/rfc2315
+ */
+/* eslint-enable max-len */
+var decrypt = function decrypt(encrypted, key, initVector) {
+ // word-level access to the encrypted bytes
+ var encrypted32 = new Int32Array(encrypted.buffer, encrypted.byteOffset, encrypted.byteLength >> 2);
+
+ var decipher = new _aes2['default'](Array.prototype.slice.call(key));
+
+ // byte and word-level access for the decrypted output
+ var decrypted = new Uint8Array(encrypted.byteLength);
+ var decrypted32 = new Int32Array(decrypted.buffer);
+
+ // temporary variables for working with the IV, encrypted, and
+ // decrypted data
+ var init0 = undefined;
+ var init1 = undefined;
+ var init2 = undefined;
+ var init3 = undefined;
+ var encrypted0 = undefined;
+ var encrypted1 = undefined;
+ var encrypted2 = undefined;
+ var encrypted3 = undefined;
+
+ // iteration variable
+ var wordIx = undefined;
+
+ // pull out the words of the IV to ensure we don't modify the
+ // passed-in reference and easier access
+ init0 = initVector[0];
+ init1 = initVector[1];
+ init2 = initVector[2];
+ init3 = initVector[3];
+
+ // decrypt four word sequences, applying cipher-block chaining (CBC)
+ // to each decrypted block
+ for (wordIx = 0; wordIx < encrypted32.length; wordIx += 4) {
+ // convert big-endian (network order) words into little-endian
+ // (javascript order)
+ encrypted0 = ntoh(encrypted32[wordIx]);
+ encrypted1 = ntoh(encrypted32[wordIx + 1]);
+ encrypted2 = ntoh(encrypted32[wordIx + 2]);
+ encrypted3 = ntoh(encrypted32[wordIx + 3]);
+
+ // decrypt the block
+ decipher.decrypt(encrypted0, encrypted1, encrypted2, encrypted3, decrypted32, wordIx);
+
+ // XOR with the IV, and restore network byte-order to obtain the
+ // plaintext
+ decrypted32[wordIx] = ntoh(decrypted32[wordIx] ^ init0);
+ decrypted32[wordIx + 1] = ntoh(decrypted32[wordIx + 1] ^ init1);
+ decrypted32[wordIx + 2] = ntoh(decrypted32[wordIx + 2] ^ init2);
+ decrypted32[wordIx + 3] = ntoh(decrypted32[wordIx + 3] ^ init3);
+
+ // setup the IV for the next round
+ init0 = encrypted0;
+ init1 = encrypted1;
+ init2 = encrypted2;
+ init3 = encrypted3;
+ }
+
+ return decrypted;
+};
+
+exports.decrypt = decrypt;
+/**
+ * The `Decrypter` class that manages decryption of AES
+ * data through `AsyncStream` objects and the `decrypt`
+ * function
+ */
+
+var Decrypter = (function () {
+ function Decrypter(encrypted, key, initVector, done) {
+ _classCallCheck(this, Decrypter);
+
+ var step = Decrypter.STEP;
+ var encrypted32 = new Int32Array(encrypted.buffer);
+ var decrypted = new Uint8Array(encrypted.byteLength);
+ var i = 0;
+
+ this.asyncStream_ = new _asyncStream2['default']();
+
+ // split up the encryption job and do the individual chunks asynchronously
+ this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));
+ for (i = step; i < encrypted32.length; i += step) {
+ initVector = new Uint32Array([ntoh(encrypted32[i - 4]), ntoh(encrypted32[i - 3]), ntoh(encrypted32[i - 2]), ntoh(encrypted32[i - 1])]);
+ this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));
+ }
+ // invoke the done() callback when everything is finished
+ this.asyncStream_.push(function () {
+ // remove pkcs#7 padding from the decrypted bytes
+ done(null, (0, _pkcs7.unpad)(decrypted));
+ });
+ }
+
+ // the maximum number of bytes to process at one time
+ // 4 * 8000;
+
+ _createClass(Decrypter, [{
+ key: 'decryptChunk_',
+ value: function decryptChunk_(encrypted, key, initVector, decrypted) {
+ return function () {
+ var bytes = decrypt(encrypted, key, initVector);
+
+ decrypted.set(bytes, encrypted.byteOffset);
+ };
+ }
+ }]);
+
+ return Decrypter;
+})();
+
+exports.Decrypter = Decrypter;
+Decrypter.STEP = 32000;
+
+exports['default'] = {
+ Decrypter: Decrypter,
+ decrypt: decrypt
+};
+},{"./aes":2,"./async-stream":3,"pkcs7":18}],5:[function(require,module,exports){
+/*
+ * index.js
+ *
+ * Index module to easily import the primary components of AES-128
+ * decryption. Like this:
+ *
+ * ```js
+ * import {Decrypter, decrypt, AsyncStream} from './src/decrypter';
+ * ```
+ */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+var _decrypter = require('./decrypter');
+
+var _asyncStream = require('./async-stream');
+
+var _asyncStream2 = _interopRequireDefault(_asyncStream);
+
+exports['default'] = {
+ decrypt: _decrypter.decrypt,
+ Decrypter: _decrypter.Decrypter,
+ AsyncStream: _asyncStream2['default']
+};
+module.exports = exports['default'];
+},{"./async-stream":3,"./decrypter":4}],6:[function(require,module,exports){
+/**
+ * Utilities for parsing M3U8 files. If the entire manifest is available,
+ * `Parser` will create an object representation with enough detail for managing
+ * playback. `ParseStream` and `LineStream` are lower-level parsing primitives
+ * that do not assume the entirety of the manifest is ready and expose a
+ * ReadableStream-like interface.
+ */
+
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+var _lineStream = require('./line-stream');
+
+var _lineStream2 = _interopRequireDefault(_lineStream);
+
+var _parseStream = require('./parse-stream');
+
+var _parseStream2 = _interopRequireDefault(_parseStream);
+
+var _parser = require('./parser');
+
+var _parser2 = _interopRequireDefault(_parser);
+
+exports['default'] = {
+ LineStream: _lineStream2['default'],
+ ParseStream: _parseStream2['default'],
+ Parser: _parser2['default']
+};
+module.exports = exports['default'];
+},{"./line-stream":7,"./parse-stream":8,"./parser":9}],7:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _stream = require('../stream');
+
+var _stream2 = _interopRequireDefault(_stream);
+
+/**
+ * A stream that buffers string input and generates a `data` event for each
+ * line.
+ */
+
+var LineStream = (function (_Stream) {
+ _inherits(LineStream, _Stream);
+
+ function LineStream() {
+ _classCallCheck(this, LineStream);
+
+ _get(Object.getPrototypeOf(LineStream.prototype), 'constructor', this).call(this);
+ this.buffer = '';
+ }
+
+ /**
+ * Add new data to be parsed.
+ * @param data {string} the text to process
+ */
+
+ _createClass(LineStream, [{
+ key: 'push',
+ value: function push(data) {
+ var nextNewline = undefined;
+
+ this.buffer += data;
+ nextNewline = this.buffer.indexOf('\n');
+
+ for (; nextNewline > -1; nextNewline = this.buffer.indexOf('\n')) {
+ this.trigger('data', this.buffer.substring(0, nextNewline));
+ this.buffer = this.buffer.substring(nextNewline + 1);
+ }
+ }
+ }]);
+
+ return LineStream;
+})(_stream2['default']);
+
+exports['default'] = LineStream;
+module.exports = exports['default'];
+},{"../stream":13}],8:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _stream = require('../stream');
+
+var _stream2 = _interopRequireDefault(_stream);
+
+// "forgiving" attribute list psuedo-grammar:
+// attributes -> keyvalue (',' keyvalue)*
+// keyvalue -> key '=' value
+// key -> [^=]*
+// value -> '"' [^"]* '"' | [^,]*
+var attributeSeparator = function attributeSeparator() {
+ var key = '[^=]*';
+ var value = '"[^"]*"|[^,]*';
+ var keyvalue = '(?:' + key + ')=(?:' + value + ')';
+
+ return new RegExp('(?:^|,)(' + keyvalue + ')');
+};
+
+var parseAttributes = function parseAttributes(attributes) {
+ // split the string using attributes as the separator
+ var attrs = attributes.split(attributeSeparator());
+ var i = attrs.length;
+ var result = {};
+ var attr = undefined;
+
+ while (i--) {
+ // filter out unmatched portions of the string
+ if (attrs[i] === '') {
+ continue;
+ }
+
+ // split the key and value
+ attr = /([^=]*)=(.*)/.exec(attrs[i]).slice(1);
+ // trim whitespace and remove optional quotes around the value
+ attr[0] = attr[0].replace(/^\s+|\s+$/g, '');
+ attr[1] = attr[1].replace(/^\s+|\s+$/g, '');
+ attr[1] = attr[1].replace(/^['"](.*)['"]$/g, '$1');
+ result[attr[0]] = attr[1];
+ }
+ return result;
+};
+
+/**
+ * A line-level M3U8 parser event stream. It expects to receive input one
+ * line at a time and performs a context-free parse of its contents. A stream
+ * interpretation of a manifest can be useful if the manifest is expected to
+ * be too large to fit comfortably into memory or the entirety of the input
+ * is not immediately available. Otherwise, it's probably much easier to work
+ * with a regular `Parser` object.
+ *
+ * Produces `data` events with an object that captures the parser's
+ * interpretation of the input. That object has a property `tag` that is one
+ * of `uri`, `comment`, or `tag`. URIs only have a single additional
+ * property, `line`, which captures the entirety of the input without
+ * interpretation. Comments similarly have a single additional property
+ * `text` which is the input without the leading `#`.
+ *
+ * Tags always have a property `tagType` which is the lower-cased version of
+ * the M3U8 directive without the `#EXT` or `#EXT-X-` prefix. For instance,
+ * `#EXT-X-MEDIA-SEQUENCE` becomes `media-sequence` when parsed. Unrecognized
+ * tags are given the tag type `unknown` and a single additional property
+ * `data` with the remainder of the input.
+ */
+
+var ParseStream = (function (_Stream) {
+ _inherits(ParseStream, _Stream);
+
+ function ParseStream() {
+ _classCallCheck(this, ParseStream);
+
+ _get(Object.getPrototypeOf(ParseStream.prototype), 'constructor', this).call(this);
+ }
+
+ /**
+ * Parses an additional line of input.
+ * @param line {string} a single line of an M3U8 file to parse
+ */
+
+ _createClass(ParseStream, [{
+ key: 'push',
+ value: function push(line) {
+ var match = undefined;
+ var event = undefined;
+
+ // strip whitespace
+ line = line.replace(/^[\u0000\s]+|[\u0000\s]+$/g, '');
+ if (line.length === 0) {
+ // ignore empty lines
+ return;
+ }
+
+ // URIs
+ if (line[0] !== '#') {
+ this.trigger('data', {
+ type: 'uri',
+ uri: line
+ });
+ return;
+ }
+
+ // Comments
+ if (line.indexOf('#EXT') !== 0) {
+ this.trigger('data', {
+ type: 'comment',
+ text: line.slice(1)
+ });
+ return;
+ }
+
+ // strip off any carriage returns here so the regex matching
+ // doesn't have to account for them.
+ line = line.replace('\r', '');
+
+ // Tags
+ match = /^#EXTM3U/.exec(line);
+ if (match) {
+ this.trigger('data', {
+ type: 'tag',
+ tagType: 'm3u'
+ });
+ return;
+ }
+ match = /^#EXTINF:?([0-9\.]*)?,?(.*)?$/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'inf'
+ };
+ if (match[1]) {
+ event.duration = parseFloat(match[1]);
+ }
+ if (match[2]) {
+ event.title = match[2];
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-TARGETDURATION:?([0-9.]*)?/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'targetduration'
+ };
+ if (match[1]) {
+ event.duration = parseInt(match[1], 10);
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#ZEN-TOTAL-DURATION:?([0-9.]*)?/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'totalduration'
+ };
+ if (match[1]) {
+ event.duration = parseInt(match[1], 10);
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-VERSION:?([0-9.]*)?/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'version'
+ };
+ if (match[1]) {
+ event.version = parseInt(match[1], 10);
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'media-sequence'
+ };
+ if (match[1]) {
+ event.number = parseInt(match[1], 10);
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-DISCONTINUITY-SEQUENCE:?(\-?[0-9.]*)?/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'discontinuity-sequence'
+ };
+ if (match[1]) {
+ event.number = parseInt(match[1], 10);
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-PLAYLIST-TYPE:?(.*)?$/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'playlist-type'
+ };
+ if (match[1]) {
+ event.playlistType = match[1];
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-BYTERANGE:?([0-9.]*)?@?([0-9.]*)?/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'byterange'
+ };
+ if (match[1]) {
+ event.length = parseInt(match[1], 10);
+ }
+ if (match[2]) {
+ event.offset = parseInt(match[2], 10);
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-ALLOW-CACHE:?(YES|NO)?/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'allow-cache'
+ };
+ if (match[1]) {
+ event.allowed = !/NO/.test(match[1]);
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-STREAM-INF:?(.*)$/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'stream-inf'
+ };
+ if (match[1]) {
+ event.attributes = parseAttributes(match[1]);
+
+ if (event.attributes.RESOLUTION) {
+ var split = event.attributes.RESOLUTION.split('x');
+ var resolution = {};
+
+ if (split[0]) {
+ resolution.width = parseInt(split[0], 10);
+ }
+ if (split[1]) {
+ resolution.height = parseInt(split[1], 10);
+ }
+ event.attributes.RESOLUTION = resolution;
+ }
+ if (event.attributes.BANDWIDTH) {
+ event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);
+ }
+ if (event.attributes['PROGRAM-ID']) {
+ event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);
+ }
+ }
+ this.trigger('data', event);
+ return;
+ }
+ match = /^#EXT-X-ENDLIST/.exec(line);
+ if (match) {
+ this.trigger('data', {
+ type: 'tag',
+ tagType: 'endlist'
+ });
+ return;
+ }
+ match = /^#EXT-X-DISCONTINUITY/.exec(line);
+ if (match) {
+ this.trigger('data', {
+ type: 'tag',
+ tagType: 'discontinuity'
+ });
+ return;
+ }
+ match = /^#EXT-X-KEY:?(.*)$/.exec(line);
+ if (match) {
+ event = {
+ type: 'tag',
+ tagType: 'key'
+ };
+ if (match[1]) {
+ event.attributes = parseAttributes(match[1]);
+ // parse the IV string into a Uint32Array
+ if (event.attributes.IV) {
+ if (event.attributes.IV.substring(0, 2) === '0x') {
+ event.attributes.IV = event.attributes.IV.substring(2);
+ }
+
+ event.attributes.IV = event.attributes.IV.match(/.{8}/g);
+ event.attributes.IV[0] = parseInt(event.attributes.IV[0], 16);
+ event.attributes.IV[1] = parseInt(event.attributes.IV[1], 16);
+ event.attributes.IV[2] = parseInt(event.attributes.IV[2], 16);
+ event.attributes.IV[3] = parseInt(event.attributes.IV[3], 16);
+ event.attributes.IV = new Uint32Array(event.attributes.IV);
+ }
+ }
+ this.trigger('data', event);
+ return;
+ }
+
+ // unknown tag type
+ this.trigger('data', {
+ type: 'tag',
+ data: line.slice(4, line.length)
+ });
+ }
+ }]);
+
+ return ParseStream;
+})(_stream2['default']);
+
+exports['default'] = ParseStream;
+module.exports = exports['default'];
+},{"../stream":13}],9:[function(require,module,exports){
+(function (global){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _stream = require('../stream');
+
+var _stream2 = _interopRequireDefault(_stream);
+
+var _lineStream = require('./line-stream');
+
+var _lineStream2 = _interopRequireDefault(_lineStream);
+
+var _parseStream = require('./parse-stream');
+
+var _parseStream2 = _interopRequireDefault(_parseStream);
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+/**
+ * A parser for M3U8 files. The current interpretation of the input is
+ * exposed as a property `manifest` on parser objects. It's just two lines to
+ * create and parse a manifest once you have the contents available as a string:
+ *
+ * ```js
+ * var parser = new videojs.m3u8.Parser();
+ * parser.push(xhr.responseText);
+ * ```
+ *
+ * New input can later be applied to update the manifest object by calling
+ * `push` again.
+ *
+ * The parser attempts to create a usable manifest object even if the
+ * underlying input is somewhat nonsensical. It emits `info` and `warning`
+ * events during the parse if it encounters input that seems invalid or
+ * requires some property of the manifest object to be defaulted.
+ */
+
+var Parser = (function (_Stream) {
+ _inherits(Parser, _Stream);
+
+ function Parser() {
+ _classCallCheck(this, Parser);
+
+ _get(Object.getPrototypeOf(Parser.prototype), 'constructor', this).call(this);
+ this.lineStream = new _lineStream2['default']();
+ this.parseStream = new _parseStream2['default']();
+ this.lineStream.pipe(this.parseStream);
+ /* eslint-disable consistent-this */
+ var self = this;
+ /* eslint-enable consistent-this */
+ var uris = [];
+ var currentUri = {};
+ var _key = undefined;
+ var noop = function noop() {};
+
+ // the manifest is empty until the parse stream begins delivering data
+ this.manifest = {
+ allowCache: true,
+ discontinuityStarts: []
+ };
+
+ // update the manifest with the m3u8 entry from the parse stream
+ this.parseStream.on('data', function (entry) {
+ ({
+ tag: function tag() {
+ // switch based on the tag type
+ (({
+ 'allow-cache': function allowCache() {
+ this.manifest.allowCache = entry.allowed;
+ if (!('allowed' in entry)) {
+ this.trigger('info', {
+ message: 'defaulting allowCache to YES'
+ });
+ this.manifest.allowCache = true;
+ }
+ },
+ byterange: function byterange() {
+ var byterange = {};
+
+ if ('length' in entry) {
+ currentUri.byterange = byterange;
+ byterange.length = entry.length;
+
+ if (!('offset' in entry)) {
+ this.trigger('info', {
+ message: 'defaulting offset to zero'
+ });
+ entry.offset = 0;
+ }
+ }
+ if ('offset' in entry) {
+ currentUri.byterange = byterange;
+ byterange.offset = entry.offset;
+ }
+ },
+ endlist: function endlist() {
+ this.manifest.endList = true;
+ },
+ inf: function inf() {
+ if (!('mediaSequence' in this.manifest)) {
+ this.manifest.mediaSequence = 0;
+ this.trigger('info', {
+ message: 'defaulting media sequence to zero'
+ });
+ }
+ if (!('discontinuitySequence' in this.manifest)) {
+ this.manifest.discontinuitySequence = 0;
+ this.trigger('info', {
+ message: 'defaulting discontinuity sequence to zero'
+ });
+ }
+ if (entry.duration >= 0) {
+ currentUri.duration = entry.duration;
+ }
+
+ this.manifest.segments = uris;
+ },
+ key: function key() {
+ if (!entry.attributes) {
+ this.trigger('warn', {
+ message: 'ignoring key declaration without attribute list'
+ });
+ return;
+ }
+ // clear the active encryption key
+ if (entry.attributes.METHOD === 'NONE') {
+ _key = null;
+ return;
+ }
+ if (!entry.attributes.URI) {
+ this.trigger('warn', {
+ message: 'ignoring key declaration without URI'
+ });
+ return;
+ }
+ if (!entry.attributes.METHOD) {
+ this.trigger('warn', {
+ message: 'defaulting key method to AES-128'
+ });
+ }
+
+ // setup an encryption key for upcoming segments
+ _key = {
+ method: entry.attributes.METHOD || 'AES-128',
+ uri: entry.attributes.URI
+ };
+
+ if (typeof entry.attributes.IV !== 'undefined') {
+ _key.iv = entry.attributes.IV;
+ }
+ },
+ 'media-sequence': function mediaSequence() {
+ if (!isFinite(entry.number)) {
+ this.trigger('warn', {
+ message: 'ignoring invalid media sequence: ' + entry.number
+ });
+ return;
+ }
+ this.manifest.mediaSequence = entry.number;
+ },
+ 'discontinuity-sequence': function discontinuitySequence() {
+ if (!isFinite(entry.number)) {
+ this.trigger('warn', {
+ message: 'ignoring invalid discontinuity sequence: ' + entry.number
+ });
+ return;
+ }
+ this.manifest.discontinuitySequence = entry.number;
+ },
+ 'playlist-type': function playlistType() {
+ if (!/VOD|EVENT/.test(entry.playlistType)) {
+ this.trigger('warn', {
+ message: 'ignoring unknown playlist type: ' + entry.playlist
+ });
+ return;
+ }
+ this.manifest.playlistType = entry.playlistType;
+ },
+ 'stream-inf': function streamInf() {
+ this.manifest.playlists = uris;
+
+ if (!entry.attributes) {
+ this.trigger('warn', {
+ message: 'ignoring empty stream-inf attributes'
+ });
+ return;
+ }
+
+ if (!currentUri.attributes) {
+ currentUri.attributes = {};
+ }
+ currentUri.attributes = (0, _videoJs.mergeOptions)(currentUri.attributes, entry.attributes);
+ },
+ discontinuity: function discontinuity() {
+ currentUri.discontinuity = true;
+ this.manifest.discontinuityStarts.push(uris.length);
+ },
+ targetduration: function targetduration() {
+ if (!isFinite(entry.duration) || entry.duration < 0) {
+ this.trigger('warn', {
+ message: 'ignoring invalid target duration: ' + entry.duration
+ });
+ return;
+ }
+ this.manifest.targetDuration = entry.duration;
+ },
+ totalduration: function totalduration() {
+ if (!isFinite(entry.duration) || entry.duration < 0) {
+ this.trigger('warn', {
+ message: 'ignoring invalid total duration: ' + entry.duration
+ });
+ return;
+ }
+ this.manifest.totalDuration = entry.duration;
+ }
+ })[entry.tagType] || noop).call(self);
+ },
+ uri: function uri() {
+ currentUri.uri = entry.uri;
+ uris.push(currentUri);
+
+ // if no explicit duration was declared, use the target duration
+ if (this.manifest.targetDuration && !('duration' in currentUri)) {
+ this.trigger('warn', {
+ message: 'defaulting segment duration to the target duration'
+ });
+ currentUri.duration = this.manifest.targetDuration;
+ }
+ // annotate with encryption information, if necessary
+ if (_key) {
+ currentUri.key = _key;
+ }
+
+ // prepare for the next URI
+ currentUri = {};
+ },
+ comment: function comment() {
+ // comments are not important for playback
+ }
+ })[entry.type].call(self);
+ });
+ }
+
+ /**
+ * Parse the input string and update the manifest object.
+ * @param chunk {string} a potentially incomplete portion of the manifest
+ */
+
+ _createClass(Parser, [{
+ key: 'push',
+ value: function push(chunk) {
+ this.lineStream.push(chunk);
+ }
+
+ /**
+ * Flush any remaining input. This can be handy if the last line of an M3U8
+ * manifest did not contain a trailing newline but the file has been
+ * completely received.
+ */
+ }, {
+ key: 'end',
+ value: function end() {
+ // flush any buffered input
+ this.lineStream.push('\n');
+ }
+ }]);
+
+ return Parser;
+})(_stream2['default']);
+
+exports['default'] = Parser;
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../stream":13,"./line-stream":7,"./parse-stream":8}],10:[function(require,module,exports){
+(function (global){
+/**
+ * playlist-loader
+ *
+ * A state machine that manages the loading, caching, and updating of
+ * M3U8 playlists.
+ *
+ */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _resolveUrl = require('./resolve-url');
+
+var _resolveUrl2 = _interopRequireDefault(_resolveUrl);
+
+var _xhr = require('./xhr');
+
+var _xhr2 = _interopRequireDefault(_xhr);
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var _stream = require('./stream');
+
+var _stream2 = _interopRequireDefault(_stream);
+
+var _m3u8 = require('./m3u8');
+
+var _m3u82 = _interopRequireDefault(_m3u8);
+
+/**
+ * Returns a new master playlist that is the result of merging an
+ * updated media playlist into the original version. If the
+ * updated media playlist does not match any of the playlist
+ * entries in the original master playlist, null is returned.
+ * @param master {object} a parsed master M3U8 object
+ * @param media {object} a parsed media M3U8 object
+ * @return {object} a new object that represents the original
+ * master playlist with the updated media playlist merged in, or
+ * null if the merge produced no change.
+ */
+var updateMaster = function updateMaster(master, media) {
+ var changed = false;
+ var result = (0, _videoJs.mergeOptions)(master, {});
+ var i = master.playlists.length;
+ var playlist = undefined;
+
+ while (i--) {
+ playlist = result.playlists[i];
+ if (playlist.uri === media.uri) {
+ // consider the playlist unchanged if the number of segments
+ // are equal and the media sequence number is unchanged
+ if (playlist.segments && media.segments && playlist.segments.length === media.segments.length && playlist.mediaSequence === media.mediaSequence) {
+ continue;
+ }
+
+ result.playlists[i] = (0, _videoJs.mergeOptions)(playlist, media);
+ result.playlists[media.uri] = result.playlists[i];
+
+ // if the update could overlap existing segment information,
+ // merge the two lists
+ if (playlist.segments) {
+ result.playlists[i].segments = updateSegments(playlist.segments, media.segments, media.mediaSequence - playlist.mediaSequence);
+ }
+ changed = true;
+ }
+ }
+ return changed ? result : null;
+};
+
+/**
+ * Returns a new array of segments that is the result of merging
+ * properties from an older list of segments onto an updated
+ * list. No properties on the updated playlist will be overridden.
+ * @param original {array} the outdated list of segments
+ * @param update {array} the updated list of segments
+ * @param offset {number} (optional) the index of the first update
+ * segment in the original segment list. For non-live playlists,
+ * this should always be zero and does not need to be
+ * specified. For live playlists, it should be the difference
+ * between the media sequence numbers in the original and updated
+ * playlists.
+ * @return a list of merged segment objects
+ */
+var updateSegments = function updateSegments(original, update, offset) {
+ var result = update.slice();
+ var length = undefined;
+ var i = undefined;
+
+ offset = offset || 0;
+ length = Math.min(original.length, update.length + offset);
+
+ for (i = offset; i < length; i++) {
+ result[i - offset] = (0, _videoJs.mergeOptions)(original[i], result[i - offset]);
+ }
+ return result;
+};
+
+var PlaylistLoader = (function (_Stream) {
+ _inherits(PlaylistLoader, _Stream);
+
+ function PlaylistLoader(srcUrl, withCredentials) {
+ _classCallCheck(this, PlaylistLoader);
+
+ _get(Object.getPrototypeOf(PlaylistLoader.prototype), 'constructor', this).call(this);
+ var loader = this;
+ var dispose = undefined;
+ var mediaUpdateTimeout = undefined;
+ var request = undefined;
+ var playlistRequestError = undefined;
+ var haveMetadata = undefined;
+
+ // a flag that disables "expired time"-tracking this setting has
+ // no effect when not playing a live stream
+ this.trackExpiredTime_ = false;
+
+ if (!srcUrl) {
+ throw new Error('A non-empty playlist URL is required');
+ }
+
+ playlistRequestError = function (xhr, url, startingState) {
+ loader.setBandwidth(request || xhr);
+
+ // any in-flight request is now finished
+ request = null;
+
+ if (startingState) {
+ loader.state = startingState;
+ }
+
+ loader.error = {
+ playlist: loader.master.playlists[url],
+ status: xhr.status,
+ message: 'HLS playlist request error at URL: ' + url,
+ responseText: xhr.responseText,
+ code: xhr.status >= 500 ? 4 : 2
+ };
+ loader.trigger('error');
+ };
+
+ // update the playlist loader's state in response to a new or
+ // updated playlist.
+
+ haveMetadata = function (xhr, url) {
+ var parser = undefined;
+ var refreshDelay = undefined;
+ var update = undefined;
+
+ loader.setBandwidth(request || xhr);
+
+ // any in-flight request is now finished
+ request = null;
+ loader.state = 'HAVE_METADATA';
+
+ parser = new _m3u82['default'].Parser();
+ parser.push(xhr.responseText);
+ parser.end();
+ parser.manifest.uri = url;
+
+ // merge this playlist into the master
+ update = updateMaster(loader.master, parser.manifest);
+ refreshDelay = (parser.manifest.targetDuration || 10) * 1000;
+ if (update) {
+ loader.master = update;
+ loader.updateMediaPlaylist_(parser.manifest);
+ } else {
+ // if the playlist is unchanged since the last reload,
+ // try again after half the target duration
+ refreshDelay /= 2;
+ }
+
+ // refresh live playlists after a target duration passes
+ if (!loader.media().endList) {
+ window.clearTimeout(mediaUpdateTimeout);
+ mediaUpdateTimeout = window.setTimeout(function () {
+ loader.trigger('mediaupdatetimeout');
+ }, refreshDelay);
+ }
+
+ loader.trigger('loadedplaylist');
+ };
+
+ // initialize the loader state
+ loader.state = 'HAVE_NOTHING';
+
+ // track the time that has expired from the live window
+ // this allows the seekable start range to be calculated even if
+ // all segments with timing information have expired
+ this.expired_ = 0;
+
+ // capture the prototype dispose function
+ dispose = this.dispose;
+
+ /**
+ * Abort any outstanding work and clean up.
+ */
+ loader.dispose = function () {
+ if (request) {
+ request.onreadystatechange = null;
+ request.abort();
+ request = null;
+ }
+ window.clearTimeout(mediaUpdateTimeout);
+ dispose.call(this);
+ };
+
+ /**
+ * When called without any arguments, returns the currently
+ * active media playlist. When called with a single argument,
+ * triggers the playlist loader to asynchronously switch to the
+ * specified media playlist. Calling this method while the
+ * loader is in the HAVE_NOTHING causes an error to be emitted
+ * but otherwise has no effect.
+ * @param playlist (optional) {object} the parsed media playlist
+ * object to switch to
+ */
+ loader.media = function (playlist) {
+ var startingState = loader.state;
+ var mediaChange = undefined;
+ // getter
+ if (!playlist) {
+ return loader.media_;
+ }
+
+ // setter
+ if (loader.state === 'HAVE_NOTHING') {
+ throw new Error('Cannot switch media playlist from ' + loader.state);
+ }
+
+ // find the playlist object if the target playlist has been
+ // specified by URI
+ if (typeof playlist === 'string') {
+ if (!loader.master.playlists[playlist]) {
+ throw new Error('Unknown playlist URI: ' + playlist);
+ }
+ playlist = loader.master.playlists[playlist];
+ }
+
+ mediaChange = !loader.media_ || playlist.uri !== loader.media_.uri;
+
+ // switch to fully loaded playlists immediately
+ if (loader.master.playlists[playlist.uri].endList) {
+ // abort outstanding playlist requests
+ if (request) {
+ request.onreadystatechange = null;
+ request.abort();
+ request = null;
+ }
+ loader.state = 'HAVE_METADATA';
+ loader.media_ = playlist;
+
+ // trigger media change if the active media has been updated
+ if (mediaChange) {
+ loader.trigger('mediachange');
+ }
+ return;
+ }
+
+ // switching to the active playlist is a no-op
+ if (!mediaChange) {
+ return;
+ }
+
+ loader.state = 'SWITCHING_MEDIA';
+
+ // there is already an outstanding playlist request
+ if (request) {
+ if ((0, _resolveUrl2['default'])(loader.master.uri, playlist.uri) === request.url) {
+ // requesting to switch to the same playlist multiple times
+ // has no effect after the first
+ return;
+ }
+ request.onreadystatechange = null;
+ request.abort();
+ request = null;
+ }
+
+ // request the new playlist
+ request = (0, _xhr2['default'])({
+ uri: (0, _resolveUrl2['default'])(loader.master.uri, playlist.uri),
+ withCredentials: withCredentials
+ }, function (error, request) {
+ if (error) {
+ return playlistRequestError(request, playlist.uri, startingState);
+ }
+
+ haveMetadata(request, playlist.uri);
+
+ // fire loadedmetadata the first time a media playlist is loaded
+ if (startingState === 'HAVE_MASTER') {
+ loader.trigger('loadedmetadata');
+ } else {
+ loader.trigger('mediachange');
+ }
+ });
+ };
+
+ loader.setBandwidth = function (xhr) {
+ loader.bandwidth = xhr.bandwidth;
+ };
+
+ // In a live list, don't keep track of the expired time until
+ // HLS tells us that "first play" has commenced
+ loader.on('firstplay', function () {
+ this.trackExpiredTime_ = true;
+ });
+
+ // live playlist staleness timeout
+ loader.on('mediaupdatetimeout', function () {
+ if (loader.state !== 'HAVE_METADATA') {
+ // only refresh the media playlist if no other activity is going on
+ return;
+ }
+
+ loader.state = 'HAVE_CURRENT_METADATA';
+ request = (0, _xhr2['default'])({
+ uri: (0, _resolveUrl2['default'])(loader.master.uri, loader.media().uri),
+ withCredentials: withCredentials
+ }, function (error, request) {
+ if (error) {
+ return playlistRequestError(request, loader.media().uri);
+ }
+ haveMetadata(request, loader.media().uri);
+ });
+ });
+
+ // request the specified URL
+ request = (0, _xhr2['default'])({
+ uri: srcUrl,
+ withCredentials: withCredentials
+ }, function (error, req) {
+ var parser = undefined;
+ var i = undefined;
+
+ // clear the loader's request reference
+ request = null;
+
+ if (error) {
+ loader.error = {
+ status: req.status,
+ message: 'HLS playlist request error at URL: ' + srcUrl,
+ responseText: req.responseText,
+ // MEDIA_ERR_NETWORK
+ code: 2
+ };
+ return loader.trigger('error');
+ }
+
+ parser = new _m3u82['default'].Parser();
+ parser.push(req.responseText);
+ parser.end();
+
+ loader.state = 'HAVE_MASTER';
+
+ parser.manifest.uri = srcUrl;
+
+ // loaded a master playlist
+ if (parser.manifest.playlists) {
+ loader.master = parser.manifest;
+
+ // setup by-URI lookups
+ i = loader.master.playlists.length;
+ while (i--) {
+ loader.master.playlists[loader.master.playlists[i].uri] = loader.master.playlists[i];
+ }
+
+ loader.trigger('loadedplaylist');
+ if (!request) {
+ // no media playlist was specifically selected so start
+ // from the first listed one
+ loader.media(parser.manifest.playlists[0]);
+ }
+ return;
+ }
+
+ // loaded a media playlist
+ // infer a master playlist if none was previously requested
+ loader.master = {
+ uri: window.location.href,
+ playlists: [{
+ uri: srcUrl
+ }]
+ };
+ loader.master.playlists[srcUrl] = loader.master.playlists[0];
+ haveMetadata(req, srcUrl);
+ return loader.trigger('loadedmetadata');
+ });
+ }
+
+ /**
+ * Update the PlaylistLoader state to reflect the changes in an
+ * update to the current media playlist.
+ * @param update {object} the updated media playlist object
+ */
+
+ _createClass(PlaylistLoader, [{
+ key: 'updateMediaPlaylist_',
+ value: function updateMediaPlaylist_(update) {
+ var outdated = undefined;
+ var i = undefined;
+ var segment = undefined;
+
+ outdated = this.media_;
+ this.media_ = this.master.playlists[update.uri];
+
+ if (!outdated) {
+ return;
+ }
+
+ // don't track expired time until this flag is truthy
+ if (!this.trackExpiredTime_) {
+ return;
+ }
+
+ // if the update was the result of a rendition switch do not
+ // attempt to calculate expired_ since media-sequences need not
+ // correlate between renditions/variants
+ if (update.uri !== outdated.uri) {
+ return;
+ }
+
+ // try using precise timing from first segment of the updated
+ // playlist
+ if (update.segments.length) {
+ if (update.segments[0].start !== undefined) {
+ this.expired_ = update.segments[0].start;
+ return;
+ } else if (update.segments[0].end !== undefined) {
+ this.expired_ = update.segments[0].end - update.segments[0].duration;
+ return;
+ }
+ }
+
+ // calculate expired by walking the outdated playlist
+ i = update.mediaSequence - outdated.mediaSequence - 1;
+
+ for (; i >= 0; i--) {
+ segment = outdated.segments[i];
+
+ if (!segment) {
+ // we missed information on this segment completely between
+ // playlist updates so we'll have to take an educated guess
+ // once we begin buffering again, any error we introduce can
+ // be corrected
+ this.expired_ += outdated.targetDuration || 10;
+ continue;
+ }
+
+ if (segment.end !== undefined) {
+ this.expired_ = segment.end;
+ return;
+ }
+ if (segment.start !== undefined) {
+ this.expired_ = segment.start + segment.duration;
+ return;
+ }
+ this.expired_ += segment.duration;
+ }
+ }
+
+ /**
+ * Determine the index of the segment that contains a specified
+ * playback position in the current media playlist. Early versions
+ * of the HLS specification require segment durations to be rounded
+ * to the nearest integer which means it may not be possible to
+ * determine the correct segment for a playback position if that
+ * position is within .5 seconds of the segment duration. This
+ * function will always return the lower of the two possible indices
+ * in those cases.
+ *
+ * @param time {number} The number of seconds since the earliest
+ * possible position to determine the containing segment for
+ * @returns {number} The number of the media segment that contains
+ * that time position. If the specified playback position is outside
+ * the time range of the current set of media segments, the return
+ * value will be clamped to the index of the segment containing the
+ * closest playback position that is currently available.
+ */
+ }, {
+ key: 'getMediaIndexForTime_',
+ value: function getMediaIndexForTime_(time) {
+ var i = undefined;
+ var segment = undefined;
+ var originalTime = time;
+ var numSegments = this.media_.segments.length;
+ var lastSegment = numSegments - 1;
+ var startIndex = undefined;
+ var endIndex = undefined;
+ var knownStart = undefined;
+ var knownEnd = undefined;
+
+ if (!this.media_) {
+ return 0;
+ }
+
+ // when the requested position is earlier than the current set of
+ // segments, return the earliest segment index
+ if (time < 0) {
+ return 0;
+ }
+
+ // find segments with known timing information that bound the
+ // target time
+ for (i = 0; i < numSegments; i++) {
+ segment = this.media_.segments[i];
+ if (segment.end) {
+ if (segment.end > time) {
+ knownEnd = segment.end;
+ endIndex = i;
+ break;
+ } else {
+ knownStart = segment.end;
+ startIndex = i + 1;
+ }
+ }
+ }
+
+ // use the bounds we just found and playlist information to
+ // estimate the segment that contains the time we are looking for
+ if (startIndex !== undefined) {
+ // We have a known-start point that is before our desired time so
+ // walk from that point forwards
+ time = time - knownStart;
+ for (i = startIndex; i < (endIndex || numSegments); i++) {
+ segment = this.media_.segments[i];
+ time -= segment.duration;
+
+ if (time < 0) {
+ return i;
+ }
+ }
+
+ if (i >= endIndex) {
+ // We haven't found a segment but we did hit a known end point
+ // so fallback to interpolating between the segment index
+ // based on the known span of the timeline we are dealing with
+ // and the number of segments inside that span
+ return startIndex + Math.floor((originalTime - knownStart) / (knownEnd - knownStart) * (endIndex - startIndex));
+ }
+
+ // We _still_ haven't found a segment so load the last one
+ return lastSegment;
+ } else if (endIndex !== undefined) {
+ // We _only_ have a known-end point that is after our desired time so
+ // walk from that point backwards
+ time = knownEnd - time;
+ for (i = endIndex; i >= 0; i--) {
+ segment = this.media_.segments[i];
+ time -= segment.duration;
+
+ if (time < 0) {
+ return i;
+ }
+ }
+
+ // We haven't found a segment so load the first one if time is zero
+ if (time === 0) {
+ return 0;
+ } else {
+ return -1;
+ }
+ } else {
+ // We known nothing so walk from the front of the playlist,
+ // subtracting durations until we find a segment that contains
+ // time and return it
+ time = time - this.expired_;
+
+ if (time < 0) {
+ return -1;
+ }
+
+ for (i = 0; i < numSegments; i++) {
+ segment = this.media_.segments[i];
+ time -= segment.duration;
+ if (time < 0) {
+ return i;
+ }
+ }
+ // We are out of possible candidates so load the last one...
+ // The last one is the least likely to overlap a buffer and therefore
+ // the one most likely to tell us something about the timeline
+ return lastSegment;
+ }
+ }
+ }]);
+
+ return PlaylistLoader;
+})(_stream2['default']);
+
+exports['default'] = PlaylistLoader;
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./m3u8":6,"./resolve-url":12,"./stream":13,"./xhr":14}],11:[function(require,module,exports){
+(function (global){
+/**
+ * Playlist related utilities.
+ */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var Playlist = {
+ /**
+ * The number of segments that are unsafe to start playback at in
+ * a live stream. Changing this value can cause playback stalls.
+ * See HTTP Live Streaming, "Playing the Media Playlist File"
+ * https://tools.ietf.org/html/draft-pantos-http-live-streaming-18#section-6.3.3
+ */
+ UNSAFE_LIVE_SEGMENTS: 3
+};
+
+var backwardDuration = function backwardDuration(playlist, endSequence) {
+ var result = 0;
+ var i = endSequence - playlist.mediaSequence;
+ // if a start time is available for segment immediately following
+ // the interval, use it
+ var segment = playlist.segments[i];
+
+ // Walk backward until we find the latest segment with timeline
+ // information that is earlier than endSequence
+ if (segment) {
+ if (typeof segment.start !== 'undefined') {
+ return { result: segment.start, precise: true };
+ }
+ if (typeof segment.end !== 'undefined') {
+ return {
+ result: segment.end - segment.duration,
+ precise: true
+ };
+ }
+ }
+ while (i--) {
+ segment = playlist.segments[i];
+ if (typeof segment.end !== 'undefined') {
+ return { result: result + segment.end, precise: true };
+ }
+
+ result += segment.duration;
+
+ if (typeof segment.start !== 'undefined') {
+ return { result: result + segment.start, precise: true };
+ }
+ }
+ return { result: result, precise: false };
+};
+
+var forwardDuration = function forwardDuration(playlist, endSequence) {
+ var result = 0;
+ var segment = undefined;
+ var i = endSequence - playlist.mediaSequence;
+ // Walk forward until we find the earliest segment with timeline
+ // information
+
+ for (; i < playlist.segments.length; i++) {
+ segment = playlist.segments[i];
+ if (typeof segment.start !== 'undefined') {
+ return {
+ result: segment.start - result,
+ precise: true
+ };
+ }
+
+ result += segment.duration;
+
+ if (typeof segment.end !== 'undefined') {
+ return {
+ result: segment.end - result,
+ precise: true
+ };
+ }
+ }
+ // indicate we didn't find a useful duration estimate
+ return { result: -1, precise: false };
+};
+
+/**
+ * Calculate the media duration from the segments associated with a
+ * playlist. The duration of a subinterval of the available segments
+ * may be calculated by specifying an end index.
+ *
+ * @param playlist {object} a media playlist object
+ * @param endSequence {number} (optional) an exclusive upper boundary
+ * for the playlist. Defaults to playlist length.
+ * @return {number} the duration between the first available segment
+ * and end index.
+ */
+var intervalDuration = function intervalDuration(playlist, endSequence) {
+ var backward = undefined;
+ var forward = undefined;
+
+ if (typeof endSequence === 'undefined') {
+ endSequence = playlist.mediaSequence + playlist.segments.length;
+ }
+
+ if (endSequence < playlist.mediaSequence) {
+ return 0;
+ }
+
+ // do a backward walk to estimate the duration
+ backward = backwardDuration(playlist, endSequence);
+ if (backward.precise) {
+ // if we were able to base our duration estimate on timing
+ // information provided directly from the Media Source, return
+ // it
+ return backward.result;
+ }
+
+ // walk forward to see if a precise duration estimate can be made
+ // that way
+ forward = forwardDuration(playlist, endSequence);
+ if (forward.precise) {
+ // we found a segment that has been buffered and so it's
+ // position is known precisely
+ return forward.result;
+ }
+
+ // return the less-precise, playlist-based duration estimate
+ return backward.result;
+};
+
+/**
+ * Calculates the duration of a playlist. If a start and end index
+ * are specified, the duration will be for the subset of the media
+ * timeline between those two indices. The total duration for live
+ * playlists is always Infinity.
+ * @param playlist {object} a media playlist object
+ * @param endSequence {number} (optional) an exclusive upper
+ * boundary for the playlist. Defaults to the playlist media
+ * sequence number plus its length.
+ * @param includeTrailingTime {boolean} (optional) if false, the
+ * interval between the final segment and the subsequent segment
+ * will not be included in the result
+ * @return {number} the duration between the start index and end
+ * index.
+ */
+var duration = function duration(playlist, endSequence, includeTrailingTime) {
+ if (!playlist) {
+ return 0;
+ }
+
+ if (typeof includeTrailingTime === 'undefined') {
+ includeTrailingTime = true;
+ }
+
+ // if a slice of the total duration is not requested, use
+ // playlist-level duration indicators when they're present
+ if (typeof endSequence === 'undefined') {
+ // if present, use the duration specified in the playlist
+ if (playlist.totalDuration) {
+ return playlist.totalDuration;
+ }
+
+ // duration should be Infinity for live playlists
+ if (!playlist.endList) {
+ return window.Infinity;
+ }
+ }
+
+ // calculate the total duration based on the segment durations
+ return intervalDuration(playlist, endSequence, includeTrailingTime);
+};
+
+exports.duration = duration;
+/**
+ * Calculates the interval of time that is currently seekable in a
+ * playlist. The returned time ranges are relative to the earliest
+ * moment in the specified playlist that is still available. A full
+ * seekable implementation for live streams would need to offset
+ * these values by the duration of content that has expired from the
+ * stream.
+ * @param playlist {object} a media playlist object
+ * @return {TimeRanges} the periods of time that are valid targets
+ * for seeking
+ */
+var seekable = function seekable(playlist) {
+ var start = undefined;
+ var end = undefined;
+
+ // without segments, there are no seekable ranges
+ if (!playlist.segments) {
+ return (0, _videoJs.createTimeRange)();
+ }
+ // when the playlist is complete, the entire duration is seekable
+ if (playlist.endList) {
+ return (0, _videoJs.createTimeRange)(0, duration(playlist));
+ }
+
+ // live playlists should not expose three segment durations worth
+ // of content from the end of the playlist
+ // https://tools.ietf.org/html/draft-pantos-http-live-streaming-16#section-6.3.3
+ start = intervalDuration(playlist, playlist.mediaSequence);
+ end = intervalDuration(playlist, playlist.mediaSequence + Math.max(0, playlist.segments.length - Playlist.UNSAFE_LIVE_SEGMENTS));
+ return (0, _videoJs.createTimeRange)(start, end);
+};
+
+exports.seekable = seekable;
+Playlist.duration = duration;
+Playlist.seekable = seekable;
+
+// exports
+exports['default'] = Playlist;
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],12:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+var _globalDocument = require('global/document');
+
+var _globalDocument2 = _interopRequireDefault(_globalDocument);
+
+/* eslint-disable max-len */
+/**
+ * Constructs a new URI by interpreting a path relative to another
+ * URI.
+ * @param basePath {string} a relative or absolute URI
+ * @param path {string} a path part to combine with the base
+ * @return {string} a URI that is equivalent to composing `base`
+ * with `path`
+ * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
+ */
+/* eslint-enable max-len */
+var resolveUrl = function resolveUrl(basePath, path) {
+ // use the base element to get the browser to handle URI resolution
+ var oldBase = _globalDocument2['default'].querySelector('base');
+ var docHead = _globalDocument2['default'].querySelector('head');
+ var a = _globalDocument2['default'].createElement('a');
+ var base = oldBase;
+ var oldHref = undefined;
+ var result = undefined;
+
+ // prep the document
+ if (oldBase) {
+ oldHref = oldBase.href;
+ } else {
+ base = docHead.appendChild(_globalDocument2['default'].createElement('base'));
+ }
+
+ base.href = basePath;
+ a.href = path;
+ result = a.href;
+
+ // clean up
+ if (oldBase) {
+ oldBase.href = oldHref;
+ } else {
+ docHead.removeChild(base);
+ }
+ return result;
+};
+
+exports['default'] = resolveUrl;
+module.exports = exports['default'];
+},{"global/document":16}],13:[function(require,module,exports){
+/**
+ * A lightweight readable stream implemention that handles event dispatching.
+ */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+var Stream = (function () {
+ function Stream() {
+ _classCallCheck(this, Stream);
+
+ this.listeners = {};
+ }
+
+ /**
+ * Add a listener for a specified event type.
+ * @param type {string} the event name
+ * @param listener {function} the callback to be invoked when an event of
+ * the specified type occurs
+ */
+
+ _createClass(Stream, [{
+ key: 'on',
+ value: function on(type, listener) {
+ if (!this.listeners[type]) {
+ this.listeners[type] = [];
+ }
+ this.listeners[type].push(listener);
+ }
+
+ /**
+ * Remove a listener for a specified event type.
+ * @param type {string} the event name
+ * @param listener {function} a function previously registered for this
+ * type of event through `on`
+ */
+ }, {
+ key: 'off',
+ value: function off(type, listener) {
+ var index = undefined;
+
+ if (!this.listeners[type]) {
+ return false;
+ }
+ index = this.listeners[type].indexOf(listener);
+ this.listeners[type].splice(index, 1);
+ return index > -1;
+ }
+
+ /**
+ * Trigger an event of the specified type on this stream. Any additional
+ * arguments to this function are passed as parameters to event listeners.
+ * @param type {string} the event name
+ */
+ }, {
+ key: 'trigger',
+ value: function trigger(type) {
+ var callbacks = undefined;
+ var i = undefined;
+ var length = undefined;
+ var args = undefined;
+
+ callbacks = this.listeners[type];
+ if (!callbacks) {
+ return;
+ }
+ // Slicing the arguments on every invocation of this method
+ // can add a significant amount of overhead. Avoid the
+ // intermediate object creation for the common case of a
+ // single callback argument
+ if (arguments.length === 2) {
+ length = callbacks.length;
+ for (i = 0; i < length; ++i) {
+ callbacks[i].call(this, arguments[1]);
+ }
+ } else {
+ args = Array.prototype.slice.call(arguments, 1);
+ length = callbacks.length;
+ for (i = 0; i < length; ++i) {
+ callbacks[i].apply(this, args);
+ }
+ }
+ }
+
+ /**
+ * Destroys the stream and cleans up.
+ */
+ }, {
+ key: 'dispose',
+ value: function dispose() {
+ this.listeners = {};
+ }
+
+ /**
+ * Forwards all `data` events on this stream to the destination stream. The
+ * destination stream should provide a method `push` to receive the data
+ * events as they arrive.
+ * @param destination {stream} the stream that will receive all `data` events
+ * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options
+ */
+ }, {
+ key: 'pipe',
+ value: function pipe(destination) {
+ this.on('data', function (data) {
+ destination.push(data);
+ });
+ }
+ }]);
+
+ return Stream;
+})();
+
+exports['default'] = Stream;
+module.exports = exports['default'];
+},{}],14:[function(require,module,exports){
+(function (global){
+/**
+ * A wrapper for videojs.xhr that tracks bandwidth.
+ */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var xhr = function xhr(options, callback) {
+ // Add a default timeout for all hls requests
+ options = (0, _videoJs.mergeOptions)({
+ timeout: 45e3
+ }, options);
+
+ var request = (0, _videoJs.xhr)(options, function (error, response) {
+ if (!error && request.response) {
+ request.responseTime = new Date().getTime();
+ request.roundTripTime = request.responseTime - request.requestTime;
+ request.bytesReceived = request.response.byteLength || request.response.length;
+ if (!request.bandwidth) {
+ request.bandwidth = Math.floor(request.bytesReceived / request.roundTripTime * 8 * 1000);
+ }
+ }
+
+ // videojs.xhr now uses a specific code
+ // on the error object to signal that a request has
+ // timed out errors of setting a boolean on the request object
+ if (error || request.timedout) {
+ request.timedout = request.timedout || error.code === 'ETIMEDOUT';
+ } else {
+ request.timedout = false;
+ }
+
+ // videojs.xhr no longer considers status codes outside of 200 and 0
+ // (for file uris) to be errors, but the old XHR did, so emulate that
+ // behavior. Status 206 may be used in response to byterange requests.
+ if (!error && response.statusCode !== 200 && response.statusCode !== 206 && response.statusCode !== 0) {
+ error = new Error('XHR Failed with a response of: ' + (request && (request.response || request.responseText)));
+ }
+
+ callback(error, request);
+ });
+
+ request.requestTime = new Date().getTime();
+ return request;
+};
+
+exports['default'] = xhr;
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],15:[function(require,module,exports){
+
+},{}],16:[function(require,module,exports){
+(function (global){
+var topLevel = typeof global !== 'undefined' ? global :
+ typeof window !== 'undefined' ? window : {}
+var minDoc = require('min-document');
+
+if (typeof document !== 'undefined') {
+ module.exports = document;
+} else {
+ var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
+
+ if (!doccy) {
+ doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
+ }
+
+ module.exports = doccy;
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"min-document":15}],17:[function(require,module,exports){
+/*
+ * pkcs7.pad
+ * https://github.com/brightcove/pkcs7
+ *
+ * Copyright (c) 2014 Brightcove
+ * Licensed under the apache2 license.
+ */
+
+'use strict';
+
+var PADDING;
+
+/**
+ * Returns a new Uint8Array that is padded with PKCS#7 padding.
+ * @param plaintext {Uint8Array} the input bytes before encryption
+ * @return {Uint8Array} the padded bytes
+ * @see http://tools.ietf.org/html/rfc5652
+ */
+module.exports = function pad(plaintext) {
+ var padding = PADDING[(plaintext.byteLength % 16) || 0],
+ result = new Uint8Array(plaintext.byteLength + padding.length);
+ result.set(plaintext);
+ result.set(padding, plaintext.byteLength);
+ return result;
+};
+
+// pre-define the padding values
+PADDING = [
+ [16, 16, 16, 16,
+ 16, 16, 16, 16,
+ 16, 16, 16, 16,
+ 16, 16, 16, 16],
+
+ [15, 15, 15, 15,
+ 15, 15, 15, 15,
+ 15, 15, 15, 15,
+ 15, 15, 15],
+
+ [14, 14, 14, 14,
+ 14, 14, 14, 14,
+ 14, 14, 14, 14,
+ 14, 14],
+
+ [13, 13, 13, 13,
+ 13, 13, 13, 13,
+ 13, 13, 13, 13,
+ 13],
+
+ [12, 12, 12, 12,
+ 12, 12, 12, 12,
+ 12, 12, 12, 12],
+
+ [11, 11, 11, 11,
+ 11, 11, 11, 11,
+ 11, 11, 11],
+
+ [10, 10, 10, 10,
+ 10, 10, 10, 10,
+ 10, 10],
+
+ [9, 9, 9, 9,
+ 9, 9, 9, 9,
+ 9],
+
+ [8, 8, 8, 8,
+ 8, 8, 8, 8],
+
+ [7, 7, 7, 7,
+ 7, 7, 7],
+
+ [6, 6, 6, 6,
+ 6, 6],
+
+ [5, 5, 5, 5,
+ 5],
+
+ [4, 4, 4, 4],
+
+ [3, 3, 3],
+
+ [2, 2],
+
+ [1]
+];
+
+},{}],18:[function(require,module,exports){
+/*
+ * pkcs7
+ * https://github.com/brightcove/pkcs7
+ *
+ * Copyright (c) 2014 Brightcove
+ * Licensed under the apache2 license.
+ */
+
+'use strict';
+
+exports.pad = require('./pad.js');
+exports.unpad = require('./unpad.js');
+
+},{"./pad.js":17,"./unpad.js":19}],19:[function(require,module,exports){
+/*
+ * pkcs7.unpad
+ * https://github.com/brightcove/pkcs7
+ *
+ * Copyright (c) 2014 Brightcove
+ * Licensed under the apache2 license.
+ */
+
+'use strict';
+
+/**
+ * Returns the subarray of a Uint8Array without PKCS#7 padding.
+ * @param padded {Uint8Array} unencrypted bytes that have been padded
+ * @return {Uint8Array} the unpadded bytes
+ * @see http://tools.ietf.org/html/rfc5652
+ */
+module.exports = function unpad(padded) {
+ return padded.subarray(0, padded.byteLength - padded[padded.byteLength - 1]);
+};
+
+},{}],20:[function(require,module,exports){
+(function (global){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var _videoJs2 = _interopRequireDefault(_videoJs);
+
+var deprecateOldCue = function deprecateOldCue(cue) {
+ Object.defineProperties(cue.frame, {
+ id: {
+ get: function get() {
+ _videoJs2['default'].log.warn('cue.frame.id is deprecated. Use cue.value.key instead.');
+ return cue.value.key;
+ }
+ },
+ value: {
+ get: function get() {
+ _videoJs2['default'].log.warn('cue.frame.value is deprecated. Use cue.value.data instead.');
+ return cue.value.data;
+ }
+ },
+ privateData: {
+ get: function get() {
+ _videoJs2['default'].log.warn('cue.frame.privateData is deprecated. Use cue.value.data instead.');
+ return cue.value.data;
+ }
+ }
+ });
+};
+
+var addTextTrackData = function addTextTrackData(sourceHandler, captionArray, metadataArray) {
+ var Cue = window.WebKitDataCue || window.VTTCue;
+
+ if (captionArray) {
+ captionArray.forEach(function (caption) {
+ this.inbandTextTrack_.addCue(new Cue(caption.startTime + this.timestampOffset, caption.endTime + this.timestampOffset, caption.text));
+ }, sourceHandler);
+ }
+
+ if (metadataArray) {
+ metadataArray.forEach(function (metadata) {
+ var time = metadata.cueTime + this.timestampOffset;
+
+ metadata.frames.forEach(function (frame) {
+ var cue = new Cue(time, time, frame.value || frame.url || frame.data || '');
+
+ cue.frame = frame;
+ cue.value = frame;
+ deprecateOldCue(cue);
+ this.metadataTrack_.addCue(cue);
+ }, this);
+ }, sourceHandler);
+ }
+};
+
+exports['default'] = addTextTrackData;
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],21:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+var createTextTracksIfNecessary = function createTextTracksIfNecessary(sourceBuffer, mediaSource, segment) {
+ // create an in-band caption track if one is present in the segment
+ if (segment.captions && segment.captions.length && !sourceBuffer.inbandTextTrack_) {
+ sourceBuffer.inbandTextTrack_ = mediaSource.player_.addTextTrack('captions', 'cc1');
+ }
+
+ if (segment.metadata && segment.metadata.length && !sourceBuffer.metadataTrack_) {
+ sourceBuffer.metadataTrack_ = mediaSource.player_.addTextTrack('metadata', 'Timed Metadata');
+ sourceBuffer.metadataTrack_.inBandMetadataTrackDispatchType = segment.metadata.dispatchType;
+ }
+};
+
+exports['default'] = createTextTracksIfNecessary;
+module.exports = exports['default'];
+},{}],22:[function(require,module,exports){
+/**
+ * The maximum size in bytes for append operations to the video.js
+ * SWF. Calling through to Flash blocks and can be expensive so
+ * tuning this parameter may improve playback on slower
+ * systems. There are two factors to consider:
+ * - Each interaction with the SWF must be quick or you risk dropping
+ * video frames. To maintain 60fps for the rest of the page, each append
+ * must not take longer than 16ms. Given the likelihood that the page
+ * will be executing more javascript than just playback, you probably
+ * want to aim for less than 8ms. We aim for just 4ms.
+ * - Bigger appends significantly increase throughput. The total number of
+ * bytes over time delivered to the SWF must exceed the video bitrate or
+ * playback will stall.
+ *
+ * We adaptively tune the size of appends to give the best throughput
+ * possible given the performance of the system. To do that we try to append
+ * as much as possible in TIME_PER_TICK and while tuning the size of appends
+ * dynamically so that we only append about 4-times in that 4ms span.
+ *
+ * The reason we try to keep the number of appends around four is due to
+ * externalities such as Flash load and garbage collection that are highly
+ * variable and having 4 iterations allows us to exit the loop early if
+ * an iteration takes longer than expected.
+ */
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var flashConstants = {
+ TIME_BETWEEN_TICKS: Math.floor(1000 / 480),
+ TIME_PER_TICK: Math.floor(1000 / 240),
+ // 1kb
+ BYTES_PER_CHUNK: 1 * 1024,
+ MIN_CHUNK: 1024,
+ MAX_CHUNK: 1024 * 1024
+};
+
+exports["default"] = flashConstants;
+module.exports = exports["default"];
+},{}],23:[function(require,module,exports){
+(function (global){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var _videoJs2 = _interopRequireDefault(_videoJs);
+
+var _flashSourceBuffer = require('./flash-source-buffer');
+
+var _flashSourceBuffer2 = _interopRequireDefault(_flashSourceBuffer);
+
+var _flashConstants = require('./flash-constants');
+
+var _flashConstants2 = _interopRequireDefault(_flashConstants);
+
+var FlashMediaSource = (function (_videojs$EventTarget) {
+ _inherits(FlashMediaSource, _videojs$EventTarget);
+
+ function FlashMediaSource() {
+ var _this = this;
+
+ _classCallCheck(this, FlashMediaSource);
+
+ _get(Object.getPrototypeOf(FlashMediaSource.prototype), 'constructor', this).call(this);
+ this.sourceBuffers = [];
+ this.readyState = 'closed';
+
+ this.on(['sourceopen', 'webkitsourceopen'], function (event) {
+ // find the swf where we will push media data
+ _this.swfObj = document.getElementById(event.swfId);
+ _this.player_ = (0, _videoJs2['default'])(_this.swfObj.parentNode);
+ _this.tech_ = _this.swfObj.tech;
+ _this.readyState = 'open';
+
+ _this.tech_.on('seeking', function () {
+ var i = _this.sourceBuffers.length;
+
+ while (i--) {
+ _this.sourceBuffers[i].abort();
+ }
+ });
+
+ // trigger load events
+ if (_this.swfObj) {
+ _this.swfObj.vjs_load();
+ }
+ });
+ }
+
+ /**
+ * Set or return the presentation duration.
+ * @param value {double} the duration of the media in seconds
+ * @param {double} the current presentation duration
+ * @see http://www.w3.org/TR/media-source/#widl-MediaSource-duration
+ */
+
+ _createClass(FlashMediaSource, [{
+ key: 'addSeekableRange_',
+ value: function addSeekableRange_() {}
+ // intentional no-op
+
+ // create a new source buffer to receive a type of media data
+
+ }, {
+ key: 'addSourceBuffer',
+ value: function addSourceBuffer(type) {
+ var sourceBuffer = undefined;
+
+ // if this is an FLV type, we'll push data to flash
+ if (type.indexOf('video/mp2t') === 0) {
+ // Flash source buffers
+ sourceBuffer = new _flashSourceBuffer2['default'](this);
+ } else {
+ throw new Error('NotSupportedError (Video.js)');
+ }
+
+ this.sourceBuffers.push(sourceBuffer);
+ return sourceBuffer;
+ }
+
+ /* eslint-disable max-len */
+ /**
+ * Signals the end of the stream.
+ * @param error {string} (optional) Signals that a playback error
+ * has occurred. If specified, it must be either "network" or
+ * "decode".
+ * @see https://w3c.github.io/media-source/#widl-MediaSource-endOfStream-void-EndOfStreamError-error
+ */
+ /* eslint-enable max-len */
+ }, {
+ key: 'endOfStream',
+ value: function endOfStream(error) {
+ if (error === 'network') {
+ // MEDIA_ERR_NETWORK
+ this.tech_.error(2);
+ } else if (error === 'decode') {
+ // MEDIA_ERR_DECODE
+ this.tech_.error(3);
+ }
+ if (this.readyState !== 'ended') {
+ this.readyState = 'ended';
+ this.swfObj.vjs_endOfStream();
+ }
+ }
+ }]);
+
+ return FlashMediaSource;
+})(_videoJs2['default'].EventTarget);
+
+exports['default'] = FlashMediaSource;
+try {
+ Object.defineProperty(FlashMediaSource.prototype, 'duration', {
+ get: function get() {
+ if (!this.swfObj) {
+ return NaN;
+ }
+ // get the current duration from the SWF
+ return this.swfObj.vjs_getProperty('duration');
+ },
+ set: function set(value) {
+ var i = undefined;
+ var oldDuration = this.swfObj.vjs_getProperty('duration');
+
+ this.swfObj.vjs_setProperty('duration', value);
+
+ if (value < oldDuration) {
+ // In MSE, this triggers the range removal algorithm which causes
+ // an update to occur
+ for (i = 0; i < this.sourceBuffers.length; i++) {
+ this.sourceBuffers[i].remove(value, oldDuration);
+ }
+ }
+
+ return value;
+ }
+ });
+} catch (e) {
+ // IE8 throws if defineProperty is called on a non-DOM node. We
+ // don't support IE8 but we shouldn't throw an error if loaded
+ // there.
+ FlashMediaSource.prototype.duration = NaN;
+}
+
+for (var property in _flashConstants2['default']) {
+ FlashMediaSource[property] = _flashConstants2['default'][property];
+}
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./flash-constants":22,"./flash-source-buffer":24}],24:[function(require,module,exports){
+(function (global){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var _videoJs2 = _interopRequireDefault(_videoJs);
+
+var _muxJs = require('mux.js');
+
+var _muxJs2 = _interopRequireDefault(_muxJs);
+
+var _removeCuesFromTrack = require('./remove-cues-from-track');
+
+var _removeCuesFromTrack2 = _interopRequireDefault(_removeCuesFromTrack);
+
+var _createTextTracksIfNecessary = require('./create-text-tracks-if-necessary');
+
+var _createTextTracksIfNecessary2 = _interopRequireDefault(_createTextTracksIfNecessary);
+
+var _addTextTrackData = require('./add-text-track-data');
+
+var _addTextTrackData2 = _interopRequireDefault(_addTextTrackData);
+
+var _flashConstants = require('./flash-constants');
+
+var _flashConstants2 = _interopRequireDefault(_flashConstants);
+
+var scheduleTick = function scheduleTick(func) {
+ // Chrome doesn't invoke requestAnimationFrame callbacks
+ // in background tabs, so use setTimeout.
+ window.setTimeout(func, _flashConstants2['default'].TIME_BETWEEN_TICKS);
+};
+
+// Source Buffer
+
+var FlashSourceBuffer = (function (_videojs$EventTarget) {
+ _inherits(FlashSourceBuffer, _videojs$EventTarget);
+
+ function FlashSourceBuffer(mediaSource) {
+ var _this = this;
+
+ _classCallCheck(this, FlashSourceBuffer);
+
+ _get(Object.getPrototypeOf(FlashSourceBuffer.prototype), 'constructor', this).call(this);
+ var encodedHeader = undefined;
+
+ // Start off using the globally defined value but refine
+ // as we append data into flash
+ this.chunkSize_ = _flashConstants2['default'].BYTES_PER_CHUNK;
+
+ // byte arrays queued to be appended
+ this.buffer_ = [];
+
+ // the total number of queued bytes
+ this.bufferSize_ = 0;
+
+ // to be able to determine the correct position to seek to, we
+ // need to retain information about the mapping between the
+ // media timeline and PTS values
+ this.basePtsOffset_ = NaN;
+
+ this.mediaSource = mediaSource;
+
+ // indicates whether the asynchronous continuation of an operation
+ // is still being processed
+ // see https://w3c.github.io/media-source/#widl-SourceBuffer-updating
+ this.updating = false;
+ this.timestampOffset_ = 0;
+
+ // TS to FLV transmuxer
+ this.segmentParser_ = new _muxJs2['default'].flv.Transmuxer();
+ this.segmentParser_.on('data', this.receiveBuffer_.bind(this));
+ encodedHeader = window.btoa(String.fromCharCode.apply(null, Array.prototype.slice.call(this.segmentParser_.getFlvHeader())));
+ this.mediaSource.swfObj.vjs_appendBuffer(encodedHeader);
+
+ Object.defineProperty(this, 'timestampOffset', {
+ get: function get() {
+ return this.timestampOffset_;
+ },
+ set: function set(val) {
+ if (typeof val === 'number' && val >= 0) {
+ this.timestampOffset_ = val;
+ this.segmentParser_ = new _muxJs2['default'].flv.Transmuxer();
+ this.segmentParser_.on('data', this.receiveBuffer_.bind(this));
+ // We have to tell flash to expect a discontinuity
+ this.mediaSource.swfObj.vjs_discontinuity();
+ // the media <-> PTS mapping must be re-established after
+ // the discontinuity
+ this.basePtsOffset_ = NaN;
+ }
+ }
+ });
+
+ Object.defineProperty(this, 'buffered', {
+ get: function get() {
+ return _videoJs2['default'].createTimeRanges(this.mediaSource.swfObj.vjs_getProperty('buffered'));
+ }
+ });
+
+ // On a seek we remove all text track data since flash has no concept
+ // of a buffered-range and everything else is reset on seek
+ this.mediaSource.player_.on('seeked', function () {
+ (0, _removeCuesFromTrack2['default'])(0, Infinity, _this.metadataTrack_);
+ (0, _removeCuesFromTrack2['default'])(0, Infinity, _this.inbandTextTrack_);
+ });
+ }
+
+ // accept video data and pass to the video (swf) object
+
+ _createClass(FlashSourceBuffer, [{
+ key: 'appendBuffer',
+ value: function appendBuffer(bytes) {
+ var _this2 = this;
+
+ var error = undefined;
+ var chunk = 512 * 1024;
+ var i = 0;
+
+ if (this.updating) {
+ error = new Error('SourceBuffer.append() cannot be called ' + 'while an update is in progress');
+ error.name = 'InvalidStateError';
+ error.code = 11;
+ throw error;
+ }
+
+ this.updating = true;
+ this.mediaSource.readyState = 'open';
+ this.trigger({ type: 'update' });
+
+ // this is here to use recursion
+ var chunkInData = function chunkInData() {
+ _this2.segmentParser_.push(bytes.subarray(i, i + chunk));
+ i += chunk;
+ if (i < bytes.byteLength) {
+ scheduleTick(chunkInData);
+ } else {
+ scheduleTick(_this2.segmentParser_.flush.bind(_this2.segmentParser_));
+ }
+ };
+
+ chunkInData();
+ }
+
+ // reset the parser and remove any data queued to be sent to the swf
+ }, {
+ key: 'abort',
+ value: function abort() {
+ this.buffer_ = [];
+ this.bufferSize_ = 0;
+ this.mediaSource.swfObj.vjs_abort();
+
+ // report any outstanding updates have ended
+ if (this.updating) {
+ this.updating = false;
+ this.trigger({ type: 'updateend' });
+ }
+ }
+
+ // Flash cannot remove ranges already buffered in the NetStream
+ // but seeking clears the buffer entirely. For most purposes,
+ // having this operation act as a no-op is acceptable.
+ }, {
+ key: 'remove',
+ value: function remove(start, end) {
+ (0, _removeCuesFromTrack2['default'])(start, end, this.metadataTrack_);
+ (0, _removeCuesFromTrack2['default'])(start, end, this.inbandTextTrack_);
+ this.trigger({ type: 'update' });
+ this.trigger({ type: 'updateend' });
+ }
+ }, {
+ key: 'receiveBuffer_',
+ value: function receiveBuffer_(segment) {
+ var _this3 = this;
+
+ // create an in-band caption track if one is present in the segment
+ (0, _createTextTracksIfNecessary2['default'])(this, this.mediaSource, segment);
+ (0, _addTextTrackData2['default'])(this, segment.captions, segment.metadata);
+
+ // Do this asynchronously since convertTagsToData_ can be time consuming
+ scheduleTick(function () {
+ var flvBytes = _this3.convertTagsToData_(segment);
+
+ if (_this3.buffer_.length === 0) {
+ scheduleTick(_this3.processBuffer_.bind(_this3));
+ }
+
+ if (flvBytes) {
+ _this3.buffer_.push(flvBytes);
+ _this3.bufferSize_ += flvBytes.byteLength;
+ }
+ });
+ }
+
+ // append a portion of the current buffer to the SWF
+ }, {
+ key: 'processBuffer_',
+ value: function processBuffer_() {
+ var chunk = undefined;
+ var i = undefined;
+ var length = undefined;
+ var binary = undefined;
+ var b64str = undefined;
+ var startByte = 0;
+ var appendIterations = 0;
+ var startTime = +new Date();
+ var appendTime = undefined;
+
+ if (!this.buffer_.length) {
+ if (this.updating !== false) {
+ this.updating = false;
+ this.trigger({ type: 'updateend' });
+ }
+ // do nothing if the buffer is empty
+ return;
+ }
+
+ do {
+ appendIterations++;
+ // concatenate appends up to the max append size
+ chunk = this.buffer_[0].subarray(startByte, startByte + this.chunkSize_);
+
+ // requeue any bytes that won't make it this round
+ if (chunk.byteLength < this.chunkSize_ || this.buffer_[0].byteLength === startByte + this.chunkSize_) {
+ startByte = 0;
+ this.buffer_.shift();
+ } else {
+ startByte += this.chunkSize_;
+ }
+
+ this.bufferSize_ -= chunk.byteLength;
+
+ // base64 encode the bytes
+ binary = '';
+ length = chunk.byteLength;
+ for (i = 0; i < length; i++) {
+ binary += String.fromCharCode(chunk[i]);
+ }
+ b64str = window.btoa(binary);
+
+ // bypass normal ExternalInterface calls and pass xml directly
+ // IE can be slow by default
+ this.mediaSource.swfObj.CallFunction('<invoke name="vjs_appendBuffer"' + 'returntype="javascript"><arguments><string>' + b64str + '</string></arguments></invoke>');
+ appendTime = new Date() - startTime;
+ } while (this.buffer_.length && appendTime < _flashConstants2['default'].TIME_PER_TICK);
+
+ if (this.buffer_.length && startByte) {
+ this.buffer_[0] = this.buffer_[0].subarray(startByte);
+ }
+
+ if (appendTime >= _flashConstants2['default'].TIME_PER_TICK) {
+ // We want to target 4 iterations per time-slot so that gives us
+ // room to adjust to changes in Flash load and other externalities
+ // such as garbage collection while still maximizing throughput
+ this.chunkSize_ = Math.floor(this.chunkSize_ * (appendIterations / 4));
+ }
+
+ // We also make sure that the chunk-size doesn't drop below 1KB or
+ // go above 1MB as a sanity check
+ this.chunkSize_ = Math.max(_flashConstants2['default'].MIN_CHUNK, Math.min(this.chunkSize_, _flashConstants2['default'].MAX_CHUNK));
+
+ // schedule another append if necessary
+ if (this.bufferSize_ !== 0) {
+ scheduleTick(this.processBuffer_.bind(this));
+ } else {
+ this.updating = false;
+ this.trigger({ type: 'updateend' });
+ }
+ }
+
+ // Turns an array of flv tags into a Uint8Array representing the
+ // flv data. Also removes any tags that are before the current
+ // time so that playback begins at or slightly after the right
+ // place on a seek
+ }, {
+ key: 'convertTagsToData_',
+ value: function convertTagsToData_(segmentData) {
+ var segmentByteLength = 0;
+ var tech = this.mediaSource.tech_;
+ var targetPts = 0;
+ var i = undefined;
+ var j = undefined;
+ var segment = undefined;
+ var filteredTags = [];
+ var tags = this.getOrderedTags_(segmentData);
+
+ // Establish the media timeline to PTS translation if we don't
+ // have one already
+ if (isNaN(this.basePtsOffset_) && tags.length) {
+ this.basePtsOffset_ = tags[0].pts;
+ }
+
+ // Trim any tags that are before the end of the end of
+ // the current buffer
+ if (tech.buffered().length) {
+ targetPts = tech.buffered().end(0) - this.timestampOffset;
+ }
+ // Trim to currentTime if it's ahead of buffered or buffered doesn't exist
+ targetPts = Math.max(targetPts, tech.currentTime() - this.timestampOffset);
+
+ // PTS values are represented in milliseconds
+ targetPts *= 1e3;
+ targetPts += this.basePtsOffset_;
+
+ // skip tags with a presentation time less than the seek target
+ for (i = 0; i < tags.length; i++) {
+ if (tags[i].pts >= targetPts) {
+ filteredTags.push(tags[i]);
+ }
+ }
+
+ if (filteredTags.length === 0) {
+ return;
+ }
+
+ // concatenate the bytes into a single segment
+ for (i = 0; i < filteredTags.length; i++) {
+ segmentByteLength += filteredTags[i].bytes.byteLength;
+ }
+ segment = new Uint8Array(segmentByteLength);
+ for (i = 0, j = 0; i < filteredTags.length; i++) {
+ segment.set(filteredTags[i].bytes, j);
+ j += filteredTags[i].bytes.byteLength;
+ }
+
+ return segment;
+ }
+
+ // assemble the FLV tags in decoder order
+ }, {
+ key: 'getOrderedTags_',
+ value: function getOrderedTags_(segmentData) {
+ var videoTags = segmentData.tags.videoTags;
+ var audioTags = segmentData.tags.audioTags;
+ var tag = undefined;
+ var tags = [];
+
+ while (videoTags.length || audioTags.length) {
+ if (!videoTags.length) {
+ // only audio tags remain
+ tag = audioTags.shift();
+ } else if (!audioTags.length) {
+ // only video tags remain
+ tag = videoTags.shift();
+ } else if (audioTags[0].dts < videoTags[0].dts) {
+ // audio should be decoded next
+ tag = audioTags.shift();
+ } else {
+ // video should be decoded next
+ tag = videoTags.shift();
+ }
+
+ tags.push(tag.finalize());
+ }
+
+ return tags;
+ }
+ }]);
+
+ return FlashSourceBuffer;
+})(_videoJs2['default'].EventTarget);
+
+exports['default'] = FlashSourceBuffer;
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./add-text-track-data":20,"./create-text-tracks-if-necessary":21,"./flash-constants":22,"./remove-cues-from-track":26,"mux.js":37}],25:[function(require,module,exports){
+(function (global){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var _videoJs2 = _interopRequireDefault(_videoJs);
+
+var _virtualSourceBuffer = require('./virtual-source-buffer');
+
+var _virtualSourceBuffer2 = _interopRequireDefault(_virtualSourceBuffer);
+
+// Replace the old apple-style `avc1.<dd>.<dd>` codec string with the standard
+// `avc1.<hhhhhh>`
+var translateLegacyCodecs = function translateLegacyCodecs(codecs) {
+ return codecs.replace(/avc1\.(\d+)\.(\d+)/i, function (orig, profile, avcLevel) {
+ var profileHex = ('00' + Number(profile).toString(16)).slice(-2);
+ var avcLevelHex = ('00' + Number(avcLevel).toString(16)).slice(-2);
+
+ return 'avc1.' + profileHex + '00' + avcLevelHex;
+ });
+};
+
+var HtmlMediaSource = (function (_videojs$EventTarget) {
+ _inherits(HtmlMediaSource, _videojs$EventTarget);
+
+ function HtmlMediaSource() {
+ _classCallCheck(this, HtmlMediaSource);
+
+ _get(Object.getPrototypeOf(HtmlMediaSource.prototype), 'constructor', this).call(this, _videoJs2['default'].EventTarget);
+ /* eslint-disable consistent-this */
+ var self = this;
+ /* eslint-enable consistent-this */
+ var property = undefined;
+
+ this.mediaSource_ = new window.MediaSource();
+ // delegate to the native MediaSource's methods by default
+ for (property in this.mediaSource_) {
+ if (!(property in HtmlMediaSource.prototype) && typeof this.mediaSource_[property] === 'function') {
+ this[property] = this.mediaSource_[property].bind(this.mediaSource_);
+ }
+ }
+
+ // emulate `duration` and `seekable` until seeking can be
+ // handled uniformly for live streams
+ // see https://github.com/w3c/media-source/issues/5
+ this.duration_ = NaN;
+ Object.defineProperty(this, 'duration', {
+ get: function get() {
+ if (self.duration_ === Infinity) {
+ return self.duration_;
+ }
+ return self.mediaSource_.duration;
+ },
+ set: function set(duration) {
+ self.duration_ = duration;
+ if (duration !== Infinity) {
+ self.mediaSource_.duration = duration;
+ return;
+ }
+ }
+ });
+ Object.defineProperty(this, 'seekable', {
+ get: function get() {
+ if (this.duration_ === Infinity) {
+ return _videoJs2['default'].createTimeRanges([[0, self.mediaSource_.duration]]);
+ }
+ return self.mediaSource_.seekable;
+ }
+ });
+
+ Object.defineProperty(this, 'readyState', {
+ get: function get() {
+ return self.mediaSource_.readyState;
+ }
+ });
+
+ // the list of virtual and native SourceBuffers created by this
+ // MediaSource
+ this.sourceBuffers = [];
+
+ // Re-emit MediaSource events on the polyfill
+ ['sourceopen', 'sourceclose', 'sourceended'].forEach(function (eventName) {
+ this.mediaSource_.addEventListener(eventName, this.trigger.bind(this));
+ }, this);
+
+ // capture the associated player when the MediaSource is
+ // successfully attached
+ this.on('sourceopen', function (event) {
+ var video = document.querySelector('[src="' + self.url_ + '"]');
+
+ if (!video) {
+ return;
+ }
+
+ self.player_ = (0, _videoJs2['default'])(video.parentNode);
+ });
+
+ // explicitly terminate any WebWorkers that were created
+ // by SourceHandlers
+ this.on('sourceclose', function (event) {
+ this.sourceBuffers.forEach(function (sourceBuffer) {
+ if (sourceBuffer.transmuxer_) {
+ sourceBuffer.transmuxer_.terminate();
+ }
+ });
+
+ this.sourceBuffers.length = 0;
+ });
+ }
+
+ _createClass(HtmlMediaSource, [{
+ key: 'addSeekableRange_',
+ value: function addSeekableRange_(start, end) {
+ var error = undefined;
+
+ if (this.duration !== Infinity) {
+ error = new Error('MediaSource.addSeekableRange() can only be invoked ' + 'when the duration is Infinity');
+ error.name = 'InvalidStateError';
+ error.code = 11;
+ throw error;
+ }
+
+ if (end > this.mediaSource_.duration || isNaN(this.mediaSource_.duration)) {
+ this.mediaSource_.duration = end;
+ }
+ }
+ }, {
+ key: 'addSourceBuffer',
+ value: function addSourceBuffer(type) {
+ var buffer = undefined;
+ var codecs = undefined;
+ var avcCodec = undefined;
+ var mp4aCodec = undefined;
+ var avcRegEx = /avc1\.[\da-f]+/i;
+ var mp4aRegEx = /mp4a\.\d+.\d+/i;
+
+ // create a virtual source buffer to transmux MPEG-2 transport
+ // stream segments into fragmented MP4s
+ if (/^video\/mp2t/i.test(type)) {
+ codecs = type.split(';').slice(1).join(';');
+ codecs = translateLegacyCodecs(codecs);
+
+ // Pull out each individual codec string if it exists
+ avcCodec = (codecs.match(avcRegEx) || [])[0];
+ mp4aCodec = (codecs.match(mp4aRegEx) || [])[0];
+
+ // If a codec is unspecified, use the defaults
+ if (!avcCodec || !avcCodec.length) {
+ avcCodec = 'avc1.4d400d';
+ }
+ if (!mp4aCodec || !mp4aCodec.length) {
+ mp4aCodec = 'mp4a.40.2';
+ }
+
+ buffer = new _virtualSourceBuffer2['default'](this, [avcCodec, mp4aCodec]);
+ this.sourceBuffers.push(buffer);
+ return buffer;
+ }
+
+ // delegate to the native implementation
+ buffer = this.mediaSource_.addSourceBuffer(type);
+ this.sourceBuffers.push(buffer);
+ return buffer;
+ }
+ }]);
+
+ return HtmlMediaSource;
+})(_videoJs2['default'].EventTarget);
+
+exports['default'] = HtmlMediaSource;
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./virtual-source-buffer":29}],26:[function(require,module,exports){
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var removeCuesFromTrack = function removeCuesFromTrack(start, end, track) {
+ var i = undefined;
+ var cue = undefined;
+
+ if (!track) {
+ return;
+ }
+
+ i = track.cues.length;
+
+ while (i--) {
+ cue = track.cues[i];
+
+ // Remove any overlapping cue
+ if (cue.startTime <= end && cue.endTime >= start) {
+ track.removeCue(cue);
+ }
+ }
+};
+
+exports["default"] = removeCuesFromTrack;
+module.exports = exports["default"];
+},{}],27:[function(require,module,exports){
+/**
+ * videojs-contrib-media-sources
+ *
+ * Copyright (c) 2015 Brightcove
+ * All rights reserved.
+ *
+ * Handles communication between the browser-world and the mux.js
+ * transmuxer running inside of a WebWorker by exposing a simple
+ * message-based interface to a Transmuxer object.
+ */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+var _muxJs = require('mux.js');
+
+var _muxJs2 = _interopRequireDefault(_muxJs);
+
+var globalTransmuxer = undefined;
+var initOptions = {};
+
+/**
+ * wireTransmuxerEvents
+ * Re-emits tranmsuxer events by converting them into messages to the
+ * world outside the worker
+ */
+var wireTransmuxerEvents = function wireTransmuxerEvents(transmuxer) {
+ transmuxer.on('data', function (segment) {
+ // transfer ownership of the underlying ArrayBuffer
+ // instead of doing a copy to save memory
+ // ArrayBuffers are transferable but generic TypedArrays are not
+ /* eslint-disable max-len */
+ // see https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Passing_data_by_transferring_ownership_(transferable_objects)
+ /* eslint-enable max-len */
+ var typedArray = segment.data;
+
+ segment.data = typedArray.buffer;
+ postMessage({
+ action: 'data',
+ segment: segment,
+ byteOffset: typedArray.byteOffset,
+ byteLength: typedArray.byteLength
+ }, [segment.data]);
+ });
+
+ if (transmuxer.captionStream) {
+ transmuxer.captionStream.on('data', function (caption) {
+ postMessage({
+ action: 'caption',
+ data: caption
+ });
+ });
+ }
+
+ transmuxer.on('done', function (data) {
+ postMessage({ action: 'done' });
+ });
+};
+
+/**
+ * All incoming messages route through this hash. If no function exists
+ * to handle an incoming message, then we ignore the message.
+ */
+var messageHandlers = {
+ /**
+ * init
+ * Allows you to initialize the transmuxer and pass along options from
+ * outside the worker
+ */
+ init: function init(data) {
+ initOptions = data && data.options || {};
+ this.defaultInit();
+ },
+ /**
+ * defaultInit
+ * Is called before every function and initializes the transmuxer with
+ * default options if `init` was never explicitly called
+ */
+ defaultInit: function defaultInit() {
+ if (globalTransmuxer) {
+ globalTransmuxer.dispose();
+ }
+ globalTransmuxer = new _muxJs2['default'].mp4.Transmuxer(initOptions);
+ wireTransmuxerEvents(globalTransmuxer);
+ },
+ /**
+ * push
+ * Adds data (a ts segment) to the start of the transmuxer pipeline for
+ * processing
+ */
+ push: function push(data) {
+ // Cast array buffer to correct type for transmuxer
+ var segment = new Uint8Array(data.data, data.byteOffset, data.byteLength);
+
+ globalTransmuxer.push(segment);
+ },
+ /**
+ * reset
+ * Recreate the transmuxer so that the next segment added via `push`
+ * start with a fresh transmuxer
+ */
+ reset: function reset() {
+ this.defaultInit();
+ },
+ /**
+ * setTimestampOffset
+ * Set the value that will be used as the `baseMediaDecodeTime` time for the
+ * next segment pushed in. Subsequent segments will have their `baseMediaDecodeTime`
+ * set relative to the first based on the PTS values.
+ */
+ setTimestampOffset: function setTimestampOffset(data) {
+ var timestampOffset = data.timestampOffset || 0;
+
+ globalTransmuxer.setBaseMediaDecodeTime(Math.round(timestampOffset * 90000));
+ },
+ /**
+ * flush
+ * Forces the pipeline to finish processing the last segment and emit it's
+ * results
+ */
+ flush: function flush(data) {
+ globalTransmuxer.flush();
+ }
+};
+
+var Worker = function Worker(self) {
+ self.onmessage = function (event) {
+ // Setup the default transmuxer if one doesn't exist yet and we are invoked with
+ // an action other than `init`
+ if (!globalTransmuxer && event.data.action !== 'init') {
+ messageHandlers.defaultInit();
+ }
+
+ if (event.data && event.data.action) {
+ if (messageHandlers[event.data.action]) {
+ messageHandlers[event.data.action](event.data);
+ }
+ }
+ };
+};
+
+exports['default'] = Worker;
+module.exports = exports['default'];
+},{"mux.js":37}],28:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+var _flashMediaSource = require('./flash-media-source');
+
+var _flashMediaSource2 = _interopRequireDefault(_flashMediaSource);
+
+var _htmlMediaSource = require('./html-media-source');
+
+var _htmlMediaSource2 = _interopRequireDefault(_htmlMediaSource);
+
+// import videojs from 'video.js';
+var videojs = window.videojs;
+var urlCount = 0;
+
+// ------------
+// Media Source
+// ------------
+
+var defaults = {
+ // how to determine the MediaSource implementation to use. There
+ // are three available modes:
+ // - auto: use native MediaSources where available and Flash
+ // everywhere else
+ // - html5: always use native MediaSources
+ // - flash: always use the Flash MediaSource polyfill
+ mode: 'auto'
+};
+
+// store references to the media sources so they can be connected
+// to a video element (a swf object)
+videojs.mediaSources = {};
+
+// provide a method for a swf object to notify JS that a media source is now open
+var open = function open(msObjectURL, swfId) {
+ var mediaSource = videojs.mediaSources[msObjectURL];
+
+ if (mediaSource) {
+ mediaSource.trigger({ type: 'sourceopen', swfId: swfId });
+ } else {
+ throw new Error('Media Source not found (Video.js)');
+ }
+};
+
+// Check to see if the native MediaSource object exists and supports
+// an MP4 container with both H.264 video and AAC-LC audio
+var supportsNativeMediaSources = function supportsNativeMediaSources() {
+ return !!window.MediaSource && window.MediaSource.isTypeSupported('video/mp4;codecs="avc1.4d400d,mp4a.40.2"');
+};
+
+var MediaSource = function MediaSource(options) {
+ var settings = videojs.mergeOptions(defaults, options);
+
+ this.MediaSource = {
+ open: open,
+ supportsNativeMediaSources: supportsNativeMediaSources
+ };
+
+ // determine whether HTML MediaSources should be used
+ if (settings.mode === 'html5' || settings.mode === 'auto' && supportsNativeMediaSources()) {
+ return new _htmlMediaSource2['default']();
+ }
+
+ // otherwise, emulate them through the SWF
+ return new _flashMediaSource2['default']();
+};
+
+exports.MediaSource = MediaSource;
+MediaSource.open = open;
+MediaSource.supportsNativeMediaSources = supportsNativeMediaSources;
+
+var URL = {
+ createObjectURL: function createObjectURL(object) {
+ var objectUrlPrefix = 'blob:vjs-media-source/';
+ var url = undefined;
+
+ // use the native MediaSource to generate an object URL
+ if (object instanceof _htmlMediaSource2['default']) {
+ url = window.URL.createObjectURL(object.mediaSource_);
+ object.url_ = url;
+ return url;
+ }
+ // if the object isn't an emulated MediaSource, delegate to the
+ // native implementation
+ if (!(object instanceof _flashMediaSource2['default'])) {
+ url = window.URL.createObjectURL(object);
+ object.url_ = url;
+ return url;
+ }
+
+ // build a URL that can be used to map back to the emulated
+ // MediaSource
+ url = objectUrlPrefix + urlCount;
+
+ urlCount++;
+
+ // setup the mapping back to object
+ videojs.mediaSources[url] = object;
+
+ return url;
+ }
+};
+
+exports.URL = URL;
+videojs.MediaSource = MediaSource;
+videojs.URL = URL;
+},{"./flash-media-source":23,"./html-media-source":25}],29:[function(require,module,exports){
+(function (global){
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var _videoJs2 = _interopRequireDefault(_videoJs);
+
+var _createTextTracksIfNecessary = require('./create-text-tracks-if-necessary');
+
+var _createTextTracksIfNecessary2 = _interopRequireDefault(_createTextTracksIfNecessary);
+
+var _removeCuesFromTrack = require('./remove-cues-from-track');
+
+var _removeCuesFromTrack2 = _interopRequireDefault(_removeCuesFromTrack);
+
+var _addTextTrackData = require('./add-text-track-data');
+
+var _addTextTrackData2 = _interopRequireDefault(_addTextTrackData);
+
+var _webworkify = require('webworkify');
+
+var _webworkify2 = _interopRequireDefault(_webworkify);
+
+var _transmuxerWorker = require('./transmuxer-worker');
+
+var _transmuxerWorker2 = _interopRequireDefault(_transmuxerWorker);
+
+var aggregateUpdateHandler = function aggregateUpdateHandler(mediaSource, guardBufferName, type) {
+ return function () {
+ if (!mediaSource[guardBufferName] || !mediaSource[guardBufferName].updating) {
+ return mediaSource.trigger(type);
+ }
+ };
+};
+
+var VirtualSourceBuffer = (function (_videojs$EventTarget) {
+ _inherits(VirtualSourceBuffer, _videojs$EventTarget);
+
+ function VirtualSourceBuffer(mediaSource, codecs) {
+ var _this = this;
+
+ _classCallCheck(this, VirtualSourceBuffer);
+
+ _get(Object.getPrototypeOf(VirtualSourceBuffer.prototype), 'constructor', this).call(this, _videoJs2['default'].EventTarget);
+ this.timestampOffset_ = 0;
+ this.pendingBuffers_ = [];
+ this.bufferUpdating_ = false;
+ this.mediaSource_ = mediaSource;
+ this.codecs_ = codecs;
+
+ // append muxed segments to their respective native buffers as
+ // soon as they are available
+ this.transmuxer_ = (0, _webworkify2['default'])(_transmuxerWorker2['default']);
+ this.transmuxer_.postMessage({ action: 'init', options: { remux: false } });
+
+ this.transmuxer_.onmessage = function (event) {
+ if (event.data.action === 'data') {
+ return _this.data_(event);
+ }
+
+ if (event.data.action === 'done') {
+ return _this.done_(event);
+ }
+ };
+
+ // this timestampOffset is a property with the side-effect of resetting
+ // baseMediaDecodeTime in the transmuxer on the setter
+ Object.defineProperty(this, 'timestampOffset', {
+ get: function get() {
+ return this.timestampOffset_;
+ },
+ set: function set(val) {
+ if (typeof val === 'number' && val >= 0) {
+ this.timestampOffset_ = val;
+
+ // We have to tell the transmuxer to set the baseMediaDecodeTime to
+ // the desired timestampOffset for the next segment
+ this.transmuxer_.postMessage({
+ action: 'setTimestampOffset',
+ timestampOffset: val
+ });
+ }
+ }
+ });
+ // setting the append window affects both source buffers
+ Object.defineProperty(this, 'appendWindowStart', {
+ get: function get() {
+ return (this.videoBuffer_ || this.audioBuffer_).appendWindowStart;
+ },
+ set: function set(start) {
+ if (this.videoBuffer_) {
+ this.videoBuffer_.appendWindowStart = start;
+ }
+ if (this.audioBuffer_) {
+ this.audioBuffer_.appendWindowStart = start;
+ }
+ }
+ });
+ // this buffer is "updating" if either of its native buffers are
+ Object.defineProperty(this, 'updating', {
+ get: function get() {
+ return this.bufferUpdating_ || this.audioBuffer_ && this.audioBuffer_.updating || this.videoBuffer_ && this.videoBuffer_.updating;
+ }
+ });
+ // the buffered property is the intersection of the buffered
+ // ranges of the native source buffers
+ Object.defineProperty(this, 'buffered', {
+ get: function get() {
+ var start = null;
+ var end = null;
+ var arity = 0;
+ var extents = [];
+ var ranges = [];
+
+ // Handle the case where there is no buffer data
+ if ((!this.videoBuffer_ || this.videoBuffer_.buffered.length === 0) && (!this.audioBuffer_ || this.audioBuffer_.buffered.length === 0)) {
+ return _videoJs2['default'].createTimeRange();
+ }
+
+ // Handle the case where we only have one buffer
+ if (!this.videoBuffer_) {
+ return this.audioBuffer_.buffered;
+ } else if (!this.audioBuffer_) {
+ return this.videoBuffer_.buffered;
+ }
+
+ // Handle the case where we have both buffers and create an
+ // intersection of the two
+ var videoBuffered = this.videoBuffer_.buffered;
+ var audioBuffered = this.audioBuffer_.buffered;
+ var count = videoBuffered.length;
+
+ // A) Gather up all start and end times
+ while (count--) {
+ extents.push({ time: videoBuffered.start(count), type: 'start' });
+ extents.push({ time: videoBuffered.end(count), type: 'end' });
+ }
+ count = audioBuffered.length;
+ while (count--) {
+ extents.push({ time: audioBuffered.start(count), type: 'start' });
+ extents.push({ time: audioBuffered.end(count), type: 'end' });
+ }
+ // B) Sort them by time
+ extents.sort(function (a, b) {
+ return a.time - b.time;
+ });
+
+ // C) Go along one by one incrementing arity for start and decrementing
+ // arity for ends
+ for (count = 0; count < extents.length; count++) {
+ if (extents[count].type === 'start') {
+ arity++;
+
+ // D) If arity is ever incremented to 2 we are entering an
+ // overlapping range
+ if (arity === 2) {
+ start = extents[count].time;
+ }
+ } else if (extents[count].type === 'end') {
+ arity--;
+
+ // E) If arity is ever decremented to 1 we leaving an
+ // overlapping range
+ if (arity === 1) {
+ end = extents[count].time;
+ }
+ }
+
+ // F) Record overlapping ranges
+ if (start !== null && end !== null) {
+ ranges.push([start, end]);
+ start = null;
+ end = null;
+ }
+ }
+
+ return _videoJs2['default'].createTimeRanges(ranges);
+ }
+ });
+ }
+
+ // Transmuxer message handlers
+
+ _createClass(VirtualSourceBuffer, [{
+ key: 'data_',
+ value: function data_(event) {
+ var segment = event.data.segment;
+ var nativeMediaSource = this.mediaSource_.mediaSource_;
+
+ // Cast ArrayBuffer to TypedArray
+ segment.data = new Uint8Array(segment.data, event.data.byteOffset, event.data.byteLength);
+
+ // If any sourceBuffers have not been created, do so now
+ if (segment.type === 'video') {
+ if (!this.videoBuffer_) {
+ this.videoBuffer_ = nativeMediaSource.addSourceBuffer('video/mp4;codecs="' + this.codecs_[0] + '"');
+ // aggregate buffer events
+ this.videoBuffer_.addEventListener('updatestart', aggregateUpdateHandler(this, 'audioBuffer_', 'updatestart'));
+ this.videoBuffer_.addEventListener('update', aggregateUpdateHandler(this, 'audioBuffer_', 'update'));
+ this.videoBuffer_.addEventListener('updateend', aggregateUpdateHandler(this, 'audioBuffer_', 'updateend'));
+ }
+ } else if (segment.type === 'audio') {
+ if (!this.audioBuffer_) {
+ this.audioBuffer_ = nativeMediaSource.addSourceBuffer('audio/mp4;codecs="' + this.codecs_[1] + '"');
+ // aggregate buffer events
+ this.audioBuffer_.addEventListener('updatestart', aggregateUpdateHandler(this, 'videoBuffer_', 'updatestart'));
+ this.audioBuffer_.addEventListener('update', aggregateUpdateHandler(this, 'videoBuffer_', 'update'));
+ this.audioBuffer_.addEventListener('updateend', aggregateUpdateHandler(this, 'videoBuffer_', 'updateend'));
+ }
+ } else if (segment.type === 'combined') {
+ if (!this.videoBuffer_) {
+ this.videoBuffer_ = nativeMediaSource.addSourceBuffer('video/mp4;codecs="' + this.codecs_.join(',') + '"');
+ // aggregate buffer events
+ this.videoBuffer_.addEventListener('updatestart', aggregateUpdateHandler(this, 'videoBuffer_', 'updatestart'));
+ this.videoBuffer_.addEventListener('update', aggregateUpdateHandler(this, 'videoBuffer_', 'update'));
+ this.videoBuffer_.addEventListener('updateend', aggregateUpdateHandler(this, 'videoBuffer_', 'updateend'));
+ }
+ }
+ (0, _createTextTracksIfNecessary2['default'])(this, this.mediaSource_, segment);
+
+ // Add the segments to the pendingBuffers array
+ this.pendingBuffers_.push(segment);
+ return;
+ }
+ }, {
+ key: 'done_',
+ value: function done_() {
+ // All buffers should have been flushed from the muxer
+ // start processing anything we have received
+ this.processPendingSegments_();
+ return;
+ }
+
+ // SourceBuffer Implementation
+
+ }, {
+ key: 'appendBuffer',
+ value: function appendBuffer(segment) {
+ // Start the internal "updating" state
+ this.bufferUpdating_ = true;
+
+ this.transmuxer_.postMessage({
+ action: 'push',
+ // Send the typed-array of data as an ArrayBuffer so that
+ // it can be sent as a "Transferable" and avoid the costly
+ // memory copy
+ data: segment.buffer,
+
+ // To recreate the original typed-array, we need information
+ // about what portion of the ArrayBuffer it was a view into
+ byteOffset: segment.byteOffset,
+ byteLength: segment.byteLength
+ }, [segment.buffer]);
+ this.transmuxer_.postMessage({ action: 'flush' });
+ }
+ }, {
+ key: 'remove',
+ value: function remove(start, end) {
+ if (this.videoBuffer_) {
+ this.videoBuffer_.remove(start, end);
+ }
+ if (this.audioBuffer_) {
+ this.audioBuffer_.remove(start, end);
+ }
+
+ // Remove Metadata Cues (id3)
+ (0, _removeCuesFromTrack2['default'])(start, end, this.metadataTrack_);
+
+ // Remove Any Captions
+ (0, _removeCuesFromTrack2['default'])(start, end, this.inbandTextTrack_);
+ }
+
+ /**
+ * Process any segments that the muxer has output
+ * Concatenate segments together based on type and append them into
+ * their respective sourceBuffers
+ */
+ }, {
+ key: 'processPendingSegments_',
+ value: function processPendingSegments_() {
+ var sortedSegments = {
+ video: {
+ segments: [],
+ bytes: 0
+ },
+ audio: {
+ segments: [],
+ bytes: 0
+ },
+ captions: [],
+ metadata: []
+ };
+
+ // Sort segments into separate video/audio arrays and
+ // keep track of their total byte lengths
+ sortedSegments = this.pendingBuffers_.reduce(function (segmentObj, segment) {
+ var type = segment.type;
+ var data = segment.data;
+
+ // A "combined" segment type (unified video/audio) uses the videoBuffer
+ if (type === 'combined') {
+ type = 'video';
+ }
+
+ segmentObj[type].segments.push(data);
+ segmentObj[type].bytes += data.byteLength;
+
+ // Gather any captions into a single array
+ if (segment.captions) {
+ segmentObj.captions = segmentObj.captions.concat(segment.captions);
+ }
+
+ // Gather any metadata into a single array
+ if (segment.metadata) {
+ segmentObj.metadata = segmentObj.metadata.concat(segment.metadata);
+ }
+
+ return segmentObj;
+ }, sortedSegments);
+
+ (0, _addTextTrackData2['default'])(this, sortedSegments.captions, sortedSegments.metadata);
+
+ // Merge multiple video and audio segments into one and append
+ this.concatAndAppendSegments_(sortedSegments.video, this.videoBuffer_);
+ this.concatAndAppendSegments_(sortedSegments.audio, this.audioBuffer_);
+
+ this.pendingBuffers_.length = 0;
+
+ // We are no longer in the internal "updating" state
+ this.bufferUpdating_ = false;
+ }
+
+ /**
+ * Combind all segments into a single Uint8Array and then append them
+ * to the destination buffer
+ */
+ }, {
+ key: 'concatAndAppendSegments_',
+ value: function concatAndAppendSegments_(segmentObj, destinationBuffer) {
+ var offset = 0;
+ var tempBuffer = undefined;
+
+ if (segmentObj.bytes) {
+ tempBuffer = new Uint8Array(segmentObj.bytes);
+
+ // Combine the individual segments into one large typed-array
+ segmentObj.segments.forEach(function (segment) {
+ tempBuffer.set(segment, offset);
+ offset += segment.byteLength;
+ });
+
+ destinationBuffer.appendBuffer(tempBuffer);
+ }
+ }
+
+ // abort any sourceBuffer actions and throw out any un-appended data
+ }, {
+ key: 'abort',
+ value: function abort() {
+ if (this.videoBuffer_) {
+ this.videoBuffer_.abort();
+ }
+ if (this.audioBuffer_) {
+ this.audioBuffer_.abort();
+ }
+ if (this.transmuxer_) {
+ this.transmuxer_.postMessage({ action: 'reset' });
+ }
+ this.pendingBuffers_.length = 0;
+ this.bufferUpdating_ = false;
+ }
+ }]);
+
+ return VirtualSourceBuffer;
+})(_videoJs2['default'].EventTarget);
+
+exports['default'] = VirtualSourceBuffer;
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./add-text-track-data":20,"./create-text-tracks-if-necessary":21,"./remove-cues-from-track":26,"./transmuxer-worker":27,"webworkify":50}],30:[function(require,module,exports){
+/**
+ * mux.js
+ *
+ * Copyright (c) 2016 Brightcove
+ * All rights reserved.
+ *
+ * A stream-based aac to mp4 converter. This utility can be used to
+ * deliver mp4s to a SourceBuffer on platforms that support native
+ * Media Source Extensions.
+ */
+'use strict';
+var Stream = require('../utils/stream.js');
+
+// Constants
+var AacStream;
+
+/**
+ * Splits an incoming stream of binary data into ADTS and ID3 Frames.
+ */
+
+AacStream = function() {
+ var
+ everything,
+ receivedTimeStamp = false,
+ timeStamp = 0;
+
+ AacStream.prototype.init.call(this);
+
+ this.setTimestamp = function (timestamp) {
+ timeStamp = timestamp;
+ };
+
+ this.parseId3TagSize = function(header, byteIndex) {
+ var
+ returnSize = (header[byteIndex + 6] << 21) |
+ (header[byteIndex + 7] << 14) |
+ (header[byteIndex + 8] << 7) |
+ (header[byteIndex + 9]),
+ flags = header[byteIndex + 5],
+ footerPresent = (flags & 16) >> 4;
+
+ if (footerPresent) {
+ return returnSize + 20;
+ }
+ return returnSize + 10;
+ };
+
+ this.parseAdtsSize = function(header, byteIndex) {
+ var
+ lowThree = (header[byteIndex + 5] & 0xE0) >> 5,
+ middle = header[byteIndex + 4] << 3,
+ highTwo = header[byteIndex + 3] & 0x3 << 11;
+
+ return (highTwo | middle) | lowThree;
+ };
+
+ this.push = function(bytes) {
+ var
+ frameSize = 0,
+ byteIndex = 0,
+ chunk,
+ packet,
+ tempLength;
+
+ // If there are bytes remaining from the last segment, prepend them to the
+ // bytes that were pushed in
+ if (everything !== undefined && everything.length) {
+ tempLength = everything.length;
+ everything = new Uint8Array(bytes.byteLength + tempLength);
+ everything.set(everything.subarray(0, tempLength));
+ everything.set(bytes, tempLength);
+ } else {
+ everything = bytes;
+ }
+
+ while (everything.length - byteIndex >= 10) {
+ if ((everything[byteIndex] === 'I'.charCodeAt(0)) &&
+ (everything[byteIndex + 1] === 'D'.charCodeAt(0)) &&
+ (everything[byteIndex + 2] === '3'.charCodeAt(0))) {
+
+ //check framesize
+ frameSize = this.parseId3TagSize(everything, byteIndex);
+ //we have enough in the buffer to emit a full packet
+ if (frameSize > everything.length) {
+ break;
+ }
+ chunk = {
+ type: 'timed-metadata',
+ data: everything.subarray(byteIndex, byteIndex + frameSize)
+ };
+ this.trigger('data', chunk);
+ byteIndex += frameSize;
+ continue;
+ } else if ((everything[byteIndex] & 0xff === 0xff) &&
+ ((everything[byteIndex + 1] & 0xf0) === 0xf0)) {
+ frameSize = this.parseAdtsSize(everything, byteIndex);
+
+ if (frameSize > everything.length) {
+ break;
+ }
+ packet = {
+ type: 'audio',
+ data: everything.subarray(byteIndex, byteIndex + frameSize),
+ pts: timeStamp,
+ dts: timeStamp,
+ };
+ this.trigger('data', packet);
+ byteIndex += frameSize;
+ continue;
+ }
+ byteIndex++;
+ }
+ };
+};
+
+AacStream.prototype = new Stream();
+
+
+
+module.exports = AacStream;
+
+},{"../utils/stream.js":49}],31:[function(require,module,exports){
+'use strict';
+
+var Stream = require('../utils/stream.js');
+
+var AdtsStream;
+
+var
+ ADTS_SAMPLING_FREQUENCIES = [
+ 96000,
+ 88200,
+ 64000,
+ 48000,
+ 44100,
+ 32000,
+ 24000,
+ 22050,
+ 16000,
+ 12000,
+ 11025,
+ 8000,
+ 7350
+ ];
+
+/*
+ * Accepts a ElementaryStream and emits data events with parsed
+ * AAC Audio Frames of the individual packets. Input audio in ADTS
+ * format is unpacked and re-emitted as AAC frames.
+ *
+ * @see http://wiki.multimedia.cx/index.php?title=ADTS
+ * @see http://wiki.multimedia.cx/?title=Understanding_AAC
+ */
+AdtsStream = function() {
+ var self, buffer;
+
+ AdtsStream.prototype.init.call(this);
+
+ self = this;
+
+ this.push = function(packet) {
+ var
+ i = 0,
+ frameNum = 0,
+ frameLength,
+ protectionSkipBytes,
+ frameEnd,
+ oldBuffer,
+ numFrames,
+ sampleCount,
+ adtsFrameDuration;
+
+ if (packet.type !== 'audio') {
+ // ignore non-audio data
+ return;
+ }
+
+ // Prepend any data in the buffer to the input data so that we can parse
+ // aac frames the cross a PES packet boundary
+ if (buffer) {
+ oldBuffer = buffer;
+ buffer = new Uint8Array(oldBuffer.byteLength + packet.data.byteLength);
+ buffer.set(oldBuffer);
+ buffer.set(packet.data, oldBuffer.byteLength);
+ } else {
+ buffer = packet.data;
+ }
+
+ // unpack any ADTS frames which have been fully received
+ // for details on the ADTS header, see http://wiki.multimedia.cx/index.php?title=ADTS
+ while (i + 5 < buffer.length) {
+
+ // Loook for the start of an ADTS header..
+ if (buffer[i] !== 0xFF || (buffer[i + 1] & 0xF6) !== 0xF0) {
+ // If a valid header was not found, jump one forward and attempt to
+ // find a valid ADTS header starting at the next byte
+ i++;
+ continue;
+ }
+
+ // The protection skip bit tells us if we have 2 bytes of CRC data at the
+ // end of the ADTS header
+ protectionSkipBytes = (~buffer[i + 1] & 0x01) * 2;
+
+ // Frame length is a 13 bit integer starting 16 bits from the
+ // end of the sync sequence
+ frameLength = ((buffer[i + 3] & 0x03) << 11) |
+ (buffer[i + 4] << 3) |
+ ((buffer[i + 5] & 0xe0) >> 5);
+
+ sampleCount = ((buffer[i + 6] & 0x03) + 1) * 1024;
+ adtsFrameDuration = (sampleCount * 90000) /
+ ADTS_SAMPLING_FREQUENCIES[(buffer[i + 2] & 0x3c) >>> 2];
+
+ frameEnd = i + frameLength;
+
+ // If we don't have enough data to actually finish this ADTS frame, return
+ // and wait for more data
+ if (buffer.byteLength < frameEnd) {
+ return;
+ }
+
+ // Otherwise, deliver the complete AAC frame
+ this.trigger('data', {
+ pts: packet.pts + (frameNum * adtsFrameDuration),
+ dts: packet.dts + (frameNum * adtsFrameDuration),
+ sampleCount: sampleCount,
+ audioobjecttype: ((buffer[i + 2] >>> 6) & 0x03) + 1,
+ channelcount: ((buffer[i + 2] & 1) << 3) |
+ ((buffer[i + 3] & 0xc0) >>> 6),
+ samplerate: ADTS_SAMPLING_FREQUENCIES[(buffer[i + 2] & 0x3c) >>> 2],
+ samplingfrequencyindex: (buffer[i + 2] & 0x3c) >>> 2,
+ // assume ISO/IEC 14496-12 AudioSampleEntry default of 16
+ samplesize: 16,
+ data: buffer.subarray(i + 7 + protectionSkipBytes, frameEnd)
+ });
+
+ // If the buffer is empty, clear it and return
+ if (buffer.byteLength === frameEnd) {
+ buffer = undefined;
+ return;
+ }
+
+ frameNum++;
+
+ // Remove the finished frame from the buffer and start the process again
+ buffer = buffer.subarray(frameEnd);
+ }
+ };
+ this.flush = function() {
+ this.trigger('done');
+ };
+};
+
+AdtsStream.prototype = new Stream();
+
+module.exports = AdtsStream;
+
+},{"../utils/stream.js":49}],32:[function(require,module,exports){
+'use strict';
+
+var Stream = require('../utils/stream.js');
+var ExpGolomb = require('../utils/exp-golomb.js');
+
+var H264Stream, NalByteStream;
+
+/**
+ * Accepts a NAL unit byte stream and unpacks the embedded NAL units.
+ */
+NalByteStream = function() {
+ var
+ syncPoint = 0,
+ i,
+ buffer;
+ NalByteStream.prototype.init.call(this);
+
+ this.push = function(data) {
+ var swapBuffer;
+
+ if (!buffer) {
+ buffer = data.data;
+ } else {
+ swapBuffer = new Uint8Array(buffer.byteLength + data.data.byteLength);
+ swapBuffer.set(buffer);
+ swapBuffer.set(data.data, buffer.byteLength);
+ buffer = swapBuffer;
+ }
+
+ // Rec. ITU-T H.264, Annex B
+ // scan for NAL unit boundaries
+
+ // a match looks like this:
+ // 0 0 1 .. NAL .. 0 0 1
+ // ^ sync point ^ i
+ // or this:
+ // 0 0 1 .. NAL .. 0 0 0
+ // ^ sync point ^ i
+
+ // advance the sync point to a NAL start, if necessary
+ for (; syncPoint < buffer.byteLength - 3; syncPoint++) {
+ if (buffer[syncPoint + 2] === 1) {
+ // the sync point is properly aligned
+ i = syncPoint + 5;
+ break;
+ }
+ }
+
+ while (i < buffer.byteLength) {
+ // look at the current byte to determine if we've hit the end of
+ // a NAL unit boundary
+ switch (buffer[i]) {
+ case 0:
+ // skip past non-sync sequences
+ if (buffer[i - 1] !== 0) {
+ i += 2;
+ break;
+ } else if (buffer[i - 2] !== 0) {
+ i++;
+ break;
+ }
+
+ // deliver the NAL unit
+ this.trigger('data', buffer.subarray(syncPoint + 3, i - 2));
+
+ // drop trailing zeroes
+ do {
+ i++;
+ } while (buffer[i] !== 1 && i < buffer.length);
+ syncPoint = i - 2;
+ i += 3;
+ break;
+ case 1:
+ // skip past non-sync sequences
+ if (buffer[i - 1] !== 0 ||
+ buffer[i - 2] !== 0) {
+ i += 3;
+ break;
+ }
+
+ // deliver the NAL unit
+ this.trigger('data', buffer.subarray(syncPoint + 3, i - 2));
+ syncPoint = i - 2;
+ i += 3;
+ break;
+ default:
+ // the current byte isn't a one or zero, so it cannot be part
+ // of a sync sequence
+ i += 3;
+ break;
+ }
+ }
+ // filter out the NAL units that were delivered
+ buffer = buffer.subarray(syncPoint);
+ i -= syncPoint;
+ syncPoint = 0;
+ };
+
+ this.flush = function() {
+ // deliver the last buffered NAL unit
+ if (buffer && buffer.byteLength > 3) {
+ this.trigger('data', buffer.subarray(syncPoint + 3));
+ }
+ // reset the stream state
+ buffer = null;
+ syncPoint = 0;
+ this.trigger('done');
+ };
+};
+NalByteStream.prototype = new Stream();
+
+/**
+ * Accepts input from a ElementaryStream and produces H.264 NAL unit data
+ * events.
+ */
+H264Stream = function() {
+ var
+ nalByteStream = new NalByteStream(),
+ self,
+ trackId,
+ currentPts,
+ currentDts,
+
+ discardEmulationPreventionBytes,
+ readSequenceParameterSet,
+ skipScalingList;
+
+ H264Stream.prototype.init.call(this);
+ self = this;
+
+ this.push = function(packet) {
+ if (packet.type !== 'video') {
+ return;
+ }
+ trackId = packet.trackId;
+ currentPts = packet.pts;
+ currentDts = packet.dts;
+
+ nalByteStream.push(packet);
+ };
+
+ nalByteStream.on('data', function(data) {
+ var
+ event = {
+ trackId: trackId,
+ pts: currentPts,
+ dts: currentDts,
+ data: data
+ };
+
+ switch (data[0] & 0x1f) {
+ case 0x05:
+ event.nalUnitType = 'slice_layer_without_partitioning_rbsp_idr';
+ break;
+ case 0x06:
+ event.nalUnitType = 'sei_rbsp';
+ event.escapedRBSP = discardEmulationPreventionBytes(data.subarray(1));
+ break;
+ case 0x07:
+ event.nalUnitType = 'seq_parameter_set_rbsp';
+ event.escapedRBSP = discardEmulationPreventionBytes(data.subarray(1));
+ event.config = readSequenceParameterSet(event.escapedRBSP);
+ break;
+ case 0x08:
+ event.nalUnitType = 'pic_parameter_set_rbsp';
+ break;
+ case 0x09:
+ event.nalUnitType = 'access_unit_delimiter_rbsp';
+ break;
+
+ default:
+ break;
+ }
+ self.trigger('data', event);
+ });
+ nalByteStream.on('done', function() {
+ self.trigger('done');
+ });
+
+ this.flush = function() {
+ nalByteStream.flush();
+ };
+
+ /**
+ * Advance the ExpGolomb decoder past a scaling list. The scaling
+ * list is optionally transmitted as part of a sequence parameter
+ * set and is not relevant to transmuxing.
+ * @param count {number} the number of entries in this scaling list
+ * @param expGolombDecoder {object} an ExpGolomb pointed to the
+ * start of a scaling list
+ * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1
+ */
+ skipScalingList = function(count, expGolombDecoder) {
+ var
+ lastScale = 8,
+ nextScale = 8,
+ j,
+ deltaScale;
+
+ for (j = 0; j < count; j++) {
+ if (nextScale !== 0) {
+ deltaScale = expGolombDecoder.readExpGolomb();
+ nextScale = (lastScale + deltaScale + 256) % 256;
+ }
+
+ lastScale = (nextScale === 0) ? lastScale : nextScale;
+ }
+ };
+
+ /**
+ * Expunge any "Emulation Prevention" bytes from a "Raw Byte
+ * Sequence Payload"
+ * @param data {Uint8Array} the bytes of a RBSP from a NAL
+ * unit
+ * @return {Uint8Array} the RBSP without any Emulation
+ * Prevention Bytes
+ */
+ discardEmulationPreventionBytes = function(data) {
+ var
+ length = data.byteLength,
+ emulationPreventionBytesPositions = [],
+ i = 1,
+ newLength, newData;
+
+ // Find all `Emulation Prevention Bytes`
+ while (i < length - 2) {
+ if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {
+ emulationPreventionBytesPositions.push(i + 2);
+ i += 2;
+ } else {
+ i++;
+ }
+ }
+
+ // If no Emulation Prevention Bytes were found just return the original
+ // array
+ if (emulationPreventionBytesPositions.length === 0) {
+ return data;
+ }
+
+ // Create a new array to hold the NAL unit data
+ newLength = length - emulationPreventionBytesPositions.length;
+ newData = new Uint8Array(newLength);
+ var sourceIndex = 0;
+
+ for (i = 0; i < newLength; sourceIndex++, i++) {
+ if (sourceIndex === emulationPreventionBytesPositions[0]) {
+ // Skip this byte
+ sourceIndex++;
+ // Remove this position index
+ emulationPreventionBytesPositions.shift();
+ }
+ newData[i] = data[sourceIndex];
+ }
+
+ return newData;
+ };
+
+ /**
+ * Read a sequence parameter set and return some interesting video
+ * properties. A sequence parameter set is the H264 metadata that
+ * describes the properties of upcoming video frames.
+ * @param data {Uint8Array} the bytes of a sequence parameter set
+ * @return {object} an object with configuration parsed from the
+ * sequence parameter set, including the dimensions of the
+ * associated video frames.
+ */
+ readSequenceParameterSet = function(data) {
+ var
+ frameCropLeftOffset = 0,
+ frameCropRightOffset = 0,
+ frameCropTopOffset = 0,
+ frameCropBottomOffset = 0,
+ expGolombDecoder, profileIdc, levelIdc, profileCompatibility,
+ chromaFormatIdc, picOrderCntType,
+ numRefFramesInPicOrderCntCycle, picWidthInMbsMinus1,
+ picHeightInMapUnitsMinus1,
+ frameMbsOnlyFlag,
+ scalingListCount,
+ i;
+
+ expGolombDecoder = new ExpGolomb(data);
+ profileIdc = expGolombDecoder.readUnsignedByte(); // profile_idc
+ profileCompatibility = expGolombDecoder.readUnsignedByte(); // constraint_set[0-5]_flag
+ levelIdc = expGolombDecoder.readUnsignedByte(); // level_idc u(8)
+ expGolombDecoder.skipUnsignedExpGolomb(); // seq_parameter_set_id
+
+ // some profiles have more optional data we don't need
+ if (profileIdc === 100 ||
+ profileIdc === 110 ||
+ profileIdc === 122 ||
+ profileIdc === 244 ||
+ profileIdc === 44 ||
+ profileIdc === 83 ||
+ profileIdc === 86 ||
+ profileIdc === 118 ||
+ profileIdc === 128 ||
+ profileIdc === 138 ||
+ profileIdc === 139 ||
+ profileIdc === 134) {
+ chromaFormatIdc = expGolombDecoder.readUnsignedExpGolomb();
+ if (chromaFormatIdc === 3) {
+ expGolombDecoder.skipBits(1); // separate_colour_plane_flag
+ }
+ expGolombDecoder.skipUnsignedExpGolomb(); // bit_depth_luma_minus8
+ expGolombDecoder.skipUnsignedExpGolomb(); // bit_depth_chroma_minus8
+ expGolombDecoder.skipBits(1); // qpprime_y_zero_transform_bypass_flag
+ if (expGolombDecoder.readBoolean()) { // seq_scaling_matrix_present_flag
+ scalingListCount = (chromaFormatIdc !== 3) ? 8 : 12;
+ for (i = 0; i < scalingListCount; i++) {
+ if (expGolombDecoder.readBoolean()) { // seq_scaling_list_present_flag[ i ]
+ if (i < 6) {
+ skipScalingList(16, expGolombDecoder);
+ } else {
+ skipScalingList(64, expGolombDecoder);
+ }
+ }
+ }
+ }
+ }
+
+ expGolombDecoder.skipUnsignedExpGolomb(); // log2_max_frame_num_minus4
+ picOrderCntType = expGolombDecoder.readUnsignedExpGolomb();
+
+ if (picOrderCntType === 0) {
+ expGolombDecoder.readUnsignedExpGolomb(); //log2_max_pic_order_cnt_lsb_minus4
+ } else if (picOrderCntType === 1) {
+ expGolombDecoder.skipBits(1); // delta_pic_order_always_zero_flag
+ expGolombDecoder.skipExpGolomb(); // offset_for_non_ref_pic
+ expGolombDecoder.skipExpGolomb(); // offset_for_top_to_bottom_field
+ numRefFramesInPicOrderCntCycle = expGolombDecoder.readUnsignedExpGolomb();
+ for(i = 0; i < numRefFramesInPicOrderCntCycle; i++) {
+ expGolombDecoder.skipExpGolomb(); // offset_for_ref_frame[ i ]
+ }
+ }
+
+ expGolombDecoder.skipUnsignedExpGolomb(); // max_num_ref_frames
+ expGolombDecoder.skipBits(1); // gaps_in_frame_num_value_allowed_flag
+
+ picWidthInMbsMinus1 = expGolombDecoder.readUnsignedExpGolomb();
+ picHeightInMapUnitsMinus1 = expGolombDecoder.readUnsignedExpGolomb();
+
+ frameMbsOnlyFlag = expGolombDecoder.readBits(1);
+ if (frameMbsOnlyFlag === 0) {
+ expGolombDecoder.skipBits(1); // mb_adaptive_frame_field_flag
+ }
+
+ expGolombDecoder.skipBits(1); // direct_8x8_inference_flag
+ if (expGolombDecoder.readBoolean()) { // frame_cropping_flag
+ frameCropLeftOffset = expGolombDecoder.readUnsignedExpGolomb();
+ frameCropRightOffset = expGolombDecoder.readUnsignedExpGolomb();
+ frameCropTopOffset = expGolombDecoder.readUnsignedExpGolomb();
+ frameCropBottomOffset = expGolombDecoder.readUnsignedExpGolomb();
+ }
+
+ return {
+ profileIdc: profileIdc,
+ levelIdc: levelIdc,
+ profileCompatibility: profileCompatibility,
+ width: ((picWidthInMbsMinus1 + 1) * 16) - frameCropLeftOffset * 2 - frameCropRightOffset * 2,
+ height: ((2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16) - (frameCropTopOffset * 2) - (frameCropBottomOffset * 2)
+ };
+ };
+
+};
+H264Stream.prototype = new Stream();
+
+module.exports = {
+ H264Stream: H264Stream,
+ NalByteStream: NalByteStream,
+};
+
+},{"../utils/exp-golomb.js":48,"../utils/stream.js":49}],33:[function(require,module,exports){
+module.exports = {
+ adts: require('./adts'),
+ h264: require('./h264'),
+};
+
+},{"./adts":31,"./h264":32}],34:[function(require,module,exports){
+/**
+ * An object that stores the bytes of an FLV tag and methods for
+ * querying and manipulating that data.
+ * @see http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf
+ */
+'use strict';
+
+var FlvTag;
+
+// (type:uint, extraData:Boolean = false) extends ByteArray
+FlvTag = function(type, extraData) {
+ var
+ // Counter if this is a metadata tag, nal start marker if this is a video
+ // tag. unused if this is an audio tag
+ adHoc = 0, // :uint
+
+ // The default size is 16kb but this is not enough to hold iframe
+ // data and the resizing algorithm costs a bit so we create a larger
+ // starting buffer for video tags
+ bufferStartSize = 16384,
+
+ // checks whether the FLV tag has enough capacity to accept the proposed
+ // write and re-allocates the internal buffers if necessary
+ prepareWrite = function(flv, count) {
+ var
+ bytes,
+ minLength = flv.position + count;
+ if (minLength < flv.bytes.byteLength) {
+ // there's enough capacity so do nothing
+ return;
+ }
+
+ // allocate a new buffer and copy over the data that will not be modified
+ bytes = new Uint8Array(minLength * 2);
+ bytes.set(flv.bytes.subarray(0, flv.position), 0);
+ flv.bytes = bytes;
+ flv.view = new DataView(flv.bytes.buffer);
+ },
+
+ // commonly used metadata properties
+ widthBytes = FlvTag.widthBytes || new Uint8Array('width'.length),
+ heightBytes = FlvTag.heightBytes || new Uint8Array('height'.length),
+ videocodecidBytes = FlvTag.videocodecidBytes || new Uint8Array('videocodecid'.length),
+ i;
+
+ if (!FlvTag.widthBytes) {
+ // calculating the bytes of common metadata names ahead of time makes the
+ // corresponding writes faster because we don't have to loop over the
+ // characters
+ // re-test with test/perf.html if you're planning on changing this
+ for (i = 0; i < 'width'.length; i++) {
+ widthBytes[i] = 'width'.charCodeAt(i);
+ }
+ for (i = 0; i < 'height'.length; i++) {
+ heightBytes[i] = 'height'.charCodeAt(i);
+ }
+ for (i = 0; i < 'videocodecid'.length; i++) {
+ videocodecidBytes[i] = 'videocodecid'.charCodeAt(i);
+ }
+
+ FlvTag.widthBytes = widthBytes;
+ FlvTag.heightBytes = heightBytes;
+ FlvTag.videocodecidBytes = videocodecidBytes;
+ }
+
+ this.keyFrame = false; // :Boolean
+
+ switch(type) {
+ case FlvTag.VIDEO_TAG:
+ this.length = 16;
+ // Start the buffer at 256k
+ bufferStartSize *= 6;
+ break;
+ case FlvTag.AUDIO_TAG:
+ this.length = 13;
+ this.keyFrame = true;
+ break;
+ case FlvTag.METADATA_TAG:
+ this.length = 29;
+ this.keyFrame = true;
+ break;
+ default:
+ throw("Error Unknown TagType");
+ }
+
+ this.bytes = new Uint8Array(bufferStartSize);
+ this.view = new DataView(this.bytes.buffer);
+ this.bytes[0] = type;
+ this.position = this.length;
+ this.keyFrame = extraData; // Defaults to false
+
+ // presentation timestamp
+ this.pts = 0;
+ // decoder timestamp
+ this.dts = 0;
+
+ // ByteArray#writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0)
+ this.writeBytes = function(bytes, offset, length) {
+ var
+ start = offset || 0,
+ end;
+ length = length || bytes.byteLength;
+ end = start + length;
+
+ prepareWrite(this, length);
+ this.bytes.set(bytes.subarray(start, end), this.position);
+
+ this.position += length;
+ this.length = Math.max(this.length, this.position);
+ };
+
+ // ByteArray#writeByte(value:int):void
+ this.writeByte = function(byte) {
+ prepareWrite(this, 1);
+ this.bytes[this.position] = byte;
+ this.position++;
+ this.length = Math.max(this.length, this.position);
+ };
+
+ // ByteArray#writeShort(value:int):void
+ this.writeShort = function(short) {
+ prepareWrite(this, 2);
+ this.view.setUint16(this.position, short);
+ this.position += 2;
+ this.length = Math.max(this.length, this.position);
+ };
+
+ // Negative index into array
+ // (pos:uint):int
+ this.negIndex = function(pos) {
+ return this.bytes[this.length - pos];
+ };
+
+ // The functions below ONLY work when this[0] == VIDEO_TAG.
+ // We are not going to check for that because we dont want the overhead
+ // (nal:ByteArray = null):int
+ this.nalUnitSize = function() {
+ if (adHoc === 0) {
+ return 0;
+ }
+
+ return this.length - (adHoc + 4);
+ };
+
+ this.startNalUnit = function() {
+ // remember position and add 4 bytes
+ if (adHoc > 0) {
+ throw new Error("Attempted to create new NAL wihout closing the old one");
+ }
+
+ // reserve 4 bytes for nal unit size
+ adHoc = this.length;
+ this.length += 4;
+ this.position = this.length;
+ };
+
+ // (nal:ByteArray = null):void
+ this.endNalUnit = function(nalContainer) {
+ var
+ nalStart, // :uint
+ nalLength; // :uint
+
+ // Rewind to the marker and write the size
+ if (this.length === adHoc + 4) {
+ // we started a nal unit, but didnt write one, so roll back the 4 byte size value
+ this.length -= 4;
+ } else if (adHoc > 0) {
+ nalStart = adHoc + 4;
+ nalLength = this.length - nalStart;
+
+ this.position = adHoc;
+ this.view.setUint32(this.position, nalLength);
+ this.position = this.length;
+
+ if (nalContainer) {
+ // Add the tag to the NAL unit
+ nalContainer.push(this.bytes.subarray(nalStart, nalStart + nalLength));
+ }
+ }
+
+ adHoc = 0;
+ };
+
+ /**
+ * Write out a 64-bit floating point valued metadata property. This method is
+ * called frequently during a typical parse and needs to be fast.
+ */
+ // (key:String, val:Number):void
+ this.writeMetaDataDouble = function(key, val) {
+ var i;
+ prepareWrite(this, 2 + key.length + 9);
+
+ // write size of property name
+ this.view.setUint16(this.position, key.length);
+ this.position += 2;
+
+ // this next part looks terrible but it improves parser throughput by
+ // 10kB/s in my testing
+
+ // write property name
+ if (key === 'width') {
+ this.bytes.set(widthBytes, this.position);
+ this.position += 5;
+ } else if (key === 'height') {
+ this.bytes.set(heightBytes, this.position);
+ this.position += 6;
+ } else if (key === 'videocodecid') {
+ this.bytes.set(videocodecidBytes, this.position);
+ this.position += 12;
+ } else {
+ for (i = 0; i < key.length; i++) {
+ this.bytes[this.position] = key.charCodeAt(i);
+ this.position++;
+ }
+ }
+
+ // skip null byte
+ this.position++;
+
+ // write property value
+ this.view.setFloat64(this.position, val);
+ this.position += 8;
+
+ // update flv tag length
+ this.length = Math.max(this.length, this.position);
+ ++adHoc;
+ };
+
+ // (key:String, val:Boolean):void
+ this.writeMetaDataBoolean = function(key, val) {
+ var i;
+ prepareWrite(this, 2);
+ this.view.setUint16(this.position, key.length);
+ this.position += 2;
+ for (i = 0; i < key.length; i++) {
+ // if key.charCodeAt(i) >= 255, handle error
+ prepareWrite(this, 1);
+ this.bytes[this.position] = key.charCodeAt(i);
+ this.position++;
+ }
+ prepareWrite(this, 2);
+ this.view.setUint8(this.position, 0x01);
+ this.position++;
+ this.view.setUint8(this.position, val ? 0x01 : 0x00);
+ this.position++;
+ this.length = Math.max(this.length, this.position);
+ ++adHoc;
+ };
+
+ // ():ByteArray
+ this.finalize = function() {
+ var
+ dtsDelta, // :int
+ len; // :int
+
+ switch(this.bytes[0]) {
+ // Video Data
+ case FlvTag.VIDEO_TAG:
+ this.bytes[11] = ((this.keyFrame || extraData) ? 0x10 : 0x20 ) | 0x07; // We only support AVC, 1 = key frame (for AVC, a seekable frame), 2 = inter frame (for AVC, a non-seekable frame)
+ this.bytes[12] = extraData ? 0x00 : 0x01;
+
+ dtsDelta = this.pts - this.dts;
+ this.bytes[13] = (dtsDelta & 0x00FF0000) >>> 16;
+ this.bytes[14] = (dtsDelta & 0x0000FF00) >>> 8;
+ this.bytes[15] = (dtsDelta & 0x000000FF) >>> 0;
+ break;
+
+ case FlvTag.AUDIO_TAG:
+ this.bytes[11] = 0xAF; // 44 kHz, 16-bit stereo
+ this.bytes[12] = extraData ? 0x00 : 0x01;
+ break;
+
+ case FlvTag.METADATA_TAG:
+ this.position = 11;
+ this.view.setUint8(this.position, 0x02); // String type
+ this.position++;
+ this.view.setUint16(this.position, 0x0A); // 10 Bytes
+ this.position += 2;
+ // set "onMetaData"
+ this.bytes.set([0x6f, 0x6e, 0x4d, 0x65,
+ 0x74, 0x61, 0x44, 0x61,
+ 0x74, 0x61], this.position);
+ this.position += 10;
+ this.bytes[this.position] = 0x08; // Array type
+ this.position++;
+ this.view.setUint32(this.position, adHoc);
+ this.position = this.length;
+ this.bytes.set([0, 0, 9], this.position);
+ this.position += 3; // End Data Tag
+ this.length = this.position;
+ break;
+ }
+
+ len = this.length - 11;
+
+ // write the DataSize field
+ this.bytes[ 1] = (len & 0x00FF0000) >>> 16;
+ this.bytes[ 2] = (len & 0x0000FF00) >>> 8;
+ this.bytes[ 3] = (len & 0x000000FF) >>> 0;
+ // write the Timestamp
+ this.bytes[ 4] = (this.dts & 0x00FF0000) >>> 16;
+ this.bytes[ 5] = (this.dts & 0x0000FF00) >>> 8;
+ this.bytes[ 6] = (this.dts & 0x000000FF) >>> 0;
+ this.bytes[ 7] = (this.dts & 0xFF000000) >>> 24;
+ // write the StreamID
+ this.bytes[ 8] = 0;
+ this.bytes[ 9] = 0;
+ this.bytes[10] = 0;
+
+ // Sometimes we're at the end of the view and have one slot to write a
+ // uint32, so, prepareWrite of count 4, since, view is uint8
+ prepareWrite(this, 4);
+ this.view.setUint32(this.length, this.length);
+ this.length += 4;
+ this.position += 4;
+
+ // trim down the byte buffer to what is actually being used
+ this.bytes = this.bytes.subarray(0, this.length);
+ this.frameTime = FlvTag.frameTime(this.bytes);
+ // if bytes.bytelength isn't equal to this.length, handle error
+ return this;
+ };
+};
+
+FlvTag.AUDIO_TAG = 0x08; // == 8, :uint
+FlvTag.VIDEO_TAG = 0x09; // == 9, :uint
+FlvTag.METADATA_TAG = 0x12; // == 18, :uint
+
+// (tag:ByteArray):Boolean {
+FlvTag.isAudioFrame = function(tag) {
+ return FlvTag.AUDIO_TAG === tag[0];
+};
+
+// (tag:ByteArray):Boolean {
+FlvTag.isVideoFrame = function(tag) {
+ return FlvTag.VIDEO_TAG === tag[0];
+};
+
+// (tag:ByteArray):Boolean {
+FlvTag.isMetaData = function(tag) {
+ return FlvTag.METADATA_TAG === tag[0];
+};
+
+// (tag:ByteArray):Boolean {
+FlvTag.isKeyFrame = function(tag) {
+ if (FlvTag.isVideoFrame(tag)) {
+ return tag[11] === 0x17;
+ }
+
+ if (FlvTag.isAudioFrame(tag)) {
+ return true;
+ }
+
+ if (FlvTag.isMetaData(tag)) {
+ return true;
+ }
+
+ return false;
+};
+
+// (tag:ByteArray):uint {
+FlvTag.frameTime = function(tag) {
+ var pts = tag[ 4] << 16; // :uint
+ pts |= tag[ 5] << 8;
+ pts |= tag[ 6] << 0;
+ pts |= tag[ 7] << 24;
+ return pts;
+};
+
+module.exports = FlvTag;
+
+},{}],35:[function(require,module,exports){
+module.exports = {
+ tag: require('./flv-tag'),
+ Transmuxer: require('./transmuxer'),
+ tools: require('../tools/flv-inspector'),
+};
+
+},{"../tools/flv-inspector":46,"./flv-tag":34,"./transmuxer":36}],36:[function(require,module,exports){
+'use strict';
+
+var Stream = require('../utils/stream.js');
+var FlvTag = require('./flv-tag.js');
+var m2ts = require('../m2ts/m2ts.js');
+var AdtsStream = require('../codecs/adts.js');
+var H264Stream = require('../codecs/h264').H264Stream;
+
+var
+ MetadataStream,
+ Transmuxer,
+ VideoSegmentStream,
+ AudioSegmentStream,
+ CoalesceStream,
+ collectTimelineInfo,
+ metaDataTag,
+ extraDataTag;
+
+/**
+ * Store information about the start and end of the tracka and the
+ * duration for each frame/sample we process in order to calculate
+ * the baseMediaDecodeTime
+ */
+collectTimelineInfo = function (track, data) {
+ if (typeof data.pts === 'number') {
+ if (track.timelineStartInfo.pts === undefined) {
+ track.timelineStartInfo.pts = data.pts;
+ } else {
+ track.timelineStartInfo.pts =
+ Math.min(track.timelineStartInfo.pts, data.pts);
+ }
+ }
+
+ if (typeof data.dts === 'number') {
+ if (track.timelineStartInfo.dts === undefined) {
+ track.timelineStartInfo.dts = data.dts;
+ } else {
+ track.timelineStartInfo.dts =
+ Math.min(track.timelineStartInfo.dts, data.dts);
+ }
+ }
+};
+
+metaDataTag = function(track, pts) {
+ var
+ tag = new FlvTag(FlvTag.METADATA_TAG); // :FlvTag
+
+ tag.dts = pts;
+ tag.pts = pts;
+
+ tag.writeMetaDataDouble("videocodecid", 7);
+ tag.writeMetaDataDouble("width", track.width);
+ tag.writeMetaDataDouble("height", track.height);
+
+ return tag;
+};
+
+extraDataTag = function(track, pts) {
+ var
+ i,
+ tag = new FlvTag(FlvTag.VIDEO_TAG, true);
+
+ tag.dts = pts;
+ tag.pts = pts;
+
+ tag.writeByte(0x01);// version
+ tag.writeByte(track.profileIdc);// profile
+ tag.writeByte(track.profileCompatibility);// compatibility
+ tag.writeByte(track.levelIdc);// level
+ tag.writeByte(0xFC | 0x03); // reserved (6 bits), NULA length size - 1 (2 bits)
+ tag.writeByte(0xE0 | 0x01 ); // reserved (3 bits), num of SPS (5 bits)
+ tag.writeShort( track.sps[0].length ); // data of SPS
+ tag.writeBytes( track.sps[0] ); // SPS
+
+ tag.writeByte(track.pps.length); // num of PPS (will there ever be more that 1 PPS?)
+ for (i = 0 ; i < track.pps.length ; ++i) {
+ tag.writeShort(track.pps[i].length); // 2 bytes for length of PPS
+ tag.writeBytes(track.pps[i]); // data of PPS
+ }
+
+ return tag;
+};
+
+/**
+ * Constructs a single-track, media segment from AAC data
+ * events. The output of this stream can be fed to flash.
+ */
+AudioSegmentStream = function(track) {
+ var
+ adtsFrames = [],
+ adtsFramesLength = 0,
+ sequenceNumber = 0,
+ earliestAllowedDts = 0,
+ oldExtraData;
+
+ AudioSegmentStream.prototype.init.call(this);
+
+ this.push = function(data) {
+ collectTimelineInfo(track, data);
+
+ if (track && track.channelcount === undefined) {
+ track.audioobjecttype = data.audioobjecttype;
+ track.channelcount = data.channelcount;
+ track.samplerate = data.samplerate;
+ track.samplingfrequencyindex = data.samplingfrequencyindex;
+ track.samplesize = data.samplesize;
+ track.extraData = (track.audioobjecttype << 11) |
+ (track.samplingfrequencyindex << 7) |
+ (track.channelcount << 3);
+ }
+
+ data.pts = Math.round(data.pts / 90);
+ data.dts = Math.round(data.dts / 90);
+
+ // buffer audio data until end() is called
+ adtsFrames.push(data);
+ };
+
+ this.flush = function() {
+ var currentFrame, adtsFrame, deltaDts,lastMetaPts, tags = [];
+ // return early if no audio data has been observed
+ if (adtsFrames.length === 0) {
+ this.trigger('done');
+ return;
+ }
+
+ lastMetaPts = -Infinity;
+
+ while (adtsFrames.length) {
+ currentFrame = adtsFrames.shift();
+
+ // write out metadata tags every 1 second so that the decoder
+ // is re-initialized quickly after seeking into a different
+ // audio configuration
+ if (track.extraData !== oldExtraData || currentFrame.pts - lastMetaPts >= 1000) {
+ adtsFrame = new FlvTag(FlvTag.METADATA_TAG);
+ adtsFrame.pts = currentFrame.pts;
+ adtsFrame.dts = currentFrame.dts;
+
+ // AAC is always 10
+ adtsFrame.writeMetaDataDouble("audiocodecid", 10);
+ adtsFrame.writeMetaDataBoolean("stereo", 2 === track.channelcount);
+ adtsFrame.writeMetaDataDouble ("audiosamplerate", track.samplerate);
+ // Is AAC always 16 bit?
+ adtsFrame.writeMetaDataDouble ("audiosamplesize", 16);
+
+ tags.push(adtsFrame);
+
+ oldExtraData = track.extraData;
+
+ adtsFrame = new FlvTag(FlvTag.AUDIO_TAG, true);
+ // For audio, DTS is always the same as PTS. We want to set the DTS
+ // however so we can compare with video DTS to determine approximate
+ // packet order
+ adtsFrame.pts = currentFrame.pts;
+ adtsFrame.dts = currentFrame.dts;
+
+ adtsFrame.view.setUint16(adtsFrame.position, track.extraData);
+ adtsFrame.position += 2;
+ adtsFrame.length = Math.max(adtsFrame.length, adtsFrame.position);
+
+ tags.push(adtsFrame);
+
+ lastMetaPts = currentFrame.pts;
+ }
+ adtsFrame = new FlvTag(FlvTag.AUDIO_TAG);
+ adtsFrame.pts = currentFrame.pts;
+ adtsFrame.dts = currentFrame.dts;
+
+ adtsFrame.writeBytes(currentFrame.data);
+
+ tags.push(adtsFrame);
+ }
+
+ oldExtraData = null;
+ this.trigger('data', {track: track, tags: tags});
+
+ this.trigger('done');
+ };
+};
+AudioSegmentStream.prototype = new Stream();
+
+/**
+ * Store FlvTags for the h264 stream
+ * @param track {object} track metadata configuration
+ */
+VideoSegmentStream = function(track) {
+ var
+ sequenceNumber = 0,
+ nalUnits = [],
+ nalUnitsLength = 0,
+ config,
+ h264Frame;
+ VideoSegmentStream.prototype.init.call(this);
+
+ this.finishFrame = function(tags, frame) {
+ if (!frame) {
+ return;
+ }
+ // Check if keyframe and the length of tags.
+ // This makes sure we write metadata on the first frame of a segment.
+ if (config && track && track.newMetadata &&
+ (frame.keyFrame || tags.length === 0)) {
+ // Push extra data on every IDR frame in case we did a stream change + seek
+ tags.push(metaDataTag(config, frame.pts));
+ tags.push(extraDataTag(track, frame.pts));
+ track.newMetadata = false;
+ }
+
+ frame.endNalUnit();
+ tags.push(frame);
+ };
+
+ this.push = function(data) {
+ collectTimelineInfo(track, data);
+
+ data.pts = Math.round(data.pts / 90);
+ data.dts = Math.round(data.dts / 90);
+
+ // buffer video until flush() is called
+ nalUnits.push(data);
+ };
+
+ this.flush = function() {
+ var
+ currentNal,
+ tags = [];
+
+ // Throw away nalUnits at the start of the byte stream until we find
+ // the first AUD
+ while (nalUnits.length) {
+ if (nalUnits[0].nalUnitType === 'access_unit_delimiter_rbsp') {
+ break;
+ }
+ nalUnits.shift();
+ }
+
+ // return early if no video data has been observed
+ if (nalUnits.length === 0) {
+ this.trigger('done');
+ return;
+ }
+
+ while (nalUnits.length) {
+ currentNal = nalUnits.shift();
+
+ // record the track config
+ if (currentNal.nalUnitType === 'seq_parameter_set_rbsp') {
+ track.newMetadata = true;
+ config = currentNal.config;
+ track.width = config.width;
+ track.height = config.height;
+ track.sps = [currentNal.data];
+ track.profileIdc = config.profileIdc;
+ track.levelIdc = config.levelIdc;
+ track.profileCompatibility = config.profileCompatibility;
+ h264Frame.endNalUnit();
+ } else if (currentNal.nalUnitType === 'pic_parameter_set_rbsp') {
+ track.newMetadata = true;
+ track.pps = [currentNal.data];
+ h264Frame.endNalUnit();
+ } else if (currentNal.nalUnitType === 'access_unit_delimiter_rbsp') {
+ if (h264Frame) {
+ this.finishFrame(tags, h264Frame);
+ }
+ h264Frame = new FlvTag(FlvTag.VIDEO_TAG);
+ h264Frame.pts = currentNal.pts;
+ h264Frame.dts = currentNal.dts;
+ } else {
+ if (currentNal.nalUnitType === 'slice_layer_without_partitioning_rbsp_idr') {
+ // the current sample is a key frame
+ h264Frame.keyFrame = true;
+ }
+ h264Frame.endNalUnit();
+ }
+ h264Frame.startNalUnit();
+ h264Frame.writeBytes(currentNal.data);
+ }
+ if (h264Frame) {
+ this.finishFrame(tags, h264Frame);
+ }
+
+ this.trigger('data', {track: track, tags: tags});
+
+ // Continue with the flush process now
+ this.trigger('done');
+ };
+};
+
+VideoSegmentStream.prototype = new Stream();
+
+/**
+ * The final stage of the transmuxer that emits the flv tags
+ * for audio, video, and metadata. Also tranlates in time and
+ * outputs caption data and id3 cues.
+ */
+CoalesceStream = function(options) {
+ // Number of Tracks per output segment
+ // If greater than 1, we combine multiple
+ // tracks into a single segment
+ this.numberOfTracks = 0;
+ this.metadataStream = options.metadataStream;
+
+ this.videoTags = [];
+ this.audioTags = [];
+ this.videoTrack = null;
+ this.audioTrack = null;
+ this.pendingCaptions = [];
+ this.pendingMetadata = [];
+ this.pendingTracks = 0;
+
+ CoalesceStream.prototype.init.call(this);
+
+ // Take output from multiple
+ this.push = function(output) {
+ // buffer incoming captions until the associated video segment
+ // finishes
+ if (output.text) {
+ return this.pendingCaptions.push(output);
+ }
+ // buffer incoming id3 tags until the final flush
+ if (output.frames) {
+ return this.pendingMetadata.push(output);
+ }
+
+ if (output.track.type === 'video') {
+ this.videoTrack = output.track;
+ this.videoTags = output.tags;
+ this.pendingTracks++;
+ }
+ if (output.track.type === 'audio') {
+ this.audioTrack = output.track;
+ this.audioTags = output.tags;
+ this.pendingTracks++;
+ }
+ };
+};
+
+CoalesceStream.prototype = new Stream();
+CoalesceStream.prototype.flush = function() {
+ var
+ id3,
+ caption,
+ i,
+ timelineStartPts,
+ event = {
+ tags: {},
+ captions: [],
+ metadata: []
+ };
+
+ if (this.pendingTracks < this.numberOfTracks) {
+ return;
+ }
+
+ if (this.videoTrack) {
+ timelineStartPts = this.videoTrack.timelineStartInfo.pts;
+ } else if (this.audioTrack) {
+ timelineStartPts = this.audioTrack.timelineStartInfo.pts;
+ }
+
+ event.tags.videoTags = this.videoTags;
+ event.tags.audioTags = this.audioTags;
+
+ // Translate caption PTS times into second offsets into the
+ // video timeline for the segment
+ for (i = 0; i < this.pendingCaptions.length; i++) {
+ caption = this.pendingCaptions[i];
+ caption.startTime = caption.startPts - timelineStartPts;
+ caption.startTime /= 90e3;
+ caption.endTime = caption.endPts - timelineStartPts;
+ caption.endTime /= 90e3;
+ event.captions.push(caption);
+ }
+
+ // Translate ID3 frame PTS times into second offsets into the
+ // video timeline for the segment
+ for (i = 0; i < this.pendingMetadata.length; i++) {
+ id3 = this.pendingMetadata[i];
+ id3.cueTime = id3.pts - timelineStartPts;
+ id3.cueTime /= 90e3;
+ event.metadata.push(id3);
+ }
+ // We add this to every single emitted segment even though we only need
+ // it for the first
+ event.metadata.dispatchType = this.metadataStream.dispatchType;
+
+ // Reset stream state
+ this.videoTrack = null;
+ this.audioTrack = null;
+ this.videoTags = [];
+ this.audioTags = [];
+ this.pendingCaptions.length = 0;
+ this.pendingMetadata.length = 0;
+ this.pendingTracks = 0;
+
+ // Emit the final segment
+ this.trigger('data', event);
+
+ this.trigger('done');
+};
+
+/**
+ * An object that incrementally transmuxes MPEG2 Trasport Stream
+ * chunks into an FLV.
+ */
+Transmuxer = function(options) {
+ var
+ self = this,
+ videoTrack,
+ audioTrack,
+
+ packetStream, parseStream, elementaryStream,
+ adtsStream, h264Stream,
+ videoSegmentStream, audioSegmentStream, captionStream,
+ coalesceStream;
+
+ Transmuxer.prototype.init.call(this);
+
+ options = options || {};
+
+ // expose the metadata stream
+ this.metadataStream = new m2ts.MetadataStream();
+
+ options.metadataStream = this.metadataStream;
+
+ // set up the parsing pipeline
+ packetStream = new m2ts.TransportPacketStream();
+ parseStream = new m2ts.TransportParseStream();
+ elementaryStream = new m2ts.ElementaryStream();
+ adtsStream = new AdtsStream();
+ h264Stream = new H264Stream();
+ coalesceStream = new CoalesceStream(options);
+
+ // disassemble MPEG2-TS packets into elementary streams
+ packetStream
+ .pipe(parseStream)
+ .pipe(elementaryStream);
+
+ // !!THIS ORDER IS IMPORTANT!!
+ // demux the streams
+ elementaryStream
+ .pipe(h264Stream);
+ elementaryStream
+ .pipe(adtsStream);
+
+ elementaryStream
+ .pipe(this.metadataStream)
+ .pipe(coalesceStream);
+ // if CEA-708 parsing is available, hook up a caption stream
+ captionStream = new m2ts.CaptionStream();
+ h264Stream.pipe(captionStream)
+ .pipe(coalesceStream);
+
+ // hook up the segment streams once track metadata is delivered
+ elementaryStream.on('data', function(data) {
+ var i, videoTrack, audioTrack;
+
+ if (data.type === 'metadata') {
+ i = data.tracks.length;
+
+ // scan the tracks listed in the metadata
+ while (i--) {
+ if (data.tracks[i].type === 'video') {
+ videoTrack = data.tracks[i];
+ } else if (data.tracks[i].type === 'audio') {
+ audioTrack = data.tracks[i];
+ }
+ }
+
+ // hook up the video segment stream to the first track with h264 data
+ if (videoTrack && !videoSegmentStream) {
+ coalesceStream.numberOfTracks++;
+ videoSegmentStream = new VideoSegmentStream(videoTrack);
+
+ // Set up the final part of the video pipeline
+ h264Stream
+ .pipe(videoSegmentStream)
+ .pipe(coalesceStream);
+ }
+
+ if (audioTrack && !audioSegmentStream) {
+ // hook up the audio segment stream to the first track with aac data
+ coalesceStream.numberOfTracks++;
+ audioSegmentStream = new AudioSegmentStream(audioTrack);
+
+ // Set up the final part of the audio pipeline
+ adtsStream
+ .pipe(audioSegmentStream)
+ .pipe(coalesceStream);
+ }
+ }
+ });
+
+ // feed incoming data to the front of the parsing pipeline
+ this.push = function(data) {
+ packetStream.push(data);
+ };
+
+ // flush any buffered data
+ this.flush = function() {
+ // Start at the top of the pipeline and flush all pending work
+ packetStream.flush();
+ };
+
+ // Re-emit any data coming from the coalesce stream to the outside world
+ coalesceStream.on('data', function (event) {
+ self.trigger('data', event);
+ });
+
+ // Let the consumer know we have finished flushing the entire pipeline
+ coalesceStream.on('done', function () {
+ self.trigger('done');
+ });
+
+ // For information on the FLV format, see
+ // http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf.
+ // Technically, this function returns the header and a metadata FLV tag
+ // if duration is greater than zero
+ // duration in seconds
+ // @return {object} the bytes of the FLV header as a Uint8Array
+ this.getFlvHeader = function(duration, audio, video) { // :ByteArray {
+ var
+ headBytes = new Uint8Array(3 + 1 + 1 + 4),
+ head = new DataView(headBytes.buffer),
+ metadata,
+ result,
+ metadataLength;
+
+ // default arguments
+ duration = duration || 0;
+ audio = audio === undefined? true : audio;
+ video = video === undefined? true : video;
+
+ // signature
+ head.setUint8(0, 0x46); // 'F'
+ head.setUint8(1, 0x4c); // 'L'
+ head.setUint8(2, 0x56); // 'V'
+
+ // version
+ head.setUint8(3, 0x01);
+
+ // flags
+ head.setUint8(4, (audio ? 0x04 : 0x00) | (video ? 0x01 : 0x00));
+
+ // data offset, should be 9 for FLV v1
+ head.setUint32(5, headBytes.byteLength);
+
+ // init the first FLV tag
+ if (duration <= 0) {
+ // no duration available so just write the first field of the first
+ // FLV tag
+ result = new Uint8Array(headBytes.byteLength + 4);
+ result.set(headBytes);
+ result.set([0, 0, 0, 0], headBytes.byteLength);
+ return result;
+ }
+
+ // write out the duration metadata tag
+ metadata = new FlvTag(FlvTag.METADATA_TAG);
+ metadata.pts = metadata.dts = 0;
+ metadata.writeMetaDataDouble("duration", duration);
+ metadataLength = metadata.finalize().length;
+ result = new Uint8Array(headBytes.byteLength + metadataLength);
+ result.set(headBytes);
+ result.set(head.byteLength, metadataLength);
+
+ return result;
+ };
+};
+Transmuxer.prototype = new Stream();
+
+// forward compatibility
+module.exports = Transmuxer;
+
+},{"../codecs/adts.js":31,"../codecs/h264":32,"../m2ts/m2ts.js":40,"../utils/stream.js":49,"./flv-tag.js":34}],37:[function(require,module,exports){
+'use strict';
+
+var muxjs = {
+ codecs: require('./codecs'),
+ mp4: require('./mp4'),
+ flv: require('./flv'),
+ mp2t: require('./m2ts'),
+};
+module.exports = muxjs;
+
+},{"./codecs":33,"./flv":35,"./m2ts":39,"./mp4":43}],38:[function(require,module,exports){
+/**
+ * mux.js
+ *
+ * Copyright (c) 2015 Brightcove
+ * All rights reserved.
+ *
+ * Reads in-band caption information from a video elementary
+ * stream. Captions must follow the CEA-708 standard for injection
+ * into an MPEG-2 transport streams.
+ * @see https://en.wikipedia.org/wiki/CEA-708
+ */
+
+'use strict';
+
+// -----------------
+// Link To Transport
+// -----------------
+
+// Supplemental enhancement information (SEI) NAL units have a
+// payload type field to indicate how they are to be
+// interpreted. CEAS-708 caption content is always transmitted with
+// payload type 0x04.
+var USER_DATA_REGISTERED_ITU_T_T35 = 4,
+ RBSP_TRAILING_BITS = 128,
+ Stream = require('../utils/stream');
+
+/**
+ * Parse a supplemental enhancement information (SEI) NAL unit.
+ * Stops parsing once a message of type ITU T T35 has been found.
+ *
+ * @param bytes {Uint8Array} the bytes of a SEI NAL unit
+ * @return {object} the parsed SEI payload
+ * @see Rec. ITU-T H.264, 7.3.2.3.1
+ */
+var parseSei = function(bytes) {
+ var
+ i = 0,
+ result = {
+ payloadType: -1,
+ payloadSize: 0,
+ },
+ payloadType = 0,
+ payloadSize = 0;
+
+ // go through the sei_rbsp parsing each each individual sei_message
+ while (i < bytes.byteLength) {
+ // stop once we have hit the end of the sei_rbsp
+ if (bytes[i] === RBSP_TRAILING_BITS) {
+ break;
+ }
+
+ // Parse payload type
+ while (bytes[i] === 0xFF) {
+ payloadType += 255;
+ i++;
+ }
+ payloadType += bytes[i++];
+
+ // Parse payload size
+ while (bytes[i] === 0xFF) {
+ payloadSize += 255;
+ i++;
+ }
+ payloadSize += bytes[i++];
+
+ // this sei_message is a 608/708 caption so save it and break
+ // there can only ever be one caption message in a frame's sei
+ if (!result.payload && payloadType === USER_DATA_REGISTERED_ITU_T_T35) {
+ result.payloadType = payloadType;
+ result.payloadSize = payloadSize;
+ result.payload = bytes.subarray(i, i + payloadSize);
+ break;
+ }
+
+ // skip the payload and parse the next message
+ i += payloadSize;
+ payloadType = 0;
+ payloadSize = 0;
+ }
+
+ return result;
+};
+
+// see ANSI/SCTE 128-1 (2013), section 8.1
+var parseUserData = function(sei) {
+ // itu_t_t35_contry_code must be 181 (United States) for
+ // captions
+ if (sei.payload[0] !== 181) {
+ return null;
+ }
+
+ // itu_t_t35_provider_code should be 49 (ATSC) for captions
+ if (((sei.payload[1] << 8) | sei.payload[2]) !== 49) {
+ return null;
+ }
+
+ // the user_identifier should be "GA94" to indicate ATSC1 data
+ if (String.fromCharCode(sei.payload[3],
+ sei.payload[4],
+ sei.payload[5],
+ sei.payload[6]) !== 'GA94') {
+ return null;
+ }
+
+ // finally, user_data_type_code should be 0x03 for caption data
+ if (sei.payload[7] !== 0x03) {
+ return null;
+ }
+
+ // return the user_data_type_structure and strip the trailing
+ // marker bits
+ return sei.payload.subarray(8, sei.payload.length - 1);
+};
+
+// see CEA-708-D, section 4.4
+var parseCaptionPackets = function(pts, userData) {
+ var results = [], i, count, offset, data;
+
+ // if this is just filler, return immediately
+ if (!(userData[0] & 0x40)) {
+ return results;
+ }
+
+ // parse out the cc_data_1 and cc_data_2 fields
+ count = userData[0] & 0x1f;
+ for (i = 0; i < count; i++) {
+ offset = i * 3;
+ data = {
+ type: userData[offset + 2] & 0x03,
+ pts: pts
+ };
+
+ // capture cc data when cc_valid is 1
+ if (userData[offset + 2] & 0x04) {
+ data.ccData = (userData[offset + 3] << 8) | userData[offset + 4];
+ results.push(data);
+ }
+ }
+ return results;
+};
+
+var CaptionStream = function() {
+ var self = this;
+ CaptionStream.prototype.init.call(this);
+
+ this.captionPackets_ = [];
+
+ this.field1_ = new Cea608Stream();
+
+ // forward data and done events from field1_ to this CaptionStream
+ this.field1_.on('data', this.trigger.bind(this, 'data'));
+ this.field1_.on('done', this.trigger.bind(this, 'done'));
+};
+CaptionStream.prototype = new Stream();
+CaptionStream.prototype.push = function(event) {
+ var sei, userData, captionPackets;
+
+ // only examine SEI NALs
+ if (event.nalUnitType !== 'sei_rbsp') {
+ return;
+ }
+
+ // parse the sei
+ sei = parseSei(event.escapedRBSP);
+
+ // ignore everything but user_data_registered_itu_t_t35
+ if (sei.payloadType !== USER_DATA_REGISTERED_ITU_T_T35) {
+ return;
+ }
+
+ // parse out the user data payload
+ userData = parseUserData(sei);
+
+ // ignore unrecognized userData
+ if (!userData) {
+ return;
+ }
+
+ // parse out CC data packets and save them for later
+ this.captionPackets_ = this.captionPackets_.concat(parseCaptionPackets(event.pts, userData));
+};
+
+CaptionStream.prototype.flush = function () {
+ // make sure we actually parsed captions before proceeding
+ if (!this.captionPackets_.length) {
+ this.field1_.flush();
+ return;
+ }
+
+ // sort caption byte-pairs based on their PTS values
+ this.captionPackets_.sort(function(a, b) {
+ return a.pts - b.pts;
+ });
+
+ // Push each caption into Cea608Stream
+ this.captionPackets_.forEach(this.field1_.push, this.field1_);
+
+ this.captionPackets_.length = 0;
+ this.field1_.flush();
+ return;
+};
+// ----------------------
+// Session to Application
+// ----------------------
+
+var BASIC_CHARACTER_TRANSLATION = {
+ 0x2a: 0xe1,
+ 0x5c: 0xe9,
+ 0x5e: 0xed,
+ 0x5f: 0xf3,
+ 0x60: 0xfa,
+ 0x7b: 0xe7,
+ 0x7c: 0xf7,
+ 0x7d: 0xd1,
+ 0x7e: 0xf1,
+ 0x7f: 0x2588
+};
+
+var getCharFromCode = function(code) {
+ if(code === null) {
+ return '';
+ }
+ code = BASIC_CHARACTER_TRANSLATION[code] || code;
+ return String.fromCharCode(code);
+};
+
+// Constants for the byte codes recognized by Cea608Stream. This
+// list is not exhaustive. For a more comprehensive listing and
+// semantics see
+// http://www.gpo.gov/fdsys/pkg/CFR-2010-title47-vol1/pdf/CFR-2010-title47-vol1-sec15-119.pdf
+var PADDING = 0x0000,
+
+ // Pop-on Mode
+ RESUME_CAPTION_LOADING = 0x1420,
+ END_OF_CAPTION = 0x142f,
+
+ // Roll-up Mode
+ ROLL_UP_2_ROWS = 0x1425,
+ ROLL_UP_3_ROWS = 0x1426,
+ ROLL_UP_4_ROWS = 0x1427,
+ RESUME_DIRECT_CAPTIONING = 0x1429,
+ CARRIAGE_RETURN = 0x142d,
+ // Erasure
+ BACKSPACE = 0x1421,
+ ERASE_DISPLAYED_MEMORY = 0x142c,
+ ERASE_NON_DISPLAYED_MEMORY = 0x142e;
+
+// the index of the last row in a CEA-608 display buffer
+var BOTTOM_ROW = 14;
+// CEA-608 captions are rendered onto a 34x15 matrix of character
+// cells. The "bottom" row is the last element in the outer array.
+var createDisplayBuffer = function() {
+ var result = [], i = BOTTOM_ROW + 1;
+ while (i--) {
+ result.push('');
+ }
+ return result;
+};
+
+var Cea608Stream = function() {
+ Cea608Stream.prototype.init.call(this);
+
+ this.mode_ = 'popOn';
+ // When in roll-up mode, the index of the last row that will
+ // actually display captions. If a caption is shifted to a row
+ // with a lower index than this, it is cleared from the display
+ // buffer
+ this.topRow_ = 0;
+ this.startPts_ = 0;
+ this.displayed_ = createDisplayBuffer();
+ this.nonDisplayed_ = createDisplayBuffer();
+ this.lastControlCode_ = null;
+
+ this.push = function(packet) {
+ // Ignore other channels
+ if (packet.type !== 0) {
+ return;
+ }
+ var data, swap, char0, char1;
+ // remove the parity bits
+ data = packet.ccData & 0x7f7f;
+
+ // ignore duplicate control codes
+ if (data === this.lastControlCode_) {
+ this.lastControlCode_ = null;
+ return;
+ }
+
+ // Store control codes
+ if ((data & 0xf000) === 0x1000) {
+ this.lastControlCode_ = data;
+ } else {
+ this.lastControlCode_ = null;
+ }
+
+ switch (data) {
+ case PADDING:
+ break;
+ case RESUME_CAPTION_LOADING:
+ this.mode_ = 'popOn';
+ break;
+ case END_OF_CAPTION:
+ // if a caption was being displayed, it's gone now
+ this.flushDisplayed(packet.pts);
+
+ // flip memory
+ swap = this.displayed_;
+ this.displayed_ = this.nonDisplayed_;
+ this.nonDisplayed_ = swap;
+
+ // start measuring the time to display the caption
+ this.startPts_ = packet.pts;
+ break;
+
+ case ROLL_UP_2_ROWS:
+ this.topRow_ = BOTTOM_ROW - 1;
+ this.mode_ = 'rollUp';
+ break;
+ case ROLL_UP_3_ROWS:
+ this.topRow_ = BOTTOM_ROW - 2;
+ this.mode_ = 'rollUp';
+ break;
+ case ROLL_UP_4_ROWS:
+ this.topRow_ = BOTTOM_ROW - 3;
+ this.mode_ = 'rollUp';
+ break;
+ case CARRIAGE_RETURN:
+ this.flushDisplayed(packet.pts);
+ this.shiftRowsUp_();
+ this.startPts_ = packet.pts;
+ break;
+
+ case BACKSPACE:
+ if (this.mode_ === 'popOn') {
+ this.nonDisplayed_[BOTTOM_ROW] = this.nonDisplayed_[BOTTOM_ROW].slice(0, -1);
+ } else {
+ this.displayed_[BOTTOM_ROW] = this.displayed_[BOTTOM_ROW].slice(0, -1);
+ }
+ break;
+ case ERASE_DISPLAYED_MEMORY:
+ this.flushDisplayed(packet.pts);
+ this.displayed_ = createDisplayBuffer();
+ break;
+ case ERASE_NON_DISPLAYED_MEMORY:
+ this.nonDisplayed_ = createDisplayBuffer();
+ break;
+ default:
+ char0 = data >>> 8;
+ char1 = data & 0xff;
+
+ // Look for a Channel 1 Preamble Address Code
+ if (char0 >= 0x10 && char0 <= 0x17 &&
+ char1 >= 0x40 && char1 <= 0x7F &&
+ (char0 !== 0x10 || char1 < 0x60)) {
+ // Follow Safari's lead and replace the PAC with a space
+ char0 = 0x20;
+ // we only want one space so make the second character null
+ // which will get become '' in getCharFromCode
+ char1 = null;
+ }
+
+ // Look for special character sets
+ if ((char0 === 0x11 || char0 === 0x19) &&
+ (char1 >= 0x30 && char1 <= 0x3F)) {
+ // Put in eigth note and space
+ char0 = 0xE299AA;
+ char1 = '';
+ }
+
+ // ignore unsupported control codes
+ if ((char0 & 0xf0) === 0x10) {
+ return;
+ }
+
+ // character handling is dependent on the current mode
+ this[this.mode_](packet.pts, char0, char1);
+ break;
+ }
+ };
+};
+Cea608Stream.prototype = new Stream();
+// Trigger a cue point that captures the current state of the
+// display buffer
+Cea608Stream.prototype.flushDisplayed = function(pts) {
+ var row, i;
+
+ for (i = 0; i < this.displayed_.length; i++) {
+ row = this.displayed_[i];
+ if (row.length) {
+ this.trigger('data', {
+ startPts: this.startPts_,
+ endPts: pts,
+ // remove spaces from the start and end of the string
+ text: row.trim()
+ });
+ }
+ }
+};
+
+// Mode Implementations
+Cea608Stream.prototype.popOn = function(pts, char0, char1) {
+ var baseRow = this.nonDisplayed_[BOTTOM_ROW];
+
+ // buffer characters
+ baseRow += getCharFromCode(char0);
+ baseRow += getCharFromCode(char1);
+ this.nonDisplayed_[BOTTOM_ROW] = baseRow;
+};
+
+Cea608Stream.prototype.rollUp = function(pts, char0, char1) {
+ var baseRow = this.displayed_[BOTTOM_ROW];
+ if (baseRow === '') {
+ // we're starting to buffer new display input, so flush out the
+ // current display
+ this.flushDisplayed(pts);
+
+ this.startPts_ = pts;
+ }
+
+ baseRow += getCharFromCode(char0);
+ baseRow += getCharFromCode(char1);
+
+ this.displayed_[BOTTOM_ROW] = baseRow;
+};
+Cea608Stream.prototype.shiftRowsUp_ = function() {
+ var i;
+ // clear out inactive rows
+ for (i = 0; i < this.topRow_; i++) {
+ this.displayed_[i] = '';
+ }
+ // shift displayed rows up
+ for (i = this.topRow_; i < BOTTOM_ROW; i++) {
+ this.displayed_[i] = this.displayed_[i + 1];
+ }
+ // clear out the bottom row
+ this.displayed_[BOTTOM_ROW] = '';
+};
+
+// exports
+module.exports = {
+ CaptionStream: CaptionStream,
+ Cea608Stream: Cea608Stream,
+};
+
+
+},{"../utils/stream":49}],39:[function(require,module,exports){
+module.exports = require('./m2ts');
+
+},{"./m2ts":40}],40:[function(require,module,exports){
+/**
+ * mux.js
+ *
+ * Copyright (c) 2015 Brightcove
+ * All rights reserved.
+ *
+ * A stream-based mp2t to mp4 converter. This utility can be used to
+ * deliver mp4s to a SourceBuffer on platforms that support native
+ * Media Source Extensions.
+ */
+'use strict';
+var Stream = require('../utils/stream.js'),
+ CaptionStream = require('./caption-stream'),
+ StreamTypes = require('./stream-types');
+
+var Stream = require('../utils/stream.js');
+var m2tsStreamTypes = require('./stream-types.js');
+
+// object types
+var
+ TransportPacketStream, TransportParseStream, ElementaryStream,
+ AacStream, H264Stream, NalByteStream;
+
+// constants
+var
+ MP2T_PACKET_LENGTH = 188, // bytes
+ SYNC_BYTE = 0x47,
+
+/**
+ * Splits an incoming stream of binary data into MPEG-2 Transport
+ * Stream packets.
+ */
+TransportPacketStream = function() {
+ var
+ buffer = new Uint8Array(MP2T_PACKET_LENGTH),
+ bytesInBuffer = 0;
+
+ TransportPacketStream.prototype.init.call(this);
+
+ // Deliver new bytes to the stream.
+
+ this.push = function(bytes) {
+ var
+ i = 0,
+ startIndex = 0,
+ endIndex = MP2T_PACKET_LENGTH,
+ everything;
+
+ // If there are bytes remaining from the last segment, prepend them to the
+ // bytes that were pushed in
+ if (bytesInBuffer) {
+ everything = new Uint8Array(bytes.byteLength + bytesInBuffer);
+ everything.set(buffer.subarray(0, bytesInBuffer));
+ everything.set(bytes, bytesInBuffer);
+ bytesInBuffer = 0;
+ } else {
+ everything = bytes;
+ }
+
+ // While we have enough data for a packet
+ while (endIndex < everything.byteLength) {
+ // Look for a pair of start and end sync bytes in the data..
+ if (everything[startIndex] === SYNC_BYTE && everything[endIndex] === SYNC_BYTE) {
+ // We found a packet so emit it and jump one whole packet forward in
+ // the stream
+ this.trigger('data', everything.subarray(startIndex, endIndex));
+ startIndex += MP2T_PACKET_LENGTH;
+ endIndex += MP2T_PACKET_LENGTH;
+ continue;
+ }
+ // If we get here, we have somehow become de-synchronized and we need to step
+ // forward one byte at a time until we find a pair of sync bytes that denote
+ // a packet
+ startIndex++;
+ endIndex++;
+ }
+
+ // If there was some data left over at the end of the segment that couldn't
+ // possibly be a whole packet, keep it because it might be the start of a packet
+ // that continues in the next segment
+ if (startIndex < everything.byteLength) {
+ buffer.set(everything.subarray(startIndex), 0);
+ bytesInBuffer = everything.byteLength - startIndex;
+ }
+ };
+
+ this.flush = function () {
+ // If the buffer contains a whole packet when we are being flushed, emit it
+ // and empty the buffer. Otherwise hold onto the data because it may be
+ // important for decoding the next segment
+ if (bytesInBuffer === MP2T_PACKET_LENGTH && buffer[0] === SYNC_BYTE) {
+ this.trigger('data', buffer);
+ bytesInBuffer = 0;
+ }
+ this.trigger('done');
+ };
+};
+TransportPacketStream.prototype = new Stream();
+
+/**
+ * Accepts an MP2T TransportPacketStream and emits data events with parsed
+ * forms of the individual transport stream packets.
+ */
+TransportParseStream = function() {
+ var parsePsi, parsePat, parsePmt, parsePes, self;
+ TransportParseStream.prototype.init.call(this);
+ self = this;
+
+ this.packetsWaitingForPmt = [];
+ this.programMapTable = undefined;
+
+ parsePsi = function(payload, psi) {
+ var offset = 0;
+
+ // PSI packets may be split into multiple sections and those
+ // sections may be split into multiple packets. If a PSI
+ // section starts in this packet, the payload_unit_start_indicator
+ // will be true and the first byte of the payload will indicate
+ // the offset from the current position to the start of the
+ // section.
+ if (psi.payloadUnitStartIndicator) {
+ offset += payload[offset] + 1;
+ }
+
+ if (psi.type === 'pat') {
+ parsePat(payload.subarray(offset), psi);
+ } else {
+ parsePmt(payload.subarray(offset), psi);
+ }
+ };
+
+ parsePat = function(payload, pat) {
+ pat.section_number = payload[7];
+ pat.last_section_number = payload[8];
+
+ // skip the PSI header and parse the first PMT entry
+ self.pmtPid = (payload[10] & 0x1F) << 8 | payload[11];
+ pat.pmtPid = self.pmtPid;
+ };
+
+ /**
+ * Parse out the relevant fields of a Program Map Table (PMT).
+ * @param payload {Uint8Array} the PMT-specific portion of an MP2T
+ * packet. The first byte in this array should be the table_id
+ * field.
+ * @param pmt {object} the object that should be decorated with
+ * fields parsed from the PMT.
+ */
+ parsePmt = function(payload, pmt) {
+ var sectionLength, tableEnd, programInfoLength, offset;
+
+ // PMTs can be sent ahead of the time when they should actually
+ // take effect. We don't believe this should ever be the case
+ // for HLS but we'll ignore "forward" PMT declarations if we see
+ // them. Future PMT declarations have the current_next_indicator
+ // set to zero.
+ if (!(payload[5] & 0x01)) {
+ return;
+ }
+
+ // overwrite any existing program map table
+ self.programMapTable = {};
+
+ // the mapping table ends at the end of the current section
+ sectionLength = (payload[1] & 0x0f) << 8 | payload[2];
+ tableEnd = 3 + sectionLength - 4;
+
+ // to determine where the table is, we have to figure out how
+ // long the program info descriptors are
+ programInfoLength = (payload[10] & 0x0f) << 8 | payload[11];
+
+ // advance the offset to the first entry in the mapping table
+ offset = 12 + programInfoLength;
+ while (offset < tableEnd) {
+ // add an entry that maps the elementary_pid to the stream_type
+ self.programMapTable[(payload[offset + 1] & 0x1F) << 8 | payload[offset + 2]] = payload[offset];
+
+ // move to the next table entry
+ // skip past the elementary stream descriptors, if present
+ offset += ((payload[offset + 3] & 0x0F) << 8 | payload[offset + 4]) + 5;
+ }
+
+ // record the map on the packet as well
+ pmt.programMapTable = self.programMapTable;
+
+ // if there are any packets waiting for a PMT to be found, process them now
+ while (self.packetsWaitingForPmt.length) {
+ self.processPes_.apply(self, self.packetsWaitingForPmt.shift());
+ }
+ };
+
+ /**
+ * Deliver a new MP2T packet to the stream.
+ */
+ this.push = function(packet) {
+ var
+ result = {},
+ offset = 4;
+
+ result.payloadUnitStartIndicator = !!(packet[1] & 0x40);
+
+ // pid is a 13-bit field starting at the last bit of packet[1]
+ result.pid = packet[1] & 0x1f;
+ result.pid <<= 8;
+ result.pid |= packet[2];
+
+ // if an adaption field is present, its length is specified by the
+ // fifth byte of the TS packet header. The adaptation field is
+ // used to add stuffing to PES packets that don't fill a complete
+ // TS packet, and to specify some forms of timing and control data
+ // that we do not currently use.
+ if (((packet[3] & 0x30) >>> 4) > 0x01) {
+ offset += packet[offset] + 1;
+ }
+
+ // parse the rest of the packet based on the type
+ if (result.pid === 0) {
+ result.type = 'pat';
+ parsePsi(packet.subarray(offset), result);
+ this.trigger('data', result);
+ } else if (result.pid === this.pmtPid) {
+ result.type = 'pmt';
+ parsePsi(packet.subarray(offset), result);
+ this.trigger('data', result);
+ } else if (this.programMapTable === undefined) {
+ // When we have not seen a PMT yet, defer further processing of
+ // PES packets until one has been parsed
+ this.packetsWaitingForPmt.push([packet, offset, result]);
+ } else {
+ this.processPes_(packet, offset, result);
+ }
+ };
+
+ this.processPes_ = function (packet, offset, result) {
+ result.streamType = this.programMapTable[result.pid];
+ result.type = 'pes';
+ result.data = packet.subarray(offset);
+
+ this.trigger('data', result);
+ };
+
+};
+TransportParseStream.prototype = new Stream();
+TransportParseStream.STREAM_TYPES = {
+ h264: 0x1b,
+ adts: 0x0f
+};
+
+/**
+ * Reconsistutes program elementary stream (PES) packets from parsed
+ * transport stream packets. That is, if you pipe an
+ * mp2t.TransportParseStream into a mp2t.ElementaryStream, the output
+ * events will be events which capture the bytes for individual PES
+ * packets plus relevant metadata that has been extracted from the
+ * container.
+ */
+ElementaryStream = function() {
+ var
+ // PES packet fragments
+ video = {
+ data: [],
+ size: 0
+ },
+ audio = {
+ data: [],
+ size: 0
+ },
+ timedMetadata = {
+ data: [],
+ size: 0
+ },
+ parsePes = function(payload, pes) {
+ var ptsDtsFlags;
+
+ // find out if this packets starts a new keyframe
+ pes.dataAlignmentIndicator = (payload[6] & 0x04) !== 0;
+ // PES packets may be annotated with a PTS value, or a PTS value
+ // and a DTS value. Determine what combination of values is
+ // available to work with.
+ ptsDtsFlags = payload[7];
+
+ // PTS and DTS are normally stored as a 33-bit number. Javascript
+ // performs all bitwise operations on 32-bit integers but javascript
+ // supports a much greater range (52-bits) of integer using standard
+ // mathematical operations.
+ // We construct a 31-bit value using bitwise operators over the 31
+ // most significant bits and then multiply by 4 (equal to a left-shift
+ // of 2) before we add the final 2 least significant bits of the
+ // timestamp (equal to an OR.)
+ if (ptsDtsFlags & 0xC0) {
+ // the PTS and DTS are not written out directly. For information
+ // on how they are encoded, see
+ // http://dvd.sourceforge.net/dvdinfo/pes-hdr.html
+ pes.pts = (payload[9] & 0x0E) << 27
+ | (payload[10] & 0xFF) << 20
+ | (payload[11] & 0xFE) << 12
+ | (payload[12] & 0xFF) << 5
+ | (payload[13] & 0xFE) >>> 3;
+ pes.pts *= 4; // Left shift by 2
+ pes.pts += (payload[13] & 0x06) >>> 1; // OR by the two LSBs
+ pes.dts = pes.pts;
+ if (ptsDtsFlags & 0x40) {
+ pes.dts = (payload[14] & 0x0E ) << 27
+ | (payload[15] & 0xFF ) << 20
+ | (payload[16] & 0xFE ) << 12
+ | (payload[17] & 0xFF ) << 5
+ | (payload[18] & 0xFE ) >>> 3;
+ pes.dts *= 4; // Left shift by 2
+ pes.dts += (payload[18] & 0x06) >>> 1; // OR by the two LSBs
+ }
+ }
+
+ // the data section starts immediately after the PES header.
+ // pes_header_data_length specifies the number of header bytes
+ // that follow the last byte of the field.
+ pes.data = payload.subarray(9 + payload[8]);
+ },
+ flushStream = function(stream, type) {
+ var
+ packetData = new Uint8Array(stream.size),
+ event = {
+ type: type
+ },
+ i = 0,
+ fragment;
+
+ // do nothing if there is no buffered data
+ if (!stream.data.length) {
+ return;
+ }
+ event.trackId = stream.data[0].pid;
+
+ // reassemble the packet
+ while (stream.data.length) {
+ fragment = stream.data.shift();
+
+ packetData.set(fragment.data, i);
+ i += fragment.data.byteLength;
+ }
+
+ // parse assembled packet's PES header
+ parsePes(packetData, event);
+
+ stream.size = 0;
+
+ self.trigger('data', event);
+ },
+ self;
+
+ ElementaryStream.prototype.init.call(this);
+ self = this;
+
+ this.push = function(data) {
+ ({
+ pat: function() {
+ // we have to wait for the PMT to arrive as well before we
+ // have any meaningful metadata
+ },
+ pes: function() {
+ var stream, streamType;
+
+ switch (data.streamType) {
+ case StreamTypes.H264_STREAM_TYPE:
+ case m2tsStreamTypes.H264_STREAM_TYPE:
+ stream = video;
+ streamType = 'video';
+ break;
+ case StreamTypes.ADTS_STREAM_TYPE:
+ stream = audio;
+ streamType = 'audio';
+ break;
+ case StreamTypes.METADATA_STREAM_TYPE:
+ stream = timedMetadata;
+ streamType = 'timed-metadata';
+ break;
+ default:
+ // ignore unknown stream types
+ return;
+ }
+
+ // if a new packet is starting, we can flush the completed
+ // packet
+ if (data.payloadUnitStartIndicator) {
+ flushStream(stream, streamType);
+ }
+
+ // buffer this fragment until we are sure we've received the
+ // complete payload
+ stream.data.push(data);
+ stream.size += data.data.byteLength;
+ },
+ pmt: function() {
+ var
+ event = {
+ type: 'metadata',
+ tracks: []
+ },
+ programMapTable = data.programMapTable,
+ k,
+ track;
+
+ // translate streams to tracks
+ for (k in programMapTable) {
+ if (programMapTable.hasOwnProperty(k)) {
+ track = {
+ timelineStartInfo: {
+ baseMediaDecodeTime: 0
+ }
+ };
+ track.id = +k;
+ if (programMapTable[k] === m2tsStreamTypes.H264_STREAM_TYPE) {
+ track.codec = 'avc';
+ track.type = 'video';
+ } else if (programMapTable[k] === m2tsStreamTypes.ADTS_STREAM_TYPE) {
+ track.codec = 'adts';
+ track.type = 'audio';
+ }
+ event.tracks.push(track);
+ }
+ }
+ self.trigger('data', event);
+ }
+ })[data.type]();
+ };
+
+ /**
+ * Flush any remaining input. Video PES packets may be of variable
+ * length. Normally, the start of a new video packet can trigger the
+ * finalization of the previous packet. That is not possible if no
+ * more video is forthcoming, however. In that case, some other
+ * mechanism (like the end of the file) has to be employed. When it is
+ * clear that no additional data is forthcoming, calling this method
+ * will flush the buffered packets.
+ */
+ this.flush = function() {
+ // !!THIS ORDER IS IMPORTANT!!
+ // video first then audio
+ flushStream(video, 'video');
+ flushStream(audio, 'audio');
+ flushStream(timedMetadata, 'timed-metadata');
+ this.trigger('done');
+ };
+};
+ElementaryStream.prototype = new Stream();
+
+var m2ts = {
+ PAT_PID: 0x0000,
+ MP2T_PACKET_LENGTH: MP2T_PACKET_LENGTH,
+ TransportPacketStream: TransportPacketStream,
+ TransportParseStream: TransportParseStream,
+ ElementaryStream: ElementaryStream,
+ CaptionStream: CaptionStream.CaptionStream,
+ Cea608Stream: CaptionStream.Cea608Stream,
+ MetadataStream: require('./metadata-stream'),
+};
+
+for (var type in StreamTypes) {
+ if (StreamTypes.hasOwnProperty(type)) {
+ m2ts[type] = StreamTypes[type];
+ }
+}
+
+module.exports = m2ts;
+
+},{"../utils/stream.js":49,"./caption-stream":38,"./metadata-stream":41,"./stream-types":42,"./stream-types.js":42}],41:[function(require,module,exports){
+/**
+ * Accepts program elementary stream (PES) data events and parses out
+ * ID3 metadata from them, if present.
+ * @see http://id3.org/id3v2.3.0
+ */
+'use strict';
+var
+ Stream = require('../utils/stream'),
+ StreamTypes = require('./stream-types'),
+ // return a percent-encoded representation of the specified byte range
+ // @see http://en.wikipedia.org/wiki/Percent-encoding
+ percentEncode = function(bytes, start, end) {
+ var i, result = '';
+ for (i = start; i < end; i++) {
+ result += '%' + ('00' + bytes[i].toString(16)).slice(-2);
+ }
+ return result;
+ },
+ // return the string representation of the specified byte range,
+ // interpreted as UTf-8.
+ parseUtf8 = function(bytes, start, end) {
+ return decodeURIComponent(percentEncode(bytes, start, end));
+ },
+ // return the string representation of the specified byte range,
+ // interpreted as ISO-8859-1.
+ parseIso88591 = function(bytes, start, end) {
+ return unescape(percentEncode(bytes, start, end)); // jshint ignore:line
+ },
+ parseSyncSafeInteger = function (data) {
+ return (data[0] << 21) |
+ (data[1] << 14) |
+ (data[2] << 7) |
+ (data[3]);
+ },
+ tagParsers = {
+ 'TXXX': function(tag) {
+ var i;
+ if (tag.data[0] !== 3) {
+ // ignore frames with unrecognized character encodings
+ return;
+ }
+
+ for (i = 1; i < tag.data.length; i++) {
+ if (tag.data[i] === 0) {
+ // parse the text fields
+ tag.description = parseUtf8(tag.data, 1, i);
+ // do not include the null terminator in the tag value
+ tag.value = parseUtf8(tag.data, i + 1, tag.data.length - 1);
+ break;
+ }
+ }
+ tag.data = tag.value;
+ },
+ 'WXXX': function(tag) {
+ var i;
+ if (tag.data[0] !== 3) {
+ // ignore frames with unrecognized character encodings
+ return;
+ }
+
+ for (i = 1; i < tag.data.length; i++) {
+ if (tag.data[i] === 0) {
+ // parse the description and URL fields
+ tag.description = parseUtf8(tag.data, 1, i);
+ tag.url = parseUtf8(tag.data, i + 1, tag.data.length);
+ break;
+ }
+ }
+ },
+ 'PRIV': function(tag) {
+ var i;
+
+ for (i = 0; i < tag.data.length; i++) {
+ if (tag.data[i] === 0) {
+ // parse the description and URL fields
+ tag.owner = parseIso88591(tag.data, 0, i);
+ break;
+ }
+ }
+ tag.privateData = tag.data.subarray(i + 1);
+ tag.data = tag.privateData;
+ }
+ },
+ MetadataStream;
+
+MetadataStream = function(options) {
+ var
+ settings = {
+ debug: !!(options && options.debug),
+
+ // the bytes of the program-level descriptor field in MP2T
+ // see ISO/IEC 13818-1:2013 (E), section 2.6 "Program and
+ // program element descriptors"
+ descriptor: options && options.descriptor
+ },
+ // the total size in bytes of the ID3 tag being parsed
+ tagSize = 0,
+ // tag data that is not complete enough to be parsed
+ buffer = [],
+ // the total number of bytes currently in the buffer
+ bufferSize = 0,
+ i;
+
+ MetadataStream.prototype.init.call(this);
+
+ // calculate the text track in-band metadata track dispatch type
+ // https://html.spec.whatwg.org/multipage/embedded-content.html#steps-to-expose-a-media-resource-specific-text-track
+ this.dispatchType = StreamTypes.METADATA_STREAM_TYPE.toString(16);
+ if (settings.descriptor) {
+ for (i = 0; i < settings.descriptor.length; i++) {
+ this.dispatchType += ('00' + settings.descriptor[i].toString(16)).slice(-2);
+ }
+ }
+
+ this.push = function(chunk) {
+ var tag, frameStart, frameSize, frame, i, frameHeader;
+ if (chunk.type !== 'timed-metadata') {
+ return;
+ }
+
+ // if data_alignment_indicator is set in the PES header,
+ // we must have the start of a new ID3 tag. Assume anything
+ // remaining in the buffer was malformed and throw it out
+ if (chunk.dataAlignmentIndicator) {
+ bufferSize = 0;
+ buffer.length = 0;
+ }
+
+ // ignore events that don't look like ID3 data
+ if (buffer.length === 0 &&
+ (chunk.data.length < 10 ||
+ chunk.data[0] !== 'I'.charCodeAt(0) ||
+ chunk.data[1] !== 'D'.charCodeAt(0) ||
+ chunk.data[2] !== '3'.charCodeAt(0))) {
+ if (settings.debug) {
+ console.log('Skipping unrecognized metadata packet');
+ }
+ return;
+ }
+
+ // add this chunk to the data we've collected so far
+
+ buffer.push(chunk);
+ bufferSize += chunk.data.byteLength;
+
+ // grab the size of the entire frame from the ID3 header
+ if (buffer.length === 1) {
+ // the frame size is transmitted as a 28-bit integer in the
+ // last four bytes of the ID3 header.
+ // The most significant bit of each byte is dropped and the
+ // results concatenated to recover the actual value.
+ tagSize = parseSyncSafeInteger(chunk.data.subarray(6, 10));
+
+ // ID3 reports the tag size excluding the header but it's more
+ // convenient for our comparisons to include it
+ tagSize += 10;
+ }
+
+ // if the entire frame has not arrived, wait for more data
+ if (bufferSize < tagSize) {
+ return;
+ }
+
+ // collect the entire frame so it can be parsed
+ tag = {
+ data: new Uint8Array(tagSize),
+ frames: [],
+ pts: buffer[0].pts,
+ dts: buffer[0].dts
+ };
+ for (i = 0; i < tagSize;) {
+ tag.data.set(buffer[0].data.subarray(0, tagSize - i), i);
+ i += buffer[0].data.byteLength;
+ bufferSize -= buffer[0].data.byteLength;
+ buffer.shift();
+ }
+
+ // find the start of the first frame and the end of the tag
+ frameStart = 10;
+ if (tag.data[5] & 0x40) {
+ // advance the frame start past the extended header
+ frameStart += 4; // header size field
+ frameStart += parseSyncSafeInteger(tag.data.subarray(10, 14));
+
+ // clip any padding off the end
+ tagSize -= parseSyncSafeInteger(tag.data.subarray(16, 20));
+ }
+
+ // parse one or more ID3 frames
+ // http://id3.org/id3v2.3.0#ID3v2_frame_overview
+ do {
+ // determine the number of bytes in this frame
+ frameSize = parseSyncSafeInteger(tag.data.subarray(frameStart + 4, frameStart + 8));
+ if (frameSize < 1) {
+ return console.log('Malformed ID3 frame encountered. Skipping metadata parsing.');
+ }
+ frameHeader = String.fromCharCode(tag.data[frameStart],
+ tag.data[frameStart + 1],
+ tag.data[frameStart + 2],
+ tag.data[frameStart + 3]);
+
+
+ frame = {
+ id: frameHeader,
+ data: tag.data.subarray(frameStart + 10, frameStart + frameSize + 10)
+ };
+ frame.key = frame.id;
+ if (tagParsers[frame.id]) {
+ tagParsers[frame.id](frame);
+ if (frame.owner === 'com.apple.streaming.transportStreamTimestamp') {
+ var
+ d = frame.data,
+ size = ((d[3] & 0x01) << 30) |
+ (d[4] << 22) |
+ (d[5] << 14) |
+ (d[6] << 6) |
+ (d[7] >>> 2);
+
+ size *= 4;
+ size += d[7] & 0x03;
+ frame.timeStamp = size;
+ this.trigger('timestamp', frame);
+ }
+ }
+ tag.frames.push(frame);
+
+ frameStart += 10; // advance past the frame header
+ frameStart += frameSize; // advance past the frame body
+ } while (frameStart < tagSize);
+ this.trigger('data', tag);
+ };
+};
+MetadataStream.prototype = new Stream();
+
+module.exports = MetadataStream;
+
+},{"../utils/stream":49,"./stream-types":42}],42:[function(require,module,exports){
+'use strict';
+
+module.exports = {
+ H264_STREAM_TYPE: 0x1B,
+ ADTS_STREAM_TYPE: 0x0F,
+ METADATA_STREAM_TYPE: 0x15
+};
+
+},{}],43:[function(require,module,exports){
+module.exports = {
+ generator: require('./mp4-generator'),
+ Transmuxer: require('./transmuxer').Transmuxer,
+ AudioSegmentStream: require('./transmuxer').AudioSegmentStream,
+ VideoSegmentStream: require('./transmuxer').VideoSegmentStream,
+ tools: require('../tools/mp4-inspector'),
+};
+
+},{"../tools/mp4-inspector":47,"./mp4-generator":44,"./transmuxer":45}],44:[function(require,module,exports){
+/**
+ * mux.js
+ *
+ * Copyright (c) 2015 Brightcove
+ * All rights reserved.
+ *
+ * Functions that generate fragmented MP4s suitable for use with Media
+ * Source Extensions.
+ */
+'use strict';
+
+var box, dinf, esds, ftyp, mdat, mfhd, minf, moof, moov, mvex, mvhd, trak,
+ tkhd, mdia, mdhd, hdlr, sdtp, stbl, stsd, styp, traf, trex, trun,
+ types, MAJOR_BRAND, MINOR_VERSION, AVC1_BRAND, VIDEO_HDLR,
+ AUDIO_HDLR, HDLR_TYPES, VMHD, SMHD, DREF, STCO, STSC, STSZ, STTS;
+
+// pre-calculate constants
+(function() {
+ var i;
+ types = {
+ avc1: [], // codingname
+ avcC: [],
+ btrt: [],
+ dinf: [],
+ dref: [],
+ esds: [],
+ ftyp: [],
+ hdlr: [],
+ mdat: [],
+ mdhd: [],
+ mdia: [],
+ mfhd: [],
+ minf: [],
+ moof: [],
+ moov: [],
+ mp4a: [], // codingname
+ mvex: [],
+ mvhd: [],
+ sdtp: [],
+ smhd: [],
+ stbl: [],
+ stco: [],
+ stsc: [],
+ stsd: [],
+ stsz: [],
+ stts: [],
+ styp: [],
+ tfdt: [],
+ tfhd: [],
+ traf: [],
+ trak: [],
+ trun: [],
+ trex: [],
+ tkhd: [],
+ vmhd: []
+ };
+
+ for (i in types) {
+ if (types.hasOwnProperty(i)) {
+ types[i] = [
+ i.charCodeAt(0),
+ i.charCodeAt(1),
+ i.charCodeAt(2),
+ i.charCodeAt(3)
+ ];
+ }
+ }
+
+ MAJOR_BRAND = new Uint8Array([
+ 'i'.charCodeAt(0),
+ 's'.charCodeAt(0),
+ 'o'.charCodeAt(0),
+ 'm'.charCodeAt(0)
+ ]);
+ AVC1_BRAND = new Uint8Array([
+ 'a'.charCodeAt(0),
+ 'v'.charCodeAt(0),
+ 'c'.charCodeAt(0),
+ '1'.charCodeAt(0)
+ ]);
+ MINOR_VERSION = new Uint8Array([0, 0, 0, 1]);
+ VIDEO_HDLR = new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, 0x00, 0x00, // pre_defined
+ 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x56, 0x69, 0x64, 0x65,
+ 0x6f, 0x48, 0x61, 0x6e,
+ 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'
+ ]);
+ AUDIO_HDLR = new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, 0x00, 0x00, // pre_defined
+ 0x73, 0x6f, 0x75, 0x6e, // handler_type: 'soun'
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x53, 0x6f, 0x75, 0x6e,
+ 0x64, 0x48, 0x61, 0x6e,
+ 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler'
+ ]);
+ HDLR_TYPES = {
+ "video":VIDEO_HDLR,
+ "audio": AUDIO_HDLR
+ };
+ DREF = new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, 0x00, 0x01, // entry_count
+ 0x00, 0x00, 0x00, 0x0c, // entry_size
+ 0x75, 0x72, 0x6c, 0x20, // 'url' type
+ 0x00, // version 0
+ 0x00, 0x00, 0x01 // entry_flags
+ ]);
+ SMHD = new Uint8Array([
+ 0x00, // version
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, // balance, 0 means centered
+ 0x00, 0x00 // reserved
+ ]);
+ STCO = new Uint8Array([
+ 0x00, // version
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, 0x00, 0x00 // entry_count
+ ]);
+ STSC = STCO;
+ STSZ = new Uint8Array([
+ 0x00, // version
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, 0x00, 0x00, // sample_size
+ 0x00, 0x00, 0x00, 0x00, // sample_count
+ ]);
+ STTS = STCO;
+ VMHD = new Uint8Array([
+ 0x00, // version
+ 0x00, 0x00, 0x01, // flags
+ 0x00, 0x00, // graphicsmode
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00 // opcolor
+ ]);
+})();
+
+box = function(type) {
+ var
+ payload = [],
+ size = 0,
+ i,
+ result,
+ view;
+
+ for (i = 1; i < arguments.length; i++) {
+ payload.push(arguments[i]);
+ }
+
+ i = payload.length;
+
+ // calculate the total size we need to allocate
+ while (i--) {
+ size += payload[i].byteLength;
+ }
+ result = new Uint8Array(size + 8);
+ view = new DataView(result.buffer, result.byteOffset, result.byteLength);
+ view.setUint32(0, result.byteLength);
+ result.set(type, 4);
+
+ // copy the payload into the result
+ for (i = 0, size = 8; i < payload.length; i++) {
+ result.set(payload[i], size);
+ size += payload[i].byteLength;
+ }
+ return result;
+};
+
+dinf = function() {
+ return box(types.dinf, box(types.dref, DREF));
+};
+
+esds = function(track) {
+ return box(types.esds, new Uint8Array([
+ 0x00, // version
+ 0x00, 0x00, 0x00, // flags
+
+ // ES_Descriptor
+ 0x03, // tag, ES_DescrTag
+ 0x19, // length
+ 0x00, 0x00, // ES_ID
+ 0x00, // streamDependenceFlag, URL_flag, reserved, streamPriority
+
+ // DecoderConfigDescriptor
+ 0x04, // tag, DecoderConfigDescrTag
+ 0x11, // length
+ 0x40, // object type
+ 0x15, // streamType
+ 0x00, 0x06, 0x00, // bufferSizeDB
+ 0x00, 0x00, 0xda, 0xc0, // maxBitrate
+ 0x00, 0x00, 0xda, 0xc0, // avgBitrate
+
+ // DecoderSpecificInfo
+ 0x05, // tag, DecoderSpecificInfoTag
+ 0x02, // length
+ // ISO/IEC 14496-3, AudioSpecificConfig
+ // for samplingFrequencyIndex see ISO/IEC 13818-7:2006, 8.1.3.2.2, Table 35
+ (track.audioobjecttype << 3) | (track.samplingfrequencyindex >>> 1),
+ (track.samplingfrequencyindex << 7) | (track.channelcount << 3),
+ 0x06, 0x01, 0x02 // GASpecificConfig
+ ]));
+};
+
+ftyp = function() {
+ return box(types.ftyp, MAJOR_BRAND, MINOR_VERSION, MAJOR_BRAND, AVC1_BRAND);
+};
+
+hdlr = function(type) {
+ return box(types.hdlr, HDLR_TYPES[type]);
+};
+mdat = function(data) {
+ return box(types.mdat, data);
+};
+mdhd = function(track) {
+ var result = new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, 0x00, 0x02, // creation_time
+ 0x00, 0x00, 0x00, 0x03, // modification_time
+ 0x00, 0x01, 0x5f, 0x90, // timescale, 90,000 "ticks" per second
+
+ (track.duration >>> 24) & 0xFF,
+ (track.duration >>> 16) & 0xFF,
+ (track.duration >>> 8) & 0xFF,
+ track.duration & 0xFF, // duration
+ 0x55, 0xc4, // 'und' language (undetermined)
+ 0x00, 0x00
+ ]);
+
+ // Use the sample rate from the track metadata, when it is
+ // defined. The sample rate can be parsed out of an ADTS header, for
+ // instance.
+ if (track.samplerate) {
+ result[12] = (track.samplerate >>> 24) & 0xFF;
+ result[13] = (track.samplerate >>> 16) & 0xFF;
+ result[14] = (track.samplerate >>> 8) & 0xFF;
+ result[15] = (track.samplerate) & 0xFF;
+ }
+
+ return box(types.mdhd, result);
+};
+mdia = function(track) {
+ return box(types.mdia, mdhd(track), hdlr(track.type), minf(track));
+};
+mfhd = function(sequenceNumber) {
+ return box(types.mfhd, new Uint8Array([
+ 0x00,
+ 0x00, 0x00, 0x00, // flags
+ (sequenceNumber & 0xFF000000) >> 24,
+ (sequenceNumber & 0xFF0000) >> 16,
+ (sequenceNumber & 0xFF00) >> 8,
+ sequenceNumber & 0xFF, // sequence_number
+ ]));
+};
+minf = function(track) {
+ return box(types.minf,
+ track.type === 'video' ? box(types.vmhd, VMHD) : box(types.smhd, SMHD),
+ dinf(),
+ stbl(track));
+};
+moof = function(sequenceNumber, tracks) {
+ var
+ trackFragments = [],
+ i = tracks.length;
+ // build traf boxes for each track fragment
+ while (i--) {
+ trackFragments[i] = traf(tracks[i]);
+ }
+ return box.apply(null, [
+ types.moof,
+ mfhd(sequenceNumber)
+ ].concat(trackFragments));
+};
+/**
+ * Returns a movie box.
+ * @param tracks {array} the tracks associated with this movie
+ * @see ISO/IEC 14496-12:2012(E), section 8.2.1
+ */
+moov = function(tracks) {
+ var
+ i = tracks.length,
+ boxes = [];
+
+ while (i--) {
+ boxes[i] = trak(tracks[i]);
+ }
+
+ return box.apply(null, [types.moov, mvhd(0xffffffff)].concat(boxes).concat(mvex(tracks)));
+};
+mvex = function(tracks) {
+ var
+ i = tracks.length,
+ boxes = [];
+
+ while (i--) {
+ boxes[i] = trex(tracks[i]);
+ }
+ return box.apply(null, [types.mvex].concat(boxes));
+};
+mvhd = function(duration) {
+ var
+ bytes = new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, 0x00, 0x01, // creation_time
+ 0x00, 0x00, 0x00, 0x02, // modification_time
+ 0x00, 0x01, 0x5f, 0x90, // timescale, 90,000 "ticks" per second
+ (duration & 0xFF000000) >> 24,
+ (duration & 0xFF0000) >> 16,
+ (duration & 0xFF00) >> 8,
+ duration & 0xFF, // duration
+ 0x00, 0x01, 0x00, 0x00, // 1.0 rate
+ 0x01, 0x00, // 1.0 volume
+ 0x00, 0x00, // reserved
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x00, // transformation: unity matrix
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, // pre_defined
+ 0xff, 0xff, 0xff, 0xff // next_track_ID
+ ]);
+ return box(types.mvhd, bytes);
+};
+
+sdtp = function(track) {
+ var
+ samples = track.samples || [],
+ bytes = new Uint8Array(4 + samples.length),
+ flags,
+ i;
+
+ // leave the full box header (4 bytes) all zero
+
+ // write the sample table
+ for (i = 0; i < samples.length; i++) {
+ flags = samples[i].flags;
+
+ bytes[i + 4] = (flags.dependsOn << 4) |
+ (flags.isDependedOn << 2) |
+ (flags.hasRedundancy);
+ }
+
+ return box(types.sdtp,
+ bytes);
+};
+
+stbl = function(track) {
+ return box(types.stbl,
+ stsd(track),
+ box(types.stts, STTS),
+ box(types.stsc, STSC),
+ box(types.stsz, STSZ),
+ box(types.stco, STCO));
+};
+
+(function() {
+ var videoSample, audioSample;
+
+ stsd = function(track) {
+
+ return box(types.stsd, new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x00, // flags
+ 0x00, 0x00, 0x00, 0x01
+ ]), track.type === 'video' ? videoSample(track) : audioSample(track));
+ };
+
+ videoSample = function(track) {
+ var
+ sps = track.sps || [],
+ pps = track.pps || [],
+ sequenceParameterSets = [],
+ pictureParameterSets = [],
+ i;
+
+ // assemble the SPSs
+ for (i = 0; i < sps.length; i++) {
+ sequenceParameterSets.push((sps[i].byteLength & 0xFF00) >>> 8);
+ sequenceParameterSets.push((sps[i].byteLength & 0xFF)); // sequenceParameterSetLength
+ sequenceParameterSets = sequenceParameterSets.concat(Array.prototype.slice.call(sps[i])); // SPS
+ }
+
+ // assemble the PPSs
+ for (i = 0; i < pps.length; i++) {
+ pictureParameterSets.push((pps[i].byteLength & 0xFF00) >>> 8);
+ pictureParameterSets.push((pps[i].byteLength & 0xFF));
+ pictureParameterSets = pictureParameterSets.concat(Array.prototype.slice.call(pps[i]));
+ }
+
+ return box(types.avc1, new Uint8Array([
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x01, // data_reference_index
+ 0x00, 0x00, // pre_defined
+ 0x00, 0x00, // reserved
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, // pre_defined
+ (track.width & 0xff00) >> 8,
+ track.width & 0xff, // width
+ (track.height & 0xff00) >> 8,
+ track.height & 0xff, // height
+ 0x00, 0x48, 0x00, 0x00, // horizresolution
+ 0x00, 0x48, 0x00, 0x00, // vertresolution
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x01, // frame_count
+ 0x13,
+ 0x76, 0x69, 0x64, 0x65,
+ 0x6f, 0x6a, 0x73, 0x2d,
+ 0x63, 0x6f, 0x6e, 0x74,
+ 0x72, 0x69, 0x62, 0x2d,
+ 0x68, 0x6c, 0x73, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, // compressorname
+ 0x00, 0x18, // depth = 24
+ 0x11, 0x11 // pre_defined = -1
+ ]), box(types.avcC, new Uint8Array([
+ 0x01, // configurationVersion
+ track.profileIdc, // AVCProfileIndication
+ track.profileCompatibility, // profile_compatibility
+ track.levelIdc, // AVCLevelIndication
+ 0xff // lengthSizeMinusOne, hard-coded to 4 bytes
+ ].concat([
+ sps.length // numOfSequenceParameterSets
+ ]).concat(sequenceParameterSets).concat([
+ pps.length // numOfPictureParameterSets
+ ]).concat(pictureParameterSets))), // "PPS"
+ box(types.btrt, new Uint8Array([
+ 0x00, 0x1c, 0x9c, 0x80, // bufferSizeDB
+ 0x00, 0x2d, 0xc6, 0xc0, // maxBitrate
+ 0x00, 0x2d, 0xc6, 0xc0
+ ])) // avgBitrate
+ );
+ };
+
+ audioSample = function(track) {
+ return box(types.mp4a, new Uint8Array([
+
+ // SampleEntry, ISO/IEC 14496-12
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x01, // data_reference_index
+
+ // AudioSampleEntry, ISO/IEC 14496-12
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ (track.channelcount & 0xff00) >> 8,
+ (track.channelcount & 0xff), // channelcount
+
+ (track.samplesize & 0xff00) >> 8,
+ (track.samplesize & 0xff), // samplesize
+ 0x00, 0x00, // pre_defined
+ 0x00, 0x00, // reserved
+
+ (track.samplerate & 0xff00) >> 8,
+ (track.samplerate & 0xff),
+ 0x00, 0x00 // samplerate, 16.16
+
+ // MP4AudioSampleEntry, ISO/IEC 14496-14
+ ]), esds(track));
+ };
+})();
+
+styp = function() {
+ return box(types.styp, MAJOR_BRAND, MINOR_VERSION, MAJOR_BRAND);
+};
+
+tkhd = function(track) {
+ var result = new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x07, // flags
+ 0x00, 0x00, 0x00, 0x00, // creation_time
+ 0x00, 0x00, 0x00, 0x00, // modification_time
+ (track.id & 0xFF000000) >> 24,
+ (track.id & 0xFF0000) >> 16,
+ (track.id & 0xFF00) >> 8,
+ track.id & 0xFF, // track_ID
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ (track.duration & 0xFF000000) >> 24,
+ (track.duration & 0xFF0000) >> 16,
+ (track.duration & 0xFF00) >> 8,
+ track.duration & 0xFF, // duration
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, // reserved
+ 0x00, 0x00, // layer
+ 0x00, 0x00, // alternate_group
+ 0x01, 0x00, // non-audio track volume
+ 0x00, 0x00, // reserved
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x00, // transformation: unity matrix
+ (track.width & 0xFF00) >> 8,
+ track.width & 0xFF,
+ 0x00, 0x00, // width
+ (track.height & 0xFF00) >> 8,
+ track.height & 0xFF,
+ 0x00, 0x00 // height
+ ]);
+
+ return box(types.tkhd, result);
+};
+
+/**
+ * Generate a track fragment (traf) box. A traf box collects metadata
+ * about tracks in a movie fragment (moof) box.
+ */
+traf = function(track) {
+ var trackFragmentHeader, trackFragmentDecodeTime,
+ trackFragmentRun, sampleDependencyTable, dataOffset;
+
+ trackFragmentHeader = box(types.tfhd, new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x3a, // flags
+ (track.id & 0xFF000000) >> 24,
+ (track.id & 0xFF0000) >> 16,
+ (track.id & 0xFF00) >> 8,
+ (track.id & 0xFF), // track_ID
+ 0x00, 0x00, 0x00, 0x01, // sample_description_index
+ 0x00, 0x00, 0x00, 0x00, // default_sample_duration
+ 0x00, 0x00, 0x00, 0x00, // default_sample_size
+ 0x00, 0x00, 0x00, 0x00 // default_sample_flags
+ ]));
+
+ trackFragmentDecodeTime = box(types.tfdt, new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x00, // flags
+ // baseMediaDecodeTime
+ (track.baseMediaDecodeTime >>> 24) & 0xFF,
+ (track.baseMediaDecodeTime >>> 16) & 0xFF,
+ (track.baseMediaDecodeTime >>> 8) & 0xFF,
+ track.baseMediaDecodeTime & 0xFF
+ ]));
+
+ // the data offset specifies the number of bytes from the start of
+ // the containing moof to the first payload byte of the associated
+ // mdat
+ dataOffset = (32 + // tfhd
+ 16 + // tfdt
+ 8 + // traf header
+ 16 + // mfhd
+ 8 + // moof header
+ 8); // mdat header
+
+ // audio tracks require less metadata
+ if (track.type === 'audio') {
+ trackFragmentRun = trun(track, dataOffset);
+ return box(types.traf,
+ trackFragmentHeader,
+ trackFragmentDecodeTime,
+ trackFragmentRun);
+ }
+
+ // video tracks should contain an independent and disposable samples
+ // box (sdtp)
+ // generate one and adjust offsets to match
+ sampleDependencyTable = sdtp(track);
+ trackFragmentRun = trun(track,
+ sampleDependencyTable.length + dataOffset);
+ return box(types.traf,
+ trackFragmentHeader,
+ trackFragmentDecodeTime,
+ trackFragmentRun,
+ sampleDependencyTable);
+};
+
+/**
+ * Generate a track box.
+ * @param track {object} a track definition
+ * @return {Uint8Array} the track box
+ */
+trak = function(track) {
+ track.duration = track.duration || 0xffffffff;
+ return box(types.trak,
+ tkhd(track),
+ mdia(track));
+};
+
+trex = function(track) {
+ var result = new Uint8Array([
+ 0x00, // version 0
+ 0x00, 0x00, 0x00, // flags
+ (track.id & 0xFF000000) >> 24,
+ (track.id & 0xFF0000) >> 16,
+ (track.id & 0xFF00) >> 8,
+ (track.id & 0xFF), // track_ID
+ 0x00, 0x00, 0x00, 0x01, // default_sample_description_index
+ 0x00, 0x00, 0x00, 0x00, // default_sample_duration
+ 0x00, 0x00, 0x00, 0x00, // default_sample_size
+ 0x00, 0x01, 0x00, 0x01 // default_sample_flags
+ ]);
+ // the last two bytes of default_sample_flags is the sample
+ // degradation priority, a hint about the importance of this sample
+ // relative to others. Lower the degradation priority for all sample
+ // types other than video.
+ if (track.type !== 'video') {
+ result[result.length - 1] = 0x00;
+ }
+
+ return box(types.trex, result);
+};
+
+(function() {
+ var audioTrun, videoTrun, trunHeader;
+
+ // This method assumes all samples are uniform. That is, if a
+ // duration is present for the first sample, it will be present for
+ // all subsequent samples.
+ // see ISO/IEC 14496-12:2012, Section 8.8.8.1
+ trunHeader = function(samples, offset) {
+ var durationPresent = 0, sizePresent = 0,
+ flagsPresent = 0, compositionTimeOffset = 0;
+
+ // trun flag constants
+ if (samples.length) {
+ if (samples[0].duration !== undefined) {
+ durationPresent = 0x1;
+ }
+ if (samples[0].size !== undefined) {
+ sizePresent = 0x2;
+ }
+ if (samples[0].flags !== undefined) {
+ flagsPresent = 0x4;
+ }
+ if (samples[0].compositionTimeOffset !== undefined) {
+ compositionTimeOffset = 0x8;
+ }
+ }
+
+ return [
+ 0x00, // version 0
+ 0x00,
+ durationPresent | sizePresent | flagsPresent | compositionTimeOffset,
+ 0x01, // flags
+ (samples.length & 0xFF000000) >>> 24,
+ (samples.length & 0xFF0000) >>> 16,
+ (samples.length & 0xFF00) >>> 8,
+ samples.length & 0xFF, // sample_count
+ (offset & 0xFF000000) >>> 24,
+ (offset & 0xFF0000) >>> 16,
+ (offset & 0xFF00) >>> 8,
+ offset & 0xFF // data_offset
+ ];
+ };
+
+ videoTrun = function(track, offset) {
+ var bytes, samples, sample, i;
+
+ samples = track.samples || [];
+ offset += 8 + 12 + (16 * samples.length);
+
+ bytes = trunHeader(samples, offset);
+
+ for (i = 0; i < samples.length; i++) {
+ sample = samples[i];
+ bytes = bytes.concat([
+ (sample.duration & 0xFF000000) >>> 24,
+ (sample.duration & 0xFF0000) >>> 16,
+ (sample.duration & 0xFF00) >>> 8,
+ sample.duration & 0xFF, // sample_duration
+ (sample.size & 0xFF000000) >>> 24,
+ (sample.size & 0xFF0000) >>> 16,
+ (sample.size & 0xFF00) >>> 8,
+ sample.size & 0xFF, // sample_size
+ (sample.flags.isLeading << 2) | sample.flags.dependsOn,
+ (sample.flags.isDependedOn << 6) |
+ (sample.flags.hasRedundancy << 4) |
+ (sample.flags.paddingValue << 1) |
+ sample.flags.isNonSyncSample,
+ sample.flags.degradationPriority & 0xF0 << 8,
+ sample.flags.degradationPriority & 0x0F, // sample_flags
+ (sample.compositionTimeOffset & 0xFF000000) >>> 24,
+ (sample.compositionTimeOffset & 0xFF0000) >>> 16,
+ (sample.compositionTimeOffset & 0xFF00) >>> 8,
+ sample.compositionTimeOffset & 0xFF // sample_composition_time_offset
+ ]);
+ }
+ return box(types.trun, new Uint8Array(bytes));
+ };
+
+ audioTrun = function(track, offset) {
+ var bytes, samples, sample, i;
+
+ samples = track.samples || [];
+ offset += 8 + 12 + (8 * samples.length);
+
+ bytes = trunHeader(samples, offset);
+
+ for (i = 0; i < samples.length; i++) {
+ sample = samples[i];
+ bytes = bytes.concat([
+ (sample.duration & 0xFF000000) >>> 24,
+ (sample.duration & 0xFF0000) >>> 16,
+ (sample.duration & 0xFF00) >>> 8,
+ sample.duration & 0xFF, // sample_duration
+ (sample.size & 0xFF000000) >>> 24,
+ (sample.size & 0xFF0000) >>> 16,
+ (sample.size & 0xFF00) >>> 8,
+ sample.size & 0xFF]); // sample_size
+ }
+
+ return box(types.trun, new Uint8Array(bytes));
+ };
+
+ trun = function(track, offset) {
+ if (track.type === 'audio') {
+ return audioTrun(track, offset);
+ } else {
+ return videoTrun(track, offset);
+ }
+ };
+})();
+
+module.exports = {
+ ftyp: ftyp,
+ mdat: mdat,
+ moof: moof,
+ moov: moov,
+ initSegment: function(tracks) {
+ var
+ fileType = ftyp(),
+ movie = moov(tracks),
+ result;
+
+ result = new Uint8Array(fileType.byteLength + movie.byteLength);
+ result.set(fileType);
+ result.set(movie, fileType.byteLength);
+ return result;
+ }
+};
+
+},{}],45:[function(require,module,exports){
+/**
+ * mux.js
+ *
+ * Copyright (c) 2015 Brightcove
+ * All rights reserved.
+ *
+ * A stream-based mp2t to mp4 converter. This utility can be used to
+ * deliver mp4s to a SourceBuffer on platforms that support native
+ * Media Source Extensions.
+ */
+'use strict';
+
+var Stream = require('../utils/stream.js');
+var mp4 = require('./mp4-generator.js');
+var m2ts = require('../m2ts/m2ts.js');
+var AdtsStream = require('../codecs/adts.js');
+var H264Stream = require('../codecs/h264').H264Stream;
+var AacStream = require('../aac');
+
+// object types
+var VideoSegmentStream, AudioSegmentStream, Transmuxer, CoalesceStream;
+
+// Helper functions
+var
+ defaultSample,
+ collectDtsInfo,
+ clearDtsInfo,
+ calculateTrackBaseMediaDecodeTime,
+ arrayEquals,
+ sumFrameByteLengths;
+
+/**
+ * Default sample object
+ * see ISO/IEC 14496-12:2012, section 8.6.4.3
+ */
+defaultSample = {
+ size: 0,
+ flags: {
+ isLeading: 0,
+ dependsOn: 1,
+ isDependedOn: 0,
+ hasRedundancy: 0,
+ degradationPriority: 0
+ }
+};
+
+/**
+ * Compare two arrays (even typed) for same-ness
+ */
+arrayEquals = function(a, b) {
+ var
+ i;
+
+ if (a.length !== b.length) {
+ return false;
+ }
+
+ // compare the value of each element in the array
+ for (i = 0; i < a.length; i++) {
+ if (a[i] !== b[i]) {
+ return false;
+ }
+ }
+
+ return true;
+};
+
+/**
+ * Sum the `byteLength` properties of the data in each AAC frame
+ */
+sumFrameByteLengths = function(array) {
+ var
+ i,
+ currentObj,
+ sum = 0;
+
+ // sum the byteLength's all each nal unit in the frame
+ for (i = 0; i < array.length; i++) {
+ currentObj = array[i];
+ sum += currentObj.data.byteLength;
+ }
+
+ return sum;
+};
+
+/**
+ * Constructs a single-track, ISO BMFF media segment from AAC data
+ * events. The output of this stream can be fed to a SourceBuffer
+ * configured with a suitable initialization segment.
+ */
+AudioSegmentStream = function(track) {
+ var
+ adtsFrames = [],
+ sequenceNumber = 0,
+ earliestAllowedDts = 0;
+
+ AudioSegmentStream.prototype.init.call(this);
+
+ this.push = function(data) {
+ collectDtsInfo(track, data);
+
+ if (track) {
+ track.audioobjecttype = data.audioobjecttype;
+ track.channelcount = data.channelcount;
+ track.samplerate = data.samplerate;
+ track.samplingfrequencyindex = data.samplingfrequencyindex;
+ track.samplesize = data.samplesize;
+ }
+
+ // buffer audio data until end() is called
+ adtsFrames.push(data);
+ };
+
+ this.setEarliestDts = function(earliestDts) {
+ earliestAllowedDts = earliestDts - track.timelineStartInfo.baseMediaDecodeTime;
+ };
+
+ this.flush = function() {
+ var
+ frames,
+ moof,
+ mdat,
+ boxes;
+
+ // return early if no audio data has been observed
+ if (adtsFrames.length === 0) {
+ this.trigger('done');
+ return;
+ }
+
+ frames = this.trimAdtsFramesByEarliestDts_(adtsFrames);
+
+ // we have to build the index from byte locations to
+ // samples (that is, adts frames) in the audio data
+ track.samples = this.generateSampleTable_(frames);
+
+ // concatenate the audio data to constuct the mdat
+ mdat = mp4.mdat(this.concatenateFrameData_(frames));
+
+ adtsFrames = [];
+
+ calculateTrackBaseMediaDecodeTime(track);
+ moof = mp4.moof(sequenceNumber, [track]);
+ boxes = new Uint8Array(moof.byteLength + mdat.byteLength);
+
+ // bump the sequence number for next time
+ sequenceNumber++;
+
+ boxes.set(moof);
+ boxes.set(mdat, moof.byteLength);
+
+ clearDtsInfo(track);
+
+ this.trigger('data', {track: track, boxes: boxes});
+ this.trigger('done');
+ };
+
+ // If the audio segment extends before the earliest allowed dts
+ // value, remove AAC frames until starts at or after the earliest
+ // allowed DTS so that we don't end up with a negative baseMedia-
+ // DecodeTime for the audio track
+ this.trimAdtsFramesByEarliestDts_ = function(adtsFrames) {
+ if (track.minSegmentDts >= earliestAllowedDts) {
+ return adtsFrames;
+ }
+
+ // We will need to recalculate the earliest segment Dts
+ track.minSegmentDts = Infinity;
+
+ return adtsFrames.filter(function(currentFrame) {
+ // If this is an allowed frame, keep it and record it's Dts
+ if (currentFrame.dts >= earliestAllowedDts) {
+ track.minSegmentDts = Math.min(track.minSegmentDts, currentFrame.dts);
+ track.minSegmentPts = track.minSegmentDts;
+ return true;
+ }
+ // Otherwise, discard it
+ return false;
+ });
+ };
+
+ // generate the track's raw mdat data from an array of frames
+ this.generateSampleTable_ = function(frames) {
+ var
+ i,
+ currentFrame,
+ samples = [];
+
+ for (i = 0; i < frames.length; i++) {
+ currentFrame = frames[i];
+ samples.push({
+ size: currentFrame.data.byteLength,
+ duration: 1024 // For AAC audio, all samples contain 1024 samples
+ });
+ }
+ return samples;
+ };
+
+ // generate the track's sample table from an array of frames
+ this.concatenateFrameData_ = function(frames) {
+ var
+ i,
+ currentFrame,
+ dataOffset = 0,
+ data = new Uint8Array(sumFrameByteLengths(frames));
+
+ for (i = 0; i < frames.length; i++) {
+ currentFrame = frames[i];
+
+ data.set(currentFrame.data, dataOffset);
+ dataOffset += currentFrame.data.byteLength;
+ }
+ return data;
+ };
+};
+
+AudioSegmentStream.prototype = new Stream();
+
+/**
+ * Constructs a single-track, ISO BMFF media segment from H264 data
+ * events. The output of this stream can be fed to a SourceBuffer
+ * configured with a suitable initialization segment.
+ * @param track {object} track metadata configuration
+ */
+VideoSegmentStream = function(track) {
+ var
+ sequenceNumber = 0,
+ nalUnits = [],
+ config,
+ pps;
+
+ VideoSegmentStream.prototype.init.call(this);
+
+ delete track.minPTS;
+
+ this.gopCache_ = [];
+
+ this.push = function(nalUnit) {
+ collectDtsInfo(track, nalUnit);
+
+ // record the track config
+ if (nalUnit.nalUnitType === 'seq_parameter_set_rbsp' &&
+ !config) {
+ config = nalUnit.config;
+
+ track.width = config.width;
+ track.height = config.height;
+ track.sps = [nalUnit.data];
+ track.profileIdc = config.profileIdc;
+ track.levelIdc = config.levelIdc;
+ track.profileCompatibility = config.profileCompatibility;
+ }
+
+ if (nalUnit.nalUnitType === 'pic_parameter_set_rbsp' &&
+ !pps) {
+ pps = nalUnit.data;
+ track.pps = [nalUnit.data];
+ }
+
+ // buffer video until flush() is called
+ nalUnits.push(nalUnit);
+ };
+
+ this.flush = function() {
+ var
+ frames,
+ gopForFusion,
+ gops,
+ moof,
+ mdat,
+ boxes;
+
+ // Throw away nalUnits at the start of the byte stream until
+ // we find the first AUD
+ while (nalUnits.length) {
+ if (nalUnits[0].nalUnitType === 'access_unit_delimiter_rbsp') {
+ break;
+ }
+ nalUnits.shift();
+ }
+
+ // Return early if no video data has been observed
+ if (nalUnits.length === 0) {
+ this.resetStream_();
+ this.trigger('done');
+ return;
+ }
+
+ // Organize the raw nal-units into arrays that represent
+ // higher-level constructs such as frames and gops
+ // (group-of-pictures)
+ frames = this.groupNalsIntoFrames_(nalUnits);
+ gops = this.groupFramesIntoGops_(frames);
+
+ // If the first frame of this fragment is not a keyframe we have
+ // a problem since MSE (on Chrome) requires a leading keyframe.
+ //
+ // We have two approaches to repairing this situation:
+ // 1) GOP-FUSION:
+ // This is where we keep track of the GOPS (group-of-pictures)
+ // from previous fragments and attempt to find one that we can
+ // prepend to the current fragment in order to create a valid
+ // fragment.
+ // 2) KEYFRAME-PULLING:
+ // Here we search for the first keyframe in the fragment and
+ // throw away all the frames between the start of the fragment
+ // and that keyframe. We then extend the duration and pull the
+ // PTS of the keyframe forward so that it covers the time range
+ // of the frames that were disposed of.
+ //
+ // #1 is far prefereable over #2 which can cause "stuttering" but
+ // requires more things to be just right.
+ if (!gops[0][0].keyFrame) {
+ // Search for a gop for fusion from our gopCache
+ gopForFusion = this.getGopForFusion_(nalUnits[0], track);
+
+ if (gopForFusion) {
+ gops.unshift(gopForFusion);
+ // Adjust Gops' metadata to account for the inclusion of the
+ // new gop at the beginning
+ gops.byteLength += gopForFusion.byteLength;
+ gops.nalCount += gopForFusion.nalCount;
+ gops.pts = gopForFusion.pts;
+ gops.dts = gopForFusion.dts;
+ gops.duration += gopForFusion.duration;
+ } else {
+ // If we didn't find a candidate gop fall back to keyrame-pulling
+ gops = this.extendFirstKeyFrame_(gops);
+ }
+ }
+ collectDtsInfo(track, gops);
+
+ // First, we have to build the index from byte locations to
+ // samples (that is, frames) in the video data
+ track.samples = this.generateSampleTable_(gops);
+
+ // Concatenate the video data and construct the mdat
+ mdat = mp4.mdat(this.concatenateNalData_(gops));
+
+ // save all the nals in the last GOP into the gop cache
+ this.gopCache_.unshift({
+ gop: gops.pop(),
+ pps: track.pps,
+ sps: track.sps
+ });
+
+ // Keep a maximum of 6 GOPs in the cache
+ this.gopCache_.length = Math.min(6, this.gopCache_.length);
+
+ // Clear nalUnits
+ nalUnits = [];
+
+ calculateTrackBaseMediaDecodeTime(track);
+
+ this.trigger('timelineStartInfo', track.timelineStartInfo);
+
+ moof = mp4.moof(sequenceNumber, [track]);
+
+ // it would be great to allocate this array up front instead of
+ // throwing away hundreds of media segment fragments
+ boxes = new Uint8Array(moof.byteLength + mdat.byteLength);
+
+ // Bump the sequence number for next time
+ sequenceNumber++;
+
+ boxes.set(moof);
+ boxes.set(mdat, moof.byteLength);
+
+ this.trigger('data', {track: track, boxes: boxes});
+
+ this.resetStream_();
+
+ // Continue with the flush process now
+ this.trigger('done');
+ };
+
+ this.resetStream_ = function() {
+ clearDtsInfo(track);
+
+ // reset config and pps because they may differ across segments
+ // for instance, when we are rendition switching
+ config = undefined;
+ pps = undefined;
+ };
+
+ // Search for a candidate Gop for gop-fusion from the gop cache and
+ // return it or return null if no good candidate was found
+ this.getGopForFusion_ = function (nalUnit) {
+ var
+ halfSecond = 45000, // Half-a-second in a 90khz clock
+ allowableOverlap = 10000, // About 3 frames @ 30fps
+ nearestDistance = Infinity,
+ dtsDistance,
+ nearestGopObj,
+ currentGop,
+ currentGopObj,
+ i;
+
+ // Search for the GOP nearest to the beginning of this nal unit
+ for (i = 0; i < this.gopCache_.length; i++) {
+ currentGopObj = this.gopCache_[i];
+ currentGop = currentGopObj.gop;
+
+ // Reject Gops with different SPS or PPS
+ if (!(track.pps && arrayEquals(track.pps[0], currentGopObj.pps[0])) ||
+ !(track.sps && arrayEquals(track.sps[0], currentGopObj.sps[0]))) {
+ continue;
+ }
+
+ // Reject Gops that would require a negative baseMediaDecodeTime
+ if (currentGop.dts < track.timelineStartInfo.dts) {
+ continue;
+ }
+
+ // The distance between the end of the gop and the start of the nalUnit
+ dtsDistance = (nalUnit.dts - currentGop.dts) - currentGop.duration;
+
+ // Only consider GOPS that start before the nal unit and end within
+ // a half-second of the nal unit
+ if (dtsDistance >= -allowableOverlap &&
+ dtsDistance <= halfSecond) {
+
+ // Always use the closest GOP we found if there is more than
+ // one candidate
+ if (!nearestGopObj ||
+ nearestDistance > dtsDistance) {
+ nearestGopObj = currentGopObj;
+ nearestDistance = dtsDistance;
+ }
+ }
+ }
+
+ if (nearestGopObj) {
+ return nearestGopObj.gop;
+ }
+ return null;
+ };
+
+ this.extendFirstKeyFrame_ = function(gops) {
+ var
+ h, i,
+ currentGop,
+ newGops;
+
+ if (!gops[0][0].keyFrame) {
+ // Remove the first GOP
+ currentGop = gops.shift();
+
+ gops.byteLength -= currentGop.byteLength;
+ gops.nalCount -= currentGop.nalCount;
+
+ // Extend the first frame of what is now the
+ // first gop to cover the time period of the
+ // frames we just removed
+ gops[0][0].dts = currentGop.dts;
+ gops[0][0].pts = currentGop.pts;
+ gops[0][0].duration += currentGop.duration;
+ }
+
+ return gops;
+ };
+
+ // Convert an array of nal units into an array of frames with each frame being
+ // composed of the nal units that make up that frame
+ // Also keep track of cummulative data about the frame from the nal units such
+ // as the frame duration, starting pts, etc.
+ this.groupNalsIntoFrames_ = function(nalUnits) {
+ var
+ i,
+ currentNal,
+ startPts,
+ startDts,
+ currentFrame = [],
+ frames = [];
+
+ currentFrame.byteLength = 0;
+
+ for (i = 0; i < nalUnits.length; i++) {
+ currentNal = nalUnits[i];
+
+ // Split on 'aud'-type nal units
+ if (currentNal.nalUnitType === 'access_unit_delimiter_rbsp') {
+ // Since the very first nal unit is expected to be an AUD
+ // only push to the frames array when currentFrame is not empty
+ if (currentFrame.length) {
+ currentFrame.duration = currentNal.dts - currentFrame.dts;
+ frames.push(currentFrame);
+ }
+ currentFrame = [currentNal];
+ currentFrame.byteLength = currentNal.data.byteLength;
+ currentFrame.pts = currentNal.pts;
+ currentFrame.dts = currentNal.dts;
+ } else {
+ // Specifically flag key frames for ease of use later
+ if (currentNal.nalUnitType === 'slice_layer_without_partitioning_rbsp_idr') {
+ currentFrame.keyFrame = true;
+ }
+ currentFrame.duration = currentNal.dts - currentFrame.dts;
+ currentFrame.byteLength += currentNal.data.byteLength;
+ currentFrame.push(currentNal);
+ }
+ }
+
+ // For the last frame, use the duration of the previous frame if we
+ // have nothing better to go on
+ if (frames.length &&
+ !currentFrame.duration ||
+ currentFrame.duration <= 0) {
+ currentFrame.duration = frames[frames.length - 1].duration;
+ }
+
+ // Push the final frame
+ frames.push(currentFrame);
+ return frames;
+ };
+
+ // Convert an array of frames into an array of Gop with each Gop being composed
+ // of the frames that make up that Gop
+ // Also keep track of cummulative data about the Gop from the frames such as the
+ // Gop duration, starting pts, etc.
+ this.groupFramesIntoGops_ = function(frames) {
+ var
+ i,
+ currentFrame,
+ currentGop = [],
+ gops = [];
+
+ // We must pre-set some of the values on the Gop since we
+ // keep running totals of these values
+ currentGop.byteLength = 0;
+ currentGop.nalCount = 0;
+ currentGop.duration = 0;
+ currentGop.pts = frames[0].pts;
+ currentGop.dts = frames[0].dts;
+
+ // store some metadata about all the Gops
+ gops.byteLength = 0;
+ gops.nalCount = 0;
+ gops.duration = 0;
+ gops.pts = frames[0].pts;
+ gops.dts = frames[0].dts;
+
+ for (i = 0; i < frames.length; i++) {
+ currentFrame = frames[i];
+
+ if (currentFrame.keyFrame) {
+ // Since the very first frame is expected to be an keyframe
+ // only push to the gops array when currentGop is not empty
+ if (currentGop.length) {
+ gops.push(currentGop);
+ gops.byteLength += currentGop.byteLength;
+ gops.nalCount += currentGop.nalCount;
+ gops.duration += currentGop.duration;
+ }
+
+ currentGop = [currentFrame];
+ currentGop.nalCount = currentFrame.length;
+ currentGop.byteLength = currentFrame.byteLength;
+ currentGop.pts = currentFrame.pts;
+ currentGop.dts = currentFrame.dts;
+ currentGop.duration = currentFrame.duration;
+ } else {
+ currentGop.duration += currentFrame.duration;
+ currentGop.nalCount += currentFrame.length;
+ currentGop.byteLength += currentFrame.byteLength;
+ currentGop.push(currentFrame);
+ }
+ }
+
+ if (gops.length && currentGop.duration <= 0) {
+ currentGop.duration = gops[gops.length - 1].duration;
+ }
+ gops.byteLength += currentGop.byteLength;
+ gops.nalCount += currentGop.nalCount;
+ gops.duration += currentGop.duration;
+
+ // push the final Gop
+ gops.push(currentGop);
+ return gops;
+ };
+
+ // generate the track's sample table from an array of gops
+ this.generateSampleTable_ = function(gops, baseDataOffset) {
+ var
+ h, i,
+ sample,
+ currentGop,
+ currentFrame,
+ currentSample,
+ dataOffset = baseDataOffset || 0,
+ samples = [];
+
+ for (h = 0; h < gops.length; h++) {
+ currentGop = gops[h];
+
+ for (i = 0; i < currentGop.length; i++) {
+ currentFrame = currentGop[i];
+
+ sample = Object.create(defaultSample);
+
+ sample.dataOffset = dataOffset;
+ sample.compositionTimeOffset = currentFrame.pts - currentFrame.dts;
+ sample.duration = currentFrame.duration;
+ sample.size = 4 * currentFrame.length; // Space for nal unit size
+ sample.size += currentFrame.byteLength;
+
+ if (currentFrame.keyFrame) {
+ sample.flags.dependsOn = 2;
+ }
+
+ dataOffset += sample.size;
+
+ samples.push(sample);
+ }
+ }
+ return samples;
+ };
+
+ // generate the track's raw mdat data from an array of gops
+ this.concatenateNalData_ = function (gops) {
+ var
+ h, i, j,
+ currentGop,
+ currentFrame,
+ currentNal,
+ dataOffset = 0,
+ nalsByteLength = gops.byteLength,
+ numberOfNals = gops.nalCount,
+ totalByteLength = nalsByteLength + 4 * numberOfNals,
+ data = new Uint8Array(totalByteLength),
+ view = new DataView(data.buffer);
+
+ // For each Gop..
+ for (h = 0; h < gops.length; h++) {
+ currentGop = gops[h];
+
+ // For each Frame..
+ for (i = 0; i < currentGop.length; i++) {
+ currentFrame = currentGop[i];
+
+ // For each NAL..
+ for (j = 0; j < currentFrame.length; j++) {
+ currentNal = currentFrame[j];
+
+ view.setUint32(dataOffset, currentNal.data.byteLength);
+ dataOffset += 4;
+ data.set(currentNal.data, dataOffset);
+ dataOffset += currentNal.data.byteLength;
+ }
+ }
+ }
+ return data;
+ };
+};
+
+VideoSegmentStream.prototype = new Stream();
+
+/**
+ * Store information about the start and end of the track and the
+ * duration for each frame/sample we process in order to calculate
+ * the baseMediaDecodeTime
+ */
+collectDtsInfo = function (track, data) {
+ if (typeof data.pts === 'number') {
+ if (track.timelineStartInfo.pts === undefined) {
+ track.timelineStartInfo.pts = data.pts;
+ }
+
+ if (track.minSegmentPts === undefined) {
+ track.minSegmentPts = data.pts;
+ } else {
+ track.minSegmentPts = Math.min(track.minSegmentPts, data.pts);
+ }
+
+ if (track.maxSegmentPts === undefined) {
+ track.maxSegmentPts = data.pts;
+ } else {
+ track.maxSegmentPts = Math.max(track.maxSegmentPts, data.pts);
+ }
+ }
+
+ if (typeof data.dts === 'number') {
+ if (track.timelineStartInfo.dts === undefined) {
+ track.timelineStartInfo.dts = data.dts;
+ }
+
+ if (track.minSegmentDts === undefined) {
+ track.minSegmentDts = data.dts;
+ } else {
+ track.minSegmentDts = Math.min(track.minSegmentDts, data.dts);
+ }
+
+ if (track.maxSegmentDts === undefined) {
+ track.maxSegmentDts = data.dts;
+ } else {
+ track.maxSegmentDts = Math.max(track.maxSegmentDts, data.dts);
+ }
+ }
+};
+
+/**
+ * Clear values used to calculate the baseMediaDecodeTime between
+ * tracks
+ */
+clearDtsInfo = function (track) {
+ delete track.minSegmentDts;
+ delete track.maxSegmentDts;
+ delete track.minSegmentPts;
+ delete track.maxSegmentPts;
+};
+
+/**
+ * Calculate the track's baseMediaDecodeTime based on the earliest
+ * DTS the transmuxer has ever seen and the minimum DTS for the
+ * current track
+ */
+calculateTrackBaseMediaDecodeTime = function (track) {
+ var
+ oneSecondInPTS = 90000, // 90kHz clock
+ scale,
+ // Calculate the distance, in time, that this segment starts from the start
+ // of the timeline (earliest time seen since the transmuxer initialized)
+ timeSinceStartOfTimeline = track.minSegmentDts - track.timelineStartInfo.dts,
+ // Calculate the first sample's effective compositionTimeOffset
+ firstSampleCompositionOffset = track.minSegmentPts - track.minSegmentDts;
+
+ // track.timelineStartInfo.baseMediaDecodeTime is the location, in time, where
+ // we want the start of the first segment to be placed
+ track.baseMediaDecodeTime = track.timelineStartInfo.baseMediaDecodeTime;
+
+ // Add to that the distance this segment is from the very first
+ track.baseMediaDecodeTime += timeSinceStartOfTimeline;
+
+ // Subtract this segment's "compositionTimeOffset" so that the first frame of
+ // this segment is displayed exactly at the `baseMediaDecodeTime` or at the
+ // end of the previous segment
+ track.baseMediaDecodeTime -= firstSampleCompositionOffset;
+
+ // baseMediaDecodeTime must not become negative
+ track.baseMediaDecodeTime = Math.max(0, track.baseMediaDecodeTime);
+
+ if (track.type === 'audio') {
+ // Audio has a different clock equal to the sampling_rate so we need to
+ // scale the PTS values into the clock rate of the track
+ scale = track.samplerate / oneSecondInPTS;
+ track.baseMediaDecodeTime *= scale;
+ track.baseMediaDecodeTime = Math.floor(track.baseMediaDecodeTime);
+ }
+};
+
+/**
+ * A Stream that can combine multiple streams (ie. audio & video)
+ * into a single output segment for MSE. Also supports audio-only
+ * and video-only streams.
+ */
+CoalesceStream = function(options) {
+ // Number of Tracks per output segment
+ // If greater than 1, we combine multiple
+ // tracks into a single segment
+ this.numberOfTracks = 0;
+ this.metadataStream = options.metadataStream;
+
+ if (typeof options.remux !== 'undefined') {
+ this.remuxTracks = !!options.remux;
+ } else {
+ this.remuxTracks = true;
+ }
+
+ this.pendingTracks = [];
+ this.videoTrack = null;
+ this.pendingBoxes = [];
+ this.pendingCaptions = [];
+ this.pendingMetadata = [];
+ this.pendingBytes = 0;
+ this.emittedTracks = 0;
+
+ CoalesceStream.prototype.init.call(this);
+
+ // Take output from multiple
+ this.push = function(output) {
+ // buffer incoming captions until the associated video segment
+ // finishes
+ if (output.text) {
+ return this.pendingCaptions.push(output);
+ }
+ // buffer incoming id3 tags until the final flush
+ if (output.frames) {
+ return this.pendingMetadata.push(output);
+ }
+
+ // Add this track to the list of pending tracks and store
+ // important information required for the construction of
+ // the final segment
+ this.pendingTracks.push(output.track);
+ this.pendingBoxes.push(output.boxes);
+ this.pendingBytes += output.boxes.byteLength;
+
+ if (output.track.type === 'video') {
+ this.videoTrack = output.track;
+ }
+ if (output.track.type === 'audio') {
+ this.audioTrack = output.track;
+ }
+ };
+};
+
+CoalesceStream.prototype = new Stream();
+CoalesceStream.prototype.flush = function() {
+ var
+ offset = 0,
+ event = {
+ captions: [],
+ metadata: []
+ },
+ caption,
+ id3,
+ initSegment,
+ timelineStartPts = 0,
+ i;
+
+ // Return until we have enough tracks from the pipeline to remux
+ if (this.pendingTracks.length === 0 ||
+ (this.remuxTracks && this.pendingTracks.length < this.numberOfTracks)) {
+ return;
+ }
+
+ if (this.videoTrack) {
+ timelineStartPts = this.videoTrack.timelineStartInfo.pts;
+ } else if (this.audioTrack) {
+ timelineStartPts = this.audioTrack.timelineStartInfo.pts;
+ }
+
+ if (this.pendingTracks.length === 1) {
+ event.type = this.pendingTracks[0].type;
+ } else {
+ event.type = 'combined';
+ }
+ this.emittedTracks += this.pendingTracks.length;
+
+ initSegment = mp4.initSegment(this.pendingTracks);
+
+ // Create a new typed array large enough to hold the init
+ // segment and all tracks
+ event.data = new Uint8Array(initSegment.byteLength +
+ this.pendingBytes);
+
+ // Create an init segment containing a moov
+ // and track definitions
+ event.data.set(initSegment);
+ offset += initSegment.byteLength;
+
+ // Append each moof+mdat (one per track) after the init segment
+ for (i = 0; i < this.pendingBoxes.length; i++) {
+ event.data.set(this.pendingBoxes[i], offset);
+ offset += this.pendingBoxes[i].byteLength;
+ }
+
+ // Translate caption PTS times into second offsets into the
+ // video timeline for the segment
+ for (i = 0; i < this.pendingCaptions.length; i++) {
+ caption = this.pendingCaptions[i];
+ caption.startTime = (caption.startPts - timelineStartPts);
+ caption.startTime /= 90e3;
+ caption.endTime = (caption.endPts - timelineStartPts);
+ caption.endTime /= 90e3;
+ event.captions.push(caption);
+ }
+
+ // Translate ID3 frame PTS times into second offsets into the
+ // video timeline for the segment
+ for (i = 0; i < this.pendingMetadata.length; i++) {
+ id3 = this.pendingMetadata[i];
+ id3.cueTime = (id3.pts - timelineStartPts);
+ id3.cueTime /= 90e3;
+ event.metadata.push(id3);
+ }
+ // We add this to every single emitted segment even though we only need
+ // it for the first
+ event.metadata.dispatchType = this.metadataStream.dispatchType;
+
+ // Reset stream state
+ this.pendingTracks.length = 0;
+ this.videoTrack = null;
+ this.pendingBoxes.length = 0;
+ this.pendingCaptions.length = 0;
+ this.pendingBytes = 0;
+ this.pendingMetadata.length = 0;
+
+ // Emit the built segment
+ this.trigger('data', event);
+
+ // Only emit `done` if all tracks have been flushed and emitted
+ if (this.emittedTracks >= this.numberOfTracks) {
+ this.trigger('done');
+ this.emittedTracks = 0;
+ }
+};
+/**
+ * A Stream that expects MP2T binary data as input and produces
+ * corresponding media segments, suitable for use with Media Source
+ * Extension (MSE) implementations that support the ISO BMFF byte
+ * stream format, like Chrome.
+ */
+Transmuxer = function(options) {
+ var
+ self = this,
+ videoTrack,
+ audioTrack,
+ packetStream, parseStream, elementaryStream,
+ adtsStream, h264Stream,aacStream,
+ videoSegmentStream, audioSegmentStream, captionStream,
+ coalesceStream,
+ headOfPipeline;
+
+ this.setupAacPipeline = function() {
+ this.metadataStream = new m2ts.MetadataStream();
+ options.metadataStream = this.metadataStream;
+
+ // set up the parsing pipeline
+ aacStream = new AacStream();
+ adtsStream = new AdtsStream();
+ coalesceStream = new CoalesceStream(options);
+ headOfPipeline = aacStream;
+
+ aacStream.pipe(adtsStream);
+ aacStream.pipe(this.metadataStream);
+ this.metadataStream.pipe(coalesceStream);
+
+ this.metadataStream.on('timestamp', function(frame) {
+ aacStream.setTimestamp(frame.timestamp);
+ });
+ this.addAacListener();
+ };
+
+
+ this.addAacListener = function() {
+ aacStream.on('data', function(data) {
+ var i;
+
+ if (data.type === 'timed-metadata') {
+ var track = {
+ timelineStartInfo: {
+ baseMediaDecodeTime: 0 },
+ codec: 'adts',
+ type: 'audio' };
+
+ if (track && !audioSegmentStream) {
+ // hook up the audio segment stream to the first track with aac data
+ coalesceStream.numberOfTracks++;
+ audioSegmentStream = new AudioSegmentStream(track);
+ // Set up the final part of the audio pipeline
+ adtsStream
+ .pipe(audioSegmentStream)
+ .pipe(coalesceStream);
+ }
+ }
+ });
+ };
+
+ this.setupTsPipeline = function() {
+ this.metadataStream = new m2ts.MetadataStream();
+
+ options.metadataStream = this.metadataStream;
+
+ // set up the parsing pipeline
+ packetStream = new m2ts.TransportPacketStream();
+ parseStream = new m2ts.TransportParseStream();
+ elementaryStream = new m2ts.ElementaryStream();
+ adtsStream = new AdtsStream();
+ h264Stream = new H264Stream();
+ captionStream = new m2ts.CaptionStream();
+ coalesceStream = new CoalesceStream(options);
+ headOfPipeline = packetStream;
+
+ // disassemble MPEG2-TS packets into elementary streams
+ packetStream
+ .pipe(parseStream)
+ .pipe(elementaryStream);
+
+ // !!THIS ORDER IS IMPORTANT!!
+ // demux the streams
+ elementaryStream
+ .pipe(h264Stream);
+ elementaryStream
+ .pipe(adtsStream);
+
+ elementaryStream
+ .pipe(this.metadataStream)
+ .pipe(coalesceStream);
+
+ // Hook up CEA-608/708 caption stream
+ h264Stream.pipe(captionStream)
+ .pipe(coalesceStream);
+ this.addTsListener();
+ };
+
+ this.addTsListener = function() {
+
+ elementaryStream.on('data', function(data) {
+ var i;
+
+ if (data.type === 'metadata') {
+ i = data.tracks.length;
+
+ // scan the tracks listed in the metadata
+ while (i--) {
+ if (!videoTrack && data.tracks[i].type === 'video') {
+ videoTrack = data.tracks[i];
+ videoTrack.timelineStartInfo.baseMediaDecodeTime = self.baseMediaDecodeTime;
+ } else if (!audioTrack && data.tracks[i].type === 'audio') {
+ audioTrack = data.tracks[i];
+ audioTrack.timelineStartInfo.baseMediaDecodeTime = self.baseMediaDecodeTime;
+ }
+ }
+
+ // hook up the video segment stream to the first track with h264 data
+ if (videoTrack && !videoSegmentStream) {
+ coalesceStream.numberOfTracks++;
+ videoSegmentStream = new VideoSegmentStream(videoTrack);
+
+ videoSegmentStream.on('timelineStartInfo', function(timelineStartInfo){
+ // When video emits timelineStartInfo data after a flush, we forward that
+ // info to the AudioSegmentStream, if it exists, because video timeline
+ // data takes precedence.
+ if (audioTrack) {
+ audioTrack.timelineStartInfo = timelineStartInfo;
+ // On the first segment we trim AAC frames that exist before the
+ // very earliest DTS we have seen in video because Chrome will
+ // interpret any video track with a baseMediaDecodeTime that is
+ // non-zero as a gap.
+ audioSegmentStream.setEarliestDts(timelineStartInfo.dts);
+ }
+ });
+
+ // Set up the final part of the video pipeline
+ h264Stream
+ .pipe(videoSegmentStream)
+ .pipe(coalesceStream);
+ }
+
+ if (audioTrack && !audioSegmentStream) {
+ // hook up the audio segment stream to the first track with aac data
+ coalesceStream.numberOfTracks++;
+ audioSegmentStream = new AudioSegmentStream(audioTrack);
+
+ // Set up the final part of the audio pipeline
+ adtsStream
+ .pipe(audioSegmentStream)
+ .pipe(coalesceStream);
+ }
+ }
+ });
+ };
+ Transmuxer.prototype.init.call(this);
+ options = options || {};
+
+ this.baseMediaDecodeTime = options.baseMediaDecodeTime || 0;
+
+ // expose the metadata stream
+ if (options.aacfile === undefined) {
+ this.setupTsPipeline();
+ } else {
+ this.setupAacPipeline();
+ }
+
+ // hook up the segment streams once track metadata is delivered
+ this.setBaseMediaDecodeTime = function (baseMediaDecodeTime) {
+ this.baseMediaDecodeTime = baseMediaDecodeTime;
+ if (audioTrack) {
+ audioTrack.timelineStartInfo.dts = undefined;
+ audioTrack.timelineStartInfo.pts = undefined;
+ clearDtsInfo(audioTrack);
+ audioTrack.timelineStartInfo.baseMediaDecodeTime = baseMediaDecodeTime;
+ }
+ if (videoTrack) {
+ videoSegmentStream.gopCache_ = [];
+ videoTrack.timelineStartInfo.dts = undefined;
+ videoTrack.timelineStartInfo.pts = undefined;
+ clearDtsInfo(videoTrack);
+ videoTrack.timelineStartInfo.baseMediaDecodeTime = baseMediaDecodeTime;
+ }
+ };
+
+ // feed incoming data to the front of the parsing pipeline
+ this.push = function(data) {
+ headOfPipeline.push(data);
+ };
+
+ // flush any buffered data
+ this.flush = function() {
+ // Start at the top of the pipeline and flush all pending work
+ headOfPipeline.flush();
+ };
+
+ // Re-emit any data coming from the coalesce stream to the outside world
+ coalesceStream.on('data', function (data) {
+ self.trigger('data', data);
+ });
+ // Let the consumer know we have finished flushing the entire pipeline
+ coalesceStream.on('done', function () {
+ self.trigger('done');
+ });
+};
+Transmuxer.prototype = new Stream();
+
+module.exports = {
+ Transmuxer: Transmuxer,
+ VideoSegmentStream: VideoSegmentStream,
+ AudioSegmentStream: AudioSegmentStream,
+};
+
+},{"../aac":30,"../codecs/adts.js":31,"../codecs/h264":32,"../m2ts/m2ts.js":40,"../utils/stream.js":49,"./mp4-generator.js":44}],46:[function(require,module,exports){
+'use strict';
+
+var
+ tagTypes = {
+ 0x08: 'audio',
+ 0x09: 'video',
+ 0x12: 'metadata'
+ },
+ hex = function (val) {
+ return '0x' + ('00' + val.toString(16)).slice(-2).toUpperCase();
+ },
+ hexStringList = function (data) {
+ var arr = [], i;
+ /* jshint -W086 */
+ while(data.byteLength > 0) {
+ i = 0;
+ switch(data.byteLength) {
+ default:
+ arr.push(hex(data[i++]));
+ case 7:
+ arr.push(hex(data[i++]));
+ case 6:
+ arr.push(hex(data[i++]));
+ case 5:
+ arr.push(hex(data[i++]));
+ case 4:
+ arr.push(hex(data[i++]));
+ case 3:
+ arr.push(hex(data[i++]));
+ case 2:
+ arr.push(hex(data[i++]));
+ case 1:
+ arr.push(hex(data[i++]));
+ }
+ data = data.subarray(i);
+ }
+ /* jshint +W086 */
+ return arr.join(' ');
+ },
+ parseAVCTag = function (tag, obj) {
+ var
+ avcPacketTypes = [
+ 'AVC Sequence Header',
+ 'AVC NALU',
+ 'AVC End-of-Sequence'
+ ],
+ nalUnitTypes = [
+ 'unspecified',
+ 'slice_layer_without_partitioning',
+ 'slice_data_partition_a_layer',
+ 'slice_data_partition_b_layer',
+ 'slice_data_partition_c_layer',
+ 'slice_layer_without_partitioning_idr',
+ 'sei',
+ 'seq_parameter_set',
+ 'pic_parameter_set',
+ 'access_unit_delimiter',
+ 'end_of_seq',
+ 'end_of_stream',
+ 'filler',
+ 'seq_parameter_set_ext',
+ 'prefix_nal_unit',
+ 'subset_seq_parameter_set',
+ 'reserved',
+ 'reserved',
+ 'reserved'
+ ],
+ compositionTime = (tag[1] & parseInt('01111111', 2) << 16) | (tag[2] << 8) | tag[3];
+
+ obj = obj || {};
+
+ obj.avcPacketType = avcPacketTypes[tag[0]];
+ obj.CompositionTime = (tag[1] & parseInt('10000000', 2)) ? -compositionTime : compositionTime;
+
+ if (tag[0] === 1) {
+ obj.nalUnitTypeRaw = hexStringList(tag.subarray(4, 100));
+ } else {
+ obj.data = hexStringList(tag.subarray(4));
+ }
+
+ return obj;
+ },
+ parseVideoTag = function (tag, obj) {
+ var
+ frameTypes = [
+ 'Unknown',
+ 'Keyframe (for AVC, a seekable frame)',
+ 'Inter frame (for AVC, a nonseekable frame)',
+ 'Disposable inter frame (H.263 only)',
+ 'Generated keyframe (reserved for server use only)',
+ 'Video info/command frame'
+ ],
+ codecIDs = [
+ 'JPEG (currently unused)',
+ 'Sorenson H.263',
+ 'Screen video',
+ 'On2 VP6',
+ 'On2 VP6 with alpha channel',
+ 'Screen video version 2',
+ 'AVC'
+ ],
+ codecID = tag[0] & parseInt('00001111', 2);
+
+ obj = obj || {};
+
+ obj.frameType = frameTypes[(tag[0] & parseInt('11110000', 2)) >>> 4];
+ obj.codecID = codecID;
+
+ if (codecID === 7) {
+ return parseAVCTag(tag.subarray(1), obj);
+ }
+ return obj;
+ },
+ parseAACTag = function (tag, obj) {
+ var packetTypes = [
+ 'AAC Sequence Header',
+ 'AAC Raw'
+ ];
+
+ obj = obj || {};
+
+ obj.aacPacketType = packetTypes[tag[0]];
+ obj.data = hexStringList(tag.subarray(1));
+
+ return obj;
+ },
+ parseAudioTag = function (tag, obj) {
+ var
+ formatTable = [
+ 'Linear PCM, platform endian',
+ 'ADPCM',
+ 'MP3',
+ 'Linear PCM, little endian',
+ 'Nellymoser 16-kHz mono',
+ 'Nellymoser 8-kHz mono',
+ 'Nellymoser',
+ 'G.711 A-law logarithmic PCM',
+ 'G.711 mu-law logarithmic PCM',
+ 'reserved',
+ 'AAC',
+ 'Speex',
+ 'MP3 8-Khz',
+ 'Device-specific sound'
+ ],
+ samplingRateTable = [
+ '5.5-kHz',
+ '11-kHz',
+ '22-kHz',
+ '44-kHz'
+ ],
+ soundFormat = (tag[0] & parseInt('11110000', 2)) >>> 4;
+
+ obj = obj || {};
+
+ obj.soundFormat = formatTable[soundFormat];
+ obj.soundRate = samplingRateTable[(tag[0] & parseInt('00001100', 2)) >>> 2];
+ obj.soundSize = ((tag[0] & parseInt('00000010', 2)) >>> 1) ? '16-bit' : '8-bit';
+ obj.soundType = (tag[0] & parseInt('00000001', 2)) ? 'Stereo' : 'Mono';
+
+ if (soundFormat === 10) {
+ return parseAACTag(tag.subarray(1), obj);
+ }
+ return obj;
+ },
+ parseGenericTag = function (tag) {
+ return {
+ tagType: tagTypes[tag[0]],
+ dataSize: (tag[1] << 16) | (tag[2] << 8) | tag[3],
+ timestamp: (tag[7] << 24) | (tag[4] << 16) | (tag[5] << 8) | tag[6],
+ streamID: (tag[8] << 16) | (tag[9] << 8) | tag[10]
+ };
+ },
+ inspectFlvTag = function (tag) {
+ var header = parseGenericTag(tag);
+ switch (tag[0]) {
+ case 0x08:
+ parseAudioTag(tag.subarray(11), header);
+ break;
+ case 0x09:
+ parseVideoTag(tag.subarray(11), header);
+ break;
+ case 0x12:
+ }
+ return header;
+ },
+ inspectFlv = function (bytes) {
+ var i = 9, // header
+ dataSize,
+ parsedResults = [],
+ tag;
+
+ // traverse the tags
+ i += 4; // skip previous tag size
+ while (i < bytes.byteLength) {
+ dataSize = bytes[i + 1] << 16;
+ dataSize |= bytes[i + 2] << 8;
+ dataSize |= bytes[i + 3];
+ dataSize += 11;
+
+ tag = bytes.subarray(i, i + dataSize);
+ parsedResults.push(inspectFlvTag(tag));
+ i += dataSize + 4;
+ }
+ return parsedResults;
+ },
+ textifyFlv = function (flvTagArray) {
+ return JSON.stringify(flvTagArray, null, 2);
+ };
+
+module.exports = {
+ inspectTag: inspectFlvTag,
+ inspect: inspectFlv,
+ textify: textifyFlv
+};
+
+},{}],47:[function(require,module,exports){
+(function (global){
+'use strict';
+
+var
+ inspectMp4,
+ textifyMp4,
+ /**
+ * Returns the string representation of an ASCII encoded four byte buffer.
+ * @param buffer {Uint8Array} a four-byte buffer to translate
+ * @return {string} the corresponding string
+ */
+ parseType = function(buffer) {
+ var result = '';
+ result += String.fromCharCode(buffer[0]);
+ result += String.fromCharCode(buffer[1]);
+ result += String.fromCharCode(buffer[2]);
+ result += String.fromCharCode(buffer[3]);
+ return result;
+ },
+ parseMp4Date = function(seconds) {
+ return new Date(seconds * 1000 - 2082844800000);
+ },
+ parseSampleFlags = function(flags) {
+ return {
+ isLeading: (flags[0] & 0x0c) >>> 2,
+ dependsOn: flags[0] & 0x03,
+ isDependedOn: (flags[1] & 0xc0) >>> 6,
+ hasRedundancy: (flags[1] & 0x30) >>> 4,
+ paddingValue: (flags[1] & 0x0e) >>> 1,
+ isNonSyncSample: flags[1] & 0x01,
+ degradationPriority: (flags[2] << 8) | flags[3]
+ };
+ },
+ nalParse = function(avcStream) {
+ var
+ avcView = new DataView(avcStream.buffer, avcStream.byteOffset, avcStream.byteLength),
+ result = [],
+ i,
+ length;
+ for (i = 0; i + 4 < avcStream.length; i += length) {
+ length = avcView.getUint32(i);
+ i += 4;
+
+ // bail if this doesn't appear to be an H264 stream
+ if (length <= 0) {
+ return;
+ }
+
+ switch(avcStream[i] & 0x1F) {
+ case 0x01:
+ result.push('slice_layer_without_partitioning_rbsp');
+ break;
+ case 0x05:
+ result.push('slice_layer_without_partitioning_rbsp_idr');
+ break;
+ case 0x06:
+ result.push('sei_rbsp');
+ break;
+ case 0x07:
+ result.push('seq_parameter_set_rbsp');
+ break;
+ case 0x08:
+ result.push('pic_parameter_set_rbsp');
+ break;
+ case 0x09:
+ result.push('access_unit_delimiter_rbsp');
+ break;
+ default:
+ result.push(avcStream[i] & 0x1F);
+ break;
+ }
+ }
+ return result;
+ },
+
+ // registry of handlers for individual mp4 box types
+ parse = {
+ // codingname, not a first-class box type. stsd entries share the
+ // same format as real boxes so the parsing infrastructure can be
+ // shared
+ avc1: function(data) {
+ var view = new DataView(data.buffer, data.byteOffset, data.byteLength);
+ return {
+ dataReferenceIndex: view.getUint16(6),
+ width: view.getUint16(24),
+ height: view.getUint16(26),
+ horizresolution: view.getUint16(28) + (view.getUint16(30) / 16),
+ vertresolution: view.getUint16(32) + (view.getUint16(34) / 16),
+ frameCount: view.getUint16(40),
+ depth: view.getUint16(74),
+ config: inspectMp4(data.subarray(78, data.byteLength))
+ };
+ },
+ avcC: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ result = {
+ configurationVersion: data[0],
+ avcProfileIndication: data[1],
+ profileCompatibility: data[2],
+ avcLevelIndication: data[3],
+ lengthSizeMinusOne: data[4] & 0x03,
+ sps: [],
+ pps: []
+ },
+ numOfSequenceParameterSets = data[5] & 0x1f,
+ numOfPictureParameterSets,
+ nalSize,
+ offset,
+ i;
+
+ // iterate past any SPSs
+ offset = 6;
+ for (i = 0; i < numOfSequenceParameterSets; i++) {
+ nalSize = view.getUint16(offset);
+ offset += 2;
+ result.sps.push(new Uint8Array(data.subarray(offset, offset + nalSize)));
+ offset += nalSize;
+ }
+ // iterate past any PPSs
+ numOfPictureParameterSets = data[offset];
+ offset++;
+ for (i = 0; i < numOfPictureParameterSets; i++) {
+ nalSize = view.getUint16(offset);
+ offset += 2;
+ result.pps.push(new Uint8Array(data.subarray(offset, offset + nalSize)));
+ offset += nalSize;
+ }
+ return result;
+ },
+ btrt: function(data) {
+ var view = new DataView(data.buffer, data.byteOffset, data.byteLength);
+ return {
+ bufferSizeDB: view.getUint32(0),
+ maxBitrate: view.getUint32(4),
+ avgBitrate: view.getUint32(8)
+ };
+ },
+ esds: function(data) {
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ esId: (data[6] << 8) | data[7],
+ streamPriority: data[8] & 0x1f,
+ decoderConfig: {
+ objectProfileIndication: data[11],
+ streamType: (data[12] >>> 2) & 0x3f,
+ bufferSize: (data[13] << 16) | (data[14] << 8) | data[15],
+ maxBitrate: (data[16] << 24) |
+ (data[17] << 16) |
+ (data[18] << 8) |
+ data[19],
+ avgBitrate: (data[20] << 24) |
+ (data[21] << 16) |
+ (data[22] << 8) |
+ data[23],
+ decoderConfigDescriptor: {
+ tag: data[24],
+ length: data[25],
+ audioObjectType: (data[26] >>> 3) & 0x1f,
+ samplingFrequencyIndex: ((data[26] & 0x07) << 1) |
+ ((data[27] >>> 7) & 0x01),
+ channelConfiguration: (data[27] >>> 3) & 0x0f
+ }
+ }
+ };
+ },
+ ftyp: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ result = {
+ majorBrand: parseType(data.subarray(0, 4)),
+ minorVersion: view.getUint32(4),
+ compatibleBrands: []
+ },
+ i = 8;
+ while (i < data.byteLength) {
+ result.compatibleBrands.push(parseType(data.subarray(i, i + 4)));
+ i += 4;
+ }
+ return result;
+ },
+ dinf: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ dref: function(data) {
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ dataReferences: inspectMp4(data.subarray(8))
+ };
+ },
+ hdlr: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ language,
+ result = {
+ version: view.getUint8(0),
+ flags: new Uint8Array(data.subarray(1, 4)),
+ handlerType: parseType(data.subarray(8, 12)),
+ name: ''
+ },
+ i = 8;
+
+ // parse out the name field
+ for (i = 24; i < data.byteLength; i++) {
+ if (data[i] === 0x00) {
+ // the name field is null-terminated
+ i++;
+ break;
+ }
+ result.name += String.fromCharCode(data[i]);
+ }
+ // decode UTF-8 to javascript's internal representation
+ // see http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html
+ result.name = decodeURIComponent(global.escape(result.name));
+
+ return result;
+ },
+ mdat: function(data) {
+ return {
+ byteLength: data.byteLength,
+ nals: nalParse(data)
+ };
+ },
+ mdhd: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ i = 4,
+ language,
+ result = {
+ version: view.getUint8(0),
+ flags: new Uint8Array(data.subarray(1, 4)),
+ language: ''
+ };
+ if (result.version === 1) {
+ i += 4;
+ result.creationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes
+ i += 8;
+ result.modificationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes
+ i += 4;
+ result.timescale = view.getUint32(i);
+ i += 8;
+ result.duration = view.getUint32(i); // truncating top 4 bytes
+ } else {
+ result.creationTime = parseMp4Date(view.getUint32(i));
+ i += 4;
+ result.modificationTime = parseMp4Date(view.getUint32(i));
+ i += 4;
+ result.timescale = view.getUint32(i);
+ i += 4;
+ result.duration = view.getUint32(i);
+ }
+ i += 4;
+ // language is stored as an ISO-639-2/T code in an array of three 5-bit fields
+ // each field is the packed difference between its ASCII value and 0x60
+ language = view.getUint16(i);
+ result.language += String.fromCharCode((language >> 10) + 0x60);
+ result.language += String.fromCharCode(((language & 0x03c0) >> 5) + 0x60);
+ result.language += String.fromCharCode((language & 0x1f) + 0x60);
+
+ return result;
+ },
+ mdia: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ mfhd: function(data) {
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ sequenceNumber: (data[4] << 24) |
+ (data[5] << 16) |
+ (data[6] << 8) |
+ (data[7])
+ };
+ },
+ minf: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ // codingname, not a first-class box type. stsd entries share the
+ // same format as real boxes so the parsing infrastructure can be
+ // shared
+ mp4a: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ result = {
+ // 6 bytes reserved
+ dataReferenceIndex: view.getUint16(6),
+ // 4 + 4 bytes reserved
+ channelcount: view.getUint16(16),
+ samplesize: view.getUint16(18),
+ // 2 bytes pre_defined
+ // 2 bytes reserved
+ samplerate: view.getUint16(24) + (view.getUint16(26) / 65536)
+ };
+
+ // if there are more bytes to process, assume this is an ISO/IEC
+ // 14496-14 MP4AudioSampleEntry and parse the ESDBox
+ if (data.byteLength > 28) {
+ result.streamDescriptor = inspectMp4(data.subarray(28))[0];
+ }
+ return result;
+ },
+ moof: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ moov: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ mvex: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ mvhd: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ i = 4,
+ result = {
+ version: view.getUint8(0),
+ flags: new Uint8Array(data.subarray(1, 4))
+ };
+
+ if (result.version === 1) {
+ i += 4;
+ result.creationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes
+ i += 8;
+ result.modificationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes
+ i += 4;
+ result.timescale = view.getUint32(i);
+ i += 8;
+ result.duration = view.getUint32(i); // truncating top 4 bytes
+ } else {
+ result.creationTime = parseMp4Date(view.getUint32(i));
+ i += 4;
+ result.modificationTime = parseMp4Date(view.getUint32(i));
+ i += 4;
+ result.timescale = view.getUint32(i);
+ i += 4;
+ result.duration = view.getUint32(i);
+ }
+ i += 4;
+
+ // convert fixed-point, base 16 back to a number
+ result.rate = view.getUint16(i) + (view.getUint16(i + 2) / 16);
+ i += 4;
+ result.volume = view.getUint8(i) + (view.getUint8(i + 1) / 8);
+ i += 2;
+ i += 2;
+ i += 2 * 4;
+ result.matrix = new Uint32Array(data.subarray(i, i + (9 * 4)));
+ i += 9 * 4;
+ i += 6 * 4;
+ result.nextTrackId = view.getUint32(i);
+ return result;
+ },
+ pdin: function(data) {
+ var view = new DataView(data.buffer, data.byteOffset, data.byteLength);
+ return {
+ version: view.getUint8(0),
+ flags: new Uint8Array(data.subarray(1, 4)),
+ rate: view.getUint32(4),
+ initialDelay: view.getUint32(8)
+ };
+ },
+ sdtp: function(data) {
+ var
+ result = {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ samples: []
+ }, i;
+
+ for (i = 4; i < data.byteLength; i++) {
+ result.samples.push({
+ dependsOn: (data[i] & 0x30) >> 4,
+ isDependedOn: (data[i] & 0x0c) >> 2,
+ hasRedundancy: data[i] & 0x03
+ });
+ }
+ return result;
+ },
+ sidx: function(data) {
+ var view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ result = {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ references: [],
+ referenceId: view.getUint32(4),
+ timescale: view.getUint32(8),
+ earliestPresentationTime: view.getUint32(12),
+ firstOffset: view.getUint32(16)
+ },
+ referenceCount = view.getUint16(22),
+ i;
+
+ for (i = 24; referenceCount; i += 12, referenceCount-- ) {
+ result.references.push({
+ referenceType: (data[i] & 0x80) >>> 7,
+ referencedSize: view.getUint32(i) & 0x7FFFFFFF,
+ subsegmentDuration: view.getUint32(i + 4),
+ startsWithSap: !!(data[i + 8] & 0x80),
+ sapType: (data[i + 8] & 0x70) >>> 4,
+ sapDeltaTime: view.getUint32(i + 8) & 0x0FFFFFFF
+ });
+ }
+
+ return result;
+ },
+ smhd: function(data) {
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ balance: data[4] + (data[5] / 256)
+ };
+ },
+ stbl: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ stco: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ result = {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ chunkOffsets: []
+ },
+ entryCount = view.getUint32(4),
+ i;
+ for (i = 8; entryCount; i += 4, entryCount--) {
+ result.chunkOffsets.push(view.getUint32(i));
+ }
+ return result;
+ },
+ stsc: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ entryCount = view.getUint32(4),
+ result = {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ sampleToChunks: []
+ },
+ i;
+ for (i = 8; entryCount; i += 12, entryCount--) {
+ result.sampleToChunks.push({
+ firstChunk: view.getUint32(i),
+ samplesPerChunk: view.getUint32(i + 4),
+ sampleDescriptionIndex: view.getUint32(i + 8)
+ });
+ }
+ return result;
+ },
+ stsd: function(data) {
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ sampleDescriptions: inspectMp4(data.subarray(8))
+ };
+ },
+ stsz: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ result = {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ sampleSize: view.getUint32(4),
+ entries: []
+ },
+ i;
+ for (i = 12; i < data.byteLength; i += 4) {
+ result.entries.push(view.getUint32(i));
+ }
+ return result;
+ },
+ stts: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ result = {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ timeToSamples: []
+ },
+ entryCount = view.getUint32(4),
+ i;
+
+ for (i = 8; entryCount; i += 8, entryCount--) {
+ result.timeToSamples.push({
+ sampleCount: view.getUint32(i),
+ sampleDelta: view.getUint32(i + 4)
+ });
+ }
+ return result;
+ },
+ styp: function(data) {
+ return parse.ftyp(data);
+ },
+ tfdt: function(data) {
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ baseMediaDecodeTime: data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]
+ };
+ },
+ tfhd: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ result = {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ trackId: view.getUint32(4)
+ },
+ baseDataOffsetPresent = result.flags[2] & 0x01,
+ sampleDescriptionIndexPresent = result.flags[2] & 0x02,
+ defaultSampleDurationPresent = result.flags[2] & 0x08,
+ defaultSampleSizePresent = result.flags[2] & 0x10,
+ defaultSampleFlagsPresent = result.flags[2] & 0x20,
+ i;
+
+ i = 8;
+ if (baseDataOffsetPresent) {
+ i += 4; // truncate top 4 bytes
+ result.baseDataOffset = view.getUint32(12);
+ i += 4;
+ }
+ if (sampleDescriptionIndexPresent) {
+ result.sampleDescriptionIndex = view.getUint32(i);
+ i += 4;
+ }
+ if (defaultSampleDurationPresent) {
+ result.defaultSampleDuration = view.getUint32(i);
+ i += 4;
+ }
+ if (defaultSampleSizePresent) {
+ result.defaultSampleSize = view.getUint32(i);
+ i += 4;
+ }
+ if (defaultSampleFlagsPresent) {
+ result.defaultSampleFlags = view.getUint32(i);
+ }
+ return result;
+ },
+ tkhd: function(data) {
+ var
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ i = 4,
+ result = {
+ version: view.getUint8(0),
+ flags: new Uint8Array(data.subarray(1, 4)),
+ };
+ if (result.version === 1) {
+ i += 4;
+ result.creationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes
+ i += 8;
+ result.modificationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes
+ i += 4;
+ result.trackId = view.getUint32(i);
+ i += 4;
+ i += 8;
+ result.duration = view.getUint32(i); // truncating top 4 bytes
+ } else {
+ result.creationTime = parseMp4Date(view.getUint32(i));
+ i += 4;
+ result.modificationTime = parseMp4Date(view.getUint32(i));
+ i += 4;
+ result.trackId = view.getUint32(i);
+ i += 4;
+ i += 4;
+ result.duration = view.getUint32(i);
+ }
+ i += 4;
+ i += 2 * 4;
+ result.layer = view.getUint16(i);
+ i += 2;
+ result.alternateGroup = view.getUint16(i);
+ i += 2;
+ // convert fixed-point, base 16 back to a number
+ result.volume = view.getUint8(i) + (view.getUint8(i + 1) / 8);
+ i += 2;
+ i += 2;
+ result.matrix = new Uint32Array(data.subarray(i, i + (9 * 4)));
+ i += 9 * 4;
+ result.width = view.getUint16(i) + (view.getUint16(i + 2) / 16);
+ i += 4;
+ result.height = view.getUint16(i) + (view.getUint16(i + 2) / 16);
+ return result;
+ },
+ traf: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ trak: function(data) {
+ return {
+ boxes: inspectMp4(data)
+ };
+ },
+ trex: function(data) {
+ var view = new DataView(data.buffer, data.byteOffset, data.byteLength);
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ trackId: view.getUint32(4),
+ defaultSampleDescriptionIndex: view.getUint32(8),
+ defaultSampleDuration: view.getUint32(12),
+ defaultSampleSize: view.getUint32(16),
+ sampleDependsOn: data[20] & 0x03,
+ sampleIsDependedOn: (data[21] & 0xc0) >> 6,
+ sampleHasRedundancy: (data[21] & 0x30) >> 4,
+ samplePaddingValue: (data[21] & 0x0e) >> 1,
+ sampleIsDifferenceSample: !!(data[21] & 0x01),
+ sampleDegradationPriority: view.getUint16(22)
+ };
+ },
+ trun: function(data) {
+ var
+ result = {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ samples: []
+ },
+ view = new DataView(data.buffer, data.byteOffset, data.byteLength),
+ dataOffsetPresent = result.flags[2] & 0x01,
+ firstSampleFlagsPresent = result.flags[2] & 0x04,
+ sampleDurationPresent = result.flags[1] & 0x01,
+ sampleSizePresent = result.flags[1] & 0x02,
+ sampleFlagsPresent = result.flags[1] & 0x04,
+ sampleCompositionTimeOffsetPresent = result.flags[1] & 0x08,
+ sampleCount = view.getUint32(4),
+ offset = 8,
+ sample;
+
+ if (dataOffsetPresent) {
+ result.dataOffset = view.getUint32(offset);
+ offset += 4;
+ }
+
+ if (firstSampleFlagsPresent && sampleCount) {
+ sample = {
+ flags: parseSampleFlags(data.subarray(offset, offset + 4))
+ };
+ offset += 4;
+ if (sampleDurationPresent) {
+ sample.duration = view.getUint32(offset);
+ offset += 4;
+ }
+ if (sampleSizePresent) {
+ sample.size = view.getUint32(offset);
+ offset += 4;
+ }
+ if (sampleCompositionTimeOffsetPresent) {
+ sample.compositionTimeOffset = view.getUint32(offset);
+ offset += 4;
+ }
+ result.samples.push(sample);
+ sampleCount--;
+ }
+
+ while (sampleCount--) {
+ sample = {};
+ if (sampleDurationPresent) {
+ sample.duration = view.getUint32(offset);
+ offset += 4;
+ }
+ if (sampleSizePresent) {
+ sample.size = view.getUint32(offset);
+ offset += 4;
+ }
+ if (sampleFlagsPresent) {
+ sample.flags = parseSampleFlags(data.subarray(offset, offset + 4));
+ offset += 4;
+ }
+ if (sampleCompositionTimeOffsetPresent) {
+ sample.compositionTimeOffset = view.getUint32(offset);
+ offset += 4;
+ }
+ result.samples.push(sample);
+ }
+ return result;
+ },
+ 'url ': function(data) {
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4))
+ };
+ },
+ vmhd: function(data) {
+ var view = new DataView(data.buffer, data.byteOffset, data.byteLength);
+ return {
+ version: data[0],
+ flags: new Uint8Array(data.subarray(1, 4)),
+ graphicsmode: view.getUint16(4),
+ opcolor: new Uint16Array([view.getUint16(6),
+ view.getUint16(8),
+ view.getUint16(10)])
+ };
+ }
+ };
+
+
+/**
+ * Return a javascript array of box objects parsed from an ISO base
+ * media file.
+ * @param data {Uint8Array} the binary data of the media to be inspected
+ * @return {array} a javascript array of potentially nested box objects
+ */
+inspectMp4 = function(data) {
+ var
+ i = 0,
+ result = [],
+ view,
+ size,
+ type,
+ end,
+ box;
+
+ // Convert data from Uint8Array to ArrayBuffer, to follow Dataview API
+ var ab = new ArrayBuffer(data.length);
+ var v = new Uint8Array(ab);
+ for (var z = 0; z < data.length; ++z) {
+ v[z] = data[z];
+ }
+ view = new DataView(ab);
+
+
+ while (i < data.byteLength) {
+ // parse box data
+ size = view.getUint32(i);
+ type = parseType(data.subarray(i + 4, i + 8));
+ end = size > 1 ? i + size : data.byteLength;
+
+ // parse type-specific data
+ box = (parse[type] || function(data) {
+ return {
+ data: data
+ };
+ })(data.subarray(i + 8, end));
+ box.size = size;
+ box.type = type;
+
+ // store this box and move to the next
+ result.push(box);
+ i = end;
+ }
+ return result;
+};
+
+/**
+ * Returns a textual representation of the javascript represtentation
+ * of an MP4 file. You can use it as an alternative to
+ * JSON.stringify() to compare inspected MP4s.
+ * @param inspectedMp4 {array} the parsed array of boxes in an MP4
+ * file
+ * @param depth {number} (optional) the number of ancestor boxes of
+ * the elements of inspectedMp4. Assumed to be zero if unspecified.
+ * @return {string} a text representation of the parsed MP4
+ */
+textifyMp4 = function(inspectedMp4, depth) {
+ var indent;
+ depth = depth || 0;
+ indent = new Array(depth * 2 + 1).join(' ');
+
+ // iterate over all the boxes
+ return inspectedMp4.map(function(box, index) {
+
+ // list the box type first at the current indentation level
+ return indent + box.type + '\n' +
+
+ // the type is already included and handle child boxes separately
+ Object.keys(box).filter(function(key) {
+ return key !== 'type' && key !== 'boxes';
+
+ // output all the box properties
+ }).map(function(key) {
+ var prefix = indent + ' ' + key + ': ',
+ value = box[key];
+
+ // print out raw bytes as hexademical
+ if (value instanceof Uint8Array || value instanceof Uint32Array) {
+ var bytes = Array.prototype.slice.call(new Uint8Array(value.buffer, value.byteOffset, value.byteLength))
+ .map(function(byte) {
+ return ' ' + ('00' + byte.toString(16)).slice(-2);
+ }).join('').match(/.{1,24}/g);
+ if (!bytes) {
+ return prefix + '<>';
+ }
+ if (bytes.length === 1) {
+ return prefix + '<' + bytes.join('').slice(1) + '>';
+ }
+ return prefix + '<\n' + bytes.map(function(line) {
+ return indent + ' ' + line;
+ }).join('\n') + '\n' + indent + ' >';
+ }
+
+ // stringify generic objects
+ return prefix +
+ JSON.stringify(value, null, 2)
+ .split('\n').map(function(line, index) {
+ if (index === 0) {
+ return line;
+ }
+ return indent + ' ' + line;
+ }).join('\n');
+ }).join('\n') +
+
+ // recursively textify the child boxes
+ (box.boxes ? '\n' + textifyMp4(box.boxes, depth + 1) : '');
+ }).join('\n');
+};
+
+module.exports = {
+ inspect: inspectMp4,
+ textify: textifyMp4
+};
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],48:[function(require,module,exports){
+'use strict';
+
+var ExpGolomb;
+
+/**
+ * Parser for exponential Golomb codes, a variable-bitwidth number encoding
+ * scheme used by h264.
+ */
+ExpGolomb = function(workingData) {
+ var
+ // the number of bytes left to examine in workingData
+ workingBytesAvailable = workingData.byteLength,
+
+ // the current word being examined
+ workingWord = 0, // :uint
+
+ // the number of bits left to examine in the current word
+ workingBitsAvailable = 0; // :uint;
+
+ // ():uint
+ this.length = function() {
+ return (8 * workingBytesAvailable);
+ };
+
+ // ():uint
+ this.bitsAvailable = function() {
+ return (8 * workingBytesAvailable) + workingBitsAvailable;
+ };
+
+ // ():void
+ this.loadWord = function() {
+ var
+ position = workingData.byteLength - workingBytesAvailable,
+ workingBytes = new Uint8Array(4),
+ availableBytes = Math.min(4, workingBytesAvailable);
+
+ if (availableBytes === 0) {
+ throw new Error('no bytes available');
+ }
+
+ workingBytes.set(workingData.subarray(position,
+ position + availableBytes));
+ workingWord = new DataView(workingBytes.buffer).getUint32(0);
+
+ // track the amount of workingData that has been processed
+ workingBitsAvailable = availableBytes * 8;
+ workingBytesAvailable -= availableBytes;
+ };
+
+ // (count:int):void
+ this.skipBits = function(count) {
+ var skipBytes; // :int
+ if (workingBitsAvailable > count) {
+ workingWord <<= count;
+ workingBitsAvailable -= count;
+ } else {
+ count -= workingBitsAvailable;
+ skipBytes = Math.floor(count / 8);
+
+ count -= (skipBytes * 8);
+ workingBytesAvailable -= skipBytes;
+
+ this.loadWord();
+
+ workingWord <<= count;
+ workingBitsAvailable -= count;
+ }
+ };
+
+ // (size:int):uint
+ this.readBits = function(size) {
+ var
+ bits = Math.min(workingBitsAvailable, size), // :uint
+ valu = workingWord >>> (32 - bits); // :uint
+ // if size > 31, handle error
+ workingBitsAvailable -= bits;
+ if (workingBitsAvailable > 0) {
+ workingWord <<= bits;
+ } else if (workingBytesAvailable > 0) {
+ this.loadWord();
+ }
+
+ bits = size - bits;
+ if (bits > 0) {
+ return valu << bits | this.readBits(bits);
+ } else {
+ return valu;
+ }
+ };
+
+ // ():uint
+ this.skipLeadingZeros = function() {
+ var leadingZeroCount; // :uint
+ for (leadingZeroCount = 0 ; leadingZeroCount < workingBitsAvailable ; ++leadingZeroCount) {
+ if (0 !== (workingWord & (0x80000000 >>> leadingZeroCount))) {
+ // the first bit of working word is 1
+ workingWord <<= leadingZeroCount;
+ workingBitsAvailable -= leadingZeroCount;
+ return leadingZeroCount;
+ }
+ }
+
+ // we exhausted workingWord and still have not found a 1
+ this.loadWord();
+ return leadingZeroCount + this.skipLeadingZeros();
+ };
+
+ // ():void
+ this.skipUnsignedExpGolomb = function() {
+ this.skipBits(1 + this.skipLeadingZeros());
+ };
+
+ // ():void
+ this.skipExpGolomb = function() {
+ this.skipBits(1 + this.skipLeadingZeros());
+ };
+
+ // ():uint
+ this.readUnsignedExpGolomb = function() {
+ var clz = this.skipLeadingZeros(); // :uint
+ return this.readBits(clz + 1) - 1;
+ };
+
+ // ():int
+ this.readExpGolomb = function() {
+ var valu = this.readUnsignedExpGolomb(); // :int
+ if (0x01 & valu) {
+ // the number is odd if the low order bit is set
+ return (1 + valu) >>> 1; // add 1 to make it even, and divide by 2
+ } else {
+ return -1 * (valu >>> 1); // divide by two then make it negative
+ }
+ };
+
+ // Some convenience functions
+ // :Boolean
+ this.readBoolean = function() {
+ return 1 === this.readBits(1);
+ };
+
+ // ():int
+ this.readUnsignedByte = function() {
+ return this.readBits(8);
+ };
+
+ this.loadWord();
+};
+
+module.exports = ExpGolomb;
+
+},{}],49:[function(require,module,exports){
+/**
+ * mux.js
+ *
+ * Copyright (c) 2014 Brightcove
+ * All rights reserved.
+ *
+ * A lightweight readable stream implemention that handles event dispatching.
+ * Objects that inherit from streams should call init in their constructors.
+ */
+'use strict';
+
+var Stream = function() {
+ this.init = function() {
+ var listeners = {};
+ /**
+ * Add a listener for a specified event type.
+ * @param type {string} the event name
+ * @param listener {function} the callback to be invoked when an event of
+ * the specified type occurs
+ */
+ this.on = function(type, listener) {
+ if (!listeners[type]) {
+ listeners[type] = [];
+ }
+ listeners[type].push(listener);
+ };
+ /**
+ * Remove a listener for a specified event type.
+ * @param type {string} the event name
+ * @param listener {function} a function previously registered for this
+ * type of event through `on`
+ */
+ this.off = function(type, listener) {
+ var index;
+ if (!listeners[type]) {
+ return false;
+ }
+ index = listeners[type].indexOf(listener);
+ listeners[type].splice(index, 1);
+ return index > -1;
+ };
+ /**
+ * Trigger an event of the specified type on this stream. Any additional
+ * arguments to this function are passed as parameters to event listeners.
+ * @param type {string} the event name
+ */
+ this.trigger = function(type) {
+ var callbacks, i, length, args;
+ callbacks = listeners[type];
+ if (!callbacks) {
+ return;
+ }
+ // Slicing the arguments on every invocation of this method
+ // can add a significant amount of overhead. Avoid the
+ // intermediate object creation for the common case of a
+ // single callback argument
+ if (arguments.length === 2) {
+ length = callbacks.length;
+ for (i = 0; i < length; ++i) {
+ callbacks[i].call(this, arguments[1]);
+ }
+ } else {
+ args = [];
+ i = arguments.length;
+ for (i = 1; i < arguments.length; ++i) {
+ args.push(arguments[i]);
+ }
+ length = callbacks.length;
+ for (i = 0; i < length; ++i) {
+ callbacks[i].apply(this, args);
+ }
+ }
+ };
+ /**
+ * Destroys the stream and cleans up.
+ */
+ this.dispose = function() {
+ listeners = {};
+ };
+ };
+};
+
+/**
+ * Forwards all `data` events on this stream to the destination stream. The
+ * destination stream should provide a method `push` to receive the data
+ * events as they arrive.
+ * @param destination {stream} the stream that will receive all `data` events
+ * @param autoFlush {boolean} if false, we will not call `flush` on the destination
+ * when the current stream emits a 'done' event
+ * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options
+ */
+Stream.prototype.pipe = function(destination) {
+ this.on('data', function(data) {
+ destination.push(data);
+ });
+
+ this.on('done', function() {
+ destination.flush();
+ });
+
+ return destination;
+};
+
+// Default stream functions that are expected to be overridden to perform
+// actual work. These are provided by the prototype as a sort of no-op
+// implementation so that we don't have to check for their existence in the
+// `pipe` function above.
+Stream.prototype.push = function(data) {
+ this.trigger('data', data);
+};
+
+Stream.prototype.flush = function() {
+ this.trigger('done');
+};
+
+module.exports = Stream;
+
+},{}],50:[function(require,module,exports){
+var bundleFn = arguments[3];
+var sources = arguments[4];
+var cache = arguments[5];
+
+var stringify = JSON.stringify;
+
+module.exports = function (fn) {
+ var keys = [];
+ var wkey;
+ var cacheKeys = Object.keys(cache);
+
+ for (var i = 0, l = cacheKeys.length; i < l; i++) {
+ var key = cacheKeys[i];
+ if (cache[key].exports === fn) {
+ wkey = key;
+ break;
+ }
+ }
+
+ if (!wkey) {
+ wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);
+ var wcache = {};
+ for (var i = 0, l = cacheKeys.length; i < l; i++) {
+ var key = cacheKeys[i];
+ wcache[key] = key;
+ }
+ sources[wkey] = [
+ Function(['require','module','exports'], '(' + fn + ')(self)'),
+ wcache
+ ];
+ }
+ var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);
+
+ var scache = {}; scache[wkey] = wkey;
+ sources[skey] = [
+ Function(['require'],'require(' + stringify(wkey) + ')(self)'),
+ scache
+ ];
+
+ var src = '(' + bundleFn + ')({'
+ + Object.keys(sources).map(function (key) {
+ return stringify(key) + ':['
+ + sources[key][0]
+ + ',' + stringify(sources[key][1]) + ']'
+ ;
+ }).join(',')
+ + '},{},[' + stringify(skey) + '])'
+ ;
+
+ var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
+
+ return new Worker(URL.createObjectURL(
+ new Blob([src], { type: 'text/javascript' })
+ ));
+};
+
+},{}],51:[function(require,module,exports){
+(function (global){
+/**
+ * videojs-hls
+ * The main file for the HLS project.
+ * License: https://github.com/videojs/videojs-contrib-hls/blob/master/LICENSE
+ */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', {
+ value: true
+});
+
+var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _playlistLoader = require('./playlist-loader');
+
+var _playlistLoader2 = _interopRequireDefault(_playlistLoader);
+
+var _playlist = require('./playlist');
+
+var _playlist2 = _interopRequireDefault(_playlist);
+
+var _xhr = require('./xhr');
+
+var _xhr2 = _interopRequireDefault(_xhr);
+
+var _decrypter = require('./decrypter');
+
+var _binUtils = require('./bin-utils');
+
+var _binUtils2 = _interopRequireDefault(_binUtils);
+
+var _videojsContribMediaSources = require('videojs-contrib-media-sources');
+
+var _m3u8 = require('./m3u8');
+
+var _m3u82 = _interopRequireDefault(_m3u8);
+
+var _videoJs = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null);
+
+var _videoJs2 = _interopRequireDefault(_videoJs);
+
+var _resolveUrl = require('./resolve-url');
+
+var _resolveUrl2 = _interopRequireDefault(_resolveUrl);
+
+var Hls = {
+ PlaylistLoader: _playlistLoader2['default'],
+ Playlist: _playlist2['default'],
+ Decrypter: _decrypter.Decrypter,
+ AsyncStream: _decrypter.AsyncStream,
+ decrypt: _decrypter.decrypt,
+ utils: _binUtils2['default'],
+ xhr: _xhr2['default']
+};
+
+// the desired length of video to maintain in the buffer, in seconds
+Hls.GOAL_BUFFER_LENGTH = 30;
+
+// HLS is a source handler, not a tech. Make sure attempts to use it
+// as one do not cause exceptions.
+Hls.canPlaySource = function () {
+ return _videoJs2['default'].log.warn('HLS is no longer a tech. Please remove it from ' + 'your player\'s techOrder.');
+};
+
+// Search for a likely end time for the segment that was just appened
+// based on the state of the `buffered` property before and after the
+// append.
+// If we found only one such uncommon end-point return it.
+Hls.findSoleUncommonTimeRangesEnd_ = function (original, update) {
+ var i = undefined;
+ var start = undefined;
+ var end = undefined;
+ var result = [];
+ var edges = [];
+
+ // In order to qualify as a possible candidate, the end point must:
+ // 1) Not have already existed in the `original` ranges
+ // 2) Not result from the shrinking of a range that already existed
+ // in the `original` ranges
+ // 3) Not be contained inside of a range that existed in `original`
+ var overlapsCurrentEnd = function overlapsCurrentEnd(span) {
+ return span[0] <= end && span[1] >= end;
+ };
+
+ if (original) {
+ // Save all the edges in the `original` TimeRanges object
+ for (i = 0; i < original.length; i++) {
+ start = original.start(i);
+ end = original.end(i);
+
+ edges.push([start, end]);
+ }
+ }
+
+ if (update) {
+ // Save any end-points in `update` that are not in the `original`
+ // TimeRanges object
+ for (i = 0; i < update.length; i++) {
+ start = update.start(i);
+ end = update.end(i);
+
+ if (edges.some(overlapsCurrentEnd)) {
+ continue;
+ }
+
+ // at this point it must be a unique non-shrinking end edge
+ result.push(end);
+ }
+ }
+
+ // we err on the side of caution and return null if didn't find
+ // exactly *one* differing end edge in the search above
+ if (result.length !== 1) {
+ return null;
+ }
+
+ return result[0];
+};
+
+/**
+ * Whether the browser has built-in HLS support.
+ */
+Hls.supportsNativeHls = (function () {
+ var video = document.createElement('video');
+ var xMpegUrl = undefined;
+ var vndMpeg = undefined;
+
+ // native HLS is definitely not supported if HTML5 video isn't
+ if (!_videoJs2['default'].getComponent('Html5').isSupported()) {
+ return false;
+ }
+
+ xMpegUrl = video.canPlayType('application/x-mpegURL');
+ vndMpeg = video.canPlayType('application/vnd.apple.mpegURL');
+ return (/probably|maybe/.test(xMpegUrl) || /probably|maybe/.test(vndMpeg)
+ );
+})();
+
+// HLS is a source handler, not a tech. Make sure attempts to use it
+// as one do not cause exceptions.
+Hls.isSupported = function () {
+ return _videoJs2['default'].log.warn('HLS is no longer a tech. Please remove it from ' + 'your player\'s techOrder.');
+};
+
+/**
+ * A comparator function to sort two playlist object by bandwidth.
+ * @param left {object} a media playlist object
+ * @param right {object} a media playlist object
+ * @return {number} Greater than zero if the bandwidth attribute of
+ * left is greater than the corresponding attribute of right. Less
+ * than zero if the bandwidth of right is greater than left and
+ * exactly zero if the two are equal.
+ */
+Hls.comparePlaylistBandwidth = function (left, right) {
+ var leftBandwidth = undefined;
+ var rightBandwidth = undefined;
+
+ if (left.attributes && left.attributes.BANDWIDTH) {
+ leftBandwidth = left.attributes.BANDWIDTH;
+ }
+ leftBandwidth = leftBandwidth || window.Number.MAX_VALUE;
+ if (right.attributes && right.attributes.BANDWIDTH) {
+ rightBandwidth = right.attributes.BANDWIDTH;
+ }
+ rightBandwidth = rightBandwidth || window.Number.MAX_VALUE;
+
+ return leftBandwidth - rightBandwidth;
+};
+
+/**
+ * A comparator function to sort two playlist object by resolution (width).
+ * @param left {object} a media playlist object
+ * @param right {object} a media playlist object
+ * @return {number} Greater than zero if the resolution.width attribute of
+ * left is greater than the corresponding attribute of right. Less
+ * than zero if the resolution.width of right is greater than left and
+ * exactly zero if the two are equal.
+ */
+Hls.comparePlaylistResolution = function (left, right) {
+ var leftWidth = undefined;
+ var rightWidth = undefined;
+
+ if (left.attributes && left.attributes.RESOLUTION && left.attributes.RESOLUTION.width) {
+ leftWidth = left.attributes.RESOLUTION.width;
+ }
+
+ leftWidth = leftWidth || window.Number.MAX_VALUE;
+
+ if (right.attributes && right.attributes.RESOLUTION && right.attributes.RESOLUTION.width) {
+ rightWidth = right.attributes.RESOLUTION.width;
+ }
+
+ rightWidth = rightWidth || window.Number.MAX_VALUE;
+
+ // NOTE - Fallback to bandwidth sort as appropriate in cases where multiple renditions
+ // have the same media dimensions/ resolution
+ if (leftWidth === rightWidth && left.attributes.BANDWIDTH && right.attributes.BANDWIDTH) {
+ return left.attributes.BANDWIDTH - right.attributes.BANDWIDTH;
+ }
+ return leftWidth - rightWidth;
+};
+
+// A fudge factor to apply to advertised playlist bitrates to account for
+// temporary flucations in client bandwidth
+var bandwidthVariance = 1.2;
+
+// 5 minute blacklist
+var blacklistDuration = 5 * 60 * 1000;
+
+// Fudge factor to account for TimeRanges rounding
+var TIME_FUDGE_FACTOR = 1 / 30;
+var Component = _videoJs2['default'].getComponent('Component');
+
+// The amount of time to wait between checking the state of the buffer
+var bufferCheckInterval = 500;
+
+// returns true if a key has failed to download within a certain amount of retries
+var keyFailed = function keyFailed(key) {
+ return key.retries && key.retries >= 2;
+};
+
+/**
+ * Returns the CSS value for the specified property on an element
+ * using `getComputedStyle`. Firefox has a long-standing issue where
+ * getComputedStyle() may return null when running in an iframe with
+ * `display: none`.
+ * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397
+ */
+var safeGetComputedStyle = function safeGetComputedStyle(el, property) {
+ var result = undefined;
+
+ if (!el) {
+ return '';
+ }
+
+ result = getComputedStyle(el);
+ if (!result) {
+ return '';
+ }
+
+ return result[property];
+};
+
+/**
+ * Updates segment with information about its end-point in time and, optionally,
+ * the segment duration if we have enough information to determine a segment duration
+ * accurately.
+ * @param playlist {object} a media playlist object
+ * @param segmentIndex {number} the index of segment we last appended
+ * @param segmentEnd {number} the known of the segment referenced by segmentIndex
+ */
+var updateSegmentMetadata = function updateSegmentMetadata(playlist, segmentIndex, segmentEnd) {
+ if (!playlist) {
+ return;
+ }
+
+ var segment = playlist.segments[segmentIndex];
+ var previousSegment = playlist.segments[segmentIndex - 1];
+
+ if (segmentEnd && segment) {
+ segment.end = segmentEnd;
+
+ // fix up segment durations based on segment end data
+ if (!previousSegment) {
+ // first segment is always has a start time of 0 making its duration
+ // equal to the segment end
+ segment.duration = segment.end;
+ } else if (previousSegment.end) {
+ segment.duration = segment.end - previousSegment.end;
+ }
+ }
+};
+
+/**
+ * Determines if we should call endOfStream on the media source based on the state
+ * of the buffer or if appened segment was the final segment in the playlist.
+ * @param playlist {object} a media playlist object
+ * @param mediaSource {object} the MediaSource object
+ * @param segmentIndex {number} the index of segment we last appended
+ * @param currentBuffered {object} the buffered region that currentTime resides in
+ * @return {boolean} whether the calling function should call endOfStream on the MediaSource
+ */
+var detectEndOfStream = function detectEndOfStream(playlist, mediaSource, segmentIndex, currentBuffered) {
+ if (!playlist) {
+ return false;
+ }
+
+ var segments = playlist.segments;
+
+ // determine a few boolean values to help make the branch below easier
+ // to read
+ var appendedLastSegment = segmentIndex === segments.length - 1;
+ var bufferedToEnd = currentBuffered.length && segments[segments.length - 1].end <= currentBuffered.end(0);
+
+ // if we've buffered to the end of the video, we need to call endOfStream
+ // so that MediaSources can trigger the `ended` event when it runs out of
+ // buffered data instead of waiting for me
+ return playlist.endList && mediaSource.readyState === 'open' && (appendedLastSegment || bufferedToEnd);
+};
+
+var parseCodecs = function parseCodecs(codecs) {
+ var result = {
+ codecCount: 0,
+ videoCodec: null,
+ audioProfile: null
+ };
+
+ result.codecCount = codecs.split(',').length;
+ result.codecCount = result.codecCount || 2;
+
+ // parse the video codec but ignore the version
+ result.videoCodec = /(^|\s|,)+(avc1)[^ ,]*/i.exec(codecs);
+ result.videoCodec = result.videoCodec && result.videoCodec[2];
+
+ // parse the last field of the audio codec
+ result.audioProfile = /(^|\s|,)+mp4a.\d+\.(\d+)/i.exec(codecs);
+ result.audioProfile = result.audioProfile && result.audioProfile[2];
+
+ return result;
+};
+
+var filterBufferedRanges = function filterBufferedRanges(predicate) {
+ return function (time) {
+ var i = undefined;
+ var ranges = [];
+ var tech = this.tech_;
+
+ // !!The order of the next two assignments is important!!
+ // `currentTime` must be equal-to or greater-than the start of the
+ // buffered range. Flash executes out-of-process so, every value can
+ // change behind the scenes from line-to-line. By reading `currentTime`
+ // after `buffered`, we ensure that it is always a current or later
+ // value during playback.
+ var buffered = tech.buffered();
+
+ if (typeof time === 'undefined') {
+ time = tech.currentTime();
+ }
+
+ // IE 11 has a bug where it will report a the video as fully buffered
+ // before any data has been loaded. This is a work around where we
+ // report a fully empty buffer until SourceBuffers have been created
+ // which is after a segment has been loaded and transmuxed.
+ if (!this.mediaSource || !this.mediaSource.mediaSource_ || !this.mediaSource.mediaSource_.sourceBuffers.length) {
+ return _videoJs2['default'].createTimeRanges([]);
+ }
+
+ if (buffered && buffered.length) {
+ // Search for a range containing the play-head
+ for (i = 0; i < buffered.length; i++) {
+ if (predicate(buffered.start(i), buffered.end(i), time)) {
+ ranges.push([buffered.start(i), buffered.end(i)]);
+ }
+ }
+ }
+
+ return _videoJs2['default'].createTimeRanges(ranges);
+ };
+};
+
+var HlsHandler = (function (_Component) {
+ _inherits(HlsHandler, _Component);
+
+ function HlsHandler(tech, options) {
+ var _this = this;
+
+ _classCallCheck(this, HlsHandler);
+
+ _get(Object.getPrototypeOf(HlsHandler.prototype), 'constructor', this).call(this, tech);
+ var _player = undefined;
+
+ // tech.player() is deprecated but setup a reference to HLS for
+ // backwards-compatibility
+ if (tech.options_ && tech.options_.playerId) {
+ _player = (0, _videoJs2['default'])(tech.options_.playerId);
+ if (!_player.hls) {
+ Object.defineProperty(_player, 'hls', {
+ get: function get() {
+ _videoJs2['default'].log.warn('player.hls is deprecated. Use player.tech.hls instead.');
+ return _this;
+ }
+ });
+ }
+ }
+ this.tech_ = tech;
+ this.source_ = options.source;
+ this.mode_ = options.mode;
+ // the segment info object for a segment that is in the process of
+ // being downloaded or processed
+ this.pendingSegment_ = null;
+
+ // start playlist selection at a reasonable bandwidth for
+ // broadband internet
+ // 0.5 Mbps
+ this.bandwidth = options.bandwidth || 4194304;
+ this.bytesReceived = 0;
+
+ // loadingState_ tracks how far along the buffering process we
+ // have been given permission to proceed. There are three possible
+ // values:
+ // - none: do not load playlists or segments
+ // - meta: load playlists but not segments
+ // - segments: load everything
+ this.loadingState_ = 'none';
+ if (this.tech_.preload() !== 'none') {
+ this.loadingState_ = 'meta';
+ }
+
+ // periodically check if new data needs to be downloaded or
+ // buffered data should be appended to the source buffer
+ this.startCheckingBuffer_();
+
+ this.on(this.tech_, 'seeking', function () {
+ this.setCurrentTime(this.tech_.currentTime());
+ });
+ this.on(this.tech_, 'error', function () {
+ this.stopCheckingBuffer_();
+ });
+
+ this.on(this.tech_, 'play', this.play);
+ }
+
+ /**
+ * Attempts to find the buffered TimeRange that contains the specified
+ * time, or where playback is currently happening if no specific time
+ * is specified.
+ * @param time (optional) {number} the time to filter on. Defaults to
+ * currentTime.
+ * @return a new TimeRanges object.
+ */
+
+ _createClass(HlsHandler, [{
+ key: 'src',
+ value: function src(_src) {
+ var _this2 = this;
+
+ var oldMediaPlaylist = undefined;
+
+ // do nothing if the src is falsey
+ if (!_src) {
+ return;
+ }
+
+ this.mediaSource = new _videoJs2['default'].MediaSource({ mode: this.mode_ });
+
+ // load the MediaSource into the player
+ this.mediaSource.addEventListener('sourceopen', this.handleSourceOpen.bind(this));
+
+ this.options_ = {};
+ if (typeof this.source_.withCredentials !== 'undefined') {
+ this.options_.withCredentials = this.source_.withCredentials;
+ } else if (_videoJs2['default'].options.hls) {
+ this.options_.withCredentials = _videoJs2['default'].options.hls.withCredentials;
+ }
+ this.playlists = new Hls.PlaylistLoader(this.source_.src, this.options_.withCredentials);
+
+ this.tech_.one('canplay', this.setupFirstPlay.bind(this));
+
+ this.playlists.on('loadedmetadata', function () {
+ oldMediaPlaylist = _this2.playlists.media();
+
+ // if this isn't a live video and preload permits, start
+ // downloading segments
+ if (oldMediaPlaylist.endList && _this2.tech_.preload() !== 'metadata' && _this2.tech_.preload() !== 'none') {
+ _this2.loadingState_ = 'segments';
+ }
+
+ _this2.setupSourceBuffer_();
+ _this2.setupFirstPlay();
+ _this2.fillBuffer();
+ _this2.tech_.trigger('loadedmetadata');
+ });
+
+ this.playlists.on('error', function () {
+ _this2.blacklistCurrentPlaylist_(_this2.playlists.error);
+ });
+
+ this.playlists.on('loadedplaylist', function () {
+ var updatedPlaylist = _this2.playlists.media();
+ var seekable = undefined;
+
+ if (!updatedPlaylist) {
+ // select the initial variant
+ _this2.playlists.media(_this2.selectPlaylist());
+ return;
+ }
+
+ _this2.updateDuration(_this2.playlists.media());
+
+ // update seekable
+ seekable = _this2.seekable();
+ if (_this2.duration() === Infinity && seekable.length !== 0) {
+ _this2.mediaSource.addSeekableRange_(seekable.start(0), seekable.end(0));
+ }
+
+ oldMediaPlaylist = updatedPlaylist;
+ });
+
+ this.playlists.on('mediachange', function () {
+ _this2.tech_.trigger({
+ type: 'mediachange',
+ bubbles: true
+ });
+ });
+
+ // do nothing if the tech has been disposed already
+ // this can occur if someone sets the src in player.ready(), for instance
+ if (!this.tech_.el()) {
+ return;
+ }
+
+ this.tech_.src(_videoJs2['default'].URL.createObjectURL(this.mediaSource));
+ }
+ }, {
+ key: 'handleSourceOpen',
+ value: function handleSourceOpen() {
+ // Only attempt to create the source buffer if none already exist.
+ // handleSourceOpen is also called when we are "re-opening" a source buffer
+ // after `endOfStream` has been called (in response to a seek for instance)
+ if (!this.sourceBuffer) {
+ this.setupSourceBuffer_();
+ }
+
+ // if autoplay is enabled, begin playback. This is duplicative of
+ // code in video.js but is required because play() must be invoked
+ // *after* the media source has opened.
+ // NOTE: moving this invocation of play() after
+ // sourceBuffer.appendBuffer() below caused live streams with
+ // autoplay to stall
+ if (this.tech_.autoplay()) {
+ this.play();
+ }
+ }
+
+ /**
+ * Blacklist playlists that are known to be codec or
+ * stream-incompatible with the SourceBuffer configuration. For
+ * instance, Media Source Extensions would cause the video element to
+ * stall waiting for video data if you switched from a variant with
+ * video and audio to an audio-only one.
+ *
+ * @param media {object} a media playlist compatible with the current
+ * set of SourceBuffers. Variants in the current master playlist that
+ * do not appear to have compatible codec or stream configurations
+ * will be excluded from the default playlist selection algorithm
+ * indefinitely.
+ */
+ }, {
+ key: 'excludeIncompatibleVariants_',
+ value: function excludeIncompatibleVariants_(media) {
+ var master = this.playlists.master;
+ var codecCount = 2;
+ var videoCodec = null;
+ var audioProfile = null;
+ var codecs = undefined;
+
+ if (media.attributes && media.attributes.CODECS) {
+ codecs = parseCodecs(media.attributes.CODECS);
+ videoCodec = codecs.videoCodec;
+ audioProfile = codecs.audioProfile;
+ codecCount = codecs.codecCount;
+ }
+ master.playlists.forEach(function (variant) {
+ var variantCodecs = {
+ codecCount: 2,
+ videoCodec: null,
+ audioProfile: null
+ };
+
+ if (variant.attributes && variant.attributes.CODECS) {
+ variantCodecs = parseCodecs(variant.attributes.CODECS);
+ }
+
+ // if the streams differ in the presence or absence of audio or
+ // video, they are incompatible
+ if (variantCodecs.codecCount !== codecCount) {
+ variant.excludeUntil = Infinity;
+ }
+
+ // if h.264 is specified on the current playlist, some flavor of
+ // it must be specified on all compatible variants
+ if (variantCodecs.videoCodec !== videoCodec) {
+ variant.excludeUntil = Infinity;
+ }
+ // HE-AAC ("mp4a.40.5") is incompatible with all other versions of
+ // AAC audio in Chrome 46. Don't mix the two.
+ if (variantCodecs.audioProfile === '5' && audioProfile !== '5' || audioProfile === '5' && variantCodecs.audioProfile !== '5') {
+ variant.excludeUntil = Infinity;
+ }
+ });
+ }
+ }, {
+ key: 'setupSourceBuffer_',
+ value: function setupSourceBuffer_() {
+ var media = this.playlists.media();
+ var mimeType = undefined;
+
+ // wait until a media playlist is available and the Media Source is
+ // attached
+ if (!media || this.mediaSource.readyState !== 'open') {
+ return;
+ }
+
+ // if the codecs were explicitly specified, pass them along to the
+ // source buffer
+ mimeType = 'video/mp2t';
+ if (media.attributes && media.attributes.CODECS) {
+ mimeType += '; codecs="' + media.attributes.CODECS + '"';
+ }
+ this.sourceBuffer = this.mediaSource.addSourceBuffer(mimeType);
+
+ // exclude any incompatible variant streams from future playlist
+ // selection
+ this.excludeIncompatibleVariants_(media);
+
+ // transition the sourcebuffer to the ended state if we've hit the end of
+ // the playlist
+ this.sourceBuffer.addEventListener('updateend', this.updateEndHandler_.bind(this));
+ }
+
+ /**
+ * Seek to the latest media position if this is a live video and the
+ * player and video are loaded and initialized.
+ */
+ }, {
+ key: 'setupFirstPlay',
+ value: function setupFirstPlay() {
+ var seekable = undefined;
+ var media = this.playlists.media();
+
+ // check that everything is ready to begin buffering
+
+ // 1) the video is a live stream of unknown duration
+ if (this.duration() === Infinity &&
+
+ // 2) the player has not played before and is not paused
+ this.tech_.played().length === 0 && !this.tech_.paused() &&
+
+ // 3) the Media Source and Source Buffers are ready
+ this.sourceBuffer &&
+
+ // 4) the active media playlist is available
+ media &&
+
+ // 5) the video element or flash player is in a readyState of
+ // at least HAVE_FUTURE_DATA
+ this.tech_.readyState() >= 1) {
+
+ // trigger the playlist loader to start "expired time"-tracking
+ this.playlists.trigger('firstplay');
+
+ // seek to the latest media position for live videos
+ seekable = this.seekable();
+ if (seekable.length) {
+ this.tech_.setCurrentTime(seekable.end(0));
+ }
+ }
+ }
+
+ /**
+ * Begin playing the video.
+ */
+ }, {
+ key: 'play',
+ value: function play() {
+ this.loadingState_ = 'segments';
+
+ if (this.tech_.ended()) {
+ this.tech_.setCurrentTime(0);
+ }
+
+ if (this.tech_.played().length === 0) {
+ return this.setupFirstPlay();
+ }
+
+ // if the viewer has paused and we fell out of the live window,
+ // seek forward to the earliest available position
+ if (this.duration() === Infinity) {
+ if (this.tech_.currentTime() < this.seekable().start(0)) {
+ this.tech_.setCurrentTime(this.seekable().start(0));
+ }
+ }
+ }
+ }, {
+ key: 'setCurrentTime',
+ value: function setCurrentTime(currentTime) {
+ var buffered = this.findBufferedRange_();
+
+ if (!(this.playlists && this.playlists.media())) {
+ // return immediately if the metadata is not ready yet
+ return 0;
+ }
+
+ // it's clearly an edge-case but don't thrown an error if asked to
+ // seek within an empty playlist
+ if (!this.playlists.media().segments) {
+ return 0;
+ }
+
+ // if the seek location is already buffered, continue buffering as
+ // usual
+ if (buffered && buffered.length) {
+ return currentTime;
+ }
+
+ // if we are in the middle of appending a segment, let it finish up
+ if (this.pendingSegment_ && this.pendingSegment_.buffered) {
+ return currentTime;
+ }
+
+ this.lastSegmentLoaded_ = null;
+
+ // cancel outstanding requests and buffer appends
+ this.cancelSegmentXhr();
+
+ // abort outstanding key requests, if necessary
+ if (this.keyXhr_) {
+ this.keyXhr_.aborted = true;
+ this.cancelKeyXhr();
+ }
+
+ // begin filling the buffer at the new position
+ this.fillBuffer(this.playlists.getMediaIndexForTime_(currentTime));
+ }
+ }, {
+ key: 'duration',
+ value: function duration() {
+ var playlists = this.playlists;
+
+ if (!playlists) {
+ return 0;
+ }
+
+ if (this.mediaSource) {
+ return this.mediaSource.duration;
+ }
+
+ return Hls.Playlist.duration(playlists.media());
+ }
+ }, {
+ key: 'seekable',
+ value: function seekable() {
+ var media = undefined;
+ var seekable = undefined;
+
+ if (!this.playlists) {
+ return _videoJs2['default'].createTimeRanges();
+ }
+ media = this.playlists.media();
+ if (!media) {
+ return _videoJs2['default'].createTimeRanges();
+ }
+
+ seekable = Hls.Playlist.seekable(media);
+ if (seekable.length === 0) {
+ return seekable;
+ }
+
+ // if the seekable start is zero, it may be because the player has
+ // been paused for a long time and stopped buffering. in that case,
+ // fall back to the playlist loader's running estimate of expired
+ // time
+ if (seekable.start(0) === 0) {
+ return _videoJs2['default'].createTimeRanges([[this.playlists.expired_, this.playlists.expired_ + seekable.end(0)]]);
+ }
+
+ // seekable has been calculated based on buffering video data so it
+ // can be returned directly
+ return seekable;
+ }
+
+ /**
+ * Update the player duration
+ */
+ }, {
+ key: 'updateDuration',
+ value: function updateDuration(playlist) {
+ var _this3 = this;
+
+ var oldDuration = this.mediaSource.duration;
+ var newDuration = Hls.Playlist.duration(playlist);
+ var buffered = this.tech_.buffered();
+ var setDuration = function setDuration() {
+ _this3.mediaSource.duration = newDuration;
+ _this3.tech_.trigger('durationchange');
+
+ _this3.mediaSource.removeEventListener('sourceopen', setDuration);
+ };
+
+ if (buffered.length > 0) {
+ newDuration = Math.max(newDuration, buffered.end(buffered.length - 1));
+ }
+
+ // if the duration has changed, invalidate the cached value
+ if (oldDuration !== newDuration) {
+ // update the duration
+ if (this.mediaSource.readyState !== 'open') {
+ this.mediaSource.addEventListener('sourceopen', setDuration);
+ } else if (!this.sourceBuffer || !this.sourceBuffer.updating) {
+ this.mediaSource.duration = newDuration;
+ this.tech_.trigger('durationchange');
+ }
+ }
+ }
+
+ /**
+ * Clear all buffers and reset any state relevant to the current
+ * source. After this function is called, the tech should be in a
+ * state suitable for switching to a different video.
+ */
+ }, {
+ key: 'resetSrc_',
+ value: function resetSrc_() {
+ this.cancelSegmentXhr();
+ this.cancelKeyXhr();
+
+ if (this.sourceBuffer && this.mediaSource.readyState === 'open') {
+ this.sourceBuffer.abort();
+ }
+ }
+ }, {
+ key: 'cancelKeyXhr',
+ value: function cancelKeyXhr() {
+ if (this.keyXhr_) {
+ this.keyXhr_.onreadystatechange = null;
+ this.keyXhr_.abort();
+ this.keyXhr_ = null;
+ }
+ }
+ }, {
+ key: 'cancelSegmentXhr',
+ value: function cancelSegmentXhr() {
+ if (this.segmentXhr_) {
+ // Prevent error handler from running.
+ this.segmentXhr_.onreadystatechange = null;
+ this.segmentXhr_.abort();
+ this.segmentXhr_ = null;
+ }
+
+ // clear out the segment being processed
+ this.pendingSegment_ = null;
+ }
+
+ /**
+ * Abort all outstanding work and cleanup.
+ */
+ }, {
+ key: 'dispose',
+ value: function dispose() {
+ this.stopCheckingBuffer_();
+
+ if (this.playlists) {
+ this.playlists.dispose();
+ }
+
+ this.resetSrc_();
+ _get(Object.getPrototypeOf(HlsHandler.prototype), 'dispose', this).call(this);
+ }
+
+ /**
+ * Chooses the appropriate media playlist based on the current
+ * bandwidth estimate and the player size.
+ * @return the highest bitrate playlist less than the currently detected
+ * bandwidth, accounting for some amount of bandwidth variance
+ */
+ }, {
+ key: 'selectPlaylist',
+ value: function selectPlaylist() {
+ var effectiveBitrate = undefined;
+ var sortedPlaylists = this.playlists.master.playlists.slice();
+ var bandwidthPlaylists = [];
+ var now = +new Date();
+ var i = undefined;
+ var variant = undefined;
+ var bandwidthBestVariant = undefined;
+ var resolutionPlusOne = undefined;
+ var resolutionPlusOneAttribute = undefined;
+ var resolutionBestVariant = undefined;
+ var width = undefined;
+ var height = undefined;
+
+ sortedPlaylists.sort(Hls.comparePlaylistBandwidth);
+
+ // filter out any playlists that have been excluded due to
+ // incompatible configurations or playback errors
+ sortedPlaylists = sortedPlaylists.filter(function (localVariant) {
+ if (typeof localVariant.excludeUntil !== 'undefined') {
+ return now >= localVariant.excludeUntil;
+ }
+ return true;
+ });
+
+ // filter out any variant that has greater effective bitrate
+ // than the current estimated bandwidth
+ i = sortedPlaylists.length;
+ while (i--) {
+ variant = sortedPlaylists[i];
+
+ // ignore playlists without bandwidth information
+ if (!variant.attributes || !variant.attributes.BANDWIDTH) {
+ continue;
+ }
+
+ effectiveBitrate = variant.attributes.BANDWIDTH * bandwidthVariance;
+
+ if (effectiveBitrate < this.bandwidth) {
+ bandwidthPlaylists.push(variant);
+
+ // since the playlists are sorted in ascending order by
+ // bandwidth, the first viable variant is the best
+ if (!bandwidthBestVariant) {
+ bandwidthBestVariant = variant;
+ }
+ }
+ }
+
+ i = bandwidthPlaylists.length;
+
+ // sort variants by resolution
+ bandwidthPlaylists.sort(Hls.comparePlaylistResolution);
+
+ // forget our old variant from above,
+ // or we might choose that in high-bandwidth scenarios
+ // (this could be the lowest bitrate rendition as we go through all of them above)
+ variant = null;
+
+ width = parseInt(safeGetComputedStyle(this.tech_.el(), 'width'), 10);
+ height = parseInt(safeGetComputedStyle(this.tech_.el(), 'height'), 10);
+
+ // iterate through the bandwidth-filtered playlists and find
+ // best rendition by player dimension
+ while (i--) {
+ variant = bandwidthPlaylists[i];
+
+ // ignore playlists without resolution information
+ if (!variant.attributes || !variant.attributes.RESOLUTION || !variant.attributes.RESOLUTION.width || !variant.attributes.RESOLUTION.height) {
+ continue;
+ }
+
+ // since the playlists are sorted, the first variant that has
+ // dimensions less than or equal to the player size is the best
+
+ var variantResolution = variant.attributes.RESOLUTION;
+
+ if (variantResolution.width === width && variantResolution.height === height) {
+ // if we have the exact resolution as the player use it
+ resolutionPlusOne = null;
+ resolutionBestVariant = variant;
+ break;
+ } else if (variantResolution.width < width && variantResolution.height < height) {
+ // if both dimensions are less than the player use the
+ // previous (next-largest) variant
+ break;
+ } else if (!resolutionPlusOne || variantResolution.width < resolutionPlusOneAttribute.width && variantResolution.height < resolutionPlusOneAttribute.height) {
+ // If we still haven't found a good match keep a
+ // reference to the previous variant for the next loop
+ // iteration
+
+ // By only saving variants if they are smaller than the
+ // previously saved variant, we ensure that we also pick
+ // the highest bandwidth variant that is just-larger-than
+ // the video player
+ resolutionPlusOne = variant;
+ resolutionPlusOneAttribute = resolutionPlusOne.attributes.RESOLUTION;
+ }
+ }
+
+ // fallback chain of variants
+ return resolutionPlusOne || resolutionBestVariant || bandwidthBestVariant || sortedPlaylists[0];
+ }
+
+ /**
+ * Periodically request new segments and append video data.
+ */
+ }, {
+ key: 'checkBuffer_',
+ value: function checkBuffer_() {
+ // calling this method directly resets any outstanding buffer checks
+ if (this.checkBufferTimeout_) {
+ window.clearTimeout(this.checkBufferTimeout_);
+ this.checkBufferTimeout_ = null;
+ }
+
+ this.fillBuffer();
+ this.drainBuffer();
+
+ // wait awhile and try again
+ this.checkBufferTimeout_ = window.setTimeout(this.checkBuffer_.bind(this), bufferCheckInterval);
+ }
+
+ /**
+ * Setup a periodic task to request new segments if necessary and
+ * append bytes into the SourceBuffer.
+ */
+ }, {
+ key: 'startCheckingBuffer_',
+ value: function startCheckingBuffer_() {
+ this.checkBuffer_();
+ }
+
+ /**
+ * Stop the periodic task requesting new segments and feeding the
+ * SourceBuffer.
+ */
+ }, {
+ key: 'stopCheckingBuffer_',
+ value: function stopCheckingBuffer_() {
+ if (this.checkBufferTimeout_) {
+ window.clearTimeout(this.checkBufferTimeout_);
+ this.checkBufferTimeout_ = null;
+ }
+ }
+
+ /**
+ * Determines whether there is enough video data currently in the buffer
+ * and downloads a new segment if the buffered time is less than the goal.
+ * @param seekToTime (optional) {number} the offset into the downloaded segment
+ * to seek to, in seconds
+ */
+ }, {
+ key: 'fillBuffer',
+ value: function fillBuffer(mediaIndex) {
+ var tech = this.tech_;
+ var currentTime = tech.currentTime();
+ var hasBufferedContent = this.tech_.buffered().length !== 0;
+ var currentBuffered = this.findBufferedRange_();
+ var outsideBufferedRanges = !(currentBuffered && currentBuffered.length);
+ var currentBufferedEnd = 0;
+ var bufferedTime = 0;
+ var segment = undefined;
+ var segmentInfo = undefined;
+ var segmentTimestampOffset = undefined;
+
+ // if preload is set to "none", do not download segments until playback is requested
+ if (this.loadingState_ !== 'segments') {
+ return;
+ }
+
+ // if a video has not been specified, do nothing
+ if (!tech.currentSrc() || !this.playlists) {
+ return;
+ }
+
+ // if there is a request already in flight, do nothing
+ if (this.segmentXhr_) {
+ return;
+ }
+
+ // wait until the buffer is up to date
+ if (this.pendingSegment_) {
+ return;
+ }
+
+ // if no segments are available, do nothing
+ if (this.playlists.state === 'HAVE_NOTHING' || !this.playlists.media() || !this.playlists.media().segments) {
+ return;
+ }
+
+ // if a playlist switch is in progress, wait for it to finish
+ if (this.playlists.state === 'SWITCHING_MEDIA') {
+ return;
+ }
+
+ if (typeof mediaIndex === 'undefined') {
+ if (currentBuffered && currentBuffered.length) {
+ currentBufferedEnd = currentBuffered.end(0);
+ mediaIndex = this.playlists.getMediaIndexForTime_(currentBufferedEnd);
+ bufferedTime = Math.max(0, currentBufferedEnd - currentTime);
+
+ // if there is plenty of content in the buffer and we're not
+ // seeking, relax for awhile
+ if (bufferedTime >= Hls.GOAL_BUFFER_LENGTH) {
+ return;
+ }
+ } else {
+ mediaIndex = this.playlists.getMediaIndexForTime_(this.tech_.currentTime());
+ }
+ }
+ segment = this.playlists.media().segments[mediaIndex];
+
+ // if the video has finished downloading
+ if (!segment) {
+ return;
+ }
+
+ // we have entered a state where we are fetching the same segment,
+ // try to walk forward
+ if (this.lastSegmentLoaded_ && this.playlistUriToUrl(this.lastSegmentLoaded_.uri) === this.playlistUriToUrl(segment.uri) && this.lastSegmentLoaded_.byterange === segment.byterange) {
+ return this.fillBuffer(mediaIndex + 1);
+ }
+
+ // package up all the work to append the segment
+ segmentInfo = {
+ // resolve the segment URL relative to the playlist
+ uri: this.playlistUriToUrl(segment.uri),
+ // the segment's mediaIndex & mediaSequence at the time it was requested
+ mediaIndex: mediaIndex,
+ mediaSequence: this.playlists.media().mediaSequence,
+ // the segment's playlist
+ playlist: this.playlists.media(),
+ // The state of the buffer when this segment was requested
+ currentBufferedEnd: currentBufferedEnd,
+ // unencrypted bytes of the segment
+ bytes: null,
+ // when a key is defined for this segment, the encrypted bytes
+ encryptedBytes: null,
+ // optionally, the decrypter that is unencrypting the segment
+ decrypter: null,
+ // the state of the buffer before a segment is appended will be
+ // stored here so that the actual segment duration can be
+ // determined after it has been appended
+ buffered: null,
+ // The target timestampOffset for this segment when we append it
+ // to the source buffer
+ timestampOffset: null
+ };
+
+ if (mediaIndex > 0) {
+ segmentTimestampOffset = Hls.Playlist.duration(segmentInfo.playlist, segmentInfo.playlist.mediaSequence + mediaIndex) + this.playlists.expired_;
+ }
+
+ if (this.tech_.seeking() && outsideBufferedRanges) {
+ // If there are discontinuities in the playlist, we can't be sure of anything
+ // related to time so we reset the timestamp offset and start appending data
+ // anew on every seek
+ if (segmentInfo.playlist.discontinuityStarts.length) {
+ segmentInfo.timestampOffset = segmentTimestampOffset;
+ }
+ } else if (segment.discontinuity && currentBuffered.length) {
+ // If we aren't seeking and are crossing a discontinuity, we should set
+ // timestampOffset for new segments to be appended the end of the current
+ // buffered time-range
+ segmentInfo.timestampOffset = currentBuffered.end(0);
+ } else if (!hasBufferedContent && this.tech_.currentTime() > 0.05) {
+ // If we are trying to play at a position that is not zero but we aren't
+ // currently seeking according to the video element
+ segmentInfo.timestampOffset = segmentTimestampOffset;
+ }
+
+ this.loadSegment(segmentInfo);
+ }
+ }, {
+ key: 'playlistUriToUrl',
+ value: function playlistUriToUrl(segmentRelativeUrl) {
+ var playListUrl = undefined;
+
+ // resolve the segment URL relative to the playlist
+ if (this.playlists.media().uri === this.source_.src) {
+ playListUrl = (0, _resolveUrl2['default'])(this.source_.src, segmentRelativeUrl);
+ } else {
+ playListUrl = (0, _resolveUrl2['default'])((0, _resolveUrl2['default'])(this.source_.src, this.playlists.media().uri || ''), segmentRelativeUrl);
+ }
+ return playListUrl;
+ }
+
+ /*
+ * Turns segment byterange into a string suitable for use in
+ * HTTP Range requests
+ */
+ }, {
+ key: 'byterangeStr_',
+ value: function byterangeStr_(byterange) {
+ var byterangeStart = undefined;
+ var byterangeEnd = undefined;
+
+ // `byterangeEnd` is one less than `offset + length` because the HTTP range
+ // header uses inclusive ranges
+ byterangeEnd = byterange.offset + byterange.length - 1;
+ byterangeStart = byterange.offset;
+ return 'bytes=' + byterangeStart + '-' + byterangeEnd;
+ }
+
+ /*
+ * Defines headers for use in the xhr request for a particular segment.
+ */
+ }, {
+ key: 'segmentXhrHeaders_',
+ value: function segmentXhrHeaders_(segment) {
+ var headers = {};
+
+ if ('byterange' in segment) {
+ headers.Range = this.byterangeStr_(segment.byterange);
+ }
+ return headers;
+ }
+
+ /*
+ * Sets `bandwidth`, `segmentXhrTime`, and appends to the `bytesReceived.
+ * Expects an object with:
+ * * `roundTripTime` - the round trip time for the request we're setting the time for
+ * * `bandwidth` - the bandwidth we want to set
+ * * `bytesReceived` - amount of bytes downloaded
+ * `bandwidth` is the only required property.
+ */
+ }, {
+ key: 'setBandwidth',
+ value: function setBandwidth(localXhr) {
+ // calculate the download bandwidth
+ this.segmentXhrTime = localXhr.roundTripTime;
+ this.bandwidth = localXhr.bandwidth;
+ this.bytesReceived += localXhr.bytesReceived || 0;
+
+ this.tech_.trigger('bandwidthupdate');
+ }
+
+ /*
+ * Blacklists a playlist when an error occurs for a set amount of time
+ * making it unavailable for selection by the rendition selection algorithm
+ * and then forces a new playlist (rendition) selection.
+ */
+ }, {
+ key: 'blacklistCurrentPlaylist_',
+ value: function blacklistCurrentPlaylist_(error) {
+ var currentPlaylist = undefined;
+ var nextPlaylist = undefined;
+
+ // If the `error` was generated by the playlist loader, it will contain
+ // the playlist we were trying to load (but failed) and that should be
+ // blacklisted instead of the currently selected playlist which is likely
+ // out-of-date in this scenario
+ currentPlaylist = error.playlist || this.playlists.media();
+
+ // If there is no current playlist, then an error occurred while we were
+ // trying to load the master OR while we were disposing of the tech
+ if (!currentPlaylist) {
+ this.error = error;
+ return this.mediaSource.endOfStream('network');
+ }
+
+ // Blacklist this playlist
+ currentPlaylist.excludeUntil = Date.now() + blacklistDuration;
+
+ // Select a new playlist
+ nextPlaylist = this.selectPlaylist();
+
+ if (nextPlaylist) {
+ _videoJs2['default'].log.warn('Problem encountered with the current ' + 'HLS playlist. Switching to another playlist.');
+
+ return this.playlists.media(nextPlaylist);
+ }
+ _videoJs2['default'].log.warn('Problem encountered with the current ' + 'HLS playlist. No suitable alternatives found.');
+ // We have no more playlists we can select so we must fail
+ this.error = error;
+ return this.mediaSource.endOfStream('network');
+ }
+ }, {
+ key: 'loadSegment',
+ value: function loadSegment(segmentInfo) {
+ var _this4 = this;
+
+ var segment = segmentInfo.playlist.segments[segmentInfo.mediaIndex];
+ var removeToTime = 0;
+ var seekable = this.seekable();
+ var currentTime = this.tech_.currentTime();
+
+ // Chrome has a hard limit of 150mb of
+ // buffer and a very conservative "garbage collector"
+ // We manually clear out the old buffer to ensure
+ // we don't trigger the QuotaExceeded error
+ // on the source buffer during subsequent appends
+ if (this.sourceBuffer && !this.sourceBuffer.updating) {
+ // If we have a seekable range use that as the limit for what can be removed safely
+ // otherwise remove anything older than 1 minute before the current play head
+ if (seekable.length && seekable.start(0) > 0 && seekable.start(0) < currentTime) {
+ removeToTime = seekable.start(0);
+ } else {
+ removeToTime = currentTime - 60;
+ }
+
+ if (removeToTime > 0) {
+ this.sourceBuffer.remove(0, removeToTime);
+ }
+ }
+
+ // if the segment is encrypted, request the key
+ if (segment.key) {
+ this.fetchKey_(segment);
+ }
+
+ // request the next segment
+ this.segmentXhr_ = Hls.xhr({
+ uri: segmentInfo.uri,
+ responseType: 'arraybuffer',
+ withCredentials: this.source_.withCredentials,
+ // Set xhr timeout to 150% of the segment duration to allow us
+ // some time to switch renditions in the event of a catastrophic
+ // decrease in network performance or a server issue.
+ timeout: segment.duration * 1.5 * 1000,
+ headers: this.segmentXhrHeaders_(segment)
+ }, function (error, request) {
+ // This is a timeout of a previously aborted segment request
+ // so simply ignore it
+ if (!_this4.segmentXhr_ || request !== _this4.segmentXhr_) {
+ return;
+ }
+
+ // the segment request is no longer outstanding
+ _this4.segmentXhr_ = null;
+
+ // if a segment request times out, we may have better luck with another playlist
+ if (request.timedout) {
+ _this4.bandwidth = 1;
+ return _this4.playlists.media(_this4.selectPlaylist());
+ }
+
+ // otherwise, trigger a network error
+ if (!request.aborted && error) {
+ return _this4.blacklistCurrentPlaylist_({
+ status: request.status,
+ message: 'HLS segment request error at URL: ' + segmentInfo.uri,
+ code: request.status >= 500 ? 4 : 2
+ });
+ }
+
+ // stop processing if the request was aborted
+ if (!request.response) {
+ return;
+ }
+
+ _this4.lastSegmentLoaded_ = segment;
+ _this4.setBandwidth(request);
+
+ if (segment.key) {
+ segmentInfo.encryptedBytes = new Uint8Array(request.response);
+ } else {
+ segmentInfo.bytes = new Uint8Array(request.response);
+ }
+
+ _this4.pendingSegment_ = segmentInfo;
+
+ _this4.tech_.trigger('progress');
+ _this4.drainBuffer();
+
+ // figure out what stream the next segment should be downloaded from
+ // with the updated bandwidth information
+ _this4.playlists.media(_this4.selectPlaylist());
+ });
+ }
+ }, {
+ key: 'drainBuffer',
+ value: function drainBuffer() {
+ var segmentInfo = undefined;
+ var mediaIndex = undefined;
+ var playlist = undefined;
+ var bytes = undefined;
+ var segment = undefined;
+ var decrypter = undefined;
+ var segIv = undefined;
+
+ // if the buffer is empty or the source buffer hasn't been created
+ // yet, do nothing
+ if (!this.pendingSegment_ || !this.sourceBuffer) {
+ return;
+ }
+
+ // the pending segment has already been appended and we're waiting
+ // for updateend to fire
+ if (this.pendingSegment_.buffered) {
+ return;
+ }
+
+ // we can't append more data if the source buffer is busy processing
+ // what we've already sent
+ if (this.sourceBuffer.updating) {
+ return;
+ }
+
+ segmentInfo = this.pendingSegment_;
+ mediaIndex = segmentInfo.mediaIndex;
+ playlist = segmentInfo.playlist;
+ bytes = segmentInfo.bytes;
+ segment = playlist.segments[mediaIndex];
+
+ if (segment.key && !bytes) {
+ // this is an encrypted segment
+ // if the key download failed, we want to skip this segment
+ // but if the key hasn't downloaded yet, we want to try again later
+ if (keyFailed(segment.key)) {
+ return this.blacklistCurrentPlaylist_({
+ message: 'HLS segment key request error.',
+ code: 4
+ });
+ } else if (!segment.key.bytes) {
+ // waiting for the key bytes, try again later
+ return;
+ } else if (segmentInfo.decrypter) {
+ // decryption is in progress, try again later
+ return;
+ }
+ // if the media sequence is greater than 2^32, the IV will be incorrect
+ // assuming 10s segments, that would be about 1300 years
+ segIv = segment.key.iv || new Uint32Array([0, 0, 0, mediaIndex + playlist.mediaSequence]);
+
+ // create a decrypter to incrementally decrypt the segment
+ decrypter = new Hls.Decrypter(segmentInfo.encryptedBytes, segment.key.bytes, segIv, function (error, localBytes) {
+ if (error) {
+ _videoJs2['default'].log.warn(error);
+ }
+ segmentInfo.bytes = localBytes;
+ });
+ segmentInfo.decrypter = decrypter;
+ return;
+ }
+
+ this.pendingSegment_.buffered = this.tech_.buffered();
+
+ if (segmentInfo.timestampOffset !== null) {
+ this.sourceBuffer.timestampOffset = segmentInfo.timestampOffset;
+ }
+
+ // the segment is asynchronously added to the current buffered data
+ this.sourceBuffer.appendBuffer(bytes);
+ }
+ }, {
+ key: 'updateEndHandler_',
+ value: function updateEndHandler_() {
+ var segmentInfo = this.pendingSegment_;
+ var playlist = undefined;
+ var currentMediaIndex = undefined;
+ var currentBuffered = undefined;
+ var seekable = undefined;
+ var timelineUpdate = undefined;
+ var isEndOfStream = undefined;
+
+ // stop here if the update errored or was aborted
+ if (!segmentInfo) {
+ this.pendingSegment_ = null;
+ return;
+ }
+
+ // In Firefox, the updateend event is triggered for both removing from the buffer and
+ // adding to the buffer. To prevent this code from executing on removals, we wait for
+ // segmentInfo to have a filled in buffered value before we continue processing.
+ if (!segmentInfo.buffered) {
+ return;
+ }
+
+ this.pendingSegment_ = null;
+
+ playlist = segmentInfo.playlist;
+ currentMediaIndex = segmentInfo.mediaIndex + (segmentInfo.mediaSequence - playlist.mediaSequence);
+ currentBuffered = this.findBufferedRange_();
+ isEndOfStream = detectEndOfStream(playlist, this.mediaSource, currentMediaIndex, currentBuffered);
+
+ // if we switched renditions don't try to add segment timeline
+ // information to the playlist
+ if (segmentInfo.playlist.uri !== this.playlists.media().uri) {
+ if (isEndOfStream) {
+ return this.mediaSource.endOfStream();
+ }
+ return this.fillBuffer();
+ }
+
+ // when seeking to the beginning of the seekable range, it's
+ // possible that imprecise timing information may cause the seek to
+ // end up earlier than the start of the range
+ // in that case, seek again
+ seekable = this.seekable();
+ if (this.tech_.seeking() && currentBuffered.length === 0) {
+ if (seekable.length && this.tech_.currentTime() < seekable.start(0)) {
+ var next = this.findNextBufferedRange_();
+
+ if (next.length) {
+ _videoJs2['default'].log('tried seeking to', this.tech_.currentTime(), 'but that was too early, retrying at', next.start(0));
+ this.tech_.setCurrentTime(next.start(0) + TIME_FUDGE_FACTOR);
+ }
+ }
+ }
+
+ timelineUpdate = Hls.findSoleUncommonTimeRangesEnd_(segmentInfo.buffered, this.tech_.buffered());
+
+ // Update segment meta-data (duration and end-point) based on timeline
+ updateSegmentMetadata(playlist, currentMediaIndex, timelineUpdate);
+
+ // If we decide to signal the end of stream, then we can return instead
+ // of trying to fetch more segments
+ if (isEndOfStream) {
+ return this.mediaSource.endOfStream();
+ }
+
+ if (timelineUpdate !== null || segmentInfo.buffered.length !== this.tech_.buffered().length) {
+ this.updateDuration(playlist);
+ // check if it's time to download the next segment
+ this.fillBuffer();
+ return;
+ }
+
+ // the last segment append must have been entirely in the
+ // already buffered time ranges. just buffer forward until we
+ // find a segment that adds to the buffered time ranges and
+ // improves subsequent media index calculations.
+ this.fillBuffer(currentMediaIndex + 1);
+ return;
+ }
+
+ /**
+ * Attempt to retrieve the key for a particular media segment.
+ */
+ }, {
+ key: 'fetchKey_',
+ value: function fetchKey_(segment) {
+ var _this5 = this;
+
+ var key = undefined;
+ var settings = undefined;
+ var receiveKey = undefined;
+
+ // if there is a pending XHR or no segments, don't do anything
+ if (this.keyXhr_) {
+ return;
+ }
+
+ settings = this.options_;
+
+ /**
+ * Handle a key XHR response.
+ */
+ receiveKey = function (keyRecieved) {
+ return function (error, request) {
+ var view = undefined;
+
+ _this5.keyXhr_ = null;
+
+ if (error || !request.response || request.response.byteLength !== 16) {
+ keyRecieved.retries = keyRecieved.retries || 0;
+ keyRecieved.retries++;
+ if (!request.aborted) {
+ // try fetching again
+ _this5.fetchKey_(segment);
+ }
+ return;
+ }
+
+ view = new DataView(request.response);
+ keyRecieved.bytes = new Uint32Array([view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12)]);
+
+ // check to see if this allows us to make progress buffering now
+ _this5.checkBuffer_();
+ };
+ };
+
+ key = segment.key;
+
+ // nothing to do if this segment is unencrypted
+ if (!key) {
+ return;
+ }
+
+ // request the key if the retry limit hasn't been reached
+ if (!key.bytes && !keyFailed(key)) {
+ this.keyXhr_ = Hls.xhr({
+ uri: this.playlistUriToUrl(key.uri),
+ responseType: 'arraybuffer',
+ withCredentials: settings.withCredentials
+ }, receiveKey(key));
+ return;
+ }
+ }
+ }]);
+
+ return HlsHandler;
+})(Component);
+
+exports['default'] = HlsHandler;
+HlsHandler.prototype.findBufferedRange_ = filterBufferedRanges(function (start, end, time) {
+ return start - TIME_FUDGE_FACTOR <= time && end + TIME_FUDGE_FACTOR >= time;
+});
+/**
+ * Returns the TimeRanges that begin at or later than the specified
+ * time.
+ * @param time (optional) {number} the time to filter on. Defaults to
+ * currentTime.
+ * @return a new TimeRanges object.
+ */
+HlsHandler.prototype.findNextBufferedRange_ = filterBufferedRanges(function (start, end, time) {
+ return start - TIME_FUDGE_FACTOR >= time;
+});
+
+/**
+ * The Source Handler object, which informs video.js what additional
+ * MIME types are supported and sets up playback. It is registered
+ * automatically to the appropriate tech based on the capabilities of
+ * the browser it is running in. It is not necessary to use or modify
+ * this object in normal usage.
+ */
+var HlsSourceHandler = function HlsSourceHandler(mode) {
+ return {
+ canHandleSource: function canHandleSource(srcObj) {
+ return HlsSourceHandler.canPlayType(srcObj.type);
+ },
+ handleSource: function handleSource(source, tech) {
+ if (mode === 'flash') {
+ // We need to trigger this asynchronously to give others the chance
+ // to bind to the event when a source is set at player creation
+ tech.setTimeout(function () {
+ tech.trigger('loadstart');
+ }, 1);
+ }
+ tech.hls = new HlsHandler(tech, {
+ source: source,
+ mode: mode
+ });
+ tech.hls.src(source.src);
+ return tech.hls;
+ },
+ canPlayType: function canPlayType(type) {
+ return HlsSourceHandler.canPlayType(type);
+ }
+ };
+};
+
+HlsSourceHandler.canPlayType = function (type) {
+ var mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i;
+
+ // favor native HLS support if it's available
+ if (Hls.supportsNativeHls) {
+ return false;
+ }
+ return mpegurlRE.test(type);
+};
+
+if (typeof _videoJs2['default'].MediaSource === 'undefined' || typeof _videoJs2['default'].URL === 'undefined') {
+ _videoJs2['default'].MediaSource = _videojsContribMediaSources.MediaSource;
+ _videoJs2['default'].URL = _videojsContribMediaSources.URL;
+}
+
+// register source handlers with the appropriate techs
+if (_videojsContribMediaSources.MediaSource.supportsNativeMediaSources()) {
+ _videoJs2['default'].getComponent('Html5').registerSourceHandler(HlsSourceHandler('html5'));
+}
+if (window.Uint8Array) {
+ _videoJs2['default'].getComponent('Flash').registerSourceHandler(HlsSourceHandler('flash'));
+}
+
+_videoJs2['default'].HlsHandler = HlsHandler;
+_videoJs2['default'].HlsSourceHandler = HlsSourceHandler;
+_videoJs2['default'].Hls = Hls;
+_videoJs2['default'].m3u8 = _m3u82['default'];
+
+exports['default'] = {
+ Hls: Hls,
+ HlsHandler: HlsHandler,
+ HlsSourceHandler: HlsSourceHandler
+};
+module.exports = exports['default'];
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./bin-utils":1,"./decrypter":5,"./m3u8":6,"./playlist":11,"./playlist-loader":10,"./resolve-url":12,"./xhr":14,"videojs-contrib-media-sources":28}]},{},[51])(51)
+}); \ No newline at end of file