/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.frame.vp8;
import org.apache.log4j.Logger;
import com.ttProject.frame.VideoSelector;
import com.ttProject.frame.vp8.type.IntraFrame;
import com.ttProject.frame.vp8.type.KeyFrame;
import com.ttProject.nio.channels.IReadChannel;
import com.ttProject.unit.IUnit;
import com.ttProject.unit.extra.BitLoader;
import com.ttProject.unit.extra.bit.Bit1;
import com.ttProject.unit.extra.bit.Bit19;
import com.ttProject.unit.extra.bit.Bit3;
/**
* selector for vp8 frame.
* @author taktod
*/
public class Vp8FrameSelector extends VideoSelector {
/** logger */
@SuppressWarnings("unused")
private Logger logger = Logger.getLogger(Vp8FrameSelector.class);
/** key frame for ref. */
private KeyFrame keyFrame = null;
/**
* {@inheritDoc}
*/
@Override
public IUnit select(IReadChannel channel) throws Exception {
if(channel.position() == channel.size()) {
return null;
}
// get frameType version showframe firstPartsSize from first 3 bytes.
BitLoader loader = new BitLoader(channel);
loader.setLittleEndianFlg(true);
Bit1 frameType = new Bit1();
Bit3 version = new Bit3();
Bit1 showFrame = new Bit1();
Bit19 firstPartSize = new Bit19();
loader.load(frameType, version, showFrame, firstPartSize);
Vp8Frame frame = null;
switch(frameType.get()) {
case 0: // keyFrame
frame = new KeyFrame(frameType, version, showFrame, firstPartSize);
keyFrame = (KeyFrame)frame;
break;
case 1: // intraFrame
if(keyFrame == null) {
return null;
}
frame = new IntraFrame(frameType, version, showFrame, firstPartSize);
frame.setKeyFrame(keyFrame);
break;
default:
throw new Exception("unexpected frameType:" + frameType.get());
}
frame.minimumLoad(channel);
return frame;
}
}