Adds an Opus configuration form and changes the default Opus settings. Updates the Opus JNI binaries. Notifies encoders that implement PacketLossAwareEncoder (Opus and SILK) of packet loss information received via RTCP.

cusax-fix
Boris Grozev 13 years ago
parent f0a2931a2c
commit 1e7e76e755

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -896,10 +896,11 @@ plugin.generalconfig.ACCEPT_PHONE_NUMBER_WITH_ALPHA_CHARS_EXAMPLE=e.g. +1-800-MY
plugin.generalconfig.SIP_CALL_CONFIG=SIP
plugin.generalconfig.OPUS_CONFIG=Opus
plugin.generalconfig.OPUS_AUDIO_BANDWIDTH=Audio bandwidth:
plugin.generalconfig.OPUS_BITRATE=Maximun average bitrate:
plugin.generalconfig.OPUS_BITRATE=Encoder average bitrate (kbps):
plugin.generalconfig.OPUS_USE_DTX=Use DTX:
plugin.generalconfig.OPUS_USE_CBR=Use CBR:
plugin.generalconfig.OPUS_USE_FEC=Use inband FEC:
plugin.generalconfig.OPUS_COMPLEXITY=Encoder complexity:
plugin.generalconfig.OPUS_MIN_EXPECTED_PACKET_LOSS=Minimum expected packet loss(%):
plugin.generalconfig.SILK_CONFIG=Silk
plugin.generalconfig.SILK_USE_FEC=Use inband FEC:
plugin.generalconfig.SILK_ALWAYS_ASSUME_PACKET_LOSS=Always assume packet loss:

