package com.laifeng.sopcastsdk.stream.sender.rtmp.io;
import com.laifeng.sopcastsdk.stream.sender.rtmp.packets.ChunkHeader;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Title: SessionInfo
* @Package com.jimfengfly.rtmppublisher.packets
* @Description:
* @Author Jim
* @Date 2016/11/29
* @Time 上午10:49
* @Version
*/
public class SessionInfo {
public static final byte RTMP_STREAM_CHANNEL = 0x05;
public static final byte RTMP_COMMAND_CHANNEL = 0x03;
public static final byte RTMP_VIDEO_CHANNEL = 0x06;
public static final byte RTMP_AUDIO_CHANNEL = 0x07;
public static final byte RTMP_CONTROL_CHANNEL = 0x02;
/** The window acknowledgement size for this RTMP session, in bytes; default to max to avoid unnecessary "Acknowledgment" messages from being sent */
private int acknowledgementWindowSize = Integer.MAX_VALUE;
/** Used internally to store the total number of bytes read (used when sending Acknowledgement messages) */
private int totalBytesRead = 0;
/** Default chunk size is 128 bytes */
private int rxChunkSize = 128;
private int txChunkSize = 128;
private Map<Integer, ChunkHeader> chunkReceiveChannels = new HashMap<>();
private Map<Integer, ChunkHeader> chunkSendChannels = new HashMap<>();
private Map<Integer, String> invokedMethods = new ConcurrentHashMap<>();
public ChunkHeader getPreReceiveChunkHeader(int chunkStreamId) {
return chunkReceiveChannels.get(chunkStreamId);
}
public void putPreReceiveChunkHeader(int chunkStreamId, ChunkHeader chunkHeader) {
chunkReceiveChannels.put(chunkStreamId, chunkHeader);
}
public ChunkHeader getPreSendChunkHeader(int chunkStreamId) {
return chunkSendChannels.get(chunkStreamId);
}
public void putPreSendChunkHeader(int chunkStreamId, ChunkHeader chunkHeader) {
chunkSendChannels.put(chunkStreamId, chunkHeader);
}
public String takeInvokedCommand(int transactionId) {
return invokedMethods.remove(transactionId);
}
public String addInvokedCommand(int transactionId, String commandName) {
return invokedMethods.put(transactionId, commandName);
}
public int getRxChunkSize() {
return rxChunkSize;
}
public void setRxChunkSize(int chunkSize) {
this.rxChunkSize = chunkSize;
}
public int getTxChunkSize() {
return txChunkSize;
}
public void setTxChunkSize(int chunkSize) {
this.txChunkSize = chunkSize;
}
public int getAcknowledgementWindowSize() {
return acknowledgementWindowSize;
}
public void setAcknowledgmentWindowSize(int acknowledgementWindowSize) {
this.acknowledgementWindowSize = acknowledgementWindowSize;
}
private static long sessionBeginTimestamp;
/** Sets the session beginning timestamp for all chunks */
public static void markSessionTimestampTx() {
sessionBeginTimestamp = System.nanoTime() / 1000000;
}
/** Utility method for calculating & synchronizing transmitted timestamps */
public long markAbsoluteTimestampTx() {
return System.nanoTime() / 1000000 - sessionBeginTimestamp;
}
}