diff options
author | Thierry Strudel <tstrudel@google.com> | 2017-08-23 15:18:48 -0700 |
---|---|---|
committer | Thierry Strudel <tstrudel@google.com> | 2017-09-15 11:37:33 -0700 |
commit | a353607795ce19c8ca306a7b57ab8f3513e64f30 (patch) | |
tree | b09b00c0d4b2ec3acec69bd0a5b2b80a02d1a93d /msm8998 | |
parent | 544fdbb7dbafbe83a1313564074f0af689aae752 (diff) | |
download | media-a353607795ce19c8ca306a7b57ab8f3513e64f30.tar.gz |
msm8998: Update to 07.00.00.279.357
msm8998: from hardware/qcom/media
2ce45c6c mm-video-v4l2: Protect buffer lifecycle with lock
Test: build, boot, sanity checks
Bug: 64986220
Change-Id: I556c32a4ffefd5b2088e9ee146e4b2cb8e9edcfb
Signed-off-by: Thierry Strudel <tstrudel@google.com>
Diffstat (limited to 'msm8998')
-rw-r--r-- | msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index 107eaee..3ac98e6 100644 --- a/msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -2934,6 +2934,7 @@ OMX_ERRORTYPE omx_video::use_buffer( return OMX_ErrorInvalidState; } if (port == PORT_INDEX_IN) { + auto_lock l(m_lock); eRet = use_input_buffer(hComp,bufferHdr,port,appData,bytes,buffer); } else if (port == PORT_INDEX_OUT) { eRet = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); @@ -3135,7 +3136,9 @@ OMX_ERRORTYPE omx_video::allocate_input_meta_buffer( meta_buffer_hdr, m_inp_mem_ptr); } for (index = 0; ((index < m_sInPortDef.nBufferCountActual) && - meta_buffer_hdr[index].pBuffer); index++); + meta_buffer_hdr[index].pBuffer && + BITMASK_PRESENT(&m_inp_bm_count, index)); index++); + if (index == m_sInPortDef.nBufferCountActual) { DEBUG_PRINT_ERROR("All buffers are allocated input_meta_buffer"); return OMX_ErrorBadParameter; @@ -3559,6 +3562,7 @@ OMX_ERRORTYPE omx_video::allocate_buffer(OMX_IN OMX_HANDLETYPE h // What if the client calls again. if (port == PORT_INDEX_IN) { + auto_lock l(m_lock); #ifdef _ANDROID_ICS_ if (meta_mode_enable) eRet = allocate_input_meta_buffer(hComp,bufferHdr,appData,bytes); @@ -3653,10 +3657,12 @@ OMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp, DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %u, actual cnt %u", nPortIndex, (unsigned int)m_sInPortDef.nBufferCountActual); + pthread_mutex_lock(&m_lock); if (nPortIndex < m_sInPortDef.nBufferCountActual && BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) { // Clear the bit associated with it. BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); + pthread_mutex_unlock(&m_lock); free_input_buffer (buffer); m_sInPortDef.bPopulated = OMX_FALSE; @@ -3684,6 +3690,7 @@ OMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp, #endif } } else { + pthread_mutex_unlock(&m_lock); DEBUG_PRINT_ERROR("ERROR: free_buffer ,Port Index Invalid"); eRet = OMX_ErrorBadPortIndex; } @@ -3986,7 +3993,7 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, auto_lock l(m_lock); pmem_data_buf = (OMX_U8 *)m_pInput_pmem[nBufIndex].buffer; - if (pmem_data_buf) { + if (pmem_data_buf && BITMASK_PRESENT(&m_inp_bm_count, nBufIndex)) { memcpy (pmem_data_buf, (buffer->pBuffer + buffer->nOffset), buffer->nFilledLen); } |