⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jb_utl.cpp

📁 基于h323协议的软phone
💻 CPP
📖 第 1 页 / 共 3 页
字号:
       if( bufLen % framesize )
        {
            frames++;
            
            /* pad remainder with ff */
//            cmMemset((U8*)putBuffer+bufLen, 0xff, (frames*framesize)-bufLen);
     
            memset((U8*)putBuffer+bufLen, 0xff, (frames*framesize)-bufLen);
            bufLen = frames * framesize;
        }
      //  connCb->jitter.curTimestamp += (frames * JB_10MS_TIMESTAMP);
    }
    /* slm: MR3327 add support for G723 variable bitrates */
    /* check if we have mixed G723 frames in the buffer */
    else if( connCb->key.rxCodec == JB_G723 )
    {
        /*
            The least significant two bits of the first octet in
            the frame determine the frame size and codec type:
            bits  content                      octets/frame
            00    high-rate speech (6.3 kb/s)            24
            01    low-rate speech (5.3 kb/s)             20
            10    SID frame                               4
            11    reserved
        */
        U8 type;
        U32 offset = 0;
        frames = 0;
        while( offset < bufLen )
        {
            type = putBuffer[offset] & 0x3;
            frames++;
            switch( type )
            {
                /* G723 6.3Kbps frame */
                case 0:
                    offset += JB_G723_6_RAW_FRAME_SIZE;
                    break;
                /* G723 5.3Kbps frame */
                case 1:
                    offset += JB_G723_5_RAW_FRAME_SIZE;
                    break;
                /* G723 SID frame */
                case 2:
                    offset += JB_G723_SID_RAW_FRAME_SIZE;
                    break;
                /* Bad header in the packet, skip the data */
                default:
                    offset = bufLen;
                    break;
            }
        }
		
       // connCb->jitter.curTimestamp += (frames * 3 * JB_10MS_TIMESTAMP);
    }
    else
    {
        /* slm: MR8849 convert frames from ms to number of 10ms dsp frames */
        if( connCb->key.rxCodec == JB_G722 )
            frames = frames / JB_G722_MS_PER_FRAME;
        else if( connCb->key.rxCodec == JB_G726_32 )
            frames = frames / JB_G726_32_MS_PER_FRAME;
        else
            frames = frames / JB_G711_MS_PER_FRAME;

        //connCb->jitter.curTimestamp += (frames * JB_10MS_TIMESTAMP);
    }

/* debug JB out */
#ifdef DEBUG_JB
{
unsigned char foo[4];
static int speech = 0;
foo[0] = putBuffer[0] | 0x80;
foo[1] = putBuffer[1] | 0x80;
foo[2] = putBuffer[2] | 0x80;
foo[3] = putBuffer[3] | 0x80;
/* check for speech */
if((speech == 0) && ((foo[0] < 0xf0) && (foo[1] < 0xf0) && (foo[2] < 0xf0) && (foo[3] < 0xf0)))
{
    speech = 1;
    gGpio |= (1 << 8);
    if( isT8300 )
        *((volatile ULONG *)0xE000C014) = gGpio;
}
/* check for silence */
if((speech == 1) && ((foo[0] >= 0xf8) && (foo[1] >= 0xf8) && (foo[2] >= 0xf8) && (foo[3] >= 0xf8)))
{
    speech = 0;
    gGpio &= ~(1 << 8);
    if( isT8300 )
        *((volatile ULONG *)0xE000C014) = gGpio;
}
if( jbdbg_d_index && jbdbg_d_index < MAX_JBDBG )
{
jbdbg_d[jbdbg_d_index-1].frames = frames;
jbdbg_d[jbdbg_d_index-1].length = bufLen;
jbdbg_d[jbdbg_d_index-1].seq = connCb->jitter.jBuf[nextP].seqNum;
jbdbg_d[jbdbg_d_index-1].pkttimestamp = connCb->jitter.jBuf[nextP].timeStamp;
}
}
#endif

	
//    semGive(jbCb.sem);


