diff --git a/lib/media/closed_caption_parser.js b/lib/media/closed_caption_parser.js index 622470475e..c73e2c6be6 100644 --- a/lib/media/closed_caption_parser.js +++ b/lib/media/closed_caption_parser.js @@ -86,7 +86,9 @@ shaka.media.ClosedCaptionParser = class { for (const captionPacket of captionPackets) { const uint8ArrayData = shaka.util.BufferUtils.toUint8(captionPacket.packet); - this.ceaDecoder_.extract(uint8ArrayData, captionPacket.pts); + if (uint8ArrayData.length > 0) { + this.ceaDecoder_.extract(uint8ArrayData, captionPacket.pts); + } } // Decode and return the parsed captions. diff --git a/test/media/closed_caption_parser_unit.js b/test/media/closed_caption_parser_unit.js new file mode 100644 index 0000000000..086d51975b --- /dev/null +++ b/test/media/closed_caption_parser_unit.js @@ -0,0 +1,15 @@ +goog.require('shaka.media.ClosedCaptionParser'); +goog.require('shaka.test.Util'); + +describe('ClosedCaptionParser', () => { + it('can handle empty caption packets', async () => { + const initSegment = await shaka.test.Util.fetch( + 'base/test/test/assets/empty_caption_video_init.mp4'); + const videoSegment = await shaka.test.Util.fetch( + 'base/test/test/assets/empty_caption_video_segment.mp4'); + const parser = new shaka.media.ClosedCaptionParser(); + parser.init(initSegment); + parser.parseFrom(videoSegment); + }); +}); + diff --git a/test/test/assets/empty_caption_video_init.mp4 b/test/test/assets/empty_caption_video_init.mp4 new file mode 100644 index 0000000000..41345d5263 Binary files /dev/null and b/test/test/assets/empty_caption_video_init.mp4 differ diff --git a/test/test/assets/empty_caption_video_segment.mp4 b/test/test/assets/empty_caption_video_segment.mp4 new file mode 100644 index 0000000000..a7788fd742 Binary files /dev/null and b/test/test/assets/empty_caption_video_segment.mp4 differ