/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ /* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk<ymnk@jcraft.com> * * Many thanks to * Monty <monty@xiph.org> and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; public class Block{ ///necessary stream state for linking to the framing abstraction float[][] pcm=new float[0][]; // this is a pointer into local storage Buffer opb=new Buffer(); int lW; int W; int nW; int pcmend; int mode; int eofflag; long granulepos; long sequence; DspState vd; // For read-only access of configuration // bitmetrics for the frame int glue_bits; int time_bits; int floor_bits; int res_bits; public Block(DspState vd){ this.vd=vd; if(vd.analysisp!=0){ opb.writeinit(); } } public void init(DspState vd){ this.vd=vd; } public int clear(){ if(vd!=null){ if(vd.analysisp!=0){ opb.writeclear(); } } return (0); } public int synthesis(Packet op){ Info vi=vd.vi; // first things first. Make sure decode is ready opb.readinit(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 (-1); } // read our mode and pre/post windowsize int _mode=opb.read(vd.modebits); if(_mode==-1) return (-1); mode=_mode; W=vi.mode_param[mode].blockflag; if(W!=0){ lW=opb.read(1); nW=opb.read(1); if(nW==-1) return (-1); } else{ lW=0; nW=0; } // more setup granulepos=op.granulepos; sequence=op.packetno-3; // first block is third packet eofflag=op.e_o_s; // alloc pcm passback storage pcmend=vi.blocksizes[W]; if(pcm.length<vi.channels){ pcm=new float[vi.channels][]; } for(int i=0; i<vi.channels; i++){ if(pcm[i]==null||pcm[i].length<pcmend){ pcm[i]=new float[pcmend]; } else{ for(int j=0; j<pcmend; j++){ pcm[i][j]=0; } } } // unpack_header enforces range checking int type=vi.map_type[vi.mode_param[mode].mapping]; return (FuncMapping.mapping_P[type].inverse(this, vd.mode[mode])); } }