mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Formatting fixes
This commit is contained in:
parent
d717a0c5d5
commit
b6070a5299
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user