From a9e3f5def4fa17aa82f47a8d3a1f1452c2e6f245 Mon Sep 17 00:00:00 2001 From: sheenachhabra Date: Mon, 22 May 2023 17:24:34 +0100 Subject: [PATCH] Write metadata to Mp4Muxer in the release() method Earlier metadata was written multiple times as it came. With new changes, all the distinct metadata entries will get collected and will be written at once in the end. PiperOrigin-RevId: 534088401 --- .../media3/transformer/InAppMuxer.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java index f80f7f4e8b..b44490d7f7 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java @@ -33,7 +33,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** {@link Muxer} implementation that uses a {@link Mp4Muxer}. */ @UnstableApi @@ -85,12 +87,14 @@ public final class InAppMuxer implements Muxer { private final long maxDelayBetweenSamplesMs; private final List trackTokenList; private final BufferInfo bufferInfo; + private final Set metadataEntries; private InAppMuxer(Mp4Muxer mp4Muxer, long maxDelayBetweenSamplesMs) { this.mp4Muxer = mp4Muxer; this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs; trackTokenList = new ArrayList<>(); bufferInfo = new BufferInfo(); + metadataEntries = new LinkedHashSet<>(); } @Override @@ -133,15 +137,16 @@ public final class InAppMuxer implements Muxer { public void addMetadata(Metadata metadata) { for (int i = 0; i < metadata.length(); i++) { Metadata.Entry entry = metadata.get(i); + // Keep only supported metadata. if (entry instanceof Mp4LocationData) { - mp4Muxer.setLocation( - ((Mp4LocationData) entry).latitude, ((Mp4LocationData) entry).longitude); + metadataEntries.add(entry); } } } @Override public void release(boolean forCancellation) throws MuxerException { + writeMetadata(); try { mp4Muxer.close(); } catch (IOException e) { @@ -153,4 +158,13 @@ public final class InAppMuxer implements Muxer { public long getMaxDelayBetweenSamplesMs() { return maxDelayBetweenSamplesMs; } + + private void writeMetadata() { + for (Metadata.Entry entry : metadataEntries) { + if (entry instanceof Mp4LocationData) { + mp4Muxer.setLocation( + ((Mp4LocationData) entry).latitude, ((Mp4LocationData) entry).longitude); + } + } + } }