109 lines
2.8 KiB
JavaScript
109 lines
2.8 KiB
JavaScript
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;
|
|
}
|
|
|