diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java b/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java index 2ddbfb4708..2bd54367e1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java @@ -61,15 +61,11 @@ public final class EventMessageEncoder { writeUnsignedInt(dataOutputStream, duration); writeUnsignedInt(dataOutputStream, eventMessage.id); dataOutputStream.write(eventMessage.messageData); + dataOutputStream.flush(); return byteArrayOutputStream.toByteArray(); } catch (IOException e) { + // Should never happen. throw new RuntimeException(e); - } finally { - try { - dataOutputStream.close(); - } catch (IOException ignored) { - // ignored - } } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java index f7f0c63300..1ce0ccb93d 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java @@ -19,7 +19,6 @@ import static com.google.common.truth.Truth.assertThat; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataInputBuffer; -import java.io.IOException; import java.nio.ByteBuffer; import org.junit.Test; import org.junit.runner.RunWith; @@ -56,63 +55,4 @@ public final class EventMessageDecoderTest { assertThat(eventMessage.messageData).isEqualTo(new byte[]{0, 1, 2, 3, 4}); } - @Test - public void testEncodeEventStream() throws IOException { - EventMessage eventMessage = new EventMessage("urn:test", "123", 3000, 1000403, - new byte[] {0, 1, 2, 3, 4}); - byte[] expectedEmsgBody = new byte[] { - 117, 114, 110, 58, 116, 101, 115, 116, 0, // scheme_id_uri = "urn:test" - 49, 50, 51, 0, // value = "123" - 0, 0, -69, -128, // timescale = 48000 - 0, 0, -69, -128, // presentation_time_delta = 48 - 0, 2, 50, -128, // event_duration = 144000 - 0, 15, 67, -45, // id = 1000403 - 0, 1, 2, 3, 4}; // message_data = {0, 1, 2, 3, 4} - byte[] encodedByteArray = new EventMessageEncoder().encode(eventMessage, 48000, 1000000); - assertThat(encodedByteArray).isEqualTo(expectedEmsgBody); - } - - @Test - public void testEncodeDecodeEventStream() throws IOException { - EventMessage expectedEmsg = new EventMessage("urn:test", "123", 3000, 1000403, - new byte[] {0, 1, 2, 3, 4}); - byte[] encodedByteArray = new EventMessageEncoder().encode(expectedEmsg, 48000, 1); - MetadataInputBuffer buffer = new MetadataInputBuffer(); - buffer.data = ByteBuffer.allocate(encodedByteArray.length).put(encodedByteArray); - - EventMessageDecoder decoder = new EventMessageDecoder(); - Metadata metadata = decoder.decode(buffer); - assertThat(metadata.length()).isEqualTo(1); - assertThat(metadata.get(0)).isEqualTo(expectedEmsg); - } - - @Test - public void testEncodeEventStreamMultipleTimesWorkingCorrectly() throws IOException { - EventMessage eventMessage = new EventMessage("urn:test", "123", 3000, 1000403, - new byte[] {0, 1, 2, 3, 4}); - byte[] expectedEmsgBody = new byte[] { - 117, 114, 110, 58, 116, 101, 115, 116, 0, // scheme_id_uri = "urn:test" - 49, 50, 51, 0, // value = "123" - 0, 0, -69, -128, // timescale = 48000 - 0, 0, -69, -128, // presentation_time_delta = 48 - 0, 2, 50, -128, // event_duration = 144000 - 0, 15, 67, -45, // id = 1000403 - 0, 1, 2, 3, 4}; // message_data = {0, 1, 2, 3, 4} - EventMessage eventMessage1 = new EventMessage("urn:test", "123", 3000, 1000402, - new byte[] {4, 3, 2, 1, 0}); - byte[] expectedEmsgBody1 = new byte[] { - 117, 114, 110, 58, 116, 101, 115, 116, 0, // scheme_id_uri = "urn:test" - 49, 50, 51, 0, // value = "123" - 0, 0, -69, -128, // timescale = 48000 - 0, 0, -69, -128, // presentation_time_delta = 48 - 0, 2, 50, -128, // event_duration = 144000 - 0, 15, 67, -46, // id = 1000402 - 4, 3, 2, 1, 0}; // message_data = {4, 3, 2, 1, 0} - EventMessageEncoder eventMessageEncoder = new EventMessageEncoder(); - byte[] encodedByteArray = eventMessageEncoder.encode(eventMessage, 48000, 1000000); - assertThat(encodedByteArray).isEqualTo(expectedEmsgBody); - byte[] encodedByteArray1 = eventMessageEncoder.encode(eventMessage1, 48000, 1000000); - assertThat(encodedByteArray1).isEqualTo(expectedEmsgBody1); - } - } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java new file mode 100644 index 0000000000..f526fc3451 --- /dev/null +++ b/library/core/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2017 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.emsg; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.android.exoplayer2.metadata.Metadata; +import com.google.android.exoplayer2.metadata.MetadataInputBuffer; +import java.io.IOException; +import java.nio.ByteBuffer; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +/** + * Unit test for {@link EventMessageEncoder}. + */ +@RunWith(RobolectricTestRunner.class) +@Config(sdk = Config.TARGET_SDK, manifest = Config.NONE) +public final class EventMessageEncoderTest { + + @Test + public void testEncodeEventStream() throws IOException { + EventMessage eventMessage = new EventMessage("urn:test", "123", 3000, 1000403, + new byte[] {0, 1, 2, 3, 4}); + byte[] expectedEmsgBody = new byte[] { + 117, 114, 110, 58, 116, 101, 115, 116, 0, // scheme_id_uri = "urn:test" + 49, 50, 51, 0, // value = "123" + 0, 0, -69, -128, // timescale = 48000 + 0, 0, -69, -128, // presentation_time_delta = 48 + 0, 2, 50, -128, // event_duration = 144000 + 0, 15, 67, -45, // id = 1000403 + 0, 1, 2, 3, 4}; // message_data = {0, 1, 2, 3, 4} + byte[] encodedByteArray = new EventMessageEncoder().encode(eventMessage, 48000, 1000000); + assertThat(encodedByteArray).isEqualTo(expectedEmsgBody); + } + + @Test + public void testEncodeDecodeEventStream() throws IOException { + EventMessage expectedEmsg = new EventMessage("urn:test", "123", 3000, 1000403, + new byte[] {0, 1, 2, 3, 4}); + byte[] encodedByteArray = new EventMessageEncoder().encode(expectedEmsg, 48000, 1); + MetadataInputBuffer buffer = new MetadataInputBuffer(); + buffer.data = ByteBuffer.allocate(encodedByteArray.length).put(encodedByteArray); + + EventMessageDecoder decoder = new EventMessageDecoder(); + Metadata metadata = decoder.decode(buffer); + assertThat(metadata.length()).isEqualTo(1); + assertThat(metadata.get(0)).isEqualTo(expectedEmsg); + } + + @Test + public void testEncodeEventStreamMultipleTimesWorkingCorrectly() throws IOException { + EventMessage eventMessage = new EventMessage("urn:test", "123", 3000, 1000403, + new byte[] {0, 1, 2, 3, 4}); + byte[] expectedEmsgBody = new byte[] { + 117, 114, 110, 58, 116, 101, 115, 116, 0, // scheme_id_uri = "urn:test" + 49, 50, 51, 0, // value = "123" + 0, 0, -69, -128, // timescale = 48000 + 0, 0, -69, -128, // presentation_time_delta = 48 + 0, 2, 50, -128, // event_duration = 144000 + 0, 15, 67, -45, // id = 1000403 + 0, 1, 2, 3, 4}; // message_data = {0, 1, 2, 3, 4} + EventMessage eventMessage1 = new EventMessage("urn:test", "123", 3000, 1000402, + new byte[] {4, 3, 2, 1, 0}); + byte[] expectedEmsgBody1 = new byte[] { + 117, 114, 110, 58, 116, 101, 115, 116, 0, // scheme_id_uri = "urn:test" + 49, 50, 51, 0, // value = "123" + 0, 0, -69, -128, // timescale = 48000 + 0, 0, -69, -128, // presentation_time_delta = 48 + 0, 2, 50, -128, // event_duration = 144000 + 0, 15, 67, -46, // id = 1000402 + 4, 3, 2, 1, 0}; // message_data = {4, 3, 2, 1, 0} + EventMessageEncoder eventMessageEncoder = new EventMessageEncoder(); + byte[] encodedByteArray = eventMessageEncoder.encode(eventMessage, 48000, 1000000); + assertThat(encodedByteArray).isEqualTo(expectedEmsgBody); + byte[] encodedByteArray1 = eventMessageEncoder.encode(eventMessage1, 48000, 1000000); + assertThat(encodedByteArray1).isEqualTo(expectedEmsgBody1); + } + +} diff --git a/library/dash/src/androidTest/assets/sample_mpd_4_event_stream b/library/dash/src/androidTest/assets/sample_mpd_4_event_stream index 4352205d3f..cf96541ca0 100644 --- a/library/dash/src/androidTest/assets/sample_mpd_4_event_stream +++ b/library/dash/src/androidTest/assets/sample_mpd_4_event_stream @@ -27,33 +27,19 @@ - - - http://redirector.googlevideo.com/videoplayback/id/BktsoMO3OMs.0/itag/140/source/yt_live_broadcast/ratebypass/yes/cmbypass/yes/mime/audio%2Fmp4/live/1/gir/yes/noclen/1/signature/B5137EA0CC278C07DD056D204E863CC81EDEB39E.1AD5D242EBC94922EDA7165353A89A5E08A4103A/key/dg_test0/mpd_version/5/ip/0.0.0.0/ipbits/0/expire/1476490914/sparams/ip,ipbits,expire,id,itag,source,ratebypass,cmbypass,mime,live,gir,noclen/ + http://www.dummy.url/ - http://redirector.googlevideo.com/videoplayback/id/BktsoMO3OMs.0/itag/133/source/yt_live_broadcast/ratebypass/yes/cmbypass/yes/mime/video%2Fmp4/live/1/gir/yes/noclen/1/signature/90154AE9C5C9D9D519CBF2E43AB0A1778375992D.40E2E855ADFB38FA7E95E168FEEEA6796B080BD7/key/dg_test0/mpd_version/5/ip/0.0.0.0/ipbits/0/expire/1476490914/sparams/ip,ipbits,expire,id,itag,source,ratebypass,cmbypass,mime,live,gir,noclen/ - - - http://redirector.googlevideo.com/videoplayback/id/BktsoMO3OMs.0/itag/134/source/yt_live_broadcast/ratebypass/yes/cmbypass/yes/mime/video%2Fmp4/live/1/gir/yes/noclen/1/signature/5C094AEFDCEB1A4D2F3C05F8BD095C336EF0E1C3.7AE6B9951B0237AAE6F031927AACAC4974BAFFAA/key/dg_test0/mpd_version/5/ip/0.0.0.0/ipbits/0/expire/1476490914/sparams/ip,ipbits,expire,id,itag,source,ratebypass,cmbypass,mime,live,gir,noclen/ - - - http://redirector.googlevideo.com/videoplayback/id/BktsoMO3OMs.0/itag/135/source/yt_live_broadcast/ratebypass/yes/cmbypass/yes/mime/video%2Fmp4/live/1/gir/yes/noclen/1/signature/1F7660CA4E5B4AE4D60E18795680E34CDD2EF3C9.800B0A1D5F490DE142CCF4C88C64FD21D42129/key/dg_test0/mpd_version/5/ip/0.0.0.0/ipbits/0/expire/1476490914/sparams/ip,ipbits,expire,id,itag,source,ratebypass,cmbypass,mime,live,gir,noclen/ - - - http://redirector.googlevideo.com/videoplayback/id/BktsoMO3OMs.0/itag/160/source/yt_live_broadcast/ratebypass/yes/cmbypass/yes/mime/video%2Fmp4/live/1/gir/yes/noclen/1/signature/94EB61673784DF0C4237A1A866F2E171C8A64ADB.AEC00AA06C2278FEA8702FB62693B70D8977F46C/key/dg_test0/mpd_version/5/ip/0.0.0.0/ipbits/0/expire/1476490914/sparams/ip,ipbits,expire,id,itag,source,ratebypass,cmbypass,mime,live,gir,noclen/ - - - http://redirector.googlevideo.com/videoplayback/id/BktsoMO3OMs.0/itag/136/source/yt_live_broadcast/ratebypass/yes/cmbypass/yes/mime/video%2Fmp4/live/1/gir/yes/noclen/1/signature/6D8C34FC30A1F1A4F700B61180D1C4CCF6274844.29EBCB4A837DE626C52C66CF650519E61C2FF0BF/key/dg_test0/mpd_version/5/ip/0.0.0.0/ipbits/0/expire/1476490914/sparams/ip,ipbits,expire,id,itag,source,ratebypass,cmbypass,mime,live,gir,noclen/ + http://www.dummy.url/ diff --git a/library/dash/src/androidTest/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java b/library/dash/src/androidTest/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java index b24a7da878..37dc6a748e 100644 --- a/library/dash/src/androidTest/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java +++ b/library/dash/src/androidTest/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java @@ -79,6 +79,7 @@ public class DashManifestParserTest extends InstrumentationTestCase { Period period = mpd.getPeriod(0); assertEquals(3, period.eventStreams.size()); + // assert text-only event stream EventStream eventStream1 = period.eventStreams.get(0); assertEquals(1, eventStream1.events.length);