From db68aa94901f32f34d415b559f932e86b9b98f6b Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 2 Oct 2019 11:50:12 +0100 Subject: [PATCH] Rollback of https://github.com/google/ExoPlayer/commit/01f484cbe965f7858f9621c97fec94d30eef188a *** 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 --- .../metadata/emsg/EventMessageDecoder.java | 28 ++++++------------- .../metadata/MetadataRendererTest.java | 22 +++++---------- .../source/dash/PlayerEmsgHandler.java | 3 -- 3 files changed, 15 insertions(+), 38 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java index bbf7476d25..d87376feb0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.metadata.emsg; -import androidx.annotation.Nullable; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataDecoder; import com.google.android.exoplayer2.metadata.MetadataInputBuffer; @@ -29,31 +28,20 @@ public final class EventMessageDecoder implements MetadataDecoder { @SuppressWarnings("ByteBufferBackingArray") @Override - @Nullable public Metadata decode(MetadataInputBuffer inputBuffer) { ByteBuffer buffer = Assertions.checkNotNull(inputBuffer.data); byte[] data = buffer.array(); int size = buffer.limit(); - EventMessage decodedEventMessage = decode(new ParsableByteArray(data, size)); - if (decodedEventMessage == null) { - return null; - } else { - return new Metadata(decodedEventMessage); - } + return new Metadata(decode(new ParsableByteArray(data, size))); } - @Nullable public EventMessage decode(ParsableByteArray emsgData) { - try { - String schemeIdUri = Assertions.checkNotNull(emsgData.readNullTerminatedString()); - String value = Assertions.checkNotNull(emsgData.readNullTerminatedString()); - long durationMs = emsgData.readUnsignedInt(); - long id = emsgData.readUnsignedInt(); - byte[] messageData = - Arrays.copyOfRange(emsgData.data, emsgData.getPosition(), emsgData.limit()); - return new EventMessage(schemeIdUri, value, durationMs, id, messageData); - } catch (RuntimeException e) { - return null; - } + String schemeIdUri = Assertions.checkNotNull(emsgData.readNullTerminatedString()); + String value = Assertions.checkNotNull(emsgData.readNullTerminatedString()); + long durationMs = emsgData.readUnsignedInt(); + long id = emsgData.readUnsignedInt(); + byte[] messageData = + Arrays.copyOfRange(emsgData.data, emsgData.getPosition(), emsgData.limit()); + return new EventMessage(schemeIdUri, value, durationMs, id, messageData); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/metadata/MetadataRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/metadata/MetadataRendererTest.java index de18d370ec..1ad0ce6b79 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/metadata/MetadataRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/metadata/MetadataRendererTest.java @@ -78,20 +78,13 @@ public class MetadataRendererTest { /* id= */ 0, "Test data".getBytes(UTF_8)); - List metadata = runRenderer(EMSG_FORMAT, eventMessageEncoder.encode(emsg)); + List metadata = runRenderer(eventMessageEncoder.encode(emsg)); assertThat(metadata).hasSize(1); assertThat(metadata.get(0).length()).isEqualTo(1); assertThat(metadata.get(0).get(0)).isEqualTo(emsg); } - @Test - public void decodeMetadata_skipsMalformed() throws Exception { - List metadata = runRenderer(EMSG_FORMAT, "not valid emsg bytes".getBytes(UTF_8)); - - assertThat(metadata).isEmpty(); - } - @Test public void decodeMetadata_handlesId3WrappedInEmsg() throws Exception { EventMessage emsg = @@ -102,7 +95,7 @@ public class MetadataRendererTest { /* id= */ 0, encodeTxxxId3Frame("Test description", "Test value")); - List metadata = runRenderer(EMSG_FORMAT, eventMessageEncoder.encode(emsg)); + List metadata = runRenderer(eventMessageEncoder.encode(emsg)); assertThat(metadata).hasSize(1); assertThat(metadata.get(0).length()).isEqualTo(1); @@ -122,7 +115,7 @@ public class MetadataRendererTest { /* id= */ 0, SCTE35_TIME_SIGNAL_BYTES); - List metadata = runRenderer(EMSG_FORMAT, eventMessageEncoder.encode(emsg)); + List metadata = runRenderer(eventMessageEncoder.encode(emsg)); assertThat(metadata).hasSize(1); assertThat(metadata.get(0).length()).isEqualTo(1); @@ -139,18 +132,17 @@ public class MetadataRendererTest { /* id= */ 0, "Not a real ID3 tag".getBytes(ISO_8859_1)); - List metadata = runRenderer(EMSG_FORMAT, eventMessageEncoder.encode(emsg)); + List metadata = runRenderer(eventMessageEncoder.encode(emsg)); assertThat(metadata).isEmpty(); } - private static List runRenderer(Format format, byte[] input) - throws ExoPlaybackException { + private static List runRenderer(byte[] input) throws ExoPlaybackException { List metadata = new ArrayList<>(); MetadataRenderer renderer = new MetadataRenderer(metadata::add, /* outputLooper= */ null); renderer.replaceStream( - new Format[] {format}, - new FakeSampleStream(format, /* eventDispatcher= */ null, input), + new Format[] {EMSG_FORMAT}, + new FakeSampleStream(EMSG_FORMAT, /* eventDispatcher= */ null, input), /* offsetUs= */ 0L); renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the format renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the data diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java index 883ca7420e..af4bf3ad70 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java @@ -360,9 +360,6 @@ public final class PlayerEmsgHandler implements Handler.Callback { } long eventTimeUs = inputBuffer.timeUs; Metadata metadata = decoder.decode(inputBuffer); - if (metadata == null) { - continue; - } EventMessage eventMessage = (EventMessage) metadata.get(0); if (isPlayerEmsgEvent(eventMessage.schemeIdUri, eventMessage.value)) { parsePlayerEmsgEvent(eventTimeUs, eventMessage);