#if 0/***remove by chen for delay**/
    /* slm: MR8849 now use array of coders for multiple lines */
    if (connCb->connIndex == jbCb.activeConn[connCb->key.lineNo])
    {
	
	
        /* slm: MR4386 Need semaphore to protect DSP writes */
        semTake(jbCb.dspSem[connCb->key.lineNo], WAIT_FOREVER);
//        jbCb.dspSem[connCb->key.lineNo].lock();
	//printf("putbufferbegin = %d\n",tickGet());
	  
     if(dspApiDecoder[connCb->key.lineNo])
            dspApiDecoder[connCb->key.lineNo]->putBuffer(putBuffer, frames, bufLen);
	
     //   if(dspApiDecoder[1])
         //   dspApiDecoder[1]->putBuffer(putBuffer, frames, bufLen,1);
	
	//printf("numpacket =%d\n",connCb->sts.numPackets);
	//printf("frames =%d\n",frames);
	//printf("playnumseq =%d\n",connCb->jitter.jBuf[nextP].seqNum);
//	if(codecIndex != -1 && dspApiDecoder[codecIndex])
//            dspApiDecoder[codecIndex]->putBuffer(putBuffer, frames, bufLen);

        semGive(jbCb.dspSem[connCb->key.lineNo]);

//        jbCb.dspSem[connCb->key.lineNo].unlock();
    }
#endif
       connCb->jitter.curTimestamp = connCb->jitter.jBuf[nextP].timeStamp;
       dspBuffer.bufLen = bufLen;
	dspBuffer.frames = frames;
	dspBuffer.putBuffer = putBuffer;
	//printf("putbufferend = %d\n",tickGet());
    RETVALUE(ROK);
#endif	
} /* JbRemovePacket */

