Skip to content
Snippets Groups Projects
QualityControlImpl.java 4.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
     *
     * Distributable under LGPL license.
     * See terms of license at gnu.org.
     */
    package org.jitsi.impl.neomedia;
    
    import java.awt.*;
    
    import org.jitsi.impl.neomedia.device.*;
    import org.jitsi.service.neomedia.*;
    import org.jitsi.service.protocol.*;
    import org.jitsi.util.*;
    
    /**
     * Implements {@link QualityControl} for the purposes of
     * {@link VideoMediaStreamImpl}.
     *
     * @author Damian Minkov
     * @author Lyubomir Marinov
     */
    class QualityControlImpl
        implements QualityControl
    {
        /**
         * The <tt>Logger</tt> used by the <tt>QualityControlImpl</tt> class and its
         * instances for logging output.
         */
        private static final Logger logger
            = Logger.getLogger(QualityControlImpl.class);
    
        /**
         * This is the local settings from the configuration panel.
         */
        private QualityPreset localSettingsPreset;
    
        /**
         * The maximum values for resolution, framerate, etc.
         */
        private QualityPreset maxPreset;
    
        /**
         * The current used preset.
         */
        private QualityPreset preset;
    
        /**
         * Sets the preset.
         *
         * @param preset the desired video settings
         * @throws OperationFailedException
         */
        private void setRemoteReceivePreset(QualityPreset preset)
            throws OperationFailedException
        {
            if (preset.compareTo(getPreferredSendPreset()) > 0)
                this.preset = getPreferredSendPreset();
            else
            {
                this.preset = preset;
    
                Dimension resolution;
    
                if (logger.isInfoEnabled()
                        && (preset != null)
                        && ((resolution = preset.getResolution()) != null))
                {
                    logger.info(
                            "video send resolution: "
                                + resolution.width
                                + "x"
                                + resolution.height);
                }
            }
        }
    
        /**
         * The current preset.
         *
         * @return the current preset
         */
        public QualityPreset getRemoteReceivePreset()
        {
            return preset;
        }
    
        /**
         * The minimum resolution values for remote part.
         *
         * @return minimum resolution values for remote part.
         */
        public QualityPreset getRemoteSendMinPreset()
        {
            /* We do not support such a value at the time of this writing. */
            return null;
        }
    
        /**
         * The max resolution values for remote part.
         *
         * @return max resolution values for remote part.
         */
        public QualityPreset getRemoteSendMaxPreset()
        {
            return maxPreset;
        }
    
        /**
         * Does nothing specific locally.
         *
         * @param preset the max preset
         * @throws OperationFailedException not thrown.
         */
        public void setPreferredRemoteSendMaxPreset(QualityPreset preset)
            throws OperationFailedException
        {
            setRemoteSendMaxPreset(preset);
        }
    
        /**
         * Changes remote send preset, the one we will receive.
         *
         * @param preset
         */
        public void setRemoteSendMaxPreset(QualityPreset preset)
        {
            this.maxPreset = preset;
        }
    
        /**
         * Gets the local setting of capture.
         *
         * @return the local setting of capture
         */
        private QualityPreset getPreferredSendPreset()
        {
            if(localSettingsPreset == null)
            {
                DeviceConfiguration devCfg
                    = NeomediaServiceUtils
                        .getMediaServiceImpl()
                            .getDeviceConfiguration();
    
                localSettingsPreset
                    = new QualityPreset(
                            devCfg.getVideoSize(),
                            devCfg.getFrameRate());
            }
            return localSettingsPreset;
        }
    
        /**
         * Sets maximum resolution.
         *
         * @param res
         */
        public void setRemoteReceiveResolution(Dimension res)
        {
            try
            {
                setRemoteReceivePreset(new QualityPreset(res));
            }
            catch(OperationFailedException ofe)
            {
                logger.warn("Failed to set remote receive resolution", ofe);
            }
        }
    }