Example #1
0
void checkForPacketArrival(void* /*clientData*/) {
    if (!notifyOnPacketArrival) return; // we're not checking
    
    // Check each subsession, to see whether it has received data packets:
    unsigned numSubsessionsChecked = 0;
    unsigned numSubsessionsWithReceivedData = 0;
    unsigned numSubsessionsThatHaveBeenSynced = 0;
    
    MediaSubsessionIterator iter(*session);
    MediaSubsession* subsession;
    while ((subsession = iter.next()) != NULL)
    {
        RTPSource* src = subsession->rtpSource();
        if (src == NULL) continue;
        ++numSubsessionsChecked;
        
        if (src->receptionStatsDB().numActiveSourcesSinceLastReset() > 0)
        {
            // At least one data packet has arrived
            ++numSubsessionsWithReceivedData;
        }
        if (src->hasBeenSynchronizedUsingRTCP())
            ++numSubsessionsThatHaveBeenSynced;
    }
    
    unsigned numSubsessionsToCheck = numSubsessionsChecked;
    // Special case for "QuickTimeFileSink"s and "AVIFileSink"s:
    // They might not use all of the input sources:
    if (qtOut != NULL)
        numSubsessionsToCheck = qtOut->numActiveSubsessions();
    
    else if (aviOut != NULL)
        numSubsessionsToCheck = aviOut->numActiveSubsessions();
    
    Boolean notifyTheUser;
    if (!syncStreams)
        notifyTheUser = numSubsessionsWithReceivedData > 0; // easy case
    else
    {
        notifyTheUser = numSubsessionsWithReceivedData >= numSubsessionsToCheck
        && numSubsessionsThatHaveBeenSynced == numSubsessionsChecked;
        // Note: A subsession with no active sources is considered to be synced
    }
    if (notifyTheUser)
    {
        struct timeval timeNow;
        gettimeofday(&timeNow, NULL);
        char timestampStr[100];
        sprintf(timestampStr, "%ld%03ld", timeNow.tv_sec, (long)(timeNow.tv_usec/1000));
        *env << (syncStreams ? "Synchronized d" : "D")
		<< "ata packets have begun arriving [" << timestampStr << "]\007\n";
        return;
    }
    
    // No luck, so reschedule this check again, after a delay:
    int uSecsToDelay = 100000; // 100 ms
    arrivalCheckTimerTask
    = env->taskScheduler().scheduleDelayedTask(uSecsToDelay,
                                               (TaskFunc*)checkForPacketArrival, NULL);
}