Commit bd52b19a by bachinger Committed by Oliver Woodman

Make EventSampleStream honour FLAG_PEEK and FLAG_OMIT_SAMPLE_DATA

#minor-release

PiperOrigin-RevId: 420289147
parent 8f8cde66
...@@ -114,10 +114,15 @@ import java.io.IOException; ...@@ -114,10 +114,15 @@ import java.io.IOException;
// More events may be appended later. // More events may be appended later.
return C.RESULT_NOTHING_READ; return C.RESULT_NOTHING_READ;
} }
int sampleIndex = currentIndex++; int sampleIndex = currentIndex;
byte[] serializedEvent = eventMessageEncoder.encode(eventStream.events[sampleIndex]); if ((readFlags & SampleStream.FLAG_PEEK) == 0) {
buffer.ensureSpaceForWrite(serializedEvent.length); currentIndex++;
buffer.data.put(serializedEvent); }
if ((readFlags & SampleStream.FLAG_OMIT_SAMPLE_DATA) == 0) {
byte[] serializedEvent = eventMessageEncoder.encode(eventStream.events[sampleIndex]);
buffer.ensureSpaceForWrite(serializedEvent.length);
buffer.data.put(serializedEvent);
}
buffer.timeUs = eventTimesUs[sampleIndex]; buffer.timeUs = eventTimesUs[sampleIndex];
buffer.setFlags(C.BUFFER_FLAG_KEY_FRAME); buffer.setFlags(C.BUFFER_FLAG_KEY_FRAME);
return C.RESULT_BUFFER_READ; return C.RESULT_BUFFER_READ;
......
...@@ -25,6 +25,7 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; ...@@ -25,6 +25,7 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.metadata.MetadataInputBuffer; import com.google.android.exoplayer2.metadata.MetadataInputBuffer;
import com.google.android.exoplayer2.metadata.emsg.EventMessage; import com.google.android.exoplayer2.metadata.emsg.EventMessage;
import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder; import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder;
import com.google.android.exoplayer2.source.SampleStream;
import com.google.android.exoplayer2.source.dash.manifest.EventStream; import com.google.android.exoplayer2.source.dash.manifest.EventStream;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import org.junit.Before; import org.junit.Before;
...@@ -132,6 +133,58 @@ public final class EventSampleStreamTest { ...@@ -132,6 +133,58 @@ public final class EventSampleStreamTest {
assertThat(inputBuffer.data.array()).isEqualTo(getEncodedMessage(eventMessage)); assertThat(inputBuffer.data.array()).isEqualTo(getEncodedMessage(eventMessage));
} }
@Test
public void readData_peek_doesNotAdvanceSampleIndex() {
long presentationTimeUs = 1000000;
EventMessage eventMessage = newEventMessageWithId(1);
EventStream eventStream =
new EventStream(
SCHEME_ID,
VALUE,
TIME_SCALE,
new long[] {presentationTimeUs},
new EventMessage[] {eventMessage});
EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, false);
// first read - read format
readData(sampleStream);
// read the event with FLAG_PEEK
int result = readData(sampleStream, SampleStream.FLAG_PEEK);
assertThat(result).isEqualTo(C.RESULT_BUFFER_READ);
assertThat(inputBuffer.isKeyFrame()).isTrue();
assertThat(inputBuffer.data.array()).isEqualTo(getEncodedMessage(eventMessage));
// read again gives the same message again (there is only one msg)
result = readData(sampleStream);
assertThat(result).isEqualTo(C.RESULT_BUFFER_READ);
assertThat(inputBuffer.isKeyFrame()).isTrue();
assertThat(inputBuffer.data.array()).isEqualTo(getEncodedMessage(eventMessage));
// read again gives end of stream
result = readData(sampleStream);
assertThat(result).isEqualTo(C.RESULT_BUFFER_READ);
assertThat(inputBuffer.isEndOfStream()).isTrue();
}
@Test
public void readData_omitSampleData_doesOmitSampleData() {
long presentationTimeUs = 1000000;
EventMessage eventMessage = newEventMessageWithId(1);
EventStream eventStream =
new EventStream(
SCHEME_ID,
VALUE,
TIME_SCALE,
new long[] {presentationTimeUs},
new EventMessage[] {eventMessage});
EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, false);
// first read - read format
readData(sampleStream);
// read the event with FLAG_OMIT_SAMPLE_DATA
int result = readData(sampleStream, SampleStream.FLAG_OMIT_SAMPLE_DATA);
assertThat(result).isEqualTo(C.RESULT_BUFFER_READ);
assertThat(inputBuffer.data).isNull();
}
/** /**
* Tests that {@link EventSampleStream#skipData(long)} will skip until the given position, and the * Tests that {@link EventSampleStream#skipData(long)} will skip until the given position, and the
* next {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, int)} call will return * next {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, int)} call will return
...@@ -390,8 +443,12 @@ public final class EventSampleStreamTest { ...@@ -390,8 +443,12 @@ public final class EventSampleStreamTest {
} }
private int readData(EventSampleStream sampleStream) { private int readData(EventSampleStream sampleStream) {
return readData(sampleStream, /* readFlags= */ 0);
}
private int readData(EventSampleStream sampleStream, @SampleStream.ReadFlags int readFlags) {
inputBuffer.clear(); inputBuffer.clear();
return sampleStream.readData(formatHolder, inputBuffer, /* readFlags= */ 0); return sampleStream.readData(formatHolder, inputBuffer, readFlags);
} }
private EventMessage newEventMessageWithId(int id) { private EventMessage newEventMessageWithId(int id) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment