mirror of
https://github.com/go-gst/go-gst.git
synced 2025-10-05 07:56:51 +08:00
183 lines
5.8 KiB
Go
183 lines
5.8 KiB
Go
package gst
|
|
|
|
// #include "gst.go.h"
|
|
import "C"
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
"unsafe"
|
|
)
|
|
|
|
// Caps is a go wrapper around GstCaps.
|
|
type Caps struct {
|
|
native *C.GstCaps
|
|
}
|
|
|
|
// NewAnyCaps creates a new caps that indicate compatibility with any format.
|
|
func NewAnyCaps() *Caps { return wrapCaps(C.gst_caps_new_any()) }
|
|
|
|
// NewEmptyCaps creates a new empty caps object. This is essentially the opposite of
|
|
// NewAnyCamps.
|
|
func NewEmptyCaps() *Caps { return wrapCaps(C.gst_caps_new_empty()) }
|
|
|
|
// NewEmptySimpleCaps returns a new empty caps object with the given media format.
|
|
func NewEmptySimpleCaps(mediaFormat string) *Caps {
|
|
cFormat := C.CString(mediaFormat)
|
|
defer C.free(unsafe.Pointer(cFormat))
|
|
caps := C.gst_caps_new_empty_simple(cFormat)
|
|
return wrapCaps(caps)
|
|
}
|
|
|
|
// NewFullCaps creates a new caps from the given structures.
|
|
func NewFullCaps(structures ...*Structure) *Caps {
|
|
caps := NewEmptyCaps()
|
|
for _, st := range structures {
|
|
caps.AppendStructure(st)
|
|
}
|
|
return caps
|
|
}
|
|
|
|
// NewSimpleCaps creates new caps with the given media format and key value pairs.
|
|
// The key of each pair must be a string, followed by any field that can be converted
|
|
// to a GType.
|
|
func NewSimpleCaps(mediaFormat string, fieldVals ...interface{}) (*Caps, error) {
|
|
if len(fieldVals)%2 != 0 {
|
|
return nil, errors.New("Received odd number of key/value pairs")
|
|
}
|
|
caps := NewEmptySimpleCaps(mediaFormat)
|
|
strParts := make([]string, 0)
|
|
for i := 0; i < len(fieldVals); i = i + 2 {
|
|
fieldKey, ok := fieldVals[i].(string)
|
|
if !ok {
|
|
return nil, errors.New("One or more field keys are not a valid string")
|
|
}
|
|
strParts = append(strParts, fmt.Sprintf("%s=%v", fieldKey, fieldVals[i+1]))
|
|
}
|
|
structure := NewStructureFromString(strings.Join(strParts, ", "))
|
|
if structure == nil {
|
|
return nil, errors.New("Could not build structure from the provided arguments")
|
|
}
|
|
caps.AppendStructure(structure)
|
|
return caps, nil
|
|
}
|
|
|
|
// NewCapsFromString creates a new Caps object from the given string.
|
|
func NewCapsFromString(capsStr string) *Caps {
|
|
cStr := C.CString(capsStr)
|
|
defer C.free(unsafe.Pointer(cStr))
|
|
caps := C.gst_caps_from_string(cStr)
|
|
if caps == nil {
|
|
return nil
|
|
}
|
|
return wrapCaps(caps)
|
|
}
|
|
|
|
// NewRawCaps returns new GstCaps with the given format, sample-rate, and channels.
|
|
func NewRawCaps(format string, rate, channels int) *Caps {
|
|
capsStr := fmt.Sprintf("audio/x-raw, format=%s, rate=%d, channels=%d", format, rate, channels)
|
|
return NewCapsFromString(capsStr)
|
|
}
|
|
|
|
func (c *Caps) unsafe() unsafe.Pointer { return unsafe.Pointer(c.native) }
|
|
|
|
// Ref increases the ref count on these caps by one.
|
|
func (c *Caps) Ref() { C.gst_caps_ref(c.Instance()) }
|
|
|
|
// Unref decreases the ref count on these caps by one.
|
|
func (c *Caps) Unref() { C.gst_caps_unref(c.Instance()) }
|
|
|
|
// Instance returns the native GstCaps instance
|
|
func (c *Caps) Instance() *C.GstCaps { return C.toGstCaps(c.unsafe()) }
|
|
|
|
// IsAny returns true if these caps match any media format.
|
|
func (c *Caps) IsAny() bool { return gobool(C.gst_caps_is_any(c.Instance())) }
|
|
|
|
// IsEmpty returns true if these caps are empty.
|
|
func (c *Caps) IsEmpty() bool { return gobool(C.gst_caps_is_empty(c.Instance())) }
|
|
|
|
// AppendStructure appends the given structure to this caps instance.
|
|
func (c *Caps) AppendStructure(st *Structure) {
|
|
C.gst_caps_append_structure(c.Instance(), st.Instance())
|
|
}
|
|
|
|
// Append appends the given caps element to these caps. These caps take ownership
|
|
// over the given object. If either caps are ANY, the resulting caps will be ANY.
|
|
func (c *Caps) Append(caps *Caps) {
|
|
C.gst_caps_append(c.Instance(), caps.Instance())
|
|
}
|
|
|
|
// Size returns the number of structures inside this caps instance.
|
|
func (c *Caps) Size() int { return int(C.gst_caps_get_size(c.Instance())) }
|
|
|
|
// GetStructureAt returns the structure at the given index, or nil if none exists.
|
|
func (c *Caps) GetStructureAt(idx int) *Structure {
|
|
st := C.gst_caps_get_structure(c.Instance(), C.guint(idx))
|
|
if st == nil {
|
|
return nil
|
|
}
|
|
return wrapStructure(st)
|
|
}
|
|
|
|
// GetFeaturesAt returns the feature at the given index, or nil if none exists.
|
|
func (c *Caps) GetFeaturesAt(idx int) *CapsFeatures {
|
|
feats := C.gst_caps_get_features(c.Instance(), C.guint(idx))
|
|
if feats == nil {
|
|
return nil
|
|
}
|
|
return wrapCapsFeatures(feats)
|
|
}
|
|
|
|
func wrapCaps(caps *C.GstCaps) *Caps { return &Caps{native: caps} }
|
|
|
|
// CapsFeatures is a go representation of GstCapsFeatures.
|
|
type CapsFeatures struct{ native *C.GstCapsFeatures }
|
|
|
|
// NewCapsFeaturesFromString creates new CapsFeatures from the given string.
|
|
func NewCapsFeaturesFromString(features string) *CapsFeatures {
|
|
cStr := C.CString(features)
|
|
defer C.free(unsafe.Pointer(cStr))
|
|
capsFeatures := C.gst_caps_features_from_string(cStr)
|
|
if capsFeatures == nil {
|
|
return nil
|
|
}
|
|
return wrapCapsFeatures(capsFeatures)
|
|
}
|
|
|
|
// Instance returns the native underlying GstCapsFeatures instance.
|
|
func (c *CapsFeatures) Instance() *C.GstCapsFeatures {
|
|
return C.toGstCapsFeatures(unsafe.Pointer(c.native))
|
|
}
|
|
|
|
// String implements a stringer on caps features.
|
|
func (c *CapsFeatures) String() string {
|
|
return C.GoString(C.gst_caps_features_to_string(c.Instance()))
|
|
}
|
|
|
|
// IsAny returns true if these features match any.
|
|
func (c *CapsFeatures) IsAny() bool { return gobool(C.gst_caps_features_is_any(c.Instance())) }
|
|
|
|
// Equal returns true if the given CapsFeatures are equal to the provided ones.
|
|
// If the provided structure is nil, this function immediately returns false.
|
|
func (c *CapsFeatures) Equal(feats *CapsFeatures) bool {
|
|
if feats == nil {
|
|
return false
|
|
}
|
|
return gobool(C.gst_caps_features_is_equal(c.Instance(), feats.Instance()))
|
|
}
|
|
|
|
// Go casting of pre-baked caps features
|
|
var (
|
|
CapsFeaturesAny = wrapCapsFeatures(C.gst_caps_features_new_any())
|
|
)
|
|
|
|
// Go casting of caps features constants
|
|
const (
|
|
CapsFeatureMemorySystemMemory = C.GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY
|
|
)
|
|
|
|
func wrapCapsFeatures(features *C.GstCapsFeatures) *CapsFeatures {
|
|
return &CapsFeatures{native: features}
|
|
}
|