You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openmeetings.apache.org by co...@google.com on 2013/03/13 13:31:32 UTC

[red5phone] r105 committed - Video: av setting are switch on video (with check)...

Revision: 105
Author:   solomax666@gmail.com
Date:     Wed Mar 13 05:31:08 2013
Log:      Video: av setting are switch on video (with check)
	FIR request is added (partially tested)
http://code.google.com/p/red5phone/source/detail?r=105

Modified:
  /branches/red5sip/src/java/org/red5/sip/app/RTMPRoomClient.java
  /branches/red5sip/src/java/org/red5/sip/app/RTPStreamVideoReceiver.java
  /branches/red5sip/src/java/org/red5/sip/app/RTPStreamVideoSender.java
  /branches/red5sip/src/java/org/red5/sip/app/RTPVideoStream.java
  /branches/red5sip/src/java/org/red5/sip/app/SIPTransport.java
  /branches/red5sip/src/java/org/red5/sip/app/SIPUserAgent.java
  /branches/red5sip/src/java/org/red5/sip/app/SIPVideoConverter.java
  /branches/red5sip/src/java/org/red5/sip/app/SIPVideoLauncher.java

=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/RTMPRoomClient.java	Sun Mar  
10 22:33:36 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/RTMPRoomClient.java	Wed Mar  
13 05:31:08 2013
@@ -60,6 +60,7 @@
  	private ISipNumberListener sipNumberListener = null;
  	private long lastSendActivityMS = 0L;
  	private boolean videoStarted = false;
