dburckh / ExoPlayer

Deprecated. See https://github.com/dburckh/Media3Avi
Apache License 2.0
3 stars 2 forks source link

Source error after seeking backwards #2

Closed moneytoo closed 2 years ago

moneytoo commented 2 years ago

With this sample, the video plays fine, but I get errors after scrubbing on the timeline to the beginning.

E/LoadTask: Unexpected exception loading stream
      java.lang.IllegalArgumentException
        at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:39)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:643)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:32)
        at com.google.android.exoplayer2.upstream.DataSpec$Builder.build(DataSpec.java:214)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.buildDataSpec(ProgressiveMediaPeriod.java:1092)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1012)
        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:920)
E/ExoPlayerImplInternal: Playback error
      com.google.android.exoplayer2.ExoPlaybackException: Source error
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:628)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:604)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loopOnce(Looper.java:226)
        at android.os.Looper.loop(Looper.java:313)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: com.google.android.exoplayer2.upstream.Loader$UnexpectedLoaderException: Unexpected IllegalArgumentException: null
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:430)
        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:920)
     Caused by: java.lang.IllegalArgumentException
        at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:39)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:643)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:32)
        at com.google.android.exoplayer2.upstream.DataSpec$Builder.build(DataSpec.java:214)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.buildDataSpec(ProgressiveMediaPeriod.java:1092)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1012)
        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:920) 

Sample: altaj-test-60.zip

dburckh commented 2 years ago

I could not duplicate this one. It looks like it was an invalid seek position. Could you give me specific steps to recreate it? Also, the device you tested on might be helpful.

moneytoo commented 2 years ago

I was testing it outside the demo, with configured SeekParameters, some callbacks to update the picture during scrubbing etc. I will try replicating that in the demo.

moneytoo commented 2 years ago

I'm able to duplicate it in the demo app with just scrubbing forward and backward multiple times (during playback). (I only added Toast to show on player error.) Though in this case it requires "few" more attempts.

This is on Samsung Galaxy S21 FE. I will try also different devices.

I/CCodecConfig: query failed after returning 8 values (BAD_INDEX)
D/EventLogger: isPlaying [eventTime=34.76, mediaPos=76.52, window=0, period=0, false]
W/Codec2Client: query -- param skipped: index = 1342179345.
    query -- param skipped: index = 2415921170.
