mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Rollback of 01f484cbe9
*** Original commit *** Modify EventMessageDecoder to return null if decoding fails (currently throws exceptions) This matches the documentation on MetadataDecoder.decode: "@return The decoded metadata object, or null if the metadata could not be decoded." *** PiperOrigin-RevId: 272405287
This commit is contained in:
parent
f5873b8f00
commit
db68aa9490
@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.metadata.emsg;
|
package com.google.android.exoplayer2.metadata.emsg;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
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.metadata.MetadataInputBuffer;
|
||||||
@ -29,31 +28,20 @@ public final class EventMessageDecoder implements MetadataDecoder {
|
|||||||
|
|
||||||
@SuppressWarnings("ByteBufferBackingArray")
|
@SuppressWarnings("ByteBufferBackingArray")
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
|
||||||
public Metadata decode(MetadataInputBuffer inputBuffer) {
|
public Metadata decode(MetadataInputBuffer inputBuffer) {
|
||||||
ByteBuffer buffer = Assertions.checkNotNull(inputBuffer.data);
|
ByteBuffer buffer = Assertions.checkNotNull(inputBuffer.data);
|
||||||
byte[] data = buffer.array();
|
byte[] data = buffer.array();
|
||||||
int size = buffer.limit();
|
int size = buffer.limit();
|
||||||
EventMessage decodedEventMessage = decode(new ParsableByteArray(data, size));
|
return new Metadata(decode(new ParsableByteArray(data, size)));
|
||||||
if (decodedEventMessage == null) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
return new Metadata(decodedEventMessage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public EventMessage decode(ParsableByteArray emsgData) {
|
public EventMessage decode(ParsableByteArray emsgData) {
|
||||||
try {
|
String schemeIdUri = Assertions.checkNotNull(emsgData.readNullTerminatedString());
|
||||||
String schemeIdUri = Assertions.checkNotNull(emsgData.readNullTerminatedString());
|
String value = Assertions.checkNotNull(emsgData.readNullTerminatedString());
|
||||||
String value = Assertions.checkNotNull(emsgData.readNullTerminatedString());
|
long durationMs = emsgData.readUnsignedInt();
|
||||||
long durationMs = emsgData.readUnsignedInt();
|
long id = emsgData.readUnsignedInt();
|
||||||
long id = emsgData.readUnsignedInt();
|
byte[] messageData =
|
||||||
byte[] messageData =
|
Arrays.copyOfRange(emsgData.data, emsgData.getPosition(), emsgData.limit());
|
||||||
Arrays.copyOfRange(emsgData.data, emsgData.getPosition(), emsgData.limit());
|
return new EventMessage(schemeIdUri, value, durationMs, id, messageData);
|
||||||
return new EventMessage(schemeIdUri, value, durationMs, id, messageData);
|
|
||||||
} catch (RuntimeException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,20 +78,13 @@ public class MetadataRendererTest {
|
|||||||
/* id= */ 0,
|
/* id= */ 0,
|
||||||
"Test data".getBytes(UTF_8));
|
"Test data".getBytes(UTF_8));
|
||||||
|
|
||||||
List<Metadata> metadata = runRenderer(EMSG_FORMAT, eventMessageEncoder.encode(emsg));
|
List<Metadata> metadata = runRenderer(eventMessageEncoder.encode(emsg));
|
||||||
|
|
||||||
assertThat(metadata).hasSize(1);
|
assertThat(metadata).hasSize(1);
|
||||||
assertThat(metadata.get(0).length()).isEqualTo(1);
|
assertThat(metadata.get(0).length()).isEqualTo(1);
|
||||||
assertThat(metadata.get(0).get(0)).isEqualTo(emsg);
|
assertThat(metadata.get(0).get(0)).isEqualTo(emsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void decodeMetadata_skipsMalformed() throws Exception {
|
|
||||||
List<Metadata> metadata = runRenderer(EMSG_FORMAT, "not valid emsg bytes".getBytes(UTF_8));
|
|
||||||
|
|
||||||
assertThat(metadata).isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void decodeMetadata_handlesId3WrappedInEmsg() throws Exception {
|
public void decodeMetadata_handlesId3WrappedInEmsg() throws Exception {
|
||||||
EventMessage emsg =
|
EventMessage emsg =
|
||||||
@ -102,7 +95,7 @@ public class MetadataRendererTest {
|
|||||||
/* id= */ 0,
|
/* id= */ 0,
|
||||||
encodeTxxxId3Frame("Test description", "Test value"));
|
encodeTxxxId3Frame("Test description", "Test value"));
|
||||||
|
|
||||||
List<Metadata> metadata = runRenderer(EMSG_FORMAT, eventMessageEncoder.encode(emsg));
|
List<Metadata> metadata = runRenderer(eventMessageEncoder.encode(emsg));
|
||||||
|
|
||||||
assertThat(metadata).hasSize(1);
|
assertThat(metadata).hasSize(1);
|
||||||
assertThat(metadata.get(0).length()).isEqualTo(1);
|
assertThat(metadata.get(0).length()).isEqualTo(1);
|
||||||
@ -122,7 +115,7 @@ public class MetadataRendererTest {
|
|||||||
/* id= */ 0,
|
/* id= */ 0,
|
||||||
SCTE35_TIME_SIGNAL_BYTES);
|
SCTE35_TIME_SIGNAL_BYTES);
|
||||||
|
|
||||||
List<Metadata> metadata = runRenderer(EMSG_FORMAT, eventMessageEncoder.encode(emsg));
|
List<Metadata> metadata = runRenderer(eventMessageEncoder.encode(emsg));
|
||||||
|
|
||||||
assertThat(metadata).hasSize(1);
|
assertThat(metadata).hasSize(1);
|
||||||
assertThat(metadata.get(0).length()).isEqualTo(1);
|
assertThat(metadata.get(0).length()).isEqualTo(1);
|
||||||
@ -139,18 +132,17 @@ public class MetadataRendererTest {
|
|||||||
/* id= */ 0,
|
/* id= */ 0,
|
||||||
"Not a real ID3 tag".getBytes(ISO_8859_1));
|
"Not a real ID3 tag".getBytes(ISO_8859_1));
|
||||||
|
|
||||||
List<Metadata> metadata = runRenderer(EMSG_FORMAT, eventMessageEncoder.encode(emsg));
|
List<Metadata> metadata = runRenderer(eventMessageEncoder.encode(emsg));
|
||||||
|
|
||||||
assertThat(metadata).isEmpty();
|
assertThat(metadata).isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Metadata> runRenderer(Format format, byte[] input)
|
private static List<Metadata> runRenderer(byte[] input) throws ExoPlaybackException {
|
||||||
throws ExoPlaybackException {
|
|
||||||
List<Metadata> metadata = new ArrayList<>();
|
List<Metadata> metadata = new ArrayList<>();
|
||||||
MetadataRenderer renderer = new MetadataRenderer(metadata::add, /* outputLooper= */ null);
|
MetadataRenderer renderer = new MetadataRenderer(metadata::add, /* outputLooper= */ null);
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {format},
|
new Format[] {EMSG_FORMAT},
|
||||||
new FakeSampleStream(format, /* eventDispatcher= */ null, input),
|
new FakeSampleStream(EMSG_FORMAT, /* eventDispatcher= */ null, input),
|
||||||
/* offsetUs= */ 0L);
|
/* offsetUs= */ 0L);
|
||||||
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the format
|
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the format
|
||||||
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the data
|
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the data
|
||||||
|
@ -360,9 +360,6 @@ public final class PlayerEmsgHandler implements Handler.Callback {
|
|||||||
}
|
}
|
||||||
long eventTimeUs = inputBuffer.timeUs;
|
long eventTimeUs = inputBuffer.timeUs;
|
||||||
Metadata metadata = decoder.decode(inputBuffer);
|
Metadata metadata = decoder.decode(inputBuffer);
|
||||||
if (metadata == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
EventMessage eventMessage = (EventMessage) metadata.get(0);
|
EventMessage eventMessage = (EventMessage) metadata.get(0);
|
||||||
if (isPlayerEmsgEvent(eventMessage.schemeIdUri, eventMessage.value)) {
|
if (isPlayerEmsgEvent(eventMessage.schemeIdUri, eventMessage.value)) {
|
||||||
parsePlayerEmsgEvent(eventTimeUs, eventMessage);
|
parsePlayerEmsgEvent(eventTimeUs, eventMessage);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user