2023-11-01 18:52:03 CST W44D3

This commit is contained in:
aggresss
2023-11-01 18:52:03 +08:00
parent 2080b3f4d3
commit 1fb9289156
4 changed files with 33 additions and 27 deletions

View File

@@ -180,7 +180,7 @@ func (fltc *AVFilterContext) GetName() string {
// SetName sets `AVFilterContext.name` value.
func (fltc *AVFilterContext) SetName(v string) {
C.free(unsafe.Pointer(fltc.name))
FreePointer(fltc.name)
fltc.name, _ = StringCasting(v)
}
@@ -1032,7 +1032,7 @@ func (fltio *AVFilterInOut) GetName() string {
// SetName sets `AVFilterInOut.name` value.
func (fltio *AVFilterInOut) SetName(v string) {
C.free(unsafe.Pointer(fltio.name))
FreePointer(fltio.name)
fltio.name, _ = StringCasting(v)
}

View File

@@ -1140,7 +1140,7 @@ func (s *AVFormatContext) GetUrl() string {
func (s *AVFormatContext) SetUrl(v string) {
vPtr, _ := StringCasting(v)
if s.url != nil {
C.free(unsafe.Pointer(s.url))
FreePointer(s.url)
}
s.url = (*C.char)(vPtr)
}

View File

@@ -30,7 +30,7 @@ func AvTempfile(prefix string, logOffset int32, logCtx CVoidPointer) (filename s
prefixPtr, prefixFunc := StringCasting(prefix)
defer prefixFunc()
var filenamePtr *C.char
defer C.free(unsafe.Pointer(filenamePtr))
defer FreePointer(filenamePtr)
ret = (int32)(C.av_tempfile((*C.char)(prefixPtr),
(**C.char)(unsafe.Pointer(&filenamePtr)),
(C.int)(logOffset),

View File

@@ -25,6 +25,33 @@ type UnsingedInteger interface {
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}
// CVoidPointer represents a (void*) type pointer in the C world.
type CVoidPointer any
// VoidPointer returns a unsafe.Pointer from CVoidPointer.
func VoidPointer(a CVoidPointer) unsafe.Pointer {
if a == nil {
return nil
}
return unsafe.Pointer(reflect.ValueOf(a).Pointer())
}
// CVoidPointer represents a (void**) type pointer in the C world.
type CVoidPointerPointer any
// VoidPointerPointer returns a *unsafe.Pointer from CVoidPointerPointer.
func VoidPointerPointer(a CVoidPointerPointer) *unsafe.Pointer {
if a == nil {
return nil
}
return (*unsafe.Pointer)(unsafe.Pointer(reflect.ValueOf(a).Pointer()))
}
// FreePointer frees memory allocated in the C world.
func FreePointer(ptr CVoidPointer) {
C.free(VoidPointer(ptr))
}
const NIL = "\\'<nil>'\\"
// StringCasting casts go string to c world char* with free function.
@@ -34,7 +61,7 @@ func StringCasting(s string) (allocPtr *C.char, freeFunc func()) {
return nil, func() {}
}
allocPtr = C.CString(s)
freeFunc = func() { C.free(unsafe.Pointer(allocPtr)) }
freeFunc = func() { FreePointer(allocPtr) }
return allocPtr, freeFunc
}
@@ -96,28 +123,6 @@ func PointerOffset[U any, V Integer](ptr *U, offset V) *U {
uintptr(unsafe.Sizeof(*ptr))*(uintptr(offset))))
}
// CVoidPointer represents a (void*) type pointer in the C world.
type CVoidPointer any
// VoidPointer returns a unsafe.Pointer from CVoidPointer.
func VoidPointer(a CVoidPointer) unsafe.Pointer {
if a == nil {
return nil
}
return unsafe.Pointer(reflect.ValueOf(a).Pointer())
}
// CVoidPointer represents a (void**) type pointer in the C world.
type CVoidPointerPointer any
// VoidPointerPointer returns a *unsafe.Pointer from CVoidPointerPointer.
func VoidPointerPointer(a CVoidPointerPointer) *unsafe.Pointer {
if a == nil {
return nil
}
return (*unsafe.Pointer)(unsafe.Pointer(reflect.ValueOf(a).Pointer()))
}
// CondExpr is Conditional Operator like Ternary Operator in the C world.
func CondExpr[T any](cond bool, x, y T) T {
if cond {
@@ -126,6 +131,7 @@ func CondExpr[T any](cond bool, x, y T) T {
return y
}
// PlusPlus is ++ like operator.
func PlusPlus[T Integer](x *T) T {
defer func() { *x++ }()
return *x