1+ #include " ../XEngine_Hdr.h"
2+ /* *******************************************************************
3+ // Created: 2024/01/11 10:31:20
4+ // File Name: D:\XEngine_StreamMedia\XEngine_Source\XEngine_ServiceApp\XEngine_StreamMediaApp\StreamMedia_PullStream\PullStream_ClientWebRtc.cpp
5+ // File Path: D:\XEngine_StreamMedia\XEngine_Source\XEngine_ServiceApp\XEngine_StreamMediaApp\StreamMedia_PullStream
6+ // File Base: PullStream_ClientWebRtc
7+ // File Ext: cpp
8+ // Project: XEngine(网络通信引擎)
9+ // Author: qyt
10+ // Purpose: WEBRTC拉流服务
11+ // History:
12+ *********************************************************************/
13+ bool PullStream_ClientWebRtc_Handle (RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen)
14+ {
15+ int nRVLen = 0 ;
16+ int nSDLen = 0 ;
17+ XNETHANDLE xhParse = 0 ;
18+ XNETHANDLE xhPacket = 0 ;
19+ XCHAR tszRVBuffer[4096 ] = {};
20+ XCHAR tszSDBuffer[4096 ] = {};
21+ RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {};
22+
23+ st_HDRParam.nHttpCode = 200 ; // HTTP CODE码
24+ st_HDRParam.bIsClose = true ; // 收到回复后就关闭
25+
26+ if (!SDPProtocol_Parse_Create (&xhParse, lpszMsgBuffer, nMsgLen))
27+ {
28+ ModuleProtocol_Packet_Comm (tszRVBuffer, &nRVLen, NULL , 400 , " sdp is incorrent" );
29+ HttpProtocol_Server_SendMsgEx (xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
30+ XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
31+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" WEBRTC:%s,请求拉流的SDP不正确,错误:%lX" ), lpszClientAddr, SDPProtocol_GetLastError ());
32+ return false ;
33+ }
34+
35+ bool bBundle = false ;
36+ bool bRTCPMux = false ;
37+ int nListCount = 0 ;
38+ STREAMMEDIA_SDPPROTOCOL_ATTR** ppSt_ListAttr;
39+ SDPProtocol_Parse_GetAttr (xhParse, &ppSt_ListAttr, &nListCount);
40+ for (int i = 0 ; i < nListCount; i++)
41+ {
42+ LPCXSTR lpszAttrGroup = _X (" group" );
43+ LPCXSTR lpszAttrMux = _X (" rtcp-mux" );
44+ if (0 == _tcsxnicmp (lpszAttrGroup, ppSt_ListAttr[i]->tszAttrKey , _tcsxlen (lpszAttrGroup)))
45+ {
46+ LPCXSTR lpszBundleStr = _X (" BUNDLE" );
47+ if (0 == _tcsxnicmp (lpszBundleStr, ppSt_ListAttr[i]->tszAttrValue , _tcsxlen (lpszBundleStr)))
48+ {
49+ // 是否启用了端口一致绑定
50+ bBundle = true ;
51+ break ;
52+ }
53+ }
54+ else if (0 == _tcsxnicmp (lpszAttrMux, ppSt_ListAttr[i]->tszAttrKey , _tcsxlen (lpszAttrMux)))
55+ {
56+ bRTCPMux = true ; // 复用端口检查
57+ }
58+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" SDPProtocol_Parse_GetAttr:%s-%s" ), ppSt_ListAttr[i]->tszAttrKey , ppSt_ListAttr[i]->tszAttrValue );
59+ }
60+
61+ SDPProtocol_Packet_Create (&xhPacket);
62+ SDPProtocol_Packet_Owner (xhPacket, _X (" rtc" ), xhPacket, _X (" 0.0.0.0" ));
63+ SDPProtocol_Packet_Session (xhPacket, _X (" XEngine_Session" ));
64+ SDPProtocol_Packet_OptionalRange (xhPacket);
65+
66+ XCHAR** pptszAVList;
67+ BaseLib_OperatorMemory_Malloc ((XPPPMEM)&pptszAVList, 1 , MAX_PATH);
68+ _tcsxcpy (pptszAVList[0 ], _X (" 111" ));
69+
70+ SDPProtocol_Packet_OptionalAddAttr (xhPacket, _X (" ice-lite" ));
71+ SDPProtocol_Packet_OptionalAddAttr (xhPacket, _X (" group" ), _X (" BUNDLE 0 1" ));
72+ SDPProtocol_Packet_OptionalAddAttr (xhPacket, _X (" msid-semantic" ), _X (" WMS live/livestream" ));
73+ SDPProtocol_Packet_AddMedia (xhPacket, _X (" audio" ), _X (" UDP/TLS/RTP/SAVPF" ), &pptszAVList, 1 );
74+
75+ ModuleProtocol_Packet_Comm (tszRVBuffer, &nRVLen);
76+ HttpProtocol_Server_SendMsgEx (xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
77+ XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
78+ SDPProtocol_Parse_Destory (xhParse);
79+ SDPProtocol_Packet_Destory (xhPacket);
80+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" WEBRTC:%s,WHIP协议拉流请求成功" ), lpszClientAddr);
81+ return true ;
82+ }
0 commit comments