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

}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;

}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
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;
}
Exemplo n.º 8
0
/************************
* 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;
}
Exemplo n.º 9
0
/************************
* 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;
}
Exemplo n.º 10
0
/************************
* 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;
}
Exemplo n.º 11
0
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;
}
Exemplo n.º 12
0
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;
}
Exemplo n.º 13
0
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;
}
Exemplo n.º 14
0
/************************
* 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;
}
Exemplo n.º 15
0
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;
}
Exemplo n.º 16
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;
}