mirror of
https://github.com/go-gst/go-gst.git
synced 2025-10-08 09:20:19 +08:00
pull in upstream interface improvements and add a few more gstreamer interfaces
This commit is contained in:
196
gst/gst_element_impl.go
Normal file
196
gst/gst_element_impl.go
Normal file
@@ -0,0 +1,196 @@
|
||||
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)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user