Make EventSampleStream honour FLAG_PEEK and FLAG_OMIT_SAMPLE_DATA

#minor-release

PiperOrigin-RevId: 420289147
This commit is contained in:
bachinger 2022-01-07 15:35:01 +00:00
parent e06b15506c
commit 6ea54253ac
2 changed files with 67 additions and 5 deletions

View File

@ -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;
if ((readFlags & SampleStream.FLAG_PEEK) == 0) {
currentIndex++;
}
if ((readFlags & SampleStream.FLAG_OMIT_SAMPLE_DATA) == 0) {
byte[] serializedEvent = eventMessageEncoder.encode(eventStream.events[sampleIndex]); byte[] serializedEvent = eventMessageEncoder.encode(eventStream.events[sampleIndex]);
buffer.ensureSpaceForWrite(serializedEvent.length); buffer.ensureSpaceForWrite(serializedEvent.length);
buffer.data.put(serializedEvent); 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;

View File

@ -23,6 +23,7 @@ import androidx.media3.common.MimeTypes;
import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.decoder.DecoderInputBuffer;
import androidx.media3.exoplayer.FormatHolder; import androidx.media3.exoplayer.FormatHolder;
import androidx.media3.exoplayer.dash.manifest.EventStream; import androidx.media3.exoplayer.dash.manifest.EventStream;
import androidx.media3.exoplayer.source.SampleStream;
import androidx.media3.extractor.metadata.MetadataInputBuffer; import androidx.media3.extractor.metadata.MetadataInputBuffer;
import androidx.media3.extractor.metadata.emsg.EventMessage; import androidx.media3.extractor.metadata.emsg.EventMessage;
import androidx.media3.extractor.metadata.emsg.EventMessageEncoder; import androidx.media3.extractor.metadata.emsg.EventMessageEncoder;
@ -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 {
} }
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) {