1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.authoring.tracks; 2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.boxes.*; 4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.boxes.sampleentry.AudioSampleEntry; 5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.authoring.AbstractTrack; 6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.authoring.TrackMetaData; 7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.boxes.AC3SpecificBox; 8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.boxes.mp4.objectdescriptors.BitReaderBuffer; 9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.InputStream; 11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException; 12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer; 13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.Date; 14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.LinkedList; 15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.List; 16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class AC3TrackImpl extends AbstractTrack { 18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu TrackMetaData trackMetaData = new TrackMetaData(); 19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu SampleDescriptionBox sampleDescriptionBox; 20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int samplerate; 22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int bitrate; 23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int channelCount; 24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int fscod; 26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int bsid; 27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int bsmod; 28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int acmod; 29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int lfeon; 30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int frmsizecod; 31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int frameSize; 33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int[][][][] bitRateAndFrameSizeTable; 34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private InputStream inputStream; 36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private List<ByteBuffer> samples; 37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu boolean readSamples = false; 38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu List<TimeToSampleBox.Entry> stts; 39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private String lang = "und"; 40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public AC3TrackImpl(InputStream fin, String lang) throws IOException { 42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu this.lang = lang; 43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu parse(fin); 44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public AC3TrackImpl(InputStream fin) throws IOException { 47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu parse(fin); 48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private void parse(InputStream fin) throws IOException { 51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu inputStream = fin; 52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable = new int[19][2][3][2]; 53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu stts = new LinkedList<TimeToSampleBox.Entry>(); 54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu initBitRateAndFrameSizeTable(); 55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (!readVariables()) { 56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throw new IOException(); 57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sampleDescriptionBox = new SampleDescriptionBox(); 60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu AudioSampleEntry audioSampleEntry = new AudioSampleEntry("ac-3"); 61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu audioSampleEntry.setChannelCount(2); // According to ETSI TS 102 366 Annex F 62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu audioSampleEntry.setSampleRate(samplerate); 63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu audioSampleEntry.setDataReferenceIndex(1); 64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu audioSampleEntry.setSampleSize(16); 65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu AC3SpecificBox ac3 = new AC3SpecificBox(); 67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ac3.setAcmod(acmod); 68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ac3.setBitRateCode(frmsizecod >> 1); 69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ac3.setBsid(bsid); 70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ac3.setBsmod(bsmod); 71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ac3.setFscod(fscod); 72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ac3.setLfeon(lfeon); 73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ac3.setReserved(0); 74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu audioSampleEntry.addBox(ac3); 76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sampleDescriptionBox.addBox(audioSampleEntry); 77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu trackMetaData.setCreationTime(new Date()); 79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu trackMetaData.setModificationTime(new Date()); 80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu trackMetaData.setLanguage(lang); 81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu trackMetaData.setTimescale(samplerate); // Audio tracks always use samplerate as timescale 82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu samples = new LinkedList<ByteBuffer>(); 84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (!readSamples()) { 85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throw new IOException(); 86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public List<ByteBuffer> getSamples() { 91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return samples; 93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public SampleDescriptionBox getSampleDescriptionBox() { 96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return sampleDescriptionBox; 97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public List<TimeToSampleBox.Entry> getDecodingTimeEntries() { 100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return stts; 101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public List<CompositionTimeToSample.Entry> getCompositionTimeEntries() { 104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return null; 105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public long[] getSyncSamples() { 108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return null; 109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public List<SampleDependencyTypeBox.Entry> getSampleDependencies() { 112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return null; 113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public TrackMetaData getTrackMetaData() { 116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return trackMetaData; 117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public String getHandler() { 120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return "soun"; 121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public Box getMediaHeaderBox() { 124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return new SoundMediaHeaderBox(); 125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public SubSampleInformationBox getSubsampleInformationBox() { 128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return null; 129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private boolean readVariables() throws IOException { 132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu byte[] data = new byte[100]; 133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu inputStream.mark(100); 134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (100 != inputStream.read(data, 0, 100)) { 135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return false; 136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 137dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu inputStream.reset(); // Rewind 138dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ByteBuffer bb = ByteBuffer.wrap(data); 139dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu BitReaderBuffer brb = new BitReaderBuffer(bb); 140dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int syncword = brb.readBits(16); 141dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (syncword != 0xb77) { 142dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return false; 143dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 144dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu brb.readBits(16); // CRC-1 145dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu fscod = brb.readBits(2); 146dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 147dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu switch (fscod) { 148dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 0: 149dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu samplerate = 48000; 150dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 151dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 152dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 1: 153dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu samplerate = 44100; 154dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 155dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 156dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 2: 157dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu samplerate = 32000; 158dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 159dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 160dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 3: 161dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu samplerate = 0; 162dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 163dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 164dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 165dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (samplerate == 0) { 166dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return false; 167dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 168dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 169dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu frmsizecod = brb.readBits(6); 170dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 171dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (!calcBitrateAndFrameSize(frmsizecod)) { 172dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return false; 173dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 174dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 175dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (frameSize == 0) { 176dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return false; 177dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 178dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bsid = brb.readBits(5); 179dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bsmod = brb.readBits(3); 180dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu acmod = brb.readBits(3); 181dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 182dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (bsid == 9) { 183dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu samplerate /= 2; 184dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else if (bsid != 8 && bsid != 6) { 185dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return false; 186dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 187dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 188dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if ((acmod != 1) && ((acmod & 1) == 1)) { 189dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu brb.readBits(2); 190dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 191dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 192dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (0 != (acmod & 4)) { 193dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu brb.readBits(2); 194dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 195dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 196dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (acmod == 2) { 197dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu brb.readBits(2); 198dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 199dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 200dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu switch (acmod) { 201dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 0: 202dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount = 2; 203dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 204dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 205dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 1: 206dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount = 1; 207dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 208dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 209dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 2: 210dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount = 2; 211dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 212dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 213dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 3: 214dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount = 3; 215dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 216dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 217dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 4: 218dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount = 3; 219dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 220dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 221dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 5: 222dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount = 4; 223dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 224dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 225dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 6: 226dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount = 4; 227dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 228dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 229dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu case 7: 230dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount = 5; 231dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 232dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 233dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 234dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 235dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu lfeon = brb.readBits(1); 236dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 237dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (lfeon == 1) { 238dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu channelCount++; 239dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 240dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return true; 241dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 242dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 243dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private boolean calcBitrateAndFrameSize(int code) { 244dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int frmsizecode = code >>> 1; 245dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int flag = code & 1; 246dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (frmsizecode > 18 || flag > 1 || fscod > 2) { 247dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return false; 248dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 249dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitrate = bitRateAndFrameSizeTable[frmsizecode][flag][fscod][0]; 250dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu frameSize = 2 * bitRateAndFrameSizeTable[frmsizecode][flag][fscod][1]; 251dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return true; 252dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 253dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 254dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private boolean readSamples() throws IOException { 255dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (readSamples) { 256dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return true; 257dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 258dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu readSamples = true; 259dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu byte[] header = new byte[5]; 260dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu boolean ret = false; 261dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu inputStream.mark(5); 262dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu while (-1 != inputStream.read(header)) { 263dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ret = true; 264dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int frmsizecode = header[4] & 63; 265dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu calcBitrateAndFrameSize(frmsizecode); 266dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu inputStream.reset(); 267dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu byte[] data = new byte[frameSize]; 268dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu inputStream.read(data); 269dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu samples.add(ByteBuffer.wrap(data)); 270dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu stts.add(new TimeToSampleBox.Entry(1, 1536)); 271dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu inputStream.mark(5); 272dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 273dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return ret; 274dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 275dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 276dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private void initBitRateAndFrameSizeTable() { 277dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu // ETSI 102 366 Table 4.13, in frmsizecod, flag, fscod, bitrate/size order. Note that all sizes are in words, and all bitrates in kbps 278dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 279dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu // 48kHz 280dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][0][0][0] = 32; 281dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][1][0][0] = 32; 282dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][0][0][1] = 64; 283dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][1][0][1] = 64; 284dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][0][0][0] = 40; 285dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][1][0][0] = 40; 286dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][0][0][1] = 80; 287dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][1][0][1] = 80; 288dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][0][0][0] = 48; 289dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][1][0][0] = 48; 290dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][0][0][1] = 96; 291dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][1][0][1] = 96; 292dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][0][0][0] = 56; 293dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][1][0][0] = 56; 294dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][0][0][1] = 112; 295dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][1][0][1] = 112; 296dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][0][0][0] = 64; 297dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][1][0][0] = 64; 298dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][0][0][1] = 128; 299dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][1][0][1] = 128; 300dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][0][0][0] = 80; 301dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][1][0][0] = 80; 302dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][0][0][1] = 160; 303dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][1][0][1] = 160; 304dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][0][0][0] = 96; 305dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][1][0][0] = 96; 306dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][0][0][1] = 192; 307dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][1][0][1] = 192; 308dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][0][0][0] = 112; 309dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][1][0][0] = 112; 310dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][0][0][1] = 224; 311dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][1][0][1] = 224; 312dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][0][0][0] = 128; 313dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][1][0][0] = 128; 314dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][0][0][1] = 256; 315dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][1][0][1] = 256; 316dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][0][0][0] = 160; 317dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][1][0][0] = 160; 318dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][0][0][1] = 320; 319dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][1][0][1] = 320; 320dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][0][0][0] = 192; 321dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][1][0][0] = 192; 322dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][0][0][1] = 384; 323dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][1][0][1] = 384; 324dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][0][0][0] = 224; 325dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][1][0][0] = 224; 326dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][0][0][1] = 448; 327dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][1][0][1] = 448; 328dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][0][0][0] = 256; 329dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][1][0][0] = 256; 330dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][0][0][1] = 512; 331dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][1][0][1] = 512; 332dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][0][0][0] = 320; 333dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][1][0][0] = 320; 334dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][0][0][1] = 640; 335dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][1][0][1] = 640; 336dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][0][0][0] = 384; 337dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][1][0][0] = 384; 338dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][0][0][1] = 768; 339dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][1][0][1] = 768; 340dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][0][0][0] = 448; 341dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][1][0][0] = 448; 342dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][0][0][1] = 896; 343dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][1][0][1] = 896; 344dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][0][0][0] = 512; 345dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][1][0][0] = 512; 346dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][0][0][1] = 1024; 347dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][1][0][1] = 1024; 348dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][0][0][0] = 576; 349dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][1][0][0] = 576; 350dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][0][0][1] = 1152; 351dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][1][0][1] = 1152; 352dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][0][0][0] = 640; 353dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][1][0][0] = 640; 354dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][0][0][1] = 1280; 355dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][1][0][1] = 1280; 356dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 357dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu // 44.1 kHz 358dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][0][1][0] = 32; 359dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][1][1][0] = 32; 360dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][0][1][1] = 69; 361dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][1][1][1] = 70; 362dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][0][1][0] = 40; 363dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][1][1][0] = 40; 364dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][0][1][1] = 87; 365dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][1][1][1] = 88; 366dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][0][1][0] = 48; 367dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][1][1][0] = 48; 368dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][0][1][1] = 104; 369dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][1][1][1] = 105; 370dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][0][1][0] = 56; 371dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][1][1][0] = 56; 372dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][0][1][1] = 121; 373dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][1][1][1] = 122; 374dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][0][1][0] = 64; 375dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][1][1][0] = 64; 376dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][0][1][1] = 139; 377dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][1][1][1] = 140; 378dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][0][1][0] = 80; 379dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][1][1][0] = 80; 380dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][0][1][1] = 174; 381dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][1][1][1] = 175; 382dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][0][1][0] = 96; 383dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][1][1][0] = 96; 384dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][0][1][1] = 208; 385dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][1][1][1] = 209; 386dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][0][1][0] = 112; 387dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][1][1][0] = 112; 388dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][0][1][1] = 243; 389dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][1][1][1] = 244; 390dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][0][1][0] = 128; 391dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][1][1][0] = 128; 392dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][0][1][1] = 278; 393dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][1][1][1] = 279; 394dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][0][1][0] = 160; 395dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][1][1][0] = 160; 396dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][0][1][1] = 348; 397dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][1][1][1] = 349; 398dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][0][1][0] = 192; 399dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][1][1][0] = 192; 400dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][0][1][1] = 417; 401dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][1][1][1] = 418; 402dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][0][1][0] = 224; 403dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][1][1][0] = 224; 404dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][0][1][1] = 487; 405dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][1][1][1] = 488; 406dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][0][1][0] = 256; 407dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][1][1][0] = 256; 408dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][0][1][1] = 557; 409dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][1][1][1] = 558; 410dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][0][1][0] = 320; 411dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][1][1][0] = 320; 412dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][0][1][1] = 696; 413dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][1][1][1] = 697; 414dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][0][1][0] = 384; 415dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][1][1][0] = 384; 416dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][0][1][1] = 835; 417dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][1][1][1] = 836; 418dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][0][1][0] = 448; 419dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][1][1][0] = 448; 420dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][0][1][1] = 975; 421dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][1][1][1] = 975; 422dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][0][1][0] = 512; 423dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][1][1][0] = 512; 424dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][0][1][1] = 1114; 425dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][1][1][1] = 1115; 426dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][0][1][0] = 576; 427dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][1][1][0] = 576; 428dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][0][1][1] = 1253; 429dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][1][1][1] = 1254; 430dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][0][1][0] = 640; 431dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][1][1][0] = 640; 432dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][0][1][1] = 1393; 433dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][1][1][1] = 1394; 434dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 435dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu // 32kHz 436dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][0][2][0] = 32; 437dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][1][2][0] = 32; 438dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][0][2][1] = 96; 439dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[0][1][2][1] = 96; 440dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][0][2][0] = 40; 441dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][1][2][0] = 40; 442dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][0][2][1] = 120; 443dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[1][1][2][1] = 120; 444dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][0][2][0] = 48; 445dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][1][2][0] = 48; 446dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][0][2][1] = 144; 447dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[2][1][2][1] = 144; 448dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][0][2][0] = 56; 449dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][1][2][0] = 56; 450dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][0][2][1] = 168; 451dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[3][1][2][1] = 168; 452dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][0][2][0] = 64; 453dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][1][2][0] = 64; 454dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][0][2][1] = 192; 455dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[4][1][2][1] = 192; 456dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][0][2][0] = 80; 457dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][1][2][0] = 80; 458dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][0][2][1] = 240; 459dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[5][1][2][1] = 240; 460dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][0][2][0] = 96; 461dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][1][2][0] = 96; 462dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][0][2][1] = 288; 463dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[6][1][2][1] = 288; 464dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][0][2][0] = 112; 465dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][1][2][0] = 112; 466dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][0][2][1] = 336; 467dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[7][1][2][1] = 336; 468dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][0][2][0] = 128; 469dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][1][2][0] = 128; 470dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][0][2][1] = 384; 471dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[8][1][2][1] = 384; 472dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][0][2][0] = 160; 473dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][1][2][0] = 160; 474dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][0][2][1] = 480; 475dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[9][1][2][1] = 480; 476dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][0][2][0] = 192; 477dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][1][2][0] = 192; 478dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][0][2][1] = 576; 479dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[10][1][2][1] = 576; 480dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][0][2][0] = 224; 481dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][1][2][0] = 224; 482dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][0][2][1] = 672; 483dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[11][1][2][1] = 672; 484dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][0][2][0] = 256; 485dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][1][2][0] = 256; 486dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][0][2][1] = 768; 487dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[12][1][2][1] = 768; 488dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][0][2][0] = 320; 489dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][1][2][0] = 320; 490dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][0][2][1] = 960; 491dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[13][1][2][1] = 960; 492dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][0][2][0] = 384; 493dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][1][2][0] = 384; 494dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][0][2][1] = 1152; 495dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[14][1][2][1] = 1152; 496dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][0][2][0] = 448; 497dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][1][2][0] = 448; 498dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][0][2][1] = 1344; 499dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[15][1][2][1] = 1344; 500dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][0][2][0] = 512; 501dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][1][2][0] = 512; 502dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][0][2][1] = 1536; 503dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[16][1][2][1] = 1536; 504dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][0][2][0] = 576; 505dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][1][2][0] = 576; 506dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][0][2][1] = 1728; 507dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[17][1][2][1] = 1728; 508dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][0][2][0] = 640; 509dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][1][2][0] = 640; 510dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][0][2][1] = 1920; 511dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bitRateAndFrameSizeTable[18][1][2][1] = 1920; 512dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 513dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}