From 7cc03d7b2e56d1c3d12b4ba742cf341aa5685671 Mon Sep 17 00:00:00 2001
From: Boris Grozev <boris@jitsi.org>
Date: Thu, 8 Aug 2013 18:32:09 +0300
Subject: [PATCH] Allows to freely change the direction of a MediaStream
 without a device, by assuming a default device direction of SENDRECV.

---
 .../jitsi/impl/neomedia/MediaStreamImpl.java  | 33 ++++++++++++-------
 .../neomedia/device/MediaDeviceSession.java   |  7 +++-
 2 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
index f3b7223c..a9c8ded7 100644
--- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
+++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
@@ -641,7 +641,10 @@ private void createSendStreams()
     {
         StreamRTPManager rtpManager = getRTPManager();
         MediaDeviceSession deviceSession = getDeviceSession();
-        DataSource dataSource = deviceSession.getOutputDataSource();
+        DataSource dataSource
+                = deviceSession == null
+                ? null
+                : deviceSession.getOutputDataSource();
         int streamCount;
 
         if (dataSource instanceof PushBufferDataSource)
@@ -974,15 +977,17 @@ private void doSetTarget(MediaStreamTarget target)
      */
     public AbstractMediaDevice getDevice()
     {
-        return getDeviceSession().getDevice();
+        MediaDeviceSession deviceSession = getDeviceSession();
+
+        return (deviceSession == null) ? null : deviceSession.getDevice();
     }
 
     /**
-     * Gets the <tt>MediaDirection</tt> of the <tt>device</tt> of this instance
-     * if any or {@link MediaDirection#INACTIVE}.
+     * Gets the <tt>MediaDirection</tt> of the <tt>device</tt> of this instance.
+     * In case there is no device, {@link MediaDirection#SENDRECV} is assumed.
      *
      * @return the <tt>MediaDirection</tt> of the <tt>device</tt> of this
-     * instance if any or <tt>MediaDirection.INACTIVE</tt>
+     * instance if any or <tt>MediaDirection.SENDRECV</tt>
      */
     private MediaDirection getDeviceDirection()
     {
@@ -990,7 +995,7 @@ private MediaDirection getDeviceDirection()
 
         return
             (deviceSession == null)
-                ? MediaDirection.INACTIVE
+                ? MediaDirection.SENDRECV
                 : deviceSession.getDevice().getDirection();
     }
 
@@ -1897,6 +1902,8 @@ private void start(MediaDirection direction)
          */
         boolean getRTPManagerForRTPTranslator = true;
 
+        MediaDeviceSession deviceSession = getDeviceSession();
+
         if (direction.allowsSending()
                 && ((startedDirection == null)
                         || !startedDirection.allowsSending()))
@@ -1909,7 +1916,8 @@ private void start(MediaDirection direction)
 
             startSendStreams();
 
-            getDeviceSession().start(MediaDirection.SENDONLY);
+            if (deviceSession != null)
+                deviceSession.start(MediaDirection.SENDONLY);
 
             if (MediaDirection.RECVONLY.equals(startedDirection))
                 startedDirection = MediaDirection.SENDRECV;
@@ -1950,7 +1958,8 @@ else if (startedDirection == null)
 
             startReceiveStreams();
 
-            getDeviceSession().start(MediaDirection.RECVONLY);
+            if (deviceSession != null)
+                deviceSession.start(MediaDirection.RECVONLY);
 
             if (MediaDirection.SENDONLY.equals(startedDirection))
                 startedDirection = MediaDirection.SENDRECV;
@@ -2542,11 +2551,13 @@ public void update(RemoteEvent remoteEvent)
             if ((feedback != null)
                     && (getDirection() != MediaDirection.INACTIVE))
             {
-                Set<PacketLossAwareEncoder> plaes
-                    = deviceSession.getEncoderControls(
+                Set<PacketLossAwareEncoder> plaes = null;
+                MediaDeviceSession deviceSession= getDeviceSession();
+                if (deviceSession != null)
+                    plaes = deviceSession.getEncoderControls(
                             PacketLossAwareEncoder.class);
 
-                if (!plaes.isEmpty())
+                if (plaes != null && !plaes.isEmpty())
                 {
                     int expectedPacketLoss
                         = (feedback.getFractionLost() * 100) / 256;
diff --git a/src/org/jitsi/impl/neomedia/device/MediaDeviceSession.java b/src/org/jitsi/impl/neomedia/device/MediaDeviceSession.java
index 8edf7c74..d24f1f9b 100644
--- a/src/org/jitsi/impl/neomedia/device/MediaDeviceSession.java
+++ b/src/org/jitsi/impl/neomedia/device/MediaDeviceSession.java
@@ -1389,7 +1389,12 @@ else if (ev instanceof RealizeCompleteEvent)
                             FormatParametersAwareCodec.class,
                             processor))
             {
-                fpac.setFormatParameters(format.getFormatParameters());
+                Map<String, String> formatParameters
+                        = format == null
+                        ? null
+                        : format.getFormatParameters();
+                if (formatParameters != null)
+                    fpac.setFormatParameters(formatParameters);
             }
         }
     }
-- 
GitLab