Surface reuse issue related to BufferQueueProducer and MediaCodec

225 Views Asked by At

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.

  1. The app uses a SurfaceView.
  2. 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.

0

There are 0 best solutions below