You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.7 KiB
143 lines
4.7 KiB
4 years ago
|
var Transmuxer = require('../lib/partial/transmuxer.js');
|
||
|
var utils = require('./utils');
|
||
|
var generatePMT = utils.generatePMT;
|
||
|
var videoPes = utils.videoPes;
|
||
|
var audioPes = utils.audioPes;
|
||
|
var packetize = utils.packetize;
|
||
|
var PAT = utils.PAT;
|
||
|
|
||
|
QUnit.module('Partial Transmuxer - Options');
|
||
|
[
|
||
|
{options: {keepOriginalTimestamps: false}},
|
||
|
{options: {keepOriginalTimestamps: true}},
|
||
|
{options: {keepOriginalTimestamps: false, baseMediaDecodeTime: 15000}},
|
||
|
{options: {keepOriginalTimestamps: true, baseMediaDecodeTime: 15000}},
|
||
|
{options: {keepOriginalTimestamps: false}, baseMediaSetter: 15000},
|
||
|
{options: {keepOriginalTimestamps: true}, baseMediaSetter: 15000}
|
||
|
].forEach(function(test) {
|
||
|
var createTransmuxer = function() {
|
||
|
var transmuxer = new Transmuxer(test.options);
|
||
|
|
||
|
if (test.baseMediaSetter) {
|
||
|
transmuxer.setBaseMediaDecodeTime(test.baseMediaSetter);
|
||
|
}
|
||
|
|
||
|
return transmuxer;
|
||
|
};
|
||
|
|
||
|
var name = '';
|
||
|
|
||
|
Object.keys(test.options).forEach(function(optionName) {
|
||
|
name += '' + optionName + ' ' + test.options[optionName] + ' ';
|
||
|
});
|
||
|
|
||
|
if (test.baseMediaSetter) {
|
||
|
name += 'baseMediaDecodeTime setter ' + test.baseMediaSetter;
|
||
|
}
|
||
|
|
||
|
QUnit.test('Audio frames after video not trimmed, ' + name, function(assert) {
|
||
|
var
|
||
|
segments = [],
|
||
|
earliestDts = 15000,
|
||
|
transmuxer = createTransmuxer();
|
||
|
|
||
|
transmuxer.on('data', function(segment) {
|
||
|
segments.push(segment);
|
||
|
});
|
||
|
|
||
|
// the following transmuxer pushes add tiny video and
|
||
|
// audio data to the transmuxer. When we add the data
|
||
|
// we also set the pts/dts time so that audio should
|
||
|
// not be trimmed.
|
||
|
transmuxer.push(packetize(PAT));
|
||
|
transmuxer.push(packetize(generatePMT({
|
||
|
hasVideo: true,
|
||
|
hasAudio: true
|
||
|
})));
|
||
|
|
||
|
transmuxer.push(packetize(audioPes([
|
||
|
0x19, 0x47
|
||
|
], true, earliestDts + 1)));
|
||
|
transmuxer.push(packetize(videoPes([
|
||
|
0x09, 0x01 // access_unit_delimiter_rbsp
|
||
|
], true, earliestDts)));
|
||
|
transmuxer.push(packetize(videoPes([
|
||
|
0x08, 0x01 // pic_parameter_set_rbsp
|
||
|
], true, earliestDts)));
|
||
|
transmuxer.push(packetize(videoPes([
|
||
|
0x07, // seq_parameter_set_rbsp
|
||
|
0x27, 0x42, 0xe0, 0x0b,
|
||
|
0xa9, 0x18, 0x60, 0x9d,
|
||
|
0x80, 0x53, 0x06, 0x01,
|
||
|
0x06, 0xb6, 0xc2, 0xb5,
|
||
|
0xef, 0x7c, 0x04
|
||
|
], false, earliestDts)));
|
||
|
transmuxer.push(packetize(videoPes([
|
||
|
0x05, 0x01 // slice_layer_without_partitioning_rbsp_idr
|
||
|
], true, earliestDts)));
|
||
|
transmuxer.flush();
|
||
|
|
||
|
// the partial transmuxer only generates a video segment
|
||
|
// when all audio frames are trimmed. So we should have an audio and video
|
||
|
// segment
|
||
|
assert.equal(segments.length, 2, 'generated a video and an audio segment');
|
||
|
assert.equal(segments[0].type, 'video', 'video segment exists');
|
||
|
assert.equal(segments[1].type, 'audio', 'audio segment exists');
|
||
|
});
|
||
|
|
||
|
QUnit.test('Audio frames trimmed before video, ' + name, function(assert) {
|
||
|
var
|
||
|
segments = [],
|
||
|
earliestDts = 15000,
|
||
|
baseTime = test.options.baseMediaDecodeTime || test.baseMediaSetter || 0,
|
||
|
transmuxer = createTransmuxer();
|
||
|
|
||
|
transmuxer.on('data', function(segment) {
|
||
|
segments.push(segment);
|
||
|
});
|
||
|
|
||
|
// the following transmuxer pushes add tiny video and
|
||
|
// audio data to the transmuxer. When we add the data
|
||
|
// we also set the pts/dts time so that audio should
|
||
|
// be trimmed.
|
||
|
transmuxer.push(packetize(PAT));
|
||
|
transmuxer.push(packetize(generatePMT({
|
||
|
hasVideo: true,
|
||
|
hasAudio: true
|
||
|
})));
|
||
|
|
||
|
transmuxer.push(packetize(audioPes([
|
||
|
0x19, 0x47
|
||
|
], true, earliestDts - baseTime - 1)));
|
||
|
transmuxer.push(packetize(videoPes([
|
||
|
0x09, 0x01 // access_unit_delimiter_rbsp
|
||
|
], true, earliestDts)));
|
||
|
transmuxer.push(packetize(videoPes([
|
||
|
0x08, 0x01 // pic_parameter_set_rbsp
|
||
|
], true, earliestDts)));
|
||
|
transmuxer.push(packetize(videoPes([
|
||
|
0x07, // seq_parameter_set_rbsp
|
||
|
0x27, 0x42, 0xe0, 0x0b,
|
||
|
0xa9, 0x18, 0x60, 0x9d,
|
||
|
0x80, 0x53, 0x06, 0x01,
|
||
|
0x06, 0xb6, 0xc2, 0xb5,
|
||
|
0xef, 0x7c, 0x04
|
||
|
], false, earliestDts)));
|
||
|
transmuxer.push(packetize(videoPes([
|
||
|
0x05, 0x01 // slice_layer_without_partitioning_rbsp_idr
|
||
|
], true, earliestDts)));
|
||
|
transmuxer.flush();
|
||
|
|
||
|
// the partial transmuxer only generates a video segment
|
||
|
// when all audio frames are trimmed.
|
||
|
if (test.options.keepOriginalTimestamps && !baseTime) {
|
||
|
assert.equal(segments.length, 2, 'generated both a video/audio segment');
|
||
|
assert.equal(segments[0].type, 'video', 'segment is video');
|
||
|
assert.equal(segments[1].type, 'audio', 'segment is audio');
|
||
|
} else {
|
||
|
assert.equal(segments.length, 1, 'generated only a video segment');
|
||
|
assert.equal(segments[0].type, 'video', 'segment is video');
|
||
|
}
|
||
|
});
|
||
|
});
|