Fix segment requesting error when playing a DASH content without an url and without BaseURL elements #1192
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #1190
We brought in the last v3.29.0 a regression which made it impossible to play a DASH content in very specific conditions.
Thankfully, the conditions to reproduce it are relatively rare and easy to work-around (as written in the issue). Basically it only happens when all following conditions are true:
url
for the MPD (for now only works if you at least communicated either ainitialManifest
or amanifestLoader
)manifestLoader
if you used one<BaseURL>
element, or it does but only inside<Representation>
elements (which means basically directly for each segments, e.g. in a<SegmentList>
element).When those conditions are met, you will receive a
PIPELINE_LOAD_ERROR
error with the message"No CDN to request"
when the RxPlayer is trying to request its first segment.This happens because since the RxPlayer v3.29.0, we try to identify one or multiple CDN through which segments may be requested. This is done at the
<Representation>
level.Under the specific conditions written earlier, MPD parsers will indicate an empty array as the CDN that can be used to reach that Representation's segments, because it has no way of defining even one root URL.
In the corresponding
Manifest
's structure documentation (the protocol-agnostic structure defined by the RxPlayer for a Manifest), an empty array is then documented asAn empty array means that no CDN are left to request the resource. As such, no resource can be loaded in that situation.
.So an empty array is for explicitly telling that the segment should be reachable through a potential CDN, but that no CDN is usable, at least right now.
That's why the
"No CDN to request"
error was sent: the logic performing segment requests just wanted to load a segment, but saw that right now no CDN can be requested for it.To fix this situation, we could set that value to
null
, which exists, instead of an empty array. But this is how anull
value is defined in the sameManifest
structure:null if there's no CDN involved here (e.g. resources are not requested through the network).
In that specific issue, the segment may perfectly be reachable through the network, we just don't know the root URL. We also risk breaking functional use cases if a full URL was actually declared for each segment.
I thus hesitated between redefining the empty array and not throw in that case, redefining
null
, or to invent a third special case.For now, I chose to explicitly allow a new way of telling that an URL may exist, but should be entirely associated to each segment: by setting the empty string instead.
This basically technically indicates - by following the logic already there - that all following URL are either absolute or relative to the page doing the requests, so it may imply a new strange behavior here when only relative segment URL are present (resulting in the browser considering the current page as the root URL), but I don't know how we should realistically act anyway in that specific case.