+	private boolean streamCreated = false;
  	private final Runnable updateTask = new Runnable() {
  		public void run() {
  			while (true) {
@@ -84,6 +85,7 @@
  	final private String context;
  	final private String host;
  	private int activeVideoStreamID = -1;
+	private String destination;

  	public RTMPRoomClient(String host, String context, int roomId) {
  		super();
@@ -126,7 +128,9 @@
  		this.sipNumberListener = sipNumberListener;
  	}

-	public void init() {
+	public void init(String destination) {
+		this.destination = destination;
+		streamCreated = false;
  		getPublicSID();
  	}

@@ -414,7 +418,10 @@
  		case setUserAVSettings:
  			log.info("setUserAVSettings");
  			// SIP -> red5
-			createStream(this);
+			if (!streamCreated) {
+				createStream(this);
+				streamCreated = true;
+			}
  			break;
  		case setSipTransport:
  			log.info("setSipTransport");
@@ -520,7 +527,7 @@
  			return;
  		}
  		if (!videoStarted) {
-			//setUserAVSettings("av"); //TODO video support is disabled now as  
unstable
+			setUserAVSettings("av");
  			videoStarted = true;
  		}
  		if (videoBuffer == null || (videoBuffer.capacity() < video.length  
&& !videoBuffer.isAutoExpand())) {
@@ -540,4 +547,12 @@

  		publishStreamData(publishStreamId, message);
  	}
+
+	public String getDestination() {
+		return destination;
+	}
+
+	public void setDestination(String destination) {
+		this.destination = destination;
+	}
  }
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/RTPStreamVideoReceiver.java	 
Tue Mar  5 01:52:05 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/RTPStreamVideoReceiver.java	 
Wed Mar 13 05:31:08 2013
@@ -21,11 +21,11 @@
  	private boolean running;
  	private ConverterThread converterThread;

-	public RTPStreamVideoReceiver(IMediaReceiver mediaReceiver,  
DatagramSocket socket, SIPCodec codec) {
+	public RTPStreamVideoReceiver(SIPTransport sipTransport, IMediaReceiver  
mediaReceiver, DatagramSocket socket, SIPCodec codec) {
  		this.mediaReceiver = mediaReceiver;
  		rtpSocket = new RtpSocket(socket);
  		this.codec = codec;
-		converterThread = new ConverterThread();
+		converterThread = new ConverterThread(sipTransport);
  	}

  	@Override
@@ -57,9 +57,9 @@
  		private boolean running;
  		private SIPVideoConverter converter;

-		public ConverterThread() {
+		public ConverterThread(SIPTransport sipTransport) {
  			packetQueue = new ConcurrentLinkedQueue<RtpPacket>();
-			converter = new SIPVideoConverter();
+			converter = new SIPVideoConverter(sipTransport);
  		}

  		public void addPacket(RtpPacket packet) {
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/RTPStreamVideoSender.java	 
Tue Mar  5 01:52:05 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/RTPStreamVideoSender.java	 
Wed Mar 13 05:31:08 2013
@@ -14,10 +14,11 @@

  	private static Logger log =  
LoggerFactory.getLogger(RTPStreamVideoSender.class);
  	private SIPCodec codec;
+	private SIPTransport sipTransport;
  	private RtpSocket rtpSocket;
  	private int seqn = 0;

-	public RTPStreamVideoSender(IMediaReceiver mediaReceiver, SIPCodec codec,
+	public RTPStreamVideoSender(SIPTransport sipTransport, IMediaReceiver  
mediaReceiver, SIPCodec codec,
  			DatagramSocket srcSocket, String destAddr, int destPort) {
  		this.codec = codec;
  		mediaReceiver.setVideoSender(this);
@@ -31,7 +32,7 @@

  	@Override
  	public IMediaStream createStream(int streamId) {
-		return new RTPVideoStream(this, codec);
+		return new RTPVideoStream(sipTransport, this, codec);
  	}

  	@Override
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/RTPVideoStream.java	Tue  
Mar  5 01:52:05 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/RTPVideoStream.java	Wed Mar  
13 05:31:08 2013
@@ -10,10 +10,10 @@
  	private SIPVideoConverter converter;
  	private SIPCodec codec;

-	public RTPVideoStream(RTPStreamVideoSender sender, SIPCodec codec) {
+	public RTPVideoStream(SIPTransport sipTransport, RTPStreamVideoSender  
sender, SIPCodec codec) {
  		this.sender = sender;
  		this.codec = codec;
-		converter = new SIPVideoConverter();
+		converter = new SIPVideoConverter(sipTransport);
  	}

  	@Override
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/SIPTransport.java	Tue Mar   
5 01:52:05 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/SIPTransport.java	Wed Mar  
13 05:31:08 2013
@@ -4,6 +4,9 @@
  import org.slf4j.LoggerFactory;
  import org.zoolu.net.SocketAddress;
  import org.zoolu.sip.address.NameAddress;
+import org.zoolu.sip.message.Message;
+import org.zoolu.sip.message.MessageFactory;
+import org.zoolu.sip.message.SipMethods;
  import org.zoolu.sip.provider.SipProvider;
  import org.zoolu.sip.provider.SipStack;

@@ -11,8 +14,8 @@
  	protected static Logger log = LoggerFactory.getLogger(SIPTransport.class);

  	protected RTMPRoomClient roomClient;
-	private SipProvider sip_provider;
-	private SIPUserAgentProfile user_profile;
+	private SipProvider sipProvider;
+	private SIPUserAgentProfile userProfile;
  	private String opt_outbound_proxy = null;
  	private SIPUserAgent ua;
  	private SIPRegisterAgent ra;
@@ -51,27 +54,27 @@
  			SipStack.debug_level = 0;
  			SipStack.log_path = "log";

-			sip_provider = new SipProvider(null, sipPort);
-			sip_provider.setOutboundProxy(new SocketAddress(opt_outbound_proxy));
+			sipProvider = new SipProvider(null, sipPort);
+			sipProvider.setOutboundProxy(new SocketAddress(opt_outbound_proxy));

-			user_profile = new SIPUserAgentProfile();
-			user_profile.audioPort = rtpAudioPort;
-			user_profile.videoPort = rtpVideoPort;
-			user_profile.username = username;
-			user_profile.passwd = password;
-			user_profile.realm = realm;
-			user_profile.fromUrl = fromURL;
-			user_profile.contactUrl = "sip:" + phone + "@" +  
sip_provider.getViaAddress();
+			userProfile = new SIPUserAgentProfile();
+			userProfile.audioPort = rtpAudioPort;
+			userProfile.videoPort = rtpVideoPort;
+			userProfile.username = username;
+			userProfile.passwd = password;
+			userProfile.realm = realm;
+			userProfile.fromUrl = fromURL;
+			userProfile.contactUrl = "sip:" + phone + "@" +  
sipProvider.getViaAddress();

-			if (sip_provider.getPort() != SipStack.default_port) {
-				user_profile.contactUrl += ":" + sip_provider.getPort();
+			if (sipProvider.getPort() != SipStack.default_port) {
+				userProfile.contactUrl += ":" + sipProvider.getPort();
  			}

-			user_profile.keepaliveTime = 8000;
-			user_profile.acceptTime = 0;
-			user_profile.hangupTime = 20;
+			userProfile.keepaliveTime = 8000;
+			userProfile.acceptTime = 0;
+			userProfile.hangupTime = 20;

-			ua = new SIPUserAgent(sip_provider, user_profile, this, roomClient);
+			ua = new SIPUserAgent(sipProvider, userProfile, this, roomClient);

  			ua.listen();

@@ -84,7 +87,7 @@
  		p("Calling " + destination);

  		try {
-			roomClient.init();
+			roomClient.init(destination);

  			ua.setMedia(roomClient);
  			ua.hangup();
@@ -109,10 +112,10 @@

  		try {

-			if (sip_provider != null) {
-				ra = new SIPRegisterAgent(sip_provider, user_profile.fromUrl,  
user_profile.contactUrl, username,
-						user_profile.realm, password, this);
-				loopRegister(user_profile.expires, user_profile.expires / 2,  
user_profile.keepaliveTime);
+			if (sipProvider != null) {
+				ra = new SIPRegisterAgent(sipProvider, userProfile.fromUrl,  
userProfile.contactUrl, username,
+						userProfile.realm, password, this);
+				loopRegister(userProfile.expires, userProfile.expires / 2,  
userProfile.keepaliveTime);
  			}

  		} catch (Exception e) {
@@ -131,7 +134,7 @@

  		try {
  			p("provider.halt");
-			sip_provider.halt();
+			sipProvider.halt();
  		} catch (Exception e) {
  			p("close: Exception:>\n" + e);
  		}
@@ -244,4 +247,18 @@
  		this.number = number;
  		this.call(number);
  	}
+
+	public void requestFIR() {
+		log.debug("requesting FIR...");
+		Message msg = MessageFactory.createRequest(
+			sipProvider
+			, SipMethods.INFO
+			, sipProvider.completeNameAddress(roomClient.getDestination())
+			, sipProvider.completeNameAddress(userProfile.fromUrl)
+			, ""); // no way to pass content-type, will set empty message for now
+		msg.setBody("application/media_control+xml"
+			, "<?xml version=\"1.0\"  
encoding=\"utf-8\" ?><media_control><vc_primitive><to_encoder>" +
+				 
	"<picture_fast_update></picture_fast_update></to_encoder></vc_primitive></media_control>");
+		sipProvider.sendMessage(msg);
+	}
  }
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/SIPUserAgent.java	Tue Mar   
5 01:52:05 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/SIPUserAgent.java	Wed Mar  
13 05:31:08 2013
@@ -409,14 +409,6 @@

  		printLog("launchMediaApplication", "remoteAudioPort = " +  
remoteAudioPort + ", remoteVideoPort = "
  				+ remoteVideoPort + ".");
-
-		// Select the media direction (send_only, recv_ony, fullduplex).
-		int dir = 0;
-		if (userProfile.recvOnly) {
-			dir = -1;
-		} else if (userProfile.sendOnly) {
-			dir = 1;
-		}

  		printLog("launchMediaApplication", "user_profile.audio = " +  
userProfile.audio + ", user_profile.video = "
  				+ userProfile.video + ", audio_app = " + audioApp + ", video_app = " +  
videoApp + ".");
@@ -442,7 +434,7 @@
  		if (userProfile.video && localVideoPort != 0 && remoteVideoPort != 0) {
  			if (videoApp == null) {
          		if (sipVideoCodec != null) {
-        			videoApp = new SIPVideoLauncher(localVideoPort,  
remoteMediaAddress, remoteAudioPort, mediaReceiver, sipVideoCodec);
+        			videoApp = new SIPVideoLauncher(localVideoPort,  
remoteMediaAddress, remoteAudioPort, (SIPTransport)listener, mediaReceiver,  
sipVideoCodec);
          		} else {
          			printLog( "launchMediaApplication", "SipCodec for video not  
initialized." );
          		}
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/SIPVideoConverter.java	Tue  
Mar  5 21:44:18 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/SIPVideoConverter.java	Wed  
Mar 13 05:31:08 2013
@@ -4,12 +4,12 @@
  import java.util.Arrays;
  import java.util.List;

+import local.net.RtpPacket;
+
  import org.red5.codecs.SIPCodec;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;

-import local.net.RtpPacket;
-
  public class SIPVideoConverter {

  	private static final Logger log =  
LoggerFactory.getLogger(SIPVideoConverter.class);
@@ -23,13 +23,15 @@
  	private long startTm;
  	private long startRelativeTime;
  	private List<RtpPacketWrapper> packetsQueue;
+	private SIPTransport sipTransport;

  	// rtmp => rtp
  	private int lenSize;
  	private boolean spsSent = false;
  	private boolean ppsSent = false;

-	public SIPVideoConverter() {
+	public SIPVideoConverter(SIPTransport sipTransport) {
+		this.sipTransport = sipTransport;
  		resetConverter();
  		startRelativeTime = System.currentTimeMillis();
  	}
@@ -359,6 +361,7 @@

  	protected void requestFIR() {
  		log.debug("requesting FIR...");
+		sipTransport.requestFIR();
  	}

  	public static class RTMPPacketInfo {
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/SIPVideoLauncher.java	Tue  
Mar  5 01:52:05 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/SIPVideoLauncher.java	Wed  
Mar 13 05:31:08 2013
@@ -15,11 +15,11 @@
  	protected RTPStreamVideoReceiver receiver;
  	protected RTPStreamVideoSender sender;

-	public SIPVideoLauncher(int localPort, String remoteAddr, int remotePort,  
IMediaReceiver mediaReceiver, SIPCodec codec) {
+	public SIPVideoLauncher(int localPort, String remoteAddr, int remotePort,  
SIPTransport sipTransport, IMediaReceiver mediaReceiver, SIPCodec codec) {
  		try {
  			socket = new DatagramSocket(localPort);
-			receiver = new RTPStreamVideoReceiver(mediaReceiver, socket, codec);
-			sender = new RTPStreamVideoSender(mediaReceiver, codec, socket,  
remoteAddr, remotePort);
+			receiver = new RTPStreamVideoReceiver(sipTransport, mediaReceiver,  
socket, codec);
+			sender = new RTPStreamVideoSender(sipTransport, mediaReceiver, codec,  
socket, remoteAddr, remotePort);
  		} catch (Exception e) {
  			log.error("", e);
  		}