diff options
Diffstat (limited to 'sec_mm/sec_omx/sec_omx_component/video/enc/h264enc/SEC_OMX_H264enc.c')
-rw-r--r-- | sec_mm/sec_omx/sec_omx_component/video/enc/h264enc/SEC_OMX_H264enc.c | 1307 |
1 files changed, 0 insertions, 1307 deletions
diff --git a/sec_mm/sec_omx/sec_omx_component/video/enc/h264enc/SEC_OMX_H264enc.c b/sec_mm/sec_omx/sec_omx_component/video/enc/h264enc/SEC_OMX_H264enc.c deleted file mode 100644 index 24bbc7a..0000000 --- a/sec_mm/sec_omx/sec_omx_component/video/enc/h264enc/SEC_OMX_H264enc.c +++ /dev/null @@ -1,1307 +0,0 @@ -/* - * - * Copyright 2010 Samsung Electronics S.LSI Co. LTD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * @file SEC_OMX_H264enc.c - * @brief - * @author SeungBeom Kim (sbcrux.kim@samsung.com) - * @version 1.0 - * @history - * 2010.7.15 : Create - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "SEC_OMX_Macros.h" -#include "SEC_OMX_Basecomponent.h" -#include "SEC_OMX_Baseport.h" -#include "SEC_OMX_Venc.h" -#include "library_register.h" -#include "SEC_OMX_H264enc.h" -#include "SsbSipMfcApi.h" -#include "color_space_convertor.h" - -#undef SEC_LOG_TAG -#define SEC_LOG_TAG "SEC_H264_ENC" -#define SEC_LOG_OFF -#include "SEC_OSAL_Log.h" - - -/* H.264 Encoder Supported Levels & profiles */ -SEC_OMX_VIDEO_PROFILELEVEL supportedAVCProfileLevels[] ={ - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32}, - {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4}, - - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1b}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel11}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel12}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel13}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel2}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel21}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel22}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel3}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel31}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel32}, - {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel4}, - - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1b}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel11}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel12}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel13}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel2}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel21}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel22}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel3}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel31}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel32}, - {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel4}}; - - -OMX_U32 OMXAVCProfileToProfileIDC(OMX_VIDEO_AVCPROFILETYPE profile) -{ - OMX_U32 ret = 0; //default OMX_VIDEO_AVCProfileMain - - if (profile == OMX_VIDEO_AVCProfileMain) - ret = 0; - else if (profile == OMX_VIDEO_AVCProfileHigh) - ret = 1; - else if (profile == OMX_VIDEO_AVCProfileBaseline) - ret = 2; - - return ret; -} - -OMX_U32 OMXAVCLevelToLevelIDC(OMX_VIDEO_AVCLEVELTYPE level) -{ - OMX_U32 ret = 40; //default OMX_VIDEO_AVCLevel4 - - if (level == OMX_VIDEO_AVCLevel1) - ret = 10; - else if (level == OMX_VIDEO_AVCLevel1b) - ret = 9; - else if (level == OMX_VIDEO_AVCLevel11) - ret = 11; - else if (level == OMX_VIDEO_AVCLevel12) - ret = 12; - else if (level == OMX_VIDEO_AVCLevel13) - ret = 13; - else if (level == OMX_VIDEO_AVCLevel2) - ret = 20; - else if (level == OMX_VIDEO_AVCLevel21) - ret = 21; - else if (level == OMX_VIDEO_AVCLevel22) - ret = 22; - else if (level == OMX_VIDEO_AVCLevel3) - ret = 30; - else if (level == OMX_VIDEO_AVCLevel31) - ret = 31; - else if (level == OMX_VIDEO_AVCLevel32) - ret = 32; - else if (level == OMX_VIDEO_AVCLevel4) - ret = 40; - - return ret; -} - -OMX_U8 *FindDelimiter(OMX_U8 *pBuffer, OMX_U32 size) -{ - int i; - - for (i = 0; i < size - 3; i++) { - if ((pBuffer[i] == 0x00) && - (pBuffer[i+1] == 0x00) && - (pBuffer[i+2] == 0x00) && - (pBuffer[i+3] == 0x01)) - return (pBuffer + i); - } - - return NULL; -} - -void H264PrintParams(SSBSIP_MFC_ENC_H264_PARAM h264Arg) -{ - SEC_OSAL_Log(SEC_LOG_TRACE, "SourceWidth : %d\n", h264Arg.SourceWidth); - SEC_OSAL_Log(SEC_LOG_TRACE, "SourceHeight : %d\n", h264Arg.SourceHeight); - SEC_OSAL_Log(SEC_LOG_TRACE, "ProfileIDC : %d\n", h264Arg.ProfileIDC); - SEC_OSAL_Log(SEC_LOG_TRACE, "LevelIDC : %d\n", h264Arg.LevelIDC); - SEC_OSAL_Log(SEC_LOG_TRACE, "IDRPeriod : %d\n", h264Arg.IDRPeriod); - SEC_OSAL_Log(SEC_LOG_TRACE, "NumberReferenceFrames : %d\n", h264Arg.NumberReferenceFrames); - SEC_OSAL_Log(SEC_LOG_TRACE, "NumberRefForPframes : %d\n", h264Arg.NumberRefForPframes); - SEC_OSAL_Log(SEC_LOG_TRACE, "SliceMode : %d\n", h264Arg.SliceMode); - SEC_OSAL_Log(SEC_LOG_TRACE, "SliceArgument : %d\n", h264Arg.SliceArgument); - SEC_OSAL_Log(SEC_LOG_TRACE, "NumberBFrames : %d\n", h264Arg.NumberBFrames); - SEC_OSAL_Log(SEC_LOG_TRACE, "LoopFilterDisable : %d\n", h264Arg.LoopFilterDisable); - SEC_OSAL_Log(SEC_LOG_TRACE, "LoopFilterAlphaC0Offset : %d\n", h264Arg.LoopFilterAlphaC0Offset); - SEC_OSAL_Log(SEC_LOG_TRACE, "LoopFilterBetaOffset : %d\n", h264Arg.LoopFilterBetaOffset); - SEC_OSAL_Log(SEC_LOG_TRACE, "SymbolMode : %d\n", h264Arg.SymbolMode); - SEC_OSAL_Log(SEC_LOG_TRACE, "PictureInterlace : %d\n", h264Arg.PictureInterlace); - SEC_OSAL_Log(SEC_LOG_TRACE, "Transform8x8Mode : %d\n", h264Arg.Transform8x8Mode); - SEC_OSAL_Log(SEC_LOG_TRACE, "RandomIntraMBRefresh : %d\n", h264Arg.RandomIntraMBRefresh); - SEC_OSAL_Log(SEC_LOG_TRACE, "PadControlOn : %d\n", h264Arg.PadControlOn); - SEC_OSAL_Log(SEC_LOG_TRACE, "LumaPadVal : %d\n", h264Arg.LumaPadVal); - SEC_OSAL_Log(SEC_LOG_TRACE, "CbPadVal : %d\n", h264Arg.CbPadVal); - SEC_OSAL_Log(SEC_LOG_TRACE, "CrPadVal : %d\n", h264Arg.CrPadVal); - SEC_OSAL_Log(SEC_LOG_TRACE, "EnableFRMRateControl : %d\n", h264Arg.EnableFRMRateControl); - SEC_OSAL_Log(SEC_LOG_TRACE, "EnableMBRateControl : %d\n", h264Arg.EnableMBRateControl); - SEC_OSAL_Log(SEC_LOG_TRACE, "FrameRate : %d\n", h264Arg.FrameRate); - SEC_OSAL_Log(SEC_LOG_TRACE, "Bitrate : %d\n", h264Arg.Bitrate); - SEC_OSAL_Log(SEC_LOG_TRACE, "FrameQp : %d\n", h264Arg.FrameQp); - SEC_OSAL_Log(SEC_LOG_TRACE, "QSCodeMax : %d\n", h264Arg.QSCodeMax); - SEC_OSAL_Log(SEC_LOG_TRACE, "QSCodeMin : %d\n", h264Arg.QSCodeMin); - SEC_OSAL_Log(SEC_LOG_TRACE, "CBRPeriodRf : %d\n", h264Arg.CBRPeriodRf); - SEC_OSAL_Log(SEC_LOG_TRACE, "DarkDisable : %d\n", h264Arg.DarkDisable); - SEC_OSAL_Log(SEC_LOG_TRACE, "SmoothDisable : %d\n", h264Arg.SmoothDisable); - SEC_OSAL_Log(SEC_LOG_TRACE, "StaticDisable : %d\n", h264Arg.StaticDisable); - SEC_OSAL_Log(SEC_LOG_TRACE, "ActivityDisable : %d\n", h264Arg.ActivityDisable); -} - -void Set_H264ENC_Param(SSBSIP_MFC_ENC_H264_PARAM *pH264Arg, SEC_OMX_BASECOMPONENT *pSECComponent) -{ - SEC_OMX_BASEPORT *pSECInputPort = NULL; - SEC_OMX_BASEPORT *pSECOutputPort = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - pSECInputPort = &pSECComponent->pSECPort[INPUT_PORT_INDEX]; - pSECOutputPort = &pSECComponent->pSECPort[OUTPUT_PORT_INDEX]; - - pH264Arg->codecType = H264_ENC; - pH264Arg->SourceWidth = pSECOutputPort->portDefinition.format.video.nFrameWidth; - pH264Arg->SourceHeight = pSECOutputPort->portDefinition.format.video.nFrameHeight; - pH264Arg->IDRPeriod = pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames + 1; - pH264Arg->SliceMode = 0; - pH264Arg->RandomIntraMBRefresh = 0; - pH264Arg->EnableFRMRateControl = 1; // 0: Disable, 1: Frame level RC - pH264Arg->Bitrate = pSECOutputPort->portDefinition.format.video.nBitrate; - pH264Arg->FrameQp = 20; - pH264Arg->FrameQp_P = 20; - pH264Arg->QSCodeMax = 30; - pH264Arg->QSCodeMin = 10; - pH264Arg->CBRPeriodRf = 100; - pH264Arg->PadControlOn = 0; // 0: disable, 1: enable - pH264Arg->LumaPadVal = 0; - pH264Arg->CbPadVal = 0; - pH264Arg->CrPadVal = 0; - - pH264Arg->ProfileIDC = OMXAVCProfileToProfileIDC(pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].eProfile); //0; //(OMX_VIDEO_AVCProfileMain) - pH264Arg->LevelIDC = OMXAVCLevelToLevelIDC(pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].eLevel); //40; //(OMX_VIDEO_AVCLevel4) - pH264Arg->FrameQp_B = 20; - pH264Arg->FrameRate = (pSECInputPort->portDefinition.format.video.xFramerate) >> 16; - pH264Arg->SliceArgument = 0; // Slice mb/byte size number - pH264Arg->NumberBFrames = 0; // 0 ~ 2 - pH264Arg->NumberReferenceFrames = 1; - pH264Arg->NumberRefForPframes = 1; - pH264Arg->LoopFilterDisable = 1; // 1: Loop Filter Disable, 0: Filter Enable - pH264Arg->LoopFilterAlphaC0Offset = 0; - pH264Arg->LoopFilterBetaOffset = 0; - pH264Arg->SymbolMode = 0; // 0: CAVLC, 1: CABAC - pH264Arg->PictureInterlace = 0; - pH264Arg->Transform8x8Mode = 0; // 0: 4x4, 1: allow 8x8 - pH264Arg->EnableMBRateControl = 0; // 0: Disable, 1:MB level RC - pH264Arg->DarkDisable = 1; - pH264Arg->SmoothDisable = 1; - pH264Arg->StaticDisable = 1; - pH264Arg->ActivityDisable = 1; - - switch ((SEC_OMX_COLOR_FORMATTYPE)pSECInputPort->portDefinition.format.video.eColorFormat) { - case OMX_COLOR_FormatYUV420SemiPlanar: - pH264Arg->FrameMap = NV12_LINEAR; - break; - case OMX_SEC_COLOR_FormatNV12TPhysicalAddress: - default: - pH264Arg->FrameMap = NV12_TILE; - break; - } - -#ifdef USE_ANDROID_EXTENSION - if (pSECInputPort->bStoreMetaDataInBuffer != OMX_FALSE) { - SEC_OMX_DATA *pInputData = &pSECComponent->processData[INPUT_PORT_INDEX]; - if(isMetadataBufferTypeGrallocSource(pInputData->dataBuffer) == OMX_TRUE) - pH264Arg->FrameMap = NV12_LINEAR; - else - pH264Arg->FrameMap = NV12_TILE; - } -#endif - -/* - SEC_OSAL_Log(SEC_LOG_TRACE, "pSECPort->eControlRate: 0x%x", pSECOutputPort->eControlRate); - switch (pSECOutputPort->eControlRate) { - case OMX_Video_ControlRateVariable: - SEC_OSAL_Log(SEC_LOG_TRACE, "Video Encode VBR"); - pH264Arg->EnableFRMRateControl = 0; // 0: Disable, 1: Frame level RC - pH264Arg->EnableMBRateControl = 0; // 0: Disable, 1:MB level RC - pH264Arg->CBRPeriodRf = 100; - break; - case OMX_Video_ControlRateConstant: - SEC_OSAL_Log(SEC_LOG_TRACE, "Video Encode CBR"); - pH264Arg->EnableFRMRateControl = 1; // 0: Disable, 1: Frame level RC - pH264Arg->EnableMBRateControl = 1; // 0: Disable, 1:MB level RC - pH264Arg->CBRPeriodRf = 10; - break; - case OMX_Video_ControlRateDisable: - default: //Android default - SEC_OSAL_Log(SEC_LOG_TRACE, "Video Encode VBR"); - pH264Arg->EnableFRMRateControl = 0; - pH264Arg->EnableMBRateControl = 0; - pH264Arg->CBRPeriodRf = 100; - break; - } -*/ - H264PrintParams(*pH264Arg); -} - -OMX_ERRORTYPE SEC_MFC_H264Enc_GetParameter( - OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_INDEXTYPE nParamIndex, - OMX_INOUT OMX_PTR pComponentParameterStructure) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = NULL; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - - FunctionIn(); - - if (hComponent == NULL || pComponentParameterStructure == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; - ret = SEC_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - if (pOMXComponent->pComponentPrivate == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - - pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - if (pSECComponent->currentState == OMX_StateInvalid ) { - ret = OMX_StateInvalid; - goto EXIT; - } - - switch (nParamIndex) { - case OMX_IndexParamVideoAvc: - { - OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure; - OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - ret = SEC_OMX_Check_SizeVersion(pDstAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pDstAVCComponent->nPortIndex >= ALL_PORT_NUM) { - ret = OMX_ErrorBadPortIndex; - goto EXIT; - } - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - pSrcAVCComponent = &pH264Enc->AVCComponent[pDstAVCComponent->nPortIndex]; - - SEC_OSAL_Memcpy(pDstAVCComponent, pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE)); - } - break; - case OMX_IndexParamStandardComponentRole: - { - OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure; - ret = SEC_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - SEC_OSAL_Strcpy((char *)pComponentRole->cRole, SEC_OMX_COMPONENT_H264_ENC_ROLE); - } - break; - case OMX_IndexParamVideoProfileLevelQuerySupported: - { - OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure; - SEC_OMX_VIDEO_PROFILELEVEL *pProfileLevel = NULL; - OMX_U32 maxProfileLevelNum = 0; - - ret = SEC_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) { - ret = OMX_ErrorBadPortIndex; - goto EXIT; - } - - pProfileLevel = supportedAVCProfileLevels; - maxProfileLevelNum = sizeof(supportedAVCProfileLevels) / sizeof(SEC_OMX_VIDEO_PROFILELEVEL); - - if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) { - ret = OMX_ErrorNoMore; - goto EXIT; - } - - pProfileLevel += pDstProfileLevel->nProfileIndex; - pDstProfileLevel->eProfile = pProfileLevel->profile; - pDstProfileLevel->eLevel = pProfileLevel->level; - } - break; - case OMX_IndexParamVideoProfileLevelCurrent: - { - OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure; - OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - ret = SEC_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) { - ret = OMX_ErrorBadPortIndex; - goto EXIT; - } - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - pSrcAVCComponent = &pH264Enc->AVCComponent[pDstProfileLevel->nPortIndex]; - - pDstProfileLevel->eProfile = pSrcAVCComponent->eProfile; - pDstProfileLevel->eLevel = pSrcAVCComponent->eLevel; - } - break; - case OMX_IndexParamVideoErrorCorrection: - { - OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; - OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - ret = SEC_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pDstErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) { - ret = OMX_ErrorBadPortIndex; - goto EXIT; - } - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - pSrcErrorCorrectionType = &pH264Enc->errorCorrectionType[OUTPUT_PORT_INDEX]; - - pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; - pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; - pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; - pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; - pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; - } - break; - default: - ret = SEC_OMX_VideoEncodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure); - break; - } -EXIT: - FunctionOut(); - - return ret; -} - -OMX_ERRORTYPE SEC_MFC_H264Enc_SetParameter( - OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_INDEXTYPE nIndex, - OMX_IN OMX_PTR pComponentParameterStructure) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = NULL; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - - FunctionIn(); - - if (hComponent == NULL || pComponentParameterStructure == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; - ret = SEC_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - if (pOMXComponent->pComponentPrivate == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - - pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - if (pSECComponent->currentState == OMX_StateInvalid ) { - ret = OMX_StateInvalid; - goto EXIT; - } - - switch (nIndex) { - case OMX_IndexParamVideoAvc: - { - OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = NULL; - OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - ret = SEC_OMX_Check_SizeVersion(pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pSrcAVCComponent->nPortIndex >= ALL_PORT_NUM) { - ret = OMX_ErrorBadPortIndex; - goto EXIT; - } - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - pDstAVCComponent = &pH264Enc->AVCComponent[pSrcAVCComponent->nPortIndex]; - - SEC_OSAL_Memcpy(pDstAVCComponent, pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE)); - } - break; - case OMX_IndexParamStandardComponentRole: - { - OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure; - - ret = SEC_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if ((pSECComponent->currentState != OMX_StateLoaded) && (pSECComponent->currentState != OMX_StateWaitForResources)) { - ret = OMX_ErrorIncorrectStateOperation; - goto EXIT; - } - - if (!SEC_OSAL_Strcmp((char*)pComponentRole->cRole, SEC_OMX_COMPONENT_H264_ENC_ROLE)) { - pSECComponent->pSECPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC; - } else { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - } - break; - case OMX_IndexParamVideoProfileLevelCurrent: - { - OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure; - OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - ret = SEC_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) { - ret = OMX_ErrorBadPortIndex; - goto EXIT; - } - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - - pDstAVCComponent = &pH264Enc->AVCComponent[pSrcProfileLevel->nPortIndex]; - pDstAVCComponent->eProfile = pSrcProfileLevel->eProfile; - pDstAVCComponent->eLevel = pSrcProfileLevel->eLevel; - } - break; - case OMX_IndexParamVideoErrorCorrection: - { - OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; - OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - ret = SEC_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pSrcErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) { - ret = OMX_ErrorBadPortIndex; - goto EXIT; - } - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - pDstErrorCorrectionType = &pH264Enc->errorCorrectionType[OUTPUT_PORT_INDEX]; - - pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; - pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; - pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; - pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; - pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; - } - break; - default: - ret = SEC_OMX_VideoEncodeSetParameter(hComponent, nIndex, pComponentParameterStructure); - break; - } -EXIT: - FunctionOut(); - - return ret; -} - -OMX_ERRORTYPE SEC_MFC_H264Enc_GetConfig( - OMX_HANDLETYPE hComponent, - OMX_INDEXTYPE nIndex, - OMX_PTR pComponentConfigStructure) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = NULL; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - - FunctionIn(); - - if (hComponent == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; - ret = SEC_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pOMXComponent->pComponentPrivate == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - - if (pComponentConfigStructure == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - if (pSECComponent->currentState == OMX_StateInvalid) { - ret = OMX_ErrorInvalidState; - goto EXIT; - } - - switch (nIndex) { - default: - ret = SEC_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure); - break; - } - -EXIT: - FunctionOut(); - - return ret; -} - -OMX_ERRORTYPE SEC_MFC_H264Enc_SetConfig( - OMX_HANDLETYPE hComponent, - OMX_INDEXTYPE nIndex, - OMX_PTR pComponentConfigStructure) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = NULL; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - - FunctionIn(); - - if (hComponent == NULL || pComponentConfigStructure == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; - ret = SEC_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - if (pOMXComponent->pComponentPrivate == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - - pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - if (pSECComponent->currentState == OMX_StateInvalid) { - ret = OMX_ErrorInvalidState; - goto EXIT; - } - - switch (nIndex) { - default: - ret = SEC_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure); - break; - } - -EXIT: - FunctionOut(); - - return ret; -} - -OMX_ERRORTYPE SEC_MFC_H264Enc_GetExtensionIndex( - OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_STRING cParameterName, - OMX_OUT OMX_INDEXTYPE *pIndexType) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = NULL; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - - FunctionIn(); - - if (hComponent == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; - ret = SEC_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - if (pOMXComponent->pComponentPrivate == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - - if ((cParameterName == NULL) || (pIndexType == NULL)) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - if (pSECComponent->currentState == OMX_StateInvalid) { - ret = OMX_ErrorInvalidState; - goto EXIT; - } - -#ifdef USE_ANDROID_EXTENSION - if (SEC_OSAL_Strcmp(cParameterName, SEC_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) { - *pIndexType = OMX_IndexParamStoreMetaDataBuffer; - ret = OMX_ErrorNone; - } else { - ret = SEC_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType); - } -#else - ret = SEC_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType); -#endif - -EXIT: - FunctionOut(); - - return ret; -} - -OMX_ERRORTYPE SEC_MFC_H264Enc_ComponentRoleEnum(OMX_HANDLETYPE hComponent, OMX_U8 *cRole, OMX_U32 nIndex) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = NULL; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - - FunctionIn(); - - if ((hComponent == NULL) || (cRole == NULL)) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) { - SEC_OSAL_Strcpy((char *)cRole, SEC_OMX_COMPONENT_H264_ENC_ROLE); - ret = OMX_ErrorNone; - } else { - ret = OMX_ErrorNoMore; - } - -EXIT: - FunctionOut(); - - return ret; -} - -OMX_ERRORTYPE SEC_MFC_EncodeThread(OMX_HANDLETYPE hComponent) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - FunctionIn(); - - if (hComponent == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - - pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - - while (pH264Enc->NBEncThread.bExitEncodeThread == OMX_FALSE) { - SEC_OSAL_SemaphoreWait(pH264Enc->NBEncThread.hEncFrameStart); - - if (pH264Enc->NBEncThread.bExitEncodeThread == OMX_FALSE) { - pH264Enc->hMFCH264Handle.returnCodec = SsbSipMfcEncExe(pH264Enc->hMFCH264Handle.hMFCHandle); - SEC_OSAL_SemaphorePost(pH264Enc->NBEncThread.hEncFrameEnd); - } - } - -EXIT: - FunctionOut(); - SEC_OSAL_ThreadExit(NULL); - - return ret; -} - -/* MFC Init */ -OMX_ERRORTYPE SEC_MFC_H264Enc_Init(OMX_COMPONENTTYPE *pOMXComponent) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - SEC_OMX_BASECOMPONENT *pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - SEC_OMX_BASEPORT *pSECInputPort = &pSECComponent->pSECPort[INPUT_PORT_INDEX]; - SEC_OMX_BASEPORT *pSECOutputPort = &pSECComponent->pSECPort[OUTPUT_PORT_INDEX]; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - OMX_PTR hMFCHandle = NULL; - OMX_S32 returnCodec = 0; - - FunctionIn(); - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - pH264Enc->hMFCH264Handle.bConfiguredMFC = OMX_FALSE; - pSECComponent->bUseFlagEOF = OMX_FALSE; - pSECComponent->bSaveFlagEOS = OMX_FALSE; - - /* MFC(Multi Function Codec) encoder and CMM(Codec Memory Management) driver open */ - SSBIP_MFC_BUFFER_TYPE buf_type = CACHE; - hMFCHandle = (OMX_PTR)SsbSipMfcEncOpen(&buf_type); - if (hMFCHandle == NULL) { - ret = OMX_ErrorInsufficientResources; - goto EXIT; - } - pH264Enc->hMFCH264Handle.hMFCHandle = hMFCHandle; - - SsbSipMfcEncSetSize(hMFCHandle, H264_ENC, - pSECOutputPort->portDefinition.format.video.nFrameWidth, - pSECOutputPort->portDefinition.format.video.nFrameHeight); - - /* Allocate encoder's input buffer */ - returnCodec = SsbSipMfcEncGetInBuf(hMFCHandle, &(pH264Enc->hMFCH264Handle.inputInfo)); - if (returnCodec != MFC_RET_OK) { - ret = OMX_ErrorInsufficientResources; - goto EXIT; - } - pH264Enc->MFCEncInputBuffer[0].YPhyAddr = pH264Enc->hMFCH264Handle.inputInfo.YPhyAddr; - pH264Enc->MFCEncInputBuffer[0].CPhyAddr = pH264Enc->hMFCH264Handle.inputInfo.CPhyAddr; - pH264Enc->MFCEncInputBuffer[0].YVirAddr = pH264Enc->hMFCH264Handle.inputInfo.YVirAddr; - pH264Enc->MFCEncInputBuffer[0].CVirAddr = pH264Enc->hMFCH264Handle.inputInfo.CVirAddr; - pH264Enc->MFCEncInputBuffer[0].YBufferSize = pH264Enc->hMFCH264Handle.inputInfo.YSize; - pH264Enc->MFCEncInputBuffer[0].CBufferSize = pH264Enc->hMFCH264Handle.inputInfo.CSize; - pH264Enc->MFCEncInputBuffer[0].YDataSize = 0; - pH264Enc->MFCEncInputBuffer[0].CDataSize = 0; - SEC_OSAL_Log(SEC_LOG_TRACE, "pH264Enc->hMFCH264Handle.inputInfo.YVirAddr : 0x%x", pH264Enc->hMFCH264Handle.inputInfo.YVirAddr); - SEC_OSAL_Log(SEC_LOG_TRACE, "pH264Enc->hMFCH264Handle.inputInfo.CVirAddr : 0x%x", pH264Enc->hMFCH264Handle.inputInfo.CVirAddr); - - returnCodec = SsbSipMfcEncGetInBuf(hMFCHandle, &(pH264Enc->hMFCH264Handle.inputInfo)); - if (returnCodec != MFC_RET_OK) { - ret = OMX_ErrorInsufficientResources; - goto EXIT; - } - pH264Enc->MFCEncInputBuffer[1].YPhyAddr = pH264Enc->hMFCH264Handle.inputInfo.YPhyAddr; - pH264Enc->MFCEncInputBuffer[1].CPhyAddr = pH264Enc->hMFCH264Handle.inputInfo.CPhyAddr; - pH264Enc->MFCEncInputBuffer[1].YVirAddr = pH264Enc->hMFCH264Handle.inputInfo.YVirAddr; - pH264Enc->MFCEncInputBuffer[1].CVirAddr = pH264Enc->hMFCH264Handle.inputInfo.CVirAddr; - pH264Enc->MFCEncInputBuffer[1].YBufferSize = pH264Enc->hMFCH264Handle.inputInfo.YSize; - pH264Enc->MFCEncInputBuffer[1].CBufferSize = pH264Enc->hMFCH264Handle.inputInfo.CSize; - pH264Enc->MFCEncInputBuffer[1].YDataSize = 0; - pH264Enc->MFCEncInputBuffer[1].CDataSize = 0; - SEC_OSAL_Log(SEC_LOG_TRACE, "pH264Enc->hMFCH264Handle.inputInfo.YVirAddr : 0x%x", pH264Enc->hMFCH264Handle.inputInfo.YVirAddr); - SEC_OSAL_Log(SEC_LOG_TRACE, "pH264Enc->hMFCH264Handle.inputInfo.CVirAddr : 0x%x", pH264Enc->hMFCH264Handle.inputInfo.CVirAddr); - - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.YPhyAddr = pH264Enc->MFCEncInputBuffer[0].YPhyAddr; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.CPhyAddr = pH264Enc->MFCEncInputBuffer[0].CPhyAddr; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.YVirAddr = pH264Enc->MFCEncInputBuffer[0].YVirAddr; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.CVirAddr = pH264Enc->MFCEncInputBuffer[0].CVirAddr; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.YSize = pH264Enc->MFCEncInputBuffer[0].YBufferSize; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.CSize = pH264Enc->MFCEncInputBuffer[0].CBufferSize; - - pH264Enc->indexInputBuffer = 0; - pH264Enc->bFirstFrame = OMX_TRUE; - - pH264Enc->NBEncThread.bExitEncodeThread = OMX_FALSE; - pH264Enc->NBEncThread.bEncoderRun = OMX_FALSE; - SEC_OSAL_SemaphoreCreate(&(pH264Enc->NBEncThread.hEncFrameStart)); - SEC_OSAL_SemaphoreCreate(&(pH264Enc->NBEncThread.hEncFrameEnd)); - if (OMX_ErrorNone == SEC_OSAL_ThreadCreate(&pH264Enc->NBEncThread.hNBEncodeThread, - SEC_MFC_EncodeThread, - pOMXComponent)) { - pH264Enc->hMFCH264Handle.returnCodec = MFC_RET_OK; - } - - SEC_OSAL_Memset(pSECComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP); - SEC_OSAL_Memset(pSECComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS); - pH264Enc->hMFCH264Handle.indexTimestamp = 0; - -EXIT: - FunctionOut(); - - return ret; -} - -/* MFC Terminate */ -OMX_ERRORTYPE SEC_MFC_H264Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - SEC_OMX_BASECOMPONENT *pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - OMX_PTR hMFCHandle = NULL; - - FunctionIn(); - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - - if (pH264Enc->NBEncThread.hNBEncodeThread != NULL) { - pH264Enc->NBEncThread.bExitEncodeThread = OMX_TRUE; - SEC_OSAL_SemaphorePost(pH264Enc->NBEncThread.hEncFrameStart); - SEC_OSAL_ThreadTerminate(pH264Enc->NBEncThread.hNBEncodeThread); - pH264Enc->NBEncThread.hNBEncodeThread = NULL; - } - - if(pH264Enc->NBEncThread.hEncFrameEnd != NULL) { - SEC_OSAL_SemaphoreTerminate(pH264Enc->NBEncThread.hEncFrameEnd); - pH264Enc->NBEncThread.hEncFrameEnd = NULL; - } - - if(pH264Enc->NBEncThread.hEncFrameStart != NULL) { - SEC_OSAL_SemaphoreTerminate(pH264Enc->NBEncThread.hEncFrameStart); - pH264Enc->NBEncThread.hEncFrameStart = NULL; - } - - hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle; - if (hMFCHandle != NULL) { - SsbSipMfcEncClose(hMFCHandle); - hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle = NULL; - } - -EXIT: - FunctionOut(); - - return ret; -} - -OMX_ERRORTYPE SEC_MFC_H264_Encode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DATA *pInputData, SEC_OMX_DATA *pOutputData) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - SEC_OMX_BASECOMPONENT *pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - SEC_H264ENC_HANDLE *pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - SSBSIP_MFC_ENC_INPUT_INFO *pInputInfo = &pH264Enc->hMFCH264Handle.inputInfo; - SSBSIP_MFC_ENC_OUTPUT_INFO outputInfo; - SEC_OMX_BASEPORT *pSECPort = NULL; - MFC_ENC_ADDR_INFO addrInfo; - OMX_U32 oneFrameSize = pInputData->dataLen; - - FunctionIn(); - - if (pH264Enc->hMFCH264Handle.bConfiguredMFC == OMX_FALSE) { - Set_H264ENC_Param(&(pH264Enc->hMFCH264Handle.mfcVideoAvc), pSECComponent); - pH264Enc->hMFCH264Handle.returnCodec = SsbSipMfcEncInit(pH264Enc->hMFCH264Handle.hMFCHandle, &(pH264Enc->hMFCH264Handle.mfcVideoAvc)); - if (pH264Enc->hMFCH264Handle.returnCodec != MFC_RET_OK) { - ret = OMX_ErrorInsufficientResources; - goto EXIT; - } - - pH264Enc->hMFCH264Handle.returnCodec = SsbSipMfcEncGetOutBuf(pH264Enc->hMFCH264Handle.hMFCHandle, &outputInfo); - if (pH264Enc->hMFCH264Handle.returnCodec != MFC_RET_OK) - { - SEC_OSAL_Log(SEC_LOG_TRACE, "%s - SsbSipMfcEncGetOutBuf Failed\n", __func__); - ret = OMX_ErrorUndefined; - goto EXIT; - } else { - char *p = NULL; - int iSpsSize = 0; - int iPpsSize = 0; - - p = FindDelimiter((OMX_U8 *)outputInfo.StrmVirAddr + 4, outputInfo.headerSize - 4); - - iSpsSize = (unsigned int)p - (unsigned int)outputInfo.StrmVirAddr; - pH264Enc->hMFCH264Handle.headerData.pHeaderSPS = (OMX_PTR)outputInfo.StrmVirAddr; - pH264Enc->hMFCH264Handle.headerData.SPSLen = iSpsSize; - - iPpsSize = outputInfo.headerSize - iSpsSize; - pH264Enc->hMFCH264Handle.headerData.pHeaderPPS = outputInfo.StrmVirAddr + iSpsSize; - pH264Enc->hMFCH264Handle.headerData.PPSLen = iPpsSize; - } - - /* SEC_OSAL_Memcpy((void*)(pOutputData->dataBuffer), (const void*)(outputInfo.StrmVirAddr), outputInfo.headerSize); */ - pOutputData->dataBuffer = outputInfo.StrmVirAddr; - pOutputData->allocSize = outputInfo.headerSize; - pOutputData->dataLen = outputInfo.headerSize; - pOutputData->timeStamp = 0; - pOutputData->nFlags |= OMX_BUFFERFLAG_CODECCONFIG; - pOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME; - - pH264Enc->hMFCH264Handle.bConfiguredMFC = OMX_TRUE; - - ret = OMX_ErrorInputDataEncodeYet; - goto EXIT; - } - - if ((pInputData->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) && - (pSECComponent->bUseFlagEOF == OMX_FALSE)) { - pSECComponent->bUseFlagEOF = OMX_TRUE; - } - - if (oneFrameSize <= 0) { - pOutputData->timeStamp = pInputData->timeStamp; - pOutputData->nFlags = pInputData->nFlags; - - ret = OMX_ErrorNone; - goto EXIT; - } - - pSECPort = &pSECComponent->pSECPort[INPUT_PORT_INDEX]; - if (((pInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) || - (pSECComponent->getAllDelayBuffer == OMX_TRUE)){ - /* Dummy input data for get out encoded last frame */ - pInputInfo->YPhyAddr = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].YPhyAddr; - pInputInfo->CPhyAddr = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].CPhyAddr; - pInputInfo->YVirAddr = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].YVirAddr; - pInputInfo->CVirAddr = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].CVirAddr; - } else if (pSECPort->portDefinition.format.video.eColorFormat == OMX_SEC_COLOR_FormatNV12TPhysicalAddress) { - SEC_OSAL_Memcpy(&addrInfo.pAddrY, pInputData->dataBuffer, sizeof(addrInfo.pAddrY)); - SEC_OSAL_Memcpy(&addrInfo.pAddrC, pInputData->dataBuffer + sizeof(addrInfo.pAddrY), sizeof(addrInfo.pAddrC)); - pInputInfo->YPhyAddr = addrInfo.pAddrY; - pInputInfo->CPhyAddr = addrInfo.pAddrC; -#ifdef USE_ANDROID_EXTENSION - } else if (pSECPort->bStoreMetaDataInBuffer != OMX_FALSE) { - ret = preprocessMetaDataInBuffers(pOMXComponent, pInputData->dataBuffer, pInputInfo); - if (ret != OMX_ErrorNone) - goto EXIT; -#endif - } else { - /* Real input data */ - pInputInfo->YPhyAddr = pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.YPhyAddr; - pInputInfo->CPhyAddr = pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.CPhyAddr; - } - - pSECComponent->timeStamp[pH264Enc->hMFCH264Handle.indexTimestamp] = pInputData->timeStamp; - pSECComponent->nFlags[pH264Enc->hMFCH264Handle.indexTimestamp] = pInputData->nFlags; - - if ((pH264Enc->hMFCH264Handle.returnCodec == MFC_RET_OK) && - (pH264Enc->bFirstFrame == OMX_FALSE)) { - OMX_S32 indexTimestamp = 0; - - /* wait for mfc encode done */ - if (pH264Enc->NBEncThread.bEncoderRun != OMX_FALSE) { - SEC_OSAL_SemaphoreWait(pH264Enc->NBEncThread.hEncFrameEnd); - pH264Enc->NBEncThread.bEncoderRun = OMX_FALSE; - } - - pH264Enc->hMFCH264Handle.returnCodec = SsbSipMfcEncGetOutBuf(pH264Enc->hMFCH264Handle.hMFCHandle, &outputInfo); - if ((SsbSipMfcEncGetConfig(pH264Enc->hMFCH264Handle.hMFCHandle, MFC_ENC_GETCONF_FRAME_TAG, &indexTimestamp) != MFC_RET_OK) || - (((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)))){ - pOutputData->timeStamp = pInputData->timeStamp; - pOutputData->nFlags = pInputData->nFlags; - } else { - pOutputData->timeStamp = pSECComponent->timeStamp[indexTimestamp]; - pOutputData->nFlags = pSECComponent->nFlags[indexTimestamp]; - } - - if (pH264Enc->hMFCH264Handle.returnCodec == MFC_RET_OK) { - /** Fill Output Buffer **/ - pOutputData->dataBuffer = outputInfo.StrmVirAddr; - pOutputData->allocSize = outputInfo.dataSize; - pOutputData->dataLen = outputInfo.dataSize; - pOutputData->usedDataLen = 0; - - pOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME; - if (outputInfo.frameType == MFC_FRAME_TYPE_I_FRAME) - pOutputData->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; - - SEC_OSAL_Log(SEC_LOG_TRACE, "MFC Encode OK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - - ret = OMX_ErrorNone; - } else { - SEC_OSAL_Log(SEC_LOG_ERROR, "%s: SsbSipMfcEncGetOutBuf failed, ret:%d", __FUNCTION__, pH264Enc->hMFCH264Handle.returnCodec); - ret = OMX_ErrorUndefined; - goto EXIT; - } - - if (pSECComponent->getAllDelayBuffer == OMX_TRUE) { - ret = OMX_ErrorInputDataEncodeYet; - } - if ((pInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) { - pInputData->nFlags = (pOutputData->nFlags & (~OMX_BUFFERFLAG_EOS)); - pSECComponent->getAllDelayBuffer = OMX_TRUE; - ret = OMX_ErrorInputDataEncodeYet; - } - if ((pOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) { - pSECComponent->getAllDelayBuffer = OMX_FALSE; - pOutputData->dataLen = 0; - pOutputData->usedDataLen = 0; - SEC_OSAL_Log(SEC_LOG_TRACE, "OMX_BUFFERFLAG_EOS!!!"); - ret = OMX_ErrorNone; - } - } - if (pH264Enc->hMFCH264Handle.returnCodec != MFC_RET_OK) { - SEC_OSAL_Log(SEC_LOG_ERROR, "In %s : SsbSipMfcEncExe Failed!!!\n", __func__); - ret = OMX_ErrorUndefined; - } - - pH264Enc->hMFCH264Handle.returnCodec = SsbSipMfcEncSetInBuf(pH264Enc->hMFCH264Handle.hMFCHandle, pInputInfo); - if (pH264Enc->hMFCH264Handle.returnCodec != MFC_RET_OK) { - SEC_OSAL_Log(SEC_LOG_TRACE, "Error : SsbSipMfcEncSetInBuf() \n"); - ret = OMX_ErrorUndefined; - goto EXIT; - } else { - pH264Enc->indexInputBuffer++; - pH264Enc->indexInputBuffer %= MFC_INPUT_BUFFER_NUM_MAX; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.YPhyAddr = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].YPhyAddr; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.CPhyAddr = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].CPhyAddr; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.YVirAddr = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].YVirAddr; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.CVirAddr = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].CVirAddr; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.YSize = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].YBufferSize; - pSECComponent->processData[INPUT_PORT_INDEX].specificBufferHeader.CSize = pH264Enc->MFCEncInputBuffer[pH264Enc->indexInputBuffer].CBufferSize; - } - - SsbSipMfcEncSetConfig(pH264Enc->hMFCH264Handle.hMFCHandle, MFC_ENC_SETCONF_FRAME_TAG, &(pH264Enc->hMFCH264Handle.indexTimestamp)); - - /* mfc encode start */ - SEC_OSAL_SemaphorePost(pH264Enc->NBEncThread.hEncFrameStart); - pH264Enc->NBEncThread.bEncoderRun = OMX_TRUE; - pH264Enc->hMFCH264Handle.indexTimestamp++; - pH264Enc->hMFCH264Handle.indexTimestamp %= MAX_TIMESTAMP; - pH264Enc->bFirstFrame = OMX_FALSE; - -EXIT: - FunctionOut(); - - return ret; -} - -/* MFC Encode */ -OMX_ERRORTYPE SEC_MFC_H264Enc_bufferProcess(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DATA *pInputData, SEC_OMX_DATA *pOutputData) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - SEC_OMX_BASECOMPONENT *pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - SEC_H264ENC_HANDLE *pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - SEC_OMX_BASEPORT *pSECInputPort = &pSECComponent->pSECPort[INPUT_PORT_INDEX]; - SEC_OMX_BASEPORT *pSECOutputPort = &pSECComponent->pSECPort[OUTPUT_PORT_INDEX]; - OMX_BOOL endOfFrame = OMX_FALSE; - OMX_BOOL flagEOS = OMX_FALSE; - - FunctionIn(); - - if ((!CHECK_PORT_ENABLED(pSECInputPort)) || (!CHECK_PORT_ENABLED(pSECOutputPort)) || - (!CHECK_PORT_POPULATED(pSECInputPort)) || (!CHECK_PORT_POPULATED(pSECOutputPort))) { - ret = OMX_ErrorNone; - goto EXIT; - } - if (OMX_FALSE == SEC_Check_BufferProcess_State(pSECComponent)) { - ret = OMX_ErrorNone; - goto EXIT; - } - - ret = SEC_MFC_H264_Encode(pOMXComponent, pInputData, pOutputData); - if (ret != OMX_ErrorNone) { - if (ret == OMX_ErrorInputDataEncodeYet) { - pOutputData->usedDataLen = 0; - pOutputData->remainDataLen = pOutputData->dataLen; - } else { - pSECComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, - pSECComponent->callbackData, - OMX_EventError, ret, 0, NULL); - } - } else { - pInputData->usedDataLen += pInputData->dataLen; - pInputData->remainDataLen = pInputData->dataLen - pInputData->usedDataLen; - pInputData->dataLen -= pInputData->usedDataLen; - pInputData->usedDataLen = 0; - - /* pOutputData->usedDataLen = 0; */ - pOutputData->remainDataLen = pOutputData->dataLen - pOutputData->usedDataLen; - } - -EXIT: - FunctionOut(); - - return ret; -} - -OSCL_EXPORT_REF OMX_ERRORTYPE SEC_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = NULL; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - SEC_OMX_BASEPORT *pSECPort = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - int i = 0; - - FunctionIn(); - - if ((hComponent == NULL) || (componentName == NULL)) { - ret = OMX_ErrorBadParameter; - SEC_OSAL_Log(SEC_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); - goto EXIT; - } - if (SEC_OSAL_Strcmp(SEC_OMX_COMPONENT_H264_ENC, componentName) != 0) { - ret = OMX_ErrorBadParameter; - SEC_OSAL_Log(SEC_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__); - goto EXIT; - } - - pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; - ret = SEC_OMX_VideoEncodeComponentInit(pOMXComponent); - if (ret != OMX_ErrorNone) { - SEC_OSAL_Log(SEC_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); - goto EXIT; - } - pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - pSECComponent->codecType = HW_VIDEO_CODEC; - - pSECComponent->componentName = (OMX_STRING)SEC_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE); - if (pSECComponent->componentName == NULL) { - SEC_OMX_VideoEncodeComponentDeinit(pOMXComponent); - ret = OMX_ErrorInsufficientResources; - SEC_OSAL_Log(SEC_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); - goto EXIT; - } - SEC_OSAL_Memset(pSECComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE); - - pH264Enc = SEC_OSAL_Malloc(sizeof(SEC_H264ENC_HANDLE)); - if (pH264Enc == NULL) { - SEC_OMX_VideoEncodeComponentDeinit(pOMXComponent); - ret = OMX_ErrorInsufficientResources; - SEC_OSAL_Log(SEC_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); - goto EXIT; - } - SEC_OSAL_Memset(pH264Enc, 0, sizeof(SEC_H264ENC_HANDLE)); - pSECComponent->hCodecHandle = (OMX_HANDLETYPE)pH264Enc; - - SEC_OSAL_Strcpy(pSECComponent->componentName, SEC_OMX_COMPONENT_H264_ENC); - /* Set componentVersion */ - pSECComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; - pSECComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; - pSECComponent->componentVersion.s.nRevision = REVISION_NUMBER; - pSECComponent->componentVersion.s.nStep = STEP_NUMBER; - /* Set specVersion */ - pSECComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; - pSECComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; - pSECComponent->specVersion.s.nRevision = REVISION_NUMBER; - pSECComponent->specVersion.s.nStep = STEP_NUMBER; - - /* Android CapabilityFlags */ - pSECComponent->capabilityFlags.iIsOMXComponentMultiThreaded = OMX_TRUE; - pSECComponent->capabilityFlags.iOMXComponentSupportsExternalInputBufferAlloc = OMX_TRUE; - pSECComponent->capabilityFlags.iOMXComponentSupportsExternalOutputBufferAlloc = OMX_TRUE; - pSECComponent->capabilityFlags.iOMXComponentSupportsMovableInputBuffers = OMX_FALSE; - pSECComponent->capabilityFlags.iOMXComponentSupportsPartialFrames = OMX_FALSE; - pSECComponent->capabilityFlags.iOMXComponentUsesNALStartCodes = OMX_TRUE; - pSECComponent->capabilityFlags.iOMXComponentCanHandleIncompleteFrames = OMX_TRUE; - pSECComponent->capabilityFlags.iOMXComponentUsesFullAVCFrames = OMX_TRUE; - - /* Input port */ - pSECPort = &pSECComponent->pSECPort[INPUT_PORT_INDEX]; - pSECPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; - pSECPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; - pSECPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/ - pSECPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE; - pSECPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; - SEC_OSAL_Memset(pSECPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); - SEC_OSAL_Strcpy(pSECPort->portDefinition.format.video.cMIMEType, "raw/video"); - pSECPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; - pSECPort->portDefinition.bEnabled = OMX_TRUE; - - /* Output port */ - pSECPort = &pSECComponent->pSECPort[OUTPUT_PORT_INDEX]; - pSECPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; - pSECPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; - pSECPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/ - pSECPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE; - pSECPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC; - SEC_OSAL_Memset(pSECPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); - SEC_OSAL_Strcpy(pSECPort->portDefinition.format.video.cMIMEType, "video/avc"); - pSECPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; - pSECPort->portDefinition.bEnabled = OMX_TRUE; - - for(i = 0; i < ALL_PORT_NUM; i++) { - INIT_SET_SIZE_VERSION(&pH264Enc->AVCComponent[i], OMX_VIDEO_PARAM_AVCTYPE); - pH264Enc->AVCComponent[i].nPortIndex = i; - pH264Enc->AVCComponent[i].eProfile = OMX_VIDEO_AVCProfileBaseline; - pH264Enc->AVCComponent[i].eLevel = OMX_VIDEO_AVCLevel31; - } - - pOMXComponent->GetParameter = &SEC_MFC_H264Enc_GetParameter; - pOMXComponent->SetParameter = &SEC_MFC_H264Enc_SetParameter; - pOMXComponent->GetConfig = &SEC_MFC_H264Enc_GetConfig; - pOMXComponent->SetConfig = &SEC_MFC_H264Enc_SetConfig; - pOMXComponent->GetExtensionIndex = &SEC_MFC_H264Enc_GetExtensionIndex; - pOMXComponent->ComponentRoleEnum = &SEC_MFC_H264Enc_ComponentRoleEnum; - pOMXComponent->ComponentDeInit = &SEC_OMX_ComponentDeinit; - - pSECComponent->sec_mfc_componentInit = &SEC_MFC_H264Enc_Init; - pSECComponent->sec_mfc_componentTerminate = &SEC_MFC_H264Enc_Terminate; - pSECComponent->sec_mfc_bufferProcess = &SEC_MFC_H264Enc_bufferProcess; - pSECComponent->sec_checkInputFrame = NULL; - - pSECComponent->currentState = OMX_StateLoaded; - - ret = OMX_ErrorNone; - -EXIT: - FunctionOut(); - - return ret; -} - -OMX_ERRORTYPE SEC_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - OMX_COMPONENTTYPE *pOMXComponent = NULL; - SEC_OMX_BASECOMPONENT *pSECComponent = NULL; - SEC_H264ENC_HANDLE *pH264Enc = NULL; - - FunctionIn(); - - if (hComponent == NULL) { - ret = OMX_ErrorBadParameter; - goto EXIT; - } - pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; - pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; - - SEC_OSAL_Free(pSECComponent->componentName); - pSECComponent->componentName = NULL; - - pH264Enc = (SEC_H264ENC_HANDLE *)pSECComponent->hCodecHandle; - if (pH264Enc != NULL) { - SEC_OSAL_Free(pH264Enc); - pH264Enc = pSECComponent->hCodecHandle = NULL; - } - - ret = SEC_OMX_VideoEncodeComponentDeinit(pOMXComponent); - if (ret != OMX_ErrorNone) { - goto EXIT; - } - - ret = OMX_ErrorNone; - -EXIT: - FunctionOut(); - - return ret; -} |