package com.laifeng.sopcastsdk.stream.sender.rtmp.packets; import com.laifeng.sopcastsdk.stream.sender.rtmp.io.SessionInfo; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * * @author francois, leo */ public abstract class Chunk { protected ChunkHeader header; public Chunk(ChunkHeader header) { this.header = header; } public ChunkHeader getChunkHeader() { return header; } public abstract void readBody(InputStream in) throws IOException; protected abstract void writeBody(OutputStream out) throws IOException; public void writeTo(OutputStream out, final SessionInfo sessionInfo) throws IOException { int chunkSize = sessionInfo.getTxChunkSize(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); writeBody(baos); byte[] body = baos.toByteArray(); header.setPacketLength(body.length); // Write header for first chunk header.writeTo(out, ChunkType.TYPE_0_FULL, sessionInfo); int remainingBytes = body.length; int pos = 0; while (remainingBytes > chunkSize) { // Write packet for chunk out.write(body, pos, chunkSize); remainingBytes -= chunkSize; pos += chunkSize; // Write header for remain chunk header.writeTo(out, ChunkType.TYPE_3_NO_BYTE, sessionInfo); } out.write(body, pos, remainingBytes); } }