From d00ca1e34368c826879e552524ed3f2ca5a25a1b Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 26 Mar 2024 07:36:46 -0700 Subject: [PATCH] Plumb MP3 average bitrate from metadata frames into Format Issue: androidx/media#1081 #minor-release PiperOrigin-RevId: 619185083 --- RELEASENOTES.md | 2 ++ .../extractor/mp3/ConstantBitrateSeeker.java | 8 ++++++++ .../media3/extractor/mp3/IndexSeeker.java | 16 ++++++++++++++++ .../media3/extractor/mp3/MlltSeeker.java | 5 +++++ .../media3/extractor/mp3/Mp3Extractor.java | 9 ++++++--- .../androidx/media3/extractor/mp3/Seeker.java | 11 +++++++++++ .../media3/extractor/mp3/VbriSeeker.java | 13 +++++++++++-- .../media3/extractor/mp3/XingSeeker.java | 17 ++++++++++++++--- ...variable-frame-size-no-seek-table.mp3.0.dump | 1 + ...variable-frame-size-no-seek-table.mp3.1.dump | 1 + ...variable-frame-size-no-seek-table.mp3.2.dump | 1 + ...variable-frame-size-no-seek-table.mp3.3.dump | 1 + ...e-size-no-seek-table.mp3.unknown_length.dump | 1 + .../bear-cbr_cbr-seeking-always-enabled.0.dump | 1 + .../bear-cbr_cbr-seeking-always-enabled.1.dump | 1 + .../bear-cbr_cbr-seeking-always-enabled.2.dump | 1 + .../bear-cbr_cbr-seeking-always-enabled.3.dump | 1 + ...r-seeking-always-enabled.unknown_length.dump | 1 + .../mp3/bear-vbr-xing-header.mp3.0.dump | 1 + .../mp3/bear-vbr-xing-header.mp3.1.dump | 1 + .../mp3/bear-vbr-xing-header.mp3.2.dump | 1 + .../mp3/bear-vbr-xing-header.mp3.3.dump | 1 + ...bear-vbr-xing-header.mp3.unknown_length.dump | 1 + .../extractordumps/mp3/play-trimmed.mp3.0.dump | 1 + .../extractordumps/mp3/play-trimmed.mp3.1.dump | 1 + .../extractordumps/mp3/play-trimmed.mp3.2.dump | 1 + .../extractordumps/mp3/play-trimmed.mp3.3.dump | 1 + .../mp3/play-trimmed.mp3.unknown_length.dump | 1 + .../mp3/test-cbr-info-header.mp3.0.dump | 1 + .../mp3/test-cbr-info-header.mp3.1.dump | 1 + .../mp3/test-cbr-info-header.mp3.2.dump | 1 + .../mp3/test-cbr-info-header.mp3.3.dump | 1 + ...test-cbr-info-header.mp3.unknown_length.dump | 1 + ...g_mixedWith_sample_18byte_nclx_colr.mp4.dump | 1 + ...ping_mixedWith_test-cbr-info-header.mp3.dump | 1 + 35 files changed, 100 insertions(+), 8 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 250d3174a8..ca28769495 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -47,6 +47,8 @@ resolution but a very small number of frames ([#1051](https://github.com/androidx/media/issues/1051)). * Extractors: + * MP3: Populate `Format.averageBitrate` from metadata frames such as + `XING` and `VBRI`. * Audio: * Allow renderer recovery by disabling offload if audio track fails to initialize in offload mode. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java index 85cba7c2b5..179e718dd7 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java @@ -24,6 +24,8 @@ import androidx.media3.extractor.MpegAudioUtil; */ /* package */ final class ConstantBitrateSeeker extends ConstantBitrateSeekMap implements Seeker { + private final int bitrate; + /** * @param inputLength The length of the stream in bytes, or {@link C#LENGTH_UNSET} if unknown. * @param firstFramePosition The position of the first frame in the stream. @@ -45,6 +47,7 @@ import androidx.media3.extractor.MpegAudioUtil; mpegAudioHeader.bitrate, mpegAudioHeader.frameSize, allowSeeksIfLengthUnknown); + bitrate = mpegAudioHeader.bitrate; } @Override @@ -56,4 +59,9 @@ import androidx.media3.extractor.MpegAudioUtil; public long getDataEndPosition() { return C.INDEX_UNSET; } + + @Override + public int getAverageBitrate() { + return bitrate; + } } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/IndexSeeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/IndexSeeker.java index b2d0c8a6d9..e6207d0732 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/IndexSeeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/IndexSeeker.java @@ -20,6 +20,7 @@ import androidx.media3.common.C; import androidx.media3.common.util.LongArray; import androidx.media3.common.util.Util; import androidx.media3.extractor.SeekPoint; +import java.math.RoundingMode; /** MP3 seeker that builds a time-to-byte mapping as the stream is read. */ /* package */ final class IndexSeeker implements Seeker { @@ -30,6 +31,7 @@ import androidx.media3.extractor.SeekPoint; private final long dataEndPosition; private final LongArray timesUs; private final LongArray positions; + private final int averageBitrate; private long durationUs; @@ -40,6 +42,15 @@ import androidx.media3.extractor.SeekPoint; positions = new LongArray(); timesUs.add(0L); positions.add(dataStartPosition); + if (durationUs != C.TIME_UNSET) { + long bitrate = + Util.scaleLargeValue( + dataStartPosition - dataEndPosition, 8, durationUs, RoundingMode.HALF_UP); + this.averageBitrate = + bitrate > 0 && bitrate <= Integer.MAX_VALUE ? (int) bitrate : C.RATE_UNSET_INT; + } else { + this.averageBitrate = C.RATE_UNSET_INT; + } } @Override @@ -79,6 +90,11 @@ import androidx.media3.extractor.SeekPoint; } } + @Override + public int getAverageBitrate() { + return averageBitrate; + } + /** * Adds a seek point to the index if it is sufficiently distant from the other points. * diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/MlltSeeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/MlltSeeker.java index d1dba61ffd..63e62343cc 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/MlltSeeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/MlltSeeker.java @@ -127,4 +127,9 @@ import androidx.media3.extractor.metadata.id3.MlltFrame; public long getDataEndPosition() { return C.INDEX_UNSET; } + + @Override + public int getAverageBitrate() { + return C.RATE_UNSET_INT; + } } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java index e9d4163ed0..337e69b817 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java @@ -280,7 +280,7 @@ public final class Mp3Extractor implements Extractor { if (seeker == null) { seeker = computeSeeker(input); extractorOutput.seekMap(seeker); - currentTrackOutput.format( + Format.Builder format = new Format.Builder() .setSampleMimeType(synchronizedHeader.mimeType) .setMaxInputSize(MpegAudioUtil.MAX_FRAME_SIZE_BYTES) @@ -288,8 +288,11 @@ public final class Mp3Extractor implements Extractor { .setSampleRate(synchronizedHeader.sampleRate) .setEncoderDelay(gaplessInfoHolder.encoderDelay) .setEncoderPadding(gaplessInfoHolder.encoderPadding) - .setMetadata((flags & FLAG_DISABLE_ID3_METADATA) != 0 ? null : metadata) - .build()); + .setMetadata((flags & FLAG_DISABLE_ID3_METADATA) != 0 ? null : metadata); + if (seeker.getAverageBitrate() != C.RATE_UNSET_INT) { + format.setAverageBitrate(seeker.getAverageBitrate()); + } + currentTrackOutput.format(format.build()); firstSamplePosition = input.getPosition(); } else if (firstSamplePosition != 0) { long inputPosition = input.getPosition(); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Seeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Seeker.java index 6f3bca9a1e..19e2514be5 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Seeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Seeker.java @@ -39,6 +39,12 @@ import androidx.media3.extractor.SeekMap; */ long getDataEndPosition(); + /** + * Returns the average bitrate (usually derived from the duration and length of the file), or + * {@link C#RATE_UNSET_INT} if not known. + */ + int getAverageBitrate(); + /** A {@link Seeker} that does not support seeking through audio data. */ /* package */ class UnseekableSeeker extends SeekMap.Unseekable implements Seeker { @@ -56,5 +62,10 @@ import androidx.media3.extractor.SeekMap; // Position unset as we do not know the data end position. Note that returning 0 doesn't work. return C.INDEX_UNSET; } + + @Override + public int getAverageBitrate() { + return C.RATE_UNSET_INT; + } } } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/VbriSeeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/VbriSeeker.java index 50a4889a10..42d8aa0cc2 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/VbriSeeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/VbriSeeker.java @@ -94,19 +94,23 @@ import androidx.media3.extractor.SeekPoint; if (inputLength != C.LENGTH_UNSET && inputLength != position) { Log.w(TAG, "VBRI data size mismatch: " + inputLength + ", " + position); } - return new VbriSeeker(timesUs, positions, durationUs, /* dataEndPosition= */ position); + return new VbriSeeker( + timesUs, positions, durationUs, /* dataEndPosition= */ position, mpegAudioHeader.bitrate); } private final long[] timesUs; private final long[] positions; private final long durationUs; private final long dataEndPosition; + private final int bitrate; - private VbriSeeker(long[] timesUs, long[] positions, long durationUs, long dataEndPosition) { + private VbriSeeker( + long[] timesUs, long[] positions, long durationUs, long dataEndPosition, int bitrate) { this.timesUs = timesUs; this.positions = positions; this.durationUs = durationUs; this.dataEndPosition = dataEndPosition; + this.bitrate = bitrate; } @Override @@ -140,4 +144,9 @@ import androidx.media3.extractor.SeekPoint; public long getDataEndPosition() { return dataEndPosition; } + + @Override + public int getAverageBitrate() { + return bitrate; + } } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java index 515a11335e..0cb4fad698 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java @@ -55,7 +55,8 @@ import androidx.media3.extractor.SeekPoint; xingFrame.header.sampleRate); if (xingFrame.dataSize == C.LENGTH_UNSET || xingFrame.tableOfContents == null) { // If the size in bytes or table of contents is missing, the stream is not seekable. - return new XingSeeker(position, xingFrame.header.frameSize, durationUs); + return new XingSeeker( + position, xingFrame.header.frameSize, durationUs, xingFrame.header.bitrate); } if (inputLength != C.LENGTH_UNSET && inputLength != position + xingFrame.dataSize) { @@ -66,6 +67,7 @@ import androidx.media3.extractor.SeekPoint; position, xingFrame.header.frameSize, durationUs, + xingFrame.header.bitrate, xingFrame.dataSize, xingFrame.tableOfContents); } @@ -73,6 +75,7 @@ import androidx.media3.extractor.SeekPoint; private final long dataStartPosition; private final int xingFrameSize; private final long durationUs; + private final int bitrate; /** Data size, including the XING frame. */ private final long dataSize; @@ -85,11 +88,12 @@ import androidx.media3.extractor.SeekPoint; */ @Nullable private final long[] tableOfContents; - private XingSeeker(long dataStartPosition, int xingFrameSize, long durationUs) { + private XingSeeker(long dataStartPosition, int xingFrameSize, long durationUs, int bitrate) { this( dataStartPosition, xingFrameSize, durationUs, + bitrate, /* dataSize= */ C.LENGTH_UNSET, /* tableOfContents= */ null); } @@ -98,13 +102,15 @@ import androidx.media3.extractor.SeekPoint; long dataStartPosition, int xingFrameSize, long durationUs, + int bitrate, long dataSize, @Nullable long[] tableOfContents) { this.dataStartPosition = dataStartPosition; this.xingFrameSize = xingFrameSize; this.durationUs = durationUs; - this.tableOfContents = tableOfContents; + this.bitrate = bitrate; this.dataSize = dataSize; + this.tableOfContents = tableOfContents; dataEndPosition = dataSize == C.LENGTH_UNSET ? C.INDEX_UNSET : dataStartPosition + dataSize; } @@ -172,6 +178,11 @@ import androidx.media3.extractor.SeekPoint; return dataEndPosition; } + @Override + public int getAverageBitrate() { + return bitrate; + } + /** * Returns the time in microseconds for a given table index. * diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.0.dump index ba8b3d56bf..b8b7af77d0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.0.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 45139 sample count = 108 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.1.dump index 723354f768..02a784b9e7 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.1.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 30093 sample count = 72 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.2.dump index 00bf3f6ad4..297c862c80 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.2.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 15046 sample count = 36 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.3.dump index 231aede4cc..bf484c7ee3 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.3.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 0 sample count = 0 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.unknown_length.dump index bedbf6f497..024e90989a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.unknown_length.dump @@ -7,6 +7,7 @@ track 0: total output bytes = 45139 sample count = 108 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.0.dump index ba8b3d56bf..b8b7af77d0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.0.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 45139 sample count = 108 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.1.dump index 723354f768..02a784b9e7 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.1.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 30093 sample count = 72 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.2.dump index 00bf3f6ad4..297c862c80 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.2.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 15046 sample count = 36 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.3.dump index 231aede4cc..bf484c7ee3 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.3.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 0 sample count = 0 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.unknown_length.dump index 0b5cee3bb7..9d3936b518 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-cbr_cbr-seeking-always-enabled.unknown_length.dump @@ -8,6 +8,7 @@ track 0: total output bytes = 45139 sample count = 108 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.0.dump index 633b451d6b..1dd1aed0a8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.0.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 38160 sample count = 117 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.1.dump index 4c022e760b..420919c0b0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.1.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 24384 sample count = 77 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.2.dump index 95a79c22a8..64fe870c86 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.2.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 11328 sample count = 38 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.3.dump index 5f8a8b26a4..55ffb9d9d0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.3.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 0 sample count = 0 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.unknown_length.dump index 633b451d6b..1dd1aed0a8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header.mp3.unknown_length.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 38160 sample count = 117 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.0.dump index 0fd5622999..cc3c05e915 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.0.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 418 sample count = 1 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.1.dump index 0fd5622999..cc3c05e915 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.1.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 418 sample count = 1 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.2.dump index 0fd5622999..cc3c05e915 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.2.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 418 sample count = 1 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.3.dump index 0fd5622999..cc3c05e915 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.3.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 418 sample count = 1 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.unknown_length.dump index 2e747d9b21..b1c1ef1f49 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/play-trimmed.mp3.unknown_length.dump @@ -7,6 +7,7 @@ track 0: total output bytes = 418 sample count = 1 format 0: + averageBitrate = 128000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 2 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.0.dump index 86ac2aad9f..2703819722 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.0.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 8359 sample count = 40 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.1.dump index 5868123166..80ddbc5768 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.1.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 5643 sample count = 27 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.2.dump index 25a2640d65..19af6f791a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.2.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 2926 sample count = 14 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.3.dump index f7ea250468..27a2286cec 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.3.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 0 sample count = 0 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.unknown_length.dump index 86ac2aad9f..2703819722 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/test-cbr-info-header.mp3.unknown_length.dump @@ -10,6 +10,7 @@ track 0: total output bytes = 8359 sample count = 40 format 0: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 1 diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp3/test-cbr-info-header.mp3/looping_mixedWith_sample_18byte_nclx_colr.mp4.dump b/libraries/test_data/src/test/assets/transformerdumps/mp3/test-cbr-info-header.mp3/looping_mixedWith_sample_18byte_nclx_colr.mp4.dump index b71a426130..7a717c6e8a 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp3/test-cbr-info-header.mp3/looping_mixedWith_sample_18byte_nclx_colr.mp4.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp3/test-cbr-info-header.mp3/looping_mixedWith_sample_18byte_nclx_colr.mp4.dump @@ -1,4 +1,5 @@ format audio: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 1 diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_18byte_nclx_colr.mp4/looping_mixedWith_test-cbr-info-header.mp3.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_18byte_nclx_colr.mp4/looping_mixedWith_test-cbr-info-header.mp3.dump index c2722157e7..ba53bd2055 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_18byte_nclx_colr.mp4/looping_mixedWith_test-cbr-info-header.mp3.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_18byte_nclx_colr.mp4/looping_mixedWith_test-cbr-info-header.mp3.dump @@ -1,4 +1,5 @@ format audio: + averageBitrate = 64000 sampleMimeType = audio/mpeg maxInputSize = 4096 channelCount = 1