mirror of
				https://github.com/pion/webrtc.git
				synced 2025-10-31 18:52:55 +08:00 
			
		
		
		
	| @@ -159,6 +159,22 @@ func (m *Manager) SendRTP(packet *rtp.Packet) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // SendRTCP finds a connected port and sends the passed RTCP packet | ||||||
|  | func (m *Manager) SendRTCP(pkt []byte) { | ||||||
|  | 	m.portsLock.Lock() | ||||||
|  | 	defer m.portsLock.Unlock() | ||||||
|  |  | ||||||
|  | 	local, remote := m.IceAgent.SelectedPair() | ||||||
|  | 	if local == nil || remote == nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	for _, p := range m.ports { | ||||||
|  | 		if p.listeningAddr.Equal(local) { | ||||||
|  | 			p.sendRTCP(pkt, remote) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // SendDataChannelMessage sends a DataChannel message to a connected peer | // SendDataChannelMessage sends a DataChannel message to a connected peer | ||||||
| func (m *Manager) SendDataChannelMessage(payload datachannel.Payload, streamIdentifier uint16) error { | func (m *Manager) SendDataChannelMessage(payload datachannel.Payload, streamIdentifier uint16) error { | ||||||
| 	var data []byte | 	var data []byte | ||||||
|   | |||||||
| @@ -11,7 +11,8 @@ func (p *port) sendRTP(packet *rtp.Packet, dst net.Addr) { | |||||||
| 	p.m.srtpOutboundContextLock.Lock() | 	p.m.srtpOutboundContextLock.Lock() | ||||||
| 	defer p.m.srtpOutboundContextLock.Unlock() | 	defer p.m.srtpOutboundContextLock.Unlock() | ||||||
| 	if p.m.srtpOutboundContext == nil { | 	if p.m.srtpOutboundContext == nil { | ||||||
| 		fmt.Printf("Tried to send RTP packet but no SRTP Context to handle it \n") | 		// TODO log-level | ||||||
|  | 		// fmt.Printf("Tried to send RTP packet but no SRTP Context to handle it \n") | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -40,3 +41,22 @@ func (p *port) sendSCTP(buf []byte, dst fmt.Stringer) { | |||||||
| 		fmt.Println(err) | 		fmt.Println(err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (p *port) sendRTCP(buf []byte, dst net.Addr) { | ||||||
|  | 	p.m.srtpOutboundContextLock.Lock() | ||||||
|  | 	defer p.m.srtpOutboundContextLock.Unlock() | ||||||
|  | 	if p.m.srtpOutboundContext == nil { | ||||||
|  | 		fmt.Printf("Tried to send RTCP packet but no SRTP Context to handle it \n") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	encrypted, err := p.m.srtpOutboundContext.EncryptRTCP(buf) | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if _, err := p.conn.WriteTo(encrypted, nil, dst); err != nil { | ||||||
|  | 		fmt.Printf("Failed to send packet: %s \n", err.Error()) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
| @@ -9,11 +9,13 @@ type PacketType uint8 | |||||||
|  |  | ||||||
| // RTCP packet types registered with IANA. See: https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-4 | // RTCP packet types registered with IANA. See: https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-4 | ||||||
| const ( | const ( | ||||||
| 	TypeSenderReport       PacketType = 200 // RFC 3550, 6.4.1 | 	TypeSenderReport            PacketType = 200 // RFC 3550, 6.4.1 | ||||||
| 	TypeReceiverReport     PacketType = 201 // RFC 3550, 6.4.2 | 	TypeReceiverReport          PacketType = 201 // RFC 3550, 6.4.2 | ||||||
| 	TypeSourceDescription  PacketType = 202 // RFC 3550, 6.5 | 	TypeSourceDescription       PacketType = 202 // RFC 3550, 6.5 | ||||||
| 	TypeGoodbye            PacketType = 203 // RFC 3550, 6.6 | 	TypeGoodbye                 PacketType = 203 // RFC 3550, 6.6 | ||||||
| 	TypeApplicationDefined PacketType = 204 // RFC 3550, 6.7 (unimplemented) | 	TypeApplicationDefined      PacketType = 204 // RFC 3550, 6.7 (unimplemented) | ||||||
|  | 	TypePayloadSpecificFeedback PacketType = 206 // RFC 4585, 6.3 | ||||||
|  |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func (p PacketType) String() string { | func (p PacketType) String() string { | ||||||
| @@ -28,6 +30,8 @@ func (p PacketType) String() string { | |||||||
| 		return "BYE" | 		return "BYE" | ||||||
| 	case TypeApplicationDefined: | 	case TypeApplicationDefined: | ||||||
| 		return "APP" | 		return "APP" | ||||||
|  | 	case TypePayloadSpecificFeedback: | ||||||
|  | 		return "PSFB" | ||||||
| 	default: | 	default: | ||||||
| 		return string(p) | 		return string(p) | ||||||
| 	} | 	} | ||||||
| @@ -41,7 +45,7 @@ type Header struct { | |||||||
| 	// some additional padding octets at the end which are not part of | 	// some additional padding octets at the end which are not part of | ||||||
| 	// the control information but are included in the length field. | 	// the control information but are included in the length field. | ||||||
| 	Padding bool | 	Padding bool | ||||||
| 	// The number of reception reports or sources contained in this packet (depending on the Type) | 	// The number of reception reports, sources contained or FMT in this packet (depending on the Type) | ||||||
| 	Count uint8 | 	Count uint8 | ||||||
| 	// The RTCP packet type for this packet | 	// The RTCP packet type for this packet | ||||||
| 	Type PacketType | 	Type PacketType | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								pkg/rtcp/packet.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								pkg/rtcp/packet.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | package rtcp | ||||||
|  |  | ||||||
|  | // Packet represents an RTCP packet, a protocol used for out-of-band statistics and control information for an RTP session | ||||||
|  | type Packet interface { | ||||||
|  | 	Marshal() ([]byte, error) | ||||||
|  | 	Unmarshal(rawPacket []byte) error | ||||||
|  | } | ||||||
| @@ -18,6 +18,7 @@ import ( | |||||||
| 	"github.com/pions/webrtc/pkg/ice" | 	"github.com/pions/webrtc/pkg/ice" | ||||||
| 	"github.com/pions/webrtc/pkg/media" | 	"github.com/pions/webrtc/pkg/media" | ||||||
| 	"github.com/pions/webrtc/pkg/rtcerr" | 	"github.com/pions/webrtc/pkg/rtcerr" | ||||||
|  | 	"github.com/pions/webrtc/pkg/rtcp" | ||||||
| 	"github.com/pions/webrtc/pkg/rtp" | 	"github.com/pions/webrtc/pkg/rtp" | ||||||
| 	"github.com/pkg/errors" | 	"github.com/pkg/errors" | ||||||
| ) | ) | ||||||
| @@ -719,6 +720,17 @@ func (pc *RTCPeerConnection) SetIdentityProvider(provider string) error { | |||||||
| 	return errors.Errorf("TODO SetIdentityProvider") | 	return errors.Errorf("TODO SetIdentityProvider") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // SendRTCP sends a user provided RTCP packet to the connected peer | ||||||
|  | // If no peer is connected the packet is discarded | ||||||
|  | func (pc *RTCPeerConnection) SendRTCP(pkt rtcp.Packet) error { | ||||||
|  | 	raw, err := pkt.Marshal() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	pc.networkManager.SendRTCP(raw) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // Close ends the RTCPeerConnection | // Close ends the RTCPeerConnection | ||||||
| func (pc *RTCPeerConnection) Close() error { | func (pc *RTCPeerConnection) Close() error { | ||||||
| 	pc.networkManager.Close() | 	pc.networkManager.Close() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sean DuBois
					Sean DuBois