This issue is a bit complicated, so I try to focus on the relevant parts instead of dumping all the code of thousands of lines and a large number of logcat entries.
The app streams AVC and HEVC videos and it works flawlessly on a large number of Android devices. I have found one Android model with this issue in question. I have reasons to believe this is not the only device with this issue.
The decoding process is very similar to this sample.
- The app uses a SurfaceView.
- It uses mediaCodec.configure(mediaFormat, surface, null, null)
After mediaCodec is stopped and released, the surface can be used again and again. It works flawlessly on many devices. However, on this device, such reuse results in a flashing green screen. The following are relevant logcat entries:
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 14 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 15 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 16 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 17 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 18 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 19 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 20 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 21 is not owned by the producer (state = ACQUIRED)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 24 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 25 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 26 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 27 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 28 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 29 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 30 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 31 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 32 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 33 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 34 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 35 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 36 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 37 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 38 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 39 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 40 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 41 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 42 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 43 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 44 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 45 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 46 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 47 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 48 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 49 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 50 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 51 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 52 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 53 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 54 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 55 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 56 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 57 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 58 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 59 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 60 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 61 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 62 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 63 is not owned by the producer (state = FREE)
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 0 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.5 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.5 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.5 MediaCodec I rendring output error -22
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 22 is not owned by the producer (state = FREE)
00:44.5 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.5 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.5 MediaCodec I rendring output error -22
00:44.5 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 1 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.5 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.5 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.5 MediaCodec I rendring output error -22
00:44.6 MediaCodec I rendring output error -38
00:44.6 MediaCodec I rendring output error -38
00:44.6 MediaCodec I rendring output error -38
00:44.7 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 2 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.7 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.7 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.7 MediaCodec I rendring output error -22
00:44.7 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 3 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.7 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.7 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.7 MediaCodec I rendring output error -22
00:44.7 MediaCodec I rendring output error -38
00:44.7 BufferPoolAccessor2.0 D bufferpool2 0xb40000759e4fe038 : 4(8388608 size) total buffers - 4(8388608 size) used buffers - 0/6 (recycle/alloc) - 6/1315 (fetch/ transfer)
00:44.7 MediaCodec I rendring output error -38
00:44.7 MediaCodec I rendring output error -38
00:44.7 MediaCodec I rendring output error -38
00:44.7 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 4 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.7 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.7 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.7 MediaCodec I rendring output error -22
00:44.8 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 5 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.8 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.8 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.8 MediaCodec I rendring output error -22
00:44.8 MediaCodec I rendring output error -38
00:44.8 MediaCodec I rendring output error -38
00:44.8 MediaCodec I rendring output error -38
00:44.8 MediaCodec I rendring output error -38
00:44.9 MediaCodec I rendring output error -38
00:44.9 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 6 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.9 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.9 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.9 MediaCodec I rendring output error -22
00:44.9 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 7 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.9 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.9 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.9 MediaCodec I rendring output error -22
00:44.9 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 8 i s n ot o wned b y t he p roducer ( state = F REE)
00:44.9 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:44.9 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:44.9 MediaCodec I rendring output error -22
00:44.9 MediaCodec I rendring output error -38
00:44.9 MediaCodec I rendring output error -38
00:45.0 MediaCodec I rendring output error -38
00:45.0 MediaCodec I rendring output error -38
00:45.1 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 9 i s n ot o wned b y t he p roducer ( state = F REE)
00:45.1 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:45.1 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:45.1 MediaCodec I rendring output error -22
00:45.1 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 23 is not owned by the producer (state = FREE)
00:45.1 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:45.1 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:45.1 MediaCodec I rendring output error -22
00:45.1 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 10 is not owned by the producer (state = FREE)
00:45.1 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:45.1 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:45.1 MediaCodec I rendring output error -22
00:45.1 MediaCodec I rendring output error -38
00:45.1 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 11 is not owned by the producer (state = FREE)
00:45.1 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:45.1 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:45.1 MediaCodec I rendring output error -22
00:45.1 MediaCodec I rendring output error -38
00:45.1 MediaCodec I rendring output error -38
00:45.1 MediaCodec I rendring output error -38
00:45.2 BufferPoolAccessor2.0 D bufferpool2 0xb40000759e50f118 : 6(12582912 size) total buffers - 4(8388608 size ) used buffers - 0/6 (recycle/alloc) - 6/243 (fetch/ transfer)
00:45.2 MediaCodec I rendring output error -38
00:45.2 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 12 is not owned by the producer (state = FREE)
00:45.2 Codec2-Out...ufferQueue E outputBuffer -- queueBuffer() failed on bufferqueue-based block. Error = -22.
00:45.2 CCodecBufferChannel I [c2.rk.avc.decoder#438] queueBuffer failed: -22
00:45.2 MediaCodec I rendring output error -22
00:45.2 BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) queueBuffer: slot 13 is not owned by the producer (state = FREE)
The signature entries are the following type that always shows up when this issue occurs:
BufferQueueProducer E [SurfaceView[packagename/activityname]#21(BLAST Consumer)21](id:45580000001d,api:3,p:17752,c:17752) detachBuffer: slot 14 is not owned by the producer (state = FREE)
I think this is highly similar to this one. It looks like that many other developers have encountered this problem.
I believe this is specific to codecs because this problem is completely gone when I use decoder OMX.google.h264.decoder instead of c2.rk.avc.decoder on this particular Android device with this issue.
I wonder if anyone could shed some light on this and offer a tip on potential remedies. Is there a way to refresh the SurfaceView without recreating it? At present, the SurfaceView is in a layout file.