Home | History | Annotate | Download | only in src
      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 #ifndef PVMF_JB_JITTERBUFFERMISC_H_INCLUDED
     19 #include "pvmf_jitter_buffer_node.h"
     20 #endif
     21 
     22 #ifndef PVMF_JITTER_BUFFER_COMMON_TYPES_H_INCLUDED
     23 #include "pvmf_jitter_buffer_common_types.h"
     24 #endif
     25 
     26 
     27 #ifndef OSCL_EXCLUSIVE_PTR_H_INCLUDED
     28 #include "oscl_exclusive_ptr.h"
     29 #endif
     30 
     31 #ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
     32 #include "pvmf_media_clock.h"
     33 #endif
     34 
     35 #ifndef __MEDIA_CLOCK_CONVERTER_H
     36 #include "media_clock_converter.h"
     37 #endif
     38 
     39 #ifndef PVMF_STREAMING_MANAGER_NODE_H_INCLUDED
     40 #include "pvmf_jitter_buffer_node.h"
     41 #endif
     42 
     43 #ifndef PVMF_JITTER_BUFFER_FACTORY_H
     44 #include "pvmf_jitter_buffer_factory.h"
     45 #endif
     46 
     47 #ifndef PVMF_MEDIA_DATA_H_INCLUDED
     48 #include "pvmf_media_data.h"
     49 #endif
     50 
     51 #ifndef PVMF_MEDIA_CMD_H_INCLUDED
     52 #include "pvmf_media_cmd.h"
     53 #endif
     54 
     55 #ifndef PVMF_MEDIA_MSG_FORMAT_IDS_H_INCLUDED
     56 #include "pvmf_media_msg_format_ids.h"
     57 #endif
     58 
     59 #ifndef PVLOGGER_H_INCLUDED
     60 #include "pvlogger.h"
     61 #endif
     62 
     63 #ifndef PVMF_SM_TUNABLES_H_INCLUDED
     64 #include "pvmf_sm_tunables.h"
     65 #endif
     66 
     67 #ifndef PVMF_BASIC_ERRORINFOMESSAGE_H_INCLUDED
     68 #include "pvmf_basic_errorinfomessage.h"
     69 #endif
     70 
     71 #ifndef OSCL_DLL_H_INCLUDED
     72 #include "oscl_dll.h"
     73 #endif
     74 
     75 #ifndef OSCL_MIME_STRING_UTILS_H
     76 #include "pv_mime_string_utils.h"
     77 #endif
     78 
     79 #ifndef OSCL_RAND_H_INCLUDED
     80 #include "oscl_rand.h"
     81 #endif
     82 
     83 // Define entry point for this DLL
     84 OSCL_DLL_ENTRY_POINT_DEFAULT()
     85 
     86 //Construction and Destruction
     87 OSCL_EXPORT_REF PVMFJitterBufferNode::PVMFJitterBufferNode(int32 aPriority,
     88         JitterBufferFactory* aJBFactory): OsclActiveObject(aPriority, "JitterBufferNode")
     89 {
     90     //Initialize capability
     91     iCapability.iCanSupportMultipleInputPorts = true;
     92     iCapability.iCanSupportMultipleOutputPorts = true;
     93     iCapability.iHasMaxNumberOfPorts = false;
     94     iCapability.iMaxNumberOfPorts = 0;//no maximum
     95     iCapability.iInputFormatCapability.push_back(PVMF_MIME_RTP);
     96     iCapability.iInputFormatCapability.push_back(PVMF_MIME_ASFFF);
     97     iCapability.iInputFormatCapability.push_back(PVMF_MIME_RMFF);
     98     iCapability.iOutputFormatCapability.push_back(PVMF_MIME_RTP);
     99     iCapability.iOutputFormatCapability.push_back(PVMF_MIME_ASFFF);
    100     //Jitter buffer factory
    101     ipJitterBufferFactory   =   aJBFactory;
    102 
    103     //Initialize loggers
    104     ipLogger = NULL;
    105     ipDataPathLogger = NULL;
    106     ipDataPathLoggerIn = NULL;
    107     ipDataPathLoggerOut = NULL;
    108     ipDataPathLoggerFlowCtrl = NULL;
    109     ipClockLogger = NULL;
    110     ipClockLoggerSessionDuration = NULL;
    111     ipClockLoggerRebuff = NULL;
    112     ipDiagnosticsLogger = NULL;
    113     ipJBEventsClockLogger = NULL;
    114 
    115     //Diagniostics related
    116     iDiagnosticsLogged = false;
    117     iNumRunL = 0;
    118 
    119     Construct();
    120     ResetNodeParams(false);
    121 }
    122 
    123 void PVMFJitterBufferNode::Construct()
    124 {
    125     //creation and initialization of objects that need to be created on heap in the ctor is done here
    126     iInputCommands.Construct(PVMF_JITTER_BUFFER_NODE_COMMAND_ID_START,
    127                              PVMF_JITTER_BUFFER_VECTOR_RESERVE);
    128     iCurrentCommand.Construct(0, 1);
    129 
    130     iPortVector.Construct(PVMF_JITTER_BUFFER_NODE_PORT_VECTOR_RESERVE);
    131 }
    132 
    133 void PVMFJitterBufferNode::ResetNodeParams(bool aReleaseMemory)
    134 {
    135     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ResetNodeParams In aReleaseMemory[%d]", aReleaseMemory));
    136     //Session specific initializations and resetting
    137 
    138     oStartPending = false;
    139     oStopOutputPorts = true;
    140     iPauseTime = 0;
    141     ipClientPlayBackClock = NULL;
    142     iMediaReceiveingChannelPrepared = false;
    143 
    144     iBroadCastSession = false;
    145 
    146     iDelayEstablished = false;
    147     iJitterBufferState = PVMF_JITTER_BUFFER_READY;
    148     iJitterDelayPercent = 0;
    149 
    150     //Extension interface initializations
    151     if (ipExtensionInterface && aReleaseMemory)
    152     {
    153         ipExtensionInterface->removeRef();
    154     }
    155     ipExtensionInterface = NULL;
    156 
    157     //Variables to persist info passed on by the extension interface
    158     iRebufferingThreshold = DEFAULT_JITTER_BUFFER_UNDERFLOW_THRESHOLD_IN_MS;
    159     iJitterBufferDurationInMilliSeconds = DEFAULT_JITTER_BUFFER_DURATION_IN_MS;
    160     iMaxInactivityDurationForMediaInMs = DEFAULT_MAX_INACTIVITY_DURATION_IN_MS;
    161     iEstimatedServerKeepAheadInMilliSeconds = DEFAULT_ESTIMATED_SERVER_KEEPAHEAD_FOR_OOO_SYNC_IN_MS;
    162 
    163     iJitterBufferSz = 0;
    164     iMaxNumBufferResizes = DEFAULT_MAX_NUM_SOCKETMEMPOOL_RESIZES;
    165     iBufferResizeSize = DEFAULT_MAX_SOCKETMEMPOOL_RESIZELEN_INPUT_PORT;
    166     iBufferingStatusIntervalInMs =
    167         (PVMF_JITTER_BUFFER_BUFFERING_STATUS_EVENT_CYCLES * 1000) / PVMF_JITTER_BUFFER_BUFFERING_STATUS_EVENT_FREQUENCY;
    168 
    169     iDisableFireWallPackets = false;
    170     //iPlayingAfterSeek = false;
    171 
    172     //Event Notifier initialization/reseting
    173     iIncomingMediaInactivityDurationCallBkId = 0;
    174     iIncomingMediaInactivityDurationCallBkPending = false;
    175     iNotifyBufferingStatusCallBkId = 0;
    176     iNotifyBufferingStatusCallBkPending = false;
    177 
    178 
    179     if (aReleaseMemory)
    180     {
    181         if (ipJitterBufferMisc)
    182             OSCL_DELETE(ipJitterBufferMisc);
    183     }
    184 
    185     ipJitterBufferMisc = NULL;
    186     ipEventNotifier = NULL;
    187 
    188 
    189     /* Clear queued messages in ports */
    190     uint32 i;
    191     for (i = 0; i < iPortVector.size(); i++)
    192     {
    193         PVMFJitterBufferPortParams* pPortParams = NULL;
    194         bool bRet = getPortContainer(iPortVector[i], pPortParams);
    195         if (bRet)
    196         {
    197             if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
    198             {
    199                 pPortParams->ipJitterBuffer->ResetJitterBuffer();
    200             }
    201 
    202             pPortParams->ResetParams();
    203         }
    204         iPortVector[i]->ClearMsgQueues();
    205     }
    206 
    207     //Cleaning up of conatiner objects
    208     /* delete corresponding port params */
    209 
    210     if (aReleaseMemory)
    211     {
    212         //port vect and port params Q
    213         Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
    214         for (it = iPortParamsQueue.begin();
    215                 it != iPortParamsQueue.end();
    216                 it++)
    217         {
    218             PVMFJitterBufferPortParams* pPortParams = *it;
    219 
    220             if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
    221             {
    222                 if (ipJitterBufferFactory)
    223                     ipJitterBufferFactory->Destroy(pPortParams->ipJitterBuffer);
    224             }
    225 
    226             OSCL_DELETE(&pPortParams->irPort);
    227             OSCL_DELETE(pPortParams);
    228         }
    229         iPortParamsQueue.clear();
    230         iPortVector.clear();
    231         iPortVector.Reconstruct();
    232     }
    233 
    234     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ResetNodeParams Out -"));
    235     return;
    236 }
    237 
    238 PVMFJitterBufferNode::~PVMFJitterBufferNode()
    239 {
    240     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::~PVMFJitterBufferNode In"));
    241     LogSessionDiagnostics();
    242     ResetNodeParams();
    243 
    244     /*
    245      * Cleanup commands
    246      * The command queues are self-deleting, but we want to
    247      * notify the observer of unprocessed commands.
    248      */
    249     while (!iCurrentCommand.empty())
    250     {
    251         CommandComplete(iCurrentCommand, iCurrentCommand.front(), PVMFFailure);
    252     }
    253     while (!iInputCommands.empty())
    254     {
    255         CommandComplete(iInputCommands, iInputCommands.front(), PVMFFailure);
    256     }
    257 
    258     Cancel();
    259     /* thread logoff */
    260     if (IsAdded())
    261         RemoveFromScheduler();
    262     CleanUp();
    263     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::~PVMFJitterBufferNode Out"));
    264 }
    265 
    266 void PVMFJitterBufferNode::CleanUp()    //Reverse of Construct
    267 {
    268     //noop
    269 }
    270 
    271 ///////////////////////////////////////////////////////////////////////////////
    272 //Implementation of overrides from PVInterface
    273 ///////////////////////////////////////////////////////////////////////////////
    274 
    275 ///////////////////////////////////////////////////////////////////////////////
    276 //Checks if the instance of PVMFJitterBufferExtensionInterfaceImpl is existing
    277 //If existing: Query from this interface if UUID mentioned is supported
    278 //If not existing: Instantiate PVMFJitterBufferExtensionInterfaceImpl
    279 //and query requested interface from the PVMFJitterBufferExtensionInterfaceImpl
    280 //Return Values:true/false
    281 //Leave Codes: OsclErrNoMemory
    282 //Leave Condition: If instance of PVMFJitterBufferExtensionInterfaceImpl cannot
    283 //be instantiated.
    284 ///////////////////////////////////////////////////////////////////////////////
    285 bool PVMFJitterBufferNode::queryInterface(const PVUuid& uuid, PVInterface*& iface)
    286 {
    287     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::queryInterface In"));
    288     iface = NULL;
    289     if (uuid == PVUuid(PVMF_JITTERBUFFERNODE_EXTENSIONINTERFACE_UUID))
    290     {
    291         if (!ipExtensionInterface)
    292         {
    293             OsclMemAllocator alloc;
    294             int32 err;
    295             OsclAny*ptr = NULL;
    296             OSCL_TRY(err,
    297                      ptr = alloc.ALLOCATE(sizeof(PVMFJitterBufferExtensionInterfaceImpl));
    298                     );
    299             if (err != OsclErrNone || !ptr)
    300             {
    301                 PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::queryInterface: Error - Out of memory"));
    302                 OSCL_LEAVE(OsclErrNoMemory);
    303             }
    304             ipExtensionInterface =
    305                 OSCL_PLACEMENT_NEW(ptr, PVMFJitterBufferExtensionInterfaceImpl(this));
    306         }
    307         return (ipExtensionInterface->queryInterface(uuid, iface));
    308     }
    309     else
    310     {
    311         return false;
    312     }
    313 }
    314 
    315 ///////////////////////////////////////////////////////////////////////////////
    316 //Implementation  of overrides from PVMFNodeInterface
    317 ///////////////////////////////////////////////////////////////////////////////
    318 
    319 ///////////////////////////////////////////////////////////////////////////////
    320 //Does thread-specific node creation and go to "Idle" state.
    321 //Creates logger objects
    322 //Adds the AO to the scheduler
    323 //Return values: PVMFSuccess/PVMFErrInvalidState
    324 //PVMFSuccess: If API call is successful and was made in EPVMFNodeCreated state
    325 //PVMFErrInvalidState: If API is called in the invalid state
    326 //Leave Codes: NA
    327 ///////////////////////////////////////////////////////////////////////////////
    328 OSCL_EXPORT_REF PVMFStatus PVMFJitterBufferNode::ThreadLogon()
    329 {
    330     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ThreadLogon In"));
    331     PVMFStatus status;
    332 
    333     switch (iInterfaceState)
    334     {
    335         case EPVMFNodeCreated:
    336         {
    337             if (!IsAdded())
    338                 AddToScheduler();
    339 
    340             ipLogger = PVLogger::GetLoggerObject("jitterbuffernode");
    341             ipDataPathLogger = PVLogger::GetLoggerObject("datapath.sourcenode.jitterbuffernode");
    342             ipDataPathLoggerIn = PVLogger::GetLoggerObject("datapath.sourcenode.jitterbuffernode.in");
    343             ipDataPathLoggerOut = PVLogger::GetLoggerObject("datapath.sourcenode.jitterbuffernode.out");
    344             ipDataPathLoggerFlowCtrl = PVLogger::GetLoggerObject("datapath.sourcenode.jitterbuffernode.flowctrl");
    345 
    346             ipClockLogger = PVLogger::GetLoggerObject("clock.jitterbuffernode");
    347             ipClockLoggerSessionDuration = PVLogger::GetLoggerObject("clock.streaming_manager.sessionduration");
    348             ipClockLoggerRebuff = PVLogger::GetLoggerObject("clock.jitterbuffernode.rebuffer");
    349 
    350             ipDiagnosticsLogger = PVLogger::GetLoggerObject("pvplayerdiagnostics.streamingmanager");
    351             ipJBEventsClockLogger = PVLogger::GetLoggerObject("jitterbuffernode.eventsclock");
    352 
    353             iDiagnosticsLogged = false;
    354             SetState(EPVMFNodeIdle);
    355             status = PVMFSuccess;
    356         }
    357         break;
    358         default:
    359             status = PVMFErrInvalidState;
    360             break;
    361     }
    362 
    363     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ThreadLogon Out retval - %d", status));
    364     return status;
    365 }
    366 
    367 ///////////////////////////////////////////////////////////////////////////////
    368 //Does thread-specific node cleanup and go to "Created" state.
    369 //Releases logger objects
    370 //Removes the AO to the scheduler
    371 //Return values: PVMFSuccess/PVMFErrInvalidState
    372 //PVMFSuccess: If API call is successful and was made in EPVMFNodeIdle state
    373 //PVMFErrInvalidState: If API is called in the invalid state
    374 //Leave Codes: NA
    375 ///////////////////////////////////////////////////////////////////////////////
    376 OSCL_EXPORT_REF PVMFStatus PVMFJitterBufferNode::ThreadLogoff()
    377 {
    378     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ThreadLogoff In"));
    379     PVMFStatus status = PVMFFailure;
    380 
    381     switch (iInterfaceState)
    382     {
    383         case EPVMFNodeIdle:
    384         {
    385             ResetNodeParams();
    386             ipLogger = NULL;
    387             ipDataPathLogger = NULL;
    388             ipDataPathLoggerIn = NULL;
    389             ipDataPathLoggerOut = NULL;
    390             ipClockLogger = NULL;
    391             ipClockLoggerSessionDuration = NULL;
    392             ipDiagnosticsLogger = NULL;
    393             ipDataPathLoggerFlowCtrl = NULL;
    394             if (IsAdded())
    395             {
    396                 RemoveFromScheduler();
    397             }
    398             SetState(EPVMFNodeCreated);
    399             status = PVMFSuccess;
    400         }
    401         break;
    402 
    403         default:
    404             status = PVMFErrInvalidState;
    405             break;
    406     }
    407     return status;
    408 }
    409 
    410 ///////////////////////////////////////////////////////////////////////////////
    411 //Retrieves node capabilities.
    412 //Decides supported input/output formats and provides node capabilities
    413 //Return values: PVMFSuccess/PVMFErrInvalidState
    414 //PVMFSuccess: If API call is successful
    415 //If Input/Output format could not be determined
    416 //Leave Codes: NA
    417 ///////////////////////////////////////////////////////////////////////////////
    418 OSCL_EXPORT_REF PVMFStatus PVMFJitterBufferNode::GetCapability(PVMFNodeCapability& aNodeCapability)
    419 {
    420     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::GetCapability In"));
    421     aNodeCapability = iCapability;
    422     return PVMFSuccess;
    423 }
    424 
    425 ///////////////////////////////////////////////////////////////////////////////
    426 //Retrives a port iterator.
    427 //Can Leave:No
    428 //Return values: PVMFSuccess/PVMFErrInvalidState
    429 //PVMFSuccess - If API call is successful
    430 ////////////////////////////////////////////////////////////////////////////////
    431 OSCL_EXPORT_REF PVMFPortIter* PVMFJitterBufferNode::GetPorts(const PVMFPortFilter* aFilter)
    432 {
    433     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::GetPorts"));
    434     OSCL_UNUSED_ARG(aFilter);//port filter is not implemented.
    435     iPortVector.Reset();
    436     return &iPortVector;
    437 }
    438 
    439 ///////////////////////////////////////////////////////////////////////////////
    440 //Retrives a port iterator.
    441 //Can Leave:No
    442 //Return values: PVMFSuccess/PVMFErrInvalidState
    443 //PVMFSuccess - If API call is successful
    444 //PVMFErrInvalidState - If API is called in the invalid state
    445 ////////////////////////////////////////////////////////////////////////////////
    446 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::QueryUUID(PVMFSessionId s,
    447         const PvmfMimeString& aMimeType,
    448         Oscl_Vector< PVUuid, OsclMemAllocator >& aUuids,
    449         bool aExactUuidsOnly ,
    450         const OsclAny* aContext)
    451 {
    452     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::QueryUUID"));
    453     PVMFJitterBufferNodeCommand cmd;
    454     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    455             PVMF_JITTER_BUFFER_NODE_QUERYUUID,
    456             aMimeType,
    457             aUuids,
    458             aExactUuidsOnly,
    459             aContext);
    460     return QueueCommandL(cmd);
    461 }
    462 
    463 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::QueryInterface(PVMFSessionId s,
    464         const PVUuid& aUuid,
    465         PVInterface*& aInterfacePtr,
    466         const OsclAny* aContext)
    467 {
    468     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:QueryInterface"));
    469     PVMFJitterBufferNodeCommand cmd;
    470     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    471             PVMF_JITTER_BUFFER_NODE_QUERYINTERFACE,
    472             aUuid,
    473             aInterfacePtr,
    474             aContext);
    475     return QueueCommandL(cmd);
    476 }
    477 
    478 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::RequestPort(PVMFSessionId s,
    479         int32 aPortTag,
    480         const PvmfMimeString* aPortConfig,
    481         const OsclAny* aContext)
    482 {
    483     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:RequestPort"));
    484     PVMFJitterBufferNodeCommand cmd;
    485     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    486             PVMF_JITTER_BUFFER_NODE_REQUESTPORT,
    487             aPortTag,
    488             aPortConfig,
    489             aContext);
    490     return QueueCommandL(cmd);
    491 }
    492 
    493 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::ReleasePort(PVMFSessionId s,
    494         PVMFPortInterface& aPort,
    495         const OsclAny* aContext)
    496 {
    497     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:ReleasePort"));
    498     PVMFJitterBufferNodeCommand cmd;
    499     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    500             PVMF_JITTER_BUFFER_NODE_RELEASEPORT,
    501             aPort,
    502             aContext);
    503     return QueueCommandL(cmd);
    504 }
    505 
    506 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::Init(PVMFSessionId s,
    507         const OsclAny* aContext)
    508 {
    509     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:Init"));
    510     PVMFJitterBufferNodeCommand cmd;
    511     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    512             PVMF_JITTER_BUFFER_NODE_INIT,
    513             aContext);
    514     return QueueCommandL(cmd);
    515 }
    516 
    517 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::Prepare(PVMFSessionId s,
    518         const OsclAny* aContext)
    519 {
    520     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:Prepare"));
    521     PVMFJitterBufferNodeCommand cmd;
    522     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    523             PVMF_JITTER_BUFFER_NODE_PREPARE,
    524             aContext);
    525     return QueueCommandL(cmd);
    526 }
    527 
    528 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::Start(PVMFSessionId s,
    529         const OsclAny* aContext)
    530 {
    531     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:Start"));
    532     PVMFJitterBufferNodeCommand cmd;
    533     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    534             PVMF_JITTER_BUFFER_NODE_START,
    535             aContext);
    536     return QueueCommandL(cmd);
    537 }
    538 
    539 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::Stop(PVMFSessionId s,
    540         const OsclAny* aContext)
    541 {
    542     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:Stop"));
    543     PVMFJitterBufferNodeCommand cmd;
    544     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    545             PVMF_JITTER_BUFFER_NODE_STOP,
    546             aContext);
    547     return QueueCommandL(cmd);
    548 }
    549 
    550 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::Flush(PVMFSessionId s,
    551         const OsclAny* aContext)
    552 {
    553     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:Flush"));
    554     PVMFJitterBufferNodeCommand cmd;
    555     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    556             PVMF_JITTER_BUFFER_NODE_FLUSH,
    557             aContext);
    558     return QueueCommandL(cmd);
    559 }
    560 
    561 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::Pause(PVMFSessionId s,
    562         const OsclAny* aContext)
    563 {
    564     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:Pause"));
    565     PVMFJitterBufferNodeCommand cmd;
    566     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    567             PVMF_JITTER_BUFFER_NODE_PAUSE,
    568             aContext);
    569     return QueueCommandL(cmd);
    570 }
    571 
    572 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::Reset(PVMFSessionId s,
    573         const OsclAny* aContext)
    574 {
    575     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:Reset"));
    576     PVMFJitterBufferNodeCommand cmd;
    577     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    578             PVMF_JITTER_BUFFER_NODE_RESET,
    579             aContext);
    580     return QueueCommandL(cmd);
    581 }
    582 
    583 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::CancelAllCommands(PVMFSessionId s,
    584         const OsclAny* aContextData)
    585 {
    586     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:CancelAllCommands"));
    587     PVMFJitterBufferNodeCommand cmd;
    588     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    589             PVMF_JITTER_BUFFER_NODE_CANCELALLCOMMANDS,
    590             aContextData);
    591     return QueueCommandL(cmd);
    592 }
    593 
    594 OSCL_EXPORT_REF PVMFCommandId PVMFJitterBufferNode::CancelCommand(PVMFSessionId s,
    595         PVMFCommandId aCmdId,
    596         const OsclAny* aContextData)
    597 {
    598     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:CancelCommand"));
    599     PVMFJitterBufferNodeCommand cmd;
    600     cmd.PVMFJitterBufferNodeCommandBase::Construct(s,
    601             PVMF_JITTER_BUFFER_NODE_CANCELCOMMAND,
    602             aCmdId,
    603             aContextData);
    604     return QueueCommandL(cmd);
    605 }
    606 
    607 void PVMFJitterBufferNode::HandlePortActivity(const PVMFPortActivity& aActivity)
    608 {
    609     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::PortActivity: port=0x%x, type=%d",
    610                          aActivity.iPort, aActivity.iType));
    611 
    612     PVMFJitterBufferPortParams* portParamsPtr = NULL;
    613     PVMFJitterBufferPort* jbPort = OSCL_STATIC_CAST(PVMFJitterBufferPort*, aActivity.iPort);
    614     portParamsPtr = jbPort->iPortParams;
    615 
    616     if (aActivity.iType != PVMF_PORT_ACTIVITY_DELETED)
    617     {
    618         if (portParamsPtr == NULL)
    619         {
    620             ReportErrorEvent(PVMFErrPortProcessing, (OsclAny*)(aActivity.iPort));
    621             PVMF_JBNODE_LOGERROR((0, "0x%x PVMFJitterBufferNode::HandlePortActivity - getPortContainer Failed", this));
    622             return;
    623         }
    624     }
    625 
    626     /*
    627      * A port is reporting some activity or state change.  This code
    628      * figures out whether we need to queue a processing event
    629      * for the AO, and/or report a node event to the observer.
    630      */
    631 
    632     switch (aActivity.iType)
    633     {
    634         case PVMF_PORT_ACTIVITY_CREATED:
    635             /*
    636              * Report port created info event to the node.
    637              */
    638             ReportInfoEvent(PVMFInfoPortCreated, (OsclAny*)aActivity.iPort);
    639             break;
    640 
    641         case PVMF_PORT_ACTIVITY_DELETED:
    642             /*
    643              * Report port deleted info event to the node.
    644              */
    645             ReportInfoEvent(PVMFInfoPortDeleted, (OsclAny*)aActivity.iPort);
    646             break;
    647 
    648         case PVMF_PORT_ACTIVITY_CONNECT:
    649             //nothing needed.
    650             break;
    651 
    652         case PVMF_PORT_ACTIVITY_DISCONNECT:
    653         {
    654             if (ipJitterBufferMisc)
    655             {
    656                 LogSessionDiagnostics();
    657                 ipJitterBufferMisc->StreamingSessionStopped();
    658             }
    659         }
    660         break;
    661 
    662         case PVMF_PORT_ACTIVITY_OUTGOING_MSG:
    663         {
    664             if (portParamsPtr->iProcessOutgoingMessages)
    665             {
    666                 /*
    667                  * An outgoing message was queued on this port.
    668                  * All ports have outgoing messages
    669                  * in this node
    670                  */
    671                 QueuePortActivity(portParamsPtr, aActivity);
    672             }
    673         }
    674         break;
    675 
    676         case PVMF_PORT_ACTIVITY_INCOMING_MSG:
    677         {
    678             /*
    679              * An outgoing message was queued on this port.
    680              * Only input and feedback ports have incoming messages
    681              * in this node
    682              */
    683             int32 portTag = portParamsPtr->iTag;
    684             switch (portTag)
    685             {
    686                 case PVMF_JITTER_BUFFER_PORT_TYPE_INPUT:
    687                 case PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK:
    688                     if (portParamsPtr->iProcessIncomingMessages)
    689                     {
    690                         QueuePortActivity(portParamsPtr, aActivity);
    691                     }
    692                     break;
    693 
    694                 default:
    695                     OSCL_ASSERT(false);
    696                     break;
    697             }
    698         }
    699         break;
    700 
    701         case PVMF_PORT_ACTIVITY_OUTGOING_QUEUE_BUSY:
    702         {
    703             int32 portTag = portParamsPtr->iTag;
    704             switch (portTag)
    705             {
    706                 case PVMF_JITTER_BUFFER_PORT_TYPE_INPUT:
    707                     /*
    708                      * We typically use incoming port's outgoing q
    709                      * only in case of 3GPP streaming, wherein we
    710                      * send firewall packets. If it is busy, it does
    711                      * not stop us from registering incoming data pkts.
    712                      * so do nothing.
    713                      */
    714                     break;
    715 
    716                 case PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT:
    717                 {
    718                     /*
    719                      * This implies that this output port cannot accept any more
    720                      * msgs on its outgoing queue. This would usually imply that
    721                      * the corresponding input port must stop processing messages,
    722                      * however in case of jitter buffer the input and output ports
    723                      * are separated by a huge jitter buffer. Therefore continue
    724                      * to process the input.
    725                      */
    726                 }
    727                 break;
    728 
    729                 case PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK:
    730                     portParamsPtr->iProcessIncomingMessages = false;
    731                     break;
    732 
    733                 default:
    734                     OSCL_ASSERT(false);
    735                     break;
    736             }
    737         }
    738         break;
    739 
    740         case PVMF_PORT_ACTIVITY_OUTGOING_QUEUE_READY:
    741         {
    742             int32 portTag = portParamsPtr->iTag;
    743             /*
    744              * Outgoing queue was previously busy, but is now ready.
    745              * We may need to schedule new processing events depending
    746              * on the port type.
    747              */
    748             switch (portTag)
    749             {
    750                 case PVMF_JITTER_BUFFER_PORT_TYPE_INPUT:
    751                     /*
    752                      * We never did anything in PVMF_PORT_ACTIVITY_OUTGOING_QUEUE_BUSY
    753                      * so do nothing
    754                      */
    755                     break;
    756 
    757                 case PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT:
    758                 {
    759                     /*
    760                      * This implies that this output port can accept more
    761                      * msgs on its outgoing queue. This implies that the corresponding
    762                      * input port can start processing messages again.
    763                      */
    764                     PVMFJitterBufferPort* jbPort = OSCL_STATIC_CAST(PVMFJitterBufferPort*, aActivity.iPort);
    765                     PVMFJitterBufferPortParams* inPortParams = jbPort->iCounterpartPortParams;
    766                     if (inPortParams != NULL)
    767                     {
    768                         inPortParams->iProcessIncomingMessages = true;
    769                     }
    770                     else
    771                     {
    772                         OSCL_ASSERT(false);
    773                     }
    774                 }
    775                 break;
    776 
    777                 case PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK:
    778                     portParamsPtr->iProcessIncomingMessages = true;
    779                     break;
    780 
    781                 default:
    782                     OSCL_ASSERT(false);
    783                     break;
    784             }
    785             if (IsAdded())
    786             {
    787                 RunIfNotReady();
    788             }
    789         }
    790         break;
    791 
    792         case PVMF_PORT_ACTIVITY_CONNECTED_PORT_BUSY:
    793         {
    794             /*
    795              * The connected port has become busy (its incoming queue is
    796              * busy).
    797              */
    798             int32 portTag = portParamsPtr->iTag;
    799             switch (portTag)
    800             {
    801                 case PVMF_JITTER_BUFFER_PORT_TYPE_INPUT:
    802                     break;
    803 
    804                 case PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT:
    805                 {
    806                     /*
    807                      * This implies that this output port cannot send any more
    808                      * msgs from its outgoing queue. It should stop processing
    809                      * messages till the connect port is ready.
    810                      */
    811                     portParamsPtr->iProcessOutgoingMessages = false;
    812                 }
    813                 break;
    814 
    815                 case PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK:
    816                     portParamsPtr->iProcessOutgoingMessages = false;
    817                     break;
    818 
    819                 default:
    820                     OSCL_ASSERT(false);
    821                     break;
    822             }
    823         }
    824         break;
    825 
    826         case PVMF_PORT_ACTIVITY_CONNECTED_PORT_READY:
    827         {
    828             /*
    829              * The connected port has transitioned from Busy to Ready.
    830              * It's time to start processing messages outgoing again.
    831              */
    832             int32 portTag = portParamsPtr->iTag;
    833             switch (portTag)
    834             {
    835                 case PVMF_JITTER_BUFFER_PORT_TYPE_INPUT:
    836                     break;
    837 
    838                 case PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT:
    839                     /*
    840                      * This implies that this output port can now send
    841                      * msgs from its outgoing queue. It can start processing
    842                      * messages now.
    843                      */
    844                     portParamsPtr->iProcessOutgoingMessages = true;
    845                     break;
    846 
    847                 case PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK:
    848                     portParamsPtr->iProcessOutgoingMessages = true;
    849                     break;
    850 
    851                 default:
    852                     OSCL_ASSERT(false);
    853                     break;
    854             }
    855             if (IsAdded())
    856             {
    857                 RunIfNotReady();
    858             }
    859         }
    860         break;
    861 
    862         default:
    863             break;
    864     }
    865 }
    866 
    867 /////////////////////////////////////////////////////
    868 // Port Processing routines
    869 /////////////////////////////////////////////////////
    870 void PVMFJitterBufferNode::QueuePortActivity(PVMFJitterBufferPortParams* aPortParams,
    871         const PVMFPortActivity &aActivity)
    872 {
    873     OSCL_UNUSED_ARG(aPortParams);
    874     OSCL_UNUSED_ARG(aActivity);
    875 
    876     if (IsAdded())
    877     {
    878         /*
    879          * wake up the AO to process the port activity event.
    880          */
    881         RunIfNotReady();
    882     }
    883 }
    884 
    885 ///////////////////////////////////////////////////////////////////////////////
    886 //Extension interfaces function implementation
    887 ///////////////////////////////////////////////////////////////////////////////
    888 void PVMFJitterBufferNode::SetRTCPIntervalInMicroSecs(uint32 aRTCPInterval)
    889 {
    890     OSCL_UNUSED_ARG(aRTCPInterval);
    891 }
    892 
    893 bool PVMFJitterBufferNode::SetPortParams(PVMFPortInterface* aPort,
    894         uint32 aTimeScale,
    895         uint32 aBitRate,
    896         OsclRefCounterMemFrag& aConfig,
    897         bool aRateAdaptation,
    898         uint32 aRateAdaptationFeedBackFrequency)
    899 {
    900     return SetPortParams(aPort, aTimeScale, aBitRate, aConfig, aRateAdaptation,
    901                          aRateAdaptationFeedBackFrequency, false);
    902 }
    903 
    904 bool PVMFJitterBufferNode::SetPlayRange(int32 aStartTimeInMS,
    905                                         int32 aStopTimeInMS,
    906                                         bool aPlayAfterASeek,
    907                                         bool aStopTimeAvailable)
    908 {
    909     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetPlayRange In StartTime[%d], StopTime[%d] StopTimeValid[%d] PlayingAfterSeek[%d]", aStartTimeInMS, aStopTimeInMS, aStopTimeAvailable, aPlayAfterASeek));
    910     ipJitterBufferMisc->SetPlayRange(aStartTimeInMS, aStopTimeInMS, aPlayAfterASeek, aStopTimeAvailable);
    911     return true;
    912 }
    913 
    914 void PVMFJitterBufferNode::SetPlayBackThresholdInMilliSeconds(uint32 aThreshold)
    915 {
    916     OSCL_UNUSED_ARG(aThreshold);
    917 }
    918 
    919 void PVMFJitterBufferNode::SetJitterBufferRebufferingThresholdInMilliSeconds(uint32 aThreshold)
    920 {
    921     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetJitterBufferRebufferingThresholdInMilliSeconds Threshhold[%d]", aThreshold));
    922     if (aThreshold < iJitterBufferDurationInMilliSeconds)
    923     {
    924         iRebufferingThreshold = aThreshold;
    925         Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
    926         for (it = iPortParamsQueue.begin(); it != iPortParamsQueue.end(); it++)
    927         {
    928             PVMFJitterBufferPortParams* pPortParams = *it;
    929             if ((pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT))
    930             {
    931                 PVMFJitterBuffer* jitterBuffer = pPortParams->ipJitterBuffer;
    932                 if (jitterBuffer)
    933                 {
    934                     jitterBuffer->SetRebufferingThresholdInMilliSeconds(aThreshold);
    935                 }
    936             }
    937         }
    938     }
    939 }
    940 
    941 void PVMFJitterBufferNode::GetJitterBufferRebufferingThresholdInMilliSeconds(uint32& aThreshold)
    942 {
    943     aThreshold = iRebufferingThreshold;
    944 }
    945 
    946 void PVMFJitterBufferNode::SetJitterBufferDurationInMilliSeconds(uint32 aDuration)
    947 {
    948     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetJitterBufferDurationInMilliSeconds Duration [%d]", aDuration));
    949     uint32 duration = iJitterBufferDurationInMilliSeconds;
    950     if (aDuration > iRebufferingThreshold)
    951     {
    952         duration = aDuration;
    953         iJitterBufferDurationInMilliSeconds = duration;
    954     }
    955 
    956     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
    957     for (it = iPortParamsQueue.begin(); it != iPortParamsQueue.end(); it++)
    958     {
    959         PVMFJitterBufferPortParams* pPortParams  = *it;
    960         if ((pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT))
    961         {
    962             PVMFJitterBuffer* jitterBuffer = pPortParams->ipJitterBuffer;
    963             if (jitterBuffer)
    964             {
    965                 jitterBuffer->SetDurationInMilliSeconds(duration);
    966             }
    967         }
    968     }
    969 }
    970 
    971 void PVMFJitterBufferNode::GetJitterBufferDurationInMilliSeconds(uint32& duration)
    972 {
    973     duration = iJitterBufferDurationInMilliSeconds;
    974 }
    975 
    976 void PVMFJitterBufferNode::SetEarlyDecodingTimeInMilliSeconds(uint32 duration)
    977 {
    978     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetEarlyDecodingTimeInMilliSeconds - Early Decoding Time [%d]", duration));
    979     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator iter;
    980     for (iter = iPortParamsQueue.begin(); iter != iPortParamsQueue.end(); iter++)
    981     {
    982         PVMFJitterBufferPortParams* pPortParams = *iter;
    983         if (pPortParams && (pPortParams->ipJitterBuffer) && (PVMF_JITTER_BUFFER_PORT_TYPE_INPUT == pPortParams->iTag))
    984         {
    985             pPortParams->ipJitterBuffer->SetEarlyDecodingTimeInMilliSeconds(duration);
    986         }
    987     }
    988 }
    989 
    990 void PVMFJitterBufferNode::SetBurstThreshold(float burstThreshold)
    991 {
    992     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetBurstThreshold burstThreshold[%f]", burstThreshold));
    993     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator iter;
    994     for (iter = iPortParamsQueue.begin(); iter != iPortParamsQueue.end(); iter++)
    995     {
    996         PVMFJitterBufferPortParams* pPortParams = *iter;
    997         if (pPortParams && (pPortParams->ipJitterBuffer) && (PVMF_JITTER_BUFFER_PORT_TYPE_INPUT == pPortParams->iTag))
    998         {
    999             pPortParams->ipJitterBuffer->SetBurstThreshold(burstThreshold);
   1000         }
   1001     }
   1002 }
   1003 
   1004 void PVMFJitterBufferNode::SetMaxInactivityDurationForMediaInMs(uint32 aDuration)
   1005 {
   1006     iMaxInactivityDurationForMediaInMs = aDuration;
   1007 }
   1008 
   1009 void PVMFJitterBufferNode::GetMaxInactivityDurationForMediaInMs(uint32& aDuration)
   1010 {
   1011     aDuration = iMaxInactivityDurationForMediaInMs;
   1012 }
   1013 
   1014 void PVMFJitterBufferNode::SetClientPlayBackClock(PVMFMediaClock* aClientClock)
   1015 {
   1016     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetClientPlayBackClock %x", aClientClock));
   1017     //remove ourself as observer of old clock, if any.
   1018     //Todo: Repetition should make sence only after call to Reset function.
   1019     ipClientPlayBackClock = aClientClock;
   1020 }
   1021 
   1022 bool PVMFJitterBufferNode::PrepareForRepositioning(bool oUseExpectedClientClockVal ,
   1023         uint32 aExpectedClientClockVal)
   1024 {
   1025     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::PrepareForRepositioning oUseExpectedClientClockVal[%d], aExpectedClientClockVal[%d]", oUseExpectedClientClockVal, aExpectedClientClockVal));
   1026     iJitterBufferState = PVMF_JITTER_BUFFER_IN_TRANSITION;
   1027     ipJitterBufferMisc->PrepareForRepositioning(oUseExpectedClientClockVal, aExpectedClientClockVal);
   1028     return true;
   1029 }
   1030 
   1031 bool PVMFJitterBufferNode::SetPortSSRC(PVMFPortInterface* aPort, uint32 aSSRC)
   1032 {
   1033     bool retval = false;
   1034     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetPortSSRC aPort[%x], aSSRC[%d]", aPort, aSSRC));
   1035     if(aPort)
   1036     {
   1037         Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::const_iterator iter;
   1038         for (iter = iPortParamsQueue.begin(); iter != iPortParamsQueue.end() ; ++iter)
   1039         {
   1040             if (iter && (*iter) && (&((*iter)->irPort) == aPort))
   1041             {
   1042                 retval = true;
   1043                 ipJitterBufferMisc->SetPortSSRC(aPort, aSSRC);
   1044                 break;
   1045             }
   1046         }
   1047     }
   1048     return retval;
   1049 }
   1050 
   1051 bool PVMFJitterBufferNode::SetPortRTPParams(PVMFPortInterface* aPort,
   1052         bool   aSeqNumBasePresent,
   1053         uint32 aSeqNumBase,
   1054         bool   aRTPTimeBasePresent,
   1055         uint32 aRTPTimeBase,
   1056         bool   aNPTTimeBasePresent,
   1057         uint32 aNPTInMS,
   1058         bool oPlayAfterASeek)
   1059 {
   1060     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetPortRTPParams In Port - 0x%x", aPort));
   1061     uint32 i;
   1062     //The above method is called only during 3GPP repositioning, however, since the aPort param in the signature
   1063     // takes care only of the input port, the output port msg queues aren't cleared.
   1064     // As a result ClearMsgQueues need to be called explicity on all the ports.
   1065     //The oPlayAfterASeek check is necessary since the clearing of msg queues has to be carried out only during repositioning,
   1066     // not otherwise
   1067     if (oPlayAfterASeek)
   1068     {
   1069         for (i = 0; i < iPortParamsQueue.size(); i++)
   1070         {
   1071             PVMFJitterBufferPortParams* pPortParams = iPortParamsQueue[i];
   1072             pPortParams->irPort.ClearMsgQueues();
   1073         }
   1074     }
   1075     for (i = 0; i < iPortParamsQueue.size(); i++)
   1076     {
   1077         PVMFJitterBufferPortParams* pPortParams = iPortParamsQueue[i];
   1078 
   1079         if (&pPortParams->irPort == aPort)
   1080         {
   1081             if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   1082             {
   1083                 if (pPortParams->ipJitterBuffer != NULL)
   1084                 {
   1085                     PVMFRTPInfoParams rtpInfoParams;
   1086                     rtpInfoParams.seqNumBaseSet = aSeqNumBasePresent;
   1087                     rtpInfoParams.seqNum = aSeqNumBase;
   1088                     rtpInfoParams.rtpTimeBaseSet = aRTPTimeBasePresent;
   1089                     rtpInfoParams.rtpTime = aRTPTimeBase;
   1090                     rtpInfoParams.nptTimeBaseSet = aNPTTimeBasePresent;
   1091                     rtpInfoParams.nptTimeInMS = aNPTInMS;
   1092                     rtpInfoParams.rtpTimeScale = pPortParams->iTimeScale;
   1093                     pPortParams->ipJitterBuffer->setRTPInfoParams(rtpInfoParams, oPlayAfterASeek);
   1094                     /* In case this is after a reposition purge the jitter buffer */
   1095                     if (oPlayAfterASeek)
   1096                     {
   1097                         uint32 timebase32 = 0;
   1098                         uint32 clientClock32 = 0;
   1099                         bool overflowFlag = false;
   1100                         if (ipClientPlayBackClock != NULL)
   1101                             ipClientPlayBackClock->GetCurrentTime32(clientClock32, overflowFlag, PVMF_MEDIA_CLOCK_MSEC, timebase32);
   1102 #if (PVLOGGER_INST_LEVEL > PVLOGMSG_INST_LLDBG)
   1103 
   1104                         PVMF_JBNODE_LOGCLOCK_REBUFF((0, "PVMFJitterBufferNode::setPortRTPParams - Purging Upto SeqNum =%d", aSeqNumBase));
   1105                         PVMF_JBNODE_LOGCLOCK_REBUFF((0, "PVMFJitterBufferNode::setPortRTPParams - Before Purge - ClientClock=%d",
   1106                                                      clientClock32));
   1107 #endif
   1108                         pPortParams->ipJitterBuffer->PurgeElementsWithSeqNumsLessThan(aSeqNumBase,
   1109                                 clientClock32);
   1110 #if (PVLOGGER_INST_LEVEL > PVLOGMSG_INST_LLDBG)
   1111                         PVMF_JBNODE_LOGCLOCK_REBUFF((0, "PVMFJitterBufferNode::setPortRTPParams - After Purge - ClientClock=%d",
   1112                                                      clientClock32));
   1113 #endif
   1114                         /*
   1115                          * Since we flushed the jitter buffer, set it to ready state,
   1116                          * reset the delay flag
   1117                          */
   1118                         iDelayEstablished = false;
   1119                         iJitterBufferState = PVMF_JITTER_BUFFER_READY;
   1120                         //iPlayingAfterSeek = true;
   1121                     }
   1122                 }
   1123                 return true;
   1124             }
   1125         }
   1126     }
   1127     return false;
   1128 }
   1129 
   1130 bool PVMFJitterBufferNode::SetPortRTCPParams(PVMFPortInterface* aPort,
   1131         int aNumSenders,
   1132         uint32 aRR,
   1133         uint32 aRS)
   1134 {
   1135     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetPortRTCPParams aPort - [0x%x]", aPort));
   1136     return ipJitterBufferMisc->SetPortRTCPParams(aPort, aNumSenders, aRR, aRS);
   1137 }
   1138 
   1139 PVMFTimestamp PVMFJitterBufferNode::GetActualMediaDataTSAfterSeek()
   1140 {
   1141     return ipJitterBufferMisc->GetActualMediaDataTSAfterSeek();
   1142 }
   1143 
   1144 PVMFTimestamp PVMFJitterBufferNode::GetMaxMediaDataTS()
   1145 {
   1146     return ipJitterBufferMisc->GetMaxMediaDataTS();
   1147 }
   1148 
   1149 PVMFStatus PVMFJitterBufferNode::SetServerInfo(PVMFJitterBufferFireWallPacketInfo& aServerInfo)
   1150 {
   1151     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetServerInfo In"));
   1152     if (iDisableFireWallPackets == false)
   1153     {
   1154         ipJitterBufferMisc->SetServerInfo(aServerInfo);
   1155     }
   1156     else
   1157     {
   1158         PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::setServerInfo: FW Pkts Disabled"));
   1159         if (iCurrentCommand.size() > 0)
   1160         {
   1161             if (iCurrentCommand.front().iCmd == PVMF_JITTER_BUFFER_NODE_PREPARE)
   1162             {
   1163                 /* No firewall packet exchange - Complete Prepare */
   1164                 CompletePrepare();
   1165             }
   1166         }
   1167     }
   1168     return PVMFSuccess;
   1169 }
   1170 
   1171 PVMFStatus PVMFJitterBufferNode::NotifyOutOfBandEOS()
   1172 {
   1173     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::NotifyOutOfBandEOS In"));
   1174     // Ignore Out Of Band EOS for any Non Live stream
   1175     if (ipJitterBufferMisc && (!ipJitterBufferMisc->PlayStopTimeAvailable()))
   1176     {
   1177         if (iJitterBufferState != PVMF_JITTER_BUFFER_IN_TRANSITION)
   1178         {
   1179             ipJitterBufferMisc->SetSessionDurationExpired();
   1180             CancelEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   1181             PVMF_JBNODE_LOGDATATRAFFIC((0, "PVMFJitterBufferNode::NotifyOutOfBandEOS - Out Of Band EOS Recvd"));
   1182             PVMF_JBNODE_LOGCLOCK_SESSION_DURATION((0, "PVMFJitterBufferNode::NotifyOutOfBandEOS - Out Of Band EOS Recvd"));
   1183         }
   1184         else
   1185         {
   1186             PVMF_JBNODE_LOGDATATRAFFIC((0, "PVMFJitterBufferNode::NotifyOutOfBandEOS - Ignoring Out Of Band EOS in Transition State"));
   1187             PVMF_JBNODE_LOGCLOCK_SESSION_DURATION((0, "PVMFJitterBufferNode::NotifyOutOfBandEOS - Ignoring Out Of Band EOS in Transition State"));
   1188         }
   1189     }
   1190     else
   1191     {
   1192         PVMF_JBNODE_LOGDATATRAFFIC((0, "PVMFJitterBufferNode::NotifyOutOfBandEOS - Ignoring Out Of Band EOS for Non Live Stream"));
   1193         PVMF_JBNODE_LOGCLOCK_SESSION_DURATION((0, "PVMFJitterBufferNode::NotifyOutOfBandEOS - Ignoring Out Of Band EOS for Non Live Stream"));
   1194     }
   1195     return PVMFSuccess;
   1196 }
   1197 
   1198 PVMFStatus PVMFJitterBufferNode::SendBOSMessage(uint32 aStreamID)
   1199 {
   1200     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SendBOSMessage In"));
   1201     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   1202     for (it = iPortParamsQueue.begin();
   1203             it != iPortParamsQueue.end();
   1204             it++)
   1205     {
   1206         PVMFJitterBufferPortParams* pPortParams = *it;
   1207         if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   1208         {
   1209             if (pPortParams->ipJitterBuffer)
   1210             {
   1211                 pPortParams->ipJitterBuffer->QueueBOSCommand(aStreamID);
   1212             }
   1213         }
   1214     }
   1215     PVMF_JBNODE_LOGDATATRAFFIC((0, "PVMFJitterBufferNode::SendBOSMessage - BOS Recvd"));
   1216     return PVMFSuccess;
   1217 }
   1218 
   1219 void PVMFJitterBufferNode::SetJitterBufferChunkAllocator(OsclMemPoolResizableAllocator*
   1220         aDataBufferAllocator, const PVMFPortInterface* aPort)
   1221 {
   1222     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetJitterBufferChunkAllocator -aPort 0x%x", aPort));
   1223     PVMFJitterBufferPort* port = OSCL_STATIC_CAST(PVMFJitterBufferPort*, aPort);
   1224     if (port->iPortParams->ipJitterBuffer)
   1225     {
   1226         port->iPortParams->ipJitterBuffer->SetJitterBufferChunkAllocator(aDataBufferAllocator);
   1227     }
   1228 }
   1229 
   1230 void PVMFJitterBufferNode::SetJitterBufferMemPoolInfo(const PvmfPortBaseImpl* aPort,
   1231         uint32 aSize,
   1232         uint32 aResizeSize,
   1233         uint32 aMaxNumResizes,
   1234         uint32 aExpectedNumberOfBlocksPerBuffer)
   1235 {
   1236     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetJitterBufferMemPoolInfo Port 0x%x", aPort));
   1237     PVMFJitterBufferPort* port = OSCL_STATIC_CAST(PVMFJitterBufferPort*, aPort);
   1238     if (port->iPortParams->ipJitterBuffer)
   1239     {
   1240         port->iPortParams->ipJitterBuffer->SetJitterBufferMemPoolInfo(aSize, aResizeSize, aMaxNumResizes, aExpectedNumberOfBlocksPerBuffer);
   1241     }
   1242 }
   1243 
   1244 void PVMFJitterBufferNode::GetJitterBufferMemPoolInfo(const PvmfPortBaseImpl* aPort,
   1245         uint32& aSize,
   1246         uint32& aResizeSize,
   1247         uint32& aMaxNumResizes,
   1248         uint32& aExpectedNumberOfBlocksPerBuffer) const
   1249 {
   1250     PVMFJitterBufferPort* port = OSCL_STATIC_CAST(PVMFJitterBufferPort*, aPort);
   1251     if (port->iPortParams->ipJitterBuffer)
   1252     {
   1253         port->iPortParams->ipJitterBuffer->GetJitterBufferMemPoolInfo(aSize, aResizeSize, aMaxNumResizes, aExpectedNumberOfBlocksPerBuffer);
   1254     }
   1255 }
   1256 
   1257 void PVMFJitterBufferNode::SetSharedBufferResizeParams(uint32 maxNumResizes,
   1258         uint32 resizeSize)
   1259 {
   1260     // make sure we're in a state that makes sense
   1261     OSCL_ASSERT((iInterfaceState == EPVMFNodeCreated) ||
   1262                 (iInterfaceState == EPVMFNodeIdle) ||
   1263                 (iInterfaceState == EPVMFNodeInitialized));
   1264 
   1265     iMaxNumBufferResizes = maxNumResizes;
   1266     iBufferResizeSize = resizeSize;
   1267 }
   1268 
   1269 void PVMFJitterBufferNode::GetSharedBufferResizeParams(uint32& maxNumResizes,
   1270         uint32& resizeSize)
   1271 {
   1272     maxNumResizes = iMaxNumBufferResizes;
   1273     resizeSize = iBufferResizeSize;
   1274 }
   1275 
   1276 bool PVMFJitterBufferNode::ClearJitterBuffer(PVMFPortInterface* aPort,
   1277         uint32 aSeqNum)
   1278 {
   1279     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ClearJitterBuffer Port 0x%x aSeqNum[%d]", aPort, aSeqNum));
   1280     /* Typically called only for HTTP streaming sessions */
   1281     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   1282     for (it = iPortParamsQueue.begin(); it != iPortParamsQueue.end(); it++)
   1283     {
   1284         PVMFJitterBufferPortParams* pPortParams = *it;
   1285         pPortParams->irPort.ClearMsgQueues();
   1286     }
   1287 
   1288     for (it = iPortParamsQueue.begin(); it != iPortParamsQueue.end(); it++)
   1289     {
   1290         PVMFJitterBufferPortParams* pPortParams = *it;
   1291         if (&pPortParams->irPort == aPort && (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT) && (pPortParams->ipJitterBuffer != NULL))
   1292         {
   1293             uint32 timebase32 = 0;
   1294             uint32 clientClock32 = 0;
   1295             bool overflowFlag = false;
   1296             if (ipClientPlayBackClock != NULL)
   1297                 ipClientPlayBackClock->GetCurrentTime32(clientClock32, overflowFlag, PVMF_MEDIA_CLOCK_MSEC, timebase32);
   1298             pPortParams->ipJitterBuffer->PurgeElementsWithSeqNumsLessThan(aSeqNum,
   1299                     clientClock32);
   1300             ipJitterBufferMisc->ResetSession();
   1301             iJitterBufferState = PVMF_JITTER_BUFFER_READY;
   1302             return true;
   1303         }
   1304     }
   1305     return false;
   1306 }
   1307 
   1308 void PVMFJitterBufferNode::FlushJitterBuffer()
   1309 {
   1310     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::FlushJitterBuffer In"));
   1311     for (uint32 i = 0; i < iPortParamsQueue.size(); i++)
   1312     {
   1313         PVMFJitterBufferPortParams* pPortParams = iPortParamsQueue[i];
   1314         if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   1315         {
   1316             if (pPortParams->ipJitterBuffer != NULL)
   1317             {
   1318                 pPortParams->ipJitterBuffer->FlushJitterBuffer();
   1319             }
   1320         }
   1321     }
   1322 }
   1323 
   1324 PVMFStatus PVMFJitterBufferNode::SetInputMediaHeaderPreParsed(PVMFPortInterface* aPort,
   1325         bool aHeaderPreParsed)
   1326 {
   1327     PVMFStatus status = PVMFFailure;
   1328     PVMFJitterBufferPort *port = OSCL_STATIC_CAST(PVMFJitterBufferPort*, aPort);
   1329     if (port)
   1330     {
   1331         PVMFJitterBufferPortParams* portParams = port->GetPortParams();
   1332         if (portParams && portParams->ipJitterBuffer)
   1333         {
   1334             status = portParams->ipJitterBuffer->SetInputPacketHeaderPreparsed(aHeaderPreParsed);
   1335         }
   1336     }
   1337     return status;
   1338 }
   1339 
   1340 PVMFStatus PVMFJitterBufferNode::HasSessionDurationExpired(bool& aExpired)
   1341 {
   1342     aExpired = ipJitterBufferMisc->IsSessionExpired();
   1343     PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::HasSessionDurationExpired %d", aExpired));
   1344     return PVMFSuccess;
   1345 }
   1346 
   1347 bool PVMFJitterBufferNode::PurgeElementsWithNPTLessThan(NptTimeFormat &aNPTTime)
   1348 {
   1349     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::PurgeElementsWithNPTLessThan"));
   1350     bool retval = false;
   1351 
   1352     if (ipJitterBufferMisc)
   1353     {
   1354         retval = ipJitterBufferMisc->PurgeElementsWithNPTLessThan(aNPTTime);
   1355     }
   1356 
   1357     iJitterBufferState = PVMF_JITTER_BUFFER_READY;
   1358 
   1359     return retval;
   1360 }
   1361 
   1362 void PVMFJitterBufferNode::SetBroadCastSession()
   1363 {
   1364     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetBroadCastSession"));
   1365     iBroadCastSession = true;
   1366     if (ipJitterBufferMisc)
   1367     {
   1368         ipJitterBufferMisc->SetBroadcastSession();
   1369     }
   1370 }
   1371 
   1372 void PVMFJitterBufferNode::DisableFireWallPackets()
   1373 {
   1374     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::DisableFireWallPackets"));
   1375     if (ipJitterBufferMisc)
   1376         ipJitterBufferMisc->MediaReceivingChannelPreparationRequired(false);
   1377 }
   1378 
   1379 void PVMFJitterBufferNode::UpdateJitterBufferState()
   1380 {
   1381     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::UpdateJitterBufferState"));
   1382     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator iter;
   1383     for (iter = iPortParamsQueue.begin(); iter != iPortParamsQueue.end(); iter ++)
   1384     {
   1385         PVMFJitterBufferPortParams* ptr = *iter;
   1386         if (PVMF_JITTER_BUFFER_PORT_TYPE_INPUT == ptr->iTag)
   1387         {
   1388             ptr->ipJitterBuffer->SetJitterBufferState(PVMF_JITTER_BUFFER_READY);
   1389         }
   1390     }
   1391     iDelayEstablished = true;
   1392 }
   1393 
   1394 void PVMFJitterBufferNode::StartOutputPorts()
   1395 {
   1396     oStopOutputPorts = false;
   1397 }
   1398 
   1399 void PVMFJitterBufferNode::StopOutputPorts()
   1400 {
   1401     oStopOutputPorts = true;
   1402 }
   1403 
   1404 ///////////////////////////////////////////////////////////////////////////////
   1405 //Used for the implementation of extension interface functions
   1406 ///////////////////////////////////////////////////////////////////////////////
   1407 bool
   1408 PVMFJitterBufferNode::SetPortParams(PVMFPortInterface* aPort,
   1409                                     uint32 aTimeScale,
   1410                                     uint32 aBitRate,
   1411                                     OsclRefCounterMemFrag& aConfig,
   1412                                     bool aRateAdaptation,
   1413                                     uint32 aRateAdaptationFeedBackFrequency,
   1414                                     uint aMaxNumBuffResizes, uint aBuffResizeSize)
   1415 {
   1416     return SetPortParams(aPort, aTimeScale, aBitRate, aConfig, aRateAdaptation,
   1417                          aRateAdaptationFeedBackFrequency, true,
   1418                          aMaxNumBuffResizes, aBuffResizeSize);
   1419 }
   1420 bool
   1421 PVMFJitterBufferNode::SetPortParams(PVMFPortInterface* aPort,
   1422                                     uint32 aTimeScale,
   1423                                     uint32 aBitRate,
   1424                                     OsclRefCounterMemFrag& aConfig,
   1425                                     bool aRateAdaptation,
   1426                                     uint32 aRateAdaptationFeedBackFrequency,
   1427                                     bool aUserSpecifiedBuffParams,
   1428                                     uint aMaxNumBuffResizes, uint aBuffResizeSize)
   1429 {
   1430     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::SetPortParams"));
   1431     OSCL_UNUSED_ARG(aUserSpecifiedBuffParams);
   1432     uint32 ii;
   1433     for (ii = 0; ii < iPortParamsQueue.size(); ii++)
   1434     {
   1435         PVMFJitterBufferPortParams* pPortParams = iPortParamsQueue[ii];
   1436 
   1437         if (&pPortParams->irPort == aPort)
   1438         {
   1439             pPortParams->iTimeScale = aTimeScale;
   1440             pPortParams->iMediaClockConverter.set_timescale(aTimeScale);
   1441             pPortParams->iBitrate = aBitRate;
   1442             if (pPortParams->ipJitterBuffer)
   1443             {
   1444                 pPortParams->ipJitterBuffer->SetTrackConfig(aConfig);
   1445                 pPortParams->ipJitterBuffer->SetTimeScale(aTimeScale);
   1446                 pPortParams->ipJitterBuffer->SetMediaClockConverter(&pPortParams->iMediaClockConverter);
   1447             }
   1448 
   1449 
   1450             /* Compute buffer size based on bitrate and jitter duration*/
   1451             uint32 sizeInBytes = 0;
   1452             if (((int32)iJitterBufferDurationInMilliSeconds > 0) &&
   1453                     ((int32)aBitRate > 0))
   1454             {
   1455                 uint32 byteRate = aBitRate / 8;
   1456                 uint32 overhead = (byteRate * PVMF_JITTER_BUFFER_NODE_MEM_POOL_OVERHEAD) / 100;
   1457                 uint32 durationInSec = iJitterBufferDurationInMilliSeconds / 1000;
   1458                 sizeInBytes = ((byteRate + overhead) * durationInSec);
   1459                 if (sizeInBytes < MIN_RTP_SOCKET_MEM_POOL_SIZE_IN_BYTES)
   1460                 {
   1461                     sizeInBytes = MIN_RTP_SOCKET_MEM_POOL_SIZE_IN_BYTES;
   1462                 }
   1463                 sizeInBytes += (2 * MAX_SOCKET_BUFFER_SIZE);
   1464             }
   1465 
   1466             if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   1467             {
   1468                 PVMFJitterBuffer* jitterBuffer = NULL;
   1469                 jitterBuffer = pPortParams->ipJitterBuffer;
   1470 
   1471                 if (jitterBuffer)
   1472                 {
   1473                     pPortParams->ipJitterBuffer->SetJitterBufferMemPoolInfo(sizeInBytes, aBuffResizeSize, aMaxNumBuffResizes, 3000);
   1474                 }
   1475 
   1476                 if (ipJitterBufferMisc)
   1477                     ipJitterBufferMisc->SetRateAdaptationInfo(&pPortParams->irPort, aRateAdaptation, aRateAdaptationFeedBackFrequency, sizeInBytes);
   1478             }
   1479 
   1480             iPortParamsQueue[ii] = pPortParams;
   1481             return true;
   1482         }
   1483     }
   1484     return false;
   1485 }
   1486 
   1487 // This routine is called by various command APIs to queue an
   1488 // asynchronous command for processing by the command handler AO.
   1489 // This function may leave if the command can't be queued due to
   1490 // memory allocation failure.
   1491 PVMFCommandId PVMFJitterBufferNode::QueueCommandL(PVMFJitterBufferNodeCommand& aCmd)
   1492 {
   1493     PVMFCommandId id;
   1494 
   1495     id = iInputCommands.AddL(aCmd);
   1496 
   1497     if (IsAdded())
   1498     {
   1499         //wakeup the AO
   1500         RunIfNotReady();
   1501     }
   1502     return id;
   1503 }
   1504 
   1505 ///////////////////////////////////////////////////////////////////////////////
   1506 //OsclActiveObject Implementation
   1507 ///////////////////////////////////////////////////////////////////////////////
   1508 /**
   1509  * This AO handles both API commands and port activity.
   1510  * The AO will either process one command or service one connected
   1511  * port per call.  It will re-schedule itself and run continuously
   1512  * until it runs out of things to do.
   1513  */
   1514 void PVMFJitterBufferNode::Run()
   1515 {
   1516     iNumRunL++;
   1517     /*
   1518      * Process commands.
   1519      */
   1520     if (!iInputCommands.empty())
   1521     {
   1522         if (ProcessCommand(iInputCommands.front()))
   1523         {
   1524             /*
   1525              * note: need to check the state before re-scheduling
   1526              * since the node could have been reset in the ProcessCommand
   1527              * call.
   1528              */
   1529             if (iInterfaceState != EPVMFNodeCreated)
   1530             {
   1531                 if (IsAdded())
   1532                 {
   1533                     RunIfNotReady();
   1534                 }
   1535             }
   1536             return;
   1537         }
   1538     }
   1539 
   1540     /*
   1541      * Process port activity
   1542      */
   1543     if (((iInterfaceState == EPVMFNodeInitialized) ||
   1544             (iInterfaceState == EPVMFNodePrepared) ||
   1545             (iInterfaceState == EPVMFNodeStarted)  ||
   1546             (iInterfaceState == EPVMFNodePaused)) ||
   1547             FlushPending())
   1548     {
   1549         uint32 i;
   1550         for (i = 0; i < iPortVector.size(); i++)
   1551         {
   1552             PVMFJitterBufferPortParams* portContainerPtr =
   1553                 iPortVector[i]->iPortParams;
   1554 
   1555             if (portContainerPtr == NULL)
   1556             {
   1557                 if (!getPortContainer(iPortVector[i], portContainerPtr))
   1558                 {
   1559                     PVMF_JBNODE_LOGERROR((0, "0x%x PVMFJitterBufferNode::Run: Error - getPortContainer failed", this));
   1560                     return;
   1561                 }
   1562                 iPortVector[i]->iPortParams = portContainerPtr;
   1563             }
   1564 
   1565             ProcessPortActivity(portContainerPtr);
   1566         }
   1567 
   1568         if (CheckForPortRescheduling())
   1569         {
   1570             if (IsAdded())
   1571             {
   1572                 /*
   1573                  * Re-schedule since there is atleast one port that needs processing
   1574                  */
   1575                 RunIfNotReady();
   1576             }
   1577             return;
   1578         }
   1579     }
   1580 
   1581     /*
   1582      * If we get here we did not process any ports or commands.
   1583      * Check for completion of a flush command...
   1584      */
   1585     if (FlushPending() && (!CheckForPortActivityQueues()))
   1586     {
   1587         uint32 i;
   1588         /*
   1589          * Debug check-- all the port queues should be empty at
   1590          * this point.
   1591          */
   1592         for (i = 0; i < iPortVector.size(); i++)
   1593         {
   1594             if (iPortVector[i]->IncomingMsgQueueSize() > 0 ||
   1595                     iPortVector[i]->OutgoingMsgQueueSize() > 0)
   1596             {
   1597                 OSCL_ASSERT(false);
   1598             }
   1599         }
   1600         /*
   1601          * Flush is complete.  Go to prepared state.
   1602          */
   1603         SetState(EPVMFNodePrepared);
   1604         /*
   1605          * resume port input so the ports can be re-started.
   1606          */
   1607         for (i = 0; i < iPortVector.size(); i++)
   1608         {
   1609             iPortVector[i]->ResumeInput();
   1610         }
   1611         CommandComplete(iCurrentCommand, iCurrentCommand.front(), PVMFSuccess);
   1612         if (IsAdded())
   1613         {
   1614             RunIfNotReady();
   1615         }
   1616     }
   1617     return;
   1618 }
   1619 
   1620 void PVMFJitterBufferNode::DoCancel()
   1621 {
   1622     /*
   1623      * the base class cancel operation is sufficient.
   1624      */
   1625     OsclActiveObject::DoCancel();
   1626 }
   1627 
   1628 bool PVMFJitterBufferNode::ProcessPortActivity(PVMFJitterBufferPortParams* aPortParams)
   1629 {
   1630     if (!aPortParams)
   1631     {
   1632         return false;
   1633     }
   1634 
   1635     PVMFStatus status = PVMFSuccess;
   1636     switch (aPortParams->iTag)
   1637     {
   1638         case PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT:
   1639         {
   1640             if ((aPortParams->iProcessOutgoingMessages) &&
   1641                     (aPortParams->irPort.OutgoingMsgQueueSize() > 0))
   1642             {
   1643                 status = ProcessOutgoingMsg(aPortParams);
   1644             }
   1645             /*
   1646              * Send data out of jitter buffer as long as there's:
   1647              *  - more data to send
   1648              *  - outgoing queue isn't in a Busy state.
   1649              *  - ports are not paused
   1650              */
   1651             PVMFJitterBufferPort* outPort = OSCL_STATIC_CAST(PVMFJitterBufferPort*, &aPortParams->irPort);
   1652             PVMFJitterBufferPortParams* inPortParamsPtr = outPort->iCounterpartPortParams;
   1653             if (aPortParams->iProcessOutgoingMessages)
   1654             {
   1655                 if ((oStopOutputPorts == false) && (inPortParamsPtr->iCanReceivePktFromJB))
   1656                 {
   1657                     SendData(OSCL_STATIC_CAST(PVMFPortInterface*, &inPortParamsPtr->irPort));
   1658                 }
   1659             }
   1660         }
   1661         break;
   1662 
   1663         case PVMF_JITTER_BUFFER_PORT_TYPE_INPUT:
   1664         {
   1665             PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ProcessPortActivity: input port- aPortParams->iProcessIncomingMessages %d aPortParams->iPort->IncomingMsgQueueSize()  %d" ,
   1666                                  aPortParams->iProcessIncomingMessages, aPortParams->irPort.IncomingMsgQueueSize()));
   1667             if ((aPortParams->iProcessIncomingMessages) &&
   1668                     (aPortParams->irPort.IncomingMsgQueueSize() > 0))
   1669             {
   1670                 status = ProcessIncomingMsg(aPortParams);
   1671             }
   1672             if ((aPortParams->iProcessOutgoingMessages) &&
   1673                     (aPortParams->irPort.OutgoingMsgQueueSize() > 0))
   1674             {
   1675                 status = ProcessOutgoingMsg(aPortParams);
   1676             }
   1677         }
   1678         break;
   1679 
   1680         case PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK:
   1681         {
   1682             PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ProcessPortActivity: - aPortParams->iProcessIncomingMessages %d aPortParams->iPort->IncomingMsgQueueSize()  %d" ,
   1683                                  aPortParams->iProcessIncomingMessages, aPortParams->irPort.IncomingMsgQueueSize()));
   1684 
   1685             if ((aPortParams->iProcessIncomingMessages) &&
   1686                     (aPortParams->irPort.IncomingMsgQueueSize() > 0))
   1687             {
   1688                 status = ProcessIncomingMsg(aPortParams);
   1689             }
   1690             if ((aPortParams->iProcessOutgoingMessages) &&
   1691                     (aPortParams->irPort.OutgoingMsgQueueSize() > 0))
   1692             {
   1693                 status = ProcessOutgoingMsg(aPortParams);
   1694             }
   1695         }
   1696         break;
   1697 
   1698         default:
   1699             break;
   1700     }
   1701 
   1702     /*
   1703      * Report any unexpected failure in port processing...
   1704      * (the InvalidState error happens when port input is suspended,
   1705      * so don't report it.)
   1706      */
   1707     if (status != PVMFErrBusy
   1708             && status != PVMFSuccess
   1709             && status != PVMFErrInvalidState)
   1710     {
   1711         PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ProcessPortActivity: Error - ProcessPortActivity failed. port=0x%x",
   1712                               &aPortParams->irPort));
   1713         ReportErrorEvent(PVMFErrPortProcessing, (OsclAny*)(&aPortParams->irPort));
   1714     }
   1715 
   1716     /*
   1717      * return true if we processed an activity...
   1718      */
   1719     return (status != PVMFErrBusy);
   1720 }
   1721 
   1722 ///////////////////////////////////////////////////////////////////////////////
   1723 //Processing of incoming msg
   1724 ///////////////////////////////////////////////////////////////////////////////
   1725 PVMFStatus PVMFJitterBufferNode::ProcessIncomingMsg(PVMFJitterBufferPortParams* aPortParams)
   1726 {
   1727     PVUuid eventuuid = PVMFJitterBufferNodeEventTypeUUID;
   1728     PVMFPortInterface* aPort = &aPortParams->irPort;
   1729 
   1730     PVMF_JBNODE_LOGDATATRAFFIC_IN((0, "PVMFJitterBufferNode::ProcessIncomingMsg: %s Tag %d", aPortParams->iMimeType.get_cstr(), aPortParams->iTag));
   1731 
   1732     aPortParams->iNumMediaMsgsRecvd++;
   1733 
   1734     if (aPortParams->iMonitorForRemoteActivity == true)
   1735     {
   1736         CancelEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   1737         RequestEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   1738     }
   1739 
   1740     switch (aPortParams->iTag)
   1741     {
   1742         case PVMF_JITTER_BUFFER_PORT_TYPE_INPUT:
   1743         {
   1744             /* Parse packet header - mainly to retrieve time stamp */
   1745             PVMFJitterBuffer* jitterBuffer = aPortParams->ipJitterBuffer;
   1746             if (jitterBuffer == NULL)
   1747             {
   1748                 PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ProcessIncomingMsg: findJitterBuffer failed"));
   1749                 int32 errcode = PVMFJitterBufferNodeUnableToRegisterIncomingPacket;
   1750                 ReportErrorEvent(PVMFErrArgument, (OsclAny*)(aPort), &eventuuid, &errcode);
   1751                 return PVMFErrArgument;
   1752             }
   1753 
   1754             /*
   1755              * Incoming message recvd on the input port.
   1756              * Dequeue the message
   1757              */
   1758             PVMFSharedMediaMsgPtr msg;
   1759             PVMFStatus status = aPort->DequeueIncomingMsg(msg);
   1760             if (status != PVMFSuccess)
   1761             {
   1762                 ReportErrorEvent(PVMFErrPortProcessing, (OsclAny*)(aPort));
   1763                 PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ProcessIncomingMsg: Error - INPUT PORT - DequeueIncomingMsg failed"));
   1764                 return status;
   1765             }
   1766 
   1767             PVMFJitterBufferRegisterMediaMsgStatus regStatus = jitterBuffer->RegisterMediaMsg(msg);
   1768             switch (regStatus)
   1769             {
   1770 
   1771                 case PVMF_JB_REGISTER_MEDIA_MSG_SUCCESS:
   1772                 {
   1773                     PVMF_JBNODE_LOGDATATRAFFIC_IN((0, "PVMFJitterBufferNode::ProcessIncomingMsg: Packet registered successfully Mime %s", aPortParams->iMimeType.get_cstr()));
   1774                 }
   1775                 break;
   1776                 case PVMF_JB_REGISTER_MEDIA_MSG_FAILURE_JB_FULL:
   1777                 {
   1778                     aPortParams->iProcessIncomingMessages = false;
   1779                     jitterBuffer->NotifyFreeSpaceAvailable();
   1780                     int32 infocode = PVMFJitterBufferNodeJitterBufferFull;
   1781                     ReportInfoEvent(PVMFInfoOverflow, (OsclAny*)(aPort), &eventuuid, &infocode);
   1782                     PVMF_JBNODE_LOGDATATRAFFIC_IN((0, "PVMFJitterBufferNode::ProcessIncomingMsg: Jitter Buffer full"));
   1783                     PVMF_JBNODE_LOGDATATRAFFIC_FLOWCTRL_E((0, "PVMFJitterBufferNode::ProcessIncomingMsg: Jitter Buffer full"));
   1784                     return PVMFErrBusy;
   1785                 }
   1786                 break;
   1787                 case PVMF_JB_REGISTER_MEDIA_MSG_FAILURE_INSUFFICIENT_MEMORY_FOR_PACKETIZATION:
   1788                 {
   1789                     aPortParams->iProcessIncomingMessages = false;
   1790                     jitterBuffer->NotifyFreeSpaceAvailable();
   1791                     return PVMFErrBusy;
   1792                 }
   1793                 break;
   1794                 case PVMF_JB_REGISTER_MEDIA_MSG_ERR_CORRUPT_PACKET:
   1795                 {
   1796                     PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ProcessIncomingMsg: unable to register packet"));
   1797                     int32 errcode = PVMFJitterBufferNodeUnableToRegisterIncomingPacket;
   1798                     ReportErrorEvent(PVMFErrArgument, (OsclAny*)(aPort), &eventuuid, &errcode);
   1799                     return PVMFErrArgument;
   1800                 }
   1801                 case PVMF_JB_REGISTER_MEDIA_MSG_ERR_EOS_SIGNALLED:
   1802                 {
   1803                     PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ProcessIncomingMsg: data received after signalling EOS"));
   1804                 }
   1805                 break;
   1806                 default:
   1807                 {
   1808                     PVMF_JBNODE_LOGDATATRAFFIC_IN((0, "PVMFJitterBufferNode::ProcessIncomingMsg: Packet could not be registered Register packet returned status %d", regStatus));
   1809                     PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ProcessIncomingMsg: Packet could not be registered Register packet returned status %d", regStatus));
   1810                 }
   1811             }
   1812             SendData(aPort);
   1813         }
   1814         break;
   1815 
   1816         case PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK:
   1817         {
   1818             /*
   1819              * Incoming RTCP reports - recvd on the input port.
   1820              * Dequeue the message - Need to fully implement
   1821              * RTCP
   1822              */
   1823             PVMFSharedMediaMsgPtr msg;
   1824             PVMFStatus status = aPort->DequeueIncomingMsg(msg);
   1825             if (status != PVMFSuccess)
   1826             {
   1827                 ReportErrorEvent(PVMFErrPortProcessing, (OsclAny*)(aPort));
   1828                 PVMF_JBNODE_LOGERROR((0, "0x%x PVMFJitterBufferNode::ProcessIncomingMsg: Error - FB PORT - DequeueIncomingMsg failed", this));
   1829                 return status;
   1830             }
   1831             status = ipJitterBufferMisc->ProcessFeedbackMessage(*aPortParams, msg);
   1832             PVMF_JBNODE_LOGDATATRAFFIC_IN((0, "PVMFJitterBufferNode::ProcessIncomingMsg: Feedback Packet registered with status code status %d", status));
   1833         }
   1834         break;
   1835 
   1836         default:
   1837         {
   1838             ReportErrorEvent(PVMFErrPortProcessing, (OsclAny*)(aPort));
   1839             PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ProcessIncomingMsg - Invalid Port Tag"));
   1840             return PVMFFailure;
   1841         }
   1842     }
   1843     return (PVMFSuccess);
   1844 }
   1845 
   1846 ///////////////////////////////////////////////////////////////////////////////
   1847 //Processing of outgoing msg
   1848 ///////////////////////////////////////////////////////////////////////////////
   1849 PVMFStatus PVMFJitterBufferNode::ProcessOutgoingMsg(PVMFJitterBufferPortParams* aPortParams)
   1850 {
   1851     PVMFPortInterface* aPort = &aPortParams->irPort;
   1852     /*
   1853      * Called by the AO to process one message off the outgoing
   1854      * message queue for the given port.  This routine will
   1855      * try to send the data to the connected port.
   1856      */
   1857     PVMF_JBNODE_LOGINFO((0, "0x%x PVMFJitterBufferNode::ProcessOutgoingMsg: aPort=0x%x", this, aPort));
   1858 
   1859     /*
   1860      * If connected port is busy, the outgoing message cannot be process. It will be
   1861      * queued to be processed again after receiving PORT_ACTIVITY_CONNECTED_PORT_READY
   1862      * from this port.
   1863      */
   1864     if (aPort->IsConnectedPortBusy())
   1865     {
   1866         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "0x%x PVMFJitterBufferNode::ProcessOutgoingMsg: Connected port is busy", this));
   1867         aPortParams->iProcessOutgoingMessages = false;
   1868         return PVMFErrBusy;
   1869     }
   1870 
   1871     PVMFStatus status = PVMFSuccess;
   1872 
   1873     status = aPort->Send();
   1874     if (status == PVMFErrBusy)
   1875     {
   1876         PVMF_JBNODE_LOGDATATRAFFIC((0, "PVMFJitterBufferNode::ProcessOutgoingMsg: Connected port goes into busy state"));
   1877         aPortParams->iProcessOutgoingMessages = false;
   1878     }
   1879     else
   1880     {
   1881         aPortParams->iNumMediaMsgsSent++;
   1882     }
   1883     return status;
   1884 }
   1885 
   1886 PVMFStatus
   1887 PVMFJitterBufferNode::SendData(PVMFPortInterface* aPort)
   1888 {
   1889     PVMFJitterBufferPort* jbPort =
   1890         OSCL_STATIC_CAST(PVMFJitterBufferPort*, aPort);
   1891 
   1892     PVMFPortInterface* outputPort = jbPort->iPortCounterpart;
   1893     PVMFJitterBufferPortParams* portParamsPtr = jbPort->iPortParams;
   1894     PVMFJitterBufferPortParams* outPortParamsPtr = jbPort->iCounterpartPortParams;
   1895     PVMFJitterBuffer* jitterBuffer = portParamsPtr->ipJitterBuffer;
   1896 
   1897     PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData In %s", outPortParamsPtr->iMimeType.get_cstr())) ;
   1898 
   1899     if (!(portParamsPtr->iCanReceivePktFromJB))
   1900     {
   1901         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData - Cant retrieve pkt from JB"));
   1902         return PVMFFailure;
   1903     }
   1904 
   1905     if (outPortParamsPtr->irPort.IsOutgoingQueueBusy())
   1906     {
   1907         outPortParamsPtr->iProcessOutgoingMessages = false;
   1908         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData - Port found to be busy %s", outPortParamsPtr->iMimeType.get_cstr())) ;
   1909         return PVMFErrBusy;
   1910     }
   1911 
   1912     if (oStopOutputPorts)
   1913     {
   1914         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData from Mime[%s] Output ports Stopped--", jbPort->iPortParams->iMimeType.get_cstr()));
   1915         return PVMFSuccess;
   1916     }
   1917 
   1918     PVMFSharedMediaMsgPtr mediaOutMsg;
   1919     bool cmdPacket = false;
   1920     PVMFStatus status = jbPort->iPortParams->ipJitterBuffer->RetrievePacket(mediaOutMsg, cmdPacket);
   1921     while (PVMFSuccess == status)
   1922     {
   1923         if (!cmdPacket)
   1924         {
   1925             //media msg
   1926             outPortParamsPtr->iLastMsgTimeStamp = mediaOutMsg->getTimestamp();
   1927         }
   1928 
   1929         status = outputPort->QueueOutgoingMsg(mediaOutMsg);
   1930 
   1931         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData from Mime[%s] MediaMsg SeqNum[%d], Ts[%d]", jbPort->iPortParams->iMimeType.get_cstr(), mediaOutMsg->getSeqNum(), mediaOutMsg->getTimestamp()));
   1932 
   1933         if (outPortParamsPtr->irPort.IsOutgoingQueueBusy())
   1934         {
   1935             outPortParamsPtr->iProcessOutgoingMessages = false;
   1936             PVMFJitterBufferStats stats = jbPort->iPortParams->ipJitterBuffer->getJitterBufferStats();
   1937             PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "Send Data Mime %s stats.currentOccupancy[%d], stats.maxSeqNumRegistered[%d], stats.lastRetrievedSeqNum[%d] stats.maxTimeStampRetrievedWithoutRTPOffset[%d] SendOut Pkt[%d]", jbPort->iPortParams->iMimeType.get_cstr(), stats.currentOccupancy, stats.maxSeqNumRegistered, stats.lastRetrievedSeqNum, stats.maxTimeStampRetrievedWithoutRTPOffset, outPortParamsPtr->iNumMediaMsgsSent));
   1938             return PVMFErrBusy;
   1939         }
   1940         status = jbPort->iPortParams->ipJitterBuffer->RetrievePacket(mediaOutMsg, cmdPacket);
   1941     }
   1942 
   1943     if (PVMFErrNotReady == status)
   1944     {
   1945         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData from Mime[%s] JB not ready", jbPort->iPortParams->iMimeType.get_cstr()));
   1946 
   1947 
   1948         uint32 currentTime32 = 0;
   1949         uint32 currentTimeBase32 = 0;
   1950         bool overflowFlag = false;
   1951         ipJitterBufferMisc->GetEstimatedServerClock().GetCurrentTime32(currentTime32,
   1952                 overflowFlag,
   1953                 PVMF_MEDIA_CLOCK_MSEC,
   1954                 currentTimeBase32);
   1955 
   1956 
   1957         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData - Estimated serv clock %d", currentTime32));
   1958         currentTime32 = 0;
   1959         currentTimeBase32 = 0;
   1960         ipClientPlayBackClock->GetCurrentTime32(currentTime32,
   1961                                                 overflowFlag,
   1962                                                 PVMF_MEDIA_CLOCK_MSEC,
   1963                                                 currentTimeBase32);
   1964         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData - Client serv clock %d", currentTime32));
   1965 
   1966 
   1967         PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::SendData - Occupancy is %d delayestablish %d", jbPort->iPortParams->ipJitterBuffer->getJitterBufferStats().currentOccupancy, iDelayEstablished));
   1968 
   1969         portParamsPtr->iCanReceivePktFromJB = false;
   1970         jitterBuffer->NotifyCanRetrievePacket();
   1971         return PVMFErrNotReady;
   1972     }
   1973 
   1974     return status;
   1975 }
   1976 
   1977 bool PVMFJitterBufferNode::CheckForPortRescheduling()
   1978 {
   1979     //This method is only called from JB Node AO's Run.
   1980     //Purpose of this method is to determine whether the node
   1981     //needs scheduling based on any outstanding port activities
   1982     //Here is the scheduling criteria for different port types:
   1983     //a) PVMF_JITTER_BUFFER_PORT_TYPE_INPUT - If there are incoming
   1984     //msgs waiting in incoming msg queue then node needs scheduling,
   1985     //as long oProcessIncomingMessages is true. This boolean stays true
   1986     //as long we can register packets in JB. If JB is full this boolean
   1987     //is made false (when CheckForSpaceInJitterBuffer() returns false)
   1988     //and is once again made true in JitterBufferFreeSpaceAvailable() callback.
   1989     //We also use the input port briefly as a bidirectional port in case of
   1990     //RTSP streaming to do firewall packet exchange. So if there are outgoing
   1991     //msgs and oProcessOutgoingMessages is true then node needs scheduling.
   1992     //b) PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT - As long as:
   1993     //  - there are msgs in outgoing queue
   1994     //  - oProcessOutgoingMessages is true
   1995     //  - and as long as there is data in JB and we are not in buffering
   1996     //then node needs scheduling.
   1997     //c) PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK - As long as:
   1998     //  - there are msgs in incoming queue and oProcessIncomingMessages is true
   1999     //  - there are msgs in outgoing queue and oProcessOutgoingMessages is true
   2000     uint32 i;
   2001     for (i = 0; i < iPortVector.size(); i++)
   2002     {
   2003         PVMFJitterBufferPortParams* portContainerPtr = iPortVector[i]->iPortParams;
   2004         if (portContainerPtr == NULL)
   2005         {
   2006             PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::CheckForPortRescheduling: Error - GetPortContainer failed"));
   2007             return false;
   2008         }
   2009         if (portContainerPtr->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   2010         {
   2011             if (portContainerPtr->irPort.IncomingMsgQueueSize() > 0)
   2012             {
   2013                 if (portContainerPtr->iProcessIncomingMessages)
   2014                 {
   2015                     /*
   2016                      * Found a port that has outstanding activity and
   2017                      * is not busy.
   2018                      */
   2019                     return true;
   2020                 }
   2021             }
   2022             if (portContainerPtr->irPort.OutgoingMsgQueueSize() > 0)
   2023             {
   2024                 if (portContainerPtr->iProcessOutgoingMessages)
   2025                 {
   2026                     /*
   2027                      * Found a port that has outstanding activity and
   2028                      * is not busy.
   2029                      */
   2030                     return true;
   2031                 }
   2032             }
   2033         }
   2034         else if (portContainerPtr->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT)
   2035         {
   2036             PVMFJitterBufferPort* jbPort =
   2037                 OSCL_STATIC_CAST(PVMFJitterBufferPort*, &portContainerPtr->irPort);
   2038             PVMFJitterBufferPortParams* inPortParamsPtr = jbPort->iCounterpartPortParams;
   2039             if ((portContainerPtr->irPort.OutgoingMsgQueueSize() > 0) ||
   2040                     (inPortParamsPtr->iCanReceivePktFromJB))
   2041             {
   2042                 if ((portContainerPtr->iProcessOutgoingMessages) && (oStopOutputPorts == false))
   2043                 {
   2044                     /*
   2045                      * Found a port that has outstanding activity and
   2046                      * is not busy.
   2047                      */
   2048                     return true;
   2049                 }
   2050             }
   2051         }
   2052         else if (portContainerPtr->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK)
   2053         {
   2054             if (portContainerPtr->irPort.IncomingMsgQueueSize() > 0)
   2055             {
   2056                 if (portContainerPtr->iProcessIncomingMessages)
   2057                 {
   2058                     /*
   2059                      * Found a port that has outstanding activity and
   2060                      * is not busy.
   2061                      */
   2062                     return true;
   2063                 }
   2064             }
   2065             if (portContainerPtr->irPort.OutgoingMsgQueueSize() > 0)
   2066             {
   2067                 if (portContainerPtr->iProcessOutgoingMessages)
   2068                 {
   2069                     /*
   2070                      * Found a port that has outstanding activity and
   2071                      * is not busy.
   2072                      */
   2073                     return true;
   2074                 }
   2075             }
   2076         }
   2077     }
   2078     /*
   2079      * No port processing needed - either all port activity queues are empty
   2080      * or the ports are backed up due to flow control.
   2081      */
   2082     return false;
   2083 }
   2084 
   2085 bool PVMFJitterBufferNode::CheckForPortActivityQueues()
   2086 {
   2087     uint32 i;
   2088     for (i = 0; i < iPortVector.size(); i++)
   2089     {
   2090         PVMFJitterBufferPortParams* portContainerPtr = NULL;
   2091 
   2092         if (!getPortContainer(iPortVector[i], portContainerPtr))
   2093         {
   2094             PVMF_JBNODE_LOGERROR((0, "0x%x PVMFJitterBufferNode::CheckForPortActivityQueues: Error - GetPortContainer failed", this));
   2095             return false;
   2096         }
   2097 
   2098         if ((portContainerPtr->irPort.IncomingMsgQueueSize() > 0) ||
   2099                 (portContainerPtr->irPort.OutgoingMsgQueueSize() > 0))
   2100         {
   2101             /*
   2102              * Found a port that still has an outstanding activity.
   2103              */
   2104             return true;
   2105         }
   2106     }
   2107 
   2108     return false;
   2109 }
   2110 
   2111 /**
   2112  * A routine to tell if a flush operation is in progress.
   2113  */
   2114 bool PVMFJitterBufferNode::FlushPending()
   2115 {
   2116     return (iCurrentCommand.size() > 0
   2117             && iCurrentCommand.front().iCmd == PVMF_JITTER_BUFFER_NODE_FLUSH);
   2118 }
   2119 
   2120 // Called by the command handler AO to process a command from
   2121 // the input queue.
   2122 // Return true if a command was processed, false if the command
   2123 // processor is busy and can't process another command now.
   2124 
   2125 bool PVMFJitterBufferNode::ProcessCommand(PVMFJitterBufferNodeCommand& aCmd)
   2126 {
   2127     /*
   2128      * normally this node will not start processing one command
   2129      * until the prior one is finished.  However, a hi priority
   2130      * command such as Cancel must be able to interrupt a command
   2131      * in progress.
   2132      */
   2133     if (!iCurrentCommand.empty() && !aCmd.hipri())
   2134         return false;
   2135 
   2136     switch (aCmd.iCmd)
   2137     {
   2138         case PVMF_JITTER_BUFFER_NODE_QUERYUUID:
   2139             DoQueryUuid(aCmd);
   2140             break;
   2141 
   2142         case PVMF_JITTER_BUFFER_NODE_QUERYINTERFACE:
   2143             DoQueryInterface(aCmd);
   2144             break;
   2145 
   2146         case PVMF_JITTER_BUFFER_NODE_REQUESTPORT:
   2147             DoRequestPort(aCmd);
   2148             break;
   2149 
   2150         case PVMF_JITTER_BUFFER_NODE_RELEASEPORT:
   2151             DoReleasePort(aCmd);
   2152             break;
   2153 
   2154         case PVMF_JITTER_BUFFER_NODE_INIT:
   2155             DoInit(aCmd);
   2156             break;
   2157 
   2158         case PVMF_JITTER_BUFFER_NODE_PREPARE:
   2159             DoPrepare(aCmd);
   2160             break;
   2161 
   2162         case PVMF_JITTER_BUFFER_NODE_START:
   2163             DoStart(aCmd);
   2164             break;
   2165 
   2166         case PVMF_JITTER_BUFFER_NODE_STOP:
   2167             DoStop(aCmd);
   2168             break;
   2169 
   2170         case PVMF_JITTER_BUFFER_NODE_FLUSH:
   2171             DoFlush(aCmd);
   2172             break;
   2173 
   2174         case PVMF_JITTER_BUFFER_NODE_PAUSE:
   2175             DoPause(aCmd);
   2176             break;
   2177 
   2178         case PVMF_JITTER_BUFFER_NODE_RESET:
   2179             DoReset(aCmd);
   2180             break;
   2181 
   2182         case PVMF_JITTER_BUFFER_NODE_CANCELALLCOMMANDS:
   2183             DoCancelAllCommands(aCmd);
   2184             break;
   2185 
   2186         case PVMF_JITTER_BUFFER_NODE_CANCELCOMMAND:
   2187             DoCancelCommand(aCmd);
   2188             break;
   2189 
   2190         default:
   2191         {
   2192             /* unknown command type */
   2193             CommandComplete(iInputCommands, aCmd, PVMFErrNotSupported);
   2194         }
   2195         break;
   2196     }
   2197 
   2198     return true;
   2199 }
   2200 
   2201 void
   2202 PVMFJitterBufferNode::MoveCmdToCurrentQueue(PVMFJitterBufferNodeCommand& aCmd)
   2203 {
   2204     int32 err;
   2205     OSCL_TRY(err, iCurrentCommand.StoreL(aCmd););
   2206     if (err != OsclErrNone)
   2207     {
   2208         CommandComplete(iInputCommands, aCmd, PVMFErrNoMemory);
   2209         return;
   2210     }
   2211     iInputCommands.Erase(&aCmd);
   2212     return;
   2213 }
   2214 
   2215 void PVMFJitterBufferNode::CommandComplete(PVMFJitterBufferNodeCmdQ& aCmdQ,
   2216         PVMFJitterBufferNodeCommand& aCmd,
   2217         PVMFStatus aStatus,
   2218         OsclAny* aEventData,
   2219         PVUuid* aEventUUID,
   2220         int32* aEventCode)
   2221 {
   2222     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:CommandComplete Id %d Cmd %d Status %d Context %d Data %d"
   2223                          , aCmd.iId, aCmd.iCmd, aStatus, aCmd.iContext, aEventData));
   2224 
   2225     PVInterface* extif = NULL;
   2226     PVMFBasicErrorInfoMessage* errormsg = NULL;
   2227     if (aEventUUID && aEventCode)
   2228     {
   2229         PVMF_JITTER_BUFFER_NEW(NULL, PVMFBasicErrorInfoMessage, (*aEventCode, *aEventUUID, NULL), errormsg);
   2230         extif = OSCL_STATIC_CAST(PVInterface*, errormsg);
   2231     }
   2232 
   2233     /* create response */
   2234     PVMFCmdResp resp(aCmd.iId, aCmd.iContext, aStatus, extif, aEventData);
   2235     PVMFSessionId session = aCmd.iSession;
   2236 
   2237     /* Erase the command from the queue */
   2238     aCmdQ.Erase(&aCmd);
   2239 
   2240     /* Report completion to the session observer */
   2241     ReportCmdCompleteEvent(session, resp);
   2242 
   2243     if (errormsg)
   2244     {
   2245         errormsg->removeRef();
   2246     }
   2247 
   2248     /*
   2249      * Transition to error state in case of select errors only, viz.
   2250      * PVMFFailure, PVMFErrNoMemory, PVMFErrNoResources
   2251      * Any other status implies that the node is probably in a recoverable
   2252      * state
   2253      */
   2254     if ((aStatus == PVMFFailure) ||
   2255             (aStatus == PVMFErrNoMemory) ||
   2256             (aStatus == PVMFErrNoResources))
   2257     {
   2258         SetState(EPVMFNodeError);
   2259     }
   2260 }
   2261 
   2262 void PVMFJitterBufferNode::CommandComplete(PVMFJitterBufferNodeCommand& aCmd,
   2263         PVMFStatus aStatus,
   2264         OsclAny* aEventData,
   2265         PVUuid* aEventUUID,
   2266         int32* aEventCode)
   2267 {
   2268     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:CommandComplete Id %d Cmd %d Status %d Context %d Data %d"
   2269                          , aCmd.iId, aCmd.iCmd, aStatus, aCmd.iContext, aEventData));
   2270 
   2271     PVInterface* extif = NULL;
   2272     PVMFBasicErrorInfoMessage* errormsg = NULL;
   2273     if (aEventUUID && aEventCode)
   2274     {
   2275         PVMF_JITTER_BUFFER_NEW(NULL, PVMFBasicErrorInfoMessage, (*aEventCode, *aEventUUID, NULL), errormsg);
   2276         extif = OSCL_STATIC_CAST(PVInterface*, errormsg);
   2277     }
   2278 
   2279     /* create response */
   2280     PVMFCmdResp resp(aCmd.iId, aCmd.iContext, aStatus, extif, aEventData);
   2281     PVMFSessionId session = aCmd.iSession;
   2282 
   2283     /* Report completion to the session observer */
   2284     ReportCmdCompleteEvent(session, resp);
   2285 
   2286     if (errormsg)
   2287     {
   2288         errormsg->removeRef();
   2289     }
   2290     /*
   2291      * Transition to error state in case of select errors only, viz.
   2292      * PVMFFailure, PVMFErrNoMemory, PVMFErrNoResources
   2293      * Any other status implies that the node is probably in a recoverable
   2294      * state
   2295      */
   2296     if ((aStatus == PVMFFailure) ||
   2297             (aStatus == PVMFErrNoMemory) ||
   2298             (aStatus == PVMFErrNoResources))
   2299     {
   2300         SetState(EPVMFNodeError);
   2301     }
   2302 }
   2303 
   2304 /**
   2305  * The various command handlers call this when a INTERNAL command is complete.
   2306  * Does not report completion as it is an internal command
   2307  */
   2308 void PVMFJitterBufferNode::InternalCommandComplete(PVMFJitterBufferNodeCmdQ& aCmdQ,
   2309         PVMFJitterBufferNodeCommand& aCmd,
   2310         PVMFStatus aStatus,
   2311         OsclAny* aEventData)
   2312 {
   2313     OSCL_UNUSED_ARG(aEventData);
   2314 
   2315     PVMF_JBNODE_LOGINFO((0, "JitterBufferNode:InternalCommandComplete Id %d Cmd %d Status %d Context %d Data %d"
   2316                          , aCmd.iId, aCmd.iCmd, aStatus, aCmd.iContext, aEventData));
   2317 
   2318     /* Erase the command from the queue */
   2319     aCmdQ.Erase(&aCmd);
   2320 
   2321     /*
   2322      * Transition to error state in case of select errors only, viz.
   2323      * PVMFFailure, PVMFErrNoMemory, PVMFErrNoResources
   2324      * Any other status implies that the node is probably in a recoverable
   2325      * state
   2326      */
   2327     if ((aStatus == PVMFFailure) ||
   2328             (aStatus == PVMFErrNoMemory) ||
   2329             (aStatus == PVMFErrNoResources))
   2330     {
   2331         SetState(EPVMFNodeError);
   2332     }
   2333 }
   2334 
   2335 ///////////////////////////////////////////////////////////////////////////////
   2336 //Called by the command handler AO to do the Query UUID
   2337 ///////////////////////////////////////////////////////////////////////////////
   2338 void PVMFJitterBufferNode::DoQueryUuid(PVMFJitterBufferNodeCommand& aCmd)
   2339 {
   2340     // This node supports Query UUID from any state
   2341     OSCL_String* mimetype;
   2342     Oscl_Vector<PVUuid, OsclMemAllocator> *uuidvec;
   2343     bool exactmatch;
   2344     aCmd.PVMFJitterBufferNodeCommandBase::Parse(mimetype, uuidvec, exactmatch);
   2345 
   2346     // Try to match the input mimetype against any of
   2347     // the custom interfaces for this node
   2348 
   2349     // Match against custom interface1...
   2350     // also match against base mimetypes for custom interface1,
   2351     // unless exactmatch is set.
   2352 
   2353     if (*mimetype == PVMF_JITTERBUFFER_CUSTOMINTERFACE_MIMETYPE
   2354             || (!exactmatch && *mimetype == PVMF_JITTERBUFFER_MIMETYPE)
   2355             || (!exactmatch && *mimetype == PVMF_JITTERBUFFER_BASEMIMETYPE))
   2356     {
   2357         PVUuid uuid(PVMF_JITTERBUFFERNODE_EXTENSIONINTERFACE_UUID);
   2358         uuidvec->push_back(uuid);
   2359     }
   2360     CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   2361 }
   2362 
   2363 ///////////////////////////////////////////////////////////////////////////////
   2364 //Called by the command handler AO to do the Query Interface.
   2365 ///////////////////////////////////////////////////////////////////////////////
   2366 void PVMFJitterBufferNode::DoQueryInterface(PVMFJitterBufferNodeCommand& aCmd)
   2367 {
   2368     //This node supports Query Interface from any state
   2369     PVUuid* uuid;
   2370     PVInterface** ptr;
   2371     aCmd.PVMFJitterBufferNodeCommandBase::Parse(uuid, ptr);
   2372 
   2373     if (*uuid == PVUuid(PVMF_JITTERBUFFERNODE_EXTENSIONINTERFACE_UUID))
   2374     {
   2375         if (!ipExtensionInterface)
   2376         {
   2377             OsclMemAllocator alloc;
   2378             int32 err;
   2379             OsclAny*ptr = NULL;
   2380             OSCL_TRY(err,
   2381                      ptr = alloc.ALLOCATE(sizeof(PVMFJitterBufferExtensionInterfaceImpl));
   2382                     );
   2383             if (err != OsclErrNone || !ptr)
   2384             {
   2385                 PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::DoQueryInterface: Error - Out of memory"));
   2386                 CommandComplete(iInputCommands, aCmd, PVMFErrNoMemory);
   2387                 return;
   2388             }
   2389             ipExtensionInterface =
   2390                 OSCL_PLACEMENT_NEW(ptr, PVMFJitterBufferExtensionInterfaceImpl(this));
   2391         }
   2392         if (ipExtensionInterface->queryInterface(*uuid, *ptr))
   2393         {
   2394             CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   2395         }
   2396         else
   2397         {
   2398             CommandComplete(iInputCommands, aCmd, PVMFErrNotSupported);
   2399         }
   2400     }
   2401     else
   2402     {
   2403         // not supported
   2404         *ptr = NULL;
   2405         CommandComplete(iInputCommands, aCmd, PVMFErrNotSupported);
   2406     }
   2407 }
   2408 
   2409 ///////////////////////////////////////////////////////////////////////////////
   2410 // Called by the command handler AO to do the port request
   2411 // Decides the type of requested port
   2412 // Reserve space in port vector for the new port
   2413 // Instantiate the port and push it in the port vector
   2414 // Populate portparms for tag (port type), jitterbuffer, port, iId,
   2415 //
   2416 ///////////////////////////////////////////////////////////////////////////////
   2417 void PVMFJitterBufferNode::DoRequestPort(PVMFJitterBufferNodeCommand& aCmd)
   2418 {
   2419     // This node supports port request from any state
   2420     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::DoRequestPort"));
   2421 
   2422     // retrieve port tag
   2423     int32 tag;
   2424     OSCL_String* mimetype;
   2425     aCmd.PVMFJitterBufferNodeCommandBase::Parse(tag, mimetype);
   2426 
   2427     PVMFJitterBufferNodePortTag jitterbufferPortTag = PVMF_JITTER_BUFFER_PORT_TYPE_INPUT;
   2428 
   2429     if (tag % 3)
   2430     {
   2431         if (tag % 3 == 1)
   2432         {
   2433             jitterbufferPortTag = PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT;
   2434         }
   2435         else if (tag % 3 == 2)
   2436         {
   2437             jitterbufferPortTag = PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK;
   2438         }
   2439     }
   2440     else
   2441     {
   2442         jitterbufferPortTag = PVMF_JITTER_BUFFER_PORT_TYPE_INPUT;
   2443     }
   2444 
   2445     // Input ports have tags: 0, 3, 6, ...
   2446     // Output ports have tags: 1, 4, 7, ...
   2447     // Feedback ports have tags: 2, 5, 8, ...
   2448 
   2449     //set port name for datapath logging.
   2450     OSCL_StackString<20> portname;
   2451     switch (jitterbufferPortTag)
   2452     {
   2453         case PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT:
   2454             portname = "JitterBufOut";
   2455             break;
   2456         case PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK:
   2457             //don't log this port for now...
   2458             //portname="JitterBufFeedback";
   2459             break;
   2460         case PVMF_JITTER_BUFFER_PORT_TYPE_INPUT:
   2461             //don't log this port for now...
   2462             //portname="JitterBufIn";
   2463             break;
   2464         default:
   2465             // avoid compiler warning
   2466             break;
   2467     }
   2468 
   2469     // Allocate a new port
   2470     OsclAny *ptr = AllocatePort();
   2471     if (!ptr)
   2472     {
   2473         PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::DoRequestPort: Error - iPortVector Out of memory"));
   2474         CommandComplete(iInputCommands, aCmd, PVMFErrNoMemory);
   2475         return;
   2476     }
   2477 
   2478     OsclExclusivePtr<PVMFJitterBufferPort> portAutoPtr;
   2479     PVMFJitterBufferPort* port = NULL;
   2480 
   2481     OsclExclusivePtr<PVMFJitterBuffer> jitterBufferAutoPtr;
   2482 
   2483     // create base port with default settings
   2484     port = OSCL_PLACEMENT_NEW(ptr, PVMFJitterBufferPort(tag, *this, portname.get_str()));
   2485     portAutoPtr.set(port);
   2486 
   2487     /* Add the port to the port vector. */
   2488     if (!PushPortToVect(port))
   2489     {
   2490         CommandComplete(iInputCommands, aCmd, PVMFErrNoMemory);
   2491         return;
   2492     }
   2493 
   2494     PVMFJitterBufferPortParams* pPortParams = OSCL_NEW(PVMFJitterBufferPortParams, (*port));
   2495     pPortParams->iTag = jitterbufferPortTag;
   2496     PVMFJitterBuffer* jbPtr = NULL;
   2497     pPortParams->ipJitterBuffer = NULL;
   2498     pPortParams->iId = tag;
   2499     if (mimetype != NULL)
   2500     {
   2501         pPortParams->iMimeType = mimetype->get_str();
   2502     }
   2503 
   2504     // create jitter buffer if input port
   2505     if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   2506     {
   2507         PVMFJitterBufferConstructParams jbConstructParams(ipJitterBufferMisc->GetEstimatedServerClock(), *ipClientPlayBackClock, pPortParams->iMimeType, *ipJitterBufferMisc->GetEventNotifier(), iDelayEstablished, iJitterDelayPercent, iJitterBufferState, this, port);
   2508         jbPtr = ipJitterBufferFactory->Create(jbConstructParams);
   2509         if (jbPtr)
   2510             jbPtr->SetDurationInMilliSeconds(iJitterBufferDurationInMilliSeconds);
   2511         jitterBufferAutoPtr.set(jbPtr);
   2512         pPortParams->ipJitterBuffer = jbPtr;
   2513         if (iBroadCastSession == true)
   2514         {
   2515             jbPtr->SetBroadCastSession();
   2516         }
   2517     }
   2518 
   2519     if (!PushPortParamsToQ(pPortParams))
   2520     {
   2521         PVMF_JBNODE_LOGERROR((0, "0x%x PVMFJitterBufferNode::DoRequestPort: Error - iPortParamsQueue.push_back() failed", this));
   2522         CommandComplete(iInputCommands, aCmd, PVMFErrNoMemory);
   2523         return;
   2524     }
   2525 
   2526 
   2527     // Update the iPortParams for all existing ports since adding a new Port Parameters element might
   2528     // have caused reallocation of the vector elements.
   2529     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   2530     for (it = iPortParamsQueue.begin();
   2531             it != iPortParamsQueue.end();
   2532             it++)
   2533     {
   2534         PVMFJitterBufferPortParams* portParametersPtr = *it;
   2535         PVMFJitterBufferPort* portPtr = OSCL_REINTERPRET_CAST(PVMFJitterBufferPort*, &portParametersPtr->irPort);
   2536         portPtr->iPortParams = portParametersPtr;
   2537 
   2538         // Update also the port counterpart and port counterpart parameters
   2539         PVMFPortInterface* cpPort = getPortCounterpart(portPtr);
   2540         if (cpPort != NULL)
   2541         {
   2542             portPtr->iPortCounterpart = (PVMFJitterBufferPort*)cpPort;
   2543             PVMFJitterBufferPortParams* cpPortContainerPtr = NULL;
   2544             if (getPortContainer(portPtr->iPortCounterpart, cpPortContainerPtr))
   2545             {
   2546                 portPtr->iCounterpartPortParams = cpPortContainerPtr;
   2547             }
   2548             else
   2549             {
   2550                 PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::DoRequestPort: getPortContainer for port counterpart failed"));
   2551                 CommandComplete(iInputCommands, aCmd, PVMFFailure);
   2552                 return;
   2553             }
   2554         }
   2555 
   2556     }
   2557 
   2558     portAutoPtr.release();
   2559     jitterBufferAutoPtr.release();
   2560 
   2561 
   2562     /* Return the port pointer to the caller. */
   2563     CommandComplete(iInputCommands, aCmd, PVMFSuccess, (OsclAny*)port);
   2564 }
   2565 
   2566 OsclAny* PVMFJitterBufferNode::AllocatePort()
   2567 {
   2568     OsclAny *ptr = NULL;
   2569     int32 err;
   2570     OSCL_TRY(err, ptr = iPortVector.Allocate(););
   2571     if (err != OsclErrNone)
   2572     {
   2573         ptr = NULL;
   2574     }
   2575     return ptr;
   2576 }
   2577 
   2578 bool PVMFJitterBufferNode::PushPortToVect(PVMFJitterBufferPort*& aPort)
   2579 {
   2580     int32 err;
   2581     OSCL_TRY(err, iPortVector.AddL(aPort););
   2582     if (err != OsclErrNone)
   2583     {
   2584         return false;
   2585     }
   2586     return true;
   2587 }
   2588 
   2589 bool PVMFJitterBufferNode::PushPortParamsToQ(PVMFJitterBufferPortParams*& aPortParams)
   2590 {
   2591     int32 err;
   2592     OSCL_TRY(err, iPortParamsQueue.push_back(aPortParams););
   2593     if (err != OsclErrNone)
   2594     {
   2595         return false;
   2596     }
   2597     return true;
   2598 }
   2599 
   2600 /**
   2601  * Called by the command handler AO to do the port release
   2602  */
   2603 void PVMFJitterBufferNode::DoReleasePort(PVMFJitterBufferNodeCommand& aCmd)
   2604 {
   2605     /*This node supports release port from any state*/
   2606 
   2607     /* Find the port in the port vector */
   2608     ResetNodeParams();
   2609 
   2610     PVMFPortInterface* p = NULL;
   2611     aCmd.PVMFJitterBufferNodeCommandBase::Parse(p);
   2612 
   2613     PVMFJitterBufferPort* port = (PVMFJitterBufferPort*)p;
   2614 
   2615     PVMFJitterBufferPort** portPtr = iPortVector.FindByValue(port);
   2616     if (portPtr)
   2617     {
   2618         /* delete corresponding port params */
   2619         Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   2620 
   2621         for (it = iPortParamsQueue.begin();
   2622                 it != iPortParamsQueue.end();
   2623                 it++)
   2624         {
   2625             PVMFJitterBufferPortParams* pPortParams = *it;
   2626             if (&pPortParams->irPort == iPortVector.front())
   2627             {
   2628                 if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   2629                 {
   2630                     ipJitterBufferFactory->Destroy(pPortParams->ipJitterBuffer);
   2631                 }
   2632                 iPortParamsQueue.erase(it);
   2633                 break;
   2634             }
   2635         }
   2636         /* delete the port */
   2637         iPortVector.Erase(portPtr);
   2638 
   2639         CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   2640     }
   2641     else
   2642     {
   2643         /* port not found */
   2644         CommandComplete(iInputCommands, aCmd, PVMFErrArgument);
   2645     }
   2646 }
   2647 
   2648 ///////////////////////////////////////////////////////////////////////////////
   2649 // Called by the command handler AO to initialize the node
   2650 // Decides the type of requested port
   2651 // Reserve space in port vector for the new port
   2652 // Instantiate the port and push it in the port vector
   2653 // Populate portparms for tag (port type), jitterbuffer, port, iId,
   2654 //
   2655 ///////////////////////////////////////////////////////////////////////////////
   2656 void PVMFJitterBufferNode::DoInit(PVMFJitterBufferNodeCommand& aCmd)
   2657 {
   2658     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::DoInit"));
   2659     switch (iInterfaceState)
   2660     {
   2661         case EPVMFNodeIdle:
   2662             if (ipJitterBufferMisc)
   2663             {
   2664                 ipJitterBufferMisc->Reset();
   2665                 OSCL_DELETE(ipJitterBufferMisc);
   2666                 ipJitterBufferMisc = NULL;
   2667             }
   2668             ipJitterBufferMisc = PVMFJitterBufferMisc::New(this, *ipClientPlayBackClock, iPortParamsQueue);
   2669             if (ipJitterBufferMisc)
   2670             {
   2671                 ipEventNotifier = ipJitterBufferMisc->GetEventNotifier();
   2672                 if (iBroadCastSession == true)
   2673                     ipJitterBufferMisc->SetBroadcastSession();
   2674             }
   2675 
   2676             SetState(EPVMFNodeInitialized);
   2677             CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   2678             break;
   2679 
   2680         default:
   2681             CommandComplete(iInputCommands, aCmd, PVMFErrInvalidState);
   2682             break;
   2683     }
   2684 }
   2685 
   2686 /**
   2687  * Called by the command handler AO to do the node Prepare
   2688  */
   2689 void PVMFJitterBufferNode::DoPrepare(PVMFJitterBufferNodeCommand& aCmd)
   2690 {
   2691     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::DoPrepare"));
   2692     switch (iInterfaceState)
   2693     {
   2694         case EPVMFNodeInitialized:
   2695         {
   2696             uint32 i;
   2697             for (i = 0; i < iPortVector.size(); i++)
   2698             {
   2699                 PVMFJitterBufferPortParams* portContainerPtr1 = NULL;
   2700                 if (getPortContainer(iPortVector[i], portContainerPtr1))
   2701                 {
   2702                     iPortVector[i]->iPortParams = portContainerPtr1;
   2703                 }
   2704                 else
   2705                 {
   2706                     PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::DoPrepare: getPortContainer - Self"));
   2707                     CommandComplete(iInputCommands, aCmd, PVMFFailure);
   2708                     break;
   2709                 }
   2710                 PVMFPortInterface* cpPort = getPortCounterpart(iPortVector[i]);
   2711                 if (cpPort != NULL)
   2712                 {
   2713                     iPortVector[i]->iPortCounterpart = (PVMFJitterBufferPort*)cpPort;
   2714                     PVMFJitterBufferPortParams* portContainerPtr2 = NULL;
   2715                     if (getPortContainer(iPortVector[i]->iPortCounterpart, portContainerPtr2))
   2716                     {
   2717                         iPortVector[i]->iCounterpartPortParams = portContainerPtr2;
   2718                     }
   2719                     else
   2720                     {
   2721                         PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::DoPrepare: getPortContainer - Counterpart"));
   2722                         CommandComplete(iInputCommands, aCmd, PVMFFailure);
   2723                         break;
   2724                     }
   2725                 }
   2726             }
   2727 
   2728             ipJitterBufferMisc->Prepare();
   2729             PVMFStatus status = ipJitterBufferMisc->PrepareMediaReceivingChannel();
   2730             if (PVMFPending == status)
   2731             {
   2732                 MoveCmdToCurrentQueue(aCmd);
   2733             }
   2734             else
   2735             {
   2736                 if (PVMFSuccess == status)
   2737                 {
   2738                     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::DoPrepare: FW Pkts Disabled"));
   2739                     /* Complete prepare */
   2740                     SetState(EPVMFNodePrepared);
   2741                     CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   2742                 }
   2743                 else
   2744                 {
   2745                     CommandComplete(iInputCommands, aCmd, status);
   2746                 }
   2747             }
   2748         }
   2749         break;
   2750 
   2751         default:
   2752             CommandComplete(iInputCommands, aCmd, PVMFErrInvalidState);
   2753             break;
   2754     }
   2755 }
   2756 
   2757 void PVMFJitterBufferNode::CompletePrepare()
   2758 {
   2759     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::CompletePrepare"));
   2760     SetState(EPVMFNodePrepared);
   2761     PVMFJitterBufferNodeCommand cmd = iCurrentCommand.front();
   2762     CommandComplete(cmd, PVMFSuccess);
   2763     iCurrentCommand.Erase(&iCurrentCommand.front());
   2764     return;
   2765 }
   2766 
   2767 void PVMFJitterBufferNode::CancelPrepare()
   2768 {
   2769     ipJitterBufferMisc->CancelMediaReceivingChannelPreparation();
   2770     PVMFJitterBufferNodeCommand cmd = iCurrentCommand.front();
   2771     CommandComplete(cmd, PVMFErrCancelled);
   2772     iCurrentCommand.Erase(&iCurrentCommand.front());
   2773     return;
   2774 }
   2775 
   2776 /**
   2777  * Called by the command handler AO to do the node Start
   2778  */
   2779 void PVMFJitterBufferNode::DoStart(PVMFJitterBufferNodeCommand& aCmd)
   2780 {
   2781     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::DoStart"));
   2782     PVMFStatus status = PVMFSuccess;
   2783     switch (iInterfaceState)
   2784     {
   2785         case EPVMFNodePrepared:
   2786         case EPVMFNodePaused:
   2787         {
   2788             ipJitterBufferMisc->StreamingSessionStarted();
   2789             /* Diagnostic logging */
   2790             iDiagnosticsLogged = false;
   2791             iMediaReceiveingChannelPrepared = true;
   2792 
   2793             if (iInterfaceState == EPVMFNodePaused)
   2794             {
   2795                 uint32 currticks = OsclTickCount::TickCount();
   2796                 uint32 startTime = OsclTickCount::TicksToMsec(currticks);
   2797                 uint32 diff = (startTime - iPauseTime);
   2798                 if (diff > PVMF_JITTER_BUFFER_NODE_FIREWALL_PKT_DEFAULT_PAUSE_DURATION_IN_MS)
   2799                 {
   2800                     if (PVMFPending == ipJitterBufferMisc->PrepareMediaReceivingChannel())
   2801                     {
   2802                         iMediaReceiveingChannelPrepared = false;
   2803                     }
   2804                 }
   2805             }
   2806 
   2807             if (!ipJitterBufferMisc->IsSessionExpired())
   2808                 RequestEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   2809 
   2810             /* If auto paused, implies jitter buffer is not empty */
   2811             if ((iDelayEstablished == false) ||
   2812                     (iJitterBufferState == PVMF_JITTER_BUFFER_IN_TRANSITION))
   2813             {
   2814 
   2815                 Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator iter;
   2816                 for (iter = iPortParamsQueue.begin(); iter != iPortParamsQueue.end(); iter++)
   2817                 {
   2818                     PVMFJitterBufferPortParams* pPortParams = *iter;
   2819                     if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   2820                     {
   2821                         pPortParams->ipJitterBuffer->NotifyCanRetrievePacket();
   2822                     }
   2823                 }
   2824                 /*
   2825                  * Move start to current msg queue where it would stay
   2826                  * jitter buffer is full.
   2827                  */
   2828                 oStartPending = true;
   2829                 MoveCmdToCurrentQueue(aCmd);
   2830                 ReportInfoEvent(PVMFInfoBufferingStart);
   2831                 RequestEventCallBack(JB_NOTIFY_REPORT_BUFFERING_STATUS);
   2832             }
   2833             else
   2834             {
   2835                 if (false == iMediaReceiveingChannelPrepared)
   2836                 {
   2837                     oStartPending = true;
   2838                     MoveCmdToCurrentQueue(aCmd);
   2839                 }
   2840                 else
   2841                 {
   2842                     /* Just resuming from a paused state with enough data in jitter buffer */
   2843                     oStartPending = false;
   2844                     SetState(EPVMFNodeStarted);
   2845                     /* Enable Output Ports */
   2846                     StartOutputPorts();
   2847                     CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   2848                 }
   2849             }
   2850         }
   2851         break;
   2852 
   2853         default:
   2854             status = PVMFErrInvalidState;
   2855             CommandComplete(iInputCommands, aCmd, status);
   2856             break;
   2857     }
   2858     return;
   2859 }
   2860 
   2861 void PVMFJitterBufferNode::CompleteStart()
   2862 {
   2863     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::CompleteStart"));
   2864     PVMF_JBNODE_LOGDATATRAFFIC((0, "PVMFJitterBufferNode::CompleteStart"));
   2865 
   2866     if (!iMediaReceiveingChannelPrepared)
   2867         return;
   2868 
   2869     PVMFJitterBufferNodeCommand aCmd = iCurrentCommand.front();
   2870     if (iJitterBufferState == PVMF_JITTER_BUFFER_READY)
   2871     {
   2872         switch (iInterfaceState)
   2873         {
   2874             case EPVMFNodePrepared:
   2875             case EPVMFNodePaused:
   2876             case EPVMFNodeStarted:
   2877             {
   2878                 /* transition to Started */
   2879                 oStartPending = false;
   2880                 SetState(EPVMFNodeStarted);
   2881                 /* Enable Output Ports */
   2882                 StartOutputPorts();
   2883                 /* Enable remote activity monitoring */
   2884                 Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   2885                 for (it = iPortParamsQueue.begin(); it != iPortParamsQueue.end(); it++)
   2886                 {
   2887                     PVMFJitterBufferPortParams* pPortParams = *it;
   2888                     if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   2889                     {
   2890                         pPortParams->iMonitorForRemoteActivity = true;
   2891                     }
   2892                 }
   2893                 CommandComplete(aCmd, PVMFSuccess);
   2894                 /* Erase the command from the current queue */
   2895                 iCurrentCommand.Erase(&iCurrentCommand.front());
   2896             }
   2897             break;
   2898 
   2899             default:
   2900             {
   2901                 SetState(EPVMFNodeError);
   2902                 CommandComplete(aCmd, PVMFErrInvalidState);
   2903                 /* Erase the command from the current queue */
   2904                 iCurrentCommand.Erase(&iCurrentCommand.front());
   2905             }
   2906             break;
   2907         }
   2908     }
   2909     else
   2910     {
   2911         SetState(EPVMFNodeError);
   2912         CommandComplete(aCmd, PVMFErrInvalidState);
   2913         /* Erase the command from the current queue */
   2914         iCurrentCommand.Erase(&iCurrentCommand.front());
   2915     }
   2916 }
   2917 
   2918 void PVMFJitterBufferNode::CancelStart()
   2919 {
   2920     if (ipJitterBufferMisc)
   2921         ipJitterBufferMisc->Reset();
   2922 
   2923     PVMFJitterBufferNodeCommand aCmd = iCurrentCommand.front();
   2924     oStartPending = false;
   2925     CommandComplete(aCmd, PVMFErrCancelled);
   2926     /* Erase the command from the current queue */
   2927     iCurrentCommand.Erase(&iCurrentCommand.front());
   2928     return;
   2929 }
   2930 
   2931 void PVMFJitterBufferNode::DoStop(PVMFJitterBufferNodeCommand& aCmd)
   2932 {
   2933     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::DoStop"));
   2934     LogSessionDiagnostics();
   2935     PVMFStatus aStatus = PVMFSuccess;
   2936 
   2937     switch (iInterfaceState)
   2938     {
   2939         case EPVMFNodeStarted:
   2940         case EPVMFNodePaused:
   2941         {
   2942             if (ipJitterBufferMisc)
   2943                 ipJitterBufferMisc->StreamingSessionStopped();
   2944 
   2945             /* Clear queued messages in ports */
   2946             for (uint32 i = 0; i < iPortVector.size(); i++)
   2947             {
   2948                 PVMFJitterBufferPortParams* pPortParams = NULL;
   2949                 bool bRet = getPortContainer(iPortVector[i], pPortParams);
   2950                 if (bRet)
   2951                 {
   2952                     if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   2953                     {
   2954                         pPortParams->ipJitterBuffer->ResetJitterBuffer();
   2955                     }
   2956                     pPortParams->ResetParams();
   2957                 }
   2958                 iPortVector[i]->ClearMsgQueues();
   2959             }
   2960 
   2961             if (aStatus == PVMFSuccess)
   2962             {
   2963                 /* Reset State Variables */
   2964                 iDelayEstablished = false;
   2965                 if (ipJitterBufferMisc)
   2966                     ipJitterBufferMisc->SetSessionDurationExpired();
   2967                 oStopOutputPorts = true;
   2968                 oStartPending = false;
   2969                 iJitterBufferState = PVMF_JITTER_BUFFER_READY;
   2970                 iJitterDelayPercent = 0;
   2971 
   2972                 /* transition to Prepared state */
   2973                 SetState(EPVMFNodePrepared);
   2974             }
   2975             CommandComplete(iInputCommands, aCmd, aStatus);
   2976         }
   2977 
   2978         break;
   2979 
   2980         default:
   2981             CommandComplete(iInputCommands, aCmd, PVMFErrInvalidState);
   2982             break;
   2983     }
   2984 }
   2985 
   2986 /**
   2987  * Called by the command handler AO to do the node Flush
   2988  */
   2989 void PVMFJitterBufferNode::DoFlush(PVMFJitterBufferNodeCommand& aCmd)
   2990 {
   2991     OSCL_UNUSED_ARG(aCmd);
   2992 }
   2993 
   2994 /**
   2995  * Called by the command handler AO to do the node Pause
   2996  */
   2997 void PVMFJitterBufferNode::DoPause(PVMFJitterBufferNodeCommand& aCmd)
   2998 {
   2999     iPauseTime = 0;
   3000     switch (iInterfaceState)
   3001     {
   3002         case EPVMFNodeStarted:
   3003         case EPVMFNodePaused:
   3004         {
   3005             uint32 currticks = OsclTickCount::TickCount();
   3006             iPauseTime = OsclTickCount::TicksToMsec(currticks);
   3007             ipJitterBufferMisc->StreamingSessionPaused();
   3008             SetState(EPVMFNodePaused);
   3009             StopOutputPorts();
   3010             CancelEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   3011             CancelEventCallBack(JB_NOTIFY_REPORT_BUFFERING_STATUS);
   3012             PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::DoPause Success"));
   3013             CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   3014         }
   3015         break;
   3016 
   3017         default:
   3018             PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::DoPause PVMFErrInvalidState iInterfaceState %d", iInterfaceState));
   3019             CommandComplete(iInputCommands, aCmd, PVMFErrInvalidState);
   3020             break;
   3021     }
   3022 }
   3023 
   3024 /**
   3025  * Called by the command handler AO to do the node Reset.
   3026  */
   3027 void PVMFJitterBufferNode::DoReset(PVMFJitterBufferNodeCommand& aCmd)
   3028 {
   3029     PVMF_JBNODE_LOGERROR((0, "JitterBufferNode:DoReset %d", iInterfaceState));
   3030     LogSessionDiagnostics();
   3031     ResetNodeParams();
   3032     SetState(EPVMFNodeIdle);
   3033     CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   3034 }
   3035 
   3036 /**
   3037  * Called by the command handler AO to do the Cancel single command
   3038  */
   3039 void PVMFJitterBufferNode::DoCancelCommand(PVMFJitterBufferNodeCommand& aCmd)
   3040 {
   3041     /* extract the command ID from the parameters.*/
   3042     PVMFCommandId id;
   3043     aCmd.PVMFJitterBufferNodeCommandBase::Parse(id);
   3044 
   3045     /* first check "current" command if any */
   3046     {
   3047         PVMFJitterBufferNodeCommand* cmd = iCurrentCommand.FindById(id);
   3048         if (cmd)
   3049         {
   3050             /* cancel the queued command */
   3051             CommandComplete(iCurrentCommand, *cmd, PVMFErrCancelled);
   3052             /* report cancel success */
   3053             CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   3054             return;
   3055         }
   3056     }
   3057 
   3058     /* next check input queue */
   3059     {
   3060         /* start at element 1 since this cancel command is element 0 */
   3061         PVMFJitterBufferNodeCommand* cmd = iInputCommands.FindById(id, 1);
   3062         if (cmd)
   3063         {
   3064             /* cancel the queued command */
   3065             CommandComplete(iInputCommands, *cmd, PVMFErrCancelled);
   3066             /* report cancel success */
   3067             CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   3068             return;
   3069         }
   3070     }
   3071     /* if we get here the command isn't queued so the cancel fails */
   3072     CommandComplete(iInputCommands, aCmd, PVMFErrArgument);
   3073 }
   3074 
   3075 /**
   3076  * Called by the command handler AO to do the Cancel All
   3077  */
   3078 void PVMFJitterBufferNode::DoCancelAllCommands(PVMFJitterBufferNodeCommand& aCmd)
   3079 {
   3080     /* first cancel the current command if any */
   3081     if (!iCurrentCommand.empty())
   3082     {
   3083         if (iCurrentCommand.front().iCmd == PVMF_JITTER_BUFFER_NODE_PREPARE)
   3084         {
   3085             CancelPrepare();
   3086         }
   3087         else if (iCurrentCommand.front().iCmd == PVMF_JITTER_BUFFER_NODE_START)
   3088         {
   3089             CancelStart();
   3090         }
   3091         else
   3092         {
   3093             OSCL_ASSERT(false);
   3094         }
   3095     }
   3096     /* next cancel all queued commands */
   3097     {
   3098         /* start at element 1 since this cancel command is element 0. */
   3099         while (iInputCommands.size() > 1)
   3100             CommandComplete(iInputCommands, iInputCommands[1], PVMFErrCancelled);
   3101     }
   3102 
   3103     uint32 i;
   3104     for (i = 0; i < iPortVector.size(); i++)
   3105     {
   3106         PVMFJitterBufferPortParams* pPortParams = NULL;
   3107         bool bRet = getPortContainer(iPortVector[i], pPortParams);
   3108         if (bRet)
   3109         {
   3110             if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   3111             {
   3112                 pPortParams->ipJitterBuffer->ResetJitterBuffer();
   3113             }
   3114             pPortParams->ResetParams();
   3115         }
   3116         iPortVector[i]->ClearMsgQueues();
   3117     }
   3118 
   3119 
   3120     /* finally, report cancel complete.*/
   3121     CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   3122 }
   3123 
   3124 PVMFPortInterface*
   3125 PVMFJitterBufferNode::getPortCounterpart(PVMFPortInterface* aPort)
   3126 {
   3127     uint32 ii;
   3128     /*
   3129      * Get port params
   3130      */
   3131     for (ii = 0; ii < iPortParamsQueue.size(); ii++)
   3132     {
   3133         if (&iPortParamsQueue[ii]->irPort == aPort)
   3134         {
   3135             break;
   3136         }
   3137     }
   3138     if (ii >= iPortParamsQueue.size())
   3139     {
   3140         return NULL;
   3141     }
   3142 
   3143     PVMFJitterBufferNodePortTag tag = iPortParamsQueue[ii]->iTag;
   3144     int32 id = iPortParamsQueue[ii]->iId;
   3145     uint32 jj;
   3146 
   3147     /* Even numbered ports are input ports */
   3148     if (tag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   3149     {
   3150         for (jj = 0; jj < iPortParamsQueue.size(); jj++)
   3151         {
   3152             if ((id + 1) == iPortParamsQueue[jj]->iId)
   3153             {
   3154                 return (&iPortParamsQueue[jj]->irPort);
   3155             }
   3156         }
   3157     }
   3158     /* odd numbered ports are output ports */
   3159     else if (tag == PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT)
   3160     {
   3161         for (jj = 0; jj < iPortParamsQueue.size(); jj++)
   3162         {
   3163             if ((id - 1) == iPortParamsQueue[jj]->iId)
   3164             {
   3165                 return (&iPortParamsQueue[jj]->irPort);
   3166 
   3167 
   3168             }
   3169         }
   3170     }
   3171     return NULL;
   3172 }
   3173 
   3174 
   3175 
   3176 
   3177 ///////////////////////////////////////////////////////////////////////////////
   3178 //Jitter Buffer Extension Interface Implementation
   3179 ///////////////////////////////////////////////////////////////////////////////
   3180 
   3181 ///////////////////////////////////////////////////////////////////////////////
   3182 //OsclActiveObject
   3183 ///////////////////////////////////////////////////////////////////////////////
   3184 
   3185 
   3186 ///////////////////////////////////////////////////////////////////////////////
   3187 //PVMFJitterBufferObserver Implementation
   3188 ///////////////////////////////////////////////////////////////////////////////
   3189 void PVMFJitterBufferNode::JitterBufferFreeSpaceAvailable(OsclAny* aContext)
   3190 {
   3191     PVMFPortInterface* port = OSCL_STATIC_CAST(PVMFPortInterface*, aContext);
   3192     PVMFJitterBufferPort* jbPort = OSCL_STATIC_CAST(PVMFJitterBufferPort*, port);
   3193     PVMFJitterBufferPortParams* portParams = jbPort->iPortParams;
   3194     if (portParams)
   3195         portParams->iProcessIncomingMessages = true;
   3196 
   3197     if (IsAdded())
   3198     {
   3199         RunIfNotReady();
   3200     }
   3201 }
   3202 
   3203 void PVMFJitterBufferNode::ProcessJBInfoEvent(PVMFAsyncEvent& aEvent)
   3204 {
   3205     PVMF_JBNODE_LOGCLOCK_REBUFF((0, "PVMFJitterBufferNode::ProcessJBInfoEvent: Event Type [%d]", aEvent.GetEventType()));
   3206     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::ProcessJBInfoEvent Event: Type [%d]", aEvent.GetEventType()));
   3207     switch (aEvent.GetEventType())
   3208     {
   3209         case PVMFInfoUnderflow:
   3210         {
   3211             RequestEventCallBack(JB_NOTIFY_REPORT_BUFFERING_STATUS);
   3212             if (oStartPending == false)
   3213             {
   3214                 UpdateRebufferingStats(PVMFInfoUnderflow);
   3215                 ipJitterBufferMisc->StreamingSessionBufferingStart();
   3216                 ReportInfoEvent(PVMFInfoUnderflow);
   3217                 ReportInfoEvent(PVMFInfoBufferingStart);
   3218                 ReportInfoEvent(PVMFInfoBufferingStatus);
   3219             }
   3220         }
   3221         break;
   3222         case PVMFInfoDataReady:
   3223         {
   3224             UpdateRebufferingStats(PVMFInfoDataReady);
   3225             ReportInfoEvent(PVMFInfoBufferingStatus);
   3226             ReportInfoEvent(PVMFInfoDataReady);
   3227             ReportInfoEvent(PVMFInfoBufferingComplete);
   3228             CancelEventCallBack(JB_NOTIFY_REPORT_BUFFERING_STATUS);
   3229 
   3230             Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   3231             for (it = iPortParamsQueue.begin(); it != iPortParamsQueue.end(); it++)
   3232             {
   3233                 PVMFJitterBufferPortParams* pPortParams = *it;
   3234                 if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   3235                 {
   3236                     pPortParams->iCanReceivePktFromJB = true;
   3237                     pPortParams->ipJitterBuffer->CancelNotifyCanRetrievePacket();
   3238                     PVMFJitterBufferStats stats = pPortParams->ipJitterBuffer->getJitterBufferStats();
   3239                     PVMF_JBNODE_LOGDATATRAFFIC((0, "Mime %s stats.currentOccupancy[%d], stats.maxSeqNumRegistered[%d], stats.lastRetrievedSeqNum[%d] stats.maxTimeStampRetrievedWithoutRTPOffset[%d]", pPortParams->iMimeType.get_cstr(), stats.currentOccupancy, stats.maxSeqNumRegistered, stats.lastRetrievedSeqNum, stats.maxTimeStampRetrievedWithoutRTPOffset));
   3240                 }
   3241             }
   3242 
   3243             if (oStartPending)
   3244             {
   3245                 CompleteStart();
   3246             }
   3247             else
   3248             {
   3249                 ipJitterBufferMisc->StreamingSessionBufferingEnd();
   3250 
   3251             }
   3252         }
   3253         break;
   3254         case PVMFInfoOverflow:
   3255         {
   3256             ReportInfoEvent(PVMFInfoOverflow);
   3257         }
   3258         break;
   3259         case PVMFJitterBufferNodeJitterBufferLowWaterMarkReached:
   3260         {
   3261             Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator iter;
   3262             for (iter = iPortParamsQueue.begin(); iter != iPortParamsQueue.end(); iter++)
   3263             {
   3264                 PVMFJitterBufferPortParams* pPortParams = *iter;
   3265                 if (pPortParams->iMonitorForRemoteActivity == false)
   3266                 {
   3267                     pPortParams->iMonitorForRemoteActivity = true;
   3268                     RequestEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   3269                 }
   3270 
   3271             }
   3272             ReportInfoEvent(PVMFJitterBufferNodeJitterBufferLowWaterMarkReached);
   3273         }
   3274         break;
   3275         case PVMFJitterBufferNodeJitterBufferHighWaterMarkReached:
   3276         {
   3277             Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator iter;
   3278             for (iter = iPortParamsQueue.begin(); iter != iPortParamsQueue.end(); iter++)
   3279             {
   3280                 PVMFJitterBufferPortParams* pPortParams = *iter;
   3281                 if (pPortParams->iMonitorForRemoteActivity == true)
   3282                 {
   3283                     pPortParams->iMonitorForRemoteActivity = false;
   3284                     CancelEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   3285                 }
   3286             }
   3287             ReportInfoEvent(PVMFJitterBufferNodeJitterBufferHighWaterMarkReached);
   3288         }
   3289         break;
   3290         case PVMFJitterBufferNodeStreamThinningRecommended:
   3291         {
   3292             PVMFNodeInterface::ReportInfoEvent(aEvent);
   3293         }
   3294         break;
   3295         default:
   3296         {
   3297             //noop
   3298         }
   3299     }
   3300 
   3301 }
   3302 
   3303 void PVMFJitterBufferNode::PacketReadyToBeRetrieved(OsclAny* aContext)
   3304 {
   3305     if (aContext)
   3306     {
   3307         PVMFJitterBufferPort* port = OSCL_REINTERPRET_CAST(PVMFJitterBufferPort*, aContext);
   3308         PVMFJitterBufferPortParams* portparams = port->GetPortParams();
   3309         if (portparams)
   3310         {
   3311             PVMF_JBNODE_LOGDATATRAFFIC_OUT((0, "PVMFJitterBufferNode::PacketReadyToBeRetrieved for mime type %s", portparams->iMimeType.get_cstr()));
   3312             portparams->iCanReceivePktFromJB = true;
   3313         }
   3314     }
   3315 }
   3316 
   3317 void PVMFJitterBufferNode::EndOfStreamSignalled(OsclAny* aContext)
   3318 {
   3319     if (aContext)
   3320     {
   3321         PVLogger* ipDataPathLoggerRTCP = PVLogger::GetLoggerObject("datapath.sourcenode.jitterbuffer.rtcp");
   3322         PVMF_JBNODE_LOG_RTCP_DATAPATH((0, "PVMFJitterBufferNode::EndOfStreamSignalled"));
   3323         PVMFJitterBufferPort* port = OSCL_REINTERPRET_CAST(PVMFJitterBufferPort*, aContext);
   3324         PVMFJitterBufferPortParams* portparams = port->GetPortParams();
   3325         if (portparams)
   3326         {
   3327             RunIfNotReady();
   3328         }
   3329     }
   3330 }
   3331 
   3332 void PVMFJitterBufferNode::UpdateRebufferingStats(PVMFEventType aEventType)
   3333 {
   3334     if (aEventType == PVMFInfoUnderflow)
   3335     {
   3336         Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   3337         for (it = iPortParamsQueue.begin();
   3338                 it != iPortParamsQueue.end();
   3339                 it++)
   3340         {
   3341             PVMFJitterBufferPortParams* pJitterBufferPortParams = *it;
   3342             if (pJitterBufferPortParams->iMonitorForRemoteActivity == false)
   3343             {
   3344                 pJitterBufferPortParams->iMonitorForRemoteActivity = true;
   3345                 CancelEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   3346                 RequestEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   3347             }
   3348         }
   3349 
   3350         PVMF_JBNODE_LOGDATATRAFFIC_FLOWCTRL_E((0, "PVMFJitterBufferNode::UpdateRebufferingStats: Sending Auto Resume"));
   3351     }
   3352 
   3353 }
   3354 ///////////////////////////////////////////////////////////////////////////////
   3355 //PVMFJitterBufferMiscObserver
   3356 ///////////////////////////////////////////////////////////////////////////////
   3357 void PVMFJitterBufferNode::MessageReadyToSend(PVMFPortInterface*& aPort, PVMFSharedMediaMsgPtr& aMessage)
   3358 {
   3359     PVMF_JBNODE_LOGINFO((0, "0x%x PVMFJitterBufferNode::MessageReadyToSend: aPort=0x%x", this, aPort));
   3360 
   3361     PVMFJitterBufferPort* jitterbufferPort = OSCL_STATIC_CAST(PVMFJitterBufferPort*, aPort);
   3362 
   3363     //Kind of messages received here
   3364     //RTCP reports
   3365     //Firewall packets
   3366     //We do not expect port to go in busy state at firewall port and if somehow port used for sending rtcp messages
   3367     //is in busy state, or gets into busy state, we just ignore it and discard the message
   3368     PVMFStatus status = PVMFSuccess;
   3369     aPort->QueueOutgoingMsg(aMessage);
   3370     status = aPort->Send();
   3371     if (status == PVMFSuccess)
   3372     {
   3373         jitterbufferPort->iPortParams->iNumMediaMsgsSent++;
   3374     }
   3375     return;
   3376 }
   3377 
   3378 void PVMFJitterBufferNode::MediaReceivingChannelPrepared(bool aStatus)
   3379 {
   3380     //ignore the status param.
   3381     OSCL_UNUSED_ARG(aStatus);
   3382     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode::MediaRecvChannelPrerared In"));
   3383     iMediaReceiveingChannelPrepared = true;
   3384     if (iCurrentCommand.size())
   3385     {
   3386         PVMFJitterBufferNodeCommand& cmd = iCurrentCommand.front();
   3387         if (PVMF_JITTER_BUFFER_NODE_PREPARE == cmd.iCmd)
   3388         {
   3389             CompletePrepare();
   3390         }
   3391         if (PVMF_JITTER_BUFFER_NODE_START == cmd.iCmd)
   3392         {
   3393             CompleteStart();
   3394         }
   3395     }
   3396 }
   3397 
   3398 void PVMFJitterBufferNode::ProcessRTCPControllerEvent(PVMFAsyncEvent& aEvent)
   3399 {
   3400     PVMFNodeInterface::ReportInfoEvent(aEvent);
   3401 }
   3402 
   3403 void PVMFJitterBufferNode::SessionSessionExpired()
   3404 {
   3405 
   3406     CancelEventCallBack(JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED);
   3407 }
   3408 
   3409 ///////////////////////////////////////////////////////////////////////////////
   3410 //PVMFJBEventNotifierObserver implementation
   3411 ///////////////////////////////////////////////////////////////////////////////
   3412 void PVMFJitterBufferNode::ProcessCallback(CLOCK_NOTIFICATION_INTF_TYPE aClockNotificationInterfaceType, uint32 aCallBkId, const OsclAny* aContext, PVMFStatus aStatus)
   3413 {
   3414     OSCL_UNUSED_ARG(aClockNotificationInterfaceType);
   3415     OSCL_UNUSED_ARG(aContext);
   3416     PVMF_JBNODE_LOG_EVENTS_CLOCK((0, "PVMFJitterBufferNode::ProcessCallBack In CallBackId [%d] ", aCallBkId));
   3417 
   3418     if (PVMFSuccess == aStatus)
   3419     {
   3420         if (aCallBkId == iIncomingMediaInactivityDurationCallBkId)
   3421         {
   3422             iIncomingMediaInactivityDurationCallBkPending = false;
   3423             HandleEvent_IncomingMediaInactivityDurationExpired();
   3424         }
   3425         else if (aCallBkId == iNotifyBufferingStatusCallBkId)
   3426         {
   3427             iNotifyBufferingStatusCallBkPending = false;
   3428             HandleEvent_NotifyReportBufferingStatus();
   3429         }
   3430     }
   3431     else
   3432     {
   3433 
   3434         //Log it
   3435     }
   3436     PVMF_JBNODE_LOG_EVENTS_CLOCK((0, "PVMFJitterBufferNode::ProcessCallBack Out"));
   3437 }
   3438 
   3439 void PVMFJitterBufferNode::HandleEvent_IncomingMediaInactivityDurationExpired()
   3440 {
   3441     PVMF_JBNODE_LOG_EVENTS_CLOCK((0, "PVMFJitterBufferNode::HandleEvent_IncomingMediaInactivityDurationExpired In"));
   3442 
   3443     PVUuid eventuuid = PVMFJitterBufferNodeEventTypeUUID;
   3444     int32 errcode = PVMFJitterBufferNodeRemoteInactivityTimerExpired;
   3445 
   3446     PVMF_JB_LOGCLOCK_SESSION_DURATION((0, "PVMFJitterBufferNode::HandleEvent_IncomingMediaInactivityDurationExpired- iCurrentCommand.size()[%d]", iCurrentCommand.size()));
   3447     if (iCurrentCommand.size() > 0)
   3448     {
   3449         PVMFJitterBufferNodeCommand cmd = iCurrentCommand.front();
   3450         CommandComplete(cmd, PVMFFailure, NULL, &eventuuid, &errcode);
   3451         iCurrentCommand.Erase(&iCurrentCommand.front());
   3452     }
   3453     else
   3454     {
   3455         ReportInfoEvent(PVMFErrTimeout, NULL, &eventuuid, &errcode);
   3456         ipJitterBufferMisc->SetSessionDurationExpired();
   3457         if (IsAdded())
   3458         {
   3459             RunIfNotReady();
   3460         }
   3461     }
   3462 
   3463     PVMF_JBNODE_LOG_EVENTS_CLOCK((0, "PVMFJitterBufferNode::HandleEvent_IncomingMediaInactivityDurationExpired Out"));
   3464 }
   3465 
   3466 void PVMFJitterBufferNode::HandleEvent_NotifyReportBufferingStatus()
   3467 {
   3468     PVMF_JBNODE_LOG_EVENTS_CLOCK((0, "PVMFJitterBufferNode::HandleEvent_NotifyReportBufferingStatus In"));
   3469     if (iDelayEstablished == false)
   3470     {
   3471         /*
   3472          * Check to see if the session duration has expired
   3473          */
   3474         if (ipJitterBufferMisc->IsSessionExpired())
   3475         {
   3476             PVMF_JBNODE_LOGCLOCK((0, "PVMFJitterBufferNode::TimeoutOccurred - Session Duration Expired"));
   3477             /* Force out of rebuffering */
   3478             Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   3479             for (it = iPortParamsQueue.begin();
   3480                     it != iPortParamsQueue.end();
   3481                     it++)
   3482             {
   3483                 PVMFJitterBufferPortParams* pPortParams = *it;
   3484                 if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   3485                 {
   3486                     SendData(&(pPortParams->irPort));
   3487                 }
   3488             }
   3489             if (IsAdded())
   3490             {
   3491                 RunIfNotReady();
   3492             }
   3493         }
   3494         else
   3495         {
   3496             ReportInfoEvent(PVMFInfoBufferingStatus);
   3497             RequestEventCallBack(JB_NOTIFY_REPORT_BUFFERING_STATUS);
   3498         }
   3499     }
   3500     PVMF_JBNODE_LOG_EVENTS_CLOCK((0, "PVMFJitterBufferNode::HandleEvent_NotifyReportBufferingStatus Out"));
   3501 }
   3502 
   3503 ///////////////////////////////////////////////////////////////////////////////
   3504 //Utility functions
   3505 ///////////////////////////////////////////////////////////////////////////////
   3506 
   3507 bool
   3508 PVMFJitterBufferNode::getPortContainer(PVMFPortInterface* aPort,
   3509                                        PVMFJitterBufferPortParams*& aPortParamsPtr)
   3510 {
   3511     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   3512 
   3513     for (it = iPortParamsQueue.begin();
   3514             it != iPortParamsQueue.end();
   3515             it++)
   3516     {
   3517         PVMFJitterBufferPortParams* pPortParams = *it;
   3518         if (&pPortParams->irPort == aPort)
   3519         {
   3520             aPortParamsPtr = *it;
   3521             return true;
   3522         }
   3523     }
   3524     return false;
   3525 }
   3526 
   3527 bool PVMFJitterBufferNode::RequestEventCallBack(JB_NOTIFY_CALLBACK aEventType, uint32 aDelay, OsclAny* aContext)
   3528 {
   3529     OSCL_UNUSED_ARG(aDelay);
   3530     OSCL_UNUSED_ARG(aContext);
   3531     bool retval = false;
   3532     switch (aEventType)
   3533     {
   3534         case JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED:
   3535         {
   3536             PVMFJBEventNotificationRequestInfo eventRequestInfo(CLOCK_NOTIFICATION_INTF_TYPE_NONDECREASING, this, NULL);
   3537             retval = ipEventNotifier->RequestCallBack(eventRequestInfo, iMaxInactivityDurationForMediaInMs, iIncomingMediaInactivityDurationCallBkId);
   3538             if (retval)
   3539             {
   3540                 iIncomingMediaInactivityDurationCallBkPending = true;
   3541             }
   3542         }
   3543         break;
   3544         case JB_NOTIFY_REPORT_BUFFERING_STATUS:
   3545         {
   3546             if (iNotifyBufferingStatusCallBkPending)
   3547             {
   3548                 CancelEventCallBack(JB_NOTIFY_REPORT_BUFFERING_STATUS);
   3549             }
   3550             PVMFJBEventNotificationRequestInfo eventRequestInfo(CLOCK_NOTIFICATION_INTF_TYPE_NONDECREASING, this, NULL);
   3551             retval = ipEventNotifier->RequestCallBack(eventRequestInfo, iBufferingStatusIntervalInMs, iNotifyBufferingStatusCallBkId);
   3552             if (retval)
   3553             {
   3554                 iNotifyBufferingStatusCallBkPending = true;
   3555             }
   3556         }
   3557         break;
   3558 
   3559         default:
   3560         {
   3561             //Log it
   3562         }
   3563     }
   3564     return retval;
   3565 }
   3566 
   3567 void PVMFJitterBufferNode::CancelEventCallBack(JB_NOTIFY_CALLBACK aEventType, OsclAny* aContext)
   3568 {
   3569     OSCL_UNUSED_ARG(aContext);
   3570     switch (aEventType)
   3571     {
   3572         case JB_INCOMING_MEDIA_INACTIVITY_DURATION_EXPIRED:
   3573         {
   3574             if (iIncomingMediaInactivityDurationCallBkPending)
   3575             {
   3576                 PVMFJBEventNotificationRequestInfo eventRequestInfo(CLOCK_NOTIFICATION_INTF_TYPE_NONDECREASING, this, NULL);
   3577                 ipEventNotifier->CancelCallBack(eventRequestInfo, iIncomingMediaInactivityDurationCallBkId);
   3578                 iIncomingMediaInactivityDurationCallBkPending = false;
   3579             }
   3580         }
   3581         break;
   3582         case JB_NOTIFY_REPORT_BUFFERING_STATUS:
   3583         {
   3584             if (iNotifyBufferingStatusCallBkPending)
   3585             {
   3586                 PVMFJBEventNotificationRequestInfo eventRequestInfo(CLOCK_NOTIFICATION_INTF_TYPE_NONDECREASING, this, NULL);
   3587                 ipEventNotifier->CancelCallBack(eventRequestInfo, iNotifyBufferingStatusCallBkId);
   3588                 iNotifyBufferingStatusCallBkPending = false;
   3589             }
   3590         }
   3591         break;
   3592 
   3593         default:
   3594         {
   3595             //Log it
   3596         }
   3597     }
   3598     return;
   3599 }
   3600 
   3601 void PVMFJitterBufferNode::SetState(TPVMFNodeInterfaceState s)
   3602 {
   3603     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode:SetState %d", s));
   3604     PVMFNodeInterface::SetState(s);
   3605 }
   3606 
   3607 void PVMFJitterBufferNode::ReportErrorEvent(PVMFEventType aEventType,
   3608         OsclAny* aEventData,
   3609         PVUuid* aEventUUID,
   3610         int32* aEventCode)
   3611 {
   3612     PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode:NodeErrorEvent Type %d Data %d"
   3613                           , aEventType, aEventData));
   3614 
   3615     if (aEventUUID && aEventCode)
   3616     {
   3617         PVMFBasicErrorInfoMessage* eventmsg;
   3618         PVMF_JITTER_BUFFER_NEW(NULL, PVMFBasicErrorInfoMessage, (*aEventCode, *aEventUUID, NULL), eventmsg);
   3619         PVMFAsyncEvent asyncevent(PVMFErrorEvent,
   3620                                   aEventType,
   3621                                   NULL,
   3622                                   OSCL_STATIC_CAST(PVInterface*, eventmsg),
   3623                                   aEventData,
   3624                                   NULL,
   3625                                   0);
   3626         PVMFNodeInterface::ReportErrorEvent(asyncevent);
   3627         eventmsg->removeRef();
   3628     }
   3629     else
   3630     {
   3631         PVMFNodeInterface::ReportErrorEvent(aEventType, aEventData);
   3632     }
   3633 }
   3634 
   3635 void PVMFJitterBufferNode::ReportInfoEvent(PVMFEventType aEventType,
   3636         OsclAny* aEventData,
   3637         PVUuid* aEventUUID,
   3638         int32* aEventCode)
   3639 {
   3640     PVMF_JBNODE_LOGINFO((0, "PVMFJitterBufferNode:NodeInfoEvent Type %d Data %d"
   3641                          , aEventType, aEventData));
   3642 
   3643     if (aEventType == PVMFInfoBufferingStatus)
   3644     {
   3645         PVMFAsyncEvent asyncevent(PVMFInfoEvent,
   3646                                   aEventType,
   3647                                   NULL,
   3648                                   NULL,
   3649                                   aEventData,
   3650                                   &iJitterDelayPercent,
   3651                                   sizeof(iJitterDelayPercent));
   3652         PVMFNodeInterface::ReportInfoEvent(asyncevent);
   3653     }
   3654     else if (aEventUUID && aEventCode)
   3655     {
   3656         PVMFBasicErrorInfoMessage* eventmsg;
   3657         PVMF_JITTER_BUFFER_NEW(NULL, PVMFBasicErrorInfoMessage, (*aEventCode, *aEventUUID, NULL), eventmsg);
   3658         PVMFErrorInfoMessageInterface* interimPtr =
   3659             OSCL_STATIC_CAST(PVMFErrorInfoMessageInterface*, eventmsg);
   3660         PVMFAsyncEvent asyncevent(PVMFInfoEvent,
   3661                                   aEventType,
   3662                                   NULL,
   3663                                   OSCL_STATIC_CAST(PVInterface*, interimPtr),
   3664                                   aEventData,
   3665                                   NULL,
   3666                                   0);
   3667         PVMFNodeInterface::ReportInfoEvent(asyncevent);
   3668         eventmsg->removeRef();
   3669     }
   3670     else
   3671     {
   3672         PVMFNodeInterface::ReportInfoEvent(aEventType, aEventData);
   3673     }
   3674 }
   3675 
   3676 PVMFJitterBuffer*
   3677 PVMFJitterBufferNode::findJitterBuffer(PVMFPortInterface* aPort)
   3678 {
   3679     uint32 ii;
   3680     for (ii = 0; ii < iPortParamsQueue.size(); ii++)
   3681     {
   3682 
   3683         if (&iPortParamsQueue[ii]->irPort == aPort)
   3684         {
   3685             return (iPortParamsQueue[ii]->ipJitterBuffer);
   3686 
   3687         }
   3688     }
   3689     return NULL;
   3690 }
   3691 
   3692 
   3693 void PVMFJitterBufferNode::LogSessionDiagnostics()
   3694 {
   3695     if (iDiagnosticsLogged == false)
   3696     {
   3697         ipDiagnosticsLogger = PVLogger::GetLoggerObject("pvplayerdiagnostics.streamingmanager");
   3698 
   3699         LogPortDiagnostics();
   3700 
   3701         Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   3702         for (it = iPortParamsQueue.begin(); it != iPortParamsQueue.end(); it++)
   3703         {
   3704             PVMFJitterBufferPortParams* pPortParams = *it;
   3705             if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   3706             {
   3707                 PVMFJitterBuffer* jitterBuffer = findJitterBuffer(&pPortParams->irPort);
   3708                 if (jitterBuffer != NULL)
   3709                 {
   3710                     PVMFJitterBufferStats jbStats = jitterBuffer->getJitterBufferStats();
   3711                     uint32 in_wrap_count = 0;
   3712                     uint32 max_ts_reg = jbStats.maxTimeStampRegistered;
   3713                     pPortParams->iMediaClockConverter.set_clock(max_ts_reg, in_wrap_count);
   3714 
   3715                     in_wrap_count = 0;
   3716                     uint32 max_ts_ret = jbStats.maxTimeStampRetrieved;
   3717                     pPortParams->iMediaClockConverter.set_clock(max_ts_ret, in_wrap_count);
   3718 
   3719                     uint32 currentTime32 = 0;
   3720                     uint32 currentTimeBase32 = 0;
   3721                     bool overflowFlag = false;
   3722                     ipJitterBufferMisc->GetEstimatedServerClock().GetCurrentTime32(currentTime32,
   3723                             overflowFlag,
   3724                             PVMF_MEDIA_CLOCK_MSEC,
   3725                             currentTimeBase32);
   3726                     uint32 bitrate32 = 0;
   3727                     uint32 totalNumBytesRecvd = jbStats.totalNumBytesRecvd;
   3728                     if (currentTime32 != 0)
   3729                     {
   3730                         bitrate32 = (totalNumBytesRecvd / currentTime32);
   3731                     }
   3732 
   3733                     bitrate32 *= 8;
   3734 
   3735                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"));
   3736                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "JitterBuffer - TrackMime Type = %s", pPortParams->iMimeType.get_cstr()));
   3737                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "Total Num Packets Recvd = %d", jbStats.totalNumPacketsReceived));
   3738                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "Total Num Packets Registered Into JitterBuffer = %d", jbStats.totalNumPacketsRegistered));
   3739                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "Total Num Packets Retrieved From JitterBuffer = %d", jbStats.totalNumPacketsRetrieved));
   3740                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "MaxSeqNum Recvd = %d", jbStats.maxSeqNumReceived));
   3741                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "MaxSeqNum Registered = %d", jbStats.maxSeqNumRegistered));
   3742                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "MaxSeqNum Retrieved = %d", jbStats.lastRetrievedSeqNum));
   3743                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "MaxTimeStamp Registered In MS = %d", pPortParams->iMediaClockConverter.get_converted_ts(1000)));
   3744                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "MaxTimeStamp Retrieved In MS = %d", pPortParams->iMediaClockConverter.get_converted_ts(1000)));
   3745                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "Total Number of Packets Lost = %d", jbStats.totalPacketsLost));
   3746                     PVMF_JBNODE_LOGDIAGNOSTICS((0, "Estimated Bitrate = %d", bitrate32));
   3747                 }
   3748             }
   3749         }
   3750         iDiagnosticsLogged = true;
   3751     }
   3752 }
   3753 
   3754 void PVMFJitterBufferNode::LogPortDiagnostics()
   3755 {
   3756     PVLogger* ipDiagnosticsLogger = PVLogger::GetLoggerObject("pvplayerdiagnostics.streamingmanager");
   3757 
   3758     PVMF_JBNODE_LOGDIAGNOSTICS((0, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"));
   3759     PVMF_JBNODE_LOGDIAGNOSTICS((0, "PVMFJitterBufferNode - iNumRunL = %d", iNumRunL));
   3760 
   3761     Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>::iterator it;
   3762     for (it = iPortParamsQueue.begin(); it != iPortParamsQueue.end(); it++)
   3763     {
   3764         PVMFJitterBufferPortParams* pPortParams = *it;
   3765         PvmfPortBaseImpl* ptr =
   3766             OSCL_STATIC_CAST(PvmfPortBaseImpl*, &pPortParams->irPort);
   3767         PvmfPortBaseImplStats stats;
   3768         ptr->GetStats(stats);
   3769 
   3770         if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT)
   3771         {
   3772             PVMF_JBNODE_LOGDIAGNOSTICS((0, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"));
   3773             PVMF_JBNODE_LOGDIAGNOSTICS((0, "PVMF_JITTER_BUFFER_PORT_TYPE_INPUT"));
   3774             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingMsgRecv = %d", stats.iIncomingMsgRecv));
   3775             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingMsgConsumed = %d", stats.iIncomingMsgConsumed));
   3776             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingQueueBusy = %d", stats.iIncomingQueueBusy));
   3777             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgQueued = %d", stats.iOutgoingMsgQueued));
   3778             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgSent = %d", stats.iOutgoingMsgSent));
   3779             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingQueueBusy = %d", stats.iOutgoingQueueBusy));
   3780             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgDiscarded = %d", stats.iOutgoingMsgDiscarded));
   3781         }
   3782         else if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK)
   3783         {
   3784             PVMF_JBNODE_LOGDIAGNOSTICS((0, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"));
   3785             PVMF_JBNODE_LOGDIAGNOSTICS((0, "PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK"));
   3786             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingMsgRecv = %d", stats.iIncomingMsgRecv));
   3787             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingMsgConsumed = %d", stats.iIncomingMsgConsumed));
   3788             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingQueueBusy = %d", stats.iIncomingQueueBusy));
   3789             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgQueued = %d", stats.iOutgoingMsgQueued));
   3790             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgSent = %d", stats.iOutgoingMsgSent));
   3791             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingQueueBusy = %d", stats.iOutgoingQueueBusy));
   3792             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgDiscarded = %d", stats.iOutgoingMsgDiscarded));
   3793         }
   3794         else if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT)
   3795         {
   3796             PVMF_JBNODE_LOGDIAGNOSTICS((0, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"));
   3797             PVMF_JBNODE_LOGDIAGNOSTICS((0, "PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT"));
   3798             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingMsgRecv = %d", stats.iIncomingMsgRecv));
   3799             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingMsgConsumed = %d", stats.iIncomingMsgConsumed));
   3800             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iIncomingQueueBusy = %d", stats.iIncomingQueueBusy));
   3801             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgQueued = %d", stats.iOutgoingMsgQueued));
   3802             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgSent = %d", stats.iOutgoingMsgSent));
   3803             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingQueueBusy = %d", stats.iOutgoingQueueBusy));
   3804             PVMF_JBNODE_LOGDIAGNOSTICS((0, "iOutgoingMsgDiscarded = %d", stats.iOutgoingMsgDiscarded));
   3805         }
   3806     }
   3807 }
   3808 
   3809 bool PVMFJitterBufferNode::PrepareForPlaylistSwitch()
   3810 {
   3811 #if (PVLOGGER_INST_LEVEL > PVLOGMSG_INST_LLDBG)
   3812     uint32 clientClock32 = 0;
   3813     bool overflowFlag = false;
   3814     ipClientPlayBackClock->GetCurrentTime32(clientClock32, overflowFlag, PVMF_MEDIA_CLOCK_MSEC);
   3815     uint32 serverClock32 = ipJitterBufferMisc->GetEstimatedServerClockValue();
   3816     PVMF_JBNODE_LOGCLOCK_REBUFF((0, "PVMFJitterBufferNode::PrepareForPlaylistSwitch - Before - EstServClock=%d",
   3817                                  serverClock32));
   3818     PVMF_JBNODE_LOGCLOCK_REBUFF((0, "PVMFJitterBufferNode::PrepareForPlaylistSwitch - Before - ClientClock=%d",
   3819                                  clientClock32));
   3820 #endif
   3821     iJitterBufferState = PVMF_JITTER_BUFFER_IN_TRANSITION;
   3822     ipClientPlayBackClock->Pause();
   3823 
   3824     return true;
   3825 }
   3826 
   3827 void PVMFJitterBufferNode::ClockStateUpdated()
   3828 {
   3829     PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ClockStateUpdated - iClientPlayBackClock[%d]", ipClientPlayBackClock->GetState()));
   3830     if (!iDelayEstablished)
   3831     {
   3832         // Don't let anyone start the clock while
   3833         // we're rebuffering
   3834         if (ipClientPlayBackClock != NULL)
   3835         {
   3836             if (ipClientPlayBackClock->GetState() == PVMFMediaClock::RUNNING)
   3837             {
   3838                 PVMF_JBNODE_LOGERROR((0, "PVMFJitterBufferNode::ClockStateUpdated - Clock was started during rebuffering.  Pausing..."));
   3839                 ipClientPlayBackClock->Pause();
   3840             }
   3841         }
   3842     }
   3843 }
   3844 
   3845 void PVMFJitterBufferNode::NotificationsInterfaceDestroyed()
   3846 {
   3847     //noop
   3848 }
   3849 
   3850 void PVMFJitterBufferNode::MediaTrackSSRCEstablished(PVMFJitterBuffer* aJitterBuffer, uint32 aSSRC)
   3851 {
   3852     for (uint32 ii = 0; ii < iPortVector.size(); ii++)
   3853     {
   3854         PVMFJitterBufferPortParams* pPortParams = NULL;
   3855         bool bRet = getPortContainer(iPortVector[ii], pPortParams);
   3856         if (bRet)
   3857         {
   3858             if (pPortParams->iTag == PVMF_JITTER_BUFFER_PORT_TYPE_INPUT && pPortParams->ipJitterBuffer == aJitterBuffer)
   3859             {
   3860                 ipJitterBufferMisc->SetPortSSRC(&pPortParams->irPort, aSSRC);
   3861                 break;
   3862             }
   3863         }
   3864     }
   3865 }
   3866