31f3e4db by Simeon Bateman Committed by David LaPalomento

fixed conflicts, added aacstream and h264stream elements

1 parent f239b405
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 (function(window, videojs, undefined) { 14 (function(window, videojs, undefined) {
15 'use strict'; 15 'use strict';
16 16
17 var PacketStream, ParseStream, ProgramStream, Transmuxer, MP2T_PACKET_LENGTH, H264_STREAM_TYPE, ADTS_STREAM_TYPE, mp4; 17 var PacketStream, ParseStream, ProgramStream, Transmuxer, AacStream, H264Stream, MP2T_PACKET_LENGTH, H264_STREAM_TYPE, ADTS_STREAM_TYPE, mp4;
18 18
19 MP2T_PACKET_LENGTH = 188; // bytes 19 MP2T_PACKET_LENGTH = 188; // bytes
20 H264_STREAM_TYPE = 0x1b; 20 H264_STREAM_TYPE = 0x1b;
...@@ -273,15 +273,22 @@ ProgramStream = function() { ...@@ -273,15 +273,22 @@ ProgramStream = function() {
273 data: [], 273 data: [],
274 size: 0 274 size: 0
275 }, 275 },
276 flushStream = function(stream, type) { 276 flushStream = function(stream, type, pes) {
277 var 277 var
278 event = { 278 event = {
279 type: type, 279 type: type,
280 data: new Uint8Array(stream.size) 280 data: new Uint8Array(stream.size),
281 }, 281 },
282 i = 0, 282 i = 0,
283 fragment; 283 fragment;
284 284
285 // move over data from PES into Stream frame
286 event.pts = pes.pts;
287 event.dts = pes.dts;
288 event.pid = pes.pid;
289 event.dataAlignmentIndicator = pes.dataAlignmentIndicator;
290 event.payloadUnitStartIndicator = pes.payloadUnitStartIndicator
291
285 // do nothing if there is no buffered data 292 // do nothing if there is no buffered data
286 if (!stream.data.length) { 293 if (!stream.data.length) {
287 return; 294 return;
...@@ -323,7 +330,7 @@ ProgramStream = function() { ...@@ -323,7 +330,7 @@ ProgramStream = function() {
323 // if a new packet is starting, we can flush the completed 330 // if a new packet is starting, we can flush the completed
324 // packet 331 // packet
325 if (data.payloadUnitStartIndicator) { 332 if (data.payloadUnitStartIndicator) {
326 flushStream(stream, streamType); 333 flushStream(stream, streamType, data);
327 } 334 }
328 335
329 // buffer this fragment until we are sure we've received the 336 // buffer this fragment until we are sure we've received the
...@@ -369,28 +376,69 @@ ProgramStream = function() { ...@@ -369,28 +376,69 @@ ProgramStream = function() {
369 * will flush the buffered packets. 376 * will flush the buffered packets.
370 */ 377 */
371 this.end = function() { 378 this.end = function() {
379 debugger
372 flushStream(video, 'video'); 380 flushStream(video, 'video');
373 flushStream(audio, 'audio'); 381 flushStream(audio, 'audio');
374 }; 382 };
375 }; 383 };
376 ProgramStream.prototype = new videojs.Hls.Stream(); 384 ProgramStream.prototype = new videojs.Hls.Stream();
377 385
386 /*
387 * Accepts a ProgramStream and emits data events with parsed
388 * AAC Audio Frames of the individual packets.
389 */
390 AacStream = function() {
391 var self;
392 AacStream.prototype.init.call(this);
393 self = this;
394
395 this.push = function(packet) {
396 if (packet.type == "audio") {
397 console.log('AAC Stream Push!');
398 this.trigger('data', packet);
399 }
400 };
401 };
402 AacStream.prototype = new videojs.Hls.Stream();
403
404 /**
405 * Accepts a ProgramStream and emits data events with parsed
406 * AAC Audio Frames of the individual packets.
407 */
408 H264Stream = function() {
409 var self;
410 H264Stream.prototype.init.call(this);
411 self = this;
412
413 this.push = function(packet) {
414 if (packet.type == "video") {
415 console.log('h264 Stream Push!');
416 this.trigger('data', packet);
417 }
418 };
419 };
420 H264Stream.prototype = new videojs.Hls.Stream();
421
422
378 Transmuxer = function() { 423 Transmuxer = function() {
379 var self = this, packetStream, parseStream, programStream; 424 var self = this, packetStream, parseStream, programStream, aacStream, h264Stream;
380 Transmuxer.prototype.init.call(this); 425 Transmuxer.prototype.init.call(this);
381 426
382 // set up the parsing pipeline 427 // set up the parsing pipeline
383 packetStream = new PacketStream(); 428 packetStream = new PacketStream();
384 parseStream = new ParseStream(); 429 parseStream = new ParseStream();
385 programStream = new ProgramStream(); 430 programStream = new ProgramStream();
431 aacStream = new AacStream();
432 h264Stream = new H264Stream();
386 433
387 packetStream.pipe(parseStream); 434 packetStream.pipe(parseStream);
388 parseStream.pipe(programStream); 435 parseStream.pipe(programStream);
436 programStream.pipe(aacStream);
389 437
390 // generate an init segment 438 // generate an init segment
391 this.initSegment = mp4.initSegment(); 439 this.initSegment = mp4.initSegment();
392 440
393 programStream.on('data', function(data) { 441 aacStream.on('data', function(data) {
394 self.trigger('data', data); 442 self.trigger('data', data);
395 }); 443 });
396 444
...@@ -411,6 +459,8 @@ window.videojs.mp2t = { ...@@ -411,6 +459,8 @@ window.videojs.mp2t = {
411 PacketStream: PacketStream, 459 PacketStream: PacketStream,
412 ParseStream: ParseStream, 460 ParseStream: ParseStream,
413 ProgramStream: ProgramStream, 461 ProgramStream: ProgramStream,
414 Transmuxer: Transmuxer 462 Transmuxer: Transmuxer,
463 AacStream: AacStream,
464 H264Stream: H264Stream
415 }; 465 };
416 })(window, window.videojs); 466 })(window, window.videojs);
......
...@@ -63,8 +63,7 @@ ...@@ -63,8 +63,7 @@
63 </div> 63 </div>
64 <div class="result-wrapper"> 64 <div class="result-wrapper">
65 <h3>Working</h3> 65 <h3>Working</h3>
66 <pre class="working-boxes"> 66 <pre class="working-boxes"></pre>
67 </pre>
68 </div> 67 </div>
69 </section> 68 </section>
70 <section> 69 <section>
...@@ -107,6 +106,8 @@ ...@@ -107,6 +106,8 @@
107 <script src="../../src/stream.js"></script> 106 <script src="../../src/stream.js"></script>
108 <script src="../../src/mp4-generator.js"></script> 107 <script src="../../src/mp4-generator.js"></script>
109 <script src="../../src/transmuxer.js"></script> 108 <script src="../../src/transmuxer.js"></script>
109 <script src="../../src/flv-tag.js"></script>
110 <script src="../../src/exp-golomb.js"></script>
110 <script src="js/mp4-inspector.js"></script> 111 <script src="js/mp4-inspector.js"></script>
111 112
112 <script src="../../src/bin-utils.js"></script> 113 <script src="../../src/bin-utils.js"></script>
...@@ -123,6 +124,7 @@ ...@@ -123,6 +124,7 @@
123 124
124 video = document.createElement('video'), 125 video = document.createElement('video'),
125 mediaSource = new MediaSource(), 126 mediaSource = new MediaSource(),
127 FlvTag = videojs.Hls.FlvTag;
126 128
127 logevent = function(event) { 129 logevent = function(event) {
128 console.log(event.type); 130 console.log(event.type);
...@@ -150,13 +152,17 @@ ...@@ -150,13 +152,17 @@
150 videojs.log = console.log.bind(console); 152 videojs.log = console.log.bind(console);
151 153
152 original.addEventListener('change', function() { 154 original.addEventListener('change', function() {
153 var reader = new FileReader(); 155 var reader = new FileReader(),
156 videoSegments= [],
157 audioSegments = [],
158 videoBuffer = [],
159 audioBuffer = [];
160
154 reader.addEventListener('loadend', function() { 161 reader.addEventListener('loadend', function() {
155 var segment = new Uint8Array(reader.result), 162 var segment = new Uint8Array(reader.result),
156 transmuxer = new videojs.mp2t.Transmuxer(), 163 transmuxer = new videojs.mp2t.Transmuxer(),
157 hex = ''; 164 hex = '';
158 165
159
160 transmuxer.on('data', function(data) { 166 transmuxer.on('data', function(data) {
161 if (data) { 167 if (data) {
162 console.log(data); 168 console.log(data);
...@@ -182,6 +188,8 @@ ...@@ -182,6 +188,8 @@
182 var hex = '', 188 var hex = '',
183 bytes = new Uint8Array(reader.result); 189 bytes = new Uint8Array(reader.result);
184 190
191
192 console.log("boxes", videojs.inspectMp4(bytes));
185 // clear old box info 193 // clear old box info
186 workingBoxes.innerHTML = JSON.stringify(videojs.inspectMp4(bytes), null, ' '); 194 workingBoxes.innerHTML = JSON.stringify(videojs.inspectMp4(bytes), null, ' ');
187 195
......
...@@ -14,7 +14,15 @@ ...@@ -14,7 +14,15 @@
14 <link rel="stylesheet" href="css/main.css"> 14 <link rel="stylesheet" href="css/main.css">
15 15
16 <script src="js/vendor/modernizr-2.6.2.min.js"></script> 16 <script src="js/vendor/modernizr-2.6.2.min.js"></script>
17 <script src="min-m4s.js"></script> 17
18 <script>
19 window.videojs = window.videojs || {
20 Hls: {}
21 };
22 </script>
23 <!--<script src="min-m4s.js"></script>-->
24 <script src="./js/mdat.js"></script>
25 <script src="../../src/mp4-generator.js"></script>
18 </head> 26 </head>
19 <body> 27 <body>
20 <!--[if lt IE 7]> 28 <!--[if lt IE 7]>
...@@ -50,57 +58,56 @@ ...@@ -50,57 +58,56 @@
50 </footer> 58 </footer>
51 </div> 59 </div>
52 60
53
54 61
55 62
63
56 64
57 <script> 65 <script>
58 var ms, 66 var ms,
59 sourceBuffer, 67 sourceBuffer,
60 video; 68 video;
61 69
62
63 function closed() { 70 function closed() {
64 console.log("MediaSource Closed."); 71 console.log("MediaSource Closed.");
65 } 72 }
66 73
67 var done = false; 74 var done = false;
68 function loadFragment() { 75 function loadFragment() {
69 if (done) { 76 if (done) {
70 return; 77 return;
71 } 78 }
72 console.log("LOAD FRAGMENT"); 79
73 /* 80 console.log("LOAD FRAGMENT");
74 var req = new XMLHttpRequest(); 81
75 req.responseType = "arraybuffer"; 82 var moov = videojs.mp4.moov(100, 600, 300, "video");
76 req.open("GET", "../fixtures/dash/1-avc1.42c00d.m4s", true); 83 var moof = videojs.mp4.moof([{trackId: 1}]);
77 */ 84 var frag = Array.prototype.slice.call(moov);
85 frag = frag.concat(Array.prototype.slice.call(moof));
86 frag = frag.concat(Array.prototype.slice.call(mdat));
87
78 88
79
80 //req.onload = function () {
81 console.log("FRAGMENT DONE LOADING");
82 89
83 sourceBuffer.appendBuffer(new Uint8Array(m4s)); 90 sourceBuffer.appendBuffer( new Uint8Array( frag ) );
91
84 done = true; 92 done = true;
85 //};
86 93
87 /* 94 }
88 req.onerror = function () { 95
89 window.alert("Could not load fragment."); 96 function loadMdat(){
90 }; 97 console.log('mdat', mdat);
98 setTimeout( function(){
99 sourceBuffer.appendBuffer(new Uint8Amdat);
100 },0);
91 101
92 req.send();
93 */
94 } 102 }
95 103
96 function loadInit() { 104 function loadInit() {
97
98 console.log("LOAD INIT"); 105 console.log("LOAD INIT");
99 var req = new XMLHttpRequest(); 106 var req = new XMLHttpRequest();
100 req.responseType = "arraybuffer"; 107 req.responseType = "arraybuffer";
101 req.open("GET", "../fixtures/dash/init.mp4", true); 108 req.open("GET", "./ts2/Header.m4s", true);
102 109
103 req.onload = function () { 110 req.onload = function() {
104 console.log("INIT DONE LOADING"); 111 console.log("INIT DONE LOADING");
105 sourceBuffer.appendBuffer(new Uint8Array(req.response)); 112 sourceBuffer.appendBuffer(new Uint8Array(req.response));
106 sourceBuffer.addEventListener('update', loadFragment); 113 sourceBuffer.addEventListener('update', loadFragment);
...@@ -111,11 +118,11 @@ ...@@ -111,11 +118,11 @@
111 }; 118 };
112 119
113 req.send(); 120 req.send();
114 121
115 } 122 }
116 123
117 function opened() { 124 function opened() {
118 125
119 console.log("OPENED"); 126 console.log("OPENED");
120 sourceBuffer = ms.addSourceBuffer('video/mp4;codecs="avc1.42c00d"'); 127 sourceBuffer = ms.addSourceBuffer('video/mp4;codecs="avc1.42c00d"');
121 128
......