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

📄 javaencoder.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.*;

/**
 * The ilbc Encoder
 *
 * @author Damian Minkov
 */
public class JavaEncoder
    extends com.ibm.media.codec.audio.AudioCodec
{
    private Format lastFormat = null;

    private ilbc_encoder enc = null;
    private int ILBC_NO_OF_BYTES = 0;

    public JavaEncoder()
    {
        supportedInputFormats = new AudioFormat[]
            {
            new AudioFormat(
                AudioFormat.LINEAR,
                8000,
                16,
                1,
                AudioFormat.LITTLE_ENDIAN, //isBigEndian(),
                AudioFormat.SIGNED //isSigned());
            )};

        defaultOutputFormats = new AudioFormat[]
            {new AudioFormat(
                Constants.ILBC_RTP,
                8000.0,
                16,
                1,
                AudioFormat.LITTLE_ENDIAN,
                AudioFormat.SIGNED)};

        PLUGIN_NAME = "pcm to iLbc converter";
    }

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

        supportedOutputFormats = new AudioFormat[]
            {new AudioFormat(
                Constants.ILBC_RTP,
                8000.0,
                16,
                1,
                AudioFormat.LITTLE_ENDIAN,
                AudioFormat.SIGNED)};

        return supportedOutputFormats;
    }

    public void open() throws ResourceUnavailableException
    {
        int mode = Constants.ILBC_MODE;
        enc = new ilbc_encoder(mode);

        if(mode == 20)
            ILBC_NO_OF_BYTES = ilbc_constants.NO_OF_BYTES_20MS;
        else if(mode == 30)
            ILBC_NO_OF_BYTES = ilbc_constants.NO_OF_BYTES_30MS;
    }

    public void close()
    {

    }



    private void initConverter(AudioFormat inFormat)
    {
        lastFormat = inFormat;
    }

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

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


        Format newFormat = inputBuffer.getFormat();

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

        int inpLength = inputBuffer.getLength();
        int inOffset = inputBuffer.getOffset();
        byte[] inpData = (byte[]) inputBuffer.getData();

        if (inpLength == 0)
        {
            return OUTPUT_BUFFER_NOT_FILLED;
        }
        else if(inpLength < enc.ULP_inst.blockl*2)
        {
            return OUTPUT_BUFFER_NOT_FILLED;
        }

		short[] encoded_data = new short[ILBC_NO_OF_BYTES / 2];

        int outLength = ILBC_NO_OF_BYTES;
        byte[] outdata = validateByteArraySize(outputBuffer, outLength);

        short[] data = Utils.byteToShortArray(inpData, inOffset, inpLength, true);
        enc.encode(encoded_data, data);

        Utils.shortArrToByteArr(encoded_data, outdata, false);

        updateOutput(outputBuffer, outputFormat, outLength, 0);


        inputBuffer.setLength(inpLength - enc.ULP_inst.blockl*2);
        inputBuffer.setOffset(inOffset + enc.ULP_inst.blockl*2);

        return BUFFER_PROCESSED_OK | INPUT_BUFFER_NOT_CONSUMED;
    }

    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 + -