Major improvements to UnifiedPlayer: 1. GetFrameImage() now works when paused for responsive UI updates 2. Play() method properly starts FFmpeg process 3. Frame display loop runs continuously for smooth video display 4. Disabled audio temporarily to fix video playback fundamentals 5. Simplified FFmpeg command to focus on video stream only Player now: - Generates video frames correctly - Shows video when paused - Has responsive progress tracking - Starts playback properly Next steps: Re-enable audio playback once video is stable
57 lines
2.3 KiB
Go
57 lines
2.3 KiB
Go
// SPDX-License-Identifier: Apache-2.0
|
|
// SPDX-FileCopyrightText: 2022 The Ebitengine Authors
|
|
|
|
//go:build darwin || freebsd || linux || netbsd || windows
|
|
|
|
package purego
|
|
|
|
// CDecl marks a function as being called using the __cdecl calling convention as defined in
|
|
// the [MSDocs] when passed to NewCallback. It must be the first argument to the function.
|
|
// This is only useful on 386 Windows, but it is safe to use on other platforms.
|
|
//
|
|
// [MSDocs]: https://learn.microsoft.com/en-us/cpp/cpp/cdecl?view=msvc-170
|
|
type CDecl struct{}
|
|
|
|
const (
|
|
maxArgs = 15
|
|
numOfFloatRegisters = 8 // arm64 and amd64 both have 8 float registers
|
|
)
|
|
|
|
type syscall15Args struct {
|
|
fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr
|
|
f1, f2, f3, f4, f5, f6, f7, f8 uintptr
|
|
arm64_r8 uintptr
|
|
}
|
|
|
|
// SyscallN takes fn, a C function pointer and a list of arguments as uintptr.
|
|
// There is an internal maximum number of arguments that SyscallN can take. It panics
|
|
// when the maximum is exceeded. It returns the result and the libc error code if there is one.
|
|
//
|
|
// In order to call this function properly make sure to follow all the rules specified in [unsafe.Pointer]
|
|
// especially point 4.
|
|
//
|
|
// NOTE: SyscallN does not properly call functions that have both integer and float parameters.
|
|
// See discussion comment https://github.com/ebiten/purego/pull/1#issuecomment-1128057607
|
|
// for an explanation of why that is.
|
|
//
|
|
// On amd64, if there are more than 8 floats the 9th and so on will be placed incorrectly on the
|
|
// stack.
|
|
//
|
|
// The pragma go:nosplit is not needed at this function declaration because it uses go:uintptrescapes
|
|
// which forces all the objects that the uintptrs point to onto the heap where a stack split won't affect
|
|
// their memory location.
|
|
//
|
|
//go:uintptrescapes
|
|
func SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {
|
|
if fn == 0 {
|
|
panic("purego: fn is nil")
|
|
}
|
|
if len(args) > maxArgs {
|
|
panic("purego: too many arguments to SyscallN")
|
|
}
|
|
// add padding so there is no out-of-bounds slicing
|
|
var tmp [maxArgs]uintptr
|
|
copy(tmp[:], args)
|
|
return syscall_syscall15X(fn, tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], tmp[8], tmp[9], tmp[10], tmp[11], tmp[12], tmp[13], tmp[14])
|
|
}
|