Add vorbis comment parsing to OggReader
Change how OggReader handles the CommentsHeader instance, enabling VorbisComment tags to be parsed from it.
This commit is contained in:
parent
029a2b27cb
commit
d6eae9ad5f
@ -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<String> vorbisComments, List<PictureFrame> pictureFrames) {
|
||||
if (vorbisComments.isEmpty() && pictureFrames.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
ArrayList<Metadata.Entry> 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);
|
||||
}
|
||||
}
|
||||
|
@ -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<String> vorbisComments) {
|
||||
return buildMetadata(vorbisComments, Collections.emptyList());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Metadata buildMetadata(List<String> vorbisComments, List<PictureFrame> pictureFrames) {
|
||||
if (vorbisComments.isEmpty() && pictureFrames.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
ArrayList<Metadata.Entry> 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}.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user