#include "libavcodec/bytestream.h"
#include "libavutil/avstring.h"
#include "libavutil/intfloat.h"
#include "libavutil/lfg.h"
#include "libavutil/opt.h"
#include "libavutil/random_seed.h"
#include "libavutil/sha.h"
#include "avformat.h"
#include "internal.h"
#include "network.h"
#include "flv.h"
#include "rtmp.h"
#include "rtmpcrypt.h"
#include "rtmppkt.h"
#include "url.h"
Go to the source code of this file.
Data Structures | |
struct | TrackedMethod |
struct | RTMPContext |
protocol handler context More... | |
Defines | |
#define | APP_MAX_LENGTH 128 |
#define | PLAYPATH_MAX_LENGTH 256 |
#define | TCURL_MAX_LENGTH 512 |
#define | FLASHVER_MAX_LENGTH 64 |
#define | RTMP_PKTDATA_DEFAULT_SIZE 4096 |
#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 | OFFSET(x) offsetof(RTMPContext, x) |
#define | DEC AV_OPT_FLAG_DECODING_PARAM |
#define | ENC AV_OPT_FLAG_ENCODING_PARAM |
#define | RTMP_PROTOCOL(flavor) |
Enumerations | |
enum | ClientState { STATE_START, STATE_HANDSHAKED, STATE_FCPUBLISH, STATE_PLAYING, STATE_PUBLISHING, STATE_RECEIVING, STATE_STOPPED } |
RTMP protocol handler state. More... | |
Functions | |
static int | add_tracked_method (RTMPContext *rt, const char *name, int id) |
static void | del_tracked_method (RTMPContext *rt, int index) |
static int | find_tracked_method (URLContext *s, RTMPPacket *pkt, int offset, char **tracked_method) |
static void | free_tracked_methods (RTMPContext *rt) |
static int | rtmp_send_packet (RTMPContext *rt, RTMPPacket *pkt, int track) |
static int | rtmp_write_amf_data (URLContext *s, char *param, uint8_t **p) |
static int | gen_connect (URLContext *s, RTMPContext *rt) |
Generate 'connect' call and send it to the server. | |
static int | read_connect (URLContext *s, RTMPContext *rt) |
static int | gen_release_stream (URLContext *s, RTMPContext *rt) |
Generate 'releaseStream' call and send it to the server. | |
static int | gen_fcpublish_stream (URLContext *s, RTMPContext *rt) |
Generate 'FCPublish' call and send it to the server. | |
static int | gen_fcunpublish_stream (URLContext *s, RTMPContext *rt) |
Generate 'FCUnpublish' call and send it to the server. | |
static int | gen_create_stream (URLContext *s, RTMPContext *rt) |
Generate 'createStream' call and send it to the server. | |
static int | gen_delete_stream (URLContext *s, RTMPContext *rt) |
Generate 'deleteStream' call and send it to the server. | |
static int | gen_buffer_time (URLContext *s, RTMPContext *rt) |
Generate client buffer time and send it to the server. | |
static int | gen_play (URLContext *s, RTMPContext *rt) |
Generate 'play' call and send it to the server, then ping the server to start actual playing. | |
static int | gen_publish (URLContext *s, RTMPContext *rt) |
Generate 'publish' call and send it to the server. | |
static int | gen_pong (URLContext *s, RTMPContext *rt, RTMPPacket *ppkt) |
Generate ping reply and send it to the server. | |
static int | gen_swf_verification (URLContext *s, RTMPContext *rt) |
Generate SWF verification message and send it to the server. | |
static int | gen_server_bw (URLContext *s, RTMPContext *rt) |
Generate server bandwidth message and send it to the server. | |
static int | gen_check_bw (URLContext *s, RTMPContext *rt) |
Generate check bandwidth message and send it to the server. | |
static int | gen_bytes_read (URLContext *s, RTMPContext *rt, uint32_t ts) |
Generate report on bytes read so far and send it to the server. | |
static int | gen_fcsubscribe_stream (URLContext *s, RTMPContext *rt, const char *subscribe) |
int | ff_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. | |
int | ff_rtmp_calc_digest_pos (const uint8_t *buf, int off, int mod_val, int add_val) |
Calculate digest position for RTMP handshake packets. | |
static int | rtmp_handshake_imprint_with_digest (uint8_t *buf, int encrypted) |
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_calc_swf_verification (URLContext *s, RTMPContext *rt, uint8_t *buf) |
static int | rtmp_calc_swfhash (URLContext *s) |
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_receive_hs_packet (RTMPContext *rt, uint32_t *first_int, uint32_t *second_int, char *arraydata, int size) |
static int | rtmp_send_hs_packet (RTMPContext *rt, uint32_t first_int, uint32_t second_int, char *arraydata, int size) |
static int | rtmp_server_handshake (URLContext *s, RTMPContext *rt) |
rtmp handshake server side | |
static int | handle_chunk_size (URLContext *s, RTMPPacket *pkt) |
static int | handle_ping (URLContext *s, RTMPPacket *pkt) |
static int | handle_client_bw (URLContext *s, RTMPPacket *pkt) |
static int | handle_server_bw (URLContext *s, RTMPPacket *pkt) |
static int | handle_invoke_error (URLContext *s, RTMPPacket *pkt) |
static int | send_invoke_response (URLContext *s, RTMPPacket *pkt) |
static int | handle_invoke_result (URLContext *s, RTMPPacket *pkt) |
static int | handle_invoke_status (URLContext *s, RTMPPacket *pkt) |
static int | handle_invoke (URLContext *s, RTMPPacket *pkt) |
static int | handle_notify (URLContext *s, RTMPPacket *pkt) |
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. | |
static const AVOption | rtmp_options [] |
Definition in file rtmpproto.c.
#define APP_MAX_LENGTH 128 |
#define DEC AV_OPT_FLAG_DECODING_PARAM |
Definition at line 2405 of file rtmpproto.c.
#define ENC AV_OPT_FLAG_ENCODING_PARAM |
Definition at line 2406 of file rtmpproto.c.
#define FLASHVER_MAX_LENGTH 64 |
#define OFFSET | ( | x | ) | offsetof(RTMPContext, x) |
Definition at line 2404 of file rtmpproto.c.
#define PLAYER_KEY_OPEN_PART_LEN 30 |
length of partial key used for first client digest signing
Definition at line 121 of file rtmpproto.c.
Referenced by rtmp_handshake_imprint_with_digest().
#define PLAYPATH_MAX_LENGTH 256 |
#define RTMP_PKTDATA_DEFAULT_SIZE 4096 |
Definition at line 55 of file rtmpproto.c.
Referenced by read_connect(), and send_invoke_response().
#define RTMP_PROTOCOL | ( | flavor | ) |
Value:
static const AVClass flavor##_class = { \ .class_name = #flavor, \ .item_name = av_default_item_name, \ .option = rtmp_options, \ .version = LIBAVUTIL_VERSION_INT, \ }; \ \ URLProtocol ff_##flavor##_protocol = { \ .name = #flavor, \ .url_open = rtmp_open, \ .url_read = rtmp_read, \ .url_write = rtmp_write, \ .url_close = rtmp_close, \ .priv_data_size = sizeof(RTMPContext), \ .flags = URL_PROTOCOL_FLAG_NETWORK, \ .priv_data_class= &flavor##_class, \ };
Definition at line 2431 of file rtmpproto.c.
#define SERVER_KEY_OPEN_PART_LEN 36 |
length of partial key used for first server digest signing
Definition at line 132 of file rtmpproto.c.
Referenced by rtmp_validate_digest().
#define TCURL_MAX_LENGTH 512 |
enum ClientState |
RTMP protocol handler state.
Definition at line 58 of file rtmpproto.c.
static int add_tracked_method | ( | RTMPContext * | rt, | |
const char * | name, | |||
int | id | |||
) | [static] |
static void del_tracked_method | ( | RTMPContext * | rt, | |
int | index | |||
) | [static] |
int ff_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.
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 855 of file rtmpproto.c.
Referenced by ff_rtmpe_compute_secret_key(), rtmp_calc_swf_verification(), rtmp_calc_swfhash(), rtmp_handshake(), rtmp_handshake_imprint_with_digest(), and rtmp_validate_digest().
Calculate digest position for RTMP handshake packets.
buf | input buffer (should be 1536 bytes) | |
off | offset in buffer where to start calculating digest position | |
mod_val | value used for computing modulo | |
add_val | value added at the end (after computing modulo) |
Definition at line 897 of file rtmpproto.c.
Referenced by ff_rtmpe_compute_secret_key(), ff_rtmpe_gen_pub_key(), rtmp_handshake_imprint_with_digest(), and rtmp_validate_digest().
static int find_tracked_method | ( | URLContext * | s, | |
RTMPPacket * | pkt, | |||
int | offset, | |||
char ** | tracked_method | |||
) | [static] |
Definition at line 173 of file rtmpproto.c.
Referenced by handle_invoke_error(), and handle_invoke_result().
static void free_tracked_methods | ( | RTMPContext * | rt | ) | [static] |
static int gen_buffer_time | ( | URLContext * | s, | |
RTMPContext * | rt | |||
) | [static] |
Generate client buffer time and send it to the server.
Definition at line 656 of file rtmpproto.c.
Referenced by handle_invoke_result().
static int 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 819 of file rtmpproto.c.
Referenced by get_packet().
static int gen_check_bw | ( | URLContext * | s, | |
RTMPContext * | rt | |||
) | [static] |
Generate check bandwidth message and send it to the server.
Definition at line 798 of file rtmpproto.c.
Referenced by handle_invoke().
static int gen_connect | ( | URLContext * | s, | |
RTMPContext * | rt | |||
) | [static] |
Generate 'connect' call and send it to the server.
Definition at line 301 of file rtmpproto.c.
Referenced by rtmp_open().
static int 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 607 of file rtmpproto.c.
Referenced by handle_invoke_result().
static int 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 632 of file rtmpproto.c.
Referenced by rtmp_close().
static int 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 559 of file rtmpproto.c.
Referenced by handle_invoke_result().
static int gen_fcsubscribe_stream | ( | URLContext * | s, | |
RTMPContext * | rt, | |||
const char * | subscribe | |||
) | [static] |
static int 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 583 of file rtmpproto.c.
Referenced by rtmp_close().
static int 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 678 of file rtmpproto.c.
Referenced by handle_invoke_result().
static int gen_pong | ( | URLContext * | s, | |
RTMPContext * | rt, | |||
RTMPPacket * | ppkt | |||
) | [static] |
Generate ping reply and send it to the server.
Definition at line 732 of file rtmpproto.c.
Referenced by handle_ping().
static int gen_publish | ( | URLContext * | s, | |
RTMPContext * | rt | |||
) | [static] |
Generate 'publish' call and send it to the server.
Definition at line 705 of file rtmpproto.c.
Referenced by handle_invoke_result().
static int 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 535 of file rtmpproto.c.
Referenced by handle_invoke_result().
static int gen_server_bw | ( | URLContext * | s, | |
RTMPContext * | rt | |||
) | [static] |
Generate server bandwidth message and send it to the server.
Definition at line 779 of file rtmpproto.c.
Referenced by handle_invoke_result().
static int gen_swf_verification | ( | URLContext * | s, | |
RTMPContext * | rt | |||
) | [static] |
Generate SWF verification message and send it to the server.
Definition at line 758 of file rtmpproto.c.
Referenced by handle_ping().
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 1926 of file rtmpproto.c.
Referenced by ff_audio_rechunk_interleave(), rtmp_open(), and rtmp_read().
static int handle_chunk_size | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int handle_client_bw | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int handle_invoke | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int handle_invoke_error | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int handle_invoke_result | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int handle_invoke_status | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int handle_notify | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int handle_ping | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int handle_server_bw | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
static int read_connect | ( | URLContext * | s, | |
RTMPContext * | rt | |||
) | [static] |
static int rtmp_calc_swf_verification | ( | URLContext * | s, | |
RTMPContext * | rt, | |||
uint8_t * | buf | |||
) | [static] |
static int rtmp_calc_swfhash | ( | URLContext * | s | ) | [static] |
static int rtmp_close | ( | URLContext * | h | ) | [static] |
Definition at line 2030 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 1113 of file rtmpproto.c.
Referenced by rtmp_open().
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) | |
encrypted | use an encrypted connection (RTMPE) |
Definition at line 917 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 2060 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 1870 of file rtmpproto.c.
Referenced by get_packet(), and rtmp_write().
static int rtmp_read | ( | URLContext * | s, | |
uint8_t * | buf, | |||
int | size | |||
) | [static] |
Definition at line 2265 of file rtmpproto.c.
static int rtmp_receive_hs_packet | ( | RTMPContext * | rt, | |
uint32_t * | first_int, | |||
uint32_t * | second_int, | |||
char * | arraydata, | |||
int | size | |||
) | [static] |
static int rtmp_send_hs_packet | ( | RTMPContext * | rt, | |
uint32_t | first_int, | |||
uint32_t | second_int, | |||
char * | arraydata, | |||
int | size | |||
) | [static] |
static int rtmp_send_packet | ( | RTMPContext * | rt, | |
RTMPPacket * | pkt, | |||
int | track | |||
) | [static] |
Definition at line 207 of file rtmpproto.c.
Referenced by gen_buffer_time(), gen_bytes_read(), gen_check_bw(), gen_connect(), gen_create_stream(), gen_delete_stream(), gen_fcpublish_stream(), gen_fcsubscribe_stream(), gen_fcunpublish_stream(), gen_play(), gen_pong(), gen_publish(), gen_release_stream(), gen_server_bw(), gen_swf_verification(), and rtmp_write().
static int rtmp_server_handshake | ( | URLContext * | s, | |
RTMPContext * | rt | |||
) | [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 942 of file rtmpproto.c.
Referenced by rtmp_handshake().
static int rtmp_write | ( | URLContext * | s, | |
const uint8_t * | buf, | |||
int | size | |||
) | [static] |
Definition at line 2292 of file rtmpproto.c.
static int rtmp_write_amf_data | ( | URLContext * | s, | |
char * | param, | |||
uint8_t ** | p | |||
) | [static] |
static int send_invoke_response | ( | URLContext * | s, | |
RTMPPacket * | pkt | |||
) | [static] |
const AVOption rtmp_options[] [static] |
Initial value:
{ {"rtmp_app", "Name of application to connect to on the RTMP server", OFFSET(app), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_buffer", "Set buffer time in milliseconds. The default is 3000.", OFFSET(client_buffer_time), AV_OPT_TYPE_INT, {.i64 = 3000}, 0, INT_MAX, DEC|ENC}, {"rtmp_conn", "Append arbitrary AMF data to the Connect message", OFFSET(conn), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_flashver", "Version of the Flash plugin used to run the SWF player.", OFFSET(flashver), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_flush_interval", "Number of packets flushed in the same request (RTMPT only).", OFFSET(flush_interval), AV_OPT_TYPE_INT, {.i64 = 10}, 0, INT_MAX, ENC}, {"rtmp_live", "Specify that the media is a live stream.", OFFSET(live), AV_OPT_TYPE_INT, {.i64 = -2}, INT_MIN, INT_MAX, DEC, "rtmp_live"}, {"any", "both", 0, AV_OPT_TYPE_CONST, {.i64 = -2}, 0, 0, DEC, "rtmp_live"}, {"live", "live stream", 0, AV_OPT_TYPE_CONST, {.i64 = -1}, 0, 0, DEC, "rtmp_live"}, {"recorded", "recorded stream", 0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, DEC, "rtmp_live"}, {"rtmp_pageurl", "URL of the web page in which the media was embedded. By default no value will be sent.", OFFSET(pageurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC}, {"rtmp_playpath", "Stream identifier to play or to publish", OFFSET(playpath), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_subscribe", "Name of live stream to subscribe to. Defaults to rtmp_playpath.", OFFSET(subscribe), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC}, {"rtmp_swfhash", "SHA256 hash of the decompressed SWF file (32 bytes).", OFFSET(swfhash), AV_OPT_TYPE_BINARY, .flags = DEC}, {"rtmp_swfsize", "Size of the decompressed SWF file, required for SWFVerification.", OFFSET(swfsize), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, DEC}, {"rtmp_swfurl", "URL of the SWF player. By default no value will be sent", OFFSET(swfurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_swfverify", "URL to player swf file, compute hash/size automatically.", OFFSET(swfverify), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC}, {"rtmp_tcurl", "URL of the target stream. Defaults to proto://host[:port]/app.", OFFSET(tcurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_listen", "Listen for incoming rtmp connections", OFFSET(listen), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC, "rtmp_listen" }, {"timeout", "Maximum timeout (in seconds) to wait for incoming connections. -1 is infinite. Implies -rtmp_listen 1", OFFSET(listen_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX, DEC, "rtmp_listen" }, { NULL }, }
Definition at line 2408 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 123 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 134 of file rtmpproto.c.
Referenced by rtmp_handshake(), and rtmp_validate_digest().