Adds user interface to control the H.264 encoder's use of Periodic Intra Refresh and maximum interval between keyframes.

cusax-fix
Lyubomir Marinov 13 years ago
parent c335965f2b
commit 328f9b587c

@ -1418,14 +1418,16 @@ impl.neomedia.configform.AUDIO=Audio
impl.neomedia.configform.VIDEO=Video impl.neomedia.configform.VIDEO=Video
impl.neomedia.configform.H264=H.264 impl.neomedia.configform.H264=H.264
impl.neomedia.configform.H264.defaultIntraRefresh=Periodic Intra Refresh
impl.neomedia.configform.H264.defaultProfile=Default profile to encode into: impl.neomedia.configform.H264.defaultProfile=Default profile to encode into:
impl.neomedia.configform.H264.defaultProfile.baseline=Baseline impl.neomedia.configform.H264.defaultProfile.baseline=Baseline
impl.neomedia.configform.H264.defaultProfile.main=Main
impl.neomedia.configform.H264.defaultProfile.high=High impl.neomedia.configform.H264.defaultProfile.high=High
impl.neomedia.configform.H264.preset=Encoder Preset impl.neomedia.configform.H264.defaultProfile.main=Main
impl.neomedia.configform.H264.keyint=Maximum interval between key frames
impl.neomedia.configform.H264.preferredKeyFrameRequester=Preferred method to request key frames: impl.neomedia.configform.H264.preferredKeyFrameRequester=Preferred method to request key frames:
impl.neomedia.configform.H264.preferredKeyFrameRequester.rtcp=RTCP impl.neomedia.configform.H264.preferredKeyFrameRequester.rtcp=RTCP
impl.neomedia.configform.H264.preferredKeyFrameRequester.signaling=Signaling impl.neomedia.configform.H264.preferredKeyFrameRequester.signaling=Signaling
impl.neomedia.configform.H264.preset=Encoder Preset
# The callrecordingconfig plugin was never really committed into trunk and its # The callrecordingconfig plugin was never really committed into trunk and its
# ConfigurationForm was actually put in the neomedia bundle. # ConfigurationForm was actually put in the neomedia bundle.

