Skip to content

Commit 0f6da2a

Browse files
committed
exoplayer: upd sabr classes
1 parent 4c4e2ee commit 0f6da2a

File tree

3 files changed

+83
-31
lines changed

3 files changed

+83
-31
lines changed

exoplayer-amzn-2.10.6/library/sabr/src/main/java/com/google/android/exoplayer2/source/sabr/parser/SabrExtractor.java

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -309,22 +309,32 @@ public void init(ExtractorOutput output) {
309309
@Override
310310
public int read(ExtractorInput input, PositionHolder seekPosition)
311311
throws IOException, InterruptedException {
312+
313+
Log.e(TAG, "Starting new SABR read...");
314+
312315
sampleRead = false;
313316
boolean continueReading = true;
314317
while (continueReading && !sampleRead) {
315318
SabrPart sabrPart = sabrStream.parse(input);
316319
continueReading = sabrPart != null;
317320

318-
//if (sabrPart instanceof FormatInitializedSabrPart) {
319-
// initializeFormat((FormatInitializedSabrPart) sabrPart);
320-
//} else if (sabrPart instanceof MediaSegmentInitSabrPart) {
321-
// initializeSegment((MediaSegmentInitSabrPart) sabrPart);
322-
//} else if (sabrPart instanceof MediaSegmentDataSabrPart) {
323-
// writeSegmentData((MediaSegmentDataSabrPart) sabrPart);
324-
//} else if (sabrPart instanceof MediaSegmentEndSabrPart) {
325-
// endSegment((MediaSegmentEndSabrPart) sabrPart);
321+
// Debug
322+
//if (sabrPart instanceof MediaSegmentDataSabrPart) {
323+
// MediaSegmentDataSabrPart data = (MediaSegmentDataSabrPart) sabrPart;
324+
// Log.e(TAG, "Consumed contentLength: " + data.contentLength);
325+
// data.data.skipFully(data.contentLength);
326326
//}
327327

328+
if (sabrPart instanceof FormatInitializedSabrPart) {
329+
initializeFormat((FormatInitializedSabrPart) sabrPart);
330+
} else if (sabrPart instanceof MediaSegmentInitSabrPart) {
331+
initializeSegment((MediaSegmentInitSabrPart) sabrPart);
332+
} else if (sabrPart instanceof MediaSegmentDataSabrPart) {
333+
writeSegmentData((MediaSegmentDataSabrPart) sabrPart);
334+
} else if (sabrPart instanceof MediaSegmentEndSabrPart) {
335+
endSegment((MediaSegmentEndSabrPart) sabrPart);
336+
}
337+
328338
if (continueReading && maybeSeekForCues(seekPosition, input.getPosition())) {
329339
return Extractor.RESULT_SEEK;
330340
}
@@ -371,7 +381,9 @@ private void writeSegmentData(MediaSegmentDataSabrPart part) throws IOException,
371381

372382
// TODO: init seek segment data
373383

374-
Track track = tracks.get(blockTrackNumber);
384+
// TODO: hardcoded blockTrackNumber is bad
385+
//Track track = tracks.get(blockTrackNumber);
386+
Track track = tracks.get(1);
375387

376388
// Ignore the block if we don't know about the track to which it belongs.
377389
if (track == null) {
@@ -401,7 +413,7 @@ private void initCurrentTrack() {
401413
currentTrack.stereoMode = format.stereoMode;
402414
currentTrack.sampleRate = format.sampleRate;
403415
currentTrack.name = format.label; // TODO: possibly wrong name
404-
currentTrack.codecId = format.codecs; // TODO: possibly wrong codec id
416+
currentTrack.codecId = translate(format.codecs); // TODO: possibly wrong codec id
405417
currentTrack.language = format.language;
406418

407419
if (format.colorInfo != null) {
@@ -421,19 +433,35 @@ private void initCurrentTrack() {
421433
}
422434

423435
private void initExtractorOutput() throws ParserException {
424-
if (isCodecSupported(currentTrack.codecId)) {
436+
String codecId = currentTrack.codecId;
437+
if (isCodecSupported(codecId)) {
425438
currentTrack.initializeOutput(extractorOutput, currentTrack.number);
426439
tracks.put(currentTrack.number, currentTrack);
427440
}
428441
currentTrack = null;
429442

430443
// We have a single track per SABR stream
431444
if (tracks.size() == 0) {
432-
throw new ParserException("No valid tracks were found");
445+
throw new ParserException("No valid tracks were found for codec: " + codecId);
433446
}
434447
extractorOutput.endTracks();
435448
}
436449

450+
private String translate(String codecId) {
451+
if (codecId == null) {
452+
return null;
453+
}
454+
455+
switch (codecId) {
456+
case "opus":
457+
return CODEC_ID_OPUS;
458+
case "vp9":
459+
return CODEC_ID_VP9;
460+
}
461+
462+
return codecId;
463+
}
464+
437465
private void commitSampleToOutput(Track track, long timeUs) {
438466
track.output.sampleMetadata(timeUs, blockFlags, sampleBytesWritten, 0, track.cryptoData);
439467
sampleRead = true;

exoplayer-amzn-2.10.6/library/sabr/src/main/java/com/google/android/exoplayer2/source/sabr/parser/SabrStream.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,13 @@ public class SabrStream {
5959
UMPPartId.SABR_REDIRECT,
6060
UMPPartId.FORMAT_INITIALIZATION_METADATA,
6161
UMPPartId.NEXT_REQUEST_POLICY,
62-
UMPPartId.LIVE_METADATA,
63-
UMPPartId.SABR_SEEK,
62+
//UMPPartId.LIVE_METADATA,
63+
//UMPPartId.SABR_SEEK,
6464
UMPPartId.SABR_ERROR,
6565
UMPPartId.SABR_CONTEXT_UPDATE,
6666
UMPPartId.SABR_CONTEXT_SENDING_POLICY,
67-
UMPPartId.RELOAD_PLAYER_RESPONSE
67+
UMPPartId.RELOAD_PLAYER_RESPONSE,
68+
//UMPPartId.SNACKBAR_MESSAGE // ???
6869
};
6970
private final int[] IGNORED_PARTS = {
7071
UMPPartId.REQUEST_IDENTIFIER,
@@ -145,6 +146,7 @@ public SabrStream(
145146
sqMismatchForwardCount = 0;
146147
}
147148

149+
148150
public SabrPart parse(@NonNull ExtractorInput extractorInput) {
149151
SabrPart result = null;
150152

@@ -482,16 +484,22 @@ private UMPPart nextKnownUMPPart(@NonNull ExtractorInput extractorInput) {
482484
part = decoder.decode(extractorInput);
483485

484486
if (part == null) {
487+
Log.e(TAG, "Cannot decode UMP stream. It is possibly ended.");
485488
break;
486489
}
487490

488491
// Normal reading: 47, 58. 52, 53, 42, 35, 20, 21, 22, 20...
489492
if (contains(KNOWN_PARTS, part.partId)) {
493+
Log.d(TAG, "Found known part. id: %s, size: %s, position: %s", part.partId, part.size, part.data.getPosition());
490494
break;
491495
} else {
492-
Log.e(TAG, "Unknown part encountered: %s", part.partId);
496+
Log.e(TAG, "Unknown part encountered. id: %s, size: %s, position: %s", part.partId, part.size, part.data.getPosition());
493497
part.skip(); // an essential part to continue reading
494498
}
499+
500+
// Debug
501+
//Log.e(TAG, "Unknown part encountered. id: %s, size: %s, position: %s", part.partId, part.size, part.data.getPosition());
502+
//part.skip(); // an essential part to continue reading
495503
}
496504

497505
return part;

exoplayer-amzn-2.10.6/library/sabr/src/main/java/com/google/android/exoplayer2/source/sabr/parser/processor/SabrProcessor.java

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.liskovsoft.sharedutils.helpers.Helpers;
4444
import com.liskovsoft.sharedutils.mylogger.Log;
4545

46+
import java.io.IOException;
4647
import java.util.ArrayList;
4748
import java.util.HashMap;
4849
import java.util.HashSet;
@@ -169,9 +170,16 @@ public ProcessMediaHeaderResult processMediaHeader(MediaHeader mediaHeader) {
169170
throw new SabrStreamError(String.format("FormatId not found in MediaHeader (media_header=%s)", mediaHeader));
170171
}
171172

173+
// MOD: triggered even when no match found (probably multi thread issue?)
172174
// Guard. This should not happen, except if we don't clear partial segments
173175
if (partialSegments.containsKey(Utils.toLong(mediaHeader.getHeaderId()))) {
174-
throw new SabrStreamError(String.format("Header ID %s already exists", mediaHeader.getHeaderId()));
176+
// TODO: investigate why different formats have the same header
177+
// MOD: fix the exception
178+
//throw new SabrStreamError(String.format("Header ID %s already exists", mediaHeader.getHeaderId()));
179+
int headerId = mediaHeader.getHeaderId();
180+
mediaHeader = mediaHeader.toBuilder()
181+
.setHeaderId(++headerId)
182+
.build();
175183
}
176184

177185
SelectedFormat initializedFormat = selectedFormats.get(mediaHeader.getFormatId().toString());
@@ -305,10 +313,10 @@ public ProcessMediaHeaderResult processMediaHeader(MediaHeader mediaHeader) {
305313
return result;
306314
}
307315

308-
public ProcessMediaResult processMedia(long headerId, int contentLength, ExtractorInput data) {
316+
public ProcessMediaResult processMedia(long headerId, int contentLength, ExtractorInput data) throws IOException, InterruptedException {
309317
Segment segment = partialSegments.get(headerId);
310318
if (segment == null) {
311-
Log.d(TAG, "Header ID %s not found", headerId);
319+
Log.e(TAG, "Header ID %s not found", headerId);
312320
throw new SabrStreamError(String.format("Header ID %s not found in partial segments", headerId));
313321
}
314322

@@ -318,6 +326,7 @@ public ProcessMediaResult processMedia(long headerId, int contentLength, Extract
318326
ProcessMediaResult result = new ProcessMediaResult();
319327

320328
if (!segment.discard) {
329+
Log.d(TAG, "processMedia: part created. contentLength: %s", contentLength);
321330
result.sabrPart = new MediaSegmentDataSabrPart(
322331
segment.initializedFormat.formatSelector,
323332
segment.formatId,
@@ -329,13 +338,19 @@ public ProcessMediaResult processMedia(long headerId, int contentLength, Extract
329338
contentLength,
330339
segmentStartBytes
331340
);
341+
} else {
342+
Log.e(TAG, "processMedia: part discarded. contentLength: %s", contentLength);
343+
data.skipFully(contentLength);
332344
}
333345

334346
return result;
335347
}
336348

337349
public ProcessMediaEndResult processMediaEnd(long headerId) {
338-
Segment segment = partialSegments.remove(headerId);
350+
// TODO: investigate why remove produces the exception
351+
// MOD: don't remove segments
352+
//Segment segment = partialSegments.remove(headerId);
353+
Segment segment = partialSegments.get(headerId);
339354
if (segment == null) {
340355
Log.d(TAG, "Header ID %s not found", headerId);
341356
throw new SabrStreamError(String.format("Header ID %s not found in partial segments", headerId));
@@ -344,17 +359,18 @@ public ProcessMediaEndResult processMediaEnd(long headerId) {
344359
Log.d(TAG, "MediaEnd for %s (sequence %s, data length = %s)",
345360
segment.formatId, segment.sequenceNumber, segment.receivedDataLength);
346361

347-
if (segment.contentLength != -1 && segment.receivedDataLength != segment.contentLength) {
348-
if (segment.contentLengthEstimated) {
349-
Log.d(TAG, "Content length for %s (sequence %s) was estimated, " +
350-
"estimated %s bytes, got %s bytes",
351-
segment.formatId, segment.sequenceNumber, segment.contentLength, segment.receivedDataLength);
352-
} else {
353-
throw new SabrStreamError(String.format("Content length mismatch for %s (sequence %s): " +
354-
"expected %s bytes, got %s bytes",
355-
segment.formatId, segment.sequenceNumber, segment.contentLength, segment.receivedDataLength));
356-
}
357-
}
362+
// MOD: remove. receivedDataLength != segment.contentLength
363+
//if (segment.contentLength != -1 && segment.receivedDataLength != segment.contentLength) {
364+
// if (segment.contentLengthEstimated) {
365+
// Log.d(TAG, "Content length for %s (sequence %s) was estimated, " +
366+
// "estimated %s bytes, got %s bytes",
367+
// segment.formatId, segment.sequenceNumber, segment.contentLength, segment.receivedDataLength);
368+
// } else {
369+
// throw new SabrStreamError(String.format("Content length mismatch for %s (sequence %s): " +
370+
// "expected %s bytes, got %s bytes",
371+
// segment.formatId, segment.sequenceNumber, segment.contentLength, segment.receivedDataLength));
372+
// }
373+
//}
358374

359375
ProcessMediaEndResult result = new ProcessMediaEndResult();
360376

0 commit comments

Comments
 (0)