mirror of
				https://github.com/pion/webrtc.git
				synced 2025-11-01 03:04:06 +08:00 
			
		
		
		
	Remove PacketWithHeader type
This simplifies the RTCP interface, and saves a bit of code. Relates to #119
This commit is contained in:
		 Woodrow Douglass
					Woodrow Douglass
				
			
				
					committed by
					
						 Max Hawkins
						Max Hawkins
					
				
			
			
				
	
			
			
			 Max Hawkins
						Max Hawkins
					
				
			
						parent
						
							510829772e
						
					
				
				
					commit
					81ceadeb71
				
			| @@ -20,7 +20,7 @@ import ( | |||||||
| // and Rtcp messages incoming from the remote host | // and Rtcp messages incoming from the remote host | ||||||
| type TransportPair struct { | type TransportPair struct { | ||||||
| 	RTP  chan<- *rtp.Packet | 	RTP  chan<- *rtp.Packet | ||||||
| 	RTCP chan<- *rtcp.PacketWithHeader | 	RTCP chan<- rtcp.Packet | ||||||
| } | } | ||||||
|  |  | ||||||
| // Manager contains all network state (DTLS, SRTP) that is shared between ports | // Manager contains all network state (DTLS, SRTP) that is shared between ports | ||||||
| @@ -55,7 +55,7 @@ type Manager struct { | |||||||
|  |  | ||||||
| //AddTransportPair notifies the network manager that an RTCTrack has | //AddTransportPair notifies the network manager that an RTCTrack has | ||||||
| //been created externally, and packets may be incoming with this ssrc | //been created externally, and packets may be incoming with this ssrc | ||||||
| func (m *Manager) AddTransportPair(ssrc uint32, Rtp chan<- *rtp.Packet, Rtcp chan<- *rtcp.PacketWithHeader) { | func (m *Manager) AddTransportPair(ssrc uint32, Rtp chan<- *rtp.Packet, Rtcp chan<- rtcp.Packet) { | ||||||
| 	m.pairsLock.Lock() | 	m.pairsLock.Lock() | ||||||
| 	defer m.pairsLock.Unlock() | 	defer m.pairsLock.Unlock() | ||||||
| 	bufferTransport := m.bufferTransportPairs[ssrc] | 	bufferTransport := m.bufferTransportPairs[ssrc] | ||||||
|   | |||||||
| @@ -44,8 +44,9 @@ func (p *port) handleSRTP(buffer []byte) { | |||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 			{ | 			{ | ||||||
| 				var report rtcp.PacketWithHeader | 				var report rtcp.Packet | ||||||
| 				err = report.Unmarshal(decrypted) | 				var header rtcp.Header | ||||||
|  | 				report, header, err = rtcp.Unmarshal(decrypted) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					fmt.Println(err) | 					fmt.Println(err) | ||||||
| 					return | 					return | ||||||
| @@ -55,33 +56,33 @@ func (p *port) handleSRTP(buffer []byte) { | |||||||
| 					bufferTransport := p.m.getBufferTransports(ssrc) | 					bufferTransport := p.m.getBufferTransports(ssrc) | ||||||
| 					if bufferTransport != nil && bufferTransport.RTCP != nil { | 					if bufferTransport != nil && bufferTransport.RTCP != nil { | ||||||
| 						select { | 						select { | ||||||
| 						case bufferTransport.RTCP <- &report: | 						case bufferTransport.RTCP <- report: | ||||||
| 						default: | 						default: | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				switch report.Header.Type { | 				switch header.Type { | ||||||
| 				case rtcp.TypeSenderReport: | 				case rtcp.TypeSenderReport: | ||||||
| 					for _, ssrc := range report.Packet.(*rtcp.SenderReport).Reports { | 					for _, ssrc := range report.(*rtcp.SenderReport).Reports { | ||||||
| 						f(ssrc.SSRC) | 						f(ssrc.SSRC) | ||||||
| 					} | 					} | ||||||
| 				case rtcp.TypeReceiverReport: | 				case rtcp.TypeReceiverReport: | ||||||
| 					for _, ssrc := range report.Packet.(*rtcp.ReceiverReport).Reports { | 					for _, ssrc := range report.(*rtcp.ReceiverReport).Reports { | ||||||
| 						f(ssrc.SSRC) | 						f(ssrc.SSRC) | ||||||
| 					} | 					} | ||||||
| 				case rtcp.TypeSourceDescription: | 				case rtcp.TypeSourceDescription: | ||||||
| 					for _, ssrc := range report.Packet.(*rtcp.SourceDescription).Chunks { | 					for _, ssrc := range report.(*rtcp.SourceDescription).Chunks { | ||||||
| 						f(ssrc.Source) | 						f(ssrc.Source) | ||||||
| 					} | 					} | ||||||
| 				case rtcp.TypeGoodbye: | 				case rtcp.TypeGoodbye: | ||||||
| 					for _, ssrc := range report.Packet.(*rtcp.Goodbye).Sources { | 					for _, ssrc := range report.(*rtcp.Goodbye).Sources { | ||||||
| 						f(ssrc) | 						f(ssrc) | ||||||
| 					} | 					} | ||||||
| 				case rtcp.TypeTransportSpecificFeedback: | 				case rtcp.TypeTransportSpecificFeedback: | ||||||
| 					f(report.Packet.(*rtcp.RapidResynchronizationRequest).MediaSSRC) | 					f(report.(*rtcp.RapidResynchronizationRequest).MediaSSRC) | ||||||
| 				case rtcp.TypePayloadSpecificFeedback: | 				case rtcp.TypePayloadSpecificFeedback: | ||||||
| 					f(report.Packet.(*rtcp.PictureLossIndication).MediaSSRC) | 					f(report.(*rtcp.PictureLossIndication).MediaSSRC) | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			return | 			return | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								media.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								media.go
									
									
									
									
									
								
							| @@ -15,7 +15,7 @@ type RTCTrack struct { | |||||||
| 	Ssrc        uint32 | 	Ssrc        uint32 | ||||||
| 	Codec       *RTCRtpCodec | 	Codec       *RTCRtpCodec | ||||||
| 	Packets     <-chan *rtp.Packet | 	Packets     <-chan *rtp.Packet | ||||||
| 	RTCPPackets <-chan *rtcp.PacketWithHeader | 	RTCPPackets <-chan rtcp.Packet | ||||||
| 	Samples     chan<- media.RTCSample | 	Samples     chan<- media.RTCSample | ||||||
| 	RawRTP      chan<- *rtp.Packet | 	RawRTP      chan<- *rtp.Packet | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,80 +6,40 @@ type Packet interface { | |||||||
| 	Unmarshal(rawPacket []byte) error | 	Unmarshal(rawPacket []byte) error | ||||||
| } | } | ||||||
|  |  | ||||||
| // PacketWithHeader is a pair to represent an RTCP header and its | // Unmarshal is a factory a polymorphic RTCP packet, and its header, | ||||||
| // packet's polymorphic parsed and unparsed forms. | func Unmarshal(rawPacket []byte) (Packet, Header, error) { | ||||||
| type PacketWithHeader struct { | 	var h Header | ||||||
| 	Header | 	var p Packet | ||||||
| 	Packet |  | ||||||
| 	RawPacket []byte |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //Marshal a PakcetWithHeader to a bytearray | 	err := h.Unmarshal(rawPacket) | ||||||
| func (p PacketWithHeader) Marshal() ([]byte, error) { |  | ||||||
| 	return p.Packet.Marshal() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //Unmarshal a bytearray to a header-packet pair |  | ||||||
| func (p *PacketWithHeader) Unmarshal(rawPacket []byte) error { |  | ||||||
|  |  | ||||||
| 	p.RawPacket = rawPacket |  | ||||||
|  |  | ||||||
| 	if err := p.Header.Unmarshal(rawPacket); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	switch p.Header.Type { |  | ||||||
| 	case TypeSenderReport: |  | ||||||
| 		sr := new(SenderReport) |  | ||||||
| 		err := sr.Unmarshal(rawPacket) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 			return err | 		return nil, h, err | ||||||
| 	} | 	} | ||||||
| 		p.Packet = sr |  | ||||||
|  | 	switch h.Type { | ||||||
|  | 	case TypeSenderReport: | ||||||
|  | 		p = new(SenderReport) | ||||||
|  |  | ||||||
| 	case TypeReceiverReport: | 	case TypeReceiverReport: | ||||||
| 		rr := new(ReceiverReport) | 		p = new(ReceiverReport) | ||||||
| 		err := rr.Unmarshal(rawPacket) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		p.Packet = rr |  | ||||||
|  |  | ||||||
| 	case TypeSourceDescription: | 	case TypeSourceDescription: | ||||||
| 		sdes := new(SourceDescription) | 		p = new(SourceDescription) | ||||||
| 		err := sdes.Unmarshal(rawPacket) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		p.Packet = sdes |  | ||||||
|  |  | ||||||
| 	case TypeGoodbye: | 	case TypeGoodbye: | ||||||
| 		bye := new(Goodbye) | 		p = new(Goodbye) | ||||||
| 		err := bye.Unmarshal(rawPacket) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		p.Packet = bye |  | ||||||
|  |  | ||||||
| 	case TypeTransportSpecificFeedback: | 	case TypeTransportSpecificFeedback: | ||||||
| 		rrr := new(RapidResynchronizationRequest) | 		p = new(RapidResynchronizationRequest) | ||||||
| 		err := rrr.Unmarshal(rawPacket) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		p.Packet = rrr |  | ||||||
|  |  | ||||||
| 	case TypePayloadSpecificFeedback: | 	case TypePayloadSpecificFeedback: | ||||||
| 		psfb := new(PictureLossIndication) | 		p = new(PictureLossIndication) | ||||||
| 		err := psfb.Unmarshal(rawPacket) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		p.Packet = psfb |  | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
| 		return errWrongType | 		return nil, h, errWrongType | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	err = p.Unmarshal(rawPacket) | ||||||
|  | 	return p, h, err | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -79,11 +79,11 @@ func TestUnmarshal(t *testing.T) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("Read rr: %v", err) | 		t.Fatalf("Read rr: %v", err) | ||||||
| 	} | 	} | ||||||
| 	var pwh PacketWithHeader | 	var parsed Packet | ||||||
| 	if err = pwh.Unmarshal(packet); err != nil { | 	if parsed, _, err = Unmarshal(packet); err != nil { | ||||||
| 		t.Errorf("Unmarshal pwh: %v", err) | 		t.Errorf("Unmarshal parsed: %v", err) | ||||||
| 	} | 	} | ||||||
| 	assert.IsType(t, pwh.Packet, (*ReceiverReport)(nil), "Unmarshalled to incorrect type") | 	assert.IsType(t, parsed, (*ReceiverReport)(nil), "Unmarshalled to incorrect type") | ||||||
|  |  | ||||||
| 	wantRR := &ReceiverReport{ | 	wantRR := &ReceiverReport{ | ||||||
| 		SSRC: 0x902f9e2e, | 		SSRC: 0x902f9e2e, | ||||||
| @@ -97,7 +97,7 @@ func TestUnmarshal(t *testing.T) { | |||||||
| 			Delay:              150137, | 			Delay:              150137, | ||||||
| 		}}, | 		}}, | ||||||
| 	} | 	} | ||||||
| 	if got, want := wantRR, pwh.Packet; !reflect.DeepEqual(got, want) { | 	if got, want := wantRR, parsed; !reflect.DeepEqual(got, want) { | ||||||
| 		t.Errorf("Unmarshal rr: got %#v, want %#v", got, want) | 		t.Errorf("Unmarshal rr: got %#v, want %#v", got, want) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -107,10 +107,10 @@ func TestUnmarshal(t *testing.T) { | |||||||
| 		t.Fatalf("Read sdes: %v", err) | 		t.Fatalf("Read sdes: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err = pwh.Unmarshal(packet); err != nil { | 	if parsed, _, err = Unmarshal(packet); err != nil { | ||||||
| 		t.Errorf("Unmarshal pwh: %v", err) | 		t.Errorf("Unmarshal parsed: %v", err) | ||||||
| 	} | 	} | ||||||
| 	assert.IsType(t, pwh.Packet, (*SourceDescription)(nil), "Unmarshalled to incorrect type") | 	assert.IsType(t, parsed, (*SourceDescription)(nil), "Unmarshalled to incorrect type") | ||||||
|  |  | ||||||
| 	wantSdes := &SourceDescription{ | 	wantSdes := &SourceDescription{ | ||||||
| 		Chunks: []SourceDescriptionChunk{ | 		Chunks: []SourceDescriptionChunk{ | ||||||
| @@ -126,7 +126,7 @@ func TestUnmarshal(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if got, want := pwh.Packet, wantSdes; !reflect.DeepEqual(got, want) { | 	if got, want := parsed, wantSdes; !reflect.DeepEqual(got, want) { | ||||||
| 		t.Errorf("Unmarshal sdes: got %#v, want %#v", got, want) | 		t.Errorf("Unmarshal sdes: got %#v, want %#v", got, want) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -136,16 +136,16 @@ func TestUnmarshal(t *testing.T) { | |||||||
| 		t.Fatalf("Read bye: %v", err) | 		t.Fatalf("Read bye: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err = pwh.Unmarshal(packet); err != nil { | 	if parsed, _, err = Unmarshal(packet); err != nil { | ||||||
| 		t.Errorf("Unmarshal pwh: %v", err) | 		t.Errorf("Unmarshal parsed: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	assert.IsType(t, pwh.Packet, (*Goodbye)(nil), "Unmarshalled to incorrect type") | 	assert.IsType(t, parsed, (*Goodbye)(nil), "Unmarshalled to incorrect type") | ||||||
|  |  | ||||||
| 	wantBye := &Goodbye{ | 	wantBye := &Goodbye{ | ||||||
| 		Sources: []uint32{0x902f9e2e}, | 		Sources: []uint32{0x902f9e2e}, | ||||||
| 	} | 	} | ||||||
| 	if got, want := pwh.Packet, wantBye; !reflect.DeepEqual(got, want) { | 	if got, want := parsed, wantBye; !reflect.DeepEqual(got, want) { | ||||||
| 		t.Errorf("Unmarshal bye: got %#v, want %#v", got, want) | 		t.Errorf("Unmarshal bye: got %#v, want %#v", got, want) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -155,17 +155,17 @@ func TestUnmarshal(t *testing.T) { | |||||||
| 		t.Fatalf("Read pli: %v", err) | 		t.Fatalf("Read pli: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err = pwh.Unmarshal(packet); err != nil { | 	if parsed, _, err = Unmarshal(packet); err != nil { | ||||||
| 		t.Errorf("Unmarshal pwh: %v", err) | 		t.Errorf("Unmarshal parsed: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	assert.IsType(t, pwh.Packet, (*PictureLossIndication)(nil), "Unmarshalled to incorrect type") | 	assert.IsType(t, parsed, (*PictureLossIndication)(nil), "Unmarshalled to incorrect type") | ||||||
|  |  | ||||||
| 	wantPli := &PictureLossIndication{ | 	wantPli := &PictureLossIndication{ | ||||||
| 		SenderSSRC: 0x902f9e2e, | 		SenderSSRC: 0x902f9e2e, | ||||||
| 		MediaSSRC:  0x902f9e2e, | 		MediaSSRC:  0x902f9e2e, | ||||||
| 	} | 	} | ||||||
| 	if got, want := pwh.Packet, wantPli; !reflect.DeepEqual(got, want) { | 	if got, want := parsed, wantPli; !reflect.DeepEqual(got, want) { | ||||||
| 		t.Errorf("Unmarshal pli: got %#v, want %#v", got, want) | 		t.Errorf("Unmarshal pli: got %#v, want %#v", got, want) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -175,17 +175,17 @@ func TestUnmarshal(t *testing.T) { | |||||||
| 		t.Fatalf("Read rrr: %v", err) | 		t.Fatalf("Read rrr: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err = pwh.Unmarshal(packet); err != nil { | 	if parsed, _, err = Unmarshal(packet); err != nil { | ||||||
| 		t.Errorf("Unmarshal pwh: %v", err) | 		t.Errorf("Unmarshal parsed: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	assert.IsType(t, pwh.Packet, (*RapidResynchronizationRequest)(nil), "Unmarshalled to incorrect type") | 	assert.IsType(t, parsed, (*RapidResynchronizationRequest)(nil), "Unmarshalled to incorrect type") | ||||||
|  |  | ||||||
| 	wantRrr := &RapidResynchronizationRequest{ | 	wantRrr := &RapidResynchronizationRequest{ | ||||||
| 		SenderSSRC: 0x902f9e2e, | 		SenderSSRC: 0x902f9e2e, | ||||||
| 		MediaSSRC:  0x902f9e2e, | 		MediaSSRC:  0x902f9e2e, | ||||||
| 	} | 	} | ||||||
| 	if got, want := pwh.Packet, wantRrr; !reflect.DeepEqual(got, want) { | 	if got, want := parsed, wantRrr; !reflect.DeepEqual(got, want) { | ||||||
| 		t.Errorf("Unmarshal rrr: got %#v, want %#v", got, want) | 		t.Errorf("Unmarshal rrr: got %#v, want %#v", got, want) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1029,7 +1029,7 @@ func (pc *RTCPeerConnection) generateChannel(ssrc uint32, payloadType uint8) (tp | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	rtpTransport := make(chan *rtp.Packet, 15) | 	rtpTransport := make(chan *rtp.Packet, 15) | ||||||
| 	rtcpTransport := make(chan *rtcp.PacketWithHeader, 15) | 	rtcpTransport := make(chan rtcp.Packet, 15) | ||||||
|  |  | ||||||
| 	track := &RTCTrack{ | 	track := &RTCTrack{ | ||||||
| 		PayloadType: payloadType, | 		PayloadType: payloadType, | ||||||
| @@ -1202,7 +1202,7 @@ func (pc *RTCPeerConnection) newRTCTrack(payloadType uint8, ssrc uint32, id, lab | |||||||
|  |  | ||||||
| 	trackInput := make(chan media.RTCSample, 15) // Is the buffering needed? | 	trackInput := make(chan media.RTCSample, 15) // Is the buffering needed? | ||||||
| 	rawPackets := make(chan *rtp.Packet) | 	rawPackets := make(chan *rtp.Packet) | ||||||
| 	rtcpPackets := make(chan *rtcp.PacketWithHeader) | 	rtcpPackets := make(chan rtcp.Packet) | ||||||
| 	if ssrc == 0 { | 	if ssrc == 0 { | ||||||
| 		buf := make([]byte, 4) | 		buf := make([]byte, 4) | ||||||
| 		_, err = rand.Read(buf) | 		_, err = rand.Read(buf) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user