Skip to content

Commit e679e73

Browse files
committed
modify:basic rtp send supported
1 parent 72ed2ed commit e679e73

File tree

7 files changed

+210
-6
lines changed

7 files changed

+210
-6
lines changed

XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,54 @@ extern "C" bool ModuleHelp_Rtsp_GetSsrc(LPCXSTR lpszClientID, XCHAR* ptszSsrcStr
380380
备注:
381381
*********************************************************************/
382382
extern "C" bool ModuleHelp_Rtsp_GetTrack(LPCXSTR lpszClientID, int nTrackID, bool* pbVideo);
383+
/********************************************************************
384+
函数名称:ModuleHelp_Rtsp_GetRTPAddr
385+
函数功能:获取RTP发送地址端口
386+
参数.一:lpszClientID
387+
In/Out:In
388+
类型:常量字符指针
389+
可空:N
390+
意思:输入要处理的客户端ID
391+
参数.二:ptszADDRStr
392+
In/Out:Out
393+
类型:字符指针
394+
可空:N
395+
意思:输出地址字符串
396+
参数.三:bVideo
397+
In/Out:In
398+
类型:逻辑型
399+
可空:N
400+
意思:输入是音频还是视频
401+
返回值
402+
类型:逻辑型
403+
意思:是否成功
404+
备注:
405+
*********************************************************************/
406+
extern "C" bool ModuleHelp_Rtsp_GetRTPAddr(LPCXSTR lpszClientID, XCHAR* ptszADDRStr, bool bVideo);
407+
/********************************************************************
408+
函数名称:ModuleHelp_Rtsp_GetRTPAddr
409+
函数功能:获取RTCP发送地址端口
410+
参数.一:lpszClientID
411+
In/Out:In
412+
类型:常量字符指针
413+
可空:N
414+
意思:输入要处理的客户端ID
415+
参数.二:ptszADDRStr
416+
In/Out:Out
417+
类型:字符指针
418+
可空:N
419+
意思:输出地址字符串
420+
参数.三:bVideo
421+
In/Out:In
422+
类型:逻辑型
423+
可空:N
424+
意思:输入是音频还是视频
425+
返回值
426+
类型:逻辑型
427+
意思:是否成功
428+
备注:
429+
*********************************************************************/
430+
extern "C" bool ModuleHelp_Rtsp_GetRTCPAddr(LPCXSTR lpszClientID, XCHAR* ptszADDRStr, bool bVideo);
383431
/************************************************************************/
384432
/* 导出的RTMP函数 */
385433
/************************************************************************/

XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Rtsp/ModuleHelp_Rtsp.cpp

Lines changed: 111 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ bool CModuleHelp_Rtsp::ModuleHelp_Rtsp_SetClient(LPCXSTR lpszClientID, int nRTPP
185185
意思:是否成功
186186
备注:
187187
*********************************************************************/
188-
bool CModuleHelp_Rtsp::ModuleHelp_Rtsp_GetClient(LPCXSTR lpszClientID, int* pInt_RTPPort, int* pInt_RTCPPort, bool bVideo /* = true */)
188+
bool CModuleHelp_Rtsp::ModuleHelp_Rtsp_GetClient(LPCXSTR lpszClientID, int* pInt_RTPPort /* = NULL */, int* pInt_RTCPPort /* = NULL */, bool bVideo /* = true */)
189189
{
190190
ModuleHelp_IsErrorOccur = false;
191191

@@ -199,13 +199,25 @@ bool CModuleHelp_Rtsp::ModuleHelp_Rtsp_GetClient(LPCXSTR lpszClientID, int* pInt
199199

200200
if (bVideo)
201201
{
202-
*pInt_RTPPort = stl_MapIterator->second.nVideoRTPPort;
203-
*pInt_RTCPPort = stl_MapIterator->second.nVideoRTCPPort;
202+
if (NULL != pInt_RTPPort)
203+
{
204+
*pInt_RTPPort = stl_MapIterator->second.nVideoRTPPort;
205+
}
206+
if (NULL != pInt_RTCPPort)
207+
{
208+
*pInt_RTCPPort = stl_MapIterator->second.nVideoRTCPPort;
209+
}
204210
}
205211
else
206212
{
207-
*pInt_RTPPort = stl_MapIterator->second.nAudioRTPPort;
208-
*pInt_RTCPPort = stl_MapIterator->second.nAudioRTCPPort;
213+
if (NULL != pInt_RTPPort)
214+
{
215+
*pInt_RTPPort = stl_MapIterator->second.nAudioRTPPort;
216+
}
217+
if (NULL != pInt_RTCPPort)
218+
{
219+
*pInt_RTCPPort = stl_MapIterator->second.nAudioRTCPPort;
220+
}
209221
}
210222
return true;
211223
}
@@ -408,4 +420,98 @@ bool CModuleHelp_Rtsp::ModuleHelp_Rtsp_GetTrack(LPCXSTR lpszClientID, int nTrack
408420
*pbVideo = false;
409421
}
410422
return true;
423+
}
424+
/********************************************************************
425+
函数名称:ModuleHelp_Rtsp_GetRTPAddr
426+
函数功能:获取RTP发送地址端口
427+
参数.一:lpszClientID
428+
In/Out:In
429+
类型:常量字符指针
430+
可空:N
431+
意思:输入要处理的客户端ID
432+
参数.二:ptszADDRStr
433+
In/Out:Out
434+
类型:字符指针
435+
可空:N
436+
意思:输出地址字符串
437+
参数.三:bVideo
438+
In/Out:In
439+
类型:逻辑型
440+
可空:N
441+
意思:输入是音频还是视频
442+
返回值
443+
类型:逻辑型
444+
意思:是否成功
445+
备注:
446+
*********************************************************************/
447+
bool CModuleHelp_Rtsp::ModuleHelp_Rtsp_GetRTPAddr(LPCXSTR lpszClientID, XCHAR* ptszADDRStr, bool bVideo)
448+
{
449+
ModuleHelp_IsErrorOccur = false;
450+
451+
unordered_map<string, RTSPPROTOCOL_CLIENTINFO>::iterator stl_MapIterator = stl_MapRTSPClient.find(lpszClientID);
452+
if (stl_MapIterator == stl_MapRTSPClient.end())
453+
{
454+
ModuleHelp_IsErrorOccur = true;
455+
ModuleHelp_dwErrorCode = ERROR_MODULE_HELP_RTSP_NOTFOUND;
456+
return false;
457+
}
458+
int nPort = 0;
459+
XCHAR tszIPAddr[128] = {};
460+
BaseLib_OperatorIPAddr_SegAddr(tszIPAddr, &nPort);
461+
if (bVideo)
462+
{
463+
_xstprintf(ptszADDRStr, _X("%s:%d"), tszIPAddr, stl_MapIterator->second.nVideoRTPPort);
464+
}
465+
else
466+
{
467+
_xstprintf(ptszADDRStr, _X("%s:%d"), tszIPAddr, stl_MapIterator->second.nAudioRTPPort);
468+
}
469+
return true;
470+
}
471+
/********************************************************************
472+
函数名称:ModuleHelp_Rtsp_GetRTPAddr
473+
函数功能:获取RTCP发送地址端口
474+
参数.一:lpszClientID
475+
In/Out:In
476+
类型:常量字符指针
477+
可空:N
478+
意思:输入要处理的客户端ID
479+
参数.二:ptszADDRStr
480+
In/Out:Out
481+
类型:字符指针
482+
可空:N
483+
意思:输出地址字符串
484+
参数.三:bVideo
485+
In/Out:In
486+
类型:逻辑型
487+
可空:N
488+
意思:输入是音频还是视频
489+
返回值
490+
类型:逻辑型
491+
意思:是否成功
492+
备注:
493+
*********************************************************************/
494+
bool CModuleHelp_Rtsp::ModuleHelp_Rtsp_GetRTCPAddr(LPCXSTR lpszClientID, XCHAR* ptszADDRStr, bool bVideo)
495+
{
496+
ModuleHelp_IsErrorOccur = false;
497+
498+
unordered_map<string, RTSPPROTOCOL_CLIENTINFO>::iterator stl_MapIterator = stl_MapRTSPClient.find(lpszClientID);
499+
if (stl_MapIterator == stl_MapRTSPClient.end())
500+
{
501+
ModuleHelp_IsErrorOccur = true;
502+
ModuleHelp_dwErrorCode = ERROR_MODULE_HELP_RTSP_NOTFOUND;
503+
return false;
504+
}
505+
int nPort = 0;
506+
XCHAR tszIPAddr[128] = {};
507+
BaseLib_OperatorIPAddr_SegAddr(tszIPAddr, &nPort);
508+
if (bVideo)
509+
{
510+
_xstprintf(ptszADDRStr, _X("%s:%d"), tszIPAddr, stl_MapIterator->second.nVideoRTCPPort);
511+
}
512+
else
513+
{
514+
_xstprintf(ptszADDRStr, _X("%s:%d"), tszIPAddr, stl_MapIterator->second.nAudioRTCPPort);
515+
}
516+
return true;
411517
}

XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Rtsp/ModuleHelp_Rtsp.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ class CModuleHelp_Rtsp
3434
bool ModuleHelp_Rtsp_CreateClient(LPCXSTR lpszClientID, int nVControlID, int nAControlID);
3535
bool ModuleHelp_Rtsp_DeleteClient(LPCXSTR lpszClientID);
3636
bool ModuleHelp_Rtsp_SetClient(LPCXSTR lpszClientID, int nRTPPort, int nRTCPPort, int nTrackID);
37-
bool ModuleHelp_Rtsp_GetClient(LPCXSTR lpszClientID, int* pInt_RTPPort, int* pInt_RTCPPort, bool bVideo = true);
37+
bool ModuleHelp_Rtsp_GetClient(LPCXSTR lpszClientID, int* pInt_RTPPort = NULL, int* pInt_RTCPPort = NULL, bool bVideo = true);
3838
bool ModuleHelp_Rtsp_SetSession(LPCXSTR lpszClientID, LPCXSTR lpszSessionStr);
3939
bool ModuleHelp_Rtsp_GetSession(LPCXSTR lpszClientID, XCHAR *ptszSessionStr);
4040
bool ModuleHelp_Rtsp_SetSsrc(LPCXSTR lpszClientID, LPCXSTR lpszSsrcStr, bool bVideo = true);
4141
bool ModuleHelp_Rtsp_GetSsrc(LPCXSTR lpszClientID, XCHAR *ptszSsrcStr, bool bVideo = true);
4242
bool ModuleHelp_Rtsp_GetTrack(LPCXSTR lpszClientID, int nTrackID, bool* pbVideo);
43+
bool ModuleHelp_Rtsp_GetRTPAddr(LPCXSTR lpszClientID, XCHAR* ptszADDRStr, bool bVideo);
44+
bool ModuleHelp_Rtsp_GetRTCPAddr(LPCXSTR lpszClientID, XCHAR* ptszADDRStr, bool bVideo);
4345
protected:
4446
private:
4547
unordered_map<string, RTSPPROTOCOL_CLIENTINFO> stl_MapRTSPClient;

XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ EXPORTS
2323
ModuleHelp_Rtsp_SetSsrc
2424
ModuleHelp_Rtsp_GetSsrc
2525
ModuleHelp_Rtsp_GetTrack
26+
ModuleHelp_Rtsp_GetRTPAddr
27+
ModuleHelp_Rtsp_GetRTCPAddr
2628

2729
ModuleHelp_Rtmp_CreateSession
2830
ModuleHelp_Rtmp_GetSession

XEngine_Source/XEngine_ModuleHelp/pch.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ extern "C" bool ModuleHelp_Rtsp_GetTrack(LPCXSTR lpszClientID, int nTrackID, boo
113113
{
114114
return m_HelpRtsp.ModuleHelp_Rtsp_GetTrack(lpszClientID, nTrackID, pbVideo);
115115
}
116+
extern "C" bool ModuleHelp_Rtsp_GetRTPAddr(LPCXSTR lpszClientID, XCHAR * ptszADDRStr, bool bVideo)
117+
{
118+
return m_HelpRtsp.ModuleHelp_Rtsp_GetRTPAddr(lpszClientID, ptszADDRStr, bVideo);
119+
}
120+
extern "C" bool ModuleHelp_Rtsp_GetRTCPAddr(LPCXSTR lpszClientID, XCHAR * ptszADDRStr, bool bVideo)
121+
{
122+
return m_HelpRtsp.ModuleHelp_Rtsp_GetRTCPAddr(lpszClientID, ptszADDRStr, bVideo);
123+
}
116124
/************************************************************************/
117125
/* 导出的RTMP函数 */
118126
/************************************************************************/

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PullStream/PullStream_ClientMethod.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,9 @@ bool PullStream_ClientMethod_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam,
235235

236236
RTSPProtocol_REPPacket_Response(tszSDBuffer, &nSDLen, &st_RTSPResponse);
237237
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
238+
239+
ModuleSession_PullStream_Insert(lpszClientAddr, tszSMSAddr, tszPushAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTSP);
240+
ModuleSession_PushStream_ClientInsert(tszPushAddr, lpszClientAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTSP);
238241
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTSP:%s,请求PLAY选项成功,会话ID:%s,视频SSRC:%s,音频SSRC:%s"), lpszClientAddr, st_RTSPRequest.tszSession, tszSSRCVideo, tszSSRCAudio);
239242
}
240243
else if (ENUM_RTSPPROTOCOL_METHOD_TYPE_TEARDOWN == st_RTSPRequest.enMethod)

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/XEngine_AVPacket.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,5 +394,40 @@ bool XEngine_AVPacket_AVFrame(XCHAR* ptszSDBuffer, int* pInt_SDLen, XCHAR* ptszR
394394
}
395395
}
396396
}
397+
if (st_ServiceConfig.st_XPull.st_PullRtsp.bEnable)
398+
{
399+
//是否有客户端需要发送RTSP流
400+
list<STREAMMEDIA_SESSIONCLIENT> stl_ListClient;
401+
ModuleSession_PushStream_ClientList(lpszClientAddr, &stl_ListClient);
402+
for (auto stl_ListIteratorClient = stl_ListClient.begin(); stl_ListIteratorClient != stl_ListClient.end(); ++stl_ListIteratorClient)
403+
{
404+
if (ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTSP == stl_ListIteratorClient->enClientType)
405+
{
406+
int nPacketCount = 0;
407+
STREAMMEDIA_RTPPROTOCOL_PACKET** ppSt_RTPPacket;
408+
XCHAR tszSSCRStr[MAX_PATH] = {};
409+
XCHAR tszADDRStr[128] = {};
410+
411+
if (0 == byAVType)
412+
{
413+
ModuleHelp_Rtsp_GetSsrc(stl_ListIteratorClient->tszClientID, tszSSCRStr, true);
414+
ModuleHelp_Rtsp_GetRTPAddr(stl_ListIteratorClient->tszClientID, tszADDRStr, true);
415+
RTPProtocol_Packet_Packet(tszSSCRStr, lpszMsgBuffer, nMsgLen, &ppSt_RTPPacket, &nPacketCount);
416+
}
417+
else
418+
{
419+
ModuleHelp_Rtsp_GetSsrc(stl_ListIteratorClient->tszClientID, tszSSCRStr, false);
420+
ModuleHelp_Rtsp_GetRTPAddr(stl_ListIteratorClient->tszClientID, tszADDRStr, false);
421+
RTPProtocol_Packet_Packet(tszSSCRStr, lpszMsgBuffer, nMsgLen, &ppSt_RTPPacket, &nPacketCount);
422+
}
423+
//发送数据,RTSP使用UDP发送
424+
for (int i = 0; i < nPacketCount; i++)
425+
{
426+
NetCore_UDPXCore_SendEx(xhVRTPSocket, tszADDRStr, ppSt_RTPPacket[i]->tszMsgBuffer, ppSt_RTPPacket[i]->nMsgLen);
427+
}
428+
BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_RTPPacket, nPacketCount);
429+
}
430+
}
431+
}
397432
return true;
398433
}

0 commit comments

Comments
 (0)