81 #define PLAYER_KEY_OPEN_PART_LEN 30
83 static const uint8_t rtmp_player_key[] = {
84 'G',
'e',
'n',
'u',
'i',
'n',
'e',
' ',
'A',
'd',
'o',
'b',
'e',
' ',
85 'F',
'l',
'a',
's',
'h',
' ',
'P',
'l',
'a',
'y',
'e',
'r',
' ',
'0',
'0',
'1',
87 0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1, 0x02,
88 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, 0x93, 0xB8,
89 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE
92 #define SERVER_KEY_OPEN_PART_LEN 36
94 static const uint8_t rtmp_server_key[] = {
95 'G',
'e',
'n',
'u',
'i',
'n',
'e',
' ',
'A',
'd',
'o',
'b',
'e',
' ',
96 'F',
'l',
'a',
's',
'h',
' ',
'M',
'e',
'd',
'i',
'a',
' ',
97 'S',
'e',
'r',
'v',
'e',
'r',
' ',
'0',
'0',
'1',
99 0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1, 0x02,
100 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, 0x93, 0xB8,
101 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE
108 const char *host,
int port)
297 bytestream_put_be16(&p, 3);
298 bytestream_put_be32(&p, 1);
299 bytestream_put_be32(&p, 256);
339 bytestream_put_be16(&p, 7);
361 #define HMAC_IPAD_VAL 0x36
362 #define HMAC_OPAD_VAL 0x5C
376 const uint8_t *key,
int keylen, uint8_t *dst)
379 uint8_t hmac_buf[64+32] = {0};
385 memcpy(hmac_buf, key, keylen);
391 for (i = 0; i < 64; i++)
404 for (i = 0; i < 64; i++)
422 int i, digest_pos = 0;
424 for (i = 8; i < 12; i++)
425 digest_pos += buf[i];
426 digest_pos = (digest_pos % 728) + 12;
443 int i, digest_pos = 0;
446 for (i = 0; i < 4; i++)
447 digest_pos += buf[i + off];
448 digest_pos = (digest_pos % 728) + off + 4;
453 if (!memcmp(digest, buf + digest_pos, 32))
478 int server_pos, client_pos;
502 serverdata[5], serverdata[6], serverdata[7], serverdata[8]);
504 if (rt->
is_input && serverdata[5] >= 3) {
532 tosend + RTMP_HANDSHAKE_PACKET_SIZE - 32);
552 const uint8_t *data_end = pkt->
data + pkt->
size;
560 if (pkt->
size != 4) {
562 "Chunk size change packet is not 4 bytes long (%d)\n", pkt->
size);
582 "Client bandwidth report packet is less than 4 bytes long (%d)\n",
595 "description", tmpstr,
sizeof(tmpstr)))
617 if (!pkt->
data[10]) {
626 if (pkt->
data[10] || pkt->
data[19] != 5 || pkt->
data[20]) {
640 const uint8_t* ptr = pkt->
data + 11;
643 for (i = 0; i < 2; i++) {
650 "level", tmpstr,
sizeof(tmpstr));
651 if (!t && !strcmp(tmpstr,
"error")) {
653 "description", tmpstr,
sizeof(tmpstr)))
658 "code", tmpstr,
sizeof(tmpstr));
661 if (!t && !strcmp(tmpstr,
"NetStream.Play.UnpublishNotify")) rt->
state =
STATE_STOPPED;
687 uint32_t ts, cts, pts=0;
735 bytestream_put_byte(&p, rpkt.
type);
736 bytestream_put_be24(&p, rpkt.
size);
737 bytestream_put_be24(&p, ts);
738 bytestream_put_byte(&p, ts >> 24);
739 bytestream_put_be24(&p, 0);
741 bytestream_put_be32(&p, 0);
752 while (next - rpkt.
data < rpkt.
size - 11) {
754 size = bytestream_get_be24(&next);
756 cts = bytestream_get_be24(&next);
757 cts |= bytestream_get_byte(&next) << 24;
762 bytestream_put_be24(&p, ts);
763 bytestream_put_byte(&p, ts >> 24);
764 next += size + 3 + 4;
805 char proto[8], hostname[256], path[1024], *fname;
812 av_url_split(proto,
sizeof(proto),
NULL, 0, hostname,
sizeof(hostname), &port,
832 if (!strncmp(path,
"/ondemand/", 10)) {
834 memcpy(rt->
app,
"ondemand", 9);
836 char *p = strchr(path + 1,
'/');
841 char *c = strchr(p + 1,
':');
842 fname = strchr(p + 1,
'/');
843 if (!fname || c < fname) {
852 if (!strchr(fname,
':') &&
853 (!strcmp(fname + strlen(fname) - 4,
".f4v") ||
854 !strcmp(fname + strlen(fname) - 4,
".mp4"))) {
871 }
while (ret == EAGAIN);
900 int orig_size =
size;
906 if (data_left >= size) {
927 int size_temp =
size;
928 int pktsize, pkttype;
930 const uint8_t *buf_temp = buf;
950 pkttype = bytestream_get_byte(&header);
951 pktsize = bytestream_get_be24(&header);
952 ts = bytestream_get_be24(&header);
953 ts |= bytestream_get_byte(&header) << 24;
954 bytestream_get_be24(&header);
993 }
while (buf_temp - buf < size);