portvideo.cpp revision aa3d0c8c33608e6718546186096f2eed53980593
1/* 2 * portvideo.cpp, port class for video 3 * 4 * Copyright (c) 2009-2010 Wind River Systems, Inc. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19#include <stdlib.h> 20#include <string.h> 21 22#include <OMX_Core.h> 23#include <OMX_Component.h> 24 25#include <componentbase.h> 26#include <portvideo.h> 27 28#define LOG_TAG "portvideo" 29#include <log.h> 30 31PortVideo::PortVideo() 32{ 33 memset(&videoparam, 0, sizeof(videoparam)); 34 ComponentBase::SetTypeHeader(&videoparam, sizeof(videoparam)); 35 36 videoparam.nIndex = 0; 37 videoparam.eCompressionFormat = OMX_VIDEO_CodingUnused; 38 videoparam.eColorFormat = OMX_COLOR_FormatYUV420Planar; 39 videoparam.xFramerate = 15 << 16; 40 41 memset(&bitrateparam, 0, sizeof(bitrateparam)); 42 ComponentBase::SetTypeHeader(&bitrateparam, sizeof(bitrateparam)); 43 44 bitrateparam.eControlRate = OMX_Video_ControlRateConstant; 45 bitrateparam.nTargetBitrate = 64000; 46 47 memset(&privateinfoparam, 0, sizeof(privateinfoparam)); 48 ComponentBase::SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); 49 50 privateinfoparam.nCapacity = 0; 51 privateinfoparam.nHolder = NULL; 52 53 mbufsharing = OMX_FALSE; 54} 55 56//PortVideo::~PortVideo() 57//{ 58// if(privateinfoparam.nHolder != NULL) { 59// free(privateinfoparam.nHolder); 60// privateinfoparam.nHolder = NULL; 61// } 62//} 63 64OMX_ERRORTYPE PortVideo::SetPortVideoParam( 65 const OMX_VIDEO_PARAM_PORTFORMATTYPE *p, bool internal) 66{ 67 if (!internal) { 68 OMX_ERRORTYPE ret; 69 70 ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); 71 if (ret != OMX_ErrorNone) 72 return ret; 73 if (videoparam.nPortIndex != p->nPortIndex) 74 return OMX_ErrorBadPortIndex; 75 } 76 else 77 videoparam.nPortIndex = p->nPortIndex; 78 79 videoparam.nIndex = p->nIndex; 80 videoparam.eCompressionFormat = p->eCompressionFormat; 81 videoparam.eColorFormat = p->eColorFormat; 82 videoparam.xFramerate = p->xFramerate; 83 84 return OMX_ErrorNone; 85} 86 87const OMX_VIDEO_PARAM_PORTFORMATTYPE *PortVideo::GetPortVideoParam(void) 88{ 89 return &videoparam; 90} 91 92OMX_ERRORTYPE PortVideo::SetPortBitrateParam( 93 const OMX_VIDEO_PARAM_BITRATETYPE *p, bool internal) 94{ 95 if (!internal) { 96 OMX_ERRORTYPE ret; 97 98 ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); 99 if (ret != OMX_ErrorNone) 100 return ret; 101 if (bitrateparam.nPortIndex != p->nPortIndex) 102 return OMX_ErrorBadPortIndex; 103 } 104 else 105 bitrateparam.nPortIndex = p->nPortIndex; 106 107 bitrateparam.eControlRate = p->eControlRate; 108 bitrateparam.nTargetBitrate = p->nTargetBitrate; 109 110 return OMX_ErrorNone; 111} 112 113const OMX_VIDEO_PARAM_BITRATETYPE *PortVideo::GetPortBitrateParam(void) 114{ 115 return &bitrateparam; 116} 117 118OMX_ERRORTYPE PortVideo::SetPortBufferSharingInfo(OMX_BOOL isbufsharing) 119{ 120 mbufsharing = isbufsharing; 121 122 return OMX_ErrorNone; 123} 124 125const OMX_BOOL *PortVideo::GetPortBufferSharingInfo(void) 126{ 127 return &mbufsharing; 128} 129 130 131OMX_ERRORTYPE PortVideo::SetPortPrivateInfoParam( 132 const OMX_VIDEO_CONFIG_PRI_INFOTYPE *p, bool internal) 133{ 134 if (!internal) { 135 OMX_ERRORTYPE ret; 136 137 ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); 138 if (ret != OMX_ErrorNone) 139 return ret; 140 if (privateinfoparam.nPortIndex != p->nPortIndex) 141 return OMX_ErrorBadPortIndex; 142 } 143 else 144 privateinfoparam.nPortIndex = p->nPortIndex; 145 146 const OMX_BOOL *isbufsharing = GetPortBufferSharingInfo(); 147 if(*isbufsharing) { 148 //if(privateinfoparam.nHolder != NULL) { 149 // free(privateinfoparam.nHolder); 150 // privateinfoparam.nHolder = NULL; 151 //} 152 if(p->nHolder != NULL) { 153 privateinfoparam.nCapacity = p->nCapacity; 154 privateinfoparam.nHolder = (OMX_PTR)malloc(sizeof(OMX_U32) * (p->nCapacity)); 155 memcpy(privateinfoparam.nHolder, p->nHolder, sizeof(OMX_U32) * (p->nCapacity)); 156 } else { 157 privateinfoparam.nCapacity = 0; 158 privateinfoparam.nHolder = NULL; 159 } 160 } 161 162 return OMX_ErrorNone; 163} 164 165const OMX_VIDEO_CONFIG_PRI_INFOTYPE *PortVideo::GetPortPrivateInfoParam(void) 166{ 167 return &privateinfoparam; 168} 169 170 171/* end of PortVideo */ 172 173PortAvc::PortAvc() 174{ 175 OMX_VIDEO_PARAM_PORTFORMATTYPE videoparam; 176 177 memcpy(&videoparam, GetPortVideoParam(), sizeof(videoparam)); 178 videoparam.eCompressionFormat = OMX_VIDEO_CodingAVC; 179 videoparam.eColorFormat = OMX_COLOR_FormatUnused; 180 videoparam.xFramerate = 15 << 16; 181 SetPortVideoParam(&videoparam, false); 182 183 memset(&avcparam, 0, sizeof(avcparam)); 184 185 //set buffer sharing mode 186#ifdef COMPONENT_SUPPORT_BUFFER_SHARING 187#ifdef COMPONENT_SUPPORT_OPENCORE 188 SetPortBufferSharingInfo(OMX_TRUE); 189 avcparam.eProfile = OMX_VIDEO_AVCProfileVendorStartUnused; 190 avcparam.eLevel = OMX_VIDEO_AVCLevelVendorStartUnused; 191#endif 192#else 193 SetPortBufferSharingInfo(OMX_FALSE); 194// avcparam.eProfile = OMX_VIDEO_AVCProfileVendorStartUnused; 195// avcparam.eLevel = OMX_VIDEO_AVCLevelVendorStartUnused; 196#endif 197 198 ComponentBase::SetTypeHeader(&avcparam, sizeof(avcparam)); 199} 200 201OMX_ERRORTYPE PortAvc::SetPortAvcParam( 202 const OMX_VIDEO_PARAM_AVCTYPE *p, bool overwrite_readonly) 203{ 204 if (!overwrite_readonly) { 205 OMX_ERRORTYPE ret; 206 207 ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); 208 if (ret != OMX_ErrorNone) 209 return ret; 210 if (avcparam.nPortIndex != p->nPortIndex) 211 return OMX_ErrorBadPortIndex; 212 } 213 else { 214 OMX_VIDEO_PARAM_PORTFORMATTYPE videoparam; 215 216 memcpy(&videoparam, GetPortVideoParam(), sizeof(videoparam)); 217 videoparam.nPortIndex = p->nPortIndex; 218 SetPortVideoParam(&videoparam, true); 219 220 avcparam.nPortIndex = p->nPortIndex; 221 } 222 223 avcparam.nSliceHeaderSpacing = p->nSliceHeaderSpacing; 224 avcparam.nPFrames = p->nPFrames; 225 avcparam.nBFrames = p->nBFrames; 226 avcparam.bUseHadamard = p->bUseHadamard; 227 avcparam.nRefFrames = p->nRefFrames; 228 avcparam.nRefIdx10ActiveMinus1 = p->nRefIdx10ActiveMinus1; 229 avcparam.nRefIdx11ActiveMinus1 = p->nRefIdx11ActiveMinus1; 230 avcparam.bEnableUEP = p->bEnableUEP; 231 avcparam.bEnableFMO = p->bEnableFMO; 232 avcparam.bEnableASO = p->bEnableASO; 233 avcparam.bEnableRS = p->bEnableRS; 234 avcparam.nAllowedPictureTypes = p->nAllowedPictureTypes; 235 avcparam.bFrameMBsOnly = p->bFrameMBsOnly; 236 avcparam.bMBAFF = p->bMBAFF; 237 avcparam.bEntropyCodingCABAC = p->bEntropyCodingCABAC; 238 avcparam.bWeightedPPrediction = p->bWeightedPPrediction; 239 avcparam.nWeightedBipredicitonMode = p->nWeightedBipredicitonMode; 240 avcparam.bconstIpred = p->bconstIpred; 241 avcparam.bDirect8x8Inference = p->bDirect8x8Inference; 242 avcparam.bDirectSpatialTemporal = p->bDirectSpatialTemporal; 243 avcparam.nCabacInitIdc = p->nCabacInitIdc; 244 avcparam.eLoopFilterMode = p->eLoopFilterMode; 245 246 return OMX_ErrorNone; 247} 248 249const OMX_VIDEO_PARAM_AVCTYPE *PortAvc::GetPortAvcParam(void) 250{ 251 return &avcparam; 252} 253 254/* end of PortAvc */ 255 256PortMpeg4::PortMpeg4() 257{ 258 OMX_VIDEO_PARAM_PORTFORMATTYPE videoparam; 259 260 memcpy(&videoparam, GetPortVideoParam(), sizeof(videoparam)); 261 videoparam.eCompressionFormat = OMX_VIDEO_CodingMPEG4; 262 videoparam.eColorFormat = OMX_COLOR_FormatUnused; 263 videoparam.xFramerate = 15 << 16; 264 SetPortVideoParam(&videoparam, false); 265 266 memset(&mpeg4param, 0, sizeof(mpeg4param)); 267 ComponentBase::SetTypeHeader(&mpeg4param, sizeof(mpeg4param)); 268 269#ifdef COMPONENT_SUPPORT_BUFFER_SHARING 270#ifdef COMPONENT_SUPPORT_OPENCORE 271 SetPortBufferSharingInfo(OMX_TRUE); 272 mpeg4param.eProfile = OMX_VIDEO_MPEG4ProfileVendorStartUnused; 273 mpeg4param.eLevel = OMX_VIDEO_MPEG4LevelVendorStartUnused; 274#endif 275#else 276 SetPortBufferSharingInfo(OMX_FALSE); 277// mpeg4param.eProfile = OMX_VIDEO_MPEG4ProfileVendorStartUnused; 278// mpeg4param.eLevel = OMX_VIDEO_MPEG4LevelVendorStartUnused; 279#endif 280} 281 282OMX_ERRORTYPE PortMpeg4::SetPortMpeg4Param( 283 const OMX_VIDEO_PARAM_MPEG4TYPE *p, bool overwrite_readonly) 284{ 285 if (!overwrite_readonly) { 286 OMX_ERRORTYPE ret; 287 288 ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); 289 if (ret != OMX_ErrorNone) 290 return ret; 291 if (mpeg4param.nPortIndex != p->nPortIndex) 292 return OMX_ErrorBadPortIndex; 293 } 294 else { 295 OMX_VIDEO_PARAM_PORTFORMATTYPE videoparam; 296 297 memcpy(&videoparam, GetPortVideoParam(), sizeof(videoparam)); 298 videoparam.nPortIndex = p->nPortIndex; 299 SetPortVideoParam(&videoparam, true); 300 301 mpeg4param.nPortIndex = p->nPortIndex; 302 } 303 304 mpeg4param.nSliceHeaderSpacing = p->nSliceHeaderSpacing; 305 mpeg4param.bSVH = p->bSVH; 306 mpeg4param.bGov = p->bGov; 307 mpeg4param.nPFrames = p->nPFrames; 308 mpeg4param.nBFrames = p->nBFrames; 309 mpeg4param.nIDCVLCThreshold = p->nIDCVLCThreshold; 310 mpeg4param.bACPred = p->bACPred; 311 mpeg4param.nMaxPacketSize = p->nMaxPacketSize; 312 mpeg4param.nTimeIncRes = p->nTimeIncRes; 313 mpeg4param.eProfile = p->eProfile; 314 mpeg4param.eLevel = p->eLevel; 315 mpeg4param.nAllowedPictureTypes = p->nAllowedPictureTypes; 316 mpeg4param.nHeaderExtension = p->nHeaderExtension; 317 mpeg4param.bReversibleVLC = p->bReversibleVLC; 318 319 return OMX_ErrorNone; 320} 321 322const OMX_VIDEO_PARAM_MPEG4TYPE *PortMpeg4::GetPortMpeg4Param(void) 323{ 324 return &mpeg4param; 325} 326 327/* end of PortMpeg4 */ 328 329PortH263::PortH263() 330{ 331 OMX_VIDEO_PARAM_PORTFORMATTYPE videoparam; 332 333 memcpy(&videoparam, GetPortVideoParam(), sizeof(videoparam)); 334 videoparam.eCompressionFormat = OMX_VIDEO_CodingH263; 335 videoparam.eColorFormat = OMX_COLOR_FormatUnused; 336 videoparam.xFramerate = 15 << 16; 337 SetPortVideoParam(&videoparam, false); 338 339 memset(&h263param, 0, sizeof(h263param)); 340 341 //set buffer sharing mode 342#ifdef COMPONENT_SUPPORT_BUFFER_SHARING 343#ifdef COMPONENT_SUPPORT_OPENCORE 344 SetPortBufferSharingInfo(OMX_TRUE); 345 h263param.eProfile = OMX_VIDEO_H263ProfileVendorStartUnused; 346 h263param.eLevel = OMX_VIDEO_H263LevelVendorStartUnused; 347#endif 348#else 349 SetPortBufferSharingInfo(OMX_FALSE); 350// h263param.eProfile = OMX_VIDEO_H263ProfileVendorStartUnused; 351// h263param.eLevel = OMX_VIDEO_H263LevelVendorStartUnused; 352#endif 353 354 ComponentBase::SetTypeHeader(&h263param, sizeof(h263param)); 355} 356 357OMX_ERRORTYPE PortH263::SetPortH263Param( 358 const OMX_VIDEO_PARAM_H263TYPE *p, bool overwrite_readonly) 359{ 360 if (!overwrite_readonly) { 361 OMX_ERRORTYPE ret; 362 363 ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p)); 364 if (ret != OMX_ErrorNone) 365 return ret; 366 if (h263param.nPortIndex != p->nPortIndex) 367 return OMX_ErrorBadPortIndex; 368 } 369 else { 370 OMX_VIDEO_PARAM_PORTFORMATTYPE videoparam; 371 372 memcpy(&videoparam, GetPortVideoParam(), sizeof(videoparam)); 373 videoparam.nPortIndex = p->nPortIndex; 374 SetPortVideoParam(&videoparam, true); 375 376 h263param.nPortIndex = p->nPortIndex; 377 } 378 379 h263param.nPFrames = p->nPFrames; 380 h263param.nBFrames = p->nBFrames; 381// h263param.eProfile = p->eProfile; 382// h263param.eLevel = p->eLevel; 383 h263param.bPLUSPTYPEAllowed = p->bPLUSPTYPEAllowed; 384 h263param.nAllowedPictureTypes = p->nAllowedPictureTypes; 385 h263param.bForceRoundingTypeToZero = p->bForceRoundingTypeToZero; 386 h263param.nPictureHeaderRepetition = p->nPictureHeaderRepetition; 387 h263param.nGOBHeaderInterval = p->nGOBHeaderInterval; 388 389 return OMX_ErrorNone; 390} 391 392const OMX_VIDEO_PARAM_H263TYPE *PortH263::GetPortH263Param(void) 393{ 394 return &h263param; 395} 396 397/* end of PortH263 */ 398 399 400