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

View File

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

View File

@ -21,7 +21,7 @@ import androidx.media3.common.util.UnstableApi;
@UnstableApi
public final class Mp4Util {
/** 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.
@ -29,7 +29,7 @@ public final class Mp4Util {
* <p>See https://developer.android.com/static/media/camera/camera2/Dynamic-depth-v1.0.pdf for
* 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.
@ -37,10 +37,10 @@ public final class Mp4Util {
* <p>See https://developer.android.com/static/media/camera/camera2/Dynamic-depth-v1.0.pdf for
* 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. */
public static final int EDITABLE_TRACK_TYPE_DEPTH_METADATA = 3;
public static final int MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA = 3;
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.checkStateNotNull;
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.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_INVERSE;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_LINEAR;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_DEPTH_METADATA;
import static androidx.media3.container.Mp4Util.EDITABLE_TRACK_TYPE_SHARP;
import static androidx.media3.container.MdtaMetadataEntry.AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED;
import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE;
import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR;
import static androidx.media3.container.Mp4Util.MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA;
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.MetadataUtil.findMdtaMetadataEntryWithKey;
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_EMIT_RAW_SUBTITLE_DATA,
FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES,
FLAG_READ_EDITABLE_VIDEO_TRACKS
FLAG_READ_AUXILIARY_TRACKS
})
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.
/**
* 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
* on the flag.
* <p>Either primary video tracks or auxiliary tracks (but not both) will be extracted based on
* the flag.
*
* <p>If the flag is set but the editable video tracks are not present, then it fallbacks to
* extract primary tracks instead.
* <p>If the flag is set but the auxiliary tracks are not present, then it fallbacks to extract
* 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.
@ -248,12 +248,12 @@ public final class Mp4Extractor implements Extractor, SeekMap {
private int sampleCurrentNalBytesRemaining;
private boolean isSampleDependedOn;
private boolean seenFtypAtom;
private boolean seekToEdvdAtom;
private long edvdAtomOffset;
private boolean readingEditableVideoTracks;
private boolean seekToAxteAtom;
private long axteAtomOffset;
private boolean readingAuxiliaryTracks;
// Used when editable video samples are in the edit data MP4 (inside edvd atom).
private long sampleOffsetForEditableVideoTracks;
// Used when auxiliary tracks samples are in the auxiliary tracks MP4 (inside axte atom).
private long sampleOffsetForAuxiliaryTracks;
// Extractor outputs.
private ExtractorOutput extractorOutput;
@ -609,11 +609,11 @@ public final class Mp4Extractor implements Extractor, SeekMap {
}
}
processAtomEnded(atomEndPosition);
if (seekToEdvdAtom) {
readingEditableVideoTracks = true;
positionHolder.position = edvdAtomOffset;
if (seekToAxteAtom) {
readingAuxiliaryTracks = true;
positionHolder.position = axteAtomOffset;
seekRequired = true;
seekToEdvdAtom = false;
seekToAxteAtom = false;
}
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.
processMoovAtom(containerAtom);
containerAtoms.clear();
if (!seekToEdvdAtom) {
if (!seekToAxteAtom) {
parserState = STATE_READING_SAMPLE;
}
} else if (!containerAtoms.isEmpty()) {
@ -649,23 +649,22 @@ public final class Mp4Extractor implements Extractor, SeekMap {
/**
* 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 {
// 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 Mp4Box.ContainerBox meta = moov.getContainerBoxOfType(Mp4Box.TYPE_meta);
List<@C.AuxiliaryTrackType Integer> auxiliaryTrackTypesForEditableVideoTracks =
new ArrayList<>();
List<@C.AuxiliaryTrackType Integer> auxiliaryTrackTypesForAuxiliaryTracks = new ArrayList<>();
if (meta != null) {
mdtaMetadata = BoxParser.parseMdtaFromMeta(meta);
if (readingEditableVideoTracks) {
if (readingAuxiliaryTracks) {
checkStateNotNull(mdtaMetadata);
maybeSetDefaultSampleOffsetForEditableVideoTracks(mdtaMetadata);
auxiliaryTrackTypesForEditableVideoTracks =
getAuxiliaryTrackTypesForEditableVideoTracks(mdtaMetadata);
} else if (shouldSeekToEdvdAtom(mdtaMetadata)) {
seekToEdvdAtom = true;
maybeSetDefaultSampleOffsetForAuxiliaryTracks(mdtaMetadata);
auxiliaryTrackTypesForAuxiliaryTracks =
getAuxiliaryTrackTypesForAuxiliaryTracks(mdtaMetadata);
} else if (shouldSeekToAxteAtom(mdtaMetadata)) {
seekToAxteAtom = true;
return;
}
}
@ -698,14 +697,14 @@ public final class Mp4Extractor implements Extractor, SeekMap {
isQuickTime,
/* modifyTrackFunction= */ track -> track);
if (readingEditableVideoTracks) {
if (readingAuxiliaryTracks) {
checkState(
auxiliaryTrackTypesForEditableVideoTracks.size() == trackSampleTables.size(),
auxiliaryTrackTypesForAuxiliaryTracks.size() == trackSampleTables.size(),
String.format(
Locale.US,
"The number of auxiliary track types from metadata (%d) is not same as the number of"
+ " editable video tracks (%d)",
auxiliaryTrackTypesForEditableVideoTracks.size(),
+ " auxiliary tracks (%d)",
auxiliaryTrackTypesForAuxiliaryTracks.size(),
trackSampleTables.size()));
}
int trackIndex = 0;
@ -748,9 +747,9 @@ public final class Mp4Extractor implements Extractor, SeekMap {
float frameRate = trackSampleTable.sampleCount / (trackDurationUs / 1000000f);
formatBuilder.setFrameRate(frameRate);
}
if (readingEditableVideoTracks) {
if (readingAuxiliaryTracks) {
roleFlags |= C.ROLE_FLAG_AUXILIARY;
formatBuilder.setAuxiliaryTrackType(auxiliaryTrackTypesForEditableVideoTracks.get(i));
formatBuilder.setAuxiliaryTrackType(auxiliaryTrackTypesForAuxiliaryTracks.get(i));
}
formatBuilder.setRoleFlags(roleFlags);
}
@ -780,18 +779,18 @@ public final class Mp4Extractor implements Extractor, SeekMap {
extractorOutput.seekMap(this);
}
private boolean shouldSeekToEdvdAtom(@Nullable Metadata mdtaMetadata) {
private boolean shouldSeekToAxteAtom(@Nullable Metadata mdtaMetadata) {
if (mdtaMetadata == null) {
return false;
}
if ((flags & FLAG_READ_EDITABLE_VIDEO_TRACKS) != 0) {
if ((flags & FLAG_READ_AUXILIARY_TRACKS) != 0) {
@Nullable
MdtaMetadataEntry edvdAtomOffsetMetadata =
findMdtaMetadataEntryWithKey(mdtaMetadata, MdtaMetadataEntry.KEY_EDITABLE_TRACKS_OFFSET);
if (edvdAtomOffsetMetadata != null) {
long offset = new ParsableByteArray(edvdAtomOffsetMetadata.value).readUnsignedLongToLong();
MdtaMetadataEntry axteAtomOffsetMetadata =
findMdtaMetadataEntryWithKey(mdtaMetadata, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_OFFSET);
if (axteAtomOffsetMetadata != null) {
long offset = new ParsableByteArray(axteAtomOffsetMetadata.value).readUnsignedLongToLong();
if (offset > 0) {
edvdAtomOffset = offset;
axteAtomOffset = offset;
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
* (inside edvd atom).
* Sets the sample offset for the auxiliary tracks, if the samples are in the auxiliary tracks MP4
* (inside axte atom).
*/
private void maybeSetDefaultSampleOffsetForEditableVideoTracks(Metadata metadata) {
private void maybeSetDefaultSampleOffsetForAuxiliaryTracks(Metadata metadata) {
@Nullable
MdtaMetadataEntry sampleLocationMetadata =
findMdtaMetadataEntryWithKey(
metadata, MdtaMetadataEntry.KEY_EDITABLE_TRACKS_SAMPLES_LOCATION);
if (sampleLocationMetadata != null) {
if (sampleLocationMetadata.value[0] == EDITABLE_TRACKS_SAMPLES_LOCATION_IN_EDIT_DATA_MP4) {
sampleOffsetForEditableVideoTracks = edvdAtomOffset + 16; // 16 bits for edvd atom header
MdtaMetadataEntry samplesInterleavedMetadata =
findMdtaMetadataEntryWithKey(metadata, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_INTERLEAVED);
if (samplesInterleavedMetadata != null) {
if (samplesInterleavedMetadata.value[0] == AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED) {
sampleOffsetForAuxiliaryTracks = axteAtomOffset + 16; // 16 bits for axte atom header
}
}
}
private List<@C.AuxiliaryTrackType Integer> getAuxiliaryTrackTypesForEditableVideoTracks(
private List<@C.AuxiliaryTrackType Integer> getAuxiliaryTrackTypesForAuxiliaryTracks(
Metadata metadata) {
MdtaMetadataEntry trackTypesMetadata =
checkStateNotNull(
findMdtaMetadataEntryWithKey(metadata, MdtaMetadataEntry.KEY_EDITABLE_TRACKS_MAP));
List<Integer> editableVideoTrackTypes = trackTypesMetadata.getEditableTrackTypesFromMap();
findMdtaMetadataEntryWithKey(metadata, MdtaMetadataEntry.KEY_AUXILIARY_TRACKS_MAP));
List<Integer> auxiliaryTrackTypesFromMap = trackTypesMetadata.getAuxiliaryTrackTypesFromMap();
List<@C.AuxiliaryTrackType Integer> auxiliaryTrackTypes =
new ArrayList<>(editableVideoTrackTypes.size());
for (int i = 0; i < editableVideoTrackTypes.size(); i++) {
new ArrayList<>(auxiliaryTrackTypesFromMap.size());
for (int i = 0; i < auxiliaryTrackTypesFromMap.size(); i++) {
@C.AuxiliaryTrackType int auxiliaryTrackType;
switch (editableVideoTrackTypes.get(i)) {
case EDITABLE_TRACK_TYPE_SHARP:
switch (auxiliaryTrackTypesFromMap.get(i)) {
case MP4_AT_AUXILIARY_TRACK_TYPE_SHARP:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_ORIGINAL;
break;
case EDITABLE_TRACK_TYPE_DEPTH_LINEAR:
case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_LINEAR;
break;
case EDITABLE_TRACK_TYPE_DEPTH_INVERSE:
case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_INVERSE;
break;
case EDITABLE_TRACK_TYPE_DEPTH_METADATA:
case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA:
auxiliaryTrackType = C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA;
break;
default:
@ -872,7 +870,7 @@ public final class Mp4Extractor implements Extractor, SeekMap {
Mp4Track track = tracks[sampleTrackIndex];
TrackOutput trackOutput = track.trackOutput;
int sampleIndex = track.sampleIndex;
long position = track.sampleTable.offsets[sampleIndex] + sampleOffsetForEditableVideoTracks;
long position = track.sampleTable.offsets[sampleIndex] + sampleOffsetForAuxiliaryTracks;
int sampleSize = track.sampleTable.sizes[sampleIndex];
@Nullable TrueHdSampleRechunker trueHdSampleRechunker = track.trueHdSampleRechunker;
long skipAmount = position - inputPosition + sampleBytesRead;
@ -1226,7 +1224,7 @@ public final class Mp4Extractor implements Extractor, SeekMap {
|| atom == Mp4Box.TYPE_stbl
|| atom == Mp4Box.TYPE_edts
|| atom == Mp4Box.TYPE_meta
|| atom == Mp4Box.TYPE_edvd;
|| atom == Mp4Box.TYPE_axte;
}
private static final class Mp4Track {

View File

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

View File

@ -229,14 +229,14 @@ public final class Mp4ExtractorParameterizedTest {
}
@Test
public void mp4WithEditableVideoTracks() throws Exception {
assertExtractorBehavior("media/mp4/sample_with_fake_editable_video_tracks.mp4");
public void mp4WithAuxiliaryTracks() throws Exception {
assertExtractorBehavior("media/mp4/sample_with_fake_auxiliary_tracks.mp4");
}
@Test
public void mp4WithEditableVideoTracksInterleavedWithPrimaryVideoTracks() throws Exception {
public void mp4WithAuxiliaryTracksInterleavedWithPrimaryVideoTracks() throws Exception {
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 {

View File

@ -1279,14 +1279,14 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
return BoxUtils.wrapIntoBox("trex", contents);
}
/** Returns the edvd box header. */
public static ByteBuffer getEdvdBoxHeader(long payloadSize) {
ByteBuffer edvdBoxHeader = ByteBuffer.allocate(LARGE_SIZE_BOX_HEADER_SIZE);
edvdBoxHeader.putInt(1); // indicating a 64-bit length field
edvdBoxHeader.put(Util.getUtf8Bytes("edvd"));
edvdBoxHeader.putLong(LARGE_SIZE_BOX_HEADER_SIZE + payloadSize); // the actual length
edvdBoxHeader.flip();
return edvdBoxHeader;
/** Returns the axte box header. */
public static ByteBuffer getAxteBoxHeader(long payloadSize) {
ByteBuffer axteBoxHeader = ByteBuffer.allocate(LARGE_SIZE_BOX_HEADER_SIZE);
axteBoxHeader.putInt(1); // indicating a 64-bit length field
axteBoxHeader.put(Util.getUtf8Bytes("axte"));
axteBoxHeader.putLong(LARGE_SIZE_BOX_HEADER_SIZE + payloadSize); // the actual length
axteBoxHeader.flip();
return axteBoxHeader;
}
/** 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.checkState;
import static androidx.media3.muxer.Boxes.LARGE_SIZE_BOX_HEADER_SIZE;
import static androidx.media3.muxer.Boxes.getEdvdBoxHeader;
import static androidx.media3.muxer.MuxerUtil.getEditableTracksLengthMetadata;
import static androidx.media3.muxer.MuxerUtil.getEditableTracksOffsetMetadata;
import static androidx.media3.muxer.MuxerUtil.isEditableVideoTrack;
import static androidx.media3.muxer.Boxes.getAxteBoxHeader;
import static androidx.media3.muxer.MuxerUtil.getAuxiliaryTracksLengthMetadata;
import static androidx.media3.muxer.MuxerUtil.getAuxiliaryTracksOffsetMetadata;
import static androidx.media3.muxer.MuxerUtil.isAuxiliaryTrack;
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 android.media.MediaCodec;
@ -107,8 +107,8 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
*/
@UnstableApi
public final class Mp4Muxer implements Muxer {
/** Parameters for {@link #FILE_FORMAT_EDITABLE_VIDEO}. */
public static final class EditableVideoParameters {
/** Parameters for {@link #FILE_FORMAT_MP4_AT}. */
public static final class Mp4AtFileParameters {
/** Provides temporary cache files to be used by the muxer. */
public interface CacheFileProvider {
@ -129,12 +129,12 @@ public final class Mp4Muxer implements Muxer {
/**
* Creates an instance.
*
* @param shouldInterleaveSamples Whether to interleave editable video track samples with
* primary track samples.
* @param shouldInterleaveSamples Whether to interleave auxiliary track samples with primary
* track samples.
* @param cacheFileProvider A {@link CacheFileProvider}. Required only when {@code
* shouldInterleaveSamples} is set to {@code false}, can be {@code null} otherwise.
*/
public EditableVideoParameters(
public Mp4AtFileParameters(
boolean shouldInterleaveSamples, @Nullable CacheFileProvider cacheFileProvider) {
checkArgument(shouldInterleaveSamples || cacheFileProvider != null);
this.shouldInterleaveSamples = shouldInterleaveSamples;
@ -177,7 +177,7 @@ public final class Mp4Muxer implements Muxer {
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(TYPE_USE)
@IntDef({FILE_FORMAT_DEFAULT, FILE_FORMAT_EDITABLE_VIDEO})
@IntDef({FILE_FORMAT_DEFAULT, FILE_FORMAT_MP4_AT})
public @interface FileFormat {}
/** The default MP4 format. */
@ -185,13 +185,13 @@ public final class Mp4Muxer implements Muxer {
// TODO: b/345219017 - Add spec details.
/**
* The editable video file format. In this file format all the tracks with {@linkplain
* Format#auxiliaryTrackType} set to {@link C#AUXILIARY_TRACK_TYPE_ORIGINAL}, {@link
* C#AUXILIARY_TRACK_TYPE_DEPTH_LINEAR}, {@link C#AUXILIARY_TRACK_TYPE_DEPTH_INVERSE}, or {@link
* C#AUXILIARY_TRACK_TYPE_DEPTH_METADATA} are written in the MP4 edit data (edvd box). The rest of
* the tracks are written as usual.
* The MP4-AT (MP4 With Auxiliary Tracks Extension) file format. In this file format all the
* tracks with {@linkplain Format#auxiliaryTrackType} set to {@link
* C#AUXILIARY_TRACK_TYPE_ORIGINAL}, {@link C#AUXILIARY_TRACK_TYPE_DEPTH_LINEAR}, {@link
* C#AUXILIARY_TRACK_TYPE_DEPTH_INVERSE}, or {@link C#AUXILIARY_TRACK_TYPE_DEPTH_METADATA} are
* 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. */
public static final class Builder {
@ -203,7 +203,7 @@ public final class Mp4Muxer implements Muxer {
private boolean sampleBatchingEnabled;
private boolean attemptStreamableOutputEnabled;
private @FileFormat int outputFileFormat;
@Nullable private EditableVideoParameters editableVideoParameters;
@Nullable private Mp4AtFileParameters mp4AtFileParameters;
/**
* 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>For {@link #FILE_FORMAT_EDITABLE_VIDEO}, {@link EditableVideoParameters} must also be
* {@linkplain #setEditableVideoParameters(EditableVideoParameters)} set}.
* <p>For {@link #FILE_FORMAT_MP4_AT}, {@link Mp4AtFileParameters} must also be {@linkplain
* #setMp4AtFileParameters(Mp4AtFileParameters)} set}.
*/
@CanIgnoreReturnValue
public Mp4Muxer.Builder setOutputFileFormat(@FileFormat int fileFormat) {
@ -306,21 +306,20 @@ public final class Mp4Muxer implements Muxer {
return this;
}
/** Sets the {@link EditableVideoParameters}. */
/** Sets the {@link Mp4AtFileParameters}. */
@CanIgnoreReturnValue
public Mp4Muxer.Builder setEditableVideoParameters(
EditableVideoParameters editableVideoParameters) {
this.editableVideoParameters = editableVideoParameters;
public Mp4Muxer.Builder setMp4AtFileParameters(Mp4AtFileParameters mp4AtFileParameters) {
this.mp4AtFileParameters = mp4AtFileParameters;
return this;
}
/** Builds an {@link Mp4Muxer} instance. */
public Mp4Muxer build() {
checkArgument(
outputFileFormat == FILE_FORMAT_EDITABLE_VIDEO
? editableVideoParameters != null
: editableVideoParameters == null,
"EditablevideoParameters must be set for FILE_FORMAT_EDITABLE_VIDEO");
outputFileFormat == FILE_FORMAT_MP4_AT
? mp4AtFileParameters != null
: mp4AtFileParameters == null,
"Mp4AtFileParameters must be set for FILE_FORMAT_MP4_AT");
return new Mp4Muxer(
outputStream,
lastSampleDurationBehavior,
@ -329,7 +328,7 @@ public final class Mp4Muxer implements Muxer {
sampleBatchingEnabled,
attemptStreamableOutputEnabled,
outputFileFormat,
editableVideoParameters);
mp4AtFileParameters);
}
}
@ -343,15 +342,15 @@ public final class Mp4Muxer implements Muxer {
private final boolean sampleBatchingEnabled;
private final boolean attemptStreamableOutputEnabled;
private final @FileFormat int outputFileFormat;
@Nullable private final EditableVideoParameters editableVideoParameters;
@Nullable private final Mp4AtFileParameters mp4AtFileParameters;
private final MetadataCollector metadataCollector;
private final Mp4Writer mp4Writer;
private final List<Track> editableVideoTracks;
private final List<Track> auxiliaryTracks;
@Nullable private String cacheFilePath;
@Nullable private FileOutputStream cacheFileOutputStream;
@Nullable private MetadataCollector editableVideoMetadataCollector;
@Nullable private Mp4Writer editableVideoMp4Writer;
@Nullable private MetadataCollector auxiliaryTracksMetadataCollector;
@Nullable private Mp4Writer auxiliaryTracksMp4Writer;
private Mp4Muxer(
FileOutputStream outputStream,
@ -361,7 +360,7 @@ public final class Mp4Muxer implements Muxer {
boolean sampleBatchingEnabled,
boolean attemptStreamableOutputEnabled,
@FileFormat int outputFileFormat,
@Nullable EditableVideoParameters editableVideoParameters) {
@Nullable Mp4AtFileParameters mp4AtFileParameters) {
this.outputStream = outputStream;
outputChannel = outputStream.getChannel();
this.lastSampleDurationBehavior = lastFrameDurationBehavior;
@ -370,7 +369,7 @@ public final class Mp4Muxer implements Muxer {
this.sampleBatchingEnabled = sampleBatchingEnabled;
this.attemptStreamableOutputEnabled = attemptStreamableOutputEnabled;
this.outputFileFormat = outputFileFormat;
this.editableVideoParameters = editableVideoParameters;
this.mp4AtFileParameters = mp4AtFileParameters;
metadataCollector = new MetadataCollector();
mp4Writer =
new Mp4Writer(
@ -381,7 +380,7 @@ public final class Mp4Muxer implements Muxer {
sampleCopyEnabled,
sampleBatchingEnabled,
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.
*/
public TrackToken addTrack(int sortKey, Format format) throws MuxerException {
if (outputFileFormat == FILE_FORMAT_EDITABLE_VIDEO && isEditableVideoTrack(format)) {
if (checkNotNull(editableVideoParameters).shouldInterleaveSamples) {
// Editable video tracks are handled by the primary Mp4Writer.
return mp4Writer.addEditableVideoTrack(sortKey, format);
if (outputFileFormat == FILE_FORMAT_MP4_AT && isAuxiliaryTrack(format)) {
if (checkNotNull(mp4AtFileParameters).shouldInterleaveSamples) {
// Auxiliary tracks are handled by the primary Mp4Writer.
return mp4Writer.addAuxiliaryTrack(sortKey, format);
}
try {
ensureSetupForEditableVideoTracks();
ensureSetupForAuxiliaryTracks();
} catch (FileNotFoundException e) {
throw new MuxerException("Cache file not found", e);
}
Track track = editableVideoMp4Writer.addTrack(sortKey, format);
editableVideoTracks.add(track);
Track track = auxiliaryTracksMp4Writer.addTrack(sortKey, format);
auxiliaryTracks.add(track);
return track;
}
return mp4Writer.addTrack(sortKey, format);
@ -458,8 +457,8 @@ public final class Mp4Muxer implements Muxer {
checkState(trackToken instanceof Track);
Track track = (Track) trackToken;
try {
if (editableVideoTracks.contains(trackToken)) {
checkNotNull(editableVideoMp4Writer).writeSampleData(track, byteBuffer, bufferInfo);
if (auxiliaryTracks.contains(trackToken)) {
checkNotNull(auxiliaryTracksMp4Writer).writeSampleData(track, byteBuffer, bufferInfo);
} else {
mp4Writer.writeSampleData(track, byteBuffer, bufferInfo);
}
@ -502,9 +501,9 @@ public final class Mp4Muxer implements Muxer {
public void close() throws MuxerException {
@Nullable MuxerException exception = null;
try {
finishWritingEditableVideoTracks();
finishWritingAuxiliaryTracks();
finishWritingPrimaryVideoTracks();
appendEditableVideoTracksDataToTheOutputFile();
appendAuxiliaryTracksDataToTheOutputFile();
} catch (IOException e) {
exception = new MuxerException("Failed to finish writing data", e);
}
@ -533,17 +532,17 @@ public final class Mp4Muxer implements Muxer {
}
}
@EnsuresNonNull({"editableVideoMp4Writer"})
private void ensureSetupForEditableVideoTracks() throws FileNotFoundException {
if (editableVideoMp4Writer == null) {
@EnsuresNonNull({"auxiliaryTracksMp4Writer"})
private void ensureSetupForAuxiliaryTracks() throws FileNotFoundException {
if (auxiliaryTracksMp4Writer == null) {
cacheFilePath =
checkNotNull(checkNotNull(editableVideoParameters).cacheFileProvider).getCacheFilePath();
checkNotNull(checkNotNull(mp4AtFileParameters).cacheFileProvider).getCacheFilePath();
cacheFileOutputStream = new FileOutputStream(cacheFilePath);
editableVideoMetadataCollector = new MetadataCollector();
editableVideoMp4Writer =
auxiliaryTracksMetadataCollector = new MetadataCollector();
auxiliaryTracksMp4Writer =
new Mp4Writer(
cacheFileOutputStream.getChannel(),
checkNotNull(editableVideoMetadataCollector),
checkNotNull(auxiliaryTracksMetadataCollector),
annexBToAvccConverter,
lastSampleDurationBehavior,
sampleCopyEnabled,
@ -552,48 +551,48 @@ public final class Mp4Muxer implements Muxer {
}
}
private void finishWritingEditableVideoTracks() throws IOException {
if (editableVideoMp4Writer == null) {
// Editable video tracks were not added.
private void finishWritingAuxiliaryTracks() throws IOException {
if (auxiliaryTracksMp4Writer == null) {
// Auxiliary tracks were not added.
return;
}
populateEditableVideoTracksMetadata(
checkNotNull(editableVideoMetadataCollector),
populateAuxiliaryTracksMetadata(
checkNotNull(auxiliaryTracksMetadataCollector),
metadataCollector.timestampData,
/* samplesInterleaved= */ false,
editableVideoTracks);
checkNotNull(editableVideoMp4Writer).finishWritingSamplesAndFinalizeMoovBox();
auxiliaryTracks);
checkNotNull(auxiliaryTracksMp4Writer).finishWritingSamplesAndFinalizeMoovBox();
}
private void finishWritingPrimaryVideoTracks() throws IOException {
// The exact offset is known after writing all the data in mp4Writer.
MdtaMetadataEntry placeholderEditableTrackOffset = getEditableTracksOffsetMetadata(0L);
if (editableVideoMp4Writer != null) {
long editableVideoDataSize = checkNotNull(cacheFileOutputStream).getChannel().size();
long edvdBoxSize = LARGE_SIZE_BOX_HEADER_SIZE + editableVideoDataSize;
metadataCollector.addMetadata(getEditableTracksLengthMetadata(edvdBoxSize));
metadataCollector.addMetadata(placeholderEditableTrackOffset);
MdtaMetadataEntry placeholderAuxiliaryTracksOffset = getAuxiliaryTracksOffsetMetadata(0L);
if (auxiliaryTracksMp4Writer != null) {
long auxiliaryTracksDataSize = checkNotNull(cacheFileOutputStream).getChannel().size();
long axteBoxSize = LARGE_SIZE_BOX_HEADER_SIZE + auxiliaryTracksDataSize;
metadataCollector.addMetadata(getAuxiliaryTracksLengthMetadata(axteBoxSize));
metadataCollector.addMetadata(placeholderAuxiliaryTracksOffset);
}
mp4Writer.finishWritingSamplesAndFinalizeMoovBox();
if (editableVideoMp4Writer != null) {
if (auxiliaryTracksMp4Writer != null) {
long primaryVideoDataSize = outputChannel.size();
metadataCollector.removeMdtaMetadataEntry(placeholderEditableTrackOffset);
metadataCollector.addMetadata(getEditableTracksOffsetMetadata(primaryVideoDataSize));
metadataCollector.removeMdtaMetadataEntry(placeholderAuxiliaryTracksOffset);
metadataCollector.addMetadata(getAuxiliaryTracksOffsetMetadata(primaryVideoDataSize));
mp4Writer.finalizeMoovBox();
checkState(
outputChannel.size() == primaryVideoDataSize,
"The editable tracks offset should remain the same");
"The auxiliary tracks offset should remain the same");
}
}
private void appendEditableVideoTracksDataToTheOutputFile() throws IOException {
if (editableVideoMp4Writer == null) {
// Editable video tracks were not added.
private void appendAuxiliaryTracksDataToTheOutputFile() throws IOException {
if (auxiliaryTracksMp4Writer == null) {
// Auxiliary tracks were not added.
return;
}
outputChannel.position(outputChannel.size());
FileInputStream inputStream = new FileInputStream(checkNotNull(cacheFilePath));
outputChannel.write(getEdvdBoxHeader(inputStream.getChannel().size()));
outputChannel.write(getAxteBoxHeader(inputStream.getChannel().size()));
ByteStreams.copy(inputStream, outputStream);
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.Boxes.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.MuxerUtil.getEditableTracksLengthMetadata;
import static androidx.media3.muxer.MuxerUtil.getEditableTracksOffsetMetadata;
import static androidx.media3.muxer.MuxerUtil.populateEditableVideoTracksMetadata;
import static androidx.media3.muxer.Boxes.getAxteBoxHeader;
import static androidx.media3.muxer.MuxerUtil.getAuxiliaryTracksLengthMetadata;
import static androidx.media3.muxer.MuxerUtil.getAuxiliaryTracksOffsetMetadata;
import static androidx.media3.muxer.MuxerUtil.populateAuxiliaryTracksMetadata;
import static java.lang.Math.max;
import static java.lang.Math.min;
@ -55,7 +55,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
private final boolean sampleCopyEnabled;
private final boolean sampleBatchingEnabled;
private final List<Track> tracks;
private final List<Track> editableVideoTracks;
private final List<Track> auxiliaryTracks;
private final AtomicBoolean hasWrittenSamples;
// 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.sampleBatchingEnabled = sampleBatchingEnabled;
tracks = new ArrayList<>();
editableVideoTracks = new ArrayList<>();
auxiliaryTracks = new ArrayList<>();
hasWrittenSamples = new AtomicBoolean(false);
canWriteMoovAtStart = attemptStreamableOutputEnabled;
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 format The {@link Format} for the track.
* @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);
editableVideoTracks.add(track);
Collections.sort(editableVideoTracks, (a, b) -> Integer.compare(a.sortKey, b.sortKey));
auxiliaryTracks.add(track);
Collections.sort(auxiliaryTracks, (a, b) -> Integer.compare(a.sortKey, b.sortKey));
return track;
}
@ -175,8 +175,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
for (int i = 0; i < tracks.size(); i++) {
writePendingTrackSamples(tracks.get(i));
}
for (int i = 0; i < editableVideoTracks.size(); i++) {
writePendingTrackSamples(editableVideoTracks.get(i));
for (int i = 0; i < auxiliaryTracks.size(); i++) {
writePendingTrackSamples(auxiliaryTracks.get(i));
}
// Leave the file empty if no samples are written.
@ -186,48 +186,48 @@ import java.util.concurrent.atomic.AtomicBoolean;
finalizeMoovBox();
if (!editableVideoTracks.isEmpty()) {
writeEdvdBox();
if (!auxiliaryTracks.isEmpty()) {
writeAxteBox();
}
}
private void writeEdvdBox() throws IOException {
private void writeAxteBox() throws IOException {
// The exact offset is known after writing primary track data.
MdtaMetadataEntry placeholderEditableTrackOffset =
getEditableTracksOffsetMetadata(/* offset= */ 0L);
metadataCollector.addMetadata(placeholderEditableTrackOffset);
ByteBuffer edvdBox = getEdvdBox();
metadataCollector.addMetadata(getEditableTracksLengthMetadata(edvdBox.remaining()));
MdtaMetadataEntry placeholderAuxiliaryTrackOffset =
getAuxiliaryTracksOffsetMetadata(/* offset= */ 0L);
metadataCollector.addMetadata(placeholderAuxiliaryTrackOffset);
ByteBuffer axteBox = getAxteBox();
metadataCollector.addMetadata(getAuxiliaryTracksLengthMetadata(axteBox.remaining()));
finalizeMoovBox();
// Once final moov is written, update the actual offset.
metadataCollector.removeMdtaMetadataEntry(placeholderEditableTrackOffset);
metadataCollector.addMetadata(getEditableTracksOffsetMetadata(outputFileChannel.size()));
metadataCollector.removeMdtaMetadataEntry(placeholderAuxiliaryTrackOffset);
metadataCollector.addMetadata(getAuxiliaryTracksOffsetMetadata(outputFileChannel.size()));
long fileSizeBefore = outputFileChannel.size();
finalizeMoovBox();
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.write(edvdBox);
outputFileChannel.write(axteBox);
}
private ByteBuffer getEdvdBox() {
// The edvd box will have one ftyp and one moov box.
private ByteBuffer getAxteBox() {
// The axte box will have one ftyp and one moov box.
ByteBuffer ftypBox = Boxes.ftyp();
MetadataCollector editableVideoMetadataCollector = new MetadataCollector();
populateEditableVideoTracksMetadata(
editableVideoMetadataCollector,
MetadataCollector auxiliaryTracksMetadataCollector = new MetadataCollector();
populateAuxiliaryTracksMetadata(
auxiliaryTracksMetadataCollector,
metadataCollector.timestampData,
/* samplesInterleaved= */ true,
editableVideoTracks);
auxiliaryTracks);
ByteBuffer moovBox =
Boxes.moov(
editableVideoTracks,
editableVideoMetadataCollector,
auxiliaryTracks,
auxiliaryTracksMetadataCollector,
/* isFragmentedMp4= */ false,
lastSampleDurationBehavior);
ByteBuffer edvdBoxHeader =
getEdvdBoxHeader(/* payloadSize= */ ftypBox.remaining() + moovBox.remaining());
return BoxUtils.concatenateBuffers(edvdBoxHeader, ftypBox, moovBox);
ByteBuffer axteBoxHeader =
getAxteBoxHeader(/* payloadSize= */ ftypBox.remaining() + moovBox.remaining());
return BoxUtils.concatenateBuffers(axteBoxHeader, ftypBox, moovBox);
}
/**
@ -501,7 +501,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
private void doInterleave() throws IOException {
boolean primaryTrackSampleWritten = maybeWritePendingTrackSamples(tracks);
maybeWritePendingTrackSamples(editableVideoTracks);
maybeWritePendingTrackSamples(auxiliaryTracks);
if (primaryTrackSampleWritten && canWriteMoovAtStart) {
maybeWriteMoovAtStart();

View File

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

View File

@ -416,7 +416,7 @@ public class Mp4MuxerEndToEndTest {
}
@Test
public void createMp4Muxer_withFileFormatEditableVideoButWithoutCacheFileProvider_throws()
public void createMp4Muxer_withFileFormatMp4AtButWithoutCacheFileProvider_throws()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath();
@ -424,20 +424,19 @@ public class Mp4MuxerEndToEndTest {
IllegalArgumentException.class,
() ->
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO)
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.build());
}
@Test
public void writeMp4File_withFileFormatEditableVideoAndEditableVideoTracks_writesEdvdBox()
throws Exception {
public void writeMp4File_withFileFormatMp4AtAndAuxiliaryTracks_writesAxteBox() throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO)
.setEditableVideoParameters(
new Mp4Muxer.EditableVideoParameters(
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath))
.build();
@ -470,15 +469,15 @@ public class Mp4MuxerEndToEndTest {
DumpableMp4Box outputFileDumpableBox =
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(
context,
outputFileDumpableBox,
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_editable_video_tracks_in_edvd.box"));
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_auxiliary_tracks_in_axte.box"));
}
@Test
public void writeMp4File_withFileFormatDefaultAndEditableVideoTracks_doesNotWriteEdvdBox()
public void writeMp4File_withFileFormatDefaultAndAuxiliaryTracks_doesNotWriteAxteBox()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build();
@ -512,24 +511,24 @@ public class Mp4MuxerEndToEndTest {
DumpableMp4Box outputFileDumpableBox =
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(
context,
outputFileDumpableBox,
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_editable_video_tracks_without_edvd.box"));
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_auxiliary_tracks_without_axte.box"));
}
@Test
public void
writeMp4File_withFileFormatEditableVideoAndEditableVideoTracks_primaryVideoTracksMatchesExpected()
writeMp4File_withFileFormatMp4AtAndAuxiliaryVideoTracks_primaryVideoTracksMatchesExpected()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO)
.setEditableVideoParameters(
new Mp4Muxer.EditableVideoParameters(
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath))
.build();
@ -571,16 +570,15 @@ public class Mp4MuxerEndToEndTest {
}
@Test
public void
writeMp4File_withFileFormatEditableVideoAndEditableVideoTracks_editableVideoTracksMatchesExpected()
public void writeMp4File_withFileFormatMp4AtAndAuxiliaryTracks_auxiliaryTracksMatchesExpected()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO)
.setEditableVideoParameters(
new Mp4Muxer.EditableVideoParameters(
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath))
.build();
@ -611,27 +609,27 @@ public class Mp4MuxerEndToEndTest {
muxer.close();
}
FakeExtractorOutput editableTracksOutput =
FakeExtractorOutput auxiliaryTracksOutput =
TestUtil.extractAllSamplesFromFilePath(
new Mp4Extractor(
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_EDITABLE_VIDEO_TRACKS),
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_AUXILIARY_TRACKS),
outputFilePath);
DumpFileAsserts.assertOutput(
context,
editableTracksOutput,
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_editable_video_tracks.mp4"));
auxiliaryTracksOutput,
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_auxiliary_tracks.mp4"));
}
@Test
public void
writeMp4File_withFileFormatEditableVideoAndEditableVideoTracksAndShouldInterleaveSamples_primaryVideoTracksMatchesExpected()
writeMp4File_withFileFormatMp4AtAndAuxiliaryTracksAndShouldInterleaveSamples_primaryVideoTracksMatchesExpected()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO)
.setEditableVideoParameters(
new Mp4Muxer.EditableVideoParameters(
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null))
.build();
@ -670,19 +668,19 @@ public class Mp4MuxerEndToEndTest {
context,
primaryTracksOutput,
MuxerTestUtil.getExpectedDumpFilePath(
"mp4_with_primary_tracks_when_editable_track_samples_interleaved.mp4"));
"mp4_with_primary_tracks_when_auxiliary_track_samples_interleaved.mp4"));
}
@Test
public void
writeMp4File_withFileFormatEditableVideoAndEditableVideoTracksAndShouldInterleaveSamples_editableVideoTracksMatchesExpected()
writeMp4File_withFileFormatMp4AtAndAuxiliaryTracksAndShouldInterleaveSamples_auxiliaryTracksMatchesExpected()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_EDITABLE_VIDEO)
.setEditableVideoParameters(
new Mp4Muxer.EditableVideoParameters(
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT)
.setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null))
.build();
@ -713,16 +711,16 @@ public class Mp4MuxerEndToEndTest {
muxer.close();
}
FakeExtractorOutput editableTracksOutput =
FakeExtractorOutput auxiliaryTracksOutput =
TestUtil.extractAllSamplesFromFilePath(
new Mp4Extractor(
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_EDITABLE_VIDEO_TRACKS),
new DefaultSubtitleParserFactory(), Mp4Extractor.FLAG_READ_AUXILIARY_TRACKS),
outputFilePath);
DumpFileAsserts.assertOutput(
context,
editableTracksOutput,
auxiliaryTracksOutput,
MuxerTestUtil.getExpectedDumpFilePath(
"mp4_with_editable_video_tracks_when_editable_track_samples_interleaved.mp4"));
"mp4_with_auxiliary_tracks_when_auxiliary_track_samples_interleaved.mp4"));
}
@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
roleFlags = [auxiliary]
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:
data = length 28, hash 410B510
data = length 9, hash FBADD682
@ -68,7 +68,7 @@ track 1:
chromaBitdepth = 8
roleFlags = [auxiliary]
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:
data = length 28, hash 410B510
data = length 9, hash FBADD682

View File

@ -23,7 +23,7 @@ track 0:
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]
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

View File

@ -23,7 +23,7 @@ track 0:
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]
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

View File

@ -23,7 +23,7 @@ track 0:
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]
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

View File

@ -23,7 +23,7 @@ track 0:
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]
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

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
roleFlags = [auxiliary]
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:
data = length 28, hash 410B510
data = length 9, hash FBADD682
@ -68,7 +68,7 @@ track 1:
chromaBitdepth = 8
roleFlags = [auxiliary]
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:
data = length 28, hash 410B510
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
roleFlags = [auxiliary]
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:
data = length 28, hash 410B510
data = length 9, hash FBADD682
@ -68,7 +68,7 @@ track 1:
chromaBitdepth = 8
roleFlags = [auxiliary]
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:
data = length 28, hash 410B510
data = length 9, hash FBADD682

View File

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

View File

@ -25,7 +25,7 @@ track 0:
chromaBitdepth = 8
roleFlags = [auxiliary]
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:
data = length 28, hash 410B510
data = length 9, hash FBADD682
@ -68,7 +68,7 @@ track 1:
chromaBitdepth = 8
roleFlags = [auxiliary]
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:
data = length 28, hash 410B510
data = length 9, hash FBADD682

View File

@ -23,7 +23,7 @@ track 0:
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]
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

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 {
private static final ImmutableSet<String> CONTAINER_BOXES =
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;
/***