Browse Source

Merge branch 'CR_3456_OMX_515_Som.Qin' into 'jh7110-devel'

CR 3456 OMX:vdec: Fix segment fault probability when video decode end

See merge request sdk/soft_3rdpart!28
andy.hu 1 year ago
parent
commit
883a1fac76

+ 18 - 6
omx-il/component/video/wave5/common/SF_OMX_video_common.c

@@ -63,12 +63,24 @@ OMX_ERRORTYPE ComponentClearCommon(SF_OMX_COMPONENT *pSfOMXComponent)
 {
     SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
 
-    pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentFeeder);
-    pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentExecoder);
-    pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentRender);
-    pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentFeeder, NULL);
-    pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentExecoder, NULL);
-    pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentRender, NULL);
+    if (pSfVideoImplement->hSFComponentFeeder)
+    {
+        pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentFeeder);
+        pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentFeeder, NULL);
+    }
+
+    if (pSfVideoImplement->hSFComponentExecoder)
+    {
+        pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentExecoder);
+        pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentExecoder, NULL);
+    }
+
+    if (pSfVideoImplement->hSFComponentRender)
+    {
+        pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentRender);
+        pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentRender, NULL);
+    }
+
     pSfVideoImplement->functions->DeInitLog();
     dlclose(pSfOMXComponent->soHandle);
     free(pSfVideoImplement->functions);

+ 15 - 9
omx-il/component/video/wave5/dec/SF_OMX_Vdec_decoder.c

@@ -2148,16 +2148,22 @@ static OMX_ERRORTYPE SF_OMX_ComponentClear(SF_OMX_COMPONENT *pSfOMXComponent)
     ComponentImpl *pSFComponentRender = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
 
     FunctionIn();
-    if (pSFComponentDecoder == NULL || pSFComponentFeeder == NULL || pSFComponentRender == NULL)
+
+    if (pSFComponentFeeder)
     {
-        goto EXIT;
+        pSFComponentFeeder->terminate = OMX_TRUE;
+        pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentFeeder);
+    }
+    if (pSFComponentDecoder)
+    {
+        pSFComponentDecoder->terminate = OMX_TRUE;
+        pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentExecoder);
+    }
+    if (pSFComponentRender)
+    {
+        pSFComponentRender->terminate = OMX_TRUE;
+        pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentRender);
     }
-    pSFComponentDecoder->terminate = OMX_TRUE;
-    pSFComponentFeeder->terminate = OMX_TRUE;
-    pSFComponentRender->terminate = OMX_TRUE;
-    pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentFeeder);
-    pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentExecoder);
-    pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentRender);
 
     pSfVideoImplement->bCmdRunning = 0;
     /* enqueue DEC_StopThread mean cmd thread cycle end */
@@ -2175,7 +2181,7 @@ static OMX_ERRORTYPE SF_OMX_ComponentClear(SF_OMX_COMPONENT *pSfOMXComponent)
     free(pSfVideoImplement->pusBitCode);
     pSfVideoImplement->functions->ClearDecListenerContext(pSfVideoImplement->lsnCtx);
     ComponentClearCommon(pSfOMXComponent);
-EXIT:
+
     nInstance--;
     FunctionOut();
 

+ 1 - 1
wave511/code/sample_v2/component_decoder/component_dec_renderer.c

@@ -615,7 +615,7 @@ static BOOL ExecuteRenderer(ComponentImpl* com, PortContainer* in, PortContainer
         {
             output->nFlags = 0x1;
             output->nFilledLen = 0;
-            VLOG(ERR, "Flush output port\r\n");
+            VLOG(INFO, "Flush output port\r\n");
             ComponentNotifyListeners(com, COMPONENT_EVENT_DEC_FILL_BUFFER_DONE, (void *)output);
         }
 #endif