Fix some MP4-AT file format related naming

Also add spec link in the code.

PiperOrigin-RevId: 704329143
This commit is contained in:
sheenachhabra 2024-12-09 10:11:12 -08:00 committed by Copybara-Service
parent 459162c692
commit e017213ee8
6 changed files with 45 additions and 90 deletions

View file

@ -41,7 +41,8 @@ public final class MdtaMetadataEntry implements Metadata.Entry {
/** Key for the capture frame rate (in frames per second). */ /** Key for the capture frame rate (in frames per second). */
public static final String KEY_ANDROID_CAPTURE_FPS = "com.android.capture.fps"; public static final String KEY_ANDROID_CAPTURE_FPS = "com.android.capture.fps";
// TODO: b/345219017 - Add depth/editing file format spec link after its published. // See the MP4 With Auxiliary Tracks Extension (MP4-AT) file format at
// https://developer.android.com/media/platform/mp4-at-file-format.
/** Key for auxiliary tracks extension box (axte) offset. */ /** Key for auxiliary tracks extension box (axte) offset. */
public static final String KEY_AUXILIARY_TRACKS_OFFSET = "auxiliary.tracks.offset"; public static final String KEY_AUXILIARY_TRACKS_OFFSET = "auxiliary.tracks.offset";

View file

@ -1,46 +0,0 @@
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.media3.container;
import androidx.media3.common.util.UnstableApi;
/** Utility methods for MP4 containers. */
@UnstableApi
public final class Mp4Util {
/** The original video track without any depth based effects applied. */
public static final int MP4_AT_AUXILIARY_TRACK_TYPE_SHARP = 0;
/**
* A linear encoded depth video track.
*
* <p>See https://developer.android.com/static/media/camera/camera2/Dynamic-depth-v1.0.pdf for
* linear depth encoding.
*/
public static final int MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR = 1;
/**
* An inverse encoded depth video track.
*
* <p>See https://developer.android.com/static/media/camera/camera2/Dynamic-depth-v1.0.pdf for
* inverse depth encoding.
*/
public static final int MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE = 2;
/** A timed metadata of depth video track. */
public static final int MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA = 3;
private Mp4Util() {}
}

View file

@ -24,10 +24,6 @@ import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Assertions.checkStateNotNull; import static androidx.media3.common.util.Assertions.checkStateNotNull;
import static androidx.media3.common.util.Util.castNonNull; import static androidx.media3.common.util.Util.castNonNull;
import static androidx.media3.container.MdtaMetadataEntry.AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED; 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.BoxParser.parseTraks;
import static androidx.media3.extractor.mp4.MetadataUtil.findMdtaMetadataEntryWithKey; import static androidx.media3.extractor.mp4.MetadataUtil.findMdtaMetadataEntryWithKey;
import static androidx.media3.extractor.mp4.MimeTypeResolver.getContainerMimeType; import static androidx.media3.extractor.mp4.MimeTypeResolver.getContainerMimeType;
@ -160,15 +156,17 @@ public final class Mp4Extractor implements Extractor, SeekMap {
*/ */
public static final int FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES = 1 << 5; public static final int FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES = 1 << 5;
// TODO: b/345219017 - Add depth/editing file format spec link after its published.
/** /**
* Flag to extract the auxiliary tracks. * Flag to extract the auxiliary tracks from the MP4 With Auxiliary Tracks Extension (MP4-AT) file
* format.
* *
* <p>Either primary video tracks or auxiliary tracks (but not both) will be extracted based on * <p>Either primary video tracks or auxiliary tracks (but not both) will be extracted based on
* the flag. * the flag.
* *
* <p>If the flag is set but the auxiliary tracks are not present, then it fallbacks to extract * <p>If the flag is set but the auxiliary tracks are not present, then it fallbacks to extract
* primary tracks instead. * primary tracks instead.
*
* <p>See the file format at https://developer.android.com/media/platform/mp4-at-file-format.
*/ */
public static final int FLAG_READ_AUXILIARY_TRACKS = 1 << 6; public static final int FLAG_READ_AUXILIARY_TRACKS = 1 << 6;
@ -824,16 +822,16 @@ public final class Mp4Extractor implements Extractor, SeekMap {
for (int i = 0; i < auxiliaryTrackTypesFromMap.size(); i++) { for (int i = 0; i < auxiliaryTrackTypesFromMap.size(); i++) {
@C.AuxiliaryTrackType int auxiliaryTrackType; @C.AuxiliaryTrackType int auxiliaryTrackType;
switch (auxiliaryTrackTypesFromMap.get(i)) { switch (auxiliaryTrackTypesFromMap.get(i)) {
case MP4_AT_AUXILIARY_TRACK_TYPE_SHARP: case 0:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_ORIGINAL; auxiliaryTrackType = AUXILIARY_TRACK_TYPE_ORIGINAL;
break; break;
case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR: case 1:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_LINEAR; auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_LINEAR;
break; break;
case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE: case 2:
auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_INVERSE; auxiliaryTrackType = AUXILIARY_TRACK_TYPE_DEPTH_INVERSE;
break; break;
case MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA: case 3:
auxiliaryTrackType = C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA; auxiliaryTrackType = C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA;
break; break;
default: default:

View file

@ -107,7 +107,7 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
*/ */
@UnstableApi @UnstableApi
public final class Mp4Muxer implements Muxer { public final class Mp4Muxer implements Muxer {
/** Parameters for {@link #FILE_FORMAT_MP4_AT}. */ /** Parameters for {@link #FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION}. */
public static final class Mp4AtFileParameters { public static final class Mp4AtFileParameters {
/** Provides temporary cache files to be used by the muxer. */ /** Provides temporary cache files to be used by the muxer. */
public interface CacheFileProvider { public interface CacheFileProvider {
@ -177,21 +177,22 @@ public final class Mp4Muxer implements Muxer {
@Documented @Documented
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@Target(TYPE_USE) @Target(TYPE_USE)
@IntDef({FILE_FORMAT_DEFAULT, FILE_FORMAT_MP4_AT}) @IntDef({FILE_FORMAT_DEFAULT, FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION})
public @interface FileFormat {} public @interface FileFormat {}
/** The default MP4 format. */ /** The default MP4 format. */
public static final int FILE_FORMAT_DEFAULT = 0; public static final int FILE_FORMAT_DEFAULT = 0;
// TODO: b/345219017 - Add spec details.
/** /**
* The MP4-AT (MP4 With Auxiliary Tracks Extension) file format. In this file format all the * The MP4 With Auxiliary Tracks Extension (MP4-AT) file format. In this file format all the
* tracks with {@linkplain Format#auxiliaryTrackType} set to {@link * 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_ORIGINAL}, {@link C#AUXILIARY_TRACK_TYPE_DEPTH_LINEAR}, {@link
* C#AUXILIARY_TRACK_TYPE_DEPTH_INVERSE}, or {@link C#AUXILIARY_TRACK_TYPE_DEPTH_METADATA} are * 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. * written in the Auxiliary Tracks MP4 (axte box). The rest of the tracks are written as usual.
*
* <p>See the file format at https://developer.android.com/media/platform/mp4-at-file-format.
*/ */
public static final int FILE_FORMAT_MP4_AT = 1; public static final int FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION = 1;
/** A builder for {@link Mp4Muxer} instances. */ /** A builder for {@link Mp4Muxer} instances. */
public static final class Builder { public static final class Builder {
@ -297,8 +298,8 @@ public final class Mp4Muxer implements Muxer {
* *
* <p>The default value is {@link #FILE_FORMAT_DEFAULT}. * <p>The default value is {@link #FILE_FORMAT_DEFAULT}.
* *
* <p>For {@link #FILE_FORMAT_MP4_AT}, {@link Mp4AtFileParameters} must also be {@linkplain * <p>For {@link #FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION}, {@link Mp4AtFileParameters}
* #setMp4AtFileParameters(Mp4AtFileParameters)} set}. * must also be {@linkplain #setMp4AtFileParameters(Mp4AtFileParameters)} set}.
*/ */
@CanIgnoreReturnValue @CanIgnoreReturnValue
public Mp4Muxer.Builder setOutputFileFormat(@FileFormat int fileFormat) { public Mp4Muxer.Builder setOutputFileFormat(@FileFormat int fileFormat) {
@ -316,10 +317,10 @@ public final class Mp4Muxer implements Muxer {
/** Builds an {@link Mp4Muxer} instance. */ /** Builds an {@link Mp4Muxer} instance. */
public Mp4Muxer build() { public Mp4Muxer build() {
checkArgument( checkArgument(
outputFileFormat == FILE_FORMAT_MP4_AT outputFileFormat == FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION
? mp4AtFileParameters != null ? mp4AtFileParameters != null
: mp4AtFileParameters == null, : mp4AtFileParameters == null,
"Mp4AtFileParameters must be set for FILE_FORMAT_MP4_AT"); "Mp4AtFileParameters must be set for FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION");
return new Mp4Muxer( return new Mp4Muxer(
outputStream, outputStream,
lastSampleDurationBehavior, lastSampleDurationBehavior,
@ -416,7 +417,8 @@ public final class Mp4Muxer implements Muxer {
* @throws MuxerException If an error occurs while adding track. * @throws MuxerException If an error occurs while adding track.
*/ */
public TrackToken addTrack(int sortKey, Format format) throws MuxerException { public TrackToken addTrack(int sortKey, Format format) throws MuxerException {
if (outputFileFormat == FILE_FORMAT_MP4_AT && isAuxiliaryTrack(format)) { if (outputFileFormat == FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION
&& isAuxiliaryTrack(format)) {
if (checkNotNull(mp4AtFileParameters).shouldInterleaveSamples) { if (checkNotNull(mp4AtFileParameters).shouldInterleaveSamples) {
// Auxiliary tracks are handled by the primary Mp4Writer. // Auxiliary tracks are handled by the primary Mp4Writer.
return mp4Writer.addAuxiliaryTrack(sortKey, format); return mp4Writer.addAuxiliaryTrack(sortKey, format);

View file

@ -18,10 +18,6 @@ package androidx.media3.muxer;
import static androidx.media3.container.MdtaMetadataEntry.AUXILIARY_TRACKS_SAMPLES_INTERLEAVED; 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.AUXILIARY_TRACKS_SAMPLES_NOT_INTERLEAVED;
import static androidx.media3.container.MdtaMetadataEntry.TYPE_INDICATOR_8_BIT_UNSIGNED_INT; import static androidx.media3.container.MdtaMetadataEntry.TYPE_INDICATOR_8_BIT_UNSIGNED_INT;
import static androidx.media3.container.Mp4Util.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.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
@ -134,16 +130,16 @@ public final class MuxerUtil {
int trackType; int trackType;
switch (track.format.auxiliaryTrackType) { switch (track.format.auxiliaryTrackType) {
case C.AUXILIARY_TRACK_TYPE_ORIGINAL: case C.AUXILIARY_TRACK_TYPE_ORIGINAL:
trackType = MP4_AT_AUXILIARY_TRACK_TYPE_SHARP; trackType = 0;
break; break;
case C.AUXILIARY_TRACK_TYPE_DEPTH_LINEAR: case C.AUXILIARY_TRACK_TYPE_DEPTH_LINEAR:
trackType = MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_LINEAR; trackType = 1;
break; break;
case C.AUXILIARY_TRACK_TYPE_DEPTH_INVERSE: case C.AUXILIARY_TRACK_TYPE_DEPTH_INVERSE:
trackType = MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_INVERSE; trackType = 2;
break; break;
case C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA: case C.AUXILIARY_TRACK_TYPE_DEPTH_METADATA:
trackType = MP4_AT_AUXILIARY_TRACK_TYPE_DEPTH_METADATA; trackType = 3;
break; break;
default: default:
throw new IllegalArgumentException( throw new IllegalArgumentException(

View file

@ -416,25 +416,28 @@ public class Mp4MuxerEndToEndTest {
} }
@Test @Test
public void createMp4Muxer_withFileFormatMp4AtButWithoutCacheFileProvider_throws() public void
throws Exception { createMp4Muxer_withMp4WithAuxiliaryTracksExtensionFileFormatButWithoutCacheFileProvider_throws()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
assertThrows( assertThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> () ->
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION)
.build()); .build());
} }
@Test @Test
public void writeMp4File_withFileFormatMp4AtAndAuxiliaryTracks_writesAxteBox() throws Exception { public void
writeMp4File_withMp4WithAuxiliaryTracksExtensionFileFormatAndAuxiliaryTracks_writesAxteBox()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath(); String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION)
.setMp4AtFileParameters( .setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath)) /* shouldInterleaveSamples= */ false, () -> cacheFilePath))
@ -477,7 +480,7 @@ public class Mp4MuxerEndToEndTest {
} }
@Test @Test
public void writeMp4File_withFileFormatDefaultAndAuxiliaryTracks_doesNotWriteAxteBox() public void writeMp4File_withDefaultFileFormatAndAuxiliaryTracks_doesNotWriteAxteBox()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build(); Mp4Muxer muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build();
@ -520,13 +523,13 @@ public class Mp4MuxerEndToEndTest {
@Test @Test
public void public void
writeMp4File_withFileFormatMp4AtAndAuxiliaryVideoTracks_primaryVideoTracksMatchesExpected() writeMp4File_withMp4WithAuxiliaryTracksExtensionFileFormatAndAuxiliaryVideoTracks_primaryVideoTracksMatchesExpected()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath(); String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION)
.setMp4AtFileParameters( .setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath)) /* shouldInterleaveSamples= */ false, () -> cacheFilePath))
@ -570,13 +573,14 @@ public class Mp4MuxerEndToEndTest {
} }
@Test @Test
public void writeMp4File_withFileFormatMp4AtAndAuxiliaryTracks_auxiliaryTracksMatchesExpected() public void
throws Exception { writeMp4File_withMp4WithAuxiliaryTracksExtensionFileFormatAndAuxiliaryTracks_auxiliaryTracksMatchesExpected()
throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
String cacheFilePath = temporaryFolder.newFile().getPath(); String cacheFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION)
.setMp4AtFileParameters( .setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ false, () -> cacheFilePath)) /* shouldInterleaveSamples= */ false, () -> cacheFilePath))
@ -622,12 +626,12 @@ public class Mp4MuxerEndToEndTest {
@Test @Test
public void public void
writeMp4File_withFileFormatMp4AtAndAuxiliaryTracksAndShouldInterleaveSamples_primaryVideoTracksMatchesExpected() writeMp4File_withMp4WithAuxiliaryTracksExtensionFileFormatAndAuxiliaryTracksAndShouldInterleaveSamples_primaryVideoTracksMatchesExpected()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION)
.setMp4AtFileParameters( .setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null)) /* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null))
@ -673,12 +677,12 @@ public class Mp4MuxerEndToEndTest {
@Test @Test
public void public void
writeMp4File_withFileFormatMp4AtAndAuxiliaryTracksAndShouldInterleaveSamples_auxiliaryTracksMatchesExpected() writeMp4File_withMp4WithAuxiliaryTracksExtensionFileFormatAndAuxiliaryTracksAndShouldInterleaveSamples_auxiliaryTracksMatchesExpected()
throws Exception { throws Exception {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer muxer = Mp4Muxer muxer =
new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)) new Mp4Muxer.Builder(new FileOutputStream(outputFilePath))
.setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_AT) .setOutputFileFormat(Mp4Muxer.FILE_FORMAT_MP4_WITH_AUXILIARY_TRACKS_EXTENSION)
.setMp4AtFileParameters( .setMp4AtFileParameters(
new Mp4Muxer.Mp4AtFileParameters( new Mp4Muxer.Mp4AtFileParameters(
/* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null)) /* shouldInterleaveSamples= */ true, /* cacheFileProvider= */ null))