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; } }
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; } }