Skip to content

Commit e614405

Browse files
committed
exoplayer: upd sabr classes
1 parent 0a6409d commit e614405

File tree

19 files changed

+1007
-137
lines changed

19 files changed

+1007
-137
lines changed

exoplayer-amzn-2.10.6/library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ public DataSpec(
299299
this.flags = flags;
300300
this.httpRequestHeaders = Collections.unmodifiableMap(new HashMap<>(httpRequestHeaders));
301301

302-
applyRangeQuery();
302+
//applyRangeQuery();
303303
}
304304

305305
/**

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ public SabrChunkSource createSabrChunkSource(
119119

120120
private final SabrStream sabrStream;
121121
private final Map<String, String> sabrHeaders;
122-
private int sabrRequestNumber = 0;
123122

124123
/**
125124
* @param manifestLoaderErrorThrower Throws errors affecting loading of manifests.
@@ -496,6 +495,7 @@ protected Chunk newInitializationChunk(
496495
RangedUri indexUri) {
497496
RangedUri requestUri;
498497
String baseUrl = representationHolder.representation.baseUrl;
498+
baseUrl = Utils.updateQuery(baseUrl, "rn", sabrStream.getIncSabrRequestNumber());
499499
if (initializationUri != null) {
500500
// It's common for initialization and index data to be stored adjacently. Attempt to merge
501501
// the two requests together to request both at once.
@@ -511,12 +511,13 @@ protected Chunk newInitializationChunk(
511511
//DataSpec dataSpec = new DataSpec(requestUri.resolveUri(baseUrl), requestUri.start,
512512
// requestUri.length, representationHolder.representation.getCacheKey());
513513
DataSpec dataSpec = new DataSpec(
514-
requestUri.resolveUri(Utils.updateQuery(baseUrl, "rn", sabrRequestNumber++)),
514+
requestUri.resolveUri(baseUrl),
515515
DataSpec.HTTP_METHOD_POST,
516-
sabrStream.buildVideoPlaybackAbrRequest(trackType).toByteArray(),
517-
requestUri.start,
518-
requestUri.start,
519-
requestUri.length,
516+
sabrStream.buildInitVideoPlaybackAbrRequest(trackType).toByteArray(),
517+
0, 0, C.LENGTH_UNSET,
518+
//requestUri.start,
519+
//requestUri.start,
520+
//requestUri.length,
520521
representationHolder.representation.getCacheKey(),
521522
0,
522523
sabrHeaders);
@@ -538,6 +539,7 @@ protected Chunk newMediaChunk(
538539
long startTimeUs = representationHolder.getSegmentStartTimeUs(firstSegmentNum);
539540
RangedUri segmentUri = representationHolder.getSegmentUrl(firstSegmentNum);
540541
String baseUrl = representation.baseUrl;
542+
baseUrl = Utils.updateQuery(baseUrl, "rn", sabrStream.getIncSabrRequestNumber());
541543
if (representationHolder.extractorWrapper == null) {
542544
long endTimeUs = representationHolder.getSegmentEndTimeUs(firstSegmentNum);
543545
DataSpec dataSpec = new DataSpec(segmentUri.resolveUri(baseUrl),
@@ -566,13 +568,15 @@ protected Chunk newMediaChunk(
566568
// MOD: add protobuf data
567569
//DataSpec dataSpec = new DataSpec(segmentUri.resolveUri(baseUrl),
568570
// segmentUri.start, segmentUri.length, representation.getCacheKey());
571+
int sabrRequestNumber = sabrStream.getIncSabrRequestNumber();
569572
DataSpec dataSpec = new DataSpec(
570-
segmentUri.resolveUri(Utils.updateQuery(baseUrl, "rn", sabrRequestNumber++)),
573+
segmentUri.resolveUri(baseUrl),
571574
DataSpec.HTTP_METHOD_POST,
572-
sabrStream.buildVideoPlaybackAbrRequest(trackType).toByteArray(),
573-
segmentUri.start,
574-
segmentUri.start,
575-
segmentUri.length,
575+
sabrStream.buildInitVideoPlaybackAbrRequest(trackType).toByteArray(),
576+
0, 0, C.LENGTH_UNSET,
577+
//segmentUri.start,
578+
//segmentUri.start,
579+
//segmentUri.length,
576580
representation.getCacheKey(),
577581
0,
578582
sabrHeaders);

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

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,7 @@ public class SabrManifest implements FilterableManifest<SabrManifest> {
5959
*/
6060
public final long minUpdatePeriodMs;
6161

