From 264ba8cfcff8452bbcb4a6761f816e179bba604b Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Thu, 12 Jan 2017 09:28:20 -0800 Subject: [PATCH] Change MetadataDecoder interface to receive a MetadataInputBuffer This allows passing a subsampleOffsetUs as in Text decoding. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=144334172 --- .../emsg/EventMessageDecoderTest.java | 6 +++- .../exoplayer2/metadata/MetadataDecoder.java | 7 ++-- .../metadata/MetadataInputBuffer.java | 36 +++++++++++++++++++ .../exoplayer2/metadata/MetadataRenderer.java | 12 +++---- .../metadata/emsg/EventMessageDecoder.java | 7 +++- .../exoplayer2/metadata/id3/Id3Decoder.java | 14 ++++++++ .../metadata/scte35/SpliceInfoDecoder.java | 7 +++- 7 files changed, 75 insertions(+), 14 deletions(-) create mode 100644 library/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java diff --git a/library/src/androidTest/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java b/library/src/androidTest/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java index 51219b60d2..b33dfd1067 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java @@ -17,6 +17,8 @@ package com.google.android.exoplayer2.metadata.emsg; import android.test.MoreAsserts; import com.google.android.exoplayer2.metadata.Metadata; +import com.google.android.exoplayer2.metadata.MetadataInputBuffer; +import java.nio.ByteBuffer; import junit.framework.TestCase; /** @@ -34,7 +36,9 @@ public final class EventMessageDecoderTest extends TestCase { 0, 15, 67, -45, // id = 1000403 0, 1, 2, 3, 4}; // message_data = {0, 1, 2, 3, 4} EventMessageDecoder decoder = new EventMessageDecoder(); - Metadata metadata = decoder.decode(rawEmsgBody, rawEmsgBody.length); + MetadataInputBuffer buffer = new MetadataInputBuffer(); + buffer.data = ByteBuffer.allocate(rawEmsgBody.length).put(rawEmsgBody); + Metadata metadata = decoder.decode(buffer); assertEquals(1, metadata.length()); EventMessage eventMessage = (EventMessage) metadata.get(0); assertEquals("urn:test", eventMessage.schemeIdUri); diff --git a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java index a73311f16b..5c04bdaa2a 100644 --- a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java +++ b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java @@ -29,13 +29,12 @@ public interface MetadataDecoder { boolean canDecode(String mimeType); /** - * Decodes a metadata object from the provided binary data. + * Decodes a {@link Metadata} element from the provided input buffer. * - * @param data The raw binary data from which to decode the metadata. - * @param size The size of the input data. + * @param inputBuffer The input buffer to decode. * @return The decoded metadata object. * @throws MetadataDecoderException If a problem occurred decoding the data. */ - Metadata decode(byte[] data, int size) throws MetadataDecoderException; + Metadata decode(MetadataInputBuffer inputBuffer) throws MetadataDecoderException; } diff --git a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java new file mode 100644 index 0000000000..a09b565653 --- /dev/null +++ b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.metadata; + +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.decoder.DecoderInputBuffer; + +/** + * A {@link DecoderInputBuffer} for a {@link MetadataDecoder}. + */ +public final class MetadataInputBuffer extends DecoderInputBuffer { + + /** + * An offset that must be added to the metadata's timestamps after it's been decoded, or + * {@link Format#OFFSET_SAMPLE_RELATIVE} if {@link #timeUs} should be added. + */ + public long subsampleOffsetUs; + + public MetadataInputBuffer() { + super(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); + } + +} diff --git a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java index c8b51139fb..4869611aeb 100644 --- a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java @@ -24,9 +24,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; -import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.util.Assertions; -import java.nio.ByteBuffer; /** * A renderer for metadata. @@ -53,7 +51,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { private final Output output; private final Handler outputHandler; private final FormatHolder formatHolder; - private final DecoderInputBuffer buffer; + private final MetadataInputBuffer buffer; private MetadataDecoder decoder; private boolean inputStreamEnded; @@ -88,7 +86,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this); this.decoderFactory = Assertions.checkNotNull(decoderFactory); formatHolder = new FormatHolder(); - buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); + buffer = new MetadataInputBuffer(); } @Override @@ -117,10 +115,10 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { inputStreamEnded = true; } else { pendingMetadataTimestamp = buffer.timeUs; + buffer.subsampleOffsetUs = formatHolder.format.subsampleOffsetUs; + buffer.flip(); try { - buffer.flip(); - ByteBuffer bufferData = buffer.data; - pendingMetadata = decoder.decode(bufferData.array(), bufferData.limit()); + pendingMetadata = decoder.decode(buffer); } catch (MetadataDecoderException e) { throw ExoPlaybackException.createForRenderer(e, getIndex()); } diff --git a/library/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java b/library/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java index eaf81a3775..b1cd5d2cf1 100644 --- a/library/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java +++ b/library/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java @@ -17,8 +17,10 @@ package com.google.android.exoplayer2.metadata.emsg; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataDecoder; +import com.google.android.exoplayer2.metadata.MetadataInputBuffer; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; +import java.nio.ByteBuffer; import java.util.Arrays; /** @@ -35,7 +37,10 @@ public final class EventMessageDecoder implements MetadataDecoder { } @Override - public Metadata decode(byte[] data, int size) { + public Metadata decode(MetadataInputBuffer inputBuffer) { + ByteBuffer buffer = inputBuffer.data; + byte[] data = buffer.array(); + int size = buffer.limit(); ParsableByteArray emsgData = new ParsableByteArray(data, size); String schemeIdUri = emsgData.readNullTerminatedString(); String value = emsgData.readNullTerminatedString(); diff --git a/library/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java b/library/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java index 810260e9e8..0316c6d986 100644 --- a/library/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java +++ b/library/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java @@ -18,10 +18,12 @@ package com.google.android.exoplayer2.metadata.id3; import android.util.Log; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataDecoder; +import com.google.android.exoplayer2.metadata.MetadataInputBuffer; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -54,6 +56,18 @@ public final class Id3Decoder implements MetadataDecoder { } @Override + public Metadata decode(MetadataInputBuffer inputBuffer) { + ByteBuffer buffer = inputBuffer.data; + return decode(buffer.array(), buffer.limit()); + } + + /** + * Decodes ID3 tags. + * + * @param data The bytes to decode ID3 tags from. + * @param size Amount of bytes in {@code data} to read. + * @return A {@link Metadata} object containing the decoded ID3 tags. + */ public Metadata decode(byte[] data, int size) { List id3Frames = new ArrayList<>(); ParsableByteArray id3Data = new ParsableByteArray(data, size); diff --git a/library/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java b/library/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java index 5af0f25481..dad8525d34 100644 --- a/library/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java +++ b/library/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java @@ -19,9 +19,11 @@ import android.text.TextUtils; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataDecoder; import com.google.android.exoplayer2.metadata.MetadataDecoderException; +import com.google.android.exoplayer2.metadata.MetadataInputBuffer; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableBitArray; import com.google.android.exoplayer2.util.ParsableByteArray; +import java.nio.ByteBuffer; /** * Decodes splice info sections and produces splice commands. @@ -48,7 +50,10 @@ public final class SpliceInfoDecoder implements MetadataDecoder { } @Override - public Metadata decode(byte[] data, int size) throws MetadataDecoderException { + public Metadata decode(MetadataInputBuffer inputBuffer) throws MetadataDecoderException { + ByteBuffer buffer = inputBuffer.data; + byte[] data = buffer.array(); + int size = buffer.limit(); sectionData.reset(data, size); sectionHeader.reset(data, size); // table_id(8), section_syntax_indicator(1), private_indicator(1), reserved(2),