diff --git a/RELEASENOTES.md b/RELEASENOTES.md index efcb086435..bb2bb34788 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -36,6 +36,8 @@ media speed with `setSpeed()`. * Track Selection: * Extractors: + * MP3: Parse LAME ReplayGain data + ([#2840](https://github.com/androidx/media/pull/2840)). * Inspector: * Audio: * Change underlying decoding library for IAMF decoder extension from 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 b0576bed72..5c3a910d12 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 @@ -176,7 +176,8 @@ public final class Mp3Extractor implements Extractor { private int synchronizedHeaderData; - @Nullable private Metadata metadata; + @Nullable private Metadata id3Metadata; + @Nullable private Metadata xingMetadata; private long basisTimeUs; private long samplesRead; private long firstSamplePosition; @@ -293,6 +294,15 @@ private int readInternal(ExtractorInput input) throws IOException { if (seeker == null) { seeker = computeSeeker(input); extractorOutput.seekMap(seeker); + Metadata metadata; + if (id3Metadata != null && (flags & FLAG_DISABLE_ID3_METADATA) == 0) { + metadata = + xingMetadata != null + ? id3Metadata.copyWithAppendedEntriesFrom(xingMetadata) + : id3Metadata; + } else { + metadata = xingMetadata; + } Format.Builder format = new Format.Builder() .setContainerMimeType(MimeTypes.AUDIO_MPEG) @@ -302,7 +312,7 @@ private int readInternal(ExtractorInput input) throws IOException { .setSampleRate(synchronizedHeader.sampleRate) .setEncoderDelay(gaplessInfoHolder.encoderDelay) .setEncoderPadding(gaplessInfoHolder.encoderPadding) - .setMetadata((flags & FLAG_DISABLE_ID3_METADATA) != 0 ? null : metadata); + .setMetadata(metadata); if (seeker.getAverageBitrate() != C.RATE_UNSET_INT) { format.setAverageBitrate(seeker.getAverageBitrate()); } @@ -388,9 +398,9 @@ private boolean synchronize(ExtractorInput input, boolean sniffing) throws IOExc boolean parseAllId3Frames = (flags & FLAG_DISABLE_ID3_METADATA) == 0; Id3Decoder.FramePredicate id3FramePredicate = parseAllId3Frames ? null : REQUIRED_ID3_FRAME_PREDICATE; - metadata = id3Peeker.peekId3Data(input, id3FramePredicate, MAX_SEARCH_BYTES); - if (metadata != null) { - gaplessInfoHolder.setFromMetadata(metadata); + id3Metadata = id3Peeker.peekId3Data(input, id3FramePredicate, MAX_SEARCH_BYTES); + if (id3Metadata != null) { + gaplessInfoHolder.setFromMetadata(id3Metadata); } peekedId3Bytes = (int) input.getPeekPosition(); if (!sniffing) { @@ -475,7 +485,7 @@ private Seeker computeSeeker(ExtractorInput input) throws IOException { // Read past any seek frame and set the seeker based on metadata or a seek frame. Metadata // takes priority as it can provide greater precision. Seeker seekFrameSeeker = maybeReadSeekFrame(input); - Seeker metadataSeeker = maybeHandleSeekMetadata(metadata, input.getPosition()); + Seeker metadataSeeker = maybeHandleSeekMetadata(id3Metadata, input.getPosition()); if (disableSeeking) { return new UnseekableSeeker(); @@ -583,6 +593,7 @@ private Seeker maybeReadSeekFrame(ExtractorInput input) throws IOException { gaplessInfoHolder.encoderDelay = xingFrame.encoderDelay; gaplessInfoHolder.encoderPadding = xingFrame.encoderPadding; } + xingMetadata = xingFrame.getMetadata(); long startPosition = input.getPosition(); if (input.getLength() != C.LENGTH_UNSET && xingFrame.dataSize != C.LENGTH_UNSET diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3InfoReplayGain.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3InfoReplayGain.java new file mode 100644 index 0000000000..6f7866d9bc --- /dev/null +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3InfoReplayGain.java @@ -0,0 +1,255 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package androidx.media3.extractor.mp3; + +import static java.lang.annotation.ElementType.TYPE_USE; + +import androidx.annotation.IntDef; +import androidx.annotation.Nullable; +import androidx.media3.common.Metadata; +import androidx.media3.common.util.UnstableApi; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.Objects; + +/** Representation of the ReplayGain data stored in a LAME Xing or Info frame. */ +@UnstableApi +public final class Mp3InfoReplayGain implements Metadata.Entry { + + /** A gain field can store one gain adjustment with name and originator metadata. */ + public static final class GainField { + + /** The name of a gain field. */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @Target(TYPE_USE) + @IntDef( + value = {NAME_RADIO, NAME_AUDIOPHILE}, + open = true) + public @interface Name {} + + /** + * A gain adjustment that makes all the tracks sound equally loud. + * + *
This behaves like tracks do on the radio, hence the name. If the ReplayGain is calculated + * on a track-by-track basis (i.e. an individual ReplayGain calculation is carried out for each + * track), this will be the result. + */ + public static final int NAME_RADIO = 1; + + /** + * A gain adjustment that represents the ideal listening gain for each track. + * + *
The problem with {@link #NAME_RADIO} is that tracks which should be quiet will be brought + * up to the level of all the rest. + * + *
To solve this problem, the "Audiophile" setting represents the ideal listening gain for + * each track. ReplayGain can have a good guess at this too, by reading the entire CD, and + * calculating a single gain adjustment for the whole disc. This works because quiet tracks then + * stay quieter than the rest, since the gain won't be changed for each track. It still solves + * the basic problem (annoying, unwanted level differences between discs) because quiet or loud + * discs are still adjusted overall. + * + *
Where ReplayGain will fail is if you have an entire CD of quiet music. It will bring it up + * to an average level. This is why the "Audiophile" Replay Gain adjustment must be user + * adjustable. The ReplayGain whole disc value represents a good guess, and should be stored in + * the file. Later, the user can tweak it if required. If the file has originated from the + * artist, then the "Audiophile" setting can be specified by the artist. Naturally, the user is + * free to change the value if they desire. + */ + public static final int NAME_AUDIOPHILE = 2; + + /** The originator of a gain field. */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @Target(TYPE_USE) + @IntDef( + value = { + ORIGINATOR_UNSET, + ORIGINATOR_ARTIST, + ORIGINATOR_USER, + ORIGINATOR_REPLAYGAIN, + ORIGINATOR_SIMPLE_RMS + }, + open = true) + public @interface Originator {} + + /** The origin of this gain adjustment is not set. */ + public static final int ORIGINATOR_UNSET = 0; + + /** This gain adjustment was manually determined by the artist. */ + public static final int ORIGINATOR_ARTIST = 1; + + /** This gain adjustment was manually determined by the user. */ + public static final int ORIGINATOR_USER = 2; + + /** This gain adjustment was automatically determined by the ReplayGain algorithm. */ + public static final int ORIGINATOR_REPLAYGAIN = 3; + + /** This gain adjustment was automatically determined by a simple RMS algorithm. */ + public static final int ORIGINATOR_SIMPLE_RMS = 4; + + /** Name/type of the gain field. */ + public final @Name int name; + + /** + * Originator of the gain field, i.e. who determined the value / in what way it was determined. + * + *
Either a human (user / artist) set the value according to their preferences, or an + * algorithm like ReplayGain or simple RMS average was used to determine it. + */ + public final @Originator int originator; + + /** + * Absolute gain adjustment in decibels. + * + *
Positive values mean the signal should be amplified, negative values mean it should be + * attenuated. + * + *
Due to limitations of the storage format, this is only accurate to the first decimal + * place. + */ + public final float gain; + + // Lint incorrectly thinks we're doing bitwise flag manipulation. + @SuppressWarnings("WrongConstant") + private GainField(@Name int name, @Originator int originator, float gain) { + this.name = name; + this.originator = originator; + this.gain = gain; + } + + /** + * Parses an instance from the packed representation. + * + *
Returns {@code null} if the representation is invalid or should be ignored (e.g. {@code + * name} is unset). + */ + // Lint incorrectly thinks we're doing bitwise flag manipulation. + @SuppressWarnings("WrongConstant") + @Nullable + private static GainField parse(int field) { + int name = (field >> 13) & 7; + if (name == 0) { + return null; + } + int originator = (field >> 10) & 7; + float gain = ((field & 0x1ff) * ((field & 0x200) != 0 ? -1 : 1)) / 10f; + return new GainField(name, originator, gain); + } + + @Override + public String toString() { + return "GainField{" + "name=" + name + ", originator=" + originator + ", gain=" + gain + '}'; + } + + @Override + public boolean equals(@Nullable Object o) { + if (!(o instanceof GainField)) { + return false; + } + GainField gainField = (GainField) o; + return name == gainField.name + && originator == gainField.originator + && Float.compare(gain, gainField.gain) == 0; + } + + @Override + public int hashCode() { + int result = name; + result = 31 * result + originator; + result = 31 * result + Float.hashCode(gain); + return result; + } + } + + /** + * 32 bit floating point "Peak signal amplitude". + * + *
1.0 is maximal signal amplitude store-able in decoding format. 0.8 is 80% of maximal signal + * amplitude store-able in decoding format. 1.5 is 150% of maximal signal amplitude store-able in + * decoding format. + * + *
A value above 1.0 can occur for example due to "true peak" measurement. A value of 0.0 means + * the peak signal amplitude is unknown. + */ + public final float peak; + + /** + * The first of two gain fields in the LAME MP3 Info header, or null if the field is invalid or + * unset. + */ + @Nullable public GainField field1; + + /** + * The second of two gain fields in the LAME MP3 Info header, or null if the field is invalid or + * unset. + */ + @Nullable public GainField field2; + + private Mp3InfoReplayGain(float peak, @Nullable GainField field1, @Nullable GainField field2) { + this.peak = peak; + this.field1 = field1; + this.field2 = field2; + } + + /** + * Parses an instance from the packed representation. + * + *
Returns null if the representation is invalid or should be ignored. + */ + @Nullable + public static Mp3InfoReplayGain parse(float peak, int field1, int field2) { + GainField parsedField1 = GainField.parse(field1); + GainField parsedField2 = GainField.parse(field2); + if (peak <= 0 && parsedField1 == null && parsedField2 == null) { + return null; + } + return new Mp3InfoReplayGain(peak, parsedField1, parsedField2); + } + + @Override + public String toString() { + return "ReplayGain Xing/Info: " + + "peak=" + + peak + + ", field 1=" + + field1 + + ", field 2=" + + field2; + } + + @Override + public boolean equals(@Nullable Object o) { + if (!(o instanceof Mp3InfoReplayGain)) { + return false; + } + Mp3InfoReplayGain that = (Mp3InfoReplayGain) o; + return Float.compare(peak, that.peak) == 0 + && Objects.equals(field1, that.field1) + && Objects.equals(field2, that.field2); + } + + @Override + public int hashCode() { + int result = Float.hashCode(peak); + result = 31 * result + (field1 != null ? field1.hashCode() : 0); + result = 31 * result + (field2 != null ? field2.hashCode() : 0); + return result; + } +} 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 421f05ac20..b62e0f074e 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 @@ -17,6 +17,7 @@ import androidx.annotation.Nullable; import androidx.media3.common.C; +import androidx.media3.common.Metadata; import androidx.media3.common.util.ParsableByteArray; import androidx.media3.common.util.Util; import androidx.media3.extractor.MpegAudioUtil; @@ -35,6 +36,9 @@ */ public final long dataSize; + /** ReplayGain data. Only present if this frame is an Info or the LAME variant of a Xing frame. */ + @Nullable public final Mp3InfoReplayGain replayGain; + /** * The number of samples to skip at the start of the stream, or {@link C#LENGTH_UNSET} if not * present in the header. @@ -58,12 +62,14 @@ private XingFrame( long frameCount, long dataSize, @Nullable long[] tableOfContents, + @Nullable Mp3InfoReplayGain replayGain, int encoderDelay, int encoderPadding) { this.header = new MpegAudioUtil.Header(header); this.frameCount = frameCount; this.dataSize = dataSize; this.tableOfContents = tableOfContents; + this.replayGain = replayGain; this.encoderDelay = encoderDelay; this.encoderPadding = encoderPadding; } @@ -98,23 +104,39 @@ public static XingFrame parse(MpegAudioUtil.Header mpegAudioHeader, ParsableByte frame.skipBytes(4); // Quality indicator } + @Nullable Mp3InfoReplayGain replayGain; int encoderDelay; int encoderPadding; - // Skip: version string (9), revision & VBR method (1), lowpass filter (1), replay gain (8), - // encoding flags & ATH type (1), bitrate (1). - int bytesToSkipBeforeEncoderDelayAndPadding = 9 + 1 + 1 + 8 + 1 + 1; - if (frame.bytesLeft() >= bytesToSkipBeforeEncoderDelayAndPadding + 3) { - frame.skipBytes(bytesToSkipBeforeEncoderDelayAndPadding); + // Skip: version string (9), revision & VBR method (1), lowpass filter (1). + int bytesToSkipBeforeReplayGain = 9 + 1 + 1; + // Skip: encoding flags & ATH type (1), bitrate (1). + int bytesToSkipAfterReplayGain = 1 + 1; + // And account for values we parse, ReplayGain (8) and encoder delay & padding (3). + if (frame.bytesLeft() >= bytesToSkipBeforeReplayGain + 8 + bytesToSkipAfterReplayGain + 3) { + frame.skipBytes(bytesToSkipBeforeReplayGain); + float peak = frame.readFloat(); + int field1 = frame.readUnsignedShort(); + int field2 = frame.readUnsignedShort(); + replayGain = Mp3InfoReplayGain.parse(peak, field1, field2); + + frame.skipBytes(bytesToSkipAfterReplayGain); int encoderDelayAndPadding = frame.readUnsignedInt24(); encoderDelay = (encoderDelayAndPadding & 0xFFF000) >> 12; encoderPadding = (encoderDelayAndPadding & 0xFFF); } else { + replayGain = null; encoderDelay = C.LENGTH_UNSET; encoderPadding = C.LENGTH_UNSET; } return new XingFrame( - mpegAudioHeader, frameCount, dataSize, tableOfContents, encoderDelay, encoderPadding); + mpegAudioHeader, + frameCount, + dataSize, + tableOfContents, + replayGain, + encoderDelay, + encoderPadding); } /** @@ -132,4 +154,13 @@ public long computeDurationUs() { return Util.sampleCountToDurationUs( (frameCount * header.samplesPerFrame) - 1, header.sampleRate); } + + /** Provide the metadata derived from this Xing frame, such as ReplayGain data. */ + @Nullable + public Metadata getMetadata() { + if (replayGain != null) { + return new Metadata(replayGain); + } + return null; + } } diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java index b30ca2127a..cf720fdc04 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java @@ -318,6 +318,30 @@ public void sampleWith200kBGarbagePrefix_sniffingFailsAfterPeeking128kB() throws /* expectedResult= */ false); } + @Test + public void sampleWithLameReplayGainFast( + @TestParameter(valuesProvider = ExtractorAsserts.ConfigProvider.class) + ExtractorAsserts.SimulationConfig simulationConfig) + throws Exception { + ExtractorAsserts.assertBehavior( + Mp3Extractor::new, + "media/mp3/bear-vbr-xing-header-replaygain-fast.mp3", + /* peekLimit= */ 1201, + simulationConfig); + } + + @Test + public void sampleWithLameReplayGainAccurate( + @TestParameter(valuesProvider = ExtractorAsserts.ConfigProvider.class) + ExtractorAsserts.SimulationConfig simulationConfig) + throws Exception { + ExtractorAsserts.assertBehavior( + Mp3Extractor::new, + "media/mp3/bear-vbr-xing-header-replaygain-accurate.mp3", + /* peekLimit= */ 1201, + simulationConfig); + } + @Nullable private static String getDumpFilePath(String inputFilePath, Enum> flagConfig) { String configName = flagConfig.name(); diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.0.dump new file mode 100644 index 0000000000..3f4a5e2991 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.0.dump @@ -0,0 +1,491 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 44928 + sample count = 117 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=8.14048E-40, field 1=GainField{name=1, originator=3, gain=23.3}, field 2=null] + sample 0: + time = 0 + flags = 1 + data = length 384, hash D3A746E7 + sample 1: + time = 24000 + flags = 1 + data = length 384, hash F1E9E3E + sample 2: + time = 48000 + flags = 1 + data = length 384, hash 456DA228 + sample 3: + time = 72000 + flags = 1 + data = length 384, hash CDB09F78 + sample 4: + time = 96000 + flags = 1 + data = length 384, hash 5BFF9C1A + sample 5: + time = 120000 + flags = 1 + data = length 384, hash 861FDAA7 + sample 6: + time = 144000 + flags = 1 + data = length 384, hash 1FE36A4D + sample 7: + time = 168000 + flags = 1 + data = length 384, hash 4DD5C0F4 + sample 8: + time = 192000 + flags = 1 + data = length 384, hash D64A8BC6 + sample 9: + time = 216000 + flags = 1 + data = length 384, hash E20D4988 + sample 10: + time = 240000 + flags = 1 + data = length 384, hash ED2BF624 + sample 11: + time = 264000 + flags = 1 + data = length 384, hash 60E5ABBC + sample 12: + time = 288000 + flags = 1 + data = length 384, hash 404244BF + sample 13: + time = 312000 + flags = 1 + data = length 384, hash C65FF8C1 + sample 14: + time = 336000 + flags = 1 + data = length 384, hash 42386869 + sample 15: + time = 360000 + flags = 1 + data = length 384, hash 592F129A + sample 16: + time = 384000 + flags = 1 + data = length 384, hash 299ACDD7 + sample 17: + time = 408000 + flags = 1 + data = length 384, hash 8FF937AC + sample 18: + time = 432000 + flags = 1 + data = length 384, hash 4B5C2884 + sample 19: + time = 456000 + flags = 1 + data = length 384, hash 862D22F1 + sample 20: + time = 480000 + flags = 1 + data = length 384, hash 49AFE67D + sample 21: + time = 504000 + flags = 1 + data = length 384, hash 420EFE5F + sample 22: + time = 528000 + flags = 1 + data = length 384, hash 52759113 + sample 23: + time = 552000 + flags = 1 + data = length 384, hash 880C2AB2 + sample 24: + time = 576000 + flags = 1 + data = length 384, hash 1F7E786A + sample 25: + time = 600000 + flags = 1 + data = length 384, hash DF5D2BCF + sample 26: + time = 624000 + flags = 1 + data = length 384, hash D4020EB3 + sample 27: + time = 648000 + flags = 1 + data = length 384, hash BF6D1CA6 + sample 28: + time = 672000 + flags = 1 + data = length 384, hash 68B200EE + sample 29: + time = 696000 + flags = 1 + data = length 384, hash A71C4AFF + sample 30: + time = 720000 + flags = 1 + data = length 384, hash C36CA276 + sample 31: + time = 744000 + flags = 1 + data = length 384, hash 5AB9C9AA + sample 32: + time = 768000 + flags = 1 + data = length 384, hash CAC81110 + sample 33: + time = 792000 + flags = 1 + data = length 384, hash B45D0135 + sample 34: + time = 816000 + flags = 1 + data = length 384, hash 9F0FF1E6 + sample 35: + time = 840000 + flags = 1 + data = length 384, hash F3F425FD + sample 36: + time = 864000 + flags = 1 + data = length 384, hash 15C4DA8 + sample 37: + time = 888000 + flags = 1 + data = length 384, hash 9B5D1E2 + sample 38: + time = 912000 + flags = 1 + data = length 384, hash 40914CAF + sample 39: + time = 936000 + flags = 1 + data = length 384, hash F7EFB71E + sample 40: + time = 960000 + flags = 1 + data = length 384, hash 53FBE77C + sample 41: + time = 984000 + flags = 1 + data = length 384, hash 77E58178 + sample 42: + time = 1008000 + flags = 1 + data = length 384, hash E3B86048 + sample 43: + time = 1032000 + flags = 1 + data = length 384, hash 6E64349 + sample 44: + time = 1056000 + flags = 1 + data = length 384, hash AC0B5E18 + sample 45: + time = 1080000 + flags = 1 + data = length 384, hash 7B4CE779 + sample 46: + time = 1104000 + flags = 1 + data = length 384, hash 50D10931 + sample 47: + time = 1128000 + flags = 1 + data = length 384, hash F0D97D3E + sample 48: + time = 1152000 + flags = 1 + data = length 384, hash ED786460 + sample 49: + time = 1176000 + flags = 1 + data = length 384, hash 435543F4 + sample 50: + time = 1200000 + flags = 1 + data = length 384, hash 523ED198 + sample 51: + time = 1224000 + flags = 1 + data = length 384, hash 705705D3 + sample 52: + time = 1248000 + flags = 1 + data = length 384, hash 4A95F442 + sample 53: + time = 1272000 + flags = 1 + data = length 384, hash 56D7EF4B + sample 54: + time = 1296000 + flags = 1 + data = length 384, hash B47AAC17 + sample 55: + time = 1320000 + flags = 1 + data = length 384, hash 38E76A4D + sample 56: + time = 1344000 + flags = 1 + data = length 384, hash ADF5E978 + sample 57: + time = 1368000 + flags = 1 + data = length 384, hash 349125C2 + sample 58: + time = 1392000 + flags = 1 + data = length 384, hash D69B3903 + sample 59: + time = 1416000 + flags = 1 + data = length 384, hash 852DA91C + sample 60: + time = 1440000 + flags = 1 + data = length 384, hash 21F87C6E + sample 61: + time = 1464000 + flags = 1 + data = length 384, hash 68686E41 + sample 62: + time = 1488000 + flags = 1 + data = length 384, hash 4DAC9F6A + sample 63: + time = 1512000 + flags = 1 + data = length 384, hash B5CA6FCF + sample 64: + time = 1536000 + flags = 1 + data = length 384, hash 9B7216B3 + sample 65: + time = 1560000 + flags = 1 + data = length 384, hash AC7162DA + sample 66: + time = 1584000 + flags = 1 + data = length 384, hash 545A4B9C + sample 67: + time = 1608000 + flags = 1 + data = length 384, hash 380FA5D4 + sample 68: + time = 1632000 + flags = 1 + data = length 384, hash 53BF79E9 + sample 69: + time = 1656000 + flags = 1 + data = length 384, hash FE2460DB + sample 70: + time = 1680000 + flags = 1 + data = length 384, hash 2525E09 + sample 71: + time = 1704000 + flags = 1 + data = length 384, hash ECCB42AA + sample 72: + time = 1728000 + flags = 1 + data = length 384, hash 1E5EC5FA + sample 73: + time = 1752000 + flags = 1 + data = length 384, hash C2597D09 + sample 74: + time = 1776000 + flags = 1 + data = length 384, hash 32CD263E + sample 75: + time = 1800000 + flags = 1 + data = length 384, hash 6B3A0DC7 + sample 76: + time = 1824000 + flags = 1 + data = length 384, hash 5155B353 + sample 77: + time = 1848000 + flags = 1 + data = length 384, hash 220C783 + sample 78: + time = 1872000 + flags = 1 + data = length 384, hash E0925905 + sample 79: + time = 1896000 + flags = 1 + data = length 384, hash 824C0D02 + sample 80: + time = 1920000 + flags = 1 + data = length 384, hash 5166F8F3 + sample 81: + time = 1944000 + flags = 1 + data = length 384, hash B5F38EE6 + sample 82: + time = 1968000 + flags = 1 + data = length 384, hash 659E483F + sample 83: + time = 1992000 + flags = 1 + data = length 384, hash A022EFCB + sample 84: + time = 2016000 + flags = 1 + data = length 384, hash 93DCF4B5 + sample 85: + time = 2040000 + flags = 1 + data = length 384, hash C965128 + sample 86: + time = 2064000 + flags = 1 + data = length 384, hash 6FD595F4 + sample 87: + time = 2088000 + flags = 1 + data = length 384, hash BF6CDB31 + sample 88: + time = 2112000 + flags = 1 + data = length 384, hash 67C738C0 + sample 89: + time = 2136000 + flags = 1 + data = length 384, hash BCFCD1CC + sample 90: + time = 2160000 + flags = 1 + data = length 384, hash A4A85D04 + sample 91: + time = 2184000 + flags = 1 + data = length 384, hash 6CD26641 + sample 92: + time = 2208000 + flags = 1 + data = length 384, hash 53817862 + sample 93: + time = 2232000 + flags = 1 + data = length 384, hash 1C98DD10 + sample 94: + time = 2256000 + flags = 1 + data = length 384, hash 5B8EE2C9 + sample 95: + time = 2280000 + flags = 1 + data = length 384, hash 227883D0 + sample 96: + time = 2304000 + flags = 1 + data = length 384, hash 50267C46 + sample 97: + time = 2328000 + flags = 1 + data = length 384, hash F02EA205 + sample 98: + time = 2352000 + flags = 1 + data = length 384, hash ED7BE6DF + sample 99: + time = 2376000 + flags = 1 + data = length 384, hash AEE4E608 + sample 100: + time = 2400000 + flags = 1 + data = length 384, hash 8EA81A05 + sample 101: + time = 2424000 + flags = 1 + data = length 384, hash C9D6BC51 + sample 102: + time = 2448000 + flags = 1 + data = length 384, hash FBE2EF0F + sample 103: + time = 2472000 + flags = 1 + data = length 384, hash 64E44326 + sample 104: + time = 2496000 + flags = 1 + data = length 384, hash 2A371FEA + sample 105: + time = 2520000 + flags = 1 + data = length 384, hash BC1F17B6 + sample 106: + time = 2544000 + flags = 1 + data = length 384, hash 759FA7C2 + sample 107: + time = 2568000 + flags = 1 + data = length 384, hash ED978C15 + sample 108: + time = 2592000 + flags = 1 + data = length 384, hash 2393BA70 + sample 109: + time = 2616000 + flags = 1 + data = length 384, hash F84E2847 + sample 110: + time = 2640000 + flags = 1 + data = length 384, hash FF006E14 + sample 111: + time = 2664000 + flags = 1 + data = length 384, hash 840D19F5 + sample 112: + time = 2688000 + flags = 1 + data = length 384, hash B17A5934 + sample 113: + time = 2712000 + flags = 1 + data = length 384, hash 2879F06E + sample 114: + time = 2736000 + flags = 1 + data = length 384, hash 386AB993 + sample 115: + time = 2760000 + flags = 1 + data = length 384, hash 276609B5 + sample 116: + time = 2784000 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.1.dump new file mode 100644 index 0000000000..d4564f9757 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.1.dump @@ -0,0 +1,339 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 30336 + sample count = 79 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=8.14048E-40, field 1=GainField{name=1, originator=3, gain=23.3}, field 2=null] + sample 0: + time = 911992 + flags = 1 + data = length 384, hash 40914CAF + sample 1: + time = 935992 + flags = 1 + data = length 384, hash F7EFB71E + sample 2: + time = 959992 + flags = 1 + data = length 384, hash 53FBE77C + sample 3: + time = 983992 + flags = 1 + data = length 384, hash 77E58178 + sample 4: + time = 1007992 + flags = 1 + data = length 384, hash E3B86048 + sample 5: + time = 1031992 + flags = 1 + data = length 384, hash 6E64349 + sample 6: + time = 1055992 + flags = 1 + data = length 384, hash AC0B5E18 + sample 7: + time = 1079992 + flags = 1 + data = length 384, hash 7B4CE779 + sample 8: + time = 1103992 + flags = 1 + data = length 384, hash 50D10931 + sample 9: + time = 1127992 + flags = 1 + data = length 384, hash F0D97D3E + sample 10: + time = 1151992 + flags = 1 + data = length 384, hash ED786460 + sample 11: + time = 1175992 + flags = 1 + data = length 384, hash 435543F4 + sample 12: + time = 1199992 + flags = 1 + data = length 384, hash 523ED198 + sample 13: + time = 1223992 + flags = 1 + data = length 384, hash 705705D3 + sample 14: + time = 1247992 + flags = 1 + data = length 384, hash 4A95F442 + sample 15: + time = 1271992 + flags = 1 + data = length 384, hash 56D7EF4B + sample 16: + time = 1295992 + flags = 1 + data = length 384, hash B47AAC17 + sample 17: + time = 1319992 + flags = 1 + data = length 384, hash 38E76A4D + sample 18: + time = 1343992 + flags = 1 + data = length 384, hash ADF5E978 + sample 19: + time = 1367992 + flags = 1 + data = length 384, hash 349125C2 + sample 20: + time = 1391992 + flags = 1 + data = length 384, hash D69B3903 + sample 21: + time = 1415992 + flags = 1 + data = length 384, hash 852DA91C + sample 22: + time = 1439992 + flags = 1 + data = length 384, hash 21F87C6E + sample 23: + time = 1463992 + flags = 1 + data = length 384, hash 68686E41 + sample 24: + time = 1487992 + flags = 1 + data = length 384, hash 4DAC9F6A + sample 25: + time = 1511992 + flags = 1 + data = length 384, hash B5CA6FCF + sample 26: + time = 1535992 + flags = 1 + data = length 384, hash 9B7216B3 + sample 27: + time = 1559992 + flags = 1 + data = length 384, hash AC7162DA + sample 28: + time = 1583992 + flags = 1 + data = length 384, hash 545A4B9C + sample 29: + time = 1607992 + flags = 1 + data = length 384, hash 380FA5D4 + sample 30: + time = 1631992 + flags = 1 + data = length 384, hash 53BF79E9 + sample 31: + time = 1655992 + flags = 1 + data = length 384, hash FE2460DB + sample 32: + time = 1679992 + flags = 1 + data = length 384, hash 2525E09 + sample 33: + time = 1703992 + flags = 1 + data = length 384, hash ECCB42AA + sample 34: + time = 1727992 + flags = 1 + data = length 384, hash 1E5EC5FA + sample 35: + time = 1751992 + flags = 1 + data = length 384, hash C2597D09 + sample 36: + time = 1775992 + flags = 1 + data = length 384, hash 32CD263E + sample 37: + time = 1799992 + flags = 1 + data = length 384, hash 6B3A0DC7 + sample 38: + time = 1823992 + flags = 1 + data = length 384, hash 5155B353 + sample 39: + time = 1847992 + flags = 1 + data = length 384, hash 220C783 + sample 40: + time = 1871992 + flags = 1 + data = length 384, hash E0925905 + sample 41: + time = 1895992 + flags = 1 + data = length 384, hash 824C0D02 + sample 42: + time = 1919992 + flags = 1 + data = length 384, hash 5166F8F3 + sample 43: + time = 1943992 + flags = 1 + data = length 384, hash B5F38EE6 + sample 44: + time = 1967992 + flags = 1 + data = length 384, hash 659E483F + sample 45: + time = 1991992 + flags = 1 + data = length 384, hash A022EFCB + sample 46: + time = 2015992 + flags = 1 + data = length 384, hash 93DCF4B5 + sample 47: + time = 2039992 + flags = 1 + data = length 384, hash C965128 + sample 48: + time = 2063992 + flags = 1 + data = length 384, hash 6FD595F4 + sample 49: + time = 2087992 + flags = 1 + data = length 384, hash BF6CDB31 + sample 50: + time = 2111992 + flags = 1 + data = length 384, hash 67C738C0 + sample 51: + time = 2135992 + flags = 1 + data = length 384, hash BCFCD1CC + sample 52: + time = 2159992 + flags = 1 + data = length 384, hash A4A85D04 + sample 53: + time = 2183992 + flags = 1 + data = length 384, hash 6CD26641 + sample 54: + time = 2207992 + flags = 1 + data = length 384, hash 53817862 + sample 55: + time = 2231992 + flags = 1 + data = length 384, hash 1C98DD10 + sample 56: + time = 2255992 + flags = 1 + data = length 384, hash 5B8EE2C9 + sample 57: + time = 2279992 + flags = 1 + data = length 384, hash 227883D0 + sample 58: + time = 2303992 + flags = 1 + data = length 384, hash 50267C46 + sample 59: + time = 2327992 + flags = 1 + data = length 384, hash F02EA205 + sample 60: + time = 2351992 + flags = 1 + data = length 384, hash ED7BE6DF + sample 61: + time = 2375992 + flags = 1 + data = length 384, hash AEE4E608 + sample 62: + time = 2399992 + flags = 1 + data = length 384, hash 8EA81A05 + sample 63: + time = 2423992 + flags = 1 + data = length 384, hash C9D6BC51 + sample 64: + time = 2447992 + flags = 1 + data = length 384, hash FBE2EF0F + sample 65: + time = 2471992 + flags = 1 + data = length 384, hash 64E44326 + sample 66: + time = 2495992 + flags = 1 + data = length 384, hash 2A371FEA + sample 67: + time = 2519992 + flags = 1 + data = length 384, hash BC1F17B6 + sample 68: + time = 2543992 + flags = 1 + data = length 384, hash 759FA7C2 + sample 69: + time = 2567992 + flags = 1 + data = length 384, hash ED978C15 + sample 70: + time = 2591992 + flags = 1 + data = length 384, hash 2393BA70 + sample 71: + time = 2615992 + flags = 1 + data = length 384, hash F84E2847 + sample 72: + time = 2639992 + flags = 1 + data = length 384, hash FF006E14 + sample 73: + time = 2663992 + flags = 1 + data = length 384, hash 840D19F5 + sample 74: + time = 2687992 + flags = 1 + data = length 384, hash B17A5934 + sample 75: + time = 2711992 + flags = 1 + data = length 384, hash 2879F06E + sample 76: + time = 2735992 + flags = 1 + data = length 384, hash 386AB993 + sample 77: + time = 2759992 + flags = 1 + data = length 384, hash 276609B5 + sample 78: + time = 2783992 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.2.dump new file mode 100644 index 0000000000..40372d3031 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.2.dump @@ -0,0 +1,183 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 15360 + sample count = 40 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=8.14048E-40, field 1=GainField{name=1, originator=3, gain=23.3}, field 2=null] + sample 0: + time = 1847985 + flags = 1 + data = length 384, hash 220C783 + sample 1: + time = 1871985 + flags = 1 + data = length 384, hash E0925905 + sample 2: + time = 1895985 + flags = 1 + data = length 384, hash 824C0D02 + sample 3: + time = 1919985 + flags = 1 + data = length 384, hash 5166F8F3 + sample 4: + time = 1943985 + flags = 1 + data = length 384, hash B5F38EE6 + sample 5: + time = 1967985 + flags = 1 + data = length 384, hash 659E483F + sample 6: + time = 1991985 + flags = 1 + data = length 384, hash A022EFCB + sample 7: + time = 2015985 + flags = 1 + data = length 384, hash 93DCF4B5 + sample 8: + time = 2039985 + flags = 1 + data = length 384, hash C965128 + sample 9: + time = 2063985 + flags = 1 + data = length 384, hash 6FD595F4 + sample 10: + time = 2087985 + flags = 1 + data = length 384, hash BF6CDB31 + sample 11: + time = 2111985 + flags = 1 + data = length 384, hash 67C738C0 + sample 12: + time = 2135985 + flags = 1 + data = length 384, hash BCFCD1CC + sample 13: + time = 2159985 + flags = 1 + data = length 384, hash A4A85D04 + sample 14: + time = 2183985 + flags = 1 + data = length 384, hash 6CD26641 + sample 15: + time = 2207985 + flags = 1 + data = length 384, hash 53817862 + sample 16: + time = 2231985 + flags = 1 + data = length 384, hash 1C98DD10 + sample 17: + time = 2255985 + flags = 1 + data = length 384, hash 5B8EE2C9 + sample 18: + time = 2279985 + flags = 1 + data = length 384, hash 227883D0 + sample 19: + time = 2303985 + flags = 1 + data = length 384, hash 50267C46 + sample 20: + time = 2327985 + flags = 1 + data = length 384, hash F02EA205 + sample 21: + time = 2351985 + flags = 1 + data = length 384, hash ED7BE6DF + sample 22: + time = 2375985 + flags = 1 + data = length 384, hash AEE4E608 + sample 23: + time = 2399985 + flags = 1 + data = length 384, hash 8EA81A05 + sample 24: + time = 2423985 + flags = 1 + data = length 384, hash C9D6BC51 + sample 25: + time = 2447985 + flags = 1 + data = length 384, hash FBE2EF0F + sample 26: + time = 2471985 + flags = 1 + data = length 384, hash 64E44326 + sample 27: + time = 2495985 + flags = 1 + data = length 384, hash 2A371FEA + sample 28: + time = 2519985 + flags = 1 + data = length 384, hash BC1F17B6 + sample 29: + time = 2543985 + flags = 1 + data = length 384, hash 759FA7C2 + sample 30: + time = 2567985 + flags = 1 + data = length 384, hash ED978C15 + sample 31: + time = 2591985 + flags = 1 + data = length 384, hash 2393BA70 + sample 32: + time = 2615985 + flags = 1 + data = length 384, hash F84E2847 + sample 33: + time = 2639985 + flags = 1 + data = length 384, hash FF006E14 + sample 34: + time = 2663985 + flags = 1 + data = length 384, hash 840D19F5 + sample 35: + time = 2687985 + flags = 1 + data = length 384, hash B17A5934 + sample 36: + time = 2711985 + flags = 1 + data = length 384, hash 2879F06E + sample 37: + time = 2735985 + flags = 1 + data = length 384, hash 386AB993 + sample 38: + time = 2759985 + flags = 1 + data = length 384, hash 276609B5 + sample 39: + time = 2783985 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.3.dump new file mode 100644 index 0000000000..2d705c22f7 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.3.dump @@ -0,0 +1,27 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 384 + sample count = 1 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=8.14048E-40, field 1=GainField{name=1, originator=3, gain=23.3}, field 2=null] + sample 0: + time = 2783978 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.unknown_length.dump new file mode 100644 index 0000000000..3f4a5e2991 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-accurate.mp3.unknown_length.dump @@ -0,0 +1,491 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 44928 + sample count = 117 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=8.14048E-40, field 1=GainField{name=1, originator=3, gain=23.3}, field 2=null] + sample 0: + time = 0 + flags = 1 + data = length 384, hash D3A746E7 + sample 1: + time = 24000 + flags = 1 + data = length 384, hash F1E9E3E + sample 2: + time = 48000 + flags = 1 + data = length 384, hash 456DA228 + sample 3: + time = 72000 + flags = 1 + data = length 384, hash CDB09F78 + sample 4: + time = 96000 + flags = 1 + data = length 384, hash 5BFF9C1A + sample 5: + time = 120000 + flags = 1 + data = length 384, hash 861FDAA7 + sample 6: + time = 144000 + flags = 1 + data = length 384, hash 1FE36A4D + sample 7: + time = 168000 + flags = 1 + data = length 384, hash 4DD5C0F4 + sample 8: + time = 192000 + flags = 1 + data = length 384, hash D64A8BC6 + sample 9: + time = 216000 + flags = 1 + data = length 384, hash E20D4988 + sample 10: + time = 240000 + flags = 1 + data = length 384, hash ED2BF624 + sample 11: + time = 264000 + flags = 1 + data = length 384, hash 60E5ABBC + sample 12: + time = 288000 + flags = 1 + data = length 384, hash 404244BF + sample 13: + time = 312000 + flags = 1 + data = length 384, hash C65FF8C1 + sample 14: + time = 336000 + flags = 1 + data = length 384, hash 42386869 + sample 15: + time = 360000 + flags = 1 + data = length 384, hash 592F129A + sample 16: + time = 384000 + flags = 1 + data = length 384, hash 299ACDD7 + sample 17: + time = 408000 + flags = 1 + data = length 384, hash 8FF937AC + sample 18: + time = 432000 + flags = 1 + data = length 384, hash 4B5C2884 + sample 19: + time = 456000 + flags = 1 + data = length 384, hash 862D22F1 + sample 20: + time = 480000 + flags = 1 + data = length 384, hash 49AFE67D + sample 21: + time = 504000 + flags = 1 + data = length 384, hash 420EFE5F + sample 22: + time = 528000 + flags = 1 + data = length 384, hash 52759113 + sample 23: + time = 552000 + flags = 1 + data = length 384, hash 880C2AB2 + sample 24: + time = 576000 + flags = 1 + data = length 384, hash 1F7E786A + sample 25: + time = 600000 + flags = 1 + data = length 384, hash DF5D2BCF + sample 26: + time = 624000 + flags = 1 + data = length 384, hash D4020EB3 + sample 27: + time = 648000 + flags = 1 + data = length 384, hash BF6D1CA6 + sample 28: + time = 672000 + flags = 1 + data = length 384, hash 68B200EE + sample 29: + time = 696000 + flags = 1 + data = length 384, hash A71C4AFF + sample 30: + time = 720000 + flags = 1 + data = length 384, hash C36CA276 + sample 31: + time = 744000 + flags = 1 + data = length 384, hash 5AB9C9AA + sample 32: + time = 768000 + flags = 1 + data = length 384, hash CAC81110 + sample 33: + time = 792000 + flags = 1 + data = length 384, hash B45D0135 + sample 34: + time = 816000 + flags = 1 + data = length 384, hash 9F0FF1E6 + sample 35: + time = 840000 + flags = 1 + data = length 384, hash F3F425FD + sample 36: + time = 864000 + flags = 1 + data = length 384, hash 15C4DA8 + sample 37: + time = 888000 + flags = 1 + data = length 384, hash 9B5D1E2 + sample 38: + time = 912000 + flags = 1 + data = length 384, hash 40914CAF + sample 39: + time = 936000 + flags = 1 + data = length 384, hash F7EFB71E + sample 40: + time = 960000 + flags = 1 + data = length 384, hash 53FBE77C + sample 41: + time = 984000 + flags = 1 + data = length 384, hash 77E58178 + sample 42: + time = 1008000 + flags = 1 + data = length 384, hash E3B86048 + sample 43: + time = 1032000 + flags = 1 + data = length 384, hash 6E64349 + sample 44: + time = 1056000 + flags = 1 + data = length 384, hash AC0B5E18 + sample 45: + time = 1080000 + flags = 1 + data = length 384, hash 7B4CE779 + sample 46: + time = 1104000 + flags = 1 + data = length 384, hash 50D10931 + sample 47: + time = 1128000 + flags = 1 + data = length 384, hash F0D97D3E + sample 48: + time = 1152000 + flags = 1 + data = length 384, hash ED786460 + sample 49: + time = 1176000 + flags = 1 + data = length 384, hash 435543F4 + sample 50: + time = 1200000 + flags = 1 + data = length 384, hash 523ED198 + sample 51: + time = 1224000 + flags = 1 + data = length 384, hash 705705D3 + sample 52: + time = 1248000 + flags = 1 + data = length 384, hash 4A95F442 + sample 53: + time = 1272000 + flags = 1 + data = length 384, hash 56D7EF4B + sample 54: + time = 1296000 + flags = 1 + data = length 384, hash B47AAC17 + sample 55: + time = 1320000 + flags = 1 + data = length 384, hash 38E76A4D + sample 56: + time = 1344000 + flags = 1 + data = length 384, hash ADF5E978 + sample 57: + time = 1368000 + flags = 1 + data = length 384, hash 349125C2 + sample 58: + time = 1392000 + flags = 1 + data = length 384, hash D69B3903 + sample 59: + time = 1416000 + flags = 1 + data = length 384, hash 852DA91C + sample 60: + time = 1440000 + flags = 1 + data = length 384, hash 21F87C6E + sample 61: + time = 1464000 + flags = 1 + data = length 384, hash 68686E41 + sample 62: + time = 1488000 + flags = 1 + data = length 384, hash 4DAC9F6A + sample 63: + time = 1512000 + flags = 1 + data = length 384, hash B5CA6FCF + sample 64: + time = 1536000 + flags = 1 + data = length 384, hash 9B7216B3 + sample 65: + time = 1560000 + flags = 1 + data = length 384, hash AC7162DA + sample 66: + time = 1584000 + flags = 1 + data = length 384, hash 545A4B9C + sample 67: + time = 1608000 + flags = 1 + data = length 384, hash 380FA5D4 + sample 68: + time = 1632000 + flags = 1 + data = length 384, hash 53BF79E9 + sample 69: + time = 1656000 + flags = 1 + data = length 384, hash FE2460DB + sample 70: + time = 1680000 + flags = 1 + data = length 384, hash 2525E09 + sample 71: + time = 1704000 + flags = 1 + data = length 384, hash ECCB42AA + sample 72: + time = 1728000 + flags = 1 + data = length 384, hash 1E5EC5FA + sample 73: + time = 1752000 + flags = 1 + data = length 384, hash C2597D09 + sample 74: + time = 1776000 + flags = 1 + data = length 384, hash 32CD263E + sample 75: + time = 1800000 + flags = 1 + data = length 384, hash 6B3A0DC7 + sample 76: + time = 1824000 + flags = 1 + data = length 384, hash 5155B353 + sample 77: + time = 1848000 + flags = 1 + data = length 384, hash 220C783 + sample 78: + time = 1872000 + flags = 1 + data = length 384, hash E0925905 + sample 79: + time = 1896000 + flags = 1 + data = length 384, hash 824C0D02 + sample 80: + time = 1920000 + flags = 1 + data = length 384, hash 5166F8F3 + sample 81: + time = 1944000 + flags = 1 + data = length 384, hash B5F38EE6 + sample 82: + time = 1968000 + flags = 1 + data = length 384, hash 659E483F + sample 83: + time = 1992000 + flags = 1 + data = length 384, hash A022EFCB + sample 84: + time = 2016000 + flags = 1 + data = length 384, hash 93DCF4B5 + sample 85: + time = 2040000 + flags = 1 + data = length 384, hash C965128 + sample 86: + time = 2064000 + flags = 1 + data = length 384, hash 6FD595F4 + sample 87: + time = 2088000 + flags = 1 + data = length 384, hash BF6CDB31 + sample 88: + time = 2112000 + flags = 1 + data = length 384, hash 67C738C0 + sample 89: + time = 2136000 + flags = 1 + data = length 384, hash BCFCD1CC + sample 90: + time = 2160000 + flags = 1 + data = length 384, hash A4A85D04 + sample 91: + time = 2184000 + flags = 1 + data = length 384, hash 6CD26641 + sample 92: + time = 2208000 + flags = 1 + data = length 384, hash 53817862 + sample 93: + time = 2232000 + flags = 1 + data = length 384, hash 1C98DD10 + sample 94: + time = 2256000 + flags = 1 + data = length 384, hash 5B8EE2C9 + sample 95: + time = 2280000 + flags = 1 + data = length 384, hash 227883D0 + sample 96: + time = 2304000 + flags = 1 + data = length 384, hash 50267C46 + sample 97: + time = 2328000 + flags = 1 + data = length 384, hash F02EA205 + sample 98: + time = 2352000 + flags = 1 + data = length 384, hash ED7BE6DF + sample 99: + time = 2376000 + flags = 1 + data = length 384, hash AEE4E608 + sample 100: + time = 2400000 + flags = 1 + data = length 384, hash 8EA81A05 + sample 101: + time = 2424000 + flags = 1 + data = length 384, hash C9D6BC51 + sample 102: + time = 2448000 + flags = 1 + data = length 384, hash FBE2EF0F + sample 103: + time = 2472000 + flags = 1 + data = length 384, hash 64E44326 + sample 104: + time = 2496000 + flags = 1 + data = length 384, hash 2A371FEA + sample 105: + time = 2520000 + flags = 1 + data = length 384, hash BC1F17B6 + sample 106: + time = 2544000 + flags = 1 + data = length 384, hash 759FA7C2 + sample 107: + time = 2568000 + flags = 1 + data = length 384, hash ED978C15 + sample 108: + time = 2592000 + flags = 1 + data = length 384, hash 2393BA70 + sample 109: + time = 2616000 + flags = 1 + data = length 384, hash F84E2847 + sample 110: + time = 2640000 + flags = 1 + data = length 384, hash FF006E14 + sample 111: + time = 2664000 + flags = 1 + data = length 384, hash 840D19F5 + sample 112: + time = 2688000 + flags = 1 + data = length 384, hash B17A5934 + sample 113: + time = 2712000 + flags = 1 + data = length 384, hash 2879F06E + sample 114: + time = 2736000 + flags = 1 + data = length 384, hash 386AB993 + sample 115: + time = 2760000 + flags = 1 + data = length 384, hash 276609B5 + sample 116: + time = 2784000 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.0.dump new file mode 100644 index 0000000000..457facc249 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.0.dump @@ -0,0 +1,491 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 44928 + sample count = 117 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=0.0, field 1=GainField{name=1, originator=3, gain=23.0}, field 2=null] + sample 0: + time = 0 + flags = 1 + data = length 384, hash D3A746E7 + sample 1: + time = 24000 + flags = 1 + data = length 384, hash F1E9E3E + sample 2: + time = 48000 + flags = 1 + data = length 384, hash 456DA228 + sample 3: + time = 72000 + flags = 1 + data = length 384, hash CDB09F78 + sample 4: + time = 96000 + flags = 1 + data = length 384, hash 5BFF9C1A + sample 5: + time = 120000 + flags = 1 + data = length 384, hash 861FDAA7 + sample 6: + time = 144000 + flags = 1 + data = length 384, hash 1FE36A4D + sample 7: + time = 168000 + flags = 1 + data = length 384, hash 4DD5C0F4 + sample 8: + time = 192000 + flags = 1 + data = length 384, hash D64A8BC6 + sample 9: + time = 216000 + flags = 1 + data = length 384, hash E20D4988 + sample 10: + time = 240000 + flags = 1 + data = length 384, hash ED2BF624 + sample 11: + time = 264000 + flags = 1 + data = length 384, hash 60E5ABBC + sample 12: + time = 288000 + flags = 1 + data = length 384, hash 404244BF + sample 13: + time = 312000 + flags = 1 + data = length 384, hash C65FF8C1 + sample 14: + time = 336000 + flags = 1 + data = length 384, hash 42386869 + sample 15: + time = 360000 + flags = 1 + data = length 384, hash 592F129A + sample 16: + time = 384000 + flags = 1 + data = length 384, hash 299ACDD7 + sample 17: + time = 408000 + flags = 1 + data = length 384, hash 8FF937AC + sample 18: + time = 432000 + flags = 1 + data = length 384, hash 4B5C2884 + sample 19: + time = 456000 + flags = 1 + data = length 384, hash 862D22F1 + sample 20: + time = 480000 + flags = 1 + data = length 384, hash 49AFE67D + sample 21: + time = 504000 + flags = 1 + data = length 384, hash 420EFE5F + sample 22: + time = 528000 + flags = 1 + data = length 384, hash 52759113 + sample 23: + time = 552000 + flags = 1 + data = length 384, hash 880C2AB2 + sample 24: + time = 576000 + flags = 1 + data = length 384, hash 1F7E786A + sample 25: + time = 600000 + flags = 1 + data = length 384, hash DF5D2BCF + sample 26: + time = 624000 + flags = 1 + data = length 384, hash D4020EB3 + sample 27: + time = 648000 + flags = 1 + data = length 384, hash BF6D1CA6 + sample 28: + time = 672000 + flags = 1 + data = length 384, hash 68B200EE + sample 29: + time = 696000 + flags = 1 + data = length 384, hash A71C4AFF + sample 30: + time = 720000 + flags = 1 + data = length 384, hash C36CA276 + sample 31: + time = 744000 + flags = 1 + data = length 384, hash 5AB9C9AA + sample 32: + time = 768000 + flags = 1 + data = length 384, hash CAC81110 + sample 33: + time = 792000 + flags = 1 + data = length 384, hash B45D0135 + sample 34: + time = 816000 + flags = 1 + data = length 384, hash 9F0FF1E6 + sample 35: + time = 840000 + flags = 1 + data = length 384, hash F3F425FD + sample 36: + time = 864000 + flags = 1 + data = length 384, hash 15C4DA8 + sample 37: + time = 888000 + flags = 1 + data = length 384, hash 9B5D1E2 + sample 38: + time = 912000 + flags = 1 + data = length 384, hash 40914CAF + sample 39: + time = 936000 + flags = 1 + data = length 384, hash F7EFB71E + sample 40: + time = 960000 + flags = 1 + data = length 384, hash 53FBE77C + sample 41: + time = 984000 + flags = 1 + data = length 384, hash 77E58178 + sample 42: + time = 1008000 + flags = 1 + data = length 384, hash E3B86048 + sample 43: + time = 1032000 + flags = 1 + data = length 384, hash 6E64349 + sample 44: + time = 1056000 + flags = 1 + data = length 384, hash AC0B5E18 + sample 45: + time = 1080000 + flags = 1 + data = length 384, hash 7B4CE779 + sample 46: + time = 1104000 + flags = 1 + data = length 384, hash 50D10931 + sample 47: + time = 1128000 + flags = 1 + data = length 384, hash F0D97D3E + sample 48: + time = 1152000 + flags = 1 + data = length 384, hash ED786460 + sample 49: + time = 1176000 + flags = 1 + data = length 384, hash 435543F4 + sample 50: + time = 1200000 + flags = 1 + data = length 384, hash 523ED198 + sample 51: + time = 1224000 + flags = 1 + data = length 384, hash 705705D3 + sample 52: + time = 1248000 + flags = 1 + data = length 384, hash 4A95F442 + sample 53: + time = 1272000 + flags = 1 + data = length 384, hash 56D7EF4B + sample 54: + time = 1296000 + flags = 1 + data = length 384, hash B47AAC17 + sample 55: + time = 1320000 + flags = 1 + data = length 384, hash 38E76A4D + sample 56: + time = 1344000 + flags = 1 + data = length 384, hash ADF5E978 + sample 57: + time = 1368000 + flags = 1 + data = length 384, hash 349125C2 + sample 58: + time = 1392000 + flags = 1 + data = length 384, hash D69B3903 + sample 59: + time = 1416000 + flags = 1 + data = length 384, hash 852DA91C + sample 60: + time = 1440000 + flags = 1 + data = length 384, hash 21F87C6E + sample 61: + time = 1464000 + flags = 1 + data = length 384, hash 68686E41 + sample 62: + time = 1488000 + flags = 1 + data = length 384, hash 4DAC9F6A + sample 63: + time = 1512000 + flags = 1 + data = length 384, hash B5CA6FCF + sample 64: + time = 1536000 + flags = 1 + data = length 384, hash 9B7216B3 + sample 65: + time = 1560000 + flags = 1 + data = length 384, hash AC7162DA + sample 66: + time = 1584000 + flags = 1 + data = length 384, hash 545A4B9C + sample 67: + time = 1608000 + flags = 1 + data = length 384, hash 380FA5D4 + sample 68: + time = 1632000 + flags = 1 + data = length 384, hash 53BF79E9 + sample 69: + time = 1656000 + flags = 1 + data = length 384, hash FE2460DB + sample 70: + time = 1680000 + flags = 1 + data = length 384, hash 2525E09 + sample 71: + time = 1704000 + flags = 1 + data = length 384, hash ECCB42AA + sample 72: + time = 1728000 + flags = 1 + data = length 384, hash 1E5EC5FA + sample 73: + time = 1752000 + flags = 1 + data = length 384, hash C2597D09 + sample 74: + time = 1776000 + flags = 1 + data = length 384, hash 32CD263E + sample 75: + time = 1800000 + flags = 1 + data = length 384, hash 6B3A0DC7 + sample 76: + time = 1824000 + flags = 1 + data = length 384, hash 5155B353 + sample 77: + time = 1848000 + flags = 1 + data = length 384, hash 220C783 + sample 78: + time = 1872000 + flags = 1 + data = length 384, hash E0925905 + sample 79: + time = 1896000 + flags = 1 + data = length 384, hash 824C0D02 + sample 80: + time = 1920000 + flags = 1 + data = length 384, hash 5166F8F3 + sample 81: + time = 1944000 + flags = 1 + data = length 384, hash B5F38EE6 + sample 82: + time = 1968000 + flags = 1 + data = length 384, hash 659E483F + sample 83: + time = 1992000 + flags = 1 + data = length 384, hash A022EFCB + sample 84: + time = 2016000 + flags = 1 + data = length 384, hash 93DCF4B5 + sample 85: + time = 2040000 + flags = 1 + data = length 384, hash C965128 + sample 86: + time = 2064000 + flags = 1 + data = length 384, hash 6FD595F4 + sample 87: + time = 2088000 + flags = 1 + data = length 384, hash BF6CDB31 + sample 88: + time = 2112000 + flags = 1 + data = length 384, hash 67C738C0 + sample 89: + time = 2136000 + flags = 1 + data = length 384, hash BCFCD1CC + sample 90: + time = 2160000 + flags = 1 + data = length 384, hash A4A85D04 + sample 91: + time = 2184000 + flags = 1 + data = length 384, hash 6CD26641 + sample 92: + time = 2208000 + flags = 1 + data = length 384, hash 53817862 + sample 93: + time = 2232000 + flags = 1 + data = length 384, hash 1C98DD10 + sample 94: + time = 2256000 + flags = 1 + data = length 384, hash 5B8EE2C9 + sample 95: + time = 2280000 + flags = 1 + data = length 384, hash 227883D0 + sample 96: + time = 2304000 + flags = 1 + data = length 384, hash 50267C46 + sample 97: + time = 2328000 + flags = 1 + data = length 384, hash F02EA205 + sample 98: + time = 2352000 + flags = 1 + data = length 384, hash ED7BE6DF + sample 99: + time = 2376000 + flags = 1 + data = length 384, hash AEE4E608 + sample 100: + time = 2400000 + flags = 1 + data = length 384, hash 8EA81A05 + sample 101: + time = 2424000 + flags = 1 + data = length 384, hash C9D6BC51 + sample 102: + time = 2448000 + flags = 1 + data = length 384, hash FBE2EF0F + sample 103: + time = 2472000 + flags = 1 + data = length 384, hash 64E44326 + sample 104: + time = 2496000 + flags = 1 + data = length 384, hash 2A371FEA + sample 105: + time = 2520000 + flags = 1 + data = length 384, hash BC1F17B6 + sample 106: + time = 2544000 + flags = 1 + data = length 384, hash 759FA7C2 + sample 107: + time = 2568000 + flags = 1 + data = length 384, hash ED978C15 + sample 108: + time = 2592000 + flags = 1 + data = length 384, hash 2393BA70 + sample 109: + time = 2616000 + flags = 1 + data = length 384, hash F84E2847 + sample 110: + time = 2640000 + flags = 1 + data = length 384, hash FF006E14 + sample 111: + time = 2664000 + flags = 1 + data = length 384, hash 840D19F5 + sample 112: + time = 2688000 + flags = 1 + data = length 384, hash B17A5934 + sample 113: + time = 2712000 + flags = 1 + data = length 384, hash 2879F06E + sample 114: + time = 2736000 + flags = 1 + data = length 384, hash 386AB993 + sample 115: + time = 2760000 + flags = 1 + data = length 384, hash 276609B5 + sample 116: + time = 2784000 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.1.dump new file mode 100644 index 0000000000..2ae4be63a2 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.1.dump @@ -0,0 +1,339 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 30336 + sample count = 79 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=0.0, field 1=GainField{name=1, originator=3, gain=23.0}, field 2=null] + sample 0: + time = 911992 + flags = 1 + data = length 384, hash 40914CAF + sample 1: + time = 935992 + flags = 1 + data = length 384, hash F7EFB71E + sample 2: + time = 959992 + flags = 1 + data = length 384, hash 53FBE77C + sample 3: + time = 983992 + flags = 1 + data = length 384, hash 77E58178 + sample 4: + time = 1007992 + flags = 1 + data = length 384, hash E3B86048 + sample 5: + time = 1031992 + flags = 1 + data = length 384, hash 6E64349 + sample 6: + time = 1055992 + flags = 1 + data = length 384, hash AC0B5E18 + sample 7: + time = 1079992 + flags = 1 + data = length 384, hash 7B4CE779 + sample 8: + time = 1103992 + flags = 1 + data = length 384, hash 50D10931 + sample 9: + time = 1127992 + flags = 1 + data = length 384, hash F0D97D3E + sample 10: + time = 1151992 + flags = 1 + data = length 384, hash ED786460 + sample 11: + time = 1175992 + flags = 1 + data = length 384, hash 435543F4 + sample 12: + time = 1199992 + flags = 1 + data = length 384, hash 523ED198 + sample 13: + time = 1223992 + flags = 1 + data = length 384, hash 705705D3 + sample 14: + time = 1247992 + flags = 1 + data = length 384, hash 4A95F442 + sample 15: + time = 1271992 + flags = 1 + data = length 384, hash 56D7EF4B + sample 16: + time = 1295992 + flags = 1 + data = length 384, hash B47AAC17 + sample 17: + time = 1319992 + flags = 1 + data = length 384, hash 38E76A4D + sample 18: + time = 1343992 + flags = 1 + data = length 384, hash ADF5E978 + sample 19: + time = 1367992 + flags = 1 + data = length 384, hash 349125C2 + sample 20: + time = 1391992 + flags = 1 + data = length 384, hash D69B3903 + sample 21: + time = 1415992 + flags = 1 + data = length 384, hash 852DA91C + sample 22: + time = 1439992 + flags = 1 + data = length 384, hash 21F87C6E + sample 23: + time = 1463992 + flags = 1 + data = length 384, hash 68686E41 + sample 24: + time = 1487992 + flags = 1 + data = length 384, hash 4DAC9F6A + sample 25: + time = 1511992 + flags = 1 + data = length 384, hash B5CA6FCF + sample 26: + time = 1535992 + flags = 1 + data = length 384, hash 9B7216B3 + sample 27: + time = 1559992 + flags = 1 + data = length 384, hash AC7162DA + sample 28: + time = 1583992 + flags = 1 + data = length 384, hash 545A4B9C + sample 29: + time = 1607992 + flags = 1 + data = length 384, hash 380FA5D4 + sample 30: + time = 1631992 + flags = 1 + data = length 384, hash 53BF79E9 + sample 31: + time = 1655992 + flags = 1 + data = length 384, hash FE2460DB + sample 32: + time = 1679992 + flags = 1 + data = length 384, hash 2525E09 + sample 33: + time = 1703992 + flags = 1 + data = length 384, hash ECCB42AA + sample 34: + time = 1727992 + flags = 1 + data = length 384, hash 1E5EC5FA + sample 35: + time = 1751992 + flags = 1 + data = length 384, hash C2597D09 + sample 36: + time = 1775992 + flags = 1 + data = length 384, hash 32CD263E + sample 37: + time = 1799992 + flags = 1 + data = length 384, hash 6B3A0DC7 + sample 38: + time = 1823992 + flags = 1 + data = length 384, hash 5155B353 + sample 39: + time = 1847992 + flags = 1 + data = length 384, hash 220C783 + sample 40: + time = 1871992 + flags = 1 + data = length 384, hash E0925905 + sample 41: + time = 1895992 + flags = 1 + data = length 384, hash 824C0D02 + sample 42: + time = 1919992 + flags = 1 + data = length 384, hash 5166F8F3 + sample 43: + time = 1943992 + flags = 1 + data = length 384, hash B5F38EE6 + sample 44: + time = 1967992 + flags = 1 + data = length 384, hash 659E483F + sample 45: + time = 1991992 + flags = 1 + data = length 384, hash A022EFCB + sample 46: + time = 2015992 + flags = 1 + data = length 384, hash 93DCF4B5 + sample 47: + time = 2039992 + flags = 1 + data = length 384, hash C965128 + sample 48: + time = 2063992 + flags = 1 + data = length 384, hash 6FD595F4 + sample 49: + time = 2087992 + flags = 1 + data = length 384, hash BF6CDB31 + sample 50: + time = 2111992 + flags = 1 + data = length 384, hash 67C738C0 + sample 51: + time = 2135992 + flags = 1 + data = length 384, hash BCFCD1CC + sample 52: + time = 2159992 + flags = 1 + data = length 384, hash A4A85D04 + sample 53: + time = 2183992 + flags = 1 + data = length 384, hash 6CD26641 + sample 54: + time = 2207992 + flags = 1 + data = length 384, hash 53817862 + sample 55: + time = 2231992 + flags = 1 + data = length 384, hash 1C98DD10 + sample 56: + time = 2255992 + flags = 1 + data = length 384, hash 5B8EE2C9 + sample 57: + time = 2279992 + flags = 1 + data = length 384, hash 227883D0 + sample 58: + time = 2303992 + flags = 1 + data = length 384, hash 50267C46 + sample 59: + time = 2327992 + flags = 1 + data = length 384, hash F02EA205 + sample 60: + time = 2351992 + flags = 1 + data = length 384, hash ED7BE6DF + sample 61: + time = 2375992 + flags = 1 + data = length 384, hash AEE4E608 + sample 62: + time = 2399992 + flags = 1 + data = length 384, hash 8EA81A05 + sample 63: + time = 2423992 + flags = 1 + data = length 384, hash C9D6BC51 + sample 64: + time = 2447992 + flags = 1 + data = length 384, hash FBE2EF0F + sample 65: + time = 2471992 + flags = 1 + data = length 384, hash 64E44326 + sample 66: + time = 2495992 + flags = 1 + data = length 384, hash 2A371FEA + sample 67: + time = 2519992 + flags = 1 + data = length 384, hash BC1F17B6 + sample 68: + time = 2543992 + flags = 1 + data = length 384, hash 759FA7C2 + sample 69: + time = 2567992 + flags = 1 + data = length 384, hash ED978C15 + sample 70: + time = 2591992 + flags = 1 + data = length 384, hash 2393BA70 + sample 71: + time = 2615992 + flags = 1 + data = length 384, hash F84E2847 + sample 72: + time = 2639992 + flags = 1 + data = length 384, hash FF006E14 + sample 73: + time = 2663992 + flags = 1 + data = length 384, hash 840D19F5 + sample 74: + time = 2687992 + flags = 1 + data = length 384, hash B17A5934 + sample 75: + time = 2711992 + flags = 1 + data = length 384, hash 2879F06E + sample 76: + time = 2735992 + flags = 1 + data = length 384, hash 386AB993 + sample 77: + time = 2759992 + flags = 1 + data = length 384, hash 276609B5 + sample 78: + time = 2783992 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.2.dump new file mode 100644 index 0000000000..176b1e30fc --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.2.dump @@ -0,0 +1,183 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 15360 + sample count = 40 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=0.0, field 1=GainField{name=1, originator=3, gain=23.0}, field 2=null] + sample 0: + time = 1847985 + flags = 1 + data = length 384, hash 220C783 + sample 1: + time = 1871985 + flags = 1 + data = length 384, hash E0925905 + sample 2: + time = 1895985 + flags = 1 + data = length 384, hash 824C0D02 + sample 3: + time = 1919985 + flags = 1 + data = length 384, hash 5166F8F3 + sample 4: + time = 1943985 + flags = 1 + data = length 384, hash B5F38EE6 + sample 5: + time = 1967985 + flags = 1 + data = length 384, hash 659E483F + sample 6: + time = 1991985 + flags = 1 + data = length 384, hash A022EFCB + sample 7: + time = 2015985 + flags = 1 + data = length 384, hash 93DCF4B5 + sample 8: + time = 2039985 + flags = 1 + data = length 384, hash C965128 + sample 9: + time = 2063985 + flags = 1 + data = length 384, hash 6FD595F4 + sample 10: + time = 2087985 + flags = 1 + data = length 384, hash BF6CDB31 + sample 11: + time = 2111985 + flags = 1 + data = length 384, hash 67C738C0 + sample 12: + time = 2135985 + flags = 1 + data = length 384, hash BCFCD1CC + sample 13: + time = 2159985 + flags = 1 + data = length 384, hash A4A85D04 + sample 14: + time = 2183985 + flags = 1 + data = length 384, hash 6CD26641 + sample 15: + time = 2207985 + flags = 1 + data = length 384, hash 53817862 + sample 16: + time = 2231985 + flags = 1 + data = length 384, hash 1C98DD10 + sample 17: + time = 2255985 + flags = 1 + data = length 384, hash 5B8EE2C9 + sample 18: + time = 2279985 + flags = 1 + data = length 384, hash 227883D0 + sample 19: + time = 2303985 + flags = 1 + data = length 384, hash 50267C46 + sample 20: + time = 2327985 + flags = 1 + data = length 384, hash F02EA205 + sample 21: + time = 2351985 + flags = 1 + data = length 384, hash ED7BE6DF + sample 22: + time = 2375985 + flags = 1 + data = length 384, hash AEE4E608 + sample 23: + time = 2399985 + flags = 1 + data = length 384, hash 8EA81A05 + sample 24: + time = 2423985 + flags = 1 + data = length 384, hash C9D6BC51 + sample 25: + time = 2447985 + flags = 1 + data = length 384, hash FBE2EF0F + sample 26: + time = 2471985 + flags = 1 + data = length 384, hash 64E44326 + sample 27: + time = 2495985 + flags = 1 + data = length 384, hash 2A371FEA + sample 28: + time = 2519985 + flags = 1 + data = length 384, hash BC1F17B6 + sample 29: + time = 2543985 + flags = 1 + data = length 384, hash 759FA7C2 + sample 30: + time = 2567985 + flags = 1 + data = length 384, hash ED978C15 + sample 31: + time = 2591985 + flags = 1 + data = length 384, hash 2393BA70 + sample 32: + time = 2615985 + flags = 1 + data = length 384, hash F84E2847 + sample 33: + time = 2639985 + flags = 1 + data = length 384, hash FF006E14 + sample 34: + time = 2663985 + flags = 1 + data = length 384, hash 840D19F5 + sample 35: + time = 2687985 + flags = 1 + data = length 384, hash B17A5934 + sample 36: + time = 2711985 + flags = 1 + data = length 384, hash 2879F06E + sample 37: + time = 2735985 + flags = 1 + data = length 384, hash 386AB993 + sample 38: + time = 2759985 + flags = 1 + data = length 384, hash 276609B5 + sample 39: + time = 2783985 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.3.dump new file mode 100644 index 0000000000..649cd2e656 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.3.dump @@ -0,0 +1,27 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 384 + sample count = 1 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=0.0, field 1=GainField{name=1, originator=3, gain=23.0}, field 2=null] + sample 0: + time = 2783978 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.unknown_length.dump new file mode 100644 index 0000000000..457facc249 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp3/bear-vbr-xing-header-replaygain-fast.mp3.unknown_length.dump @@ -0,0 +1,491 @@ +seekMap: + isSeekable = true + duration = 2807978 + getPosition(0) = [[timeUs=0, position=429]] + getPosition(1) = [[timeUs=0, position=429], [timeUs=23999, position=813]] + getPosition(1403989) = [[timeUs=1391989, position=22701], [timeUs=1415988, position=23085]] + getPosition(2807978) = [[timeUs=2783978, position=44973]] +numberOfTracks = 1 +track 0: + total output bytes = 44928 + sample count = 117 + track duration = 2807978 + format 0: + averageBitrate = 128001 + containerMimeType = audio/mpeg + sampleMimeType = audio/mpeg + maxInputSize = 4096 + channelCount = 2 + sampleRate = 48000 + encoderDelay = 576 + encoderPadding = 576 + metadata = entries=[TSSE: description=null: values=[Lavf58.29.100], ReplayGain Xing/Info: peak=0.0, field 1=GainField{name=1, originator=3, gain=23.0}, field 2=null] + sample 0: + time = 0 + flags = 1 + data = length 384, hash D3A746E7 + sample 1: + time = 24000 + flags = 1 + data = length 384, hash F1E9E3E + sample 2: + time = 48000 + flags = 1 + data = length 384, hash 456DA228 + sample 3: + time = 72000 + flags = 1 + data = length 384, hash CDB09F78 + sample 4: + time = 96000 + flags = 1 + data = length 384, hash 5BFF9C1A + sample 5: + time = 120000 + flags = 1 + data = length 384, hash 861FDAA7 + sample 6: + time = 144000 + flags = 1 + data = length 384, hash 1FE36A4D + sample 7: + time = 168000 + flags = 1 + data = length 384, hash 4DD5C0F4 + sample 8: + time = 192000 + flags = 1 + data = length 384, hash D64A8BC6 + sample 9: + time = 216000 + flags = 1 + data = length 384, hash E20D4988 + sample 10: + time = 240000 + flags = 1 + data = length 384, hash ED2BF624 + sample 11: + time = 264000 + flags = 1 + data = length 384, hash 60E5ABBC + sample 12: + time = 288000 + flags = 1 + data = length 384, hash 404244BF + sample 13: + time = 312000 + flags = 1 + data = length 384, hash C65FF8C1 + sample 14: + time = 336000 + flags = 1 + data = length 384, hash 42386869 + sample 15: + time = 360000 + flags = 1 + data = length 384, hash 592F129A + sample 16: + time = 384000 + flags = 1 + data = length 384, hash 299ACDD7 + sample 17: + time = 408000 + flags = 1 + data = length 384, hash 8FF937AC + sample 18: + time = 432000 + flags = 1 + data = length 384, hash 4B5C2884 + sample 19: + time = 456000 + flags = 1 + data = length 384, hash 862D22F1 + sample 20: + time = 480000 + flags = 1 + data = length 384, hash 49AFE67D + sample 21: + time = 504000 + flags = 1 + data = length 384, hash 420EFE5F + sample 22: + time = 528000 + flags = 1 + data = length 384, hash 52759113 + sample 23: + time = 552000 + flags = 1 + data = length 384, hash 880C2AB2 + sample 24: + time = 576000 + flags = 1 + data = length 384, hash 1F7E786A + sample 25: + time = 600000 + flags = 1 + data = length 384, hash DF5D2BCF + sample 26: + time = 624000 + flags = 1 + data = length 384, hash D4020EB3 + sample 27: + time = 648000 + flags = 1 + data = length 384, hash BF6D1CA6 + sample 28: + time = 672000 + flags = 1 + data = length 384, hash 68B200EE + sample 29: + time = 696000 + flags = 1 + data = length 384, hash A71C4AFF + sample 30: + time = 720000 + flags = 1 + data = length 384, hash C36CA276 + sample 31: + time = 744000 + flags = 1 + data = length 384, hash 5AB9C9AA + sample 32: + time = 768000 + flags = 1 + data = length 384, hash CAC81110 + sample 33: + time = 792000 + flags = 1 + data = length 384, hash B45D0135 + sample 34: + time = 816000 + flags = 1 + data = length 384, hash 9F0FF1E6 + sample 35: + time = 840000 + flags = 1 + data = length 384, hash F3F425FD + sample 36: + time = 864000 + flags = 1 + data = length 384, hash 15C4DA8 + sample 37: + time = 888000 + flags = 1 + data = length 384, hash 9B5D1E2 + sample 38: + time = 912000 + flags = 1 + data = length 384, hash 40914CAF + sample 39: + time = 936000 + flags = 1 + data = length 384, hash F7EFB71E + sample 40: + time = 960000 + flags = 1 + data = length 384, hash 53FBE77C + sample 41: + time = 984000 + flags = 1 + data = length 384, hash 77E58178 + sample 42: + time = 1008000 + flags = 1 + data = length 384, hash E3B86048 + sample 43: + time = 1032000 + flags = 1 + data = length 384, hash 6E64349 + sample 44: + time = 1056000 + flags = 1 + data = length 384, hash AC0B5E18 + sample 45: + time = 1080000 + flags = 1 + data = length 384, hash 7B4CE779 + sample 46: + time = 1104000 + flags = 1 + data = length 384, hash 50D10931 + sample 47: + time = 1128000 + flags = 1 + data = length 384, hash F0D97D3E + sample 48: + time = 1152000 + flags = 1 + data = length 384, hash ED786460 + sample 49: + time = 1176000 + flags = 1 + data = length 384, hash 435543F4 + sample 50: + time = 1200000 + flags = 1 + data = length 384, hash 523ED198 + sample 51: + time = 1224000 + flags = 1 + data = length 384, hash 705705D3 + sample 52: + time = 1248000 + flags = 1 + data = length 384, hash 4A95F442 + sample 53: + time = 1272000 + flags = 1 + data = length 384, hash 56D7EF4B + sample 54: + time = 1296000 + flags = 1 + data = length 384, hash B47AAC17 + sample 55: + time = 1320000 + flags = 1 + data = length 384, hash 38E76A4D + sample 56: + time = 1344000 + flags = 1 + data = length 384, hash ADF5E978 + sample 57: + time = 1368000 + flags = 1 + data = length 384, hash 349125C2 + sample 58: + time = 1392000 + flags = 1 + data = length 384, hash D69B3903 + sample 59: + time = 1416000 + flags = 1 + data = length 384, hash 852DA91C + sample 60: + time = 1440000 + flags = 1 + data = length 384, hash 21F87C6E + sample 61: + time = 1464000 + flags = 1 + data = length 384, hash 68686E41 + sample 62: + time = 1488000 + flags = 1 + data = length 384, hash 4DAC9F6A + sample 63: + time = 1512000 + flags = 1 + data = length 384, hash B5CA6FCF + sample 64: + time = 1536000 + flags = 1 + data = length 384, hash 9B7216B3 + sample 65: + time = 1560000 + flags = 1 + data = length 384, hash AC7162DA + sample 66: + time = 1584000 + flags = 1 + data = length 384, hash 545A4B9C + sample 67: + time = 1608000 + flags = 1 + data = length 384, hash 380FA5D4 + sample 68: + time = 1632000 + flags = 1 + data = length 384, hash 53BF79E9 + sample 69: + time = 1656000 + flags = 1 + data = length 384, hash FE2460DB + sample 70: + time = 1680000 + flags = 1 + data = length 384, hash 2525E09 + sample 71: + time = 1704000 + flags = 1 + data = length 384, hash ECCB42AA + sample 72: + time = 1728000 + flags = 1 + data = length 384, hash 1E5EC5FA + sample 73: + time = 1752000 + flags = 1 + data = length 384, hash C2597D09 + sample 74: + time = 1776000 + flags = 1 + data = length 384, hash 32CD263E + sample 75: + time = 1800000 + flags = 1 + data = length 384, hash 6B3A0DC7 + sample 76: + time = 1824000 + flags = 1 + data = length 384, hash 5155B353 + sample 77: + time = 1848000 + flags = 1 + data = length 384, hash 220C783 + sample 78: + time = 1872000 + flags = 1 + data = length 384, hash E0925905 + sample 79: + time = 1896000 + flags = 1 + data = length 384, hash 824C0D02 + sample 80: + time = 1920000 + flags = 1 + data = length 384, hash 5166F8F3 + sample 81: + time = 1944000 + flags = 1 + data = length 384, hash B5F38EE6 + sample 82: + time = 1968000 + flags = 1 + data = length 384, hash 659E483F + sample 83: + time = 1992000 + flags = 1 + data = length 384, hash A022EFCB + sample 84: + time = 2016000 + flags = 1 + data = length 384, hash 93DCF4B5 + sample 85: + time = 2040000 + flags = 1 + data = length 384, hash C965128 + sample 86: + time = 2064000 + flags = 1 + data = length 384, hash 6FD595F4 + sample 87: + time = 2088000 + flags = 1 + data = length 384, hash BF6CDB31 + sample 88: + time = 2112000 + flags = 1 + data = length 384, hash 67C738C0 + sample 89: + time = 2136000 + flags = 1 + data = length 384, hash BCFCD1CC + sample 90: + time = 2160000 + flags = 1 + data = length 384, hash A4A85D04 + sample 91: + time = 2184000 + flags = 1 + data = length 384, hash 6CD26641 + sample 92: + time = 2208000 + flags = 1 + data = length 384, hash 53817862 + sample 93: + time = 2232000 + flags = 1 + data = length 384, hash 1C98DD10 + sample 94: + time = 2256000 + flags = 1 + data = length 384, hash 5B8EE2C9 + sample 95: + time = 2280000 + flags = 1 + data = length 384, hash 227883D0 + sample 96: + time = 2304000 + flags = 1 + data = length 384, hash 50267C46 + sample 97: + time = 2328000 + flags = 1 + data = length 384, hash F02EA205 + sample 98: + time = 2352000 + flags = 1 + data = length 384, hash ED7BE6DF + sample 99: + time = 2376000 + flags = 1 + data = length 384, hash AEE4E608 + sample 100: + time = 2400000 + flags = 1 + data = length 384, hash 8EA81A05 + sample 101: + time = 2424000 + flags = 1 + data = length 384, hash C9D6BC51 + sample 102: + time = 2448000 + flags = 1 + data = length 384, hash FBE2EF0F + sample 103: + time = 2472000 + flags = 1 + data = length 384, hash 64E44326 + sample 104: + time = 2496000 + flags = 1 + data = length 384, hash 2A371FEA + sample 105: + time = 2520000 + flags = 1 + data = length 384, hash BC1F17B6 + sample 106: + time = 2544000 + flags = 1 + data = length 384, hash 759FA7C2 + sample 107: + time = 2568000 + flags = 1 + data = length 384, hash ED978C15 + sample 108: + time = 2592000 + flags = 1 + data = length 384, hash 2393BA70 + sample 109: + time = 2616000 + flags = 1 + data = length 384, hash F84E2847 + sample 110: + time = 2640000 + flags = 1 + data = length 384, hash FF006E14 + sample 111: + time = 2664000 + flags = 1 + data = length 384, hash 840D19F5 + sample 112: + time = 2688000 + flags = 1 + data = length 384, hash B17A5934 + sample 113: + time = 2712000 + flags = 1 + data = length 384, hash 2879F06E + sample 114: + time = 2736000 + flags = 1 + data = length 384, hash 386AB993 + sample 115: + time = 2760000 + flags = 1 + data = length 384, hash 276609B5 + sample 116: + time = 2784000 + flags = 1 + data = length 384, hash 5FE294B5 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/media/mp3/bear-vbr-xing-header-replaygain-accurate.mp3 b/libraries/test_data/src/test/assets/media/mp3/bear-vbr-xing-header-replaygain-accurate.mp3 new file mode 100644 index 0000000000..0f2e3fa029 Binary files /dev/null and b/libraries/test_data/src/test/assets/media/mp3/bear-vbr-xing-header-replaygain-accurate.mp3 differ diff --git a/libraries/test_data/src/test/assets/media/mp3/bear-vbr-xing-header-replaygain-fast.mp3 b/libraries/test_data/src/test/assets/media/mp3/bear-vbr-xing-header-replaygain-fast.mp3 new file mode 100644 index 0000000000..ae9d87ab25 Binary files /dev/null and b/libraries/test_data/src/test/assets/media/mp3/bear-vbr-xing-header-replaygain-fast.mp3 differ