Browse Source

sf-omx-il: Add ROI(region of interest) support for codaj12

Signed-off-by: Som Qin <som.qin@starfivetech.com>
Som Qin 2 years ago
parent
commit
9ad08d3c63

+ 82 - 2
soft_3rdpart/omx-il/component/image/dec/SF_OMX_Mjpeg_decoder.c

@@ -539,9 +539,48 @@ static OMX_ERRORTYPE SF_OMX_GetConfig(
     FunctionIn();
     if (hComponent == NULL)
     {
-        return OMX_ErrorBadParameter;
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    if (pComponentConfigStructure == NULL)
+    {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
     }
 
+    LOG(SF_LOG_INFO, "Get config on index %X\r\n", nIndex);
+    OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
+    SF_CODAJ12_IMPLEMEMT *pSfMjpegImplement = (SF_CODAJ12_IMPLEMEMT *)pSfOMXComponent->componentImpl;
+
+    switch ((OMX_U32)nIndex)
+    {
+    case OMX_IndexConfigCommonOutputCrop:
+    {
+        OMX_CONFIG_RECTTYPE *rectParam = (OMX_CONFIG_RECTTYPE *)pComponentConfigStructure;
+        DecConfigParam *decConfig = pSfMjpegImplement->config;
+        if(rectParam->nPortIndex == (OMX_U32)(OMX_OUTPUT_PORT_INDEX))
+        {
+            rectParam->nLeft = decConfig->roiOffsetX;
+            rectParam->nTop = decConfig->roiOffsetY;
+            rectParam->nWidth = decConfig->roiWidth;
+            rectParam->nHeight = decConfig->roiHeight;
+            LOG(SF_LOG_INFO, "Get OutputCrop left %d top %d width %d height %d \r\n",
+                decConfig->roiOffsetX, decConfig->roiOffsetY, decConfig->roiWidth, decConfig->roiHeight);
+        }
+        else
+        {
+            LOG(SF_LOG_WARN, "Only output port support OutputCrop param\r\n");
+            ret = OMX_ErrorBadParameter;
+        }
+        break;
+    }
+
+    default:
+        break;
+    }
+EXIT:
     FunctionOut();
 
     return ret;
@@ -557,8 +596,49 @@ static OMX_ERRORTYPE SF_OMX_SetConfig(
     FunctionIn();
     if (hComponent == NULL)
     {
-        return OMX_ErrorBadParameter;
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    if (pComponentConfigStructure == NULL)
+    {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    LOG(SF_LOG_INFO, "Set config on index %X\r\n", nIndex);
+    OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
+    SF_CODAJ12_IMPLEMEMT *pSfMjpegImplement = (SF_CODAJ12_IMPLEMEMT *)pSfOMXComponent->componentImpl;
+
+    switch ((OMX_U32)nIndex)
+    {
+    case OMX_IndexConfigCommonOutputCrop:
+    {
+        OMX_CONFIG_RECTTYPE *rectParam = (OMX_CONFIG_RECTTYPE *)pComponentConfigStructure;
+        DecConfigParam *decConfig = pSfMjpegImplement->config;
+        if(rectParam->nPortIndex == (OMX_U32)(OMX_OUTPUT_PORT_INDEX))
+        {
+            decConfig->roiOffsetX = rectParam->nLeft;
+            decConfig->roiOffsetY = rectParam->nTop;
+            decConfig->roiWidth = rectParam->nWidth;
+            decConfig->roiHeight = rectParam->nHeight;
+            decConfig->roiEnable = OMX_TRUE;
+            LOG(SF_LOG_INFO, "Set OutputCrop left %d top %d width %d height %d \r\n",
+                decConfig->roiOffsetX, decConfig->roiOffsetY, decConfig->roiWidth, decConfig->roiHeight);
+        }
+        else
+        {
+            LOG(SF_LOG_WARN, "Only support set OutputCrop config to output port\r\n");
+            ret = OMX_ErrorBadParameter;
+        }
+        break;
     }
+
+    default:
+        break;
+    }
+EXIT:
     FunctionOut();
 
     return ret;

+ 52 - 1
soft_3rdpart/omx-il/tests/mjpeg_dec_test.c

@@ -43,6 +43,10 @@ typedef struct DecodeTestContext
     OMX_BUFFERHEADERTYPE *pOutputBufferArray[64];
     AVFormatContext *avContext;
     int msgid;
+    OMX_S32 RoiLeft;
+    OMX_S32 RoiTop;
+    OMX_U32 RoiWidth;
+    OMX_U32 RoiHeight;
 } DecodeTestContext;
 DecodeTestContext *decodeTestContext;
 static OMX_S32 FillInputBuffer(DecodeTestContext *decodeTestContext, OMX_BUFFERHEADERTYPE *pInputBuffer);
@@ -202,11 +206,13 @@ int main(int argc, char **argv)
         {"output", required_argument, NULL, 'o'},
         {"input", required_argument, NULL, 'i'},
         {"format", required_argument, NULL, 'f'},
+        {"roi", required_argument, NULL, 'c'},
         {NULL, no_argument, NULL, 0},
     };
-    char *shortOpt = "i:o:f:";
+    char *shortOpt = "i:o:f:c:";
     OMX_U32 c;
     OMX_S32 l;
+    OMX_STRING val;
 
     // if (argc == 0)
     // {
@@ -238,6 +244,40 @@ int main(int argc, char **argv)
             printf("format: %s\r\n", optarg);
             memcpy(decodeTestContext->sOutputFormat, optarg, strlen(optarg));
             break;
+        case 'c':
+            val = strtok(optarg, ",");
+            if (val == NULL) {
+                printf("Invalid ROI option: %s\n", optarg);
+                return -1;
+            }
+            else {
+                decodeTestContext->RoiLeft = atoi(val);
+            }
+            val = strtok(NULL, ",");
+            if (val == NULL) {
+                printf("Invalid ROI option: %s\n", optarg);
+                return -1;
+            }
+            else {
+                decodeTestContext->RoiTop = atoi(val);
+            }
+            val = strtok(NULL, ",");
+            if (val == NULL) {
+                printf("Invalid ROI option: %s\n", optarg);
+                return -1;
+            }
+            else {
+                decodeTestContext->RoiWidth = atoi(val);
+            }
+            val = strtok(NULL, ",");
+            if (val == NULL) {
+                printf("Invalid ROI option: %s\n", optarg);
+                return -1;
+            }
+            else {
+                decodeTestContext->RoiHeight = atoi(val);
+            }
+            break;
         case 'h':
         default:
             help();
@@ -347,6 +387,17 @@ int main(int argc, char **argv)
     }
     OMX_SetParameter(hComponentDecoder, OMX_IndexParamPortDefinition, &pOutputPortDefinition);
 
+    /* Set Roi config setting*/
+    OMX_CONFIG_RECTTYPE RectConfig;
+    OMX_INIT_STRUCTURE(RectConfig);
+    RectConfig.nPortIndex = 1;
+    OMX_GetConfig(hComponentDecoder, OMX_IndexConfigCommonOutputCrop, &RectConfig);
+    RectConfig.nLeft = decodeTestContext->RoiLeft;
+    RectConfig.nTop = decodeTestContext->RoiTop;
+    RectConfig.nWidth = decodeTestContext->RoiWidth;
+    RectConfig.nHeight = decodeTestContext->RoiHeight;
+    OMX_SetConfig(hComponentDecoder, OMX_IndexConfigCommonOutputCrop, &RectConfig);
+
     OMX_SendCommand(hComponentDecoder, OMX_CommandStateSet, OMX_StateIdle, NULL);
 
     OMX_PARAM_PORTDEFINITIONTYPE pInputPortDefinition;