⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 javadecoder.java

📁 java的ilbc语音编码器,实现了其全部功能
💻 JAVA
字号:
/*
 * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package net.java.sip.communicator.impl.media.codec.audio.ilbc;

import javax.media.*;
import javax.media.format.*;

import net.java.sip.communicator.impl.media.codec.*;
import net.java.sip.communicator.impl.media.codec.audio.*;

/** iLbc to PCM java decoder
 *  @author Damian Minkov
 **/
public class JavaDecoder
    extends com.ibm.media.codec.audio.AudioCodec
{
    private Format lastFormat = null;

    /**
     * The decoder
     */
    private ilbc_decoder dec = null;

    public JavaDecoder()
    {
        inputFormats = new Format[]
            {
            new AudioFormat(
                Constants.ILBC_RTP,
                8000,
                16,
                1,
                Format.NOT_SPECIFIED,
                Format.NOT_SPECIFIED
            )};

        supportedInputFormats = new AudioFormat[]
            {
            new AudioFormat(Constants.ILBC_RTP,
                            8000,
                            16,
                            1,
                            Format.NOT_SPECIFIED,
                            Format.NOT_SPECIFIED
            )};

        defaultOutputFormats = new AudioFormat[]
            {
            new AudioFormat(AudioFormat.LINEAR)};

        PLUGIN_NAME = "iLbc Decoder";
    }

    protected Format[] getMatchingOutputFormats(Format in)
    {
        AudioFormat af = (AudioFormat) in;

        supportedOutputFormats = new AudioFormat[]
            {
            new AudioFormat(
                AudioFormat.LINEAR,
                af.getSampleRate(),
                16,
                1,
                AudioFormat.LITTLE_ENDIAN, //isBigEndian(),
                AudioFormat.SIGNED //isSigned());
            )};

        return supportedOutputFormats;

    }

    public void open()
    {}

    public void close()
    {}

    private void initConverter(AudioFormat inFormat, int inputLength)
    {
        lastFormat = inFormat;

        if(inputLength == ilbc_constants.NO_OF_BYTES_20MS)
            dec = new ilbc_decoder(20, 1);
        else if(inputLength == ilbc_constants.NO_OF_BYTES_30MS)
            dec = new ilbc_decoder(30, 1);
    }

    public int process(Buffer inputBuffer, Buffer outputBuffer)
    {
        if (!checkInputBuffer(inputBuffer))
        {
            return BUFFER_PROCESSED_FAILED;
        }

        if (isEOM(inputBuffer))
        {
            propagateEOM(outputBuffer);
            return BUFFER_PROCESSED_OK;
        }

        byte[] inData = (byte[]) inputBuffer.getData();

        int inpLength = inputBuffer.getLength();
        int inOffset = inputBuffer.getOffset();

        Format newFormat = inputBuffer.getFormat();

        if (lastFormat != newFormat)
        {
            initConverter( (AudioFormat) newFormat, inpLength);
        }

        short[] data = Utils.byteToShortArray(inData, inOffset, inpLength, false);

        short[] decodedData = new short[dec.ULP_inst.blockl];
        dec.decode(decodedData, data, (short) 1);
        int outLength = dec.ULP_inst.blockl * 2;
        byte[] outData = validateByteArraySize(outputBuffer, outLength);

        Utils.shortArrToByteArr(decodedData, outData, true);

        updateOutput(outputBuffer, outputFormat, outLength, 0);

        return BUFFER_PROCESSED_OK;
    }

    public java.lang.Object[] getControls()
    {
        if (controls == null)
        {
            controls = new Control[1];
            controls[0] = new com.sun.media.controls.SilenceSuppressionAdapter(this, false, false);
        }
        return (Object[]) controls;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -