Пример #1
0
/***********************************************************************************************************
**函数:SimpleH264SendPacket
**功能:
**输入参数:
**返回值:
***********************************************************************************************************/
int SimpleH264SendPacket(unsigned char *val,uint32_t length)
{
    /*
    *val:为264的原始数据,包含0x00 0x00 0x00 0x01信息,
    */
    int status=0;
    uint32_t  TimestampIncrement;
	uint32_t send_length,valid_len=length-4;
	char NALU=val[4],*sendStartAddr=NULL;
	#define  MAX_STREAM_SLICE 1024
    if(SimpleRtpIsActive()!=true)
    {
        printf("rtp Session is error,%s ,%d\n",__FUNCTION__, __LINE__);
        return -1;
    }
    Rtp_Lock();
	TimestampIncrement=sess.GetDefaultTimestampIncrement();
    if(valid_len<=MAX_STREAM_SLICE)
    {
        status = sess.SendPacket((void *)&val[4],valid_len,PLOAD_TYPE,true,DefaultTimestampIncrement);
        checkerror(status);
    }
    else
    {
        int k=0,l=0,len=valid_len,pos=0;
        k=len/MAX_STREAM_SLICE;
        l=len%MAX_STREAM_SLICE;
        int t=0;
        while(t<=k)
        {
            if(t==0)
            {//发送第1包					
            	sendStartAddr=(char *)(val+4);//发送数据的起始地址
				sendStartAddr[pos-1]=(NALU&0x60)|28;//FU indicator
            	sendStartAddr[pos]=(NALU&0x1f)|0x80;//FU header
				send_length=MAX_STREAM_SLICE+1;//要发送数据的长度
                status = sess.SendPacket(sendStartAddr-1,send_length,PLOAD_TYPE,false,DefaultTimestampIncrement);
				checkerror(status);
                if(status<0)
                {
                    goto end;
                }
				pos+=MAX_STREAM_SLICE;
            }
            else if(k==t&&l!=0)
            {//最后一包
            	sendStartAddr[pos-2]=(NALU&0x60)|28;//FU indicator
            	sendStartAddr[pos-1]=(NALU&0x1f)|0x40;//FU header
				send_length=l+2;//要发送数据的长度
                status = sess.SendPacket(sendStartAddr+pos-2,send_length,PLOAD_TYPE,true,0);
                checkerror(status);
                if(status<0)
                {
                    goto end;
                }
				pos+=l;
            }
            else if(t<k&&0!=t)
            {//发送第2包-----倒数第2包
            	if(l==0&&t==k-1)
            	{
					sendStartAddr[pos-2]=(NALU&0x60)|28;//FU indicator
					sendStartAddr[pos-1]=(NALU&0x1f)|0x40;//FU header
				}
				else
				{
					sendStartAddr[pos-2]=(NALU&0x60)|28;//FU indicator
					sendStartAddr[pos-1]=(NALU&0x1f);//FU header
				}
				send_length=MAX_STREAM_SLICE+2;//要发送数据的长度
                status = sess.SendPacket(sendStartAddr+pos-2,send_length,PLOAD_TYPE,false,0);
                checkerror(status);
                if(status<0)
                {
                    goto end;
                }	
				pos+=MAX_STREAM_SLICE;
            }
			t++;
        }
    }
#ifndef RTP_SUPPORT_THREAD
    checkerror(status);
#endif
end:
    Rtp_UnLock();
    return status;
}