mirror of
https://github.com/samsonjs/media.git
synced 2026-03-27 09:45:47 +00:00
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
This commit is contained in:
parent
4a6a8553e9
commit
264ba8cfcf
7 changed files with 75 additions and 14 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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<Id3Frame> id3Frames = new ArrayList<>();
|
||||
ParsableByteArray id3Data = new ParsableByteArray(data, size);
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Reference in a new issue