[Red5commits] [1608] org.red5.io and org.red5.server.net.rtmp.codec documented and revised a bit
mklishin
luke at codegent.com
Wed Jan 24 11:06:02 EST 2007
org.red5.io and org.red5.server.net.rtmp.codec documented and revised a bit
Timestamp: 01/02/07 10:22:39 EST (3 weeks ago)
Change: 1608
Author: mklishin
Files (see diff or trac for details):
java/server/trunk/src/org/red5/io/IStreamableFileFactory.java
java/server/trunk/src/org/red5/io/IStreamableFileService.java
java/server/trunk/src/org/red5/io/ITagWriter.java
java/server/trunk/src/org/red5/io/IoConstants.java
java/server/trunk/src/org/red5/io/StreamableFileFactory.java
java/server/trunk/src/org/red5/io/amf/AMF.java
java/server/trunk/src/org/red5/io/amf/Input.java
java/server/trunk/src/org/red5/io/amf/Output.java
java/server/trunk/src/org/red5/io/amf3/AMF3.java
java/server/trunk/src/org/red5/io/amf3/Input.java
java/server/trunk/src/org/red5/io/filter/ExecutorFilter.java
java/server/trunk/src/org/red5/io/flv/FLVHeader.java
java/server/trunk/src/org/red5/io/flv/IFLV.java
java/server/trunk/src/org/red5/io/flv/IFLVService.java
java/server/trunk/src/org/red5/io/flv/IKeyFrameDataAnalyzer.java
java/server/trunk/src/org/red5/io/flv/impl/FLVReader.java
java/server/trunk/src/org/red5/io/flv/impl/FLVService.java
java/server/trunk/src/org/red5/io/flv/impl/FLVWriter.java
java/server/trunk/src/org/red5/io/flv/impl/Tag.java
java/server/trunk/src/org/red5/io/flv/meta/ICueType.java
java/server/trunk/src/org/red5/io/flv/meta/IMetaCue.java
java/server/trunk/src/org/red5/io/flv/meta/IMetaData.java
java/server/trunk/src/org/red5/io/flv/meta/IMetaService.java
java/server/trunk/src/org/red5/io/flv/meta/IResolver.java
java/server/trunk/src/org/red5/io/flv/meta/MetaData.java
java/server/trunk/src/org/red5/io/flv/meta/MetaService.java
java/server/trunk/src/org/red5/io/flv/meta/Resolver.java
java/server/trunk/src/org/red5/io/mp3/IMP3.java
java/server/trunk/src/org/red5/io/mp3/IMP3Service.java
java/server/trunk/src/org/red5/io/mp3/impl/MP3.java
java/server/trunk/src/org/red5/io/mp3/impl/MP3Header.java
java/server/trunk/src/org/red5/io/mp3/impl/MP3Service.java
java/server/trunk/src/org/red5/io/object/BaseInput.java
java/server/trunk/src/org/red5/io/object/BaseOutput.java
java/server/trunk/src/org/red5/io/object/DataTypes.java
java/server/trunk/src/org/red5/io/object/Input.java
java/server/trunk/src/org/red5/io/object/Output.java
java/server/trunk/src/org/red5/io/object/RecordSet.java
java/server/trunk/src/org/red5/io/object/RecordSetPage.java
java/server/trunk/src/org/red5/io/object/Serializer.java
java/server/trunk/src/org/red5/io/object/SerializerOpts.java
java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
Trac: http://mirror1.cvsdude.com/trac/osflash/red5/changeset/1608
Index: /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java (revision 1597)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java (revision 1608)
@@ -20,8 +20,4 @@
*/
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -31,6 +27,6 @@
import org.red5.io.utils.BufferUtils;
import org.red5.server.api.IConnection;
+import org.red5.server.api.IConnection.Encoding;
import org.red5.server.api.Red5;
-import org.red5.server.api.IConnection.Encoding;
import org.red5.server.api.service.IPendingServiceCall;
import org.red5.server.api.service.IServiceCall;
@@ -38,16 +34,5 @@
import org.red5.server.net.protocol.SimpleProtocolEncoder;
import org.red5.server.net.rtmp.RTMPUtils;
-import org.red5.server.net.rtmp.event.AudioData;
-import org.red5.server.net.rtmp.event.BytesRead;
-import org.red5.server.net.rtmp.event.ChunkSize;
-import org.red5.server.net.rtmp.event.ClientBW;
-import org.red5.server.net.rtmp.event.FlexMessage;
-import org.red5.server.net.rtmp.event.IRTMPEvent;
-import org.red5.server.net.rtmp.event.Invoke;
-import org.red5.server.net.rtmp.event.Notify;
-import org.red5.server.net.rtmp.event.Ping;
-import org.red5.server.net.rtmp.event.ServerBW;
-import org.red5.server.net.rtmp.event.Unknown;
-import org.red5.server.net.rtmp.event.VideoData;
+import org.red5.server.net.rtmp.event.*;
import org.red5.server.net.rtmp.message.Constants;
import org.red5.server.net.rtmp.message.Header;
@@ -58,17 +43,37 @@
import org.red5.server.so.ISharedObjectMessage;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * RTMP protocol encoder encodes RTMP messages and packets to byte buffers.
+ */
public class RTMPProtocolEncoder implements SimpleProtocolEncoder, Constants,
IEventEncoder {
- protected static Log log = LogFactory.getLog(RTMPProtocolEncoder.class
+ /**
+ * Logger
+ */
+ protected static Log log = LogFactory.getLog(RTMPProtocolEncoder.class
.getName());
- protected static Log ioLog = LogFactory.getLog(RTMPProtocolEncoder.class
+ /**
+ * I/O operations logger
+ */
+ protected static Log ioLog = LogFactory.getLog(RTMPProtocolEncoder.class
.getName()
+ ".out");
- private Serializer serializer;
-
- private Output getOutput(ByteBuffer buffer) {
+ /**
+ * Serializer object
+ */
+ private Serializer serializer;
+
+ /**
+ * Creates output object from byte buffer
+ * @param buffer
+ * @return
+ */
+ private Output getOutput(ByteBuffer buffer) {
IConnection conn = Red5.getConnectionLocal();
if (conn.getEncoding() == Encoding.AMF3) {
@@ -95,5 +100,11 @@
}
- public ByteBuffer encodePacket(RTMP rtmp, Packet packet) {
+ /**
+ * Encode packet
+ * @param rtmp RTMP protocol state
+ * @param packet RTMP packet
+ * @return Encoded data
+ */
+ public ByteBuffer encodePacket(RTMP rtmp, Packet packet) {
final Header header = packet.getHeader();
@@ -120,6 +131,5 @@
header.setSize(data.limit());
- final ByteBuffer headers = encodeHeader(header, rtmp
- .getLastWriteHeader(channelId));
+ final ByteBuffer headers = encodeHeader(header, rtmp.getLastWriteHeader(channelId));
rtmp.setLastWriteHeader(channelId, header);
@@ -130,5 +140,5 @@
/ (float) chunkSize);
final int bufSize = header.getSize() + headers.limit()
- + (numChunks - 1 * 1);
+ + (numChunks - 1);
final ByteBuffer out = ByteBuffer.allocate(bufSize);
@@ -155,5 +165,11 @@
}
- public ByteBuffer encodeHeader(Header header, Header lastHeader) {
+ /**
+ * Encode RTMP header
+ * @param header RTMP message header
+ * @param lastHeader Previous header
+ * @return Encoded header data
+ */
+ public ByteBuffer encodeHeader(Header header, Header lastHeader) {
byte headerType = HEADER_NEW;
@@ -204,5 +220,11 @@
}
- public ByteBuffer encodeMessage(Header header, IRTMPEvent message) {
+ /**
+ * Encode message
+ * @param header RTMP message header
+ * @param message RTMP message (event)
+ * @return Encoded message data
+ */
+ public ByteBuffer encodeMessage(Header header, IRTMPEvent message) {
switch (header.getDataType()) {
case TYPE_CHUNK_SIZE:
@@ -237,5 +259,10 @@
}
- private ByteBuffer encodeServerBW(ServerBW serverBW) {
+ /**
+ * Encode server-side bandwidth event
+ * @param serverBW Server-side bandwidth event
+ * @return Encoded event data
+ */
+ private ByteBuffer encodeServerBW(ServerBW serverBW) {
final ByteBuffer out = ByteBuffer.allocate(4);
out.putInt(serverBW.getBandwidth());
@@ -243,5 +270,10 @@
}
- private ByteBuffer encodeClientBW(ClientBW clientBW) {
+ /**
+ * Encode client-side bandwidth event
+ * @param clientBW Client-side bandwidth event
+ * @return Encoded event data
+ */
+ private ByteBuffer encodeClientBW(ClientBW clientBW) {
final ByteBuffer out = ByteBuffer.allocate(5);
out.putInt(clientBW.getBandwidth());
@@ -272,131 +304,126 @@
out.putInt(0);
- int mark, len = 0;
-
- final Iterator iter = so.getEvents().iterator();
- while (iter.hasNext()) {
-
- ISharedObjectEvent event = (ISharedObjectEvent) iter.next();
- byte type = SharedObjectTypeMapping.toByte(event.getType());
-
- switch (event.getType()) {
- case SERVER_CONNECT:
- case CLIENT_INITIAL_DATA:
- case CLIENT_CLEAR_DATA:
- out.put(type);
- out.putInt(0);
- break;
-
- case SERVER_DELETE_ATTRIBUTE:
- case CLIENT_DELETE_DATA:
- case CLIENT_UPDATE_ATTRIBUTE:
- out.put(type);
- mark = out.position();
- out.skip(4); // we will be back
- output.putString(event.getKey());
- len = out.position() - mark - 4;
- out.putInt(mark, len);
- break;
-
- case SERVER_SET_ATTRIBUTE:
- case CLIENT_UPDATE_DATA:
- if (event.getKey() == null) {
- // Update multiple attributes in one request
- Map initialData = (Map) event.getValue();
-
- Iterator keys = initialData.keySet().iterator();
- while (keys.hasNext()) {
-
- out.put(type);
- mark = out.position();
- out.skip(4); // we will be back
-
- String key = (String) keys.next();
- output.putString(key);
- serializer.serialize(output, initialData.get(key));
-
- len = out.position() - mark - 4;
- out.putInt(mark, len);
- }
- } else {
- out.put(type);
- mark = out.position();
- out.skip(4); // we will be back
-
- output.putString(event.getKey());
- serializer.serialize(output, event.getValue());
-
- len = out.position() - mark - 4;
- out.putInt(mark, len);
- }
- break;
-
- case CLIENT_SEND_MESSAGE:
- case SERVER_SEND_MESSAGE:
- // Send method name and value
- out.put(type);
- mark = out.position();
- out.skip(4);
- // Serialize name of the handler to call...
- serializer.serialize(output, event.getKey());
- // ...and the arguments
- for (Object arg : (List) event.getValue()) {
- serializer.serialize(output, arg);
- }
- len = out.position() - mark - 4;
- //log.debug(len);
- out.putInt(mark, len);
- //log.info(out.getHexDump());
- break;
-
- case CLIENT_STATUS:
- out.put(type);
- mark = out.position();
- out.skip(4); // we will be back
- output.putString(event.getKey());
- output.putString((String) event.getValue());
- len = out.position() - mark - 4;
- out.putInt(mark, len);
- break;
-
- default:
- //log.error("Unknown event " + event.getType());
- // XXX: come back here, need to make this work in server or
- // client mode
- // talk to joachim about this part.
- out.put(type);
- mark = out.position();
- //out.putInt(0);
- out.skip(4); // we will be back
- output.putString(event.getKey());
- serializer.serialize(output, event.getValue());
- len = out.position() - mark - 4;
- out.putInt(mark, len);
- break;
-
- }
- }
- return out;
- }
-
- /** {@inheritDoc} */ /*
- * (non-Javadoc)
- *
- * @see org.red5.server.net.rtmp.codec.IEventEncoder#encodeNotify(org.red5.server.net.rtmp.event.Notify)
- */
+ int mark, len;
+
+ for (ISharedObjectEvent event1 : so.getEvents()) {
+
+ ISharedObjectEvent event = (ISharedObjectEvent) event1;
+ byte type = SharedObjectTypeMapping.toByte(event.getType());
+
+ switch (event.getType()) {
+ case SERVER_CONNECT:
+ case CLIENT_INITIAL_DATA:
+ case CLIENT_CLEAR_DATA:
+ out.put(type);
+ out.putInt(0);
+ break;
+
+ case SERVER_DELETE_ATTRIBUTE:
+ case CLIENT_DELETE_DATA:
+ case CLIENT_UPDATE_ATTRIBUTE:
+ out.put(type);
+ mark = out.position();
+ out.skip(4); // we will be back
+ output.putString(event.getKey());
+ len = out.position() - mark - 4;
+ out.putInt(mark, len);
+ break;
+
+ case SERVER_SET_ATTRIBUTE:
+ case CLIENT_UPDATE_DATA:
+ if (event.getKey() == null) {
+ // Update multiple attributes in one request
+ Map initialData = (Map) event.getValue();
+
+ for (Object o : initialData.keySet()) {
+
+ out.put(type);
+ mark = out.position();
+ out.skip(4); // we will be back
+
+ String key = (String) o;
+ output.putString(key);
+ serializer.serialize(output, initialData.get(key));
+
+ len = out.position() - mark - 4;
+ out.putInt(mark, len);
+ }
+ } else {
+ out.put(type);
+ mark = out.position();
+ out.skip(4); // we will be back
+
+ output.putString(event.getKey());
+ serializer.serialize(output, event.getValue());
+
+ len = out.position() - mark - 4;
+ out.putInt(mark, len);
+ }
+ break;
+
+ case CLIENT_SEND_MESSAGE:
+ case SERVER_SEND_MESSAGE:
+ // Send method name and value
+ out.put(type);
+ mark = out.position();
+ out.skip(4);
+ // Serialize name of the handler to call...
+ serializer.serialize(output, event.getKey());
+ // ...and the arguments
+ for (Object arg : (List) event.getValue()) {
+ serializer.serialize(output, arg);
+ }
+ len = out.position() - mark - 4;
+ //log.debug(len);
+ out.putInt(mark, len);
+ //log.info(out.getHexDump());
+ break;
+
+ case CLIENT_STATUS:
+ out.put(type);
+ mark = out.position();
+ out.skip(4); // we will be back
+ output.putString(event.getKey());
+ output.putString((String) event.getValue());
+ len = out.position() - mark - 4;
+ out.putInt(mark, len);
+ break;
+
+ default:
+ //log.error("Unknown event " + event.getType());
+ // XXX: come back here, need to make this work in server or
+ // client mode
+ // talk to joachim about this part.
+ out.put(type);
+ mark = out.position();
+ //out.putInt(0);
+ out.skip(4); // we will be back
+ output.putString(event.getKey());
+ serializer.serialize(output, event.getValue());
+ len = out.position() - mark - 4;
+ out.putInt(mark, len);
+ break;
+
+ }
+ }
+ return out;
+ }
+
+ /** {@inheritDoc} */
public ByteBuffer encodeNotify(Notify notify) {
return encodeNotifyOrInvoke(notify);
}
- /** {@inheritDoc} */ /*
- * (non-Javadoc)
- *
- * @see org.red5.server.net.rtmp.codec.IEventEncoder#encodeInvoke(org.red5.server.net.rtmp.event.Invoke)
- */
+ /** {@inheritDoc} */
public ByteBuffer encodeInvoke(Invoke invoke) {
return encodeNotifyOrInvoke(invoke);
}
- protected ByteBuffer encodeNotifyOrInvoke(Notify invoke) {
+ /**
+ * Encode notification event
+ * @param invoke Notification event
+ * @return Encoded event data
+ */
+ protected ByteBuffer encodeNotifyOrInvoke(Notify invoke) {
ByteBuffer out = ByteBuffer.allocate(1024);
out.setAutoExpand(true);
@@ -404,5 +431,10 @@
return out;
}
-
+
+ /**
+ * Encode notification event and fill given byte buffer
+ * @param out Byte buffer to fill
+ * @param invoke Notification event
+ */
protected void encodeNotifyOrInvoke(ByteBuffer out, Notify invoke) {
// TODO: tidy up here
@@ -457,9 +489,5 @@
}
- /** {@inheritDoc} */ /*
- * (non-Javadoc)
- *
- * @see org.red5.server.net.rtmp.codec.IEventEncoder#encodePing(org.red5.server.net.rtmp.event.Ping)
- */
+ /** {@inheritDoc} */
public ByteBuffer encodePing(Ping ping) {
int len = 6;
@@ -482,9 +510,5 @@
}
- /** {@inheritDoc} */ /*
- * (non-Javadoc)
- *
- * @see org.red5.server.net.rtmp.codec.IEventEncoder#encodeStreamBytesRead(org.red5.server.net.rtmp.event.StreamBytesRead)
- */
+ /** {@inheritDoc} */
public ByteBuffer encodeBytesRead(BytesRead bytesRead) {
final ByteBuffer out = ByteBuffer.allocate(4);
@@ -493,18 +517,10 @@
}
- /** {@inheritDoc} */ /*
- * (non-Javadoc)
- *
- * @see org.red5.server.net.rtmp.codec.IEventEncoder#encodeAudioData(org.red5.server.net.rtmp.event.AudioData)
- */
+ /** {@inheritDoc} */
public ByteBuffer encodeAudioData(AudioData audioData) {
return audioData.getData().asReadOnlyBuffer();
}
- /** {@inheritDoc} */ /*
- * (non-Javadoc)
- *
- * @see org.red5.server.net.rtmp.codec.IEventEncoder#encodeVideoData(org.red5.server.net.rtmp.event.VideoData)
- */
+ /** {@inheritDoc} */
public ByteBuffer encodeVideoData(VideoData videoData) {
return videoData.getData().asReadOnlyBuffer();
@@ -521,7 +537,7 @@
/**
- * Setter for property 'serializer'.
+ * Setter for serializer
*
- * @param serializer Value to set for property 'serializer'.
+ * @param serializer Serializer
*/
public void setSerializer(org.red5.io.object.Serializer serializer) {
@@ -529,5 +545,10 @@
}
- public ByteBuffer encodeFlexMessage(FlexMessage msg) {
+ /**
+ * Encodes Flex message event
+ * @param msg Flex message event
+ * @return Encoded data
+ */
+ public ByteBuffer encodeFlexMessage(FlexMessage msg) {
ByteBuffer out = ByteBuffer.allocate(1024);
out.setAutoExpand(true);
Index: /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java (revision 1606)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java (revision 1608)
@@ -60,5 +60,5 @@
/**
- * Filesystem logger
+ * I/O logger
*/
protected static Log ioLog = LogFactory.getLog(RTMPProtocolDecoder.class
Index: /java/server/trunk/src/org/red5/io/IoConstants.java
===================================================================
--- /java/server/trunk/src/org/red5/io/IoConstants.java (revision 1406)
+++ /java/server/trunk/src/org/red5/io/IoConstants.java (revision 1608)
@@ -25,59 +25,116 @@
*/
public interface IoConstants {
-
+ /**
+ * Video data
+ */
public static final byte TYPE_VIDEO = 0x09;
-
+ /**
+ * Audio data
+ */
public static final byte TYPE_AUDIO = 0x08;
-
+ /**
+ * Metadata
+ */
public static final byte TYPE_METADATA = 0x12;
-
+ /**
+ * Mask sound type
+ */
public static final byte MASK_SOUND_TYPE = 0x01;
-
+ /**
+ * Mono mode
+ */
public static final byte FLAG_TYPE_MONO = 0x00;
-
+ /**
+ * Stereo mode
+ */
public static final byte FLAG_TYPE_STEREO = 0x01;
-
+ /**
+ * Mask sound size
+ */
public static final byte MASK_SOUND_SIZE = 0x02;
-
+ /**
+ * 8 bit flag size
+ */
public static final byte FLAG_SIZE_8_BIT = 0x00;
-
+ /**
+ * 16 bit flag size
+ */
public static final byte FLAG_SIZE_16_BIT = 0x01;
-
+ /**
+ * Mask sound rate
+ */
public static final byte MASK_SOUND_RATE = 0x0C;
-
+ /**
+ * 5.5 KHz rate flag
+ */
public static final byte FLAG_RATE_5_5_KHZ = 0x00;
-
+ /**
+ * 11 KHz rate flag
+ */
public static final byte FLAG_RATE_11_KHZ = 0x01;
-
+ /**
+ * 22 KHz rate flag
+ */
public static final byte FLAG_RATE_22_KHZ = 0x02;
-
+ /**
+ * 44 KHz rate flag
+ */
public static final byte FLAG_RATE_44_KHZ = 0x03;
-
+ /**
+ * Mask sound format (unsigned)
+ */
public static final byte MASK_SOUND_FORMAT = 0xF0 - 0xFF; // unsigned
-
+ /**
+ * Raw data format flag
+ */
public static final byte FLAG_FORMAT_RAW = 0x00;
-
+ /**
+ * ADPCM format flag
+ */
public static final byte FLAG_FORMAT_ADPCM = 0x01;
-
+ /**
+ * MP3 format flag
+ */
public static final byte FLAG_FORMAT_MP3 = 0x02;
-
+ /**
+ * 8 KHz NellyMoser audio format flag
+ */
public static final byte FLAG_FORMAT_NELLYMOSER_8_KHZ = 0x05;
- public static final byte FLAG_FORMAT_NELLYMOSER = 0x06;
-
+ /**
+ * NellyMoser-encoded audio format flag
+ */
+ public static final byte FLAG_FORMAT_NELLYMOSER = 0x06;
+ /**
+ * Mask video codec
+ */
public static final byte MASK_VIDEO_CODEC = 0x0F;
-
+ /**
+ * H263 codec flag
+ */
public static final byte FLAG_CODEC_H263 = 0x02;
-
+ /**
+ * Screen codec flag
+ */
public static final byte FLAG_CODEC_SCREEN = 0x03;
-
+ /**
+ * On2 VP6 codec flag
+ */
public static final byte FLAG_CODEC_VP6 = 0x04;
-
+ /**
+ * Video frametype flag
+ */
public static final byte MASK_VIDEO_FRAMETYPE = 0xF0 - 0xFF; // unsigned
-
+ /**
+ * Keyframe type flag
+ */
public static final byte FLAG_FRAMETYPE_KEYFRAME = 0x01;
-
+ /**
+ * Interframe flag. Interframes are created from keyframes rather than independent image
+ */
public static final byte FLAG_FRAMETYPE_INTERFRAME = 0x02;
-
+ /**
+ * Disposable frame type flag
+ */
public static final byte FLAG_FRAMETYPE_DISPOSABLE = 0x03;
Index: /java/server/trunk/src/org/red5/io/filter/ExecutorFilter.java
===================================================================
--- /java/server/trunk/src/org/red5/io/filter/ExecutorFilter.java (revision 1606)
+++ /java/server/trunk/src/org/red5/io/filter/ExecutorFilter.java (revision 1608)
@@ -20,4 +20,9 @@
package org.red5.io.filter;
+import org.apache.mina.common.*;
+import org.apache.mina.util.ByteBufferUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.ArrayList;
import java.util.List;
@@ -26,13 +31,4 @@
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
-
-import org.apache.mina.common.IdleStatus;
-import org.apache.mina.common.IoFilterAdapter;
-import org.apache.mina.common.IoFilterChain;
-import org.apache.mina.common.IoSession;
-import org.apache.mina.common.ThreadModel;
-import org.apache.mina.util.ByteBufferUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
@@ -54,5 +50,8 @@
.getLogger(ExecutorFilter.class.getName());
- private final Executor executor;
+ /**
+ * Executes submitted runnable tasks
+ */
+ private final Executor executor;
/**
@@ -75,5 +74,11 @@
}
- public ExecutorFilter(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
+ /**
+ * Creates new instance with specified core pool size, maximum pool size and keep alive time
+ * @param corePoolSize Core pool size
+ * @param maximumPoolSize Maximum pool size
+ * @param keepAliveTime Keep alive time (in seconds)
+ */
+ public ExecutorFilter(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
this(new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue()));
}
@@ -81,5 +86,5 @@
/**
* Returns the underlying {@link Executor} instance this filter uses.
- * @return
+ * @return Executor object
*/
public Executor getExecutor() {
@@ -87,5 +92,12 @@
}
- private void fireEvent(NextFilter nextFilter, IoSession session,
+ /**
+ * Dispatches event to next filter
+ * @param nextFilter Next filter
+ * @param session IoSession object
+ * @param type Event type (opened, closed, read, written, etc)
+ * @param data Data
+ */
+ private void fireEvent(NextFilter nextFilter, IoSession session,
EventType type, Object data) {
Event event = new Event(type, nextFilter, data);
@@ -106,9 +118,20 @@
}
- private static class SessionBuffer {
- private static final String KEY = SessionBuffer.class.getName()
+ /**
+ * Holds sessions
+ */
+ private static class SessionBuffer {
+ /**
+ * Key
+ */
+ private static final String KEY = SessionBuffer.class.getName()
+ ".KEY";
- private static SessionBuffer getSessionBuffer(IoSession session) {
+ /**
+ * Creates session buffer from I/O session (connection)
+ * @param session Connection between two ends
+ * @return Session buffer
+ */
+ private static SessionBuffer getSessionBuffer(IoSession session) {
synchronized (session) {
SessionBuffer buf = (SessionBuffer) session.getAttribute(KEY);
@@ -121,10 +144,21 @@
}
+ /**
+ * MINA session
+ */
private final IoSession session;
-
+ /**
+ * Event queue
+ */
private final List eventQueue = new ArrayList();
-
+ /**
+ * Whether there's more events to process
+ */
private boolean processingCompleted = true;
+ /**
+ * Session buffer
+ * @param session I/O session
+ */
private SessionBuffer(IoSession session) {
this.session = session;
@@ -132,24 +166,58 @@
}
+ /**
+ * Type of event
+ */
protected static class EventType {
- public static final EventType OPENED = new EventType("OPENED");
-
- public static final EventType CLOSED = new EventType("CLOSED");
-
- public static final EventType READ = new EventType("READ");
-
- public static final EventType WRITTEN = new EventType("WRITTEN");
-
- public static final EventType RECEIVED = new EventType("RECEIVED");
-
- public static final EventType SENT = new EventType("SENT");
-
- public static final EventType IDLE = new EventType("IDLE");
-
- public static final EventType EXCEPTION = new EventType("EXCEPTION");
-
- private final String value;
-
- private EventType(String value) {
+ /**
+ * On connection opened
+ */
+
Note:
Diffs are chopped if more than 25k.
This is to get past the limit on the mailing list.
More information about the Red5commits
mailing list