106 lines
1.5 KiB
Go
106 lines
1.5 KiB
Go
package common
|
|
|
|
import "sync"
|
|
|
|
type Screen struct {
|
|
Width uint16
|
|
Height uint16
|
|
FPS int
|
|
Quality uint16
|
|
BitRate uint16
|
|
GOP uint8
|
|
}
|
|
|
|
var (
|
|
screen *Screen
|
|
screenOnce sync.Once
|
|
)
|
|
|
|
// ResolutionMap height to width
|
|
var ResolutionMap = map[uint16]uint16{
|
|
1080: 1920,
|
|
720: 1280,
|
|
600: 800,
|
|
480: 640,
|
|
0: 0,
|
|
}
|
|
|
|
var QualityMap = map[uint16]bool{
|
|
100: true,
|
|
80: true,
|
|
60: true,
|
|
50: true,
|
|
}
|
|
|
|
var BitRateMap = map[uint16]bool{
|
|
5000: true,
|
|
3000: true,
|
|
2000: true,
|
|
1000: true,
|
|
}
|
|
|
|
func GetScreen() *Screen {
|
|
screenOnce.Do(func() {
|
|
screen = &Screen{
|
|
Width: 0,
|
|
Height: 0,
|
|
Quality: 80,
|
|
FPS: 30,
|
|
BitRate: 3000,
|
|
GOP: 30,
|
|
}
|
|
})
|
|
|
|
return screen
|
|
}
|
|
|
|
func SetScreen(key string, value int) {
|
|
switch key {
|
|
case "resolution":
|
|
height := uint16(value)
|
|
if width, ok := ResolutionMap[height]; ok {
|
|
screen.Width = width
|
|
screen.Height = height
|
|
}
|
|
|
|
case "quality":
|
|
if value > 100 {
|
|
screen.BitRate = uint16(value)
|
|
} else {
|
|
screen.Quality = uint16(value)
|
|
}
|
|
|
|
case "fps":
|
|
screen.FPS = validateFPS(value)
|
|
|
|
case "gop":
|
|
screen.GOP = uint8(value)
|
|
}
|
|
}
|
|
|
|
func CheckScreen() {
|
|
if _, ok := ResolutionMap[screen.Height]; !ok {
|
|
screen.Width = 1920
|
|
screen.Height = 1080
|
|
}
|
|
|
|
if _, ok := QualityMap[screen.Quality]; !ok {
|
|
screen.Quality = 80
|
|
}
|
|
|
|
if _, ok := BitRateMap[screen.BitRate]; !ok {
|
|
screen.BitRate = 3000
|
|
}
|
|
}
|
|
|
|
func validateFPS(fps int) int {
|
|
if fps > 60 {
|
|
return 60
|
|
}
|
|
if fps < 10 {
|
|
return 10
|
|
}
|
|
|
|
return fps
|
|
}
|