[Vorbis] Problem with VorbisEncoder

pavan kumar pavanchikkala at yahoo.co.in
Wed Jan 11 22:18:06 PST 2006


Hi,
  Thanks for the info. I have checked for alternative endian also. The result is same. I am pasting the code i have written. It differs from the example code only when we read/write the data from/to the file. Symbian file read - write APIs support only descriptors. 
  It would be helpful if you can point out whether i am missing somewhere in the below code. This code generates the ogg with more of noise but some music somewhere in the background. Same file goldwav converts properly into an oggfile. does any one have a working example code, I would be grateful if you can send me as soon as possible.
   
  TInt CVorbisEncoder::CompleteConvert()
 {
  ogg_stream_state os; /* take physical pages, weld into a logical
     stream of packets */
  ogg_page         og; /* one Ogg bitstream page.  Vorbis packets are inside */
  ogg_packet       op; /* one raw packet of data for decode */
  
  vorbis_info      vi; /* struct that stores all the static vorbis bitstream
     settings */
  vorbis_comment   vc; /* struct that stores all the user comments */
    vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
  vorbis_block     vb; /* local working space for packet->PCM decode */
    int eos=0,ret;
  int i;
  
  RFs iFs;
  RFile iWriteFile;
  RFile iReadFile;
  TInt iCurrentPosition = 44;
  TInt iPosition = 0;
  iFs.Connect();
  iFs.Delete(_L("c:\\ccodecoutput.ogg"));
  
  TInt err = iReadFile.Open(iFs,_L("c:\\bradams.wav"),EFileRead);
  err = iWriteFile.Create(iFs,_L("c:\\ccodecoutput.ogg"), EFileWrite);
  
  /********** Encode setup ************/
    vorbis_info_init(&vi);
    
  ret=vorbis_encode_init_vbr(&vi,2,44100,0.4);
    /* do not continue if setup failed; this can happen if we ask for a
     mode that libVorbis does not support (eg, too low a bitrate, etc,
     will return 'OV_EIMPL') */
    if(ret)
   return 0;
    /* add a comment */
  vorbis_comment_init(&vc);
  vorbis_comment_add_tag(&vc,"ENCODER","encoder_example.c");
    /* set up the analysis state and auxiliary encoding storage */
  vorbis_analysis_init(&vd,&vi);
  vorbis_block_init(&vd,&vb);
  
  
  ogg_stream_init(&os,10);
    /* Vorbis streams begin with three headers; the initial header (with
     most of the codec setup parameters) which is mandated by the Ogg
     bitstream spec.  The second header holds any comment fields.  The
     third header holds the bitstream codebook.  We merely need to
     make the headers, then pass them to libvorbis one at a time;
     libvorbis handles the additional Ogg bitstream constraints */
    {
    ogg_packet header;
    ogg_packet header_comm;
    ogg_packet header_code;
      vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code);
    ogg_stream_packetin(&os,&header); /* automatically placed in its own
      page */
    ogg_stream_packetin(&os,&header_comm);
    ogg_stream_packetin(&os,&header_code);
   /* This ensures the actual
  * audio data will start on a new page, as per spec
  */
 while(!eos){
  int result=ogg_stream_flush(&os,&og);
  if(result==0)break;
  //fwrite(og.header,1,og.header_len,stdout);
  //fwrite(og.body,1,og.body_len,stdout);
  TPtr8 tempHeader(og.header, (TInt)og.header_len, (TInt)og.header_len);
  TPtr8 tempBody(og.body, (TInt)og.body_len, (TInt)og.body_len);
  iWriteFile.Write(tempHeader, (TInt)og.header_len);
  iWriteFile.Write(tempBody, (TInt)og.body_len);
 }
    }
  
  while(!eos){
    long i;
    //long bytes=fread(readbuffer,1,READ*4,stdin); /* stereo hardwired here */
 
 TBuf8<4096> readBuffer;
 TInt err = iReadFile.Read(iCurrentPosition, readBuffer, 4096);
 if(err == KErrNone)
  {
  iCurrentPosition = iCurrentPosition + readBuffer.Length();
  }
    TInt bytes = readBuffer.Length();
    if(bytes==0){
      /* end of file.  this can be done implicitly in the mainline,
         but it's easier to see here in non-clever fashion.
         Tell the library we're at end of stream so that it can handle
         the last frame and mark end of stream in the output properly */
      vorbis_analysis_wrote(&vd,0);
      }else{
      /* data to encode */
        /* expose the buffer to submit data */
      float **buffer=vorbis_analysis_buffer(&vd,1024);
      
      /* uninterleave samples */
      for(i=0;i<bytes/4;i++){
 buffer[0][i]=((readBuffer[i*4+1]<<8)|
        (0x00ff&(int)readBuffer[i*4]))/32768.f;
 buffer[1][i]=((readBuffer[i*4+3]<<8)|
        (0x00ff&(int)readBuffer[i*4+2]))/32768.f;
      }
    
      /* tell the library how much we actually submitted */
      vorbis_analysis_wrote(&vd,i);
    }
      /* vorbis does some data preanalysis, then divvies up blocks for
       more involved (potentially parallel) processing.  Get a single
       block for encoding now */
    while(vorbis_analysis_blockout(&vd,&vb)==1){
        /* analysis, assume we want to use bitrate management */
      vorbis_analysis(&vb,NULL);
      vorbis_bitrate_addblock(&vb);
        while(vorbis_bitrate_flushpacket(&vd,&op)){
 
 /* weld the packet into the bitstream */
 ogg_stream_packetin(&os,&op);
 
 /* write out pages (if any) */
 while(!eos){
   int result=ogg_stream_pageout(&os,&og);
   if(result==0)break;
   //fwrite(og.header,1,og.header_len,stdout);
   //fwrite(og.body,1,og.body_len,stdout);
   TPtr8 tempHeader(og.header, (TInt)og.header_len, (TInt)og.header_len);
   TPtr8 tempBody(og.body, (TInt)og.body_len, (TInt)og.body_len);
   iWriteFile.Write(tempHeader, (TInt)og.header_len);
   iWriteFile.Write(tempBody, (TInt)og.body_len);
   /* this could be set above, but for illustrative purposes, I do
      it here (to show that vorbis does know where the stream ends) */
   
   if(ogg_page_eos(&og))eos=1;
 }
      }
    }
  }

regards,
  Pavan.
  
Ian Malone <ibm21 at cam.ac.uk> wrote:
  pavan kumar wrote:
> Hi All,
> 
> It would be really helpful for me if you comment on the following.
> My VorbisEncoder uses libvorbis to encode into the vorbis data. I have 
> followed the call sequence given in libvorbis\examples\encoder_example.c.
> I am taking a 16bit pcm Stereo wav file and generating an oggvorbis file 
> using libvorbis and libogg. There is lots of noise in the file except 
> music is heard very feable in the background. To compare, I have created 
> an ogg file with the same configuration(same quality) using GoldWav. I 
> have observed that even the headerpages differ from the file i have 
> generated.
> I am using TInt ret=vorbis_encode_init_vbr(&iInfo,2,44100,.4); for the setup
> 



> give me an example which you are sure that it is working without any 
> modification.
> 

I'm afraid I haven't used the encoder enough to be of much help. If
everything is right encoder_example.c should work without modification.
You're not having endianness issues are you (IIRC the example encoder
is written to handle 16 bit LE)? Have you tried other wav files?
Is GoldWav using the same versions of libvorbis and libogg (I wouldn't
be very surprised by differences in headers if it used different
versions)?

-- 
imalone
_______________________________________________
Vorbis mailing list
Vorbis at xiph.org
http://lists.xiph.org/mailman/listinfo/vorbis
  


Send instant messages to your online friends http://in.messenger.yahoo.com 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.xiph.org/pipermail/vorbis/attachments/20060112/8cf6a3ce/attachment.htm


More information about the Vorbis mailing list