/* * portvideo.cpp, port class for video * * Copyright (c) 2009-2010 Wind River Systems, Inc. * * 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. */ #include #include #include #include #include #include #define LOG_TAG "portvideo" #include PortVideo::PortVideo() { memset(&videoparam, 0, sizeof(videoparam)); ComponentBase::SetTypeHeader(&videoparam, sizeof(videoparam)); videoparam.nIndex = 0; videoparam.eCompressionFormat = OMX_VIDEO_CodingUnused; videoparam.eColorFormat = OMX_COLOR_FormatYUV420Planar; videoparam.xFramerate = 15 << 16; memset(&bitrateparam, 0, sizeof(bitrateparam)); ComponentBase::SetTypeHeader(&bitrateparam, sizeof(bitrateparam)); bitrateparam.eControlRate = OMX_Video_ControlRateConstant; bitrateparam.nTargetBitrate = 64000; memset(&privateinfoparam, 0, sizeof(privateinfoparam)); ComponentBase::SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); privateinfoparam.nCapacity = 0; privateinfoparam.nHolder = NULL; mbufsharing = OMX_FALSE; } //PortVideo::~PortVideo() //{ // if(privateinfoparam.nHolder != NULL) { // free(privateinfoparam.nHolder); // privateinfoparam.nHolder = NULL; // } //} OMX_ERRORTYPE PortVideo::SetPortVideoParam( const OMX_VIDEO_PARAM_PORTFORMATTYPE *p, bool internal) { if (!internal) { OMX_ERRORTYPE ret; ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); if (ret != OMX_ErrorNone) return ret; if (videoparam.nPortIndex != p->nPortIndex) return OMX_ErrorBadPortIndex; } else videoparam.nPortIndex = p->nPortIndex; videoparam.nIndex = p->nIndex; videoparam.eCompressionFormat = p->eCompressionFormat; videoparam.eColorFormat = p->eColorFormat; videoparam.xFramerate = p->xFramerate; return OMX_ErrorNone; } const OMX_VIDEO_PARAM_PORTFORMATTYPE *PortVideo::GetPortVideoParam(void) { return &videoparam; } OMX_ERRORTYPE PortVideo::SetPortBitrateParam( const OMX_VIDEO_PARAM_BITRATETYPE *p, bool internal) { if (!internal) { OMX_ERRORTYPE ret; ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); if (ret != OMX_ErrorNone) return ret; if (bitrateparam.nPortIndex != p->nPortIndex) return OMX_ErrorBadPortIndex; } else bitrateparam.nPortIndex = p->nPortIndex; bitrateparam.eControlRate = p->eControlRate; bitrateparam.nTargetBitrate = p->nTargetBitrate; return OMX_ErrorNone; } const OMX_VIDEO_PARAM_BITRATETYPE *PortVideo::GetPortBitrateParam(void) { return &bitrateparam; } OMX_ERRORTYPE PortVideo::SetPortBufferSharingInfo(OMX_BOOL isbufsharing) { mbufsharing = isbufsharing; return OMX_ErrorNone; } const OMX_BOOL *PortVideo::GetPortBufferSharingInfo(void) { return &mbufsharing; } OMX_ERRORTYPE PortVideo::SetPortPrivateInfoParam( const OMX_VIDEO_CONFIG_PRI_INFOTYPE *p, bool internal) { if (!internal) { OMX_ERRORTYPE ret; ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); if (ret != OMX_ErrorNone) return ret; if (privateinfoparam.nPortIndex != p->nPortIndex) return OMX_ErrorBadPortIndex; } else privateinfoparam.nPortIndex = p->nPortIndex; const OMX_BOOL *isbufsharing = GetPortBufferSharingInfo(); if(*isbufsharing) { //if(privateinfoparam.nHolder != NULL) { // free(privateinfoparam.nHolder); // privateinfoparam.nHolder = NULL; //} if(p->nHolder != NULL) { privateinfoparam.nCapacity = p->nCapacity; privateinfoparam.nHolder = (OMX_PTR)malloc(sizeof(OMX_U32) * (p->nCapacity)); memcpy(privateinfoparam.nHolder, p->nHolder, sizeof(OMX_U32) * (p->nCapacity)); } else { privateinfoparam.nCapacity = 0; privateinfoparam.nHolder = NULL; } } return OMX_ErrorNone; } const OMX_VIDEO_CONFIG_PRI_INFOTYPE *PortVideo::GetPortPrivateInfoParam(void) { return &privateinfoparam; } /* end of PortVideo */ #if 0 PortAvc::PortAvc() { OMX_VIDEO_PARAM_PORTFORMATTYPE videoparam; memcpy(&videoparam, GetPortVideoParam(), sizeof(videoparam)); videoparam.eCompressionFormat = OMX_VIDEO_CodingAVC; videoparam.eColorFormat = OMX_COLOR_FormatUnused; videoparam.xFramerate = 15 << 16; SetPortVideoParam(&videoparam, false); memset(&avcparam, 0, sizeof(avcparam)); ComponentBase::SetTypeHeader(&avcparam, sizeof(avcparam)); avcparam.eProfile = OMX_VIDEO_AVCProfileVendorStartUnused; //defaul profle for buffer sharing in opencore avcparam.eLevel = OMX_VIDEO_AVCLevelVendorStartUnused; //default level for buffer sharing in opencore //set buffer sharing mode #ifdef COMPONENT_SUPPORT_BUFFER_SHARING SetPortBufferSharingInfo(OMX_TRUE); #endif } OMX_ERRORTYPE PortAvc::SetPortAvcParam( const OMX_VIDEO_PARAM_AVCTYPE *p, bool overwrite_readonly) { if (!overwrite_readonly) { OMX_ERRORTYPE ret; ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); if (ret != OMX_ErrorNone) return ret; if (avcparam.nPortIndex != p->nPortIndex) return OMX_ErrorBadPortIndex; } else { OMX_VIDEO_PARAM_PORTFORMATTYPE videoparam; memcpy(&videoparam, GetPortVideoParam(), sizeof(videoparam)); videoparam.nPortIndex = p->nPortIndex; SetPortVideoParam(&videoparam, true); avcparam.nPortIndex = p->nPortIndex; } avcparam.nSliceHeaderSpacing = p->nSliceHeaderSpacing; avcparam.nPFrames = p->nPFrames; avcparam.nBFrames = p->nBFrames; avcparam.bUseHadamard = p->bUseHadamard; avcparam.nRefFrames = p->nRefFrames; avcparam.nRefIdx10ActiveMinus1 = p->nRefIdx10ActiveMinus1; avcparam.nRefIdx11ActiveMinus1 = p->nRefIdx11ActiveMinus1; avcparam.bEnableUEP = p->bEnableUEP; avcparam.bEnableFMO = p->bEnableFMO; avcparam.bEnableASO = p->bEnableASO; avcparam.bEnableRS = p->bEnableRS; avcparam.nAllowedPictureTypes = p->nAllowedPictureTypes; avcparam.bFrameMBsOnly = p->bFrameMBsOnly; avcparam.bMBAFF = p->bMBAFF; avcparam.bEntropyCodingCABAC = p->bEntropyCodingCABAC; avcparam.bWeightedPPrediction = p->bWeightedPPrediction; avcparam.nWeightedBipredicitonMode = p->nWeightedBipredicitonMode; avcparam.bconstIpred = p->bconstIpred; avcparam.bDirect8x8Inference = p->bDirect8x8Inference; avcparam.bDirectSpatialTemporal = p->bDirectSpatialTemporal; avcparam.nCabacInitIdc = p->nCabacInitIdc; avcparam.eLoopFilterMode = p->eLoopFilterMode; #ifdef COMPONENT_SUPPORT_OPENCORE #ifdef COMPONENT_SUPPORT_BUFFER_SHARING // sepcial case ,not change default profile and level for opencore buffer sharing. #else avcparam.eProfile = p->eProfile; avcparam.eLevel = p->eLevel; #endif #else avcparam.eProfile = p->eProfile; avcparam.eLevel = p->eLevel; #endif return OMX_ErrorNone; } const OMX_VIDEO_PARAM_AVCTYPE *PortAvc::GetPortAvcParam(void) { return &avcparam; } /* end of PortAvc */ #endif