Added FreeBSD Binaries (#2)
Co-authored-by: Rob van Oostenrijk <robvanoostenrijk@noreply.users.github.com>
This commit is contained in:
committed by
GitHub
parent
b844722af1
commit
93dad05bde
@@ -112,7 +112,6 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with: { name: go2rtc_freebsd_arm64, path: go2rtc }
|
with: { name: go2rtc_freebsd_arm64, path: go2rtc }
|
||||||
|
|
||||||
|
|
||||||
docker-master:
|
docker-master:
|
||||||
name: Build docker master
|
name: Build docker master
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package device
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"os/exec"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/AlexxIT/go2rtc/internal/api"
|
||||||
|
"github.com/AlexxIT/go2rtc/pkg/core"
|
||||||
|
)
|
||||||
|
|
||||||
|
func queryToInput(query url.Values) string {
|
||||||
|
video := query.Get("video")
|
||||||
|
audio := query.Get("audio")
|
||||||
|
|
||||||
|
if video == "" && audio == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://ffmpeg.org/ffmpeg-devices.html#avfoundation
|
||||||
|
input := "-f avfoundation"
|
||||||
|
|
||||||
|
if video != "" {
|
||||||
|
video = indexToItem(videos, video)
|
||||||
|
|
||||||
|
for key, value := range query {
|
||||||
|
switch key {
|
||||||
|
case "resolution":
|
||||||
|
input += " -video_size " + value[0]
|
||||||
|
case "pixel_format", "framerate", "video_size", "capture_cursor", "capture_mouse_clicks", "capture_raw_data":
|
||||||
|
input += " -" + key + " " + value[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if audio != "" {
|
||||||
|
audio = indexToItem(audios, audio)
|
||||||
|
}
|
||||||
|
|
||||||
|
return input + ` -i "` + video + `:` + audio + `"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func initDevices() {
|
||||||
|
// [AVFoundation indev @ 0x147f04510] AVFoundation video devices:
|
||||||
|
// [AVFoundation indev @ 0x147f04510] [0] FaceTime HD Camera
|
||||||
|
// [AVFoundation indev @ 0x147f04510] [1] Capture screen 0
|
||||||
|
// [AVFoundation indev @ 0x147f04510] AVFoundation audio devices:
|
||||||
|
// [AVFoundation indev @ 0x147f04510] [0] MacBook Pro Microphone
|
||||||
|
cmd := exec.Command(
|
||||||
|
Bin, "-hide_banner", "-list_devices", "true", "-f", "avfoundation", "-i", "",
|
||||||
|
)
|
||||||
|
b, _ := cmd.CombinedOutput()
|
||||||
|
|
||||||
|
re := regexp.MustCompile(`\[\d+] (.+)`)
|
||||||
|
|
||||||
|
var kind string
|
||||||
|
for _, line := range strings.Split(string(b), "\n") {
|
||||||
|
switch {
|
||||||
|
case strings.HasSuffix(line, "video devices:"):
|
||||||
|
kind = core.KindVideo
|
||||||
|
continue
|
||||||
|
case strings.HasSuffix(line, "audio devices:"):
|
||||||
|
kind = core.KindAudio
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
m := re.FindStringSubmatch(line)
|
||||||
|
if m == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
name := m[1]
|
||||||
|
|
||||||
|
switch kind {
|
||||||
|
case core.KindVideo:
|
||||||
|
videos = append(videos, name)
|
||||||
|
case core.KindAudio:
|
||||||
|
audios = append(audios, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
streams = append(streams, &api.Source{
|
||||||
|
Name: name, URL: "ffmpeg:device?" + kind + "=" + name,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package hardware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/AlexxIT/go2rtc/internal/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
const ProbeVideoToolboxH264 = "-f lavfi -i testsrc2=size=svga -t 1 -c h264_videotoolbox -f null -"
|
||||||
|
const ProbeVideoToolboxH265 = "-f lavfi -i testsrc2=size=svga -t 1 -c hevc_videotoolbox -f null -"
|
||||||
|
|
||||||
|
func ProbeAll(bin string) []*api.Source {
|
||||||
|
return []*api.Source{
|
||||||
|
{
|
||||||
|
Name: runToString(bin, ProbeVideoToolboxH264),
|
||||||
|
URL: "ffmpeg:...#video=h264#hardware=" + EngineVideoToolbox,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: runToString(bin, ProbeVideoToolboxH265),
|
||||||
|
URL: "ffmpeg:...#video=h265#hardware=" + EngineVideoToolbox,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProbeHardware(bin, name string) string {
|
||||||
|
switch name {
|
||||||
|
case "h264":
|
||||||
|
if run(bin, ProbeVideoToolboxH264) {
|
||||||
|
return EngineVideoToolbox
|
||||||
|
}
|
||||||
|
|
||||||
|
case "h265":
|
||||||
|
if run(bin, ProbeVideoToolboxH265) {
|
||||||
|
return EngineVideoToolbox
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return EngineSoftware
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package mdns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetsockoptInt(fd uintptr, level, opt int, value int) (err error) {
|
||||||
|
// change SO_REUSEADDR and REUSEPORT flags simultaneously for BSD-like OS
|
||||||
|
// https://github.com/AlexxIT/go2rtc/issues/626
|
||||||
|
// https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ/14388707
|
||||||
|
if opt == syscall.SO_REUSEADDR {
|
||||||
|
if err = syscall.SetsockoptInt(int(fd), level, opt, value); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
opt = syscall.SO_REUSEPORT
|
||||||
|
}
|
||||||
|
|
||||||
|
return syscall.SetsockoptInt(int(fd), level, opt, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetsockoptIPMreq(fd uintptr, level, opt int, mreq *syscall.IPMreq) (err error) {
|
||||||
|
return syscall.SetsockoptIPMreq(int(fd), level, opt, mreq)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user