/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.container.ogg; import java.util.HashMap; import java.util.Map; import com.ttProject.container.ogg.type.Page; import com.ttProject.container.ogg.type.StartPage; import com.ttProject.nio.channels.IReadChannel; import com.ttProject.unit.ISelector; import com.ttProject.unit.IUnit; import com.ttProject.unit.extra.BitLoader; import com.ttProject.unit.extra.bit.Bit1; import com.ttProject.unit.extra.bit.Bit5; import com.ttProject.unit.extra.bit.Bit8; import com.ttProject.util.BufferUtil; /** * analyze ogg pages. * @author taktod */ public class OggPageSelector implements ISelector { /** logger */ // private Logger logger = Logger.getLogger(OggPageSelector.class); /** startPageMap */ private Map<Integer, StartPage> startPageMap = new HashMap<Integer, StartPage>(); /** * {@inheritDoc} */ @Override public IUnit select(IReadChannel channel) throws Exception { if(channel.size() == channel.position()) { // no more data. return null; } // read first 4 byte check string(OggS) String pattern = new String(BufferUtil.safeRead(channel, 4).array()); if(!OggPage.capturePattern.equals(pattern)) { throw new Exception("OggS is not found."); } Bit8 version = new Bit8(); Bit1 packetContinurousFlag = new Bit1(); Bit1 logicStartFlag = new Bit1(); Bit1 logicEndFlag = new Bit1(); Bit5 zeroFill = new Bit5(); BitLoader loader = new BitLoader(channel); loader.setLittleEndianFlg(true); loader.load(version, packetContinurousFlag, logicStartFlag, logicEndFlag, zeroFill ); // make page OggPage page = null; if(logicStartFlag.get() == 1) { page = new StartPage(version, packetContinurousFlag, logicStartFlag, logicEndFlag, zeroFill); } else { page = new Page(version, packetContinurousFlag, logicStartFlag, logicEndFlag, zeroFill); } page.minimumLoad(channel); if(page instanceof StartPage) { startPageMap.put(page.getStreamSerialNumber(), (StartPage)page); } else { page.setStartPage(startPageMap.get(page.getStreamSerialNumber())); } return page; } }