package us.sosia.video.stream.handler.frame;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
public class FrameEncoder{
protected final int headLength;
public FrameEncoder(int headLength) {
super();
this.headLength = headLength;
}
public ChannelBuffer encode(ChannelBuffer channelBuffer) throws Exception {
int length = channelBuffer.readableBytes();
//System.out.println("message length :"+length);
ChannelBuffer header = ChannelBuffers.buffer(headLength);
//System.out.println(channelBuffer.order());
switch (headLength) {
case 1:
if (length >= 256) {
throw new IllegalArgumentException(
"length does not fit into a byte: " + length);
}
header.writeByte((byte) length);
break;
case 2:
if (length >= 65536) {
throw new IllegalArgumentException(
"length does not fit into a short integer: " + length);
}
header.writeShort((short) length);
break;
case 3:
if (length >= 16777216) {
throw new IllegalArgumentException(
"length does not fit into a medium integer: " + length);
}
header.writeMedium(length);
break;
case 4:
header.writeInt(length);
break;
case 8:
header.writeLong(length);
break;
default:
throw new Error("should not reach here");
}
return ChannelBuffers.wrappedBuffer(header,channelBuffer);
}
}