diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacStreamMetadata.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacStreamMetadata.java index a4a2b64cb9..7a6b09b9ac 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacStreamMetadata.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacStreamMetadata.java @@ -20,8 +20,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.flac.PictureFrame; -import com.google.android.exoplayer2.metadata.flac.VorbisComment; -import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableBitArray; import com.google.android.exoplayer2.util.Util; @@ -56,12 +54,8 @@ public final class FlacStreamMetadata { } } - private static final String TAG = "FlacStreamMetadata"; - /** Indicates that a value is not in the corresponding lookup table. */ public static final int NOT_IN_LOOKUP_TABLE = -1; - /** Separator between the field name of a Vorbis comment and the corresponding value. */ - private static final String SEPARATOR = "="; /** Minimum number of samples per block. */ public final int minBlockSizeSamples; @@ -149,7 +143,7 @@ public final class FlacStreamMetadata { bitsPerSample, totalSamples, /* seekTable= */ null, - buildMetadata(vorbisComments, pictureFrames)); + VorbisUtil.buildMetadata(vorbisComments, pictureFrames)); } private FlacStreamMetadata( @@ -275,7 +269,7 @@ public final class FlacStreamMetadata { @Nullable Metadata appendedMetadata = getMetadataCopyWithAppendedEntriesFrom( - buildMetadata(vorbisComments, Collections.emptyList())); + VorbisUtil.buildMetadata(vorbisComments, Collections.emptyList())); return new FlacStreamMetadata( minBlockSizeSamples, maxBlockSizeSamples, @@ -294,7 +288,7 @@ public final class FlacStreamMetadata { @Nullable Metadata appendedMetadata = getMetadataCopyWithAppendedEntriesFrom( - buildMetadata(Collections.emptyList(), pictureFrames)); + VorbisUtil.buildMetadata(Collections.emptyList(), pictureFrames)); return new FlacStreamMetadata( minBlockSizeSamples, maxBlockSizeSamples, @@ -353,27 +347,4 @@ public final class FlacStreamMetadata { return NOT_IN_LOOKUP_TABLE; } } - - @Nullable - private static Metadata buildMetadata( - List vorbisComments, List pictureFrames) { - if (vorbisComments.isEmpty() && pictureFrames.isEmpty()) { - return null; - } - - ArrayList metadataEntries = new ArrayList<>(); - for (int i = 0; i < vorbisComments.size(); i++) { - String vorbisComment = vorbisComments.get(i); - String[] keyAndValue = Util.splitAtFirst(vorbisComment, SEPARATOR); - if (keyAndValue.length != 2) { - Log.w(TAG, "Failed to parse Vorbis comment: " + vorbisComment); - } else { - VorbisComment entry = new VorbisComment(keyAndValue[0], keyAndValue[1]); - metadataEntries.add(entry); - } - } - metadataEntries.addAll(pictureFrames); - - return metadataEntries.isEmpty() ? null : new Metadata(metadataEntries); - } } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java index 5fbd0e4ae4..7e48281246 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java @@ -15,14 +15,26 @@ */ package com.google.android.exoplayer2.extractor; +import androidx.annotation.Nullable; + import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; +import com.google.android.exoplayer2.metadata.Metadata; +import com.google.android.exoplayer2.metadata.flac.PictureFrame; +import com.google.android.exoplayer2.metadata.flac.VorbisComment; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.ParsableByteArray; +import com.google.android.exoplayer2.util.Util; + +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.List; /** Utility methods for parsing Vorbis streams. */ public final class VorbisUtil { + /** Separator between the field name of a Vorbis comment and the corresponding value. */ + private static final String SEPARATOR = "="; /** Vorbis comment header. */ public static final class CommentHeader { @@ -248,6 +260,34 @@ public final class VorbisUtil { return new CommentHeader(vendor, comments, length); } + @Nullable + public static Metadata buildMetadata(List vorbisComments) { + return buildMetadata(vorbisComments, Collections.emptyList()); + } + + @Nullable + public static Metadata buildMetadata(List vorbisComments, List pictureFrames) { + if (vorbisComments.isEmpty() && pictureFrames.isEmpty()) { + return null; + } + + ArrayList metadataEntries = new ArrayList<>(); + for (int i = 0; i < vorbisComments.size(); i++) { + String vorbisComment = vorbisComments.get(i); + String[] keyAndValue = Util.splitAtFirst(vorbisComment, SEPARATOR); + + if (keyAndValue.length != 2) { + Log.w(TAG, "Failed to parse Vorbis comment: " + vorbisComment); + } else { + VorbisComment entry = new VorbisComment(keyAndValue[0], keyAndValue[1]); + metadataEntries.add(entry); + } + } + metadataEntries.addAll(pictureFrames); + + return metadataEntries.isEmpty() ? null : new Metadata(metadataEntries); + } + /** * Verifies whether the next bytes in {@code header} are a Vorbis header of the given {@code * headerType}. diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/VorbisReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/VorbisReader.java index 607bffe858..23a1ca117d 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/VorbisReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/VorbisReader.java @@ -24,6 +24,8 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.extractor.VorbisUtil; import com.google.android.exoplayer2.extractor.VorbisUtil.Mode; +import com.google.android.exoplayer2.metadata.Metadata; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import java.io.IOException; @@ -111,6 +113,12 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; codecInitializationData.add(idHeader.data); codecInitializationData.add(vorbisSetup.setupHeaderData); + @Nullable Metadata vorbisMetadata = VorbisUtil.buildMetadata( + Arrays.asList(vorbisSetup.commentHeader.comments) + ); + + Log.d("VorbisReader", "hi metadata" + vorbisMetadata.toString()); + setupData.format = new Format.Builder() .setSampleMimeType(MimeTypes.AUDIO_VORBIS) @@ -119,7 +127,9 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; .setChannelCount(idHeader.channels) .setSampleRate(idHeader.sampleRate) .setInitializationData(codecInitializationData) + .setMetadata(vorbisMetadata) .build(); + return true; } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java index 3ab60541a9..05daeecaec 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java @@ -23,7 +23,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.metadata.Metadata; -/** A vorbis comment. */ +/** A vorbis comment, extracted from a FLAC or OGG file. */ public final class VorbisComment implements Metadata.Entry { /** The key. */