1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 #include "pv_frame_metadata_utility.h" 19 #include "pv_player_interface.h" 20 #include "pv_player_factory.h" 21 #include "pv_frame_metadata_mio_video.h" 22 #include "pv_media_output_node_factory.h" 23 #include "pv_mime_string_utils.h" 24 #include "oscl_mem_mempool.h" 25 26 #define PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT 1 27 #define PVFMUTIL_ERRORHANDLINGTIMEOUT_VALUE 30 28 29 #define PVFMUTIL_TIMERID_FRAMEREADYTIMEOUT 2 30 #define PVFMUTIL_FRAMEREADYTIMEOUT_VALUE_DEFAULT 30 31 32 static const char PVFMUTIL_FRAMERETRIEVAL_TIMEOUT_KEY[] = "x-pvmf/fmu/timeout-frameretrieval-in-seconds;valtype=uint32"; 33 34 #define PVFMUTIL_VIDEOFRAMEBUFFER_WIDTH 320 35 #define PVFMUTIL_VIDEOFRAMEBUFFER_HEIGHT 240 36 #define PVFMUTIL_VIDEOFRAMEBUFFER_MAXSIZE PVFMUTIL_VIDEOFRAMEBUFFER_WIDTH * PVFMUTIL_VIDEOFRAMEBUFFER_HEIGHT * 3 37 #define PVFMUTIL_VIDEOFRAMEBUFFER_MEMPOOL_BUFFERSIZE PVFMUTIL_VIDEOFRAMEBUFFER_MAXSIZE*2 38 39 PVFrameAndMetadataUtility* PVFrameAndMetadataUtility::New(char *aOutputFormatMIMEType, PVCommandStatusObserver *aCmdObserver, 40 PVErrorEventObserver *aErrorObserver, PVInformationalEventObserver *aInfoObserver, bool aHwAccelerated) 41 { 42 if (aOutputFormatMIMEType == NULL || aCmdObserver == NULL || 43 aErrorObserver == NULL || aInfoObserver == NULL) 44 { 45 OSCL_LEAVE(OsclErrArgument); 46 return NULL; 47 } 48 49 PVFrameAndMetadataUtility* util = NULL; 50 util = OSCL_NEW(PVFrameAndMetadataUtility, (aHwAccelerated)); 51 if (util) 52 { 53 util->Construct(aOutputFormatMIMEType, 54 aCmdObserver, 55 aErrorObserver, 56 aInfoObserver); 57 } 58 59 return util; 60 } 61 62 63 PVFrameAndMetadataUtility::~PVFrameAndMetadataUtility() 64 { 65 Cancel(); 66 67 if (!iPendingCmds.empty()) 68 { 69 iPendingCmds.pop(); 70 } 71 72 if (iPlayer != NULL) 73 { 74 PVPlayerFactory::DeletePlayer(iPlayer); 75 iPlayer = NULL; 76 } 77 78 if (iVideoFrameBufferMemPool) 79 { 80 iVideoFrameBufferMemPool->removeRef(); 81 iVideoFrameBufferMemPool = NULL; 82 } 83 84 // Shutdown and destroy the timer 85 if (iTimeoutTimer) 86 { 87 iTimeoutTimer->Clear(); 88 } 89 // Memoryleak 90 iVideoDataSink.SetDataSinkNode(NULL); 91 if (iVideoNode) 92 { 93 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iVideoNode); 94 iVideoNode = NULL; 95 } 96 if (iVideoMIO) 97 { 98 OSCL_DELETE(iVideoMIO); 99 iVideoMIO = NULL; 100 } 101 // Cleanup the audio data sink 102 iAudioDataSink.SetDataSinkNode(NULL); 103 if (iAudioNode) 104 { 105 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iAudioNode); 106 iAudioNode = NULL; 107 } 108 if (iAudioMIO) 109 { 110 OSCL_DELETE(iAudioMIO); 111 iAudioMIO = NULL; 112 } 113 // Remove the data source handle 114 iDataSource = NULL; 115 116 OSCL_DELETE(iTimeoutTimer); 117 } 118 119 PVMFStatus PVFrameAndMetadataUtility::SetMode(uint32 aMode) 120 { 121 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::SetMode() = %d", aMode)); 122 // Mode can have values of only 1, 2 or 3. 123 if ((aMode != PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_ONLY) && 124 (aMode != PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_AND_THUMBNAIL) && 125 (aMode != PV_FRAME_METADATA_INTERFACE_MODE_ALL)) 126 { 127 return PVMFErrArgument; 128 } 129 130 131 #ifdef SUPPORT_PARSER_LEVEL_METADATA_EXTRACTION_ONLY 132 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::SetMode in NOT supported in current utility(), Value(= %d) is ignored and default(1) is used", aMode)); 133 iMode = PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_ONLY; 134 return PVMFSuccess; 135 #else 136 if (iState == PVFM_UTILITY_STATE_IDLE) 137 { 138 iMode = aMode; 139 return PVMFSuccess; 140 } 141 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::SetMode() - Invalid State")); 142 return PVMFErrInvalidState; 143 #endif 144 } 145 146 PVCommandId PVFrameAndMetadataUtility::QueryUUID(const PvmfMimeString& aMimeType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids, 147 bool aExactUuidsOnly, const OsclAny* aContextData) 148 { 149 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::QueryUUID()")); 150 151 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 152 paramvec.reserve(3); 153 paramvec.clear(); 154 PVFMUtilityCommandParamUnion param; 155 param.pOsclAny_value = (OsclAny*) & aMimeType; 156 paramvec.push_back(param); 157 param.pOsclAny_value = (OsclAny*) & aUuids; 158 paramvec.push_back(param); 159 param.bool_value = aExactUuidsOnly; 160 paramvec.push_back(param); 161 return AddCommandToQueue(PVFM_UTILITY_COMMAND_QUERY_UUID, (OsclAny*)aContextData, ¶mvec); 162 } 163 164 165 PVCommandId PVFrameAndMetadataUtility::QueryInterface(const PVUuid& aUuid, PVInterface*& aInterfacePtr, const OsclAny* aContextData) 166 { 167 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::QueryInterface()")); 168 169 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 170 paramvec.reserve(1); 171 paramvec.clear(); 172 PVFMUtilityCommandParamUnion param; 173 param.pOsclAny_value = (OsclAny*) & aInterfacePtr; 174 paramvec.push_back(param); 175 return AddCommandToQueue(PVFM_UTILITY_COMMAND_QUERY_INTERFACE, (OsclAny*)aContextData, ¶mvec, &aUuid); 176 } 177 178 179 PVCommandId PVFrameAndMetadataUtility::CancelAllCommands(const OsclAny* aContextData) 180 { 181 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::CancelAllCommands()")); 182 183 return AddCommandToQueue(PVFM_UTILITY_COMMAND_CANCEL_ALL_COMMANDS, (OsclAny*)aContextData); 184 } 185 186 187 PVCommandId PVFrameAndMetadataUtility::GetState(PVFrameAndMetadataState& aState, const OsclAny* aContextData) 188 { 189 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::GetState()")); 190 191 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 192 paramvec.reserve(1); 193 paramvec.clear(); 194 PVFMUtilityCommandParamUnion param; 195 param.pOsclAny_value = (OsclAny*) & aState; 196 paramvec.push_back(param); 197 return AddCommandToQueue(PVFM_UTILITY_COMMAND_GET_STATE, (OsclAny*)aContextData, ¶mvec); 198 } 199 200 201 PVMFStatus PVFrameAndMetadataUtility::GetStateSync(PVFrameAndMetadataState& aState) 202 { 203 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::GetStateSync()")); 204 205 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 206 paramvec.reserve(1); 207 paramvec.clear(); 208 PVFMUtilityCommandParamUnion param; 209 param.pOsclAny_value = (OsclAny*) & aState; 210 paramvec.push_back(param); 211 PVFMUtilityCommand cmd(PVFM_UTILITY_COMMAND_GET_STATE, -1, NULL, ¶mvec); 212 return DoGetState(cmd, true); 213 } 214 215 216 PVCommandId PVFrameAndMetadataUtility::AddDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData) 217 { 218 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::AddDataSource()")); 219 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 220 (0, "PVFrameAndMetadataUtility::AddDataSource called Tick=%d", OsclTickCount::TickCount())); 221 222 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 223 paramvec.reserve(1); 224 paramvec.clear(); 225 PVFMUtilityCommandParamUnion param; 226 param.pOsclAny_value = (OsclAny*) & aDataSource; 227 paramvec.push_back(param); 228 return AddCommandToQueue(PVFM_UTILITY_COMMAND_ADD_DATA_SOURCE, (OsclAny*)aContextData, ¶mvec); 229 } 230 231 232 PVCommandId PVFrameAndMetadataUtility::GetMetadataKeys(PVPMetadataList& aKeyList, int32 aStartingIndex, int32 aMaxEntries, 233 char* aQueryKey, const OsclAny* aContextData) 234 { 235 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::GetMetadataKeys()")); 236 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 237 (0, "PVFrameAndMetadataUtility::GetMetadataKeys called Tick=%d", OsclTickCount::TickCount())); 238 239 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 240 paramvec.reserve(4); 241 paramvec.clear(); 242 PVFMUtilityCommandParamUnion param; 243 param.pOsclAny_value = (OsclAny*) & aKeyList; 244 paramvec.push_back(param); 245 param.int32_value = aStartingIndex; 246 paramvec.push_back(param); 247 param.int32_value = aMaxEntries; 248 paramvec.push_back(param); 249 param.pChar_value = aQueryKey; 250 paramvec.push_back(param); 251 return AddCommandToQueue(PVFM_UTILITY_COMMAND_GET_METADATA_KEYS, (OsclAny*)aContextData, ¶mvec); 252 } 253 254 255 PVCommandId PVFrameAndMetadataUtility::GetMetadataValues(PVPMetadataList& aKeyList, int32 aStartingValueIndex, int32 aMaxValueEntries, 256 int32& aNumAvailableValueEntries, Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, 257 const OsclAny* aContextData) 258 { 259 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::GetMetadataValues()")); 260 261 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 262 (0, "PVFrameAndMetadataUtility::GetMetadataValues called Tick=%d", OsclTickCount::TickCount())); 263 264 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 265 paramvec.reserve(5); 266 paramvec.clear(); 267 PVFMUtilityCommandParamUnion param; 268 param.pOsclAny_value = (OsclAny*) & aKeyList; 269 paramvec.push_back(param); 270 param.int32_value = aStartingValueIndex; 271 paramvec.push_back(param); 272 param.int32_value = aMaxValueEntries; 273 paramvec.push_back(param); 274 param.pOsclAny_value = (OsclAny*) & aNumAvailableValueEntries; 275 paramvec.push_back(param); 276 param.pOsclAny_value = (OsclAny*) & aValueList; 277 paramvec.push_back(param); 278 return AddCommandToQueue(PVFM_UTILITY_COMMAND_GET_METADATA_VALUES, (OsclAny*)aContextData, ¶mvec); 279 } 280 281 void PVFrameAndMetadataUtility::setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int32 aNumElements, PvmiKvp* &aRetKVP) 282 { 283 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::SetParametersSync()")); 284 OSCL_UNUSED_ARG(aSession); 285 286 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 287 paramvec.reserve(3); 288 paramvec.clear(); 289 PVFMUtilityCommandParamUnion param; 290 param.pOsclAny_value = (OsclAny*)aParameters; 291 paramvec.push_back(param); 292 param.int32_value = (int32)aNumElements; 293 paramvec.push_back(param); 294 param.pOsclAny_value = (OsclAny*) & aRetKVP; 295 paramvec.push_back(param); 296 297 PVFMUtilityCommand cmd(PVFM_UTILITY_COMMAND_SET_PARAMETERS, -1, NULL, ¶mvec); 298 299 DoCapConfigSetParameters(cmd, true); 300 } 301 302 303 PVCommandId PVFrameAndMetadataUtility::GetFrame(PVFrameSelector& aFrameInfo, uint8* aProvidedFrameBuffer, 304 uint32& aBufferSize, PVFrameBufferProperty& aBufferProp, const OsclAny* aContextData) 305 { 306 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::GetFrame() User provided buffer version")); 307 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 308 (0, "PVFrameAndMetadataUtility::GetFrame called Tick=%d", OsclTickCount::TickCount())); 309 310 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 311 paramvec.reserve(3); 312 paramvec.clear(); 313 PVFMUtilityCommandParamUnion param; 314 param.pOsclAny_value = (OsclAny*) & aFrameInfo; 315 paramvec.push_back(param); 316 param.pUint8_value = aProvidedFrameBuffer; 317 paramvec.push_back(param); 318 param.pUint32_value = &aBufferSize; 319 paramvec.push_back(param); 320 param.pOsclAny_value = (OsclAny*) & aBufferProp; 321 paramvec.push_back(param); 322 return AddCommandToQueue(PVFM_UTILITY_COMMAND_GET_FRAME_USER_BUFFER, (OsclAny*)aContextData, ¶mvec); 323 } 324 325 326 PVCommandId PVFrameAndMetadataUtility::GetFrame(PVFrameSelector& aFrameInfo, uint8** aFrameBufferPtr, 327 uint32& aBufferSize, PVFrameBufferProperty& aBufferProp, const OsclAny* aContextData) 328 { 329 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::GetFrame() Utility provided buffer version")); 330 331 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 332 paramvec.reserve(4); 333 paramvec.clear(); 334 PVFMUtilityCommandParamUnion param; 335 param.pOsclAny_value = (OsclAny*) & aFrameInfo; 336 paramvec.push_back(param); 337 param.pOsclAny_value = (OsclAny*)aFrameBufferPtr; 338 paramvec.push_back(param); 339 param.pUint32_value = &aBufferSize; 340 paramvec.push_back(param); 341 param.pOsclAny_value = (OsclAny*) & aBufferProp; 342 paramvec.push_back(param); 343 return AddCommandToQueue(PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER, (OsclAny*)aContextData, ¶mvec); 344 } 345 346 347 PVCommandId PVFrameAndMetadataUtility::ReturnBuffer(uint8* aFrameBufferPtr, const OsclAny* aContextData) 348 { 349 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::ReturnBuffer()")); 350 351 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 352 paramvec.reserve(1); 353 paramvec.clear(); 354 PVFMUtilityCommandParamUnion param; 355 param.pUint8_value = aFrameBufferPtr; 356 paramvec.push_back(param); 357 return AddCommandToQueue(PVFM_UTILITY_COMMAND_RETURN_BUFFER, (OsclAny*)aContextData, ¶mvec); 358 } 359 360 361 PVCommandId PVFrameAndMetadataUtility::RemoveDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData) 362 { 363 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::RemoveDataSource()")); 364 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 365 (0, "PVFrameAndMetadataUtility::RemoveDataSource called Tick=%d", OsclTickCount::TickCount())); 366 367 Oscl_Vector<PVFMUtilityCommandParamUnion, OsclMemAllocator> paramvec; 368 paramvec.reserve(1); 369 paramvec.clear(); 370 PVFMUtilityCommandParamUnion param; 371 param.pOsclAny_value = (OsclAny*) & aDataSource; 372 paramvec.push_back(param); 373 return AddCommandToQueue(PVFM_UTILITY_COMMAND_REMOVE_DATA_SOURCE, (OsclAny*)aContextData, ¶mvec); 374 } 375 376 377 PVFrameAndMetadataUtility::PVFrameAndMetadataUtility(bool aHwAccelerated) : 378 iHwAccelerated(aHwAccelerated), 379 OsclTimerObject(OsclActiveObject::EPriorityNominal, "PVFrameMetadataUtility"), 380 iCommandId(0), 381 iState(PVFM_UTILITY_STATE_IDLE), 382 iCmdStatusObserver(NULL), 383 iErrorEventObserver(NULL), 384 iInfoEventObserver(NULL), 385 iPlayer(NULL), 386 iOutputFormatType(PVMF_MIME_FORMAT_UNKNOWN), 387 iDataSource(NULL), 388 iVideoNode(NULL), 389 iVideoMIO(NULL), 390 iAudioNode(NULL), 391 iAudioMIO(NULL), 392 iLogger(NULL), 393 iErrorHandlingInUtilityAO(false), 394 iVideoFrameBufferMemPool(NULL), 395 iCurrentVideoFrameBuffer(NULL), 396 iVideoFrameBufferSize(NULL), 397 iVideoFrameSelector(NULL), 398 iVideoFrameBufferProp(NULL), 399 iFrameReceived(false), 400 iPlayerStartCompleted(false), 401 iAPICmdStatus(PVMFSuccess), 402 iAPICmdErrMsg(NULL), 403 iTimeoutTimer(NULL), 404 iErrorHandlingWaitTime(PVFMUTIL_ERRORHANDLINGTIMEOUT_VALUE), 405 iFrameReadyWaitTime(PVFMUTIL_FRAMEREADYTIMEOUT_VALUE_DEFAULT), 406 iThumbnailWidth(PVFMUTIL_VIDEOFRAMEBUFFER_WIDTH), 407 iThumbnailHeight(PVFMUTIL_VIDEOFRAMEBUFFER_HEIGHT) 408 { 409 //define this Macro in mmp build file only if mode 1 of FrMU is required. 410 #ifdef SUPPORT_PARSER_LEVEL_METADATA_EXTRACTION_ONLY 411 iMode = PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_ONLY; 412 #else 413 iMode = PV_FRAME_METADATA_INTERFACE_MODE_ALL; 414 #endif 415 iPlayerCapConfigIF = NULL; 416 iPlayerCapConfigIFPVI = NULL; 417 } 418 419 420 void PVFrameAndMetadataUtility::Construct(char *aOutputFormatMIMEType, PVCommandStatusObserver *aCmdObserver, 421 PVErrorEventObserver *aErrorObserver, PVInformationalEventObserver *aInfoObserver) 422 { 423 OSCL_ASSERT(aOutputFormatMIMEType != NULL); 424 425 iOutputFormatType = aOutputFormatMIMEType; 426 427 if (iOutputFormatType == PVMF_MIME_FORMAT_UNKNOWN) 428 { 429 OSCL_LEAVE(OsclErrArgument); 430 return; 431 } 432 iCmdStatusObserver = aCmdObserver; 433 iErrorEventObserver = aErrorObserver; 434 iInfoEventObserver = aInfoObserver; 435 436 // Create the player instance 437 iPlayer = PVPlayerFactory::CreatePlayer(this, this, this, iHwAccelerated); 438 OSCL_ASSERT(iPlayer != NULL); 439 440 // Allocate memory for vectors 441 // If a leave occurs, let it bubble up 442 iCurrentCmd.reserve(1); 443 iCurrentCmd.clear(); 444 iCmdToCancel.reserve(1); 445 iCmdToCancel.clear(); 446 iPendingCmds.reserve(4); 447 448 // Add this AO to the scheduler 449 AddToScheduler(); 450 451 // Retrieve the logger object 452 iLogger = PVLogger::GetLoggerObject("PVFrameAndMetadataUtility"); 453 iPerfLogger = PVLogger::GetLoggerObject("fmudiagnostics"); 454 455 456 // Initialize the OSCL timer for timeouts 457 iTimeoutTimer = OSCL_NEW(OsclTimer<OsclMemAllocator>, ("pvfmutility_timeout")); 458 iTimeoutTimer->SetObserver(this); 459 iTimeoutTimer->SetFrequency(1); // 1 sec resolution 460 } 461 462 463 void PVFrameAndMetadataUtility::Run() 464 { 465 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::Run() In")); 466 int32 leavecode = 0; 467 468 if (iErrorHandlingInUtilityAO) 469 { 470 iErrorHandlingInUtilityAO = false; 471 472 // Forcibly restart the player engine 473 PVMFStatus retval = DoPlayerShutdownRestart(); 474 if (retval != PVMFSuccess) 475 { 476 iAPICmdStatus = retval; 477 } 478 // Cleanup the video data sink 479 iVideoDataSink.SetDataSinkNode(NULL); 480 if (iVideoNode) 481 { 482 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iVideoNode); 483 iVideoNode = NULL; 484 } 485 if (iVideoMIO) 486 { 487 OSCL_DELETE(iVideoMIO); 488 iVideoMIO = NULL; 489 } 490 // Cleanup the audio data sink 491 iAudioDataSink.SetDataSinkNode(NULL); 492 if (iAudioNode) 493 { 494 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iAudioNode); 495 iAudioNode = NULL; 496 } 497 if (iAudioMIO) 498 { 499 OSCL_DELETE(iAudioMIO); 500 iAudioMIO = NULL; 501 } 502 // Remove the data source handle 503 iDataSource = NULL; 504 505 // Cancel any pending timers 506 if (iTimeoutTimer) 507 { 508 iTimeoutTimer->Clear(); 509 } 510 511 SetUtilityState(PVFM_UTILITY_STATE_IDLE); 512 513 // Complete any command if waiting to be completed 514 if (iCurrentCmd.empty() == false) 515 { 516 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 517 } 518 iAPICmdStatus = PVMFSuccess; 519 if (iAPICmdErrMsg) 520 { 521 iAPICmdErrMsg->removeRef(); 522 iAPICmdErrMsg = NULL; 523 } 524 return; 525 } 526 527 // Check if CancelAll() request was made 528 if (!iPendingCmds.empty()) 529 { 530 if (iPendingCmds.top().GetCmdType() == PVFM_UTILITY_COMMAND_CANCEL_ALL_COMMANDS) 531 { 532 // Process it right away 533 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::Run() Processing CancelAllCommands() request")); 534 PVFMUtilityCommand cmd(iPendingCmds.top()); 535 iPendingCmds.pop(); 536 DoCancelAllCommands(cmd); 537 return; 538 } 539 } 540 541 // Handle other requests normally 542 if (!iPendingCmds.empty() && iCurrentCmd.empty()) 543 { 544 // Retrieve the first pending command from queue 545 PVFMUtilityCommand cmd(iPendingCmds.top()); 546 iPendingCmds.pop(); 547 548 // Put in on the current command queue 549 leavecode = 0; 550 OSCL_TRY(leavecode, iCurrentCmd.push_front(cmd)); 551 OSCL_FIRST_CATCH_ANY(leavecode, 552 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::Run() Command could not be pushed onto iCurrentCmd vector")); 553 UtilityCommandCompleted(cmd.GetCmdId(), cmd.GetContext(), PVMFErrNoMemory); 554 OSCL_ASSERT(false); 555 return;); 556 557 // Process the command according to the cmd type 558 PVMFStatus cmdstatus = PVMFSuccess; 559 switch (cmd.GetCmdType()) 560 { 561 case PVFM_UTILITY_COMMAND_QUERY_UUID: 562 cmdstatus = DoQueryUUID(cmd);; 563 break; 564 565 case PVFM_UTILITY_COMMAND_QUERY_INTERFACE: 566 cmdstatus = DoQueryInterface(cmd); 567 break; 568 569 case PVFM_UTILITY_COMMAND_GET_STATE: 570 cmdstatus = DoGetState(cmd, false); 571 break; 572 573 case PVFM_UTILITY_COMMAND_ADD_DATA_SOURCE: 574 cmdstatus = DoAddDataSource(cmd); 575 break; 576 577 case PVFM_UTILITY_COMMAND_GET_METADATA_KEYS: 578 cmdstatus = DoGetMetadataKeys(cmd); 579 break; 580 581 case PVFM_UTILITY_COMMAND_GET_METADATA_VALUES: 582 cmdstatus = DoGetMetadataValues(cmd); 583 break; 584 585 case PVFM_UTILITY_COMMAND_SET_PARAMETERS: 586 cmdstatus = DoCapConfigSetParameters(cmd, false); 587 break; 588 589 case PVFM_UTILITY_COMMAND_GET_FRAME_USER_BUFFER: 590 case PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER: 591 cmdstatus = DoGetFrame(cmd); 592 break; 593 594 case PVFM_UTILITY_COMMAND_RETURN_BUFFER: 595 cmdstatus = DoReturnBuffer(cmd); 596 break; 597 598 case PVFM_UTILITY_COMMAND_REMOVE_DATA_SOURCE: 599 cmdstatus = DoRemoveDataSource(cmd); 600 break; 601 602 case PVFM_UTILITY_COMMAND_CANCEL_ALL_COMMANDS: 603 // CancelAll() should not be handled here 604 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::Run() CancelAllCommands should be not handled in here. Asserting.")); 605 OSCL_ASSERT(false); 606 // Just handle as "not supported" 607 cmdstatus = PVMFErrNotSupported; 608 break; 609 610 case PVFM_UTILITY_COMMAND_HANDLE_PLAYER_ERROR: 611 // Internal command so should not be handled here 612 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::Run() Internal error handling command should be not handled in here. Asserting.")); 613 OSCL_ASSERT(false); 614 // Just handle as "not supported" 615 cmdstatus = PVMFErrNotSupported; 616 break; 617 618 default: 619 cmdstatus = PVMFErrNotSupported; 620 break; 621 } 622 623 if (cmdstatus != PVMFSuccess) 624 { 625 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::Run() Command failed CmdId %d Status %d", cmd.GetCmdId(), cmdstatus)); 626 UtilityCommandCompleted(cmd.GetCmdId(), cmd.GetContext(), cmdstatus); 627 } 628 } 629 630 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::Run() Out")); 631 } 632 633 634 void PVFrameAndMetadataUtility::CommandCompleted(const PVCmdResponse& aResponse) 635 { 636 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::CommandCompleted() In")); 637 638 // Check if a cancel command on player engine completed 639 int32* context_int32 = (int32*)(aResponse.GetContext()); 640 if (context_int32 == &iCancelContext) 641 { 642 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::CommandCompleted() Player engine cancel command completed")); 643 644 // Check if the player engine state matches the utility's expected state 645 PVPlayerState playerstate = PVP_STATE_IDLE; 646 iPlayer->GetPVPlayerStateSync(playerstate); 647 if (playerstate == PVP_STATE_IDLE && iState != PVFM_UTILITY_STATE_IDLE) 648 { 649 iDataSource = NULL; 650 iState = PVFM_UTILITY_STATE_IDLE; 651 } 652 653 // Complete the utility's CancelAllCommands() request 654 iCmdToCancel.clear(); 655 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), PVMFSuccess); 656 return; 657 } 658 659 // Ignore other player command completion if cancelling 660 if (!iCmdToCancel.empty()) 661 { 662 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::CommandCompleted() Player command completion ignored due to cancel process")); 663 iUtilityContext.iCmdType = -1; 664 return; 665 } 666 667 // Process normal player engine command completions 668 if (aResponse.GetContext() == (OsclAny*)&iUtilityContext) 669 { 670 PVFMUtilityContext* context = (PVFMUtilityContext*)(aResponse.GetContext()); 671 switch (context->iCmdType) 672 { 673 case PVFM_CMD_PlayerQueryUUID: 674 HandlePlayerQueryUUID(*context, aResponse); 675 break; 676 677 case PVFM_CMD_PlayerQueryInterface: 678 case PVFM_CMD_PlayerQueryCapConfigInterface: 679 HandlePlayerQueryInterface(*context, aResponse); 680 break; 681 682 case PVFM_CMD_ADSPlayerAddDataSource: 683 HandleADSPlayerAddDataSource(*context, aResponse); 684 break; 685 686 case PVFM_CMD_ADSPlayerInit: 687 HandleADSPlayerInit(*context, aResponse); 688 break; 689 690 case PVFM_CMD_ADSPlayerAddVideoDataSink: 691 HandleADSPlayerAddVideoDataSink(*context, aResponse); 692 break; 693 694 case PVFM_CMD_ADSPlayerAddAudioDataSink: 695 HandleADSPlayerAddAudioDataSink(*context, aResponse); 696 break; 697 698 case PVFM_CMD_ADSPlayerPrepare: 699 HandleADSPlayerPrepare(*context, aResponse); 700 break; 701 702 case PVFM_CMD_ADSPlayerStart: 703 HandleADSPlayerStart(*context, aResponse); 704 break; 705 706 case PVFM_CMD_ADSPlayerPause: 707 HandleADSPlayerPause(*context, aResponse); 708 break; 709 710 case PVFM_CMD_PlayerGetMetadataKeys: 711 HandlePlayerGetMetadataKeys(*context, aResponse); 712 break; 713 714 case PVFM_CMD_PlayerGetMetadataValues: 715 HandlePlayerGetMetadataValues(*context, aResponse); 716 break; 717 718 case PVFM_CMD_PlayerSetParametersSync: 719 HandlePlayerSetParametersSync(*context, aResponse); 720 break; 721 722 case PVFM_CMD_GFPlayerStopFromPaused: 723 HandleGFPlayerStopFromPaused(*context, aResponse); 724 break; 725 726 case PVFM_CMD_GFPlayerPrepare: 727 HandleGFPlayerPrepare(*context, aResponse); 728 break; 729 730 case PVFM_CMD_GFPlayerStart: 731 HandleGFPlayerStart(*context, aResponse); 732 break; 733 734 case PVFM_CMD_GFPlayerPause: 735 HandleGFPlayerPause(*context, aResponse); 736 break; 737 738 case PVFM_CMD_RDSPlayerStopFromPaused: 739 HandleRDSPlayerStopFromPaused(*context, aResponse); 740 break; 741 742 case PVFM_CMD_RDSPlayerRemoveVideoDataSink: 743 HandleRDSPlayerRemoveVideoDataSink(*context, aResponse); 744 break; 745 746 case PVFM_CMD_RDSPlayerRemoveAudioDataSink: 747 HandleRDSPlayerRemoveAudioDataSink(*context, aResponse); 748 break; 749 750 case PVFM_CMD_RDSPlayerReset: 751 HandleRDSPlayerReset(*context, aResponse); 752 break; 753 754 case PVFM_CMD_RDSPlayerRemoveDataSource: 755 HandleRDSPlayerRemoveDataSource(*context, aResponse); 756 break; 757 758 default: 759 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::CommandCompleted() Unknown player command type. Asserting")); 760 OSCL_ASSERT(false); 761 break; 762 } 763 } 764 765 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::CommandCompleted() Out")); 766 } 767 768 769 void PVFrameAndMetadataUtility::HandleErrorEvent(const PVAsyncErrorEvent& aEvent) 770 { 771 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleErrorEvent() In")); 772 773 // Check the player state 774 PVPlayerState pstate; 775 iPlayer->GetPVPlayerStateSync(pstate); 776 777 switch (pstate) 778 { 779 case PVP_STATE_ERROR: 780 { 781 if (iCurrentCmd.empty() == true) 782 { 783 // Since error occurred while not processing a command so put in an internal 784 // utility command so a pending command would not be processing while handling error 785 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleErrorEvent() Queuing an internal command for error handlin")); 786 PVFMUtilityCommand errorcmd(PVFM_UTILITY_COMMAND_HANDLE_PLAYER_ERROR, -1, NULL, NULL, false); 787 iCurrentCmd.push_front(errorcmd); 788 } 789 790 // Wait for error handling to complete 791 PVMFErrorInfoMessageInterface* nextmsg = NULL; 792 if (aEvent.GetEventExtensionInterface()) 793 { 794 nextmsg = GetErrorInfoMessageInterface(*(aEvent.GetEventExtensionInterface())); 795 } 796 PVMFBasicErrorInfoMessage* errmsg = NULL; 797 errmsg = CreateBasicErrInfoMessage(nextmsg); 798 799 iAPICmdStatus = (PVMFStatus)(aEvent.GetEventType()); 800 if (iAPICmdErrMsg) 801 { 802 iAPICmdErrMsg->removeRef(); 803 iAPICmdErrMsg = NULL; 804 } 805 iAPICmdErrMsg = errmsg; 806 807 // Start a timer just in case the player does not report error handling complete 808 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 809 } 810 break; 811 812 case PVP_STATE_IDLE: 813 if (iState == PVFM_UTILITY_STATE_IDLE) 814 { 815 // Just report the error event up to the app 816 iErrorEventObserver->HandleErrorEvent(aEvent); 817 break; 818 } 819 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 820 iErrorHandlingInUtilityAO = true; 821 RunIfNotReady(); 822 break; 823 824 default: 825 // Need to shutdown/restart player and cleanup in utility's AO 826 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 827 iErrorHandlingInUtilityAO = true; 828 RunIfNotReady(); 829 break; 830 } 831 832 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleErrorEvent() Out")); 833 } 834 835 836 void PVFrameAndMetadataUtility::HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent) 837 { 838 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleInformationalEvent() In")); 839 840 // If error handling complete event, complete the utility command 841 // that was waiting for player to complete error handling 842 if (aEvent.GetEventType() == PVMFInfoErrorHandlingComplete) 843 { 844 if (iAPICmdStatus == PVMFSuccess) 845 { 846 // Error handling wait timed out so ignore this event 847 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleInformationalEvent() Error handling already timed out so ignoring this event from player.")); 848 return; 849 } 850 851 // Cancel the timeout timer 852 iTimeoutTimer->Cancel(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT); 853 854 // Check the player state and make it sure matches with expected one 855 PVPlayerState pstate; 856 iPlayer->GetPVPlayerStateSync(pstate); 857 858 switch (pstate) 859 { 860 case PVP_STATE_INITIALIZED: 861 if (iState == PVFM_UTILITY_STATE_IDLE || iState == PVFM_UTILITY_STATE_RESETTING) 862 { 863 // This should not happen 864 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleInformationalEvent() Player is initialized even though util is in idle. Asserting.")); 865 OSCL_ASSERT(false); 866 867 // Need to shutdown/restart player and cleanup in utility's AO 868 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 869 iErrorHandlingInUtilityAO = true; 870 RunIfNotReady(); 871 return; 872 } 873 else 874 { 875 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZED); 876 877 // If the current command is AddDataSource(), player engine 878 // is in initialized state so complete the command with success 879 if (iCurrentCmd.empty() == false) 880 { 881 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_ADD_DATA_SOURCE) 882 { 883 //if the mode is in which prepare of engine is called and prepare is failing 884 //we cannot send successs of adddata source 885 if (iMode == PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_ONLY) 886 { 887 iAPICmdStatus = PVMFSuccess; 888 } 889 890 if (iAPICmdErrMsg) 891 { 892 iAPICmdErrMsg->removeRef(); 893 iAPICmdErrMsg = NULL; 894 } 895 896 // Cleanup the video data sink 897 iVideoDataSink.SetDataSinkNode(NULL); 898 if (iVideoNode) 899 { 900 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iVideoNode); 901 iVideoNode = NULL; 902 } 903 if (iVideoMIO) 904 { 905 OSCL_DELETE(iVideoMIO); 906 iVideoMIO = NULL; 907 } 908 // Cleanup the audio data sink 909 iAudioDataSink.SetDataSinkNode(NULL); 910 if (iAudioNode) 911 { 912 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iAudioNode); 913 iAudioNode = NULL; 914 } 915 if (iAudioMIO) 916 { 917 OSCL_DELETE(iAudioMIO); 918 iAudioMIO = NULL; 919 } 920 } 921 } 922 } 923 break; 924 925 case PVP_STATE_IDLE: 926 if (iState != PVFM_UTILITY_STATE_IDLE) 927 { 928 // Player went back to idle state so change utility's state to idle as well 929 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleInformationalEvent() Player went back to idle so set utility to idle.")); 930 931 // Cleanup the video data sink 932 iVideoDataSink.SetDataSinkNode(NULL); 933 if (iVideoNode) 934 { 935 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iVideoNode); 936 iVideoNode = NULL; 937 } 938 if (iVideoMIO) 939 { 940 OSCL_DELETE(iVideoMIO); 941 iVideoMIO = NULL; 942 } 943 // Cleanup the audio data sink 944 iAudioDataSink.SetDataSinkNode(NULL); 945 if (iAudioNode) 946 { 947 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iAudioNode); 948 iAudioNode = NULL; 949 } 950 if (iAudioMIO) 951 { 952 OSCL_DELETE(iAudioMIO); 953 iAudioMIO = NULL; 954 } 955 // Remove the data source handle 956 iDataSource = NULL; 957 958 SetUtilityState(PVFM_UTILITY_STATE_IDLE); 959 } 960 break; 961 962 default: 963 // Player should not be in any other state when 964 // error handling completes 965 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleInformationalEvent() Unexpected player state after error handling. Asserting.")); 966 OSCL_ASSERT(false); 967 // Need to shutdown/restart player and cleanup in utility's AO 968 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 969 iErrorHandlingInUtilityAO = true; 970 RunIfNotReady(); 971 break; 972 } 973 974 // Report the command as failed if command completion was pending 975 if (iCurrentCmd.empty() == false) 976 { 977 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 978 } 979 iAPICmdStatus = PVMFSuccess; 980 if (iAPICmdErrMsg) 981 { 982 iAPICmdErrMsg->removeRef(); 983 iAPICmdErrMsg = NULL; 984 } 985 } 986 else if (aEvent.GetEventType() == PVMFInfoEndOfData) 987 { 988 if (!iCurrentCmd.empty() && 989 (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_USER_BUFFER || 990 iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER)) 991 { 992 // End of Data is received, before frame could be fetched 993 // Need to send command completion for GetFrame 994 if (!iFrameReceived) 995 { 996 HandleFrameReadyEvent(PVMFErrMaxReached); 997 } 998 } 999 iInfoEventObserver->HandleInformationalEvent(aEvent); 1000 } 1001 else 1002 { 1003 // Just pass up other info events up to app 1004 iInfoEventObserver->HandleInformationalEvent(aEvent); 1005 } 1006 1007 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleInformationalEvent() Out")); 1008 } 1009 1010 1011 void PVFrameAndMetadataUtility::HandleFrameReadyEvent(PVMFStatus aEventStatus) 1012 { 1013 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_USER_BUFFER || 1014 iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER) 1015 { 1016 iFrameReceived = true; 1017 1018 // Cancel the timeout timer 1019 iTimeoutTimer->Cancel(PVFMUTIL_TIMERID_FRAMEREADYTIMEOUT); 1020 1021 iAPICmdStatus = aEventStatus; 1022 1023 if (aEventStatus != PVMFSuccess) 1024 { 1025 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleFrameReadyEvent() Frame retrieval from video MIO failed.")); 1026 1027 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 1028 { 1029 // Return the buffer if allocated from utility's mempool 1030 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 1031 iCurrentVideoFrameBuffer = NULL; 1032 } 1033 1034 PVUuid puuid = PVFrameAndMetadataErrorInfoEventTypesUUID; 1035 PVMFBasicErrorInfoMessage* errmsg = NULL; 1036 int32 leavecode = 0; 1037 OSCL_TRY(leavecode, errmsg = OSCL_NEW(PVMFBasicErrorInfoMessage, (PVFMErrMIOComponent, puuid, NULL))); 1038 OSCL_FIRST_CATCH_ANY(leavecode, 1039 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleFrameReadyEvent() Instantiation of error msg did a leave!")); 1040 errmsg = NULL; 1041 ); 1042 1043 if (iAPICmdErrMsg) 1044 { 1045 iAPICmdErrMsg->removeRef(); 1046 iAPICmdErrMsg = NULL; 1047 } 1048 iAPICmdErrMsg = errmsg; 1049 } 1050 else 1051 { 1052 OSCL_ASSERT(iVideoFrameBufferProp != NULL); 1053 // Retrieve the video frame properties from MIO component 1054 uint32 fw = 0; 1055 uint32 fh = 0; 1056 uint32 dw = 0; 1057 uint32 dh = 0; 1058 if (iVideoMIO->GetFrameProperties(fw, fh, dw, dh) == PVMFSuccess) 1059 { 1060 iVideoFrameBufferProp->iFrameWidth = fw; 1061 iVideoFrameBufferProp->iFrameHeight = fh; 1062 iVideoFrameBufferProp->iDisplayWidth = dw; 1063 iVideoFrameBufferProp->iDisplayHeight = dh; 1064 } 1065 else 1066 { 1067 iVideoFrameBufferProp->iFrameWidth = 0; 1068 iVideoFrameBufferProp->iFrameHeight = 0; 1069 iVideoFrameBufferProp->iDisplayWidth = 0; 1070 iVideoFrameBufferProp->iDisplayHeight = 0; 1071 } 1072 } 1073 1074 // Initiate pause on player if start already completed 1075 if (iPlayerStartCompleted) 1076 { 1077 PVMFStatus retval = DoGFPlayerPause(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext()); 1078 if (retval == PVMFErrInvalidState) 1079 { 1080 // Playback already paused so GetFrame() command completed 1081 if (iAPICmdStatus != PVMFSuccess) 1082 { 1083 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 1084 { 1085 // Return the buffer if allocated from utility's mempool 1086 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 1087 iCurrentVideoFrameBuffer = NULL; 1088 } 1089 } 1090 1091 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 1092 1093 iAPICmdStatus = PVMFSuccess; 1094 if (iAPICmdErrMsg) 1095 { 1096 iAPICmdErrMsg->removeRef(); 1097 iAPICmdErrMsg = NULL; 1098 } 1099 } 1100 else if (retval != PVMFSuccess) 1101 { 1102 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleFrameReadyEvent() Stop on player failed. Report command as failed")); 1103 1104 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 1105 { 1106 // Return the buffer if allocated from utility's mempool 1107 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 1108 iCurrentVideoFrameBuffer = NULL; 1109 } 1110 1111 if (iAPICmdStatus == PVMFSuccess) 1112 { 1113 iAPICmdStatus = retval; 1114 } 1115 1116 // Need to shutdown/restart player and cleanup in utility's AO 1117 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 1118 iErrorHandlingInUtilityAO = true; 1119 RunIfNotReady(); 1120 } 1121 } 1122 // Else just wait for player to report start completed 1123 } 1124 else 1125 { 1126 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleFrameReadyEvent() Frame ready received outside of GetFrame() command. Asserting.")); 1127 //OSCL_ASSERT(false); 1128 } 1129 } 1130 1131 1132 void PVFrameAndMetadataUtility::TimeoutOccurred(int32 timerID, int32 /*timeoutInfo*/) 1133 { 1134 if (timerID == PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT) 1135 { 1136 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::TimeoutOccurred() Timer for error handling timeout triggered")); 1137 1138 if (iAPICmdStatus == PVMFSuccess) 1139 { 1140 // Error handling wait timed out so ignore this event 1141 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::TimeoutOccurred() Error handling already reported complete by player.")); 1142 return; 1143 } 1144 1145 // Check the player state and make it sure matches with expected one 1146 PVPlayerState pstate; 1147 iPlayer->GetPVPlayerStateSync(pstate); 1148 PVFrameAndMetadataState ustate; 1149 ustate = GetUtilityState(); 1150 1151 switch (pstate) 1152 { 1153 case PVP_STATE_INITIALIZED: 1154 if (ustate == PVFM_STATE_IDLE) 1155 { 1156 // This should not happen 1157 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::TimeoutOccurred() Player is initialized even though util is in idle. Asserting.")); 1158 OSCL_ASSERT(false); 1159 } 1160 break; 1161 1162 case PVP_STATE_IDLE: 1163 if (ustate != PVFM_STATE_IDLE) 1164 { 1165 // Player went back to idle state so change utility's state to idle as well 1166 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::TimeoutOccurred() Player went back to idle so set utility to idle.")); 1167 SetUtilityState(PVFM_UTILITY_STATE_IDLE); 1168 } 1169 break; 1170 1171 default: 1172 // Player should not be in any other state when 1173 // error handling completes 1174 OSCL_ASSERT(false); 1175 break; 1176 } 1177 1178 // Report the command as failed 1179 OSCL_ASSERT(iCurrentCmd.empty() == false); 1180 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 1181 iAPICmdStatus = PVMFSuccess; 1182 if (iAPICmdErrMsg) 1183 { 1184 iAPICmdErrMsg->removeRef(); 1185 iAPICmdErrMsg = NULL; 1186 } 1187 } 1188 else if (timerID == PVFMUTIL_TIMERID_FRAMEREADYTIMEOUT) 1189 { 1190 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::TimeoutOccurred() Frame retrieval from video MIO timed out.")); 1191 1192 // Cancel the pending frame retrieval 1193 iVideoMIO->CancelGetFrame(); 1194 1195 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 1196 { 1197 // Return the buffer if allocated from utility's mempool 1198 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 1199 iCurrentVideoFrameBuffer = NULL; 1200 } 1201 1202 // Create an error message 1203 PVUuid puuid = PVFrameAndMetadataErrorInfoEventTypesUUID; 1204 PVMFBasicErrorInfoMessage* errmsg = NULL; 1205 int32 leavecode = 0; 1206 OSCL_TRY(leavecode, errmsg = OSCL_NEW(PVMFBasicErrorInfoMessage, (PVFMErrMIOComponent, puuid, NULL))); 1207 OSCL_FIRST_CATCH_ANY(leavecode, 1208 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::TimeoutOccurred() Instantiation of error msg did a leave!")); 1209 errmsg = NULL; 1210 ); 1211 1212 iAPICmdStatus = PVMFErrTimeout; 1213 if (iAPICmdErrMsg) 1214 { 1215 iAPICmdErrMsg->removeRef(); 1216 iAPICmdErrMsg = NULL; 1217 } 1218 iAPICmdErrMsg = errmsg; 1219 1220 // Timer is started after player start completes so initiate pause on player 1221 PVMFStatus retval = DoGFPlayerPause(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext()); 1222 if (retval == PVMFErrInvalidState) 1223 { 1224 // Playback already paused so GetFrame() command completed 1225 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 1226 1227 iAPICmdStatus = PVMFSuccess; 1228 if (iAPICmdErrMsg) 1229 { 1230 iAPICmdErrMsg->removeRef(); 1231 iAPICmdErrMsg = NULL; 1232 } 1233 } 1234 else if (retval != PVMFSuccess) 1235 { 1236 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::TimeoutOccurred() Pause on player failed. Report command as failed")); 1237 // Need to shutdown/restart player and cleanup in utility's AO 1238 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 1239 iErrorHandlingInUtilityAO = true; 1240 RunIfNotReady(); 1241 } 1242 } 1243 else 1244 { 1245 OSCL_ASSERT(false); 1246 } 1247 } 1248 1249 1250 PVCommandId PVFrameAndMetadataUtility::AddCommandToQueue(int32 aCmdType, OsclAny* aContextData, Oscl_Vector < PVFMUtilityCommandParamUnion, 1251 OsclMemAllocator > * aParamVector, const PVUuid* aUuid, bool aAPICommand) 1252 { 1253 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::AddCommandToQueue() In CmdType %d, CmdId %d", aCmdType, iCommandId)); 1254 1255 PVFMUtilityCommand cmd(aCmdType, iCommandId, aContextData, aParamVector, aAPICommand); 1256 if (aUuid) 1257 { 1258 cmd.SetUuid(*aUuid); 1259 } 1260 1261 int32 leavecode = 0; 1262 OSCL_TRY(leavecode, iPendingCmds.push(cmd)); 1263 OSCL_FIRST_CATCH_ANY(leavecode, 1264 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::AddCommandToQueue() Adding command to pending command list did a leave!")); 1265 OSCL_ASSERT(false); 1266 return -1;); 1267 1268 RunIfNotReady(); 1269 1270 ++iCommandId; 1271 if (iCommandId == 0x7FFFFFFF) 1272 { 1273 iCommandId = 0; 1274 } 1275 1276 1277 return cmd.GetCmdId(); 1278 } 1279 1280 1281 void PVFrameAndMetadataUtility::UtilityCommandCompleted(PVCommandId aId, OsclAny* aContext, PVMFStatus aStatus, 1282 PVInterface* aExtInterface, OsclAny* aEventData, int32 aEventDataSize) 1283 { 1284 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::UtilityCommandCompleted() In CmdId %d, Status %d", aId, aStatus)); 1285 1286 // Update the current command vector 1287 1288 // Assert if the current cmd is not saved or the cmd ID does not match 1289 OSCL_ASSERT(iCurrentCmd.size() == 1); 1290 OSCL_ASSERT(iCurrentCmd[0].GetCmdId() == aId); 1291 1292 // Empty out the current cmd vector and set active if there are other pending commands 1293 PVFMUtilityCommand completedcmd(iCurrentCmd[0]); 1294 iCurrentCmd.erase(iCurrentCmd.begin()); 1295 if (!iPendingCmds.empty()) 1296 { 1297 RunIfNotReady(); 1298 } 1299 1300 // Send the command completed event 1301 if (iCmdStatusObserver) 1302 { 1303 if (aId != -1 && completedcmd.IsAPICommand()) 1304 { 1305 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::UtilityCommandCompleted() Notifying utility command as completed. CmdId %d Status %d", aId, aStatus)); 1306 PVCmdResponse cmdcompleted(aId, aContext, aStatus, aExtInterface, aEventData, aEventDataSize); 1307 iCmdStatusObserver->CommandCompleted(cmdcompleted); 1308 } 1309 else 1310 { 1311 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::UtilityCommandCompleted() aId is -1 or not an API command. CmdType %d", completedcmd.GetCmdType())); 1312 } 1313 } 1314 else 1315 { 1316 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::UtilityCommandCompleted() iCmdStatusObserver is NULL")); 1317 } 1318 } 1319 1320 void PVFrameAndMetadataUtility::setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver) 1321 { 1322 OSCL_UNUSED_ARG(aObserver); 1323 OsclError::Leave(OsclErrNotSupported); 1324 } 1325 1326 PVMFStatus PVFrameAndMetadataUtility::getParametersSync(PvmiMIOSession aSession, PvmiKeyType aIdentifier, PvmiKvp*& aParameters, int& aNumParamElements, PvmiCapabilityContext aContext) 1327 { 1328 OSCL_UNUSED_ARG(aSession); 1329 OSCL_UNUSED_ARG(aIdentifier); 1330 OSCL_UNUSED_ARG(aParameters); 1331 OSCL_UNUSED_ARG(aNumParamElements); 1332 OSCL_UNUSED_ARG(aContext); 1333 1334 return PVMFErrNotSupported; 1335 } 1336 1337 PVMFStatus PVFrameAndMetadataUtility::releaseParameters(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements) 1338 { 1339 OSCL_UNUSED_ARG(aSession); 1340 OSCL_UNUSED_ARG(aParameters); 1341 OSCL_UNUSED_ARG(aNumElements); 1342 1343 return PVMFErrNotSupported; 1344 } 1345 1346 void PVFrameAndMetadataUtility::createContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext) 1347 { 1348 OSCL_UNUSED_ARG(aSession); 1349 OSCL_UNUSED_ARG(aContext); 1350 OsclError::Leave(OsclErrNotSupported); 1351 } 1352 1353 void PVFrameAndMetadataUtility::DeleteContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext) 1354 { 1355 OSCL_UNUSED_ARG(aSession); 1356 OSCL_UNUSED_ARG(aContext); 1357 } 1358 1359 void PVFrameAndMetadataUtility::setContextParameters(PvmiMIOSession aSession, PvmiCapabilityContext& aContext, PvmiKvp* aParameters, int aNumParamElements) 1360 { 1361 OSCL_UNUSED_ARG(aSession); 1362 OSCL_UNUSED_ARG(aParameters); 1363 OSCL_UNUSED_ARG(aNumParamElements); 1364 OSCL_UNUSED_ARG(aContext); 1365 } 1366 1367 PVMFCommandId PVFrameAndMetadataUtility::setParametersAsync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements, PvmiKvp*& aRetKVP, OsclAny* aContext) 1368 { 1369 OSCL_UNUSED_ARG(aSession); 1370 OSCL_UNUSED_ARG(aParameters); 1371 OSCL_UNUSED_ARG(aNumElements); 1372 OSCL_UNUSED_ARG(aRetKVP); 1373 OSCL_UNUSED_ARG(aContext); 1374 1375 return PVMFErrNotSupported; 1376 } 1377 1378 uint32 PVFrameAndMetadataUtility::getCapabilityMetric(PvmiMIOSession aSession) 1379 { 1380 OSCL_UNUSED_ARG(aSession); 1381 OsclError::Leave(OsclErrNotSupported); 1382 return 0; 1383 } 1384 1385 PVMFStatus PVFrameAndMetadataUtility::verifyParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements) 1386 { 1387 OSCL_UNUSED_ARG(aSession); 1388 OSCL_UNUSED_ARG(aParameters); 1389 OSCL_UNUSED_ARG(aNumElements); 1390 1391 return PVMFErrNotSupported; 1392 } 1393 1394 1395 void PVFrameAndMetadataUtility::SetUtilityState(PVFMUtilityState aState) 1396 { 1397 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::SetUtilityState() In Current state %d, New state %d", iState, aState)); 1398 iState = aState; 1399 } 1400 1401 1402 PVFrameAndMetadataState PVFrameAndMetadataUtility::GetUtilityState(void) 1403 { 1404 switch (iState) 1405 { 1406 case PVFM_UTILITY_STATE_IDLE: 1407 case PVFM_UTILITY_STATE_INITIALIZING: 1408 return PVFM_STATE_IDLE; 1409 1410 case PVFM_UTILITY_STATE_INITIALIZED: 1411 case PVFM_UTILITY_STATE_RESETTING: 1412 return PVFM_STATE_INITIALIZED; 1413 1414 case PVFM_UTILITY_STATE_HANDLINGERROR: 1415 case PVFM_UTILITY_STATE_ERROR: 1416 return PVFM_STATE_ERROR; 1417 1418 default: 1419 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::GetUtilityState() Unknown utility state. Asserting")); 1420 OSCL_ASSERT(false); 1421 break; 1422 } 1423 1424 return PVFM_STATE_ERROR; 1425 } 1426 1427 1428 void PVFrameAndMetadataUtility::DoCancelAllCommands(PVFMUtilityCommand& aCmd) 1429 { 1430 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoCancelAllCommands() In")); 1431 1432 // Utility cannot be processing another cancel command 1433 OSCL_ASSERT(iCmdToCancel.empty() == true); 1434 1435 // Cancel the current command first 1436 if (iCurrentCmd.size() == 1) 1437 { 1438 // First save the current command being processed 1439 iCmdToCancel.push_front(iCurrentCmd[0]); 1440 // Cancel it 1441 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), PVMFErrCancelled); 1442 } 1443 1444 // Cancel all the pending commands 1445 while (!iPendingCmds.empty()) 1446 { 1447 // Retrieve the pending command from queue so it can be cancelled 1448 PVFMUtilityCommand cmd(iPendingCmds.top()); 1449 iPendingCmds.pop(); 1450 // Save it temporary as "current command" and then cancel it 1451 iCurrentCmd.push_front(cmd); 1452 UtilityCommandCompleted(cmd.GetCmdId(), cmd.GetContext(), PVMFErrCancelled); 1453 } 1454 1455 // Make the CancelAllCommands() command the current command 1456 iCurrentCmd.push_front(aCmd); 1457 1458 // Check if there was an ongoing command that needs to be properly cancelled 1459 if (!iCmdToCancel.empty()) 1460 { 1461 // Properly cancel a command being currently processed 1462 DoCancelCommandBeingProcessed(); 1463 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoCancelAllCommands() Out")); 1464 } 1465 else 1466 { 1467 // CancelAllCommands() command is completed so send the completion event 1468 UtilityCommandCompleted(aCmd.GetCmdId(), aCmd.GetContext(), PVMFSuccess); 1469 } 1470 } 1471 1472 1473 void PVFrameAndMetadataUtility::DoCancelCommandBeingProcessed() 1474 { 1475 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoCancelCommandBeingProcessed() In")); 1476 1477 switch (iCmdToCancel[0].GetCmdType()) 1478 { 1479 case PVFM_UTILITY_COMMAND_QUERY_UUID: 1480 case PVFM_UTILITY_COMMAND_QUERY_INTERFACE: 1481 case PVFM_UTILITY_COMMAND_ADD_DATA_SOURCE: 1482 case PVFM_UTILITY_COMMAND_GET_METADATA_KEYS: 1483 case PVFM_UTILITY_COMMAND_GET_METADATA_VALUES: 1484 case PVFM_UTILITY_COMMAND_GET_FRAME_USER_BUFFER: 1485 case PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER: 1486 case PVFM_UTILITY_COMMAND_RETURN_BUFFER: 1487 case PVFM_UTILITY_COMMAND_REMOVE_DATA_SOURCE: 1488 if (iUtilityContext.iCmdType != -1) 1489 { 1490 // Player command needs to be cancelled 1491 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1492 (0, "PVFrameAndMetadataUtility::CancelAllCommands Called Tick=%d", OsclTickCount::TickCount())); 1493 int32 leavecode = 0; 1494 OSCL_TRY(leavecode, iPlayer->CancelAllCommands((const OsclAny*) &iCancelContext)); 1495 OSCL_FIRST_CATCH_ANY(leavecode, 1496 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoCancelCommandBeingProcessed() Cancel on player engine did a leave. Asserting")); 1497 OSCL_ASSERT(false); 1498 iCmdToCancel.clear(); 1499 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), PVMFSuccess)); 1500 } 1501 else 1502 { 1503 // No pending player command to cancel so complete the CancelAllCommands() 1504 iCmdToCancel.clear(); 1505 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), PVMFSuccess); 1506 } 1507 break; 1508 1509 case PVFM_UTILITY_COMMAND_GET_STATE: 1510 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoCancelCommandBeingProcessed() Should not need to cancel GetState() since it completes in one Run.")); 1511 // Complete the CancelAllCommands() 1512 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), PVMFSuccess); 1513 break; 1514 1515 case PVFM_UTILITY_COMMAND_CANCEL_ALL_COMMANDS: 1516 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoCancelCommandBeingProcessed() Cannot cancel a CancelAllCommands(). Asserting")); 1517 OSCL_ASSERT(false); 1518 // Complete the current CancelAllCommands() 1519 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), PVMFSuccess); 1520 break; 1521 1522 default: 1523 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoCancelCommandBeingProcessed() Unknown command to cancel. Asserting")); 1524 OSCL_ASSERT(false); 1525 // Complete the CancelAllCommands() 1526 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), PVMFSuccess); 1527 break; 1528 } 1529 1530 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoCancelCommandBeingProcessed() Out")); 1531 } 1532 1533 1534 PVMFStatus PVFrameAndMetadataUtility::DoQueryUUID(PVFMUtilityCommand& aCmd) 1535 { 1536 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoQueryUUID() In")); 1537 1538 PvmfMimeString* mimetype; 1539 Oscl_Vector<PVUuid, OsclMemAllocator> *uuidvec; 1540 bool exactmatch; 1541 1542 mimetype = (PvmfMimeString*)(aCmd.GetParam(0).pOsclAny_value); 1543 uuidvec = (Oscl_Vector<PVUuid, OsclMemAllocator>*)(aCmd.GetParam(1).pOsclAny_value); 1544 exactmatch = aCmd.GetParam(2).bool_value; 1545 1546 if (mimetype == NULL || uuidvec == NULL) 1547 { 1548 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoQueryUUID() Passed in parameter invalid.")); 1549 return PVMFErrArgument; 1550 } 1551 1552 // For now, no extension interface available from utility 1553 1554 // Call QueryUUID() on the player 1555 PVMFStatus cmdstatus = DoPlayerQueryUUID(aCmd.GetCmdId(), aCmd.GetContext(), *mimetype, *uuidvec, exactmatch); 1556 1557 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoQueryUUID() Out")); 1558 return cmdstatus; 1559 } 1560 1561 1562 PVMFStatus PVFrameAndMetadataUtility::DoPlayerQueryUUID(PVCommandId aCmdId, OsclAny* aCmdContext, 1563 PvmfMimeString& aMIMEType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUUIDVec, bool aExactMatch) 1564 { 1565 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerQueryUUID() In")); 1566 1567 iUtilityContext.iCmdId = aCmdId; 1568 iUtilityContext.iCmdContext = aCmdContext; 1569 iUtilityContext.iCmdType = PVFM_CMD_PlayerQueryUUID; 1570 int32 leavecode = 0; 1571 OSCL_ASSERT(iPlayer != NULL); 1572 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1573 (0, "PVFrameAndMetadataUtility::QueryUUID Called Tick=%d", OsclTickCount::TickCount())); 1574 OSCL_TRY(leavecode, iPlayer->QueryUUID(aMIMEType, aUUIDVec, aExactMatch, (const OsclAny*)&iUtilityContext)); 1575 OSCL_FIRST_CATCH_ANY(leavecode, 1576 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoPlayerQueryUUID() QueryUUID() on player did a leave!")); 1577 return PVMFFailure;); 1578 1579 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerQueryUUID() Out")); 1580 return PVMFSuccess; 1581 } 1582 1583 1584 PVMFStatus PVFrameAndMetadataUtility::DoQueryInterface(PVFMUtilityCommand& aCmd) 1585 { 1586 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoQueryInterface() In")); 1587 1588 PVInterface** ifptr = (PVInterface**)(aCmd.GetParam(0).pOsclAny_value); 1589 PVMFStatus cmdstatus = PVMFSuccess; 1590 1591 iPlayerQueryIFUUID = aCmd.GetUuid(); 1592 PVCommandId cmdid = aCmd.GetCmdId(); 1593 OsclAny* context = aCmd.GetContext(); 1594 1595 if (ifptr == NULL) 1596 { 1597 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoQueryInterface() Passed in parameter invalid.")); 1598 return PVMFErrArgument; 1599 } 1600 1601 if (queryInterface(iPlayerQueryIFUUID, *ifptr, cmdid, context) == false) 1602 { 1603 cmdstatus = PVMFErrNotSupported; 1604 } 1605 1606 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoQueryInterface() Out")); 1607 return cmdstatus; 1608 } 1609 1610 bool PVFrameAndMetadataUtility::queryInterface(const PVUuid& uuid, PVInterface*& iface, PVCommandId cmdid, OsclAny* context) 1611 { 1612 bool status = true; 1613 1614 if (uuid == PVMI_CAPABILITY_AND_CONFIG_PVUUID) 1615 { 1616 PvmiCapabilityAndConfig* capconfigiface = OSCL_STATIC_CAST(PvmiCapabilityAndConfig*, this); 1617 iface = OSCL_STATIC_CAST(PVInterface*, capconfigiface); 1618 1619 // Call QueryInterface() on the player too in case of usage using setParametersSync() 1620 PVMFStatus cmdstatus = DoPlayerQueryInterface(cmdid, context, iPlayerQueryIFUUID, iPlayerCapConfigIFPVI); 1621 1622 if (PVMFSuccess != cmdstatus) 1623 status = false; 1624 } 1625 else 1626 { 1627 // Call QueryInterface() on the player 1628 PVMFStatus cmdstatus = DoPlayerQueryInterface(cmdid, context, iPlayerQueryIFUUID, (PVInterface*&)iface); 1629 if (PVMFSuccess != cmdstatus) 1630 status = false; 1631 } 1632 return status; 1633 } 1634 1635 1636 PVMFStatus PVFrameAndMetadataUtility::DoPlayerQueryInterface(PVCommandId aCmdId, OsclAny* aCmdContext, PVUuid& aUuid, PVInterface*& aInterfacePtr) 1637 { 1638 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerQueryInterface() In")); 1639 1640 iUtilityContext.iCmdId = aCmdId; 1641 iUtilityContext.iCmdContext = aCmdContext; 1642 iUtilityContext.iCmdType = PVFM_CMD_PlayerQueryInterface; 1643 1644 if (aUuid == PVMI_CAPABILITY_AND_CONFIG_PVUUID) 1645 { 1646 iUtilityContext.iCmdType = PVFM_CMD_PlayerQueryCapConfigInterface; 1647 } 1648 int32 leavecode = 0; 1649 OSCL_ASSERT(iPlayer != NULL); 1650 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1651 (0, "PVFrameAndMetadataUtility::QueryInterface Called Tick=%d", OsclTickCount::TickCount())); 1652 OSCL_TRY(leavecode, iPlayer->QueryInterface(aUuid, aInterfacePtr, (const OsclAny*)&iUtilityContext)); 1653 OSCL_FIRST_CATCH_ANY(leavecode, 1654 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoPlayerQueryInterface() QueryInterface() on player did a leave!")); 1655 return PVMFFailure;); 1656 1657 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerQueryInterface() Out")); 1658 return PVMFSuccess; 1659 } 1660 1661 1662 PVMFStatus PVFrameAndMetadataUtility::DoGetState(PVFMUtilityCommand& aCmd, bool aSyncCmd) 1663 { 1664 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGetState() In")); 1665 1666 PVFrameAndMetadataState* state = (PVFrameAndMetadataState*)(aCmd.GetParam(0).pOsclAny_value); 1667 if (state == NULL) 1668 { 1669 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetState() Passed in parameter invalid.")); 1670 return PVMFErrArgument; 1671 } 1672 1673 // Get current utility state using internal function 1674 *state = GetUtilityState(); 1675 1676 if (!aSyncCmd) 1677 { 1678 UtilityCommandCompleted(aCmd.GetCmdId(), aCmd.GetContext(), PVMFSuccess); 1679 } 1680 1681 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGetState() Out")); 1682 return PVMFSuccess; 1683 } 1684 1685 1686 PVMFStatus PVFrameAndMetadataUtility::DoAddDataSource(PVFMUtilityCommand& aCmd) 1687 { 1688 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoAddDataSource() In")); 1689 1690 if (GetUtilityState() != PVFM_STATE_IDLE) 1691 { 1692 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoAddDataSource() Wrong state")); 1693 return PVMFErrInvalidState; 1694 } 1695 1696 if (aCmd.GetParam(0).pOsclAny_value == NULL) 1697 { 1698 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoAddDataSource() Passed in parameter invalid.")); 1699 return PVMFErrArgument; 1700 } 1701 1702 // Save the data source 1703 iDataSource = (PVPlayerDataSource*)(aCmd.GetParam(0).pOsclAny_value); 1704 1705 // Initiate the player setup sequence 1706 PVMFStatus cmdstatus = DoADSPlayerAddDataSource(aCmd.GetCmdId(), aCmd.GetContext()); 1707 1708 1709 if (cmdstatus == PVMFSuccess) 1710 { 1711 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZING); 1712 } 1713 1714 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoAddDataSource() Out")); 1715 return cmdstatus; 1716 } 1717 1718 1719 PVMFStatus PVFrameAndMetadataUtility::DoADSPlayerAddDataSource(PVCommandId aCmdId, OsclAny* aCmdContext) 1720 { 1721 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddDataSource() In")); 1722 1723 iUtilityContext.iCmdId = aCmdId; 1724 iUtilityContext.iCmdContext = aCmdContext; 1725 iUtilityContext.iCmdType = PVFM_CMD_ADSPlayerAddDataSource; 1726 int32 leavecode = 0; 1727 1728 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1729 (0, "PVFrameAndMetadataUtility::PlayerADS called Tick=%d", OsclTickCount::TickCount())); 1730 1731 OSCL_TRY(leavecode, iPlayer->AddDataSource(*iDataSource, (const OsclAny*)&iUtilityContext)); 1732 OSCL_FIRST_CATCH_ANY(leavecode, 1733 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddDataSource() AddDataSource() on player did a leave!")); 1734 return PVMFFailure;); 1735 1736 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddDataSource() Out")); 1737 return PVMFSuccess; 1738 } 1739 1740 1741 PVMFStatus PVFrameAndMetadataUtility::DoADSPlayerInit(PVCommandId aCmdId, OsclAny* aCmdContext) 1742 { 1743 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerInit() In")); 1744 1745 iUtilityContext.iCmdId = aCmdId; 1746 iUtilityContext.iCmdContext = aCmdContext; 1747 iUtilityContext.iCmdType = PVFM_CMD_ADSPlayerInit; 1748 int32 leavecode = 0; 1749 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1750 (0, "PVFrameAndMetadataUtility::PlayerInit() called Tick=%d", OsclTickCount::TickCount())); 1751 OSCL_TRY(leavecode, iPlayer->Init((const OsclAny*)&iUtilityContext)); 1752 OSCL_FIRST_CATCH_ANY(leavecode, 1753 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerInit() Init() on player did a leave!")); 1754 return PVMFFailure;); 1755 1756 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerInit() Out")); 1757 return PVMFSuccess; 1758 } 1759 1760 1761 PVMFStatus PVFrameAndMetadataUtility::DoADSPlayerAddVideoDataSink(PVCommandId aCmdId, OsclAny* aCmdContext) 1762 { 1763 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddVideoDataSink() In")); 1764 1765 int32 leavecode = 0; 1766 OSCL_TRY(leavecode, iVideoMIO = OSCL_NEW(PVFMVideoMIO, ()); 1767 iVideoNode = PVMediaOutputNodeFactory::CreateMediaOutputNode(iVideoMIO)); 1768 OSCL_FIRST_CATCH_ANY(leavecode, 1769 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddVideoDataSink() Instantiation of MIO component and node for frame retrieval did a leave!")); 1770 return PVMFErrNoMemory; 1771 ); 1772 iVideoDataSink.SetDataSinkNode(iVideoNode); 1773 iVideoDataSink.SetDataSinkFormatType(PVMF_MIME_YUV420); 1774 iVideoMIO->setThumbnailDimensions(iThumbnailWidth, iThumbnailHeight); 1775 1776 iUtilityContext.iCmdId = aCmdId; 1777 iUtilityContext.iCmdContext = aCmdContext; 1778 iUtilityContext.iCmdType = PVFM_CMD_ADSPlayerAddVideoDataSink; 1779 1780 leavecode = 0; 1781 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1782 (0, "PVFrameAndMetadataUtility::PlayerAddVideoSink Called Tick=%d", OsclTickCount::TickCount())); 1783 1784 OSCL_TRY(leavecode, iPlayer->AddDataSink(iVideoDataSink, (const OsclAny*)&iUtilityContext)); 1785 OSCL_FIRST_CATCH_ANY(leavecode, 1786 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddVideoDataSink() AddDataSink() on player did a leave!")); 1787 return PVMFFailure;); 1788 1789 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddVideoDataSink() Out")); 1790 return PVMFSuccess; 1791 } 1792 1793 PVMFStatus PVFrameAndMetadataUtility::DoADSPlayerAddAudioDataSink(PVCommandId aCmdId, OsclAny* aCmdContext) 1794 { 1795 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddAudioDataSink() In")); 1796 1797 int32 leavecode = 0; 1798 OSCL_TRY(leavecode, iAudioMIO = OSCL_NEW(PVFMAudioMIO, ()); 1799 iAudioNode = PVMediaOutputNodeFactory::CreateMediaOutputNode(iAudioMIO)); 1800 OSCL_FIRST_CATCH_ANY(leavecode, 1801 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddAudioDataSink() Instantiation of Audio MIO component and node for frame retrieval did a leave!")); 1802 return PVMFErrNoMemory; 1803 ); 1804 iAudioDataSink.SetDataSinkNode(iAudioNode); 1805 iAudioDataSink.SetDataSinkFormatType(PVMF_MIME_PCM16); 1806 1807 iUtilityContext.iCmdId = aCmdId; 1808 iUtilityContext.iCmdContext = aCmdContext; 1809 iUtilityContext.iCmdType = PVFM_CMD_ADSPlayerAddAudioDataSink; 1810 1811 leavecode = 0; 1812 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1813 (0, "PVFrameAndMetadataUtility::PlayerAddAudioSink Called Tick=%d", OsclTickCount::TickCount())); 1814 OSCL_TRY(leavecode, iPlayer->AddDataSink(iAudioDataSink, (const OsclAny*)&iUtilityContext)); 1815 OSCL_FIRST_CATCH_ANY(leavecode, 1816 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddAudioDataSink() AddDataSink() on player did a leave!")); 1817 return PVMFFailure;); 1818 1819 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerAddAudioDataSink() Out")); 1820 return PVMFSuccess; 1821 } 1822 1823 PVMFStatus PVFrameAndMetadataUtility::DoADSPlayerPrepare(PVCommandId aCmdId, OsclAny* aCmdContext) 1824 { 1825 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerPrepare() In")); 1826 1827 iUtilityContext.iCmdId = aCmdId; 1828 iUtilityContext.iCmdContext = aCmdContext; 1829 iUtilityContext.iCmdType = PVFM_CMD_ADSPlayerPrepare; 1830 int32 leavecode = 0; 1831 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1832 (0, "PVFrameAndMetadataUtility::PlayerPrepare Called Tick=%d", OsclTickCount::TickCount())); 1833 OSCL_TRY(leavecode, iPlayer->Prepare((const OsclAny*)&iUtilityContext)); 1834 OSCL_FIRST_CATCH_ANY(leavecode, 1835 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerPrepare() Prepare() on player did a leave!")); 1836 return PVMFFailure;); 1837 1838 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerPrepare() Out")); 1839 return PVMFSuccess; 1840 } 1841 1842 1843 PVMFStatus PVFrameAndMetadataUtility::DoADSPlayerStart(PVCommandId aCmdId, OsclAny* aCmdContext) 1844 { 1845 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerStart() In")); 1846 1847 iUtilityContext.iCmdId = aCmdId; 1848 iUtilityContext.iCmdContext = aCmdContext; 1849 iUtilityContext.iCmdType = PVFM_CMD_ADSPlayerStart; 1850 int32 leavecode = 0; 1851 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1852 (0, "PVFrameAndMetadataUtility::PlayerStart Called Tick=%d", OsclTickCount::TickCount())); 1853 OSCL_TRY(leavecode, iPlayer->Start((const OsclAny*)&iUtilityContext)); 1854 OSCL_FIRST_CATCH_ANY(leavecode, 1855 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerStart() Start() on player did a leave!")); 1856 return PVMFFailure;); 1857 1858 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerStart() Out")); 1859 return PVMFSuccess; 1860 } 1861 1862 1863 PVMFStatus PVFrameAndMetadataUtility::DoADSPlayerPause(PVCommandId aCmdId, OsclAny* aCmdContext) 1864 { 1865 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerPause() In")); 1866 1867 iUtilityContext.iCmdId = aCmdId; 1868 iUtilityContext.iCmdContext = aCmdContext; 1869 iUtilityContext.iCmdType = PVFM_CMD_ADSPlayerPause; 1870 int32 leavecode = 0; 1871 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1872 (0, "PVFrameAndMetadataUtility::PlayerPause Called Tick=%d", OsclTickCount::TickCount())); 1873 OSCL_TRY(leavecode, iPlayer->Pause((const OsclAny*)&iUtilityContext)); 1874 OSCL_FIRST_CATCH_ANY(leavecode, 1875 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoADSPlayerPause() Pause() on player did a leave!")); 1876 return PVMFFailure;); 1877 1878 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoADSPlayerPause() Out")); 1879 return PVMFSuccess; 1880 } 1881 1882 1883 PVMFStatus PVFrameAndMetadataUtility::DoGetMetadataKeys(PVFMUtilityCommand& aCmd) 1884 { 1885 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGetMetadataKeys() In")); 1886 1887 if (GetUtilityState() == PVFM_STATE_IDLE || GetUtilityState() == PVFM_STATE_ERROR) 1888 { 1889 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetMetadataKeys() Wrong state.")); 1890 return PVMFErrInvalidState; 1891 } 1892 1893 PVPMetadataList* keylist = (PVPMetadataList*)(aCmd.GetParam(0).pOsclAny_value); 1894 int32 startingkeyindex = aCmd.GetParam(1).int32_value; 1895 int32 maxkeyentries = aCmd.GetParam(2).int32_value; 1896 char* querykey = aCmd.GetParam(3).pChar_value; 1897 1898 if (keylist == NULL) 1899 { 1900 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetMetadataKeys() Passed in parameter invalid.")); 1901 return PVMFErrArgument; 1902 } 1903 1904 if (maxkeyentries < -1 || maxkeyentries == 0 || startingkeyindex < 0) 1905 { 1906 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetMetadataKeys() Passed in parameter invalid.")); 1907 return PVMFErrArgument; 1908 } 1909 1910 // Call player engine API to retrieve metadata keys 1911 PVMFStatus cmdstatus = DoPlayerGetMetadataKeys(aCmd.GetCmdId(), aCmd.GetContext(), *keylist, startingkeyindex, maxkeyentries, querykey); 1912 1913 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGetMetadataKeys() Out")); 1914 return cmdstatus; 1915 } 1916 1917 1918 PVMFStatus PVFrameAndMetadataUtility::DoPlayerGetMetadataKeys(PVCommandId aCmdId, OsclAny* aCmdContext, 1919 PVPMetadataList& aKeyList, int32 aStartingIndex, int32 aMaxEntries, char* aQueryKey) 1920 { 1921 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerGetMetadataKeys() In")); 1922 1923 iUtilityContext.iCmdId = aCmdId; 1924 iUtilityContext.iCmdContext = aCmdContext; 1925 iUtilityContext.iCmdType = PVFM_CMD_PlayerGetMetadataKeys; 1926 int32 leavecode = 0; 1927 OSCL_ASSERT(iPlayer != NULL); 1928 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1929 (0, "PVFrameAndMetadataUtility::PlayerGetMetaDataKeys Called Tick=%d", OsclTickCount::TickCount())); 1930 OSCL_TRY(leavecode, iPlayer->GetMetadataKeys(aKeyList, aStartingIndex, aMaxEntries, aQueryKey, (const OsclAny*)&iUtilityContext)); 1931 OSCL_FIRST_CATCH_ANY(leavecode, 1932 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoPlayerGetMetadataKeys() GetMetadataKeys() on player did a leave!")); 1933 return PVMFFailure;); 1934 1935 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerGetMetadataKeys() Out")); 1936 return PVMFSuccess; 1937 } 1938 1939 1940 PVMFStatus PVFrameAndMetadataUtility::DoGetMetadataValues(PVFMUtilityCommand& aCmd) 1941 { 1942 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGetMetadataValues() In")); 1943 1944 if (GetUtilityState() == PVFM_STATE_IDLE || GetUtilityState() == PVFM_STATE_ERROR) 1945 { 1946 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetMetadataValues() Wrong state")); 1947 return PVMFErrInvalidState; 1948 } 1949 1950 PVPMetadataList* keylist = (PVPMetadataList*)(aCmd.GetParam(0).pOsclAny_value); 1951 int32 startingvalueindex = aCmd.GetParam(1).int32_value; 1952 int32 maxvalueentries = aCmd.GetParam(2).int32_value; 1953 int32* numavailablevalues = (int32*)(aCmd.GetParam(3).pOsclAny_value); 1954 Oscl_Vector<PvmiKvp, OsclMemAllocator>* valuelist = (Oscl_Vector<PvmiKvp, OsclMemAllocator>*)(aCmd.GetParam(4).pOsclAny_value); 1955 1956 if (keylist == NULL || valuelist == NULL || numavailablevalues == NULL) 1957 { 1958 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetMetadataValues() Passed in parameter invalid.")); 1959 return PVMFErrArgument; 1960 } 1961 1962 if (maxvalueentries < -1 || maxvalueentries == 0 || startingvalueindex < 0) 1963 { 1964 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetMetadataValues() Passed in parameter invalid.")); 1965 return PVMFErrArgument; 1966 } 1967 1968 // Call the player engine API to retrieve metadata values 1969 PVMFStatus cmdstatus = DoPlayerGetMetadataValues(aCmd.GetCmdId(), aCmd.GetContext(), *keylist, startingvalueindex, maxvalueentries, *numavailablevalues, *valuelist); 1970 1971 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGetMetadataValues() Out")); 1972 return cmdstatus; 1973 } 1974 1975 1976 PVMFStatus PVFrameAndMetadataUtility::DoPlayerGetMetadataValues(PVCommandId aCmdId, OsclAny* aCmdContext, 1977 PVPMetadataList& aKeyList, int32 aStartingValueIndex, int32 aMaxValueEntries, 1978 int32& aNumAvailableValueEntries, Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList) 1979 { 1980 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerGetMetadataValues() In")); 1981 1982 iUtilityContext.iCmdId = aCmdId; 1983 iUtilityContext.iCmdContext = aCmdContext; 1984 iUtilityContext.iCmdType = PVFM_CMD_PlayerGetMetadataValues; 1985 int32 leavecode = 0; 1986 OSCL_ASSERT(iPlayer != NULL); 1987 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 1988 (0, "PVFrameAndMetadataUtility::PlayerGetMetaDataValues Called Tick=%d", OsclTickCount::TickCount())); 1989 OSCL_TRY(leavecode, iPlayer->GetMetadataValues(aKeyList, aStartingValueIndex, aMaxValueEntries, aNumAvailableValueEntries, aValueList, (const OsclAny*)&iUtilityContext)); 1990 OSCL_FIRST_CATCH_ANY(leavecode, 1991 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoPlayerGetMetadataValues() GetMetadataValues() on player did a leave!")); 1992 return PVMFFailure;); 1993 1994 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerGetMetadataValues() Out")); 1995 return PVMFSuccess; 1996 } 1997 1998 PVMFStatus PVFrameAndMetadataUtility::DoCapConfigSetParameters(PVFMUtilityCommand& aCmd, bool aSyncCmd) 1999 { 2000 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoCapConfigSetParameters() In")); 2001 2002 PvmiKvp* paramkvp; 2003 int32 numparam; 2004 PvmiKvp** retkvp; 2005 paramkvp = (PvmiKvp*)(aCmd.GetParam(0).pOsclAny_value); 2006 numparam = aCmd.GetParam(1).int32_value; 2007 retkvp = (PvmiKvp**)(aCmd.GetParam(2).pOsclAny_value); 2008 2009 if (paramkvp == NULL || retkvp == NULL || numparam < 1) 2010 { 2011 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoCapConfigSetParameters() Passed in parameter invalid")); 2012 return PVMFErrArgument; 2013 } 2014 2015 // Go through each parameter 2016 for (int32 paramind = 0; paramind < numparam; ++paramind) 2017 { 2018 // Count the number of components and parameters in the key 2019 int compcount = pv_mime_string_compcnt(paramkvp[paramind].key); 2020 // Retrieve the first component from the key string 2021 char* compstr = NULL; 2022 pv_mime_string_extract_type(0, paramkvp[paramind].key, compstr); 2023 2024 if ((pv_mime_strcmp(compstr, _STRLIT_CHAR("x-pvmf")) < 0) || compcount < 2) 2025 { 2026 // First component should be "x-pvmf" and there must 2027 // be at least two components to go past x-pvmf 2028 *retkvp = ¶mkvp[paramind]; 2029 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoCapConfigSetParameters() Unsupported key")); 2030 return PVMFErrArgument; 2031 } 2032 2033 // Retrieve the second component from the key string 2034 pv_mime_string_extract_type(1, paramkvp[paramind].key, compstr); 2035 2036 // First check if it is key string for fmu ("fmu") 2037 if (pv_mime_strcmp(compstr, _STRLIT_CHAR("fmu")) >= 0) 2038 { 2039 if (compcount == 3) 2040 { 2041 // Verify and set the passed-in fmu setting 2042 PVMFStatus retval = DoVerifyAndSetFMUParameter(paramkvp[paramind], true); 2043 if (retval != PVMFSuccess) 2044 { 2045 *retkvp = ¶mkvp[paramind]; 2046 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoCapConfigSetParameters() Setting parameter %d failed", paramind)); 2047 return retval; 2048 } 2049 } 2050 else 2051 { 2052 // Do not support other keys right now 2053 *retkvp = ¶mkvp[paramind]; 2054 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoCapConfigSetParameters() Unsupported key")); 2055 return PVMFErrArgument; 2056 } 2057 } 2058 else 2059 { 2060 PVMFStatus cmdstatus = DoPlayerSetParametersSync(aCmd.GetCmdId(), aCmd.GetContext(), paramkvp, numparam, *retkvp); 2061 if (PVMFSuccess != cmdstatus) 2062 { 2063 return cmdstatus; 2064 } 2065 } 2066 } 2067 2068 if (!aSyncCmd) 2069 { 2070 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoCapConfigSetParameters() - Queuing up CommandComplete for a ASync command")); 2071 UtilityCommandCompleted(aCmd.GetCmdId(), aCmd.GetContext(), PVMFSuccess); 2072 } 2073 2074 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoCapConfigSetParameters() Out")); 2075 return PVMFSuccess; 2076 } 2077 2078 PVMFStatus PVFrameAndMetadataUtility::DoPlayerSetParametersSync(PVCommandId aCmdId, OsclAny* aCmdContext, PvmiKvp* aParameters, int aNumElements, PvmiKvp* &aRetKVP) 2079 { 2080 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerSetParameterSync() In")); 2081 2082 iUtilityContext.iCmdId = aCmdId; 2083 iUtilityContext.iCmdContext = aCmdContext; 2084 iUtilityContext.iCmdType = PVFM_CMD_PlayerSetParametersSync; 2085 int32 leavecode = 0; 2086 OSCL_ASSERT(iPlayerCapConfigIF != NULL); 2087 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2088 (0, "PVFrameAndMetadataUtility::Player setParametersSync Called Tick=%d", OsclTickCount::TickCount())); 2089 OSCL_TRY(leavecode, iPlayerCapConfigIF->setParametersSync(NULL, aParameters, aNumElements, aRetKVP)); 2090 OSCL_FIRST_CATCH_ANY(leavecode, 2091 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoPlayerQueryInterface() QueryInterface() on player did a leave!")); 2092 return PVMFFailure;); 2093 2094 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerSetParameterSync() Out")); 2095 return PVMFSuccess; 2096 } 2097 2098 2099 PVMFStatus PVFrameAndMetadataUtility::DoVerifyAndSetFMUParameter(PvmiKvp& aParameter, bool aSetParam) 2100 { 2101 OSCL_UNUSED_ARG(aSetParam); 2102 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoVerifyAndSetFMUParameter() In")); 2103 2104 PVMFStatus status = PVMFErrNotSupported; 2105 // Retrieve the third component from the key string 2106 char* compstr = NULL; 2107 pv_mime_string_extract_type(2, aParameter.key, compstr); 2108 2109 // Check if it is key string "timeout" 2110 if (pv_mime_strcmp(compstr, _STRLIT_CHAR("timeout")) >= 0) 2111 { 2112 if (oscl_strncmp(aParameter.key, PVFMUTIL_FRAMERETRIEVAL_TIMEOUT_KEY, oscl_strlen(PVFMUTIL_FRAMERETRIEVAL_TIMEOUT_KEY)) == 0) 2113 { 2114 iFrameReadyWaitTime = aParameter.value.uint32_value; 2115 status = PVMFSuccess; 2116 } 2117 // Possible addition: Error handling timeout 2118 } 2119 2120 return status; 2121 } 2122 bool PVFrameAndMetadataUtility::HasVideo() 2123 { 2124 //Query the MIO component for it's video format. If the format 2125 //is "unknown" then it's very likely the clip has no video. 2126 bool hasVideo = false; 2127 if (iVideoMIO) 2128 { 2129 PvmiKvp* kvp = NULL; 2130 int32 count = 0; 2131 OSCL_HeapString<OsclMemAllocator> str; 2132 str = MOUT_VIDEO_FORMAT_KEY; 2133 if (iVideoMIO->getParametersSync(0, (char*)str.get_cstr(), kvp, count, NULL) == PVMFSuccess) 2134 { 2135 if (kvp 2136 && kvp->value.pChar_value) 2137 { 2138 str = kvp->value.pChar_value; 2139 if (!(str == PVMF_MIME_FORMAT_UNKNOWN)) 2140 hasVideo = true; 2141 } 2142 iVideoMIO->releaseParameters(0, kvp, count); 2143 } 2144 } 2145 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HasVideo() %d", hasVideo)); 2146 return hasVideo; 2147 } 2148 2149 2150 PVMFStatus PVFrameAndMetadataUtility::DoGetFrame(PVFMUtilityCommand& aCmd) 2151 { 2152 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGetFrame() In")); 2153 2154 /* 2155 GetFrame can be called only when UI sets the correct mode either 2156 PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_AND_THUMBNAIL or PV_FRAME_METADATA_INTERFACE_MODE_ALL 2157 */ 2158 if (iMode == PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_ONLY) 2159 { 2160 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetFrame() called in wrong mode (%d)", iMode)); 2161 return PVMFErrArgument; 2162 } 2163 int32 leavecode = 0; 2164 2165 // Retrieve the requested video frame 2166 uint8* userframebuffer = NULL; 2167 uint8** utilityframebuffer = NULL; 2168 2169 iVideoFrameSelector = (PVFrameSelector*)(aCmd.GetParam(0).pOsclAny_value); 2170 iVideoFrameBufferSize = aCmd.GetParam(2).pUint32_value; 2171 iVideoFrameBufferProp = (PVFrameBufferProperty*)(aCmd.GetParam(3).pOsclAny_value); 2172 2173 if (iVideoFrameSelector == NULL || iVideoFrameBufferProp == NULL || iVideoFrameBufferSize == NULL) 2174 { 2175 return PVMFErrArgument; 2176 } 2177 2178 // Validate the frame selection mode 2179 if (iVideoFrameSelector->iSelectionMethod != PVFrameSelector::SPECIFIC_FRAME && 2180 iVideoFrameSelector->iSelectionMethod != PVFrameSelector::TIMESTAMP) 2181 { 2182 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetFrame() Unsupported frame selection method.")); 2183 return PVMFErrNotSupported; 2184 } 2185 2186 if (aCmd.GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER) 2187 { 2188 utilityframebuffer = (uint8**)(aCmd.GetParam(1).pOsclAny_value); 2189 if (utilityframebuffer == NULL) 2190 { 2191 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetFrame() Passed in parameter invalid.")); 2192 return PVMFErrArgument; 2193 } 2194 2195 // Create the memory pool for the video frame buffer if not created yet 2196 if (iVideoFrameBufferMemPool == NULL) 2197 { 2198 leavecode = 0; 2199 OSCL_TRY(leavecode, iVideoFrameBufferMemPool = OSCL_NEW(OsclMemPoolResizableAllocator, (PVFMUTIL_VIDEOFRAMEBUFFER_MEMPOOL_BUFFERSIZE))); 2200 OSCL_FIRST_CATCH_ANY(leavecode, 2201 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetFrame() Memory pool for video frame buffer could not be instantiated.")); 2202 return PVMFErrNoMemory; 2203 ); 2204 } 2205 2206 // Allocate video buffer from memory pool 2207 leavecode = 0; 2208 OSCL_TRY(leavecode, *utilityframebuffer = (uint8*)(iVideoFrameBufferMemPool->allocate(PVFMUTIL_VIDEOFRAMEBUFFER_MAXSIZE))); 2209 OSCL_FIRST_CATCH_ANY(leavecode, 2210 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetFrame() Memory pool for video frame buffer could not be instantiated.")); 2211 return PVMFErrNoMemory; 2212 ); 2213 2214 *iVideoFrameBufferSize = PVFMUTIL_VIDEOFRAMEBUFFER_MAXSIZE; 2215 iCurrentVideoFrameBuffer = *utilityframebuffer; 2216 } 2217 else 2218 { 2219 userframebuffer = aCmd.GetParam(1).pUint8_value; 2220 if (userframebuffer == NULL || *iVideoFrameBufferSize == 0) 2221 { 2222 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetFrame() Passed in parameter invalid.")); 2223 return PVMFErrArgument; 2224 } 2225 2226 iCurrentVideoFrameBuffer = userframebuffer; 2227 } 2228 2229 PVPlayerState playerstate; 2230 PVMFStatus retval = iPlayer->GetPVPlayerStateSync(playerstate); 2231 if (retval == PVMFSuccess) 2232 { 2233 if (playerstate == PVP_STATE_INITIALIZED) 2234 { 2235 // Start playback 2236 retval = DoGFPlayerPrepare(aCmd.GetCmdId(), aCmd.GetContext()); 2237 } 2238 else if (playerstate == PVP_STATE_PAUSED) 2239 { 2240 if (!HasVideo()) 2241 { 2242 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGetFrame() No video present")); 2243 return PVMFFailure; 2244 } 2245 // Stop first to return to initialized state 2246 retval = DoGFPlayerStopFromPaused(aCmd.GetCmdId(), aCmd.GetContext()); 2247 } 2248 else 2249 { 2250 // Player engine should not be in any other state 2251 // Report as underlying resource error 2252 OSCL_ASSERT(false); 2253 retval = PVMFErrResource; 2254 } 2255 } 2256 2257 if (retval != PVMFSuccess && aCmd.GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 2258 { 2259 // Return the buffer if allocated from utility's mempool 2260 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 2261 } 2262 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGetFrame() Out")); 2263 return retval; 2264 } 2265 2266 2267 PVMFStatus PVFrameAndMetadataUtility::DoGFPlayerStopFromPaused(PVCommandId aCmdId, OsclAny* aCmdContext) 2268 { 2269 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerStopFromPaused() In")); 2270 2271 iUtilityContext.iCmdId = aCmdId; 2272 iUtilityContext.iCmdContext = aCmdContext; 2273 iUtilityContext.iCmdType = PVFM_CMD_GFPlayerStopFromPaused; 2274 int32 leavecode = 0; 2275 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2276 (0, "PVFrameAndMetadataUtility::PlayerStop Called Tick=%d", OsclTickCount::TickCount())); 2277 OSCL_TRY(leavecode, iPlayer->Stop((const OsclAny*)&iUtilityContext)); 2278 OSCL_FIRST_CATCH_ANY(leavecode, 2279 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGFPlayerStopFromPaused() Stop() on player did a leave!")); 2280 return PVMFFailure;); 2281 2282 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerStopFromPaused() Out")); 2283 return PVMFSuccess; 2284 } 2285 2286 2287 PVMFStatus PVFrameAndMetadataUtility::DoGFPlayerPrepare(PVCommandId aCmdId, OsclAny* aCmdContext) 2288 { 2289 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerPrepare() In")); 2290 2291 // Assert if the frame retrieval variables are not set yet 2292 OSCL_ASSERT(iVideoFrameSelector != NULL); 2293 OSCL_ASSERT(iCurrentVideoFrameBuffer != NULL); 2294 OSCL_ASSERT(iVideoFrameBufferSize != NULL); 2295 OSCL_ASSERT(*iVideoFrameBufferSize > 0); 2296 2297 // Reset the flag for frame received 2298 iFrameReceived = false; 2299 2300 PVMFStatus retval; 2301 if (iVideoFrameSelector->iSelectionMethod == PVFrameSelector::SPECIFIC_FRAME) 2302 { 2303 // Request the frame retrieval video MIO to retrieve the specified frame 2304 retval = iVideoMIO->GetFrameByFrameNumber(iVideoFrameSelector->iFrameInfo.iFrameIndex, iCurrentVideoFrameBuffer, *iVideoFrameBufferSize, iOutputFormatType, *this); 2305 } 2306 else if (iVideoFrameSelector->iSelectionMethod == PVFrameSelector::TIMESTAMP) 2307 { 2308 // Request the frame retrieval video MIO to retrieve the specified timestamp 2309 retval = iVideoMIO->GetFrameByTimeoffset(iVideoFrameSelector->iFrameInfo.iTimeOffsetMilliSec, iCurrentVideoFrameBuffer, *iVideoFrameBufferSize, iOutputFormatType, *this); 2310 } 2311 else 2312 { 2313 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGFPlayerPrepare() Unsupported frame selection method.")); 2314 retval = PVMFErrNotSupported; 2315 } 2316 2317 if (retval != PVMFPending) 2318 { 2319 OSCL_ASSERT(retval != PVMFSuccess); 2320 return retval; 2321 } 2322 2323 iUtilityContext.iCmdId = aCmdId; 2324 iUtilityContext.iCmdContext = aCmdContext; 2325 iUtilityContext.iCmdType = PVFM_CMD_GFPlayerPrepare; 2326 int32 leavecode = 0; 2327 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2328 (0, "PVFrameAndMetadataUtility::PlayerPrepare Called Tick=%d", OsclTickCount::TickCount())); 2329 OSCL_TRY(leavecode, iPlayer->Prepare((const OsclAny*)&iUtilityContext)); 2330 OSCL_FIRST_CATCH_ANY(leavecode, 2331 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGFPlayerPrepare() Prepare() on player did a leave!")); 2332 return PVMFFailure;); 2333 2334 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerPrepare() Out")); 2335 return PVMFSuccess; 2336 } 2337 2338 2339 PVMFStatus PVFrameAndMetadataUtility::DoGFPlayerStart(PVCommandId aCmdId, OsclAny* aCmdContext) 2340 { 2341 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerStart() In")); 2342 2343 iUtilityContext.iCmdId = aCmdId; 2344 iUtilityContext.iCmdContext = aCmdContext; 2345 iUtilityContext.iCmdType = PVFM_CMD_GFPlayerStart; 2346 int32 leavecode = 0; 2347 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2348 (0, "PVFrameAndMetadataUtility::PlayerStart Called Tick=%d", OsclTickCount::TickCount())); 2349 OSCL_TRY(leavecode, iPlayer->Start((const OsclAny*)&iUtilityContext)); 2350 OSCL_FIRST_CATCH_ANY(leavecode, 2351 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGFPlayerStart() Start() on player did a leave!")); 2352 return PVMFFailure;); 2353 2354 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerStart() Out")); 2355 return PVMFSuccess; 2356 } 2357 2358 2359 PVMFStatus PVFrameAndMetadataUtility::DoGFPlayerPause(PVCommandId aCmdId, OsclAny* aCmdContext) 2360 { 2361 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerPause() In")); 2362 2363 PVPlayerState playerstate; 2364 PVMFStatus retval = iPlayer->GetPVPlayerStateSync(playerstate); 2365 if (retval == PVMFSuccess && playerstate == PVP_STATE_PAUSED) 2366 { 2367 // Player is already in paused state (due to EOS?) 2368 // so need to pause playback 2369 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerPause() Playback already paused")); 2370 return PVMFErrInvalidState; 2371 } 2372 2373 iUtilityContext.iCmdId = aCmdId; 2374 iUtilityContext.iCmdContext = aCmdContext; 2375 iUtilityContext.iCmdType = PVFM_CMD_GFPlayerPause; 2376 int32 leavecode = 0; 2377 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2378 (0, "PVFrameAndMetadataUtility::PlayerPause Called Tick=%d", OsclTickCount::TickCount())); 2379 OSCL_TRY(leavecode, iPlayer->Pause((const OsclAny*)&iUtilityContext)); 2380 OSCL_FIRST_CATCH_ANY(leavecode, 2381 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoGFPlayerPause() Pause() on player did a leave!")); 2382 return PVMFFailure;); 2383 2384 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoGFPlayerPause() Out")); 2385 return PVMFSuccess; 2386 } 2387 2388 2389 PVMFStatus PVFrameAndMetadataUtility::DoReturnBuffer(PVFMUtilityCommand& aCmd) 2390 { 2391 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoReturnBuffer() In")); 2392 2393 uint8* retbuffer = NULL; 2394 retbuffer = aCmd.GetParam(0).pUint8_value; 2395 if (retbuffer == NULL) 2396 { 2397 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoReturnBuffer() Specified buffer is NULL")); 2398 return PVMFErrArgument; 2399 } 2400 2401 // Return the video frame buffer 2402 int32 leavecode = 0; 2403 OSCL_TRY(leavecode, iVideoFrameBufferMemPool->deallocate((OsclAny*)retbuffer)); 2404 OSCL_FIRST_CATCH_ANY(leavecode, 2405 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoReturnBuffer() Specified buffer causes a leave in mempool when deallocating")); 2406 return PVMFErrArgument; 2407 ); 2408 2409 UtilityCommandCompleted(aCmd.GetCmdId(), aCmd.GetContext(), PVMFSuccess); 2410 2411 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoReturnBuffer() Out")); 2412 return PVMFSuccess; 2413 } 2414 2415 2416 PVMFStatus PVFrameAndMetadataUtility::DoRemoveDataSource(PVFMUtilityCommand& aCmd) 2417 { 2418 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRemoveDataSource() In")); 2419 2420 if (GetUtilityState() != PVFM_STATE_INITIALIZED) 2421 { 2422 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoRemoveDataSource() Wrong state")); 2423 return PVMFErrInvalidState; 2424 } 2425 2426 if (iDataSource != (PVPlayerDataSource*)(aCmd.GetParam(0).pOsclAny_value)) 2427 { 2428 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoRemoveDataSource() Passed in parameter invalid")); 2429 return PVMFErrArgument; 2430 } 2431 2432 // Tell player engine to remove data sink, reset, and remove data source 2433 PVMFStatus cmdstatus = PVMFFailure; 2434 PVPlayerState playerstate; 2435 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 2436 if (pretval == PVMFSuccess) 2437 { 2438 if (playerstate == PVP_STATE_INITIALIZED) 2439 { 2440 // Start with remove data sink 2441 if (iVideoNode && iVideoMIO) 2442 { 2443 cmdstatus = DoRDSPlayerRemoveVideoDataSink(aCmd.GetCmdId(), aCmd.GetContext()); 2444 } 2445 else if (iAudioNode && iAudioMIO) 2446 { 2447 cmdstatus = DoRDSPlayerRemoveAudioDataSink(aCmd.GetCmdId(), aCmd.GetContext()); 2448 } 2449 else 2450 { 2451 cmdstatus = DoRDSPlayerReset(aCmd.GetCmdId(), aCmd.GetContext()); 2452 } 2453 } 2454 else if (playerstate == PVP_STATE_PAUSED || playerstate == PVP_STATE_STARTED || playerstate == PVP_STATE_PREPARED) 2455 { 2456 // Stop first to return to initialized state 2457 cmdstatus = DoRDSPlayerStop(aCmd.GetCmdId(), aCmd.GetContext()); 2458 } 2459 else if (playerstate == PVP_STATE_IDLE) 2460 { 2461 // Call RemoveDataSource() on player 2462 cmdstatus = DoRDSPlayerRemoveDataSource(aCmd.GetCmdId(), aCmd.GetContext()); 2463 if (cmdstatus != PVMFSuccess) 2464 { 2465 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoRemoveDataSource: RemoveDataSource on player failed. Report command as failed")); 2466 2467 iAPICmdStatus = cmdstatus; 2468 if (iAPICmdErrMsg) 2469 { 2470 iAPICmdErrMsg->removeRef(); 2471 iAPICmdErrMsg = NULL; 2472 } 2473 // Need to shutdown/restart player and cleanup in utility's AO 2474 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 2475 iErrorHandlingInUtilityAO = true; 2476 RunIfNotReady(); 2477 } 2478 } 2479 else 2480 { 2481 // Player engine should not be in any other state 2482 // Report as underlying resource error 2483 OSCL_ASSERT(false); 2484 cmdstatus = PVMFErrResource; 2485 } 2486 } 2487 else 2488 { 2489 // Player engine state could not be checked so error out 2490 cmdstatus = pretval; 2491 } 2492 2493 if (cmdstatus == PVMFSuccess) 2494 { 2495 SetUtilityState(PVFM_UTILITY_STATE_RESETTING); 2496 } 2497 2498 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRemoveDataSource() Out")); 2499 return cmdstatus; 2500 } 2501 2502 2503 PVMFStatus PVFrameAndMetadataUtility::DoRDSPlayerStop(PVCommandId aCmdId, OsclAny* aCmdContext) 2504 { 2505 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerStop In")); 2506 2507 iUtilityContext.iCmdId = aCmdId; 2508 iUtilityContext.iCmdContext = aCmdContext; 2509 iUtilityContext.iCmdType = PVFM_CMD_RDSPlayerStopFromPaused; 2510 int32 leavecode = 0; 2511 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2512 (0, "PVFrameAndMetadataUtility::RDSPlayerStop Called Tick=%d", OsclTickCount::TickCount())); 2513 OSCL_TRY(leavecode, iPlayer->Stop((const OsclAny*)&iUtilityContext)); 2514 OSCL_FIRST_CATCH_ANY(leavecode, 2515 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoRDSPlayerStop Stop() on player did a leave!")); 2516 return PVMFFailure;); 2517 2518 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerStop Out")); 2519 return PVMFSuccess; 2520 } 2521 2522 2523 PVMFStatus PVFrameAndMetadataUtility::DoRDSPlayerRemoveVideoDataSink(PVCommandId aCmdId, OsclAny* aCmdContext) 2524 { 2525 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveVideoDataSink() In")); 2526 2527 iUtilityContext.iCmdId = aCmdId; 2528 iUtilityContext.iCmdContext = aCmdContext; 2529 iUtilityContext.iCmdType = PVFM_CMD_RDSPlayerRemoveVideoDataSink; 2530 int32 leavecode = 0; 2531 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2532 (0, "PVFrameAndMetadataUtility::RDSPlayerRemoveVideoSink Called Tick=%d", OsclTickCount::TickCount())); 2533 OSCL_TRY(leavecode, iPlayer->RemoveDataSink(iVideoDataSink, (const OsclAny*)&iUtilityContext)); 2534 OSCL_FIRST_CATCH_ANY(leavecode, 2535 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveVideoDataSink() RemoveDataSink() on player did a leave!")); 2536 return PVMFFailure;); 2537 2538 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveVideoDataSink() Out")); 2539 return PVMFSuccess; 2540 } 2541 2542 PVMFStatus PVFrameAndMetadataUtility::DoRDSPlayerRemoveAudioDataSink(PVCommandId aCmdId, OsclAny* aCmdContext) 2543 { 2544 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveAudioDataSink() In")); 2545 2546 iUtilityContext.iCmdId = aCmdId; 2547 iUtilityContext.iCmdContext = aCmdContext; 2548 iUtilityContext.iCmdType = PVFM_CMD_RDSPlayerRemoveAudioDataSink; 2549 int32 leavecode = 0; 2550 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2551 (0, "PVFrameAndMetadataUtility::RDSPlayerRemoveAudioSink Called Tick=%d", OsclTickCount::TickCount())); 2552 OSCL_TRY(leavecode, iPlayer->RemoveDataSink(iAudioDataSink, (const OsclAny*)&iUtilityContext)); 2553 OSCL_FIRST_CATCH_ANY(leavecode, 2554 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveAudioDataSink() RemoveDataSink() on player did a leave!")); 2555 return PVMFFailure;); 2556 2557 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveAudioDataSink() Out")); 2558 return PVMFSuccess; 2559 } 2560 2561 PVMFStatus PVFrameAndMetadataUtility::DoRDSPlayerReset(PVCommandId aCmdId, OsclAny* aCmdContext) 2562 { 2563 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerReset() In")); 2564 2565 iUtilityContext.iCmdId = aCmdId; 2566 iUtilityContext.iCmdContext = aCmdContext; 2567 iUtilityContext.iCmdType = PVFM_CMD_RDSPlayerReset; 2568 int32 leavecode = 0; 2569 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2570 (0, "PVFrameAndMetadataUtility::RDSPlayerReset Called Tick=%d", OsclTickCount::TickCount())); 2571 OSCL_TRY(leavecode, iPlayer->Reset((const OsclAny*)&iUtilityContext)); 2572 OSCL_FIRST_CATCH_ANY(leavecode, 2573 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoRDSPlayerReset() Reset() on player did a leave!")); 2574 return PVMFFailure;); 2575 2576 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerReset() Out")); 2577 return PVMFSuccess; 2578 } 2579 2580 2581 PVMFStatus PVFrameAndMetadataUtility::DoRDSPlayerRemoveDataSource(PVCommandId aCmdId, OsclAny* aCmdContext) 2582 { 2583 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveDataSource() In")); 2584 2585 iUtilityContext.iCmdId = aCmdId; 2586 iUtilityContext.iCmdContext = aCmdContext; 2587 iUtilityContext.iCmdType = PVFM_CMD_RDSPlayerRemoveDataSource; 2588 int32 leavecode = 0; 2589 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2590 (0, "PVFrameAndMetadataUtility::RDSPlayerRemoveDataSource Called Tick=%d", OsclTickCount::TickCount())); 2591 OSCL_TRY(leavecode, iPlayer->RemoveDataSource(*iDataSource, (const OsclAny*)&iUtilityContext)); 2592 OSCL_FIRST_CATCH_ANY(leavecode, 2593 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveDataSource() RemoveDataSource() on player did a leave!")); 2594 return PVMFFailure;); 2595 2596 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoRDSPlayerRemoveDataSource() Out")); 2597 return PVMFSuccess; 2598 } 2599 2600 2601 PVMFStatus PVFrameAndMetadataUtility::DoPlayerShutdownRestart(void) 2602 { 2603 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerShutdownRestart() In")); 2604 2605 int32 leavecode = 0; 2606 2607 // First destroy the player engine instance 2608 OSCL_ASSERT(iPlayer != NULL); 2609 if (iPlayer != NULL) 2610 { 2611 PVPlayerFactory::DeletePlayer(iPlayer); 2612 iPlayer = NULL; 2613 } 2614 2615 // Recreate the player instance 2616 leavecode = 0; 2617 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2618 (0, "PVFrameAndMetadataUtility::CreatePlayer Called Tick=%d", OsclTickCount::TickCount())); 2619 OSCL_TRY(leavecode, iPlayer = PVPlayerFactory::CreatePlayer(this, this, this, iHwAccelerated)); 2620 OSCL_FIRST_CATCH_ANY(leavecode, 2621 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::DoPlayerShutdownRestart() Player engine could not be instantiated! Asserting")); 2622 OSCL_ASSERT(false); 2623 return PVMFErrNoMemory;); 2624 OSCL_ASSERT(iPlayer != NULL); 2625 2626 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::DoPlayerShutdownRestart() Out")); 2627 return PVMFSuccess; 2628 } 2629 2630 2631 void PVFrameAndMetadataUtility::HandlePlayerQueryUUID(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 2632 { 2633 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerQueryUUID() In")); 2634 2635 aUtilContext.iCmdType = -1; 2636 2637 switch (aCmdResp.GetCmdStatus()) 2638 { 2639 case PVMFSuccess: 2640 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2641 (0, "PVFrameAndMetadataUtility::PlayerQueryUUID completed successfully Tick=%d", OsclTickCount::TickCount())); 2642 // Report QueryUUID() command as succesfully complete 2643 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 2644 break; 2645 2646 default: 2647 { 2648 PVMFErrorInfoMessageInterface* nextmsg = NULL; 2649 if (aCmdResp.GetEventExtensionInterface()) 2650 { 2651 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 2652 } 2653 PVMFBasicErrorInfoMessage* errmsg = NULL; 2654 errmsg = CreateBasicErrInfoMessage(nextmsg); 2655 2656 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, aCmdResp.GetCmdStatus(), OSCL_STATIC_CAST(PVInterface*, errmsg)); 2657 if (errmsg) 2658 { 2659 errmsg->removeRef(); 2660 } 2661 } 2662 break; 2663 } 2664 2665 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerQueryUUID() Out")); 2666 } 2667 2668 2669 void PVFrameAndMetadataUtility::HandlePlayerQueryInterface(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 2670 { 2671 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerQueryInterface() In")); 2672 2673 switch (aCmdResp.GetCmdStatus()) 2674 { 2675 case PVMFSuccess: 2676 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2677 (0, "PVFrameAndMetadataUtility::PlayerQueryInterface completed successfully Tick=%d", OsclTickCount::TickCount())); 2678 if (aUtilContext.iCmdType == PVFM_CMD_PlayerQueryCapConfigInterface) 2679 iPlayerCapConfigIF = OSCL_STATIC_CAST(PvmiCapabilityAndConfig*, iPlayerCapConfigIFPVI); 2680 // Report QueryInterface() command as succesfully complete 2681 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 2682 break; 2683 2684 default: 2685 { 2686 PVMFErrorInfoMessageInterface* nextmsg = NULL; 2687 if (aCmdResp.GetEventExtensionInterface()) 2688 { 2689 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 2690 } 2691 PVMFBasicErrorInfoMessage* errmsg = NULL; 2692 errmsg = CreateBasicErrInfoMessage(nextmsg); 2693 2694 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, aCmdResp.GetCmdStatus(), OSCL_STATIC_CAST(PVInterface*, errmsg)); 2695 if (errmsg) 2696 { 2697 errmsg->removeRef(); 2698 } 2699 } 2700 break; 2701 } 2702 2703 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerQueryInterface() Out")); 2704 } 2705 2706 2707 void PVFrameAndMetadataUtility::HandleADSPlayerAddDataSource(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 2708 { 2709 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddDataSource() In")); 2710 2711 aUtilContext.iCmdType = -1; 2712 2713 PVMFStatus cmdstatus = PVMFFailure; 2714 2715 switch (aCmdResp.GetCmdStatus()) 2716 { 2717 case PVMFSuccess: 2718 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2719 (0, "PVFrameAndMetadataUtility::PlayerADS completed successfully Tick=%d", OsclTickCount::TickCount())); 2720 // Call Init() on player 2721 cmdstatus = DoADSPlayerInit(aUtilContext.iCmdId, aUtilContext.iCmdContext); 2722 if (cmdstatus != PVMFSuccess) 2723 { 2724 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddDataSource() Init on player failed. Report command as failed")); 2725 iAPICmdStatus = cmdstatus; 2726 if (iAPICmdErrMsg) 2727 { 2728 iAPICmdErrMsg->removeRef(); 2729 iAPICmdErrMsg = NULL; 2730 } 2731 // Need to shutdown/restart player and cleanup in utility's AO 2732 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 2733 iErrorHandlingInUtilityAO = true; 2734 RunIfNotReady(); 2735 } 2736 break; 2737 2738 default: 2739 { 2740 PVMFErrorInfoMessageInterface* nextmsg = NULL; 2741 if (aCmdResp.GetEventExtensionInterface()) 2742 { 2743 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 2744 } 2745 PVMFBasicErrorInfoMessage* errmsg = NULL; 2746 errmsg = CreateBasicErrInfoMessage(nextmsg); 2747 2748 iAPICmdStatus = aCmdResp.GetCmdStatus(); 2749 if (iAPICmdErrMsg) 2750 { 2751 iAPICmdErrMsg->removeRef(); 2752 iAPICmdErrMsg = NULL; 2753 } 2754 iAPICmdErrMsg = errmsg; 2755 2756 // Check if player is handling the error 2757 PVPlayerState playerstate; 2758 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 2759 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 2760 { 2761 // Yes so wait for error handling to complete 2762 // Start a timer just in case the player does not report error handling complete 2763 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 2764 } 2765 else 2766 { 2767 // Need to shutdown/restart player and cleanup in utility's AO 2768 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 2769 iErrorHandlingInUtilityAO = true; 2770 RunIfNotReady(); 2771 } 2772 } 2773 break; 2774 } 2775 2776 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddDataSource() Out")); 2777 } 2778 2779 2780 void PVFrameAndMetadataUtility::HandleADSPlayerInit(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 2781 { 2782 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerInit() In")); 2783 2784 aUtilContext.iCmdType = -1; 2785 2786 PVMFStatus cmdstatus = PVMFFailure; 2787 2788 switch (aCmdResp.GetCmdStatus()) 2789 { 2790 case PVMFSuccess: 2791 { 2792 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2793 (0, "PVFrameAndMetadataUtility::PlayerInit completed successfully Tick=%d", OsclTickCount::TickCount())); 2794 if (iMode == PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_ONLY) 2795 { 2796 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_INFO, (0, "PVFrameAndMetadataUtility::HandleADSPlayerInit - ADS Complete")); 2797 // Utility's AddDataSource() successfully completed 2798 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZED); 2799 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2800 (0, "PVFrameAndMetadataUtility::AddDataSource completed sucessfully Tick=%d", OsclTickCount::TickCount())); 2801 2802 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 2803 } 2804 else 2805 { 2806 // Call AddDataSink() on player 2807 cmdstatus = DoADSPlayerAddVideoDataSink(aUtilContext.iCmdId, aUtilContext.iCmdContext); 2808 if (cmdstatus != PVMFSuccess) 2809 { 2810 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleADSPlayerInit() AddDataSink on player failed. Report command as failed")); 2811 iAPICmdStatus = aCmdResp.GetCmdStatus(); 2812 if (iAPICmdErrMsg) 2813 { 2814 iAPICmdErrMsg->removeRef(); 2815 iAPICmdErrMsg = NULL; 2816 } 2817 // Need to shutdown/restart player and cleanup in utility's AO 2818 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 2819 iErrorHandlingInUtilityAO = true; 2820 RunIfNotReady(); 2821 } 2822 } 2823 } 2824 break; 2825 2826 default: 2827 { 2828 PVMFErrorInfoMessageInterface* nextmsg = NULL; 2829 if (aCmdResp.GetEventExtensionInterface()) 2830 { 2831 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 2832 } 2833 PVMFBasicErrorInfoMessage* errmsg = NULL; 2834 errmsg = CreateBasicErrInfoMessage(nextmsg); 2835 2836 iAPICmdStatus = aCmdResp.GetCmdStatus(); 2837 if (iAPICmdErrMsg) 2838 { 2839 iAPICmdErrMsg->removeRef(); 2840 iAPICmdErrMsg = NULL; 2841 } 2842 iAPICmdErrMsg = errmsg; 2843 2844 // Check if player is handling the error 2845 PVPlayerState playerstate; 2846 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 2847 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 2848 { 2849 // Wait for error handling to complete 2850 // Start a timer just in case the player does not report error handling complete 2851 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 2852 } 2853 else 2854 { 2855 // Need to shutdown/restart player and cleanup in utility's AO 2856 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 2857 iErrorHandlingInUtilityAO = true; 2858 RunIfNotReady(); 2859 } 2860 } 2861 break; 2862 } 2863 2864 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerInit() Out")); 2865 } 2866 2867 void PVFrameAndMetadataUtility::HandleADSPlayerAddVideoDataSink(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 2868 { 2869 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddVideoDataSink() In")); 2870 2871 aUtilContext.iCmdType = -1; 2872 2873 switch (aCmdResp.GetCmdStatus()) 2874 { 2875 case PVMFSuccess: 2876 { 2877 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2878 (0, "PVFrameAndMetadataUtility::PlayerAddVideoDataSink completed successfully Tick=%d", OsclTickCount::TickCount())); 2879 if (iMode == PV_FRAME_METADATA_INTERFACE_MODE_SOURCE_METADATA_AND_THUMBNAIL) 2880 { 2881 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_INFO, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddVideoDataSink - ADS Complete")); 2882 // Utility's AddDataSource() successfully completed 2883 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZED); 2884 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2885 (0, "PVFrameAndMetadataUtility::AddDataSource completed sucessfully Tick=%d", OsclTickCount::TickCount())); 2886 2887 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 2888 } 2889 else 2890 { 2891 // Add Audio data sink 2892 PVMFStatus cmdstatus = DoADSPlayerAddAudioDataSink(aUtilContext.iCmdId, aUtilContext.iCmdContext); 2893 if (cmdstatus != PVMFSuccess) 2894 { 2895 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddVideoDataSink() AddAudioDataSink on player failed. Report command as failed")); 2896 iAPICmdStatus = aCmdResp.GetCmdStatus(); 2897 if (iAPICmdErrMsg) 2898 { 2899 iAPICmdErrMsg->removeRef(); 2900 iAPICmdErrMsg = NULL; 2901 } 2902 // Need to shutdown/restart player and cleanup in utility's AO 2903 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 2904 iErrorHandlingInUtilityAO = true; 2905 RunIfNotReady(); 2906 } 2907 } 2908 } 2909 break; 2910 2911 default: 2912 { 2913 PVMFErrorInfoMessageInterface* nextmsg = NULL; 2914 if (aCmdResp.GetEventExtensionInterface()) 2915 { 2916 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 2917 } 2918 2919 PVMFBasicErrorInfoMessage* errmsg = NULL; 2920 errmsg = CreateBasicErrInfoMessage(nextmsg); 2921 2922 iAPICmdStatus = aCmdResp.GetCmdStatus(); 2923 if (iAPICmdErrMsg) 2924 { 2925 iAPICmdErrMsg->removeRef(); 2926 iAPICmdErrMsg = NULL; 2927 } 2928 iAPICmdErrMsg = errmsg; 2929 2930 // Check if player is handling the error 2931 PVPlayerState playerstate; 2932 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 2933 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 2934 { 2935 // Wait for error handling to complete 2936 // Start a timer just in case the player does not report error handling complete 2937 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 2938 } 2939 else 2940 { 2941 // Need to shutdown/restart player and cleanup in utility's AO 2942 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 2943 iErrorHandlingInUtilityAO = true; 2944 RunIfNotReady(); 2945 } 2946 } 2947 break; 2948 } 2949 2950 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddVideoDataSink() Out")); 2951 } 2952 2953 void PVFrameAndMetadataUtility::HandleADSPlayerAddAudioDataSink(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 2954 { 2955 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddAudioDataSink() In")); 2956 2957 aUtilContext.iCmdType = -1; 2958 2959 switch (aCmdResp.GetCmdStatus()) 2960 { 2961 case PVMFSuccess: 2962 { 2963 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 2964 (0, "PVFrameAndMetadataUtility::PlayerAddAudioDataSink completed successfully Tick=%d", OsclTickCount::TickCount())); 2965 // Call Prepare() on player 2966 PVMFStatus cmdstatus = DoADSPlayerPrepare(aUtilContext.iCmdId, aUtilContext.iCmdContext); 2967 if (cmdstatus != PVMFSuccess) 2968 { 2969 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddAudioDataSink() Prepare on player failed. Report command as failed")); 2970 iAPICmdStatus = aCmdResp.GetCmdStatus(); 2971 if (iAPICmdErrMsg) 2972 { 2973 iAPICmdErrMsg->removeRef(); 2974 iAPICmdErrMsg = NULL; 2975 } 2976 // Need to shutdown/restart player and cleanup in utility's AO 2977 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 2978 iErrorHandlingInUtilityAO = true; 2979 RunIfNotReady(); 2980 } 2981 } 2982 break; 2983 2984 default: 2985 { 2986 PVMFErrorInfoMessageInterface* nextmsg = NULL; 2987 if (aCmdResp.GetEventExtensionInterface()) 2988 { 2989 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 2990 } 2991 2992 PVMFBasicErrorInfoMessage* errmsg = NULL; 2993 errmsg = CreateBasicErrInfoMessage(nextmsg); 2994 2995 iAPICmdStatus = aCmdResp.GetCmdStatus(); 2996 if (iAPICmdErrMsg) 2997 { 2998 iAPICmdErrMsg->removeRef(); 2999 iAPICmdErrMsg = NULL; 3000 } 3001 iAPICmdErrMsg = errmsg; 3002 3003 // Check if player is handling the error 3004 PVPlayerState playerstate; 3005 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3006 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3007 { 3008 // Wait for error handling to complete 3009 // Start a timer just in case the player does not report error handling complete 3010 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3011 } 3012 else 3013 { 3014 // Need to shutdown/restart player and cleanup in utility's AO 3015 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3016 iErrorHandlingInUtilityAO = true; 3017 RunIfNotReady(); 3018 } 3019 } 3020 break; 3021 } 3022 3023 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerAddVideoDataSink() Out")); 3024 } 3025 3026 3027 void PVFrameAndMetadataUtility::HandleADSPlayerPrepare(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3028 { 3029 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerPrepare() In")); 3030 3031 aUtilContext.iCmdType = -1; 3032 3033 PVMFStatus cmdstatus = PVMFFailure; 3034 3035 switch (aCmdResp.GetCmdStatus()) 3036 { 3037 case PVMFSuccess: 3038 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3039 (0, "PVFrameAndMetadataUtility::PlayerPrepare completed successfully Tick=%d", OsclTickCount::TickCount())); 3040 // Call Start() on player 3041 cmdstatus = DoADSPlayerStart(aUtilContext.iCmdId, aUtilContext.iCmdContext); 3042 if (cmdstatus != PVMFSuccess) 3043 { 3044 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleADSPlayerPrepare() Start on player failed. Report command as failed")); 3045 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3046 if (iAPICmdErrMsg) 3047 { 3048 iAPICmdErrMsg->removeRef(); 3049 iAPICmdErrMsg = NULL; 3050 } 3051 // Need to shutdown/restart player and cleanup in utility's AO 3052 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3053 iErrorHandlingInUtilityAO = true; 3054 RunIfNotReady(); 3055 } 3056 break; 3057 3058 default: 3059 { 3060 // If the player engine is in initialized state, complete AddDataSource() 3061 // command with success here. User can still retrieve metadata 3062 PVPlayerState pstate; 3063 PVMFStatus playerretval = iPlayer->GetPVPlayerStateSync(pstate); 3064 if (playerretval == PVMFSuccess && pstate == PVP_STATE_INITIALIZED) 3065 { 3066 // Utility's AddDataSource() successfully completed 3067 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZED); 3068 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 3069 break; 3070 } 3071 3072 // Else fall through to the error handling in the default case since fatal error 3073 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3074 if (aCmdResp.GetEventExtensionInterface()) 3075 { 3076 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3077 } 3078 PVMFBasicErrorInfoMessage* errmsg = NULL; 3079 errmsg = CreateBasicErrInfoMessage(nextmsg); 3080 3081 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3082 if (iAPICmdErrMsg) 3083 { 3084 iAPICmdErrMsg->removeRef(); 3085 iAPICmdErrMsg = NULL; 3086 } 3087 iAPICmdErrMsg = errmsg; 3088 3089 // Check if player is handling the error 3090 PVPlayerState playerstate; 3091 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3092 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3093 { 3094 // Wait for error handling to complete 3095 // Start a timer just in case the player does not report error handling complete 3096 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3097 } 3098 else 3099 { 3100 // Need to shutdown/restart player and cleanup in utility's AO 3101 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3102 iErrorHandlingInUtilityAO = true; 3103 RunIfNotReady(); 3104 } 3105 } 3106 break; 3107 } 3108 3109 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerPrepare() Out")); 3110 } 3111 3112 3113 void PVFrameAndMetadataUtility::HandleADSPlayerStart(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3114 { 3115 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerStart() In")); 3116 3117 aUtilContext.iCmdType = -1; 3118 3119 PVMFStatus cmdstatus = PVMFFailure; 3120 3121 switch (aCmdResp.GetCmdStatus()) 3122 { 3123 case PVMFSuccess: 3124 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3125 (0, "PVFrameAndMetadataUtility::PlayerStart completed successfully Tick=%d", OsclTickCount::TickCount())); 3126 // Call Pause() on player 3127 cmdstatus = DoADSPlayerPause(aUtilContext.iCmdId, aUtilContext.iCmdContext); 3128 if (cmdstatus != PVMFSuccess) 3129 { 3130 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleADSPlayerStart() Start on player failed. Report command as failed")); 3131 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3132 if (iAPICmdErrMsg) 3133 { 3134 iAPICmdErrMsg->removeRef(); 3135 iAPICmdErrMsg = NULL; 3136 } 3137 // Need to shutdown/restart player and cleanup in utility's AO 3138 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3139 iErrorHandlingInUtilityAO = true; 3140 RunIfNotReady(); 3141 } 3142 break; 3143 3144 default: 3145 { 3146 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3147 if (aCmdResp.GetEventExtensionInterface()) 3148 { 3149 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3150 } 3151 PVMFBasicErrorInfoMessage* errmsg = NULL; 3152 errmsg = CreateBasicErrInfoMessage(nextmsg); 3153 3154 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3155 if (iAPICmdErrMsg) 3156 { 3157 iAPICmdErrMsg->removeRef(); 3158 iAPICmdErrMsg = NULL; 3159 } 3160 iAPICmdErrMsg = errmsg; 3161 3162 // Check if player is handling the error 3163 PVPlayerState playerstate; 3164 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3165 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3166 { 3167 // Wait for error handling to complete 3168 // Start a timer just in case the player does not report error handling complete 3169 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3170 } 3171 else 3172 { 3173 // Need to shutdown/restart player and cleanup in utility's AO 3174 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3175 iErrorHandlingInUtilityAO = true; 3176 RunIfNotReady(); 3177 } 3178 } 3179 break; 3180 } 3181 3182 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerStart() Out")); 3183 } 3184 3185 3186 void PVFrameAndMetadataUtility::HandleADSPlayerPause(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3187 { 3188 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerPause() In")); 3189 3190 aUtilContext.iCmdType = -1; 3191 3192 switch (aCmdResp.GetCmdStatus()) 3193 { 3194 case PVMFSuccess: 3195 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3196 (0, "PVFrameAndMetadataUtility::PlayerPause completed successfully Tick=%d", OsclTickCount::TickCount())); 3197 // Utility's AddDataSource() successfully completed 3198 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZED); 3199 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3200 (0, "PVFrameAndMetadataUtility::AddDataSource completed sucessfully Tick=%d", OsclTickCount::TickCount())); 3201 3202 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 3203 break; 3204 3205 default: 3206 { 3207 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3208 if (aCmdResp.GetEventExtensionInterface()) 3209 { 3210 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3211 } 3212 PVMFBasicErrorInfoMessage* errmsg = NULL; 3213 errmsg = CreateBasicErrInfoMessage(nextmsg); 3214 3215 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3216 if (iAPICmdErrMsg) 3217 { 3218 iAPICmdErrMsg->removeRef(); 3219 iAPICmdErrMsg = NULL; 3220 } 3221 iAPICmdErrMsg = errmsg; 3222 3223 // Check if player is handling the error 3224 PVPlayerState playerstate; 3225 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3226 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3227 { 3228 // Wait for error handling to complete 3229 // Start a timer just in case the player does not report error handling complete 3230 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3231 } 3232 else 3233 { 3234 // Need to shutdown/restart player and cleanup in utility's AO 3235 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3236 iErrorHandlingInUtilityAO = true; 3237 RunIfNotReady(); 3238 } 3239 } 3240 break; 3241 } 3242 3243 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleADSPlayerPause() Out")); 3244 } 3245 3246 3247 void PVFrameAndMetadataUtility::HandlePlayerGetMetadataKeys(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3248 { 3249 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerGetMetadataKeys() In")); 3250 3251 aUtilContext.iCmdType = -1; 3252 3253 switch (aCmdResp.GetCmdStatus()) 3254 { 3255 case PVMFSuccess: 3256 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3257 (0, "PVFrameAndMetadataUtility::PlayerGetMetadataKeys completed successfully Tick=%d", OsclTickCount::TickCount())); 3258 3259 // Report GetMetadataKeys() command as succesfully complete 3260 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 3261 break; 3262 3263 default: 3264 { 3265 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3266 if (aCmdResp.GetEventExtensionInterface()) 3267 { 3268 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3269 } 3270 PVMFBasicErrorInfoMessage* errmsg = NULL; 3271 errmsg = CreateBasicErrInfoMessage(nextmsg); 3272 3273 // Check if player is handling the error 3274 PVPlayerState playerstate; 3275 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3276 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3277 { 3278 // Yes so wait for error handling to complete 3279 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3280 if (iAPICmdErrMsg) 3281 { 3282 iAPICmdErrMsg->removeRef(); 3283 iAPICmdErrMsg = NULL; 3284 } 3285 iAPICmdErrMsg = errmsg; 3286 // Start a timer just in case the player does not report error handling complete 3287 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3288 } 3289 else 3290 { 3291 // Report the command as failed 3292 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, aCmdResp.GetCmdStatus(), OSCL_STATIC_CAST(PVInterface*, errmsg)); 3293 if (errmsg) 3294 { 3295 errmsg->removeRef(); 3296 } 3297 } 3298 } 3299 break; 3300 } 3301 3302 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerGetMetadataKeys() Out")); 3303 } 3304 3305 3306 void PVFrameAndMetadataUtility::HandlePlayerGetMetadataValues(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3307 { 3308 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerGetMetadataValues() In")); 3309 3310 aUtilContext.iCmdType = -1; 3311 3312 switch (aCmdResp.GetCmdStatus()) 3313 { 3314 case PVMFSuccess: 3315 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3316 (0, "PVFrameAndMetadataUtility::PlayerGetMetadataValues completed successfully Tick=%d", OsclTickCount::TickCount())); 3317 // Report GetMetadataValues() command as succesfully complete 3318 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 3319 break; 3320 3321 default: 3322 { 3323 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3324 if (aCmdResp.GetEventExtensionInterface()) 3325 { 3326 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3327 } 3328 PVMFBasicErrorInfoMessage* errmsg = NULL; 3329 errmsg = CreateBasicErrInfoMessage(nextmsg); 3330 3331 // Check if player is handling the error 3332 PVPlayerState playerstate; 3333 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3334 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3335 { 3336 // Yes so wait for error handling to complete 3337 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3338 if (iAPICmdErrMsg) 3339 { 3340 iAPICmdErrMsg->removeRef(); 3341 iAPICmdErrMsg = NULL; 3342 } 3343 iAPICmdErrMsg = errmsg; 3344 // Start a timer just in case the player does not report error handling complete 3345 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3346 } 3347 else 3348 { 3349 // Report the command as failed 3350 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, aCmdResp.GetCmdStatus(), OSCL_STATIC_CAST(PVInterface*, errmsg)); 3351 if (errmsg) 3352 { 3353 errmsg->removeRef(); 3354 } 3355 } 3356 } 3357 break; 3358 } 3359 3360 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerGetMetadataValues() Out")); 3361 } 3362 3363 void PVFrameAndMetadataUtility::HandlePlayerSetParametersSync(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3364 { 3365 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerSetParametersSync() In")); 3366 3367 aUtilContext.iCmdType = -1; 3368 3369 switch (aCmdResp.GetCmdStatus()) 3370 { 3371 case PVMFSuccess: 3372 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3373 (0, "PVFrameAndMetadataUtility::PlayerSetParametersSync completed successfully Tick=%d", OsclTickCount::TickCount())); 3374 // Report SetParametersSync() command as succesfully complete 3375 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 3376 break; 3377 3378 default: 3379 { 3380 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3381 if (aCmdResp.GetEventExtensionInterface()) 3382 { 3383 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3384 } 3385 PVMFBasicErrorInfoMessage* errmsg = NULL; 3386 errmsg = CreateBasicErrInfoMessage(nextmsg); 3387 3388 // Check if player is handling the error 3389 PVPlayerState playerstate; 3390 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3391 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3392 { 3393 // Yes so wait for error handling to complete 3394 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3395 if (iAPICmdErrMsg) 3396 { 3397 iAPICmdErrMsg->removeRef(); 3398 iAPICmdErrMsg = NULL; 3399 } 3400 iAPICmdErrMsg = errmsg; 3401 // Start a timer just in case the player does not report error handling complete 3402 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3403 } 3404 else 3405 { 3406 // Report the command as failed 3407 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, aCmdResp.GetCmdStatus(), OSCL_STATIC_CAST(PVInterface*, errmsg)); 3408 if (errmsg) 3409 { 3410 errmsg->removeRef(); 3411 } 3412 } 3413 } 3414 break; 3415 } 3416 3417 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandlePlayerSetParametersSync() Out")); 3418 } 3419 3420 void PVFrameAndMetadataUtility::HandleGFPlayerStopFromPaused(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3421 { 3422 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerStopFromPaused() In")); 3423 3424 aUtilContext.iCmdType = -1; 3425 3426 switch (aCmdResp.GetCmdStatus()) 3427 { 3428 case PVMFSuccess: 3429 { 3430 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3431 (0, "PVFrameAndMetadataUtility::GFPlayerStopFromPaused completed successfully Tick=%d", OsclTickCount::TickCount())); 3432 // Call DoPrepare() on player 3433 PVMFStatus cmdstatus = DoGFPlayerPrepare(aUtilContext.iCmdId, aUtilContext.iCmdContext); 3434 if (cmdstatus != PVMFSuccess) 3435 { 3436 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleGFPlayerStopFromPaused() Prepare on player failed. Report command as failed")); 3437 3438 // Check if video frame buffer was allocated from utility's memory pool 3439 OSCL_ASSERT(iCurrentCmd.empty() == false); 3440 OSCL_ASSERT(iCurrentVideoFrameBuffer != NULL); 3441 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3442 { 3443 // Return the buffer if allocated from utility's mempool 3444 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3445 iCurrentVideoFrameBuffer = NULL; 3446 } 3447 3448 iAPICmdStatus = cmdstatus; 3449 if (iAPICmdErrMsg) 3450 { 3451 iAPICmdErrMsg->removeRef(); 3452 iAPICmdErrMsg = NULL; 3453 } 3454 // Need to shutdown/restart player and cleanup in utility's AO 3455 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3456 iErrorHandlingInUtilityAO = true; 3457 RunIfNotReady(); 3458 } 3459 } 3460 break; 3461 3462 default: 3463 { 3464 // Check if video frame buffer was allocated from utility's memory pool 3465 OSCL_ASSERT(iCurrentCmd.empty() == false); 3466 OSCL_ASSERT(iCurrentVideoFrameBuffer != NULL); 3467 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3468 { 3469 // Return the buffer if allocated from utility's mempool 3470 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3471 iCurrentVideoFrameBuffer = NULL; 3472 } 3473 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3474 if (aCmdResp.GetEventExtensionInterface()) 3475 { 3476 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3477 } 3478 PVMFBasicErrorInfoMessage* errmsg = NULL; 3479 errmsg = CreateBasicErrInfoMessage(nextmsg); 3480 3481 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3482 if (iAPICmdErrMsg) 3483 { 3484 iAPICmdErrMsg->removeRef(); 3485 iAPICmdErrMsg = NULL; 3486 } 3487 iAPICmdErrMsg = errmsg; 3488 3489 // Check if player is handling the error 3490 PVPlayerState playerstate; 3491 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3492 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3493 { 3494 // Yes so wait for error handling to complete 3495 // Start a timer just in case the player does not report error handling complete 3496 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3497 } 3498 else if (pretval == PVMFSuccess && playerstate == PVP_STATE_INITIALIZED) 3499 { 3500 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZED); 3501 3502 // Report the command as failed 3503 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 3504 iAPICmdStatus = PVMFSuccess; 3505 if (iAPICmdErrMsg) 3506 { 3507 iAPICmdErrMsg->removeRef(); 3508 iAPICmdErrMsg = NULL; 3509 } 3510 } 3511 else 3512 { 3513 // Need to shutdown/restart player and cleanup in utility's AO 3514 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3515 iErrorHandlingInUtilityAO = true; 3516 RunIfNotReady(); 3517 } 3518 } 3519 break; 3520 } 3521 3522 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerStopFromPaused() Out")); 3523 } 3524 3525 3526 void PVFrameAndMetadataUtility::HandleGFPlayerPrepare(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3527 { 3528 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerPrepare() In")); 3529 3530 aUtilContext.iCmdType = -1; 3531 3532 PVMFStatus cmdstatus = PVMFFailure; 3533 3534 switch (aCmdResp.GetCmdStatus()) 3535 { 3536 case PVMFSuccess: 3537 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3538 (0, "PVFrameAndMetadataUtility::GFPlayerPrepare completed successfully Tick=%d", OsclTickCount::TickCount())); 3539 // Call Start() on player 3540 iPlayerStartCompleted = false; 3541 cmdstatus = DoGFPlayerStart(aUtilContext.iCmdId, aUtilContext.iCmdContext); 3542 if ((cmdstatus != PVMFSuccess) || (!HasVideo())) 3543 { 3544 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleGFPlayerPrepare() Prepare on player failed. Report command as failed")); 3545 // Cancel the frame retrieval 3546 iVideoMIO->CancelGetFrame(); 3547 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3548 { 3549 // Return the buffer if allocated from utility's mempool 3550 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3551 iCurrentVideoFrameBuffer = NULL; 3552 } 3553 3554 iAPICmdStatus = cmdstatus; 3555 if (iAPICmdErrMsg) 3556 { 3557 iAPICmdErrMsg->removeRef(); 3558 iAPICmdErrMsg = NULL; 3559 } 3560 // Need to shutdown/restart player and cleanup in utility's AO 3561 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3562 iErrorHandlingInUtilityAO = true; 3563 RunIfNotReady(); 3564 } 3565 break; 3566 3567 default: 3568 { 3569 // Cancel the frame retrieval 3570 iVideoMIO->CancelGetFrame(); 3571 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3572 { 3573 // Return the buffer if allocated from utility's mempool 3574 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3575 iCurrentVideoFrameBuffer = NULL; 3576 } 3577 PVFMErrorEventType errCode = PVFMErrPlayerEngine; 3578 if (aCmdResp.GetCmdStatus() == PVMFErrResourceConfiguration) 3579 { 3580 errCode = PVFMErrNoVideoTrack; 3581 } 3582 3583 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3584 if (aCmdResp.GetEventExtensionInterface()) 3585 { 3586 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3587 } 3588 PVMFBasicErrorInfoMessage* errmsg = NULL; 3589 errmsg = CreateBasicErrInfoMessage(nextmsg, errCode); 3590 3591 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3592 if (iAPICmdErrMsg) 3593 { 3594 iAPICmdErrMsg->removeRef(); 3595 iAPICmdErrMsg = NULL; 3596 } 3597 iAPICmdErrMsg = errmsg; 3598 3599 // Check if player is handling the error 3600 PVPlayerState playerstate; 3601 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3602 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3603 { 3604 // Wait for error handling to complete 3605 // Start a timer just in case the player does not report error handling complete 3606 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3607 } 3608 else if (aCmdResp.GetCmdStatus() == PVMFErrResourceConfiguration) 3609 { 3610 // Track selection in player engine failed since there is no video track. 3611 // Complete GetFrame() with not supported for this source 3612 UtilityCommandCompleted(iCurrentCmd[0].GetCmdId(), iCurrentCmd[0].GetContext(), PVMFErrNotSupported, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 3613 iAPICmdStatus = PVMFSuccess; 3614 if (iAPICmdErrMsg) 3615 { 3616 iAPICmdErrMsg->removeRef(); 3617 iAPICmdErrMsg = NULL; 3618 } 3619 } 3620 else 3621 { 3622 // Need to shutdown/restart player and cleanup in utility's AO 3623 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3624 iErrorHandlingInUtilityAO = true; 3625 RunIfNotReady(); 3626 } 3627 } 3628 break; 3629 } 3630 3631 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerPrepare() Out")); 3632 } 3633 3634 3635 void PVFrameAndMetadataUtility::HandleGFPlayerStart(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3636 { 3637 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerStart() In")); 3638 3639 aUtilContext.iCmdType = -1; 3640 PVMFStatus cmdstatus = aCmdResp.GetCmdStatus(); 3641 3642 switch (cmdstatus) 3643 { 3644 case PVMFSuccess: 3645 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3646 (0, "PVFrameAndMetadataUtility::GFPlayerStart completed successfully Tick=%d", OsclTickCount::TickCount())); 3647 iPlayerStartCompleted = true; 3648 3649 if (iFrameReceived) 3650 { 3651 PVMFStatus retval = DoGFPlayerPause(aUtilContext.iCmdId, aUtilContext.iCmdContext); 3652 if (retval == PVMFErrInvalidState) 3653 { 3654 // Playback already paused so GetFrame() command completed 3655 if (iAPICmdStatus != PVMFSuccess) 3656 { 3657 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3658 { 3659 // Return the buffer if allocated from utility's mempool 3660 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3661 iCurrentVideoFrameBuffer = NULL; 3662 } 3663 } 3664 3665 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 3666 3667 iAPICmdStatus = PVMFSuccess; 3668 if (iAPICmdErrMsg) 3669 { 3670 iAPICmdErrMsg->removeRef(); 3671 iAPICmdErrMsg = NULL; 3672 } 3673 } 3674 else if (retval != PVMFSuccess) 3675 { 3676 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleGFPlayerStart() Pause on player failed. Report command as failed")); 3677 3678 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3679 { 3680 // Return the buffer if allocated from utility's mempool 3681 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3682 iCurrentVideoFrameBuffer = NULL; 3683 } 3684 3685 iAPICmdStatus = retval; 3686 if (iAPICmdErrMsg) 3687 { 3688 iAPICmdErrMsg->removeRef(); 3689 iAPICmdErrMsg = NULL; 3690 } 3691 3692 // Need to shutdown/restart player and cleanup in utility's AO 3693 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3694 iErrorHandlingInUtilityAO = true; 3695 RunIfNotReady(); 3696 } 3697 } 3698 else 3699 { 3700 // Wait for the video MIO to report frame is ready 3701 // Start a timer just in case frame retrieval hangs 3702 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerStart() Set a timeout of %d secs for frame retrieval", iFrameReadyWaitTime)); 3703 iTimeoutTimer->Request(PVFMUTIL_TIMERID_FRAMEREADYTIMEOUT, 0, iFrameReadyWaitTime, this, false); 3704 } 3705 break; 3706 3707 default: 3708 { 3709 // Cancel the frame retrieval 3710 iVideoMIO->CancelGetFrame(); 3711 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3712 { 3713 // Return the buffer if allocated from utility's mempool 3714 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3715 iCurrentVideoFrameBuffer = NULL; 3716 } 3717 3718 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3719 if (aCmdResp.GetEventExtensionInterface()) 3720 { 3721 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3722 } 3723 PVMFBasicErrorInfoMessage* errmsg = NULL; 3724 errmsg = CreateBasicErrInfoMessage(nextmsg); 3725 3726 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3727 if (iAPICmdErrMsg) 3728 { 3729 iAPICmdErrMsg->removeRef(); 3730 iAPICmdErrMsg = NULL; 3731 } 3732 iAPICmdErrMsg = errmsg; 3733 3734 // Check if player is handling the error 3735 PVPlayerState playerstate; 3736 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3737 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3738 { 3739 // Wait for error handling to complete 3740 // Start a timer just in case the player does not report error handling complete 3741 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3742 } 3743 else 3744 { 3745 // Need to shutdown/restart player and cleanup in utility's AO 3746 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3747 iErrorHandlingInUtilityAO = true; 3748 RunIfNotReady(); 3749 } 3750 } 3751 break; 3752 } 3753 3754 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerStart() Out")); 3755 } 3756 3757 3758 void PVFrameAndMetadataUtility::HandleGFPlayerPause(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3759 { 3760 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerPause() In")); 3761 3762 aUtilContext.iCmdType = -1; 3763 3764 switch (aCmdResp.GetCmdStatus()) 3765 { 3766 case PVMFSuccess: 3767 3768 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3769 (0, "PVFrameAndMetadataUtility::GFPlayerPause completed successfully Tick=%d", OsclTickCount::TickCount())); 3770 // GetFrame() command completed 3771 if (iAPICmdStatus != PVMFSuccess) 3772 { 3773 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3774 { 3775 // Return the buffer if allocated from utility's mempool 3776 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3777 iCurrentVideoFrameBuffer = NULL; 3778 } 3779 } 3780 3781 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3782 (0, "PVFrameAndMetadataUtility::GetFrame() completed successfully Tick=%d", OsclTickCount::TickCount())); 3783 3784 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 3785 3786 iAPICmdStatus = PVMFSuccess; 3787 if (iAPICmdErrMsg) 3788 { 3789 iAPICmdErrMsg->removeRef(); 3790 iAPICmdErrMsg = NULL; 3791 } 3792 break; 3793 3794 default: 3795 { 3796 if (iCurrentCmd[0].GetCmdType() == PVFM_UTILITY_COMMAND_GET_FRAME_UTILITY_BUFFER && iCurrentVideoFrameBuffer) 3797 { 3798 // Return the buffer if allocated from utility's mempool 3799 iVideoFrameBufferMemPool->deallocate(iCurrentVideoFrameBuffer); 3800 iCurrentVideoFrameBuffer = NULL; 3801 } 3802 3803 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3804 if (aCmdResp.GetEventExtensionInterface()) 3805 { 3806 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3807 } 3808 3809 PVMFBasicErrorInfoMessage* errmsg = NULL; 3810 errmsg = CreateBasicErrInfoMessage(nextmsg); 3811 3812 // Check if player is handling the error 3813 PVPlayerState playerstate; 3814 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3815 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3816 { 3817 // Yes so wait for error handling to complete 3818 if (iAPICmdStatus == PVMFSuccess) 3819 { 3820 // Use the player error only if there is no existing error (from frame retrieval) 3821 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3822 if (iAPICmdErrMsg) 3823 { 3824 iAPICmdErrMsg->removeRef(); 3825 iAPICmdErrMsg = NULL; 3826 } 3827 iAPICmdErrMsg = errmsg; 3828 } 3829 // Start a timer just in case the player does not report error handling complete 3830 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3831 } 3832 else if (pretval == PVMFSuccess && playerstate == PVP_STATE_INITIALIZED) 3833 { 3834 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZED); 3835 3836 // Report the command as failed 3837 if (iAPICmdStatus == PVMFSuccess) 3838 { 3839 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, aCmdResp.GetCmdStatus(), OSCL_STATIC_CAST(PVInterface*, errmsg)); 3840 if (errmsg) 3841 { 3842 errmsg->removeRef(); 3843 } 3844 } 3845 else 3846 { 3847 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 3848 iAPICmdStatus = PVMFSuccess; 3849 if (iAPICmdErrMsg) 3850 { 3851 iAPICmdErrMsg->removeRef(); 3852 iAPICmdErrMsg = NULL; 3853 } 3854 } 3855 } 3856 else 3857 { 3858 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3859 if (iAPICmdErrMsg) 3860 { 3861 iAPICmdErrMsg->removeRef(); 3862 iAPICmdErrMsg = NULL; 3863 } 3864 iAPICmdErrMsg = errmsg; 3865 // Need to shutdown/restart player and cleanup in utility's AO 3866 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3867 iErrorHandlingInUtilityAO = true; 3868 RunIfNotReady(); 3869 } 3870 } 3871 break; 3872 } 3873 3874 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleGFPlayerPause() Out")); 3875 } 3876 3877 3878 void PVFrameAndMetadataUtility::HandleRDSPlayerStopFromPaused(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3879 { 3880 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerStopFromPaused() In")); 3881 3882 aUtilContext.iCmdType = -1; 3883 3884 switch (aCmdResp.GetCmdStatus()) 3885 { 3886 case PVMFSuccess: 3887 { 3888 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3889 (0, "PVFrameAndMetadataUtility::RDSPlayerStopFromPaused completed successfully Tick=%d", OsclTickCount::TickCount())); 3890 // Call RemoveDataSink() on player 3891 PVMFStatus cmdstatus = DoRDSPlayerRemoveVideoDataSink(aUtilContext.iCmdId, aUtilContext.iCmdContext); 3892 if (cmdstatus != PVMFSuccess) 3893 { 3894 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerStopFromPaused() RemoveDataSink on player failed. Report command as failed")); 3895 iAPICmdStatus = cmdstatus; 3896 if (iAPICmdErrMsg) 3897 { 3898 iAPICmdErrMsg->removeRef(); 3899 iAPICmdErrMsg = NULL; 3900 } 3901 // Need to shutdown/restart player and cleanup in utility's AO 3902 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3903 iErrorHandlingInUtilityAO = true; 3904 RunIfNotReady(); 3905 } 3906 } 3907 break; 3908 3909 default: 3910 { 3911 PVMFErrorInfoMessageInterface* nextmsg = NULL; 3912 if (aCmdResp.GetEventExtensionInterface()) 3913 { 3914 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 3915 } 3916 PVMFBasicErrorInfoMessage* errmsg = NULL; 3917 errmsg = CreateBasicErrInfoMessage(nextmsg); 3918 3919 iAPICmdStatus = aCmdResp.GetCmdStatus(); 3920 if (iAPICmdErrMsg) 3921 { 3922 iAPICmdErrMsg->removeRef(); 3923 iAPICmdErrMsg = NULL; 3924 } 3925 iAPICmdErrMsg = errmsg; 3926 3927 // Check if player is handling the error 3928 PVPlayerState playerstate; 3929 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 3930 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 3931 { 3932 // Yes so wait for error handling to complete 3933 // Start a timer just in case the player does not report error handling complete 3934 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 3935 } 3936 else if (pretval == PVMFSuccess && playerstate == PVP_STATE_INITIALIZED) 3937 { 3938 SetUtilityState(PVFM_UTILITY_STATE_INITIALIZED); 3939 3940 // Report the command as failed 3941 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, iAPICmdStatus, OSCL_STATIC_CAST(PVInterface*, iAPICmdErrMsg)); 3942 iAPICmdStatus = PVMFSuccess; 3943 if (iAPICmdErrMsg) 3944 { 3945 iAPICmdErrMsg->removeRef(); 3946 iAPICmdErrMsg = NULL; 3947 } 3948 } 3949 else 3950 { 3951 // Need to shutdown/restart player and cleanup in utility's AO 3952 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 3953 iErrorHandlingInUtilityAO = true; 3954 RunIfNotReady(); 3955 } 3956 } 3957 break; 3958 } 3959 3960 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerStopFromPaused() Out")); 3961 } 3962 3963 void PVFrameAndMetadataUtility::HandleRDSPlayerRemoveVideoDataSink(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 3964 { 3965 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility:HandleRDSPlayerRemoveVideoDataSink() In")); 3966 3967 aUtilContext.iCmdType = -1; 3968 3969 PVMFStatus cmdstatus = PVMFFailure; 3970 3971 switch (aCmdResp.GetCmdStatus()) 3972 { 3973 case PVMFSuccess: 3974 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 3975 (0, "PVFrameAndMetadataUtility::RDSPlayerRemoveVideoDataSink completed successfully Tick=%d", OsclTickCount::TickCount())); 3976 // Cleanup the data sink 3977 iVideoDataSink.SetDataSinkNode(NULL); 3978 if (iVideoNode) 3979 { 3980 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iVideoNode); 3981 iVideoNode = NULL; 3982 } 3983 if (iVideoMIO) 3984 { 3985 OSCL_DELETE(iVideoMIO); 3986 iVideoMIO = NULL; 3987 } 3988 3989 // Call Remove audio data sink on player. 3990 if (iAudioNode && iAudioMIO) 3991 { 3992 cmdstatus = DoRDSPlayerRemoveAudioDataSink(aUtilContext.iCmdId, aUtilContext.iCmdContext); 3993 } 3994 else 3995 { 3996 // Audio sink not available so go to player reset 3997 cmdstatus = DoRDSPlayerReset(aUtilContext.iCmdId, aUtilContext.iCmdContext); 3998 } 3999 if (cmdstatus != PVMFSuccess) 4000 { 4001 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveVideoDataSink() RemoveAudioDataSink on player failed. Report command as failed")); 4002 iAPICmdStatus = cmdstatus; 4003 if (iAPICmdErrMsg) 4004 { 4005 iAPICmdErrMsg->removeRef(); 4006 iAPICmdErrMsg = NULL; 4007 } 4008 // Need to shutdown/restart player and cleanup in utility's AO 4009 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4010 iErrorHandlingInUtilityAO = true; 4011 RunIfNotReady(); 4012 } 4013 break; 4014 4015 default: 4016 { 4017 // Cleanup the data sink 4018 iVideoDataSink.SetDataSinkNode(NULL); 4019 if (iVideoNode) 4020 { 4021 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iVideoNode); 4022 iVideoNode = NULL; 4023 } 4024 if (iVideoMIO) 4025 { 4026 OSCL_DELETE(iVideoMIO); 4027 iVideoMIO = NULL; 4028 } 4029 PVMFErrorInfoMessageInterface* nextmsg = NULL; 4030 if (aCmdResp.GetEventExtensionInterface()) 4031 { 4032 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 4033 } 4034 PVMFBasicErrorInfoMessage* errmsg = NULL; 4035 errmsg = CreateBasicErrInfoMessage(nextmsg); 4036 4037 iAPICmdStatus = aCmdResp.GetCmdStatus(); 4038 if (iAPICmdErrMsg) 4039 { 4040 iAPICmdErrMsg->removeRef(); 4041 iAPICmdErrMsg = NULL; 4042 } 4043 iAPICmdErrMsg = errmsg; 4044 4045 // Check if player is handling the error 4046 PVPlayerState playerstate; 4047 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 4048 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 4049 { 4050 // Wait for error handling to complete 4051 // Start a timer just in case the player does not report error handling complete 4052 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 4053 } 4054 else if (pretval == PVMFSuccess && playerstate == PVP_STATE_INITIALIZED) 4055 { 4056 // Call Reset() on player 4057 cmdstatus = DoRDSPlayerReset(aUtilContext.iCmdId, aUtilContext.iCmdContext); 4058 if (cmdstatus != PVMFSuccess) 4059 { 4060 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveVideoDataSink() Reset on player failed. Report command as failed")); 4061 iAPICmdStatus = cmdstatus; 4062 if (iAPICmdErrMsg) 4063 { 4064 iAPICmdErrMsg->removeRef(); 4065 iAPICmdErrMsg = NULL; 4066 } 4067 // Need to shutdown/restart player and cleanup in utility's AO 4068 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4069 iErrorHandlingInUtilityAO = true; 4070 RunIfNotReady(); 4071 } 4072 } 4073 else 4074 { 4075 // Need to shutdown/restart player and cleanup in utility's AO 4076 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4077 iErrorHandlingInUtilityAO = true; 4078 RunIfNotReady(); 4079 } 4080 } 4081 break; 4082 } 4083 4084 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveVideoDataSink() Out")); 4085 } 4086 4087 void PVFrameAndMetadataUtility::HandleRDSPlayerRemoveAudioDataSink(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 4088 { 4089 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveAudioDataSink() In")); 4090 4091 aUtilContext.iCmdType = -1; 4092 4093 PVMFStatus cmdstatus = PVMFFailure; 4094 4095 switch (aCmdResp.GetCmdStatus()) 4096 { 4097 case PVMFSuccess: 4098 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 4099 (0, "PVFrameAndMetadataUtility::RDSPlayerRemoveAudioDataSink completed successfully Tick=%d", OsclTickCount::TickCount())); 4100 // Cleanup the data sink 4101 iAudioDataSink.SetDataSinkNode(NULL); 4102 if (iAudioNode) 4103 { 4104 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iAudioNode); 4105 iAudioNode = NULL; 4106 } 4107 if (iAudioMIO) 4108 { 4109 OSCL_DELETE(iAudioMIO); 4110 iAudioMIO = NULL; 4111 } 4112 4113 // Call Reset() on player 4114 cmdstatus = DoRDSPlayerReset(aUtilContext.iCmdId, aUtilContext.iCmdContext); 4115 if (cmdstatus != PVMFSuccess) 4116 { 4117 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveAudioDataSink() Reset on player failed. Report command as failed")); 4118 iAPICmdStatus = cmdstatus; 4119 if (iAPICmdErrMsg) 4120 { 4121 iAPICmdErrMsg->removeRef(); 4122 iAPICmdErrMsg = NULL; 4123 } 4124 // Need to shutdown/restart player and cleanup in utility's AO 4125 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4126 iErrorHandlingInUtilityAO = true; 4127 RunIfNotReady(); 4128 } 4129 break; 4130 4131 default: 4132 { 4133 // Cleanup the data sink 4134 iAudioDataSink.SetDataSinkNode(NULL); 4135 if (iAudioNode) 4136 { 4137 PVMediaOutputNodeFactory::DeleteMediaOutputNode(iAudioNode); 4138 iAudioNode = NULL; 4139 } 4140 if (iAudioMIO) 4141 { 4142 OSCL_DELETE(iAudioMIO); 4143 iAudioMIO = NULL; 4144 } 4145 PVMFErrorInfoMessageInterface* nextmsg = NULL; 4146 if (aCmdResp.GetEventExtensionInterface()) 4147 { 4148 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 4149 } 4150 PVMFBasicErrorInfoMessage* errmsg = NULL; 4151 errmsg = CreateBasicErrInfoMessage(nextmsg); 4152 4153 iAPICmdStatus = aCmdResp.GetCmdStatus(); 4154 if (iAPICmdErrMsg) 4155 { 4156 iAPICmdErrMsg->removeRef(); 4157 iAPICmdErrMsg = NULL; 4158 } 4159 iAPICmdErrMsg = errmsg; 4160 4161 // Check if player is handling the error 4162 PVPlayerState playerstate; 4163 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 4164 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 4165 { 4166 // Wait for error handling to complete 4167 // Start a timer just in case the player does not report error handling complete 4168 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 4169 } 4170 else if (pretval == PVMFSuccess && playerstate == PVP_STATE_INITIALIZED) 4171 { 4172 // Call Reset() on player 4173 cmdstatus = DoRDSPlayerReset(aUtilContext.iCmdId, aUtilContext.iCmdContext); 4174 if (cmdstatus != PVMFSuccess) 4175 { 4176 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveAudioDataSink() Reset on player failed. Report command as failed")); 4177 iAPICmdStatus = cmdstatus; 4178 if (iAPICmdErrMsg) 4179 { 4180 iAPICmdErrMsg->removeRef(); 4181 iAPICmdErrMsg = NULL; 4182 } 4183 // Need to shutdown/restart player and cleanup in utility's AO 4184 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4185 iErrorHandlingInUtilityAO = true; 4186 RunIfNotReady(); 4187 } 4188 } 4189 else 4190 { 4191 // Need to shutdown/restart player and cleanup in utility's AO 4192 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4193 iErrorHandlingInUtilityAO = true; 4194 RunIfNotReady(); 4195 } 4196 } 4197 break; 4198 } 4199 4200 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveAudioDataSink() Out")); 4201 } 4202 4203 4204 void PVFrameAndMetadataUtility::HandleRDSPlayerReset(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 4205 { 4206 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerReset() In")); 4207 4208 aUtilContext.iCmdType = -1; 4209 4210 PVMFStatus cmdstatus = PVMFFailure; 4211 4212 switch (aCmdResp.GetCmdStatus()) 4213 { 4214 case PVMFSuccess: 4215 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 4216 (0, "PVFrameAndMetadataUtility::RDSPlayerReset completed successfully Tick=%d", OsclTickCount::TickCount())); 4217 // Call RemoveDataSource() on player 4218 cmdstatus = DoRDSPlayerRemoveDataSource(aUtilContext.iCmdId, aUtilContext.iCmdContext); 4219 if (cmdstatus != PVMFSuccess) 4220 { 4221 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerReset() RemoveDataSource on player failed. Report command as failed")); 4222 4223 iAPICmdStatus = cmdstatus; 4224 if (iAPICmdErrMsg) 4225 { 4226 iAPICmdErrMsg->removeRef(); 4227 iAPICmdErrMsg = NULL; 4228 } 4229 // Need to shutdown/restart player and cleanup in utility's AO 4230 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4231 iErrorHandlingInUtilityAO = true; 4232 RunIfNotReady(); 4233 } 4234 break; 4235 4236 default: 4237 { 4238 PVMFErrorInfoMessageInterface* nextmsg = NULL; 4239 if (aCmdResp.GetEventExtensionInterface()) 4240 { 4241 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 4242 } 4243 PVMFBasicErrorInfoMessage* errmsg = NULL; 4244 errmsg = CreateBasicErrInfoMessage(nextmsg); 4245 4246 iAPICmdStatus = aCmdResp.GetCmdStatus(); 4247 if (iAPICmdErrMsg) 4248 { 4249 iAPICmdErrMsg->removeRef(); 4250 iAPICmdErrMsg = NULL; 4251 } 4252 iAPICmdErrMsg = errmsg; 4253 4254 // Check if player is handling the error 4255 PVPlayerState playerstate; 4256 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 4257 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 4258 { 4259 // Wait for error handling to complete 4260 // Start a timer just in case the player does not report error handling complete 4261 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 4262 } 4263 else if (pretval == PVMFSuccess && playerstate == PVP_STATE_IDLE) 4264 { 4265 // Call RemoveDataSource() on player 4266 cmdstatus = DoRDSPlayerRemoveDataSource(aUtilContext.iCmdId, aUtilContext.iCmdContext); 4267 if (cmdstatus != PVMFSuccess) 4268 { 4269 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerReset() RemoveDataSource on player failed. Report command as failed")); 4270 iAPICmdStatus = cmdstatus; 4271 if (iAPICmdErrMsg) 4272 { 4273 iAPICmdErrMsg->removeRef(); 4274 iAPICmdErrMsg = NULL; 4275 } 4276 // Need to shutdown/restart player and cleanup in utility's AO 4277 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4278 iErrorHandlingInUtilityAO = true; 4279 RunIfNotReady(); 4280 } 4281 } 4282 else 4283 { 4284 // Need to shutdown/restart player and cleanup in utility's AO 4285 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4286 iErrorHandlingInUtilityAO = true; 4287 RunIfNotReady(); 4288 } 4289 } 4290 break; 4291 } 4292 4293 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerReset() Out")); 4294 } 4295 4296 4297 void PVFrameAndMetadataUtility::HandleRDSPlayerRemoveDataSource(PVFMUtilityContext& aUtilContext, const PVCmdResponse& aCmdResp) 4298 { 4299 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveDataSource() In")); 4300 4301 aUtilContext.iCmdType = -1; 4302 4303 switch (aCmdResp.GetCmdStatus()) 4304 { 4305 case PVMFSuccess: 4306 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 4307 (0, "PVFrameAndMetadataUtility::RDSPlayerRemoveDataSource completed successfully Tick=%d", OsclTickCount::TickCount())); 4308 // Utility's RemoveDataSource() successfully completed 4309 SetUtilityState(PVFM_UTILITY_STATE_IDLE); 4310 iDataSource = NULL; 4311 4312 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iPerfLogger, PVLOGMSG_NOTICE, 4313 (0, "PVFrameAndMetadataUtility::RemoveDataSource() completed successfully Tick=%d", OsclTickCount::TickCount())); 4314 4315 UtilityCommandCompleted(aUtilContext.iCmdId, aUtilContext.iCmdContext, PVMFSuccess); 4316 break; 4317 4318 default: 4319 { 4320 // Even if the player RemoveDataSource fails, 4321 // set the data source handle to NULL and change to idle state 4322 SetUtilityState(PVFM_UTILITY_STATE_IDLE); 4323 iDataSource = NULL; 4324 4325 PVMFErrorInfoMessageInterface* nextmsg = NULL; 4326 if (aCmdResp.GetEventExtensionInterface()) 4327 { 4328 nextmsg = GetErrorInfoMessageInterface(*(aCmdResp.GetEventExtensionInterface())); 4329 } 4330 4331 PVMFBasicErrorInfoMessage* errmsg = NULL; 4332 errmsg = CreateBasicErrInfoMessage(nextmsg); 4333 4334 iAPICmdStatus = aCmdResp.GetCmdStatus(); 4335 if (iAPICmdErrMsg) 4336 { 4337 iAPICmdErrMsg->removeRef(); 4338 iAPICmdErrMsg = NULL; 4339 } 4340 iAPICmdErrMsg = errmsg; 4341 4342 // Check if player is handling the error 4343 PVPlayerState playerstate; 4344 PVMFStatus pretval = iPlayer->GetPVPlayerStateSync(playerstate); 4345 if (pretval == PVMFSuccess && playerstate == PVP_STATE_ERROR) 4346 { 4347 // Wait for error handling to complete 4348 // Start a timer just in case the player does not report error handling complete 4349 iTimeoutTimer->Request(PVFMUTIL_TIMERID_PLAYERERRORTIMEOUT, 0, iErrorHandlingWaitTime, this, false); 4350 } 4351 else 4352 { 4353 // Need to shutdown/restart player and cleanup in utility's AO 4354 OSCL_ASSERT(iErrorHandlingInUtilityAO == false); 4355 iErrorHandlingInUtilityAO = true; 4356 RunIfNotReady(); 4357 } 4358 } 4359 break; 4360 } 4361 4362 PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVFrameAndMetadataUtility::HandleRDSPlayerRemoveDataSource() Out")); 4363 } 4364 4365 void PVFrameAndMetadataUtility::SetThumbnailDimensions(uint32 aWidth, uint32 aHeight) 4366 { 4367 iThumbnailWidth = aWidth; 4368 iThumbnailHeight = aHeight; 4369 } 4370 4371 void PVFrameAndMetadataUtility::GetThumbnailDimensions(uint32 &aWidth, uint32 &aHeight) 4372 { 4373 aWidth = iThumbnailWidth; 4374 aHeight = iThumbnailHeight; 4375 } 4376 4377 PVMFErrorInfoMessageInterface* PVFrameAndMetadataUtility::GetErrorInfoMessageInterface(PVInterface& aInterface) 4378 { 4379 PVInterface* temp = NULL; 4380 if (aInterface.queryInterface(PVMFErrorInfoMessageInterfaceUUID, temp)) 4381 { 4382 PVMFErrorInfoMessageInterface* extiface = OSCL_STATIC_CAST(PVMFErrorInfoMessageInterface*, temp); 4383 return extiface; 4384 } 4385 else 4386 { 4387 return NULL; 4388 } 4389 } 4390 4391 PVMFBasicErrorInfoMessage* PVFrameAndMetadataUtility::CreateBasicErrInfoMessage(PVMFErrorInfoMessageInterface* nextmsg, PVFMErrorEventType aErrEvent) 4392 { 4393 PVUuid puuid = PVFrameAndMetadataErrorInfoEventTypesUUID; 4394 PVMFBasicErrorInfoMessage* errmsg = NULL; 4395 int32 leavecode = OsclErrNone; 4396 OSCL_TRY(leavecode, errmsg = OSCL_NEW(PVMFBasicErrorInfoMessage, (aErrEvent, puuid, nextmsg))); 4397 OSCL_FIRST_CATCH_ANY(leavecode, 4398 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFrameAndMetadataUtility::CreateBasicErrInfoMessage() Instantiation of error msg did a leave!")); 4399 errmsg = NULL;); 4400 return errmsg; 4401 } 4402