@ -154,7 +154,16 @@ public void start(BundleContext bc)
getClass().getClassLoader(),
null,
"plugin.generalconfig.SILK_CONFIG",
52, true),
0, true),
properties);
bundleContext.registerService(
ConfigurationForm.class.getName(),
new LazyConfigurationForm(
OpusConfigForm.class.getName(),
getClass().getClassLoader(),
null,
"plugin.generalconfig.OPUS_CONFIG",
0, true),
properties);
/*

@ -0,0 +1,316 @@
/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.plugin.generalconfig;
import net.java.sip.communicator.util.swing.*;
import org.jitsi.service.configuration.*;
import org.jitsi.service.neomedia.codec.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* Implements the Opus configuration panel.
*
* @author Boris Grozev
*/
public class OpusConfigForm
extends TransparentPanel
implements ActionListener
{
/**
* Strings for audio bandwidths. Used as the value for the bandwidth
* property. In sync with <tt>BANDWIDTHS_LONG</tt>
*/
private static final String[] BANDWIDTHS = new String[]{
"auto", "fb", "swb", "wb", "mb", "nb"
};
/**
* The strings used in the combobox. In sync with <tt>BANDWIDTHS</tt>
*/
private static final String[] BANDWIDTHS_LONG = new String[]{
"Auto",
"Fullband (48kHz)",
"Super-wideband (24kHz)",
"Wideband (16kHz)",
"Medium-band (12kHz)",
"Narrowband (8kHz)"
};
/**
* The default value for the "bandwidth" setting.
*/
private static final String BANDWIDTH_DEFAULT = "auto";
/**
* The default value for the "bitrate" setting
*/
private static final int BITRATE_DEFAULT = 32;
/**
* The default value for the "dtx" setting
*/
private static final boolean DTX_DEFAULT = true;
/**
* The default value for the "fec" setting
*/
private static final boolean FEC_DEFAULT = true;
/**
* The default value for the "minimum expected packet loss" setting
*/
private static final int MIN_EXPECTED_PL_DEFAULT = 1;
/**
* The index of the default value for the 'complexity' setting. Index 0
* corresponds to complexity 10.
*/
private static final int COMPLEXITY_DEFAULT_INDEX = 0;
/**
* The "audio bandwidth" combobox
*/
private final JComboBox bandwidthCombobox = new JComboBox();
/**
* The "bitrate" field
*/
private final JTextField bitrateField = new JTextField(6);
/**
* The "use dtx" checkbox
*/
private final JCheckBox dtxCheckbox = new JCheckBox();
/**
* The "use fec" checkbox
*/
private final JCheckBox fecCheckbox = new JCheckBox();
/**
* The "minimum expected packet loss" field
*/
private final JTextField minExpectedPLField = new JTextField(3);
/**
* The "complexity" combobox
*/
private final JComboBox complexityCombobox = new JComboBox();
/**
* The <tt>ConfigurationService</tt> to be used to access configuration
*/
private final ConfigurationService configurationService
= GeneralConfigPluginActivator.getConfigurationService();
/**
* The "restore defaults" button
*/
private final JButton restoreButton = new JButton(Resources.getString(
"plugin.generalconfig.RESTORE"));
/**
* Initialize a new <tt>OpusConfigForm</tt> instance.
*/
public OpusConfigForm()
{
super(new BorderLayout());
Box box = Box.createVerticalBox();
add(box, BorderLayout.NORTH);
TransparentPanel contentPanel = new TransparentPanel();
contentPanel.setLayout(new BorderLayout(10, 10));
box.add(contentPanel);
TransparentPanel labelPanel
= new TransparentPanel(new GridLayout(0, 1, 2, 2));
TransparentPanel valuePanel
= new TransparentPanel(new GridLayout(0, 1, 2, 2));
TransparentPanel southPanel
= new TransparentPanel(new GridLayout(0, 1, 2, 2));
contentPanel.add(labelPanel, BorderLayout.WEST);
contentPanel.add(valuePanel, BorderLayout.CENTER);
contentPanel.add(southPanel, BorderLayout.SOUTH);
//Audio bandwidth
labelPanel.add(new JLabel(Resources.getString(
"plugin.generalconfig.OPUS_AUDIO_BANDWIDTH")));
for(String str : BANDWIDTHS_LONG)
bandwidthCombobox.addItem(str);
bandwidthCombobox.setSelectedIndex(getBandwidthIndex(
configurationService.getString(
Constants.PROP_OPUS_BANDWIDTH, BANDWIDTH_DEFAULT)));
bandwidthCombobox.addActionListener(this);
valuePanel.add(bandwidthCombobox);
//Bitrate
labelPanel.add(new JLabel(Resources.getString(
"plugin.generalconfig.OPUS_BITRATE")));
bitrateField.setText(
((Integer)configurationService.getInt(
Constants.PROP_OPUS_BITRATE,
BITRATE_DEFAULT))
.toString());
bitrateField.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent focusEvent) {}
public void focusLost(FocusEvent focusEvent) {
configurationService.setProperty(
Constants.PROP_OPUS_BITRATE, bitrateField.getText());
}
});
valuePanel.add(bitrateField);
//DTX
labelPanel.add(new JLabel(Resources.getString(
"plugin.generalconfig.OPUS_USE_DTX")));
dtxCheckbox.setSelected(
configurationService.getBoolean(
Constants.PROP_OPUS_DTX, DTX_DEFAULT));
dtxCheckbox.addActionListener(this);
valuePanel.add(dtxCheckbox);
//FEC
labelPanel.add(new JLabel(Resources.getString(
"plugin.generalconfig.OPUS_USE_FEC")));
fecCheckbox.setSelected(
configurationService.getBoolean(
Constants.PROP_OPUS_FEC, FEC_DEFAULT));
fecCheckbox.addActionListener(this);
valuePanel.add(fecCheckbox);
//Disabled until FEC actually works
fecCheckbox.setEnabled(false);
//min expected packet loss
labelPanel.add(new JLabel(Resources.getString(
"plugin.generalconfig.OPUS_MIN_EXPECTED_PACKET_LOSS")));
minExpectedPLField.setText(
configurationService.getString(
Constants.PROP_OPUS_MIN_EXPECTED_PACKET_LOSS,
((Integer)MIN_EXPECTED_PL_DEFAULT).toString()));
minExpectedPLField.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent focusEvent) {
}
public void focusLost(FocusEvent focusEvent) {
configurationService.setProperty(
Constants.PROP_OPUS_MIN_EXPECTED_PACKET_LOSS,
minExpectedPLField.getText());
}
});
valuePanel.add(minExpectedPLField);
//Complexity
labelPanel.add(new JLabel(Resources.getString(
"plugin.generalconfig.OPUS_COMPLEXITY")));
for(int i = 10; i > 0; i--)
complexityCombobox.addItem(((Integer)i).toString());
complexityCombobox.addActionListener(this);
valuePanel.add(complexityCombobox);
restoreButton.addActionListener(this);
southPanel.add(restoreButton);
}
/**
* Restores the UI components to the default values and writes the default
* values to the configuration.
*/
private void restoreDefaults()
{
bandwidthCombobox.setSelectedIndex(getBandwidthIndex(BANDWIDTH_DEFAULT));
bitrateField.setText(((Integer)BITRATE_DEFAULT).toString());
configurationService.setProperty(
Constants.PROP_OPUS_BITRATE, BITRATE_DEFAULT);
dtxCheckbox.setSelected(DTX_DEFAULT);
configurationService.setProperty(
Constants.PROP_OPUS_DTX, DTX_DEFAULT);
fecCheckbox.setSelected(FEC_DEFAULT);
configurationService.setProperty(
Constants.PROP_OPUS_FEC, FEC_DEFAULT);
minExpectedPLField.setText(
((Integer)MIN_EXPECTED_PL_DEFAULT).toString());
configurationService.setProperty(
Constants.PROP_OPUS_MIN_EXPECTED_PACKET_LOSS,
MIN_EXPECTED_PL_DEFAULT);
complexityCombobox.setSelectedIndex(COMPLEXITY_DEFAULT_INDEX);
configurationService.setProperty(
Constants.PROP_OPUS_COMPLEXITY,
complexityCombobox.getItemAt(COMPLEXITY_DEFAULT_INDEX));
}
/**
* Action listener for the checkboxes, buttons and comboboxes. Updates
* the configuration service with the appropriate new value.
* @param actionEvent
*/
public void actionPerformed(ActionEvent actionEvent)
{
Object source = actionEvent.getSource();
if(source == restoreButton)
{
restoreDefaults();
}
else if (source == bandwidthCombobox)
{
configurationService.setProperty(
Constants.PROP_OPUS_BANDWIDTH,
BANDWIDTHS[bandwidthCombobox.getSelectedIndex()]);
}
else if(source == dtxCheckbox)
{
configurationService.setProperty(
Constants.PROP_OPUS_DTX, dtxCheckbox.isSelected());
}
else if(source == fecCheckbox)
{
configurationService.setProperty(
Constants.PROP_OPUS_FEC, fecCheckbox.isSelected());
}
else if(source == complexityCombobox)
{
configurationService.setProperty(
Constants.PROP_OPUS_COMPLEXITY,
complexityCombobox.getSelectedItem());
}
}
/**
* Returns the index of the audio bandwidth with a short name
* <tt>bandwidthShortName</tt> in <tt>bandwidthCheckbox</tt>, or -1 if it's
* not found.
*
* @param bandwidthShortName the short name of the audio bandwidth to return
* to return the index of.
*
* @return the index of the audio bandwidth with a short name
* <tt>bandwidthShortName</tt> in <tt>bandwidthCheckbox</tt>, or -1 if it's
* not found.
*/
private int getBandwidthIndex(String bandwidthShortName)
{
for(int i = 0; i < BANDWIDTHS.length; i++)
if(BANDWIDTHS[i].equals(bandwidthShortName))
return i;
return -1;
}
}

