diff --git a/extensions/flac/src/androidTest/assets/bear.flac.0.dump b/extensions/flac/src/androidTest/assets/bear.flac.0.dump index 816356a1e6..d562052a4f 100644 --- a/extensions/flac/src/androidTest/assets/bear.flac.0.dump +++ b/extensions/flac/src/androidTest/assets/bear.flac.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: total output bytes = 526272 sample count = 33 diff --git a/extensions/flac/src/androidTest/assets/bear.flac.1.dump b/extensions/flac/src/androidTest/assets/bear.flac.1.dump index 4a6b06725f..93f38227b8 100644 --- a/extensions/flac/src/androidTest/assets/bear.flac.1.dump +++ b/extensions/flac/src/androidTest/assets/bear.flac.1.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: total output bytes = 362432 sample count = 23 diff --git a/extensions/flac/src/androidTest/assets/bear.flac.2.dump b/extensions/flac/src/androidTest/assets/bear.flac.2.dump index dddb6dc264..9c53a95b06 100644 --- a/extensions/flac/src/androidTest/assets/bear.flac.2.dump +++ b/extensions/flac/src/androidTest/assets/bear.flac.2.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: total output bytes = 182208 sample count = 12 diff --git a/extensions/flac/src/androidTest/assets/bear.flac.3.dump b/extensions/flac/src/androidTest/assets/bear.flac.3.dump index 0dbe575ecf..82e23a21c1 100644 --- a/extensions/flac/src/androidTest/assets/bear.flac.3.dump +++ b/extensions/flac/src/androidTest/assets/bear.flac.3.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: total output bytes = 18368 sample count = 2 diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java index 7c69a93fc9..2c6f51da02 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java @@ -212,6 +212,7 @@ public final class FlacExtractor implements Extractor { input.getLength(), extractorOutput, outputFrameHolder); + @Nullable Metadata metadata = streamMetadata.getMetadataCopyWithAppendedEntriesFrom(id3Metadata); outputFormat(streamMetadata, metadata, trackOutput); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/extractor/FlacMetadataReader.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/FlacMetadataReader.java index e86c9b0129..e66f39de8c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/extractor/FlacMetadataReader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/FlacMetadataReader.java @@ -81,7 +81,8 @@ public final class FlacMetadataReader { throws IOException, InterruptedException { @Nullable Id3Decoder.FramePredicate id3FramePredicate = parseData ? null : Id3Decoder.NO_FRAMES_PREDICATE; - return new Id3Peeker().peekId3Data(input, id3FramePredicate); + @Nullable Metadata id3Metadata = new Id3Peeker().peekId3Data(input, id3FramePredicate); + return id3Metadata == null || id3Metadata.length() == 0 ? null : id3Metadata; } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/FlacStreamMetadata.java b/library/core/src/main/java/com/google/android/exoplayer2/util/FlacStreamMetadata.java index 2772f7e0c6..db1de183ac 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/FlacStreamMetadata.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/FlacStreamMetadata.java @@ -80,8 +80,8 @@ public final class FlacStreamMetadata { /** Total number of samples, or 0 if the value is unknown. */ public final long totalSamples; - /** Content metadata. */ - private final Metadata metadata; + /** Content metadata, or {@code null} if it is not provided. */ + @Nullable private final Metadata metadata; /** * Parses binary FLAC stream info metadata. @@ -102,7 +102,7 @@ public final class FlacStreamMetadata { bitsPerSample = scratch.readBits(5) + 1; bitsPerSampleLookupKey = getBitsPerSampleLookupKey(bitsPerSample); totalSamples = scratch.readBitsToLong(36); - metadata = new Metadata(); + metadata = null; } // Used in native code. @@ -138,7 +138,7 @@ public final class FlacStreamMetadata { int channels, int bitsPerSample, long totalSamples, - Metadata metadata) { + @Nullable Metadata metadata) { this.minBlockSizeSamples = minBlockSizeSamples; this.maxBlockSizeSamples = maxBlockSizeSamples; this.minFrameSize = minFrameSize; @@ -213,7 +213,7 @@ public final class FlacStreamMetadata { // Set the last metadata block flag, ignore the other blocks. streamMarkerAndInfoBlock[4] = (byte) 0x80; int maxInputSize = maxFrameSize > 0 ? maxFrameSize : Format.NO_VALUE; - Metadata metadataWithId3 = metadata.copyWithAppendedEntriesFrom(id3Metadata); + @Nullable Metadata metadataWithId3 = getMetadataCopyWithAppendedEntriesFrom(id3Metadata); return Format.createAudioSampleFormat( /* id= */ null, @@ -234,14 +234,16 @@ public final class FlacStreamMetadata { } /** Returns a copy of the content metadata with entries from {@code other} appended. */ + @Nullable public Metadata getMetadataCopyWithAppendedEntriesFrom(@Nullable Metadata other) { - return metadata.copyWithAppendedEntriesFrom(other); + return metadata == null ? other : metadata.copyWithAppendedEntriesFrom(other); } /** Returns a copy of {@code this} with the given Vorbis comments added to the metadata. */ public FlacStreamMetadata copyWithVorbisComments(List vorbisComments) { + @Nullable Metadata appendedMetadata = - metadata.copyWithAppendedEntriesFrom( + getMetadataCopyWithAppendedEntriesFrom( buildMetadata(vorbisComments, Collections.emptyList())); return new FlacStreamMetadata( minBlockSizeSamples, @@ -257,8 +259,10 @@ public final class FlacStreamMetadata { /** Returns a copy of {@code this} with the given picture frames added to the metadata. */ public FlacStreamMetadata copyWithPictureFrames(List pictureFrames) { + @Nullable Metadata appendedMetadata = - metadata.copyWithAppendedEntriesFrom(buildMetadata(Collections.emptyList(), pictureFrames)); + getMetadataCopyWithAppendedEntriesFrom( + buildMetadata(Collections.emptyList(), pictureFrames)); return new FlacStreamMetadata( minBlockSizeSamples, maxBlockSizeSamples, @@ -317,10 +321,11 @@ public final class FlacStreamMetadata { } } + @Nullable private static Metadata buildMetadata( List vorbisComments, List pictureFrames) { if (vorbisComments.isEmpty() && pictureFrames.isEmpty()) { - return new Metadata(); + return null; } ArrayList metadataEntries = new ArrayList<>(); @@ -336,6 +341,6 @@ public final class FlacStreamMetadata { } metadataEntries.addAll(pictureFrames); - return metadataEntries.isEmpty() ? new Metadata() : new Metadata(metadataEntries); + return metadataEntries.isEmpty() ? null : new Metadata(metadataEntries); } } diff --git a/library/core/src/test/assets/flac/bear.flac.0.dump b/library/core/src/test/assets/flac/bear.flac.0.dump index 109cc49ebb..bd8f1827e4 100644 --- a/library/core/src/test/assets/flac/bear.flac.0.dump +++ b/library/core/src/test/assets/flac/bear.flac.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 164431 diff --git a/library/core/src/test/assets/flac/bear_no_min_max_frame_size.flac.0.dump b/library/core/src/test/assets/flac/bear_no_min_max_frame_size.flac.0.dump index a7c8b628ba..4ef7138487 100644 --- a/library/core/src/test/assets/flac/bear_no_min_max_frame_size.flac.0.dump +++ b/library/core/src/test/assets/flac/bear_no_min_max_frame_size.flac.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 9218FDB7 total output bytes = 164431 diff --git a/library/core/src/test/assets/flac/bear_no_num_samples.flac.0.dump b/library/core/src/test/assets/flac/bear_no_num_samples.flac.0.dump index 7606154ddd..45b75392b3 100644 --- a/library/core/src/test/assets/flac/bear_no_num_samples.flac.0.dump +++ b/library/core/src/test/assets/flac/bear_no_num_samples.flac.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 49FA2C21 total output bytes = 164431 diff --git a/library/core/src/test/assets/flac/bear_one_metadata_block.flac.0.dump b/library/core/src/test/assets/flac/bear_one_metadata_block.flac.0.dump index 109cc49ebb..bd8f1827e4 100644 --- a/library/core/src/test/assets/flac/bear_one_metadata_block.flac.0.dump +++ b/library/core/src/test/assets/flac/bear_one_metadata_block.flac.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 164431 diff --git a/library/core/src/test/assets/flac/bear_uncommon_sample_rate.flac.0.dump b/library/core/src/test/assets/flac/bear_uncommon_sample_rate.flac.0.dump index 488517947c..e6caad8e84 100644 --- a/library/core/src/test/assets/flac/bear_uncommon_sample_rate.flac.0.dump +++ b/library/core/src/test/assets/flac/bear_uncommon_sample_rate.flac.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 7249A1B8 total output bytes = 144086 diff --git a/library/core/src/test/assets/flac/bear_with_id3_disabled.flac.0.dump b/library/core/src/test/assets/flac/bear_with_id3_disabled.flac.0.dump index 109cc49ebb..bd8f1827e4 100644 --- a/library/core/src/test/assets/flac/bear_with_id3_disabled.flac.0.dump +++ b/library/core/src/test/assets/flac/bear_with_id3_disabled.flac.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 164431 diff --git a/library/core/src/test/assets/ogg/bear_flac.ogg.0.dump b/library/core/src/test/assets/ogg/bear_flac.ogg.0.dump index 896c8ad6c5..d32342619c 100644 --- a/library/core/src/test/assets/ogg/bear_flac.ogg.0.dump +++ b/library/core/src/test/assets/ogg/bear_flac.ogg.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 164431 diff --git a/library/core/src/test/assets/ogg/bear_flac.ogg.1.dump b/library/core/src/test/assets/ogg/bear_flac.ogg.1.dump index e85b504a39..17e6c6d862 100644 --- a/library/core/src/test/assets/ogg/bear_flac.ogg.1.dump +++ b/library/core/src/test/assets/ogg/bear_flac.ogg.1.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 113666 diff --git a/library/core/src/test/assets/ogg/bear_flac.ogg.2.dump b/library/core/src/test/assets/ogg/bear_flac.ogg.2.dump index 63bc130424..e52b8897c8 100644 --- a/library/core/src/test/assets/ogg/bear_flac.ogg.2.dump +++ b/library/core/src/test/assets/ogg/bear_flac.ogg.2.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 55652 diff --git a/library/core/src/test/assets/ogg/bear_flac.ogg.3.dump b/library/core/src/test/assets/ogg/bear_flac.ogg.3.dump index fdebce7743..dabf5552da 100644 --- a/library/core/src/test/assets/ogg/bear_flac.ogg.3.dump +++ b/library/core/src/test/assets/ogg/bear_flac.ogg.3.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 445 diff --git a/library/core/src/test/assets/ogg/bear_flac.ogg.unklen.dump b/library/core/src/test/assets/ogg/bear_flac.ogg.unklen.dump index 896c8ad6c5..d32342619c 100644 --- a/library/core/src/test/assets/ogg/bear_flac.ogg.unklen.dump +++ b/library/core/src/test/assets/ogg/bear_flac.ogg.unklen.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 164431 diff --git a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.0.dump b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.0.dump index b09453f208..efbf8a3609 100644 --- a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.0.dump +++ b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.0.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 164431 diff --git a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.1.dump b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.1.dump index 4ab08524ae..80ad2045ce 100644 --- a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.1.dump +++ b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.1.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 113666 diff --git a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.2.dump b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.2.dump index 3a846736d2..c2efd50a33 100644 --- a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.2.dump +++ b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.2.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 55652 diff --git a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.3.dump b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.3.dump index 5bf1a92472..26601231a6 100644 --- a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.3.dump +++ b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.3.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 445 diff --git a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.unklen.dump b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.unklen.dump index 1a0686c5fd..67a1fecee4 100644 --- a/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.unklen.dump +++ b/library/core/src/test/assets/ogg/bear_flac_noseektable.ogg.unklen.dump @@ -24,7 +24,7 @@ track 0: selectionFlags = 0 language = null drmInitData = - - metadata = entries=[] + metadata = null initializationData: data = length 42, hash 83F6895 total output bytes = 164431 diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/FlacStreamMetadataTest.java b/library/core/src/test/java/com/google/android/exoplayer2/util/FlacStreamMetadataTest.java index d3d3e53458..ddaa550b7f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/util/FlacStreamMetadataTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/util/FlacStreamMetadataTest.java @@ -75,7 +75,7 @@ public final class FlacStreamMetadataTest { /* pictureFrames= */ new ArrayList<>()) .getMetadataCopyWithAppendedEntriesFrom(/* other= */ null); - assertThat(metadata.length()).isEqualTo(0); + assertThat(metadata).isNull(); } @Test