var TRACK_KIND = { AUDIO: 0, VIDEO: 1, TEXT: 2, }; function stringToArray(string) { return string.split("").map(function(c){ return c.charCodeAt(0); }); } var SAMPLE_FLAG = { NONE: 0, SYNC: 1 << 0, CORRUPTED: 1 << 1, DROPPED: 1 << 2, DELAYED: 1 << 3, }; function makeASample(presentationTime, decodeTime, duration, timeScale, trackID, flags, generation) { var byteLength = 30; var buffer = new ArrayBuffer(byteLength); var array = new Uint8Array(buffer); array.set(stringToArray('smpl')); var view = new DataView(buffer); view.setUint32(4, byteLength, true); view.setInt32(8, timeScale, true); view.setInt32(12, presentationTime, true); view.setInt32(16, decodeTime, true); view.setInt32(20, duration, true); view.setInt32(24, trackID, true); view.setUint8(28, flags); view.setUint8(29, generation); return buffer } function concatenateSamples(samples) { var byteLength = 0; samples.forEach(function(sample) { byteLength += sample.byteLength; }); var buffer = new ArrayBuffer(byteLength); var offset = 0; samples.forEach(function(sample){ var sourceArray = new Uint8Array(sample); var destArray = new Uint8Array(buffer, offset, sourceArray.byteLength); destArray.set(sourceArray); offset += sourceArray.byteLength; }); return buffer; } function makeATrack(trackID, codec, flags) { var byteLength = 17; var buffer = new ArrayBuffer(byteLength); var array = new Uint8Array(buffer); array.set(stringToArray('trak')); var view = new DataView(buffer); view.setUint32(4, byteLength, true); view.setInt32(8, trackID, true); var codecArray = new Uint8Array(buffer, 12, 4); codecArray.set(stringToArray(codec)); view.setUint8(16, flags, true); return buffer; } function makeAInit(duration, tracks) { var byteLength = 16 + (17 * tracks.length); var buffer = new ArrayBuffer(byteLength); var array = new Uint8Array(buffer); array.set(stringToArray('init')); if (!isNaN(duration)) { var view = new DataView(buffer); var timeScale = 1000; view.setUint32(4, byteLength, true); view.setInt32(8, duration * timeScale, true); view.setInt32(12, timeScale, true); } var offset = 16; tracks.forEach(function(track){ var sourceArray = new Uint8Array(track); var destArray = new Uint8Array(buffer, offset, sourceArray.byteLength); destArray.set(sourceArray); offset += sourceArray.byteLength; }); return buffer; } function makeAnInvalidBox() { var byteLength = 12; var buffer = new ArrayBuffer(byteLength); var array = new Uint8Array(buffer); array.set(stringToArray('invl')); var view = new DataView(buffer); view.setUint32(8, 0xFFFF, true); return buffer; }