You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1080 lines
37KB

  1. /*
  2. * RTMP network protocol
  3. * Copyright (c) 2009 Kostya Shishkov
  4. *
  5. * This file is part of Libav.
  6. *
  7. * Libav is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * Libav is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file
  23. * RTMP protocol
  24. */
  25. #include "libavcodec/bytestream.h"
  26. #include "libavutil/avstring.h"
  27. #include "libavutil/intfloat.h"
  28. #include "libavutil/lfg.h"
  29. #include "libavutil/opt.h"
  30. #include "libavutil/sha.h"
  31. #include "avformat.h"
  32. #include "internal.h"
  33. #include "network.h"
  34. #include "flv.h"
  35. #include "rtmp.h"
  36. #include "rtmppkt.h"
  37. #include "url.h"
  38. //#define DEBUG
  39. #define APP_MAX_LENGTH 128
  40. #define PLAYPATH_MAX_LENGTH 256
  41. /** RTMP protocol handler state */
  42. typedef enum {
  43. STATE_START, ///< client has not done anything yet
  44. STATE_HANDSHAKED, ///< client has performed handshake
  45. STATE_RELEASING, ///< client releasing stream before publish it (for output)
  46. STATE_FCPUBLISH, ///< client FCPublishing stream (for output)
  47. STATE_CONNECTING, ///< client connected to server successfully
  48. STATE_READY, ///< client has sent all needed commands and waits for server reply
  49. STATE_PLAYING, ///< client has started receiving multimedia data from server
  50. STATE_PUBLISHING, ///< client has started sending multimedia data to server (for output)
  51. STATE_STOPPED, ///< the broadcast has been stopped
  52. } ClientState;
  53. /** protocol handler context */
  54. typedef struct RTMPContext {
  55. const AVClass *class;
  56. URLContext* stream; ///< TCP stream used in interactions with RTMP server
  57. RTMPPacket prev_pkt[2][RTMP_CHANNELS]; ///< packet history used when reading and sending packets
  58. int chunk_size; ///< size of the chunks RTMP packets are divided into
  59. int is_input; ///< input/output flag
  60. char *playpath; ///< stream identifier to play (with possible "mp4:" prefix)
  61. int live; ///< 0: recorded, -1: live, -2: both
  62. char *app; ///< name of application
  63. ClientState state; ///< current state
  64. int main_channel_id; ///< an additional channel ID which is used for some invocations
  65. uint8_t* flv_data; ///< buffer with data for demuxer
  66. int flv_size; ///< current buffer size
  67. int flv_off; ///< number of bytes read from current buffer
  68. RTMPPacket out_pkt; ///< rtmp packet, created from flv a/v or metadata (for output)
  69. uint32_t client_report_size; ///< number of bytes after which client should report to server
  70. uint32_t bytes_read; ///< number of bytes read from server
  71. uint32_t last_bytes_read; ///< number of bytes read last reported to server
  72. int skip_bytes; ///< number of bytes to skip from the input FLV stream in the next write call
  73. uint8_t flv_header[11]; ///< partial incoming flv packet header
  74. int flv_header_bytes; ///< number of initialized bytes in flv_header
  75. int nb_invokes; ///< keeps track of invoke messages
  76. int create_stream_invoke; ///< invoke id for the create stream command
  77. } RTMPContext;
  78. #define PLAYER_KEY_OPEN_PART_LEN 30 ///< length of partial key used for first client digest signing
  79. /** Client key used for digest signing */
  80. static const uint8_t rtmp_player_key[] = {
  81. 'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ',
  82. 'F', 'l', 'a', 's', 'h', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ', '0', '0', '1',
  83. 0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1, 0x02,
  84. 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, 0x93, 0xB8,
  85. 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE
  86. };
  87. #define SERVER_KEY_OPEN_PART_LEN 36 ///< length of partial key used for first server digest signing
  88. /** Key used for RTMP server digest signing */
  89. static const uint8_t rtmp_server_key[] = {
  90. 'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ',
  91. 'F', 'l', 'a', 's', 'h', ' ', 'M', 'e', 'd', 'i', 'a', ' ',
  92. 'S', 'e', 'r', 'v', 'e', 'r', ' ', '0', '0', '1',
  93. 0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1, 0x02,
  94. 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, 0x93, 0xB8,
  95. 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE
  96. };
  97. /**
  98. * Generate 'connect' call and send it to the server.
  99. */
  100. static void gen_connect(URLContext *s, RTMPContext *rt, const char *proto,
  101. const char *host, int port)
  102. {
  103. RTMPPacket pkt;
  104. uint8_t ver[64], *p;
  105. char tcurl[512];
  106. ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0, 4096);
  107. p = pkt.data;
  108. ff_url_join(tcurl, sizeof(tcurl), proto, NULL, host, port, "/%s", rt->app);
  109. ff_amf_write_string(&p, "connect");
  110. ff_amf_write_number(&p, ++rt->nb_invokes);
  111. ff_amf_write_object_start(&p);
  112. ff_amf_write_field_name(&p, "app");
  113. ff_amf_write_string(&p, rt->app);
  114. if (rt->is_input) {
  115. snprintf(ver, sizeof(ver), "%s %d,%d,%d,%d", RTMP_CLIENT_PLATFORM, RTMP_CLIENT_VER1,
  116. RTMP_CLIENT_VER2, RTMP_CLIENT_VER3, RTMP_CLIENT_VER4);
  117. } else {
  118. snprintf(ver, sizeof(ver), "FMLE/3.0 (compatible; %s)", LIBAVFORMAT_IDENT);
  119. ff_amf_write_field_name(&p, "type");
  120. ff_amf_write_string(&p, "nonprivate");
  121. }
  122. ff_amf_write_field_name(&p, "flashVer");
  123. ff_amf_write_string(&p, ver);
  124. ff_amf_write_field_name(&p, "tcUrl");
  125. ff_amf_write_string(&p, tcurl);
  126. if (rt->is_input) {
  127. ff_amf_write_field_name(&p, "fpad");
  128. ff_amf_write_bool(&p, 0);
  129. ff_amf_write_field_name(&p, "capabilities");
  130. ff_amf_write_number(&p, 15.0);
  131. /* Tell the server we support all the audio codecs except
  132. * SUPPORT_SND_INTEL (0x0008) and SUPPORT_SND_UNUSED (0x0010)
  133. * which are unused in the RTMP protocol implementation. */
  134. ff_amf_write_field_name(&p, "audioCodecs");
  135. ff_amf_write_number(&p, 4071.0);
  136. ff_amf_write_field_name(&p, "videoCodecs");
  137. ff_amf_write_number(&p, 252.0);
  138. ff_amf_write_field_name(&p, "videoFunction");
  139. ff_amf_write_number(&p, 1.0);
  140. }
  141. ff_amf_write_object_end(&p);
  142. pkt.data_size = p - pkt.data;
  143. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  144. ff_rtmp_packet_destroy(&pkt);
  145. }
  146. /**
  147. * Generate 'releaseStream' call and send it to the server. It should make
  148. * the server release some channel for media streams.
  149. */
  150. static void gen_release_stream(URLContext *s, RTMPContext *rt)
  151. {
  152. RTMPPacket pkt;
  153. uint8_t *p;
  154. ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0,
  155. 29 + strlen(rt->playpath));
  156. av_log(s, AV_LOG_DEBUG, "Releasing stream...\n");
  157. p = pkt.data;
  158. ff_amf_write_string(&p, "releaseStream");
  159. ff_amf_write_number(&p, ++rt->nb_invokes);
  160. ff_amf_write_null(&p);
  161. ff_amf_write_string(&p, rt->playpath);
  162. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  163. ff_rtmp_packet_destroy(&pkt);
  164. }
  165. /**
  166. * Generate 'FCPublish' call and send it to the server. It should make
  167. * the server preapare for receiving media streams.
  168. */
  169. static void gen_fcpublish_stream(URLContext *s, RTMPContext *rt)
  170. {
  171. RTMPPacket pkt;
  172. uint8_t *p;
  173. ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0,
  174. 25 + strlen(rt->playpath));
  175. av_log(s, AV_LOG_DEBUG, "FCPublish stream...\n");
  176. p = pkt.data;
  177. ff_amf_write_string(&p, "FCPublish");
  178. ff_amf_write_number(&p, ++rt->nb_invokes);
  179. ff_amf_write_null(&p);
  180. ff_amf_write_string(&p, rt->playpath);
  181. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  182. ff_rtmp_packet_destroy(&pkt);
  183. }
  184. /**
  185. * Generate 'FCUnpublish' call and send it to the server. It should make
  186. * the server destroy stream.
  187. */
  188. static void gen_fcunpublish_stream(URLContext *s, RTMPContext *rt)
  189. {
  190. RTMPPacket pkt;
  191. uint8_t *p;
  192. ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0,
  193. 27 + strlen(rt->playpath));
  194. av_log(s, AV_LOG_DEBUG, "UnPublishing stream...\n");
  195. p = pkt.data;
  196. ff_amf_write_string(&p, "FCUnpublish");
  197. ff_amf_write_number(&p, ++rt->nb_invokes);
  198. ff_amf_write_null(&p);
  199. ff_amf_write_string(&p, rt->playpath);
  200. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  201. ff_rtmp_packet_destroy(&pkt);
  202. }
  203. /**
  204. * Generate 'createStream' call and send it to the server. It should make
  205. * the server allocate some channel for media streams.
  206. */
  207. static void gen_create_stream(URLContext *s, RTMPContext *rt)
  208. {
  209. RTMPPacket pkt;
  210. uint8_t *p;
  211. av_log(s, AV_LOG_DEBUG, "Creating stream...\n");
  212. ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0, 25);
  213. p = pkt.data;
  214. ff_amf_write_string(&p, "createStream");
  215. ff_amf_write_number(&p, ++rt->nb_invokes);
  216. ff_amf_write_null(&p);
  217. rt->create_stream_invoke = rt->nb_invokes;
  218. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  219. ff_rtmp_packet_destroy(&pkt);
  220. }
  221. /**
  222. * Generate 'deleteStream' call and send it to the server. It should make
  223. * the server remove some channel for media streams.
  224. */
  225. static void gen_delete_stream(URLContext *s, RTMPContext *rt)
  226. {
  227. RTMPPacket pkt;
  228. uint8_t *p;
  229. av_log(s, AV_LOG_DEBUG, "Deleting stream...\n");
  230. ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0, 34);
  231. p = pkt.data;
  232. ff_amf_write_string(&p, "deleteStream");
  233. ff_amf_write_number(&p, ++rt->nb_invokes);
  234. ff_amf_write_null(&p);
  235. ff_amf_write_number(&p, rt->main_channel_id);
  236. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  237. ff_rtmp_packet_destroy(&pkt);
  238. }
  239. /**
  240. * Generate 'play' call and send it to the server, then ping the server
  241. * to start actual playing.
  242. */
  243. static void gen_play(URLContext *s, RTMPContext *rt)
  244. {
  245. RTMPPacket pkt;
  246. uint8_t *p;
  247. av_log(s, AV_LOG_DEBUG, "Sending play command for '%s'\n", rt->playpath);
  248. ff_rtmp_packet_create(&pkt, RTMP_VIDEO_CHANNEL, RTMP_PT_INVOKE, 0,
  249. 29 + strlen(rt->playpath));
  250. pkt.extra = rt->main_channel_id;
  251. p = pkt.data;
  252. ff_amf_write_string(&p, "play");
  253. ff_amf_write_number(&p, ++rt->nb_invokes);
  254. ff_amf_write_null(&p);
  255. ff_amf_write_string(&p, rt->playpath);
  256. ff_amf_write_number(&p, rt->live);
  257. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  258. ff_rtmp_packet_destroy(&pkt);
  259. // set client buffer time disguised in ping packet
  260. ff_rtmp_packet_create(&pkt, RTMP_NETWORK_CHANNEL, RTMP_PT_PING, 1, 10);
  261. p = pkt.data;
  262. bytestream_put_be16(&p, 3);
  263. bytestream_put_be32(&p, 1);
  264. bytestream_put_be32(&p, 256); //TODO: what is a good value here?
  265. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  266. ff_rtmp_packet_destroy(&pkt);
  267. }
  268. /**
  269. * Generate 'publish' call and send it to the server.
  270. */
  271. static void gen_publish(URLContext *s, RTMPContext *rt)
  272. {
  273. RTMPPacket pkt;
  274. uint8_t *p;
  275. av_log(s, AV_LOG_DEBUG, "Sending publish command for '%s'\n", rt->playpath);
  276. ff_rtmp_packet_create(&pkt, RTMP_SOURCE_CHANNEL, RTMP_PT_INVOKE, 0,
  277. 30 + strlen(rt->playpath));
  278. pkt.extra = rt->main_channel_id;
  279. p = pkt.data;
  280. ff_amf_write_string(&p, "publish");
  281. ff_amf_write_number(&p, ++rt->nb_invokes);
  282. ff_amf_write_null(&p);
  283. ff_amf_write_string(&p, rt->playpath);
  284. ff_amf_write_string(&p, "live");
  285. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  286. ff_rtmp_packet_destroy(&pkt);
  287. }
  288. /**
  289. * Generate ping reply and send it to the server.
  290. */
  291. static void gen_pong(URLContext *s, RTMPContext *rt, RTMPPacket *ppkt)
  292. {
  293. RTMPPacket pkt;
  294. uint8_t *p;
  295. ff_rtmp_packet_create(&pkt, RTMP_NETWORK_CHANNEL, RTMP_PT_PING, ppkt->timestamp + 1, 6);
  296. p = pkt.data;
  297. bytestream_put_be16(&p, 7);
  298. bytestream_put_be32(&p, AV_RB32(ppkt->data+2));
  299. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  300. ff_rtmp_packet_destroy(&pkt);
  301. }
  302. /**
  303. * Generate server bandwidth message and send it to the server.
  304. */
  305. static void gen_server_bw(URLContext *s, RTMPContext *rt)
  306. {
  307. RTMPPacket pkt;
  308. uint8_t *p;
  309. ff_rtmp_packet_create(&pkt, RTMP_NETWORK_CHANNEL, RTMP_PT_SERVER_BW, 0, 4);
  310. p = pkt.data;
  311. bytestream_put_be32(&p, 2500000);
  312. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  313. ff_rtmp_packet_destroy(&pkt);
  314. }
  315. /**
  316. * Generate report on bytes read so far and send it to the server.
  317. */
  318. static void gen_bytes_read(URLContext *s, RTMPContext *rt, uint32_t ts)
  319. {
  320. RTMPPacket pkt;
  321. uint8_t *p;
  322. ff_rtmp_packet_create(&pkt, RTMP_NETWORK_CHANNEL, RTMP_PT_BYTES_READ, ts, 4);
  323. p = pkt.data;
  324. bytestream_put_be32(&p, rt->bytes_read);
  325. ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
  326. ff_rtmp_packet_destroy(&pkt);
  327. }
  328. //TODO: Move HMAC code somewhere. Eventually.
  329. #define HMAC_IPAD_VAL 0x36
  330. #define HMAC_OPAD_VAL 0x5C
  331. /**
  332. * Calculate HMAC-SHA2 digest for RTMP handshake packets.
  333. *
  334. * @param src input buffer
  335. * @param len input buffer length (should be 1536)
  336. * @param gap offset in buffer where 32 bytes should not be taken into account
  337. * when calculating digest (since it will be used to store that digest)
  338. * @param key digest key
  339. * @param keylen digest key length
  340. * @param dst buffer where calculated digest will be stored (32 bytes)
  341. */
  342. static void rtmp_calc_digest(const uint8_t *src, int len, int gap,
  343. const uint8_t *key, int keylen, uint8_t *dst)
  344. {
  345. struct AVSHA *sha;
  346. uint8_t hmac_buf[64+32] = {0};
  347. int i;
  348. sha = av_mallocz(av_sha_size);
  349. if (keylen < 64) {
  350. memcpy(hmac_buf, key, keylen);
  351. } else {
  352. av_sha_init(sha, 256);
  353. av_sha_update(sha,key, keylen);
  354. av_sha_final(sha, hmac_buf);
  355. }
  356. for (i = 0; i < 64; i++)
  357. hmac_buf[i] ^= HMAC_IPAD_VAL;
  358. av_sha_init(sha, 256);
  359. av_sha_update(sha, hmac_buf, 64);
  360. if (gap <= 0) {
  361. av_sha_update(sha, src, len);
  362. } else { //skip 32 bytes used for storing digest
  363. av_sha_update(sha, src, gap);
  364. av_sha_update(sha, src + gap + 32, len - gap - 32);
  365. }
  366. av_sha_final(sha, hmac_buf + 64);
  367. for (i = 0; i < 64; i++)
  368. hmac_buf[i] ^= HMAC_IPAD_VAL ^ HMAC_OPAD_VAL; //reuse XORed key for opad
  369. av_sha_init(sha, 256);
  370. av_sha_update(sha, hmac_buf, 64+32);
  371. av_sha_final(sha, dst);
  372. av_free(sha);
  373. }
  374. /**
  375. * Put HMAC-SHA2 digest of packet data (except for the bytes where this digest
  376. * will be stored) into that packet.
  377. *
  378. * @param buf handshake data (1536 bytes)
  379. * @return offset to the digest inside input data
  380. */
  381. static int rtmp_handshake_imprint_with_digest(uint8_t *buf)
  382. {
  383. int i, digest_pos = 0;
  384. for (i = 8; i < 12; i++)
  385. digest_pos += buf[i];
  386. digest_pos = (digest_pos % 728) + 12;
  387. rtmp_calc_digest(buf, RTMP_HANDSHAKE_PACKET_SIZE, digest_pos,
  388. rtmp_player_key, PLAYER_KEY_OPEN_PART_LEN,
  389. buf + digest_pos);
  390. return digest_pos;
  391. }
  392. /**
  393. * Verify that the received server response has the expected digest value.
  394. *
  395. * @param buf handshake data received from the server (1536 bytes)
  396. * @param off position to search digest offset from
  397. * @return 0 if digest is valid, digest position otherwise
  398. */
  399. static int rtmp_validate_digest(uint8_t *buf, int off)
  400. {
  401. int i, digest_pos = 0;
  402. uint8_t digest[32];
  403. for (i = 0; i < 4; i++)
  404. digest_pos += buf[i + off];
  405. digest_pos = (digest_pos % 728) + off + 4;
  406. rtmp_calc_digest(buf, RTMP_HANDSHAKE_PACKET_SIZE, digest_pos,
  407. rtmp_server_key, SERVER_KEY_OPEN_PART_LEN,
  408. digest);
  409. if (!memcmp(digest, buf + digest_pos, 32))
  410. return digest_pos;
  411. return 0;
  412. }
  413. /**
  414. * Perform handshake with the server by means of exchanging pseudorandom data
  415. * signed with HMAC-SHA2 digest.
  416. *
  417. * @return 0 if handshake succeeds, negative value otherwise
  418. */
  419. static int rtmp_handshake(URLContext *s, RTMPContext *rt)
  420. {
  421. AVLFG rnd;
  422. uint8_t tosend [RTMP_HANDSHAKE_PACKET_SIZE+1] = {
  423. 3, // unencrypted data
  424. 0, 0, 0, 0, // client uptime
  425. RTMP_CLIENT_VER1,
  426. RTMP_CLIENT_VER2,
  427. RTMP_CLIENT_VER3,
  428. RTMP_CLIENT_VER4,
  429. };
  430. uint8_t clientdata[RTMP_HANDSHAKE_PACKET_SIZE];
  431. uint8_t serverdata[RTMP_HANDSHAKE_PACKET_SIZE+1];
  432. int i;
  433. int server_pos, client_pos;
  434. uint8_t digest[32];
  435. av_log(s, AV_LOG_DEBUG, "Handshaking...\n");
  436. av_lfg_init(&rnd, 0xDEADC0DE);
  437. // generate handshake packet - 1536 bytes of pseudorandom data
  438. for (i = 9; i <= RTMP_HANDSHAKE_PACKET_SIZE; i++)
  439. tosend[i] = av_lfg_get(&rnd) >> 24;
  440. client_pos = rtmp_handshake_imprint_with_digest(tosend + 1);
  441. ffurl_write(rt->stream, tosend, RTMP_HANDSHAKE_PACKET_SIZE + 1);
  442. i = ffurl_read_complete(rt->stream, serverdata, RTMP_HANDSHAKE_PACKET_SIZE + 1);
  443. if (i != RTMP_HANDSHAKE_PACKET_SIZE + 1) {
  444. av_log(s, AV_LOG_ERROR, "Cannot read RTMP handshake response\n");
  445. return -1;
  446. }
  447. i = ffurl_read_complete(rt->stream, clientdata, RTMP_HANDSHAKE_PACKET_SIZE);
  448. if (i != RTMP_HANDSHAKE_PACKET_SIZE) {
  449. av_log(s, AV_LOG_ERROR, "Cannot read RTMP handshake response\n");
  450. return -1;
  451. }
  452. av_log(s, AV_LOG_DEBUG, "Server version %d.%d.%d.%d\n",
  453. serverdata[5], serverdata[6], serverdata[7], serverdata[8]);
  454. if (rt->is_input && serverdata[5] >= 3) {
  455. server_pos = rtmp_validate_digest(serverdata + 1, 772);
  456. if (!server_pos) {
  457. server_pos = rtmp_validate_digest(serverdata + 1, 8);
  458. if (!server_pos) {
  459. av_log(s, AV_LOG_ERROR, "Server response validating failed\n");
  460. return -1;
  461. }
  462. }
  463. rtmp_calc_digest(tosend + 1 + client_pos, 32, 0,
  464. rtmp_server_key, sizeof(rtmp_server_key),
  465. digest);
  466. rtmp_calc_digest(clientdata, RTMP_HANDSHAKE_PACKET_SIZE-32, 0,
  467. digest, 32,
  468. digest);
  469. if (memcmp(digest, clientdata + RTMP_HANDSHAKE_PACKET_SIZE - 32, 32)) {
  470. av_log(s, AV_LOG_ERROR, "Signature mismatch\n");
  471. return -1;
  472. }
  473. for (i = 0; i < RTMP_HANDSHAKE_PACKET_SIZE; i++)
  474. tosend[i] = av_lfg_get(&rnd) >> 24;
  475. rtmp_calc_digest(serverdata + 1 + server_pos, 32, 0,
  476. rtmp_player_key, sizeof(rtmp_player_key),
  477. digest);
  478. rtmp_calc_digest(tosend, RTMP_HANDSHAKE_PACKET_SIZE - 32, 0,
  479. digest, 32,
  480. tosend + RTMP_HANDSHAKE_PACKET_SIZE - 32);
  481. // write reply back to the server
  482. ffurl_write(rt->stream, tosend, RTMP_HANDSHAKE_PACKET_SIZE);
  483. } else {
  484. ffurl_write(rt->stream, serverdata+1, RTMP_HANDSHAKE_PACKET_SIZE);
  485. }
  486. return 0;
  487. }
  488. /**
  489. * Parse received packet and possibly perform some action depending on
  490. * the packet contents.
  491. * @return 0 for no errors, negative values for serious errors which prevent
  492. * further communications, positive values for uncritical errors
  493. */
  494. static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt)
  495. {
  496. int i, t;
  497. const uint8_t *data_end = pkt->data + pkt->data_size;
  498. #ifdef DEBUG
  499. ff_rtmp_packet_dump(s, pkt);
  500. #endif
  501. switch (pkt->type) {
  502. case RTMP_PT_CHUNK_SIZE:
  503. if (pkt->data_size != 4) {
  504. av_log(s, AV_LOG_ERROR,
  505. "Chunk size change packet is not 4 bytes long (%d)\n", pkt->data_size);
  506. return -1;
  507. }
  508. if (!rt->is_input)
  509. ff_rtmp_packet_write(rt->stream, pkt, rt->chunk_size, rt->prev_pkt[1]);
  510. rt->chunk_size = AV_RB32(pkt->data);
  511. if (rt->chunk_size <= 0) {
  512. av_log(s, AV_LOG_ERROR, "Incorrect chunk size %d\n", rt->chunk_size);
  513. return -1;
  514. }
  515. av_log(s, AV_LOG_DEBUG, "New chunk size = %d\n", rt->chunk_size);
  516. break;
  517. case RTMP_PT_PING:
  518. t = AV_RB16(pkt->data);
  519. if (t == 6)
  520. gen_pong(s, rt, pkt);
  521. break;
  522. case RTMP_PT_CLIENT_BW:
  523. if (pkt->data_size < 4) {
  524. av_log(s, AV_LOG_ERROR,
  525. "Client bandwidth report packet is less than 4 bytes long (%d)\n",
  526. pkt->data_size);
  527. return -1;
  528. }
  529. av_log(s, AV_LOG_DEBUG, "Client bandwidth = %d\n", AV_RB32(pkt->data));
  530. rt->client_report_size = AV_RB32(pkt->data) >> 1;
  531. break;
  532. case RTMP_PT_INVOKE:
  533. //TODO: check for the messages sent for wrong state?
  534. if (!memcmp(pkt->data, "\002\000\006_error", 9)) {
  535. uint8_t tmpstr[256];
  536. if (!ff_amf_get_field_value(pkt->data + 9, data_end,
  537. "description", tmpstr, sizeof(tmpstr)))
  538. av_log(s, AV_LOG_ERROR, "Server error: %s\n",tmpstr);
  539. return -1;
  540. } else if (!memcmp(pkt->data, "\002\000\007_result", 10)) {
  541. switch (rt->state) {
  542. case STATE_HANDSHAKED:
  543. if (!rt->is_input) {
  544. gen_release_stream(s, rt);
  545. gen_fcpublish_stream(s, rt);
  546. rt->state = STATE_RELEASING;
  547. } else {
  548. gen_server_bw(s, rt);
  549. rt->state = STATE_CONNECTING;
  550. }
  551. gen_create_stream(s, rt);
  552. break;
  553. case STATE_FCPUBLISH:
  554. rt->state = STATE_CONNECTING;
  555. break;
  556. case STATE_RELEASING:
  557. rt->state = STATE_FCPUBLISH;
  558. /* hack for Wowza Media Server, it does not send result for
  559. * releaseStream and FCPublish calls */
  560. if (!pkt->data[10]) {
  561. int pkt_id = av_int2double(AV_RB64(pkt->data + 11));
  562. if (pkt_id == rt->create_stream_invoke)
  563. rt->state = STATE_CONNECTING;
  564. }
  565. if (rt->state != STATE_CONNECTING)
  566. break;
  567. case STATE_CONNECTING:
  568. //extract a number from the result
  569. if (pkt->data[10] || pkt->data[19] != 5 || pkt->data[20]) {
  570. av_log(s, AV_LOG_WARNING, "Unexpected reply on connect()\n");
  571. } else {
  572. rt->main_channel_id = av_int2double(AV_RB64(pkt->data + 21));
  573. }
  574. if (rt->is_input) {
  575. gen_play(s, rt);
  576. } else {
  577. gen_publish(s, rt);
  578. }
  579. rt->state = STATE_READY;
  580. break;
  581. }
  582. } else if (!memcmp(pkt->data, "\002\000\010onStatus", 11)) {
  583. const uint8_t* ptr = pkt->data + 11;
  584. uint8_t tmpstr[256];
  585. for (i = 0; i < 2; i++) {
  586. t = ff_amf_tag_size(ptr, data_end);
  587. if (t < 0)
  588. return 1;
  589. ptr += t;
  590. }
  591. t = ff_amf_get_field_value(ptr, data_end,
  592. "level", tmpstr, sizeof(tmpstr));
  593. if (!t && !strcmp(tmpstr, "error")) {
  594. if (!ff_amf_get_field_value(ptr, data_end,
  595. "description", tmpstr, sizeof(tmpstr)))
  596. av_log(s, AV_LOG_ERROR, "Server error: %s\n",tmpstr);
  597. return -1;
  598. }
  599. t = ff_amf_get_field_value(ptr, data_end,
  600. "code", tmpstr, sizeof(tmpstr));
  601. if (!t && !strcmp(tmpstr, "NetStream.Play.Start")) rt->state = STATE_PLAYING;
  602. if (!t && !strcmp(tmpstr, "NetStream.Play.Stop")) rt->state = STATE_STOPPED;
  603. if (!t && !strcmp(tmpstr, "NetStream.Play.UnpublishNotify")) rt->state = STATE_STOPPED;
  604. if (!t && !strcmp(tmpstr, "NetStream.Publish.Start")) rt->state = STATE_PUBLISHING;
  605. }
  606. break;
  607. }
  608. return 0;
  609. }
  610. /**
  611. * Interact with the server by receiving and sending RTMP packets until
  612. * there is some significant data (media data or expected status notification).
  613. *
  614. * @param s reading context
  615. * @param for_header non-zero value tells function to work until it
  616. * gets notification from the server that playing has been started,
  617. * otherwise function will work until some media data is received (or
  618. * an error happens)
  619. * @return 0 for successful operation, negative value in case of error
  620. */
  621. static int get_packet(URLContext *s, int for_header)
  622. {
  623. RTMPContext *rt = s->priv_data;
  624. int ret;
  625. uint8_t *p;
  626. const uint8_t *next;
  627. uint32_t data_size;
  628. uint32_t ts, cts, pts=0;
  629. if (rt->state == STATE_STOPPED)
  630. return AVERROR_EOF;
  631. for (;;) {
  632. RTMPPacket rpkt = { 0 };
  633. if ((ret = ff_rtmp_packet_read(rt->stream, &rpkt,
  634. rt->chunk_size, rt->prev_pkt[0])) <= 0) {
  635. if (ret == 0) {
  636. return AVERROR(EAGAIN);
  637. } else {
  638. return AVERROR(EIO);
  639. }
  640. }
  641. rt->bytes_read += ret;
  642. if (rt->bytes_read > rt->last_bytes_read + rt->client_report_size) {
  643. av_log(s, AV_LOG_DEBUG, "Sending bytes read report\n");
  644. gen_bytes_read(s, rt, rpkt.timestamp + 1);
  645. rt->last_bytes_read = rt->bytes_read;
  646. }
  647. ret = rtmp_parse_result(s, rt, &rpkt);
  648. if (ret < 0) {//serious error in current packet
  649. ff_rtmp_packet_destroy(&rpkt);
  650. return -1;
  651. }
  652. if (rt->state == STATE_STOPPED) {
  653. ff_rtmp_packet_destroy(&rpkt);
  654. return AVERROR_EOF;
  655. }
  656. if (for_header && (rt->state == STATE_PLAYING || rt->state == STATE_PUBLISHING)) {
  657. ff_rtmp_packet_destroy(&rpkt);
  658. return 0;
  659. }
  660. if (!rpkt.data_size || !rt->is_input) {
  661. ff_rtmp_packet_destroy(&rpkt);
  662. continue;
  663. }
  664. if (rpkt.type == RTMP_PT_VIDEO || rpkt.type == RTMP_PT_AUDIO ||
  665. (rpkt.type == RTMP_PT_NOTIFY && !memcmp("\002\000\012onMetaData", rpkt.data, 13))) {
  666. ts = rpkt.timestamp;
  667. // generate packet header and put data into buffer for FLV demuxer
  668. rt->flv_off = 0;
  669. rt->flv_size = rpkt.data_size + 15;
  670. rt->flv_data = p = av_realloc(rt->flv_data, rt->flv_size);
  671. bytestream_put_byte(&p, rpkt.type);
  672. bytestream_put_be24(&p, rpkt.data_size);
  673. bytestream_put_be24(&p, ts);
  674. bytestream_put_byte(&p, ts >> 24);
  675. bytestream_put_be24(&p, 0);
  676. bytestream_put_buffer(&p, rpkt.data, rpkt.data_size);
  677. bytestream_put_be32(&p, 0);
  678. ff_rtmp_packet_destroy(&rpkt);
  679. return 0;
  680. } else if (rpkt.type == RTMP_PT_METADATA) {
  681. // we got raw FLV data, make it available for FLV demuxer
  682. rt->flv_off = 0;
  683. rt->flv_size = rpkt.data_size;
  684. rt->flv_data = av_realloc(rt->flv_data, rt->flv_size);
  685. /* rewrite timestamps */
  686. next = rpkt.data;
  687. ts = rpkt.timestamp;
  688. while (next - rpkt.data < rpkt.data_size - 11) {
  689. next++;
  690. data_size = bytestream_get_be24(&next);
  691. p=next;
  692. cts = bytestream_get_be24(&next);
  693. cts |= bytestream_get_byte(&next) << 24;
  694. if (pts==0)
  695. pts=cts;
  696. ts += cts - pts;
  697. pts = cts;
  698. bytestream_put_be24(&p, ts);
  699. bytestream_put_byte(&p, ts >> 24);
  700. next += data_size + 3 + 4;
  701. }
  702. memcpy(rt->flv_data, rpkt.data, rpkt.data_size);
  703. ff_rtmp_packet_destroy(&rpkt);
  704. return 0;
  705. }
  706. ff_rtmp_packet_destroy(&rpkt);
  707. }
  708. }
  709. static int rtmp_close(URLContext *h)
  710. {
  711. RTMPContext *rt = h->priv_data;
  712. if (!rt->is_input) {
  713. rt->flv_data = NULL;
  714. if (rt->out_pkt.data_size)
  715. ff_rtmp_packet_destroy(&rt->out_pkt);
  716. if (rt->state > STATE_FCPUBLISH)
  717. gen_fcunpublish_stream(h, rt);
  718. }
  719. if (rt->state > STATE_HANDSHAKED)
  720. gen_delete_stream(h, rt);
  721. av_freep(&rt->flv_data);
  722. ffurl_close(rt->stream);
  723. return 0;
  724. }
  725. /**
  726. * Open RTMP connection and verify that the stream can be played.
  727. *
  728. * URL syntax: rtmp://server[:port][/app][/playpath]
  729. * where 'app' is first one or two directories in the path
  730. * (e.g. /ondemand/, /flash/live/, etc.)
  731. * and 'playpath' is a file name (the rest of the path,
  732. * may be prefixed with "mp4:")
  733. */
  734. static int rtmp_open(URLContext *s, const char *uri, int flags)
  735. {
  736. RTMPContext *rt = s->priv_data;
  737. char proto[8], hostname[256], path[1024], *fname;
  738. char *old_app;
  739. uint8_t buf[2048];
  740. int port;
  741. int ret;
  742. rt->is_input = !(flags & AVIO_FLAG_WRITE);
  743. av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname), &port,
  744. path, sizeof(path), s->filename);
  745. if (port < 0)
  746. port = RTMP_DEFAULT_PORT;
  747. ff_url_join(buf, sizeof(buf), "tcp", NULL, hostname, port, NULL);
  748. if (ffurl_open(&rt->stream, buf, AVIO_FLAG_READ_WRITE,
  749. &s->interrupt_callback, NULL) < 0) {
  750. av_log(s , AV_LOG_ERROR, "Cannot open connection %s\n", buf);
  751. goto fail;
  752. }
  753. rt->state = STATE_START;
  754. if (rtmp_handshake(s, rt))
  755. goto fail;
  756. rt->chunk_size = 128;
  757. rt->state = STATE_HANDSHAKED;
  758. // Keep the application name when it has been defined by the user.
  759. old_app = rt->app;
  760. rt->app = av_malloc(APP_MAX_LENGTH);
  761. if (!rt->app) {
  762. rtmp_close(s);
  763. return AVERROR(ENOMEM);
  764. }
  765. //extract "app" part from path
  766. if (!strncmp(path, "/ondemand/", 10)) {
  767. fname = path + 10;
  768. memcpy(rt->app, "ondemand", 9);
  769. } else {
  770. char *p = strchr(path + 1, '/');
  771. if (!p) {
  772. fname = path + 1;
  773. rt->app[0] = '\0';
  774. } else {
  775. char *c = strchr(p + 1, ':');
  776. fname = strchr(p + 1, '/');
  777. if (!fname || c < fname) {
  778. fname = p + 1;
  779. av_strlcpy(rt->app, path + 1, p - path);
  780. } else {
  781. fname++;
  782. av_strlcpy(rt->app, path + 1, fname - path - 1);
  783. }
  784. }
  785. }
  786. if (old_app) {
  787. // The name of application has been defined by the user, override it.
  788. av_free(rt->app);
  789. rt->app = old_app;
  790. }
  791. if (!rt->playpath) {
  792. rt->playpath = av_malloc(PLAYPATH_MAX_LENGTH);
  793. if (!rt->playpath) {
  794. rtmp_close(s);
  795. return AVERROR(ENOMEM);
  796. }
  797. if (!strchr(fname, ':') &&
  798. (!strcmp(fname + strlen(fname) - 4, ".f4v") ||
  799. !strcmp(fname + strlen(fname) - 4, ".mp4"))) {
  800. memcpy(rt->playpath, "mp4:", 5);
  801. } else {
  802. rt->playpath[0] = 0;
  803. }
  804. strncat(rt->playpath, fname, PLAYPATH_MAX_LENGTH - 5);
  805. }
  806. rt->client_report_size = 1048576;
  807. rt->bytes_read = 0;
  808. rt->last_bytes_read = 0;
  809. av_log(s, AV_LOG_DEBUG, "Proto = %s, path = %s, app = %s, fname = %s\n",
  810. proto, path, rt->app, rt->playpath);
  811. gen_connect(s, rt, proto, hostname, port);
  812. do {
  813. ret = get_packet(s, 1);
  814. } while (ret == EAGAIN);
  815. if (ret < 0)
  816. goto fail;
  817. if (rt->is_input) {
  818. // generate FLV header for demuxer
  819. rt->flv_size = 13;
  820. rt->flv_data = av_realloc(rt->flv_data, rt->flv_size);
  821. rt->flv_off = 0;
  822. memcpy(rt->flv_data, "FLV\1\5\0\0\0\011\0\0\0\0", rt->flv_size);
  823. } else {
  824. rt->flv_size = 0;
  825. rt->flv_data = NULL;
  826. rt->flv_off = 0;
  827. rt->skip_bytes = 13;
  828. }
  829. s->max_packet_size = rt->stream->max_packet_size;
  830. s->is_streamed = 1;
  831. return 0;
  832. fail:
  833. rtmp_close(s);
  834. return AVERROR(EIO);
  835. }
  836. static int rtmp_read(URLContext *s, uint8_t *buf, int size)
  837. {
  838. RTMPContext *rt = s->priv_data;
  839. int orig_size = size;
  840. int ret;
  841. while (size > 0) {
  842. int data_left = rt->flv_size - rt->flv_off;
  843. if (data_left >= size) {
  844. memcpy(buf, rt->flv_data + rt->flv_off, size);
  845. rt->flv_off += size;
  846. return orig_size;
  847. }
  848. if (data_left > 0) {
  849. memcpy(buf, rt->flv_data + rt->flv_off, data_left);
  850. buf += data_left;
  851. size -= data_left;
  852. rt->flv_off = rt->flv_size;
  853. return data_left;
  854. }
  855. if ((ret = get_packet(s, 0)) < 0)
  856. return ret;
  857. }
  858. return orig_size;
  859. }
  860. static int rtmp_write(URLContext *s, const uint8_t *buf, int size)
  861. {
  862. RTMPContext *rt = s->priv_data;
  863. int size_temp = size;
  864. int pktsize, pkttype;
  865. uint32_t ts;
  866. const uint8_t *buf_temp = buf;
  867. do {
  868. if (rt->skip_bytes) {
  869. int skip = FFMIN(rt->skip_bytes, size_temp);
  870. buf_temp += skip;
  871. size_temp -= skip;
  872. rt->skip_bytes -= skip;
  873. continue;
  874. }
  875. if (rt->flv_header_bytes < 11) {
  876. const uint8_t *header = rt->flv_header;
  877. int copy = FFMIN(11 - rt->flv_header_bytes, size_temp);
  878. bytestream_get_buffer(&buf_temp, rt->flv_header + rt->flv_header_bytes, copy);
  879. rt->flv_header_bytes += copy;
  880. size_temp -= copy;
  881. if (rt->flv_header_bytes < 11)
  882. break;
  883. pkttype = bytestream_get_byte(&header);
  884. pktsize = bytestream_get_be24(&header);
  885. ts = bytestream_get_be24(&header);
  886. ts |= bytestream_get_byte(&header) << 24;
  887. bytestream_get_be24(&header);
  888. rt->flv_size = pktsize;
  889. //force 12bytes header
  890. if (((pkttype == RTMP_PT_VIDEO || pkttype == RTMP_PT_AUDIO) && ts == 0) ||
  891. pkttype == RTMP_PT_NOTIFY) {
  892. if (pkttype == RTMP_PT_NOTIFY)
  893. pktsize += 16;
  894. rt->prev_pkt[1][RTMP_SOURCE_CHANNEL].channel_id = 0;
  895. }
  896. //this can be a big packet, it's better to send it right here
  897. ff_rtmp_packet_create(&rt->out_pkt, RTMP_SOURCE_CHANNEL, pkttype, ts, pktsize);
  898. rt->out_pkt.extra = rt->main_channel_id;
  899. rt->flv_data = rt->out_pkt.data;
  900. if (pkttype == RTMP_PT_NOTIFY)
  901. ff_amf_write_string(&rt->flv_data, "@setDataFrame");
  902. }
  903. if (rt->flv_size - rt->flv_off > size_temp) {
  904. bytestream_get_buffer(&buf_temp, rt->flv_data + rt->flv_off, size_temp);
  905. rt->flv_off += size_temp;
  906. size_temp = 0;
  907. } else {
  908. bytestream_get_buffer(&buf_temp, rt->flv_data + rt->flv_off, rt->flv_size - rt->flv_off);
  909. size_temp -= rt->flv_size - rt->flv_off;
  910. rt->flv_off += rt->flv_size - rt->flv_off;
  911. }
  912. if (rt->flv_off == rt->flv_size) {
  913. rt->skip_bytes = 4;
  914. ff_rtmp_packet_write(rt->stream, &rt->out_pkt, rt->chunk_size, rt->prev_pkt[1]);
  915. ff_rtmp_packet_destroy(&rt->out_pkt);
  916. rt->flv_size = 0;
  917. rt->flv_off = 0;
  918. rt->flv_header_bytes = 0;
  919. }
  920. } while (buf_temp - buf < size);
  921. return size;
  922. }
  923. #define OFFSET(x) offsetof(RTMPContext, x)
  924. #define DEC AV_OPT_FLAG_DECODING_PARAM
  925. #define ENC AV_OPT_FLAG_ENCODING_PARAM
  926. static const AVOption rtmp_options[] = {
  927. {"rtmp_app", "Name of application to connect to on the RTMP server", OFFSET(app), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC},
  928. {"rtmp_live", "Specify that the media is a live stream.", OFFSET(live), AV_OPT_TYPE_INT, {-2}, INT_MIN, INT_MAX, DEC, "rtmp_live"},
  929. {"any", "both", 0, AV_OPT_TYPE_CONST, {-2}, 0, 0, DEC, "rtmp_live"},
  930. {"live", "live stream", 0, AV_OPT_TYPE_CONST, {-1}, 0, 0, DEC, "rtmp_live"},
  931. {"recorded", "recorded stream", 0, AV_OPT_TYPE_CONST, {0}, 0, 0, DEC, "rtmp_live"},
  932. {"rtmp_playpath", "Stream identifier to play or to publish", OFFSET(playpath), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC},
  933. { NULL },
  934. };
  935. static const AVClass rtmp_class = {
  936. .class_name = "rtmp",
  937. .item_name = av_default_item_name,
  938. .option = rtmp_options,
  939. .version = LIBAVUTIL_VERSION_INT,
  940. };
  941. URLProtocol ff_rtmp_protocol = {
  942. .name = "rtmp",
  943. .url_open = rtmp_open,
  944. .url_read = rtmp_read,
  945. .url_write = rtmp_write,
  946. .url_close = rtmp_close,
  947. .priv_data_size = sizeof(RTMPContext),
  948. .flags = URL_PROTOCOL_FLAG_NETWORK,
  949. .priv_data_class= &rtmp_class,
  950. };