コード例 #1
0
ファイル: asfparser.cpp プロジェクト: maoxuli/asfparser
RtpPacket* AsfParser::MakeRtpPacket(AsfPacket* packet) 
{
	assert(packet != NULL);
    
	if( packet->PadLen == 0 ) 
    {
		uint16_t rtpSize = RtpPacket::RTP_HEAD_LEN + 4 + packet->PacketLen; 
		RtpPacket* rtpPacket = new RtpPacket( rtpSize );
		uint8_t* p = rtpPacket->payload;
        
		*(uint16_t*) p = htons(0x4000);
		p += 2;
        
		*(uint16_t*) p = htons(rtpPacket->payloadSize);
		p += 2;
        
		memcpy( p, packet->Buf, packet->PacketLen );
		assert ( packet->PacketLen + 4 == rtpPacket->payloadSize );
		rtpPacket->SetTimeStamp( packet->Time );
		return rtpPacket;
	}
	else 
    {
		uint16_t rtpSize = RtpPacket::RTP_HEAD_LEN + 4 + 7 + 6 + packet->PayloadSize ; 
		RtpPacket* rtpPacket = new RtpPacket( rtpSize );
		uint8_t* buf = new uint8_t [ rtpPacket->payloadSize ];
		uint8_t* p = buf;
        
		*(uint16_t*) p = htons(0x4000);
		p += 2;
        
		*(uint16_t*) p = htons(rtpPacket->payloadSize);
		p += 2;
        
		(*p) = packet->ErrorFlags;
		p += 1;
		for(int i = 0; i < packet->ErrorDataLen; i++) 
        {
			(*p) = packet->ErrorData[i];
			p += 1;
		}
        
		(*p) = 0x40;
		if( (packet->LenFlags&0x01) != 0 ) 
        {
			(*p) |= 0x01;
		}
		p += 1;
        
		(*p) = packet->PropFlags;
		p += 1;
        
		*(uint16_t*)p =  rtpPacket->payloadSize - 4 ;
		p += 2;
        
		*(uint16_t*) p = packet->Time;
		p += 4;
        
		*(uint16_t*) p = packet->Duration;
		p += 2;
        
		memcpy( p, packet->Payload, packet->PayloadSize );
		p += packet->PayloadSize;
		
		assert( p - buf == rtpPacket->payloadSize );
        
        
		rtpPacket->SetPayLoad( buf, rtpPacket->payloadSize );
		rtpPacket->SetTimeStamp( packet->Time );
		delete buf;
		return rtpPacket;
	}
}
コード例 #2
0
ファイル: AsfReader.cpp プロジェクト: tempbottle/TestSet
RtpPacket * AsfReader::Packet2Rtp(AsfPacket * pa) 
{
	//将从文件读出的packet 转换成 RtpPacket  包 , 用Packet 中的time设置其Timestamp 值
	ASSERT( pa != NULL);

	DWORD rtpSize;
	if( pa->PadLen == 0 ) {
		rtpSize = RtpPacket::RTP_HEAD_LEN + 4 + pa->PacketSize;
#pragma warning(disable : 4244)
		RtpPacket* rtpPa = new RtpPacket ( rtpSize );
#pragma warning(default : 4244)
		BYTE * p = rtpPa->payload;

		*(WORD*) p = htons(0x4000);
		//if( isFirstPacket ) p|= 0x10;
		p += 2;

		*(WORD*) p = htons(rtpPa->payloadSize);
		p += 2;

		memcpy( p, pa->buf, pa->PacketSize );
		ASSERT ( pa->PacketSize + 4 == rtpPa->payloadSize );
		rtpPa->SetTimeStamp( pa->Time );
		return rtpPa;
	}
		
	
	else {
		rtpSize = RtpPacket::RTP_HEAD_LEN + 4 + 7 + 6 + pa->PayloadSize;
#pragma warning(disable : 4244)
		RtpPacket* rtpPa = new RtpPacket ( rtpSize );
#pragma warning(default : 4244)
		BYTE * buf = new BYTE [ rtpPa->payloadSize ];
		BYTE* p = buf;

		*(WORD*) p = htons(0x4000);
		p += 2;

		*(WORD*) p = htons(rtpPa->payloadSize);
		p += 2;

		(*p) = pa->ErrorFlags;
		p +=1;
		for(int i=0; i<pa->ErrorDataLen; i++) {
			(*p) = pa->ErrorData[i];
			p+=1;
		}

		(*p) = 0x40;
		if( (pa->LenFlags&0x01) != 0 ) {
			(*p)|=0x01;
		}
		p+=1;

		(*p) = pa->PropFlags;
		p+=1;

		*(WORD*)p =  rtpPa->payloadSize - 4 ;
		p+=2;

		*(DWORD*) p = pa->Time;
		p+=4;

		*(WORD*) p = pa->Duration;
		p+=2;

		memcpy( p, pa->Payload, pa->PayloadSize );
		p+=pa->PayloadSize;
		
		ASSERT( p - buf == rtpPa->payloadSize );


		rtpPa->SetPayLoad( buf, rtpPa->payloadSize );
		rtpPa->SetTimeStamp( pa->Time );
		delete buf;
		return rtpPa;

	}
	
}