Files
screen-sharing-rdp/webrtc/internal/rtc/connectionsvc.go
2020-11-05 23:24:19 +08:00

63 lines
1.5 KiB
Go

package rtc
import (
"fmt"
"github.com/imtiyazs/webrtc-remote-desktop/internal/encoders"
"github.com/imtiyazs/webrtc-remote-desktop/internal/rdisplay"
)
// RemoteScreenService is our implementation of the rtc.Service
type RemoteScreenService struct {
stunServer string
videoService rdisplay.Service
encodingService encoders.Service
}
// NewRemoteScreenService creates a new instances of RemoteScreenService
func NewRemoteScreenService(stun string, video rdisplay.Service, enc encoders.Service) Service {
return &RemoteScreenService{
stunServer: stun,
videoService: video,
encodingService: enc,
}
}
func hasElement(haystack []string, needle string) bool {
for _, item := range haystack {
if item == needle {
return true
}
}
return false
}
// CreateRemoteScreenConnection creates and configures a new peer connection
// that will stream the selected screen
func (svc *RemoteScreenService) CreateRemoteScreenConnection(screenIx int, fps int) (RemoteScreenConnection, error) {
screens, err := svc.videoService.Screens()
if err != nil {
return nil, err
}
if screenIx < 0 || screenIx > len(screens) {
screenIx = 0
}
screen := screens[screenIx]
screenGrabber, err := svc.videoService.CreateScreenGrabber(screen, fps)
if err != nil {
return nil, err
}
if err != nil {
return nil, err
}
if len(screens) == 0 {
return nil, fmt.Errorf("No available screens")
}
rtcPeer := newRemoteScreenPeerConn(svc.stunServer, screenGrabber, svc.encodingService)
return rtcPeer, nil
}