mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
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:
parent
1d2ffcb165
commit
0a75447785
@ -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 track’s 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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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() {}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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()
|
||||
throws Exception {
|
||||
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) {
|
||||
|
@ -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 {
|
||||
|
@ -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. */
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -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()
|
||||
throws Exception {
|
||||
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
|
||||
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
Binary file not shown.
Binary file not shown.
@ -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
|
@ -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
|
@ -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
|
@ -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
|
||||
|
@ -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
|
@ -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
|
@ -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;
|
||||
|
||||
/***
|
||||
|
Loading…
x
Reference in New Issue
Block a user