summaryrefslogtreecommitdiff
path: root/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c
diff options
context:
space:
mode:
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.c46
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: