Commit 264ba8cf by aquilescanta Committed by Oliver Woodman

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
parent 4a6a8553
...@@ -17,6 +17,8 @@ package com.google.android.exoplayer2.metadata.emsg; ...@@ -17,6 +17,8 @@ package com.google.android.exoplayer2.metadata.emsg;
import android.test.MoreAsserts; import android.test.MoreAsserts;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.MetadataInputBuffer;
import java.nio.ByteBuffer;
import junit.framework.TestCase; import junit.framework.TestCase;
/** /**
...@@ -34,7 +36,9 @@ public final class EventMessageDecoderTest extends TestCase { ...@@ -34,7 +36,9 @@ public final class EventMessageDecoderTest extends TestCase {
0, 15, 67, -45, // id = 1000403 0, 15, 67, -45, // id = 1000403
0, 1, 2, 3, 4}; // message_data = {0, 1, 2, 3, 4} 0, 1, 2, 3, 4}; // message_data = {0, 1, 2, 3, 4}
EventMessageDecoder decoder = new EventMessageDecoder(); 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()); assertEquals(1, metadata.length());
EventMessage eventMessage = (EventMessage) metadata.get(0); EventMessage eventMessage = (EventMessage) metadata.get(0);
assertEquals("urn:test", eventMessage.schemeIdUri); assertEquals("urn:test", eventMessage.schemeIdUri);
......
...@@ -29,13 +29,12 @@ public interface MetadataDecoder { ...@@ -29,13 +29,12 @@ public interface MetadataDecoder {
boolean canDecode(String mimeType); 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 inputBuffer The input buffer to decode.
* @param size The size of the input data.
* @return The decoded metadata object. * @return The decoded metadata object.
* @throws MetadataDecoderException If a problem occurred decoding the data. * @throws MetadataDecoderException If a problem occurred decoding the data.
*/ */
Metadata decode(byte[] data, int size) throws MetadataDecoderException; Metadata decode(MetadataInputBuffer inputBuffer) throws MetadataDecoderException;
} }
/*
* 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);
}
}
...@@ -24,9 +24,7 @@ import com.google.android.exoplayer2.C; ...@@ -24,9 +24,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import java.nio.ByteBuffer;
/** /**
* A renderer for metadata. * A renderer for metadata.
...@@ -53,7 +51,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { ...@@ -53,7 +51,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
private final Output output; private final Output output;
private final Handler outputHandler; private final Handler outputHandler;
private final FormatHolder formatHolder; private final FormatHolder formatHolder;
private final DecoderInputBuffer buffer; private final MetadataInputBuffer buffer;
private MetadataDecoder decoder; private MetadataDecoder decoder;
private boolean inputStreamEnded; private boolean inputStreamEnded;
...@@ -88,7 +86,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { ...@@ -88,7 +86,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this); this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this);
this.decoderFactory = Assertions.checkNotNull(decoderFactory); this.decoderFactory = Assertions.checkNotNull(decoderFactory);
formatHolder = new FormatHolder(); formatHolder = new FormatHolder();
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); buffer = new MetadataInputBuffer();
} }
@Override @Override
...@@ -117,10 +115,10 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { ...@@ -117,10 +115,10 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
inputStreamEnded = true; inputStreamEnded = true;
} else { } else {
pendingMetadataTimestamp = buffer.timeUs; pendingMetadataTimestamp = buffer.timeUs;
try { buffer.subsampleOffsetUs = formatHolder.format.subsampleOffsetUs;
buffer.flip(); buffer.flip();
ByteBuffer bufferData = buffer.data; try {
pendingMetadata = decoder.decode(bufferData.array(), bufferData.limit()); pendingMetadata = decoder.decode(buffer);
} catch (MetadataDecoderException e) { } catch (MetadataDecoderException e) {
throw ExoPlaybackException.createForRenderer(e, getIndex()); throw ExoPlaybackException.createForRenderer(e, getIndex());
} }
......
...@@ -17,8 +17,10 @@ package com.google.android.exoplayer2.metadata.emsg; ...@@ -17,8 +17,10 @@ package com.google.android.exoplayer2.metadata.emsg;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.MetadataDecoder; 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.MimeTypes;
import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.ParsableByteArray;
import java.nio.ByteBuffer;
import java.util.Arrays; import java.util.Arrays;
/** /**
...@@ -35,7 +37,10 @@ public final class EventMessageDecoder implements MetadataDecoder { ...@@ -35,7 +37,10 @@ public final class EventMessageDecoder implements MetadataDecoder {
} }
@Override @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); ParsableByteArray emsgData = new ParsableByteArray(data, size);
String schemeIdUri = emsgData.readNullTerminatedString(); String schemeIdUri = emsgData.readNullTerminatedString();
String value = emsgData.readNullTerminatedString(); String value = emsgData.readNullTerminatedString();
......
...@@ -18,10 +18,12 @@ package com.google.android.exoplayer2.metadata.id3; ...@@ -18,10 +18,12 @@ package com.google.android.exoplayer2.metadata.id3;
import android.util.Log; import android.util.Log;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.MetadataDecoder; 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.MimeTypes;
import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.ParsableByteArray;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
...@@ -54,6 +56,18 @@ public final class Id3Decoder implements MetadataDecoder { ...@@ -54,6 +56,18 @@ public final class Id3Decoder implements MetadataDecoder {
} }
@Override @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) { public Metadata decode(byte[] data, int size) {
List<Id3Frame> id3Frames = new ArrayList<>(); List<Id3Frame> id3Frames = new ArrayList<>();
ParsableByteArray id3Data = new ParsableByteArray(data, size); ParsableByteArray id3Data = new ParsableByteArray(data, size);
......
...@@ -19,9 +19,11 @@ import android.text.TextUtils; ...@@ -19,9 +19,11 @@ import android.text.TextUtils;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.MetadataDecoder; import com.google.android.exoplayer2.metadata.MetadataDecoder;
import com.google.android.exoplayer2.metadata.MetadataDecoderException; 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.MimeTypes;
import com.google.android.exoplayer2.util.ParsableBitArray; import com.google.android.exoplayer2.util.ParsableBitArray;
import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.ParsableByteArray;
import java.nio.ByteBuffer;
/** /**
* Decodes splice info sections and produces splice commands. * Decodes splice info sections and produces splice commands.
...@@ -48,7 +50,10 @@ public final class SpliceInfoDecoder implements MetadataDecoder { ...@@ -48,7 +50,10 @@ public final class SpliceInfoDecoder implements MetadataDecoder {
} }
@Override @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); sectionData.reset(data, size);
sectionHeader.reset(data, size); sectionHeader.reset(data, size);
// table_id(8), section_syntax_indicator(1), private_indicator(1), reserved(2), // table_id(8), section_syntax_indicator(1), private_indicator(1), reserved(2),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment