ts-inspector.test.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. 'use strict';
  2. var segments = require('data-files!segments');
  3. var
  4. QUnit = require('qunit'),
  5. tsInspector = require('../lib/tools/ts-inspector.js'),
  6. StreamTypes = require('../lib/m2ts/stream-types.js'),
  7. tsSegment = segments['test-segment.ts'](),
  8. tsNoAudioSegment = segments['test-no-audio-segment.ts'](),
  9. aacSegment = segments['test-aac-segment.aac'](),
  10. utils = require('./utils'),
  11. inspect = tsInspector.inspect,
  12. parseAudioPes_ = tsInspector.parseAudioPes_,
  13. packetize = utils.packetize,
  14. audioPes = utils.audioPes,
  15. PES_TIMESCALE = 90000;
  16. QUnit.module('TS Inspector');
  17. QUnit.test('returns null for empty segment input', function(assert) {
  18. assert.equal(inspect(new Uint8Array([])), null, 'returned null');
  19. });
  20. QUnit.test('can parse a ts segment', function(assert) {
  21. var expected = {
  22. video: [
  23. {
  24. type: 'video',
  25. pts: 126000,
  26. dts: 126000,
  27. ptsTime: 126000 / PES_TIMESCALE,
  28. dtsTime: 126000 / PES_TIMESCALE
  29. },
  30. {
  31. type: 'video',
  32. pts: 924000,
  33. dts: 924000,
  34. ptsTime: 924000 / PES_TIMESCALE,
  35. dtsTime: 924000 / PES_TIMESCALE
  36. }
  37. ],
  38. firstKeyFrame: {
  39. type: 'video',
  40. pts: 126000,
  41. dts: 126000,
  42. ptsTime: 126000 / PES_TIMESCALE,
  43. dtsTime: 126000 / PES_TIMESCALE
  44. },
  45. audio: [
  46. {
  47. type: 'audio',
  48. pts: 126000,
  49. dts: 126000,
  50. ptsTime: 126000 / PES_TIMESCALE,
  51. dtsTime: 126000 / PES_TIMESCALE
  52. },
  53. {
  54. type: 'audio',
  55. pts: 859518,
  56. dts: 859518,
  57. ptsTime: 859518 / PES_TIMESCALE,
  58. dtsTime: 859518 / PES_TIMESCALE
  59. }
  60. ]
  61. };
  62. assert.deepEqual(inspect(tsSegment), expected, 'parses ts segment timing data');
  63. });
  64. QUnit.test('adjusts timestamp values based on provided reference', function(assert) {
  65. var rollover = Math.pow(2, 33);
  66. var expected = {
  67. video: [
  68. {
  69. type: 'video',
  70. pts: (126000 + rollover),
  71. dts: (126000 + rollover),
  72. ptsTime: (126000 + rollover) / PES_TIMESCALE,
  73. dtsTime: (126000 + rollover) / PES_TIMESCALE
  74. },
  75. {
  76. type: 'video',
  77. pts: (924000 + rollover),
  78. dts: (924000 + rollover),
  79. ptsTime: (924000 + rollover) / PES_TIMESCALE,
  80. dtsTime: (924000 + rollover) / PES_TIMESCALE
  81. }
  82. ],
  83. firstKeyFrame: {
  84. type: 'video',
  85. pts: (126000 + rollover),
  86. dts: (126000 + rollover),
  87. ptsTime: (126000 + rollover) / PES_TIMESCALE,
  88. dtsTime: (126000 + rollover) / PES_TIMESCALE
  89. },
  90. audio: [
  91. {
  92. type: 'audio',
  93. pts: (126000 + rollover),
  94. dts: (126000 + rollover),
  95. ptsTime: (126000 + rollover) / PES_TIMESCALE,
  96. dtsTime: (126000 + rollover) / PES_TIMESCALE
  97. },
  98. {
  99. type: 'audio',
  100. pts: (859518 + rollover),
  101. dts: (859518 + rollover),
  102. ptsTime: (859518 + rollover) / PES_TIMESCALE,
  103. dtsTime: (859518 + rollover) / PES_TIMESCALE
  104. }
  105. ]
  106. };
  107. assert.deepEqual(inspect(tsSegment, rollover - 1), expected,
  108. 'adjusts inspected time data to account for pts rollover');
  109. });
  110. QUnit.test('can parse an aac segment', function(assert) {
  111. var expected = {
  112. audio: [
  113. {
  114. type: 'audio',
  115. pts: 895690,
  116. dts: 895690,
  117. ptsTime: 895690 / PES_TIMESCALE,
  118. dtsTime: 895690 / PES_TIMESCALE
  119. },
  120. {
  121. type: 'audio',
  122. pts: (895690 + (430 * 1024 * PES_TIMESCALE / 44100)),
  123. dts: (895690 + (430 * 1024 * PES_TIMESCALE / 44100)),
  124. ptsTime: (895690 + (430 * 1024 * PES_TIMESCALE / 44100)) / PES_TIMESCALE,
  125. dtsTime: (895690 + (430 * 1024 * PES_TIMESCALE / 44100)) / PES_TIMESCALE
  126. }
  127. ]
  128. };
  129. assert.deepEqual(inspect(aacSegment), expected, 'parses aac segment timing data');
  130. });
  131. QUnit.test('can parse ts segment with no audio muxed in', function(assert) {
  132. var expected = {
  133. video: [
  134. {
  135. type: 'video',
  136. pts: 126000,
  137. dts: 126000,
  138. ptsTime: 126000 / PES_TIMESCALE,
  139. dtsTime: 126000 / PES_TIMESCALE
  140. },
  141. {
  142. type: 'video',
  143. pts: 924000,
  144. dts: 924000,
  145. ptsTime: 924000 / PES_TIMESCALE,
  146. dtsTime: 924000 / PES_TIMESCALE
  147. }
  148. ],
  149. firstKeyFrame: {
  150. type: 'video',
  151. pts: 126000,
  152. dts: 126000,
  153. ptsTime: 126000 / PES_TIMESCALE,
  154. dtsTime: 126000 / PES_TIMESCALE
  155. }
  156. };
  157. var actual = inspect(tsNoAudioSegment);
  158. assert.equal(typeof actual.audio, 'undefined', 'results do not contain audio info');
  159. assert.deepEqual(actual, expected,
  160. 'parses ts segment without audio timing data');
  161. });
  162. QUnit.test('can parse audio PES when it\'s the only packet in a stream', function(assert) {
  163. var
  164. pts = 90000,
  165. pmt = {
  166. // fake pmt pid that doesn't clash with the audio pid
  167. pid: 0x10,
  168. table: {
  169. // pid copied over from default of audioPes function
  170. 0x12: StreamTypes.ADTS_STREAM_TYPE
  171. }
  172. },
  173. result = { audio: [] };
  174. parseAudioPes_(packetize(audioPes([0x00], true, pts)), pmt, result);
  175. // note that both the first and last packet timings are the same, as there's only one
  176. // packet to parse
  177. assert.deepEqual(
  178. result.audio,
  179. [{
  180. dts: pts,
  181. pts: pts,
  182. type: 'audio'
  183. }, {
  184. dts: pts,
  185. pts: pts,
  186. type: 'audio'
  187. }],
  188. 'parses audio pes for timing info');
  189. });