mirror of
https://github.com/androidx/media.git
synced 2025-05-06 23:20:42 +08:00
Simplify EventMessageEncoder/Decoder serialization
We're no longer tied to the emsg spec, so we can skip unused fields and assume ms for duration. Also remove @Nullable annotation from EventMessageEncoder#encode, it seems the current implementation never returns null PiperOrigin-RevId: 262135009
This commit is contained in:
parent
bb6b0e1a5a
commit
a08b537e8e
@ -15,22 +15,17 @@
|
||||
*/
|
||||
package com.google.android.exoplayer2.metadata.emsg;
|
||||
|
||||
import com.google.android.exoplayer2.C;
|
||||
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.Assertions;
|
||||
import com.google.android.exoplayer2.util.Log;
|
||||
import com.google.android.exoplayer2.util.ParsableByteArray;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
|
||||
/** Decodes data encoded by {@link EventMessageEncoder}. */
|
||||
public final class EventMessageDecoder implements MetadataDecoder {
|
||||
|
||||
private static final String TAG = "EventMessageDecoder";
|
||||
|
||||
@SuppressWarnings("ByteBufferBackingArray")
|
||||
@Override
|
||||
public Metadata decode(MetadataInputBuffer inputBuffer) {
|
||||
@ -43,15 +38,7 @@ public final class EventMessageDecoder implements MetadataDecoder {
|
||||
public EventMessage decode(ParsableByteArray emsgData) {
|
||||
String schemeIdUri = Assertions.checkNotNull(emsgData.readNullTerminatedString());
|
||||
String value = Assertions.checkNotNull(emsgData.readNullTerminatedString());
|
||||
long timescale = emsgData.readUnsignedInt();
|
||||
long presentationTimeDelta = emsgData.readUnsignedInt();
|
||||
if (presentationTimeDelta != 0) {
|
||||
// We expect the source to have accounted for presentation_time_delta by adjusting the sample
|
||||
// timestamp and zeroing the field in the sample data. Log a warning if the field is non-zero.
|
||||
Log.w(TAG, "Ignoring non-zero presentation_time_delta: " + presentationTimeDelta);
|
||||
}
|
||||
long durationMs =
|
||||
Util.scaleLargeTimestamp(emsgData.readUnsignedInt(), C.MILLIS_PER_SECOND, timescale);
|
||||
long durationMs = emsgData.readUnsignedInt();
|
||||
long id = emsgData.readUnsignedInt();
|
||||
byte[] messageData =
|
||||
Arrays.copyOfRange(emsgData.data, emsgData.getPosition(), emsgData.limit());
|
||||
|
@ -15,7 +15,6 @@
|
||||
*/
|
||||
package com.google.android.exoplayer2.metadata.emsg;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
@ -40,15 +39,12 @@ public final class EventMessageEncoder {
|
||||
* @param eventMessage The event message to be encoded.
|
||||
* @return The serialized byte array.
|
||||
*/
|
||||
@Nullable
|
||||
public byte[] encode(EventMessage eventMessage) {
|
||||
byteArrayOutputStream.reset();
|
||||
try {
|
||||
writeNullTerminatedString(dataOutputStream, eventMessage.schemeIdUri);
|
||||
String nonNullValue = eventMessage.value != null ? eventMessage.value : "";
|
||||
writeNullTerminatedString(dataOutputStream, nonNullValue);
|
||||
writeUnsignedInt(dataOutputStream, 1000); // timescale
|
||||
writeUnsignedInt(dataOutputStream, 0); // presentation_time_delta
|
||||
writeUnsignedInt(dataOutputStream, eventMessage.durationMs);
|
||||
writeUnsignedInt(dataOutputStream, eventMessage.id);
|
||||
dataOutputStream.write(eventMessage.messageData);
|
||||
|
@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.google.android.exoplayer2.metadata.emsg;
|
||||
|
||||
import static com.google.android.exoplayer2.testutil.TestUtil.createByteArray;
|
||||
import static com.google.android.exoplayer2.testutil.TestUtil.joinByteArrays;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
@ -30,18 +32,19 @@ public final class EventMessageDecoderTest {
|
||||
|
||||
@Test
|
||||
public void testDecodeEventMessage() {
|
||||
byte[] rawEmsgBody = 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 = 48000
|
||||
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[] rawEmsgBody =
|
||||
joinByteArrays(
|
||||
createByteArray(117, 114, 110, 58, 116, 101, 115, 116, 0), // scheme_id_uri = "urn:test"
|
||||
createByteArray(49, 50, 51, 0), // value = "123"
|
||||
createByteArray(0, 0, 11, 184), // event_duration_ms = 3000
|
||||
createByteArray(0, 15, 67, 211), // id = 1000403
|
||||
createByteArray(0, 1, 2, 3, 4)); // message_data = {0, 1, 2, 3, 4}
|
||||
EventMessageDecoder decoder = new EventMessageDecoder();
|
||||
MetadataInputBuffer buffer = new MetadataInputBuffer();
|
||||
buffer.data = ByteBuffer.allocate(rawEmsgBody.length).put(rawEmsgBody);
|
||||
|
||||
Metadata metadata = decoder.decode(buffer);
|
||||
|
||||
assertThat(metadata.length()).isEqualTo(1);
|
||||
EventMessage eventMessage = (EventMessage) metadata.get(0);
|
||||
assertThat(eventMessage.schemeIdUri).isEqualTo("urn:test");
|
||||
|
@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.google.android.exoplayer2.metadata.emsg;
|
||||
|
||||
import static com.google.android.exoplayer2.testutil.TestUtil.createByteArray;
|
||||
import static com.google.android.exoplayer2.testutil.TestUtil.joinByteArrays;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
@ -29,67 +31,52 @@ import org.junit.runner.RunWith;
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public final class EventMessageEncoderTest {
|
||||
|
||||
private static final EventMessage DECODED_MESSAGE =
|
||||
new EventMessage("urn:test", "123", 3000, 1000403, new byte[] {0, 1, 2, 3, 4});
|
||||
|
||||
private static final byte[] ENCODED_MESSAGE =
|
||||
joinByteArrays(
|
||||
createByteArray(117, 114, 110, 58, 116, 101, 115, 116, 0), // scheme_id_uri = "urn:test"
|
||||
createByteArray(49, 50, 51, 0), // value = "123"
|
||||
createByteArray(0, 0, 11, 184), // event_duration_ms = 3000
|
||||
createByteArray(0, 15, 67, 211), // id = 1000403
|
||||
createByteArray(0, 1, 2, 3, 4)); // message_data = {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, 3, -24, // timescale = 1000
|
||||
0, 0, 0, 0, // presentation_time_delta = 0
|
||||
0, 0, 11, -72, // event_duration = 3000
|
||||
0, 15, 67, -45, // id = 1000403
|
||||
0, 1, 2, 3, 4
|
||||
}; // message_data = {0, 1, 2, 3, 4}
|
||||
byte[] encodedByteArray = new EventMessageEncoder().encode(eventMessage);
|
||||
assertThat(encodedByteArray).isEqualTo(expectedEmsgBody);
|
||||
byte[] foo = new byte[] {1, 2, 3};
|
||||
|
||||
byte[] encodedByteArray = new EventMessageEncoder().encode(DECODED_MESSAGE);
|
||||
assertThat(encodedByteArray).isEqualTo(ENCODED_MESSAGE);
|
||||
}
|
||||
|
||||
@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);
|
||||
byte[] encodedByteArray = new EventMessageEncoder().encode(DECODED_MESSAGE);
|
||||
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);
|
||||
assertThat(metadata.get(0)).isEqualTo(DECODED_MESSAGE);
|
||||
}
|
||||
|
||||
@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, 3, -24, // timescale = 1000
|
||||
0, 0, 0, 0, // presentation_time_delta = 0
|
||||
0, 0, 11, -72, // event_duration = 3000
|
||||
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, 3, -24, // timescale = 1000
|
||||
0, 0, 0, 0, // presentation_time_delta = 0
|
||||
0, 0, 11, -72, // event_duration = 3000
|
||||
0, 15, 67, -46, // id = 1000402
|
||||
4, 3, 2, 1, 0
|
||||
}; // message_data = {4, 3, 2, 1, 0}
|
||||
joinByteArrays(
|
||||
createByteArray(117, 114, 110, 58, 116, 101, 115, 116, 0), // scheme_id_uri = "urn:test"
|
||||
createByteArray(49, 50, 51, 0), // value = "123"
|
||||
createByteArray(0, 0, 11, 184), // event_duration_ms = 3000
|
||||
createByteArray(0, 15, 67, 210), // id = 1000402
|
||||
createByteArray(4, 3, 2, 1, 0)); // message_data = {4, 3, 2, 1, 0}
|
||||
|
||||
EventMessageEncoder eventMessageEncoder = new EventMessageEncoder();
|
||||
byte[] encodedByteArray = eventMessageEncoder.encode(eventMessage);
|
||||
assertThat(encodedByteArray).isEqualTo(expectedEmsgBody);
|
||||
byte[] encodedByteArray = eventMessageEncoder.encode(DECODED_MESSAGE);
|
||||
assertThat(encodedByteArray).isEqualTo(ENCODED_MESSAGE);
|
||||
byte[] encodedByteArray1 = eventMessageEncoder.encode(eventMessage1);
|
||||
assertThat(encodedByteArray1).isEqualTo(expectedEmsgBody1);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user