video: added OMX_IndexVendorNeedContigMemory support
[GitHub/LineageOS/android_hardware_samsung_slsi_openmax.git] / component / video / enc / Exynos_OMX_VencControl.c
index 89dd29210f9d5d85c326c345885e589b460602c2..2dd1b11baefacd4523a9170026d33e54947c4a01 100644 (file)
@@ -200,7 +200,9 @@ OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
         goto EXIT;
     }
 
-    if ((nPortIndex == INPUT_PORT_INDEX) &&
+    if (pExynosPort->bNeedContigMem == OMX_TRUE) {
+        eMemType = CONTIG_MEMORY;
+    } else if ((nPortIndex == INPUT_PORT_INDEX) &&
         (pExynosPort->bufferProcessType & BUFFER_SHARE)) {
         eMemType = NORMAL_MEMORY;
     }
@@ -1407,6 +1409,26 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(
             pPortDef->nBufferSize = MAX_INPUT_METADATA_BUFFER_SIZE;
         }
 #endif
+    }
+        break;
+    case OMX_IndexVendorNeedContigMemory:
+    {
+        EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE  *pPortMemType    = (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE *)pComponentParameterStructure;
+        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:
@@ -1594,6 +1616,33 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter(
     }
         break;
 #endif
+    case OMX_IndexVendorNeedContigMemory:
+    {
+        EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE  *pPortMemType    = (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE *)pComponentParameterStructure;
+        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, nParamIndex, pComponentParameterStructure);
@@ -1818,6 +1867,12 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetExtensionIndex(
         goto EXIT;
     }
 
+    if (Exynos_OSAL_Strcmp(szParamName, EXYNOS_INDEX_PARAM_NEED_CONTIG_MEMORY) == 0) {
+        *pIndexType = (OMX_INDEXTYPE) OMX_IndexVendorNeedContigMemory;
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
 #ifdef USE_STOREMETADATA
     if (Exynos_OSAL_Strcmp(szParamName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {
         *pIndexType = (OMX_INDEXTYPE)OMX_IndexParamStoreMetaDataBuffer;