question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Significant frame drop while playing 1920x1080 HLS video tracks on AFTSSS and AFTSS

See original GitHub issue

[REQUIRED] Issue description

Fire TV Stick - 3rd Gen (2020) (AFTSSS) and Fire TV Stick Lite - 1st Gen (2020) (AFTSS) consistently drop frames while playing 1920x1080 video tracks in HLS streams.

This bug report is a copy of a bug report I created on the Amazon ExoPlayer port repo: https://github.com/amzn/exoplayer-amazon-port/issues/115 I haven’t received any response on that repo, so I am re-posting this here.

Our production app uses the ExoPlayer Amazon port, but the issue occurs in both the ExoPlayer and the ExoPlayer Amazon port. This issue started when we upgraded our ExoPlayer Amazon port version from v2.10.6 to v2.11.3. So, I tested a few different ExoPlayer versions and confirmed the issue occurs on the following versions:

  • v2.11.3 (ExoPlayer and ExoPlayer Amazon Port)
  • v2.12.1 (ExoPlayer and ExoPlayer Amazon Port)
  • v2.15.1 (ExoPlayer; there is no Amazon port for this version yet)

After some debugging, I have some insight as to why this started in v2.11: In both v2.10 and v2.11, ExoPlayer’s MediaCodecVideoRenderer.getDecoderInfos() method call returns a list of decoders available on the device. On v2.10, the order of the codecs was always returned in the following order, on both of these Fire Stick devices: [OMX.MTK.VIDEO.DECODER.AVC, OMX.google.h264.decoder]

So, to decode our HLS stream, the ExoPlayer would choose the first decoder in the list, OMX.MTK.VIDEO.DECODER.AVC (the hardware decoder). When the ExoPlayer checks the Format of our 1920x1080 video track in the HLS stream against this hardware codec, it returns that the hardware codec does not support the 1920x1080 video track. So, it would never attempt to play the 1920x1080 video track.

Starting in ExoPlayer v2.11, the ExoPlayer’s MediaCodecVideoRenderer.getDecoderInfos() implementation changed. This method started sorting the list of decoders by ‘Format’ support.

The sorting recognizes that the hardware decoder (OMX.MTK.VIDEO.DECODER.AVC) does not support the 1920x1080 video track in our HLS stream, but the software decoder (OMX.google.h264.decoder) does, so the sorting method call sorts the list of available decoders into the following order: [OMX.google.h264.decoder, OMX.MTK.VIDEO.DECODER.AVC]. The ExoPlayer then chooses the first decoder in the list, the software decoder, to decode the 1920x1080 video track. However, during playback, there is nearly constant frame drop causing a bad experience for the user.

I don’t know what’s causing the software codec to perform so poorly, but there are logs indicating frames being dropped:

2021-05-05 16:25:59.404 319-319/? E/FrameEvents: updateAcquireFence: Did not find frame.
2021-05-05 16:25:59.436 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 2, PTS = 800000
2021-05-05 16:25:59.478 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 3, PTS = 840000
2021-05-05 16:25:59.486 7423-7439/? I/exoplayer2.dem: Background concurrent copying GC freed 12043(757KB) AllocSpace objects, 4(272KB) LOS objects, 43% free, 7MB/13MB, paused 897us total 147.805ms
2021-05-05 16:25:59.521 319-319/? E/FrameEvents: updateAcquireFence: Did not find frame.
2021-05-05 16:25:59.571 319-319/? E/FrameEvents: updateAcquireFence: Did not find frame.
2021-05-05 16:25:59.584 513-601/? W/BestClock: java.time.DateTimeException: Missing NTP fix
2021-05-05 16:25:59.592 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 6, PTS = 960000
2021-05-05 16:25:59.602 315-496/? D/AudioFlinger: mixer(0xa5183780) throttle end: throttle time(3)
2021-05-05 16:25:59.638 319-319/? E/FrameEvents: updateAcquireFence: Did not find frame.
2021-05-05 16:25:59.644 513-601/? W/BestClock: java.time.DateTimeException: Missing NTP fix
2021-05-05 16:25:59.647 513-602/? W/BestClock: java.time.DateTimeException: Missing NTP fix
2021-05-05 16:25:59.655 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 7, PTS = 1000000
2021-05-05 16:25:59.704 319-319/? E/FrameEvents: updateAcquireFence: Did not find frame.
2021-05-05 16:25:59.708 315-496/? D/AudioFlinger: mixer(0xa5183780) throttle end: throttle time(2)
2021-05-05 16:25:59.745 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 1, PTS = 1080000
2021-05-05 16:25:59.785 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 2, PTS = 1120000
2021-05-05 16:25:59.836 315-496/? D/AudioFlinger: mixer(0xa5183780) throttle end: throttle time(3)
2021-05-05 16:25:59.838 319-319/? E/FrameEvents: updateAcquireFence: Did not find frame.
2021-05-05 16:25:59.879 315-496/? D/AudioFlinger: mixer(0xa5183780) throttle end: throttle time(3)
2021-05-05 16:25:59.888 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 4, PTS = 1200000
2021-05-05 16:25:59.919 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 5, PTS = 1240000
2021-05-05 16:25:59.971 319-319/? E/FrameEvents: updateAcquireFence: Did not find frame.
2021-05-05 16:26:00.032 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 7, PTS = 1320000
2021-05-05 16:26:00.072 319-319/? E/FrameEvents: updateAcquireFence: Did not find frame.
2021-05-05 16:26:00.082 513-601/? W/BestClock: java.time.DateTimeException: Missing NTP fix
2021-05-05 16:26:00.092 315-496/? D/AudioFlinger: mixer(0xa5183780) throttle end: throttle time(3)
2021-05-05 16:26:00.108 7423-7618/? I/CodecNameUnknown-MediaCodecVideoRenderer: dropOutputBuffer: bufferIndex = 1, PTS = 1400000

I also don’t know why these two Fire Sticks are reporting that their hardware codec does not support the 1920x1080 video track. Seemingly, the same OMX.MTK.VIDEO.DECODER.AVC hardware codec can play 1920x1080 video tracks on the Fire TV Stick - 2nd Gen (2016-2019) (AFTT), but not on the newer models.

Finally, this may be related to https://github.com/amzn/exoplayer-amazon-port/issues/42 but I’m not sure.

[REQUIRED] Reproduction steps

This does not reproduce with the Apple HLS samples in the demo app. However, you can reproduce it in the demo app using this sample I found on Bitmovin’s website: https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8

Notice the choppiness of the video and the logs being printed. If the issue does not reproduce the first time, try:

  • Backing out of the video, then starting it again.
  • Manually selecting the 1920x1080 video track.

[REQUIRED] Link to test content

https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8

I can provide our production HLS streams if more than this sample is needed.

[REQUIRED] A full bug report captured from the device

Fire TV Stick Lite - 1st Gen (2020) (AFTSS): bugreport-sheldon-PS7234-2021-05-05-16-39-26.zip

[REQUIRED] Version of ExoPlayer being used

  • v2.11.3 (ExoPlayer and ExoPlayer Amazon Port)
  • v2.12.1 (ExoPlayer and ExoPlayer Amazon Port)
  • v2.15.1 (ExoPlayer)

It seems to reproduce in all ExoPlayer versions (Amazon port or not) starting with v2.11.

[REQUIRED] Device(s) and version(s) of Android being used

Issue Analytics

  • State:closed
  • Created 2 years ago
  • Reactions:2
  • Comments:14 (10 by maintainers)

github_iconTop GitHub Comments

2reactions
ojw28commented, Nov 24, 2021

I think (1) is just that the codec string in the master playlist is incorrect (i.e., it’s a problem with the media itself).

(3) and (4) are the main things that we need to look at on the ExoPlayer side. In the meantime, I think you can get the old behavior with new releases of ExoPlayer with the workaround below, which should unblock you if you’re stuck not being able to upgrade to a newer release:

RenderersFactory renderersFactory =
    new DefaultRenderersFactory(context)
        ....
        .setMediaCodecSelector(
            (mimeType, requiresSecureDecoder, requiresTunnelingDecoder) -> {
              List<MediaCodecInfo> codecs = MediaCodecSelector.DEFAULT.getDecoderInfos(
                  mimeType,
                  requiresSecureDecoder,
                  requiresTunnelingDecoder);
              if (codecs.isEmpty()) {
                return Collections.emptyList();
              }
              // Only consider the first decoder.
              return Collections.singletonList(codecs.get(0));
            }
        );

player =
    new ExoPlayer.Builder(context)
        ...
        .setRenderersFactory(renderersFactory)
        .build();
1reaction
ojw28commented, Dec 2, 2021

Adaptive bitrate is based on available network bandwidth. In this case there is sufficient network bandwidth, and it’s CPU that’s the limiting factor, so the logic to step down wont be triggered.

We’ve discussed looking at additional metrics such as how frequently frames are being dropped (many frame drops is indicative of being CPU bound), and even things like the thermal state of the device, and factoring those into the adaptive bitrate logic as well. It’s something we should look at at some point, and is particularly useful for devices that only ship with software decoders. In the case discussed here though, it’s better just to avoid switching up to the 1080p stream in the first place 😃.

Read more comments on GitHub >

github_iconTop Results From Across the Web

How to Fix Dropped Frames When Streaming - Lifewire
A dropped frame is caused by missing frames in the video stream, while lag is a gap between input and response. A live...
Read more >
Fix Dropped Frames, Best Encoder, And Bitrate Settings!
If you're struggling to fix your laggy stream, then the first step is to understand what type of lag or stuttering is happening...
Read more >
Dropped Frames in OBS? Check these 5 things FIRST!
If you experience dropped frames and lag in OBS it can be hard to figure out what is causing the is. ... Your...
Read more >
Fix Game Crashing or Low In Game FPS While Using Stream ...
In some cases using 3rd party in -game overlays could cause additional FPS drop or instabilities, especially when you have multiple ...
Read more >
ExoPlayer - githubmemory
Significant frame drop while playing 1920x1080 HLS video tracks on AFTSSS and AFTSS. SashiWork. SashiWork CLOSED · Updated 8 months ago ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found