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); } } } }
int MultiConf::StartReceivingVideoSpy(int spyId, VideoCodec::RTPMap& rtpMap) { int ret = 0; Log("-StartReceivingVideoSpy [%d]\n",spyId); if(spys.find(spyId) == spys.end()) return 0; int spyeeId = spys[spyId]; //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(spyeeId,Participant::RTP); //Check particpant if (part) //Set video codec ret = part->StartReceivingVideoSpy(spyId, rtpMap); //Unlock participantsLock.DecUse(); //Exit return ret; }
int MultiConf::DeleteSpy(int spyId) { int ret = 0; Spys::iterator it = spys.find(spyId); if(it == spys.end()) return 0; spysLock.WaitUnusedAndLock(); int spyeeId = spys[spyId]; spys.erase(it); spysLock.Unlock(); Log(">DeleteSpy [%d]\n",spyId); //Use list participantsLock.IncUse(); RTPParticipant *part = (RTPParticipant*)GetParticipant(spyeeId,Participant::RTP); //Check particpant if (part) //Set video codec ret = part->DeleteVideoSpy(spyId); //Unlock participantsLock.DecUse(); Log("<DeleteSpy [%d]\n",spyId); return 1; }
int MultiConf::StartSendingVideoSpy(int spyId,char *sendVideoIp,int sendVideoPort,VideoCodec::RTPMap& rtpMap) { int ret = 0; RTPSession *rtp = NULL; if(spys.find(spyId) == spys.end()) return 0; int spyeeId = spys[spyId]; Log("-StartSendingVideoSpy [%d]\n",spyeeId); //Use list participantsLock.IncUse(); RTPParticipant *part = (RTPParticipant*)GetParticipant(spyeeId,Participant::RTP); //Check particpant if (part) //Set video codec ret = part->StartSendingVideoSpy(spyId, sendVideoIp, sendVideoPort, rtpMap); //Unlock participantsLock.DecUse(); //Start sending the video //return ((RTPParticipant*)part)->StartSendingVideo(sendVideoIp,sendVideoPort,rtpMap); return ret; }
int MultiConf::StopRecordingParticipant(int partId) { int ret = 0; Log("-StopRecordingParticipant [id:%d]\n",partId); //Lock participantsLock.IncUse(); //Get rtp participant RTPParticipant* rtp = (RTPParticipant*)GetParticipant(partId,Participant::RTP); //Check participant if (rtp) { //Set the listener for the rtp video packets rtp->SetMediaListener(NULL); //Add the listener for audio and text frames of the watcher audioEncoder.RemoveListener(&rtp->recorder); textEncoder.RemoveListener(&rtp->recorder); //Stop recording rtp->recorder.Stop(); //End recording ret = rtp->recorder.End(); } //Unlock participantsLock.DecUse(); //Exit return ret; }
int MultiConf::StartRecordingParticipant(int partId,const char* filename) { int ret = 0; Log("-StartRecordingParticipant [id:%d,name:\"%s\"]\n",partId,filename); //Lock participantsLock.IncUse(); //Get participant RTPParticipant *rtp = (RTPParticipant*)GetParticipant(partId,Participant::RTP); //Check if if (!rtp) //End goto end; //Create recording if (!rtp->recorder.Create(filename)) //End goto end; //Start recording if (!rtp->recorder.Record()) //End goto end; //Set the listener for the rtp video packets rtp->SetMediaListener(&rtp->recorder); //Add the listener for audio and text frames of the watcher audioEncoder.AddListener(&rtp->recorder); textEncoder.AddListener(&rtp->recorder); //OK ret = 1; end: //Unlock participantsLock.DecUse(); //Exit return ret; }
int MultiConf::SetRTPProperties(int id,MediaFrame::Type media,const Properties& properties) { int ret = 0; //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set codec ret = part->SetRTPProperties(media,properties); //Unlock participantsLock.DecUse(); //Exit return ret; }
/************************ * StartReceivingVideo * StartReceivingVideo *************************/ int MultiConf::StartReceivingVideo(int id,VideoCodec::RTPMap& rtpMap) { int ret = 0; Log("-StartReceivingVideo [%d]\n",id); //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set video codec ret = part->StartReceivingVideo(rtpMap); //Unlock participantsLock.DecUse(); //Exit return ret; }
/************************ * End * Termina una multiconferencia *************************/ int MultiConf::StopReceivingText(int id) { int ret = 0; Log("-StopReceivingText [%d]\n",id); //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set video codec ret = part->StopReceivingText(); //Unlock participantsLock.DecUse(); //Exit return ret; }
/************************ * StartSendingText * StartSendingText *************************/ int MultiConf::StartSendingText(int id,char *sendTextIp,int sendTextPort,TextCodec::RTPMap& rtpMap) { int ret = 0; Log("-StartSendingText [%d]\n",id); //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set video codec ret = part->StartSendingText(sendTextIp,sendTextPort,rtpMap); //Unlock participantsLock.DecUse(); //Exit return ret; }
int MultiConf::SetLocalSTUNCredentials(int id,MediaFrame::Type media,const char *username,const char* pwd) { int ret = 0; Log("-SetLocalSTUNCredentials %s [partId:%d,username:%s,pwd:%s]\n",MediaFrame::TypeToString(media),id,username,pwd); //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set codec ret = part->SetLocalSTUNCredentials(media,username,pwd); //Unlock participantsLock.DecUse(); //Exit return ret; }
int MultiConf::SetRemoteCryptoDTLS(int id,MediaFrame::Type media,const char *setup,const char *hash,const char *fingerprint) { int ret = 0; Log("-SetRemoteCryptoDTLS %s [partId:%d]\n",MediaFrame::TypeToString(media),id); //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set codec ret = part->SetRemoteCryptoDTLS(media,setup,hash,fingerprint); //Unlock participantsLock.DecUse(); //Exit return ret; }
int MultiConf::SetLocalCryptoSDES(int id,MediaFrame::Type media,const char *suite,const char* key) { int ret = 0; Log("-SetLocalCryptoSDES %s [partId:%d]\n",MediaFrame::TypeToString(media),id); //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set codec ret = part->SetLocalCryptoSDES(media,suite,key); //Unlock participantsLock.DecUse(); //Exit return ret; }
/************************ * StopReceivingVideo * StopReceivingVideo *************************/ int MultiConf::StopReceiving(int id,MediaFrame::Type media) { int ret = 0; Log("-StopReceiving %s [partId:%d]\n",MediaFrame::TypeToString(media),id); //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set video codec ret = part->StopReceiving(media); //Unlock participantsLock.DecUse(); //Exit return ret; }
int MultiConf::StartSending(int id,MediaFrame::Type media,char *sendIp,int sendPort,const RTPMap& rtpMap,const RTPMap& aptMap) { int ret = 0; Log("-StartSending %s [partId:%d]\n",MediaFrame::TypeToString(media),id); //Use list participantsLock.IncUse(); //Get the participant RTPParticipant *part = (RTPParticipant*)GetParticipant(id,Participant::RTP); //Check particpant if (part) //Set codec ret = part->StartSending(media,sendIp,sendPort,rtpMap,aptMap); //Unlock participantsLock.DecUse(); //Exit return ret; }
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; }