Skip to Main Content

Java Programming

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

DVI/RTP packet decode

807605Jul 4 2007
Hi,

I need to stream audio and/or video to a PDA device. There is a trick here which is:
The PDA must receive the stream from a multicast address. For this I have implemented a Bridge application which joins the multicast group on behalf of the PDA and receives the Multicast RTP packets (which are sent from JMStudio) and Unicasts them to the PDA.(HP iPAQ) I had no problem implementing this. The streaming is done using JMStudio player which encodes the streaming audio data into a number of encodings (DVI/RTP in my case). I choose DVI/RTP and stream a .wav audio file.
Now I have to accept the packets and play the stream on the PDA.
The j2me application receives all the RTP packets successfully and I can extract usefull information from the packets such as: Timestamp, sequence number, payload type. The payload type is 5 which means it is a DVI4 encoding.
I use the following method to decode the samples:

public int decode(Object state, byte[] input, int inp, int len, short[] output, int outp) {
int sign;
int delta;
int vpdiff;
//int valprev = audio.Convert.byte2short(input, inp);

//int index = input[inp + 2];
int valprev=0,index=0;
int inputbuffer = 0;
int bufferstep = 0;
////////////////////////////////////
valprev = input[0] <<8;
valprev |= input[1] &0xff;

index = input[2] &0xff;
//////////////////////////////////////////

if ( index < 0 ) index = 0;
else if ( index > 88 ) index = 88;

int step = stepsizeTable[index];

inp += 4;

len = (len - 4) * 2;

int count = len;
while(count-- > 0) {

if ( 0 == bufferstep ) {
inputbuffer = input[inp++];
delta = (inputbuffer >> 4) & 0xf;
bufferstep = 1;
} else {
delta = inputbuffer & 0xf;
bufferstep = 0;
}

index += indexTable[delta];
if ( index < 0 ) index = 0;
else if ( index > 88 ) index = 88;

sign = delta & 8;
delta = delta & 7;

vpdiff = step >> 1;
if ( (delta & 4) == 4 ) vpdiff += (step << 2);
if ( (delta & 2) == 2 ) vpdiff += (step << 1);
if ( (delta & 1) == 1 ) vpdiff += step;
vpdiff >>= 2;

if ( 0 != sign )
valprev -= vpdiff;
else
valprev += vpdiff;

if ( valprev > 32767 )
valprev = 32767;
else if ( valprev < -32768 )
valprev = -32768;

step = stepsizeTable[index];
output[outp++] = (short) valprev;
}

((AdpcmState)state).valprev = valprev;
((AdpcmState)state).index = index;
return len;
}

which stores the result into a short[] array.

I then convert this short[] array into a byte[] array with the following way:

s is the short[] array
adp is the byte array

for(int g=0,k=0;g<s.length;g++,k=k+2){
audio.Convert.short2byte(s[g],adp,k);
}

public static void short2byte(short ival, byte b[], int offset) {
int i;
int bits = 16;

for(i = 0; i >< 2; i++) {
bits -= 8;
b[offset + i] = (byte) ((ival >> bits) & 0xff);
}
}

The final result is loaded to the player as follows:

ByteArrayInputStream input1 = new ByteArrayInputStream(adp);
player = Manager.createPlayer(input1, "audio/x-wav");//create new player
player.addPlayerListener(this);
player.prefetch();
player.realize();

player.start();

The player begins to play but I only get horrible sounds instead of the original wave file

The player now initializes ok without any problem but I can only hear a meesed up sound rather than the original. So now I strongly believe that the problem is in the decoding of the samples of the DVI/RTP codec.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Aug 1 2007
Added on Jul 4 2007
0 comments
325 views