Refactor pending sample writing logic in Mp4Writer

The refactored method can be reused when implementing depth/editing format
interleave mode.

PiperOrigin-RevId: 663774290
This commit is contained in:
sheenachhabra 2024-08-16 10:26:38 -07:00 committed by Copybara-Service
parent 3600d04719
commit ed905a6498

View File

@ -338,6 +338,31 @@ import java.util.concurrent.atomic.AtomicBoolean;
safelyReplaceMoovAtEnd(newMoovStart, currentMoovData); safelyReplaceMoovAtEnd(newMoovStart, currentMoovData);
} }
/**
* Writes pending samples of given {@link Track tracks} if there are enough samples to write.
*
* @param tracks A list of {@link Track} containing the pending samples to be potentially written.
* @return {@code true} if any new sample is written, {@code false} otherwise.
*/
private boolean maybeWritePendingTrackSamples(List<Track> tracks) throws IOException {
boolean newSamplesWritten = false;
for (int i = 0; i < tracks.size(); i++) {
Track track = tracks.get(i);
// TODO: b/270583563 - Check if we need to consider the global timestamp instead.
if (track.pendingSamplesBufferInfo.size() > 2) {
BufferInfo firstSampleInfo = checkNotNull(track.pendingSamplesBufferInfo.peekFirst());
BufferInfo lastSampleInfo = checkNotNull(track.pendingSamplesBufferInfo.peekLast());
if (lastSampleInfo.presentationTimeUs - firstSampleInfo.presentationTimeUs
> INTERLEAVE_DURATION_US) {
newSamplesWritten = true;
writePendingTrackSamples(track);
}
}
}
return newSamplesWritten;
}
/** Writes out any pending samples of the given {@link Track}. */ /** Writes out any pending samples of the given {@link Track}. */
private void writePendingTrackSamples(Track track) throws IOException { private void writePendingTrackSamples(Track track) throws IOException {
checkState(track.pendingSamplesByteBuffer.size() == track.pendingSamplesBufferInfo.size()); checkState(track.pendingSamplesByteBuffer.size() == track.pendingSamplesBufferInfo.size());
@ -410,21 +435,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
} }
private void doInterleave() throws IOException { private void doInterleave() throws IOException {
boolean newSamplesWritten = false; boolean newSamplesWritten = maybeWritePendingTrackSamples(tracks);
for (int i = 0; i < tracks.size(); i++) {
Track track = tracks.get(i);
// TODO: b/270583563 - Check if we need to consider the global timestamp instead.
if (track.pendingSamplesBufferInfo.size() > 2) {
BufferInfo firstSampleInfo = checkNotNull(track.pendingSamplesBufferInfo.peekFirst());
BufferInfo lastSampleInfo = checkNotNull(track.pendingSamplesBufferInfo.peekLast());
if (lastSampleInfo.presentationTimeUs - firstSampleInfo.presentationTimeUs
> INTERLEAVE_DURATION_US) {
newSamplesWritten = true;
writePendingTrackSamples(track);
}
}
}
if (newSamplesWritten && canWriteMoovAtStart) { if (newSamplesWritten && canWriteMoovAtStart) {
maybeWriteMoovAtStart(); maybeWriteMoovAtStart();
} }