Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow mid-download cancellation for faster adaptive switches. #2848

Closed
shalin186 opened this issue May 19, 2017 · 6 comments
Closed

Allow mid-download cancellation for faster adaptive switches. #2848

shalin186 opened this issue May 19, 2017 · 6 comments
Assignees

Comments

@shalin186
Copy link

Hi,

I have a following question about changing the bit-rate in HLS stream.

With the current exoplayer implementation, if client has great bandwidth improvement then it will take effect only after the buffered duration of the video is played. Because chunks are always downloaded in the increasing sequence at the end of the buffer.

I know that I can reduce the buffer size but that's not how I want to solve the problem.

I have made some changes to start downloading the improved bit-rate chunk which is 2 chunks away from the currently playing chunk.
So for example,
Chunk Duration: 2 seconds
Currently Playing Chunk : Number 5
At this moment we see bandwidth improvement
So I start downloading chunk number 7 at new bit-rate.
And in this case, the client will see improved quality starting chunk number 7 itself which is less than 4 seconds away. And all that work fine.

Here's the problem I am facing:

When I start downloading new chunk (number 7 in the example) at higher bit-rate, exoplayer turns on splicing and it removes all the old chunk samples at old bit-rate. For example, I had 15 chunks in buffer (Chunk number 5 to chunk number 19), then all of them will be discarded.
In my case, I want to have a flexibility of choosing between new chunk and old chunk. Meaning, if new chunk at new bit-rate is downloaded in time, I want to play them but if not, I don't want to get into buffering situations since I could have just played old chunks at old bit-rate which were already downloaded before.
simply, disabling splicing doesn't work in this case.

I hope I am able to explain my problem properly.
Basically, I am trying to be aggressive with bit-rate change but at the same time, I don't want to get into playback buffering for the chunks which were already downloaded but sadly discarded :(
Could you suggest what possible things I could try so that I can keep multiple chunks at same timestamps and then choose them with more freedom?

Thanks a lot in advance.
Shalin

@lioun1729
Copy link

I agree this point when we want to increase quality fast for QoE

But in other sight, I think pre-buffering is efficient because it can prevent causing buffer underflow when the network varies very fast and dynamic

If we use more short buffering scheme or deleting bufferred segment for next high quality, we can experience many rebuffering and unstable behavior of player

How about you?

I think this issue's point is very good but its deployment will be quite hard in real

@shalin186
Copy link
Author

Hello, I see that the issue was labeled as enhancement about 6 months back. Could some one tell me if this enhancement will be implemented in near future?

@AquilesCanta
Copy link
Contributor

Hi @shalin186, we have been looking at ways to improve our ABR algorithm but I doubt any improvements will be released this quarter, unfortunately. I think a good first step would be allowing better customization of buffering, discarding and mid-download canceling.

@ojw28
Copy link
Contributor

ojw28 commented Jul 9, 2019

We now generate a better initial bitrate estimate based on the device's current network type and country, and also carry bitrate estimates over from one playback to the next by default. This should mitigate this issue in most cases. Should we close this issue?

@tonihei
Copy link
Collaborator

tonihei commented Jul 9, 2019

This enhancement seems to be specifically about mid-download cancellations to allow faster adaptation. That's something we might want to support in the future. I'll rename the issue title.

@tonihei tonihei changed the title Improving bit-rate of HLS stream more aggressively without running into buffering All mid-download cancellation for faster adaptive switches. Jul 9, 2019
@tonihei tonihei assigned tonihei and unassigned AquilesCanta Jul 9, 2019
@tonihei
Copy link
Collaborator

tonihei commented May 21, 2020

This is now supported for HLS (with PR #7244), but not yet for DASH or SmoothStreaming.

@ojw28 ojw28 changed the title All mid-download cancellation for faster adaptive switches. Allow mid-download cancellation for faster adaptive switches. May 21, 2020
ojw28 pushed a commit that referenced this issue Jun 11, 2020
The option to cancel ongoing loads as part of the queue size evalation
was added recently. This split out the decision to a new method so that
a TrackSelection implementation can independently cancel loads and
discard upstream data. It also clarifies that evaluateQueueSize will
only be called if there is no ongoing load.

Issue: #2848
PiperOrigin-RevId: 315659735
ojw28 pushed a commit that referenced this issue Aug 1, 2020
Issue: #7244 added this feature to HLS. This change is the exact copy
in ChunkSampleStream to add the same support to the other adaptive
formats.

Note that ChunkSampleStream doesn't support slicing, so we can't cancel
a read-from chunk, and we need to prevent reading into an already
canceled chunk load so that the chunk can be automatically discarded
after the cancelation.

Issue: #2848
PiperOrigin-RevId: 324179972
@ojw28 ojw28 closed this as completed Aug 17, 2020
@google google locked and limited conversation to collaborators Oct 17, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

5 participants