vlc | branch: master | Thomas Guillem <guil...@archos.com> | Fri Jul 25 16:50:54 2014 +0200| [f9182874b2235acea94ef634552188edc80b2df8] | committer: Martin Storsjö
iomx-dr: don't always lock buffers from dequeue According to OMXCodec.cpp, we shouldn't call lockBuffer when we first allocate all buffers, since we may cancel some of them (the min_undequeued ones). We should call lockBuffer only before giving a buffer to OMX. Signed-off-by: Martin Storsjö <mar...@martin.st> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f9182874b2235acea94ef634552188edc80b2df8 --- modules/codec/omxil/iomx_hwbuffer.c | 16 ++++++++++++++-- modules/codec/omxil/omxil.c | 13 +++++++++++-- modules/codec/omxil/omxil_core.c | 2 ++ modules/codec/omxil/omxil_core.h | 1 + 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/modules/codec/omxil/iomx_hwbuffer.c b/modules/codec/omxil/iomx_hwbuffer.c index c22d8c7..c8619d4 100644 --- a/modules/codec/omxil/iomx_hwbuffer.c +++ b/modules/codec/omxil/iomx_hwbuffer.c @@ -181,6 +181,20 @@ int IOMXHWBuffer_Dequeue( void *window, void **pp_handle ) #endif CHECK_ERR(); + *pp_handle = anb; + + return 0; +} + +int IOMXHWBuffer_Lock( void *window, void *p_handle ) +{ + ANativeWindow *anw = (ANativeWindow *)window; + ANativeWindowBuffer_t *anb = (ANativeWindowBuffer_t *)p_handle; + status_t err = NO_ERROR; + + CHECK_ANW(); + CHECK_ANB(); + #if ANDROID_API >= 18 err = anw->lockBuffer_DEPRECATED( anw, anb ); #else @@ -188,8 +202,6 @@ int IOMXHWBuffer_Dequeue( void *window, void **pp_handle ) #endif CHECK_ERR(); - *pp_handle = anb; - return 0; } diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c index 875f5a2..ce83613 100644 --- a/modules/codec/omxil/omxil.c +++ b/modules/codec/omxil/omxil.c @@ -2018,8 +2018,8 @@ static void HwBuffer_Init( decoder_t *p_dec, OmxPort *p_port ) if( !(pf_enable_graphic_buffers && pf_get_graphic_buffer_usage && pf_omx_hwbuffer_connect && pf_omx_hwbuffer_disconnect && pf_omx_hwbuffer_setup && pf_omx_hwbuffer_setcrop && - pf_omx_hwbuffer_dequeue && pf_omx_hwbuffer_queue && - pf_omx_hwbuffer_cancel && + pf_omx_hwbuffer_dequeue && pf_omx_hwbuffer_lock && + pf_omx_hwbuffer_queue && pf_omx_hwbuffer_cancel && ((OMX_COMPONENTTYPE*)p_port->omx_handle)->UseBuffer) ) { msg_Warn( p_dec, "direct output port enabled but can't find " @@ -2281,6 +2281,13 @@ static int HwBuffer_Start( decoder_t *p_dec, OmxPort *p_port ) if( p_header && p_port->p_hwbuf->i_states[i] == BUF_STATE_OWNED ) { + if( pf_omx_hwbuffer_lock( p_port->p_hwbuf->window, + p_header->pBuffer ) != 0 ) + { + msg_Err( p_dec, "lock failed" ); + HWBUFFER_UNLOCK(); + return -1; + } OMX_DBG( "FillThisBuffer %p, %p", p_header, p_header->pBuffer ); OMX_FillThisBuffer( p_port->omx_handle, p_header ); } @@ -2455,6 +2462,8 @@ static void *DequeueThread( void *data ) * we call the dequeue function if there is at least one buffer * available. */ err = pf_omx_hwbuffer_dequeue( p_port->p_hwbuf->window, &p_handle ); + if( err == 0 ) + err = pf_omx_hwbuffer_lock( p_port->p_hwbuf->window, p_handle ); HWBUFFER_LOCK(); diff --git a/modules/codec/omxil/omxil_core.c b/modules/codec/omxil/omxil_core.c index 8b866a7..23166b3 100644 --- a/modules/codec/omxil/omxil_core.c +++ b/modules/codec/omxil/omxil_core.c @@ -96,6 +96,7 @@ int (*pf_omx_hwbuffer_setup) (void *, int, int, int, int, unsigned int *, unsigned int *); int (*pf_omx_hwbuffer_setcrop) (void *, int, int, int, int); int (*pf_omx_hwbuffer_dequeue) (void *, void **); +int (*pf_omx_hwbuffer_lock) (void *, void *); int (*pf_omx_hwbuffer_queue) (void *, void *); int (*pf_omx_hwbuffer_cancel) (void *, void *); @@ -180,6 +181,7 @@ int InitOmxCore(vlc_object_t *p_this) pf_omx_hwbuffer_setup = dlsym( dll_handle, "OMXHWBuffer_Setup" ); pf_omx_hwbuffer_setcrop = dlsym( dll_handle, "OMXHWBuffer_Setcrop" ); pf_omx_hwbuffer_dequeue = dlsym( dll_handle, "OMXHWBuffer_Dequeue" ); + pf_omx_hwbuffer_lock = dlsym( dll_handle, "OMXHWBuffer_Lock" ); pf_omx_hwbuffer_queue = dlsym( dll_handle, "OMXHWBuffer_Queue" ); pf_omx_hwbuffer_cancel = dlsym( dll_handle, "OMXHWBuffer_Cancel" ); #endif diff --git a/modules/codec/omxil/omxil_core.h b/modules/codec/omxil/omxil_core.h index 0326179..dbf6629 100644 --- a/modules/codec/omxil/omxil_core.h +++ b/modules/codec/omxil/omxil_core.h @@ -44,6 +44,7 @@ int (*pf_omx_hwbuffer_setup) (void *, int, int, int, int, unsigned int *, unsigned int *); int (*pf_omx_hwbuffer_setcrop) (void *, int, int, int, int); int (*pf_omx_hwbuffer_dequeue) (void *, void **); +int (*pf_omx_hwbuffer_lock) (void *, void *); int (*pf_omx_hwbuffer_queue) (void *, void *); int (*pf_omx_hwbuffer_cancel) (void *, void *); _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits