/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.rtmp.netty;
import java.nio.ByteBuffer;
import com.ttProject.rtmp.header.HeaderType;
import com.ttProject.rtmp.header.IRtmpHeader;
import com.ttProject.rtmp.message.IRtmpMessage;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
/**
* RtmpEncoder
* @author taktod
* make ByteBuf data from IRtmpMessage.
*/
public class RtmpEncoder extends ChannelOutboundHandlerAdapter {
private int chunkSize = 128;
/**
* {@inheritDoc}
*/
@Override
public void write(ChannelHandlerContext ctx, Object msg,
ChannelPromise promise) throws Exception {
if(msg instanceof IRtmpMessage) {
IRtmpMessage message = (IRtmpMessage)msg;
IRtmpHeader header = message.getHeader();
ByteBuffer body = message.getData();
header.setSize(body.remaining());
boolean isFirst = true;
do {
int size = (body.remaining() > chunkSize ? chunkSize : body.remaining());
byte[] data = new byte[size];
body.get(data);
if(isFirst) {
ctx.write(Unpooled.wrappedBuffer(header.getData()));
isFirst = false;
}
else {
ctx.write(Unpooled.wrappedBuffer(header.switchTo(HeaderType.Type3).getData()));
}
ctx.write(Unpooled.wrappedBuffer(data));
}while(body.remaining() > 0);
}
}
}