/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.frame.vp6;
import org.apache.log4j.Logger;
import com.ttProject.frame.VideoSelector;
import com.ttProject.frame.vp6.type.InterFrame;
import com.ttProject.frame.vp6.type.IntraFrame;
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.Bit6;
/**
* selector for vp6 frame.
* @author taktod
*/
public class Vp6FrameSelector extends VideoSelector {
/** logger */
private Logger logger = Logger.getLogger(Vp6FrameSelector.class);
/** hold keyframe and share this. */
private IntraFrame keyFrame = null;
/**
* {@inheritDoc}
*/
@Override
public IUnit select(IReadChannel channel) throws Exception {
// read first byte for check.
if(channel.size() - channel.position() < 1) {
// data is too short.
return null;
}
Bit1 frameMode = new Bit1();
Bit6 qp = new Bit6();
Bit1 marker = new Bit1();
BitLoader loader = new BitLoader(channel);
loader.load(frameMode, qp, marker);
Vp6Frame frame = null;
switch(frameMode.get()) {
case 1: // interFrame
frame = new InterFrame(frameMode, qp, marker);
break;
case 0: // intraFrame(keyFrame)
frame = new IntraFrame(frameMode, qp, marker);
keyFrame = (IntraFrame)frame;
break;
default:
throw new Exception("unexpected frameMode.:" + frameMode.get());
}
if(keyFrame == null) {
logger.info("key frame is not loaded yet.");
return null;
}
setup(frame);
if(!(frame instanceof IntraFrame)) {
frame.setKeyFrame(keyFrame);
}
frame.minimumLoad(channel);
return frame;
}
}