diff options
Diffstat (limited to 'web')
19 files changed, 17644 insertions, 179 deletions
diff --git a/web/etc/nginx/default.conf b/web/etc/nginx/default.conf index 4335774..80fc4f3 100644 --- a/web/etc/nginx/default.conf +++ b/web/etc/nginx/default.conf @@ -156,8 +156,7 @@ server { ssl_stapling on; ssl_stapling_verify on; root /var/www/stream/; -# index index.pl index.html; - index index.pl index.py index.html; + index index.pl index.html; location /hls { types { #application/vnd.apple.mpegurl m3u8; @@ -192,13 +191,6 @@ server { allow 2a06:5841:151a::/64; deny all; } - location ~ \.py { - try_files $uri =404; - fastcgi_pass unix:/tmp/index-fcgi.sock; - fastcgi_index index.py; - fastcgi_param PATH_INFO $fastcgi_path_info; - include fastcgi_params; - } location ~ \.pl|cgi$ { try_files $uri =404; gzip off; diff --git a/web/etc/varnish/nms.vcl b/web/etc/varnish/nms.vcl index 53a9444..8ac8b46 100644 --- a/web/etc/varnish/nms.vcl +++ b/web/etc/varnish/nms.vcl @@ -8,9 +8,17 @@ backend default { .host = "127.0.0.1"; .port = "8080"; } - +acl yoda { + "185.110.148.11"; + "127.0.0.1"; + "::1"; + "2a06:5841:1337::11"; +} # Sort magi. sub vcl_recv { + if (client.ip !~ yoda) { + return (synth(418,"GET RECKT")); + } if (req.url ~ "^/where" || req.url ~ "^/location") { set req.url = "/api/public/location"; } diff --git a/web/nms.gathering.org/api/public/ping b/web/nms.gathering.org/api/public/ping index db46b00..811708d 100755 --- a/web/nms.gathering.org/api/public/ping +++ b/web/nms.gathering.org/api/public/ping @@ -4,9 +4,9 @@ use strict; use warnings; use nms::web; -nms::web::setwhen('10s'); +nms::web::setwhen('15s'); -my $q = $nms::web::dbh->prepare("SELECT DISTINCT ON (sysname) (now() - time) as age,sysname, latency_ms FROM ping NATURAL JOIN switches WHERE time in (select max(time) from ping where " +my $q = $nms::web::dbh->prepare("SELECT DISTINCT ON (sysname) (" . $nms::web::now . " - time) as age,sysname, latency_ms FROM ping NATURAL JOIN switches WHERE time in (select max(time) from ping where " . $nms::web::when . " group by switch)"); $q->execute(); @@ -32,6 +32,6 @@ while ( my $ref = $lq->fetchrow_hashref() ) { $nms::web::json{'linknets'}{$ref->{'linknet'}} = [ $ref->{'latency1_ms'}, $ref->{'latency2_ms'} ]; } -$nms::web::cc{'max-age'} = "2"; +$nms::web::cc{'max-age'} = "1"; $nms::web::cc{'stale-while-revalidate'} = "15"; finalize_output(); diff --git a/web/nms.gathering.org/index.html b/web/nms.gathering.org/index.html index af7776d..d3928bb 100644 --- a/web/nms.gathering.org/index.html +++ b/web/nms.gathering.org/index.html @@ -117,7 +117,7 @@ <li><a href="#disco" onclick="setUpdater(handler_disco)">DISCO</a></li> <li class="divider"> </li> <li><a href="#" onclick="toggleLayer('nowPickerBox');startNowPicker();">Travel in time</a></li> - <li><a href="#" onclick="nms.playback.startReplay('2015-04-01T09:00:00','2015-04-05T12:00:00');" title="Replay from opening 120 minutes per second">Replay TG</a></li> + <li><a href="#" onclick="nms.playback.startReplay('2016-03-21T09:00:00','2016-03-27T12:00:00');" title="Replay from opening 120 minutes per second">Replay TG</a></li> <li class="divider"> </li> <li class="dropdown-header">View</li> <li><a href="#" onclick="toggleNightMode()">Toggle Night Mode</a></li> @@ -131,6 +131,7 @@ <li class="dropdown-header">Inventory lists</li> <li><a href="#" onclick="nmsInfoBox.showWindow('inventoryListing','distro_name');">Distro names</a></li> <li><a href="#" onclick="nmsInfoBox.showWindow('inventoryListing','sysDescr')">System description</a></li> + <li><a href="#" onclick="nmsInfoBox.showWindow('inventoryListing','jnxBoxSerialNo')">Serial Numbers</a></li> <li class="divider"> </li> <li class="dropdown-header">Help</li> <li><a href="#" onclick="toggleLayer('aboutKeybindings');" >Keyboard Shortcuts</a></li> diff --git a/web/nms.gathering.org/js/nms-info-box.js b/web/nms.gathering.org/js/nms-info-box.js index 01bac94..1742ac2 100644 --- a/web/nms.gathering.org/js/nms-info-box.js +++ b/web/nms.gathering.org/js/nms-info-box.js @@ -546,7 +546,7 @@ nmsInfoBox._windowTypes.inventoryListing = { activeView: '', activeFilter: '', getTitle: function() { - return '<h4>Inventory listing</h4><button type="button" class="distro-name btn btn-xs btn-default" onclick="nmsInfoBox.showWindow(\'inventoryListing\',\'distro_name\');">Distro name</button> <button type="button" class="distro-name btn btn-xs btn-default" onclick="nmsInfoBox.showWindow(\'inventoryListing\',\'sysDescr\');">System Description</button>'; + return '<h4>Inventory listing</h4><button type="button" class="distro-name btn btn-xs btn-default" onclick="nmsInfoBox.showWindow(\'inventoryListing\',\'distro_name\');">Distro name</button> <button type="button" class="distro-name btn btn-xs btn-default" onclick="nmsInfoBox.showWindow(\'inventoryListing\',\'sysDescr\');">System Description</button><button type="button" class="distro-name btn btn-xs btn-default" onclick="nmsInfoBox.showWindow(\'inventoryListing\',\'jnxBoxSerialNo\');">Serial Numbers</button>'; }, getContent: function() { return this.content; @@ -592,6 +592,11 @@ nmsInfoBox._windowTypes.inventoryListing = { listTitle = 'System description'; needSnmp = true; break; + case 'jnxBoxSerialNo': + if(hasSnmp) + listTitle = 'Serial Numbers'; + needSnmp = true; + break; default: listTitle = 'Distro names'; list = 'distro_name'; @@ -619,6 +624,9 @@ nmsInfoBox._windowTypes.inventoryListing = { case 'sysDescr': value = nmsData.snmp.snmp[sw]["misc"]["sysDescr"][0]; break; + case 'jnxBoxSerialNo': + value = nmsData.snmp.snmp[sw]["misc"]["jnxBoxSerialNo"][0]; + break; } } catch (e) { //console.log(e); diff --git a/web/nms.gathering.org/js/nms-map-handlers.js b/web/nms.gathering.org/js/nms-map-handlers.js index 474e8ef..a7672a3 100644 --- a/web/nms.gathering.org/js/nms-map-handlers.js +++ b/web/nms.gathering.org/js/nms-map-handlers.js @@ -373,14 +373,13 @@ function getDhcpColor(stop) function dhcpUpdater() { - var realnow = Date.now(); - var now = Math.floor(realnow / 1000); if (nmsData.dhcp == undefined || nmsData.dhcp.dhcp == undefined) { return } if (nmsData.switches == undefined || nmsData.switches.switches == undefined) { return; } + var now = nmsData.dhcp.time; try { for (var sw in nmsData.switches.switches) { var c = blue; diff --git a/web/stream.gathering.org/embed.pl b/web/stream.gathering.org/embed.pl index 91fc413..ae76bea 100755 --- a/web/stream.gathering.org/embed.pl +++ b/web/stream.gathering.org/embed.pl @@ -1,14 +1,18 @@ -#!/usr/bin/perl -I /root/tgmanage/web/stream.gathering.org/streamlib +#!/usr/bin/perl -I /root/tgmanage/web/stream.gathering.org/streamlib/ use warnings; use strict; use CGI; +# apt-get install libgeo-ip-perl use Geo::IP; use NetAddr::IP; use Net::IP; # apt-get install libnet-ip-perl libnetaddr-ip-perl use HTML::Template; +# apt-get install libhtml-template-perl use stream; use stream::config; +#use MIME::Base64; +use URI::Escape; my $client = CGI->new; @@ -16,6 +20,12 @@ my $v4net = $stream::config::v4net; my $v6net = $stream::config::v6net; my $tg = $stream::config::tg; my $tg_full = $stream::config::tg_full; +my $video_url_mp4; +my $video_url = $stream::config::video_url; +my $video_url_fallback = $stream::config::video_url_fallback; +if($stream::config::video_url_mp4) { +$video_url_mp4 = $stream::config::video_url_mp4; +} my %streams = %stream::config::streams; my $force_unicast = $client->param('forceunicast'); @@ -29,41 +39,67 @@ my $clip = $client->remote_addr(); my $template = HTML::Template->new(filename => 'embed.tmpl'); my $is_local = &is_ip_local($clip, $v4net, $v6net); -my @streams = &html_local_test(); -$template->param(TG => $tg); +#my @streams = &loop_webcams("event"); +#my @camstreams = &loop_webcams("camera"); + +my %input; +for my $key ( $client->param() ) { + $input{$key} = $client->param($key); +} + +#$template->param(TG => $tg); $template->param(TG_FULL => $tg_full); -$template->param(STREAMS => \@streams); +#$template->param(STREAMS => \@streams); +#$template->param(CAMSTREAMS => \@camstreams); $template->param(NOHEADER => $no_header); +if(exists $input{url}) { + my $url = uri_unescape($input{url}); + + if ($url ~~ %streams) { + $template->param(VIDEO_URL_MAIN => $streams{$url}->{main_url}); + $template->param(VIDEO_URL_FALLBACK => $streams{$url}->{fallback_url}); + if($streams{$url}->{mp4_url}) { + $template->param(VIDEO_URL_MP4 => $streams{$url}->{mp4_url}); + } + } + # Check against XS-scripting: + #if (index($decodedUrl, 'cubemap.tg16.gathering.org/') != -1) { + # $template->param(VIDEO_URL => $decodedUrl); + #} elsif (index($decodedUrl, 'stream.tg16.gathering.org/') != -1) { + # $template->param(VIDEO_URL => $decodedUrl); + #} else { + # $template->param(VIDEO_URL => $video_url); + #} +} else { + $template->param(VIDEO_URL_MAIN => $video_url); + $template->param(VIDEO_URL_FALLBACK => $video_url_fallback); + if($video_url_mp4) { + $template->param(VIDEO_URL_MP4 => $video_url_mp4); + } +} print $template->output(); -sub html_local_test() { +sub loop_webcams() { my @s = (); foreach my $name (sort { $streams{$a}->{priority} <=> $streams{$b}->{priority} } keys %streams) { - my $title_link = "http://stream.tg$tg.gathering.org/stream.pl?delivery=%s&stream=${name}&interlaced=%s"; - my $multicast_link = $streams{$name}->{has_multicast} ? "multicast" : "unicast"; - $multicast_link = "unicast" if ($force_unicast == 1 || not $is_local); + if ($streams{$name}->{type} eq $_[0] && $streams{$name}->{online}) { + my $vlc_url = "http://stream.tg$tg.gathering.org/generate_vlc.pl?delivery=%s&stream=${name}&interlaced=%s"; + my $multicast = $streams{$name}->{has_multicast} ? "multicast" : "unicast"; + $multicast = "unicast" if (defined $force_unicast && $force_unicast == 1 || not $is_local); - if ($streams{$name}->{external}) { - $title_link = $streams{$name}->{url}; - } else { - $title_link = sprintf($title_link, $multicast_link, $streams{$name}->{interlaced}); - } - my %hash = ( - 'title_link' => $title_link, - 'title' => $streams{$name}->{title}, - 'quality' => $streams{$name}->{quality}, - 'type' => $streams{$name}->{type}, - ); - if ($multicast_link eq "multicast") { - $hash{'is_multicast'} .= 1; - my $unicast_link = $title_link; - $unicast_link=~s/multicast/unicast/g; - $hash{'unicast_link'} .= $unicast_link; - } - $hash{'description'} .= $streams{$name}->{description} if exists($streams{$name}->{description}); - push(@s, \%hash); + my $vlc_link = sprintf($vlc_url, $multicast, $streams{$name}->{interlaced}); + my $href_link = '<a class="stream-link-content" href="#" onclick="swapVideo(\'' . $name . '\');">'; + my %hash = ( + 'href' => $href_link, + 'title' => $streams{$name}->{title}, + 'quality' => $streams{$name}->{quality}, + 'type' => $streams{$name}->{type}, + 'vlc_link' => $vlc_link, + ); + push(@s, \%hash); + } } return @s; } diff --git a/web/stream.gathering.org/embed.tmpl b/web/stream.gathering.org/embed.tmpl index 6b9581b..ef3e11b 100644 --- a/web/stream.gathering.org/embed.tmpl +++ b/web/stream.gathering.org/embed.tmpl @@ -1,39 +1,53 @@ -<html> -<head> - <title>The Gathering <TMPL_VAR NAME=TG_FULL> Streams</title> - <link rel="stylesheet" type="text/css" href="pre-tg15/style.css" media="all"> - <script type="text/javascript" src="pre-tg15/jwplayer.js"></script> -</head> -<body> - <div id="innhold"> - <TMPL_UNLESS NAME=NOHEADER> - <h1>The Gathering <TMPL_VAR NAME=TG_FULL> Streams</h1> - <embed type="application/x-shockwave-flash" src="pre-tg15/player.swf" - width="800" height="450" style="undefined" id="mplf" name="mplf" quality="high" - allowfullscreen="true" allowscriptaccess="always" wmode="opaque" - stretching="exactfit" - flashvars="stretching=exactfit&file=http://wat.gathering.org:9094/southcam.flv&autostart=true"></embed> - <p> </p> - </TMPL_UNLESS> - - <TMPL_LOOP NAME="STREAMS"> - <div class="stream-link"> - <div class="stream-icon"><img src="img/icon_<TMPL_VAR NAME=QUALITY>.png" /> <img src="img/icon_<TMPL_VAR NAME=TYPE>.png" /> <TMPL_IF NAME=LOCATION><img src="img/icon_<TMPL_VAR NAME=LOCATION>.png"></TMPL_IF></div> - <div class="stream-link-content"> - <a href="<TMPL_VAR NAME=TITLE_LINK>"><TMPL_VAR NAME=TITLE></a><br> - Source: <TMPL_VAR NAME=SOURCE><br> - Delivery: <TMPL_VAR NAME=delivery> <TMPL_IF NAME=IS_MULTICAST>(<a href='<TMPL_VAR NAME=UNICAST_LINK>'>problems? try unicast vlc link here</a>)</TMPL_IF> - - </div> - </div> - </TMPL_LOOP> - </div> - - - <p>Problems with the non game streams? The easiest way to get a hold of us is on IRC (EFNet); Either of ViD or DoXiD should be available if there's too much traffic on #tg to be heard.</p> - <p><a target="_blank" href="http://stream.tg<TMPL_VAR NAME="TG">.gathering.org">http://stream.tg<TMPL_VAR NAME="TG">.gathering.org</a></p> - -</body> -</html> - - +<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>The Gathering <TMPL_VAR NAME=TG_FULL> Streams</title>
+ <script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
+ <link href="//vjs.zencdn.net/5.8/video-js.min.css" rel="stylesheet">
+ <script type="text/javascript" src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"></script>
+ <link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Droid+Sans" />
+ <style>
+
+body {
+ margin: 0;
+}
+
+.video-js {
+ padding-bottom: 55%; /* video dimensions - height/width */
+ height: 100%;
+ width: 100%;
+}
+ </style>
+</head>
+<body>
+<div class="losvideos">
+ <TMPL_UNLESS NAME=NOHEADER>
+ <video id="stream" class="videoframe video-js vjs-default-skin" controls preload="auto" poster="/resources/images/loading.png" data-setup='{ "autoplay" : true }'>
+ <TMPL_IF NAME=VIDEO_URL_MP4><source src="<TMPL_VAR NAME=VIDEO_URL_MP4>" id="videodata" type="video/mp4"></TMPL_IF>
+ <source src="<TMPL_VAR NAME=VIDEO_URL_MAIN>" id="videodata" type="video/flv">
+ <source src="<TMPL_VAR NAME=VIDEO_URL_FALLBACK>" id="videodata" type="application/x-mpegURL">
+ <p class="vjs-no-js">
+ To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
+ </p>
+ </video>
+ </TMPL_UNLESS>
+</div>
+<script src="//vjs.zencdn.net/5.8/video.js"></script>
+<script src="./resources/js/videojs-contrib-hls.js"></script>
+<script>
+
+var techOrder = ["html5", "flash"];
+if (navigator.userAgent.match(/Trident|Edge/)) {
+ techOrder = ["flash", "html5"];
+}
+
+var player = videojs('stream', {
+ techOrder: techOrder
+});
+player.play();
+</script>
+</body>
+</html>
+
+
diff --git a/web/stream.gathering.org/event.vlc b/web/stream.gathering.org/event.vlc deleted file mode 100644 index a1c2780..0000000 --- a/web/stream.gathering.org/event.vlc +++ /dev/null @@ -1,3 +0,0 @@ -#EXTM3U -#EXTINF:-1,TG15 Unicasted Event HD (720p50 H.264) 6Mbit/s -http://cubemap.tg15.gathering.org/event.ts diff --git a/web/stream.gathering.org/generate_vlc.pl b/web/stream.gathering.org/generate_vlc.pl index 178973d..5252ec4 100755 --- a/web/stream.gathering.org/generate_vlc.pl +++ b/web/stream.gathering.org/generate_vlc.pl @@ -51,8 +51,8 @@ if (exists($streams{$stream})) { } else {
#$port_del = 80;
$extinf .= "Unicasted";
- $url = $base_url;
- $url_path = $streams{$stream}->{url};
+ $url = $base_url;
+ $url_path = $streams{$stream}->{main_url};
if($streams{$stream}->{ts_enabled} eq 1) {
$url_path =~ s/.flv/.ts/;
}
diff --git a/web/stream.gathering.org/index.pl b/web/stream.gathering.org/index.pl index cc83454..9edcc20 100755 --- a/web/stream.gathering.org/index.pl +++ b/web/stream.gathering.org/index.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl -I /root/tgmanage/web/stream.gathering.org/streamlib +#!/usr/bin/perl -I /root/tgmanage/web/stream.gathering.org/streamlib/ use warnings; use strict; use CGI; @@ -11,15 +11,20 @@ use HTML::Template; # apt-get install libhtml-template-perl use stream; use stream::config; -use MIME::Base64; +#use MIME::Base64; +use URI::Escape; my $client = CGI->new; - +my $video_url_mp4; my $v4net = $stream::config::v4net; my $v6net = $stream::config::v6net; my $tg = $stream::config::tg; my $tg_full = $stream::config::tg_full; my $video_url = $stream::config::video_url; +my $video_url_fallback = $stream::config::video_url_fallback; +if($stream::config::video_url_mp4) { +$video_url_mp4 = $stream::config::video_url_mp4; +} my %streams = %stream::config::streams; my $force_unicast = $client->param('forceunicast'); @@ -47,16 +52,30 @@ $template->param(STREAMS => \@streams); $template->param(CAMSTREAMS => \@camstreams); $template->param(NOHEADER => $no_header); if(exists $input{url}) { - my $decodedUrl = decode_base64($input{url}); - # Check against XS-scripting: - if (index($decodedUrl, 'cubemap.tg15.gathering.org/') != -1) { - $template->param(VIDEO_URL => $decodedUrl); - } else { - $template->param(VIDEO_URL => $video_url); + my $url = uri_unescape($input{url}); + + if ($url ~~ %streams) { + $template->param(VIDEO_URL_MAIN => $streams{$url}->{main_url}); + $template->param(VIDEO_URL_FALLBACK => $streams{$url}->{fallback_url}); + if($streams{$url}->{mp4_url}) { + $template->param(VIDEO_URL_MP4 => $streams{$url}->{mp4_url}); + } } + # Check against XS-scripting: + #if (index($decodedUrl, 'cubemap.tg16.gathering.org/') != -1) { + # $template->param(VIDEO_URL => $decodedUrl); + #} elsif (index($decodedUrl, 'stream.tg16.gathering.org/') != -1) { + # $template->param(VIDEO_URL => $decodedUrl); + #} else { + # $template->param(VIDEO_URL => $video_url); + #} $template->param(VIDEO_AUTO_PLAY => 'true'); } else { - $template->param(VIDEO_URL => $video_url); + $template->param(VIDEO_URL_MAIN => $video_url); + $template->param(VIDEO_URL_FALLBACK => $video_url_fallback); + if($video_url_mp4) { + $template->param(VIDEO_URL_MP4 => $video_url_mp4); + } $template->param(VIDEO_AUTO_PLAY => 'false'); } print $template->output(); @@ -71,7 +90,7 @@ sub loop_webcams() { $multicast = "unicast" if (defined $force_unicast && $force_unicast == 1 || not $is_local); my $vlc_link = sprintf($vlc_url, $multicast, $streams{$name}->{interlaced}); - my $href_link = '<a class="stream-link-content" href="#" onclick="swapVideo(\'' . $streams{$name}->{url} . '\');">'; + my $href_link = '<a class="stream-link-content" href="#" onclick="swapVideo(\'' . $name . '\');">'; my %hash = ( 'href' => $href_link, diff --git a/web/stream.gathering.org/index.tmpl b/web/stream.gathering.org/index.tmpl index e1e6a2f..eca7070 100644 --- a/web/stream.gathering.org/index.tmpl +++ b/web/stream.gathering.org/index.tmpl @@ -6,15 +6,14 @@ <!-- Mobile specific
---------------------->
- <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="viewport" content="width=device-width, initial-scale=0.35">
<!-- CSS specifics
-------------------->
- <link rel="stylesheet" href="/resources/css/normalize.css">
- <link rel="stylesheet" href="/resources/css/skeleton.css">
- <link rel="stylesheet" href="/resources/css/core.css">
- <link rel="stylesheet" href="/resources/css/button-styles.css">
- <link rel="stylesheet" href="/resources/css/video-js.css">
+ <link rel="stylesheet" href="./resources/css/normalize.css">
+ <link rel="stylesheet" href="./resources/css/skeleton.css">
+ <link rel="stylesheet" href="./resources/css/core.css">
+ <link rel="stylesheet" href="./resources/css/button-styles.css">
<style type="text/css">
.vjs-big-play-button {
@@ -28,14 +27,13 @@ <!-- JavaScript specifics
---------------------------->
- <script type="text/javascript" src="/resources/js/jwplayer.js"></script>
- <script type="text/javascript" src="/resources/js/video.js"></script>
- <script type="text/javascript" src="/resources/js/video-quality-selector.js"></script>
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
+ <link href="//vjs.zencdn.net/5.8/video-js.min.css" rel="stylesheet">
+ <script type="text/javascript" src="//www.gstatic.com/cv/js/sender/v1/cast_sender.js"></script>
<script type="text/javascript">
function swapVideo (url) {
- window.location = '/?url=' + window.btoa(url);
+ window.location = '/?url=' + encodeURIComponent(url);//window.btoa(url);
}
var _float = true;
@@ -78,7 +76,7 @@ right: 0px;
width: 531px;
height: 396px;
- background-image: url('/resources/images/pixel-white.png');
+ //background-image: url('/resources/images/floater.svg');
background-size: cover;
}
@@ -94,26 +92,21 @@ }
</style>
+<!-- creative, event och game -->
</head>
<body>
<div id="header">
- <h1>The Gathering <TMPL_VAR NAME=TG_FULL> Streams</h1>
- </div>
- <div id="floater">
-
- </div>
- <div id="bubble">
- <div class="bubble">
- If you hate me, click me!
- </div>
+ <img src="resources/images/thegathering.png" width="400">
</div>
<div class="section">
<div class="container">
<div class="row">
<div class="twelve columns">
<TMPL_UNLESS NAME=NOHEADER>
- <video id="stream" class="videoframe video-js vjs-default-skin" controls preload="auto" poster="/resources/images/loading.png" data-setup='{ "autoplay": <TMPL_VAR NAME=VIDEO_AUTO_PLAY>, "plugins" : { "resolutionSelector" : { "default_res" : "720", "force_typesz" : [ "video/flv" ] } } }'>
- <source src="<TMPL_VAR NAME=VIDEO_URL>" id="videodata" type="video/flv" data-res="720">
+ <video id="stream" class="videoframe video-js vjs-default-skin" controls preload="auto" poster="/resources/images/loading.png" data-setup='{ "autoplay" : <TMPL_VAR NAME=VIDEO_AUTO_PLAY>, "techOrder": ["flash", "html5"]}'>
+ <source src="<TMPL_VAR NAME=VIDEO_URL_MAIN>" id="videodata" type="video/flv" data-res="720">
+ <TMPL_IF NAME=VIDEO_URL_MP4><source src="<TMPL_VAR NAME=VIDEO_URL_MP4>" id="videodata" type="video/mp4" data-res="720"></TMPL_IF>
+ <source src="<TMPL_VAR NAME=VIDEO_URL_FALLBACK>" id="videodata" type="application/x-mpegURL" data-res="720">
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
</p>
@@ -158,6 +151,80 @@ </div>
</div>
+
+<script src="//vjs.zencdn.net/5.8/video.js"></script>
+<script src="./resources/js/videojs-contrib-hls.js"></script>
+<script>
+
+// GOOGLE CAST
+
+var current_media;
+var session;
+
+function show_castposter() {
+ stop_loader();
+ castposter.style.display = 'block';
+ loader.style.display = 'none';
+ video.style.display = 'none';
+}
+
+function hide_castposter() {
+ castposter.style.display = 'none';
+ loader.style.display = 'none';
+ video.style.display = 'inline';
+}
+
+function stop_casting() {
+ hide_castposter();
+ if (current_media) {
+ var media = current_media;
+ current_media = null;
+ media.stop();
+ }
+ if (session) {
+ session.stop();
+ session = null;
+ }
+}
+
+function cast_current_video() {
+ if (session === undefined || selected_stream === undefined) {
+ return;
+ }
+ var title = streams[selected_stream].name;
+ var url = streams[selected_stream].url;
+ document.getElementById('casttarget').textContent = session.receiver.friendlyName;
+ show_castposter();
+ video.pause();
+ // If we are already casting this, do nothing.
+ if (current_media && current_media.media.contentId === url) {
+ console.log("Already casting " + url + " to " + session.receiver.friendlyName + " (" + current_media.playerState + ")");
+ return;
+ }
+ if (current_media) {
+ current_media = null; // Signal to on_media_status_update.
+ }
+ var media_info = new chrome.cast.media.MediaInfo(url, "video/mp4");
+ media_info.metadata = new chrome.cast.media.GenericMediaMetadata();
+ media_info.metadata.title = global_title; // + ': ' + title;
+ var request = new chrome.cast.media.LoadRequest(media_info);
+ session.loadMedia(request,
+ on_media_discovered.bind(this, 'loadMedia'),
+ on_media_error);
+}
+
+var techOrder = ["html5", "flash"];
+if (navigator.userAgent.match(/Trident|Edge|OPR/)) {
+ console.log("hit!");
+ techOrder = ["flash", "html5"];
+ //var video = document.getElementById('video');
+ //video.src = "http://bleh";
+}
+var player = videojs('stream', {
+ techOrder: techOrder
+});
+player.play();
+</script>
</body>
</html>
diff --git a/web/stream.gathering.org/noccam.vlc b/web/stream.gathering.org/noccam.vlc deleted file mode 100644 index e1bbf42..0000000 --- a/web/stream.gathering.org/noccam.vlc +++ /dev/null @@ -1,3 +0,0 @@ -#EXTM3U -#EXTINF:-1,TG15 Unicasted NOC Webcam HD (720p H.264) 3Mbit/s -http://cubemap.tg15.gathering.org/noccam.flv diff --git a/web/stream.gathering.org/resources/css/core.css b/web/stream.gathering.org/resources/css/core.css index 536cb89..e4bc7c2 100644 --- a/web/stream.gathering.org/resources/css/core.css +++ b/web/stream.gathering.org/resources/css/core.css @@ -1,5 +1,5 @@ body { - background-color: rgb(32, 32, 64); + background-color: rgb(54, 54, 54); color: #FFFFFF; } @@ -65,9 +65,9 @@ body { padding-top: 150px; } -.videoframe { - left: 50%; -} +/*.videoframe {*/ +/* left: 50%;*/ +/*}*/ .section { padding: 8rem 0 7rem; @@ -100,6 +100,10 @@ body { border: 1px solid #000000; } +.vjs-poster { + background-size: cover !important; +} + .footer { text-align: center; padding-top: 50px; @@ -164,11 +168,11 @@ body { min-width: 320px; min-height: 183px; } - .videoframe { + /*.videoframe { margin-left: -160px; - } - .videoframe:-webkit-full-screen { margin-left: 0px; } - .videoframe:-moz-full-screen { margin-left: 0px; } + }*/ + /*.videoframe:-webkit-full-screen { margin-left: 0px; } + .videoframe:-moz-full-screen { margin-left: 0px; }*/ } /* Bigger than 920 */ @@ -188,11 +192,13 @@ body { min-width: 500px; min-height: 280px; } + /* .videoframe { - margin-left: -250px; + margin-left: -490px; } .videoframe:-webkit-full-screen { margin-left: 0px; } .videoframe:-moz-full-screen { margin-left: 0px; } +*/ } /* Bigger than 1200 */ @@ -210,11 +216,13 @@ body { min-width: 700px; min-height: 393px; } +/* .videoframe { margin-left: -350px; } .videoframe:-webkit-full-screen { margin-left: 0px; } .videoframe:-moz-full-screen { margin-left: 0px; } +*/ } /* Bigger than 1600 */ @@ -234,9 +242,11 @@ body { height: 540px; min-height: 540px; } +/* .videoframe { margin-left: -480px; } .videoframe:-webkit-full-screen { margin-left: 0px; } .videoframe:-moz-full-screen { margin-left: 0px; } -}
\ No newline at end of file +*/ +} 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[
+ eJzsveuOJLmVJvgE9g6+PxqQBlPexjtN21gg3D1Co55SSyipu7VoNBKprFApR3kpZGZJq336/b5z +SLuQ5hFRWdfZriCqMsJJp9F4OTzX7/zD//Hb331y8/nbP95/4o7jYfiHfzi/u3/+4e27Xxzk08Ov +Xr366v2Hd/zoZ5/9/GDScUSjm1/lZ6Xhv92/e//y7ZtfHMx0NFJ5x2//7LO3fz/828svvnh7+PT5 +u/f3b35++NnPUfn7lx9e3aP6wxcmPnv19ou3x/d//eLn9bno6PL8A+rHeDT2aEcTDuN4NIYNnr/5 +6/P371/+v6g20WWHz05vv3rz+cs3X5ze/j/4zuGTPB38aA4cxf94+dn9+64+H4P30fjorJksGo/H +cTTJj3lKKVv55uXti69e37/58Nt3b1/cv39/fvvq7bv3vzic//78zeHXz79AzfPD/33/6tXbvx1O +r56/+MuA6QjP7l6+usebv37+4WAc5+HmV8Y+O3318tXn//LV6z/eY07sxE/dM+nxX9+jK/TK3/lx +evar1/jkd/cfPmDAeB6H8tkvT+tR8B1YfvYfn91/8VKWBTP2nz8v3b57++Xr5+/+8l5edRr5dodR +635///rLV5hZmQg7hmM4fOIT/r/6vbTEe0irT+zoDp8461Ef8niwztc2ywzd//Xl/d9+cfiXt2/u +dRpu3n34nS6R5+Pl/1rz2Vev7t/965uXHzC+yI8mnYhfv/38/hXaz9+/e/Vc3l+KWf6vDX7//N0X +9x+wtm9fffVBNl6uT8A8f/r87/dcLOnNpGcnzNMbPOfNBwz32cs/PfurbtdnX3z4hUnabHr2my/v +3/z+7b/Jq3xiDHo8YGZMzAdjszvYKIPw8WDMOI/LLP8vD7t59eH+3RvMcn3gt9r77ZvPn5XDdv/5 ++glBnsD+69snbJ3fYjP95t1LvP4vPjETltj5pPvsl+9efr5ss2QPWf8nk3zEbPLH4HiMk52e+skk +PymakI23T/lEJweL/QEvUlfMPjv/enUExuOvf4d3wauf377mjnvPQ881xbEA9dC6+Xepwde/+lLn +RVcfm/O3716+YZ/Dv0hNfvbbV1+h6pfv3n715a/e/Ont8DOldr/lYN69+c0b/PLnw+ndV+//fPj9 +27evQLw2DUqV9sLKdx/0O/I5v3F8/vLLn/9onjV/Z+85qPzf5Rnn569evfzi3fMv//zyxd5jdurn +563rvsYjsUHf3S+9yJ/138e//bsXsoh7Y91WzQ8oH3+NEX4fz/i3+xe460HYPz/85o//C3+gF7mv +Dr9/9/wFThb+nts8Ye+DTH2J5i//Wqf2IG2WvX+9warqyYfscPv5S4ztyrMebPO7vz3/8OLPn778 +4/vHn/bpyzfdcOWz5+8+/O3tu79w0j6/f76wCk9Y3L/c4/HdoPTTj+9Wz+mr+zefv5/nQf9cdsmn +mGH97AnD/PvrP7599fL962XrrT75LQb68sWr+9/9/f2H+9eP93a5/xPeY0Uq5NPbN3+9f/X2y9Vh +1HZPeNtXz988f9cs+6eyt57jYlg6ZMP7D394qEfO3J9evvkcp+p3X738cL/QnrevvyS7efjdn59/ +eS9vXVv+bu4wyDW+upE++WSwh9Ob1X31y3fPP3+Jqw5M8r++efP8NY7cF+WjQ/z5sPchLm508vnw +H8M4/NNwMqfx5vbmcnO+Od3c3Ew3+SbehBt/Y2/MdDfdTpfphHs4T3EKk8P9Pea7fM6nfJNzTjlm +n102eUy36ZJO6WZI4I1TTCG5ZNMY7+IlnuMp3sQ8/F+DwRPHb/nngQ7LE9OYDAbjksewIoaXMcgb +jPaMMd+muzziDcBd4V0C3ijhzSa84Tlf8m2+m8YJrAve3WMG4pSmPGBCbjAtZ0zO7XR3M94YTJfD +pAU88cE3NB9R7DDaawXP84d/eHZ6x+UE2wTZxGdINQbvEEZfOMPxGH0aQ87WBTt5QwZrHFP2zmCV +gp9Giz1hDvEQ0BycOHoEK/XsW+zx9F7GFyc3eszk6IPJxklPnBc34u/RO+wo+cxjq5kQc7QJLWXL +ls42g/s2usPITpf5uNUD9cQzlvbOWFqdsX8aZHvUDYItgvOFzYdzNt3w54STx3JBuUW5u7k7jTiV +9uRQ/ClIiackJZ+m4YStd7o56c/5dDndsjy283T3QUxD8WMYI0oacZzx32m8jOfxFpvNGmOc8Sai +JDMN5oSxn83F3Jk7bDdrPcoju1z27OpJQZ6Uy5POeNbteDfeoZnB86w8L5g44JHZ4KzJE/nMC5+J +Z5FOlX5iGXcqPWqvWm6knEo5S7mUcivlTgsHOMjZ0h9bCvauvNn5fMa8YlGmM4jAOZ3jOaD4sztb +FHMeT3cot5h6NjxhMW6wJFlWKGK1PIrDChqhrneDLKyS2Epk802SZ93d3d3eXe7O6PDmbrrLd+ku +3oU7f+fuLOZ8vL27vb293J6xwje3022+Tbfx1t+6W3trbsfL3eX2crmcLydsn+mSL2m4xEu4+Iu7 +WEzgeL47354v5/OGThyTj5NxOM5uxK8BB8T4kFO0ODGGR4efWJwenHqTk8mTintoHcYpj3qaKMpF +HnUzRT36noLbPiX5Pp9JWnOMFtvJ++jCOOJKKrIy+pu/SUIV5Ntmj7x8fA+PUpRWyjTx6q3+y7ev +Pr9/c/iMXPOw+QvPS/Ue12KklHXeOaDdxbIqrhRfSihHN5SDh/+G+fytT6GexGlTblZlOYvLadQT +eTfUA6lHci7rH7sqblX8pgQtg/yTCvVKQlCWMm3KjTnN5TyXk5Cd+tdlwB+38pFQwKVsLmEOrv64 +VfGrEmxkGfQfm1YlW7AX5f83q3LSco3Y7q+m26ynX63qsrYow7y8frXIuqotjU1yT0wNpZ1WK4z/ +DzPp1aU+zcus/3KVNwQY/9efcXet7bBZaId19eVe4hpHKVlWOTUrfFPKdm2xlvznVsqlWcX6UCdr +uKwZiy5SXbKpLBYWaChrxLU6l3KRclvKHUs9WXyZ9VrqZVyv4iwTqtfjncyNLRdxkhc7yda8k7Hq +CKNsGQxhkOfyOdY55110yWU3kX1wF3eH1Tbeee+DT+DkJjAhJ3/xt/4OE2mDCz7EkMIUbsBonMNt +uBswIINdCjIdI5imCdz7CVz8Jd4VVloZabLRykRXFroy0BMuuNPMPttBuGf0M1GtR8a5ss2ucETK +DZ2EGwIfJDvJFv5HuB5heM64c++wu8wgs+1wJQdczwkX9Q1u4jNuujtsNiOr4HEPxgsGh2txwgV5 +xlV5By7A4vL0uEQTLtMJl+oJl+tlwC17xx2BexcTgzsY74T7WNgx3M745l3zUxiT+e/bVbmsynlV +TqtysylTLYNwAUtJqxI3JayKXxW3KtiAw50tZUvCFuI7rod+u/65bMpZyyD/nFblZlWmVcmbklYl +rkoYbsNc/Ka4VbGrYlZlXEqd8qH8sh79+ue8KictlRm7a9Zwu3Ltam2XaLssWIphtRrbJdhO/Ha6 +yzQ3cyszOnSTWaZwM3vbGdvM07wty7OGZkZ0Nm5KmaTkUpKUWEooxUtxpdhBzl65MpX0z9tf36s+ +q/6cCrOtZZKSS8HZHoT/1hIKH67FlWILV64FFPTjGetwnbUe5N13WOtZUlA5QaUElRFUQjjN0oHK +BioZjAM20lbxkorqxVH5ghtW1S9nEMwbUcEkUcJ4UcMYUcTcYl1UGTPlPIg+JohGxopO5k60Mmfq +ZUCqc1HMeFHNGFHO3M7qmQmEPoHcB5B9R9Y3jgO28S3W+IyL4QYXRMY1EUPAhQGhH5fHiC1+i9U/ +40K5wcWSccFEXDMe143FpTNi399iV5xxEd3gQsoDbiaw07ijHO4qA17lDjv0guXjLcprlRdtwOXG +i9jY0dwtgss/DaUV29VW0g4HSi/1s4irN7gus3B/QbgGFequPE66kQ7q15cvk+2wC2G4W5F6JQkT +NlXAhjLYTHtbyZY7Qm4f/ugNZORc8hYKcnrrTVTuIl5FuG3ABKg0ivtuvuwidlneue7cfN3xsrvh +A+XLM8fgCg+aKtcgTMOtsA2mMA5hZh1u1tPOWSCfNt5pl/hDmLmL/MnTomelXojzLSr18uby1roM +N8KV3LrNyhZtgJm1AWFmfJSTOwsjfouuTWGy9XUq11y4ZBErimKhqBXmbqQTmQ398u5M6JDXC6WL +tGEWhFNwWPmEHXCSvdBwB3UqQrkAKsVZ05xlqyx0Z015hPboFO9K+mtq9Bgt0qlvTuM3Poynmf2t +ZRFk8kbESUXs0RI2klGRlobyS/1Rhnwjo275l3rHzALazOlLOQ0bwe4sHHQVCvjv1JTclEWI1N/i +UMXMufiuuK7YnVJ+ho2ku6P5HTdM2vzvZbeATgyzpH2e9WCnjTS+LtPVkqvcN6yEfC3xiWURKcO6 +DNs/Z2XD8ntf3JWiCvDruvGmPFHdPjyx4ZN/vk+Dx9fsqNyLZp5R5VIrm30pRTmsqpSoSopcZOGq +xCgnfShicz3eVS2ybP/2NFcOtZ7e9YE96TmuIn1/WtOsAoilhFlBsOiG3PqADo+fTPw2qyUW9VRz +HOuBvAwrpdZayXXaPY6njWqsP5BFmdKez7zRsm014NeO6Pz30J3M9hD2h/LBMnQKw72T+tD5bQ1Z +Kx3kNz7DD53jH/7Yfesd7rGoa+mnl3+UH7lmWLBkNwbwG+Q2piL5xcJv2Fn6uVtxHGnDcdiVBEQD +lUhAA0QgCkEqAlEIGkUCUhloaxupcpArchAlobPYXCkHZVEl+UFEISOH406k4gufUCzTKgtRGrIq +DYk8dCny0EnkoSzyECUiUi4zFKHoTiRcikUqGFE0yiIaUTjyIhwZOUp3IiGdRUKijEQpKeGpbApB +aICg5IQcGlHN3Iq4dKF5iKZAWi59FrEp+SCCE0UnJ5RqFPHprgjWJy0D+DZybuTdkvBvke0df4zw +TwsVJ0+ra7FwacqZZRGgWPwwU+qO61rxWFWTqv+uCfCaRRJ+aFgxQRui2hHODeeyoZEbijhseBKW +hrbtkrUHOIieY3gambhKPr7Nc1ykRS1rNdX6Z6uWW6ka17owEV+kDOUXuyluU7Zqt9CUuClp2Kjy +UqPmyxsV4FQk23U5tWWYdV61XLrS/9z1pe6xYX1TN3rPovrfLW63FE1eX8KVEq+WWZc7bBS7SdTN +D5XpkXIzNArlvXJ6YhHiPmw01w+Vy9PKsPPh3iI+uQxXqz7yp79EP7ajorgZZ/HTFouFlqrCVIVm +VW+mUqr2cyql6EaHoiqtP5U2LMemrkelrFVErpx81dKqztYPojTSEueSSslzmUq5mctph0bhZ+gI +1B5pWlT3+9RoRYeGK0ToGvW5RnVWlOYkOpzrtOYBGrMhKoWwDA/SlB1K8hgJGR6mG08gGQ1pGNZU +4qNJw+q8XyMMTyQD/cm/fo4fLt/TOf5aOtSNFhUs21mVnWKEJZ/lvB/A6cWVLfYESg==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ ro34TU1tjwGiIpojESUOzh+jWXDoHmix/X5Cr8FiVOPR2SntfL9tMX8/pR2Pg/XH39DpwO47HVg6 +HbjqdDAjJN427tyXxq37apH78ubSlfPXK9pN67rNn4csPp1tSuPjF6easbjYX2bf+j6dXO5jk6oq +c50aM60c6NbZZNeZZJvyo+tmgVc6z2ili5at7AVdiu36bNZWG+z5YRRPjIo4NKcAK5m35lxjFVxm +gUPKKyCkCoP0TRusyaiLOTkHSjKNCnLG2GeTJl7w4HiEYsXRh2j9aFIymk7ZGzelNNoofIpEnrYp +nx//5Eoa6h/LiDSCOWDWJqqXPZrJsxM4RhuCzcZ7iQWPeCzDjb3LEVwefWFHE/1owa6CQkdTvHWL +n67DNZEzn7K883f5FH2PH8Os/thW+RteJbsXif36/sa3xQd2Jxve7GtcXF+H6qr7mK9t6nxt9xyE +Gw9n5eCYifmB3vffYt/xePM+Q32lj3G7fdQlFHdTjVX5tuNh5AlDjYZ5qPev4dK67X+OttlS57xy +ttwQybbiO/fVdHt73W32evEWtA0a+BpGTa/W2xkCfAEAD6vUmYpheBokg4KEk65CSReY7zjDe9+U +GFHdt2Jk1Fh3K4J6EKE9FYesSUyOpxLIflscKxbnLLeKUacZMg9RA9FpiGG8+W2JLXfFKzSIOXId +A1wxELnLZ/ymFsFpjeFkxYViFMeKiuO0RnJaBS8N16KX5rxJNXgp1+Clb8sFe/+0Pd0Fu9nb3wX6 +yPaQfFdPkBuVfY9YfweSlyZKbfjN4Wk5G6yVC3PvcY34Mvo1WPBqtN9Sf9/slOfdY5434LMzwmLF +WFznCagux4U3lq3X5SSoLtCLM9DsBq1fuJ09p8eVe9Hy1fpl/MgXNjil5+JN4OT4nor/gCvnVJ9w +JUPyPjrZ9/GFRQDhPKyjgls0rj08LrODx1WwuIY5tLLKhTW4twb06n25afI1ALtKKO9lQ+dA6YaS +CK7G19YoTbtEaepzl2eE3SfZB6DB5qctdHVoIkJt2UDjTF51fUQbbUGYbiX93SR579zJYA6php4w +Jo9nj5LXbhLVs0MXt3gnAYMC4aWOGdwoNpZLZpCkdCfsOBAQ7D0DboDxnTeSbI6bQVMX7/N1T8j7 +/Hg4U8lW0uYq8f8FnzsfpxVU7JzxZI6tqD6A18jZlqBJ0MSwAdhY4iPWIRDrAId1nMIcG6BEzm0c +t3cyuTxAN1vKSZS8JX5kFTyyHz4S51dNG9dldXZdYfOGDXbJMr5rBLol0bPvuC7B2p9zcd1cXDT7 +MJfFvVuQqsPa0azBrBYPsys3QejuArqP3Q7iNxbEX+wsfmJOfMPoEnYrbmBenL7o6EW/Lie+W5O4 +ZNHVij5SOrKCCV6NRz0s5j4o5g4kpiYBH75JFvCCvH36aWQfNbIVk8rsGlYSWtqowH+RcGsYoQvg +vSzZtAi2Da0wmpwg/EpKAFRntPH04KZi3jYwck/5ZIEGzGAFV0lqflyjUmbYjyC9eFp2I84oA7+j +geA/juBeg7LUWE4biVA3ckxGGNyEO8FbjAmDZECi22TssE/6ZB5RtMeJr7rM049pVKqG+0ENRHVE +5ki+5cditmpGpftpJKQ02OPRZC/5bkjYjZVzjbXTTyCegXCDZAdm68FeHWO2Y0o4DBmblqvSJcB5 +/JNd4ezHMZ5vJNz5PdnOb6xeAhRHvLJckn/cSeKPeiky7cddgSLjtazg+sob3RZmyBXVD9mdaSha +n8us9TFnzVrhS9aKdd6KOdXbOtPbKk0mCPiwzY/ZpMbcpsVcx5BsU2KukmOuIWwfzuL7tHI3fL0k +i4+XH75D1QYrxPs2dpKaXup3hccv3H3l7E8zdJ8THMwkYPvnwrgJboRybuTjC0zfnKfCFzzKqq47 +C3dwV6IErCjq/AwgKbECw6ykU9C3sQD1WVHT0YmmQk3mguq4RDsuzvgrY2cDv5hNV9yVEnaLH7Lf +LfFjy/DxX/2WOtStseBMVvDNmsJFM4BXKNdU/ptWn9cUADQruJo9wIqxcg32v/4//10nTxhXaRTW +QTBPipX5qJ+fOnzCF0pypRGn8QwBLuOw+khe61bY/AnHmwy+FeaerD0Ze7L1ZOpVM6ZpAdb8vHi7 +XWPnVwz9zNJfitfWTclOohlMljREbihZUkoylZqRZc5KtOS9nzPeb9Ld1y0/Y+AOV/Pcu65cxZla +l6HLZ7Ut3/1afusdqgruLLaCJHYCu3EMzQWgReFZZmyWh5NlDXNiqLhVNm7sKqcVJFy1q1RYuLVp +xeRxKPaVu4IgeilWlnOxtJzmuPF6kSwQwcvPCuN4aJCGfVfclWL3y3ClwnxsGT7+q99Sh+qptFii +1raoao0ynf9S9V7KMyLoGg0UfKPdAIEuyTeeggG6RQEVrMMa9ubmso6c23qNNkF4u+m7b4drEX2d +59nTynl43EXt65UfvsO1YvcH54q/iw4flC2GKxX7yWz6rBzr7BwiFQ27qW1ih6e7xdQ13UGqx+g0 +nGuivFwswHFOobSkySuJk3bAuExD7SV5DMm9E0vMXQkEUFuMw21+h2GfhJJH0G6b9V75wbnib9Lh +vojgr8gUReIYOhGkE1YaDPm1U+ci/cwS0TAD39e7S3Hz9XZRfkfRtc8lkOIkUlgq0KdeWD0rjBb9 +Yi6DcH3nAnOaShCFgJoWLFOqdjVogopdqnVHiYw4Q2pU/k+1ucr8nYaZ7xOOr/B55O/I1ZGNI/N2 +I7IG+TD3vUfh/9Rh97OVzwpIwTD/UXO62Ubg2wqC1RXNzSnitpLmNKxEzdyImmkjpJZSRJVvODHd +z/fS4cOiwbU0uKUMu6kG21yBa3FmlnK6WRSpaCh+1+t0LeeV1/Xd7CZoZthPV5JNxhX4Z0ErVfjP +aj1e248fsiD30KsL8KqkTplma+EWA/AsKF1WNEtMQyL5bTU78g/NFX+TDq/IDldKkTiGTgTphZWt +MLOSc/ZSpwxLppRSTgWRaEmIcrvCJhpnfKIHEIquWc3XNvO4SRp7XiWMtWJsDjeaKPZm2KiybVFk +Z7H3nkV/bcTiGzBg6qvVlegH54q/iw4flC2GKxXXBZjbPZlnkYiGVd6RpawFqkXMqngiiywWixkh +LYlJhiLE3ayyk5w3loWtbaHmJ1lcS2MxJRTjwVA9TLu8614DNzY518+3l8bXMYEieZCnQFaVhiDQ +Lw/WB/weDouxiydiZ4BNy580CxVzUMpHWtEOyR9NSCub53f/KDHQhdFO2Y2Ts5KynV72xtJqmBP4 +rejpbQlqbEKeiB00Gqe5x7xbJcDjMwU6fNd2atzBpyOuguXlvtenaia+b306czpYf0yb9/pOn/KN +jIZhz2gYNn7fu35d7b38ZHhu71sPr9bHy6zymBMjb4U7XhMt19xy9f9LguBteuWFlXTt38OGBVpn +Rm6ZITKWYCrnvPfVQ/rrO0gXsbhBqB5OS6qMIhc/ogcVf+91Zp67VaLSPjXPtEoyuk3O4+fkPHa4 +mp9n0TTcrNRwZKrNFkkb9/gUcyaHFeWkWhzbHHBIJ+dzzcoYx+6wrjMIGLv2d26Qsr+jJ2iOR0Zj +cbENfeql95GJDrjpjZMcCJpdsYs/mhpf8n3/7++o/292+nfDPsJPcR8/xX38FPfx/6O4jzjtnXN8 +2sUymifEMl7PnlIk+W9ZFTffvE/a609KMlGPzpIYb0mNdypI+TU9Xp7T4y0J8mpa8ppsvLkLvxNa +vzkD39kTNMNQl31os6ev1X+jPZp2WdEUHoq3vRqr+kCOn028wn4g7MITxr0jsOq+arjCJsz2anTt +0mFuImvbHDndaPeDaq8T/Oskf3MUrt8hT71FHjhdT7uYnpQRps0kb3C14qZMmPjoi3Mq9vmofiRu +ooxl7Bhxy2I6qaey5Ty0N0J/Qq7mBG9O4A80gm87Fvjf//zyw/1/P5xePX/xFxzBzZ/fR26tXsX7 +kdm1hg5YvaZlqLDqa0j1y5zsd5uToWKpn+kheFtg1O0qZmYbz3M9Dcw6CcxpieH5JiFK51VmF4lR +Gj4+SKmUGeq4AhK3KsJGw/ddZi3rrAAfnbdsUFXDlZ1SMapDSRStm2XB4a9Cw4LFD2FhkjClKi7c +lnTkT8jn0eDwFw33Q9rtp8WE9UmFPjYqbAtisyQVasGKLjtwOE/aCh+RD278tjLCDTsbYRNOKLbq +9UZYZwyv22CVlOGhrfBYYoZtWoZi8hjyNwvCazfFZfj4MLzVFlltlOFK+qkt8NG3x/EXvv/763DP +iro2la6t0CvqNuwQtx2ZaBdhf4uvX4Ieh28Y9Zg07nEJexw+Pu6xWMFOqq4RRY27+AFnYwtwdbsD +cfXdJAT8OHXrbkrA4esoXGe/0+p1WgFKLwtE6VAUOYJSOoOUXp4EU7oFKS0Rk8M3C5lU5IHiYS0x +k8PHB02KdzV9b2LxqqZDNY7TXQNElnawyn7aCj9thZ+2wk9b4RpA4bcOjdcBDn5XT/iuVGX44Nm/ +vH3z23cv33x4+eaLTz5Zye3riuFfvmSN05rfPv/w4f7dGwj0N6/+/v79c4jy5ZfDNB2n6Dwt/T5G +d7DeH2lkZ+CNw/Y8WBOP2J/YyAFsip9k5Dfy/z/8Tf+4xz9fya91Lv7wd/nzn/Hr/8KHf8OcHH59 ++I//HA+f6zc/wz/10e0TDq9R+eg4Dp/utaqv8emq/73Pdnt7g//+8ebdh8vLFx9evn3z/N3fD78Q +7ck/nt6+fYXJ+1WZyGe3n7/88Pbds9PzF3/BZD/7/ctX988+u3/x4eeH/44v/J/4r50Z+fW/fSXd +XeST38gOtEzxC16PLFlwVpS1BqfVOvo6W0n6SzcFHLZIOSakWCBx2+TquUvx61e6XJvC4Q/P5fGb +RXLGHEewixPD3kEsDiEfHQQWXQRMl4VYM0FixrQdwnSMYBgPoGdHPMJPEIAMJvEQEnPAY1ozvp0t +aEMyNLqGcDRYm8MLdpbDEZQqoW4CQ4wv2WMM7C27o8cXQFD8ONp08NMREg/T2sejAW3CN0BI/MG7 +I+iNLb1NR+rTMIQJ8+IPDm2TDCGVsSXsizHjgyNmiP+OxzBh+Bi98XhDm46YO6PdJX+EeAZiPULg +MulgIyEOMLiIwYw+THjRiJk4OKuvxAr6bKBiCh6jcpgcSATaHSoNvoCtObIXbNNscLhiOoJVx1Oo +gsiG7ib4vkWFw3YMaA+WHyIBK7D2ZeLieOTkTJgKvCzmIR6ZNvBgsR5mAsWCSGDp7+LN0XEuum+4 +cPS1M3OELID3IZY+Nk6dBRsDYUMVPXTkkOLRSwS45WVzMAF7NcbSSTxOxqETG7Bu4cBxmDzJe+BB +eET2HpMY3JHkdMJEYYoEUwK0s3SCSZGFchSI0nT4xBxxWXDdXT5ia1MyydhV2BBYQQwEFRgsNveE +fQLC60BWSMKD9ocdELlbPOm1CQeTymx4kOyJr4yFzxwldq8P8rlPskEctnjphARiVA==
+ ]]>
+ <![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[
+ 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
+ ]]>
+ <![CDATA[
+ +DdOEHCDnygNUNyLpZL6+EhJikhnqG99tCe+rlMxey4eiRSk7uhsW3L8s+fzxl4vZzwh9X7VpLvX +HA/mGpc1Mgs4Q6QgTzDma/maWU6NPM27OQEXuvGwP+8UYsFK8GFhC8rhxtyxBSwnTlBqXKvilucE +d77dFSUQlYnzLSTNok/LSvSHSv6UlI1EBQfGOvhtNOcmndnjOe8Y9ZlSXHGifj3q07O+zjserQXh +BfK8uXPdScQ8bSv2S9skgGxMEq7C/6eEvvKBJT9cJ32m8RzL08F1TPhPfXMBb8gXkc9mZbWceWI/ +jSJvxbvJRDMF/xfneK2n706VhT7agwKYSXHuD1JJOIQcjD2wauAQnAaj8QVkaM/wEnshTxAlB5pD +vYfGnvNqJm6/phTg5rXzI8vKIaiJhwo9I8QFDPLMq/qI8wSvLVuCSSU7v/OyYjsPbOT5dEXNSjRJ +kDXUvJL9Hdwv/dhzBRm7bOdS8wTzeiaPCKhpfBayYF59lVMefWOrwYqxH5iMFsCffvys4rmpyBpR +v99twhTR+7T3s7yxr84/7/nnuYyGSOYrFsi/jkx97n/cGLlvvZg7G/f/R9hXgEeRbG0PgeDuLJZl +8UUio2s4LEFiM+09SQhREuLu7u6uQCDBXRbfxd0lCe6yfu27f/46Nd092bt7v+/hmSeh0lPdXXXq +nPc959QpcxF44LIrYgdwLquoEjXio6otRSSgEJWyRtyVAlMoRdkU5mLGmlJtKFwoNKrEsbIUomwK +c0N1UEMHkg8JnxAsLlClUG8EGq2kRkEpK3AFCtEsSO5UBTinRRlQCtZKYS5uZhAdGmKz4NXvApNw +B5IJEbIdIDNMLuodXMZRel256LswF5xuCiGA9AdEBr2K+NVK5JUKYYegoAs0xoERPYFyQf9DFptK +BBKW5mK2FzRLaAjvIF0pNCuspHUrpMkqLCS3I9AigyAppC0SeMJFpz5URDeKh0okAoquiSDgCzK0 +4d1S4shYCI1GTCltV8TNSgnNwKHHhkaNVHIIBHX2/1p6QmkuGVypdoXCQjQ1+MAxoVHqQCMRedSs +lovPpbIUKZxCLpWFgrPmDC58hVyM4nYh/XDMkeTcww6VRUIHKisLaT0aguuQZ2ks4yAoKTjlVaqJ +gQ2u1IFaXA0qCyEDV24460VYucKMycUdFkpDQR/D9xWSt8tYn0sh7dHGUFcj5pT+l0IU+IA3w4AJ +AS6831900VqoFWIHQiqKUlA3YgeingTVp5YSYFVK6QnQ09ID/rKL2TiD1lwhOmktBdMM1Qk0IlGV +G8dbKSZCY0FSium+llJgQK5Uiem+f1ncQt3Fa4nLCxsa5VIClrk4YQAJVJJtlxKO1V18J2LIG18r +Vc9SW4kdCJlW4q0MHWi61GGB41CFa41hbDhf2MxwpVzy8RpzihQaqZaHsW4V9CrVkcL+I0OjlRSN +M1dZGrO+5YZ8RKyBrcQORJmDqbEQE9ktFaIVxodg4A5wKrvayAEEDycUJrYS1b3oFVeaS94XsVad +0gIyfETNIZf2LVjASUpiZSEhIomvlcpQAdgnhGvlUtQEOx9nG5L5LUQ/JI6aGBrlFiJNtlKJeBA1 +W0refrFUDzRK+RAYixsahXwzPLcigFZadvECmhu2tuMOJF+73NxcfAKl5JyUq8SsaSUcJSG5Ea0M +ThvYvaCW4jaCx1JpJW49wKIsklToV/CjqA3BGHFLg1rC1QqBuyqNHla1Ye+rodFSbVT20l4NcEUa +VZJCgDhKKylkoTbkrwuNUvhN3H6nxAfWipMDm9QM/UKoThxbjWCxlPIuwSB8JIDQaGUpGVJDFFUJ +MTHRlBrLXynlBk+0MAoiIFMqulSSM+ApJTAh0cVkJegOpcKQKmRoVIvBDaXCUPBKWPwGjYAahcIR +okoxNIrRUhgWcZXD5haNSBdUSoPfCXo1jqzgp0ONaqU4C8Z9IXCtRjJkCuMraMQVJm7wUnZleBpp +YwL0K9XKFIsjKqXdqXg1GEgIajSWUcSAzdCBUipFBbbYcC+VmMYj8llDo/ENFGoxvoPFz4inhPWs +MSSmGXSPEPzD0WPxTgppJyxEE5QSVDa3EstpGYVWIe7oM58jxg4tpN1s5hIN0xhy/wyNYiBLaWyR +lAZG7oZvW4hlYvD8ibs6xW0y8q4UWyXs0RBQhAH8q3D1AlHJStMKWyysxGiNWM8Hb9wQZcjSgITg +QpVYZhHvK5G+byGxcbVC/L7CQuQ6VkJNLJWFuN8e83aRAMFuOckvhHciiC+mkegSxrlCo4Vo1pBA +GfbzQYlxpViwTi2SS9hMZyHONpy4IW2mw7VUDFeL++agLqkosULxCWhUSUXA8AZgQ79QnFC8nRj1 +V1mJCfF4FOVir8JOAUybRTFWAZwTZ1L0FuOzTkSdYTCAqEltZdUVCxq+ruii9vDm/JVCs5GEKAT/ +iUopRUrVUtBMpZSiYwKHMfSrFLNqoANxk6DSUMnNcDPB2QyNkl2US+ZSpZRQj1oqLaUC74koXipx +s6VSynFQG1Sg2IFxfeKIueHNVAavr0FuFNIuVqXE0cVqkCq1IfJsGEalNGPqLv5EoegLNKokl5mV +wHhgd66lVPvQXNquKW3aVQpnCK0UmtWCL80oNWqcmCiJh7m4m9nCiPaNW9AtunB/K3PD2lFDhRbx +wRRCvSu1MZqnNqw3QwfGwr1CXEK4Vi0SYtGjAHvYJZcETmwQO1DBQctyibbNNmyCN8aWBQ4BjUJQ +Fh8pJnxfLu7MFBeDWBvAQi4iATFKAkedmFtIcm8h3ksM8KsN5SnEftXG6bUSlYJa0SUUIBRlwlUW +FEaFKZTmUnWp6ohTWwz9qro4CUUsAkUhFMZGsVCEsYSpUgpRQLOkbnGuoOG51IasbcNbWBkYmhrs +iTi3Bg+IGtC8WhI6cemp1VJyjrrr/nMhuGdoFmIcak3XUsuCxwrOD5Ji20YvjFpjqIsiqFZxCwGc +HiOZEoWAazW4NINxygyFW5AeV4uRE5zKg/vFx3xJRRqtDN4KfDCY6J6SC2F/1CiNgeQrxkcsiQJq +Jd7fsksAysJQ7Qoa5VKsFucPGTqw7JLnYGVhQB0aK6nSrtpQL9DQKOxbFbmNoQOrLkYPF4lcKTQb +XWlqIe0IN0p8VAiSaMTol5R1C1VbpPKtiOwZKg3JDWxXBLQWQocayYOukYtLEV0ruovETEuNvEvK +gqW5VEpGIYVG8Y3Er8slycRVGY3VcKRSvEJWIjSaS/E3wcmrAYeCqivfMvSrkIpsGkOuGjiaRUqA +EbZ4aoDPS/EZY5UfhVjtBI+fwVUCVX4sRSZpIY60oks8y4h8oFkigiL41igMe24NvQqFOqBR0hpd +RlYppSgbnTW4+JAIvi0F9qBRds3g0YjMCJolF6NGYFEaab8cHlm5WD/JXFIEGBGIHRjrUmKjbmi0 +VEnVOYW8IHhWcyNGVRufwNgsgg7o1UrEFwphpy9cKcE0S2NNIKVYTgdjEaEAkUqs0Cg+raFRbiEB +TXORXkKzleS8VZtL1Z7kEtAUax2ppDWPU36kr1uKUTq8L3Sl0Gy0CQohAgCNkpaU9JNKLF+C0ZDo +J9aAnpZL+FclXisqPcFJDC1SDEWs5oarXUkREFFta9QSEsMlWQ1NxjKocktJj8EV4trCcT1Do5gy +LQQa/rMDY3kMjVqsLoHXrHQvC8mhJGwx06il0weEgtri9y0lKKiWS9f+Z1hbo5bSSP6gBaFZBIJC +MULcKDdmwhg7kII62OkhdiCUkOh6raoLcBcrwsD4S1hWbdlFKjRSuFyswQO9Sr4+qQAXzIoYi+xS +K0stbrJTagylA4UhVIr0S2xRSDsXse0Tv200RGLSjkbT1ZckVFOFImzSSQIKuYWxuJtKGhelWCGv +q9dJCAdDo0o6zkFKocNV76RtLJZyC/FajZRoZi4WKTTvmjMhVfc2N5cyRyQfFb6Z2ihuUtk8lXFi +RdAN5fiEylVGW4Br9GlE7SrYLVzNTymlyYhft+yS3GiuMpQnN7foUrhY0JfQqJHogUasKgTNaqOF +lguKAddvVIpaSEiGxxV0paw+jVg7s0sShVgBAJqFjZpGhzNuVIjeNJw3KjQaT2dQSu8FO+IUksAK +hTqVBn+I3OA4E0oMdmUXUsYGNBvhkNpKI14r5oFoxD2p0Kg2JgUq5HKpgy6RCzERHQ48EoPy4DQy +V0vNKoXoWRW0Hi5BL4URFYZaRdCokjyVUvIqbhanViA40KYxpp8ZqkMhZAZhXfEBlAbxhkZzc6OH +TRBvC5xPI0Jzg3sdN6qkhDG5ldgr0vmiN06MS+FmaecVnkfDg0HZBY3oiJYLYAeajcNraWWYHwuo +pyWFaiwtVUKjsF/RACzF6v6ws7ALXzZcayXuWlJqpPKeUFXfUpQ7S3FbOq7Bb2k8tQUzOmg0l2IP +QhUi3CgleCrE8Mv/cgqAlZVUTNVgJ6FR3MNviO3h55fKeanFIDUeF7VYV0jiAdAsl/bAq4F+is0q +qVgMLjtuHFyxsJmhhBnuwVgZTS4X2qykaq64bov4DFbS9hohXQEaLY2lPIUCoTC5Uj1UjVI6eQEp +CqnKF07jXyk0q6R3U5lbyAVp0kjbYYUdf/hKYyFPMXHdIHliBQ4hcwV3YKyDKdSpRY1K495bsawZ +lmdpjyq2/UKjRqoXbSC70GipNlYUNJdLHVhKJS2wa09olOo5qK2UYq9W0h4rKVgOzcYK0EKiDixe +tVQrUdRgePGLm5Tg4Glp8SukzeJ4V6OgPaTNuwoLYcb/+7EYUjkoAcuCTlJbiVMuVJTAB7ZJVZ/w +/oZFgv7SCCXjLMRt5dDYpRKmpaCwgXEoxMJJ6i76VqjNrxJqYQq6WS7u39WIChuwiFFAJY2vgnL6 +4iwohCs1UoVPAR/jRitxn6xa5NrQrJKqLwpYDBqV0r5yxBbERrlaqkGpkhs7kEtrF7sbDY3G3f5C +SBnMkFoqT4NzHw0dKEW3u8pcCF/j76uMhegNYojNmFjhyULcboibNcZibQaJM1d2rRKrUMmFRmMZ +TvxUYgfGzZFqS6kDK6nmjMrAYaHRUqonZi5u+sTN0m4/hVx62i61q+RiIXC1VINFKZ4GBs3GUja4 +0q1wrYVY808oOoEriSulKnoKqWi44SgtfKFKvPA/ypPTA9wGWJgtFuCrUSvLwVL6/EWzxIq6Nqot +/6JRY+Qlxm3bYuLFHyrr4lPb/sCfcKPCwrB/AV8rvl6Xa427b7v0+h+vIJSwx4RRlDy8ac9HaFZJ +m5blYhFZpZiXgxuVIr3FoUHjlUYubS5u9xW8gPhasciLpbDRCHpVGhvFKCNcay4KH94BJTyWtFXW +Stiv/OdXEN9NbRAEA58DSyDOm0Yjel7FUAg0St4accMuNEoOO1xZfdGfOhAL2GjU4l55THElloVr +vhnpsJFQiQlx4tY5aJSL1Fn0KONGEXUqpX31hg4s/3wzKc1XYSHx1P8YAxicmboB5g==
+ ]]>
+ <![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[
+ 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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[
+ tMZIfC7iBUiyhZjDU9i087OF+BPThZ05epyddy/8ngpmkHNT+eV3kwOTeyN55eqBpFe2BeI727RA +fCQQf4samYzk8Jgvor1fH6wJKWN3fc7XA/qiXkNrhcSX8dHVE2iNELmbvWcvkIzDNgXU8T6LXSjU +5+ay+59tFo+3qBTVr9eDzPeL2AVvF9ybtSIYxHp7D+R0wvbUwYhbyoBcEO4MR36OtSmJ2CEl5wJh +NPxneNk4kMtSklHUCnC/wooocehnUsH+oi/J6wj+gL+lBF3d+bouciycGyWnDC0YI8TWTCK58zSa +NweR8esm1xpCawzI+eBrEg9MR04vJJ2YCZ+oyL+9hEu7ModLAvaHTUcMVJD8gdvq24sSUkZWjAM+ +4e29elmEl4xX5N5cDMEcLv7oFNYtuT9iGmrX4jaSe4ftHSeE7NVHnKa5JInpIGiDkBubSvJKErNB +CieT3LUgfgWBLKmgcZVY/Gg1RFCAMeBHIIQA0nY6r0lc4zJJ7Mq7upjLvkZJDCm+9csfjjGDwAlE +NmW7P64yq3z2w5d8HZhHRe4p8nUqmuFE5ryLnw4lCCX+Vkg/NVeMKNGXwkrHkjx4AkgjgUFBNE/r +NRBcyrq8gEs+MxOCjxCspnkbyZVAwgiRI7b40U8kX1/Eu6YOoPV90fVf+Tqfdmw2xJtQfwNOx1wF +BurO1zFfgvuCeJ+ur5FxhJ1YhO4aL4Xkjqb5uhXJ1yF4QcaW1p2jqyfSfBnP7QjsLyTsmUqJm1Bn +omIXNZOEsoa1Ys1DE+FQm5yrerlRVnxrKRW7cCD33IZgcTuCc0Q3LYXkodVN6kpyf+LDMDdxDhAv +QL4OTIX8ETGAkj+BiAv1DNSTiD0IyadniQn7p0lhOaNFmq+n0HwdZLY4R5qvo4aIfAJ5Hnwo8cMQ +eGRzLi+EMBtq66hT0lyN4FKaq4MsELWGsILRHMSciC9UFNcvg2ieorR9OcEk3WIXBJNhntKarXNI +X7nKlopdiH8Su4DYOx+y+1tTOcmVjeUMa+X+WewiWlf0JH7YP204xC5EN7++mDtUSCWk4ltgYoUl +/Fq32IVY2LxSKGlbjesD+TliKGdHPt8zcTAI1UDuBb8K4RRFAcmxk4/Tmislx4vbO1le3PSDvPrt +GggQQ/BaAibCPYvcP1kVXqyvdIvoD9sEtqHkizm3lnAl9cu5gjvfU4JNXCcIOrNOL+Cp0GWJPiUp +LX24Rqp+bIp7w+ZcWUjtM/7AFKzR8HGHplASueSLs/jQGn2Fa1Q/U6yPyh004V+lsAp9jCNiEuoa +rGNAb5Dlyq18tbG20C1Akq5H17uTT8+j54b6ww6Cw4nvkohvh1+kpHLE/qiYI+pGIPIjNgWBMpDs +UrGL2BL9f4ldJEDsIrlbeADxH/7Fv5DmfxC74EkuCmxuaqSiGAhxBvMRsYEjuSeIX2Fr1E96JQ+h +63TI7R396HyiNfSQ/NF89P6JfOLx6d3+i3w+SAKBGf2T9UDahvUDmkOT3AiYgH6lxIpHZmDOUl8K +34n4D4xA8nIVwTZUdID8Dvk5fT1dSywcAzJYPuXiHFqPcAnuCzxPBSPcYweqnMkc2LpNm+ZtVOwi +awxX83gzjR/eELtQMiYmEkNtCus5TiA19+8DnAIhqc9iFyMhdoFrU30Ru7AL6N1N2HlhoTJy/xSR +YBfeFzVSkhOh5hlRPZ4KzSTtnQ6RNbbo3vdcxsk5EGPBa0HszCecmi7Pa1oCQaxuIu+SMahX0TUG +4G6C17FmBh+ljCLzm/hM1GYpyR4Enq186JobxE2EypaNivLnKzmS21JiXIKHQEgKnwKxD+yVQJ0I +OT/nGqdL6w/4nuTDMltvbWNzOw2DtSxqnpoQ+1Y4+PeC4AX2AZiTucuSOQ9RStSTsGcBOArilBBe +QE6EGgN5vidIi5ED0TUO1C8JpuIKGn4QE8/OpsIK5J6xhfe+l1e2r5QX3l9qXtH2I3AaapcmBG8b +rd9IxS5kJFc3V/xL7EIfvgFrV0bGSsZ0s0jtE59FRatQl7TzorUZrJ3DNmleDaLPrV69UMMSkd8T +f4M6CkgAkYeAWFcZVzMFhLB0rdylu9aljKmcTIm4vdOGdRMoe/WmeIDMMYgfof4puhL7JXapdI3u +T+tniK0px6jIC63be3TvreDhpyDUQmI96s5U0N07abDcxq0H9oZQMYzt4f8hdlHWtFqseLCR9c8b +/kXsQqbaoUVtBnVI/+RhwPcQu8AYSCF/FruI6Ba7IDGOilUQu1H5kBzI3q83Z+vRk9YXQkvHInek +ggpkHqH+TvFv5IGJ1O5c4/vDj0AEVl72agVb9mIlm3FlHq33e0YPUOx+uQbzlPcM1cX6E+avRP1Q +5nAqvENiK+fk1Rt7eJBTQ2QOIl4gPldUPFhByd1B1opcSLFV09jEmDHabMKQvF8DeQ7WB5API/dT +uCf2h1+EMOqG9SyzZtkmZtWPGxiIw6LWau4AkbI8PQgSo26GNSy8DzAwJc1F/kpiJuqFEOSj4iKo +BSIvhyApxCZIzAQmR9xAzgsiTtwXSlha2bFadvDtRjKnFkHsG2IXxhtBdG6hgYc5yzMQl0T+D3Jt +KnZhwDKbNykYfmtAbxVERYi/pvXJrd69Md50XcN6mzb9auemjXslOpP4A4Fe14C+Cnsv6ocotsg8 +s0jMv/ID9YvAnKh1Qnws89x8LufyYuBMEEBiTOEb2Jwz87uJVFNH0HXUiEJ9rKNS4snMk/P4qscG +EBiA38YaisqH+PLYsoliRcMGZVWLubT7mTFb+WKdvLDxOyp2QeYJH79/srzgGhW7YPPvLaViFyR/ +xn6LTUYWjJHoqgnBJwggog5FBb+jCsdBRIaKXYR1i11Ifxa7cPsiduHZk7V00FKIjpoU72JNmMR5 +Nr/uez739lKe4E5aM0jYPxV+hOacftnDpahDU7iyZ2v43Z0GivL3K1GXFsP3TRACi0ax1S/WQUiO +5rwg9Ua+hP1h5EFFQD0iB9J9Eb4Zw5CXo36EXB35L8RJgf9QQ5PsvHsrXWMHQIwLa58gzmWz7i7i +g3aPlrtE9wVBvWJH2kDYp5nkoLl+rTGzcvV6ZuN6U8aYd6TrocCdbOmD5SDSBTE7aljmCggrufek ++UTKqfnY8wUbZbd69uRJLo1rl8rq1nOZ1xdJJLbR2rtv8lC6/oe9HCEgpK3Ql5c2/cjveraRil2k +nZgJm5H/S+zC57PYxY7eSip2cXA2xAKkHbGDUFszJ/NJgb0nBGsqA/NGKbEXCrjR3rsXam1mciXD +bXHuIe1MG0ZJ9rHnIrJyInwV7JX6IRC75l5aKmReW6IKLdPHeKL+DlEM+BQpumQ8yJpleWfncvvb +jYXdbZswvhDNor62oG65sqbeTChtWMPnXFoM38DVPDIAuTRql3Q/CIhaE/ZOQx6A/Btrdl/ELjgq +dvHwJ6HylYFY/cRYUfNuvXx36wo+pnoi1ngUW4N6ybb69JQ7RvT5InbBFrb+IJG8DH5KCWGKlIOz +leHpo2l8J7FMSDswU8g4v1BKODSD4mDgARI76N4e4u8xVmzR7R+E4obVfFndarbs/gqML2rPbOb1 ++Vi7ESHcHXVwsrzo8feKjBtzuZgTk9mU8zOpj0o8Ng1imlzCvsnAdBSbYx0CeB9CEBFVE/m8uh/4 +osYVyHlYvxw95A1Yr0feQ+cHsDz27RGbEHIufieWNm/gap5uUh59YKU80C6wyedmsL5Fw1nP9MFy +j8T+WIMwt3brYcpZapgSO0UOwhEcQObLePg1gcxv1KKwXmRsoGDwOioYQ3ChMv74bFXU7kkUz2xP +GIT9GhDIEIvvrxbSri2g+xmwZgcB1c9rvRANhRAsxkeed30Rl3VmHsQuJN9cWoNADQB7jlSReeOU +MRWTlEkn5mBPRzemKR1Da++oA3nFDqI19sCcb5CP0xoGyH93RA2gazw+sYNRB0dtRVnQtFbMq/2x +O2cn8dsP+zsOT1dG75qEmj0VzqTr0ImDUQOAOCWfsncat6/ZULjYZKM6W+cEccpN6zczEDeme9nK +761RVjYbCbsfGMhLrn1HxSkhBq6+vRik/yDhpusREM4iGAH1/26BDpKz+aXrYV1UnkdyU4LDpf0t +CvnupyshdgGBdS6yYmz3+sSuMYrtqQMhAs/FX5hOxS58k4fQPCqpaipqXlJE4VgqdhHZLXYh5pxe +DEELKgZAsL/Sk+QDYWX6VFiO5KmULJn8ni9tXMmXN6+l+UlZ20qsmUCQCIJ9isz/JNg3+l+CfRUv +12Lfj5EZ202KTvcZFI8Vsa8Bnw/S9/z6FWJ563o2/cY83AfYDl0TgmgQ1lKRo6OWhnhIciTxYLPC +6uwVV+XpJhuzva9XYi6wqZdmcz4lw0Hqj1wT+RJdB96ePJD64pDiMSCJZ8s7VsPeDQgeNFizmQqn +mokkvpM4L20L7KtCHIE4qpNnL/h3pUcS3VcsRmSOpkTPWDvC3jLs+SFxUQBJdMLJGcrQynFYEwL+ +pQJzWKPE+goZS+wVg88BPoAwoOQeMYDW+rcG9RE9s0gevW+imHZ2AfwfFZGA2HogxNBI/pp0gpJQ +w3Z53wRaV0fdRFX0eANHxkMIKhqFnAS1KOz3sfBOG27pHjpA8k/Uo+T+n8UpMbby6rY1qlP3bC2v +3/TljnbIsE5laCBjEJtovobaDsQpk49Nh+AuW/F0LQRE2dKW5XzW9cVi3JFpYlT1BCoWjDV/v8zh +qNFxrpG6dA32T2IXCpK/0nWhyOKxEGZHPiEruLcEgnkKlwgduXNMX2Ijo7mow5MgdI0cBGTcUmTu +t8IXsQvECezHSzs0i829uAgxWxlVMwnY70t9lea08VWTuaK7y6XixnViSeMadtfDfwn2sV8E+/a2 +mf53wb5HKyHYh32YdI6hfkRskRLfJ++bRkWtSPzHvkOIK1EBqKj9E7BHAMKIfIB6OLX/5POzhcDS +UbAL+APkZlxl+3o+cd8UKk4ZuX88hLAVPtlDFYGZw1BrwV4Y1i97mLmtpzbWzAQSy4GjxF2tmwSC +FVF7kgv2mtgPC9xHxShJnINQG0SbUc/knQj2QD0eNunZvVeN1sAhapp6ahatUxB/AbFXISize88H +8hRgdpJn0D262MuYdGIWxBTo/iCsN2AdZctObaxTYX0Pa0OoUWCvghRRqk/3lUOYAmtwEEGLJzjK +O2UI67KjF90jQ+Ih8hpKwA4fgpwRj8CCURC1Q61WGaYeIyXsm479vRzEKYGZYau7mgwg7CqrfLac +7lHYFtEPewyxR4XWHQsblqFmAnJ96tuRE2N+xeyfQvf8we8jn02GKAfJPbB3JSRvNJ2rEMxMPzkb +AtBieHn3NYXtGsdlHJ0tr2j6SV54bwkbd2AS65s9DHsiuoWWyM9UiOrSQiqKFJg+HKIA9L0hFIT6 +TMKRaYq8y4vkOZfm0boJxLFc4/qjjkwFNBOPz4TQuTJ+/3S6pw/7wLF3EXMn9tAkxQ==
+ ]]>
+ <![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[
+ nBkFucetfIxfMBZ7984xoua1c8TrQqcIvMZwg2/8ns2HAxXmrduCY+v4f3td4CeHE88wmHw+4AMH +zuBIgkbGoSkK09D0kYvR9Amr0MxpO9CCFTK0aNMxNHe9Fb4Oo5lLJWjmXBpNW0ihabON0RQlLTRj +xm7ys1WCKLTNqWaM1ntex6iH32fZcOfCibIU//gnvhHFTz1i6165xxflu8XjGB/zqtAx/H2xU3Rf +uUN0b7VdTF+NQ0J1sVM8YFK9H7xs3gbT/9WewesfRzDauD/R40DMg7M38LMx+KcT0NSh09HMUQvQ +9NFLkdLEldg3L0FTJ6zA528zmj5xG1KatA1NnrSDrE15sTlSnidFc1cdRUv0vNH6vXcUNwd2TlDP +4RfvLOJVjT7y+/fXXvEGDPr0uUdMVb5rdB3ep6oSh4jWEqc4OHNtNY6prZVOya119klvSpxwLuEd +olnDb1+wTPd/bZsDa0Vk/yCeTVSYjiYq4gwJn6tJ+MxNVpyNvzcbjcV7OA5fk4bNQ1NGL8drW4um +TlfF9qmBbdIIzVhrjmapnkBzdjqiBUa+aAkXh5bQiWiN5WOFbUG/TlEr4dcw3UXnzxUkBXm8Dg31 +ee0f9g5jr0q8tvvvnCIf4hhXUuQY2VriGN1Z5hjTWu4Qk/faOep0VVyY1ht+6/RxM/7tffvrvIG/ +h0g1WVEJKQ2dg9c0A9vjZPz9MThijx34mYIyUhqxGPtDvHejVmG/uR7NnLoDzZ5LoXnrDqOFO6zR +fG1XtEDTBc1Ws0GztGzRT1p2aLEgDK02S1fY7N0yTv0Rv8S4lz8g7nzt9HNRkr97XljIk/uXEiqf +eibVvvJMy8tziYScIbDUO+ZMQ1xMAc4T6krtSR1S8vHFBfVb/ILp01f927F8MMFagBFx9BqMY9ko +Fez75yGlwXOxn5+NLXIKsc1J+H2ywlS8vjlo2qh5aNKoOdg34mv8UjR1Mvb/8/SQygoLpLLSCs1Z +cwTN3+6M5huFoTl6fmiF1U2FjV41o3bc5Odq1vPqGAcflbU98zxelRoY/NI/4uYzj/Dyl66RdXht +xXnOoY+LHcLeV9oEf6qxi+ttsksqrXJISCx2DzP90XV2hcT6/7pnAxj4P77+y5cMYOEReLdG4bM2 +Ge/hdHJNVvwJKY1bRfZKaZYmtkF9NAPb4U9rZein1Sz2KUZo5nw9pDRDAynN0UZKq83R7C34zJn6 +o7WHbytuCKofs+UKP12tnF+rUc5vNPn6xxGrhiuXvAt9Q+PyL0Ri3xn9EmNpbKNRTZWO8R3VDond +tQ5Jn2vtE7sqnJPbyx2hlhSu28wbz1PZ9G/tm+K/+McB/zEWrwWjj9FLkMpPGmiOii5ehzqaPlsT ++wo1NHUa9h/TNmKfic8ZPmvK07ehmTN2oFlK6kh5rjGatYhBc9ceRIu1XNFKUTJadSBXYa1b6fA1 +wU0jtzzkf9qW+mPGzgJ+rU4nbyz63GRn1nrfy/NVaGjg84DwsjzPtMIC56hHr9wihSXf9xg/5fVM +7+H8ouD7Hq6txc20nT+qXczvUL9YOElpzNz/cV0DsW0EQYfgJUcSlAURegaagPdp6rjlaCaOxwvW +WKGl2tZowUZLtGCJAM2dvR3Nwv5y5sQV+IKYtw4pz9iEMaUxmrOcQXNWS9BCjVNopZE/WsnEoPUH +niiuDW4fvekBP0Ojl1fTfM/vNOrnrYy7+cPchx7P/U03Qo7WZkbt7bgXdrQhKybl5cWYxFeXYo41 +Xom3+FAU4VITllJaahvUU24THFfkEbG7h6fXGJz8H9c2lKxnDInN45ES8R+jCOYfRT4CBgF/OXnI +LIxBlPF5VEITh8ClgiaPXYGmz9FH89QwPj75bPD24J4p26/ys9We8IsBT6o95BdtS/rb9C3h3ZM2 +BXVO2OxSOnrz+YfDt/uUTdDI5ZfsquE1TD/xp0w+8cfFXwq9LHoeBJ5qiAuHfA5ycsCaDyF3LXCJ +fPrWMayk2D608Z1DRF+5c2L1O6dY6kujg6bzu0ngI8C//zu2OeLPWA72CchYadhMpDxhJZq7TB+t +0DmJFtM2aJFVCFrukDt4hfeboWt93o1Y5/Fm+Krzjwavcnw+ZINX6cgNvk2jN3jXjd7g+Ha4qnXe +sC0e5WN2PuRX7Kzht6ld5+epBzRN1czmF+nU8Dr6dbzIoJWXGDTyYmE/f/5cVXQYYBZYVxbGzs4V +IdHGjAnSNdyJgE9Ddq1RTOd8ERl73JyhJj43aN6i7f+DXSqQPQO/PkUJ4+Fp6mjqbC2ktNgELdp5 +Eq2kvNBy6gJaJQlG6w5fVdwYUD122xV+ltpzvD8V/IadFfxm8H9b/WonqB7MVFwl8UXr5RGDNh+9 +OmS7S8nYHd7NkzSivyrvesivxfhkt/4vvLngR/9Z7kuhu34XL97tVzzLIKJxsUlQ4WL6zh8m4uKu +05Kn3w7QN/8wEqX9TYPL/oep5P53C+7xZwtxTrdM/rDqoDS/+RTMOxkV8qbqUj/FyYr/c9yDegic +tInD52Csvxb9pCJAc5aZo3kbj6CF2jZohcATLd99Bq3cfhAtW0+jRcu10OLF2mi5qhipUn6DNp1+ +OGyzbeHInal/n6tdyWvq1fKmht28BfXlu5NV2/UQyee3F4TfvlmLPv+w02/mud2Zvy7XS+pcrn+N +X29YwpsYF/OMoJy3ENX3Hecaahy491Wue7ufRFl2voiUfGzzY2r6rAXveJmo4schrqPFw70yKKG8 +xDbIozwgSjOxf85cFdV/wy4VIGvD2AOfM7zOSaPmo5kzVdGCdaZorc5RtJHyQJtpB7T1SMLgzaFv +J6i95pdq/+AFJnz/z5JPj12oX8vtTP/x9WfR71U2gj8arY1+5w9pf+eNdT7zAv3vvMzgK7+X/dTp +YdjJm+/2z1fWPxo2QscqYKhBAa8nLOX3GmX/scnE+eo04X3elGnvdTncei12f/utmNMNqUmH224l +GJkYInbv4SFsyLM10uw6mn3cLTVJ/bRB+0zCqPlLtpI87b97G4v37SeljWjhCiHGuRfRxqMvh2zy +aRu7JZlXwra3afdnnjb4ld9r8IPfp/edl+5s5LdolPLrtLp4LcPf+QM2NWHh2aXOYTHlbuEuVQFh +kv4XblBD0cO2p/2C36hzn1+/u5TXNm7kLQSd/ElR3x/20m9VAdyX9xcN7/PqRmaHFTTWbUJ62loI +nqOEOUYqtUGdCX25RmKXriw9FjJB7Jw7j8n6XV+c22dGZ37WYdxvzBHaZSrpW/kPW77WBM0cM/+/ +1IL+wzYVMc7CGGvcYjR/gxitN0tU2BbQOgn8367P5LzsMfnOHzX5hT9h9Infp1+PfUENTxmV8pTB +O97QpI63FPXxdqYd/BHjUp4zesbvNglvXWHicXuWcUrXemH57/uYng8uwo+8taCVP2yQ/YeqiXeO +iiC+ZgN95fNu5kE/J4wuXkMFP1tOJTxXZe5Um0py30plpYX2FnX5fuJHHRZcYv8uNrR8I+v/ehWb +28haNL7wk3WV+huX8OyarfR/u66R2C+OU1RG44fPQhPHzsF59AY0Z6k+WmVogzYeuTF448Wy0dtu +/P0nzQp+Kz5Pxrtf8Nt3ez5T2n00ZaSByz0lg5e8NttYZnf4/bU4eX9+INvX4C7q6bY1KuCNjX0i +lIyPHxhs/POZocbOnmMNInPnGRTyeuLOBk+uodnB5MLtn3QFEmS0x3qwydW/7aCu/tAVnQgYK9pj +N4QNrd0kvtMhkb5sPMo9b7XkCpuOSN+VnDPN6tshuvpNi8ps16Qvf9QSP3q/h877skf/Ga++6+es +UXMW7SB59r++TcQxY/kqEdrM+QzScHw+blcFr67/kZebfuZPGfTyZthfS01w3KW/fHOjv/W7G2Df +oGt7ZcImdR2kunkNMjpxeojpve7dkoa3ziebM1OsG2OS9nbnRtIf+1yNy3mxXsbHlfrer2YZPuDV +jV/yRkYp7WtNQh8vNHnwYzf9pI2l7vaYim79pkudi54kNDulqG8qQpT8iCLhSQL+fZfkWUxc/Vb2 +6jcj+auGc/KC6nPC5P6touMXR5lax040OBUxepvhKTRn+noSoxVJPX3Qn3Y5BI1XxHFt2jq0aKMI +bZL7DVKP7Jqh8YxfrlnH79D7lZeLfry3p/9oded+q/Ox6HseBr0/rrfZg6npOUe/+baPevmblC3s +PyataXCXlTQ5c7l9Uso2caq+hj7S3bIZsUIWwfy7IK5kvcmjf+iYxL1dJTjvMxaegxZF562lsnq1 +mTs9QlF01QaRU+w0zjPpJ6lP6kIupmSbWWYtI39dbGNeUugpf1ZzTJzTJhVntwiozI5dVEzxBqHv +9bn6pyNGQ79t8uAxpHbwr2+wl1PHL0E/LdVEy/VPoG0nbgzbdZdfpvuBZ3B+eQBqdHp9PGfQyYtN +qnlzw5t/22Kwz3GIroE52q0pRKYCc8RR5gp7DtuNtnRNXiiOKt7O+d1fYWQgQBvnzEBb5s9E2+Ba +MgNp79yIqJi89ZKXtYeYx+2cMCp/DX3adxyZP8/uMSAz0YcdRzCW1kOBS1ac1K4lTu7UZkOer2VS +OjWl1xs5trLzjKSw8RSV8dsuKuTlCuGdr3p0Qf8+pq77rHEHv1e7nNdQu1Q8cfP+NMVNB7IGbzuQ +NUTjcPYw7fP3x2m5Ppq0O+vrCqa/zw1mcZyrQuKp7q/2hvd4NZPoztUmaV82Gd/jtUyv/Nhhei52 +wrZt6miVygy0duZMJNqtg/YcOznSytZxyl6HCzPgOTHTO1+0mDetB6Xl5Q7CB78IhHd+0RNe/1VL +5HdvocjBdyIVnLGQvtVgTGY0n32wNL31h5bQ98VC2jZtmsjScajQ8uwQ0cFTQ8hzL1mdxuaPyk6a +5dWeo571sYLId6sFfg8XGKf2qxol9KzWc8mdulPqrLBaXY4W4tg8Y5kamqthgdbvCRmkEVitpH2b +X6Hzit+hk4eve9jvp3xYqO1+Y5LO6YiRRq6Xp5oGXZlj6pcyyyTs5nzj1Jr1xlc+bBEGPF9C2aVM +o89GT+JsEqcxjldnMXbXlJljvmN2a+oirW07kEAPxyuBCZLKLBREcgsFxi12pjC6YI0wJn+tMD5/ +PR39YJ0o/tUGKqNbk73XytFP28RkrvJS3BzWNWkWfaVPR/a46pBZSbmrZdkrP7PiImdZXtUZ4dV+ +LXiugrIPm2x89uIoPffMKdqXnk/fYemluHwrhaaMUUGThuN8AOehi1cbIw3ngvFajfwuvQ88S3/5 +6Eb3/uoseMWzptd4DROn2MmmB/C9POs5RhTyeCntkTwL+4HBzDHP0cApaKiuhbQ3bERGalpIzB4m +zwoR7ji3rHnm1qHTxMZCtBv/3BT7DcY9TpmKKdlABeQuZnxuL2Iv3lkkSWvSs8yslHFRJVs4+8Ap +8AwG43djEZ3avpOJq95GBz9eKcr4qCnLbmOkH6r85I2lvqbX/64hckueKYwrWUc97g==
+ ]]>
+ <![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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 +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 Binary files differnew file mode 100644 index 0000000..da1752e --- /dev/null +++ b/web/stream.gathering.org/resources/images/thegathering.png 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 diff --git a/web/stream.gathering.org/southcam.vlc b/web/stream.gathering.org/southcam.vlc deleted file mode 100644 index e20970c..0000000 --- a/web/stream.gathering.org/southcam.vlc +++ /dev/null @@ -1,3 +0,0 @@ -#EXTM3U -#EXTINF:-1,TG15 Unicasted South Webcam HD (720p H.264) 3Mbit/s -http://cubemap.tg15.gathering.org/southcam.flv diff --git a/web/stream.gathering.org/streamlib/stream/config.pm b/web/stream.gathering.org/streamlib/stream/config.pm index 1c968da..c07d783 100644 --- a/web/stream.gathering.org/streamlib/stream/config.pm +++ b/web/stream.gathering.org/streamlib/stream/config.pm @@ -6,9 +6,11 @@ use NetAddr::IP; our $v4net = NetAddr::IP->new("151.216.128.0/17"); our $v6net = NetAddr::IP->new("2a02:ed02::/32"); our $multicast = "udp://\@233.191.12.1"; -our $video_url = "http://cubemap.tg15.gathering.org/creativia.flv"; -our $tg = 15; -our $tg_full = 2015; +our $video_url = "http://cubemap.tg16.gathering.org/event.flv"; +our $video_url_mp4 = "http://cubemap.tg16.gathering.org/event.mp4"; +our $video_url_fallback = "http://stream.tg16.gathering.org/hls/event.m3u8"; +our $tg = 16; +our $tg_full = 2016; # priority = sorting order in streaming list @@ -23,7 +25,7 @@ our %streams = ( 'quality' => 'hd', 'priority' => 20, 'port' => 80, - 'url' => 'http://cubemap.tg15.gathering.org/event.flv', + 'main_url' => 'http://cubemap.tg15.gathering.org/event.flv', 'ts_enabled' => 1, 'online' => 0, 'external' => 1, @@ -38,9 +40,9 @@ our %streams = ( 'quality' => 'hd', 'priority' => 100, 'port' => 80, - 'url' => 'http://cubemap.tg15.gathering.org/creativia.flv', + 'main_url' => 'http://cubemap.tg15.gathering.org/creativia.flv', 'ts_enabled' => 1, - 'online' => 1, + 'online' => 0, 'external' => 1, 'interlaced' => 0, 'has_multicast' => 0, @@ -53,7 +55,7 @@ our %streams = ( 'quality' => 'hd', 'priority' => 110, 'port' => 80, - 'url' => 'http://cubemap.tg15.gathering.org/game.flv', + 'main_url' => 'http://cubemap.tg15.gathering.org/game.flv', 'ts_enabled' => 1, 'online' => 0, 'external' => 1, @@ -63,26 +65,13 @@ our %streams = ( 'source' => 'Event', 'title' => 'Game HD (720p50 H.264) 6Mbit/s' }, - -# 'creativia-hd' => { -# 'type' => 'event', -# 'quality' => 'hd', -# 'priority' => 150, -# 'port' => 5004, -# 'url' => '/creativia-lounge.ts', -# 'interlaced' => 0, -# 'has_multicast' => 0, -# 'multicast_ip' => 'udp://@[ff7e:a40:2a02:ed02:ffff::15]:2015', -# 'source' => 'Tech', -# 'title' => 'Creativia Lounge HD (720p50)' -# }, 'event-sd' => { 'type' => 'event', 'quality' => 'sd', 'priority' => 24, 'port' => 80, 'online' => 0, - 'url' => '/event-sd.ts', + 'main_url' => '/event-sd.ts', 'interlaced' => 0, 'has_multicast' => 0, 'multicast_ip' => 'udp://@[ff7e:a40:2a02:ed02:ffff::14]', @@ -95,7 +84,7 @@ our %streams = ( 'priority' => 25, 'port' => 80, 'online' => 0, - 'url' => '/event-superlow.ts', + 'main_url' => '/event-superlow.ts', 'interlaced' => 0, 'has_multicast' => 0, 'multicast_ip' => 'udp://@[ff7e:a40:2a02:ed02:ffff::16]', @@ -108,56 +97,111 @@ our %streams = ( # 'priority' => 25, # 'interlaced' => 0, # 'external' => 1, -# 'url' => 'http://www.gathering.org/tg13/no/live-tv/', +# 'main_url' => 'http://www.gathering.org/tg13/no/live-tv/', # 'source' => 'Event', # 'title' => 'Event SD (gathering.org flash player)', # }, - 'south-raw' => { + 'roofcam-raw' => { 'type' => 'camera', 'quality' => 'hd', - 'priority' => 40, - 'url' => "http://cubemap.tg15.gathering.org/southcam.flv", # <-- In use (Need to rebuild row 67 in index.pl) + 'priority' => 118, + 'main_url' => "/roofcam.ts", 'port' => 80, 'ts_enabled' => 0, - 'interlaced' => 0, + 'interlaced' => 1, + 'online' => 0, 'has_multicast' => 0, - 'external' => 1, # <-- In use (Need to rebuild row 67 in index.pl) - 'online' => 1, -# 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::16]", + #'multicast_ip' => "udp://\@[ff7e:a40:2a02:ed02:ffff::15]", 'source' => 'Tech', - 'title' => "Webcam South (HD) (720p H.264) 3Mbit/s", + 'title' => 'Webcam Roof (HD) (1536x1536 H.264) 8mbps', }, - 'roofcam-raw' => { + 'south-raw' => { 'type' => 'camera', 'quality' => 'hd', - 'priority' => 118, - 'url' => "/roofcam.ts", + 'priority' => 40, + 'main_url' => "http://cubemap.tg16.gathering.org/southcam.flv", # <-- In use (Need to rebuild row 67 in index.pl) + 'fallback_url' => 'http://stream.tg16.gathering.org/hls/southcam.m3u8', 'port' => 80, - 'ts_enabled' => 0, - 'interlaced' => 1, - 'online' => 0, + 'ts_enabled' => 1, + 'interlaced' => 0, 'has_multicast' => 0, - #'multicast_ip' => "udp://\@[ff7e:a40:2a02:ed02:ffff::15]", + 'external' => 1, # <-- In use (Need to rebuild row 67 in index.pl) + 'online' => 1, +# 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::16]", 'source' => 'Tech', - 'title' => 'Webcam Roof (HD) (1536x1536 H.264) 8mbps', + 'title' => "Webcam South (720p H.264 6Mbit/s)", }, 'noccam-raw' => { 'type' => 'camera', 'quality' => 'hd', 'priority' => 130, - 'url' => 'http://cubemap.tg15.gathering.org/noccam.flv', + 'main_url' => 'http://cubemap.tg16.gathering.org/noccam.flv', + 'fallback_url' => 'http://stream.tg16.gathering.org/hls/noccam.m3u8', 'port' => 80, # <-- Safe to remove 'external' => 1, + 'ts_enabled' => 1, 'has_multicast' => 0, # <-- Safe to remove 'interlaced' => 0, # <-- Safe to remove 'online' => 1, 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::18]:2018",# <-- Safe to remove 'source' => "Tech", # <-- Safe to remove - 'title' => "Webcam NOC (HD) (720p H.264) 3Mbit/s" + 'title' => "Webcam NOC (720p H.264 6Mbit/s)" }, -); + 'Event' => { + 'type' => 'event', + 'quality' => 'hd', + 'priority' => 12, + 'main_url' => 'http://cubemap.tg16.gathering.org/event.flv', + 'mp4_url' => 'http://cubemap.tg16.gathering.org/event.mp4', + 'fallback_url' => 'http://stream.tg16.gathering.org/hls/event.m3u8', + 'port' => 80, + 'ts_enabled' => 1, + 'interlaced' => 0, + 'has_multicast' => 0, + 'external' => 1, # <-- In use (Need to rebuild row 67 in index.pl) + 'online' => 1, +# 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::16]", + 'source' => 'Tech', + 'title' => "Event/Stage (720p H.264 6Mbit/s)", + }, + + 'Game' => { + 'type' => 'event', + 'quality' => 'hd', + 'priority' => 13, + 'main_url' => 'http://cubemap.tg16.gathering.org/game.flv', + 'fallback_url' => 'http://stream.tg16.gathering.org/hls/game.m3u8', + 'port' => 80, + 'ts_enabled' => 1, + 'interlaced' => 0, + 'has_multicast' => 0, + 'external' => 1, # <-- In use (Need to rebuild row 67 in index.pl) + 'online' => 0, +# 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::16]", + 'source' => 'Tech', + 'title' => "Game (720p H.264 6Mbit/s)", + }, + + 'Creative' => { + 'type' => 'event', + 'quality' => 'hd', + 'priority' => 14, + 'main_url' => 'http://cubemap.tg16.gathering.org/creativia.flv', + 'fallback_url' => 'http://stream.tg16.gathering.org/hls/creativia.m3u8', + 'port' => 80, + 'ts_enabled' => 1, + 'interlaced' => 0, + 'has_multicast' => 0, + 'external' => 1, # <-- In use (Need to rebuild row 67 in index.pl) + 'online' => 1, +# 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::16]", + 'source' => 'Tech', + 'title' => "Creative (720p H.264 6Mbit/s)", + } + +); 1; |