1. 程式人生 > >斷線重連處理

斷線重連處理

繼承 RtpFeedback
#ifndef CHANNEL_RTPFEEDBACKIMPL_H
#define CHANNEL_RTPFEEDBACKIMPL_H

#include "rtp_rtcp_defines.h"
#include "xx\defines.h"
using namespace webrtc ;

class RtpFeedbackImpl : public RtpFeedback
{
public:
	
	RtpFeedbackImpl (NET_ADAPTER_TYPE net_adapter_type) ;
	~RtpFeedbackImpl () ;

	//only this func is used to deal with dead or alive status
	void OnPeriodicDeadOrAlive(const WebRtc_Word32 id,
		const RTPAliveType alive) ;

public:
	//imp RtpFeedback
	WebRtc_Word32 OnInitializeDecoder(
		const WebRtc_Word32 id,
		const WebRtc_Word8 payloadType,
		const char payloadName[RTP_PAYLOAD_NAME_SIZE],
		const int frequency,
		const WebRtc_UWord8 channels,
		const WebRtc_UWord32 rate) 
	{
		return 0 ;
	}

	void OnPacketTimeout(const WebRtc_Word32 id) {} ;

	void OnReceivedPacket(const WebRtc_Word32 id,
		const RtpRtcpPacketType packetType) {} ;

	void OnIncomingSSRCChanged( const WebRtc_Word32 id,
		const WebRtc_UWord32 SSRC) {} ;

	void OnIncomingCSRCChanged( const WebRtc_Word32 id,
		const WebRtc_UWord32 CSRC,
		const bool added) {} ;

private :
	NET_ADAPTER_TYPE m_net_adapter_type ;
};

#endif 

#include "stdafx.h"
#include "RtpFeedbackImpl.h"
#include "xx\INetAdapterManager.h"
#include <iostream>
#include <inaddr.h>


RtpFeedbackImpl::RtpFeedbackImpl (NET_ADAPTER_TYPE net_adapter_type)
: m_net_adapter_type (net_adapter_type)
{
}




RtpFeedbackImpl::~RtpFeedbackImpl (void)
{
}


void RtpFeedbackImpl::OnPeriodicDeadOrAlive(const WebRtc_Word32 id,
const RTPAliveType alive)
{
if (alive == kRtpDead) //斷線重連 (重建Socket)
{
sockaddr_in svraddr ;
//重新進行connect
}
else
{
//..
}
}

//使用

	增加斷線重連機制需要對RtpRtcp呼叫以下方法
	m_pRtpRtcp->SetPeriodicDeadOrAliveStatus (true, N) ; //開啟斷線檢測,週期N秒
	m_pRtpRtcp->RegisterIncomingRTPCallback (new RtpFeedbackImpl(type)) ;

CPTSChatAVChannelBase::Initialize(strAddr, uPort, uRoomID,uUserID);
	if(m_pRtpRtcp)
		RtpRtcp::DestroyRtpRtcp(m_pRtpRtcp);
	m_pRtpRtcp = RtpRtcp::CreateRtpRtcp(0,true);
	m_pRtpRtcp->InitReceiver();
	m_pRtpRtcp->InitSender();
	m_pRtpRtcp->RegisterRtcpObservers(0,&m_BwObserver,0);
	m_pRtpRtcp->RegisterSendTransport(&m_Transport);
	m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,kRtpExtensionTransmissionTimeOffsetId);
	m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphSidCmd,kRtpExtensionEphSidCmdId);
	m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphRoomidVer,kRtpExtensionEphRoomidVerId);
	m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphCheckCode,kRtpExtensionEphCheckCodeId);
	m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphSrcKey,kRtpExtensionEphSrcKeyId);
	m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphFrameidOffset,kRtpExtensionEphFrameidOffsetId);
	m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphPacketidTotalsize,kRtpExtensionEphPacketidTotalsizeId);
	m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,kRtpExtensionTransmissionTimeOffsetId);
	m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphSidCmd,kRtpExtensionEphSidCmdId);
	m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphRoomidVer,kRtpExtensionEphRoomidVerId);
	m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphCheckCode,kRtpExtensionEphCheckCodeId);
	m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphSrcKey,kRtpExtensionEphSrcKeyId);
	m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphFrameidOffset,kRtpExtensionEphFrameidOffsetId);
	m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphPacketidTotalsize,kRtpExtensionEphPacketidTotalsizeId);
	m_pRtpRtcp->SetCSRCStatus(false);
	m_pRtpRtcp->SetSendingStatus(false);
	m_pRtpRtcp->SetRTCPStatus(kRtcpCompound);
	m_pRtpRtcp->SetNACKStatus(kNackRtcp);
	m_pRtpRtcp->SetTransmissionSmoothingStatus(true);
	m_pRtpRtcp->SetTargetSendBitrate(600000);//for test
	m_pRtpRtcp->SetStorePacketsStatus(true,CACHE_PACKET_COUNT);
	m_pRtpRtcp->SetSSRC(uUserID);
	m_pRtpRtcp->SetStartTimestamp(0);
	m_pRtpRtcp->SetPeriodicDeadOrAliveStatus (true, OFFLINE_RECONNECT_INTERVAL) ; //開啟斷線檢測,週期(OFFLINE_RECONNECT_INTERVAL)秒
	m_pRtpRtcp->RegisterIncomingRTPCallback (new RtpFeedbackImpl(ADAPTER_TYPE_AUDIO)) ;//斷線處理回撥過程