libavformat/rtmpproto.c File Reference

RTMP protocol. More...

#include "libavcodec/bytestream.h"
#include "libavutil/avstring.h"
#include "libavutil/lfg.h"
#include "libavutil/sha.h"
#include "avformat.h"
#include "internal.h"
#include "network.h"
#include "flv.h"
#include "rtmp.h"
#include "rtmppkt.h"
#include "url.h"

Go to the source code of this file.

Data Structures

struct  RTMPContext
 protocol handler context More...

Defines

#define LOG_CONTEXT   NULL
#define PLAYER_KEY_OPEN_PART_LEN   30
 length of partial key used for first client digest signing
#define SERVER_KEY_OPEN_PART_LEN   36
 length of partial key used for first server digest signing
#define HMAC_IPAD_VAL   0x36
#define HMAC_OPAD_VAL   0x5C

Enumerations

enum  ClientState {
  STATE_START, STATE_HANDSHAKED, STATE_RELEASING, STATE_FCPUBLISH,
  STATE_CONNECTING, STATE_READY, STATE_PLAYING, STATE_PUBLISHING,
  STATE_STOPPED
}
 RTMP protocol handler state. More...

Functions

static void gen_connect (URLContext *s, RTMPContext *rt, const char *proto, const char *host, int port)
 Generate 'connect' call and send it to the server.
static void gen_release_stream (URLContext *s, RTMPContext *rt)
 Generate 'releaseStream' call and send it to the server.
static void gen_fcpublish_stream (URLContext *s, RTMPContext *rt)
 Generate 'FCPublish' call and send it to the server.
static void gen_fcunpublish_stream (URLContext *s, RTMPContext *rt)
 Generate 'FCUnpublish' call and send it to the server.
static void gen_create_stream (URLContext *s, RTMPContext *rt)
 Generate 'createStream' call and send it to the server.
static void gen_delete_stream (URLContext *s, RTMPContext *rt)
 Generate 'deleteStream' call and send it to the server.
static void gen_play (URLContext *s, RTMPContext *rt)
 Generate 'play' call and send it to the server, then ping the server to start actual playing.
static void gen_publish (URLContext *s, RTMPContext *rt)
 Generate 'publish' call and send it to the server.
static void gen_pong (URLContext *s, RTMPContext *rt, RTMPPacket *ppkt)
 Generate ping reply and send it to the server.
static void gen_bytes_read (URLContext *s, RTMPContext *rt, uint32_t ts)
 Generate report on bytes read so far and send it to the server.
static void rtmp_calc_digest (const uint8_t *src, int len, int gap, const uint8_t *key, int keylen, uint8_t *dst)
 Calculate HMAC-SHA2 digest for RTMP handshake packets.
static int rtmp_handshake_imprint_with_digest (uint8_t *buf)
 Put HMAC-SHA2 digest of packet data (except for the bytes where this digest will be stored) into that packet.
static int rtmp_validate_digest (uint8_t *buf, int off)
 Verify that the received server response has the expected digest value.
static int rtmp_handshake (URLContext *s, RTMPContext *rt)
 Perform handshake with the server by means of exchanging pseudorandom data signed with HMAC-SHA2 digest.
static int rtmp_parse_result (URLContext *s, RTMPContext *rt, RTMPPacket *pkt)
 Parse received packet and possibly perform some action depending on the packet contents.
static int get_packet (URLContext *s, int for_header)
 Interact with the server by receiving and sending RTMP packets until there is some significant data (media data or expected status notification).
static int rtmp_close (URLContext *h)
static int rtmp_open (URLContext *s, const char *uri, int flags)
 Open RTMP connection and verify that the stream can be played.
static int rtmp_read (URLContext *s, uint8_t *buf, int size)
static int rtmp_write (URLContext *s, const uint8_t *buf, int size)

Variables

static const uint8_t rtmp_player_key []
 Client key used for digest signing.
static const uint8_t rtmp_server_key []
 Key used for RTMP server digest signing.
URLProtocol ff_rtmp_protocol


Detailed Description

RTMP protocol.

Definition in file rtmpproto.c.


Define Documentation

#define HMAC_IPAD_VAL   0x36

Definition at line 361 of file rtmpproto.c.

Referenced by rtmp_calc_digest().

