Browse Source

OMX: Complement OMX_GetRolesOfComponent api of omx core

Signed-off-by: Som Qin <som.qin@starfivetech.com>
Som Qin 1 year ago
parent
commit
d73ff5e792

+ 90 - 45
omx-il/component/video/wave4/SF_OMX_Wave420L_encoder.c

@@ -181,12 +181,10 @@ OMX_ERRORTYPE WaveOmxInit(SF_OMX_COMPONENT *pSfOMXComponent)
         pPortDefinition->format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
         pPortDefinition->format.video.nStride = DEFAULT_FRAME_WIDTH;
         pPortDefinition->format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
-        pPortDefinition->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
         pPortDefinition->format.video.xFramerate = DEFAULT_FRAMERATE;
 
         pPortDefinition->format.video.pNativeRender = 0;
         pPortDefinition->format.video.bFlagErrorConcealment = OMX_FALSE;
-        pPortDefinition->format.video.eColorFormat = OMX_COLOR_FormatUnused;
 
         pPortDefinition->bEnabled = OMX_TRUE;
         pPortDefinition->eDir = (i == 0 ? OMX_DirInput : OMX_DirOutput);
@@ -201,6 +199,9 @@ OMX_ERRORTYPE WaveOmxInit(SF_OMX_COMPONENT *pSfOMXComponent)
     pSfOMXComponent->portDefinition[OMX_OUTPUT_PORT_INDEX].format.video.cMIMEType = "video/H265";
 
     pSfOMXComponent->portDefinition[OMX_INPUT_PORT_INDEX].format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
+    pSfOMXComponent->portDefinition[OMX_OUTPUT_PORT_INDEX].format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pSfOMXComponent->portDefinition[OMX_INPUT_PORT_INDEX].format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    pSfOMXComponent->portDefinition[OMX_OUTPUT_PORT_INDEX].format.video.eCompressionFormat = OMX_VIDEO_CodingHEVC;
 
     memset(pSfOMXComponent->pBufferArray, 0, sizeof(pSfOMXComponent->pBufferArray));
     pSfOMXComponent->memory_optimization = OMX_TRUE;
@@ -1723,25 +1724,47 @@ static OMX_ERRORTYPE SF_OMX_GetParameter(
         OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
         OMX_U32 index = portFormat->nIndex;
         LOG(SF_LOG_INFO, "Get video port format at index %d\r\n", index);
-        portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
-        portFormat->xFramerate = 30;
-        switch (index)
+        if (portFormat->nPortIndex == OMX_OUTPUT_PORT_INDEX)
         {
-        case 0:
-            portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
-            break;
-        case 1:
-            portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar;
-            break;
-        case 2:
-            portFormat->eColorFormat = OMX_COLOR_FormatYVU420SemiPlanar;
-            break;
-        default:
             if (index > 0)
             {
                 ret = OMX_ErrorNoMore;
+                break;
             }
-            break;
+            portFormat->eCompressionFormat = pSfOMXComponent->portDefinition[OMX_OUTPUT_PORT_INDEX].format.video.eCompressionFormat;
+            portFormat->eColorFormat = pSfOMXComponent->portDefinition[OMX_OUTPUT_PORT_INDEX].format.video.eColorFormat;
+            portFormat->xFramerate = pSfOMXComponent->portDefinition[OMX_OUTPUT_PORT_INDEX].format.video.xFramerate;
+        }
+        else if (portFormat->nPortIndex == OMX_INPUT_PORT_INDEX)
+        {
+            switch (index)
+            {
+            case 0:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar;
+                portFormat->xFramerate = pSfOMXComponent->portDefinition[OMX_INPUT_PORT_INDEX].format.video.xFramerate;
+                break;
+            case 1:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+                portFormat->xFramerate = pSfOMXComponent->portDefinition[OMX_INPUT_PORT_INDEX].format.video.xFramerate;
+                break;
+            case 2:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat = OMX_COLOR_FormatYVU420SemiPlanar;
+                portFormat->xFramerate = pSfOMXComponent->portDefinition[OMX_INPUT_PORT_INDEX].format.video.xFramerate;
+                break;
+            default:
+                if (index > 0)
+                {
+                    ret = OMX_ErrorNoMore;
+                }
+                break;
+            }
+        }
+        else
+        {
+            ret = OMX_ErrorBadPortIndex;
         }
         break;
     }
