Exemplo n.º 1
0
void MultiConf::SendIdrPacket(RTPSession *rtp)
{
	Participants::iterator itBroadcaster = participants.find(m_CurrentBroadCaster);
	if(rtp != NULL && itBroadcaster != participants.end())
	{
		RTPParticipant *broadCaster = (RTPParticipant*)itBroadcaster->second;
		Log("Send idr packet to newly added video\n");
		IDRPacketSize idrPacketSize = broadCaster->GetIdrPacketSize();
		IDRPacket idrPacket = broadCaster->GetIdrPacket();
		DWORD currentTimeStamp = broadCaster->GetCurrentTimestamp();
		size_t packetSize = idrPacket.size();
		for (size_t i = 0; i< packetSize ; ++i) 
		{
			BYTE *packet = idrPacket[i];
			int length = idrPacketSize[i];
			if(i == packetSize - 1)
			{
				rtp->ForwardPacket(packet, length, 1, currentTimeStamp);
			}
			else
			{
				rtp->ForwardPacket(packet, length, 0, currentTimeStamp);
			}
		}
	}
}
Exemplo n.º 2
0
bool MultiConf::AddBroadcastReceiver(RTMPStream *receiver)
{
	broadcast.AddReceiver(receiver);
	Participants::iterator itBroadcaster = participants.find(m_CurrentBroadCaster);
	if(itBroadcaster != participants.end())
	{
		RTPParticipant *broadCaster = (RTPParticipant*)itBroadcaster->second;
		Log("Send idr packet to newly broadcast reciever\n");
		IDRPacketSize idrPacketSize = broadCaster->GetIdrPacketSize();
		IDRPacket idrPacket = broadCaster->GetIdrPacket();
		DWORD currentTimeStamp = broadCaster->GetCurrentTimestamp();
		size_t packetSize = idrPacket.size();

		//Crete desc frame
		RTMPVideoFrame frameDesc(0,2048);
		//Send
		frameDesc.SetTimestamp(currentTimeStamp);
		//Set type
		frameDesc.SetVideoCodec(RTMPVideoFrame::AVC);
		//Set type
		frameDesc.SetFrameType(RTMPVideoFrame::INTRA);
		//Set NALU type
		frameDesc.SetAVCType(0);
		//Set no delay
		frameDesc.SetAVCTS(0);
		//Create description
		AVCDescriptor desc;
		//Set values
		desc.SetConfigurationVersion(1);
		//desc.SetAVCProfileIndication(0x42);
		//desc.SetProfileCompatibility(0x80);
		//desc.SetAVCLevelIndication(0x14);
		//desc.SetAVCProfileIndication(idrPacket[0][1]);
		//desc.SetProfileCompatibility(idrPacket[0][2]);
		//desc.SetAVCLevelIndication(idrPacket[0][3]);
		desc.SetAVCProfileIndication(0x64);
		desc.SetProfileCompatibility(0x00);
		desc.SetAVCLevelIndication(0x28);
		desc.SetNALUnitLength(3);
		desc.AddSequenceParameterSet(idrPacket[0],idrPacketSize[0]);
		desc.AddPictureParameterSet(idrPacket[1],idrPacketSize[1]);
		//Serialize
		DWORD len = desc.Serialize(frameDesc.GetMediaData(),frameDesc.GetMaxMediaSize());
		//Set size
		frameDesc.SetMediaSize(len);
		//broadcast.OnPublishedFrame(0, &frameDesc);
		receiver->PlayMediaFrame(&frameDesc);
		frameDesc.Dump();

		RTMPVideoFrame frame(0,65535);
		//Set codec
		frame.SetVideoCodec(RTMPVideoFrame::AVC);
		//Set NALU type
		frame.SetAVCType(1);
		//Set no delay
		frame.SetAVCTS(0);
		frame.SetTimestamp(currentTimeStamp);
		frame.SetFrameType(RTMPVideoFrame::INTRA);
		VideoFrame *videoFrame;
		RTPDepacketizer *depacketizer = RTPDepacketizer::Create( MediaFrame::Video, VideoCodec::H264);
		for(int i = 0; i < packetSize; i++) {
			BYTE *packet = idrPacket[i];
			int packet_size = idrPacketSize[i];
			videoFrame = (VideoFrame *)depacketizer->AddPayload(packet,packet_size);
		}
		frame.SetVideoFrame(videoFrame->GetData(), videoFrame->GetLength());
		receiver->PlayMediaFrame(&frame);
		frame.Dump();
		delete depacketizer;
		
	}
	
	return true;
}