mirror of
https://github.com/thinkonmay/sunshine-sdk.git
synced 2026-08-06 18:40:31 +00:00
linux load dll
This commit is contained in:
parent
ca1098f32b
commit
4fdda48259
1
go.mod
1
go.mod
@ -4,6 +4,7 @@ go 1.22.1
|
||||
|
||||
require (
|
||||
github.com/AlexxIT/go2rtc v1.8.5
|
||||
github.com/ebitengine/purego v0.7.1
|
||||
github.com/pion/rtp v1.8.5
|
||||
github.com/stretchr/testify v1.8.4
|
||||
golang.org/x/sys v0.18.0
|
||||
|
||||
2
go.sum
2
go.sum
@ -3,6 +3,8 @@ github.com/AlexxIT/go2rtc v1.8.5/go.mod h1:hd/3EA5bXFpSQFizPa5NUD+1t9/vI8A4IA6E2
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA=
|
||||
github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
|
||||
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
|
||||
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
||||
github.com/pion/rtp v1.8.5 h1:uYzINfaK+9yWs7r537z/Rc1SvT8ILjBcmDOpJcTB+OU=
|
||||
|
||||
92
parent_linux.go
Normal file
92
parent_linux.go
Normal file
@ -0,0 +1,92 @@
|
||||
package main
|
||||
|
||||
/*
|
||||
#include "smemory.h"
|
||||
#include <string.h>
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"github.com/ebitengine/purego"
|
||||
|
||||
"github.com/thinkonmay/sunshine-sdk/codec"
|
||||
"github.com/thinkonmay/sunshine-sdk/codec/av1"
|
||||
"github.com/thinkonmay/sunshine-sdk/codec/h264"
|
||||
"github.com/thinkonmay/sunshine-sdk/codec/h265"
|
||||
"github.com/thinkonmay/sunshine-sdk/codec/opus"
|
||||
)
|
||||
|
||||
func byteSliceToString(s []byte) string {
|
||||
n := bytes.IndexByte(s, 0)
|
||||
if n >= 0 {
|
||||
s = s[:n]
|
||||
}
|
||||
return string(s)
|
||||
}
|
||||
|
||||
func main() {
|
||||
libc, err := purego.Dlopen("./libparent.so", purego.RTLD_NOW|purego.RTLD_GLOBAL)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
var deinit func()
|
||||
purego.RegisterLibFunc(&deinit, libc, "deinit_shared_memory")
|
||||
defer deinit()
|
||||
|
||||
buffer := make([]byte, 128)
|
||||
var allocate func(unsafe.Pointer) unsafe.Pointer
|
||||
purego.RegisterLibFunc(&allocate, libc, "allocate_shared_memory")
|
||||
pointer := allocate(unsafe.Pointer(&buffer[0]))
|
||||
|
||||
memory := (*C.SharedMemory)(unsafe.Pointer(pointer))
|
||||
|
||||
payloaders := map[C.int]func() codec.Payloader{
|
||||
0: func() codec.Payloader { return &h264.Payloader{} },
|
||||
1: func() codec.Payloader { return &h265.Payloader{} },
|
||||
2: func() codec.Payloader { return &av1.Payloader{} },
|
||||
3: func() codec.Payloader { return &opus.Payloader{} },
|
||||
}
|
||||
|
||||
indexes := make([]*int, C.QueueMax)
|
||||
for i, _ := range indexes {
|
||||
j := int(memory.queues[i].index)
|
||||
indexes[i] = &j
|
||||
}
|
||||
|
||||
for queue_type, i := range indexes {
|
||||
go func(queue *C.Queue, index *int) {
|
||||
buffer := make([]byte, int(C.PACKET_SIZE))
|
||||
payloader := payloaders[queue.metadata.codec]()
|
||||
|
||||
for {
|
||||
for int(queue.index) > *index {
|
||||
new_index := *index + 1
|
||||
real_index := new_index % C.QUEUE_SIZE
|
||||
block := queue.array[real_index]
|
||||
|
||||
C.memcpy(unsafe.Pointer(&buffer[0]), unsafe.Pointer(&block.data[0]), C.ulong(block.size))
|
||||
payloads := payloader.Payload(1200, buffer[:block.size])
|
||||
fmt.Printf("Queue type %d, downstream index %d, upstream index %d, receive size %d\n", queue_type, new_index, queue.index, len(payloads))
|
||||
|
||||
*index = new_index
|
||||
}
|
||||
|
||||
time.Sleep(time.Microsecond * 100)
|
||||
}
|
||||
}(&memory.queues[queue_type], i)
|
||||
}
|
||||
|
||||
fmt.Printf("execute sunshine with command : sudo setcap cap_sys_admin+p $(readlink -f sunshine) && ./sunshine %s 0\n", byteSliceToString(buffer))
|
||||
chann := make(chan os.Signal, 16)
|
||||
signal.Notify(chann, syscall.SIGTERM, os.Interrupt)
|
||||
<-chann
|
||||
fmt.Println("Stopped.")
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user