mirror of
https://github.com/go-gst/go-gst.git
synced 2025-10-05 07:56:51 +08:00
197 lines
8.2 KiB
Go
197 lines
8.2 KiB
Go
package gst
|
|
|
|
/*
|
|
#include "gst.go.h"
|
|
|
|
extern GstStateChangeReturn goGstElementClassChangeState (GstElement * element, GstStateChange change);
|
|
extern GstStateChangeReturn goGstElementClassGetState (GstElement * element, GstState * state, GstState * pending, GstClockTime timeout);
|
|
extern void goGstElementClassNoMorePads (GstElement * element);
|
|
extern void goGstElementClassPadAdded (GstElement * element, GstPad * pad);
|
|
extern void goGstElementClassPadRemoved (GstElement * element, GstPad * pad);
|
|
extern gboolean goGstElementClassPostMessage (GstElement * element, GstMessage * msg);
|
|
extern GstClock * goGstElementClassProvideClock (GstElement * element);
|
|
extern gboolean goGstElementClassQuery (GstElement * element, GstQuery * query);
|
|
extern void goGstElementClassReleasePad (GstElement * element, GstPad * pad);
|
|
extern GstPad * goGstElementClassRequestNewPad (GstElement * element, GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
|
|
extern gboolean goGstElementClassSendEvent (GstElement * element, GstEvent * event);
|
|
extern void goGstElementClassSetBus (GstElement * element, GstBus * bus);
|
|
extern gboolean goGstElementClassSetClock (GstElement * element, GstClock * clock);
|
|
extern void goGstElementClassSetContext (GstElement * element, GstContext * ctx);
|
|
extern GstStateChangeReturn goGstElementClassSetState (GstElement * element, GstState state);
|
|
extern void goGstElementClassStateChanged (GstElement * element, GstState old, GstState new, GstState pending);
|
|
|
|
void setGstElementClassChangeState (GstElementClass * klass) { klass->change_state = goGstElementClassChangeState; }
|
|
void setGstElementClassGetState (GstElementClass * klass) { klass->get_state = goGstElementClassGetState; }
|
|
void setGstElementClassNoMorePads (GstElementClass * klass) { klass->no_more_pads = goGstElementClassNoMorePads; }
|
|
void setGstElementClassPadAdded (GstElementClass * klass) { klass->pad_added = goGstElementClassPadAdded; }
|
|
void setGstElementClassPadRemoved (GstElementClass * klass) { klass->pad_removed = goGstElementClassPadRemoved; }
|
|
void setGstElementClassPostMessage (GstElementClass * klass) { klass->post_message = goGstElementClassPostMessage; }
|
|
void setGstElementClassProvideClock (GstElementClass * klass) { klass->provide_clock = goGstElementClassProvideClock; }
|
|
void setGstElementClassQuery (GstElementClass * klass) { klass->query = goGstElementClassQuery; }
|
|
void setGstElementClassReleasePad (GstElementClass * klass) { klass->release_pad = goGstElementClassReleasePad; }
|
|
void setGstElementClassRequestNewPad (GstElementClass * klass) { klass->request_new_pad = goGstElementClassRequestNewPad; }
|
|
void setGstElementClassSendEvent (GstElementClass * klass) { klass->send_event = goGstElementClassSendEvent; }
|
|
void setGstElementClassSetBus (GstElementClass * klass) { klass->set_bus = goGstElementClassSetBus; }
|
|
void setGstElementClassSetClock (GstElementClass * klass) { klass->set_clock = goGstElementClassSetClock; }
|
|
void setGstElementClassSetContext (GstElementClass * klass) { klass->set_context = goGstElementClassSetContext; }
|
|
void setGstElementClassSetState (GstElementClass * klass) { klass->set_state = goGstElementClassSetState; }
|
|
void setGstElementClassStateChanged (GstElementClass * klass) { klass->state_changed = goGstElementClassStateChanged; }
|
|
|
|
*/
|
|
import "C"
|
|
import (
|
|
"time"
|
|
"unsafe"
|
|
|
|
"github.com/tinyzimmer/go-glib/glib"
|
|
)
|
|
|
|
// ExtendsElement implements an Extendable object based on a GstElement.
|
|
var ExtendsElement glib.Extendable = &extendElement{parent: glib.ExtendsObject}
|
|
|
|
// ElementImpl is an interface containing go equivalents of the virtual methods that can be
|
|
// overridden by a plugin extending an Element.
|
|
type ElementImpl interface {
|
|
// ChangeState is called by SetState to perform an incremental state change.
|
|
ChangeState(*Element, StateChange) StateChangeReturn
|
|
// GetState should return the states of the element
|
|
GetState(self *Element, timeout time.Duration) (ret StateChangeReturn, current, pending State)
|
|
// NoMorePads is called when there are no more pads on the element.
|
|
NoMorePads(*Element)
|
|
// PadAdded is called to add a pad to the element.
|
|
PadAdded(*Element, *Pad)
|
|
// PadRemoved is called to remove a pad from the element.
|
|
PadRemoved(*Element, *Pad)
|
|
// PostMessage is called when a message is posted to the element. Call Element.ParentPostMessage
|
|
// to have it posted on the bus after processing.
|
|
PostMessage(*Element, *Message) bool
|
|
// ProvideClock is called to retrieve the clock provided by the element.
|
|
ProvideClock(*Element) *Clock
|
|
// Query is called to perform a query on the element.
|
|
Query(*Element, *Query) bool
|
|
// ReleasePad is called when a request pad is to be released.
|
|
ReleasePad(*Element, *Pad)
|
|
// RequestNewPad is called when a new pad is requested from the element.
|
|
RequestNewPad(self *Element, templ *PadTemplate, name string, caps *Caps) *Pad
|
|
// SendEvent is called to send an event to the element.
|
|
SendEvent(*Element, *Event) bool
|
|
// SetBus is called to set the Bus on the element.
|
|
SetBus(*Element, *Bus)
|
|
// SetClock is called to set the clock on the element.
|
|
SetClock(*Element, *Clock) bool
|
|
// SetContext is called to set the Context on the element.
|
|
SetContext(*Element, *Context)
|
|
// SetState is called to set a new state on the element.
|
|
SetState(*Element, State) StateChangeReturn
|
|
// StateChanged is called immediately after a new state was set.
|
|
StateChanged(self *Element, old, new, pending State)
|
|
}
|
|
|
|
type extendElement struct{ parent glib.Extendable }
|
|
|
|
func (e *extendElement) Type() glib.Type { return glib.Type(C.gst_element_get_type()) }
|
|
func (e *extendElement) ClassSize() int64 { return int64(C.sizeof_GstElementClass) }
|
|
func (e *extendElement) InstanceSize() int64 { return int64(C.sizeof_GstElement) }
|
|
|
|
func (e *extendElement) InitClass(klass unsafe.Pointer, elem glib.GoObjectSubclass) {
|
|
e.parent.InitClass(klass, elem)
|
|
|
|
elemClass := C.toGstElementClass(klass)
|
|
|
|
if _, ok := elem.(interface {
|
|
ChangeState(*Element, StateChange) StateChangeReturn
|
|
}); ok {
|
|
C.setGstElementClassChangeState(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
GetState(self *Element, timeout time.Duration) (ret StateChangeReturn, current, pending State)
|
|
}); ok {
|
|
C.setGstElementClassGetState(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
NoMorePads(*Element)
|
|
}); ok {
|
|
C.setGstElementClassNoMorePads(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
PadAdded(*Element, *Pad)
|
|
}); ok {
|
|
C.setGstElementClassPadAdded(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
PadRemoved(*Element, *Pad)
|
|
}); ok {
|
|
C.setGstElementClassPadRemoved(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
PostMessage(*Element, *Message) bool
|
|
}); ok {
|
|
C.setGstElementClassPostMessage(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
ProvideClock(*Element) *Clock
|
|
}); ok {
|
|
C.setGstElementClassProvideClock(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
Query(*Element, *Query) bool
|
|
}); ok {
|
|
C.setGstElementClassQuery(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
ReleasePad(*Element, *Pad)
|
|
}); ok {
|
|
C.setGstElementClassReleasePad(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
RequestNewPad(self *Element, templ *PadTemplate, name string, caps *Caps) *Pad
|
|
}); ok {
|
|
C.setGstElementClassRequestNewPad(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
SendEvent(*Element, *Event) bool
|
|
}); ok {
|
|
C.setGstElementClassSendEvent(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
SetBus(*Element, *Bus)
|
|
}); ok {
|
|
C.setGstElementClassSetBus(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
SetClock(*Element, *Clock) bool
|
|
}); ok {
|
|
C.setGstElementClassSetClock(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
SetContext(*Element, *Context)
|
|
}); ok {
|
|
C.setGstElementClassSetContext(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
SetState(*Element, State) StateChangeReturn
|
|
}); ok {
|
|
C.setGstElementClassSetState(elemClass)
|
|
}
|
|
|
|
if _, ok := elem.(interface {
|
|
StateChanged(self *Element, old, new, pending State)
|
|
}); ok {
|
|
C.setGstElementClassStateChanged(elemClass)
|
|
}
|
|
}
|