summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-04-21 15:26:33 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-04-21 15:26:33 -0700
commit3a2df6624ff07e3e2fe9868f58bdda48cac7aa03 (patch)
tree5885085b7a2fd76823a14eb025c9f2baf0a85849
parentb1bf6ce9c87d98335387e8475eff8e52d022202b (diff)
parent21ec5bd3f88a2e7b20f75067b68ae547146853b3 (diff)
downloadomap3-3a2df6624ff07e3e2fe9868f58bdda48cac7aa03.tar.gz
am 21ec5bd3: am b052eae4: Fixes a race condition in the hardware mp3 OMX driver code.
-rw-r--r--omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Dec_Utils.c55
-rw-r--r--omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Decoder.c35
2 files changed, 46 insertions, 44 deletions
diff --git a/omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Dec_Utils.c b/omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Dec_Utils.c
index 2909d9a..91709f6 100644
--- a/omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Dec_Utils.c
+++ b/omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Dec_Utils.c
@@ -551,6 +551,25 @@ OMX_ERRORTYPE MP3DEC_FreeCompResources(OMX_HANDLETYPE pComponent)
return eError;
}
+static void signalAlloBufThresholdIfNecessary(
+ MP3DEC_COMPONENT_PRIVATE *pComponentPrivate) {
+#ifndef UNDER_CE
+ pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
+ if (pComponentPrivate->AlloBuf_waitingsignal) {
+ pComponentPrivate->AlloBuf_waitingsignal = 0;
+ pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
+ }
+ pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
+#else
+ if (pComponentPrivate->AlloBuf_waitingsignal) {
+ // I am fairly sure this will suffer from similar issues without
+ // proper mutex protection and a loop under WinCE...
+ pComponentPrivate->AlloBuf_waitingsignal = 0;
+ OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event));
+ }
+#endif
+}
+
/* ================================================================================= * */
/**
@@ -1469,17 +1488,8 @@ OMX_U32 MP3DEC_HandleCommand (MP3DEC_COMPONENT_PRIVATE *pComponentPrivate)
pComponentPrivate->pPortDef[MP3D_OUTPUT_PORT]->bEnabled = OMX_TRUE;
OMX_PRCOMM2(pComponentPrivate->dbg, "pComponentPrivate->pPortDef[MP3D_OUTPUT_PORT]->bEnabled = %d\n",
pComponentPrivate->pPortDef[MP3D_OUTPUT_PORT]->bEnabled);
-
- if(pComponentPrivate->AlloBuf_waitingsignal){
- pComponentPrivate->AlloBuf_waitingsignal = 0;
-#ifndef UNDER_CE
- pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
- pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
- pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
-#else
- OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event));
-#endif
- }
+
+ signalAlloBufThresholdIfNecessary(pComponentPrivate);
OMX_PRCOMM2(pComponentPrivate->dbg, "setting output port to enabled\n");
}
}
@@ -1493,13 +1503,8 @@ OMX_U32 MP3DEC_HandleCommand (MP3DEC_COMPONENT_PRIVATE *pComponentPrivate)
MP3D_INPUT_PORT,
NULL);
- if(pComponentPrivate->AlloBuf_waitingsignal){
- pComponentPrivate->AlloBuf_waitingsignal = 0;
- pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
- pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
- pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
- }
-
+ signalAlloBufThresholdIfNecessary(pComponentPrivate);
+
//MP3DECFill_LCMLInitParamsEx(pHandle, 0);
// queue the pending buffers received while doing the config
for (i=0; i < pComponentPrivate->nNumInputBufPending; i++) {
@@ -1540,12 +1545,7 @@ OMX_U32 MP3DEC_HandleCommand (MP3DEC_COMPONENT_PRIVATE *pComponentPrivate)
MP3D_OUTPUT_PORT,
NULL);
- if(pComponentPrivate->AlloBuf_waitingsignal){
- pComponentPrivate->AlloBuf_waitingsignal = 0;
- pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
- pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
- pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
- }
+ signalAlloBufThresholdIfNecessary(pComponentPrivate);
OMX_PRINT2(pComponentPrivate->dbg, "reconfigOut = %d!, but should be true!\n",pComponentPrivate->reconfigOutputPort);
if(pComponentPrivate->reconfigOutputPort){
//make sure new VA's are used
@@ -1625,12 +1625,7 @@ OMX_U32 MP3DEC_HandleCommand (MP3DEC_COMPONENT_PRIVATE *pComponentPrivate)
MP3D_OUTPUT_PORT,
NULL);
- if(pComponentPrivate->AlloBuf_waitingsignal){
- pComponentPrivate->AlloBuf_waitingsignal = 0;
- pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
- pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
- pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
- }
+ signalAlloBufThresholdIfNecessary(pComponentPrivate);
MP3DEC_CleanupInitParamsEx(pHandle,commandData);
MP3DECFill_LCMLInitParamsEx(pHandle, -1);
diff --git a/omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Decoder.c b/omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Decoder.c
index 7703961..5eb55c7 100644
--- a/omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Decoder.c
+++ b/omx/audio/src/openmax_il/mp3_dec/src/OMX_Mp3Decoder.c
@@ -1821,7 +1821,24 @@ static OMX_ERRORTYPE ComponentTunnelRequest (OMX_HANDLETYPE hComp,
return eError;
}
-
+static void waitForAlloBufThreshold(
+ MP3DEC_COMPONENT_PRIVATE *pComponentPrivate) {
+#ifndef UNDER_CE
+ pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
+ pComponentPrivate->AlloBuf_waitingsignal = 1;
+ while (pComponentPrivate->AlloBuf_waitingsignal) {
+ pthread_cond_wait(
+ &pComponentPrivate->AlloBuf_threshold,
+ &pComponentPrivate->AlloBuf_mutex);
+ }
+ pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
+#else
+ // I am fairly sure this will suffer from similar issues without
+ // proper mutex protection and a loop under WinCE...
+ pComponentPrivate->AlloBuf_waitingsignal = 1;
+ OMX_WaitForEvent(&(pComponentPrivate->AlloBuf_event));
+#endif
+}
/* ================================================================================= * */
/**
@@ -1875,14 +1892,7 @@ static OMX_ERRORTYPE AllocateBuffer (OMX_IN OMX_HANDLETYPE hComponent,
MP3D_OMX_CONF_CHECK_CMD(pPortDef, 1, 1);
if(!pPortDef->bEnabled){
- pComponentPrivate->AlloBuf_waitingsignal = 1;
-#ifndef UNDER_CE
- pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
- pthread_cond_wait(&pComponentPrivate->AlloBuf_threshold, &pComponentPrivate->AlloBuf_mutex);
- pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
-#else
- OMX_WaitForEvent(&(pComponentPrivate->AlloBuf_event));
-#endif
+ waitForAlloBufThreshold(pComponentPrivate);
}
OMX_MALLOC_GENERIC(pBufferHeader, OMX_BUFFERHEADERTYPE);
@@ -2273,11 +2283,8 @@ static OMX_ERRORTYPE UseBuffer (
pComponentPrivate)->pPortDef[nPortIndex];
MP3D_OMX_CONF_CHECK_CMD(pPortDef, 1, 1);
- if(!pPortDef->bEnabled){
- pComponentPrivate->AlloBuf_waitingsignal = 1;
- pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
- pthread_cond_wait(&pComponentPrivate->AlloBuf_threshold, &pComponentPrivate->AlloBuf_mutex);
- pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
+ if(!pPortDef->bEnabled) {
+ waitForAlloBufThreshold(pComponentPrivate);
}
OMX_PRCOMM2(pComponentPrivate->dbg, ":: pPortDef = %p\n",pPortDef);
OMX_PRCOMM2(pComponentPrivate->dbg, ":: pPortDef->bEnabled = %d\n",pPortDef->bEnabled);