123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- 'use strict';
- var segments = require('data-files!segments');
- var
- QUnit = require('qunit'),
- tsInspector = require('../lib/tools/ts-inspector.js'),
- StreamTypes = require('../lib/m2ts/stream-types.js'),
- tsSegment = segments['test-segment.ts'](),
- tsNoAudioSegment = segments['test-no-audio-segment.ts'](),
- aacSegment = segments['test-aac-segment.aac'](),
- utils = require('./utils'),
- inspect = tsInspector.inspect,
- parseAudioPes_ = tsInspector.parseAudioPes_,
- packetize = utils.packetize,
- audioPes = utils.audioPes,
- PES_TIMESCALE = 90000;
- QUnit.module('TS Inspector');
- QUnit.test('returns null for empty segment input', function(assert) {
- assert.equal(inspect(new Uint8Array([])), null, 'returned null');
- });
- QUnit.test('can parse a ts segment', function(assert) {
- var expected = {
- video: [
- {
- type: 'video',
- pts: 126000,
- dts: 126000,
- ptsTime: 126000 / PES_TIMESCALE,
- dtsTime: 126000 / PES_TIMESCALE
- },
- {
- type: 'video',
- pts: 924000,
- dts: 924000,
- ptsTime: 924000 / PES_TIMESCALE,
- dtsTime: 924000 / PES_TIMESCALE
- }
- ],
- firstKeyFrame: {
- type: 'video',
- pts: 126000,
- dts: 126000,
- ptsTime: 126000 / PES_TIMESCALE,
- dtsTime: 126000 / PES_TIMESCALE
- },
- audio: [
- {
- type: 'audio',
- pts: 126000,
- dts: 126000,
- ptsTime: 126000 / PES_TIMESCALE,
- dtsTime: 126000 / PES_TIMESCALE
- },
- {
- type: 'audio',
- pts: 859518,
- dts: 859518,
- ptsTime: 859518 / PES_TIMESCALE,
- dtsTime: 859518 / PES_TIMESCALE
- }
- ]
- };
- assert.deepEqual(inspect(tsSegment), expected, 'parses ts segment timing data');
- });
- QUnit.test('adjusts timestamp values based on provided reference', function(assert) {
- var rollover = Math.pow(2, 33);
- var expected = {
- video: [
- {
- type: 'video',
- pts: (126000 + rollover),
- dts: (126000 + rollover),
- ptsTime: (126000 + rollover) / PES_TIMESCALE,
- dtsTime: (126000 + rollover) / PES_TIMESCALE
- },
- {
- type: 'video',
- pts: (924000 + rollover),
- dts: (924000 + rollover),
- ptsTime: (924000 + rollover) / PES_TIMESCALE,
- dtsTime: (924000 + rollover) / PES_TIMESCALE
- }
- ],
- firstKeyFrame: {
- type: 'video',
- pts: (126000 + rollover),
- dts: (126000 + rollover),
- ptsTime: (126000 + rollover) / PES_TIMESCALE,
- dtsTime: (126000 + rollover) / PES_TIMESCALE
- },
- audio: [
- {
- type: 'audio',
- pts: (126000 + rollover),
- dts: (126000 + rollover),
- ptsTime: (126000 + rollover) / PES_TIMESCALE,
- dtsTime: (126000 + rollover) / PES_TIMESCALE
- },
- {
- type: 'audio',
- pts: (859518 + rollover),
- dts: (859518 + rollover),
- ptsTime: (859518 + rollover) / PES_TIMESCALE,
- dtsTime: (859518 + rollover) / PES_TIMESCALE
- }
- ]
- };
- assert.deepEqual(inspect(tsSegment, rollover - 1), expected,
- 'adjusts inspected time data to account for pts rollover');
- });
- QUnit.test('can parse an aac segment', function(assert) {
- var expected = {
- audio: [
- {
- type: 'audio',
- pts: 895690,
- dts: 895690,
- ptsTime: 895690 / PES_TIMESCALE,
- dtsTime: 895690 / PES_TIMESCALE
- },
- {
- type: 'audio',
- pts: (895690 + (430 * 1024 * PES_TIMESCALE / 44100)),
- dts: (895690 + (430 * 1024 * PES_TIMESCALE / 44100)),
- ptsTime: (895690 + (430 * 1024 * PES_TIMESCALE / 44100)) / PES_TIMESCALE,
- dtsTime: (895690 + (430 * 1024 * PES_TIMESCALE / 44100)) / PES_TIMESCALE
- }
- ]
- };
- assert.deepEqual(inspect(aacSegment), expected, 'parses aac segment timing data');
- });
- QUnit.test('can parse ts segment with no audio muxed in', function(assert) {
- var expected = {
- video: [
- {
- type: 'video',
- pts: 126000,
- dts: 126000,
- ptsTime: 126000 / PES_TIMESCALE,
- dtsTime: 126000 / PES_TIMESCALE
- },
- {
- type: 'video',
- pts: 924000,
- dts: 924000,
- ptsTime: 924000 / PES_TIMESCALE,
- dtsTime: 924000 / PES_TIMESCALE
- }
- ],
- firstKeyFrame: {
- type: 'video',
- pts: 126000,
- dts: 126000,
- ptsTime: 126000 / PES_TIMESCALE,
- dtsTime: 126000 / PES_TIMESCALE
- }
- };
- var actual = inspect(tsNoAudioSegment);
- assert.equal(typeof actual.audio, 'undefined', 'results do not contain audio info');
- assert.deepEqual(actual, expected,
- 'parses ts segment without audio timing data');
- });
- QUnit.test('can parse audio PES when it\'s the only packet in a stream', function(assert) {
- var
- pts = 90000,
- pmt = {
- // fake pmt pid that doesn't clash with the audio pid
- pid: 0x10,
- table: {
- // pid copied over from default of audioPes function
- 0x12: StreamTypes.ADTS_STREAM_TYPE
- }
- },
- result = { audio: [] };
- parseAudioPes_(packetize(audioPes([0x00], true, pts)), pmt, result);
- // note that both the first and last packet timings are the same, as there's only one
- // packet to parse
- assert.deepEqual(
- result.audio,
- [{
- dts: pts,
- pts: pts,
- type: 'audio'
- }, {
- dts: pts,
- pts: pts,
- type: 'audio'
- }],
- 'parses audio pes for timing info');
- });
|