diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultMuxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultMuxer.java index 51eee17e10..6ef0be04f1 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultMuxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultMuxer.java @@ -76,6 +76,11 @@ public final class DefaultMuxer implements Muxer { this.muxer = muxer; } + @Override + public void setLocation(float latitude, float longitude) { + this.muxer.setLocation(latitude, longitude); + } + @Override public int addTrack(Format format) throws MuxerException { return muxer.addTrack(format); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java index f1532e0104..499820859d 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java @@ -104,6 +104,11 @@ import java.nio.ByteBuffer; videoTrackIndex = C.INDEX_UNSET; } + @Override + public void setLocation(float latitude, float longitude) { + mediaMuxer.setLocation(latitude, longitude); + } + @Override public int addTrack(Format format) throws MuxerException { String sampleMimeType = checkNotNull(format.sampleMimeType); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java index 5b2d66ffa5..041c2de087 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java @@ -63,6 +63,14 @@ public interface Muxer { ImmutableList getSupportedSampleMimeTypes(@C.TrackType int trackType); } + /** + * Sets the location. + * + * @param latitude The latitude, in degrees. Its value must be in the range [-90, 90]. + * @param longitude The longitude, in degrees. Its value must be in the range [-180, 180]. + */ + void setLocation(float latitude, float longitude); + /** * Adds a track with the specified format. * diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java index 074abe10f5..10e217109d 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java @@ -27,6 +27,8 @@ import androidx.annotation.IntRange; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.metadata.Metadata; +import com.google.android.exoplayer2.metadata.mp4.Mp4LocationData; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; @@ -129,6 +131,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; * and all the formats must be added before any samples can be {@linkplain #writeSample(int, * ByteBuffer, boolean, long) written}. * + *

If the {@link Format#metadata} contains {@link Mp4LocationData}, then it will be added to + * the muxer. + * * @param format The {@link Format} to be added. * @throws IllegalArgumentException If the format is unsupported. * @throws IllegalStateException If the number of formats added exceeds the {@linkplain @@ -159,6 +164,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; isReady = true; resetAbortTimer(); } + + @Nullable Mp4LocationData mp4LocationData = extractMp4LocationData(format); + if (mp4LocationData != null) { + muxer.setLocation(mp4LocationData.latitude, mp4LocationData.longitude); + } } /** @@ -328,6 +338,21 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; return trackInfoWithMinTimeUs; } + @Nullable + private static Mp4LocationData extractMp4LocationData(Format format) { + if (format.metadata == null) { + return null; + } + + for (int i = 0; i < format.metadata.length(); i++) { + Metadata.Entry entry = format.metadata.get(i); + if (entry instanceof Mp4LocationData) { + return (Mp4LocationData) entry; + } + } + return null; + } + private static final class TrackInfo { public final Format format; public final int index; diff --git a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TestMuxer.java b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TestMuxer.java index dffab0fd21..c359e2f4e2 100644 --- a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TestMuxer.java +++ b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TestMuxer.java @@ -42,6 +42,11 @@ public final class TestMuxer implements Muxer, Dumper.Dumpable { // Muxer implementation. + @Override + public void setLocation(float latitude, float longitude) { + muxer.setLocation(latitude, longitude); + } + @Override public int addTrack(Format format) throws MuxerException { int trackIndex = muxer.addTrack(format);