/* * @(#)AudioPacketizer.java 1.5 99/04/01 * * Copyright 1996-1998 by Sun Microsystems, Inc., * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A. * All rights reserved. * * This software is the confidential and proprietary information * of Sun Microsystems, Inc. ("Confidential Information"). You * shall not disclose such Confidential Information and shall use * it only in accordance with the terms of the license agreement * you entered into with Sun. */ package com.ibm.media.codec.audio; import javax.media.*; import javax.media.format.*; import javax.media.format.*; import com.sun.media.*; import com.sun.media.controls.*; /** * Implements an G723 Packetizer. */ public abstract class AudioPacketizer extends com.ibm.media.codec.audio.AudioCodec { //////////////////////////////////////////////////////////////////////////// // Variables protected byte [] history; protected int packetSize; protected int historyLength; protected int sample_count; // protected long currentSeq = (long) // (System.currentTimeMillis() * Math.random() ); // current timestamp on RTP format packets. //protected long timestamp = (long) // (System.currentTimeMillis() * Math.random() ); //////////////////////////////////////////////////////////////////////////// // Methods public synchronized int process(Buffer inputBuffer, Buffer outputBuffer) { int inpLength=inputBuffer.getLength(); int outLength = packetSize; byte[] inpData = (byte[]) inputBuffer.getData(); byte[] outData = validateByteArraySize(outputBuffer, outLength); if (inpLength+historyLength>=packetSize) { int copyFromHistory=Math.min(historyLength,packetSize); System.arraycopy(history, 0, outData, 0 ,copyFromHistory ) ; int remainingBytes=packetSize-copyFromHistory; System.arraycopy(inpData, inputBuffer.getOffset(), outData,historyLength,remainingBytes) ; historyLength -= copyFromHistory; inputBuffer.setOffset( inputBuffer.getOffset() + remainingBytes); inputBuffer.setLength( inpLength - remainingBytes); // EP: packetizers will not convert time to RTP // units. This will be done in the RTP session manager and thus // processor will use the media times as is. //outputBuffer.setSequenceNumber(currentSeq++); //outputBuffer.setTimeStamp(timestamp); //timestamp+=sample_count; updateOutput(outputBuffer, outputFormat, outLength, 0); return INPUT_BUFFER_NOT_CONSUMED ; } if (inputBuffer.isEOM() ) { // last packet System.arraycopy(history, 0, outData, 0 ,historyLength ) ; System.arraycopy(inpData, inputBuffer.getOffset(), outData,historyLength,inpLength) ; // EP: packetizers will not convert time to RTP // units. This will be done in the RTP session manager and thus // processor will use the media times as is. //outputBuffer.setSequenceNumber(currentSeq++); //outputBuffer.setTimeStamp(timestamp); //timestamp+=sample_count; updateOutput(outputBuffer, outputFormat, inpLength + historyLength, 0); historyLength=0; return BUFFER_PROCESSED_OK; } //save remainder for next time System.arraycopy(inpData, inputBuffer.getOffset(), history, historyLength,inpLength) ; historyLength += inpLength; return OUTPUT_BUFFER_NOT_FILLED ; } public void reset() { historyLength=0; } }