/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.rtmp.header; import java.nio.ByteBuffer; import com.ttProject.rtmp.header.type.Type0; import com.ttProject.rtmp.header.type.Type1; import com.ttProject.rtmp.header.type.Type2; import com.ttProject.rtmp.header.type.Type3; import com.ttProject.rtmp.message.MessageType; /** * RtmpHeader * @author taktod */ public abstract class RtmpHeader implements IRtmpHeader { private final HeaderType headerType; private int csId; private int deltaTime = 0; private long time = 0; // possible to exceeed max of integer. Then, use long for hold. private int size = 0; private MessageType messageType; private int streamId = 0; /** * constructor * @param type */ public RtmpHeader(HeaderType type) { headerType = type; } @Override public boolean isMedia() { return isVideo() || isAudio() || isAggregate(); } @Override public boolean isMetaData() { MessageType type = getMessageType(); return type == MessageType.AMF3_DATA_MESSAGE || type == MessageType.AMF0_DATA_MESSAGE; } @Override public boolean isAggregate() { return getMessageType() == MessageType.AGGREGATE_MESSAGE; } @Override public boolean isAudio() { return getMessageType() == MessageType.AUDIO_MESSAGE; } @Override public boolean isVideo() { return getMessageType() == MessageType.VIDEO_MESSAGE; } @Override public boolean isControl() { return getMessageType() == MessageType.USER_CONTROL_MESSAGE; } @Override public boolean isChunkSize() { return getMessageType() == MessageType.SET_CHUNK_SIZE; } @Override public void setCsId(int csId) { this.csId = csId; } @Override public int getCsId() { return csId; } @Override public long getTime() { return time; } @Override public MessageType getMessageType() { return messageType; } @Override public int getStreamId() { return streamId; } @Override public int getSize() { return size; } @Override public int getDeltaTime() { return deltaTime; } @Override public IRtmpHeader switchTo(HeaderType type) throws Exception { if(type == headerType) { return this; } RtmpHeader result = null; switch(type) { case Type0: result = new Type0(); break; case Type1: result = new Type1(); break; case Type2: result = new Type2(); break; case Type3: result = new Type3(); break; default: throw new Exception(); } result.csId = csId; result.deltaTime = deltaTime; result.messageType = messageType; result.size = size; result.streamId = streamId; result.time = time; return result; } protected void setMessageType(MessageType type) { this.messageType = type; } @Override public void setTime(long time) { this.time = time; } public void setSize(int size) { this.size = size; } public void setStreamId(int id) { this.streamId = id; } protected void setDeltaTime(int deltaTime) { this.deltaTime = deltaTime; } protected ByteBuffer getHeaderTypeChunkStreamIdBytes() { ByteBuffer result = null; if(csId <= 63) { result = ByteBuffer.allocate(1); result.put((byte)((headerType.intValue() << 6) | csId)); } else if(csId <= 320) { result = ByteBuffer.allocate(2); result.put((byte)(headerType.intValue() << 6)); result.put((byte)(csId - 64)); } else { result = ByteBuffer.allocate(3); result.put((byte)((headerType.intValue() << 6) | 1)); result.putShort((short)(csId - 64)); } result.flip(); return result; } }