Formatting fixes

This commit is contained in:
tonihei 2024-06-24 09:55:41 +01:00
parent d717a0c5d5
commit b6070a5299
3 changed files with 87 additions and 87 deletions

View File

@ -3,6 +3,8 @@
### Unreleased changes ### Unreleased changes
* Common Library: * Common Library:
* Add `Format.customData` to store app-provided custom information about
`Format` instances.
* ExoPlayer: * ExoPlayer:
* Fix some audio focus inconsistencies, e.g. not reporting full or * Fix some audio focus inconsistencies, e.g. not reporting full or
transient focus loss while the player is paused transient focus loss while the player is paused

View File

@ -37,6 +37,7 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -149,6 +150,7 @@ public final class Format {
private int peakBitrate; private int peakBitrate;
@Nullable private String codecs; @Nullable private String codecs;
@Nullable private Metadata metadata; @Nullable private Metadata metadata;
@Nullable private Object customData;
// Container specific. // Container specific.
@ -196,9 +198,6 @@ public final class Format {
private @C.CryptoType int cryptoType; private @C.CryptoType int cryptoType;
// Extra custom data added to the class.
@Nullable private Object customData;
/** Creates a new instance with default values. */ /** Creates a new instance with default values. */
public Builder() { public Builder() {
labels = ImmutableList.of(); labels = ImmutableList.of();
@ -244,6 +243,7 @@ public final class Format {
this.peakBitrate = format.peakBitrate; this.peakBitrate = format.peakBitrate;
this.codecs = format.codecs; this.codecs = format.codecs;
this.metadata = format.metadata; this.metadata = format.metadata;
this.customData = format.customData;
// Container specific. // Container specific.
this.containerMimeType = format.containerMimeType; this.containerMimeType = format.containerMimeType;
// Sample specific. // Sample specific.
@ -276,8 +276,6 @@ public final class Format {
this.tileCountVertical = format.tileCountVertical; this.tileCountVertical = format.tileCountVertical;
// Provided by the source. // Provided by the source.
this.cryptoType = format.cryptoType; this.cryptoType = format.cryptoType;
// Extra custom data added to the class.
this.customData = format.customData;
} }
/** /**
@ -419,6 +417,22 @@ public final class Format {
return this; return this;
} }
/**
* Sets the opaque object {@link Format#customData}. The default value is null.
*
* <p>This value is not included in serialized {@link Bundle} instances of this class that are
* used to transfer data to other processes.
*
* @param customData The {@link Format#customData}.
* @return The builder.
*/
@UnstableApi
@CanIgnoreReturnValue
public Builder setCustomData(@Nullable Object customData) {
this.customData = customData;
return this;
}
// Container specific. // Container specific.
/** /**
@ -734,20 +748,6 @@ public final class Format {
return this; return this;
} }
// Extra custom data added to the class.
/**
* Sets the opaque object {@link Format#customData}. The default value is null.
*
* @param customData The {@link Format#customData}.
* @return The builder.
*/
@CanIgnoreReturnValue
public Builder setCustomData(@Nullable Object customData) {
this.customData = customData;
return this;
}
// Build. // Build.
public Format build() { public Format build() {
@ -880,6 +880,15 @@ public final class Format {
/** Metadata, or null if unknown or not applicable. */ /** Metadata, or null if unknown or not applicable. */
@UnstableApi @Nullable public final Metadata metadata; @UnstableApi @Nullable public final Metadata metadata;
/**
* An extra opaque object that can be added to the {@link Format} to provide additional
* information that can be passed through the player.
*
* <p>This value is not included in serialized {@link Bundle} instances of this class that are
* used to transfer data to other processes.
*/
@UnstableApi @Nullable public final Object customData;
// Container specific. // Container specific.
/** The MIME type of the container, or null if unknown or not applicable. */ /** The MIME type of the container, or null if unknown or not applicable. */
@ -1004,12 +1013,6 @@ public final class Format {
*/ */
@UnstableApi public final @C.CryptoType int cryptoType; @UnstableApi public final @C.CryptoType int cryptoType;
/**
* An extra opaque object that can be added to the {@link Format} to provide additional information
* that can be passed through the player.
*/
@UnstableApi @Nullable public final Object customData;
// Lazily initialized hashcode. // Lazily initialized hashcode.
private int hashCode; private int hashCode;
@ -1046,6 +1049,7 @@ public final class Format {
bitrate = peakBitrate != NO_VALUE ? peakBitrate : averageBitrate; bitrate = peakBitrate != NO_VALUE ? peakBitrate : averageBitrate;
codecs = builder.codecs; codecs = builder.codecs;
metadata = builder.metadata; metadata = builder.metadata;
customData = builder.customData;
// Container specific. // Container specific.
containerMimeType = builder.containerMimeType; containerMimeType = builder.containerMimeType;
// Sample specific. // Sample specific.
@ -1085,8 +1089,6 @@ public final class Format {
} else { } else {
cryptoType = builder.cryptoType; cryptoType = builder.cryptoType;
} }
// Extra custom data added to the class.
customData = builder.customData;
} }
/** Returns a {@link Format.Builder} initialized with the values of this instance. */ /** Returns a {@link Format.Builder} initialized with the values of this instance. */
@ -1231,6 +1233,7 @@ public final class Format {
result = 31 * result + peakBitrate; result = 31 * result + peakBitrate;
result = 31 * result + (codecs == null ? 0 : codecs.hashCode()); result = 31 * result + (codecs == null ? 0 : codecs.hashCode());
result = 31 * result + (metadata == null ? 0 : metadata.hashCode()); result = 31 * result + (metadata == null ? 0 : metadata.hashCode());
result = 31 * result + (customData == null ? 0 : customData.hashCode());
// Container specific. // Container specific.
result = 31 * result + (containerMimeType == null ? 0 : containerMimeType.hashCode()); result = 31 * result + (containerMimeType == null ? 0 : containerMimeType.hashCode());
// Sample specific. // Sample specific.
@ -1261,8 +1264,6 @@ public final class Format {
result = 31 * result + tileCountVertical; result = 31 * result + tileCountVertical;
// Provided by the source. // Provided by the source.
result = 31 * result + cryptoType; result = 31 * result + cryptoType;
// Extra custom data added to the class.
result = 31 * result + (customData == null ? 0 : customData.hashCode());
hashCode = result; hashCode = result;
} }
return hashCode; return hashCode;
@ -1302,19 +1303,19 @@ public final class Format {
&& cryptoType == other.cryptoType && cryptoType == other.cryptoType
&& Float.compare(frameRate, other.frameRate) == 0 && Float.compare(frameRate, other.frameRate) == 0
&& Float.compare(pixelWidthHeightRatio, other.pixelWidthHeightRatio) == 0 && Float.compare(pixelWidthHeightRatio, other.pixelWidthHeightRatio) == 0
&& Util.areEqual(id, other.id) && Objects.equals(id, other.id)
&& Util.areEqual(label, other.label) && Objects.equals(label, other.label)
&& labels.equals(other.labels) && labels.equals(other.labels)
&& Util.areEqual(codecs, other.codecs) && Objects.equals(codecs, other.codecs)
&& Util.areEqual(containerMimeType, other.containerMimeType) && Objects.equals(containerMimeType, other.containerMimeType)
&& Util.areEqual(sampleMimeType, other.sampleMimeType) && Objects.equals(sampleMimeType, other.sampleMimeType)
&& Util.areEqual(language, other.language) && Objects.equals(language, other.language)
&& Arrays.equals(projectionData, other.projectionData) && Arrays.equals(projectionData, other.projectionData)
&& Util.areEqual(metadata, other.metadata) && Objects.equals(metadata, other.metadata)
&& Util.areEqual(colorInfo, other.colorInfo) && Objects.equals(colorInfo, other.colorInfo)
&& Util.areEqual(drmInitData, other.drmInitData) && Objects.equals(drmInitData, other.drmInitData)
&& initializationDataEquals(other) && initializationDataEquals(other)
&& Util.areEqual(customData, other.customData); && Objects.equals(customData, other.customData);
} }
/** /**

View File

@ -22,13 +22,13 @@ import static androidx.media3.test.utils.TestUtil.buildTestData;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertThrows;
import android.os.Bundle; import androidx.annotation.Nullable;
import androidx.media3.common.util.Util;
import androidx.media3.test.utils.FakeMetadataEntry; import androidx.media3.test.utils.FakeMetadataEntry;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -36,36 +36,6 @@ import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public final class FormatTest { public final class FormatTest {
public static class ExoCustomData {
public final String extraMetadata;
public final int customInt;
public ExoCustomData(String extraMetadata, int customInt) {
this.extraMetadata = extraMetadata;
this.customInt = customInt;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + (extraMetadata == null ? 0 : extraMetadata.hashCode());
result = 31 * result + customInt;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
ExoCustomData other = (ExoCustomData) obj;
return Util.areEqual(extraMetadata, other.extraMetadata) && customInt == other.customInt;
}
}
@Test @Test
public void buildUponFormat_createsEqualFormat() { public void buildUponFormat_createsEqualFormat() {
Format testFormat = createTestFormat(); Format testFormat = createTestFormat();
@ -73,22 +43,27 @@ public final class FormatTest {
} }
@Test @Test
public void roundTripViaBundle_ofParameters_yieldsEqualInstance() { public void roundTripViaBundle_includeMetadata_includesAllBundledFields() {
Format formatToBundle = createTestFormat(); Format formatToBundle = createTestFormat();
Format formatFromBundle = Format formatFromBundle =
Format.fromBundle(formatToBundle.toBundle(/* excludeMetadata= */ false)); Format.fromBundle(formatToBundle.toBundle(/* excludeMetadata= */ false));
assertThat(formatFromBundle).isEqualTo(formatToBundle); // Expect all data to be bundled except the custom data.
Format expectedRoundTripFormat = formatToBundle.buildUpon().setCustomData(null).build();
assertThat(formatFromBundle).isEqualTo(expectedRoundTripFormat);
} }
@Test @Test
public void roundTripViaBundle_excludeMetadata_hasMetadataExcluded() { public void roundTripViaBundle_excludeMetadata_includesAllBundledFieldsExceptMetadata() {
Format format = createTestFormat(); Format format = createTestFormat();
Bundle bundleWithMetadataExcluded = format.toBundle(/* excludeMetadata= */ true); Format formatFromBundle = Format.fromBundle(format.toBundle(/* excludeMetadata= */ true));
Format formatWithMetadataExcluded = Format.fromBundle(bundleWithMetadataExcluded); // Expect all data to be bundled except the custom data and metadata.
assertThat(formatWithMetadataExcluded).isEqualTo(format.buildUpon().setMetadata(null).build()); Format expectedRoundTripFormat =
format.buildUpon().setCustomData(null).setMetadata(null).build();
assertThat(formatFromBundle).isEqualTo(expectedRoundTripFormat);
} }
@Test @Test
@ -147,15 +122,6 @@ public final class FormatTest {
.build()); .build());
} }
@Test
public void copyFormat_copiesCustomData() {
Format format = createTestFormat().buildUpon().setCustomData(new ExoCustomData("CustomData", 100)).build();
Format copy = format.buildUpon().build();
assertThat(format.customData).isEqualTo(copy.customData);
assertThat(format.customData).isEqualTo(new ExoCustomData("CustomData", 100));
}
private static Format createTestFormat() { private static Format createTestFormat() {
byte[] initData1 = new byte[] {1, 2, 3}; byte[] initData1 = new byte[] {1, 2, 3};
byte[] initData2 = new byte[] {4, 5, 6}; byte[] initData2 = new byte[] {4, 5, 6};
@ -193,6 +159,7 @@ private static Format createTestFormat() {
.setPeakBitrate(2048) .setPeakBitrate(2048)
.setCodecs("codec") .setCodecs("codec")
.setMetadata(metadata) .setMetadata(metadata)
.setCustomData(new TestCustomData("CustomData", 100))
.setContainerMimeType(VIDEO_MP4) .setContainerMimeType(VIDEO_MP4)
.setSampleMimeType(MimeTypes.VIDEO_H264) .setSampleMimeType(MimeTypes.VIDEO_H264)
.setMaxInputSize(5000) .setMaxInputSize(5000)
@ -218,4 +185,34 @@ private static Format createTestFormat() {
.setTileCountVertical(40) .setTileCountVertical(40)
.build(); .build();
} }
private static final class TestCustomData {
public final String extraMetadata;
public final int customInt;
public TestCustomData(String extraMetadata, int customInt) {
this.extraMetadata = extraMetadata;
this.customInt = customInt;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + (extraMetadata == null ? 0 : extraMetadata.hashCode());
result = 31 * result + customInt;
return result;
}
@Override
public boolean equals(@Nullable Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
TestCustomData other = (TestCustomData) obj;
return Objects.equals(extraMetadata, other.extraMetadata) && customInt == other.customInt;
}
}
} }