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

onPlayerError from 403 when playing HLS event playlist near live on r2.15.0 #9390

Closed
spirgiuz opened this issue Sep 6, 2021 · 3 comments
Closed
Assignees
Labels

Comments

@spirgiuz
Copy link

spirgiuz commented Sep 6, 2021

Hi,

On release r2.15.0 I've noticed that onPlayerError isn't called when a 403 HTTP error occurs when playing an HLS event playlist near the end. I was using r2.14.2 and r 2.13.3 before and both worked fine, problems started from r2.15.0. I was wondering if there's a new Listener I'm supposed to be using to catch 403 errors in r2.15.0 or is this a bug? To test, I start playback then invalidate the token so the server returns 403 and the player becomes stuck throwing exceptions every few milliseconds:

2021-09-06 11:02:57.698 4049-4049/com.google.android.exoplayer2.demo E/EventLogger: internalError [eventTime=118.33, mediaPos=17.10, window=0, loadError
      com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
        at com.google.android.exoplayer2.ext.cronet.CronetDataSource.open(CronetDataSource.java:726)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:201)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:776)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.open(CacheDataSource.java:589)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
        at com.google.android.exoplayer2.upstream.DataSourceInputStream.checkOpened(DataSourceInputStream.java:99)
        at com.google.android.exoplayer2.upstream.DataSourceInputStream.open(DataSourceInputStream.java:62)
        at com.google.android.exoplayer2.upstream.ParsingLoadable.load(ParsingLoadable.java:174)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:409)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
    ]
2021-09-06 11:02:57.706 4049-4049/com.google.android.exoplayer2.demo E/EventLogger: internalError [eventTime=118.34, mediaPos=17.10, window=0, loadError
      com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
        at com.google.android.exoplayer2.ext.cronet.CronetDataSource.open(CronetDataSource.java:726)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:201)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:776)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.open(CacheDataSource.java:589)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
        at com.google.android.exoplayer2.upstream.DataSourceInputStream.checkOpened(DataSourceInputStream.java:99)
        at com.google.android.exoplayer2.upstream.DataSourceInputStream.open(DataSourceInputStream.java:62)
        at com.google.android.exoplayer2.upstream.ParsingLoadable.load(ParsingLoadable.java:174)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:409)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

If I play the same event playlist from the start (or use a vod playlist) and invalidate the token, the player acts as expected, throws the same exception every 5 seconds:

2021-09-06 11:18:00.635 6476-6476/com.google.android.exoplayer2.demo E/EventLogger: internalError [eventTime=69.63, mediaPos=69.48, window=0, period=0, loadError
      com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
        at com.google.android.exoplayer2.ext.cronet.CronetDataSource.open(CronetDataSource.java:726)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:201)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:776)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.open(CacheDataSource.java:589)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.prepareExtraction(HlsMediaChunk.java:483)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.feedDataToExtractor(HlsMediaChunk.java:457)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:432)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:388)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:409)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
    ]
2021-09-06 11:18:05.644 6476-6476/com.google.android.exoplayer2.demo E/EventLogger: internalError [eventTime=74.64, mediaPos=74.49, window=0, period=0, loadError
      com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
        at com.google.android.exoplayer2.ext.cronet.CronetDataSource.open(CronetDataSource.java:726)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:201)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:776)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.open(CacheDataSource.java:589)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.prepareExtraction(HlsMediaChunk.java:483)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.feedDataToExtractor(HlsMediaChunk.java:457)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:432)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:388)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:409)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

then when buffer runs out throws an ExoPlaybackException and calls onPlayerError:

2021-09-06 11:18:10.297 6476-6549/com.google.android.exoplayer2.demo E/ExoPlayerImplInternal: Playback error
      com.google.android.exoplayer2.ExoPlaybackException: Source error
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:624)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:596)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:214)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
        at com.google.android.exoplayer2.ext.cronet.CronetDataSource.open(CronetDataSource.java:726)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:201)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:776)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.open(CacheDataSource.java:589)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.prepareExtraction(HlsMediaChunk.java:483)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.feedDataToExtractor(HlsMediaChunk.java:457)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:432)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:388)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:409)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
2021-09-06 11:18:10.312 6476-6476/com.google.android.exoplayer2.demo E/EventLogger: playerFailed [eventTime=79.31, mediaPos=79.15, window=0, period=0, errorCode=ERROR_CODE_IO_BAD_HTTP_STATUS
      com.google.android.exoplayer2.ExoPlaybackException: Source error
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:624)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:596)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:214)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
        at com.google.android.exoplayer2.ext.cronet.CronetDataSource.open(CronetDataSource.java:726)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:201)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:776)
        at com.google.android.exoplayer2.upstream.cache.CacheDataSource.open(CacheDataSource.java:589)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.prepareExtraction(HlsMediaChunk.java:483)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.feedDataToExtractor(HlsMediaChunk.java:457)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:432)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:388)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:409)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
    ]
2021-09-06 11:18:10.313 6476-6476/com.google.android.exoplayer2.demo D/test: playererror ERROR_CODE_IO_BAD_HTTP_STATUS

I am testing using most recent ExoPlayer demo just added a print in onPlayerError in PlayerActivity.java:

      player.addListener(new PlayerEventListener(){
        @Override
        public void onPlayerError(@NonNull PlaybackException error) {
          Log.d("test","playererror "+error.getErrorCodeName());
          super.onPlayerError(error);
        }
      });
@ojw28
Copy link
Contributor

ojw28 commented Sep 7, 2021

If the issue is as described, then it's definitely a bug. Are you able to provide a stream that we can reproduce with somehow?

@spirgiuz
Copy link
Author

spirgiuz commented Sep 7, 2021

@ojw28 sorry, I am not able to provide an example stream.

@christosts christosts self-assigned this Sep 9, 2021
christosts added a commit that referenced this issue Sep 16, 2021
This was originally reported on #9390. There was a bug that when HLS
loads failed, the player would endlessly retry and never fail with a
player error.

This change fixes a bug in HlsSampleStreamWrapper.onPlaylistError()
which would return true for a playlist whose load encountered an error
but could not be excluded, whereas the method should return false.

Issue: #9390

#minor-release

PiperOrigin-RevId: 397045802
@christosts
Copy link
Contributor

We performed a similar test to the one you described ("the server starts responding with 403") and spotted a bug. We submitted a fix (see linked commit above) which is already pushed to the dev-v2 branch and will be included in the upcoming 2.15.1 minor release.

I'll close this issue for now, feel free to re-open if the fix did not fully address the issues you're observing.

christosts added a commit that referenced this issue Sep 21, 2021
This was originally reported on #9390. There was a bug that when HLS
loads failed, the player would endlessly retry and never fail with a
player error.

This change fixes a bug in HlsSampleStreamWrapper.onPlaylistError()
which would return true for a playlist whose load encountered an error
but could not be excluded, whereas the method should return false.

Issue: #9390

PiperOrigin-RevId: 397045802
@google google locked and limited conversation to collaborators Nov 16, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

3 participants