#include "stdafx.h"
#include "jrtpwrapper.h"
#include "unpackrtp.h"
#define RTP_HEAD_LEN 12
#define FRAME_DUMP_SYMBOL "D:\\jrtp_picker_metaldata.264"
bool JRTPWrapper::RtpFramizer(void * bufln, int len, int payloadLen,void **pBufOut, int *pOutLen)
{
*pOutLen = 0;
if(len < RTP_HEAD_LEN || payloadLen < 2) {
return false;
}
int rtpHeaderLen = len - payloadLen;
unsigned char * src = (unsigned char*)bufln + RTP_HEAD_LEN;
unsigned char head1 = *src;
unsigned char head2 = *(src+1);
unsigned char nal = head1 & 0x1f;// 获取FU_Indicator的Type域
unsigned char flag = head2 &0xe0;// 获取FU header的前三位,判断当前是分包的开始、中间或结束
unsigned char nal_fua = (head1 & 0xe0) | (head2 & 0x1f);
bool bFinishFrame = false;
if(nal != 28) {
printf("NAL TYPE:%d\n",nal);
}
if(nal == 0x1c) {
//printf("FU_A slice..................\n");
if(flag == 0x80) { //start
*pBufOut = src - 3;
*((unsigned int*)(*pBufOut)) = 0x01000000;
*((char*)(*pBufOut)+4) = nal_fua;
*pOutLen = len - RTP_HEAD_LEN + 3;
}else if(flag == 0x40){ //end
*pBufOut = src + 2;
*pOutLen = len - RTP_HEAD_LEN - 2;
} else { //middle
*pBufOut = src + 2;
*pOutLen = len - RTP_HEAD_LEN - 2;
}
} else {//单包数据
*pBufOut = src - 4;
* ((unsigned int *)( * pBufOut)) = 0x01000000 ;
*pOutLen = len - RTP_HEAD_LEN + 4;
}
unsigned char *bufTmp = (unsigned char*)bufln;
if(bufTmp[1]& 0x80) {
bFinishFrame = true; //rtp make
}else {
bFinishFrame = false;
}
/*if(*pOutLen > 0) {
fwrite(*pBufOut,*pOutLen,1,m_pDumpLocation);
}*/
return bFinishFrame;
}
JRTPWrapper::JRTPWrapper(TRTSPClient &rtspClient,int iLocalPort):
m_rtspClient(rtspClient)
,m_iLocalRtpPort(iLocalPort)
,m_iFrameLen(0)
,m_fCompleteFrame(false)
,m_fIsFirstPacket(true)
,m_expectedSeq(0)
#ifdef DUMP_FRAME
,m_pDumpLocation(NULL)
#endif
{
}
JRTPWrapper::~JRTPWrapper()
{
}
bool JRTPWrapper::Setup()
{
jrtplib::RTPSessionParams sessparams;
jrtplib::RTPUDPv4TransmissionParams tranparams;
sessparams.SetOwnTimestampUnit(1.0/25.0);
sessparams.SetAcceptOwnPackets(true);
tranparams.SetPortbase(m_iLocalRtpPort);
int iRet = m_session.Create(sessparams,&tranparams);
return !iRet;
}
bool JRTPWrapper::Startup()
{
if(this->Setup()) {
Start();
return true;
}
return false;
}
bool JRTPWrapper::GetIncomingPacket(unsigned char *packetBuffer, int &iLen)
{
return true;
}
void JRTPWrapper::Shutdown()
{
if(m_session.IsActive()) {
m_session.BYEDestroy(jrtplib::RTPTime(10,0),0,0);
}
}
void JRTPWrapper::Run()
{
int iRet;
#ifdef DUMP_FRAME
m_pDumpLocation = fopen(FRAME_DUMP_SYMBOL,"wb");
#endif
while(TRUE) {
iRet = m_session.BeginDataAccess();
if(m_session.GotoFirstSourceWithData()) {
jrtplib::RTPPacket *packet = NULL;
do {
while ((packet = m_session.GetNextPacket()) != NULL)
{
// You can examine the data here
printf("current packet information:PacketSize:%u,Timestamp:%u,Sequence:%u,SSRC:%u,PayloadType=%u\n",
packet->GetPacketLength(),packet->GetTimestamp(),packet->GetSequenceNumber(),packet->GetSSRC(),packet->GetPayloadType());
// we don't longer need the packet, so
// we'll delete it
void * nal = NULL;
int nal_len = 0;
m_fCompleteFrame = RtpFramizer(packet->GetPacketData(),packet->GetPacketLength(),
packet->GetPayloadLength(),&nal,&nal_len);
if(nal_len >0){
memcpy(m_frameBuffer+m_iFrameLen,nal,nal_len);
m_iFrameLen+=nal_len;
}
//Do extra process for the frame .
m_session.DeletePacket(packet);
//adjust the frame buffer position pointer.
if(m_fCompleteFrame) {
#ifdef DUMP_FRAME
//printf("Complete framizing,frame size:%u\n",m_iFrameLen);
fwrite(m_frameBuffer,m_iFrameLen,1,m_pDumpLocation);
#endif
m_iFrameLen = 0;
}
}
}while(m_session.GotoNextSourceWithData());
}
m_session.EndDataAccess();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
rtp接受和解析音视频.zip (61个子文件)
rtp
jrtplib
jthread.lib 11KB
include
jrtplib3
rtcpcompoundpacket.h 4KB
rtpaddress.h 3KB
rtppacketbuilder.h 10KB
rtpdebug.h 2KB
rtpudpv4transmitter.h 11KB
rtpexternaltransmitter.h 9KB
rtperrors.h 11KB
rtpconfig.h 2KB
rtpsession.h 26KB
rtpcollisionlist.h 3KB
rtpmemorymanager.h 8KB
rtpipv6address.h 4KB
rtppollthread.h 2KB
rtptransmitter.h 11KB
rtpipv4address.h 4KB
rtpkeyhashtable.h 9KB
rtpsourcedata.h 20KB
rtcpapppacket.h 4KB
rtprandom.h 2KB
rtpstructs.h 3KB
rtcprrpacket.h 6KB
rtcppacket.h 3KB
rtcppacketbuilder.h 12KB
rtpipv6destination.h 3KB
rtpsessionparams.h 11KB
rtpudpv6transmitter.h 11KB
rtpsources.h 17KB
rtcpunknownpacket.h 3KB
rtcpbyepacket.h 4KB
rtpmemoryobject.h 2KB
rtphashtable.h 8KB
rtpinternalsourcedata.h 5KB
rtppacket.h 7KB
rtprandomrands.h 2KB
rtcpsdespacket.h 11KB
rtprandomrand48.h 2KB
rtpbyteaddress.h 4KB
rtcpcompoundpacketbuilder.h 12KB
rtptypes_win.h 2KB
rtcpsrpacket.h 8KB
rtprawpacket.h 4KB
rtptypes.h 237B
rtpdefines.h 3KB
rtcpscheduler.h 7KB
rtprandomurandom.h 2KB
rtpipv4destination.h 3KB
rtpsessionsources.h 3KB
rtcpsdesinfo.h 8KB
rtplibraryversion.h 2KB
rtptimeutilities.h 8KB
jthread
jmutex.h 2KB
jthreadconfig.h 2KB
jthread.h 2KB
jmutexautolock.h 2KB
jthread_d.lib 57KB
jrtplib.lib 1.79MB
jrtplib_d.lib 5.84MB
unpackrtp.h 9KB
jrtpwrapper.cpp 4KB
jrtpwrapper.h 1KB
共 61 条
- 1
资源评论
- Lewin05052018-07-11能不能上传整个工程?没找到main函数。
qiuchen1512
- 粉丝: 3
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功