62-
private final String serverAbrStreamingUrl;
63-
private final String videoPlaybackUstreamerConfig;
64-
private final String poToken;
6562
private final String videoId;
66-
private final ClientInfo clientInfo;
6763
private final SabrStream sabrStream;
6864

6965
public SabrManifest(
@@ -90,11 +86,7 @@ public SabrManifest(
9086
this.suggestedPresentationDelayMs = suggestedPresentationDelayMs;
9187
this.publishTimeMs = publishTimeMs;
9288
this.periods = periods;
93-
this.serverAbrStreamingUrl = serverAbrStreamingUrl;
94-
this.videoPlaybackUstreamerConfig = videoPlaybackUstreamerConfig;
95-
this.poToken = poToken;
9689
this.videoId = videoId;
97-
this.clientInfo = clientInfo;
9890
this.sabrStream = new SabrStream(
9991
serverAbrStreamingUrl,
10092
videoPlaybackUstreamerConfig,
@@ -107,7 +99,8 @@ public SabrManifest(
10799
-1,
108100
poToken,
109101
false,
110-
videoId
102+
videoId,
103+
durationMs
111104
);
112105
}
113106

@@ -134,22 +127,6 @@ public SabrManifest copy(List<StreamKey> streamKeys) {
134127
return null;
135128
}
136129

137-
//public final String getServerAbrStreamingUrl() {
138-
// return serverAbrStreamingUrl;
139-
//}
140-
//
141-
//public final String getVideoPlaybackUstreamerConfig() {
142-
// return videoPlaybackUstreamerConfig;
143-
//}
144-
//
145-
//public final String getPoToken() {
146-
// return poToken;
147-
//}
148-
//
149-
//public ClientInfo getClientInfo() {
150-
// return clientInfo;
151-
//}
152-
153130
public final String getVideoId() {
154131
return videoId;
155132
}

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ private static final class Track {
854854

855855
/** Initializes the track with an output. */
856856
public void initializeOutput(ExtractorOutput output, int trackId) throws ParserException {
857-
String mimeType;
857+
String mimeType = null;
858858
int maxInputSize = Format.NO_VALUE;
859859
@C.PcmEncoding int pcmEncoding = Format.NO_VALUE;
860860
List<byte[]> initializationData = null;
@@ -880,20 +880,20 @@ public void initializeOutput(ExtractorOutput output, int trackId) throws ParserE
880880
break;
881881
case CODEC_ID_H264:
882882
mimeType = MimeTypes.VIDEO_H264;
883-
AvcConfig avcConfig = AvcConfig.parse(new ParsableByteArray(codecPrivate));
884-
initializationData = avcConfig.initializationData;
885-
nalUnitLengthFieldLength = avcConfig.nalUnitLengthFieldLength;
883+
//AvcConfig avcConfig = AvcConfig.parse(new ParsableByteArray(codecPrivate));
884+
//initializationData = avcConfig.initializationData;
885+
//nalUnitLengthFieldLength = avcConfig.nalUnitLengthFieldLength;
886886
break;
887887
case CODEC_ID_H265:
888888
mimeType = MimeTypes.VIDEO_H265;
889-
HevcConfig hevcConfig = HevcConfig.parse(new ParsableByteArray(codecPrivate));
890-
initializationData = hevcConfig.initializationData;
891-
nalUnitLengthFieldLength = hevcConfig.nalUnitLengthFieldLength;
889+
//HevcConfig hevcConfig = HevcConfig.parse(new ParsableByteArray(codecPrivate));
890+
//initializationData = hevcConfig.initializationData;
891+
//nalUnitLengthFieldLength = hevcConfig.nalUnitLengthFieldLength;
892892
break;
893893
case CODEC_ID_FOURCC:
894-
Pair<String, List<byte[]>> pair = parseFourCcPrivate(new ParsableByteArray(codecPrivate));
895-
mimeType = pair.first;
896-
initializationData = pair.second;
894+
//Pair<String, List<byte[]>> pair = parseFourCcPrivate(new ParsableByteArray(codecPrivate));
895+
//mimeType = pair.first;
896+
//initializationData = pair.second;
897897
break;
898898
case CODEC_ID_THEORA:
899899
// TODO: This can be set to the real mimeType if/when we work out what initializationData
@@ -903,21 +903,21 @@ public void initializeOutput(ExtractorOutput output, int trackId) throws ParserE
903903
case CODEC_ID_VORBIS:
904904
mimeType = MimeTypes.AUDIO_VORBIS;
905905
maxInputSize = VORBIS_MAX_INPUT_SIZE;
906-
initializationData = parseVorbisCodecPrivate(codecPrivate);
906+
//initializationData = parseVorbisCodecPrivate(codecPrivate);
907907
break;
908908
case CODEC_ID_OPUS:
909909
mimeType = MimeTypes.AUDIO_OPUS;
910910
maxInputSize = OPUS_MAX_INPUT_SIZE;
911-
initializationData = new ArrayList<>(3);
912-
initializationData.add(codecPrivate);
913-
initializationData.add(
914-
ByteBuffer.allocate(8).order(ByteOrder.nativeOrder()).putLong(codecDelayNs).array());
915-
initializationData.add(
916-
ByteBuffer.allocate(8).order(ByteOrder.nativeOrder()).putLong(seekPreRollNs).array());
911+
//initializationData = new ArrayList<>(3);
912+
//initializationData.add(codecPrivate);
913+
//initializationData.add(
914+
// ByteBuffer.allocate(8).order(ByteOrder.nativeOrder()).putLong(codecDelayNs).array());
915+
//initializationData.add(
916+
// ByteBuffer.allocate(8).order(ByteOrder.nativeOrder()).putLong(seekPreRollNs).array());
917917
break;
918918
case CODEC_ID_AAC:
919919
mimeType = MimeTypes.AUDIO_AAC;
920-
initializationData = Collections.singletonList(codecPrivate);
920+
//initializationData = Collections.singletonList(codecPrivate);
921921
break;
922922
case CODEC_ID_MP2:
923923
mimeType = MimeTypes.AUDIO_MPEG_L2;

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public class SabrStream {
8787
private boolean receivedNewSegments;
8888
private String url;
8989
private List<? extends SabrPart> multiResult = null;
90+
private int sabrRequestNumber = 0;
9091

9192
private static class NoSegmentsTracker {
9293
public int consecutiveRequests = 0;
@@ -120,8 +121,8 @@ public SabrStream(
120121
long startTimeMs,
121122
String poToken,
122123
boolean postLive,
123-
String videoId
124-
) {
124+
String videoId,
125+
long durationMs) {
125126
decoder = new UMPDecoder();
126127
processor = new SabrProcessor(
127128
videoPlaybackUstreamerConfig,
@@ -134,7 +135,8 @@ public SabrStream(
134135
startTimeMs,
135136
poToken,
136137
postLive,
137-
videoId
138+
videoId,
139+
durationMs
138140
);
139141
url = serverAbrStreamingUrl;
140142

@@ -167,8 +169,8 @@ public SabrPart parse(@NonNull ExtractorInput extractorInput) {
167169
return result != null ? result : multiResult != null && !multiResult.isEmpty() ? multiResult.remove(0) : null;
168170
}
169171

170-
public VideoPlaybackAbrRequest buildVideoPlaybackAbrRequest(int trackType) {
171-
return processor.buildVideoPlaybackAbrRequest(trackType);
172+
public VideoPlaybackAbrRequest buildInitVideoPlaybackAbrRequest(int trackType) {
173+
return processor.buildInitVideoPlaybackAbrRequest(trackType);
172174
}
173175

174176
public void setAudioSelection(AudioSelector audioFormatSelector) {
@@ -199,6 +201,14 @@ public void reset() {
199201
noNewSegmentsTracker.reset();
200202
}
201203

204+
public int getSabrRequestNumber() {
205+
return sabrRequestNumber;
206+
}
207+
208+
public int getIncSabrRequestNumber() {
209+
return sabrRequestNumber++;
210+
}
211+
202212
private SabrPart parsePart(UMPPart part) {
203213
switch (part.partId) {
204214
case UMPPartId.MEDIA_HEADER:
@@ -484,7 +494,7 @@ private UMPPart nextKnownUMPPart(@NonNull ExtractorInput extractorInput) {
484494
part = decoder.decode(extractorInput);
485495

486496
if (part == null) {
487-
Log.e(TAG, "Cannot decode UMP stream. It is possibly ended.");
497+
Log.d(TAG, "The UMP stream is ended.");
488498
break;
489499
}
490500

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

Lines changed: 13 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import com.google.android.exoplayer2.C;
88
import com.google.android.exoplayer2.extractor.ExtractorInput;
9-
import com.google.android.exoplayer2.source.sabr.parser.exceptions.MediaSegmentMismatchError;
109
import com.google.android.exoplayer2.source.sabr.parser.exceptions.SabrStreamError;
1110
import com.google.android.exoplayer2.source.sabr.parser.models.AudioSelector;
1211
import com.google.android.exoplayer2.source.sabr.parser.models.CaptionSelector;
@@ -65,6 +64,7 @@ public class SabrProcessor {
6564
private final String poToken;
6665
private final boolean postLive;
6766
private final String videoId;
67+
private final long durationMs;
6868
private ClientAbrState clientAbrState;
6969
private final Map<Long, Segment> partialSegments;
7070
private final Map<String, SelectedFormat> selectedFormats;
@@ -90,7 +90,8 @@ public SabrProcessor(
9090
long startTimeMs,
9191
String poToken,
9292
boolean postLive,
93-
String videoId
93+
String videoId,
94+
long durationMs
9495
) {
9596
this.videoPlaybackUstreamerConfig = videoPlaybackUstreamerConfig;
9697
this.poToken = poToken;
@@ -108,6 +109,7 @@ public SabrProcessor(
108109
this.postLive = postLive;
109110
isLive = false;
110111
this.videoId = videoId;
112+
this.durationMs = durationMs;
111113

112114
//audioFormatSelector = audioSelection;
113115
//videoFormatSelector = videoSelection;
@@ -172,15 +174,9 @@ public ProcessMediaHeaderResult processMediaHeader(MediaHeader mediaHeader) {
172174

173175
// MOD: triggered even when no match found (probably multi thread issue?)
174176
// Guard. This should not happen, except if we don't clear partial segments
175-
if (partialSegments.containsKey(Utils.toLong(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();
183-
}
177+
//if (partialSegments.containsKey(Utils.toLong(mediaHeader.getHeaderId()))) {
178+
// throw new SabrStreamError(String.format("Header ID %s already exists", mediaHeader.getHeaderId()));
179+
//}
184180

185181
SelectedFormat initializedFormat = selectedFormats.get(mediaHeader.getFormatId().toString());
186182

@@ -202,38 +198,6 @@ public ProcessMediaHeaderResult processMediaHeader(MediaHeader mediaHeader) {
202198

203199
initializedFormat.sequenceLmt = mediaHeader.hasSequenceLmt() ? mediaHeader.getSequenceLmt() : NO_VALUE;
204200

205-
// Need to keep track of if we discard due to be consumed or not
206-
// for processing down the line (MediaEnd)
207-
boolean consumed = false;
208-
boolean discard = initializedFormat.discard;
209-
210-
// Guard: Check if sequence number is within any existing consumed range
211-
// The server should not send us any segments that are already consumed
212-
// However, if retrying a request, we may get the same segment again
213-
if (!isInitSegment &&
214-
Helpers.findFirst(initializedFormat.consumedRanges,
215-
cr -> cr.startSequenceNumber <= sequenceNumber && sequenceNumber <= cr.endSequenceNumber) != null) {
216-
Log.d(TAG, "%s segment %s already consumed, marking segment as consumed", initializedFormat.formatId, sequenceNumber);
217-
consumed = true;
218-
}
219-
220-
// Validate that the segment is in order.
221-
// Note: If the format is to be discarded, we do not care about the order
222-
// and can expect uncommanded seeks as the consumer does not know about it.
223-
// Note: previous segment should never be an init segment.
224-
Segment previousSegment = initializedFormat.currentSegment;
225-
if (previousSegment != null && !isInitSegment && !previousSegment.discard && !discard
226-
&& !consumed && sequenceNumber != previousSegment.sequenceNumber + 1) {
227-
// Bail out as the segment is not in order when it is expected to be
228-
throw new MediaSegmentMismatchError(mediaHeader.getFormatId(), previousSegment.sequenceNumber + 1, sequenceNumber);
229-
}
230-
231-
if (initializedFormat.initSegment != null && isInitSegment) {
232-
Log.d(TAG, "Init segment %s already seen for format %s, marking segment as consumed",
233-
sequenceNumber, initializedFormat.formatId);
234-
consumed = true;
235-
}
236-
237201
TimeRange timeRange = mediaHeader.hasTimeRange() ? mediaHeader.getTimeRange() : null;
238202
long startMs = mediaHeader.hasStartMs() ? mediaHeader.getStartMs()
239203
: timeRange != null && timeRange.hasStartTicks() && timeRange.hasTimescale()
@@ -281,8 +245,8 @@ public ProcessMediaHeaderResult processMediaHeader(MediaHeader mediaHeader) {
281245
startMs,
282246
initializedFormat,
283247
actualDurationMs == 0 || actualDurationMs == NO_VALUE,
284-
discard || consumed,
285-
consumed,
248+
false,
249+
false,
286250
mediaHeader.hasSequenceLmt() ? mediaHeader.getSequenceLmt() : NO_VALUE
287251
);
288252

@@ -719,7 +683,7 @@ public int getLiveSegmentTargetDurationSec() {
719683
// .build();
720684
//}
721685

722-
public VideoPlaybackAbrRequest buildVideoPlaybackAbrRequest(int trackType) {
686+
public VideoPlaybackAbrRequest buildInitVideoPlaybackAbrRequest(int trackType) {
723687
int resolution = 1080; // ???
724688
int bandwidthEstimate = 1350000; // ???
725689

@@ -792,7 +756,7 @@ private StreamerContext createStreamerContext() {
792756
)
793757
)
794758
.setPlaybackCookie(
795-
nextRequestPolicy != null ? nextRequestPolicy.getPlaybackCookie() : ByteString.EMPTY
759+
nextRequestPolicy != null ? nextRequestPolicy.getPlaybackCookie().toByteString() : ByteString.EMPTY
796760
)
797761
.setClientInfo(clientInfo)
798762
.addAllSabrContexts(createSabrContexts())
@@ -870,8 +834,8 @@ private List<BufferedRange> createAllBufferedRanges(int trackType) {
870834
.setFormatId(allSelectedFormatIds.get(0))
871835
.setStartTimeMs(0)
872836
.setDurationMs(durationMs)
873-
.setStartSegmentIndex(durationMs)
874-
.setEndSegmentIndex(durationMs)
837+
.setStartSegmentIndex((int) durationMs)
838+
.setEndSegmentIndex((int) durationMs)
875839
.setTimeRange(timeRange)
876840
.build();
877841
List<BufferedRange> bufferedRanges = new ArrayList<>();

0 commit comments

Comments
 (0)