DVI/RTP packet decode

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • cs02lk1
    New Member
    • Jul 2007
    • 1

    #1

    DVI/RTP packet decode

    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:

    [CODE=java] 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.b yte2short(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)st ate).valprev = valprev;
    ((AdpcmState)st ate).index = index;
    return len;
    }[/CODE]

    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

    [CODE=java] for(int g=0,k=0;g<s.len gth;g++,k=k+2){
    audio.Convert.s hort2byte(s[g],adp,k);
    }

    public static void short2byte(shor t 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);
    }
    }[/CODE]

    The final result is loaded to the player as follows:

    [CODE=java] ByteArrayInputS tream input1 = new ByteArrayInputS tream(adp);
    player = Manager.createP layer(input1, "audio/x-wav");//create new player
    player.addPlaye rListener(this) ;
    player.prefetch ();
    player.realize( );

    player.start();
    [/CODE]
    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.
    Last edited by r035198x; Jul 6 '07, 05:28 AM. Reason: added code tags
Working...