Skip to content

Commit

Permalink
Add Element.SeekSimple support
Browse files Browse the repository at this point in the history
  • Loading branch information
jwmwalrus committed Dec 21, 2020
1 parent 57243eb commit 06dccea
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
31 changes: 31 additions & 0 deletions element.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,25 @@ const (
StateChangePreroll StateChangeReturn = C.GST_STATE_CHANGE_NO_PREROLL
)

type SeekFlags int

const (
SeekFlagNone SeekFlags = C.GST_SEEK_FLAG_NONE
SeekFlagFlush SeekFlags = C.GST_SEEK_FLAG_FLUSH
SeekFlagAccurate SeekFlags = C.GST_SEEK_FLAG_ACCURATE
SeekFlagKeyUnit SeekFlags = C.GST_SEEK_FLAG_KEY_UNIT
SeekFlagSegment SeekFlags = C.GST_SEEK_FLAG_SEGMENT
SeekFlagTrickmode SeekFlags = C.GST_SEEK_FLAG_TRICKMODE
SeekFlagSkip SeekFlags = C.GST_SEEK_FLAG_SKIP
SeekFlagSnapBefore SeekFlags = C.GST_SEEK_FLAG_SNAP_BEFORE
SeekFlagSnapAfter SeekFlags = C.GST_SEEK_FLAG_SNAP_AFTER
SeekFlagSnapNearest SeekFlags = C.GST_SEEK_FLAG_SNAP_NEAREST
SeekFlagTrickmodeKeyUnits SeekFlags = C.GST_SEEK_FLAG_TRICKMODE_KEY_UNITS
SeekFlagTrickmodeNoAudio SeekFlags = C.GST_SEEK_FLAG_TRICKMODE_NO_AUDIO
SeekFlagTrickmodeForwardPredicted SeekFlags = C.GST_SEEK_FLAG_TRICKMODE_FORWARD_PREDICTED
SeekFlagInstantRateChange SeekFlags = C.GST_SEEK_FLAG_INSTANT_RATE_CHANGE
)

type Element struct {
GstElement *C.GstElement
onPadAdded PadAddedCallback
Expand Down Expand Up @@ -121,6 +140,11 @@ func (e *Element) GetStaticPad(name string) (pad *Pad) {
return
}

func (e *Element) Query(q *Query) bool {
Cboolean := C.gst_element_query(e.GstElement, q.C)
return Cboolean == 1
}

func (e *Element) QueryPosition() (time.Duration, error) {
var position C.gint64

Expand Down Expand Up @@ -311,6 +335,13 @@ func (e *Element) GetBus() (bus *Bus) {
return
}

func (e *Element) SeekSimple(format FormatOptions, flags SeekFlags, seekPos time.Duration) bool {

Cbool := C.gst_element_seek_simple(e.GstElement, C.GstFormat(format), C.GstSeekFlags(flags), C.gint64(seekPos))

return Cbool == 1
}

func (e *Element) cleanCallback() {

if e.onPadAdded == nil {
Expand Down
66 changes: 66 additions & 0 deletions query.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package gst

/*
#cgo pkg-config: gstreamer-1.0
#include "gst.h"
*/
import "C"
import (
"errors"
"runtime"
"time"
"unsafe"
)

type FormatOptions int

const (
FormatUndefined FormatOptions = C.GST_FORMAT_UNDEFINED
FormatDefault FormatOptions = C.GST_FORMAT_DEFAULT
FormatBytes FormatOptions = C.GST_FORMAT_BYTES
FormatTime FormatOptions = C.GST_FORMAT_TIME
FormatBuffers FormatOptions = C.GST_FORMAT_BUFFERS
FormatPercent FormatOptions = C.GST_FORMAT_PERCENT
)

type Query struct {
C *C.GstQuery
}

func QueryNewSeeking(format FormatOptions) (q *Query, err error) {

gstQuery := C.gst_query_new_seeking(C.GstFormat(format))
if gstQuery == nil {
err = errors.New("could not create a Gstreamer query")
return
}

q = &Query{}

q.C = gstQuery

runtime.SetFinalizer(q, func(q *Query) {
C.gst_object_unref(C.gpointer(unsafe.Pointer(q.C)))
})

return
}

func (q *Query) ParseSeeking(format *FormatOptions) (seekable bool, segmentStart, segmentEnd time.Duration) {

var Cformat C.GstFormat
var Cseekable C.gboolean
var CsegmentStart, CsegmentEnd C.gint64

if format != nil {
Cformat = C.GstFormat(*format)
}

C.gst_query_parse_seeking(q.C, &Cformat, &Cseekable, &CsegmentStart, &CsegmentEnd)

seekable = Cseekable == 1
segmentStart = time.Duration(CsegmentStart)
segmentEnd = time.Duration(CsegmentEnd)

return
}

0 comments on commit 06dccea

Please sign in to comment.