From 8d515c8cdce4cb372a735679d6a0574c7e1a5da6 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 22 May 2024 08:46:14 -0700 Subject: [PATCH] MP3: Make a defensive copy of the header in `XingFrame` constructor This is currently set from `Mp3Extractor.synchronizedHeader` which gets overwritten every time we read a new frame. It seems safer to make this defensive copy (and there will be at most one `XingFrame` instance per-playback, so this is not prohibitively expensive). PiperOrigin-RevId: 636181038 --- .../androidx/media3/extractor/MpegAudioUtil.java | 14 ++++++++++++++ .../androidx/media3/extractor/mp3/XingFrame.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java index f8fa5c99e1..105b60c830 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java @@ -48,6 +48,20 @@ public final class MpegAudioUtil { /** Number of samples stored in the frame. */ public int samplesPerFrame; + /** Constructs an empty instance. */ + public Header() {} + + /** Constructs an instance with values from {@code header}. */ + public Header(Header header) { + this.version = header.version; + this.mimeType = header.mimeType; + this.frameSize = header.frameSize; + this.sampleRate = header.sampleRate; + this.channels = header.channels; + this.bitrate = header.bitrate; + this.samplesPerFrame = header.samplesPerFrame; + } + /** * Populates the fields in this instance to reflect the MPEG audio header in {@code headerData}, * returning whether the header was valid. If false, the values of the fields in this instance diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingFrame.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingFrame.java index 45ddaf8f58..421f05ac20 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingFrame.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingFrame.java @@ -60,7 +60,7 @@ import androidx.media3.extractor.MpegAudioUtil; @Nullable long[] tableOfContents, int encoderDelay, int encoderPadding) { - this.header = header; + this.header = new MpegAudioUtil.Header(header); this.frameCount = frameCount; this.dataSize = dataSize; this.tableOfContents = tableOfContents;