diff --git a/rtpreceiver.go b/rtpreceiver.go index 8f6c06aa..8d558e05 100644 --- a/rtpreceiver.go +++ b/rtpreceiver.go @@ -329,24 +329,33 @@ func (r *RTPReceiver) SetReadDeadline(t time.Time) error { r.mu.RLock() defer r.mu.RUnlock() - for i := range r.tracks { - if err := r.tracks[i].rtcpReadStream.SetReadDeadline(t); err != nil { - return err - } + if err := r.tracks[0].rtcpReadStream.SetReadDeadline(t); err != nil { + return err } return nil } +// SetReadDeadlineSimulcast sets the max amount of time the RTCP stream for a given rid will block before returning. 0 is forever. +func (r *RTPReceiver) SetReadDeadlineSimulcast(deadline time.Time, rid string) error { + r.mu.RLock() + defer r.mu.RUnlock() + + for _, t := range r.tracks { + if t.track != nil && t.track.rid == rid { + return t.rtcpReadStream.SetReadDeadline(deadline) + } + } + return fmt.Errorf("%w: %s", errRTPReceiverForRIDTrackStreamNotFound, rid) +} + // setRTPReadDeadline sets the max amount of time the RTP stream will block before returning. 0 is forever. // This should be fired by calling SetReadDeadline on the TrackRemote -func (r *RTPReceiver) setRTPReadDeadline(t time.Time) error { +func (r *RTPReceiver) setRTPReadDeadline(deadline time.Time, reader *TrackRemote) error { r.mu.RLock() defer r.mu.RUnlock() - for i := range r.tracks { - if err := r.tracks[i].rtpReadStream.SetReadDeadline(t); err != nil { - return err - } + if t := r.streamsForTrack(reader); t != nil { + return t.rtpReadStream.SetReadDeadline(deadline) } - return nil + return fmt.Errorf("%w: %d", errRTPReceiverWithSSRCTrackStreamNotFound, reader.SSRC()) } diff --git a/track_remote.go b/track_remote.go index 6cc72ef6..6733b7cf 100644 --- a/track_remote.go +++ b/track_remote.go @@ -179,5 +179,5 @@ func (t *TrackRemote) peek(b []byte) (n int, a interceptor.Attributes, err error // SetReadDeadline sets the max amount of time the RTP stream will block before returning. 0 is forever. func (t *TrackRemote) SetReadDeadline(deadline time.Time) error { - return t.receiver.setRTPReadDeadline(deadline) + return t.receiver.setRTPReadDeadline(deadline, t) }