rtmp.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  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 __cplusplus
  48. extern "C"
  49. {
  50. #endif
  51. #define RTMP_LIB_VERSION 0x020300 /* 2.3 */
  52. #define RTMP_FEATURE_HTTP 0x01
  53. #define RTMP_FEATURE_ENC 0x02
  54. #define RTMP_FEATURE_SSL 0x04
  55. #define RTMP_FEATURE_MFP 0x08 /* not yet supported */
  56. #define RTMP_FEATURE_WRITE 0x10 /* publish, not play */
  57. #define RTMP_FEATURE_HTTP2 0x20 /* server-side rtmpt */
  58. #define RTMP_PROTOCOL_UNDEFINED -1
  59. #define RTMP_PROTOCOL_RTMP 0
  60. #define RTMP_PROTOCOL_RTMPE RTMP_FEATURE_ENC
  61. #define RTMP_PROTOCOL_RTMPT RTMP_FEATURE_HTTP
  62. #define RTMP_PROTOCOL_RTMPS RTMP_FEATURE_SSL
  63. #define RTMP_PROTOCOL_RTMPTE (RTMP_FEATURE_HTTP|RTMP_FEATURE_ENC)
  64. #define RTMP_PROTOCOL_RTMPTS (RTMP_FEATURE_HTTP|RTMP_FEATURE_SSL)
  65. #define RTMP_PROTOCOL_RTMFP RTMP_FEATURE_MFP
  66. #define RTMP_DEFAULT_CHUNKSIZE 128
  67. /* needs to fit largest number of bytes recv() may return */
  68. #define RTMP_BUFFER_CACHE_SIZE (16*1024)
  69. #define RTMP_CHANNELS 65600
  70. extern const char RTMPProtocolStringsLower[][7];
  71. extern const AVal RTMP_DefaultFlashVer;
  72. extern int RTMP_ctrlC;
  73. uint32_t RTMP_GetTime(void);
  74. /* RTMP_PACKET_TYPE_... 0x00 */
  75. #define RTMP_PACKET_TYPE_CHUNK_SIZE 0x01
  76. /* RTMP_PACKET_TYPE_... 0x02 */
  77. #define RTMP_PACKET_TYPE_BYTES_READ_REPORT 0x03
  78. #define RTMP_PACKET_TYPE_CONTROL 0x04
  79. #define RTMP_PACKET_TYPE_SERVER_BW 0x05
  80. #define RTMP_PACKET_TYPE_CLIENT_BW 0x06
  81. /* RTMP_PACKET_TYPE_... 0x07 */
  82. #define RTMP_PACKET_TYPE_AUDIO 0x08
  83. #define RTMP_PACKET_TYPE_VIDEO 0x09
  84. /* RTMP_PACKET_TYPE_... 0x0A */
  85. /* RTMP_PACKET_TYPE_... 0x0B */
  86. /* RTMP_PACKET_TYPE_... 0x0C */
  87. /* RTMP_PACKET_TYPE_... 0x0D */
  88. /* RTMP_PACKET_TYPE_... 0x0E */
  89. #define RTMP_PACKET_TYPE_FLEX_STREAM_SEND 0x0F
  90. #define RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT 0x10
  91. #define RTMP_PACKET_TYPE_FLEX_MESSAGE 0x11
  92. #define RTMP_PACKET_TYPE_INFO 0x12
  93. #define RTMP_PACKET_TYPE_SHARED_OBJECT 0x13
  94. #define RTMP_PACKET_TYPE_INVOKE 0x14
  95. /* RTMP_PACKET_TYPE_... 0x15 */
  96. #define RTMP_PACKET_TYPE_FLASH_VIDEO 0x16
  97. #define RTMP_MAX_HEADER_SIZE 18
  98. #define RTMP_PACKET_SIZE_LARGE 0
  99. #define RTMP_PACKET_SIZE_MEDIUM 1
  100. #define RTMP_PACKET_SIZE_SMALL 2
  101. #define RTMP_PACKET_SIZE_MINIMUM 3
  102. typedef struct RTMPChunk
  103. {
  104. int c_headerSize;
  105. int c_chunkSize;
  106. char *c_chunk;
  107. char c_header[RTMP_MAX_HEADER_SIZE];
  108. } RTMPChunk;
  109. typedef struct RTMPPacket
  110. {
  111. uint8_t m_headerType;
  112. uint8_t m_packetType;
  113. uint8_t m_hasAbsTimestamp; /* timestamp absolute or relative? */
  114. int m_nChannel;
  115. uint32_t m_nTimeStamp; /* timestamp */
  116. int32_t m_nInfoField2; /* last 4 bytes in a long header */
  117. uint32_t m_nBodySize;
  118. uint32_t m_nBytesRead;
  119. RTMPChunk *m_chunk;
  120. char *m_body;
  121. } RTMPPacket;
  122. typedef struct RTMPSockBuf
  123. {
  124. SOCKET sb_socket;
  125. int sb_size; /* number of unprocessed bytes in buffer */
  126. char *sb_start; /* pointer into sb_pBuffer of next byte to process */
  127. char sb_buf[RTMP_BUFFER_CACHE_SIZE]; /* data read from socket */
  128. int sb_timedout;
  129. void *sb_ssl;
  130. } RTMPSockBuf;
  131. void RTMPPacket_Reset(RTMPPacket *p);
  132. void RTMPPacket_Dump(RTMPPacket *p);
  133. int RTMPPacket_Alloc(RTMPPacket *p, uint32_t nSize);
  134. void RTMPPacket_Free(RTMPPacket *p);
  135. #define RTMPPacket_IsReady(a) ((a)->m_nBytesRead == (a)->m_nBodySize)
  136. typedef struct RTMP_Stream {
  137. int id;
  138. AVal playpath;
  139. } RTMP_Stream;
  140. typedef struct RTMP_LNK
  141. {
  142. #define RTMP_MAX_STREAMS 8
  143. RTMP_Stream streams[RTMP_MAX_STREAMS];
  144. int nStreams;
  145. int curStreamIdx;
  146. int playingStreams;
  147. AVal hostname;
  148. AVal sockshost;
  149. AVal tcUrl;
  150. AVal swfUrl;
  151. AVal pageUrl;
  152. AVal app;
  153. AVal auth;
  154. AVal flashVer;
  155. AVal subscribepath;
  156. AVal usherToken;
  157. AVal token;
  158. AVal pubUser;
  159. AVal pubPasswd;
  160. AMFObject extras;
  161. int edepth;
  162. int seekTime;
  163. int stopTime;
  164. #define RTMP_LF_AUTH 0x0001 /* using auth param */
  165. #define RTMP_LF_LIVE 0x0002 /* stream is live */
  166. #define RTMP_LF_SWFV 0x0004 /* do SWF verification */
  167. #define RTMP_LF_PLST 0x0008 /* send playlist before play */
  168. #define RTMP_LF_BUFX 0x0010 /* toggle stream on BufferEmpty msg */
  169. #define RTMP_LF_FTCU 0x0020 /* free tcUrl on close */
  170. int lFlags;
  171. int swfAge;
  172. int protocol;
  173. int timeout; /* connection timeout in seconds */
  174. #define RTMP_PUB_NAME 0x0001 /* send login to server */
  175. #define RTMP_PUB_RESP 0x0002 /* send salted password hash */
  176. #define RTMP_PUB_ALLOC 0x0004 /* allocated data for new tcUrl & app */
  177. #define RTMP_PUB_CLEAN 0x0008 /* need to free allocated data for newer tcUrl & app at exit */
  178. #define RTMP_PUB_CLATE 0x0010 /* late clean tcUrl & app at exit */
  179. int pFlags;
  180. unsigned short socksport;
  181. unsigned short port;
  182. #ifdef CRYPTO
  183. #define RTMP_SWF_HASHLEN 32
  184. void *dh; /* for encryption */
  185. void *rc4keyIn;
  186. void *rc4keyOut;
  187. uint32_t SWFSize;
  188. uint8_t SWFHash[RTMP_SWF_HASHLEN];
  189. char SWFVerificationResponse[RTMP_SWF_HASHLEN+10];
  190. #endif
  191. } RTMP_LNK;
  192. /* state for read() wrapper */
  193. typedef struct RTMP_READ
  194. {
  195. char *buf;
  196. char *bufpos;
  197. unsigned int buflen;
  198. uint32_t timestamp;
  199. uint8_t dataType;
  200. uint8_t flags;
  201. #define RTMP_READ_HEADER 0x01
  202. #define RTMP_READ_RESUME 0x02
  203. #define RTMP_READ_NO_IGNORE 0x04
  204. #define RTMP_READ_GOTKF 0x08
  205. #define RTMP_READ_GOTFLVK 0x10
  206. #define RTMP_READ_SEEKING 0x20
  207. int8_t status;
  208. #define RTMP_READ_COMPLETE -3
  209. #define RTMP_READ_ERROR -2
  210. #define RTMP_READ_EOF -1
  211. #define RTMP_READ_IGNORE 0
  212. /* if bResume == TRUE */
  213. uint8_t initialFrameType;
  214. uint32_t nResumeTS;
  215. char *metaHeader;
  216. char *initialFrame;
  217. uint32_t nMetaHeaderSize;
  218. uint32_t nInitialFrameSize;
  219. uint32_t nIgnoredFrameCounter;
  220. uint32_t nIgnoredFlvFrameCounter;
  221. } RTMP_READ;
  222. typedef struct RTMP_METHOD
  223. {
  224. AVal name;
  225. int num;
  226. } RTMP_METHOD;
  227. typedef struct RTMP_BINDINFO
  228. {
  229. struct sockaddr_storage addr;
  230. int addrLen;
  231. } RTMP_BINDINFO;
  232. typedef int (*CUSTOMSEND)(RTMPSockBuf*, const char *, int, void*);
  233. typedef struct RTMP
  234. {
  235. int m_inChunkSize;
  236. int m_outChunkSize;
  237. int m_nBWCheckCounter;
  238. int m_nBytesIn;
  239. int m_nBytesInSent;
  240. int m_nBufferMS;
  241. int m_stream_id; /* returned in _result from createStream */
  242. int m_mediaChannel;
  243. uint32_t m_mediaStamp;
  244. uint32_t m_pauseStamp;
  245. int m_pausing;
  246. int m_nServerBW;
  247. int m_nClientBW;
  248. uint8_t m_nClientBW2;
  249. uint8_t m_bPlaying;
  250. uint8_t m_bSendEncoding;
  251. uint8_t m_bSendCounter;
  252. uint8_t m_bUseNagle;
  253. uint8_t m_bCustomSend;
  254. void* m_customSendParam;
  255. CUSTOMSEND m_customSendFunc;
  256. RTMP_BINDINFO m_bindIP;
  257. uint8_t m_bSendChunkSizeInfo;
  258. int m_numInvokes;
  259. int m_numCalls;
  260. RTMP_METHOD *m_methodCalls; /* remote method calls queue */
  261. int m_channelsAllocatedIn;
  262. int m_channelsAllocatedOut;
  263. RTMPPacket **m_vecChannelsIn;
  264. RTMPPacket **m_vecChannelsOut;
  265. int *m_channelTimestamp; /* abs timestamp of last packet */
  266. double m_fAudioCodecs; /* audioCodecs for the connect packet */
  267. double m_fVideoCodecs; /* videoCodecs for the connect packet */
  268. double m_fEncoding; /* AMF0 or AMF3 */
  269. double m_fDuration; /* duration of stream in seconds */
  270. int m_msgCounter; /* RTMPT stuff */
  271. int m_polling;
  272. int m_resplen;
  273. int m_unackd;
  274. AVal m_clientID;
  275. RTMP_READ m_read;
  276. RTMPPacket m_write;
  277. RTMPSockBuf m_sb;
  278. RTMP_LNK Link;
  279. int connect_time_ms;
  280. int last_error_code;
  281. } RTMP;
  282. int RTMP_ParseURL(const char *url, int *protocol, AVal *host,
  283. unsigned int *port, AVal *app);
  284. void RTMP_ParsePlaypath(AVal *in, AVal *out);
  285. void RTMP_SetBufferMS(RTMP *r, int size);
  286. void RTMP_UpdateBufferMS(RTMP *r);
  287. int RTMP_SetOpt(RTMP *r, const AVal *opt, AVal *arg);
  288. int RTMP_SetupURL(RTMP *r, char *url);
  289. int RTMP_AddStream(RTMP *r, const char *playpath);
  290. void RTMP_SetupStream(RTMP *r, int protocol,
  291. AVal *hostname,
  292. unsigned int port,
  293. AVal *sockshost,
  294. AVal *playpath,
  295. AVal *tcUrl,
  296. AVal *swfUrl,
  297. AVal *pageUrl,
  298. AVal *app,
  299. AVal *auth,
  300. AVal *swfSHA256Hash,
  301. uint32_t swfSize,
  302. AVal *flashVer,
  303. AVal *subscribepath,
  304. AVal *usherToken,
  305. int dStart,
  306. int dStop, int bLiveStream, long int timeout);
  307. int RTMP_Connect(RTMP *r, RTMPPacket *cp);
  308. struct sockaddr;
  309. int RTMP_Connect0(RTMP *r, struct sockaddr *svc, socklen_t addrlen);
  310. int RTMP_Connect1(RTMP *r, RTMPPacket *cp);
  311. int RTMP_Serve(RTMP *r);
  312. int RTMP_TLS_Accept(RTMP *r, void *ctx);
  313. int RTMP_ReadPacket(RTMP *r, RTMPPacket *packet);
  314. int RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue);
  315. int RTMP_SendChunk(RTMP *r, RTMPChunk *chunk);
  316. int RTMP_IsConnected(RTMP *r);
  317. SOCKET RTMP_Socket(RTMP *r);
  318. int RTMP_IsTimedout(RTMP *r);
  319. double RTMP_GetDuration(RTMP *r);
  320. int RTMP_ToggleStream(RTMP *r);
  321. int RTMP_ConnectStream(RTMP *r, int seekTime);
  322. int RTMP_ReconnectStream(RTMP *r, int seekTime, int streamIdx);
  323. void RTMP_DeleteStream(RTMP *r, int streamIdx);
  324. int RTMP_GetNextMediaPacket(RTMP *r, RTMPPacket *packet);
  325. int RTMP_ClientPacket(RTMP *r, RTMPPacket *packet);
  326. void RTMP_Init(RTMP *r);
  327. void RTMP_Close(RTMP *r);
  328. RTMP *RTMP_Alloc(void);
  329. void RTMP_TLS_Free();
  330. void RTMP_Free(RTMP *r);
  331. void RTMP_EnableWrite(RTMP *r);
  332. void *RTMP_TLS_AllocServerContext(const char* cert, const char* key);
  333. void RTMP_TLS_FreeServerContext(void *ctx);
  334. int RTMP_LibVersion(void);
  335. void RTMP_UserInterrupt(void); /* user typed Ctrl-C */
  336. int RTMP_SendCtrl(RTMP *r, short nType, unsigned int nObject,
  337. unsigned int nTime);
  338. /* caller probably doesn't know current timestamp, should
  339. * just use RTMP_Pause instead
  340. */
  341. int RTMP_SendPause(RTMP *r, int DoPause, int dTime);
  342. int RTMP_Pause(RTMP *r, int DoPause);
  343. int RTMP_FindFirstMatchingProperty(AMFObject *obj, const AVal *name,
  344. AMFObjectProperty * p);
  345. int RTMPSockBuf_Fill(RTMPSockBuf *sb);
  346. int RTMPSockBuf_Send(RTMPSockBuf *sb, const char *buf, int len);
  347. int RTMPSockBuf_Close(RTMPSockBuf *sb);
  348. int RTMP_SendCreateStream(RTMP *r);
  349. int RTMP_SendSeek(RTMP *r, int dTime);
  350. int RTMP_SendServerBW(RTMP *r);
  351. int RTMP_SendClientBW(RTMP *r);
  352. void RTMP_DropRequest(RTMP *r, int i, int freeit);
  353. int RTMP_Read(RTMP *r, char *buf, int size);
  354. int RTMP_Write(RTMP *r, const char *buf, int size, int streamIdx);
  355. /* hashswf.c */
  356. int RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash,
  357. int age);
  358. #ifdef __cplusplus
  359. };
  360. #endif
  361. #endif