// The Vorbis header is in three packets; the initial small packet in // the first page that identifies basic parameters, a second packet // with bitstream comments and a third packet that holds the // codebook. public int synthesis_headerin(Comment vc, Packet op) { csBuffer opb=new csBuffer(); if(op!=null) { opb.ReadInitialize(op.packet_base, op.packet, op.bytes); // Which of the three types of header is this? // Also verify header-ness, vorbis { byte[] buffer=new byte[6]; int packtype=opb.Read(8); //memset(buffer,0,6); opb.Read(buffer,6); if(buffer[0]!='v' || buffer[1]!='o' || buffer[2]!='r' || buffer[3]!='b' || buffer[4]!='i' || buffer[5]!='s') { // not a vorbis header return(-1); } switch(packtype) { case 0x01: // least significant *bit* is read first if(op.b_o_s==0) { // Not the initial packet return(-1); } if(rate!=0) { // previously initialized info header return(-1); } return(unpack_info(opb)); case 0x03: // least significant *bit* is read first if(rate==0) { // um... we didn't get the initial header return(-1); } return(vc.unpack(opb)); case 0x05: // least significant *bit* is read first if(rate==0 || vc.vendor==null) { // um... we didn;t get the initial header or comments yet return(-1); } return(unpack_books(opb)); default: // Not a valid vorbis header type //return(-1); break; } } } return(-1); }
// static void v_writestring(csBuffer o, byte[] s){ // int i=0; // while(s[i]!=0){ // o.write(s[i++],8); // } // } // static void v_readstring(csBuffer o, byte[] buf, int bytes){ // int i=0 // while(bytes--!=0){ // buf[i++]=o.read(8); // } // } // private csBuffer opb_blocksize=new csBuffer(); public int blocksize(Packet op) { //codec_setup_info *ci=vi->codec_setup; csBuffer opb=new csBuffer(); // synchronized(opb_blocksize){ int mode; opb.ReadInitialize(op.packet_base, op.packet, op.bytes); /* Check the packet type */ if(opb.Read(1)!=0) { /* Oops. This is not an audio data packet */ return(OV_ENOTAUDIO); } { int modebits=0; int v=modes; while(v>1) { modebits++; v = (int)((uint)v >> 1); } /* read our mode and pre/post windowsize */ mode=opb.Read(modebits); } if(mode==-1)return(OV_EBADPACKET); return(blocksizes[mode_param[mode].blockflag]); // } }