From 5e4d611669b26634f8604d19fa4c562839a879af Mon Sep 17 00:00:00 2001
From: Boris Grozev <boris@jitsi.org>
Date: Fri, 21 Sep 2012 13:07:05 +0000
Subject: [PATCH] Changes the EncodingConfiguration instance stored in
 MediaServiceImpl to one which contains global settings. Changes the names of
 some methods in EncodingConfiguration and MediaService to make their meaning
 more clear. Adds storeProperties() methods to EncodingConfiguration, makes
 EncodingsPanel use them.

---
 .../jitsi/impl/neomedia/MediaServiceImpl.java |  32 ++--
 .../codec/EncodingConfigurationImpl.java      |  31 +---
 .../impl/neomedia/device/MediaDeviceImpl.java |  17 +--
 .../format/MediaFormatFactoryImpl.java        |   7 +-
 .../neomedia/MediaConfigurationService.java   |   9 +-
 .../jitsi/service/neomedia/MediaService.java  |  13 +-
 .../neomedia/codec/EncodingConfiguration.java | 139 ++++++++++++------
 7 files changed, 146 insertions(+), 102 deletions(-)

diff --git a/src/org/jitsi/impl/neomedia/MediaServiceImpl.java b/src/org/jitsi/impl/neomedia/MediaServiceImpl.java
index c692b2ae..1835f133 100644
--- a/src/org/jitsi/impl/neomedia/MediaServiceImpl.java
+++ b/src/org/jitsi/impl/neomedia/MediaServiceImpl.java
@@ -111,6 +111,12 @@ public class MediaServiceImpl
      */
     private static boolean postInitializeOnce;
 
+    /**
+     * The prefix that is used to store configuration for encodings preference.
+     */
+    private static final String ENCODING_CONFIG_PROP_PREFIX
+        = "net.java.sip.communicator.impl.neomedia.codec.EncodingConfiguration";
+
     /**
      * The <tt>CaptureDevice</tt> user choices such as the default audio and
      * video capture devices.
@@ -141,11 +147,10 @@ public void propertyChange(PropertyChangeEvent event)
         = new ArrayList<MediaDeviceImpl>();
 
     /**
-     * The format-related user choices such as the enabled and disabled codecs
-     * and the order of their preference.
+     * The {@link EncodingConfiguration} instance that holds the current (global)
+     * list of formats and their preference.
      */
-    private final EncodingConfiguration encodingConfiguration
-        = new EncodingConfigurationImpl();
+    private final EncodingConfiguration currentEncodingConfiguration;
 
     /**
      * The <tt>MediaFormatFactory</tt> through which <tt>MediaFormat</tt>
@@ -235,6 +240,10 @@ public MediaServiceImpl()
                 postInitializeOnce(this);
             }
         }
+
+        currentEncodingConfiguration = new EncodingConfigurationImpl();
+        currentEncodingConfiguration.loadFormatPreferencesFromConfig(
+                ENCODING_CONFIG_PROP_PREFIX);
     }
 
     /**
@@ -581,15 +590,16 @@ public List<MediaDevice> getDevices(
     }
 
     /**
-     * Gets the format-related user choices such as the enabled and disabled
-     * codecs and the order of their preference.
+     * Returns the current encoding configuration -- the instance that contains
+     * the global settings. Note that any changes made to this instance will
+     * have immediate effect on the configuration.
      *
-     * @return the format-related user choices such as the enabled and disabled
-     * codecs and the order of their preference
+     * @return the current encoding configuration -- the instance that contains
+     * the global settings.
      */
-    public EncodingConfiguration getEncodingConfiguration()
+    public EncodingConfiguration getCurrentEncodingConfiguration()
     {
-        return encodingConfiguration;
+        return currentEncodingConfiguration;
     }
 
     /**
@@ -1514,7 +1524,7 @@ private static void setupFMJ()
      *
      * @return a new {@link EncodingConfiguration} instance.
      */
-    public EncodingConfiguration getNewEncodingConfiguration()
+    public EncodingConfiguration createEmptyEncodingConfiguration()
     {
         return new EncodingConfigurationImpl();
     }
diff --git a/src/org/jitsi/impl/neomedia/codec/EncodingConfigurationImpl.java b/src/org/jitsi/impl/neomedia/codec/EncodingConfigurationImpl.java
index 358875d4..071b8896 100644
--- a/src/org/jitsi/impl/neomedia/codec/EncodingConfigurationImpl.java
+++ b/src/org/jitsi/impl/neomedia/codec/EncodingConfigurationImpl.java
@@ -13,15 +13,12 @@
 
 import org.jitsi.impl.neomedia.*;
 import org.jitsi.impl.neomedia.format.*;
-import org.jitsi.service.configuration.*;
 import org.jitsi.service.libjitsi.*;
-import org.jitsi.service.neomedia.*;
 import org.jitsi.service.neomedia.codec.*;
 import org.jitsi.service.neomedia.format.*;
-import org.jitsi.util.*;
 
 /**
- * Simple configuration of encoding priorities.
+ * Configuration of encoding priorities.
  *
  * @author Damian Minkov
  * @author Lyubomir Marinov
@@ -29,12 +26,6 @@
  */
 public class EncodingConfigurationImpl extends EncodingConfiguration
 {
-    /**
-     * The SDP preference property.
-     */
-    private static final String PROP_SDP_PREFERENCE
-        = "net.java.sip.communicator.impl.neomedia.codec.EncodingConfiguration";
-
     /**
      * The indicator which determines whether the G.729 codec is enabled.
      *
@@ -89,12 +80,12 @@ public class EncodingConfigurationImpl extends EncodingConfiguration
             "org.jitsi.impl.neomedia.codec.video.h264.Packetizer",
             "org.jitsi.impl.neomedia.codec.video.SwScaler"
         };
-    
+
     /**
      * Whether custom codecs have been registered with JFM
      */
     private static boolean codecsRegistered = false;
-    
+
     /**
      * Whether custom packages have been registered with JFM
      */
@@ -111,7 +102,7 @@ public class EncodingConfigurationImpl extends EncodingConfiguration
                     "net.java.sip.communicator.impl.neomedia.jmfext",
                     "net.sf.fmj"
                 };
-    
+
     /**
      * Constructor. Loads the hard-coded default preferences and registers
      * packages and codecs with JMF.
@@ -119,7 +110,7 @@ public class EncodingConfigurationImpl extends EncodingConfiguration
     public EncodingConfigurationImpl()
     {
         initializeFormatPreferences();
-        
+
         registerCustomPackages();
         registerCustomCodecs();
     }
@@ -202,8 +193,9 @@ public void setPriority(MediaFormat encoding, int priority,
             String encodingEncoding = encoding.getEncoding();
 
             // save the settings
+            //TODO: remove the whole method
             LibJitsi.getConfigurationService().setProperty(
-                    PROP_SDP_PREFERENCE
+                    "net.java.sip.communicator.impl.neomedia.codec.EncodingConfiguration"
                         + "."
                         + getEncodingPreferenceKey(encoding),
                     priority);
@@ -426,12 +418,5 @@ private void registerCustomPackages()
         
         packagesRegistered = true;
     }
-    
-    /**
-     * Loads the "global" preferences.
-     */
-    public void loadConfig()
-    {
-        loadFormatPreferencesFromConfig(PROP_SDP_PREFERENCE);
-    }
+
 }
diff --git a/src/org/jitsi/impl/neomedia/device/MediaDeviceImpl.java b/src/org/jitsi/impl/neomedia/device/MediaDeviceImpl.java
index b5a24b4b..f76813eb 100644
--- a/src/org/jitsi/impl/neomedia/device/MediaDeviceImpl.java
+++ b/src/org/jitsi/impl/neomedia/device/MediaDeviceImpl.java
@@ -16,7 +16,6 @@
 import javax.media.protocol.*;
 
 import org.jitsi.impl.neomedia.*;
-import org.jitsi.impl.neomedia.codec.*;
 import org.jitsi.impl.neomedia.format.*;
 import org.jitsi.impl.neomedia.jmfext.media.protocol.*;
 import org.jitsi.impl.neomedia.protocol.*;
@@ -332,8 +331,8 @@ public MediaType getMediaType()
 
     /**
      * Gets the list of <tt>MediaFormat</tt>s supported by this
-     * <tt>MediaDevice</tt>. Uses the <tt>EncodingConfiguration</tt> from the
-     * media service, which contains all known encodings.
+     * <tt>MediaDevice</tt>. Uses the current <tt>EncodingConfiguration</tt>
+     * from the media service (i.e. the global configuration).
      *
      * @param sendPreset the preset used to set some of the format parameters,
      * used for video and settings.
@@ -348,7 +347,7 @@ public List<MediaFormat> getSupportedFormats(
     {
         return getSupportedFormats(sendPreset, receivePreset,
                 NeomediaServiceUtils.getMediaServiceImpl()
-                    .getEncodingConfiguration());
+                    .getCurrentEncodingConfiguration());
     }
     
     /**
@@ -366,7 +365,7 @@ public List<MediaFormat> getSupportedFormats(
     {
             return getSupportedFormats(null, null, encodingConfiguration);
     }
-    
+
     /**
      * Gets the list of <tt>MediaFormat</tt>s supported by this
      * <tt>MediaDevice</tt> and enabled in <tt>encodingConfiguration</tt>.
@@ -388,14 +387,14 @@ public List<MediaFormat> getSupportedFormats(
     {
         MediaServiceImpl mediaServiceImpl
             = NeomediaServiceUtils.getMediaServiceImpl();
-        MediaFormat[] supportedEncodings
-            = encodingConfiguration.getSupportedEncodings(getMediaType());
+        MediaFormat[] enabledEncodings
+            = encodingConfiguration.getEnabledEncodings(getMediaType());
         List<MediaFormat> supportedFormats = new ArrayList<MediaFormat>();
 
         // If there is preset, check and set the format attributes where needed.
-        if (supportedEncodings != null)
+        if (enabledEncodings != null)
         {
-            for (MediaFormat f : supportedEncodings)
+            for (MediaFormat f : enabledEncodings)
             {
                 if("h264".equalsIgnoreCase(f.getEncoding()))
                 {
diff --git a/src/org/jitsi/impl/neomedia/format/MediaFormatFactoryImpl.java b/src/org/jitsi/impl/neomedia/format/MediaFormatFactoryImpl.java
index 4923402e..f9d93d23 100644
--- a/src/org/jitsi/impl/neomedia/format/MediaFormatFactoryImpl.java
+++ b/src/org/jitsi/impl/neomedia/format/MediaFormatFactoryImpl.java
@@ -12,7 +12,6 @@
 import javax.media.format.*;
 
 import org.jitsi.impl.neomedia.*;
-import org.jitsi.impl.neomedia.codec.*;
 import org.jitsi.service.neomedia.*;
 import org.jitsi.service.neomedia.codec.*;
 import org.jitsi.service.neomedia.format.*;
@@ -469,10 +468,10 @@ private List<MediaFormat> getSupportedMediaFormats(
     {
         EncodingConfiguration encodingConfiguration
             = NeomediaServiceUtils.getMediaServiceImpl()
-                    .getEncodingConfiguration();
+                    .getCurrentEncodingConfiguration();
         List<MediaFormat> supportedMediaFormats
             = getMatchingMediaFormats(
-                encodingConfiguration.getAvailableEncodings(
+                encodingConfiguration.getAllEncodings(
                         MediaType.AUDIO),
                 encoding,
                 clockRate);
@@ -480,7 +479,7 @@ private List<MediaFormat> getSupportedMediaFormats(
         if (supportedMediaFormats.isEmpty())
             supportedMediaFormats
                 = getMatchingMediaFormats(
-                    encodingConfiguration.getAvailableEncodings(
+                    encodingConfiguration.getAllEncodings(
                             MediaType.VIDEO),
                     encoding,
                     clockRate);
diff --git a/src/org/jitsi/service/neomedia/MediaConfigurationService.java b/src/org/jitsi/service/neomedia/MediaConfigurationService.java
index ba6dfc56..112964f5 100644
--- a/src/org/jitsi/service/neomedia/MediaConfigurationService.java
+++ b/src/org/jitsi/service/neomedia/MediaConfigurationService.java
@@ -46,10 +46,11 @@ public interface MediaConfigurationService
     public Component createEncodingControls(MediaType mediaType,
             EncodingConfiguration encodingConfiguration,
             boolean autoUpdateConfig);
-    
+
     /**
-     * Returns a new <tt>EncodingConfiguration</tt> instance
-     * @return a new <tt>EncodingConfiguration</tt> instance
+     * Returns the <tt>MediaService</tt> instance
+     *
+     * @return the <tt>MediaService</tt> instance
      */
-    public EncodingConfiguration getNewEncodingConfiguration();
+    public MediaService getMediaService();
 }
diff --git a/src/org/jitsi/service/neomedia/MediaService.java b/src/org/jitsi/service/neomedia/MediaService.java
index 72aa01e8..d9977543 100644
--- a/src/org/jitsi/service/neomedia/MediaService.java
+++ b/src/org/jitsi/service/neomedia/MediaService.java
@@ -318,9 +318,18 @@ public java.awt.Point getOriginForDesktopStreamingDevice(
      * notified about changes in the values of the properties of this instance
      */
     public void removePropertyChangeListener(PropertyChangeListener listener);
-    
+
     /**
      * Returns a new <tt>EncodingConfiguration</tt> instance.
+     *
+     * @return a new <tt>EncodingConfiguration</tt> instance.
+     */
+    public EncodingConfiguration createEmptyEncodingConfiguration();
+
+    /**
+     * Returns the current <tt>EncodingConfiguration</tt> instance.
+     *
+     * @return the current <tt>EncodingConfiguration</tt> instance.
      */
-    public EncodingConfiguration getNewEncodingConfiguration();
+    public EncodingConfiguration getCurrentEncodingConfiguration();
 }
diff --git a/src/org/jitsi/service/neomedia/codec/EncodingConfiguration.java b/src/org/jitsi/service/neomedia/codec/EncodingConfiguration.java
index bf8fa705..38e71960 100644
--- a/src/org/jitsi/service/neomedia/codec/EncodingConfiguration.java
+++ b/src/org/jitsi/service/neomedia/codec/EncodingConfiguration.java
@@ -33,7 +33,7 @@ public abstract class EncodingConfiguration
 
     /**
      * The <tt>Comparator</tt> which sorts the sets according to the settings in
-     * encodingPreferences.
+     * <tt>encodingPreferences</tt>.
      */
     private final Comparator<MediaFormat> encodingComparator
         = new Comparator<MediaFormat>()
@@ -95,7 +95,7 @@ private Set<MediaFormat> updateSupportedEncodings(MediaType type)
         Set<MediaFormat> enabled
             = new TreeSet<MediaFormat>(encodingComparator);
 
-        for (MediaFormat format : getAvailableEncodings(type))
+        for (MediaFormat format : getAllEncodings(type))
         {
             if (getPriority(format) > 0)
             {
@@ -168,7 +168,8 @@ public void setPriority(MediaFormat encoding, int priority)
 
         updateSupportedEncodings();
     }
-    
+
+    //TODO: remove
     /**
      * Sets <tt>priority</tt> as the preference associated with
      * <tt>encoding</tt> (with a call to <tt>setPriority(MediaFormat, int)</tt>
@@ -204,28 +205,31 @@ public int getPriority(MediaFormat encoding)
 
     
     /**
-     * Get the available encodings for a specific <tt>MediaType</tt>.
+     * Returns all the available encodings for a specific <tt>MediaType</tt>.
+     * This includes disabled ones (ones with priority 0).
      *
-     * @param type the <tt>MediaType</tt> we would like to know its available
-     * encodings
+     * @param type the <tt>MediaType</tt> we would like to know the available
+     * encodings of
      * @return array of <tt>MediaFormat</tt> supported for the
      * <tt>MediaType</tt>
      */
-    public MediaFormat[] getAvailableEncodings(MediaType type)
+    public MediaFormat[] getAllEncodings(MediaType type)
     {
         return MediaUtils.getMediaFormats(type);
     }
 
     /**
-     * Gets the supported <tt>MediaFormat</tt>s i.e. the enabled available
-     * <tt>MediaFormat</tt>s sorted in decreasing priority.
+     * Returns the supported <tt>MediaFormat</tt>s i.e. the enabled available
+     * <tt>MediaFormat</tt>s, sorted in decreasing priority. Returns only the
+     * formats of type <tt>type</tt>.
      *
      * @param type the <tt>MediaType</tt> of the supported <tt>MediaFormat</tt>s
      * to get
      * @return an array of the supported <tt>MediaFormat</tt>s i.e. the enabled
-     * available <tt>MediaFormat</tt>s sorted in decreasing priority
+     * available <tt>MediaFormat</tt>s sorted in decreasing priority. Returns
+     * only the formats of type <tt>type</tt>.
      */
-    public MediaFormat[] getSupportedEncodings(MediaType type)
+    public MediaFormat[] getEnabledEncodings(MediaType type)
     {
         Set<MediaFormat> supportedEncodings;
 
@@ -335,12 +339,7 @@ protected String getEncodingPreferenceKey(MediaFormat encoding)
     {
         return encoding.getEncoding() + "/" + encoding.getClockRateString();
     }
-    
-    /**
-     * Loads configuration.
-     */
-    public abstract void loadConfig();
-    
+
     /**
      * Parses the properties under <tt>prefix</tt> and loads them.
      * 
@@ -349,9 +348,8 @@ protected String getEncodingPreferenceKey(MediaFormat encoding)
     public void loadFormatPreferencesFromConfig(String prefix)
     {
         ConfigurationService cfg = LibJitsi.getConfigurationService();
-        
         Map<String, String> properties = new HashMap<String, String>();
-        
+
         if (cfg != null)
         {
             for (String pName : cfg.getPropertyNamesByPrefix(prefix, false))
@@ -362,23 +360,77 @@ public void loadFormatPreferencesFromConfig(String prefix)
             loadProperties(properties);
         }
     }
-        
+
+    /**
+     * Stores the format preferences in this instance in the given <tt>Map</tt>,
+     * using <tt>prefix</tt> as a prefix to the key.
+     * Entries in the format (prefix+formatName, formatPriority) will be added
+     * to <tt>properties</tt>, one for each available format.
+     * Note that a "." is not automatically added to <tt>prefix</tt>.
+     *
+     * @param properties The <tt>Map</tt> where entries will be added.
+     * @param prefix The prefix to use.
+     */
+    public void storeProperties(Map<String, String> properties, String prefix)
+    {
+        for(MediaType mediaType : MediaType.values())
+        {
+            for(MediaFormat mediaFormat: getAllEncodings(mediaType))
+            {
+                properties.put(prefix+getEncodingPreferenceKey(mediaFormat),
+                                "" + getPriority(mediaFormat));
+            }
+        }
+    }
+
+    /**
+     * Stores the format preferecens in this instance in the given <tt>Map</tt>.
+     * Entries in the format (formatName, formatPriority) will be added
+     * to <tt>properties</tt>, one for each available format.
+     *
+     * @param properties The <tt>Map</tt> where entries will be added.
+     */
+    public void storeProperties(Map<String,String> properties)
+    {
+        storeProperties(properties, "");
+    }
+
+    /**
+     * Parses a <tt>Map<String, String></tt> and updates the format preferences
+     * according to it. Does not use a prefix.
+     *
+     * @param properties The <tt>Map</tt> to parse.
+     *
+     * @see EncodingConfiguration#loadProperties(java.util.Map, String)
+     */
+    public void loadProperties(Map<String, String> properties)
+    {
+        loadProperties(properties, "");
+    }
     
    /**
     * Parses a <tt>Map<String, String></tt> and updates the format preferences
-    * according to it.
-    * The map is expected to have entries in the form of
-    * (formatString, preference).
+    * according to it. For each entry, if it's key does not begin with
+    * <tt>prefix</tt>, its ignored. If the key begins with <tt>prefix</tt>,
+    * look for an encoding name after the last ".", and interpret the key
+    * value as preference.
+    *
     * @param properties The <tt>Map</tt> to parse.
+    * @param prefix The prefix to use.
     */
-    public void loadProperties(Map<String, String> properties)
+    public void loadProperties(Map<String, String> properties, String prefix)
     {
-
-            for (String pName
-                    : properties.keySet())
+            for(Map.Entry<String, String> entry : properties.entrySet())
             {
-                String prefStr = properties.get(pName);
+                String pName = entry.getKey();
+                String prefStr = entry.getValue();
                 String fmtName;
+
+                if(!pName.startsWith(prefix))
+                {
+                    continue;
+                }
+
                 if(pName.contains("."))
                 {
                     fmtName = pName.substring(pName.lastIndexOf('.') + 1);
@@ -387,7 +439,7 @@ public void loadProperties(Map<String, String> properties)
                 {
                     fmtName = pName;
                 }
-                
+
                 // legacy
                 if (fmtName.contains("sdp"))
                 {
@@ -445,28 +497,17 @@ public void loadProperties(Map<String, String> properties)
         // preference.
         updateSupportedEncodings();
     }
-    
-    
+
     /**
-     * Returns a <tt>Map<String, String></tt> that holds the properties
-     * corresponding to the current format preferences
-     * @return A <tt>Map<String, String></tt> that holds the properties
-     * corresponding to the current format preferences.
+     * Load the preferences stored in <tt>encodingConfiguration</tt>
+     *
+     * @param encodingConfiguration the <tt>EncodingConfiguration</tt> to load
+     *                              preferences from.
      */
-    public Map<String, String> getEncodingProperties()
+    public void loadEncodingConfiguration(EncodingConfiguration encodingConfiguration)
     {
-        Map<String, String> encodingProperties = new HashMap<String, String>();
-        for(MediaFormat mf : getAvailableEncodings(MediaType.AUDIO))
-        {
-            encodingProperties.put(getEncodingPreferenceKey(mf),
-                                   "" + getPriority(mf));
-        }
-        for(MediaFormat mf : getAvailableEncodings(MediaType.VIDEO))
-        {
-            encodingProperties.put(getEncodingPreferenceKey(mf),
-                                   "" + getPriority(mf));
-        }
-        return encodingProperties;
+        Map<String, String> properties = new HashMap<String, String>();
+        encodingConfiguration.storeProperties(properties);
+        loadProperties(properties);
     }
-    
 }
-- 
GitLab