diff options
Diffstat (limited to 'exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c')
-rw-r--r-- | exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c b/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c index 8d646db..0d3d686 100644 --- a/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c +++ b/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c @@ -1835,7 +1835,6 @@ static ExynosVideoErrorType MFC_Encoder_Enqueue_Inbuf( buf.index = index; pCtx->pInbuf[buf.index].bQueued = VIDEO_TRUE; - pthread_mutex_unlock(pMutex); if (pCtx->bShareInbuf == VIDEO_TRUE) { buf.memory = pCtx->nMemoryType; @@ -1853,15 +1852,20 @@ static ExynosVideoErrorType MFC_Encoder_Enqueue_Inbuf( buf.m.planes[i].bytesused = dataSize[i]; } + pCtx->pInbuf[buf.index].pPrivate = pPrivate; + + pthread_mutex_unlock(pMutex); + if (exynos_v4l2_qbuf(pCtx->hEnc, &buf) != 0) { ALOGE("%s: Failed to enqueue input buffer", __func__); + pthread_mutex_lock(pMutex); + pCtx->pInbuf[buf.index].pPrivate = NULL; pCtx->pInbuf[buf.index].bQueued = VIDEO_FALSE; + pthread_mutex_unlock(pMutex); ret = VIDEO_ERROR_APIFAIL; goto EXIT; } - pCtx->pInbuf[buf.index].pPrivate = pPrivate; - EXIT: return ret; } @@ -1913,7 +1917,6 @@ static ExynosVideoErrorType MFC_Encoder_Enqueue_Outbuf( } buf.index = index; pCtx->pOutbuf[buf.index].bQueued = VIDEO_TRUE; - pthread_mutex_unlock(pMutex); if (pCtx->bShareOutbuf == VIDEO_TRUE) { buf.memory = pCtx->nMemoryType; @@ -1929,15 +1932,20 @@ static ExynosVideoErrorType MFC_Encoder_Enqueue_Outbuf( buf.memory = V4L2_MEMORY_MMAP; } + pCtx->pOutbuf[buf.index].pPrivate = pPrivate; + + pthread_mutex_unlock(pMutex); + if (exynos_v4l2_qbuf(pCtx->hEnc, &buf) != 0) { ALOGE("%s: Failed to enqueue output buffer", __func__); + pthread_mutex_lock(pMutex); + pCtx->pOutbuf[buf.index].pPrivate = NULL; pCtx->pOutbuf[buf.index].bQueued = VIDEO_FALSE; + pthread_mutex_unlock(pMutex); ret = VIDEO_ERROR_APIFAIL; goto EXIT; } - pCtx->pOutbuf[buf.index].pPrivate = pPrivate; - EXIT: return ret; } @@ -1978,6 +1986,7 @@ static ExynosVideoBuffer *MFC_Encoder_Dequeue_Inbuf(void *pHandle) { ExynosVideoEncContext *pCtx = (ExynosVideoEncContext *)pHandle; ExynosVideoBuffer *pInbuf = NULL; + pthread_mutex_t *pMutex = NULL; struct v4l2_buffer buf; @@ -2005,9 +2014,14 @@ static ExynosVideoBuffer *MFC_Encoder_Dequeue_Inbuf(void *pHandle) goto EXIT; } + pMutex = (pthread_mutex_t*)pCtx->pInMutex; + pthread_mutex_lock(pMutex); + pInbuf = &pCtx->pInbuf[buf.index]; pCtx->pInbuf[buf.index].bQueued = VIDEO_FALSE; + pthread_mutex_unlock(pMutex); + EXIT: return pInbuf; } @@ -2019,6 +2033,7 @@ static ExynosVideoBuffer *MFC_Encoder_Dequeue_Outbuf(void *pHandle) { ExynosVideoEncContext *pCtx = (ExynosVideoEncContext *)pHandle; ExynosVideoBuffer *pOutbuf = NULL; + pthread_mutex_t *pMutex = NULL; struct v4l2_buffer buf; struct v4l2_plane planes[VIDEO_ENCODER_OUTBUF_PLANES]; @@ -2049,6 +2064,9 @@ static ExynosVideoBuffer *MFC_Encoder_Dequeue_Outbuf(void *pHandle) goto EXIT; } + pMutex = (pthread_mutex_t*)pCtx->pOutMutex; + pthread_mutex_lock(pMutex); + pOutbuf = &pCtx->pOutbuf[buf.index]; pOutbuf->planes[0].dataSize = buf.m.planes[0].bytesused; @@ -2070,6 +2088,8 @@ static ExynosVideoBuffer *MFC_Encoder_Dequeue_Outbuf(void *pHandle) pOutbuf->bQueued = VIDEO_FALSE; + pthread_mutex_unlock(pMutex); + EXIT: return pOutbuf; } @@ -2191,9 +2211,7 @@ static ExynosVideoErrorType MFC_Encoder_ExtensionEnqueue_Inbuf( } buf.index = index; - pCtx->pInbuf[buf.index].bQueued = VIDEO_TRUE; - pthread_mutex_unlock(pMutex); buf.memory = pCtx->nMemoryType; for (i = 0; i < nPlanes; i++) { @@ -2208,17 +2226,20 @@ static ExynosVideoErrorType MFC_Encoder_ExtensionEnqueue_Inbuf( pCtx->pInbuf[buf.index].planes[i].allocSize = allocLen[i]; } + pCtx->pInbuf[buf.index].pPrivate = pPrivate; + + pthread_mutex_unlock(pMutex); + if (exynos_v4l2_qbuf(pCtx->hEnc, &buf) != 0) { ALOGE("%s: Failed to enqueue input buffer", __func__); pthread_mutex_lock(pMutex); + pCtx->pInbuf[buf.index].pPrivate = NULL; pCtx->pInbuf[buf.index].bQueued = VIDEO_FALSE; pthread_mutex_unlock(pMutex); ret = VIDEO_ERROR_APIFAIL; goto EXIT; } - pCtx->pInbuf[buf.index].pPrivate = pPrivate; - EXIT: return ret; } @@ -2248,16 +2269,19 @@ static ExynosVideoErrorType MFC_Encoder_ExtensionDequeue_Inbuf(void *pHandle, Ex memset(&buf, 0, sizeof(buf)); buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; buf.memory = pCtx->nMemoryType; + if (exynos_v4l2_dqbuf(pCtx->hEnc, &buf) != 0) { ALOGE("%s: Failed to dequeue input buffer", __func__); ret = VIDEO_ERROR_APIFAIL; goto EXIT; } - memcpy(pVideoBuffer, &pCtx->pInbuf[buf.index], sizeof(ExynosVideoBuffer)); pMutex = (pthread_mutex_t*)pCtx->pInMutex; pthread_mutex_lock(pMutex); + + memcpy(pVideoBuffer, &pCtx->pInbuf[buf.index], sizeof(ExynosVideoBuffer)); pCtx->pInbuf[buf.index].bQueued = VIDEO_FALSE; + pthread_mutex_unlock(pMutex); EXIT: |