/*
*
*       Fun:   JbUpdateJitter
*
*       Desc:  This function is used to update the buffer parameters
*
*       Ret:   ROK on success and RFAILED on failure
*
*       Notes:
*
*       File:  jb_utl.c
*
*/
#ifdef ANSI
PUBLIC S16 JbUpdateJitter
(
JbConnCb *connCb,       /* connection control block */
JbEvent event           /* current event */
)
#else
PUBLIC S16 JbUpdateJitter(connCb, event)
JbConnCb *connCb;       /* connection control block */
JbEvent event;          /* current event */
#endif
{
    U8 currentJitter;
    S32 tempSize;

//    TRC3(JbUpdateJitter)

	/*
	 * MR: 4213
	 * Don't attempt to adjust the jitter buffer until we have
	 * received the first audio packet.  This prevents us from
	 * thinking that PLAY has run dry at the beginning of the call
	 * This way we always start the call with the minimum-sized
	 * jitter buffer
	 *
	 */
	if(connCb->jitter.gotFirst == 1)
    	currentJitter = abs(connCb->jitter.receivePacketCount - connCb->jitter.playPacketCount);
	else
		connCb->jitter.playPacketCount = 0;

    if (event == JB_RECEIVE_PACKET)
    {
        if (connCb->jitter.playPacketCount == 0)
            RETVALUE(ROK);
        connCb->jitter.playPacketCount = 0;
    }
    else
    {
        if (connCb->jitter.receivePacketCount == 0)
            RETVALUE(ROK);
        connCb->jitter.receivePacketCount = 0;
    }

    connCb->jitter.maxJitter = MAX(currentJitter, connCb->jitter.maxJitter);
    /* slm: MR4213
    ** Why is currentJitter being set to MAX().  For one thing, this is redundant with
    ** maxJitter above.  And for another thing, setting it to MAX() means it'll never
    ** report if the currentJitter shrinks.
    ** connCb->sts.currentJitter = MAX(currentJitter, connCb->sts.currentJitter);
    ** Set it to currentJitter instead.
    */
    connCb->sts.currentJitter = currentJitter;
    if (currentJitter > connCb->sts.jitterBufferSize)
    {
        tempSize = MULTPERCENT(currentJitter,jbCb.jitCfg.incAmount);
        if (tempSize < connCb->jitter.maxLatency)
        {
//printf("j>b jit:%u buf:%u t:%u r:%u p:%u\n",currentJitter, connCb->sts.jitterBufferSize, tempSize,connCb->jitter.receivePacketCount,connCb->jitter.playPacketCount);
            connCb->sts.jitterBufferSize = tempSize;
        }
        connCb->jitter.currentStableTime = 0;
        connCb->jitter.bufferCreep = 0;
    }
    else /* current jitter is <= jitter Buffer Size */
    {
        /* Bump stable time only if it hasn't already hit the limit (prevent rollover) */
        if (connCb->jitter.currentStableTime < jbCb.jitCfg.minStableTime)
            connCb->jitter.currentStableTime++;

        if (connCb->jitter.currentStableTime >= jbCb.jitCfg.minStableTime)
        {
            tempSize = MULTPERCENT(connCb->sts.jitterBufferSize, jbCb.jitCfg.decAmount);
            if (( tempSize < connCb->sts.jitterBufferSize ) && ( tempSize >= jbCb.jitCfg.minSize ))
            {
//printf("j<b jit:%u buf:%u t:%u\n", currentJitter, connCb->sts.jitterBufferSize, tempSize);
                connCb->sts.jitterBufferSize = tempSize;
                connCb->jitter.currentStableTime = 0;
                /* MR4213
                ** our jitter has dropped down, so we may need to adjust
                ** the number of packets in our queue in order to maintain
                ** minimal the path delay */
                connCb->jitter.bufferDrop = 2;
                connCb->jitter.bufferCreep = 0;
            }
            /* check for buffer creep */
            /* If we are actively playing packets and the number of packets in the JB is
            ** growing bigger than the jitterbuffer size, it means we are rcving packets
            ** at a slightly higher rate than we are playing them out.  We need to adjust
            ** for this creep by dropping a buffer */
            else if(( event == JB_PLAY_PACKET ) && ( connCb->jitter.state == JB_ACTIVE_PLAY ) &&
                    ( connCb->sts.numPackets > connCb->sts.jitterBufferSize ))
            {
                connCb->jitter.bufferCreep++;
                if( connCb->jitter.bufferCreep > 100 )
                {
                    connCb->jitter.bufferDrop = 1;
                    connCb->jitter.bufferCreep = 0;
                }
            }
        }
    }

    RETVALUE(ROK);
} /* JbUpdateJitter */

/*
*
*       Fun:   jbAddPacket
*
*       Desc:  This function add a packet to the buffer
*
*       Ret:   ROK on success and RFAILED on failure
*
*       Notes:
*
*       File:  jb_utl.c
*
*/
#ifdef ANSI
PRIVATE S16 jbAddPacket
(
U16 seq,                /* Sequence number of packet */
U32 timeStamp,          /* Timestamp of packet */
CoderInfo rxCodec,      /* Receive Codec */
Data *dBuf,             /* Source Data to insert */
JBuf *dest,             /* Dest Jitter Buffer */
U32  frameSize          /* size of the frame to send */
)
#else
PRIVATE S16 jbAddPacket(seq, timeStamp, rxCodec, dBuf, dest, frameSize)
U16 seq;                /* Sequence number of packet */
U32 timeStamp;          /* Timestamp of packet */
CoderInfo rxCodec;      /* Receive Codec */
Data *dBuf;             /* Source Data to insert */
JBuf *dest;             /* Dest Jitter Buffer */
U32  frameSize;         /* size of the frame to send */
#endif
{
    S16 i;

//    TRC3(jbAddPacket)

    if ((!dest) || (!dBuf))
    {
          RETVALUE(RFAILED);
    }

    dest->seqNum = seq;
    dest->timeStamp = timeStamp;
    /* slm: save the data buffer size */
    dest->len = frameSize;

//    cmMemcpy((U8*)dest->buffer, (U8*)dBuf, frameSize);
	memcpy((U8*)dest->buffer, (U8*)dBuf, frameSize);

    RETVALUE(ROK);
} /* jbAddPacket */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -