// @VisibleForTesting /* package */ VorbisSetup readSetupHeaders(ExtractorInput input, ParsableByteArray scratch) throws IOException, InterruptedException { if (vorbisIdHeader == null) { oggReader.readPacket(input, scratch); vorbisIdHeader = VorbisUtil.readVorbisIdentificationHeader(scratch); scratch.reset(); } if (commentHeader == null) { oggReader.readPacket(input, scratch); commentHeader = VorbisUtil.readVorbisCommentHeader(scratch); scratch.reset(); } oggReader.readPacket(input, scratch); // the third packet contains the setup header byte[] setupHeaderData = new byte[scratch.limit()]; // raw data of vorbis setup header has to be passed to decoder as CSD buffer #2 System.arraycopy(scratch.data, 0, setupHeaderData, 0, scratch.limit()); // partially decode setup header to get the modes Mode[] modes = VorbisUtil.readVorbisModes(scratch, vorbisIdHeader.channels); // we need the ilog of modes all the time when extracting, so we compute it once int iLogModes = VorbisUtil.iLog(modes.length - 1); scratch.reset(); return new VorbisSetup(vorbisIdHeader, commentHeader, setupHeaderData, modes, iLogModes); }
private static int decodeBlockSize(byte firstByteOfAudioPacket, VorbisSetup vorbisSetup) { // read modeNumber (https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-730004.3.1) int modeNumber = VorbisUtil.readBits(firstByteOfAudioPacket, vorbisSetup.iLogModes, 1); int currentBlockSize; if (!vorbisSetup.modes[modeNumber].blockFlag) { currentBlockSize = vorbisSetup.idHeader.blockSize0; } else { currentBlockSize = vorbisSetup.idHeader.blockSize1; } return currentBlockSize; }