shaka-player: DASH processManifest performance regression in 3.x

Have you read the FAQ and checked for duplicate open issues? Yes

What version of Shaka Player are you using? 2.5.x, 3.x

Can you reproduce the issue with our latest release version? Yes

Can you reproduce the issue with the latest code from main? Didn’t try

Are you using the demo app or your own custom app? Custom

If custom app, can you reproduce the issue using our demo app? N/A

What browser and OS are you using? webOS, Tizen

For embedded devices (smart TVs, etc.), what model and firmware version are you using? webOS 5.00.35 Tizen firmware 2200.9

What are the manifest and license server URIs?

What configuration are you using? What is the output of player.getConfiguration()?

Default configuration

What did you do?

Play a live stream with large DVR (several hours) using different versions of Shaka Player on webOS and Tizen TV (low performance devices)

What did you expect to happen? Playback should be smooth

What actually happened?

Using Shaka Player 2.5.x, Shaka is able to load and process the growing live manifest every few seconds.

Using Shaka Player 3.x, the processManifest step takes several seconds.

With a 4+h DVR, every time the manifest is reloaded:

  • On Tizen, it takes close to 2s
  • On webOS, it takes over 10s

There is visibly a considerable performance degradation of the manifest parsing logic, making it barely tolerable on Tizen (UI is frozen during the parsing), and completely unusable on webOS.

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Comments: 65 (17 by maintainers)

Commits related to this issue

Most upvoted comments

I think the problem has been mitigated in the main branch (see https://github.com/shaka-project/shaka-player/commit/f1c5a1c19126832184f43b0d08e9503a34b0dac0), can you check it? Thanks!

I did some profiling and code reading and I strongly suspect a refactoring which happened between 2.5 and 3:

  • Most of the for loops have been converted to enumeration loops
  • Enumerations are using JS generators
  • Generators seem to be transpiled to ES5…

image

Example in MpdUtils.js:

// Shaka 2.5.x
for (let i=0; i < timePoints.length; ++i) {

// Shaka 3.x
const enumerate = (it) => shaka.util.Iterables.enumerate(it);
for (const {item: timePoint, next} of enumerate(timePoints)) {

This looks like an absolutely catastrophic refactoring idea.

The PR surely had a good reason to be - you should first find that out.

Unfortunately Shaka 2.5.9 is still MUCH faster. Our LGs stutter with a live stream with 4h DVR with Shaka 3 (even optimised) while Shaka 2 handles it without a sweat.