/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.frame.vp6.type;
import java.nio.ByteBuffer;
import com.ttProject.frame.vp6.Vp6Frame;
import com.ttProject.nio.channels.IReadChannel;
import com.ttProject.unit.extra.BitConnector;
import com.ttProject.unit.extra.BitLoader;
import com.ttProject.unit.extra.bit.Bit16;
import com.ttProject.unit.extra.bit.Bit1;
import com.ttProject.unit.extra.bit.Bit2;
import com.ttProject.unit.extra.bit.Bit5;
import com.ttProject.unit.extra.bit.Bit6;
import com.ttProject.unit.extra.bit.Bit8;
import com.ttProject.util.BufferUtil;
/**
* keyFrame for vp6
* @author taktod
*/
public class IntraFrame extends Vp6Frame {
private Bit5 version = new Bit5();
private Bit2 version2 = new Bit2();
private Bit1 interlace = new Bit1();
private Bit16 offset = null; // 16bit
private Bit8 dimY = new Bit8(); // x16 height
private Bit8 dimX = new Bit8(); // x16 width
private Bit8 renderY = new Bit8(); // x16 height
private Bit8 renderX = new Bit8(); // x16 width
private ByteBuffer buffer = null;
/**
* constructor
*/
public IntraFrame(Bit1 frameMode, Bit6 qp, Bit1 marker) {
super(frameMode, qp, marker);
super.setKeyFrame(true);
}
/**
* {@inheritDoc}
*/
@Override
public void minimumLoad(IReadChannel channel) throws Exception {
BitLoader loader = new BitLoader(channel);
loader.load(version, version2, interlace);
if(version2.get() == 0 || getMarker().get() == 1) {
offset = new Bit16();
loader.load(offset);
}
loader.load(dimY, dimX, renderY, renderX);
super.setWidth(dimX.get() * 16);
super.setHeight(dimY.get() * 16);
super.setReadPosition(channel.position());
super.setSize(channel.size());
super.update();
}
/**
* {@inheritDoc}
*/
@Override
public void load(IReadChannel channel) throws Exception {
channel.position(super.getReadPosition());
buffer = BufferUtil.safeRead(channel, getSize() - getReadPosition());
}
/**
* {@inheritDoc}
*/
@Override
protected void requestUpdate() throws Exception {
if(buffer == null) {
throw new Exception("buffer is not loaded yet.");
}
BitConnector connector = new BitConnector();
setData(BufferUtil.connect(getHeaderBuffer(),
connector.connect(version, version2,
interlace, offset,
dimY, dimX, renderY, renderX),
buffer));
}
/**
* ref the data type. version2?
* @return
*/
public Bit2 getVersion2() {
return version2;
}
/**
* {@inheritDoc}
*/
@Override
public ByteBuffer getPackBuffer() throws Exception {
return getData();
}
}