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