Skip to main content

DVI/RTP packet decode

1 reply [Last post]
cs02lk1
Offline
Joined: 2007-07-04
Points: 0

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

;

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

;
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< 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.

Reply viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
terrencebarr
Offline
Joined: 2004-03-04
Points: 0

Hi,

I am not an expert on this but have you tried playing back straight wav files with the player first to confirm the problem is not with the file format?

Also, which Java ME implementation are you using on the iPAQ?

-- Terrence