rtmp.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. #ifndef __RTMP_H__
  2. #define __RTMP_H__
  3. /*
  4. * Copyright (C) 2005-2008 Team XBMC
  5. * http://www.xbmc.org
  6. * Copyright (C) 2008-2009 Andrej Stepanchuk
  7. * Copyright (C) 2009-2010 Howard Chu
  8. *
  9. * This file is part of librtmp.
  10. *
  11. * librtmp is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU Lesser General Public License as
  13. * published by the Free Software Foundation; either version 2.1,
  14. * or (at your option) any later version.
  15. *
  16. * librtmp is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Lesser General Public License
  22. * along with librtmp see the file COPYING. If not, write to
  23. * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  24. * Boston, MA 02110-1301, USA.
  25. * http://www.gnu.org/copyleft/lgpl.html
  26. */
  27. #if !defined(NO_CRYPTO) && !defined(CRYPTO)
  28. #define CRYPTO
  29. #else
  30. #include <sys/types.h> //for off_t
  31. #endif
  32. #include <errno.h>
  33. #include <stdint.h>
  34. #ifdef _WIN32
  35. #ifdef _MSC_VER
  36. #pragma warning(disable:4996) //depricated warnings
  37. #pragma warning(disable:4244) //64bit defensive mechanism, fixed the ones that mattered
  38. #endif
  39. #include <winsock2.h>
  40. #include <ws2tcpip.h>
  41. #else
  42. #include <sys/socket.h>
  43. #include <netinet/in.h>
  44. #define SOCKET int
  45. #endif
  46. #include "amf.h"
  47. #ifdef CRYPTO
  48. #if defined(USE_MBEDTLS)
  49. #include <mbedtls/version.h>
  50. #if MBEDTLS_VERSION_NUMBER >= 0x02040000
  51. #include <mbedtls/net_sockets.h>
  52. #else
  53. #include <mbedtls/net.h>
  54. #endif
  55. #include <mbedtls/ssl.h>
  56. #include <mbedtls/ctr_drbg.h>
  57. #include <mbedtls/entropy.h>
  58. #define my_dhm_P \
  59. "E4004C1F94182000103D883A448B3F80" \
  60. "2CE4B44A83301270002C20D0321CFD00" \
  61. "11CCEF784C26A400F43DFB901BCA7538" \
  62. "F2C6B176001CF5A0FD16D2C48B1D0C1C" \
  63. "F6AC8E1DA6BCC3B4E1F96B0564965300" \
  64. "FFA1D0B601EB2800F489AA512C4B248C" \
  65. "01F76949A60BB7F00A40B1EAB64BDD48" \
  66. "E8A700D60B7F1200FA8E77B0A979DABF"
  67. #define my_dhm_G "4"
  68. #define SSL_SET_SESSION(S,resume,timeout,ctx) mbedtls_ssl_set_session(S,ctx)
  69. typedef struct tls_ctx
  70. {
  71. mbedtls_entropy_context entropy;
  72. mbedtls_ctr_drbg_context ctr_drbg;
  73. mbedtls_ssl_config conf;
  74. mbedtls_ssl_session ssn;
  75. mbedtls_x509_crt *cacert;
  76. mbedtls_net_context net;
  77. } tls_ctx;
  78. typedef tls_ctx *TLS_CTX;
  79. #define TLS_client(ctx,s) \
  80. s = malloc(sizeof(mbedtls_ssl_context));\
  81. mbedtls_ssl_init(s);\
  82. mbedtls_ssl_config_defaults(&ctx->conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);\
  83. mbedtls_ssl_conf_rng(&ctx->conf, mbedtls_ctr_drbg_random, &ctx->ctr_drbg);\
  84. mbedtls_ssl_conf_authmode(&ctx->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\
  85. mbedtls_ssl_setup(s, &ctx->conf)
  86. #define TLS_setfd(s,fd) mbedtls_ssl_set_bio(s, fd, mbedtls_net_send, mbedtls_net_recv, NULL)
  87. #define TLS_connect(s) mbedtls_ssl_handshake(s)
  88. #define TLS_accept(s) mbedtls_ssl_handshake(s)
  89. #define TLS_read(s,b,l) mbedtls_ssl_read(s,(unsigned char *)b,l)
  90. #define TLS_write(s,b,l) mbedtls_ssl_write(s,(unsigned char *)b,l)
  91. #define TLS_shutdown(s) mbedtls_ssl_close_notify(s)
  92. #define TLS_close(s) mbedtls_ssl_free(s); free(s)
  93. #elif defined(USE_POLARSSL)
  94. #include <polarssl/version.h>
  95. #include <polarssl/net.h>
  96. #include <polarssl/ssl.h>
  97. #include <polarssl/havege.h>
  98. #if POLARSSL_VERSION_NUMBER < 0x01010000
  99. #define havege_random havege_rand
  100. #endif
  101. #if POLARSSL_VERSION_NUMBER >= 0x01020000
  102. #define SSL_SET_SESSION(S,resume,timeout,ctx) ssl_set_session(S,ctx)
  103. #else
  104. #define SSL_SET_SESSION(S,resume,timeout,ctx) ssl_set_session(S,resume,timeout,ctx)
  105. #endif
  106. typedef struct tls_ctx
  107. {
  108. havege_state hs;
  109. ssl_session ssn;
  110. } tls_ctx;
  111. #define TLS_CTX tls_ctx *
  112. #define TLS_client(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\
  113. ssl_set_endpoint(s, SSL_IS_CLIENT); ssl_set_authmode(s, SSL_VERIFY_NONE);\
  114. ssl_set_rng(s, havege_random, &ctx->hs);\
  115. ssl_set_ciphersuites(s, ssl_default_ciphersuites);\
  116. SSL_SET_SESSION(s, 1, 600, &ctx->ssn)
  117. #define TLS_setfd(s,fd) ssl_set_bio(s, net_recv, &fd, net_send, &fd)
  118. #define TLS_connect(s) ssl_handshake(s)
  119. #define TLS_accept(s) ssl_handshake(s)
  120. #define TLS_read(s,b,l) ssl_read(s,(unsigned char *)b,l)
  121. #define TLS_write(s,b,l) ssl_write(s,(unsigned char *)b,l)
  122. #define TLS_shutdown(s) ssl_close_notify(s)
  123. #define TLS_close(s) ssl_free(s); free(s)
  124. #elif defined(USE_GNUTLS)
  125. #include <gnutls/gnutls.h>
  126. typedef struct tls_ctx
  127. {
  128. gnutls_certificate_credentials_t cred;
  129. gnutls_priority_t prios;
  130. } tls_ctx;
  131. #define TLS_CTX tls_ctx *
  132. #define TLS_client(ctx,s) gnutls_init((gnutls_session_t *)(&s), GNUTLS_CLIENT); gnutls_priority_set(s, ctx->prios); gnutls_credentials_set(s, GNUTLS_CRD_CERTIFICATE, ctx->cred)
  133. #define TLS_setfd(s,fd) gnutls_transport_set_ptr(s, (gnutls_transport_ptr_t)(long)fd)
  134. #define TLS_connect(s) gnutls_handshake(s)
  135. #define TLS_accept(s) gnutls_handshake(s)
  136. #define TLS_read(s,b,l) gnutls_record_recv(s,b,l)
  137. #define TLS_write(s,b,l) gnutls_record_send(s,b,l)
  138. #define TLS_shutdown(s) gnutls_bye(s, GNUTLS_SHUT_RDWR)
  139. #define TLS_close(s) gnutls_deinit(s)
  140. #else /* USE_OPENSSL */
  141. #define TLS_CTX SSL_CTX *
  142. #define TLS_client(ctx,s) s = SSL_new(ctx)
  143. #define TLS_setfd(s,fd) SSL_set_fd(s,fd)
  144. #define TLS_connect(s) SSL_connect(s)
  145. #define TLS_accept(s) SSL_accept(s)
  146. #define TLS_read(s,b,l) SSL_read(s,b,l)
  147. #define TLS_write(s,b,l) SSL_write(s,b,l)
  148. #define TLS_shutdown(s) SSL_shutdown(s)
  149. #define TLS_close(s) SSL_free(s)
  150. #endif
  151. #elif defined(USE_ONLY_MD5)
  152. #include "md5.h"
  153. #include "cencode.h"
  154. #define MD5_DIGEST_LENGTH 16
  155. #endif
  156. #ifdef __cplusplus
  157. extern "C"
  158. {
  159. #endif
  160. #define RTMP_LIB_VERSION 0x020300 /* 2.3 */
  161. #define RTMP_FEATURE_HTTP 0x01
  162. #define RTMP_FEATURE_ENC 0x02
  163. #define RTMP_FEATURE_SSL 0x04
  164. #define RTMP_FEATURE_MFP 0x08 /* not yet supported */
  165. #define RTMP_FEATURE_WRITE 0x10 /* publish, not play */
  166. #define RTMP_FEATURE_HTTP2 0x20 /* server-side rtmpt */
  167. #define RTMP_PROTOCOL_UNDEFINED -1
  168. #define RTMP_PROTOCOL_RTMP 0
  169. #define RTMP_PROTOCOL_RTMPE RTMP_FEATURE_ENC
  170. #define RTMP_PROTOCOL_RTMPT RTMP_FEATURE_HTTP
  171. #define RTMP_PROTOCOL_RTMPS RTMP_FEATURE_SSL
  172. #define RTMP_PROTOCOL_RTMPTE (RTMP_FEATURE_HTTP|RTMP_FEATURE_ENC)
  173. #define RTMP_PROTOCOL_RTMPTS (RTMP_FEATURE_HTTP|RTMP_FEATURE_SSL)
  174. #define RTMP_PROTOCOL_RTMFP RTMP_FEATURE_MFP
  175. #define RTMP_DEFAULT_CHUNKSIZE 128
  176. /* needs to fit largest number of bytes recv() may return */
  177. #define RTMP_BUFFER_CACHE_SIZE (16*1024)
  178. #define RTMP_CHANNELS 65600
  179. extern const char RTMPProtocolStringsLower[][7];
  180. extern const AVal RTMP_DefaultFlashVer;
  181. extern int RTMP_ctrlC;
  182. uint32_t RTMP_GetTime(void);
  183. /* RTMP_PACKET_TYPE_... 0x00 */
  184. #define RTMP_PACKET_TYPE_CHUNK_SIZE 0x01
  185. /* RTMP_PACKET_TYPE_... 0x02 */
  186. #define RTMP_PACKET_TYPE_BYTES_READ_REPORT 0x03
  187. #define RTMP_PACKET_TYPE_CONTROL 0x04
  188. #define RTMP_PACKET_TYPE_SERVER_BW 0x05
  189. #define RTMP_PACKET_TYPE_CLIENT_BW 0x06
  190. /* RTMP_PACKET_TYPE_... 0x07 */
  191. #define RTMP_PACKET_TYPE_AUDIO 0x08
  192. #define RTMP_PACKET_TYPE_VIDEO 0x09
  193. /* RTMP_PACKET_TYPE_... 0x0A */
  194. /* RTMP_PACKET_TYPE_... 0x0B */
  195. /* RTMP_PACKET_TYPE_... 0x0C */
  196. /* RTMP_PACKET_TYPE_... 0x0D */
  197. /* RTMP_PACKET_TYPE_... 0x0E */
  198. #define RTMP_PACKET_TYPE_FLEX_STREAM_SEND 0x0F
  199. #define RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT 0x10
  200. #define RTMP_PACKET_TYPE_FLEX_MESSAGE 0x11
  201. #define RTMP_PACKET_TYPE_INFO 0x12
  202. #define RTMP_PACKET_TYPE_SHARED_OBJECT 0x13
  203. #define RTMP_PACKET_TYPE_INVOKE 0x14
  204. /* RTMP_PACKET_TYPE_... 0x15 */
  205. #define RTMP_PACKET_TYPE_FLASH_VIDEO 0x16
  206. #define RTMP_MAX_HEADER_SIZE 18
  207. #define RTMP_PACKET_SIZE_LARGE 0
  208. #define RTMP_PACKET_SIZE_MEDIUM 1
  209. #define RTMP_PACKET_SIZE_SMALL 2
  210. #define RTMP_PACKET_SIZE_MINIMUM 3
  211. typedef struct RTMPChunk
  212. {
  213. int c_headerSize;
  214. int c_chunkSize;
  215. char *c_chunk;
  216. char c_header[RTMP_MAX_HEADER_SIZE];
  217. } RTMPChunk;
  218. typedef struct RTMPPacket
  219. {
  220. uint8_t m_headerType;
  221. uint8_t m_packetType;
  222. uint8_t m_hasAbsTimestamp; /* timestamp absolute or relative? */
  223. int m_nChannel;
  224. uint32_t m_nTimeStamp; /* timestamp */
  225. uint32_t m_nLastWireTimeStamp; /* timestamp that was encoded when sending */
  226. int32_t m_nInfoField2; /* last 4 bytes in a long header */
  227. uint32_t m_nBodySize;
  228. uint32_t m_nBytesRead;
  229. RTMPChunk *m_chunk;
  230. char *m_body;
  231. } RTMPPacket;
  232. typedef struct RTMPSockBuf
  233. {
  234. struct sockaddr_storage sb_addr; /* address of remote */
  235. SOCKET sb_socket;
  236. int sb_size; /* number of unprocessed bytes in buffer */
  237. char *sb_start; /* pointer into sb_pBuffer of next byte to process */
  238. char sb_buf[RTMP_BUFFER_CACHE_SIZE]; /* data read from socket */
  239. int sb_timedout;
  240. void *sb_ssl;
  241. } RTMPSockBuf;
  242. void RTMPPacket_Reset(RTMPPacket *p);
  243. void RTMPPacket_Dump(RTMPPacket *p);
  244. int RTMPPacket_Alloc(RTMPPacket *p, uint32_t nSize);
  245. void RTMPPacket_Free(RTMPPacket *p);
  246. #define RTMPPacket_IsReady(a) ((a)->m_nBytesRead == (a)->m_nBodySize)
  247. typedef struct RTMP_Stream {
  248. int id;
  249. AVal playpath;
  250. } RTMP_Stream;
  251. typedef void (*CUSTOMCONNECTENCODING)(char **penc, char *ppend);
  252. typedef struct RTMP_LNK
  253. {
  254. #define RTMP_MAX_STREAMS 8
  255. RTMP_Stream streams[RTMP_MAX_STREAMS];
  256. int nStreams;
  257. int curStreamIdx;
  258. int playingStreams;
  259. AVal hostname;
  260. AVal sockshost;
  261. CUSTOMCONNECTENCODING customConnectEncode;
  262. AVal tcUrl;
  263. AVal swfUrl;
  264. AVal pageUrl;
  265. AVal app;
  266. AVal auth;
  267. AVal flashVer;
  268. AVal subscribepath;
  269. AVal usherToken;
  270. AVal token;
  271. AVal pubUser;
  272. AVal pubPasswd;
  273. AMFObject extras;
  274. int edepth;
  275. int seekTime;
  276. int stopTime;
  277. #define RTMP_LF_AUTH 0x0001 /* using auth param */
  278. #define RTMP_LF_LIVE 0x0002 /* stream is live */
  279. #define RTMP_LF_SWFV 0x0004 /* do SWF verification */
  280. #define RTMP_LF_PLST 0x0008 /* send playlist before play */
  281. #define RTMP_LF_BUFX 0x0010 /* toggle stream on BufferEmpty msg */
  282. #define RTMP_LF_FTCU 0x0020 /* free tcUrl on close */
  283. int lFlags;
  284. int swfAge;
  285. int protocol;
  286. int receiveTimeout; /* connection receive timeout in seconds */
  287. int sendTimeout; /* connection send timeout in seconds */
  288. #define RTMP_PUB_NAME 0x0001 /* send login to server */
  289. #define RTMP_PUB_RESP 0x0002 /* send salted password hash */
  290. #define RTMP_PUB_ALLOC 0x0004 /* allocated data for new tcUrl & app */
  291. #define RTMP_PUB_CLEAN 0x0008 /* need to free allocated data for newer tcUrl & app at exit */
  292. #define RTMP_PUB_CLATE 0x0010 /* late clean tcUrl & app at exit */
  293. int pFlags;
  294. unsigned short socksport;
  295. unsigned short port;
  296. #ifdef CRYPTO
  297. #define RTMP_SWF_HASHLEN 32
  298. uint32_t SWFSize;
  299. uint8_t SWFHash[RTMP_SWF_HASHLEN];
  300. char SWFVerificationResponse[RTMP_SWF_HASHLEN+10];
  301. #endif
  302. } RTMP_LNK;
  303. /* state for read() wrapper */
  304. typedef struct RTMP_READ
  305. {
  306. char *buf;
  307. char *bufpos;
  308. unsigned int buflen;
  309. uint32_t timestamp;
  310. uint8_t dataType;
  311. uint8_t flags;
  312. #define RTMP_READ_HEADER 0x01
  313. #define RTMP_READ_RESUME 0x02
  314. #define RTMP_READ_NO_IGNORE 0x04
  315. #define RTMP_READ_GOTKF 0x08
  316. #define RTMP_READ_GOTFLVK 0x10
  317. #define RTMP_READ_SEEKING 0x20
  318. int8_t status;
  319. #define RTMP_READ_COMPLETE -3
  320. #define RTMP_READ_ERROR -2
  321. #define RTMP_READ_EOF -1
  322. #define RTMP_READ_IGNORE 0
  323. /* if bResume == TRUE */
  324. uint8_t initialFrameType;
  325. uint32_t nResumeTS;
  326. char *metaHeader;
  327. char *initialFrame;
  328. uint32_t nMetaHeaderSize;
  329. uint32_t nInitialFrameSize;
  330. uint32_t nIgnoredFrameCounter;
  331. uint32_t nIgnoredFlvFrameCounter;
  332. } RTMP_READ;
  333. typedef struct RTMP_METHOD
  334. {
  335. AVal name;
  336. int num;
  337. } RTMP_METHOD;
  338. typedef struct RTMP_BINDINFO
  339. {
  340. struct sockaddr_storage addr;
  341. int addrLen;
  342. } RTMP_BINDINFO;
  343. typedef int (*CUSTOMSEND)(RTMPSockBuf*, const char *, int, void*);
  344. typedef struct RTMP
  345. {
  346. int m_inChunkSize;
  347. int m_outChunkSize;
  348. int m_nBWCheckCounter;
  349. int m_nBytesIn;
  350. int m_nBytesInSent;
  351. int m_nBufferMS;
  352. int m_stream_id; /* returned in _result from createStream */
  353. int m_mediaChannel;
  354. uint32_t m_mediaStamp;
  355. uint32_t m_pauseStamp;
  356. int m_pausing;
  357. int m_nServerBW;
  358. int m_nClientBW;
  359. uint8_t m_nClientBW2;
  360. uint8_t m_bPlaying;
  361. uint8_t m_bSendEncoding;
  362. uint8_t m_bSendCounter;
  363. uint8_t m_bUseNagle;
  364. uint8_t m_bCustomSend;
  365. void* m_customSendParam;
  366. CUSTOMSEND m_customSendFunc;
  367. RTMP_BINDINFO m_bindIP;
  368. uint8_t m_bSendChunkSizeInfo;
  369. int m_numInvokes;
  370. int m_numCalls;
  371. RTMP_METHOD *m_methodCalls; /* remote method calls queue */
  372. int m_channelsAllocatedIn;
  373. int m_channelsAllocatedOut;
  374. RTMPPacket **m_vecChannelsIn;
  375. RTMPPacket **m_vecChannelsOut;
  376. int *m_channelTimestamp; /* abs timestamp of last packet */
  377. double m_fAudioCodecs; /* audioCodecs for the connect packet */
  378. double m_fVideoCodecs; /* videoCodecs for the connect packet */
  379. double m_fEncoding; /* AMF0 or AMF3 */
  380. double m_fDuration; /* duration of stream in seconds */
  381. int m_msgCounter; /* RTMPT stuff */
  382. int m_polling;
  383. int m_resplen;
  384. int m_unackd;
  385. AVal m_clientID;
  386. RTMP_READ m_read;
  387. RTMPPacket m_write;
  388. RTMPSockBuf m_sb;
  389. RTMP_LNK Link;
  390. int connect_time_ms;
  391. int last_error_code;
  392. #ifdef CRYPTO
  393. TLS_CTX RTMP_TLS_ctx;
  394. #endif
  395. } RTMP;
  396. int RTMP_ParseURL(const char *url, int *protocol, AVal *host,
  397. unsigned int *port, AVal *app);
  398. void RTMP_ParsePlaypath(AVal *in, AVal *out);
  399. void RTMP_SetBufferMS(RTMP *r, int size);
  400. void RTMP_UpdateBufferMS(RTMP *r);
  401. int RTMP_SetOpt(RTMP *r, const AVal *opt, AVal *arg);
  402. int RTMP_SetupURL(RTMP *r, char *url);
  403. int RTMP_AddStream(RTMP *r, const char *playpath);
  404. void RTMP_SetupStream(RTMP *r, int protocol,
  405. AVal *hostname,
  406. unsigned int port,
  407. AVal *sockshost,
  408. AVal *playpath,
  409. AVal *tcUrl,
  410. AVal *swfUrl,
  411. AVal *pageUrl,
  412. AVal *app,
  413. AVal *auth,
  414. AVal *swfSHA256Hash,
  415. uint32_t swfSize,
  416. AVal *flashVer,
  417. AVal *subscribepath,
  418. AVal *usherToken,
  419. int dStart,
  420. int dStop, int bLiveStream, long int timeout);
  421. int RTMP_Connect(RTMP *r, RTMPPacket *cp);
  422. struct sockaddr;
  423. int RTMP_Connect0(RTMP *r, SOCKET socket_fd);
  424. int RTMP_Connect1(RTMP *r, RTMPPacket *cp);
  425. int RTMP_ReadPacket(RTMP *r, RTMPPacket *packet);
  426. int RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue);
  427. int RTMP_SendChunk(RTMP *r, RTMPChunk *chunk);
  428. int RTMP_IsConnected(RTMP *r);
  429. SOCKET RTMP_Socket(RTMP *r);
  430. int RTMP_IsTimedout(RTMP *r);
  431. double RTMP_GetDuration(RTMP *r);
  432. int RTMP_ToggleStream(RTMP *r);
  433. int RTMP_ConnectStream(RTMP *r, int seekTime);
  434. int RTMP_ReconnectStream(RTMP *r, int seekTime, int streamIdx);
  435. void RTMP_DeleteStream(RTMP *r, int streamIdx);
  436. int RTMP_GetNextMediaPacket(RTMP *r, RTMPPacket *packet);
  437. int RTMP_ClientPacket(RTMP *r, RTMPPacket *packet);
  438. void RTMP_Init(RTMP *r);
  439. void RTMP_Reset(RTMP *r);
  440. void RTMP_Close(RTMP *r);
  441. RTMP *RTMP_Alloc(void);
  442. void RTMP_TLS_Init(RTMP *r);
  443. void RTMP_TLS_Free(RTMP *r);
  444. void RTMP_Free(RTMP *r);
  445. void RTMP_EnableWrite(RTMP *r);
  446. int RTMP_LibVersion(void);
  447. void RTMP_UserInterrupt(void); /* user typed Ctrl-C */
  448. int RTMP_SendCtrl(RTMP *r, short nType, unsigned int nObject,
  449. unsigned int nTime);
  450. /* caller probably doesn't know current timestamp, should
  451. * just use RTMP_Pause instead
  452. */
  453. int RTMP_SendPause(RTMP *r, int DoPause, int dTime);
  454. int RTMP_Pause(RTMP *r, int DoPause);
  455. int RTMP_FindFirstMatchingProperty(AMFObject *obj, const AVal *name,
  456. AMFObjectProperty * p);
  457. int RTMPSockBuf_Fill(RTMPSockBuf *sb);
  458. int RTMPSockBuf_Send(RTMPSockBuf *sb, const char *buf, int len);
  459. int RTMPSockBuf_Close(RTMPSockBuf *sb);
  460. int RTMP_SendCreateStream(RTMP *r);
  461. int RTMP_SendSeek(RTMP *r, int dTime);
  462. int RTMP_SendServerBW(RTMP *r);
  463. int RTMP_SendClientBW(RTMP *r);
  464. void RTMP_DropRequest(RTMP *r, int i, int freeit);
  465. int RTMP_Read(RTMP *r, char *buf, int size);
  466. int RTMP_Write(RTMP *r, const char *buf, int size, int streamIdx);
  467. #ifdef USE_HASHSWF
  468. /* hashswf.c */
  469. int RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash,
  470. int age);
  471. #endif
  472. #ifdef __cplusplus
  473. };
  474. #endif
  475. #endif