From ca8b6532324c5bb3732ce1f9e834eb43d1face12 Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 25 Jul 2022 13:29:44 +0100 Subject: [PATCH] Exclude Metadata from Format when bundling from TrackGroup #minor-release PiperOrigin-RevId: 463062454 (cherry picked from commit 861196a63cbabc76b35ff6b5dbf5e1e4a61508c8) --- .../com/google/android/exoplayer2/Format.java | 16 ++++++++++++---- .../android/exoplayer2/source/TrackGroup.java | 9 ++++++--- .../google/android/exoplayer2/FormatTest.java | 12 +++++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Format.java b/library/common/src/main/java/com/google/android/exoplayer2/Format.java index b4a6814228..ea3b552e1d 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Format.java @@ -1526,6 +1526,14 @@ public final class Format implements Bundleable { @Override public Bundle toBundle() { + return toBundle(/* excludeMetadata= */ false); + } + + /** + * Returns a {@link Bundle} representing the information stored in this object. If {@code + * excludeMetadata} is true, {@linkplain Format#metadata metadata} is excluded. + */ + public Bundle toBundle(boolean excludeMetadata) { Bundle bundle = new Bundle(); bundle.putString(keyForField(FIELD_ID), id); bundle.putString(keyForField(FIELD_LABEL), label); @@ -1535,10 +1543,10 @@ public final class Format implements Bundleable { bundle.putInt(keyForField(FIELD_AVERAGE_BITRATE), averageBitrate); bundle.putInt(keyForField(FIELD_PEAK_BITRATE), peakBitrate); bundle.putString(keyForField(FIELD_CODECS), codecs); - // Metadata is currently not Bundleable because Metadata.Entry is an Interface, - // which would be difficult to unbundle in a backward compatible way. - // The entries are additionally of limited usefulness to remote processes. - bundle.putParcelable(keyForField(FIELD_METADATA), metadata); + if (!excludeMetadata) { + // TODO (internal ref: b/239701618) + bundle.putParcelable(keyForField(FIELD_METADATA), metadata); + } // Container specific. bundle.putString(keyForField(FIELD_CONTAINER_MIME_TYPE), containerMimeType); // Sample specific. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java index 3fbd7d5a89..c2be277d43 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java @@ -30,11 +30,11 @@ import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -177,8 +177,11 @@ public final class TrackGroup implements Bundleable { @Override public Bundle toBundle() { Bundle bundle = new Bundle(); - bundle.putParcelableArrayList( - keyForField(FIELD_FORMATS), BundleableUtil.toBundleArrayList(Lists.newArrayList(formats))); + ArrayList arrayList = new ArrayList<>(formats.length); + for (Format format : formats) { + arrayList.add(format.toBundle(/* excludeMetadata= */ true)); + } + bundle.putParcelableArrayList(keyForField(FIELD_FORMATS), arrayList); bundle.putString(keyForField(FIELD_ID), id); return bundle; } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java b/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java index 36c5e448b1..9218658568 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java @@ -20,6 +20,7 @@ import static com.google.android.exoplayer2.util.MimeTypes.VIDEO_MP4; import static com.google.android.exoplayer2.util.MimeTypes.VIDEO_WEBM; import static com.google.common.truth.Truth.assertThat; +import android.os.Bundle; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.metadata.Metadata; @@ -50,6 +51,16 @@ public final class FormatTest { assertThat(formatFromBundle).isEqualTo(formatToBundle); } + @Test + public void roundTripViaBundle_excludeMetadata_hasMetadataExcluded() { + Format format = createTestFormat(); + + Bundle bundleWithMetadataExcluded = format.toBundle(/* excludeMetadata= */ true); + + Format formatWithMetadataExcluded = Format.CREATOR.fromBundle(bundleWithMetadataExcluded); + assertThat(formatWithMetadataExcluded).isEqualTo(format.buildUpon().setMetadata(null).build()); + } + private static Format createTestFormat() { byte[] initData1 = new byte[] {1, 2, 3}; byte[] initData2 = new byte[] {4, 5, 6}; @@ -64,7 +75,6 @@ public final class FormatTest { DrmInitData drmInitData = new DrmInitData(drmData1, drmData2); byte[] projectionData = new byte[] {1, 2, 3}; - Metadata metadata = new Metadata(new FakeMetadataEntry("id1"), new FakeMetadataEntry("id2")); ColorInfo colorInfo =