From b6eb76201bee5534f2875e588813043bacee7dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?A=CC=81lvaro=20Velad=20Galva=CC=81n?= <ladvan91@hotmail.com> Date: Thu, 2 Jan 2025 15:27:05 +0100 Subject: [PATCH] fix: Fix gaps produced by the transmuxer --- lib/transmuxer/aac_transmuxer.js | 14 +++++++++++--- lib/transmuxer/ac3_transmuxer.js | 14 +++++++++++--- lib/transmuxer/ec3_transmuxer.js | 14 +++++++++++--- lib/transmuxer/mp3_transmuxer.js | 14 +++++++++++--- lib/transmuxer/ts_transmuxer.js | 14 +++++++++++--- test/transmuxer/transmuxer_integration.js | 4 +--- 6 files changed, 56 insertions(+), 18 deletions(-) diff --git a/lib/transmuxer/aac_transmuxer.js b/lib/transmuxer/aac_transmuxer.js index f5c8a34330..d543144a34 100644 --- a/lib/transmuxer/aac_transmuxer.js +++ b/lib/transmuxer/aac_transmuxer.js @@ -35,6 +35,9 @@ shaka.transmuxer.AacTransmuxer = class { /** @private {!Map.<string, !Uint8Array>} */ this.initSegments = new Map(); + + /** @private {?Uint8Array} */ + this.lastInitSegment_ = null; } @@ -215,11 +218,16 @@ shaka.transmuxer.AacTransmuxer = class { } else { initSegment = this.initSegments.get(initSegmentKey); } + const appendInitSegment = this.lastInitSegment_ !== initSegment; const segmentData = mp4Generator.segmentData(); - + this.lastInitSegment_ = initSegment; this.frameIndex_++; - const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); - return Promise.resolve(transmuxData); + if (appendInitSegment) { + const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); + return Promise.resolve(transmuxData); + } else { + return Promise.resolve(segmentData); + } } }; diff --git a/lib/transmuxer/ac3_transmuxer.js b/lib/transmuxer/ac3_transmuxer.js index f6cc6d044d..bd546c8fbc 100644 --- a/lib/transmuxer/ac3_transmuxer.js +++ b/lib/transmuxer/ac3_transmuxer.js @@ -34,6 +34,9 @@ shaka.transmuxer.Ac3Transmuxer = class { /** @private {!Map.<string, !Uint8Array>} */ this.initSegments = new Map(); + + /** @private {?Uint8Array} */ + this.lastInitSegment_ = null; } @@ -203,11 +206,16 @@ shaka.transmuxer.Ac3Transmuxer = class { } else { initSegment = this.initSegments.get(initSegmentKey); } + const appendInitSegment = this.lastInitSegment_ !== initSegment; const segmentData = mp4Generator.segmentData(); - + this.lastInitSegment_ = initSegment; this.frameIndex_++; - const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); - return Promise.resolve(transmuxData); + if (appendInitSegment) { + const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); + return Promise.resolve(transmuxData); + } else { + return Promise.resolve(segmentData); + } } }; diff --git a/lib/transmuxer/ec3_transmuxer.js b/lib/transmuxer/ec3_transmuxer.js index 5c2a82c14a..634c06b770 100644 --- a/lib/transmuxer/ec3_transmuxer.js +++ b/lib/transmuxer/ec3_transmuxer.js @@ -34,6 +34,9 @@ shaka.transmuxer.Ec3Transmuxer = class { /** @private {!Map.<string, !Uint8Array>} */ this.initSegments = new Map(); + + /** @private {?Uint8Array} */ + this.lastInitSegment_ = null; } @@ -203,11 +206,16 @@ shaka.transmuxer.Ec3Transmuxer = class { } else { initSegment = this.initSegments.get(initSegmentKey); } + const appendInitSegment = this.lastInitSegment_ !== initSegment; const segmentData = mp4Generator.segmentData(); - + this.lastInitSegment_ = initSegment; this.frameIndex_++; - const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); - return Promise.resolve(transmuxData); + if (appendInitSegment) { + const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); + return Promise.resolve(transmuxData); + } else { + return Promise.resolve(segmentData); + } } }; diff --git a/lib/transmuxer/mp3_transmuxer.js b/lib/transmuxer/mp3_transmuxer.js index f223566047..9886b5d76b 100644 --- a/lib/transmuxer/mp3_transmuxer.js +++ b/lib/transmuxer/mp3_transmuxer.js @@ -34,6 +34,9 @@ shaka.transmuxer.Mp3Transmuxer = class { /** @private {!Map.<string, !Uint8Array>} */ this.initSegments = new Map(); + + /** @private {?Uint8Array} */ + this.lastInitSegment_ = null; } @@ -196,11 +199,16 @@ shaka.transmuxer.Mp3Transmuxer = class { } else { initSegment = this.initSegments.get(initSegmentKey); } + const appendInitSegment = this.lastInitSegment_ !== initSegment; const segmentData = mp4Generator.segmentData(); - + this.lastInitSegment_ = initSegment; this.frameIndex_++; - const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); - return Promise.resolve(transmuxData); + if (appendInitSegment) { + const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); + return Promise.resolve(transmuxData); + } else { + return Promise.resolve(segmentData); + } } }; diff --git a/lib/transmuxer/ts_transmuxer.js b/lib/transmuxer/ts_transmuxer.js index 753a677735..88e6b34e97 100644 --- a/lib/transmuxer/ts_transmuxer.js +++ b/lib/transmuxer/ts_transmuxer.js @@ -52,6 +52,9 @@ shaka.transmuxer.TsTransmuxer = class { /** @private {?shaka.transmuxer.AacTransmuxer} */ this.aacTransmuxer_ = null; + + /** @private {?Uint8Array} */ + this.lastInitSegment_ = null; } @@ -293,11 +296,16 @@ shaka.transmuxer.TsTransmuxer = class { } else { initSegment = this.initSegments.get(initSegmentKey); } + const appendInitSegment = this.lastInitSegment_ !== initSegment; const segmentData = mp4Generator.segmentData(); - + this.lastInitSegment_ = initSegment; this.frameIndex_++; - const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); - return Promise.resolve(transmuxData); + if (appendInitSegment) { + const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData); + return Promise.resolve(transmuxData); + } else { + return Promise.resolve(segmentData); + } } diff --git a/test/transmuxer/transmuxer_integration.js b/test/transmuxer/transmuxer_integration.js index a3d8363289..4e172a6fd7 100644 --- a/test/transmuxer/transmuxer_integration.js +++ b/test/transmuxer/transmuxer_integration.js @@ -403,9 +403,7 @@ describe('Transmuxer Player', () => { await player.unload(); }); - // TODO: Fix the transmuxer for segments that do not start with a keyframe - // https://github.com/shaka-project/shaka-player/issues/7462 - xit('H.264+AC3 in TS', async () => { + it('H.264+AC3 in TS', async () => { if (!await Util.isTypeSupported('audio/mp4; codecs="ac-3"')) { pending('Codec AC-3 is not supported by the platform.'); }