#include "libavcodec/bytestream.h"
#include "libavutil/avstring.h"
#include "libavutil/intfloat_readwrite.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 | 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 |
Definition in file rtmpproto.c.
#define HMAC_IPAD_VAL 0x36 |
#define HMAC_OPAD_VAL 0x5C |
#define PLAYER_KEY_OPEN_PART_LEN 30 |
length of partial key used for first client digest signing
Definition at line 81 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 92 of file rtmpproto.c.
Referenced by rtmp_validate_digest().
enum ClientState |
RTMP protocol handler state.
Definition at line 45 of file rtmpproto.c.
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 107 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 229 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 183 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 206 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 160 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).
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) |
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.
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 773 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.
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.
buf | handshake data (1536 bytes) |
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 801 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.
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 896 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.
buf | handshake data received from the server (1536 bytes) | |
off | position to search digest offset from |
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 923 of file rtmpproto.c.
Initial value:
{ .name = "rtmp", .url_open = rtmp_open, .url_read = rtmp_read, .url_write = rtmp_write, .url_close = rtmp_close, .priv_data_size = sizeof(RTMPContext), }
Definition at line 996 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 }
Definition at line 83 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 }
Definition at line 94 of file rtmpproto.c.
Referenced by rtmp_handshake(), and rtmp_validate_digest().