ccrtp-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Ccrtp-devel] problem while reducing the seding rate


From: David Sugar
Subject: Re: [Ccrtp-devel] problem while reducing the seding rate
Date: Thu, 12 May 2005 07:27:47 -0400
User-agent: Mozilla Thunderbird 1.0.2 (Macintosh/20050317)

I have always used a RTP stream class that is derived from SymmetricRTPSession, and with a custom run method, so I had not noticed this. You may well be correct that dispatchDataPacket() should be public.

Dinil Divakaran wrote:

I have experimented with something functionally similar to this. I noticed you do not have a dispatchDataPacket at the end of your loop. I use something a bit more complex at the moment that looks like this:


But dispatchDataPacket is a protected class method !

- Dinil


void RTPStream::run(void)
{
       size_t r, n;
       size_t size = info.framesize;
       timeout_t timer;
    bool first = true;
    Event event;
    unsigned count, jitter = Driver::sip.jitter;
    unsigned jsend = jitter;
    AudioCodec *codec = session->codec;
    bool dtmfdigits = false;
    char dbuf[65];
    int dig;
    Linear tbuf;

    if(Driver::sip.getDTMFInband())
        dtmf = new DTMFDetect();

       setTimer(0);

       for(;;)
       {
        if(dtmfdigits)
        {
            dtmf->getResult(dbuf, 64);
            dig = -1;
            if(dbuf[0])
                dig = Bayonne::getDigit(dbuf[0]);
            if(dig > -1)
            {
                memset(&event, 0, sizeof(event));
                event.id = DTMF_KEYUP;
                event.dtmf.digit = dig;
                event.dtmf.duration = 60;
                if(session->postEvent(&event))
                {
                    setSource(NULL);
                    setSink(NULL);
                    setTone(NULL);
                }
            } dtmfdigits = false;
        }
               incTimer(info.framing);
               setCancel(cancelDeferred);
               enter();
        if(tone)
        {
            tbuf = tone->getFrame();
            if(!tbuf || !codec)
            {
                fcount = 0;
                tone = NULL;
                memset(&event, 0, sizeof(event));
                event.id = AUDIO_IDLE;
                session->queEvent(&event);
                goto done;
            }
            if(codec)
            {
                codec->encode(tbuf, session->buffer, info.framecount);
                putBuffer(session->buffer, size);
//                r = dispatchDataPacket();
            } if(jsend)
            {
                --jsend;
                leave();
                continue;
            }
                    }
               else if(source)
               {
                       n = source->getBuffer(session->buffer, size);
            if(n == size)
            {
                if(ending)
                {
                    memset(&event, 0, sizeof(event));
                    event.id = AUDIO_ACTIVE;
                    session->queEvent(&event);
                    ending = false;
                }
                            putBuffer(session->buffer, size);
            }
            else if(!ending)
            {
                fcount = 0;
                memset(&event, 0, sizeof(event));
                event.id = AUDIO_IDLE;
                session->queEvent(&event);
                ending = true;
            }
//                        r = dispatchDataPacket();
            if(jsend)
            {
                --jsend;
                leave();
                continue;
            }
               }
        else
            jsend = jitter;

done:
               leave();
        r = dispatchDataPacket();
               setCancel(cancelImmediate);

        if(tonecount == 1 && stopid != MSGPORT_WAKEUP)
        {
            memset(&event, 0, sizeof(event));
            event.id = stopid;
            stopid = MSGPORT_WAKEUP;
            session->postEvent(&event);
        }         if(tonecount)
            --tonecount;

        if(first)
        {
            while(isPendingData(0))
            {
                            setCancel(cancelDeferred);
                           r = takeInDataPacket();
                           if(r < 0)
                                   break;

                jitter = Driver::sip.jitter;

                if(first)
                {
                    memset(&event, 0, sizeof(event));
                    event.id = AUDIO_START;
                    session->queEvent(&event);
                    count = 6;
                    while(dtmf && count--)
dtmf->putSamples(Driver::sip.silent_frame, info.framecount);
                }

                first = false;

                            enter();
                           n = getBuffer(session->buffer, r);
                if(dtmf && codec && n == size)
                {
codec->decode(session->lbuffer, session->buffer, info.framecount); dtmfdigits = dtmf->putSamples(session->lbuffer, info.framecount); }
                           if(sink)
                                   sink->putBuffer(session->buffer, n);
                           leave();
                           setCancel(cancelImmediate);
                    }
        }
        else if(!jitter)
        {
            if(isPendingData(0))
            {
                setCancel(cancelDeferred);
                r = takeInDataPacket();
                if(r < 0)
                    break;

                enter();
                n = getBuffer(session->buffer, r);
                if(dtmf && codec && n == size)
                {
codec->decode(session->lbuffer, session->buffer, info.framecount); dtmfdigits = dtmf->putSamples(session->lbuffer, info.framecount);
                }
                if(sink)
                    sink->putBuffer(session->buffer, n);
                leave();
                setCancel(cancelImmediate);
            }
            else
            {
                memset(&event, 0, sizeof(event));
                event.id = AUDIO_STOP;
                session->queEvent(&event);
                first = true;
            }
        }
        else if(!first)
            --jitter;

               timer = getTimer();

               if(timer)
                       Thread::sleep(timer);
        else
            Thread::yield();

        enter();
        if(fcount > 1)
            --fcount;
        else if(fcount == 1)
        {
            fcount = 0;
            source = NULL;
            sink = NULL;
            tone = NULL;
            memset(&event, 0, sizeof(event));
            event.id = AUDIO_IDLE;
            session->postEvent(&event);
        }
        leave();                }
}


Dinil Divakaran wrote:


Hi all,

I was working on an example for transmitting an audio file using ccrtp (http://www.gnu.org/software/ccrtp/doc/refman/html/audiotx_8cpp-example.html) The following lines are from the above example. In this code, packets are sent and then thread sleeps for a time of 'PERIOD' milliseconds. I changed
the value of PERIOD to 100 (milliseconds) and found that even though the
program says that the packets are sent; the packets weren't actually sent. 'tcpdump' showed that only the first packet was sent; and thereafter only
RTCP packets were sent (with still lesser frequency). When I changed the
value of 'PERIOD' to 50, the packets were sent successfully.

Can anyone please tell me where have I gone wrong ?

--------------------------------------------------------------------------
                              .
                              .
                              .

        cout << "Transmitting " << PACKET_SIZE
             << " octects long packets "
             << "every " << PERIOD << " milliseconds..." << endl;

        unsigned char buffer[PACKET_SIZE];
        int count=PACKET_SIZE;

        // This will be useful for periodic execution
        TimerPort::setTimer(PERIOD);

        setCancel(cancelImmediate);
        // This is the main loop, where packets are transmitted.
        for( int i = 0 ; (!sendingfile || count > 0) ; i++ ){

            count = ::read(audioinput,buffer,PACKET_SIZE);
            if( count > 0 ){
                // send an RTP packet, providing timestamp,
                // payload type and payload.
                socket->putData(PACKET_SIZE * i, buffer, PACKET_SIZE);
            }
            cout << "." << flush;

            // Let's wait for the next cycle
            Thread::sleep(TimerPort::getTimer());
            TimerPort::incTimer(PERIOD);
        }
        cout << endl << "I have got no more data to send. " <<endl;

                              .
                              .
                              .
                              .
--------------------------------------------------------------------------

- Dinil



_______________________________________________
Ccrtp-devel mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/ccrtp-devel


Attachment: dyfet.vcf
Description: Vcard


reply via email to

[Prev in Thread] Current Thread [Next in Thread]