Rename terminologies as per the MP4-AT spec

https://developer.android.com/media/platform/mp4-at-file-format

PiperOrigin-RevId: 703531148
This commit is contained in:
sheenachhabra 2024-12-06 09:55:00 -08:00 committed by Copybara-Service
parent 1d2ffcb165
commit 0a75447785
60 changed files with 1186 additions and 1191 deletions

View File

@ -42,24 +42,23 @@ public final class MdtaMetadataEntry implements Metadata.Entry {
public static final String KEY_ANDROID_CAPTURE_FPS = "com.android.capture.fps"; public static final String KEY_ANDROID_CAPTURE_FPS = "com.android.capture.fps";
// TODO: b/345219017 - Add depth/editing file format spec link after its published. // TODO: b/345219017 - Add depth/editing file format spec link after its published.
/** Key for editable tracks box (edvd) offset. */ /** Key for auxiliary tracks extension box (axte) offset. */
public static final String KEY_EDITABLE_TRACKS_OFFSET = "editable.tracks.offset"; public static final String KEY_AUXILIARY_TRACKS_OFFSET = "auxiliary.tracks.offset";
/** Key for editable tracks box (edvd) length. */ /** Key for auxiliary tracks extension box (axte) length. */
public static final String KEY_EDITABLE_TRACKS_LENGTH = "editable.tracks.length"; public static final String KEY_AUXILIARY_TRACKS_LENGTH = "auxiliary.tracks.length";
/** Key for editable tracks map. */ /** Key for auxiliary tracks map. */
public static final String KEY_EDITABLE_TRACKS_MAP = "editable.tracks.map"; public static final String KEY_AUXILIARY_TRACKS_MAP = "auxiliary.tracks.map";
/** Key for editable tracks samples location. */ /** Key for whether auxiliary tracks samples are interleaved. */
public static final String KEY_EDITABLE_TRACKS_SAMPLES_LOCATION = public static final String KEY_AUXILIARY_TRACKS_INTERLEAVED = "auxiliary.tracks.interleaved";
"editable.tracks.samples.location";
/** The editable tracks samples are in edit data MP4. */ /** The auxiliary tracks samples are not interleaved and are in the axte.mdat box. */
public static final byte EDITABLE_TRACKS_SAMPLES_LOCATION_IN_EDIT_DATA_MP4 = 0; public static final byte AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED = 0;
/** The editable tracks samples are interleaved with the primary tracks samples. */ /** The auxiliary tracks samples are interleaved in the primary video tracks mdat box. */
public static final byte EDITABLE_TRACKS_SAMPLES_LOCATION_INTERLEAVED = 1; public static final byte AUXILIARY_TRACKS_SAMPLES_INTERLEAVED = 1;
/** The default locale indicator which implies all speakers in all countries. */ /** The default locale indicator which implies all speakers in all countries. */
public static final int DEFAULT_LOCALE_INDICATOR = 0; public static final int DEFAULT_LOCALE_INDICATOR = 0;
@ -120,11 +119,11 @@ public final class MdtaMetadataEntry implements Metadata.Entry {
} }
/** /**
* Returns the editable track types from the {@linkplain #KEY_EDITABLE_TRACKS_MAP editable tracks * Returns the auxiliary track types from the {@linkplain #KEY_AUXILIARY_TRACKS_MAP auxiliary
* map} metadata. * tracks map} metadata.
*/ */
public List<Integer> getEditableTrackTypesFromMap() { public List<Integer> getAuxiliaryTrackTypesFromMap() {
checkState(key.equals(KEY_EDITABLE_TRACKS_MAP), "Metadata is not an editable tracks map"); checkState(key.equals(KEY_AUXILIARY_TRACKS_MAP), "Metadata is not an auxiliary tracks map");
// Value has 1 byte version, 1 byte track count, n bytes track types. // Value has 1 byte version, 1 byte track count, n bytes track types.
int numberOfTracks = value[1]; int numberOfTracks = value[1];
List<Integer> trackTypes = new ArrayList<>(); List<Integer> trackTypes = new ArrayList<>();
@ -179,8 +178,8 @@ public final class MdtaMetadataEntry implements Metadata.Entry {
formattedValue = String.valueOf(new ParsableByteArray(value).readUnsignedLongToLong()); formattedValue = String.valueOf(new ParsableByteArray(value).readUnsignedLongToLong());
break; break;
case TYPE_INDICATOR_RESERVED: case TYPE_INDICATOR_RESERVED:
if (key.equals(KEY_EDITABLE_TRACKS_MAP)) { if (key.equals(KEY_AUXILIARY_TRACKS_MAP)) {
formattedValue = getFormattedValueForEditableTracksMap(getEditableTrackTypesFromMap()); formattedValue = getFormattedValueForAuxiliaryTracksMap(getAuxiliaryTrackTypesFromMap());
break; break;
} }
// fall through // fall through
@ -225,26 +224,26 @@ public final class MdtaMetadataEntry implements Metadata.Entry {
case KEY_ANDROID_CAPTURE_FPS: case KEY_ANDROID_CAPTURE_FPS:
checkArgument(typeIndicator == TYPE_INDICATOR_FLOAT32 && value.length == 4); checkArgument(typeIndicator == TYPE_INDICATOR_FLOAT32 && value.length == 4);
break; break;
case KEY_EDITABLE_TRACKS_OFFSET: case KEY_AUXILIARY_TRACKS_OFFSET:
case KEY_EDITABLE_TRACKS_LENGTH: case KEY_AUXILIARY_TRACKS_LENGTH:
checkArgument(typeIndicator == TYPE_INDICATOR_UNSIGNED_INT64 && value.length == 8); checkArgument(typeIndicator == TYPE_INDICATOR_UNSIGNED_INT64 && value.length == 8);
break; break;
case KEY_EDITABLE_TRACKS_MAP: case KEY_AUXILIARY_TRACKS_MAP:
checkArgument(typeIndicator == TYPE_INDICATOR_RESERVED); checkArgument(typeIndicator == TYPE_INDICATOR_RESERVED);
break; break;
case KEY_EDITABLE_TRACKS_SAMPLES_LOCATION: case KEY_AUXILIARY_TRACKS_INTERLEAVED:
checkArgument( checkArgument(
typeIndicator == TYPE_INDICATOR_8_BIT_UNSIGNED_INT typeIndicator == TYPE_INDICATOR_8_BIT_UNSIGNED_INT
&& value.length == 1 && value.length == 1
&& (value[0] == EDITABLE_TRACKS_SAMPLES_LOCATION_IN_EDIT_DATA_MP4 && (value[0] == AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED
|| value[0] == EDITABLE_TRACKS_SAMPLES_LOCATION_INTERLEAVED)); || value[0] == AUXILIARY_TRACKS_SAMPLES_INTERLEAVED));
break; break;
default: default:
// Ignore custom keys. // Ignore custom keys.
} }
} }
private static String getFormattedValueForEditableTracksMap(List<Integer> trackTypes) { private static String getFormattedValueForAuxiliaryTracksMap(List<Integer> trackTypes) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("track types = "); sb.append("track types = ");
Joiner.on(',').appendTo(sb, trackTypes); Joiner.on(',').appendTo(sb, trackTypes);

View File

@ -459,7 +459,7 @@ public abstract class Mp4Box {
public static final int TYPE_iacb = 0x69616362; public static final int TYPE_iacb = 0x69616362;
@SuppressWarnings("ConstantCaseForConstants") @SuppressWarnings("ConstantCaseForConstants")
public static final int TYPE_edvd = 0x65647664; public static final int TYPE_axte = 0x61787465;
public final int type; public final int type;

View File

@ -21,7 +21,7 @@ import androidx.media3.common.util.UnstableApi;
@UnstableApi @UnstableApi
public final class Mp4Util { public final class Mp4Util {
/** The original video track without any depth based effects applied. */ /** The original video track without any depth based effects applied. */
public static final int EDITABLE_TRACK_TYPE_SHARP = 0; public static final int MP4_AT_AUXILIARY_TRACK_TYPE_SHARP = 0;
/** /**
* A linear encoded depth video track. * A linear encoded depth video track.
@ -29,7 +29,7 @@ public final class Mp4Util {
* <p>See https://developer.android.com/static/media/camera/camera2/Dynamic-depth-v1.0.pdf for * <p>See https://developer.android.com/static/media/camera/camera2/Dynamic-depth-v1.0.pdf for
* linear depth encoding. * linear depth encoding.
*/ */
public static final int EDITABLE_TRACK_TYPE_DEPTH_LINEAR = 1; public static final int MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR = 1;
/** /**
* An inverse encoded depth video track. * An inverse encoded depth video track.
@ -37,10 +37,10 @@ public final class Mp4Util {
* <p>See https://developer.android.com/static/media/camera/camera2/Dynamic-depth-v1.0.pdf for * <p>See https://developer.android.com/static/media/camera/camera2/Dynamic-depth-v1.0.pdf for
* inverse depth encoding. * inverse depth encoding.
*/ */
public static final int EDITABLE_TRACK_TYPE_DEPTH_INVERSE = 2; public static final int MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE = 2;
/** A timed metadata of depth video track. */ /** A timed metadata of depth video track. */
public static final int EDITABLE_TRACK_TYPE_DEPTH_METADATA = 3; public static final int MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA = 3;
private Mp4Util() {} private Mp4Util() {}
} }

View File

@ -23,11 +23,11 @@ import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Assertions.checkStateNotNull; import static androidx.media3.common.util.Assertions.checkStateNotNull;
import static androidx.media3.common.util.Util.castNonNull; import static androidx.media3.common.util.Util.castNonNull;
import static androidx.media3.container.MdtaMetadataEntry.EDITABLE_TRACKS_SAMPLES_LOCATION_IN_EDIT_DATA_MP4; import static androidx.media3.container.MdtaMetadataEntry.AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_INVERSE; import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_LINEAR; import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_METADATA; import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_SHARP; import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_SHARP;
import static androidx.media3.extractor.mp4.BoxParser.parseTraks; import static androidx.media3.extractor.mp4.BoxParser.parseTraks;
import static androidx.media3.extractor.mp4.MetadataUtil.findMdtaMetadataEntryWithKey; import static androidx.media3.extractor.mp4.MetadataUtil.findMdtaMetadataEntryWithKey;
import static androidx.media3.extractor.mp4.MimeTypeResolver.getContainerMimeType; import static androidx.media3.extractor.mp4.MimeTypeResolver.getContainerMimeType;
@ -110,7 +110,7 @@ public final class Mp4Extractor implements Extractor, SeekMap {
FLAG_MARK_FIRST_VIDEO_TRACK_WITH_MAIN_ROLE, FLAG_MARK_FIRST_VIDEO_TRACK_WITH_MAIN_ROLE,
FLAG_EMIT_RAW_SUBTITLE_DATA, FLAG_EMIT_RAW_SUBTITLE_DATA,
FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES, FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES,
FLAG_READ_EDITABLE_VIDEO_TRACKS FLAG_READ_AUXILIARY_TRACKS
}) })
public @interface Flags {} public @interface Flags {}
@ -162,15 +162,15 @@ public final class Mp4Extractor implements Extractor, SeekMap {
// TODO: b/345219017 - Add depth/editing file format spec link after its published. // TODO: b/345219017 - Add depth/editing file format spec link after its published.
/** /**
* Flag to extract the editable video tracks. * Flag to extract the auxiliary tracks.
* *
* <p>Either primary video tracks or editable video tracks (but not both) will be extracted based * <p>Either primary video tracks or auxiliary tracks (but not both) will be extracted based on
* on the flag. * the flag.
* *
* <p>If the flag is set but the editable video tracks are not present, then it fallbacks to * <p>If the flag is set but the auxiliary tracks are not present, then it fallbacks to extract
* extract primary tracks instead. * primary tracks instead.
*/ */
public static final int FLAG_READ_EDITABLE_VIDEO_TRACKS = 1 << 6; public static final int FLAG_READ_AUXILIARY_TRACKS = 1 << 6;
/** /**
* @deprecated Use {@link #newFactory(SubtitleParser.Factory)} instead. * @deprecated Use {@link #newFactory(SubtitleParser.Factory)} instead.
@ -248,12 +248,12 @@ public final class Mp4Extractor implements Extractor, SeekMap {
private int sampleCurrentNalBytesRemaining; private int sampleCurrentNalBytesRemaining;
private boolean isSampleDependedOn; private boolean isSampleDependedOn;
private boolean seenFtypAtom; private boolean seenFtypAtom;
private boolean seekToEdvdAtom; private boolean seekToAxteAtom;
private long edvdAtomOffset; private long axteAtomOffset;
private boolean readingEditableVideoTracks; private boolean readingAuxiliaryTracks;
// Used when editable video samples are in the edit data MP4 (inside edvd atom). // Used when auxiliary tracks samples are in the auxiliary tracks MP4 (inside axte atom).
private long sampleOffsetForEditableVideoTracks; private long sampleOffsetForAuxiliaryTracks;
// Extractor outputs. // Extractor outputs.
private ExtractorOutput extractorOutput; private ExtractorOutput extractorOutput;
@ -609,11 +609,11 @@ public final class Mp4Extractor implements Extractor, SeekMap {
} }
} }
processAtomEnded(atomEndPosition); processAtomEnded(atomEndPosition);
if (seekToEdvdAtom) { if (seekToAxteAtom) {
readingEditableVideoTracks = true; readingAuxiliaryTracks = true;
positionHolder.position = edvdAtomOffset; positionHolder.position = axteAtomOffset;
seekRequired = true; seekRequired = true;
seekToEdvdAtom = false; seekToAxteAtom = false;
} }
return seekRequired && parserState != STATE_READING_SAMPLE; return seekRequired && parserState != STATE_READING_SAMPLE;
} }
@ -634,7 +634,7 @@ public final class Mp4Extractor implements Extractor, SeekMap {
// We've reached the end of the moov atom. Process it and prepare to read samples. // We've reached the end of the moov atom. Process it and prepare to read samples.
processMoovAtom(containerAtom); processMoovAtom(containerAtom);
containerAtoms.clear(); containerAtoms.clear();
if (!seekToEdvdAtom) { if (!seekToAxteAtom) {
parserState = STATE_READING_SAMPLE; parserState = STATE_READING_SAMPLE;
} }
} else if (!containerAtoms.isEmpty()) { } else if (!containerAtoms.isEmpty()) {
@ -649,23 +649,22 @@ public final class Mp4Extractor implements Extractor, SeekMap {
/** /**
* Processes moov atom and updates the stored track metadata. * Processes moov atom and updates the stored track metadata.
* *
* <p>The processing is aborted if the edvd.moov atom needs to be processed instead. * <p>The processing is aborted if the axte.moov atom needs to be processed instead.
*/ */
private void processMoovAtom(ContainerBox moov) throws ParserException { private void processMoovAtom(ContainerBox moov) throws ParserException {
// Process metadata first to determine whether to abort processing and seek to the edvd atom. // Process metadata first to determine whether to abort processing and seek to the axte atom.
@Nullable Metadata mdtaMetadata = null; @Nullable Metadata mdtaMetadata = null;
@Nullable Mp4Box.ContainerBox meta = moov.getContainerBoxOfType(Mp4Box.TYPE_meta); @Nullable Mp4Box.ContainerBox meta = moov.getContainerBoxOfType(Mp4Box.TYPE_meta);
List<@C.AuxiliaryTrackType Integer> auxiliaryTrackTypesForEditableVideoTracks = List<@C.AuxiliaryTrackType Integer> auxiliaryTrackTypesForAuxiliaryTracks = new ArrayList<>();
new ArrayList<>();
if (meta != null) { if (meta != null) {
mdtaMetadata = BoxParser.parseMdtaFromMeta(meta); mdtaMetadata = BoxParser.parseMdtaFromMeta(meta);
if (readingEditableVideoTracks) { if (readingAuxiliaryTracks) {
checkStateNotNull(mdtaMetadata); checkStateNotNull(mdtaMetadata);
maybeSetDefaultSampleOffsetForEditableVideoTracks(mdtaMetadata); maybeSetDefaultSampleOffsetForAuxiliaryTracks(mdtaMetadata);
auxiliaryTrackTypesForEditableVideoTracks = auxiliaryTrackTypesForAuxiliaryTracks =
getAuxiliaryTrackTypesForEditableVideoTracks(mdtaMetadata); getAuxiliaryTrackTypesForAuxiliaryTracks(mdtaMetadata);
} else if (shouldSeekToEdvdAtom(mdtaMetadata)) { } else if (shouldSeekToAxteAtom(mdtaMetadata)) {
seekToEdvdAtom = true; seekToAxteAtom = true;
return; return;
} }
} }
@ -698,14 +697,14 @@ public final class Mp4Extractor implements Extractor, SeekMap {
isQuickTime, isQuickTime,
/* modifyTrackFunction= */ track -> track); /* modifyTrackFunction= */ track -> track);
if (readingEditableVideoTracks) { if (readingAuxiliaryTracks) {
checkState( checkState(
auxiliaryTrackTypesForEditableVideoTracks.size() == trackSampleTables.size(), auxiliaryTrackTypesForAuxiliaryTracks.size() == trackSampleTables.size(),
String.format( String.format(
Locale.US, Locale.US,
"The number of auxiliary track types from metadata (%d) is not same as the number of" "The number of auxiliary track types from metadata (%d) is not same as the number of"
+ " editable video tracks (%d)", + " auxiliary tracks (%d)",
auxiliaryTrackTypesForEditableVideoTracks.size(), auxiliaryTrackTypesForAuxiliaryTracks.size(),
trackSampleTables.size())); trackSampleTables.size()));
} }
int trackIndex = 0; int trackIndex = 0;
@ -748,9 +747,9 @@ public final class Mp4Extractor implements Extractor, SeekMap {
float frameRate = trackSampleTable.sampleCount / (trackDurationUs / 1000000f); float frameRate = trackSampleTable.sampleCount / (trackDurationUs / 1000000f);
formatBuilder.setFrameRate(frameRate); formatBuilder.setFrameRate(frameRate);
} }
if (readingEditableVideoTracks) { if (readingAuxiliaryTracks) {
roleFlags |= C.ROLE_FLAG_AUXILIARY; roleFlags |= C.ROLE_FLAG_AUXILIARY;
formatBuilder.setAuxiliaryTrackType(auxiliaryTrackTypesForEditableVideoTracks.get(i)); formatBuilder.setAuxiliaryTrackType(auxiliaryTrackTypesForAuxiliaryTracks.get(i));
} }
formatBuilder.setRoleFlags(roleFlags); formatBuilder.setRoleFlags(roleFlags);
} }
@ -780,18 +779,18 @@ public final class Mp4Extractor implements Extractor, SeekMap {
extractorOutput.seekMap(this); extractorOutput.seekMap(this);
} }
private boolean shouldSeekToEdvdAtom(@Nullable Metadata mdtaMetadata) { private boolean shouldSeekToAxteAtom(@Nullable Metadata mdtaMetadata) {
if (mdtaMetadata == null) { if (mdtaMetadata == null) {
return false; return false;
} }
if ((flags & FLAG_READ_EDITABLE_VIDEO_TRACKS) != 0) { if ((flags & FLAG_READ_AUXILIARY_TRACKS) != 0) {
@Nullable @Nullable
MdtaMetadataEntry edvdAtomOffsetMetadata = MdtaMetadataEntry axteAtomOffsetMetadata =
findMdtaMetadataEntryWithKey(mdtaMetadata, MdtaMetadataEntry.KEY_EDITABLE_TRACKS_OFFSET); findMdtaMetadataEntryWithKey(mdtaMetadata, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_OFFSET);
if (edvdAtomOffsetMetadata != null) { if (axteAtomOffsetMetadata != null) {
long offset = new ParsableByteArray(edvdAtomOffsetMetadata.value).readUnsignedLongToLong(); long offset = new ParsableByteArray(axteAtomOffsetMetadata.value).readUnsignedLongToLong();
if (offset > 0) { if (offset > 0) {
edvdAtomOffset = offset; axteAtomOffset = offset;
return true; return true;
} }
} }
@ -800,42 +799,41 @@ public final class Mp4Extractor implements Extractor, SeekMap {
} }
/** /**
* Sets the sample offset for the editable video tracks, if the samples are in the edit data MP4 * Sets the sample offset for the auxiliary tracks, if the samples are in the auxiliary tracks MP4
* (inside edvd atom). * (inside axte atom).
*/ */
private void maybeSetDefaultSampleOffsetForEditableVideoTracks(Metadata metadata) { private void maybeSetDefaultSampleOffsetForAuxiliaryTracks(Metadata metadata) {
@Nullable @Nullable
MdtaMetadataEntry sampleLocationMetadata = MdtaMetadataEntry samplesInterleavedMetadata =
findMdtaMetadataEntryWithKey( findMdtaMetadataEntryWithKey(metadata, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_INTERLEAVED);
metadata, MdtaMetadataEntry.KEY_EDITABLE_TRACKS_SAMPLES_LOCATION); if (samplesInterleavedMetadata != null) {
if (sampleLocationMetadata != null) { if (samplesInterleavedMetadata.value[0] == AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED) {
if (sampleLocationMetadata.value[0] == EDITABLE_TRACKS_SAMPLES_LOCATION_IN_EDIT_DATA_MP4) { sampleOffsetForAuxiliaryTracks = axteAtomOffset + 16; // 16 bits for axte atom header
sampleOffsetForEditableVideoTracks = edvdAtomOffset + 16; // 16 bits for edvd atom header
} }
} }
} }
private List<@C.AuxiliaryTrackType Integer> getAuxiliaryTrackTypesForEditableVideoTracks( private List<@C.AuxiliaryTrackType Integer> getAuxiliaryTrackTypesForAuxiliaryTracks(
Metadata metadata) { Metadata metadata) {
MdtaMetadataEntry trackTypesMetadata = MdtaMetadataEntry trackTypesMetadata =
checkStateNotNull( checkStateNotNull(
findMdtaMetadataEntryWithKey(metadata, MdtaMetadataEntry.KEY_EDITABLE_TRACKS_MAP)); findMdtaMetadataEntryWithKey(metadata, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_MAP));
List<Integer> editableVideoTrackTypes = trackTypesMetadata.getEditableTrackTypesFromMap(); List<Integer> auxiliaryTrackTypesFromMap = trackTypesMetadata.getAuxiliaryTrackTypesFromMap();
List<@C.AuxiliaryTrackType Integer> auxiliaryTrackTypes = List<@C.AuxiliaryTrackType Integer> auxiliaryTrackTypes =
new ArrayList<>(editableVideoTrackTypes.size()); new ArrayList<>(auxiliaryTrackTypesFromMap.size());
for (int i = 0; i < editableVideoTrackTypes.size(); i++) { for (int i = 0; i < auxiliaryTrackTypesFromMap.size(); i++) {
@C.AuxiliaryTrackType int auxiliaryTrackType; @C.AuxiliaryTrackType int auxiliaryTrackType;
switch (editableVideoTrackTypes.get(i)) { switch (auxiliaryTrackTypesFromMap.get(i)) {
case EDITABLE_TRACK_TYPE_SHARP: case MP4_AT_AUXILIARY_TRACK_TYPE_SHARP:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_ORIGINAL; auxiliaryTrackType = AUXILIARY_TRACK_TYPE_ORIGINAL;
break; break;
case EDITABLE_TRACK_TYPE_DEPTH_LINEAR: case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_LINEAR; auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_LINEAR;
break; break;
case EDITABLE_TRACK_TYPE_DEPTH_INVERSE: case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_INVERSE; auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_INVERSE;
break; break;
case EDITABLE_TRACK_TYPE_DEPTH_METADATA: case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA:
auxiliaryTrackType = C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA; auxiliaryTrackType = C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA;
break; break;
default: default:
@ -872,7 +870,7 @@ public final class Mp4Extractor implements Extractor, SeekMap {
Mp4Track track = tracks[sampleTrackIndex]; Mp4Track track = tracks[sampleTrackIndex];
TrackOutput trackOutput = track.trackOutput; TrackOutput trackOutput = track.trackOutput;
int sampleIndex = track.sampleIndex; int sampleIndex = track.sampleIndex;
long position = track.sampleTable.offsets[sampleIndex] + sampleOffsetForEditableVideoTracks; long position = track.sampleTable.offsets[sampleIndex] + sampleOffsetForAuxiliaryTracks;
int sampleSize = track.sampleTable.sizes[sampleIndex]; int sampleSize = track.sampleTable.sizes[sampleIndex];
@Nullable TrueHdSampleRechunker trueHdSampleRechunker = track.trueHdSampleRechunker; @Nullable TrueHdSampleRechunker trueHdSampleRechunker = track.trueHdSampleRechunker;
long skipAmount = position - inputPosition + sampleBytesRead; long skipAmount = position - inputPosition + sampleBytesRead;
@ -1226,7 +1224,7 @@ public final class Mp4Extractor implements Extractor, SeekMap {
|| atom == Mp4Box.TYPE_stbl || atom == Mp4Box.TYPE_stbl
|| atom == Mp4Box.TYPE_edts || atom == Mp4Box.TYPE_edts
|| atom == Mp4Box.TYPE_meta || atom == Mp4Box.TYPE_meta
|| atom == Mp4Box.TYPE_edvd; || atom == Mp4Box.TYPE_axte;
} }
private static final class Mp4Track { private static final class Mp4Track {

View File

@ -107,54 +107,53 @@ public final class Mp4ExtractorNonParameterizedTest {
@Test @Test
public void public void
extract_fileHavingNoEditableVideoTracksWithReadEditableVideoTracksFlag_extractsPrimaryVideoTracks() extract_fileHavingNoAuxiliaryTracksWithReadAuxiliaryTracksFlag_extractsPrimaryVideoTracks()
throws Exception { throws Exception {
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
String inputFilePath = "media/mp4/sample.mp4"; String inputFilePath = "media/mp4/sample.mp4";
Mp4Extractor mp4Extractor = Mp4Extractor mp4Extractor =
new Mp4Extractor( new Mp4Extractor(
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_EDITABLE_VIDEO_TRACKS); new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_AUXILIARY_TRACKS);
FakeExtractorOutput primaryTracksOutput = FakeExtractorOutput primaryTracksOutput =
TestUtil.extractAllSamplesFromFile(mp4Extractor, context, inputFilePath); TestUtil.extractAllSamplesFromFile(mp4Extractor, context, inputFilePath);
String dumpFilePath = getDumpFilePath(inputFilePath, "_with_flag_read_Editable_video_tracks"); String dumpFilePath = getDumpFilePath(inputFilePath, "_with_flag_read_auxiliary_tracks");
DumpFileAsserts.assertOutput(context, primaryTracksOutput, dumpFilePath); DumpFileAsserts.assertOutput(context, primaryTracksOutput, dumpFilePath);
} }
@Test @Test
public void public void extract_fileHavingAuxiliaryTracksWithReadAuxiliaryTracksFlag_extractsAuxiliaryTracks()
extract_fileHavingEditableVideoTracksWithReadEditableVideoTracksFlag_extractsEditableVideoTracks() throws Exception {
throws Exception {
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
String inputFilePath = "media/mp4/sample_with_fake_editable_video_tracks.mp4"; String inputFilePath = "media/mp4/sample_with_fake_auxiliary_tracks.mp4";
Mp4Extractor mp4Extractor = Mp4Extractor mp4Extractor =
new Mp4Extractor( new Mp4Extractor(
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_EDITABLE_VIDEO_TRACKS); new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_AUXILIARY_TRACKS);
FakeExtractorOutput editableTracksOutput = FakeExtractorOutput auxiliaryTracksOutput =
TestUtil.extractAllSamplesFromFile(mp4Extractor, context, inputFilePath); TestUtil.extractAllSamplesFromFile(mp4Extractor, context, inputFilePath);
String dumpFilePath = getDumpFilePath(inputFilePath, "_with_flag_read_Editable_video_tracks"); String dumpFilePath = getDumpFilePath(inputFilePath, "_with_flag_read_auxiliary_tracks");
DumpFileAsserts.assertOutput(context, editableTracksOutput, dumpFilePath); DumpFileAsserts.assertOutput(context, auxiliaryTracksOutput, dumpFilePath);
} }
@Test @Test
public void public void
extract_fileHavingEditableVideoTracksInterleavedWithPrimaryVideoTracksWithReadEditableVideoTracksFlag_extractsEditableVideoTracks() extract_fileHavingAuxiliaryTracksInterleavedWithPrimaryVideoTracksWithReadAuxiliaryTracksFlag_extractsAuxiliaryTracks()
throws Exception { throws Exception {
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
String inputFilePath = String inputFilePath =
"media/mp4/sample_with_fake_editable_video_tracks_interleaved_with_primary_video_tracks.mp4"; "media/mp4/sample_with_fake_auxiliary_tracks_interleaved_with_primary_video_tracks.mp4";
Mp4Extractor mp4Extractor = Mp4Extractor mp4Extractor =
new Mp4Extractor( new Mp4Extractor(
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_EDITABLE_VIDEO_TRACKS); new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_AUXILIARY_TRACKS);
FakeExtractorOutput editableTracksOutput = FakeExtractorOutput auxiliaryTracksOutput =
TestUtil.extractAllSamplesFromFile(mp4Extractor, context, inputFilePath); TestUtil.extractAllSamplesFromFile(mp4Extractor, context, inputFilePath);
String dumpFilePath = getDumpFilePath(inputFilePath, "_with_flag_read_Editable_video_tracks"); String dumpFilePath = getDumpFilePath(inputFilePath, "_with_flag_read_auxiliary_tracks");
DumpFileAsserts.assertOutput(context, editableTracksOutput, dumpFilePath); DumpFileAsserts.assertOutput(context, auxiliaryTracksOutput, dumpFilePath);
} }
private static String getDumpFilePath(String inputFilePath, String suffix) { private static String getDumpFilePath(String inputFilePath, String suffix) {

View File

@ -229,14 +229,14 @@ public final class Mp4ExtractorParameterizedTest {
} }
@Test @Test
public void mp4WithEditableVideoTracks() throws Exception { public void mp4WithAuxiliaryTracks() throws Exception {
assertExtractorBehavior("media/mp4/sample_with_fake_editable_video_tracks.mp4"); assertExtractorBehavior("media/mp4/sample_with_fake_auxiliary_tracks.mp4");
} }
@Test @Test
public void mp4WithEditableVideoTracksInterleavedWithPrimaryVideoTracks() throws Exception { public void mp4WithAuxiliaryTracksInterleavedWithPrimaryVideoTracks() throws Exception {
assertExtractorBehavior( assertExtractorBehavior(
"media/mp4/sample_with_fake_editable_video_tracks_interleaved_with_primary_video_tracks.mp4"); "media/mp4/sample_with_fake_auxiliary_tracks_interleaved_with_primary_video_tracks.mp4");
} }
private void assertExtractorBehavior(String file) throws IOException { private void assertExtractorBehavior(String file) throws IOException {

View File

@ -1279,14 +1279,14 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
return BoxUtils.wrapIntoBox("trex", contents); return BoxUtils.wrapIntoBox("trex", contents);
} }
/** Returns the edvd box header. */ /** Returns the axte box header. */
public static ByteBuffer getEdvdBoxHeader(long payloadSize) { public static ByteBuffer getAxteBoxHeader(long payloadSize) {
ByteBuffer edvdBoxHeader = ByteBuffer.allocate(LARGE_SIZE_BOX_HEADER_SIZE); ByteBuffer axteBoxHeader = ByteBuffer.allocate(LARGE_SIZE_BOX_HEADER_SIZE);
edvdBoxHeader.putInt(1); // indicating a 64-bit length field axteBoxHeader.putInt(1); // indicating a 64-bit length field
edvdBoxHeader.put(Util.getUtf8Bytes("edvd")); axteBoxHeader.put(Util.getUtf8Bytes("axte"));
edvdBoxHeader.putLong(LARGE_SIZE_BOX_HEADER_SIZE + payloadSize); // the actual length axteBoxHeader.putLong(LARGE_SIZE_BOX_HEADER_SIZE + payloadSize); // the actual length
edvdBoxHeader.flip(); axteBoxHeader.flip();
return edvdBoxHeader; return axteBoxHeader;
} }
/** Returns an ISO 639-2/T (ISO3) language code for the IETF BCP 47 language tag. */ /** Returns an ISO 639-2/T (ISO3) language code for the IETF BCP 47 language tag. */

View File

@ -19,12 +19,12 @@ import static androidx.media3.common.util.Assertions.checkArgument;
import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.muxer.Boxes.LARGE_SIZE_BOX_HEADER_SIZE; import static androidx.media3.muxer.Boxes.LARGE_SIZE_BOX_HEADER_SIZE;
import static androidx.media3.muxer.Boxes.getEdvdBoxHeader; import static androidx.media3.muxer.Boxes.getAxteBoxHeader;
import static androidx.media3.muxer.MuxerUtil.getEditableTracksLengthMetadata; import static androidx.media3.muxer.MuxerUtil.getAuxiliaryTracksLengthMetadata;
import static androidx.media3.muxer.MuxerUtil.getEditableTracksOffsetMetadata; import static androidx.media3.muxer.MuxerUtil.getAuxiliaryTracksOffsetMetadata;
import static androidx.media3.muxer.MuxerUtil.isEditableVideoTrack; import static androidx.media3.muxer.MuxerUtil.isAuxiliaryTrack;
import static androidx.media3.muxer.MuxerUtil.isMetadataSupported; import static androidx.media3.muxer.MuxerUtil.isMetadataSupported;
import static androidx.media3.muxer.MuxerUtil.populateEditableVideoTracksMetadata; import static androidx.media3.muxer.MuxerUtil.populateAuxiliaryTracksMetadata;
import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.ElementType.TYPE_USE;
import android.media.MediaCodec; import android.media.MediaCodec;
@ -107,8 +107,8 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
*/ */
@UnstableApi @UnstableApi
public final class Mp4Muxer implements Muxer { public final class Mp4Muxer implements Muxer {
/** Parameters for {@link #FILE_FORMAT_EDITABLE_VIDEO}. */ /** Parameters for {@link #FILE_FORMAT_MP4_AT}. */
public static final class EditableVideoParameters { public static final class Mp4AtFileParameters {
/** Provides temporary cache files to be used by the muxer. */ /** Provides temporary cache files to be used by the muxer. */
public interface CacheFileProvider { public interface CacheFileProvider {
@ -129,12 +129,12 @@ public final class Mp4Muxer implements Muxer {
/** /**
* Creates an instance. * Creates an instance.
* *
* @param shouldInterleaveSamples Whether to interleave editable video track samples with * @param shouldInterleaveSamples Whether to interleave auxiliary track samples with primary
* primary track samples. * track samples.
* @param cacheFileProvider A {@link CacheFileProvider}. Required only when {@code * @param cacheFileProvider A {@link CacheFileProvider}. Required only when {@code
* shouldInterleaveSamples} is set to {@code false}, can be {@code null} otherwise. * shouldInterleaveSamples} is set to {@code false}, can be {@code null} otherwise.
*/ */
public EditableVideoParameters( public Mp4AtFileParameters(
boolean shouldInterleaveSamples, @Nullable CacheFileProvider cacheFileProvider) { boolean shouldInterleaveSamples, @Nullable CacheFileProvider cacheFileProvider) {
checkArgument(shouldInterleaveSamples || cacheFileProvider != null); checkArgument(shouldInterleaveSamples || cacheFileProvider != null);
this.shouldInterleaveSamples = shouldInterleaveSamples; this.shouldInterleaveSamples = shouldInterleaveSamples;
@ -177,7 +177,7 @@ public final class Mp4Muxer implements Muxer {
@Documented @Documented
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@Target(TYPE_USE) @Target(TYPE_USE)
@IntDef({FILE_FORMAT_DEFAULT, FILE_FORMAT_EDITABLE_VIDEO}) @IntDef({FILE_FORMAT_DEFAULT, FILE_FORMAT_MP4_AT})
public @interface FileFormat {} public @interface FileFormat {}
/** The default MP4 format. */ /** The default MP4 format. */
@ -185,13 +185,13 @@ public final class Mp4Muxer implements Muxer {
// TODO: b/345219017 - Add spec details. // TODO: b/345219017 - Add spec details.
/** /**
* The editable video file format. In this file format all the tracks with {@linkplain * The MP4-AT (MP4 With Auxiliary Tracks Extension) file format. In this file format all the
* Format#auxiliaryTrackType} set to {@link C#AUXILIARY_TRACK_TYPE_ORIGINAL}, {@link * tracks with {@linkplain Format#auxiliaryTrackType} set to {@link
* C#AUXILIARY_TRACK_TYPE_DEPTH_LINEAR}, {@link C#AUXILIARY_TRACK_TYPE_DEPTH_INVERSE}, or {@link * C#AUXILIARY_TRACK_TYPE_ORIGINAL}, {@link C#AUXILIARY_TRACK_TYPE_DEPTH_LINEAR}, {@link
* C#AUXILIARY_TRACK_TYPE_DEPTH_METADATA} are written in the MP4 edit data (edvd box). The rest of * C#AUXILIARY_TRACK_TYPE_DEPTH_INVERSE}, or {@link C#AUXILIARY_TRACK_TYPE_DEPTH_METADATA} are
* the tracks are written as usual. * written in the Auxiliary Tracks MP4 (axte box). The rest of the tracks are written as usual.
*/ */
public static final int FILE_FORMAT_EDITABLE_VIDEO = 1; public static final int FILE_FORMAT_MP4_AT = 1;
/** A builder for {@link Mp4Muxer} instances. */ /** A builder for {@link Mp4Muxer} instances. */
public static final class Builder { public static final class Builder {
@ -203,7 +203,7 @@ public final class Mp4Muxer implements Muxer {
private boolean sampleBatchingEnabled; private boolean sampleBatchingEnabled;
private boolean attemptStreamableOutputEnabled; private boolean attemptStreamableOutputEnabled;
private @FileFormat int outputFileFormat; private @FileFormat int outputFileFormat;
@Nullable private EditableVideoParameters editableVideoParameters; @Nullable private Mp4AtFileParameters mp4AtFileParameters;
/** /**
* Creates a {@link Builder} instance with default values. * Creates a {@link Builder} instance with default values.
@ -297,8 +297,8 @@ public final class Mp4Muxer implements Muxer {
* *
* <p>The default value is {@link #FILE_FORMAT_DEFAULT}. * <p>The default value is {@link #FILE_FORMAT_DEFAULT}.
* *
* <p>For {@link #FILE_FORMAT_EDITABLE_VIDEO}, {@link EditableVideoParameters} must also be * <p>For {@link #FILE_FORMAT_MP4_AT}, {@link Mp4AtFileParameters} must also be {@linkplain
* {@linkplain #setEditableVideoParameters(EditableVideoParameters)} set}. * #setMp4AtFileParameters(Mp4AtFileParameters)} set}.
*/ */
@CanIgnoreReturnValue @CanIgnoreReturnValue
public Mp4Muxer.Builder setOutputFileFormat(@FileFormat int fileFormat) { public Mp4Muxer.Builder setOutputFileFormat(@FileFormat int fileFormat) {
@ -306,21 +306,20 @@ public final class Mp4Muxer implements Muxer {
return this; return this;
} }
/** Sets the {@link EditableVideoParameters}. */ /** Sets the {@link Mp4AtFileParameters}. */
@CanIgnoreReturnValue @CanIgnoreReturnValue
public Mp4Muxer.Builder setEditableVideoParameters( public Mp4Muxer.Builder setMp4AtFileParameters(Mp4AtFileParameters mp4AtFileParameters) {
EditableVideoParameters editableVideoParameters) { this.mp4AtFileParameters = mp4AtFileParameters;
this.editableVideoParameters = editableVideoParameters;
return this; return this;
} }
/** Builds an {@link Mp4Muxer} instance. */ /** Builds an {@link Mp4Muxer} instance. */
public Mp4Muxer build() { public Mp4Muxer build() {
checkArgument( checkArgument(
outputFileFormat == FILE_FORMAT_EDITABLE_VIDEO outputFileFormat == FILE_FORMAT_MP4_AT
? editableVideoParameters != null ? mp4AtFileParameters != null
: editableVideoParameters == null, : mp4AtFileParameters == null,
"EditablevideoParameters must be set for FILE_FORMAT_EDITABLE_VIDEO"); "Mp4AtFileParameters must be set for FILE_FORMAT_MP4_AT");
return new Mp4Muxer( return new Mp4Muxer(
outputStream, outputStream,
lastSampleDurationBehavior, lastSampleDurationBehavior,
@ -329,7 +328,7 @@ public final class Mp4Muxer implements Muxer {
sampleBatchingEnabled, sampleBatchingEnabled,
attemptStreamableOutputEnabled, attemptStreamableOutputEnabled,
outputFileFormat, outputFileFormat,
editableVideoParameters); mp4AtFileParameters);
} }
} }
@ -343,15 +342,15 @@ public final class Mp4Muxer implements Muxer {
private final boolean sampleBatchingEnabled; private final boolean sampleBatchingEnabled;
private final boolean attemptStreamableOutputEnabled; private final boolean attemptStreamableOutputEnabled;
private final @FileFormat int outputFileFormat; private final @FileFormat int outputFileFormat;
@Nullable private final EditableVideoParameters editableVideoParameters; @Nullable private final Mp4AtFileParameters mp4AtFileParameters;
private final MetadataCollector metadataCollector; private final MetadataCollector metadataCollector;
private final Mp4Writer mp4Writer; private final Mp4Writer mp4Writer;
private final List<Track> editableVideoTracks; private final List<Track> auxiliaryTracks;
@Nullable private String cacheFilePath; @Nullable private String cacheFilePath;
@Nullable private FileOutputStream cacheFileOutputStream; @Nullable private FileOutputStream cacheFileOutputStream;
@Nullable private MetadataCollector editableVideoMetadataCollector; @Nullable private MetadataCollector auxiliaryTracksMetadataCollector;
@Nullable private Mp4Writer editableVideoMp4Writer; @Nullable private Mp4Writer auxiliaryTracksMp4Writer;
private Mp4Muxer( private Mp4Muxer(
FileOutputStream outputStream, FileOutputStream outputStream,
@ -361,7 +360,7 @@ public final class Mp4Muxer implements Muxer {
boolean sampleBatchingEnabled, boolean sampleBatchingEnabled,
boolean attemptStreamableOutputEnabled, boolean attemptStreamableOutputEnabled,
@FileFormat int outputFileFormat, @FileFormat int outputFileFormat,
@Nullable EditableVideoParameters editableVideoParameters) { @Nullable Mp4AtFileParameters mp4AtFileParameters) {
this.outputStream = outputStream; this.outputStream = outputStream;
outputChannel = outputStream.getChannel(); outputChannel = outputStream.getChannel();
this.lastSampleDurationBehavior = lastFrameDurationBehavior; this.lastSampleDurationBehavior = lastFrameDurationBehavior;
@ -370,7 +369,7 @@ public final class Mp4Muxer implements Muxer {
this.sampleBatchingEnabled = sampleBatchingEnabled; this.sampleBatchingEnabled = sampleBatchingEnabled;
this.attemptStreamableOutputEnabled = attemptStreamableOutputEnabled; this.attemptStreamableOutputEnabled = attemptStreamableOutputEnabled;
this.outputFileFormat = outputFileFormat; this.outputFileFormat = outputFileFormat;
this.editableVideoParameters = editableVideoParameters; this.mp4AtFileParameters = mp4AtFileParameters;
metadataCollector = new MetadataCollector(); metadataCollector = new MetadataCollector();
mp4Writer = mp4Writer =
new Mp4Writer( new Mp4Writer(
@ -381,7 +380,7 @@ public final class Mp4Muxer implements Muxer {
sampleCopyEnabled, sampleCopyEnabled,
sampleBatchingEnabled, sampleBatchingEnabled,
attemptStreamableOutputEnabled); attemptStreamableOutputEnabled);
editableVideoTracks = new ArrayList<>(); auxiliaryTracks = new ArrayList<>();
} }
/** /**
@ -417,18 +416,18 @@ public final class Mp4Muxer implements Muxer {
* @throws MuxerException If an error occurs while adding track. * @throws MuxerException If an error occurs while adding track.
*/ */
public TrackToken addTrack(int sortKey, Format format) throws MuxerException { public TrackToken addTrack(int sortKey, Format format) throws MuxerException {
if (outputFileFormat == FILE_FORMAT_EDITABLE_VIDEO && isEditableVideoTrack(format)) { if (outputFileFormat == FILE_FORMAT_MP4_AT && isAuxiliaryTrack(format)) {
if (checkNotNull(editableVideoParameters).shouldInterleaveSamples) { if (checkNotNull(mp4AtFileParameters).shouldInterleaveSamples) {
// Editable video tracks are handled by the primary Mp4Writer. // Auxiliary tracks are handled by the primary Mp4Writer.
return mp4Writer.addEditableVideoTrack(sortKey, format); return mp4Writer.addAuxiliaryTrack(sortKey, format);
} }
try { try {
ensureSetupForEditableVideoTracks(); ensureSetupForAuxiliaryTracks();
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
throw new MuxerException("Cache file not found", e); throw new MuxerException("Cache file not found", e);
} }
Track track = editableVideoMp4Writer.addTrack(sortKey, format); Track track = auxiliaryTracksMp4Writer.addTrack(sortKey, format);
editableVideoTracks.add(track); auxiliaryTracks.add(track);
return track; return track;
} }
return mp4Writer.addTrack(sortKey, format); return mp4Writer.addTrack(sortKey, format);
@ -458,8 +457,8 @@ public final class Mp4Muxer implements Muxer {
checkState(trackToken instanceof Track); checkState(trackToken instanceof Track);
Track track = (Track) trackToken; Track track = (Track) trackToken;
try { try {
if (editableVideoTracks.contains(trackToken)) { if (auxiliaryTracks.contains(trackToken)) {
checkNotNull(editableVideoMp4Writer).writeSampleData(track, byteBuffer, bufferInfo); checkNotNull(auxiliaryTracksMp4Writer).writeSampleData(track, byteBuffer, bufferInfo);
} else { } else {
mp4Writer.writeSampleData(track, byteBuffer, bufferInfo); mp4Writer.writeSampleData(track, byteBuffer, bufferInfo);
} }
@ -502,9 +501,9 @@ public final class Mp4Muxer implements Muxer {
public void close() throws MuxerException { public void close() throws MuxerException {
@Nullable MuxerException exception = null; @Nullable MuxerException exception = null;
try { try {
finishWritingEditableVideoTracks(); finishWritingAuxiliaryTracks();
finishWritingPrimaryVideoTracks(); finishWritingPrimaryVideoTracks();
appendEditableVideoTracksDataToTheOutputFile(); appendAuxiliaryTracksDataToTheOutputFile();
} catch (IOException e) { } catch (IOException e) {
exception = new MuxerException("Failed to finish writing data", e); exception = new MuxerException("Failed to finish writing data", e);
} }
@ -533,17 +532,17 @@ public final class Mp4Muxer implements Muxer {
} }
} }
@EnsuresNonNull({"editableVideoMp4Writer"}) @EnsuresNonNull({"auxiliaryTracksMp4Writer"})
private void ensureSetupForEditableVideoTracks() throws FileNotFoundException { private void ensureSetupForAuxiliaryTracks() throws FileNotFoundException {
if (editableVideoMp4Writer == null) { if (auxiliaryTracksMp4Writer == null) {
cacheFilePath = cacheFilePath =
checkNotNull(checkNotNull(editableVideoParameters).cacheFileProvider).getCacheFilePath(); checkNotNull(checkNotNull(mp4AtFileParameters).cacheFileProvider).getCacheFilePath();
cacheFileOutputStream = new FileOutputStream(cacheFilePath); cacheFileOutputStream = new FileOutputStream(cacheFilePath);
editableVideoMetadataCollector = new MetadataCollector(); auxiliaryTracksMetadataCollector = new MetadataCollector();
editableVideoMp4Writer = auxiliaryTracksMp4Writer =
new Mp4Writer( new Mp4Writer(
cacheFileOutputStream.getChannel(), cacheFileOutputStream.getChannel(),
checkNotNull(editableVideoMetadataCollector), checkNotNull(auxiliaryTracksMetadataCollector),
annexBToAvccConverter, annexBToAvccConverter,
lastSampleDurationBehavior, lastSampleDurationBehavior,
sampleCopyEnabled, sampleCopyEnabled,
@ -552,48 +551,48 @@ public final class Mp4Muxer implements Muxer {
} }
} }
private void finishWritingEditableVideoTracks() throws IOException { private void finishWritingAuxiliaryTracks() throws IOException {
if (editableVideoMp4Writer == null) { if (auxiliaryTracksMp4Writer == null) {
// Editable video tracks were not added. // Auxiliary tracks were not added.
return; return;
} }
populateEditableVideoTracksMetadata( populateAuxiliaryTracksMetadata(
checkNotNull(editableVideoMetadataCollector), checkNotNull(auxiliaryTracksMetadataCollector),
metadataCollector.timestampData, metadataCollector.timestampData,
/* samplesInterleaved= */ false, /* samplesInterleaved= */ false,
editableVideoTracks); auxiliaryTracks);
checkNotNull(editableVideoMp4Writer).finishWritingSamplesAndFinalizeMoovBox(); checkNotNull(auxiliaryTracksMp4Writer).finishWritingSamplesAndFinalizeMoovBox();
} }
private void finishWritingPrimaryVideoTracks() throws IOException { private void finishWritingPrimaryVideoTracks() throws IOException {
// The exact offset is known after writing all the data in mp4Writer. // The exact offset is known after writing all the data in mp4Writer.
MdtaMetadataEntry placeholderEditableTrackOffset = getEditableTracksOffsetMetadata(0L); MdtaMetadataEntry placeholderAuxiliaryTracksOffset = getAuxiliaryTracksOffsetMetadata(0L);
if (editableVideoMp4Writer != null) { if (auxiliaryTracksMp4Writer != null) {
long editableVideoDataSize = checkNotNull(cacheFileOutputStream).getChannel().size(); long auxiliaryTracksDataSize = checkNotNull(cacheFileOutputStream).getChannel().size();
long edvdBoxSize = LARGE_SIZE_BOX_HEADER_SIZE + editableVideoDataSize; long axteBoxSize = LARGE_SIZE_BOX_HEADER_SIZE + auxiliaryTracksDataSize;
metadataCollector.addMetadata(getEditableTracksLengthMetadata(edvdBoxSize)); metadataCollector.addMetadata(getAuxiliaryTracksLengthMetadata(axteBoxSize));
metadataCollector.addMetadata(placeholderEditableTrackOffset); metadataCollector.addMetadata(placeholderAuxiliaryTracksOffset);
} }
mp4Writer.finishWritingSamplesAndFinalizeMoovBox(); mp4Writer.finishWritingSamplesAndFinalizeMoovBox();
if (editableVideoMp4Writer != null) { if (auxiliaryTracksMp4Writer != null) {
long primaryVideoDataSize = outputChannel.size(); long primaryVideoDataSize = outputChannel.size();
metadataCollector.removeMdtaMetadataEntry(placeholderEditableTrackOffset); metadataCollector.removeMdtaMetadataEntry(placeholderAuxiliaryTracksOffset);
metadataCollector.addMetadata(getEditableTracksOffsetMetadata(primaryVideoDataSize)); metadataCollector.addMetadata(getAuxiliaryTracksOffsetMetadata(primaryVideoDataSize));
mp4Writer.finalizeMoovBox(); mp4Writer.finalizeMoovBox();
checkState( checkState(
outputChannel.size() == primaryVideoDataSize, outputChannel.size() == primaryVideoDataSize,
"The editable tracks offset should remain the same"); "The auxiliary tracks offset should remain the same");
} }
} }
private void appendEditableVideoTracksDataToTheOutputFile() throws IOException { private void appendAuxiliaryTracksDataToTheOutputFile() throws IOException {
if (editableVideoMp4Writer == null) { if (auxiliaryTracksMp4Writer == null) {
// Editable video tracks were not added. // Auxiliary tracks were not added.
return; return;
} }
outputChannel.position(outputChannel.size()); outputChannel.position(outputChannel.size());
FileInputStream inputStream = new FileInputStream(checkNotNull(cacheFilePath)); FileInputStream inputStream = new FileInputStream(checkNotNull(cacheFilePath));
outputChannel.write(getEdvdBoxHeader(inputStream.getChannel().size())); outputChannel.write(getAxteBoxHeader(inputStream.getChannel().size()));
ByteStreams.copy(inputStream, outputStream); ByteStreams.copy(inputStream, outputStream);
inputStream.close(); inputStream.close();
} }

View File

@ -20,10 +20,10 @@ import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.muxer.AnnexBUtils.doesSampleContainAnnexBNalUnits; import static androidx.media3.muxer.AnnexBUtils.doesSampleContainAnnexBNalUnits;
import static androidx.media3.muxer.Boxes.BOX_HEADER_SIZE; import static androidx.media3.muxer.Boxes.BOX_HEADER_SIZE;
import static androidx.media3.muxer.Boxes.LARGE_SIZE_BOX_HEADER_SIZE; import static androidx.media3.muxer.Boxes.LARGE_SIZE_BOX_HEADER_SIZE;
import static androidx.media3.muxer.Boxes.getEdvdBoxHeader; import static androidx.media3.muxer.Boxes.getAxteBoxHeader;
import static androidx.media3.muxer.MuxerUtil.getEditableTracksLengthMetadata; import static androidx.media3.muxer.MuxerUtil.getAuxiliaryTracksLengthMetadata;
import static androidx.media3.muxer.MuxerUtil.getEditableTracksOffsetMetadata; import static androidx.media3.muxer.MuxerUtil.getAuxiliaryTracksOffsetMetadata;
import static androidx.media3.muxer.MuxerUtil.populateEditableVideoTracksMetadata; import static androidx.media3.muxer.MuxerUtil.populateAuxiliaryTracksMetadata;
import static java.lang.Math.max; import static java.lang.Math.max;
import static java.lang.Math.min; import static java.lang.Math.min;
@ -55,7 +55,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
private final boolean sampleCopyEnabled; private final boolean sampleCopyEnabled;
private final boolean sampleBatchingEnabled; private final boolean sampleBatchingEnabled;
private final List<Track> tracks; private final List<Track> tracks;
private final List<Track> editableVideoTracks; private final List<Track> auxiliaryTracks;
private final AtomicBoolean hasWrittenSamples; private final AtomicBoolean hasWrittenSamples;
// Stores location of the space reserved for the moov box at the beginning of the file (after ftyp // Stores location of the space reserved for the moov box at the beginning of the file (after ftyp
@ -101,7 +101,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
this.sampleCopyEnabled = sampleCopyEnabled; this.sampleCopyEnabled = sampleCopyEnabled;
this.sampleBatchingEnabled = sampleBatchingEnabled; this.sampleBatchingEnabled = sampleBatchingEnabled;
tracks = new ArrayList<>(); tracks = new ArrayList<>();
editableVideoTracks = new ArrayList<>(); auxiliaryTracks = new ArrayList<>();
hasWrittenSamples = new AtomicBoolean(false); hasWrittenSamples = new AtomicBoolean(false);
canWriteMoovAtStart = attemptStreamableOutputEnabled; canWriteMoovAtStart = attemptStreamableOutputEnabled;
lastMoovWritten = Range.closed(0L, 0L); lastMoovWritten = Range.closed(0L, 0L);
@ -123,18 +123,18 @@ import java.util.concurrent.atomic.AtomicBoolean;
} }
/** /**
* Adds an editable video track of the given {@link Format}. * Adds an auxiliary track of the given {@link Format}.
* *
* <p>See {@link MuxerUtil#isEditableVideoTrack(Format)} for editable video tracks. * <p>See {@link MuxerUtil#isAuxiliaryTrack(Format)} for auxiliary tracks.
* *
* @param sortKey The key used for sorting the track list. * @param sortKey The key used for sorting the track list.
* @param format The {@link Format} for the track. * @param format The {@link Format} for the track.
* @return A unique {@link Track}. It should be used in {@link #writeSampleData}. * @return A unique {@link Track}. It should be used in {@link #writeSampleData}.
*/ */
public Track addEditableVideoTrack(int sortKey, Format format) { public Track addAuxiliaryTrack(int sortKey, Format format) {
Track track = new Track(format, sortKey, sampleCopyEnabled); Track track = new Track(format, sortKey, sampleCopyEnabled);
editableVideoTracks.add(track); auxiliaryTracks.add(track);
Collections.sort(editableVideoTracks, (a, b) -> Integer.compare(a.sortKey, b.sortKey)); Collections.sort(auxiliaryTracks, (a, b) -> Integer.compare(a.sortKey, b.sortKey));
return track; return track;
} }
@ -175,8 +175,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
for (int i = 0; i < tracks.size(); i++) { for (int i = 0; i < tracks.size(); i++) {
writePendingTrackSamples(tracks.get(i)); writePendingTrackSamples(tracks.get(i));
} }
for (int i = 0; i < editableVideoTracks.size(); i++) { for (int i = 0; i < auxiliaryTracks.size(); i++) {
writePendingTrackSamples(editableVideoTracks.get(i)); writePendingTrackSamples(auxiliaryTracks.get(i));
} }
// Leave the file empty if no samples are written. // Leave the file empty if no samples are written.
@ -186,48 +186,48 @@ import java.util.concurrent.atomic.AtomicBoolean;
finalizeMoovBox(); finalizeMoovBox();
if (!editableVideoTracks.isEmpty()) { if (!auxiliaryTracks.isEmpty()) {
writeEdvdBox(); writeAxteBox();
} }
} }
private void writeEdvdBox() throws IOException { private void writeAxteBox() throws IOException {
// The exact offset is known after writing primary track data. // The exact offset is known after writing primary track data.
MdtaMetadataEntry placeholderEditableTrackOffset = MdtaMetadataEntry placeholderAuxiliaryTrackOffset =
getEditableTracksOffsetMetadata(/* offset= */ 0L); getAuxiliaryTracksOffsetMetadata(/* offset= */ 0L);
metadataCollector.addMetadata(placeholderEditableTrackOffset); metadataCollector.addMetadata(placeholderAuxiliaryTrackOffset);
ByteBuffer edvdBox = getEdvdBox(); ByteBuffer axteBox = getAxteBox();
metadataCollector.addMetadata(getEditableTracksLengthMetadata(edvdBox.remaining())); metadataCollector.addMetadata(getAuxiliaryTracksLengthMetadata(axteBox.remaining()));
finalizeMoovBox(); finalizeMoovBox();
// Once final moov is written, update the actual offset. // Once final moov is written, update the actual offset.
metadataCollector.removeMdtaMetadataEntry(placeholderEditableTrackOffset); metadataCollector.removeMdtaMetadataEntry(placeholderAuxiliaryTrackOffset);
metadataCollector.addMetadata(getEditableTracksOffsetMetadata(outputFileChannel.size())); metadataCollector.addMetadata(getAuxiliaryTracksOffsetMetadata(outputFileChannel.size()));
long fileSizeBefore = outputFileChannel.size(); long fileSizeBefore = outputFileChannel.size();
finalizeMoovBox(); finalizeMoovBox();
checkState(fileSizeBefore == outputFileChannel.size()); checkState(fileSizeBefore == outputFileChannel.size());
// After writing primary track data, write the edvd box. // After writing primary track data, write the axte box.
outputFileChannel.position(outputFileChannel.size()); outputFileChannel.position(outputFileChannel.size());
outputFileChannel.write(edvdBox); outputFileChannel.write(axteBox);
} }
private ByteBuffer getEdvdBox() { private ByteBuffer getAxteBox() {
// The edvd box will have one ftyp and one moov box. // The axte box will have one ftyp and one moov box.
ByteBuffer ftypBox = Boxes.ftyp(); ByteBuffer ftypBox = Boxes.ftyp();
MetadataCollector editableVideoMetadataCollector = new MetadataCollector(); MetadataCollector auxiliaryTracksMetadataCollector = new MetadataCollector();
populateEditableVideoTracksMetadata( populateAuxiliaryTracksMetadata(
editableVideoMetadataCollector, auxiliaryTracksMetadataCollector,
metadataCollector.timestampData, metadataCollector.timestampData,
/* samplesInterleaved= */ true, /* samplesInterleaved= */ true,
editableVideoTracks); auxiliaryTracks);
ByteBuffer moovBox = ByteBuffer moovBox =
Boxes.moov( Boxes.moov(
editableVideoTracks, auxiliaryTracks,
editableVideoMetadataCollector, auxiliaryTracksMetadataCollector,
/* isFragmentedMp4= */ false, /* isFragmentedMp4= */ false,
lastSampleDurationBehavior); lastSampleDurationBehavior);
ByteBuffer edvdBoxHeader = ByteBuffer axteBoxHeader =
getEdvdBoxHeader(/* payloadSize= */ ftypBox.remaining() + moovBox.remaining()); getAxteBoxHeader(/* payloadSize= */ ftypBox.remaining() + moovBox.remaining());
return BoxUtils.concatenateBuffers(edvdBoxHeader, ftypBox, moovBox); return BoxUtils.concatenateBuffers(axteBoxHeader, ftypBox, moovBox);
} }
/** /**
@ -501,7 +501,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
private void doInterleave() throws IOException { private void doInterleave() throws IOException {
boolean primaryTrackSampleWritten = maybeWritePendingTrackSamples(tracks); boolean primaryTrackSampleWritten = maybeWritePendingTrackSamples(tracks);
maybeWritePendingTrackSamples(editableVideoTracks); maybeWritePendingTrackSamples(auxiliaryTracks);
if (primaryTrackSampleWritten && canWriteMoovAtStart) { if (primaryTrackSampleWritten && canWriteMoovAtStart) {
maybeWriteMoovAtStart(); maybeWriteMoovAtStart();

View File

@ -15,13 +15,13 @@
*/ */
package androidx.media3.muxer; package androidx.media3.muxer;
import static androidx.media3.container.MdtaMetadataEntry.EDITABLE_TRACKS_SAMPLES_LOCATION_INTERLEAVED; import static androidx.media3.container.MdtaMetadataEntry.AUXILIARY_TRACKS_SAMPLES_INTERLEAVED;
import static androidx.media3.container.MdtaMetadataEntry.EDITABLE_TRACKS_SAMPLES_LOCATION_IN_EDIT_DATA_MP4; import static androidx.media3.container.MdtaMetadataEntry.AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED;
import static androidx.media3.container.MdtaMetadataEntry.TYPE_INDICATOR_8_BIT_UNSIGNED_INT; import static androidx.media3.container.MdtaMetadataEntry.TYPE_INDICATOR_8_BIT_UNSIGNED_INT;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_INVERSE; import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_LINEAR; import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_METADATA; import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_SHARP; import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_SHARP;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
@ -55,10 +55,10 @@ public final class MuxerUtil {
} }
/** /**
* Returns whether the given {@linkplain Format track format} is an editable video track. * Returns whether the given {@linkplain Format track format} is an auxiliary track.
* *
* <p>The {@linkplain Format track format} with {@link C#ROLE_FLAG_AUXILIARY} and the {@code * <p>The {@linkplain Format track format} with {@link C#ROLE_FLAG_AUXILIARY} and the {@code
* auxiliaryTrackType} from the following are considered as an editable video track. * auxiliaryTrackType} from the following are considered as an auxiliary track.
* *
* <ul> * <ul>
* <li>{@link C#AUXILIARY_TRACK_TYPE_ORIGINAL} * <li>{@link C#AUXILIARY_TRACK_TYPE_ORIGINAL}
@ -67,7 +67,7 @@ public final class MuxerUtil {
* <li>{@link C#AUXILIARY_TRACK_TYPE_DEPTH_METADATA} * <li>{@link C#AUXILIARY_TRACK_TYPE_DEPTH_METADATA}
* </ul> * </ul>
*/ */
/* package */ static boolean isEditableVideoTrack(Format format) { /* package */ static boolean isAuxiliaryTrack(Format format) {
return (format.roleFlags & C.ROLE_FLAG_AUXILIARY) > 0 return (format.roleFlags & C.ROLE_FLAG_AUXILIARY) > 0
&& (format.auxiliaryTrackType == C.AUXILIARY_TRACK_TYPE_ORIGINAL && (format.auxiliaryTrackType == C.AUXILIARY_TRACK_TYPE_ORIGINAL
|| format.auxiliaryTrackType == C.AUXILIARY_TRACK_TYPE_DEPTH_LINEAR || format.auxiliaryTrackType == C.AUXILIARY_TRACK_TYPE_DEPTH_LINEAR
@ -75,84 +75,86 @@ public final class MuxerUtil {
|| format.auxiliaryTrackType == C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA); || format.auxiliaryTrackType == C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA);
} }
/** Returns a {@link MdtaMetadataEntry} for the editable tracks offset metadata. */ /** Returns a {@link MdtaMetadataEntry} for the auxiliary tracks offset metadata. */
/* package */ static MdtaMetadataEntry getEditableTracksOffsetMetadata(long offset) { /* package */ static MdtaMetadataEntry getAuxiliaryTracksOffsetMetadata(long offset) {
return new MdtaMetadataEntry( return new MdtaMetadataEntry(
MdtaMetadataEntry.KEY_EDITABLE_TRACKS_OFFSET, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_OFFSET,
Longs.toByteArray(offset), Longs.toByteArray(offset),
MdtaMetadataEntry.TYPE_INDICATOR_UNSIGNED_INT64); MdtaMetadataEntry.TYPE_INDICATOR_UNSIGNED_INT64);
} }
/** Returns a {@link MdtaMetadataEntry} for the editable tracks length metadata. */ /** Returns a {@link MdtaMetadataEntry} for the auxiliary tracks length metadata. */
/* package */ static MdtaMetadataEntry getEditableTracksLengthMetadata(long length) { /* package */ static MdtaMetadataEntry getAuxiliaryTracksLengthMetadata(long length) {
return new MdtaMetadataEntry( return new MdtaMetadataEntry(
MdtaMetadataEntry.KEY_EDITABLE_TRACKS_LENGTH, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_LENGTH,
Longs.toByteArray(length), Longs.toByteArray(length),
MdtaMetadataEntry.TYPE_INDICATOR_UNSIGNED_INT64); MdtaMetadataEntry.TYPE_INDICATOR_UNSIGNED_INT64);
} }
/** /**
* Populates editable video tracks metadata. * Populates auxiliary tracks metadata.
* *
* @param metadataCollector The {@link MetadataCollector} to add the metadata to. * @param metadataCollector The {@link MetadataCollector} to add the metadata to.
* @param timestampData The {@link Mp4TimestampData}. * @param timestampData The {@link Mp4TimestampData}.
* @param samplesInterleaved Whether editable video track samples are interleaved with the primary * @param samplesInterleaved Whether auxiliary track samples are interleaved with the primary
* track samples. * track samples.
* @param editableVideoTracks The editable video tracks. * @param auxiliaryTracks The auxiliary tracks.
*/ */
/* package */ static void populateEditableVideoTracksMetadata( /* package */ static void populateAuxiliaryTracksMetadata(
MetadataCollector metadataCollector, MetadataCollector metadataCollector,
Mp4TimestampData timestampData, Mp4TimestampData timestampData,
boolean samplesInterleaved, boolean samplesInterleaved,
List<Track> editableVideoTracks) { List<Track> auxiliaryTracks) {
metadataCollector.addMetadata(timestampData); metadataCollector.addMetadata(timestampData);
metadataCollector.addMetadata(getEditableTracksSamplesLocationMetadata(samplesInterleaved)); metadataCollector.addMetadata(getAuxiliaryTracksSamplesLocationMetadata(samplesInterleaved));
metadataCollector.addMetadata(getEditableTracksMapMetadata(editableVideoTracks)); metadataCollector.addMetadata(getAuxiliaryTracksMapMetadata(auxiliaryTracks));
} }
private static MdtaMetadataEntry getEditableTracksSamplesLocationMetadata( private static MdtaMetadataEntry getAuxiliaryTracksSamplesLocationMetadata(
boolean samplesInterleaved) { boolean samplesInterleaved) {
return new MdtaMetadataEntry( return new MdtaMetadataEntry(
MdtaMetadataEntry.KEY_EDITABLE_TRACKS_SAMPLES_LOCATION, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_INTERLEAVED,
new byte[] { new byte[] {
samplesInterleaved samplesInterleaved
? EDITABLE_TRACKS_SAMPLES_LOCATION_INTERLEAVED ? AUXILIARY_TRACKS_SAMPLES_INTERLEAVED
: EDITABLE_TRACKS_SAMPLES_LOCATION_IN_EDIT_DATA_MP4 : AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED
}, },
TYPE_INDICATOR_8_BIT_UNSIGNED_INT); TYPE_INDICATOR_8_BIT_UNSIGNED_INT);
} }
private static MdtaMetadataEntry getEditableTracksMapMetadata(List<Track> editableVideoTracks) { private static MdtaMetadataEntry getAuxiliaryTracksMapMetadata(List<Track> auxiliaryTracks) {
// 1 byte version + 1 byte track count (n) + n bytes track types. // 1 byte version + 1 byte track count (n) + n bytes track types.
int totalTracks = editableVideoTracks.size(); int totalTracks = auxiliaryTracks.size();
int dataSize = 2 + totalTracks; int dataSize = 2 + totalTracks;
byte[] data = new byte[dataSize]; byte[] data = new byte[dataSize];
data[0] = 1; // version data[0] = 1; // version
data[1] = (byte) totalTracks; // track count data[1] = (byte) totalTracks; // track count
for (int i = 0; i < totalTracks; i++) { for (int i = 0; i < totalTracks; i++) {
Track track = editableVideoTracks.get(i); Track track = auxiliaryTracks.get(i);
int trackType; int trackType;
switch (track.format.auxiliaryTrackType) { switch (track.format.auxiliaryTrackType) {
case C.AUXILIARY_TRACK_TYPE_ORIGINAL: case C.AUXILIARY_TRACK_TYPE_ORIGINAL:
trackType = EDITABLE_TRACK_TYPE_SHARP; trackType = MP4_AT_AUXILIARY_TRACK_TYPE_SHARP;
break; break;
case C.AUXILIARY_TRACK_TYPE_DEPTH_LINEAR: case C.AUXILIARY_TRACK_TYPE_DEPTH_LINEAR:
trackType = EDITABLE_TRACK_TYPE_DEPTH_LINEAR; trackType = MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR;
break; break;
case C.AUXILIARY_TRACK_TYPE_DEPTH_INVERSE: case C.AUXILIARY_TRACK_TYPE_DEPTH_INVERSE:
trackType = EDITABLE_TRACK_TYPE_DEPTH_INVERSE; trackType = MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE;
break; break;
case C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA: case C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA:
trackType = EDITABLE_TRACK_TYPE_DEPTH_METADATA; trackType = MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA;
break; break;
default: default:
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Unsupported editable track type " + track.format.auxiliaryTrackType); "Unsupported auxiliary track type " + track.format.auxiliaryTrackType);
} }
data[i + 2] = (byte) trackType; data[i + 2] = (byte) trackType;
} }
return new MdtaMetadataEntry( return new MdtaMetadataEntry(
MdtaMetadataEntry.KEY_EDITABLE_TRACKS_MAP, data, MdtaMetadataEntry.TYPE_INDICATOR_RESERVED); MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_MAP,
data,
MdtaMetadataEntry.TYPE_INDICATOR_RESERVED);
} }
private static boolean isMdtaMetadataEntrySupported(MdtaMetadataEntry mdtaMetadataEntry) { private static boolean isMdtaMetadataEntrySupported(MdtaMetadataEntry mdtaMetadataEntry) {

View File

@ -416,7 +416,7 @@ public class Mp4MuxerEndToEndTest {
} }
@Test @Test
public void createMp4Muxer_withFileFormatEditableVideoButWithoutCacheFileProvider_throws() public void createMp4Muxer_withFileFormatMp4AtButWithoutCacheFileProvider_throws()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
@ -424,20 +424,19 @@ public class Mp4MuxerEndToEndTest {
IllegalArgumentException.class, IllegalArgumentException.class,
() -> () ->
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.build()); .build());
} }
@Test @Test
public void writeMp4File_withFileFormatEditableVideoAndEditableVideoTracks_writesEdvdBox() public void writeMp4File_withFileFormatMp4AtAndAuxiliaryTracks_writesAxteBox() throws Exception {
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath(); String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setEditableVideoParameters( .setMp4AtFileParameters(
new Mp4Muxer.EditableVideoParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath)) /* shouldInterleaveSamples= */ false, () -> cacheFilePath))
.build(); .build();
@ -470,15 +469,15 @@ public class Mp4MuxerEndToEndTest {
DumpableMp4Box outputFileDumpableBox = DumpableMp4Box outputFileDumpableBox =
new DumpableMp4Box(ByteBuffer.wrap(TestUtil.getByteArrayFromFilePath(outputFilePath))); new DumpableMp4Box(ByteBuffer.wrap(TestUtil.getByteArrayFromFilePath(outputFilePath)));
// 1 track is written in the outer moov box and 2 tracks are written in the edvd.moov box. // 1 track is written in the outer moov box and 2 tracks are written in the axte.moov box.
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
outputFileDumpableBox, outputFileDumpableBox,
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_editable_video_tracks_in_edvd.box")); MuxerTestUtil.getExpectedDumpFilePath("mp4_with_auxiliary_tracks_in_axte.box"));
} }
@Test @Test
public void writeMp4File_withFileFormatDefaultAndEditableVideoTracks_doesNotWriteEdvdBox() public void writeMp4File_withFileFormatDefaultAndAuxiliaryTracks_doesNotWriteAxteBox()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build(); Mp4Muxer muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build();
@ -512,24 +511,24 @@ public class Mp4MuxerEndToEndTest {
DumpableMp4Box outputFileDumpableBox = DumpableMp4Box outputFileDumpableBox =
new DumpableMp4Box(ByteBuffer.wrap(TestUtil.getByteArrayFromFilePath(outputFilePath))); new DumpableMp4Box(ByteBuffer.wrap(TestUtil.getByteArrayFromFilePath(outputFilePath)));
// All 3 tracks are written in the outer moov box and no edvd box. // All 3 tracks are written in the outer moov box and no axte box.
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
outputFileDumpableBox, outputFileDumpableBox,
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_editable_video_tracks_without_edvd.box")); MuxerTestUtil.getExpectedDumpFilePath("mp4_with_auxiliary_tracks_without_axte.box"));
} }
@Test @Test
public void public void
writeMp4File_withFileFormatEditableVideoAndEditableVideoTracks_primaryVideoTracksMatchesExpected() writeMp4File_withFileFormatMp4AtAndAuxiliaryVideoTracks_primaryVideoTracksMatchesExpected()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath(); String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setEditableVideoParameters( .setMp4AtFileParameters(
new Mp4Muxer.EditableVideoParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath)) /* shouldInterleaveSamples= */ false, () -> cacheFilePath))
.build(); .build();
@ -571,16 +570,15 @@ public class Mp4MuxerEndToEndTest {
} }
@Test @Test
public void public void writeMp4File_withFileFormatMp4AtAndAuxiliaryTracks_auxiliaryTracksMatchesExpected()
writeMp4File_withFileFormatEditableVideoAndEditableVideoTracks_editableVideoTracksMatchesExpected() throws Exception {
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath(); String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setEditableVideoParameters( .setMp4AtFileParameters(
new Mp4Muxer.EditableVideoParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath)) /* shouldInterleaveSamples= */ false, () -> cacheFilePath))
.build(); .build();
@ -611,27 +609,27 @@ public class Mp4MuxerEndToEndTest {
muxer.close(); muxer.close();
} }
FakeExtractorOutput editableTracksOutput = FakeExtractorOutput auxiliaryTracksOutput =
TestUtil.extractAllSamplesFromFilePath( TestUtil.extractAllSamplesFromFilePath(
new Mp4Extractor( new Mp4Extractor(
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_EDITABLE_VIDEO_TRACKS), new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_AUXILIARY_TRACKS),
outputFilePath); outputFilePath);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
editableTracksOutput, auxiliaryTracksOutput,
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_editable_video_tracks.mp4")); MuxerTestUtil.getExpectedDumpFilePath("mp4_with_auxiliary_tracks.mp4"));
} }
@Test @Test
public void public void
writeMp4File_withFileFormatEditableVideoAndEditableVideoTracksAndShouldInterleaveSamples_primaryVideoTracksMatchesExpected() writeMp4File_withFileFormatMp4AtAndAuxiliaryTracksAndShouldInterleaveSamples_primaryVideoTracksMatchesExpected()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setEditableVideoParameters( .setMp4AtFileParameters(
new Mp4Muxer.EditableVideoParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null)) /* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null))
.build(); .build();
@ -670,19 +668,19 @@ public class Mp4MuxerEndToEndTest {
context, context,
primaryTracksOutput, primaryTracksOutput,
MuxerTestUtil.getExpectedDumpFilePath( MuxerTestUtil.getExpectedDumpFilePath(
"mp4_with_primary_tracks_when_editable_track_samples_interleaved.mp4")); "mp4_with_primary_tracks_when_auxiliary_track_samples_interleaved.mp4"));
} }
@Test @Test
public void public void
writeMp4File_withFileFormatEditableVideoAndEditableVideoTracksAndShouldInterleaveSamples_editableVideoTracksMatchesExpected() writeMp4File_withFileFormatMp4AtAndAuxiliaryTracksAndShouldInterleaveSamples_auxiliaryTracksMatchesExpected()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setEditableVideoParameters( .setMp4AtFileParameters(
new Mp4Muxer.EditableVideoParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null)) /* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null))
.build(); .build();
@ -713,16 +711,16 @@ public class Mp4MuxerEndToEndTest {
muxer.close(); muxer.close();
} }
FakeExtractorOutput editableTracksOutput = FakeExtractorOutput auxiliaryTracksOutput =
TestUtil.extractAllSamplesFromFilePath( TestUtil.extractAllSamplesFromFilePath(
new Mp4Extractor( new Mp4Extractor(
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_EDITABLE_VIDEO_TRACKS), new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_AUXILIARY_TRACKS),
outputFilePath); outputFilePath);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
editableTracksOutput, auxiliaryTracksOutput,
MuxerTestUtil.getExpectedDumpFilePath( MuxerTestUtil.getExpectedDumpFilePath(
"mp4_with_editable_video_tracks_when_editable_track_samples_interleaved.mp4")); "mp4_with_auxiliary_tracks_when_auxiliary_track_samples_interleaved.mp4"));
} }
@Test @Test

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -25,7 +25,7 @@ track 0:
chromaBitdepth = 8 chromaBitdepth = 8
roleFlags = [auxiliary] roleFlags = [auxiliary]
auxiliaryTrackType = original auxiliaryTrackType = original
metadata = entries=[mdta: key=editable.tracks.map, value=track types = 0,1, mdta: key=editable.tracks.samples.location, value=0, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.interleaved, value=0, mdta: key=auxiliary.tracks.map, value=track types = 0,1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682
@ -68,7 +68,7 @@ track 1:
chromaBitdepth = 8 chromaBitdepth = 8
roleFlags = [auxiliary] roleFlags = [auxiliary]
auxiliaryTrackType = depth-linear auxiliaryTrackType = depth-linear
metadata = entries=[mdta: key=editable.tracks.map, value=track types = 0,1, mdta: key=editable.tracks.samples.location, value=0, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.interleaved, value=0, mdta: key=auxiliary.tracks.map, value=track types = 0,1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -23,7 +23,7 @@ track 0:
colorRange = 1 colorRange = 1
lumaBitdepth = 8 lumaBitdepth = 8
chromaBitdepth = 8 chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -23,7 +23,7 @@ track 0:
colorRange = 1 colorRange = 1
lumaBitdepth = 8 lumaBitdepth = 8
chromaBitdepth = 8 chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -23,7 +23,7 @@ track 0:
colorRange = 1 colorRange = 1
lumaBitdepth = 8 lumaBitdepth = 8
chromaBitdepth = 8 chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -23,7 +23,7 @@ track 0:
colorRange = 1 colorRange = 1
lumaBitdepth = 8 lumaBitdepth = 8
chromaBitdepth = 8 chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -25,7 +25,7 @@ track 0:
chromaBitdepth = 8 chromaBitdepth = 8
roleFlags = [auxiliary] roleFlags = [auxiliary]
auxiliaryTrackType = original auxiliaryTrackType = original
metadata = entries=[mdta: key=editable.tracks.map, value=track types = 0,1, mdta: key=editable.tracks.samples.location, value=1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.interleaved, value=1, mdta: key=auxiliary.tracks.map, value=track types = 0,1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682
@ -68,7 +68,7 @@ track 1:
chromaBitdepth = 8 chromaBitdepth = 8
roleFlags = [auxiliary] roleFlags = [auxiliary]
auxiliaryTrackType = depth-linear auxiliaryTrackType = depth-linear
metadata = entries=[mdta: key=editable.tracks.map, value=track types = 0,1, mdta: key=editable.tracks.samples.location, value=1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.interleaved, value=1, mdta: key=auxiliary.tracks.map, value=track types = 0,1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -25,7 +25,7 @@ track 0:
chromaBitdepth = 8 chromaBitdepth = 8
roleFlags = [auxiliary] roleFlags = [auxiliary]
auxiliaryTrackType = original auxiliaryTrackType = original
metadata = entries=[mdta: key=editable.tracks.map, value=track types = 0,1, mdta: key=editable.tracks.samples.location, value=0, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.interleaved, value=0, mdta: key=auxiliary.tracks.map, value=track types = 0,1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682
@ -68,7 +68,7 @@ track 1:
chromaBitdepth = 8 chromaBitdepth = 8
roleFlags = [auxiliary] roleFlags = [auxiliary]
auxiliaryTrackType = depth-linear auxiliaryTrackType = depth-linear
metadata = entries=[mdta: key=editable.tracks.map, value=track types = 0,1, mdta: key=editable.tracks.samples.location, value=0, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.interleaved, value=0, mdta: key=auxiliary.tracks.map, value=track types = 0,1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -1,15 +1,15 @@
ftyp (28 bytes): ftyp (28 bytes):
Data = length 20, hash EF896440 Data = length 20, hash EF896440
moov (879 bytes): moov (881 bytes):
mvhd (108 bytes): mvhd (108 bytes):
Data = length 100, hash 2613A5C Data = length 100, hash 2613A5C
meta (189 bytes): meta (191 bytes):
hdlr (33 bytes): hdlr (33 bytes):
Data = length 25, hash C39D0F5B Data = length 25, hash C39D0F5B
keys (76 bytes): keys (78 bytes):
Data = length 68, hash AEF33438 Data = length 70, hash C5147150
ilst (72 bytes): ilst (72 bytes):
Data = length 64, hash 545348D9 Data = length 64, hash 3B286CD9
trak (574 bytes): trak (574 bytes):
tkhd (92 bytes): tkhd (92 bytes):
Data = length 84, hash 3D79758F Data = length 84, hash 3D79758F
@ -36,23 +36,23 @@ moov (879 bytes):
Data = length 16, hash E4EE6662 Data = length 16, hash E4EE6662
stss (36 bytes): stss (36 bytes):
Data = length 28, hash 53024615 Data = length 28, hash 53024615
free (399129 bytes): free (399127 bytes):
Data = length 399121, hash 4626C21F Data = length 399119, hash 82DEBDDF
mdat (296 bytes): mdat (296 bytes):
Data = length 280, hash 8DCFD2E3 Data = length 280, hash 8DCFD2E3
edvd (400628 bytes): axte (400628 bytes):
ftyp (28 bytes): ftyp (28 bytes):
Data = length 20, hash EF896440 Data = length 20, hash EF896440
moov (1449 bytes): moov (1446 bytes):
mvhd (108 bytes): mvhd (108 bytes):
Data = length 100, hash 2613A5D Data = length 100, hash 2613A5D
meta (185 bytes): meta (182 bytes):
hdlr (33 bytes): hdlr (33 bytes):
Data = length 25, hash C39D0F5B Data = length 25, hash C39D0F5B
keys (83 bytes): keys (80 bytes):
Data = length 75, hash 951DA420 Data = length 72, hash 4E5C3894
ilst (61 bytes): ilst (61 bytes):
Data = length 53, hash 1156FE81 Data = length 53, hash 75D49FBD
trak (574 bytes): trak (574 bytes):
tkhd (92 bytes): tkhd (92 bytes):
Data = length 84, hash 3D79758F Data = length 84, hash 3D79758F
@ -105,7 +105,7 @@ edvd (400628 bytes):
Data = length 16, hash E4EE6699 Data = length 16, hash E4EE6699
stss (36 bytes): stss (36 bytes):
Data = length 28, hash 53024615 Data = length 28, hash 53024615
free (398559 bytes): free (398562 bytes):
Data = length 398551, hash D08A6DF Data = length 398554, hash C1D2F8C1
mdat (576 bytes): mdat (576 bytes):
Data = length 560, hash 9E0D5FC5 Data = length 560, hash 9E0D5FC5

View File

@ -25,7 +25,7 @@ track 0:
chromaBitdepth = 8 chromaBitdepth = 8
roleFlags = [auxiliary] roleFlags = [auxiliary]
auxiliaryTrackType = original auxiliaryTrackType = original
metadata = entries=[mdta: key=editable.tracks.map, value=track types = 0,1, mdta: key=editable.tracks.samples.location, value=1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.interleaved, value=1, mdta: key=auxiliary.tracks.map, value=track types = 0,1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682
@ -68,7 +68,7 @@ track 1:
chromaBitdepth = 8 chromaBitdepth = 8
roleFlags = [auxiliary] roleFlags = [auxiliary]
auxiliaryTrackType = depth-linear auxiliaryTrackType = depth-linear
metadata = entries=[mdta: key=editable.tracks.map, value=track types = 0,1, mdta: key=editable.tracks.samples.location, value=1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.interleaved, value=1, mdta: key=auxiliary.tracks.map, value=track types = 0,1, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -23,7 +23,7 @@ track 0:
colorRange = 1 colorRange = 1
lumaBitdepth = 8 lumaBitdepth = 8
chromaBitdepth = 8 chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.offset, value=400332, mdta: key=editable.tracks.length, value=400628, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000] metadata = entries=[mdta: key=auxiliary.tracks.length, value=400628, mdta: key=auxiliary.tracks.offset, value=400332, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData: initializationData:
data = length 28, hash 410B510 data = length 28, hash 410B510
data = length 9, hash FBADD682 data = length 9, hash FBADD682

View File

@ -0,0 +1,50 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=auxiliary.tracks.length, value=1490, mdta: key=auxiliary.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,50 +0,0 @@
seekMap:
isSeekable = true
duration = 0
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(1) = [[timeUs=0, position=400276]]
getPosition(0) = [[timeUs=0, position=400052]]
getPosition(0) = [[timeUs=0, position=400052]]
numberOfTracks = 1
track 0:
total output bytes = 280
sample count = 5
track duration = 0
format 0:
id = 1
containerMimeType = video/mp4
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
maxNumReorderSamples = 2
width = 12
height = 10
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[mdta: key=editable.tracks.length, value=1493, mdta: key=editable.tracks.offset, value=400892, Mp4Timestamp: creation time=1000000, modification time=5000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 4:
time = 0
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -26,7 +26,7 @@ import java.nio.ByteBuffer;
public final class DumpableMp4Box implements Dumper.Dumpable { public final class DumpableMp4Box implements Dumper.Dumpable {
private static final ImmutableSet<String> CONTAINER_BOXES = private static final ImmutableSet<String> CONTAINER_BOXES =
ImmutableSet.of( ImmutableSet.of(
"moov", "trak", "mdia", "minf", "stbl", "edts", "meta", "mvex", "moof", "traf", "edvd"); "moov", "trak", "mdia", "minf", "stbl", "edts", "meta", "mvex", "moof", "traf", "axte");
private final ParsableByteArray box; private final ParsableByteArray box;
/*** /***