mirror of
https://github.com/androidx/media.git
synced 2025-05-07 15:40:37 +08:00
Add support for writing MP4 location data using media muxer
PiperOrigin-RevId: 515297752
This commit is contained in:
parent
9be419e679
commit
f69160079c
@ -76,6 +76,11 @@ public final class DefaultMuxer implements Muxer {
|
|||||||
this.muxer = muxer;
|
this.muxer = muxer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLocation(float latitude, float longitude) {
|
||||||
|
this.muxer.setLocation(latitude, longitude);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int addTrack(Format format) throws MuxerException {
|
public int addTrack(Format format) throws MuxerException {
|
||||||
return muxer.addTrack(format);
|
return muxer.addTrack(format);
|
||||||
|
@ -104,6 +104,11 @@ import java.nio.ByteBuffer;
|
|||||||
videoTrackIndex = C.INDEX_UNSET;
|
videoTrackIndex = C.INDEX_UNSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLocation(float latitude, float longitude) {
|
||||||
|
mediaMuxer.setLocation(latitude, longitude);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int addTrack(Format format) throws MuxerException {
|
public int addTrack(Format format) throws MuxerException {
|
||||||
String sampleMimeType = checkNotNull(format.sampleMimeType);
|
String sampleMimeType = checkNotNull(format.sampleMimeType);
|
||||||
|
@ -63,6 +63,14 @@ public interface Muxer {
|
|||||||
ImmutableList<String> getSupportedSampleMimeTypes(@C.TrackType int trackType);
|
ImmutableList<String> 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.
|
* Adds a track with the specified format.
|
||||||
*
|
*
|
||||||
|
@ -27,6 +27,8 @@ import androidx.annotation.IntRange;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.Format;
|
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.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
import com.google.common.collect.ImmutableList;
|
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,
|
* and all the formats must be added before any samples can be {@linkplain #writeSample(int,
|
||||||
* ByteBuffer, boolean, long) written}.
|
* ByteBuffer, boolean, long) written}.
|
||||||
*
|
*
|
||||||
|
* <p>If the {@link Format#metadata} contains {@link Mp4LocationData}, then it will be added to
|
||||||
|
* the muxer.
|
||||||
|
*
|
||||||
* @param format The {@link Format} to be added.
|
* @param format The {@link Format} to be added.
|
||||||
* @throws IllegalArgumentException If the format is unsupported.
|
* @throws IllegalArgumentException If the format is unsupported.
|
||||||
* @throws IllegalStateException If the number of formats added exceeds the {@linkplain
|
* @throws IllegalStateException If the number of formats added exceeds the {@linkplain
|
||||||
@ -159,6 +164,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
|||||||
isReady = true;
|
isReady = true;
|
||||||
resetAbortTimer();
|
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;
|
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 {
|
private static final class TrackInfo {
|
||||||
public final Format format;
|
public final Format format;
|
||||||
public final int index;
|
public final int index;
|
||||||
|
@ -42,6 +42,11 @@ public final class TestMuxer implements Muxer, Dumper.Dumpable {
|
|||||||
|
|
||||||
// Muxer implementation.
|
// Muxer implementation.
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLocation(float latitude, float longitude) {
|
||||||
|
muxer.setLocation(latitude, longitude);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int addTrack(Format format) throws MuxerException {
|
public int addTrack(Format format) throws MuxerException {
|
||||||
int trackIndex = muxer.addTrack(format);
|
int trackIndex = muxer.addTrack(format);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user