diff --git a/lib/cea/mp4_cea_parser.js b/lib/cea/mp4_cea_parser.js index 553407813a..e931bd9303 100644 --- a/lib/cea/mp4_cea_parser.js +++ b/lib/cea/mp4_cea_parser.js @@ -275,6 +275,7 @@ shaka.cea.Mp4CeaParser = class { const naluHeader = reader.readUint8(); let naluType = null; let isSeiMessage = false; + let naluHeaderSize = 1; goog.asserts.assert(this.bitstreamFormat_ != BitstreamFormat.UNKNOWN, 'Bitstream format should have been checked before now!'); @@ -285,6 +286,8 @@ shaka.cea.Mp4CeaParser = class { break; case BitstreamFormat.H265: + naluHeaderSize = 2; + reader.skip(1); naluType = (naluHeader >> 1) & 0x3f; isSeiMessage = naluType == ICeaParser.H265_PREFIX_NALU_TYPE_SEI || @@ -304,7 +307,7 @@ shaka.cea.Mp4CeaParser = class { const pts = (time + timeOffset)/timescale; for (const packet of this.seiProcessor_ - .process(reader.readBytes(naluSize - 1))) { + .process(reader.readBytes(naluSize - naluHeaderSize))) { captionPackets.push({ packet, pts, @@ -312,7 +315,7 @@ shaka.cea.Mp4CeaParser = class { } } else { try { - reader.skip(naluSize - 1); + reader.skip(naluSize - naluHeaderSize); } catch (e) { // It is necessary to ignore this error because it can break the start // of playback even if the user does not want to see the subtitles. diff --git a/test/cea/mp4_cea_parser_unit.js b/test/cea/mp4_cea_parser_unit.js index 3f93c65bc8..6c8c51ffaa 100644 --- a/test/cea/mp4_cea_parser_unit.js +++ b/test/cea/mp4_cea_parser_unit.js @@ -7,20 +7,30 @@ describe('Mp4CeaParser', () => { const ceaInitSegmentUri = '/base/test/test/assets/cea-init.mp4'; const ceaSegmentUri = '/base/test/test/assets/cea-segment.mp4'; + const h265ceaInitSegmentUri = '/base/test/test/assets/h265-cea-init.mp4'; + const h265ceaSegmentUri = '/base/test/test/assets/h265-cea-segment.mp4'; const Util = shaka.test.Util; /** @type {!ArrayBuffer} */ let ceaInitSegment; /** @type {!ArrayBuffer} */ let ceaSegment; + /** @type {!ArrayBuffer} */ + let h265ceaInitSegment; + /** @type {!ArrayBuffer} */ + let h265ceaSegment; beforeAll(async () => { const responses = await Promise.all([ shaka.test.Util.fetch(ceaInitSegmentUri), shaka.test.Util.fetch(ceaSegmentUri), + shaka.test.Util.fetch(h265ceaInitSegmentUri), + shaka.test.Util.fetch(h265ceaSegmentUri), ]); ceaInitSegment = responses[0]; ceaSegment = responses[1]; + h265ceaInitSegment = responses[2]; + h265ceaSegment = responses[3]; }); /** @@ -70,6 +80,15 @@ describe('Mp4CeaParser', () => { .toEqual(expectedCea708Packet); }); + it('parses cea data from an h265 mp4 stream', () => { + const ceaParser = new shaka.cea.Mp4CeaParser(); + + ceaParser.init(h265ceaInitSegment); + const ceaPackets = ceaParser.parse(h265ceaSegment); + expect(ceaPackets).toBeDefined(); + expect(ceaPackets.length).toBe(60); + }); + it('parses an invalid init segment', () => { const cea708Parser = new shaka.cea.Mp4CeaParser(); diff --git a/test/test/assets/h265-cea-init.mp4 b/test/test/assets/h265-cea-init.mp4 new file mode 100644 index 0000000000..67b7e96b96 Binary files /dev/null and b/test/test/assets/h265-cea-init.mp4 differ diff --git a/test/test/assets/h265-cea-segment.mp4 b/test/test/assets/h265-cea-segment.mp4 new file mode 100644 index 0000000000..b1b9f90eef Binary files /dev/null and b/test/test/assets/h265-cea-segment.mp4 differ