mirror of
https://github.com/go-gst/go-gst.git
synced 2025-09-26 20:11:18 +08:00
244 lines
7.2 KiB
Go
244 lines
7.2 KiB
Go
package gst
|
|
|
|
/*
|
|
#include "gst.go.h"
|
|
|
|
extern gboolean goPluginInit (GstPlugin * plugin, gpointer user_data);
|
|
extern gboolean goGlobalPluginInit (GstPlugin * plugin);
|
|
|
|
gboolean cgoPluginInit (GstPlugin * plugin, gpointer user_data)
|
|
{
|
|
return goPluginInit(plugin, user_data);
|
|
}
|
|
|
|
gboolean cgoGlobalPluginInit(GstPlugin * plugin)
|
|
{
|
|
return goGlobalPluginInit(plugin);
|
|
}
|
|
|
|
GstPluginDesc * getPluginMeta (gint major,
|
|
gint minor,
|
|
gchar * name,
|
|
gchar * description,
|
|
GstPluginInitFunc init,
|
|
gchar * version,
|
|
gchar * license,
|
|
gchar * source,
|
|
gchar * package,
|
|
gchar * origin,
|
|
gchar * release_datetime)
|
|
{
|
|
|
|
GstPluginDesc * desc = malloc ( sizeof (GstPluginDesc) );
|
|
|
|
desc->major_version = major;
|
|
desc->minor_version = minor;
|
|
desc->name = name;
|
|
desc->description = description;
|
|
desc->plugin_init = init;
|
|
desc->version = version;
|
|
desc->license = license;
|
|
desc->source = source;
|
|
desc->package = package;
|
|
desc->origin = origin;
|
|
desc->release_datetime = release_datetime;
|
|
|
|
return desc;
|
|
}
|
|
|
|
*/
|
|
import "C"
|
|
|
|
import (
|
|
"errors"
|
|
"unsafe"
|
|
|
|
"github.com/go-gst/go-glib/glib"
|
|
gopointer "github.com/mattn/go-pointer"
|
|
)
|
|
|
|
// PluginMetadata represents the information to include when registering a new plugin
|
|
// with gstreamer.
|
|
type PluginMetadata struct {
|
|
// The major version number of the GStreamer core that the plugin was compiled for, you can just use VersionMajor here
|
|
MajorVersion Version
|
|
// The minor version number of the GStreamer core that the plugin was compiled for, you can just use VersionMinor here
|
|
MinorVersion Version
|
|
// A unique name of the plugin (ideally prefixed with an application- or library-specific namespace prefix in order to
|
|
// avoid name conflicts in case a similar plugin with the same name ever gets added to GStreamer)
|
|
Name string
|
|
// A description of the plugin
|
|
Description string
|
|
// The function to call when initiliazing the plugin
|
|
Init PluginInitFunc
|
|
// The version of the plugin
|
|
Version string
|
|
// The license for the plugin, must match one of the license constants in this package
|
|
License License
|
|
// The source module the plugin belongs to
|
|
Source string
|
|
// The shipped package the plugin belongs to
|
|
Package string
|
|
// The URL to the provider of the plugin
|
|
Origin string
|
|
// The date of release in ISO 8601 format.
|
|
// See https://gstreamer.freedesktop.org/documentation/gstreamer/gstplugin.html?gi-language=c#GstPluginDesc for more details.
|
|
ReleaseDate string
|
|
}
|
|
|
|
var globalPluginInit PluginInitFunc
|
|
|
|
// Export will export the PluginMetadata to an unsafe pointer to a GstPluginDesc.
|
|
func (p *PluginMetadata) Export() unsafe.Pointer {
|
|
globalPluginInit = p.Init
|
|
desc := C.getPluginMeta(
|
|
C.gint(p.MajorVersion),
|
|
C.gint(p.MinorVersion),
|
|
(*C.gchar)(unsafe.Pointer(&[]byte(p.Name)[0])),
|
|
(*C.gchar)(C.CString(p.Description)),
|
|
(C.GstPluginInitFunc(C.cgoGlobalPluginInit)),
|
|
(*C.gchar)(C.CString(p.Version)),
|
|
(*C.gchar)(C.CString(string(p.License))),
|
|
(*C.gchar)(C.CString(p.Source)),
|
|
(*C.gchar)(C.CString(p.Package)),
|
|
(*C.gchar)(C.CString(p.Origin)),
|
|
(*C.gchar)(C.CString(p.ReleaseDate)),
|
|
)
|
|
return unsafe.Pointer(desc)
|
|
}
|
|
|
|
// PluginInitFunc is a function called by the plugin loader at startup. This function should register
|
|
// all the features of the plugin. The function should return true if the plugin is initialized successfully.
|
|
type PluginInitFunc func(*Plugin) bool
|
|
|
|
// Plugin is a go representation of a GstPlugin.
|
|
type Plugin struct{ *Object }
|
|
|
|
// FromGstPluginUnsafeNone wraps the given pointer in a Plugin.
|
|
func FromGstPluginUnsafeNone(plugin unsafe.Pointer) *Plugin {
|
|
return &Plugin{wrapObject(glib.TransferNone(plugin))}
|
|
}
|
|
|
|
// FromGstPluginUnsafeFull wraps the given pointer in a Plugin.
|
|
func FromGstPluginUnsafeFull(plugin unsafe.Pointer) *Plugin {
|
|
return &Plugin{wrapObject(glib.TransferFull(plugin))}
|
|
}
|
|
|
|
// RegisterPlugin will register a static plugin, i.e. a plugin which is private to an application
|
|
// or library and contained within the application or library (as opposed to being shipped as a
|
|
// separate module file).
|
|
func RegisterPlugin(desc *PluginMetadata, initFunc PluginInitFunc) bool {
|
|
cName := C.CString(desc.Name)
|
|
cDesc := C.CString(desc.Description)
|
|
cVers := C.CString(desc.Version)
|
|
cLics := C.CString(string(desc.License))
|
|
cSrc := C.CString(desc.Source)
|
|
cPkg := C.CString(desc.Package)
|
|
cOrg := C.CString(desc.Origin)
|
|
defer func() {
|
|
for _, ptr := range []*C.char{cName, cDesc, cVers, cLics, cSrc, cPkg, cOrg} {
|
|
C.free(unsafe.Pointer(ptr))
|
|
}
|
|
}()
|
|
fPtr := gopointer.Save(initFunc)
|
|
return gobool(C.gst_plugin_register_static_full(
|
|
C.gint(desc.MajorVersion), C.gint(desc.MinorVersion),
|
|
(*C.gchar)(cName), (*C.gchar)(cDesc),
|
|
C.GstPluginInitFullFunc(C.cgoPluginInit),
|
|
(*C.gchar)(cVers), (*C.gchar)(cLics),
|
|
(*C.gchar)(cSrc), (*C.gchar)(cPkg),
|
|
(*C.gchar)(cOrg), (C.gpointer)(unsafe.Pointer(fPtr)),
|
|
))
|
|
}
|
|
|
|
// LoadPluginByName loads the named plugin and places a ref count on it. The function
|
|
// returns nil if the plugin could not be loaded.
|
|
func LoadPluginByName(name string) *Plugin {
|
|
cstr := C.CString(name)
|
|
defer C.free(unsafe.Pointer(cstr))
|
|
plugin := C.gst_plugin_load_by_name((*C.gchar)(unsafe.Pointer(cstr)))
|
|
if plugin == nil {
|
|
return nil
|
|
}
|
|
return FromGstPluginUnsafeFull(unsafe.Pointer(plugin))
|
|
}
|
|
|
|
// LoadPluginFile loads the given plugin and refs it. If an error is returned Plugin will be nil.
|
|
func LoadPluginFile(fpath string) (*Plugin, error) {
|
|
cstr := C.CString(fpath)
|
|
defer C.free(unsafe.Pointer(cstr))
|
|
var gerr *C.GError
|
|
plugin := C.gst_plugin_load_file((*C.gchar)(unsafe.Pointer(cstr)), (**C.GError)(&gerr))
|
|
if gerr != nil {
|
|
defer C.g_free((C.gpointer)(gerr))
|
|
return nil, errors.New(C.GoString(gerr.message))
|
|
}
|
|
return FromGstPluginUnsafeFull(unsafe.Pointer(plugin)), nil
|
|
}
|
|
|
|
// Instance returns the underlying GstPlugin instance.
|
|
func (p *Plugin) Instance() *C.GstPlugin { return C.toGstPlugin(p.Unsafe()) }
|
|
|
|
// Description returns the description for this plugin.
|
|
func (p *Plugin) Description() string {
|
|
ret := C.gst_plugin_get_description((*C.GstPlugin)(p.Instance()))
|
|
if ret == nil {
|
|
return ""
|
|
}
|
|
return C.GoString(ret)
|
|
}
|
|
|
|
// Filename returns the filename for this plugin.
|
|
func (p *Plugin) Filename() string {
|
|
ret := C.gst_plugin_get_filename((*C.GstPlugin)(p.Instance()))
|
|
if ret == nil {
|
|
return ""
|
|
}
|
|
return C.GoString(ret)
|
|
}
|
|
|
|
// Version returns the version for this plugin.
|
|
func (p *Plugin) Version() string {
|
|
ret := C.gst_plugin_get_version((*C.GstPlugin)(p.Instance()))
|
|
if ret == nil {
|
|
return ""
|
|
}
|
|
return C.GoString(ret)
|
|
}
|
|
|
|
// License returns the license for this plugin.
|
|
func (p *Plugin) License() License {
|
|
ret := C.gst_plugin_get_license((*C.GstPlugin)(p.Instance()))
|
|
if ret == nil {
|
|
return ""
|
|
}
|
|
return License(C.GoString(ret))
|
|
}
|
|
|
|
// Source returns the source module for this plugin.
|
|
func (p *Plugin) Source() string {
|
|
ret := C.gst_plugin_get_source((*C.GstPlugin)(p.Instance()))
|
|
if ret == nil {
|
|
return ""
|
|
}
|
|
return C.GoString(ret)
|
|
}
|
|
|
|
// Package returns the binary package for this plugin.
|
|
func (p *Plugin) Package() string {
|
|
ret := C.gst_plugin_get_package((*C.GstPlugin)(p.Instance()))
|
|
if ret == nil {
|
|
return ""
|
|
}
|
|
return C.GoString(ret)
|
|
}
|
|
|
|
// Origin returns the origin URL for this plugin.
|
|
func (p *Plugin) Origin() string {
|
|
ret := C.gst_plugin_get_origin((*C.GstPlugin)(p.Instance()))
|
|
if ret == nil {
|
|
return ""
|
|
}
|
|
return C.GoString(ret)
|
|
}
|