Gnash
0.8.10
|
Classes | |
struct | RTMPHeader |
The RTMPHeader contains all the fields for the packet header. More... | |
struct | RTMPPacket |
An RTMPPacket class contains a full description of an RTMP packet. More... | |
struct | RTMP |
This class is for handling the RTMP protocol. More... | |
Enumerations | |
enum | ControlType { CONTROL_CLEAR_STREAM = 0x00, CONTROL_CLEAR_BUFFER = 0x01, CONTROL_STREAM_DRY = 0x02, CONTROL_BUFFER_TIME = 0x03, CONTROL_RESET_STREAM = 0x04, CONTROL_PING = 0x06, CONTROL_PONG = 0x07, CONTROL_REQUEST_VERIFY = 0x1a, CONTROL_RESPOND_VERIFY = 0x1b, CONTROL_BUFFER_EMPTY = 0x1f, CONTROL_BUFFER_READY = 0x20 } |
Known control / ping codes. More... | |
enum | Channels { CHANNEL_CONTROL1 = 0x02, CHANNEL_CONTROL2 = 0x03, CHANNEL_VIDEO = 0x08 } |
The known channels. More... | |
enum | PacketType { PACKET_TYPE_NONE = 0x00, PACKET_TYPE_CHUNK_SIZE = 0x01, PACKET_TYPE_BYTES_READ = 0x03, PACKET_TYPE_CONTROL = 0x04, PACKET_TYPE_SERVERBW = 0x05, PACKET_TYPE_CLIENTBW = 0x06, PACKET_TYPE_AUDIO = 0x08, PACKET_TYPE_VIDEO = 0x09, PACKET_TYPE_FLEX_STREAM_SEND = 0x0f, PACKET_TYPE_FLEX_SHARED_OBJECT = 0x10, PACKET_TYPE_FLEX_MESSAGE = 0x11, PACKET_TYPE_METADATA = 0x12, PACKET_TYPE_SHARED_OBJECT = 0x13, PACKET_TYPE_INVOKE = 0x14, PACKET_TYPE_FLV = 0x16 } |
The known packet types. More... | |
enum | PacketSize { RTMP_PACKET_SIZE_LARGE = 0, RTMP_PACKET_SIZE_MEDIUM = 1, RTMP_PACKET_SIZE_SMALL = 2, RTMP_PACKET_SIZE_MINIMUM = 3 } |
The PacketSize specifies the number of fields contained in the header. More... | |
Functions | |
bool | sendServerBW (RTMP &r) |
Send the server bandwidth. | |
bool | sendCtrl (RTMP &r, ControlType, unsigned int nObject, unsigned int nTime) |
Send a control packet. | |
std::ostream & | operator<< (std::ostream &o, PacketType p) |
Logging assistance for PacketType. | |
std::ostream & | operator<< (std::ostream &o, ControlType t) |
Logging assistance for ControlType. | |
bool | hasPayload (const RTMPPacket &p) |
Check whether an RTMPPacket has a payload. | |
void | clearPayload (RTMPPacket &p) |
Clear the message body and the bytes read of an RTMPPacket. | |
size_t | payloadSize (const RTMPPacket &p) |
The current size of the space allocated for the message payload. | |
boost::uint8_t * | payloadData (RTMPPacket &p) |
Access the payload data section of the buffer. | |
const boost::uint8_t * | payloadData (const RTMPPacket &p) |
Access the payload data section of the buffer. | |
const boost::uint8_t * | payloadEnd (const RTMPPacket &p) |
Get the end of the allocated payload data section of the buffer. | |
bool | isReady (const RTMPPacket &p) |
Check if a packet is ready for processing. |
The known channels.
CHANNEL_CONTROL1 is for internal controls: sendCtrl send server BW send bytes received. These contain no AMF data. CHANNEL_CONTROL2 is for ActionScript controls _checkbw: AS _result: connect: Maybe from ASNative(2100, 0) (connect) createStream: AS deleteStream: Maybe ASNative(2100, 1) (close) FCSubscribe: Don't know. These all contain AMF data.
Known control / ping codes.
See http://jira.red5.org/confluence/display/docs/Ping (may not exist). 0x00: Clear the stream. No third and fourth parameters. The second parameter could be 0. After the connection is established, a Ping 0,0 will be sent from server to client. The message will also be sent to client on the start of Play and in response of a Seek or Pause/Resume request. This Ping tells client to re-calibrate the clock with the timestamp of the next packet server sends. 0x01: Tell the stream to clear the playing buffer. 0x02: Stream dry (not sure what this means!) 0x03: Buffer time of the client. The third parameter is the buffer time in milliseconds. 0x04: Reset a stream. Used together with type 0 in the case of VOD. Often sent before type 0. 0x06: Ping the client from server. The second parameter is the current time. 0x07: Pong reply from client. The second parameter is the time the server sent with his ping request. 0x1a: SWFVerification request 0x1b: SWFVerification response 0x1f: Not sure, maybe buffer empty. 0x20: Buffer ready.
The PacketSize specifies the number of fields contained in the header.
1. A large packet has all header fields. We would expect the first packet on any channel to be large. 2. A medium packet has the same m_nInfoField2 and packet type. 3. A small packet has the same data size. 4. A minimal packet has all fields the same. The minimal and small data packets can be used to send a payload in more than one packet. If the data received is smaller than the specified data size, the packet remains in the channel with its payload. Data from each new packet is added to this stored payload until all the advertised data is read. These names are taken from rtmpdump.
The known packet types.
void gnash::rtmp::clearPayload | ( | RTMPPacket & | p | ) | [inline] |
Clear the message body and the bytes read of an RTMPPacket.
This is to be used to free used information from packets in a channel. The header information must be preserved for future packets, but the payload is no longer needed once read.
References gnash::rtmp::RTMPPacket::buffer, and gnash::rtmp::RTMPPacket::bytesRead.
Referenced by gnash::rtmp::RTMP::update().
bool gnash::rtmp::hasPayload | ( | const RTMPPacket & | p | ) | [inline] |
Check whether an RTMPPacket has a payload.
Only stored packets may not have a payload. A packet without a payload has already been processed and is only used for its header information.
References gnash::rtmp::RTMPPacket::buffer.
Referenced by gnash::rtmp::RTMP::update(), payloadSize(), payloadData(), and payloadEnd().
bool gnash::rtmp::isReady | ( | const RTMPPacket & | p | ) | [inline] |
Check if a packet is ready for processing.
A packet is ready for processing if its payload size matches the data size in its header. It may take several successive packets to form a complete packet.
References gnash::rtmp::RTMPPacket::bytesRead, gnash::rtmp::RTMPPacket::header, and gnash::rtmp::RTMPHeader::dataSize.
Referenced by gnash::rtmp::RTMP::update().
std::ostream & gnash::rtmp::operator<< | ( | std::ostream & | o, |
PacketType | p | ||
) |
Logging assistance for PacketType.
References PACKET_TYPE_CHUNK_SIZE, PACKET_TYPE_BYTES_READ, PACKET_TYPE_CONTROL, PACKET_TYPE_SERVERBW, PACKET_TYPE_CLIENTBW, PACKET_TYPE_AUDIO, PACKET_TYPE_VIDEO, PACKET_TYPE_FLEX_STREAM_SEND, PACKET_TYPE_FLEX_SHARED_OBJECT, PACKET_TYPE_FLEX_MESSAGE, PACKET_TYPE_METADATA, PACKET_TYPE_SHARED_OBJECT, PACKET_TYPE_INVOKE, and PACKET_TYPE_FLV.
std::ostream & gnash::rtmp::operator<< | ( | std::ostream & | o, |
ControlType | t | ||
) |
Logging assistance for ControlType.
References CONTROL_CLEAR_STREAM, CONTROL_CLEAR_BUFFER, CONTROL_STREAM_DRY, CONTROL_BUFFER_TIME, CONTROL_RESET_STREAM, CONTROL_PING, CONTROL_PONG, CONTROL_REQUEST_VERIFY, CONTROL_RESPOND_VERIFY, CONTROL_BUFFER_EMPTY, and CONTROL_BUFFER_READY.
boost::uint8_t* gnash::rtmp::payloadData | ( | RTMPPacket & | p | ) | [inline] |
Access the payload data section of the buffer.
References assert, hasPayload(), gnash::rtmp::RTMPPacket::buffer, and gnash::SimpleBuffer::data().
Referenced by gnash::rtmp::RTMP::handlePacket(), and gnash::rtmp::RTMP::sendPacket().
const boost::uint8_t* gnash::rtmp::payloadData | ( | const RTMPPacket & | p | ) | [inline] |
Access the payload data section of the buffer.
References assert, hasPayload(), gnash::rtmp::RTMPPacket::buffer, and gnash::SimpleBuffer::data().
const boost::uint8_t* gnash::rtmp::payloadEnd | ( | const RTMPPacket & | p | ) | [inline] |
Get the end of the allocated payload data section of the buffer.
Note that this is only valid for packets we create, and for packets we have fully read. Stored packets that have not yet received all data have allocated space that has not yet been written.
References assert, hasPayload(), gnash::rtmp::RTMPPacket::buffer, gnash::SimpleBuffer::data(), and gnash::SimpleBuffer::size().
Referenced by gnash::rtmp::RTMP::sendPacket().
size_t gnash::rtmp::payloadSize | ( | const RTMPPacket & | p | ) | [inline] |
The current size of the space allocated for the message payload.
For messages we create, this matches the exact size of the payload. For messages we read, this is the expected size of the data.
References assert, hasPayload(), gnash::rtmp::RTMPPacket::buffer, and gnash::SimpleBuffer::size().
Referenced by gnash::rtmp::RTMP::handlePacket(), and gnash::rtmp::RTMP::sendPacket().
bool gnash::rtmp::sendCtrl | ( | RTMP & | r, |
ControlType | t, | ||
unsigned int | nObject, | ||
unsigned int | nTime | ||
) |
Send a control packet.
The type of Ping packet is 0x4 and contains two mandatory parameters and two optional parameters. The first parameter is the type of Ping and in short integer. The second parameter is the target of the ping. As Ping is always sent in Channel 2 (control channel) and the target object in RTMP header is always 0 whicj means the Connection object, it's necessary to put an extra parameter to indicate the exact target object the Ping is sent to. The second parameter takes this responsibility. The value has the same meaning as the target object field in RTMP header. (The second value could also be used as other purposes, like RTT Ping/Pong. It is used as the timestamp.) The third and fourth parameters are optional and could be looked upon as the parameter of the Ping packet.
References gnash::rtmp::RTMPPacket::header, gnash::rtmp::RTMPHeader::channel, CHANNEL_CONTROL1, gnash::rtmp::RTMPHeader::headerType, RTMP_PACKET_SIZE_LARGE, gnash::rtmp::RTMPHeader::packetType, PACKET_TYPE_CONTROL, CONTROL_BUFFER_TIME, CONTROL_RESPOND_VERIFY, gnash::rtmp::RTMPPacket::buffer, gnash::SimpleBuffer::appendNetworkShort(), gnash::SimpleBuffer::appendNetworkLong(), and gnash::rtmp::RTMP::sendPacket().
Referenced by gnash::rtmp::RTMP::setBufferTime().
DSOEXPORT bool gnash::rtmp::sendServerBW | ( | RTMP & | r | ) |
Send the server bandwidth.
Send a bandwidth ping to the server.
Why would we want to send this?
References gnash::rtmp::RTMPPacket::header, gnash::rtmp::RTMPHeader::channel, CHANNEL_CONTROL1, gnash::rtmp::RTMPHeader::packetType, PACKET_TYPE_SERVERBW, gnash::rtmp::RTMPPacket::buffer, gnash::SimpleBuffer::appendNetworkLong(), gnash::rtmp::RTMP::serverBandwidth(), and gnash::rtmp::RTMP::sendPacket().