@ -9,6 +9,7 @@
import net.java.sip.communicator.util.swing.*;
import org.jitsi.service.configuration.*;
import org.jitsi.service.neomedia.codec.*;
import javax.swing.*;
import java.awt.*;
@ -22,33 +23,7 @@
public class SilkConfigForm
extends TransparentPanel
{
/**
* The property name associated with the 'use fec' setting
*/
private static final String FEC_PROP
= "net.java.sip.communicator.impl.neomedia.codec.audio.silk." +
"encoder.USE_FEC";
/**
* The property name associated with the 'always assume packet loss' setting
*/
private static final String ASSUME_PL_PROP
= "net.java.sip.communicator.impl.neomedia.codec.audio.silk." +
"encoder.AWLAYS_ASSUME_PACKET_LOSS";
/**
* The property name associated with the 'speech activity threshold' setting
*/
private static final String FEC_SAT_PROP
= "net.java.sip.communicator.impl.neomedia.codec.audio.silk." +
"encoder.SPEECH_ACTIVITY_THRESHOLD";
/**
* The property name associated with the 'advertise fec' setting
*/
private static final String FEC_ADVERTISE_PROP
= "net.java.sip.communicator.impl.neomedia.codec.audio.silk." +
"ADVERTISE_FEC";
/**
* The default value for the SAT setting
@ -140,22 +115,22 @@ public SilkConfigForm()
fecCheckbox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
configurationService.setProperty(FEC_PROP,
configurationService.setProperty(Constants.PROP_SILK_FEC,
fecCheckbox.isSelected());
}
});
fecCheckbox.setSelected(configurationService.getBoolean(
FEC_PROP, FEC_DEFAULT));
Constants.PROP_SILK_FEC, FEC_DEFAULT));
valuePanel.add(fecCheckbox);
assumePLCheckbox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
configurationService.setProperty(ASSUME_PL_PROP,
configurationService.setProperty(Constants.PROP_SILK_ASSUME_PL,
assumePLCheckbox.isSelected());
}
});
assumePLCheckbox.setSelected(configurationService.getBoolean(
ASSUME_PL_PROP, FEC_FORCE_PL_DEFAULT));
Constants.PROP_SILK_ASSUME_PL, FEC_FORCE_PL_DEFAULT));
valuePanel.add(assumePLCheckbox);
SATField.addFocusListener(new FocusListener() {
@ -163,22 +138,23 @@ public void focusGained(FocusEvent focusEvent){}
public void focusLost(FocusEvent focusEvent)
{
configurationService.setProperty(FEC_SAT_PROP,
configurationService.setProperty(Constants.PROP_SILK_FEC_SAT,
SATField.getText());
}
});
SATField.setText(configurationService.getString(
FEC_SAT_PROP, FEC_SAT_DEFAULT));
Constants.PROP_SILK_FEC_SAT, FEC_SAT_DEFAULT));
valuePanel.add(SATField);
advertiseFECCheckbox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
configurationService.setProperty(FEC_ADVERTISE_PROP,
configurationService.setProperty(
Constants.PROP_SILK_ADVERSISE_FEC,
advertiseFECCheckbox.isSelected());
}
});
advertiseFECCheckbox.setSelected(configurationService.getBoolean(
FEC_ADVERTISE_PROP, FEC_ADVERTISE_DEFAULT));
Constants.PROP_SILK_ADVERSISE_FEC, FEC_ADVERTISE_DEFAULT));
valuePanel.add(advertiseFECCheckbox);
@ -199,17 +175,18 @@ public void actionPerformed(ActionEvent e)
private void restoreDefaults()
{
fecCheckbox.setSelected(FEC_DEFAULT);
configurationService.setProperty(FEC_PROP, FEC_DEFAULT);
configurationService.setProperty(Constants.PROP_SILK_FEC, FEC_DEFAULT);
assumePLCheckbox.setSelected(FEC_FORCE_PL_DEFAULT);
configurationService.setProperty(
ASSUME_PL_PROP, FEC_FORCE_PL_DEFAULT);
Constants.PROP_SILK_ASSUME_PL, FEC_FORCE_PL_DEFAULT);
SATField.setText(FEC_SAT_DEFAULT);
configurationService.setProperty(FEC_SAT_PROP, FEC_SAT_DEFAULT);
configurationService.setProperty(
Constants.PROP_SILK_FEC_SAT, FEC_SAT_DEFAULT);
advertiseFECCheckbox.setSelected(FEC_ADVERTISE_DEFAULT);
configurationService.setProperty(
FEC_ADVERTISE_PROP, FEC_ADVERTISE_DEFAULT);
Constants.PROP_SILK_ADVERSISE_FEC, FEC_ADVERTISE_DEFAULT);
}
}
Loading…
Cancel
Save