Source: lib/cea/ts_cea_parser.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.cea.TsCeaParser');
  7. goog.require('shaka.cea.CeaUtils');
  8. goog.require('shaka.cea.SeiProcessor');
  9. goog.require('shaka.media.ClosedCaptionParser');
  10. goog.require('shaka.util.BufferUtils');
  11. goog.require('shaka.util.TsParser');
  12. /**
  13. * MPEG TS CEA parser.
  14. * @implements {shaka.extern.ICeaParser}
  15. * @export
  16. */
  17. shaka.cea.TsCeaParser = class {
  18. /** */
  19. constructor() {
  20. /**
  21. * SEI data processor.
  22. * @private
  23. * @const {!shaka.cea.SeiProcessor}
  24. */
  25. this.seiProcessor_ = new shaka.cea.SeiProcessor();
  26. }
  27. /**
  28. * @override
  29. */
  30. init(initSegment) {
  31. // TS hasn't init segment
  32. }
  33. /**
  34. * @override
  35. */
  36. parse(mediaSegment) {
  37. const CeaUtils = shaka.cea.CeaUtils;
  38. /** @type {!Array<!shaka.extern.ICeaParser.CaptionPacket>} **/
  39. const captionPackets = [];
  40. const uint8ArrayData = shaka.util.BufferUtils.toUint8(mediaSegment);
  41. if (!shaka.util.TsParser.probe(uint8ArrayData)) {
  42. return captionPackets;
  43. }
  44. const tsParser = new shaka.util.TsParser().parse(uint8ArrayData);
  45. const codecs = tsParser.getCodecs();
  46. const videoNalus = tsParser.getVideoNalus();
  47. const validNaluTypes = [];
  48. switch (codecs.video) {
  49. case 'avc':
  50. validNaluTypes.push(CeaUtils.H264_NALU_TYPE_SEI);
  51. break;
  52. case 'hvc':
  53. validNaluTypes.push(CeaUtils.H265_PREFIX_NALU_TYPE_SEI);
  54. validNaluTypes.push(CeaUtils.H265_SUFFIX_NALU_TYPE_SEI);
  55. break;
  56. }
  57. if (!validNaluTypes.length) {
  58. return captionPackets;
  59. }
  60. for (const nalu of videoNalus) {
  61. if (validNaluTypes.includes(nalu.type) && nalu.time != null) {
  62. for (const packet of this.seiProcessor_.process(nalu.data)) {
  63. captionPackets.push({
  64. packet: packet,
  65. pts: nalu.time,
  66. });
  67. }
  68. }
  69. }
  70. return captionPackets;
  71. }
  72. };
  73. shaka.media.ClosedCaptionParser.registerParser('video/mp2t',
  74. () => new shaka.cea.TsCeaParser());