#define HMAC_OPAD_VAL   0x5C

Definition at line 362 of file rtmpproto.c.

Referenced by rtmp_calc_digest().

#define LOG_CONTEXT   NULL

#define PLAYER_KEY_OPEN_PART_LEN   30

length of partial key used for first client digest signing

Definition at line 82 of file rtmpproto.c.

Referenced by rtmp_handshake_imprint_with_digest().

#define SERVER_KEY_OPEN_PART_LEN   36

length of partial key used for first server digest signing

Definition at line 93 of file rtmpproto.c.

Referenced by rtmp_validate_digest().


Enumeration Type Documentation

RTMP protocol handler state.

Enumerator:
STATE_START  client has not done anything yet
STATE_HANDSHAKED  client has performed handshake
STATE_RELEASING  client releasing stream before publish it (for output)
STATE_FCPUBLISH  client FCPublishing stream (for output)
STATE_CONNECTING  client connected to server successfully
STATE_READY  client has sent all needed commands and waits for server reply
STATE_PLAYING  client has started receiving multimedia data from server
STATE_PUBLISHING  client has started sending multimedia data to server (for output)
STATE_STOPPED  the broadcast has been stopped

Definition at line 51 of file rtmpproto.c.


Function Documentation

static void gen_bytes_read ( URLContext s,
RTMPContext rt,
uint32_t  ts 
) [static]

Generate report on bytes read so far and send it to the server.

Definition at line 348 of file rtmpproto.c.

Referenced by get_packet().

static void gen_connect ( URLContext s,
RTMPContext rt,
const char *  proto,
const char *  host,
int  port 
) [static]

Generate 'connect' call and send it to the server.

Definition at line 108 of file rtmpproto.c.

Referenced by rtmp_open().

static void gen_create_stream ( URLContext s,
RTMPContext rt 
) [static]

Generate 'createStream' call and send it to the server.

It should make the server allocate some channel for media streams.

Definition at line 230 of file rtmpproto.c.

Referenced by rtmp_parse_result().

static void gen_delete_stream ( URLContext s,
RTMPContext rt 
) [static]

Generate 'deleteStream' call and send it to the server.

It should make the server remove some channel for media streams.

Definition at line 252 of file rtmpproto.c.

Referenced by rtmp_close().

static void gen_fcpublish_stream ( URLContext s,
RTMPContext rt 
) [static]

Generate 'FCPublish' call and send it to the server.

It should make the server preapare for receiving media streams.

Definition at line 184 of file rtmpproto.c.

Referenced by rtmp_parse_result().

static void gen_fcunpublish_stream ( URLContext s,
RTMPContext rt 
) [static]

Generate 'FCUnpublish' call and send it to the server.

It should make the server destroy stream.

Definition at line 207 of file rtmpproto.c.

Referenced by rtmp_close().

static void gen_play ( URLContext s,
RTMPContext rt 
) [static]

Generate 'play' call and send it to the server, then ping the server to start actual playing.

Definition at line 274 of file rtmpproto.c.

Referenced by rtmp_parse_result().

static void gen_pong ( URLContext s,
RTMPContext rt,
RTMPPacket ppkt 
) [static]

Generate ping reply and send it to the server.

Definition at line 332 of file rtmpproto.c.

Referenced by rtmp_parse_result().

static void gen_publish ( URLContext s,
RTMPContext rt 
) [static]

Generate 'publish' call and send it to the server.

Definition at line 308 of file rtmpproto.c.

Referenced by rtmp_parse_result().

static void gen_release_stream ( URLContext s,
RTMPContext rt 
) [static]

Generate 'releaseStream' call and send it to the server.

It should make the server release some channel for media streams.

Definition at line 161 of file rtmpproto.c.

Referenced by rtmp_parse_result().

static int get_packet ( URLContext s,
int  for_header 
) [static]

Interact with the server by receiving and sending RTMP packets until there is some significant data (media data or expected status notification).

Parameters:
s reading context
for_header non-zero value tells function to work until it gets notification from the server that playing has been started, otherwise function will work until some media data is received (or an error happens)
Returns:
0 for successful operation, negative value in case of error

Definition at line 680 of file rtmpproto.c.

Referenced by ff_audio_rechunk_interleave(), rtmp_open(), and rtmp_read().

