?? jb_utl.cpp
字號:
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 + -