Dash-Industry-Forum / dash.js

A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.
http://reference.dashif.org/dash.js/nightly/samples/dash-if-reference-player/index.html
Other
5.16k stars 1.68k forks source link

Rate Adaptation Algorithm in dash.js #850

Closed akouSDN closed 8 years ago

akouSDN commented 9 years ago

Hi, everybody I want to implement a new client rate adaptation algorithm based on dash.js. However, I don't find the file of rate adaptation implemented in dash.js to modify it.

Please, Can anybody give me a favor ? (location of rate adaptation algorithm in dash.js) Thank you so much !

rofeifei commented 9 years ago

Hi, I am currently using the dashif client and trying to understand the adaptation logic used by the dashif player,The adaptation algorithm uses information about the available throughput in the past and the buffer fill level to select the quality level of the next segment,The implementation of dash.js includes five class of ABR rules – 'ABRRulesCollection.js', 'BufferOccupancyRule.js','InsufficientBufferRule.js' and 'ThroughputRule'.If i understood correctly,dashIF determines the throughput of the next segment based on the the available throughput in the past :lastRequestThroughput = Math.round((lastRequest.trace[lastRequest.trace.length - 1].b * 8 ) / downloadTime); at ThroughputRule.js
Thanks

dsparacio commented 9 years ago

There are two main components to ABR in Dash.js ThroughputRule and AbandonRequestsRule.

As you mention the ThroughputRule uses recent past calculated throughput to predict the near future's throughput. We average the last X segments to smooth out some VBR and network variations.

The AbandonmentRule however will detect real time throughput changes during the download progress of each fragment. It calculates If it will take longer to download a chuck vs length/duration gained by downloading. If this value is 1.5 x the fragment duration then we abandon and re-downloaded at same fragment ID but at a lower quality.

The other two rules you mention are more outside cases.

BufferOccupancyRule is there to override the ThroughputRule when it requests a switch down. This will only happen when we have enouch buffer occupancy to absorb a few slower downloads. Attempt to prevent oscillation.

The InsufficientBufferRule forces a switch to 0 when a rebuffer event occurs, This is a last resort to get data as fast as possible to resume streaming.

akouSDN commented 9 years ago

Thanks a lot

bwidtmann commented 9 years ago

we have tried to document the basic ABR rules in current dash.js version 1.5.1 in following google docs:

https://docs.google.com/drawings/d/16_EztksKjiZSF0HdjR44soAs7x8QewwlqnABnqjhyk4/edit?usp=sharing

rofeifei commented 9 years ago

Hi, i add some documentation for bufferController class in following google docs: https://docs.google.com/drawings/d/1hz7jy4qHrwzFSx7Axsa51tw3p8xCOCiF32BYI79GWsY/edit?usp=sharing

akouSDN commented 9 years ago

Thanks guys