mirror of
				https://github.com/go-gst/go-gst.git
				synced 2025-10-31 11:36:23 +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)
 | |
| 	}
 | |
| }
 | 
