MP3 extractor: refactor seeker initialization

PiperOrigin-RevId: 291405419
This commit is contained in:
kimvde 2020-01-24 19:08:55 +00:00 committed by Andrew Lewis
parent 3fc61de7f7
commit 694f9844b0

View File

@ -190,24 +190,7 @@ public final class Mp3Extractor implements Extractor {
} }
} }
if (seeker == null) { if (seeker == null) {
// Read past any seek frame and set the seeker based on metadata or a seek frame. Metadata seeker = computeSeeker(input);
// 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);
}
}
extractorOutput.seekMap(seeker); extractorOutput.seekMap(seeker);
trackOutput.format( trackOutput.format(
Format.createAudioSampleFormat( 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, * 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. * returning a {@link Seeker} if the metadata was present and valid, or {@code null} otherwise.