Change go version to 1.20 for Windows 7 support
This commit is contained in:
@@ -29,7 +29,7 @@ jobs:
|
|||||||
with: { name: go2rtc_win64, path: go2rtc.exe }
|
with: { name: go2rtc_win64, path: go2rtc.exe }
|
||||||
|
|
||||||
- name: Build go2rtc_win32
|
- name: Build go2rtc_win32
|
||||||
env: { GOOS: windows, GOARCH: 386 }
|
env: { GOOS: windows, GOARCH: 386, GOTOOLCHAIN: go1.20.14 }
|
||||||
run: go build -ldflags "-s -w" -trimpath
|
run: go build -ldflags "-s -w" -trimpath
|
||||||
- name: Upload go2rtc_win32
|
- name: Upload go2rtc_win32
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -85,7 +85,7 @@ jobs:
|
|||||||
with: { name: go2rtc_linux_mipsel, path: go2rtc }
|
with: { name: go2rtc_linux_mipsel, path: go2rtc }
|
||||||
|
|
||||||
- name: Build go2rtc_mac_amd64
|
- name: Build go2rtc_mac_amd64
|
||||||
env: { GOOS: darwin, GOARCH: amd64 }
|
env: { GOOS: darwin, GOARCH: amd64, GOTOOLCHAIN: go1.20.14 }
|
||||||
run: go build -ldflags "-s -w" -trimpath
|
run: go build -ldflags "-s -w" -trimpath
|
||||||
- name: Upload go2rtc_mac_amd64
|
- name: Upload go2rtc_mac_amd64
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
|
|||||||
@@ -115,8 +115,8 @@ Ultimate camera streaming application with support RTSP, WebRTC, HomeKit, FFmpeg
|
|||||||
|
|
||||||
Download binary for your OS from [latest release](https://github.com/AlexxIT/go2rtc/releases/):
|
Download binary for your OS from [latest release](https://github.com/AlexxIT/go2rtc/releases/):
|
||||||
|
|
||||||
- `go2rtc_win64.zip` - Windows 64-bit
|
- `go2rtc_win64.zip` - Windows 10+ 64-bit
|
||||||
- `go2rtc_win32.zip` - Windows 32-bit
|
- `go2rtc_win32.zip` - Windows 7+ 32-bit
|
||||||
- `go2rtc_win_arm64.zip` - Windows ARM 64-bit
|
- `go2rtc_win_arm64.zip` - Windows ARM 64-bit
|
||||||
- `go2rtc_linux_amd64` - Linux 64-bit
|
- `go2rtc_linux_amd64` - Linux 64-bit
|
||||||
- `go2rtc_linux_i386` - Linux 32-bit
|
- `go2rtc_linux_i386` - Linux 32-bit
|
||||||
@@ -124,8 +124,8 @@ Download binary for your OS from [latest release](https://github.com/AlexxIT/go2
|
|||||||
- `go2rtc_linux_arm` - Linux ARM 32-bit (ex. Raspberry 32-bit OS)
|
- `go2rtc_linux_arm` - Linux ARM 32-bit (ex. Raspberry 32-bit OS)
|
||||||
- `go2rtc_linux_armv6` - Linux ARMv6 (for old Raspberry 1 and Zero)
|
- `go2rtc_linux_armv6` - Linux ARMv6 (for old Raspberry 1 and Zero)
|
||||||
- `go2rtc_linux_mipsel` - Linux MIPS (ex. [Xiaomi Gateway 3](https://github.com/AlexxIT/XiaomiGateway3), [Wyze cameras](https://github.com/gtxaspec/wz_mini_hacks))
|
- `go2rtc_linux_mipsel` - Linux MIPS (ex. [Xiaomi Gateway 3](https://github.com/AlexxIT/XiaomiGateway3), [Wyze cameras](https://github.com/gtxaspec/wz_mini_hacks))
|
||||||
- `go2rtc_mac_amd64.zip` - Mac Intel 64-bit
|
- `go2rtc_mac_amd64.zip` - macOS 10.13+ Intel 64-bit
|
||||||
- `go2rtc_mac_arm64.zip` - Mac ARM 64-bit
|
- `go2rtc_mac_arm64.zip` - macOS ARM 64-bit
|
||||||
|
|
||||||
Don't forget to fix the rights `chmod +x go2rtc_xxx_xxx` on Linux and Mac.
|
Don't forget to fix the rights `chmod +x go2rtc_xxx_xxx` on Linux and Mac.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
module github.com/AlexxIT/go2rtc
|
module github.com/AlexxIT/go2rtc
|
||||||
|
|
||||||
go 1.22
|
go 1.20
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/asticode/go-astits v1.13.0
|
github.com/asticode/go-astits v1.13.0
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"slices"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -230,7 +229,7 @@ func trimSpace(b []byte) []byte {
|
|||||||
func setRemoteInfo(info core.Info, source string, args []string) {
|
func setRemoteInfo(info core.Info, source string, args []string) {
|
||||||
info.SetSource(source)
|
info.SetSource(source)
|
||||||
|
|
||||||
if i := slices.Index(args, "-i"); i > 0 && i < len(args)-1 {
|
if i := core.Index(args, "-i"); i > 0 && i < len(args)-1 {
|
||||||
rawURL := args[i+1]
|
rawURL := args[i+1]
|
||||||
if u, err := url.Parse(rawURL); err == nil && u.Host != "" {
|
if u, err := url.Parse(rawURL); err == nil && u.Host != "" {
|
||||||
info.SetRemoteAddr(u.Host)
|
info.SetRemoteAddr(u.Host)
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package ffmpeg
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"slices"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/AlexxIT/go2rtc/internal/api"
|
"github.com/AlexxIT/go2rtc/internal/api"
|
||||||
@@ -44,7 +43,7 @@ func Init() {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
args := parseArgs(url[7:])
|
args := parseArgs(url[7:])
|
||||||
if slices.Contains(args.Codecs, "auto") {
|
if core.Contains(args.Codecs, "auto") {
|
||||||
return "", nil // force call streams.HandleFunc("ffmpeg")
|
return "", nil // force call streams.HandleFunc("ffmpeg")
|
||||||
}
|
}
|
||||||
return "exec:" + args.String(), nil
|
return "exec:" + args.String(), nil
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package webrtc
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"slices"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/AlexxIT/go2rtc/internal/api/ws"
|
"github.com/AlexxIT/go2rtc/internal/api/ws"
|
||||||
|
"github.com/AlexxIT/go2rtc/pkg/core"
|
||||||
"github.com/AlexxIT/go2rtc/pkg/webrtc"
|
"github.com/AlexxIT/go2rtc/pkg/webrtc"
|
||||||
pion "github.com/pion/webrtc/v3"
|
pion "github.com/pion/webrtc/v3"
|
||||||
)
|
)
|
||||||
@@ -75,14 +75,14 @@ func FilterCandidate(candidate *pion.ICECandidate) bool {
|
|||||||
|
|
||||||
// host candidate should be in the hosts list
|
// host candidate should be in the hosts list
|
||||||
if candidate.Typ == pion.ICECandidateTypeHost && filters.Candidates != nil {
|
if candidate.Typ == pion.ICECandidateTypeHost && filters.Candidates != nil {
|
||||||
if !slices.Contains(filters.Candidates, candidate.Address) {
|
if !core.Contains(filters.Candidates, candidate.Address) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if filters.Networks != nil {
|
if filters.Networks != nil {
|
||||||
networkType := NetworkType(candidate.Protocol.String(), candidate.Address)
|
networkType := NetworkType(candidate.Protocol.String(), candidate.Address)
|
||||||
if !slices.Contains(filters.Networks, networkType) {
|
if !core.Contains(filters.Networks, networkType) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
// This code copied from go1.21 for backward support in go1.20.
|
||||||
|
// We need to support go1.20 for Windows 7
|
||||||
|
|
||||||
|
// Index returns the index of the first occurrence of v in s,
|
||||||
|
// or -1 if not present.
|
||||||
|
func Index[S ~[]E, E comparable](s S, v E) int {
|
||||||
|
for i := range s {
|
||||||
|
if v == s[i] {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Contains reports whether v is present in s.
|
||||||
|
func Contains[S ~[]E, E comparable](s S, v E) bool {
|
||||||
|
return Index(s, v) >= 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type Ordered interface {
|
||||||
|
~int | ~int8 | ~int16 | ~int32 | ~int64 |
|
||||||
|
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
|
||||||
|
~float32 | ~float64 |
|
||||||
|
~string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Max returns the maximal value in x. It panics if x is empty.
|
||||||
|
// For floating-point E, Max propagates NaNs (any NaN value in x
|
||||||
|
// forces the output to be NaN).
|
||||||
|
func Max[S ~[]E, E Ordered](x S) E {
|
||||||
|
if len(x) < 1 {
|
||||||
|
panic("slices.Max: empty list")
|
||||||
|
}
|
||||||
|
m := x[0]
|
||||||
|
for i := 1; i < len(x); i++ {
|
||||||
|
if x[i] > m {
|
||||||
|
m = x[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ package homekit
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand/v2"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package homekit
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"slices"
|
|
||||||
|
|
||||||
"github.com/AlexxIT/go2rtc/pkg/aac"
|
"github.com/AlexxIT/go2rtc/pkg/aac"
|
||||||
"github.com/AlexxIT/go2rtc/pkg/core"
|
"github.com/AlexxIT/go2rtc/pkg/core"
|
||||||
@@ -22,8 +21,8 @@ func videoToMedia(codecs []camera.VideoCodec) *core.Media {
|
|||||||
for _, codec := range codecs {
|
for _, codec := range codecs {
|
||||||
for _, param := range codec.CodecParams {
|
for _, param := range codec.CodecParams {
|
||||||
// get best profile and level
|
// get best profile and level
|
||||||
profileID := slices.Max(param.ProfileID)
|
profileID := core.Max(param.ProfileID)
|
||||||
level := slices.Max(param.Level)
|
level := core.Max(param.Level)
|
||||||
profile := videoProfiles[profileID] + videoLevels[level]
|
profile := videoProfiles[profileID] + videoLevels[level]
|
||||||
mediaCodec := &core.Codec{
|
mediaCodec := &core.Codec{
|
||||||
Name: videoCodecs[codec.CodecType],
|
Name: videoCodecs[codec.CodecType],
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@ package webrtc
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"slices"
|
|
||||||
|
|
||||||
|
"github.com/AlexxIT/go2rtc/pkg/core"
|
||||||
"github.com/pion/interceptor"
|
"github.com/pion/interceptor"
|
||||||
"github.com/pion/webrtc/v3"
|
"github.com/pion/webrtc/v3"
|
||||||
)
|
)
|
||||||
@@ -47,7 +47,7 @@ func NewServerAPI(network, address string, filters *Filters) (*webrtc.API, error
|
|||||||
if filters != nil && filters.Interfaces != nil {
|
if filters != nil && filters.Interfaces != nil {
|
||||||
s.SetIncludeLoopbackCandidate(true)
|
s.SetIncludeLoopbackCandidate(true)
|
||||||
s.SetInterfaceFilter(func(name string) bool {
|
s.SetInterfaceFilter(func(name string) bool {
|
||||||
return slices.Contains(filters.Interfaces, name)
|
return core.Contains(filters.Interfaces, name)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// disable listen on Hassio docker interfaces
|
// disable listen on Hassio docker interfaces
|
||||||
@@ -59,7 +59,7 @@ func NewServerAPI(network, address string, filters *Filters) (*webrtc.API, error
|
|||||||
if filters != nil && filters.IPs != nil {
|
if filters != nil && filters.IPs != nil {
|
||||||
s.SetIncludeLoopbackCandidate(true)
|
s.SetIncludeLoopbackCandidate(true)
|
||||||
s.SetIPFilter(func(ip net.IP) bool {
|
s.SetIPFilter(func(ip net.IP) bool {
|
||||||
return slices.Contains(filters.IPs, ip.String())
|
return core.Contains(filters.IPs, ip.String())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,11 @@
|
|||||||
|
## Versions
|
||||||
|
|
||||||
|
[Go 1.20](https://go.dev/doc/go1.20) is last version with support Windows 7 and macOS 10.13.
|
||||||
|
Go 1.21 support only Windows 10 and macOS 10.15.
|
||||||
|
|
||||||
|
So we will set `go 1.20` (minimum version) inside `go.mod` file. And will use env `GOTOOLCHAIN=go1.20.14` for building
|
||||||
|
`win32` and `mac_amd64` binaries. All other binaries will use latest go version.
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
- UPX-3.96 pack broken bin for `linux_mipsel`
|
- UPX-3.96 pack broken bin for `linux_mipsel`
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
|
|
||||||
|
@SET GOTOOLCHAIN=
|
||||||
@SET GOOS=windows
|
@SET GOOS=windows
|
||||||
@SET GOARCH=amd64
|
@SET GOARCH=amd64
|
||||||
@SET FILENAME=go2rtc_win64.zip
|
@SET FILENAME=go2rtc_win64.zip
|
||||||
go build -ldflags "-s -w" -trimpath && 7z a -mx9 -sdel %FILENAME% go2rtc.exe
|
go build -ldflags "-s -w" -trimpath && 7z a -mx9 -sdel %FILENAME% go2rtc.exe
|
||||||
|
|
||||||
|
@SET GOTOOLCHAIN=go1.20.14
|
||||||
@SET GOOS=windows
|
@SET GOOS=windows
|
||||||
@SET GOARCH=386
|
@SET GOARCH=386
|
||||||
@SET FILENAME=go2rtc_win32.zip
|
@SET FILENAME=go2rtc_win32.zip
|
||||||
go build -ldflags "-s -w" -trimpath && 7z a -mx9 -sdel %FILENAME% go2rtc.exe
|
go build -ldflags "-s -w" -trimpath && 7z a -mx9 -sdel %FILENAME% go2rtc.exe
|
||||||
|
|
||||||
|
@SET GOTOOLCHAIN=
|
||||||
@SET GOOS=windows
|
@SET GOOS=windows
|
||||||
@SET GOARCH=arm64
|
@SET GOARCH=arm64
|
||||||
@SET FILENAME=go2rtc_win_arm64.zip
|
@SET FILENAME=go2rtc_win_arm64.zip
|
||||||
@@ -47,11 +50,13 @@ go build -ldflags "-s -w" -trimpath -o %FILENAME% && upx %FILENAME%
|
|||||||
@SET FILENAME=go2rtc_linux_mipsel
|
@SET FILENAME=go2rtc_linux_mipsel
|
||||||
go build -ldflags "-s -w" -trimpath -o %FILENAME% && upx %FILENAME%
|
go build -ldflags "-s -w" -trimpath -o %FILENAME% && upx %FILENAME%
|
||||||
|
|
||||||
|
@SET GOTOOLCHAIN=go1.20.14
|
||||||
@SET GOOS=darwin
|
@SET GOOS=darwin
|
||||||
@SET GOARCH=amd64
|
@SET GOARCH=amd64
|
||||||
@SET FILENAME=go2rtc_mac_amd64.zip
|
@SET FILENAME=go2rtc_mac_amd64.zip
|
||||||
go build -ldflags "-s -w" -trimpath && 7z a -mx9 -sdel %FILENAME% go2rtc
|
go build -ldflags "-s -w" -trimpath && 7z a -mx9 -sdel %FILENAME% go2rtc
|
||||||
|
|
||||||
|
@SET GOTOOLCHAIN=
|
||||||
@SET GOOS=darwin
|
@SET GOOS=darwin
|
||||||
@SET GOARCH=arm64
|
@SET GOARCH=arm64
|
||||||
@SET FILENAME=go2rtc_mac_arm64.zip
|
@SET FILENAME=go2rtc_mac_arm64.zip
|
||||||
|
|||||||
Reference in New Issue
Block a user