static void rtmp_calc_digest ( const uint8_t *  src,
int  len,
int  gap,
const uint8_t *  key,
int  keylen,
uint8_t *  dst 
) [static]

Calculate HMAC-SHA2 digest for RTMP handshake packets.

Parameters:
src input buffer
len input buffer length (should be 1536)
gap offset in buffer where 32 bytes should not be taken into account when calculating digest (since it will be used to store that digest)
key digest key
keylen digest key length
dst buffer where calculated digest will be stored (32 bytes)

Definition at line 375 of file rtmpproto.c.

Referenced by rtmp_handshake(), rtmp_handshake_imprint_with_digest(), and rtmp_validate_digest().

static int rtmp_close ( URLContext h  )  [static]

Definition at line 774 of file rtmpproto.c.

static int rtmp_handshake ( URLContext s,
RTMPContext rt 
) [static]

Perform handshake with the server by means of exchanging pseudorandom data signed with HMAC-SHA2 digest.

Returns:
0 if handshake succeeds, negative value otherwise

Definition at line 464 of file rtmpproto.c.

Referenced by rtmp_open().

static int rtmp_handshake_imprint_with_digest ( uint8_t *  buf  )  [static]

Put HMAC-SHA2 digest of packet data (except for the bytes where this digest will be stored) into that packet.

Parameters:
buf handshake data (1536 bytes)
Returns:
offset to the digest inside input data

Definition at line 420 of file rtmpproto.c.

Referenced by rtmp_handshake().

static int rtmp_open ( URLContext s,
const char *  uri,
int  flags 
) [static]

Open RTMP connection and verify that the stream can be played.

URL syntax: rtmp://server[:port][/app][/playpath] where 'app' is first one or two directories in the path (e.g. /ondemand/, /flash/live/, etc.) and 'playpath' is a file name (the rest of the path, may be prefixed with "mp4:")

Definition at line 803 of file rtmpproto.c.

static int rtmp_parse_result ( URLContext s,
RTMPContext rt,
RTMPPacket pkt 
) [static]

Parse received packet and possibly perform some action depending on the packet contents.

Returns:
0 for no errors, negative values for serious errors which prevent further communications, positive values for uncritical errors

Definition at line 549 of file rtmpproto.c.

Referenced by get_packet().

static int rtmp_read ( URLContext s,
uint8_t *  buf,
int  size 
) [static]

Definition at line 900 of file rtmpproto.c.

static int rtmp_validate_digest ( uint8_t *  buf,
int  off 
) [static]

Verify that the received server response has the expected digest value.

Parameters:
buf handshake data received from the server (1536 bytes)
off position to search digest offset from
Returns:
0 if digest is valid, digest position otherwise

Definition at line 441 of file rtmpproto.c.

Referenced by rtmp_handshake().

static int rtmp_write ( URLContext s,
const uint8_t *  buf,
int  size 
) [static]

Definition at line 927 of file rtmpproto.c.


Variable Documentation

Initial value:

 {
    .name      = "rtmp",
    .url_open  = rtmp_open,
    .url_read  = rtmp_read,
    .url_write = rtmp_write,
    .url_close = rtmp_close,
}

Definition at line 993 of file rtmpproto.c.

const uint8_t rtmp_player_key[] [static]

Initial value:

 {
    'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ',
    'F', 'l', 'a', 's', 'h', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ', '0', '0', '1',

    0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1, 0x02,
    0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, 0x93, 0xB8,
    0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE
}
Client key used for digest signing.

Definition at line 84 of file rtmpproto.c.

Referenced by rtmp_handshake(), and rtmp_handshake_imprint_with_digest().

const uint8_t rtmp_server_key[] [static]

Initial value:

 {
    'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ',
    'F', 'l', 'a', 's', 'h', ' ', 'M', 'e', 'd', 'i', 'a', ' ',
    'S', 'e', 'r', 'v', 'e', 'r', ' ', '0', '0', '1',

    0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1, 0x02,
    0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, 0x93, 0xB8,
    0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE
}
Key used for RTMP server digest signing.

Definition at line 95 of file rtmpproto.c.

Referenced by rtmp_handshake(), and rtmp_validate_digest().


Generated on Fri Oct 26 02:38:21 2012 for FFmpeg by  doxygen 1.5.8