I/CCodec: state->set(RUNNING)
I/CCodecBufferChannel: [c2.sec.mpeg4.decoder#490] 4 initial input buffers available
I/CCodec: state->set(FLUSHING)
I/CCodec: state->set(FLUSHED)
D/CCodecBuffers: [c2.sec.mp3.decoder#747:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 0
    [c2.sec.mp3.decoder#747:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 1
    [c2.sec.mp3.decoder#747:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 2
D/MediaCodec: keep callback message for reclaim
I/CCodec: state->set(RESUMING)
I/CCodecConfig: query failed after returning 7 values (BAD_INDEX)
W/Codec2Client: query -- param skipped: index = 1342179345.
    query -- param skipped: index = 2415921170.
I/CCodec: state->set(RUNNING)
I/CCodecBufferChannel: [c2.sec.mp3.decoder#747] 4 initial input buffers available
D/EventLogger: loading [eventTime=34.77, mediaPos=76.52, window=0, period=0, true]
D/AudioTrack: setVolume(1.000000, 1.000000) pid : 16105
D/EventLogger: loading [eventTime=34.79, mediaPos=76.52, window=0, period=0, false]
D/EventLogger: renderedFirstFrame [eventTime=34.97, mediaPos=76.52, window=0, period=0, Surface(name=null)/@0xa684e3b]
D/EventLogger: state [eventTime=34.98, mediaPos=76.52, window=0, period=0, READY]
D/EventLogger: isPlaying [eventTime=34.98, mediaPos=76.53, window=0, period=0, true]
D/AudioTrack: getTimestamp_l(1406): device stall time corrected using current time 98555594939903
I/ViewRootImpl@9b22d9d[PlayerActivity]: ViewPostIme pointer 0
I/ViewRootImpl@9b22d9d[PlayerActivity]: ViewPostIme pointer 1
D/AviExtractor: SeekPoint: us=28000000 pos=2507438
D/EventLogger: positionDiscontinuity [eventTime=35.19, mediaPos=29.19, window=0, period=0, reason=SEEK, PositionInfo:old [mediaItem=0, period=0, pos=76634], PositionInfo:new [mediaItem=0, period=0, pos=29192]]
I/CCodec: state->set(FLUSHING)
I/CCodec: state->set(FLUSHED)
D/MediaCodec: keep callback message for reclaim
I/CCodec: state->set(RESUMING)
I/CCodecConfig: query failed after returning 8 values (BAD_INDEX)
W/Codec2Client: query -- param skipped: index = 1342179345.
    query -- param skipped: index = 2415921170.
I/CCodec: state->set(RUNNING)
D/EventLogger: state [eventTime=35.20, mediaPos=29.19, window=0, period=0, BUFFERING]
I/CCodecBufferChannel: [c2.sec.mpeg4.decoder#490] 4 initial input buffers available
I/CCodec: state->set(FLUSHING)
    state->set(FLUSHED)
D/CCodecBuffers: [c2.sec.mp3.decoder#747:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 0
    [c2.sec.mp3.decoder#747:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 1
D/MediaCodec: keep callback message for reclaim
D/EventLogger: isPlaying [eventTime=35.20, mediaPos=29.19, window=0, period=0, false]
I/CCodec: state->set(RESUMING)
I/CCodecConfig: query failed after returning 7 values (BAD_INDEX)
W/Codec2Client: query -- param skipped: index = 1342179345.
    query -- param skipped: index = 2415921170.
I/CCodec: state->set(RUNNING)
I/CCodecBufferChannel: [c2.sec.mp3.decoder#747] 4 initial input buffers available
D/AviExtractor: SeekPoint: us=28000000 pos=2507438
D/ApplicationMediaCapabilities: Building ApplicationMediaCapabilities with: (Supported HDR: [android.media.feature.hdr.dolby_vision, android.media.feature.hdr.hdr10, android.media.feature.hdr.hdr10_plus, android.media.feature.hdr.hlg] Unsupported HDR: []) (Supported Codec:  [video/hevc] Unsupported Codec:[]) false
D/EventLogger: loading [eventTime=35.21, mediaPos=29.19, window=0, period=0, true]
D/AudioTrack: setVolume(1.000000, 1.000000) pid : 16105
D/EventLogger: renderedFirstFrame [eventTime=35.23, mediaPos=29.19, window=0, period=0, Surface(name=null)/@0xa684e3b]
D/EventLogger: state [eventTime=35.24, mediaPos=29.19, window=0, period=0, READY]
D/EventLogger: isPlaying [eventTime=35.24, mediaPos=29.22, window=0, period=0, true]
D/EventLogger: loading [eventTime=35.26, mediaPos=29.22, window=0, period=0, false]
I/ViewRootImpl@9b22d9d[PlayerActivity]: ViewPostIme pointer 0
I/ViewRootImpl@9b22d9d[PlayerActivity]: ViewPostIme pointer 1
D/AviExtractor: SeekPoint: us=10000000 pos=1328126
D/EventLogger: positionDiscontinuity [eventTime=35.58, mediaPos=10.31, window=0, period=0, reason=SEEK, PositionInfo:old [mediaItem=0, period=0, pos=29441], PositionInfo:new [mediaItem=0, period=0, pos=10310]]
I/CCodec: state->set(FLUSHING)
I/CCodec: state->set(FLUSHED)
D/MediaCodec: keep callback message for reclaim
I/CCodec: state->set(RESUMING)
I/CCodecConfig: query failed after returning 8 values (BAD_INDEX)
W/Codec2Client: query -- param skipped: index = 1342179345.
    query -- param skipped: index = 2415921170.
I/CCodec: state->set(RUNNING)
D/EventLogger: state [eventTime=35.58, mediaPos=10.31, window=0, period=0, BUFFERING]
I/CCodecBufferChannel: [c2.sec.mpeg4.decoder#490] 4 initial input buffers available
D/EventLogger: isPlaying [eventTime=35.58, mediaPos=10.31, window=0, period=0, false]
I/CCodec: state->set(FLUSHING)
I/CCodec: state->set(FLUSHED)
D/CCodecBuffers: [c2.sec.mp3.decoder#747:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 0
    [c2.sec.mp3.decoder#747:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 1
D/MediaCodec: keep callback message for reclaim
I/CCodec: state->set(RESUMING)
I/CCodecConfig: query failed after returning 7 values (BAD_INDEX)
W/Codec2Client: query -- param skipped: index = 1342179345.
    query -- param skipped: index = 2415921170.
I/CCodec: state->set(RUNNING)
I/CCodecBufferChannel: [c2.sec.mp3.decoder#747] 4 initial input buffers available
D/AviExtractor: SeekPoint: us=10000000 pos=1328126
D/ApplicationMediaCapabilities: Building ApplicationMediaCapabilities with: (Supported HDR: [android.media.feature.hdr.dolby_vision, android.media.feature.hdr.hdr10, android.media.feature.hdr.hdr10_plus, android.media.feature.hdr.hlg] Unsupported HDR: []) (Supported Codec:  [video/hevc] Unsupported Codec:[]) false
W/AviExtractor: Unknown tag=ðÆßþ pos=1333832 size=-1008739560 moviEnd=10615954
D/EventLogger: loading [eventTime=35.59, mediaPos=10.31, window=0, period=0, true]
E/LoadTask: Unexpected exception loading stream
      java.lang.IllegalArgumentException
        at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:39)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:643)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:32)
        at com.google.android.exoplayer2.upstream.DataSpec$Builder.build(DataSpec.java:214)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.buildDataSpec(ProgressiveMediaPeriod.java:1088)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1008)
        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:920)
E/EventLogger: internalError [eventTime=35.59, mediaPos=10.31, window=0, period=0, loadError
      com.google.android.exoplayer2.upstream.Loader$UnexpectedLoaderException: Unexpected IllegalArgumentException: null
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:430)
        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:920)
     Caused by: java.lang.IllegalArgumentException
        at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:39)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:643)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:32)
        at com.google.android.exoplayer2.upstream.DataSpec$Builder.build(DataSpec.java:214)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.buildDataSpec(ProgressiveMediaPeriod.java:1088)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1008)
        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:920) 
    ]
E/ExoPlayerImplInternal: Playback error
      com.google.android.exoplayer2.ExoPlaybackException: Source error
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:639)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loopOnce(Looper.java:226)
        at android.os.Looper.loop(Looper.java:313)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: com.google.android.exoplayer2.upstream.Loader$UnexpectedLoaderException: Unexpected IllegalArgumentException: null
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:430)
        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:920)
     Caused by: java.lang.IllegalArgumentException
        at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:39)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:643)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:32)
        at com.google.android.exoplayer2.upstream.DataSpec$Builder.build(DataSpec.java:214)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.buildDataSpec(ProgressiveMediaPeriod.java:1088)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1008)
        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:920) 
