diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java index f5c48700e5..a1e0e34e0e 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java @@ -190,24 +190,7 @@ public final class Mp3Extractor implements Extractor { } } if (seeker == null) { - // 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()); - - if (disableSeeking) { - seeker = new UnseekableSeeker(); - } else { - if (metadataSeeker != null) { - seeker = metadataSeeker; - } else if (seekFrameSeeker != null) { - seeker = seekFrameSeeker; - } - if (seeker == null - || (!seeker.isSeekable() && (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING) != 0)) { - seeker = getConstantBitrateSeeker(input); - } - } + seeker = computeSeeker(input); extractorOutput.seekMap(seeker); trackOutput.format( Format.createAudioSampleFormat( @@ -385,6 +368,31 @@ public final class Mp3Extractor implements Extractor { } } + private Seeker computeSeeker(ExtractorInput input) throws IOException, InterruptedException { + // 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()); + + if (disableSeeking) { + return new UnseekableSeeker(); + } + + @Nullable Seeker resultSeeker = null; + if (metadataSeeker != null) { + resultSeeker = metadataSeeker; + } else if (seekFrameSeeker != null) { + resultSeeker = seekFrameSeeker; + } + + if (resultSeeker == null + || (!resultSeeker.isSeekable() && (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING) != 0)) { + resultSeeker = getConstantBitrateSeeker(input); + } + + return resultSeeker; + } + /** * Consumes the next frame from the {@code input} if it contains VBRI or Xing seeking metadata, * returning a {@link Seeker} if the metadata was present and valid, or {@code null} otherwise.