video: added OMX_IndexVendorNeedContigMemory support
[GitHub/LineageOS/android_hardware_samsung_slsi_openmax.git] / component / video / dec / Exynos_OMX_VdecControl.c
index f1454b8c0e0c4551c2617b9e2c0ca5a9f6644278..7f814ce8a2bac295f934de7967605275a71c521f 100644 (file)
@@ -197,6 +197,8 @@ OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
     if ((pVideoDec->bDRMPlayerMode == OMX_TRUE) &&
         (nPortIndex == INPUT_PORT_INDEX)) {
         mem_type = SECURE_MEMORY;
+    } else if (pExynosPort->bNeedContigMem == OMX_TRUE) {
+        mem_type = CONTIG_MEMORY;
     } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
                (pExynosPort->bufferProcessType & BUFFER_SHARE)) {
         mem_type = NORMAL_MEMORY;
@@ -1072,6 +1074,26 @@ OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetParameter(
     }
         break;
 #endif
+    case OMX_IndexVendorNeedContigMemory:
+    {
+        EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE  *pPortMemType    = (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE *)ComponentParameterStructure;
+        OMX_U32                              nPortIndex      = pPortMemType->nPortIndex;
+        EXYNOS_OMX_BASEPORT                 *pExynosPort;
+
+        if (nPortIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        ret = Exynos_OMX_Check_SizeVersion(pPortMemType, sizeof(EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE));
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+
+        pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+
+        pPortMemType->bNeedContigMem = pExynosPort->bNeedContigMem;
+    }
+        break;
     default:
     {
         ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
@@ -1239,6 +1261,33 @@ OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetParameter(
     }
         break;
 #endif
+    case OMX_IndexVendorNeedContigMemory:
+    {
+        EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE  *pPortMemType    = (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE *)ComponentParameterStructure;
+        OMX_U32                              nPortIndex      = pPortMemType->nPortIndex;
+        EXYNOS_OMX_BASEPORT                 *pExynosPort;
+
+        if (nPortIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        ret = Exynos_OMX_Check_SizeVersion(pPortMemType, sizeof(EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE));
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+
+        pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
+                ret = OMX_ErrorIncorrectStateOperation;
+                goto EXIT;
+            }
+        }
+
+        pExynosPort->bNeedContigMem = pPortMemType->bNeedContigMem;
+    }
+        break;
     default:
     {
         ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
@@ -1388,6 +1437,12 @@ OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetExtensionIndex(
         goto EXIT;
     }
 
+    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_NEED_CONTIG_MEMORY) == 0) {
+        *pIndexType = (OMX_INDEXTYPE) OMX_IndexVendorNeedContigMemory;
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
 #ifdef USE_ANB
     if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_ANB) == 0)
         *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamEnableAndroidBuffers;