diff --git a/src/org/jitsi/impl/neomedia/MediaServiceImpl.java b/src/org/jitsi/impl/neomedia/MediaServiceImpl.java index c692b2ae8d2b5171955211cf4a8ed54e1d73d988..1835f133c55480ef110707727e16b8599f4b3c29 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 358875d4ac266da419cb6acbeb9b7a854ede1f8c..071b8896555a8d51a03e580549309efad76363c4 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 b5a24b4b52d19257bb9a19e0e1b7d12a86b4b196..f76813eb8f50e2dcaef5f91ae8902b2a644967e6 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 4923402ea294bc85bc8c1ce2e5a8fd8c8e98139b..f9d93d23e18a45bc9b4668fc34fcabaaed482fe1 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 ba6dfc5633d0492a82900ff2d0464f910ae8b324..112964f5bfcf2c265629dfa47995f25e60cab12c 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 72aa01e85fe6f9f4ae4d8c595683d599ab21b53e..d99775434ae2a44acc2d6d10f61a59a59f079844 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 bf8fa705f739b6cd95bcbe6cbee115bd9f66dd42..38e71960f5377993589dd913632486c2269d258e 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); } - }