Lines Matching refs:r
112 static int HandShake(RTMP *r, int FP9HandShake);
113 static int SocksNegotiate(RTMP *r);
115 static int SendConnectPacket(RTMP *r, RTMPPacket *cp);
116 static int SendCheckBW(RTMP *r);
117 static int SendCheckBWResult(RTMP *r, double txn);
118 static int SendDeleteStream(RTMP *r, double dStreamId);
119 static int SendFCSubscribe(RTMP *r, AVal *subscribepath);
120 static int SendPlay(RTMP *r);
121 static int SendBytesReceived(RTMP *r);
122 static int SendUsherToken(RTMP *r, AVal *usherToken);
125 static int SendBGHasStream(RTMP *r, double dId, AVal *playpath);
128 static int HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize);
129 static int HandleMetadata(RTMP *r, char *body, unsigned int len);
130 static void HandleChangeChunkSize(RTMP *r, const RTMPPacket *packet);
131 static void HandleAudio(RTMP *r, const RTMPPacket *packet);
132 static void HandleVideo(RTMP *r, const RTMPPacket *packet);
133 static void HandleCtrl(RTMP *r, const RTMPPacket *packet);
134 static void HandleServerBW(RTMP *r, const RTMPPacket *packet);
135 static void HandleClientBW(RTMP *r, const RTMPPacket *packet);
137 static int ReadN(RTMP *r, char *buffer, int n);
138 static int WriteN(RTMP *r, const char *buffer, int n);
142 static int HTTP_Post(RTMP *r, RTMPTCmd cmd, const char *buf, int len);
143 static int HTTP_read(RTMP *r, int fill);
145 static void CloseInternal(RTMP *r, int reconnect);
323 RTMP_Free(RTMP *r) in RTMP_Free() argument
325 free(r); in RTMP_Free()
329 RTMP_Init(RTMP *r) in RTMP_Init() argument
336 memset(r, 0, sizeof(RTMP)); in RTMP_Init()
337 r->m_sb.sb_socket = -1; in RTMP_Init()
338 r->m_inChunkSize = RTMP_DEFAULT_CHUNKSIZE; in RTMP_Init()
339 r->m_outChunkSize = RTMP_DEFAULT_CHUNKSIZE; in RTMP_Init()
340 r->m_nBufferMS = 30000; in RTMP_Init()
341 r->m_nClientBW = 2500000; in RTMP_Init()
342 r->m_nClientBW2 = 2; in RTMP_Init()
343 r->m_nServerBW = 2500000; in RTMP_Init()
344 r->m_fAudioCodecs = 3191.0; in RTMP_Init()
345 r->m_fVideoCodecs = 252.0; in RTMP_Init()
346 r->Link.timeout = 30; in RTMP_Init()
347 r->Link.swfAge = 30; in RTMP_Init()
351 RTMP_EnableWrite(RTMP *r) in RTMP_EnableWrite() argument
353 r->Link.protocol |= RTMP_FEATURE_WRITE; in RTMP_EnableWrite()
357 RTMP_GetDuration(RTMP *r) in RTMP_GetDuration() argument
359 return r->m_fDuration; in RTMP_GetDuration()
363 RTMP_IsConnected(RTMP *r) in RTMP_IsConnected() argument
365 return r->m_sb.sb_socket != -1; in RTMP_IsConnected()
369 RTMP_Socket(RTMP *r) in RTMP_Socket() argument
371 return r->m_sb.sb_socket; in RTMP_Socket()
375 RTMP_IsTimedout(RTMP *r) in RTMP_IsTimedout() argument
377 return r->m_sb.sb_timedout; in RTMP_IsTimedout()
381 RTMP_SetBufferMS(RTMP *r, int size) in RTMP_SetBufferMS() argument
383 r->m_nBufferMS = size; in RTMP_SetBufferMS()
387 RTMP_UpdateBufferMS(RTMP *r) in RTMP_UpdateBufferMS() argument
389 RTMP_SendCtrl(r, 3, r->m_stream_id, r->m_nBufferMS); in RTMP_UpdateBufferMS()
410 SocksSetup(RTMP *r, AVal *sockshost) in SocksSetup() argument
419 r->Link.sockshost.av_val = hostname; in SocksSetup()
420 r->Link.sockshost.av_len = strlen(hostname); in SocksSetup()
422 r->Link.socksport = socksport ? atoi(socksport + 1) : 1080; in SocksSetup()
423 RTMP_Log(RTMP_LOGDEBUG, "Connecting via SOCKS proxy: %s:%d", r->Link.sockshost.av_val, in SocksSetup()
424 r->Link.socksport); in SocksSetup()
428 r->Link.sockshost.av_val = NULL; in SocksSetup()
429 r->Link.sockshost.av_len = 0; in SocksSetup()
430 r->Link.socksport = 0; in SocksSetup()
435 RTMP_SetupStream(RTMP *r, in RTMP_SetupStream() argument
486 memcpy(r->Link.SWFHash, swfSHA256Hash->av_val, sizeof(r->Link.SWFHash)); in RTMP_SetupStream()
487 r->Link.SWFSize = swfSize; in RTMP_SetupStream()
489 RTMP_LogHex(RTMP_LOGDEBUG, r->Link.SWFHash, sizeof(r->Link.SWFHash)); in RTMP_SetupStream()
490 RTMP_Log(RTMP_LOGDEBUG, "SWFSize : %u", r->Link.SWFSize); in RTMP_SetupStream()
494 r->Link.SWFSize = 0; in RTMP_SetupStream()
498 SocksSetup(r, sockshost); in RTMP_SetupStream()
501 r->Link.tcUrl = *tcUrl; in RTMP_SetupStream()
503 r->Link.swfUrl = *swfUrl; in RTMP_SetupStream()
505 r->Link.pageUrl = *pageUrl; in RTMP_SetupStream()
507 r->Link.app = *app; in RTMP_SetupStream()
510 r->Link.auth = *auth; in RTMP_SetupStream()
511 r->Link.lFlags |= RTMP_LF_AUTH; in RTMP_SetupStream()
514 r->Link.flashVer = *flashVer; in RTMP_SetupStream()
516 r->Link.flashVer = RTMP_DefaultFlashVer; in RTMP_SetupStream()
518 r->Link.subscribepath = *subscribepath; in RTMP_SetupStream()
520 r->Link.usherToken = *usherToken; in RTMP_SetupStream()
521 r->Link.seekTime = dStart; in RTMP_SetupStream()
522 r->Link.stopTime = dStop; in RTMP_SetupStream()
524 r->Link.lFlags |= RTMP_LF_LIVE; in RTMP_SetupStream()
525 r->Link.timeout = timeout; in RTMP_SetupStream()
527 r->Link.protocol = protocol; in RTMP_SetupStream()
528 r->Link.hostname = *host; in RTMP_SetupStream()
529 r->Link.port = port; in RTMP_SetupStream()
530 r->Link.playpath = *playpath; in RTMP_SetupStream()
532 if (r->Link.port == 0) in RTMP_SetupStream()
535 r->Link.port = 443; in RTMP_SetupStream()
537 r->Link.port = 80; in RTMP_SetupStream()
539 r->Link.port = 1935; in RTMP_SetupStream()
713 int RTMP_SetOpt(RTMP *r, const AVal *opt, AVal *arg) in RTMP_SetOpt() argument
721 v = (char *)r + options[i].off; in RTMP_SetOpt()
742 if (parseAMF(&r->Link.extras, arg, &r->Link.edepth)) in RTMP_SetOpt()
757 int RTMP_SetupURL(RTMP *r, char *url) in RTMP_SetupURL() argument
768 ret = RTMP_ParseURL(url, &r->Link.protocol, &r->Link.hostname, in RTMP_SetupURL()
769 &port, &r->Link.playpath0, &r->Link.app); in RTMP_SetupURL()
772 r->Link.port = port; in RTMP_SetupURL()
773 r->Link.playpath = r->Link.playpath0; in RTMP_SetupURL()
814 ret = RTMP_SetOpt(r, &opt, &arg); in RTMP_SetupURL()
819 if (!r->Link.tcUrl.av_len) in RTMP_SetupURL()
821 r->Link.tcUrl.av_val = url; in RTMP_SetupURL()
822 if (r->Link.app.av_len) in RTMP_SetupURL()
824 if (r->Link.app.av_val < url + len) in RTMP_SetupURL()
827 r->Link.tcUrl.av_len = r->Link.app.av_len + (r->Link.app.av_val - url); in RTMP_SetupURL()
831 len = r->Link.hostname.av_len + r->Link.app.av_len + in RTMP_SetupURL()
833 r->Link.tcUrl.av_val = malloc(len); in RTMP_SetupURL()
834 r->Link.tcUrl.av_len = snprintf(r->Link.tcUrl.av_val, len, in RTMP_SetupURL()
836 RTMPProtocolStringsLower[r->Link.protocol], in RTMP_SetupURL()
837 r->Link.hostname.av_len, r->Link.hostname.av_val, in RTMP_SetupURL()
838 r->Link.port, in RTMP_SetupURL()
839 r->Link.app.av_len, r->Link.app.av_val); in RTMP_SetupURL()
840 r->Link.lFlags |= RTMP_LF_FTCU; in RTMP_SetupURL()
845 r->Link.tcUrl.av_len = strlen(url); in RTMP_SetupURL()
850 if ((r->Link.lFlags & RTMP_LF_SWFV) && r->Link.swfUrl.av_len) in RTMP_SetupURL()
851 RTMP_HashSWF(r->Link.swfUrl.av_val, &r->Link.SWFSize, in RTMP_SetupURL()
852 (unsigned char *)r->Link.SWFHash, r->Link.swfAge); in RTMP_SetupURL()
855 SocksSetup(r, &r->Link.sockshost); in RTMP_SetupURL()
857 if (r->Link.port == 0) in RTMP_SetupURL()
859 if (r->Link.protocol & RTMP_FEATURE_SSL) in RTMP_SetupURL()
860 r->Link.port = 443; in RTMP_SetupURL()
861 else if (r->Link.protocol & RTMP_FEATURE_HTTP) in RTMP_SetupURL()
862 r->Link.port = 80; in RTMP_SetupURL()
864 r->Link.port = 1935; in RTMP_SetupURL()
906 RTMP_Connect0(RTMP *r, struct sockaddr * service) in RTMP_Connect0() argument
909 r->m_sb.sb_timedout = FALSE; in RTMP_Connect0()
910 r->m_pausing = 0; in RTMP_Connect0()
911 r->m_fDuration = 0.0; in RTMP_Connect0()
913 r->m_sb.sb_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); in RTMP_Connect0()
914 if (r->m_sb.sb_socket != -1) in RTMP_Connect0()
916 if (connect(r->m_sb.sb_socket, service, sizeof(struct sockaddr)) < 0) in RTMP_Connect0()
921 RTMP_Close(r); in RTMP_Connect0()
925 if (r->Link.socksport) in RTMP_Connect0()
928 if (!SocksNegotiate(r)) in RTMP_Connect0()
931 RTMP_Close(r); in RTMP_Connect0()
945 SET_RCVTIMEO(tv, r->Link.timeout); in RTMP_Connect0()
947 (r->m_sb.sb_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv))) in RTMP_Connect0()
950 __FUNCTION__, r->Link.timeout); in RTMP_Connect0()
954 setsockopt(r->m_sb.sb_socket, IPPROTO_TCP, TCP_NODELAY, (char *) &on, sizeof(on)); in RTMP_Connect0()
960 RTMP_TLS_Accept(RTMP *r, void *ctx) in RTMP_TLS_Accept() argument
963 TLS_server(ctx, r->m_sb.sb_ssl); in RTMP_TLS_Accept()
964 TLS_setfd(r->m_sb.sb_ssl, r->m_sb.sb_socket); in RTMP_TLS_Accept()
965 if (TLS_accept(r->m_sb.sb_ssl) < 0) in RTMP_TLS_Accept()
977 RTMP_Connect1(RTMP *r, RTMPPacket *cp) in RTMP_Connect1() argument
979 if (r->Link.protocol & RTMP_FEATURE_SSL) in RTMP_Connect1()
982 TLS_client(RTMP_TLS_ctx, r->m_sb.sb_ssl); in RTMP_Connect1()
983 TLS_setfd(r->m_sb.sb_ssl, r->m_sb.sb_socket); in RTMP_Connect1()
984 if (TLS_connect(r->m_sb.sb_ssl) < 0) in RTMP_Connect1()
987 RTMP_Close(r); in RTMP_Connect1()
992 RTMP_Close(r); in RTMP_Connect1()
997 if (r->Link.protocol & RTMP_FEATURE_HTTP) in RTMP_Connect1()
999 r->m_msgCounter = 1; in RTMP_Connect1()
1000 r->m_clientID.av_val = NULL; in RTMP_Connect1()
1001 r->m_clientID.av_len = 0; in RTMP_Connect1()
1002 HTTP_Post(r, RTMPT_OPEN, "", 1); in RTMP_Connect1()
1003 if (HTTP_read(r, 1) != 0) in RTMP_Connect1()
1005 r->m_msgCounter = 0; in RTMP_Connect1()
1007 RTMP_Close(r); in RTMP_Connect1()
1010 r->m_msgCounter = 0; in RTMP_Connect1()
1013 if (!HandShake(r, TRUE)) in RTMP_Connect1()
1016 RTMP_Close(r); in RTMP_Connect1()
1021 if (!SendConnectPacket(r, cp)) in RTMP_Connect1()
1024 RTMP_Close(r); in RTMP_Connect1()
1031 RTMP_Connect(RTMP *r, RTMPPacket *cp) in RTMP_Connect() argument
1034 if (!r->Link.hostname.av_len) in RTMP_Connect()
1040 if (r->Link.socksport) in RTMP_Connect()
1043 if (!add_addr_info(&service, &r->Link.sockshost, r->Link.socksport)) in RTMP_Connect()
1049 if (!add_addr_info(&service, &r->Link.hostname, r->Link.port)) in RTMP_Connect()
1053 if (!RTMP_Connect0(r, (struct sockaddr *)&service)) in RTMP_Connect()
1056 r->m_bSendCounter = TRUE; in RTMP_Connect()
1058 return RTMP_Connect1(r, cp); in RTMP_Connect()
1062 SocksNegotiate(RTMP *r) in SocksNegotiate() argument
1068 add_addr_info(&service, &r->Link.hostname, r->Link.port); in SocksNegotiate()
1074 (r->Link.port >> 8) & 0xFF, in SocksNegotiate()
1075 (r->Link.port) & 0xFF, in SocksNegotiate()
1081 WriteN(r, packet, sizeof packet); in SocksNegotiate()
1083 if (ReadN(r, packet, 8) != 8) in SocksNegotiate()
1099 RTMP_ConnectStream(RTMP *r, int seekTime) in RTMP_ConnectStream() argument
1107 r->Link.seekTime = seekTime; in RTMP_ConnectStream()
1109 r->m_mediaChannel = 0; in RTMP_ConnectStream()
1111 while (!r->m_bPlaying && RTMP_IsConnected(r) && RTMP_ReadPacket(r, &packet)) in RTMP_ConnectStream()
1126 RTMP_ClientPacket(r, &packet); in RTMP_ConnectStream()
1131 return r->m_bPlaying; in RTMP_ConnectStream()
1135 RTMP_ReconnectStream(RTMP *r, int seekTime) in RTMP_ReconnectStream() argument
1137 RTMP_DeleteStream(r); in RTMP_ReconnectStream()
1139 RTMP_SendCreateStream(r); in RTMP_ReconnectStream()
1141 return RTMP_ConnectStream(r, seekTime); in RTMP_ReconnectStream()
1145 RTMP_ToggleStream(RTMP *r) in RTMP_ToggleStream() argument
1149 if (!r->m_pausing) in RTMP_ToggleStream()
1151 if (RTMP_IsTimedout(r) && r->m_read.status == RTMP_READ_EOF) in RTMP_ToggleStream()
1152 r->m_read.status = 0; in RTMP_ToggleStream()
1154 res = RTMP_SendPause(r, TRUE, r->m_pauseStamp); in RTMP_ToggleStream()
1158 r->m_pausing = 1; in RTMP_ToggleStream()
1161 res = RTMP_SendPause(r, FALSE, r->m_pauseStamp); in RTMP_ToggleStream()
1162 r->m_pausing = 3; in RTMP_ToggleStream()
1167 RTMP_DeleteStream(RTMP *r) in RTMP_DeleteStream() argument
1169 if (r->m_stream_id < 0) in RTMP_DeleteStream()
1172 r->m_bPlaying = FALSE; in RTMP_DeleteStream()
1174 SendDeleteStream(r, r->m_stream_id); in RTMP_DeleteStream()
1175 r->m_stream_id = -1; in RTMP_DeleteStream()
1179 RTMP_GetNextMediaPacket(RTMP *r, RTMPPacket *packet) in RTMP_GetNextMediaPacket() argument
1183 while (!bHasMediaPacket && RTMP_IsConnected(r) in RTMP_GetNextMediaPacket()
1184 && RTMP_ReadPacket(r, packet)) in RTMP_GetNextMediaPacket()
1191 bHasMediaPacket = RTMP_ClientPacket(r, packet); in RTMP_GetNextMediaPacket()
1197 else if (r->m_pausing == 3) in RTMP_GetNextMediaPacket()
1199 if (packet->m_nTimeStamp <= r->m_mediaStamp) in RTMP_GetNextMediaPacket()
1207 r->m_mediaStamp); in RTMP_GetNextMediaPacket()
1212 r->m_pausing = 0; in RTMP_GetNextMediaPacket()
1217 r->m_bPlaying = TRUE; in RTMP_GetNextMediaPacket()
1218 else if (r->m_sb.sb_timedout && !r->m_pausing) in RTMP_GetNextMediaPacket()
1219 r->m_pauseStamp = r->m_mediaChannel < r->m_channelsAllocatedIn ? in RTMP_GetNextMediaPacket()
1220 r->m_channelTimestamp[r->m_mediaChannel] : 0; in RTMP_GetNextMediaPacket()
1226 RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) in RTMP_ClientPacket() argument
1233 HandleChangeChunkSize(r, packet); in RTMP_ClientPacket()
1243 HandleCtrl(r, packet); in RTMP_ClientPacket()
1248 HandleServerBW(r, packet); in RTMP_ClientPacket()
1253 HandleClientBW(r, packet); in RTMP_ClientPacket()
1259 HandleAudio(r, packet); in RTMP_ClientPacket()
1261 if (!r->m_mediaChannel) in RTMP_ClientPacket()
1262 r->m_mediaChannel = packet->m_nChannel; in RTMP_ClientPacket()
1263 if (!r->m_pausing) in RTMP_ClientPacket()
1264 r->m_mediaStamp = packet->m_nTimeStamp; in RTMP_ClientPacket()
1270 HandleVideo(r, packet); in RTMP_ClientPacket()
1272 if (!r->m_mediaChannel) in RTMP_ClientPacket()
1273 r->m_mediaChannel = packet->m_nChannel; in RTMP_ClientPacket()
1274 if (!r->m_pausing) in RTMP_ClientPacket()
1275 r->m_mediaStamp = packet->m_nTimeStamp; in RTMP_ClientPacket()
1312 if (HandleInvoke(r, packet->m_body + 1, packet->m_nBodySize - 1) == 1) in RTMP_ClientPacket()
1320 if (HandleMetadata(r, packet->m_body, packet->m_nBodySize)) in RTMP_ClientPacket()
1335 if (HandleInvoke(r, packet->m_body, packet->m_nBodySize) == 1) in RTMP_ClientPacket()
1356 HandleMetadata(r, packet->m_body + pos + 11, dataSize); in RTMP_ClientPacket()
1365 if (!r->m_pausing) in RTMP_ClientPacket()
1366 r->m_mediaStamp = nTimeStamp; in RTMP_ClientPacket()
1390 ReadN(RTMP *r, char *buffer, int n) in ReadN() argument
1396 r->m_sb.sb_timedout = FALSE; in ReadN()
1406 if (r->Link.protocol & RTMP_FEATURE_HTTP) in ReadN()
1409 while (!r->m_resplen) in ReadN()
1412 if (r->m_sb.sb_size < 13 || refill) in ReadN()
1414 if (!r->m_unackd) in ReadN()
1415 HTTP_Post(r, RTMPT_IDLE, "", 1); in ReadN()
1416 if (RTMPSockBuf_Fill(&r->m_sb) < 1) in ReadN()
1418 if (!r->m_sb.sb_timedout) in ReadN()
1419 RTMP_Close(r); in ReadN()
1423 if ((ret = HTTP_read(r, 0)) == -1) in ReadN()
1426 RTMP_Close(r); in ReadN()
1438 if (r->m_resplen && !r->m_sb.sb_size) in ReadN()
1439 RTMPSockBuf_Fill(&r->m_sb); in ReadN()
1440 avail = r->m_sb.sb_size; in ReadN()
1441 if (avail > r->m_resplen) in ReadN()
1442 avail = r->m_resplen; in ReadN()
1446 avail = r->m_sb.sb_size; in ReadN()
1449 if (RTMPSockBuf_Fill(&r->m_sb) < 1) in ReadN()
1451 if (!r->m_sb.sb_timedout) in ReadN()
1452 RTMP_Close(r); in ReadN()
1455 avail = r->m_sb.sb_size; in ReadN()
1461 memcpy(ptr, r->m_sb.sb_start, nRead); in ReadN()
1462 r->m_sb.sb_start += nRead; in ReadN()
1463 r->m_sb.sb_size -= nRead; in ReadN()
1465 r->m_nBytesIn += nRead; in ReadN()
1466 if (r->m_bSendCounter in ReadN()
1467 && r->m_nBytesIn > ( r->m_nBytesInSent + r->m_nClientBW / 10)) in ReadN()
1468 if (!SendBytesReceived(r)) in ReadN()
1480 RTMP_Close(r); in ReadN()
1484 if (r->Link.protocol & RTMP_FEATURE_HTTP) in ReadN()
1485 r->m_resplen -= nBytes; in ReadN()
1488 if (r->Link.rc4keyIn) in ReadN()
1490 RC4_encrypt(r->Link.rc4keyIn, nBytes, ptr); in ReadN()
1502 WriteN(RTMP *r, const char *buffer, int n) in WriteN() argument
1509 if (r->Link.rc4keyOut) in WriteN()
1516 RC4_encrypt2(r->Link.rc4keyOut, n, buffer, ptr); in WriteN()
1524 if (r->Link.protocol & RTMP_FEATURE_HTTP) in WriteN()
1525 nBytes = HTTP_Post(r, RTMPT_SEND, ptr, n); in WriteN()
1527 nBytes = RTMPSockBuf_Send(&r->m_sb, ptr, n); in WriteN()
1539 RTMP_Close(r); in WriteN()
1579 SendConnectPacket(RTMP *r, RTMPPacket *cp) in SendConnectPacket() argument
1586 return RTMP_SendPacket(r, cp, TRUE); in SendConnectPacket()
1598 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendConnectPacket()
1601 enc = AMF_EncodeNamedString(enc, pend, &av_app, &r->Link.app); in SendConnectPacket()
1604 if (r->Link.protocol & RTMP_FEATURE_WRITE) in SendConnectPacket()
1610 if (r->Link.flashVer.av_len) in SendConnectPacket()
1612 enc = AMF_EncodeNamedString(enc, pend, &av_flashVer, &r->Link.flashVer); in SendConnectPacket()
1616 if (r->Link.swfUrl.av_len) in SendConnectPacket()
1618 enc = AMF_EncodeNamedString(enc, pend, &av_swfUrl, &r->Link.swfUrl); in SendConnectPacket()
1622 if (r->Link.tcUrl.av_len) in SendConnectPacket()
1624 enc = AMF_EncodeNamedString(enc, pend, &av_tcUrl, &r->Link.tcUrl); in SendConnectPacket()
1628 if (!(r->Link.protocol & RTMP_FEATURE_WRITE)) in SendConnectPacket()
1636 enc = AMF_EncodeNamedNumber(enc, pend, &av_audioCodecs, r->m_fAudioCodecs); in SendConnectPacket()
1639 enc = AMF_EncodeNamedNumber(enc, pend, &av_videoCodecs, r->m_fVideoCodecs); in SendConnectPacket()
1645 if (r->Link.pageUrl.av_len) in SendConnectPacket()
1647 enc = AMF_EncodeNamedString(enc, pend, &av_pageUrl, &r->Link.pageUrl); in SendConnectPacket()
1652 if (r->m_fEncoding != 0.0 || r->m_bSendEncoding) in SendConnectPacket()
1654 enc = AMF_EncodeNamedNumber(enc, pend, &av_objectEncoding, r->m_fEncoding); in SendConnectPacket()
1665 if (r->Link.auth.av_len) in SendConnectPacket()
1667 enc = AMF_EncodeBoolean(enc, pend, r->Link.lFlags & RTMP_LF_AUTH); in SendConnectPacket()
1670 enc = AMF_EncodeString(enc, pend, &r->Link.auth); in SendConnectPacket()
1674 if (r->Link.extras.o_num) in SendConnectPacket()
1677 for (i = 0; i < r->Link.extras.o_num; i++) in SendConnectPacket()
1679 enc = AMFProp_Encode(&r->Link.extras.o_props[i], enc, pend); in SendConnectPacket()
1686 return RTMP_SendPacket(r, &packet, TRUE); in SendConnectPacket()
1693 SendBGHasStream(RTMP *r, double dId, AVal *playpath)
1718 return RTMP_SendPacket(r, &packet, TRUE);
1725 RTMP_SendCreateStream(RTMP *r) in RTMP_SendCreateStream() argument
1741 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in RTMP_SendCreateStream()
1746 return RTMP_SendPacket(r, &packet, TRUE); in RTMP_SendCreateStream()
1752 SendFCSubscribe(RTMP *r, AVal *subscribepath) in SendFCSubscribe() argument
1768 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendFCSubscribe()
1777 return RTMP_SendPacket(r, &packet, TRUE); in SendFCSubscribe()
1784 SendUsherToken(RTMP *r, AVal *usherToken) in SendUsherToken() argument
1800 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendUsherToken()
1809 return RTMP_SendPacket(r, &packet, FALSE); in SendUsherToken()
1816 SendReleaseStream(RTMP *r) in SendReleaseStream() argument
1832 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendReleaseStream()
1834 enc = AMF_EncodeString(enc, pend, &r->Link.playpath); in SendReleaseStream()
1840 return RTMP_SendPacket(r, &packet, FALSE); in SendReleaseStream()
1846 SendFCPublish(RTMP *r) in SendFCPublish() argument
1862 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendFCPublish()
1864 enc = AMF_EncodeString(enc, pend, &r->Link.playpath); in SendFCPublish()
1870 return RTMP_SendPacket(r, &packet, FALSE); in SendFCPublish()
1876 SendFCUnpublish(RTMP *r) in SendFCUnpublish() argument
1892 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendFCUnpublish()
1894 enc = AMF_EncodeString(enc, pend, &r->Link.playpath); in SendFCUnpublish()
1900 return RTMP_SendPacket(r, &packet, FALSE); in SendFCUnpublish()
1908 SendPublish(RTMP *r) in SendPublish() argument
1918 packet.m_nInfoField2 = r->m_stream_id; in SendPublish()
1924 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendPublish()
1926 enc = AMF_EncodeString(enc, pend, &r->Link.playpath); in SendPublish()
1937 return RTMP_SendPacket(r, &packet, TRUE); in SendPublish()
1943 SendDeleteStream(RTMP *r, double dStreamId) in SendDeleteStream() argument
1959 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendDeleteStream()
1966 return RTMP_SendPacket(r, &packet, FALSE); in SendDeleteStream()
1972 RTMP_SendPause(RTMP *r, int DoPause, int iTime) in RTMP_SendPause() argument
1988 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in RTMP_SendPause()
1996 return RTMP_SendPacket(r, &packet, TRUE); in RTMP_SendPause()
1999 int RTMP_Pause(RTMP *r, int DoPause) in RTMP_Pause() argument
2002 r->m_pauseStamp = r->m_mediaChannel < r->m_channelsAllocatedIn ? in RTMP_Pause()
2003 r->m_channelTimestamp[r->m_mediaChannel] : 0; in RTMP_Pause()
2004 return RTMP_SendPause(r, DoPause, r->m_pauseStamp); in RTMP_Pause()
2010 RTMP_SendSeek(RTMP *r, int iTime) in RTMP_SendSeek() argument
2026 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in RTMP_SendSeek()
2032 r->m_read.flags |= RTMP_READ_SEEKING; in RTMP_SendSeek()
2033 r->m_read.nResumeTS = 0; in RTMP_SendSeek()
2035 return RTMP_SendPacket(r, &packet, TRUE); in RTMP_SendSeek()
2039 RTMP_SendServerBW(RTMP *r) in RTMP_SendServerBW() argument
2054 AMF_EncodeInt32(packet.m_body, pend, r->m_nServerBW); in RTMP_SendServerBW()
2055 return RTMP_SendPacket(r, &packet, FALSE); in RTMP_SendServerBW()
2059 RTMP_SendClientBW(RTMP *r) in RTMP_SendClientBW() argument
2074 AMF_EncodeInt32(packet.m_body, pend, r->m_nClientBW); in RTMP_SendClientBW()
2075 packet.m_body[4] = r->m_nClientBW2; in RTMP_SendClientBW()
2076 return RTMP_SendPacket(r, &packet, FALSE); in RTMP_SendClientBW()
2080 SendBytesReceived(RTMP *r) in SendBytesReceived() argument
2095 AMF_EncodeInt32(packet.m_body, pend, r->m_nBytesIn); /* hard coded for now */ in SendBytesReceived()
2096 r->m_nBytesInSent = r->m_nBytesIn; in SendBytesReceived()
2099 return RTMP_SendPacket(r, &packet, FALSE); in SendBytesReceived()
2105 SendCheckBW(RTMP *r) in SendCheckBW() argument
2121 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendCheckBW()
2127 return RTMP_SendPacket(r, &packet, FALSE); in SendCheckBW()
2133 SendCheckBWResult(RTMP *r, double txn) in SendCheckBWResult() argument
2142 packet.m_nTimeStamp = 0x16 * r->m_nBWCheckCounter; /* temp inc value. till we figure it out. */ in SendCheckBWResult()
2151 enc = AMF_EncodeNumber(enc, pend, (double)r->m_nBWCheckCounter++); in SendCheckBWResult()
2155 return RTMP_SendPacket(r, &packet, FALSE); in SendCheckBWResult()
2162 SendPong(RTMP *r, double txn) in SendPong() argument
2171 packet.m_nTimeStamp = 0x16 * r->m_nBWCheckCounter; /* temp inc value. till we figure it out. */ in SendPong()
2183 return RTMP_SendPacket(r, &packet, FALSE); in SendPong()
2189 SendPlay(RTMP *r) in SendPlay() argument
2199 packet.m_nInfoField2 = r->m_stream_id; /*0x01000000; */ in SendPlay()
2205 enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); in SendPlay()
2209 __FUNCTION__, r->Link.seekTime, r->Link.stopTime, in SendPlay()
2210 r->Link.playpath.av_val); in SendPlay()
2211 enc = AMF_EncodeString(enc, pend, &r->Link.playpath); in SendPlay()
2223 if (r->Link.lFlags & RTMP_LF_LIVE) in SendPlay()
2227 if (r->Link.seekTime > 0.0) in SendPlay()
2228 enc = AMF_EncodeNumber(enc, pend, r->Link.seekTime); /* resume from here */ in SendPlay()
2241 if (r->Link.stopTime) in SendPlay()
2243 enc = AMF_EncodeNumber(enc, pend, r->Link.stopTime - r->Link.seekTime); in SendPlay()
2250 return RTMP_SendPacket(r, &packet, TRUE); in SendPlay()
2257 SendPlaylist(RTMP *r) in SendPlaylist() argument
2267 packet.m_nInfoField2 = r->m_stream_id; /*0x01000000; */ in SendPlaylist()
2280 enc = AMF_EncodeNamedString(enc, pend, &av_0, &r->Link.playpath); in SendPlaylist()
2291 return RTMP_SendPacket(r, &packet, TRUE); in SendPlaylist()
2295 SendSecureTokenResponse(RTMP *r, AVal *resp) in SendSecureTokenResponse() argument
2319 return RTMP_SendPacket(r, &packet, FALSE); in SendSecureTokenResponse()
2339 RTMP_SendCtrl(RTMP *r, short nType, unsigned int nObject, unsigned int nTime) in RTMP_SendCtrl() argument
2371 memcpy(buf, r->Link.SWFVerificationResponse, 42); in RTMP_SendCtrl()
2389 return RTMP_SendPacket(r, &packet, FALSE); in RTMP_SendCtrl()
2408 RTMP_DropRequest(RTMP *r, int i, int freeit) in RTMP_DropRequest() argument
2410 AV_erase(r->m_methodCalls, &r->m_numCalls, i, freeit); in RTMP_DropRequest()
2522 PublisherAuth(RTMP *r, AVal *description) in PublisherAuth() argument
2544 if (strstr(r->Link.app.av_val, av_authmod_adobe.av_val) != NULL) { in PublisherAuth()
2547 } else if(r->Link.pubUser.av_len && r->Link.pubPasswd.av_len) { in PublisherAuth()
2548 pubToken.av_val = malloc(r->Link.pubUser.av_len + av_authmod_adobe.av_len + 8); in PublisherAuth()
2551 r->Link.pubUser.av_val); in PublisherAuth()
2604 MD5_Update(&md5ctx, r->Link.pubPasswd.av_val, r->Link.pubPasswd.av_len); in PublisherAuth()
2607 user.av_val, salt.av_val, r->Link.pubPasswd.av_val); in PublisherAuth()
2662 ptr = malloc(r->Link.app.av_len + pubToken.av_len); in PublisherAuth()
2663 strncpy(ptr, r->Link.app.av_val, r->Link.app.av_len); in PublisherAuth()
2664 strncpy(ptr + r->Link.app.av_len, pubToken.av_val, pubToken.av_len); in PublisherAuth()
2665 r->Link.app.av_len += pubToken.av_len; in PublisherAuth()
2666 if(r->Link.lFlags & RTMP_LF_FAPU) in PublisherAuth()
2667 free(r->Link.app.av_val); in PublisherAuth()
2668 r->Link.app.av_val = ptr; in PublisherAuth()
2670 ptr = malloc(r->Link.tcUrl.av_len + pubToken.av_len); in PublisherAuth()
2671 strncpy(ptr, r->Link.tcUrl.av_val, r->Link.tcUrl.av_len); in PublisherAuth()
2672 strncpy(ptr + r->Link.tcUrl.av_len, pubToken.av_val, pubToken.av_len); in PublisherAuth()
2673 r->Link.tcUrl.av_len += pubToken.av_len; in PublisherAuth()
2674 if(r->Link.lFlags & RTMP_LF_FTCU) in PublisherAuth()
2675 free(r->Link.tcUrl.av_val); in PublisherAuth()
2676 r->Link.tcUrl.av_val = ptr; in PublisherAuth()
2679 r->Link.lFlags |= RTMP_LF_FTCU | RTMP_LF_FAPU; in PublisherAuth()
2682 r->Link.app.av_len, r->Link.app.av_val, in PublisherAuth()
2683 r->Link.tcUrl.av_len, r->Link.tcUrl.av_val, in PublisherAuth()
2684 r->Link.playpath.av_val); in PublisherAuth()
2692 if (strstr(r->Link.app.av_val, av_authmod_llnw.av_val) != NULL) { in PublisherAuth()
2695 } else if(r->Link.pubUser.av_len && r->Link.pubPasswd.av_len) { in PublisherAuth()
2696 pubToken.av_val = malloc(r->Link.pubUser.av_len + av_authmod_llnw.av_len + 8); in PublisherAuth()
2699 r->Link.pubUser.av_val); in PublisherAuth()
2772 MD5_Update(&md5ctx, r->Link.pubPasswd.av_val, r->Link.pubPasswd.av_len); in PublisherAuth()
2775 user.av_val, realm, r->Link.pubPasswd.av_val); in PublisherAuth()
2781 apptmp = r->Link.app; in PublisherAuth()
2846 ptr = malloc(r->Link.app.av_len + pubToken.av_len); in PublisherAuth()
2847 strncpy(ptr, r->Link.app.av_val, r->Link.app.av_len); in PublisherAuth()
2848 strncpy(ptr + r->Link.app.av_len, pubToken.av_val, pubToken.av_len); in PublisherAuth()
2849 r->Link.app.av_len += pubToken.av_len; in PublisherAuth()
2850 if(r->Link.lFlags & RTMP_LF_FAPU) in PublisherAuth()
2851 free(r->Link.app.av_val); in PublisherAuth()
2852 r->Link.app.av_val = ptr; in PublisherAuth()
2854 ptr = malloc(r->Link.tcUrl.av_len + pubToken.av_len); in PublisherAuth()
2855 strncpy(ptr, r->Link.tcUrl.av_val, r->Link.tcUrl.av_len); in PublisherAuth()
2856 strncpy(ptr + r->Link.tcUrl.av_len, pubToken.av_val, pubToken.av_len); in PublisherAuth()
2857 r->Link.tcUrl.av_len += pubToken.av_len; in PublisherAuth()
2858 if(r->Link.lFlags & RTMP_LF_FTCU) in PublisherAuth()
2859 free(r->Link.tcUrl.av_val); in PublisherAuth()
2860 r->Link.tcUrl.av_val = ptr; in PublisherAuth()
2863 r->Link.lFlags |= RTMP_LF_FTCU | RTMP_LF_FAPU; in PublisherAuth()
2866 r->Link.app.av_len, r->Link.app.av_val, in PublisherAuth()
2867 r->Link.tcUrl.av_len, r->Link.tcUrl.av_val, in PublisherAuth()
2868 r->Link.playpath.av_val); in PublisherAuth()
2912 HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) in HandleInvoke() argument
2942 for (i=0; i<r->m_numCalls; i++) { in HandleInvoke()
2943 if (r->m_methodCalls[i].num == (int)txn) { in HandleInvoke()
2944 methodInvoked = r->m_methodCalls[i].name; in HandleInvoke()
2945 AV_erase(r->m_methodCalls, &r->m_numCalls, i, FALSE); in HandleInvoke()
2960 if (r->Link.token.av_len) in HandleInvoke()
2965 DecodeTEA(&r->Link.token, &p.p_vu.p_aval); in HandleInvoke()
2966 SendSecureTokenResponse(r, &p.p_vu.p_aval); in HandleInvoke()
2969 if (r->Link.protocol & RTMP_FEATURE_WRITE) in HandleInvoke()
2971 SendReleaseStream(r); in HandleInvoke()
2972 SendFCPublish(r); in HandleInvoke()
2976 RTMP_SendServerBW(r); in HandleInvoke()
2977 RTMP_SendCtrl(r, 3, 0, 300); in HandleInvoke()
2979 RTMP_SendCreateStream(r); in HandleInvoke()
2981 if (!(r->Link.protocol & RTMP_FEATURE_WRITE)) in HandleInvoke()
2984 if (r->Link.usherToken.av_len) in HandleInvoke()
2985 SendUsherToken(r, &r->Link.usherToken); in HandleInvoke()
2987 if (r->Link.subscribepath.av_len) in HandleInvoke()
2988 SendFCSubscribe(r, &r->Link.subscribepath); in HandleInvoke()
2989 else if (r->Link.lFlags & RTMP_LF_LIVE) in HandleInvoke()
2990 SendFCSubscribe(r, &r->Link.playpath); in HandleInvoke()
2995 r->m_stream_id = (int)AMFProp_GetNumber(AMF_GetProp(&obj, NULL, 3)); in HandleInvoke()
2997 if (r->Link.protocol & RTMP_FEATURE_WRITE) in HandleInvoke()
2999 SendPublish(r); in HandleInvoke()
3003 if (r->Link.lFlags & RTMP_LF_PLST) in HandleInvoke()
3004 SendPlaylist(r); in HandleInvoke()
3005 SendPlay(r); in HandleInvoke()
3006 RTMP_SendCtrl(r, 3, r->m_stream_id, r->m_nBufferMS); in HandleInvoke()
3012 r->m_bPlaying = TRUE; in HandleInvoke()
3018 if (!r->m_nBWCheckCounter) in HandleInvoke()
3019 SendCheckBW(r); in HandleInvoke()
3027 RTMP_Close(r); in HandleInvoke()
3032 SendPong(r, txn); in HandleInvoke()
3036 SendCheckBWResult(r, txn); in HandleInvoke()
3041 for (i = 0; i < r->m_numCalls; i++) in HandleInvoke()
3042 if (AVMATCH(&r->m_methodCalls[i].name, &av__checkbw)) in HandleInvoke()
3044 AV_erase(r->m_methodCalls, &r->m_numCalls, i, TRUE); in HandleInvoke()
3054 if (r->Link.protocol & RTMP_FEATURE_WRITE) in HandleInvoke()
3056 for (i=0; i<r->m_numCalls; i++) in HandleInvoke()
3058 if (r->m_methodCalls[i].num == txn) in HandleInvoke()
3060 methodInvoked = r->m_methodCalls[i].name; in HandleInvoke()
3061 AV_erase(r->m_methodCalls, &r->m_numCalls, i, FALSE); in HandleInvoke()
3085 if (PublisherAuth(r, &description) == 1) in HandleInvoke()
3087 CloseInternal(r, 1); in HandleInvoke()
3088 if (!RTMP_Connect(r, NULL) || !RTMP_ConnectStream(r, 0)) in HandleInvoke()
3105 RTMP_Close(r); in HandleInvoke()
3121 r->m_stream_id = -1; in HandleInvoke()
3122 RTMP_Close(r); in HandleInvoke()
3130 r->m_bPlaying = TRUE; in HandleInvoke()
3131 for (i = 0; i < r->m_numCalls; i++) in HandleInvoke()
3133 if (AVMATCH(&r->m_methodCalls[i].name, &av_play)) in HandleInvoke()
3135 AV_erase(r->m_methodCalls, &r->m_numCalls, i, TRUE); in HandleInvoke()
3144 r->m_bPlaying = TRUE; in HandleInvoke()
3145 for (i = 0; i < r->m_numCalls; i++) in HandleInvoke()
3147 if (AVMATCH(&r->m_methodCalls[i].name, &av_publish)) in HandleInvoke()
3149 AV_erase(r->m_methodCalls, &r->m_numCalls, i, TRUE); in HandleInvoke()
3160 RTMP_Close(r); in HandleInvoke()
3166 r->m_read.flags &= ~RTMP_READ_SEEKING; in HandleInvoke()
3171 if (r->m_pausing == 1 || r->m_pausing == 2) in HandleInvoke()
3173 RTMP_SendPause(r, FALSE, r->m_pauseStamp); in HandleInvoke()
3174 r->m_pausing = 3; in HandleInvoke()
3181 for (i = 0; i < r->m_numCalls; i++) in HandleInvoke()
3183 if (AVMATCH(&r->m_methodCalls[i].name, &av_set_playlist)) in HandleInvoke()
3185 AV_erase(r->m_methodCalls, &r->m_numCalls, i, TRUE); in HandleInvoke()
3303 HandleMetadata(RTMP *r, char *body, unsigned int len) in HandleMetadata() argument
3330 r->m_fDuration = prop.p_vu.p_number; in HandleMetadata()
3335 r->m_read.dataType |= 1; in HandleMetadata()
3337 r->m_read.dataType |= 4; in HandleMetadata()
3345 HandleChangeChunkSize(RTMP *r, const RTMPPacket *packet) in HandleChangeChunkSize() argument
3349 r->m_inChunkSize = AMF_DecodeInt32(packet->m_body); in HandleChangeChunkSize()
3351 r->m_inChunkSize); in HandleChangeChunkSize()
3356 HandleAudio(RTMP *r, const RTMPPacket *packet) in HandleAudio() argument
3361 HandleVideo(RTMP *r, const RTMPPacket *packet) in HandleVideo() argument
3366 HandleCtrl(RTMP *r, const RTMPPacket *packet) in HandleCtrl() argument
3388 if (r->m_pausing == 1) in HandleCtrl()
3389 r->m_pausing = 2; in HandleCtrl()
3405 RTMP_SendCtrl(r, 0x07, tmp, 0); in HandleCtrl()
3447 if (!(r->Link.lFlags & RTMP_LF_BUFX)) in HandleCtrl()
3449 if (!r->m_pausing) in HandleCtrl()
3451 r->m_pauseStamp = r->m_mediaChannel < r->m_channelsAllocatedIn ? in HandleCtrl()
3452 r->m_channelTimestamp[r->m_mediaChannel] : 0; in HandleCtrl()
3453 RTMP_SendPause(r, TRUE, r->m_pauseStamp); in HandleCtrl()
3454 r->m_pausing = 1; in HandleCtrl()
3456 else if (r->m_pausing == 2) in HandleCtrl()
3458 RTMP_SendPause(r, FALSE, r->m_pauseStamp); in HandleCtrl()
3459 r->m_pausing = 3; in HandleCtrl()
3489 else if (r->Link.SWFSize) in HandleCtrl()
3491 RTMP_SendCtrl(r, 0x1B, 0, 0); in HandleCtrl()
3508 HandleServerBW(RTMP *r, const RTMPPacket *packet) in HandleServerBW() argument
3510 r->m_nServerBW = AMF_DecodeInt32(packet->m_body); in HandleServerBW()
3511 RTMP_Log(RTMP_LOGDEBUG, "%s: server BW = %d", __FUNCTION__, r->m_nServerBW); in HandleServerBW()
3515 HandleClientBW(RTMP *r, const RTMPPacket *packet) in HandleClientBW() argument
3517 r->m_nClientBW = AMF_DecodeInt32(packet->m_body); in HandleClientBW()
3519 r->m_nClientBW2 = packet->m_body[4]; in HandleClientBW()
3521 r->m_nClientBW2 = -1; in HandleClientBW()
3522 RTMP_Log(RTMP_LOGDEBUG, "%s: client BW = %d %d", __FUNCTION__, r->m_nClientBW, in HandleClientBW()
3523 r->m_nClientBW2); in HandleClientBW()
3550 RTMP_ReadPacket(RTMP *r, RTMPPacket *packet) in RTMP_ReadPacket() argument
3558 RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d", __FUNCTION__, r->m_sb.sb_socket); in RTMP_ReadPacket()
3560 if (ReadN(r, (char *)hbuf, 1) == 0) in RTMP_ReadPacket()
3571 if (ReadN(r, (char *)&hbuf[1], 1) != 1) in RTMP_ReadPacket()
3584 if (ReadN(r, (char *)&hbuf[1], 2) != 2) in RTMP_ReadPacket()
3598 if (packet->m_nChannel >= r->m_channelsAllocatedIn) in RTMP_ReadPacket()
3601 int *timestamp = realloc(r->m_channelTimestamp, sizeof(int) * n); in RTMP_ReadPacket()
3602 RTMPPacket **packets = realloc(r->m_vecChannelsIn, sizeof(RTMPPacket*) * n); in RTMP_ReadPacket()
3604 free(r->m_channelTimestamp); in RTMP_ReadPacket()
3606 free(r->m_vecChannelsIn); in RTMP_ReadPacket()
3607 r->m_channelTimestamp = timestamp; in RTMP_ReadPacket()
3608 r->m_vecChannelsIn = packets; in RTMP_ReadPacket()
3610 r->m_channelsAllocatedIn = 0; in RTMP_ReadPacket()
3613 …memset(r->m_channelTimestamp + r->m_channelsAllocatedIn, 0, sizeof(int) * (n - r->m_channelsAlloca… in RTMP_ReadPacket()
3614 …memset(r->m_vecChannelsIn + r->m_channelsAllocatedIn, 0, sizeof(RTMPPacket*) * (n - r->m_channelsA… in RTMP_ReadPacket()
3615 r->m_channelsAllocatedIn = n; in RTMP_ReadPacket()
3623 if (r->m_vecChannelsIn[packet->m_nChannel]) in RTMP_ReadPacket()
3624 memcpy(packet, r->m_vecChannelsIn[packet->m_nChannel], in RTMP_ReadPacket()
3630 if (nSize > 0 && ReadN(r, header, nSize) != nSize) in RTMP_ReadPacket()
3663 if (ReadN(r, header + nSize, 4) != 4) in RTMP_ReadPacket()
3687 nChunk = r->m_inChunkSize; in RTMP_ReadPacket()
3700 if (ReadN(r, packet->m_body + packet->m_nBytesRead, nChunk) != nChunk) in RTMP_ReadPacket()
3712 if (!r->m_vecChannelsIn[packet->m_nChannel]) in RTMP_ReadPacket()
3713 r->m_vecChannelsIn[packet->m_nChannel] = malloc(sizeof(RTMPPacket)); in RTMP_ReadPacket()
3714 memcpy(r->m_vecChannelsIn[packet->m_nChannel], packet, sizeof(RTMPPacket)); in RTMP_ReadPacket()
3717 r->m_vecChannelsIn[packet->m_nChannel]->m_nTimeStamp = 0xffffff; in RTMP_ReadPacket()
3724 …packet->m_nTimeStamp += r->m_channelTimestamp[packet->m_nChannel]; /* timestamps seem to be always… in RTMP_ReadPacket()
3726 r->m_channelTimestamp[packet->m_nChannel] = packet->m_nTimeStamp; in RTMP_ReadPacket()
3730 r->m_vecChannelsIn[packet->m_nChannel]->m_body = NULL; in RTMP_ReadPacket()
3731 r->m_vecChannelsIn[packet->m_nChannel]->m_nBytesRead = 0; in RTMP_ReadPacket()
3732 …r->m_vecChannelsIn[packet->m_nChannel]->m_hasAbsTimestamp = FALSE; /* can only be false if we reus… in RTMP_ReadPacket()
3744 HandShake(RTMP *r, int FP9HandShake) in HandShake() argument
3768 if (!WriteN(r, clientbuf, RTMP_SIG_SIZE + 1)) in HandShake()
3771 if (ReadN(r, &type, 1) != 1) /* 0x03 or 0x06 */ in HandShake()
3780 if (ReadN(r, serversig, RTMP_SIG_SIZE) != RTMP_SIG_SIZE) in HandShake()
3793 if (!WriteN(r, serversig, RTMP_SIG_SIZE)) in HandShake()
3796 if (ReadN(r, serversig, RTMP_SIG_SIZE) != RTMP_SIG_SIZE) in HandShake()
3808 SHandShake(RTMP *r) in SHandShake() argument
3816 if (ReadN(r, serverbuf, 1) != 1) /* 0x03 or 0x06 */ in SHandShake()
3840 if (!WriteN(r, serverbuf, RTMP_SIG_SIZE + 1)) in SHandShake()
3843 if (ReadN(r, clientsig, RTMP_SIG_SIZE) != RTMP_SIG_SIZE) in SHandShake()
3856 if (!WriteN(r, clientsig, RTMP_SIG_SIZE)) in SHandShake()
3859 if (ReadN(r, clientsig, RTMP_SIG_SIZE) != RTMP_SIG_SIZE) in SHandShake()
3872 RTMP_SendChunk(RTMP *r, RTMPChunk *chunk) in RTMP_SendChunk() argument
3877 RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d, size=%d", __FUNCTION__, r->m_sb.sb_socket, in RTMP_SendChunk()
3887 wrote = WriteN(r, ptr, chunk->c_headerSize + chunk->c_chunkSize); in RTMP_SendChunk()
3891 wrote = WriteN(r, chunk->c_header, chunk->c_headerSize); in RTMP_SendChunk()
3896 RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue) in RTMP_SendPacket() argument
3908 if (packet->m_nChannel >= r->m_channelsAllocatedOut) in RTMP_SendPacket()
3911 RTMPPacket **packets = realloc(r->m_vecChannelsOut, sizeof(RTMPPacket*) * n); in RTMP_SendPacket()
3913 free(r->m_vecChannelsOut); in RTMP_SendPacket()
3914 r->m_vecChannelsOut = NULL; in RTMP_SendPacket()
3915 r->m_channelsAllocatedOut = 0; in RTMP_SendPacket()
3918 r->m_vecChannelsOut = packets; in RTMP_SendPacket()
3919 …memset(r->m_vecChannelsOut + r->m_channelsAllocatedOut, 0, sizeof(RTMPPacket*) * (n - r->m_channel… in RTMP_SendPacket()
3920 r->m_channelsAllocatedOut = n; in RTMP_SendPacket()
3923 prevPacket = r->m_vecChannelsOut[packet->m_nChannel]; in RTMP_SendPacket()
4018 nChunkSize = r->m_outChunkSize; in RTMP_SendPacket()
4020 RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d, size=%d", __FUNCTION__, r->m_sb.sb_socket, in RTMP_SendPacket()
4023 if (r->Link.protocol & RTMP_FEATURE_HTTP) in RTMP_SendPacket()
4051 wrote = WriteN(r, header, nChunkSize + hSize); in RTMP_SendPacket()
4090 int wrote = WriteN(r, tbuf, toff-tbuf); in RTMP_SendPacket()
4110 AV_queue(&r->m_methodCalls, &r->m_numCalls, &method, txn); in RTMP_SendPacket()
4114 if (!r->m_vecChannelsOut[packet->m_nChannel]) in RTMP_SendPacket()
4115 r->m_vecChannelsOut[packet->m_nChannel] = malloc(sizeof(RTMPPacket)); in RTMP_SendPacket()
4116 memcpy(r->m_vecChannelsOut[packet->m_nChannel], packet, sizeof(RTMPPacket)); in RTMP_SendPacket()
4121 RTMP_Serve(RTMP *r) in RTMP_Serve() argument
4123 return SHandShake(r); in RTMP_Serve()
4127 RTMP_Close(RTMP *r) in RTMP_Close() argument
4129 CloseInternal(r, 0); in RTMP_Close()
4133 CloseInternal(RTMP *r, int reconnect) in CloseInternal() argument
4137 if (RTMP_IsConnected(r)) in CloseInternal()
4139 if (r->m_stream_id > 0) in CloseInternal()
4141 i = r->m_stream_id; in CloseInternal()
4142 r->m_stream_id = 0; in CloseInternal()
4143 if ((r->Link.protocol & RTMP_FEATURE_WRITE)) in CloseInternal()
4144 SendFCUnpublish(r); in CloseInternal()
4145 SendDeleteStream(r, i); in CloseInternal()
4147 if (r->m_clientID.av_val) in CloseInternal()
4149 HTTP_Post(r, RTMPT_CLOSE, "", 1); in CloseInternal()
4150 free(r->m_clientID.av_val); in CloseInternal()
4151 r->m_clientID.av_val = NULL; in CloseInternal()
4152 r->m_clientID.av_len = 0; in CloseInternal()
4154 RTMPSockBuf_Close(&r->m_sb); in CloseInternal()
4157 r->m_stream_id = -1; in CloseInternal()
4158 r->m_sb.sb_socket = -1; in CloseInternal()
4159 r->m_nBWCheckCounter = 0; in CloseInternal()
4160 r->m_nBytesIn = 0; in CloseInternal()
4161 r->m_nBytesInSent = 0; in CloseInternal()
4163 if (r->m_read.flags & RTMP_READ_HEADER) { in CloseInternal()
4164 free(r->m_read.buf); in CloseInternal()
4165 r->m_read.buf = NULL; in CloseInternal()
4167 r->m_read.dataType = 0; in CloseInternal()
4168 r->m_read.flags = 0; in CloseInternal()
4169 r->m_read.status = 0; in CloseInternal()
4170 r->m_read.nResumeTS = 0; in CloseInternal()
4171 r->m_read.nIgnoredFrameCounter = 0; in CloseInternal()
4172 r->m_read.nIgnoredFlvFrameCounter = 0; in CloseInternal()
4174 r->m_write.m_nBytesRead = 0; in CloseInternal()
4175 RTMPPacket_Free(&r->m_write); in CloseInternal()
4177 for (i = 0; i < r->m_channelsAllocatedIn; i++) in CloseInternal()
4179 if (r->m_vecChannelsIn[i]) in CloseInternal()
4181 RTMPPacket_Free(r->m_vecChannelsIn[i]); in CloseInternal()
4182 free(r->m_vecChannelsIn[i]); in CloseInternal()
4183 r->m_vecChannelsIn[i] = NULL; in CloseInternal()
4186 free(r->m_vecChannelsIn); in CloseInternal()
4187 r->m_vecChannelsIn = NULL; in CloseInternal()
4188 free(r->m_channelTimestamp); in CloseInternal()
4189 r->m_channelTimestamp = NULL; in CloseInternal()
4190 r->m_channelsAllocatedIn = 0; in CloseInternal()
4191 for (i = 0; i < r->m_channelsAllocatedOut; i++) in CloseInternal()
4193 if (r->m_vecChannelsOut[i]) in CloseInternal()
4195 free(r->m_vecChannelsOut[i]); in CloseInternal()
4196 r->m_vecChannelsOut[i] = NULL; in CloseInternal()
4199 free(r->m_vecChannelsOut); in CloseInternal()
4200 r->m_vecChannelsOut = NULL; in CloseInternal()
4201 r->m_channelsAllocatedOut = 0; in CloseInternal()
4202 AV_clear(r->m_methodCalls, r->m_numCalls); in CloseInternal()
4203 r->m_methodCalls = NULL; in CloseInternal()
4204 r->m_numCalls = 0; in CloseInternal()
4205 r->m_numInvokes = 0; in CloseInternal()
4207 r->m_bPlaying = FALSE; in CloseInternal()
4208 r->m_sb.sb_size = 0; in CloseInternal()
4210 r->m_msgCounter = 0; in CloseInternal()
4211 r->m_resplen = 0; in CloseInternal()
4212 r->m_unackd = 0; in CloseInternal()
4214 if (r->Link.lFlags & RTMP_LF_FTCU && !reconnect) in CloseInternal()
4216 free(r->Link.tcUrl.av_val); in CloseInternal()
4217 r->Link.tcUrl.av_val = NULL; in CloseInternal()
4218 r->Link.lFlags ^= RTMP_LF_FTCU; in CloseInternal()
4220 if (r->Link.lFlags & RTMP_LF_FAPU && !reconnect) in CloseInternal()
4222 free(r->Link.app.av_val); in CloseInternal()
4223 r->Link.app.av_val = NULL; in CloseInternal()
4224 r->Link.lFlags ^= RTMP_LF_FAPU; in CloseInternal()
4229 free(r->Link.playpath0.av_val); in CloseInternal()
4230 r->Link.playpath0.av_val = NULL; in CloseInternal()
4233 if (r->Link.dh) in CloseInternal()
4235 MDH_free(r->Link.dh); in CloseInternal()
4236 r->Link.dh = NULL; in CloseInternal()
4238 if (r->Link.rc4keyIn) in CloseInternal()
4240 RC4_free(r->Link.rc4keyIn); in CloseInternal()
4241 r->Link.rc4keyIn = NULL; in CloseInternal()
4243 if (r->Link.rc4keyOut) in CloseInternal()
4245 RC4_free(r->Link.rc4keyOut); in CloseInternal()
4246 r->Link.rc4keyOut = NULL; in CloseInternal()
4407 HTTP_Post(RTMP *r, RTMPTCmd cmd, const char *buf, int len) in HTTP_Post() argument
4418 r->m_clientID.av_val ? r->m_clientID.av_val : "", in HTTP_Post()
4419 r->m_msgCounter, r->Link.hostname.av_len, r->Link.hostname.av_val, in HTTP_Post()
4420 r->Link.port, len); in HTTP_Post()
4421 RTMPSockBuf_Send(&r->m_sb, hbuf, hlen); in HTTP_Post()
4422 hlen = RTMPSockBuf_Send(&r->m_sb, buf, len); in HTTP_Post()
4423 r->m_msgCounter++; in HTTP_Post()
4424 r->m_unackd++; in HTTP_Post()
4429 HTTP_read(RTMP *r, int fill) in HTTP_read() argument
4436 RTMPSockBuf_Fill(&r->m_sb); in HTTP_read()
4437 if (r->m_sb.sb_size < 13) { in HTTP_read()
4442 if (strncmp(r->m_sb.sb_start, "HTTP/1.1 200 ", 13)) in HTTP_read()
4444 r->m_sb.sb_start[r->m_sb.sb_size] = '\0'; in HTTP_read()
4445 if (!strstr(r->m_sb.sb_start, "\r\n\r\n")) { in HTTP_read()
4451 ptr = r->m_sb.sb_start + sizeof("HTTP/1.1 200"); in HTTP_read()
4465 if (ptr + (r->m_clientID.av_val ? 1 : hlen) > r->m_sb.sb_start + r->m_sb.sb_size) in HTTP_read()
4471 r->m_sb.sb_size -= ptr - r->m_sb.sb_start; in HTTP_read()
4472 r->m_sb.sb_start = ptr; in HTTP_read()
4473 r->m_unackd--; in HTTP_read()
4475 if (!r->m_clientID.av_val) in HTTP_read()
4477 r->m_clientID.av_len = hlen; in HTTP_read()
4478 r->m_clientID.av_val = malloc(hlen+1); in HTTP_read()
4479 if (!r->m_clientID.av_val) in HTTP_read()
4481 r->m_clientID.av_val[0] = '/'; in HTTP_read()
4482 memcpy(r->m_clientID.av_val+1, ptr, hlen-1); in HTTP_read()
4483 r->m_clientID.av_val[hlen] = 0; in HTTP_read()
4484 r->m_sb.sb_size = 0; in HTTP_read()
4488 r->m_polling = *ptr++; in HTTP_read()
4489 r->m_resplen = hlen - 1; in HTTP_read()
4490 r->m_sb.sb_start++; in HTTP_read()
4491 r->m_sb.sb_size--; in HTTP_read()
4503 Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) in Read_1_Packet() argument
4514 rtnGetNextMediaPacket = RTMP_GetNextMediaPacket(r, &packet); in Read_1_Packet()
4532 r->m_read.dataType |= (((packet.m_packetType == RTMP_PACKET_TYPE_AUDIO) << 2) | in Read_1_Packet()
4550 if (r->m_read.flags & RTMP_READ_SEEKING) in Read_1_Packet()
4563 if (r->m_read.flags & RTMP_READ_RESUME) in Read_1_Packet()
4568 if (r->m_read.nMetaHeaderSize > 0 in Read_1_Packet()
4583 if ((r->m_read.nMetaHeaderSize != nPacketLen) || in Read_1_Packet()
4585 (r->m_read.metaHeader, packetBody, in Read_1_Packet()
4586 r->m_read.nMetaHeaderSize) != 0)) in Read_1_Packet()
4600 if (r->m_read.nInitialFrameSize > 0) in Read_1_Packet()
4603 if (packet.m_packetType == r->m_read.initialFrameType in Read_1_Packet()
4604 && r->m_read.nInitialFrameSize == nPacketLen) in Read_1_Packet()
4612 (r->m_read.initialFrame, packetBody, in Read_1_Packet()
4613 r->m_read.nInitialFrameSize) == 0) in Read_1_Packet()
4616 r->m_read.flags |= RTMP_READ_GOTKF; in Read_1_Packet()
4655 r->m_read.initialFrameType in Read_1_Packet()
4658 if (ts == r->m_read.nResumeTS) in Read_1_Packet()
4662 if (r->m_read.nInitialFrameSize != dataSize in Read_1_Packet()
4663 || memcmp(r->m_read.initialFrame, in Read_1_Packet()
4665 r->m_read. in Read_1_Packet()
4673 r->m_read.flags |= RTMP_READ_GOTFLVK; in Read_1_Packet()
4691 else if (r->m_read.nResumeTS < ts) in Read_1_Packet()
4701 if (ts < r->m_read.nResumeTS) in Read_1_Packet()
4710 if (!(r->m_read.flags & RTMP_READ_GOTFLVK)) in Read_1_Packet()
4722 && (r->m_read.flags & (RTMP_READ_GOTKF|RTMP_READ_GOTFLVK))) in Read_1_Packet()
4735 r->m_read.flags |= (RTMP_READ_GOTKF|RTMP_READ_GOTFLVK); in Read_1_Packet()
4741 if (!(r->m_read.flags & RTMP_READ_GOTKF) && in Read_1_Packet()
4746 r->m_read.nIgnoredFrameCounter++; in Read_1_Packet()
4747 if (r->m_read.nIgnoredFrameCounter > MAX_IGNORED_FRAMES) in Read_1_Packet()
4754 if (!(r->m_read.flags & RTMP_READ_GOTFLVK) && in Read_1_Packet()
4759 r->m_read.nIgnoredFlvFrameCounter++; in Read_1_Packet()
4760 if (r->m_read.nIgnoredFlvFrameCounter > MAX_IGNORED_FRAMES) in Read_1_Packet()
4773 if (!(r->m_read.flags & RTMP_READ_NO_IGNORE) && in Read_1_Packet()
4787 r->m_read.flags |= RTMP_READ_NO_IGNORE; in Read_1_Packet()
4803 r->m_read.buf = malloc(size + 4); in Read_1_Packet()
4804 if (r->m_read.buf == 0) in Read_1_Packet()
4811 ptr = r->m_read.buf; in Read_1_Packet()
4827 nTimeStamp = r->m_read.nResumeTS + packet.m_nTimeStamp; in Read_1_Packet()
4873 delta = packet.m_nTimeStamp - nTimeStamp + r->m_read.nResumeTS; in Read_1_Packet()
4890 r->m_read.dataType |= (((*(packetBody + pos) == 0x08) << 2) | in Read_1_Packet()
4954 r->m_read.timestamp = (r->Link.lFlags & RTMP_LF_LIVE) ? packet.m_nTimeStamp : nTimeStamp; in Read_1_Packet()
4966 memcpy(buf, r->m_read.buf, len); in Read_1_Packet()
4967 r->m_read.bufpos = r->m_read.buf + len; in Read_1_Packet()
4968 r->m_read.buflen = ret - len; in Read_1_Packet()
4981 RTMP_Read(RTMP *r, char *buf, int size) in RTMP_Read() argument
4987 switch (r->m_read.status) { in RTMP_Read()
4999 if (!(r->m_read.flags & RTMP_READ_HEADER)) in RTMP_Read()
5001 if (!(r->m_read.flags & RTMP_READ_RESUME)) in RTMP_Read()
5005 r->m_read.buf = mybuf; in RTMP_Read()
5006 r->m_read.buflen = HEADERBUF; in RTMP_Read()
5009 r->m_read.buf += sizeof(flvHeader); in RTMP_Read()
5010 r->m_read.buflen -= sizeof(flvHeader); in RTMP_Read()
5013 while (r->m_read.timestamp == 0) in RTMP_Read()
5015 nRead = Read_1_Packet(r, r->m_read.buf, r->m_read.buflen); in RTMP_Read()
5019 r->m_read.buf = NULL; in RTMP_Read()
5020 r->m_read.buflen = 0; in RTMP_Read()
5021 r->m_read.status = nRead; in RTMP_Read()
5025 if (r->m_read.buf < mybuf || r->m_read.buf > end) { in RTMP_Read()
5027 memcpy(mybuf+cnt, r->m_read.buf, nRead); in RTMP_Read()
5028 free(r->m_read.buf); in RTMP_Read()
5029 r->m_read.buf = mybuf+cnt+nRead; in RTMP_Read()
5033 r->m_read.buf += nRead; in RTMP_Read()
5034 r->m_read.buflen -= nRead; in RTMP_Read()
5035 if (r->m_read.dataType == 5) in RTMP_Read()
5038 mybuf[4] = r->m_read.dataType; in RTMP_Read()
5039 r->m_read.buflen = r->m_read.buf - mybuf; in RTMP_Read()
5040 r->m_read.buf = mybuf; in RTMP_Read()
5041 r->m_read.bufpos = mybuf; in RTMP_Read()
5043 r->m_read.flags |= RTMP_READ_HEADER; in RTMP_Read()
5046 if ((r->m_read.flags & RTMP_READ_SEEKING) && r->m_read.buf) in RTMP_Read()
5049 free(r->m_read.buf); in RTMP_Read()
5050 r->m_read.buf = NULL; in RTMP_Read()
5051 r->m_read.bufpos = NULL; in RTMP_Read()
5052 r->m_read.buflen = 0; in RTMP_Read()
5056 if (r->m_read.buf) in RTMP_Read()
5058 nRead = r->m_read.buflen; in RTMP_Read()
5061 memcpy(buf, r->m_read.bufpos, nRead); in RTMP_Read()
5062 r->m_read.buflen -= nRead; in RTMP_Read()
5063 if (!r->m_read.buflen) in RTMP_Read()
5065 free(r->m_read.buf); in RTMP_Read()
5066 r->m_read.buf = NULL; in RTMP_Read()
5067 r->m_read.bufpos = NULL; in RTMP_Read()
5071 r->m_read.bufpos += nRead; in RTMP_Read()
5078 while (size > 0 && (nRead = Read_1_Packet(r, buf, size)) >= 0) in RTMP_Read()
5087 r->m_read.status = nRead; in RTMP_Read()
5097 RTMP_Write(RTMP *r, const char *buf, int size) in RTMP_Write() argument
5099 RTMPPacket *pkt = &r->m_write; in RTMP_Write()
5104 pkt->m_nInfoField2 = r->m_stream_id; in RTMP_Write()
5169 ret = RTMP_SendPacket(r, pkt, FALSE); in RTMP_Write()