@@ -1967,37 +1990,59 @@ static OMX_ERRORTYPE SF_OMX_SetParameter(
         OMX_PARAM_PORTDEFINITIONTYPE *pPort = &pSfOMXComponent->portDefinition[nPortIndex];
         LOG(SF_LOG_INFO, "Set eColorFormat to %d\r\n", eColorFormat);
 
-        if (nPortIndex >= OMX_PORT_MAX)
-            return OMX_ErrorBadPortIndex;
-
-        pPort = &pSfOMXComponent->portDefinition[nPortIndex];
-
-        switch (eColorFormat)
+        if (nPortIndex == OMX_OUTPUT_PORT_INDEX)
         {
-        case OMX_COLOR_FormatYUV420Planar:
-            pImp->encConfig.cbcrInterleave = OMX_FALSE;
-            pImp->encConfig.nv21 = OMX_FALSE;
-            pImp->encConfig.srcFormat = FORMAT_420;
-            pImp->encConfig.packedFormat = NOT_PACKED;
-            break;
-        case OMX_COLOR_FormatYUV420SemiPlanar:
-            pImp->encConfig.cbcrInterleave = OMX_TRUE;
-            pImp->encConfig.nv21 = OMX_FALSE;
-            pImp->encConfig.srcFormat = FORMAT_420;
-            pImp->encConfig.packedFormat = NOT_PACKED;
-            break;
-        case OMX_COLOR_FormatYVU420SemiPlanar:
-            pImp->encConfig.cbcrInterleave = OMX_TRUE;
-            pImp->encConfig.nv21 = OMX_TRUE;
-            pImp->encConfig.srcFormat = FORMAT_420;
-            pImp->encConfig.packedFormat = NOT_PACKED;
-            break;
-        default:
-            ret = OMX_ErrorBadParameter;
-            break;
+            if (portFormat->eColorFormat != pPort->format.video.eColorFormat ||
+                    portFormat->eCompressionFormat != pPort->format.video.eCompressionFormat)
+            {
+                return OMX_ErrorBadParameter;
+            }
+        }
+        else if (nPortIndex == OMX_INPUT_PORT_INDEX)
+        {
+            if (portFormat->eCompressionFormat != pPort->format.video.eCompressionFormat)
+            {
+                return OMX_ErrorBadParameter;
+            }
+            if (portFormat->xFramerate == 0)
+            {
+                return OMX_ErrorBadParameter;
+            }
+            switch (portFormat->eColorFormat)
+            {
+                case OMX_COLOR_FormatYUV420Planar: //I420
+                    pImp->encConfig.cbcrInterleave = OMX_FALSE;
+                    pImp->encConfig.nv21 = OMX_FALSE;
+                    pImp->encConfig.srcFormat = FORMAT_420;
+                    pImp->encConfig.packedFormat = NOT_PACKED;
+                    pPort->format.video.xFramerate = portFormat->xFramerate;
+                    break;
+                case OMX_COLOR_FormatYUV420SemiPlanar: //NV12
+                    pImp->encConfig.cbcrInterleave = OMX_TRUE;
+                    pImp->encConfig.nv21 = OMX_FALSE;
+                    pImp->encConfig.srcFormat = FORMAT_420;
+                    pImp->encConfig.packedFormat = NOT_PACKED;
+                    pPort->format.video.xFramerate = portFormat->xFramerate;
+                    break;
+                case OMX_COLOR_FormatYVU420SemiPlanar: //NV21
+                    pImp->encConfig.cbcrInterleave = OMX_TRUE;
+                    pImp->encConfig.nv21 = OMX_TRUE;
+                    pImp->encConfig.srcFormat = FORMAT_420;
+                    pImp->encConfig.packedFormat = NOT_PACKED;
+                    pPort->format.video.xFramerate = portFormat->xFramerate;
+                    break;
+                default:
+                    LOG(SF_LOG_ERR, "Error to set parameter: %d, only nv12 nv21 i420 supported\r\n", portFormat->eColorFormat);
+                    return OMX_ErrorBadParameter;
+                    break;
+            }
+            if(!ret){
+                pPort->format.video.eColorFormat = eColorFormat;
+            }
         }
-        if(!ret){
-            pPort->format.video.eColorFormat = eColorFormat;
+        else
+        {
+            return OMX_ErrorBadPortIndex;
         }
         break;
     }

+ 11 - 3
omx-il/component/video/wave5/common/SF_OMX_video_common.c

@@ -292,7 +292,6 @@ OMX_ERRORTYPE InitComponentStructorCommon(SF_OMX_COMPONENT *pSfOMXComponent)
         pPortDefinition->format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
         pPortDefinition->format.video.nStride = DEFAULT_FRAME_WIDTH;
         pPortDefinition->format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
-        pPortDefinition->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
         pPortDefinition->format.video.cMIMEType = malloc(OMX_MAX_STRINGNAME_SIZE);
         pPortDefinition->format.video.xFramerate = 30;
         if (pPortDefinition->format.video.cMIMEType == NULL)
@@ -306,7 +305,6 @@ OMX_ERRORTYPE InitComponentStructorCommon(SF_OMX_COMPONENT *pSfOMXComponent)
         memset(pPortDefinition->format.video.cMIMEType, 0, OMX_MAX_STRINGNAME_SIZE);
         pPortDefinition->format.video.pNativeRender = 0;
         pPortDefinition->format.video.bFlagErrorConcealment = OMX_FALSE;
-        pPortDefinition->format.video.eColorFormat = OMX_COLOR_FormatUnused;
         pPortDefinition->bEnabled = OMX_TRUE;
 
         pAVCComponent->nPortIndex = i;
@@ -322,9 +320,19 @@ OMX_ERRORTYPE InitComponentStructorCommon(SF_OMX_COMPONENT *pSfOMXComponent)
     pSfOMXComponent->portDefinition[0].nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
     pSfOMXComponent->portDefinition[0].nBufferCountActual = VPU_INPUT_BUF_NUMBER;
     pSfOMXComponent->portDefinition[0].nBufferCountMin = VPU_INPUT_BUF_NUMBER;
+    if (strstr(pSfOMXComponent->componentName, "avc") != NULL)
+    {
+        pSfOMXComponent->portDefinition[0].format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+    }
+    else if (strstr(pSfOMXComponent->componentName, "hevc") != NULL)
+    {
+        pSfOMXComponent->portDefinition[0].format.video.eCompressionFormat = OMX_VIDEO_CodingHEVC;
+    }
+    pSfOMXComponent->portDefinition[0].format.video.eColorFormat = OMX_COLOR_FormatUnused;
 
     strcpy(pSfOMXComponent->portDefinition[1].format.video.cMIMEType, "raw/video");
-    pSfOMXComponent->portDefinition[1].format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+    pSfOMXComponent->portDefinition[1].format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    pSfOMXComponent->portDefinition[1].format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
     pSfOMXComponent->portDefinition[1].eDir = OMX_DirOutput;
     pSfOMXComponent->portDefinition[1].nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
     pSfOMXComponent->portDefinition[1].nBufferCountActual = VPU_OUTPUT_BUF_NUMBER;

+ 81 - 37
omx-il/component/video/wave5/dec/SF_OMX_Vdec_decoder.c

@@ -790,29 +790,47 @@ static OMX_ERRORTYPE SF_OMX_GetParameter(
     {
         OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
         OMX_U32 index = portFormat->nIndex;
-        switch (index)
+        if (portFormat->nPortIndex == 0)
         {
-        case 0:
-            portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
-            portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar;
-            portFormat->xFramerate = 30;
-            break;
-        case 1:
-            portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
-            portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
-            portFormat->xFramerate = 30;
-            break;
-        case 2:
-            portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
-            portFormat->eColorFormat = OMX_COLOR_FormatYVU420SemiPlanar;
-            portFormat->xFramerate = 30;
-            break;
-        default:
             if (index > 0)
             {
                 ret = OMX_ErrorNoMore;
+                break;
             }
-            break;
+            portFormat->eCompressionFormat = pSfOMXComponent->portDefinition[0].format.video.eCompressionFormat;
+            portFormat->eColorFormat = pSfOMXComponent->portDefinition[0].format.video.eColorFormat;
+            portFormat->xFramerate = pSfOMXComponent->portDefinition[0].format.video.xFramerate;
+        }
+        else if (portFormat->nPortIndex == 1)
+        {
+            switch (index)
+            {
+            case 0:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar;
+                portFormat->xFramerate = pSfOMXComponent->portDefinition[1].format.video.xFramerate;
+                break;
+            case 1:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+                portFormat->xFramerate = pSfOMXComponent->portDefinition[1].format.video.xFramerate;
+                break;
+            case 2:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat = OMX_COLOR_FormatYVU420SemiPlanar;
+                portFormat->xFramerate = pSfOMXComponent->portDefinition[1].format.video.xFramerate;
+                break;
+            default:
+                if (index > 0)
+                {
+                    ret = OMX_ErrorNoMore;
+                }
+                break;
+            }
+        }
+        else
+        {
+            ret = OMX_ErrorBadPortIndex;
         }
     }
 
@@ -853,10 +871,16 @@ static OMX_ERRORTYPE SF_OMX_GetParameter(
         break;
 
     case OMX_IndexParamVideoAvc:
+    {
+        OMX_VIDEO_PARAM_AVCTYPE *sFormatAvc = (OMX_VIDEO_PARAM_AVCTYPE *)ComponentParameterStructure;
+        sFormatAvc->eProfile = OMX_VIDEO_AVCProfileBaseline;
+        sFormatAvc->eLevel = OMX_VIDEO_AVCLevel1;
+    }
         break;
     case OMX_IndexParamVideoHevc:
         break;
     case OMX_IndexParamVideoProfileLevelQuerySupported:
+        ret = OMX_ErrorNoMore;
         break;
     case OMX_IndexParamCompBufferSupplier:
     {
@@ -912,27 +936,47 @@ static OMX_ERRORTYPE SF_OMX_SetParameter(
         TestDecConfig *pTestDecConfig = (TestDecConfig *)pSfVideoImplement->testConfig;
         OMX_PARAM_PORTDEFINITIONTYPE *pPort = &pSfOMXComponent->portDefinition[nPortIndex];
         LOG(SF_LOG_DEBUG, "Set video format to port %d color %d\r\n", portFormat->nPortIndex, portFormat->eColorFormat);
-        switch (portFormat->eColorFormat)
+
+        if (nPortIndex == 0)
         {
-             case OMX_COLOR_FormatYUV420Planar: //I420
-                pTestDecConfig->cbcrInterleave = FALSE;
-                pTestDecConfig->nv21 = FALSE;
-                pPort->format.video.eColorFormat = portFormat->eColorFormat;
-                break;
-            case OMX_COLOR_FormatYUV420SemiPlanar: //NV12
-                pTestDecConfig->cbcrInterleave = TRUE;
-                pTestDecConfig->nv21 = FALSE;
-                pPort->format.video.eColorFormat = portFormat->eColorFormat;
-                break;
-            case OMX_COLOR_FormatYVU420SemiPlanar: //NV21
-                pTestDecConfig->cbcrInterleave = TRUE;
-                pTestDecConfig->nv21 = TRUE;
-                pPort->format.video.eColorFormat = portFormat->eColorFormat;
-                break;
-            default:
-                LOG(SF_LOG_ERR, "Error to set parameter: %d, only nv12 nv21 i420 supported\r\n", portFormat->eColorFormat);
+            if (portFormat->eColorFormat != pPort->format.video.eColorFormat ||
+                    portFormat->eCompressionFormat != pPort->format.video.eCompressionFormat)
+            {
                 return OMX_ErrorBadParameter;
-                break;
+            }
+        }
+        else if (nPortIndex == 1)
+        {
+            if (portFormat->eCompressionFormat != pPort->format.video.eCompressionFormat)
+            {
+                return OMX_ErrorBadParameter;
+            }
+            switch (portFormat->eColorFormat)
+            {
+                case OMX_COLOR_FormatYUV420Planar: //I420
+                    pTestDecConfig->cbcrInterleave = FALSE;
+                    pTestDecConfig->nv21 = FALSE;
+                    pPort->format.video.eColorFormat = portFormat->eColorFormat;
+                    break;
+                case OMX_COLOR_FormatYUV420SemiPlanar: //NV12
+                    pTestDecConfig->cbcrInterleave = TRUE;
+                    pTestDecConfig->nv21 = FALSE;
+                    pPort->format.video.eColorFormat = portFormat->eColorFormat;
+                    break;
+                case OMX_COLOR_FormatYVU420SemiPlanar: //NV21
+                    pTestDecConfig->cbcrInterleave = TRUE;
+                    pTestDecConfig->nv21 = TRUE;
+                    pPort->format.video.eColorFormat = portFormat->eColorFormat;
+                    break;
+                default:
+                    LOG(SF_LOG_ERR, "Error to set parameter: %d, only nv12 nv21 i420 supported\r\n", portFormat->eColorFormat);
+                    return OMX_ErrorBadParameter;
+                    break;
+            }
+        }
+        else
+        {
+            return OMX_ErrorBadPortIndex;
         }
         break;
     }

+ 0 - 2
omx-il/core/SF_OMX_Core.c

@@ -244,7 +244,6 @@ OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent(
     OMX_ERRORTYPE ret = OMX_ErrorNone;
     FunctionIn();
 
-#if 0 //todo
     for (int i = 0; i < SF_OMX_COMPONENT_NUM; i ++)
     {
         if (sf_omx_component_list[i] == NULL)
@@ -260,7 +259,6 @@ OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent(
             LOG(SF_LOG_INFO,"Get component %s, Role = %s\r\n", sf_omx_component_list[i]->componentName, sf_omx_component_list[i]->componentRule)
         }
     }
-#endif
 
     FunctionOut();
     return ret;

+ 2 - 2
omx-il/tests/dec_test.c

@@ -36,8 +36,8 @@ typedef struct Message
 typedef struct DecodeTestContext
 {
     OMX_HANDLETYPE hComponentDecoder;
-    char sOutputFilePath[64];
-    char sInputFilePath[64];
+    char sOutputFilePath[256];
+    char sInputFilePath[256];
     char sOutputFormat[64];
     OMX_U32 ScaleWidth;
     OMX_U32 ScaleHeight;

+ 2 - 2
omx-il/tests/enc_test.c

@@ -39,8 +39,8 @@ typedef struct Message
 typedef struct EncodeTestContext
 {
     OMX_HANDLETYPE hComponentEncoder;
-    char sOutputFilePath[64];
-    char sInputFilePath[64];
+    char sOutputFilePath[256];
+    char sInputFilePath[256];
     FILE *pInputFile;
     char sInputFormat[64];
     char sOutputFormat[64];

+ 2 - 2
omx-il/tests/mjpeg_dec_test.c

@@ -37,8 +37,8 @@ typedef struct Message
 typedef struct DecodeTestContext
 {
     OMX_HANDLETYPE hComponentDecoder;
-    char sOutputFilePath[64];
-    char sInputFilePath[64];
+    char sOutputFilePath[256];
+    char sInputFilePath[256];
     char sOutputFormat[64];
     OMX_BUFFERHEADERTYPE *pInputBufferArray[64];
     OMX_BUFFERHEADERTYPE *pOutputBufferArray[64];