I/CCodec: state->set(FLUSHING)
I/CCodec: state->set(FLUSHED)
D/MediaCodec: keep callback message for reclaim
I/CCodec: state->set(RESUMING)
I/CCodecConfig: query failed after returning 8 values (BAD_INDEX)
W/Codec2Client: query -- param skipped: index = 1342179345.
    query -- param skipped: index = 2415921170.
I/CCodec: state->set(RUNNING)
I/CCodecBufferChannel: [c2.sec.mpeg4.decoder#490] 4 initial input buffers available
I/CCodec: state->set(FLUSHING)
D/EventLogger: videoDisabled [eventTime=35.60, mediaPos=10.31, window=0, period=0]
I/CCodec: state->set(FLUSHED)
D/MediaCodec: keep callback message for reclaim
I/CCodec: state->set(RESUMING)
I/CCodecConfig: query failed after returning 7 values (BAD_INDEX)
W/Codec2Client: query -- param skipped: index = 1342179345.
    query -- param skipped: index = 2415921170.
I/CCodec: state->set(RUNNING)
I/CCodecBufferChannel: [c2.sec.mp3.decoder#747] 4 initial input buffers available
D/EventLogger: audioDisabled [eventTime=35.60, mediaPos=10.31, window=0, period=0]
D/SurfaceUtils: connecting to surface 0x6f67ee1b70, reason connectToSurface
I/MediaCodec: [c2.sec.mpeg4.decoder] setting surface generation to 16491522
D/SurfaceUtils: disconnecting from surface 0x6f67ee1b70, reason connectToSurface(reconnect)
    connecting to surface 0x6f67ee1b70, reason connectToSurface(reconnect)
D/Codec2-OutputBufferQueue: remote graphic buffer migration 0/0
D/Codec2Client: setOutputSurface -- failed to set consumer usage (6/BAD_INDEX)
    setOutputSurface -- generation=16491522 consumer usage=0x900
E/BufferQueueProducer: [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 0 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 1 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 2 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 3 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 4 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 5 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 6 is not owned by the producer (state = ACQUIRED)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 7 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 8 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 9 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 10 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 11 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 12 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 13 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 14 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 15 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 16 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 17 is not owned by the producer (state = FREE)
E/BufferQueueProducer: [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 18 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 19 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 20 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 21 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 22 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 23 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 24 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 25 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 26 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 27 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 28 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 29 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 30 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 31 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 32 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 33 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 34 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 35 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 36 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 37 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 38 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 39 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 40 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 41 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 42 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 43 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 44 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 45 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 46 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 47 is not owned by the producer (state = FREE)
E/BufferQueueProducer: [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 48 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 49 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 50 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 51 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 52 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 53 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 54 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 55 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 56 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 57 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 58 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 59 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 60 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 61 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 62 is not owned by the producer (state = FREE)
    [SurfaceView - com.google.android.exoplayer2.demo/com.google.android.exoplayer2.demo.PlayerActivity@7d9d53f@0#3(BLAST Consumer)3](id:3ee900000003,api:3,p:16105,c:16105) detachBuffer: slot 63 is not owned by the producer (state = FREE)
D/Codec2Client: Surface configure completed
D/SurfaceUtils: disconnecting from surface 0x6f67ed9330, reason disconnectFromSurface
I/CCodec: state->set(RELEASING)
D/CCodecBufferChannel: [c2.sec.mpeg4.decoder#490] MediaCodec discarded an unknown buffer
    [c2.sec.mpeg4.decoder#490] MediaCodec discarded an unknown buffer
    [c2.sec.mpeg4.decoder#490] MediaCodec discarded an unknown buffer
I/CCodec: [c2.sec.mpeg4.decoder] release(1)
D/CCodecBufferChannel: [c2.sec.mpeg4.decoder#490] MediaCodec discarded an unknown buffer
D/EventLogger: videoDecoderReleased [eventTime=35.60, mediaPos=10.31, window=0, period=0, c2.sec.mpeg4.decoder]
I/CCodec: state->set(RELEASING)
D/CCodecBufferChannel: [c2.sec.mp3.decoder#747] MediaCodec discarded an unknown buffer
I/CCodec: [c2.sec.mp3.decoder] release(1)
D/CCodecBufferChannel: [c2.sec.mp3.decoder#747] MediaCodec discarded an unknown buffer
    [c2.sec.mp3.decoder#747] MediaCodec discarded an unknown buffer
    [c2.sec.mp3.decoder#747] MediaCodec discarded an unknown buffer
D/EventLogger: audioDecoderReleased [eventTime=35.60, mediaPos=10.31, window=0, period=0, c2.sec.mp3.decoder]
I/CCodec: state->set(RELEASED)
I/CCodec: state->set(RELEASED)
I/hw-BpHwBinder: onLastStrongRef automatically unlinking death recipients
D/SurfaceUtils: disconnecting from surface 0x6f67ee1b70, reason disconnectFromSurface
I/MediaCodec: Codec shutdown complete
E/EventLogger: playerFailed [eventTime=35.61, mediaPos=10.31, window=0, period=0, errorCode=ERROR_CODE_IO_UNSPECIFIED
      com.google.android.exoplayer2.ExoPlaybackException: Source error
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:639)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loopOnce(Looper.java:226)
        at android.os.Looper.loop(Looper.java:313)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: com.google.android.exoplayer2.upstream.Loader$UnexpectedLoaderException: Unexpected IllegalArgumentException: null
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:430)
        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:920)
     Caused by: java.lang.IllegalArgumentException
        at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:39)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:643)
        at com.google.android.exoplayer2.upstream.DataSpec.<init>(DataSpec.java:32)
        at com.google.android.exoplayer2.upstream.DataSpec$Builder.build(DataSpec.java:214)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.buildDataSpec(ProgressiveMediaPeriod.java:1088)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1008)
        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:920) 
    ]
D/CompatibilityChangeReporter: Compat change id reported: 147798919; UID 10428; state: DISABLED
I/MediaCodec: Codec shutdown complete
I/hw-BpHwBinder: onLastStrongRef automatically unlinking death recipients
E/BufferQueueProducer: [MediaCodec.release](id:3ee900000004,api:0,p:-1,c:16105) detachBuffer: BufferQueue has no connected producer
moneytoo commented 2 years ago

I'm also able to reproduce it on different device such as OnePlus 7. Though it's much harder in the demo app. In my app I'm updating the picture during scrubbing by calling seekTo in the onScrubMove callback (and waiting for the frame to be rendered).

dburckh commented 2 years ago

Yeah, that got it. I pressed forward and backward in the demo app rapidly and it got it a couple times. I also see a potential issue if a negative seek position is passed. I'll fix that as well.

dburckh commented 2 years ago

Found it, if you seek while the Extractor was in a middle of a chunk, it becomes unstable. Added change so partial chunk is abandoned on seek. Changes pushed.

moneytoo commented 2 years ago

Great! Works fine after updating.