Remove TrackMetadataProvider interface

This interface was used by Boxes.moov. This CL removes the interface and just uses the Track object directly.

Since Track is package-private it seems fine to use it directly.
The drawback with interface is that, with every new field addition in the
Track class, we need to update the interface as well (if we need to access that field for moov box).

PiperOrigin-RevId: 669295399
This commit is contained in:
sheenachhabra 2024-08-30 05:44:07 -07:00 committed by Copybara-Service
parent 613c7a6aa7
commit 791483f2d3
2 changed files with 11 additions and 46 deletions

View File

@ -52,19 +52,6 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
/** Writes out various types of boxes as per MP4 (ISO/IEC 14496-12) standards. */ /** Writes out various types of boxes as per MP4 (ISO/IEC 14496-12) standards. */
/* package */ final class Boxes { /* package */ final class Boxes {
/** Provides track's metadata like media format, written samples. */
public interface TrackMetadataProvider {
Format format();
int videoUnitTimebase();
ImmutableList<BufferInfo> writtenSamples();
ImmutableList<Long> writtenChunkOffsets();
ImmutableList<Integer> writtenChunkSampleCounts();
}
/** Total number of bytes in an integer. */ /** Total number of bytes in an integer. */
private static final int BYTES_PER_INTEGER = 4; private static final int BYTES_PER_INTEGER = 4;
@ -125,7 +112,7 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
/** Returns the moov box. */ /** Returns the moov box. */
@SuppressWarnings("InlinedApi") @SuppressWarnings("InlinedApi")
public static ByteBuffer moov( public static ByteBuffer moov(
List<? extends TrackMetadataProvider> tracks, List<Track> tracks,
MetadataCollector metadataCollector, MetadataCollector metadataCollector,
long minInputPtsUs, long minInputPtsUs,
boolean isFragmentedMp4, boolean isFragmentedMp4,
@ -142,17 +129,17 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
int nextTrackId = 1; int nextTrackId = 1;
long videoDurationUs = 0L; long videoDurationUs = 0L;
for (int i = 0; i < tracks.size(); i++) { for (int i = 0; i < tracks.size(); i++) {
TrackMetadataProvider track = tracks.get(i); Track track = tracks.get(i);
if (!isFragmentedMp4 && track.writtenSamples().isEmpty()) { if (!isFragmentedMp4 && track.writtenSamples.isEmpty()) {
continue; continue;
} }
Format format = track.format(); Format format = track.format;
String languageCode = bcp47LanguageTagToIso3(format.language); String languageCode = bcp47LanguageTagToIso3(format.language);
// Generate the sample durations to calculate the total duration for tkhd box. // Generate the sample durations to calculate the total duration for tkhd box.
List<Integer> sampleDurationsVu = List<Integer> sampleDurationsVu =
convertPresentationTimestampsToDurationsVu( convertPresentationTimestampsToDurationsVu(
track.writtenSamples(), track.writtenSamples,
minInputPtsUs, minInputPtsUs,
track.videoUnitTimebase(), track.videoUnitTimebase(),
lastSampleDurationBehavior); lastSampleDurationBehavior);
@ -168,12 +155,12 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
ByteBuffer stts = stts(sampleDurationsVu); ByteBuffer stts = stts(sampleDurationsVu);
ByteBuffer ctts = ByteBuffer ctts =
MimeTypes.isVideo(format.sampleMimeType) MimeTypes.isVideo(format.sampleMimeType)
? ctts(track.writtenSamples(), sampleDurationsVu, track.videoUnitTimebase()) ? ctts(track.writtenSamples, sampleDurationsVu, track.videoUnitTimebase())
: ByteBuffer.allocate(0); : ByteBuffer.allocate(0);
ByteBuffer stsz = stsz(track.writtenSamples()); ByteBuffer stsz = stsz(track.writtenSamples);
ByteBuffer stsc = stsc(track.writtenChunkSampleCounts()); ByteBuffer stsc = stsc(track.writtenChunkSampleCounts);
ByteBuffer chunkOffsetBox = ByteBuffer chunkOffsetBox =
isFragmentedMp4 ? stco(track.writtenChunkOffsets()) : co64(track.writtenChunkOffsets()); isFragmentedMp4 ? stco(track.writtenChunkOffsets) : co64(track.writtenChunkOffsets);
String handlerType; String handlerType;
String handlerName; String handlerName;
@ -190,7 +177,7 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
sampleEntryBox = videoSampleEntry(format); sampleEntryBox = videoSampleEntry(format);
stsdBox = stsd(sampleEntryBox); stsdBox = stsd(sampleEntryBox);
stblBox = stblBox =
stbl(stsdBox, stts, ctts, stsz, stsc, chunkOffsetBox, stss(track.writtenSamples())); stbl(stsdBox, stts, ctts, stsz, stsc, chunkOffsetBox, stss(track.writtenSamples));
break; break;
case C.TRACK_TYPE_AUDIO: case C.TRACK_TYPE_AUDIO:
handlerType = "soun"; handlerType = "soun";

View File

@ -20,7 +20,6 @@ import android.media.MediaCodec.BufferInfo;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.MimeTypes; import androidx.media3.common.MimeTypes;
import androidx.media3.muxer.Muxer.TrackToken; import androidx.media3.muxer.Muxer.TrackToken;
import com.google.common.collect.ImmutableList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
@ -28,7 +27,7 @@ import java.util.Deque;
import java.util.List; import java.util.List;
/** Represents a single track (audio, video, metadata etc.). */ /** Represents a single track (audio, video, metadata etc.). */
/* package */ final class Track implements TrackToken, Boxes.TrackMetadataProvider { /* package */ final class Track implements TrackToken {
public final Format format; public final Format format;
public final int sortKey; public final int sortKey;
public final List<BufferInfo> writtenSamples; public final List<BufferInfo> writtenSamples;
@ -99,30 +98,9 @@ import java.util.List;
pendingSamplesByteBuffer.addLast(byteBufferToAdd); pendingSamplesByteBuffer.addLast(byteBufferToAdd);
} }
@Override
public int videoUnitTimebase() { public int videoUnitTimebase() {
return MimeTypes.isAudio(format.sampleMimeType) return MimeTypes.isAudio(format.sampleMimeType)
? 48_000 // TODO: b/270583563 - Update these with actual values from mediaFormat. ? 48_000 // TODO: b/270583563 - Update these with actual values from mediaFormat.
: 90_000; : 90_000;
} }
@Override
public ImmutableList<BufferInfo> writtenSamples() {
return ImmutableList.copyOf(writtenSamples);
}
@Override
public ImmutableList<Long> writtenChunkOffsets() {
return ImmutableList.copyOf(writtenChunkOffsets);
}
@Override
public ImmutableList<Integer> writtenChunkSampleCounts() {
return ImmutableList.copyOf(writtenChunkSampleCounts);
}
@Override
public Format format() {
return format;
}
} }