Files
mediadevices/pkg/driver/screen/screen.go
2023-01-14 09:02:46 +09:00

87 lines
1.7 KiB
Go

// +build !linux
package screen
import (
"fmt"
"image"
"io"
"github.com/kbinani/screenshot"
"github.com/pion/mediadevices/pkg/driver"
"github.com/pion/mediadevices/pkg/frame"
"github.com/pion/mediadevices/pkg/io/video"
"github.com/pion/mediadevices/pkg/prop"
)
type screen struct {
displayIndex int
doneCh chan struct{}
}
func init() {
Initialize()
}
// Initialize finds and registers active displays. This is part of an experimental API.
func Initialize() {
activeDisplays := screenshot.NumActiveDisplays()
for i := 0; i < activeDisplays; i++ {
priority := driver.PriorityNormal
if i == 0 {
priority = driver.PriorityHigh
}
s := newScreen(i)
driver.GetManager().Register(s, driver.Info{
Label: fmt.Sprint(i),
DeviceType: driver.Screen,
Priority: priority,
})
}
}
func newScreen(displayIndex int) *screen {
s := screen{
displayIndex: displayIndex,
}
return &s
}
func (s *screen) Open() error {
s.doneCh = make(chan struct{})
return nil
}
func (s *screen) Close() error {
close(s.doneCh)
return nil
}
func (s *screen) VideoRecord(selectedProp prop.Media) (video.Reader, error) {
r := video.ReaderFunc(func() (img image.Image, release func(), err error) {
select {
case <-s.doneCh:
return nil, nil, io.EOF
default:
}
img, err = screenshot.CaptureDisplay(s.displayIndex)
release = func() {}
return
})
return r, nil
}
func (s *screen) Properties() []prop.Media {
resolution := screenshot.GetDisplayBounds(s.displayIndex)
supportedProp := prop.Media{
Video: prop.Video{
Width: resolution.Dx(),
Height: resolution.Dy(),
FrameFormat: frame.FormatRGBA,
},
}
return []prop.Media{supportedProp}
}