mirror of
https://github.com/pion/mediadevices.git
synced 2025-09-27 04:46:10 +08:00
87 lines
1.7 KiB
Go
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}
|
|
}
|