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.');
       }