[vorbis-dev] decoder_example -- event driven?

Wayne F Davis wfdavis at seas.upenn.edu
Thu Apr 5 22:58:12 PDT 2001

I'm trying to adapt decoder_example to to support more of an event driven
model.  I'm building an RTSP client/server where the client will have a
function called everytime a new packet comes in.  So, I want to queue
up these packets to be played.

My current attack is as follows (note this isn't very robust and I
realized that):

For first and second packet i grab all the header stuff in the same way
as decoder_example.  From the third packet on, I send it to a bunch of

      float **pcm;
      int samples;

      bytes = 4096;
      buffer = memcpy (buffer, data, bytes);


      ogg_stream_pagein(&os,&og); /* can safely ignore errors at
                                     this point */
      /* we have a packet.  Decode it */
      if(vorbis_synthesis(&vb,&op)==0) /* test for success! */
      **pcm is a multichannel float vector.  In stereo, for
      example, pcm[0] is left, and pcm[1] is right.  samples is
      the size of each channel.  Convert the float values
      (-1.<=range<=1.) to whatever PCM format and write it out */
      while((samples=vorbis_synthesis_pcmout(&vd,&pcm))>0) {
        int i,j;
        int clipflag=0;
        int bout=(samples<convsize?samples:convsize);
        fprintf (stderr,
                 "\nhoebag, i made it the while loop");

        /* convert floats to 16 bit signed ints (host order) and
           interleave */
          ogg_int16_t *ptr=convbuffer+i;
          float  *mono=pcm[i];
#if 1
            int val=mono[j]*32767.f;
#else /* optional dither */
            int val=mono[j]*32767.f+drand48()-0.5f;
            /* might as well guard against clipping */
          fprintf(stderr,"Clipping in frame %ld\n",(long)(vd.sequence));
        write (mywav, convbuffer, 2*vi.channels*bout);

        vorbis_synthesis_read(&vd,bout); /* tell libvorbis how
                                            many samples we
                                            actually consumed */


So, the first packets come in fine because I can retrieve the title, etc
properly.  All of the packets come in correctly because I write them out
to disk and it is the same file as the original file.  However, when I put
the packets through the above code, I lose a lot of information and the
mywav file is a small portion of what it should be.

If anyone has some ideas how I can solve this problem, I would appreciate
any help.


Wayne Davis - wfdavis at seas.upenn.edu - PGP Key Available

--- >8 ----
List archives:  http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'vorbis-dev-request at xiph.org'
containing only the word 'unsubscribe' in the body.  No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.

More information about the Vorbis-dev mailing list