@ -10,6 +10,7 @@
import java.awt.event.*; import java.awt.event.*;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.impl.neomedia.*; import net.java.sip.communicator.impl.neomedia.*;
import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.desktoputil.*;
@ -20,9 +21,10 @@
import org.jitsi.service.resources.*; import org.jitsi.service.resources.*;
/** /**
* Implements the H.264 configuration form (panel). * Implements the H.264 configuration form/panel.
* *
* @author Lyubomir Marinov * @author Lyubomir Marinov
* @author Damian Minkov
*/ */
public class ConfigurationPanel public class ConfigurationPanel
extends TransparentPanel extends TransparentPanel
@ -37,114 +39,140 @@ public class ConfigurationPanel
*/ */
public ConfigurationPanel() public ConfigurationPanel()
{ {
/* Create the UI components. */ // Create the UI components.
super(new FlowLayout()); super(new BorderLayout());
TransparentPanel contentPanel TransparentPanel contentPanel
= new TransparentPanel(new GridBagLayout()); = new TransparentPanel(new GridBagLayout());
add(contentPanel); add(contentPanel, BorderLayout.NORTH);
ResourceManagementService resources = NeomediaActivator.getResources(); ResourceManagementService r = NeomediaActivator.getResources();
GridBagConstraints gridBagConstraints = new GridBagConstraints(); GridBagConstraints cnstrnts = new GridBagConstraints();
JLabel defaultProfileLabel cnstrnts.anchor = GridBagConstraints.FIRST_LINE_START;
= new JLabel( cnstrnts.fill = GridBagConstraints.HORIZONTAL;
resources.getI18NString(
Component defaultProfileLabel
= createLineWrapLabel(
r.getI18NString(
"impl.neomedia.configform.H264.defaultProfile")); "impl.neomedia.configform.H264.defaultProfile"));
gridBagConstraints.anchor = GridBagConstraints.LINE_START; cnstrnts.gridx = 0;
gridBagConstraints.gridx = 0; cnstrnts.gridy = 0;
gridBagConstraints.gridy = 0; cnstrnts.weightx = 1;
contentPanel.add(defaultProfileLabel, gridBagConstraints); contentPanel.add(defaultProfileLabel, cnstrnts);
JComboBox defaultProfileComboBox = new JComboBox(); JComboBox defaultProfileComboBox = new JComboBox();
defaultProfileComboBox.setEditable(false); defaultProfileComboBox.setEditable(false);
defaultProfileComboBox.addItem( defaultProfileComboBox.addItem(
new NameValuePair( new NameValuePair(
resources.getI18NString( r.getI18NString(
"impl.neomedia.configform.H264.defaultProfile." "impl.neomedia.configform.H264.defaultProfile."
+ JNIEncoder.BASELINE_PROFILE), + JNIEncoder.BASELINE_PROFILE),
JNIEncoder.BASELINE_PROFILE)); JNIEncoder.BASELINE_PROFILE));
defaultProfileComboBox.addItem( defaultProfileComboBox.addItem(
new NameValuePair( new NameValuePair(
resources.getI18NString( r.getI18NString(
"impl.neomedia.configform.H264.defaultProfile." "impl.neomedia.configform.H264.defaultProfile."
+ JNIEncoder.MAIN_PROFILE), + JNIEncoder.MAIN_PROFILE),
JNIEncoder.MAIN_PROFILE)); JNIEncoder.MAIN_PROFILE));
defaultProfileComboBox.addItem( defaultProfileComboBox.addItem(
new NameValuePair( new NameValuePair(
resources.getI18NString( r.getI18NString(
"impl.neomedia.configform.H264.defaultProfile." "impl.neomedia.configform.H264.defaultProfile."
+ JNIEncoder.HIGH_PROFILE), + JNIEncoder.HIGH_PROFILE),
JNIEncoder.HIGH_PROFILE)); JNIEncoder.HIGH_PROFILE));
gridBagConstraints.anchor = GridBagConstraints.LINE_START; cnstrnts.gridx = 1;
gridBagConstraints.gridx = 1; cnstrnts.gridy = 0;
gridBagConstraints.gridy = 0; cnstrnts.weightx = 0;
contentPanel.add(defaultProfileComboBox, gridBagConstraints); contentPanel.add(defaultProfileComboBox, cnstrnts);
JLabel preferredKeyFrameRequesterLabel Component preferredKeyFrameRequesterLabel
= new JLabel( = createLineWrapLabel(
resources.getI18NString( r.getI18NString(
"impl.neomedia.configform.H264" "impl.neomedia.configform.H264"
+ ".preferredKeyFrameRequester")); + ".preferredKeyFrameRequester"));
gridBagConstraints.anchor = GridBagConstraints.LINE_START; cnstrnts.gridx = 0;
gridBagConstraints.gridx = 0; cnstrnts.gridy = 1;
gridBagConstraints.gridy = 1; cnstrnts.weightx = 1;
contentPanel.add(preferredKeyFrameRequesterLabel, gridBagConstraints); contentPanel.add(preferredKeyFrameRequesterLabel, cnstrnts);
JComboBox preferredKeyFrameRequesterComboBox = new JComboBox(); JComboBox preferredKeyFrameRequesterComboBox = new JComboBox();
preferredKeyFrameRequesterComboBox.setEditable(false); preferredKeyFrameRequesterComboBox.setEditable(false);
preferredKeyFrameRequesterComboBox.addItem( preferredKeyFrameRequesterComboBox.addItem(
new NameValuePair( new NameValuePair(
resources.getI18NString( r.getI18NString(
"impl.neomedia.configform.H264" "impl.neomedia.configform.H264"
+ ".preferredKeyFrameRequester." + ".preferredKeyFrameRequester."
+ KeyFrameControl.KeyFrameRequester.RTCP), + KeyFrameControl.KeyFrameRequester.RTCP),
KeyFrameControl.KeyFrameRequester.RTCP)); KeyFrameControl.KeyFrameRequester.RTCP));
preferredKeyFrameRequesterComboBox.addItem( preferredKeyFrameRequesterComboBox.addItem(
new NameValuePair( new NameValuePair(
resources.getI18NString( r.getI18NString(
"impl.neomedia.configform.H264" "impl.neomedia.configform.H264"
+ ".preferredKeyFrameRequester." + ".preferredKeyFrameRequester."
+ KeyFrameControl.KeyFrameRequester.SIGNALING), + KeyFrameControl.KeyFrameRequester.SIGNALING),
KeyFrameControl.KeyFrameRequester.SIGNALING)); KeyFrameControl.KeyFrameRequester.SIGNALING));
gridBagConstraints.anchor = GridBagConstraints.LINE_START; cnstrnts.gridx = 1;
gridBagConstraints.gridx = 1; cnstrnts.gridy = 1;
gridBagConstraints.gridy = 1; cnstrnts.weightx = 0;
contentPanel.add( contentPanel.add(
preferredKeyFrameRequesterComboBox, preferredKeyFrameRequesterComboBox,
gridBagConstraints); cnstrnts);
JLabel presetLabel Component presetLabel
= new JLabel(resources.getI18NString( = createLineWrapLabel(
"impl.neomedia.configform.H264.preset")); r.getI18NString("impl.neomedia.configform.H264.preset"));
gridBagConstraints.anchor = GridBagConstraints.LINE_START; cnstrnts.gridx = 0;
gridBagConstraints.gridx = 0; cnstrnts.gridy = 2;
gridBagConstraints.gridy = 2; cnstrnts.weightx = 1;
contentPanel.add(presetLabel, gridBagConstraints); contentPanel.add(presetLabel, cnstrnts);
JComboBox presetComboBox = new JComboBox(); JComboBox presetComboBox = new JComboBox();
presetComboBox.setEditable(false); presetComboBox.setEditable(false);
for(String presetSetting : JNIEncoder.AVAILABLE_PRESETS) for (String preset : JNIEncoder.AVAILABLE_PRESETS)
{ presetComboBox.addItem(new NameValuePair(preset, preset));
presetComboBox.addItem( cnstrnts.gridx = 1;
new NameValuePair(presetSetting, presetSetting)); cnstrnts.gridy = 2;
} cnstrnts.weightx = 0;
gridBagConstraints.anchor = GridBagConstraints.LINE_START; contentPanel.add(presetComboBox, cnstrnts);
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
contentPanel.add(
presetComboBox,
gridBagConstraints);
/* JCheckBox defaultIntraRefreshCheckBox
* Load the values from the ConfigurationService into the UI components. = new SIPCommCheckBox(
*/ r.getI18NString(
ConfigurationService configuration "impl.neomedia.configform.H264"
= NeomediaActivator.getConfigurationService(); + ".defaultIntraRefresh"));
cnstrnts.gridwidth = GridBagConstraints.REMAINDER;
cnstrnts.gridx = 0;
cnstrnts.gridy = 3;
cnstrnts.weightx = 1;
contentPanel.add(defaultIntraRefreshCheckBox, cnstrnts);
cnstrnts.gridwidth = 1;
Component keyintLabel
= createLineWrapLabel(
r.getI18NString("impl.neomedia.configform.H264.keyint"));
cnstrnts.gridx = 0;
cnstrnts.gridy = 4;
cnstrnts.weightx = 1;
contentPanel.add(keyintLabel, cnstrnts);
JSpinner keyintSpinner
= new JSpinner(
new SpinnerNumberModel(
JNIEncoder.DEFAULT_KEYINT,
1, JNIEncoder.X264_KEYINT_MAX_INFINITE,
JNIEncoder.DEFAULT_FRAME_RATE));
cnstrnts.gridx = 1;
cnstrnts.gridy = 4;
cnstrnts.weightx = 0;
contentPanel.add(keyintSpinner, cnstrnts);
// Load the values from the ConfigurationService into the UI components.
ConfigurationService cfg = NeomediaActivator.getConfigurationService();
setSelectedNameValuePair( setSelectedNameValuePair(
defaultProfileComboBox, defaultProfileComboBox,
configuration.getString( cfg.getString(
JNIEncoder.DEFAULT_PROFILE_PNAME, JNIEncoder.DEFAULT_PROFILE_PNAME,
JNIEncoder.DEFAULT_DEFAULT_PROFILE)); JNIEncoder.DEFAULT_DEFAULT_PROFILE));
addActionListener( addActionListener(
@ -153,7 +181,7 @@ public ConfigurationPanel()
setSelectedNameValuePair( setSelectedNameValuePair(
preferredKeyFrameRequesterComboBox, preferredKeyFrameRequesterComboBox,
configuration.getString( cfg.getString(
KeyFrameControl.KeyFrameRequester.PREFERRED_PNAME, KeyFrameControl.KeyFrameRequester.PREFERRED_PNAME,
KeyFrameControl.KeyFrameRequester.DEFAULT_PREFERRED)); KeyFrameControl.KeyFrameRequester.DEFAULT_PREFERRED));
addActionListener( addActionListener(
@ -162,9 +190,50 @@ public ConfigurationPanel()
setSelectedNameValuePair( setSelectedNameValuePair(
presetComboBox, presetComboBox,
configuration.getString( cfg.getString(
JNIEncoder.PRESET_PNAME, JNIEncoder.DEFAULT_PRESET)); JNIEncoder.PRESET_PNAME,
JNIEncoder.DEFAULT_PRESET));
addActionListener(presetComboBox, JNIEncoder.PRESET_PNAME); addActionListener(presetComboBox, JNIEncoder.PRESET_PNAME);
defaultIntraRefreshCheckBox.setSelected(
cfg.getBoolean(
JNIEncoder.DEFAULT_INTRA_REFRESH_PNAME,
JNIEncoder.DEFAULT_DEFAULT_INTRA_REFRESH));
defaultIntraRefreshCheckBox.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JCheckBox checkBox = (JCheckBox) e.getSource();
NeomediaActivator
.getConfigurationService()
.setProperty(
JNIEncoder.DEFAULT_INTRA_REFRESH_PNAME,
Boolean.toString(
checkBox.isSelected()));
}
});
keyintSpinner.setValue(
cfg.getInt(JNIEncoder.KEYINT_PNAME, JNIEncoder.DEFAULT_KEYINT));
keyintSpinner.addChangeListener(
new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
JSpinner spinner = (JSpinner) e.getSource();
SpinnerNumberModel model
= (SpinnerNumberModel) spinner.getModel();
int value = model.getNumber().intValue();
NeomediaActivator
.getConfigurationService()
.setProperty(
JNIEncoder.KEYINT_PNAME,
Integer.toString(value));
}
});
} }
/** /**
@ -199,6 +268,28 @@ public void actionPerformed(ActionEvent e)
}); });
} }
/**
* Initializes a new <tt>Component</tt> instance which is to display a
* specific text in the fashion of <tt>JLabel</tt> and with line wrapping.
*
* @param text the text to be displayed by the new instance
* @return a new <tt>Component</tt> instance which displays the specified
* <tt>text</tt> in the fashion of <tt>JLabel</tt> and with line wrapping
*/
private Component createLineWrapLabel(String text)
{
JTextArea textArea = new JTextArea();
textArea.setEditable(false);
textArea.setFocusable(false);
textArea.setLineWrap(true);
textArea.setOpaque(false);
textArea.setText(text);
return textArea;
}
/** /**
* Sets the selected item in a specific <tt>JComboBox</tt> populated with * Sets the selected item in a specific <tt>JComboBox</tt> populated with
* <tt>NameValuePair</tt>s to the one which has a specific <tt>value</tt>. * <tt>NameValuePair</tt>s to the one which has a specific <tt>value</tt>.
@ -209,16 +300,13 @@ public void actionPerformed(ActionEvent e)
*/ */
private void setSelectedNameValuePair(JComboBox comboBox, String value) private void setSelectedNameValuePair(JComboBox comboBox, String value)
{ {
int itemCount = comboBox.getItemCount(); for (int i = 0, count = comboBox.getItemCount(); i < count; i++)
for (int itemIndex = 0; itemIndex < itemCount; itemIndex++)
{ {
NameValuePair nameValuePair NameValuePair nameValuePair = (NameValuePair) comboBox.getItemAt(i);
= (NameValuePair) comboBox.getItemAt(itemIndex);
if (nameValuePair.value.equals(value)) if (nameValuePair.value.equals(value))
{ {
comboBox.setSelectedIndex(itemIndex); comboBox.setSelectedIndex(i);
break; break;
} }
} }

@ -10,7 +10,6 @@
import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.*;
import org.jitsi.service.configuration.*;
import org.jivesoftware.smack.util.*; import org.jivesoftware.smack.util.*;
import org.osgi.framework.*; import org.osgi.framework.*;

@ -15,9 +15,7 @@
import net.java.sip.communicator.plugin.desktoputil.wizard.*; import net.java.sip.communicator.plugin.desktoputil.wizard.*;
import net.java.sip.communicator.service.credentialsstorage.*; import net.java.sip.communicator.service.credentialsstorage.*;
import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.jabber.*; import net.java.sip.communicator.service.protocol.jabber.*;
import org.jitsi.util.*;
/** /**
* The <tt>JabberAccountRegistrationForm</tt>. * The <tt>JabberAccountRegistrationForm</tt>.

Loading…
Cancel
Save