Fix networked WAV extraction (where # bytes read < # bytes requested).
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=118457489
This commit is contained in:
parent
ce47d7be38
commit
d869a8d2fa
@ -37,6 +37,8 @@ public final class WavExtractor implements Extractor, SeekMap {
|
|||||||
private ExtractorOutput extractorOutput;
|
private ExtractorOutput extractorOutput;
|
||||||
private TrackOutput trackOutput;
|
private TrackOutput trackOutput;
|
||||||
private WavHeader wavHeader;
|
private WavHeader wavHeader;
|
||||||
|
private int bytesPerFrame;
|
||||||
|
private int pendingBytes;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean sniff(ExtractorInput input) throws IOException, InterruptedException {
|
public boolean sniff(ExtractorInput input) throws IOException, InterruptedException {
|
||||||
@ -53,7 +55,7 @@ public final class WavExtractor implements Extractor, SeekMap {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void seek() {
|
public void seek() {
|
||||||
// Do nothing.
|
pendingBytes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -69,6 +71,7 @@ public final class WavExtractor implements Extractor, SeekMap {
|
|||||||
wavHeader.getBitrate(), MAX_INPUT_SIZE, wavHeader.getNumChannels(),
|
wavHeader.getBitrate(), MAX_INPUT_SIZE, wavHeader.getNumChannels(),
|
||||||
wavHeader.getSampleRateHz(), null, null);
|
wavHeader.getSampleRateHz(), null, null);
|
||||||
trackOutput.format(format);
|
trackOutput.format(format);
|
||||||
|
bytesPerFrame = wavHeader.getBytesPerFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wavHeader.hasDataBounds()) {
|
if (!wavHeader.hasDataBounds()) {
|
||||||
@ -76,15 +79,21 @@ public final class WavExtractor implements Extractor, SeekMap {
|
|||||||
extractorOutput.seekMap(this);
|
extractorOutput.seekMap(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
long inputPosition = input.getPosition();
|
int bytesAppended = trackOutput.sampleData(input, MAX_INPUT_SIZE - pendingBytes, true);
|
||||||
int bytesRead = trackOutput.sampleData(input, MAX_INPUT_SIZE, true);
|
if (bytesAppended != RESULT_END_OF_INPUT) {
|
||||||
if (bytesRead == RESULT_END_OF_INPUT) {
|
pendingBytes += bytesAppended;
|
||||||
return RESULT_END_OF_INPUT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trackOutput.sampleMetadata(
|
// Samples must consist of a whole number of frames.
|
||||||
wavHeader.getTimeUs(inputPosition), C.BUFFER_FLAG_KEY_FRAME, bytesRead, 0, null);
|
int pendingFrames = pendingBytes / bytesPerFrame;
|
||||||
return RESULT_CONTINUE;
|
if (pendingFrames > 0) {
|
||||||
|
long timeUs = wavHeader.getTimeUs(input.getPosition() - pendingBytes);
|
||||||
|
int size = pendingFrames * bytesPerFrame;
|
||||||
|
pendingBytes -= size;
|
||||||
|
trackOutput.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, size, pendingBytes, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytesAppended == RESULT_END_OF_INPUT ? RESULT_END_OF_INPUT : RESULT_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeekMap implementation.
|
// SeekMap implementation.
|
||||||
|
@ -68,6 +68,11 @@ import com.google.android.exoplayer.C;
|
|||||||
return blockAlignment / numChannels;
|
return blockAlignment / numChannels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns the bytes per frame of this WAV. */
|
||||||
|
public int getBytesPerFrame() {
|
||||||
|
return blockAlignment;
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns the bitrate of this WAV. */
|
/** Returns the bitrate of this WAV. */
|
||||||
public int getBitrate() {
|
public int getBitrate() {
|
||||||
return sampleRateHz * bitsPerSample * numChannels;
|
return sampleRateHz * bitsPerSample * numChannels;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user