/*
* JBoss, Home of Professional Open Source
* Copyright 2011, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.restcomm.media.codec.g711.ulaw;
import org.restcomm.media.spi.dsp.Codec;
import org.restcomm.media.spi.format.Format;
import org.restcomm.media.spi.format.FormatFactory;
import org.restcomm.media.spi.memory.Frame;
import org.restcomm.media.spi.memory.Memory;
/**
*
* @author Oleg Kulikov
*/
public class Decoder implements Codec {
private final static Format ulaw = FormatFactory.createAudioFormat("pcmu", 8000, 8, 1);
private final static Format linear = FormatFactory.createAudioFormat("linear", 8000, 16, 1);
private int j=0,i=0;
private int sourceLen=0,destinationLen=0;
private int currentIndex;
private static byte[] muLawDecompressTable_low = new byte[]{
(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,
(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,
(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,
(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,(byte)0x84,
(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,
(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,
(byte)0xc4,(byte)0x44,(byte)0xc4,(byte)0x44,(byte)0xc4,(byte)0x44,(byte)0xc4,(byte)0x44,
(byte)0xc4,(byte)0x44,(byte)0xc4,(byte)0x44,(byte)0xc4,(byte)0x44,(byte)0xc4,(byte)0x44,
(byte)0xa4,(byte)0xe4,(byte)0x24,(byte)0x64,(byte)0xa4,(byte)0xe4,(byte)0x24,(byte)0x64,
(byte)0xa4,(byte)0xe4,(byte)0x24,(byte)0x64,(byte)0xa4,(byte)0xe4,(byte)0x24,(byte)0x64,
(byte)0x94,(byte)0xb4,(byte)0xd4,(byte)0xf4,(byte)0x14,(byte)0x34,(byte)0x54,(byte)0x74,
(byte)0x94,(byte)0xb4,(byte)0xd4,(byte)0xf4,(byte)0x14,(byte)0x34,(byte)0x54,(byte)0x74,
(byte)0x8c,(byte)0x9c,(byte)0xac,(byte)0xbc,(byte)0xcc,(byte)0xdc,(byte)0xec,(byte)0xfc,
(byte)0xc,(byte)0x1c,(byte)0x2c,(byte)0x3c,(byte)0x4c,(byte)0x5c,(byte)0x6c,(byte)0x7c,
(byte)0x88,(byte)0x90,(byte)0x98,(byte)0xa0,(byte)0xa8,(byte)0xb0,(byte)0xb8,(byte)0xc0,
(byte)0xc8,(byte)0xd0,(byte)0xd8,(byte)0xe0,(byte)0xe8,(byte)0xf0,(byte)0xf8,(byte)0x0,
(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,
(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,
(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,
(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,(byte)0x7c,
(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,
(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,
(byte)0x3c,(byte)0xbc,(byte)0x3c,(byte)0xbc,(byte)0x3c,(byte)0xbc,(byte)0x3c,(byte)0xbc,
(byte)0x3c,(byte)0xbc,(byte)0x3c,(byte)0xbc,(byte)0x3c,(byte)0xbc,(byte)0x3c,(byte)0xbc,
(byte)0x5c,(byte)0x1c,(byte)0xdc,(byte)0x9c,(byte)0x5c,(byte)0x1c,(byte)0xdc,(byte)0x9c,
(byte)0x5c,(byte)0x1c,(byte)0xdc,(byte)0x9c,(byte)0x5c,(byte)0x1c,(byte)0xdc,(byte)0x9c,
(byte)0x6c,(byte)0x4c,(byte)0x2c,(byte)0xc,(byte)0xec,(byte)0xcc,(byte)0xac,(byte)0x8c,
(byte)0x6c,(byte)0x4c,(byte)0x2c,(byte)0xc,(byte)0xec,(byte)0xcc,(byte)0xac,(byte)0x8c,
(byte)0x74,(byte)0x64,(byte)0x54,(byte)0x44,(byte)0x34,(byte)0x24,(byte)0x14,(byte)0x4,
(byte)0xf4,(byte)0xe4,(byte)0xd4,(byte)0xc4,(byte)0xb4,(byte)0xa4,(byte)0x94,(byte)0x84,
(byte)0x78,(byte)0x70,(byte)0x68,(byte)0x60,(byte)0x58,(byte)0x50,(byte)0x48,(byte)0x40,
(byte)0x38,(byte)0x30,(byte)0x28,(byte)0x20,(byte)0x18,(byte)0x10,(byte)0x8,(byte)0x0,
};
private static byte[] muLawDecompressTable_high = new byte[]{
(byte)0x82,(byte)0x86,(byte)0x8a,(byte)0x8e,(byte)0x92,(byte)0x96,(byte)0x9a,(byte)0x9e,
(byte)0xa2,(byte)0xa6,(byte)0xaa,(byte)0xae,(byte)0xb2,(byte)0xb6,(byte)0xba,(byte)0xbe,
(byte)0xc1,(byte)0xc3,(byte)0xc5,(byte)0xc7,(byte)0xc9,(byte)0xcb,(byte)0xcd,(byte)0xcf,
(byte)0xd1,(byte)0xd3,(byte)0xd5,(byte)0xd7,(byte)0xd9,(byte)0xdb,(byte)0xdd,(byte)0xdf,
(byte)0xe1,(byte)0xe2,(byte)0xe3,(byte)0xe4,(byte)0xe5,(byte)0xe6,(byte)0xe7,(byte)0xe8,
(byte)0xe9,(byte)0xea,(byte)0xeb,(byte)0xec,(byte)0xed,(byte)0xee,(byte)0xef,(byte)0xf0,
(byte)0xf0,(byte)0xf1,(byte)0xf1,(byte)0xf2,(byte)0xf2,(byte)0xf3,(byte)0xf3,(byte)0xf4,
(byte)0xf4,(byte)0xf5,(byte)0xf5,(byte)0xf6,(byte)0xf6,(byte)0xf7,(byte)0xf7,(byte)0xf8,
(byte)0xf8,(byte)0xf8,(byte)0xf9,(byte)0xf9,(byte)0xf9,(byte)0xf9,(byte)0xfa,(byte)0xfa,
(byte)0xfa,(byte)0xfa,(byte)0xfb,(byte)0xfb,(byte)0xfb,(byte)0xfb,(byte)0xfc,(byte)0xfc,
(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfc,(byte)0xfd,(byte)0xfd,(byte)0xfd,(byte)0xfd,
(byte)0xfd,(byte)0xfd,(byte)0xfd,(byte)0xfd,(byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,
(byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,
(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,
(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,
(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x0,
(byte)0x7d,(byte)0x79,(byte)0x75,(byte)0x71,(byte)0x6d,(byte)0x69,(byte)0x65,(byte)0x61,
(byte)0x5d,(byte)0x59,(byte)0x55,(byte)0x51,(byte)0x4d,(byte)0x49,(byte)0x45,(byte)0x41,
(byte)0x3e,(byte)0x3c,(byte)0x3a,(byte)0x38,(byte)0x36,(byte)0x34,(byte)0x32,(byte)0x30,
(byte)0x2e,(byte)0x2c,(byte)0x2a,(byte)0x28,(byte)0x26,(byte)0x24,(byte)0x22,(byte)0x20,
(byte)0x1e,(byte)0x1d,(byte)0x1c,(byte)0x1b,(byte)0x1a,(byte)0x19,(byte)0x18,(byte)0x17,
(byte)0x16,(byte)0x15,(byte)0x14,(byte)0x13,(byte)0x12,(byte)0x11,(byte)0x10,(byte)0xf,
(byte)0xf,(byte)0xe,(byte)0xe,(byte)0xd,(byte)0xd,(byte)0xc,(byte)0xc,(byte)0xb,
(byte)0xb,(byte)0xa,(byte)0xa,(byte)0x9,(byte)0x9,(byte)0x8,(byte)0x8,(byte)0x7,
(byte)0x7,(byte)0x7,(byte)0x6,(byte)0x6,(byte)0x6,(byte)0x6,(byte)0x5,(byte)0x5,
(byte)0x5,(byte)0x5,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x4,(byte)0x3,(byte)0x3,
(byte)0x3,(byte)0x3,(byte)0x3,(byte)0x3,(byte)0x2,(byte)0x2,(byte)0x2,(byte)0x2,
(byte)0x2,(byte)0x2,(byte)0x2,(byte)0x2,(byte)0x1,(byte)0x1,(byte)0x1,(byte)0x1,
(byte)0x1,(byte)0x1,(byte)0x1,(byte)0x1,(byte)0x1,(byte)0x1,(byte)0x1,(byte)0x1,
(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,
(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,
(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,
};
/**
* (Non Java-doc)
*
* @see org.mobicents.media.server.impl.jmf.dsp.Codec#getSupportedFormat().
*/
public Format getSupportedInputFormat() {
return ulaw;
}
/**
* (Non Java-doc)
*
* @see org.mobicents.media.server.impl.jmf.dsp.Codec#getSupportedFormat().
*/
public Format getSupportedOutputFormat() {
return linear;
}
/**
* (Non Java-doc)
*
* @see org.mobicents.media.server.impl.jmf.dsp.Codec#process(Buffer).
*/
public Frame process(Frame frame) {
sourceLen=frame.getLength();
destinationLen=sourceLen * 2;
Frame res = Memory.allocate(destinationLen);
byte[] data=frame.getData();
byte[] resData=res.getData();
for (i = 0,j = 0; i < sourceLen; i++)
{
currentIndex = data[i] & 0xff;
resData[j++] = muLawDecompressTable_low[currentIndex];
resData[j++] = muLawDecompressTable_high[currentIndex];
}
res.setOffset(0);
res.setLength(destinationLen);
res.setTimestamp(frame.getTimestamp());
res.setDuration(frame.getDuration());
res.setSequenceNumber(frame.getSequenceNumber());
res.setEOM(frame.isEOM());
res.setFormat(linear);
return res;
}
}