exynos_omx: multi_thread: Add OMX_IndexParamVideoIntraRefresh support.

Add OMX_IndexParamVideoIntraRefresh support, with "Cyclic intra marcoblock refresh" mode support only.
Don't support "Adaptive intra-refresh".

o related-to-bug: 7524845

Change-Id: Id47c0cd3831db6fdb4e46ccece8f8d6f955d777a
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h
index cb5f110..072c2b4 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h
@@ -99,6 +99,7 @@
     OMX_BOOL IntraRefreshVOP;
     OMX_VIDEO_CONTROLRATETYPE eControlRate[ALL_PORT_NUM];
     OMX_VIDEO_PARAM_QUANTIZATIONTYPE quantization;
+    OMX_VIDEO_PARAM_INTRAREFRESHTYPE intraRefresh;
 
     OMX_BOOL bFirstInput;
     OMX_BOOL bFirstOutput;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c
index e8c8647..42bcc38 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c
@@ -1196,6 +1196,25 @@
 #endif
     }
         break;
+    case OMX_IndexParamVideoIntraRefresh:
+    {
+        OMX_VIDEO_PARAM_INTRAREFRESHTYPE *pIntraRefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)ComponentParameterStructure;
+        OMX_U32                           portIndex = pIntraRefresh->nPortIndex;
+        EXYNOS_OMX_VIDEOENC_COMPONENT    *pVideoEnc = NULL;
+
+        if (portIndex != OUTPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+            pIntraRefresh->eRefreshMode = pVideoEnc->intraRefresh.eRefreshMode;
+            pIntraRefresh->nAirMBs = pVideoEnc->intraRefresh.nAirMBs;
+            pIntraRefresh->nAirRef = pVideoEnc->intraRefresh.nAirRef;
+            pIntraRefresh->nCirMBs = pVideoEnc->intraRefresh.nCirMBs;
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
     default:
     {
         ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
@@ -1358,6 +1377,30 @@
         ret = OMX_ErrorNone;
     }
         break;
+    case OMX_IndexParamVideoIntraRefresh:
+    {
+        OMX_VIDEO_PARAM_INTRAREFRESHTYPE *pIntraRefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)ComponentParameterStructure;
+        OMX_U32                           portIndex = pIntraRefresh->nPortIndex;
+        EXYNOS_OMX_VIDEOENC_COMPONENT    *pVideoEnc = NULL;
+
+        if (portIndex != OUTPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+            if (pIntraRefresh->eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) {
+                pVideoEnc->intraRefresh.eRefreshMode = pIntraRefresh->eRefreshMode;
+                pVideoEnc->intraRefresh.nCirMBs = pIntraRefresh->nCirMBs;
+                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_VIDEO_IntraRefreshCyclic Enable, nCirMBs: %d",
+                                pVideoEnc->intraRefresh.nCirMBs);
+            } else {
+                ret = OMX_ErrorUnsupportedSetting;
+                goto EXIT;
+            }
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
 #ifdef USE_STOREMETADATA
     case OMX_IndexParamStoreMetaDataBuffer:
     {
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
index 0f8a275..d25503d 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
@@ -241,7 +241,6 @@
     pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
     pCommonParam->IDRPeriod    = pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames + 1;
     pCommonParam->SliceMode    = 0;
-    pCommonParam->RandomIntraMBRefresh = 0;
     pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
     pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
     pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
@@ -252,6 +251,15 @@
     pCommonParam->CbPadVal     = 0;
     pCommonParam->CrPadVal     = 0;
 
+    if (pVideoEnc->intraRefresh.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) {
+        /* Cyclic Mode */
+        pCommonParam->RandomIntraMBRefresh = pVideoEnc->intraRefresh.nCirMBs;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh: %d", pCommonParam->RandomIntraMBRefresh);
+    } else {
+        /* Don't support "Adaptive" and "Cyclic + Adaptive" */
+        pCommonParam->RandomIntraMBRefresh = 0;
+    }
+
     if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
         if (pVideoEnc->ANBColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
             pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c
index 4884a81..f58ee45 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c
@@ -232,7 +232,6 @@
     pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
     pCommonParam->IDRPeriod    = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1;
     pCommonParam->SliceMode    = 0;
-    pCommonParam->RandomIntraMBRefresh = 0;
     pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
     pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
     pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
@@ -243,6 +242,14 @@
     pCommonParam->CbPadVal     = 0;
     pCommonParam->CrPadVal     = 0;
 
+    if (pVideoEnc->intraRefresh.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) {
+        /* Cyclic Mode */
+        pCommonParam->RandomIntraMBRefresh = pVideoEnc->intraRefresh.nCirMBs;
+    } else {
+        /* Don't support "Adaptive" and "Cyclic + Adaptive" */
+        pCommonParam->RandomIntraMBRefresh = 0;
+    }
+
     if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
         if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear)
             pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
@@ -333,7 +340,6 @@
     pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
     pCommonParam->IDRPeriod    = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1;
     pCommonParam->SliceMode    = 0;
-    pCommonParam->RandomIntraMBRefresh = 0;
     pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
     pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
     pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
@@ -344,6 +350,14 @@
     pCommonParam->CbPadVal     = 0;
     pCommonParam->CrPadVal     = 0;
 
+    if (pVideoEnc->intraRefresh.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) {
+        /* Cyclic Mode */
+        pCommonParam->RandomIntraMBRefresh = pVideoEnc->intraRefresh.nCirMBs;
+    } else {
+        /* Don't support "Adaptive" and "Cyclic + Adaptive" */
+        pCommonParam->RandomIntraMBRefresh = 0;
+    }
+
     if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
         if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear)
             pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;