Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions bin.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ type Bin struct {
func ParseBinFromDescription(binStr string, ghostPads bool) (bin *Bin, err error) {
var gError *C.GError

pDesc := (*C.gchar)(unsafe.Pointer(C.CString(binStr)))
defer C.g_free(C.gpointer(unsafe.Pointer(pDesc)))
pDesc := C.CString(binStr)
defer C.free(unsafe.Pointer(pDesc))

var ghost int
if ghostPads {
Expand All @@ -29,7 +29,7 @@ func ParseBinFromDescription(binStr string, ghostPads bool) (bin *Bin, err error
ghost = 0
}

gstElt := C.gst_parse_bin_from_description(pDesc, C.int(ghost), &gError)
gstElt := C.gst_parse_bin_from_description((*C.gchar)(pDesc), C.int(ghost), &gError)

if gError != nil {
err = errors.New("create bin error")
Expand All @@ -48,10 +48,10 @@ func ParseBinFromDescription(binStr string, ghostPads bool) (bin *Bin, err error

func BinNew(name string) (bin *Bin) {

pName := (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(pName)))
pName := C.CString(name)
defer C.free(unsafe.Pointer(pName))

Celement := C.gst_bin_new(pName)
Celement := C.gst_bin_new((*C.gchar)(pName))
bin = &Bin{}

bin.GstElement = Celement
Expand Down Expand Up @@ -87,9 +87,9 @@ func (b *Bin) AddMany(elements ...*Element) {

func (b *Bin) GetByName(name string) (element *Element) {

n := (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(n)))
CElement := C.X_gst_bin_get_by_name(b.GstElement, n)
n := C.CString(name)
defer C.free(unsafe.Pointer(n))
CElement := C.X_gst_bin_get_by_name(b.GstElement, (*C.gchar)(n))

if CElement == nil {
return
Expand Down
2 changes: 1 addition & 1 deletion bus.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func (b *Bus) Pop() (message *Message) {
}

func (b *Bus) PopTimed() (message *Message, err error) {
var timeNone int64 = C.GST_CLOCK_TIME_NONE
var timeNone uint64 = C.GST_CLOCK_TIME_NONE

CGstMessage := C.gst_bus_timed_pop(b.C, C.ulonglong(timeNone))
if CGstMessage == nil {
Expand Down
6 changes: 3 additions & 3 deletions caps.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ type Caps struct {
}

func CapsFromString(caps string) (gstCaps *Caps) {
c := (*C.gchar)(unsafe.Pointer(C.CString(caps)))
defer C.g_free(C.gpointer(unsafe.Pointer(c)))
CCaps := C.gst_caps_from_string(c)
c := C.CString(caps)
defer C.free(unsafe.Pointer(c))
CCaps := C.gst_caps_from_string((*C.gchar)(c))
gstCaps = &Caps{
caps: CCaps,
}
Expand Down
58 changes: 29 additions & 29 deletions element.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ func (e *Element) Name() (name string) {
}

func (e *Element) DumpDot(filePath string) {
n := (*C.gchar)(unsafe.Pointer(C.CString(filePath)))
defer C.g_free(C.gpointer(unsafe.Pointer(n)))
C.X_GST_DEBUG_BIN_TO_DOT_FILE(e.GstElement, n)
n := C.CString(filePath)
defer C.free(unsafe.Pointer(n))
C.X_GST_DEBUG_BIN_TO_DOT_FILE(e.GstElement, (*C.gchar)(n))
}

func (e *Element) Link(dst *Element) bool {
Expand All @@ -94,9 +94,9 @@ func (e *Element) Link(dst *Element) bool {

func (e *Element) GetPadTemplate(name string) (padTemplate *PadTemplate) {

n := (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(n)))
CPadTemplate := C.gst_element_class_get_pad_template(C.X_GST_ELEMENT_GET_CLASS(e.GstElement), n)
n := C.CString(name)
defer C.free(unsafe.Pointer(n))
CPadTemplate := C.gst_element_class_get_pad_template(C.X_GST_ELEMENT_GET_CLASS(e.GstElement), (*C.gchar)(n))
padTemplate = &PadTemplate{
C: CPadTemplate,
}
Expand All @@ -112,15 +112,15 @@ func (e *Element) GetRequestPad(padTemplate *PadTemplate, name string, caps *Cap
if name == "" {
n = nil
} else {
n = (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(n)))
n = C.CString(name)
defer C.free(unsafe.Pointer(n))
}
if caps == nil {
c = nil
} else {
c = caps.caps
}
CPad := C.gst_element_request_pad(e.GstElement, padTemplate.C, n, c)
CPad := C.gst_element_request_pad(e.GstElement, padTemplate.C, (*C.gchar)(n), c)
pad = &Pad{
pad: CPad,
}
Expand All @@ -130,9 +130,9 @@ func (e *Element) GetRequestPad(padTemplate *PadTemplate, name string, caps *Cap

func (e *Element) GetStaticPad(name string) (pad *Pad) {

n := (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(n)))
CPad := C.gst_element_get_static_pad(e.GstElement, n)
n := C.CString(name)
defer C.free(unsafe.Pointer(n))
CPad := C.gst_element_get_static_pad(e.GstElement, (*C.gchar)(n))
pad = &Pad{
pad: CPad,
}
Expand Down Expand Up @@ -285,36 +285,36 @@ func (e *Element) IsEOS() bool {

func (e *Element) SetObject(name string, value interface{}) {

cname := (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(cname)))
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
switch value.(type) {
case string:
str := (*C.gchar)(unsafe.Pointer(C.CString(value.(string))))
defer C.g_free(C.gpointer(unsafe.Pointer(str)))
C.X_gst_g_object_set_string(e.GstElement, cname, str)
str := C.CString(value.(string))
defer C.free(unsafe.Pointer(str))
C.X_gst_g_object_set_string(e.GstElement, (*C.gchar)(unsafe.Pointer(cname)), (*C.gchar)(str))
case int:
C.X_gst_g_object_set_int(e.GstElement, cname, C.gint(value.(int)))
C.X_gst_g_object_set_int(e.GstElement, (*C.gchar)(unsafe.Pointer(cname)), C.gint(value.(int)))
case uint32:
C.X_gst_g_object_set_uint(e.GstElement, cname, C.guint(value.(uint32)))
C.X_gst_g_object_set_uint(e.GstElement, (*C.gchar)(unsafe.Pointer(cname)), C.guint(value.(uint32)))
case bool:
var cvalue int
if value.(bool) == true {
cvalue = 1
} else {
cvalue = 0
}
C.X_gst_g_object_set_bool(e.GstElement, cname, C.gboolean(cvalue))
C.X_gst_g_object_set_bool(e.GstElement, (*C.gchar)(unsafe.Pointer(cname)), C.gboolean(cvalue))
case float64:
C.X_gst_g_object_set_gdouble(e.GstElement, cname, C.gdouble(value.(float64)))
C.X_gst_g_object_set_gdouble(e.GstElement, (*C.gchar)(unsafe.Pointer(cname)), C.gdouble(value.(float64)))
case *Caps:
caps := value.(*Caps)
C.X_gst_g_object_set_caps(e.GstElement, cname, caps.caps)
C.X_gst_g_object_set_caps(e.GstElement, (*C.gchar)(unsafe.Pointer(cname)), caps.caps)
case *Structure:
structure := value.(*Structure)
C.X_gst_g_object_set_structure(e.GstElement, cname, structure.C)
C.X_gst_g_object_set_structure(e.GstElement, (*C.gchar)(unsafe.Pointer(cname)), structure.C)
case *Element:
element := value.(*Element)
C.X_gst_g_object_set_element(e.GstElement, cname, element.GstElement)
C.X_gst_g_object_set_element(e.GstElement, (*C.gchar)(unsafe.Pointer(cname)), element.GstElement)

default:
panic(fmt.Errorf("SetObject: don't know how to set value for type %T", value))
Expand Down Expand Up @@ -420,15 +420,15 @@ func (e *Element) SetPadAddedCallback(callback PadAddedCallback) {
func ElementFactoryMake(factoryName string, name string) (e *Element, err error) {
var pName *C.gchar

pFactoryName := (*C.gchar)(unsafe.Pointer(C.CString(factoryName)))
defer C.g_free(C.gpointer(unsafe.Pointer(pFactoryName)))
pFactoryName := C.CString(factoryName)
defer C.free(unsafe.Pointer(pFactoryName))
if name == "" {
pName = nil
} else {
pName = (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(pName)))
pName = C.CString(name)
defer C.free(unsafe.Pointer(pName))
}
gstElt := C.gst_element_factory_make(pFactoryName, pName)
gstElt := C.gst_element_factory_make((*C.gchar)(pFactoryName), (*C.gchar)(pName))

if gstElt == nil {
err = errors.New(fmt.Sprintf("could not create a GStreamer element factoryName %s, name %s", factoryName, name))
Expand Down
4 changes: 2 additions & 2 deletions element_other.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//go:build !arm && !arm64
// +build !arm,!arm64
//go:build !arm && !arm64 && !windows
// +build !arm,!arm64,!windows

package gst

Expand Down
13 changes: 13 additions & 0 deletions element_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package gst

/*
#cgo pkg-config: gstreamer-1.0 gstreamer-app-1.0
#include "gst.h"
*/
import "C"
import "time"

func (e *Element) Seek(duration time.Duration) bool {
result := C.gst_element_seek_simple(e.GstElement, C.GST_FORMAT_TIME, C.GST_SEEK_FLAG_FLUSH, C.gint64(duration.Nanoseconds()))
return result == C.TRUE
}
55 changes: 55 additions & 0 deletions example/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package main

import (
"fmt"
"github.com/notedit/gst"
"time"
)

func testGST() {
println(1)
pipeline, err := gst.ParseLaunch("appsrc name=mysource format=time is-live=true do-timestamp=true ! videoconvert ! autovideosink")
println(2)
if err != nil {
panic("pipeline error")
}
println(3)
videoCap := gst.CapsFromString("video/x-raw,format=RGB,width=320,height=240,bpp=24,depth=24")
println(4)
element := pipeline.GetByName("mysource")
println(5)
element.SetObject("caps", videoCap)
println(6)
pipeline.SetState(gst.StatePlaying)
println(7)
i := 0
for {

if i > 100 {
break
}

data := make([]byte, 320*240*3)

err := element.PushBuffer(data)

if err != nil {
fmt.Println("push buffer error")
break
}

fmt.Println("push one")
i++
time.Sleep(50000000)
}

pipeline.SetState(gst.StateNull)

pipeline = nil
element = nil
videoCap = nil
}
func main() {

testGST()
}
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
github.com/notedit/gst v0.1.3 h1:Z5q274M3TJst3w+iAdZLIoIhzp7QiwYdH98Vik+f89g=
github.com/notedit/gst v0.1.3/go.mod h1:99yZ0oIrCg0xd2a1rn/1cjcUAHLAGTDxXLD1FQ5NpoM=
8 changes: 5 additions & 3 deletions gst.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
#include "gst.h"

void X_gst_shim_init() {


gchar *nano_str;
guint major, minor, micro, nano;

fprintf(stderr, "[ GSTREAMER ] shim init\n");

gst_init(0, NULL);

gst_version (&major, &minor, &micro, &nano);
Expand Down Expand Up @@ -244,9 +247,8 @@ void X_gst_pipeline_set_latency(GstElement* element, GstClockTime clockTime) {


GstFlowReturn X_gst_app_src_push_buffer(GstElement* element, void *buffer,int len) {

gpointer p = g_memdup2(buffer, len);
GstBuffer *data = gst_buffer_new_wrapped(p, len);
GstBuffer *data = gst_buffer_new_memdup(buffer, len);
//GstBuffer *data = gst_buffer_new_wrapped(p, len);

return gst_app_src_push_buffer(GST_APP_SRC(element), data);
}
Expand Down
22 changes: 11 additions & 11 deletions pad.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,33 +96,33 @@ func (p *Pad) IsLinked() bool {

func (e *Pad) SetObject(name string, value interface{}) {

cname := (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(cname)))
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
switch value.(type) {
case string:
str := (*C.gchar)(unsafe.Pointer(C.CString(value.(string))))
defer C.g_free(C.gpointer(unsafe.Pointer(str)))
C.X_gst_g_pad_set_string(e.pad, cname, str)
str := C.CString(value.(string))
defer C.free(unsafe.Pointer(str))
C.X_gst_g_pad_set_string(e.pad, (*C.gchar)(cname), (*C.gchar)(str))
case int:
C.X_gst_g_pad_set_int(e.pad, cname, C.gint(value.(int)))
C.X_gst_g_pad_set_int(e.pad, (*C.gchar)(cname), C.gint(value.(int)))
case uint32:
C.X_gst_g_pad_set_uint(e.pad, cname, C.guint(value.(uint32)))
C.X_gst_g_pad_set_uint(e.pad, (*C.gchar)(cname), C.guint(value.(uint32)))
case bool:
var cvalue int
if value.(bool) == true {
cvalue = 1
} else {
cvalue = 0
}
C.X_gst_g_pad_set_bool(e.pad, cname, C.gboolean(cvalue))
C.X_gst_g_pad_set_bool(e.pad, (*C.gchar)(cname), C.gboolean(cvalue))
case float64:
C.X_gst_g_pad_set_gdouble(e.pad, cname, C.gdouble(value.(float64)))
C.X_gst_g_pad_set_gdouble(e.pad, (*C.gchar)(cname), C.gdouble(value.(float64)))
case *Caps:
caps := value.(*Caps)
C.X_gst_g_pad_set_caps(e.pad, cname, caps.caps)
C.X_gst_g_pad_set_caps(e.pad, (*C.gchar)(cname), caps.caps)
case *Structure:
structure := value.(*Structure)
C.X_gst_g_pad_set_structure(e.pad, cname, structure.C)
C.X_gst_g_pad_set_structure(e.pad, (*C.gchar)(cname), structure.C)
default:
panic(fmt.Errorf("SetObject: don't know how to set value for type %T", value))
}
Expand Down
17 changes: 6 additions & 11 deletions pipeline.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,25 +25,20 @@ type Pipeline struct {
func ParseLaunch(pipelineStr string) (p *Pipeline, err error) {
var gError *C.GError

pDesc := (*C.gchar)(unsafe.Pointer(C.CString(pipelineStr)))
defer C.g_free(C.gpointer(unsafe.Pointer(pDesc)))

gstElt := C.gst_parse_launch(pDesc, &gError)
pDesc := C.CString(pipelineStr)
defer C.free(unsafe.Pointer(pDesc))

gstElt := C.gst_parse_launch((*C.gchar)(pDesc), &gError)
if gError != nil {
err = errors.New(C.GoString(C.ErrorMessage(gError)))
return
}

p = &Pipeline{}
p.GstElement = gstElt

C.X_gst_pipeline_use_clock_real(p.GstElement)

runtime.SetFinalizer(p, func(p *Pipeline) {
C.gst_object_unref(C.gpointer(unsafe.Pointer(p.GstElement)))
})

return
}

Expand All @@ -53,11 +48,11 @@ func PipelineNew(name string) (e *Pipeline, err error) {
if name == "" {
pName = nil
} else {
pName := (*C.gchar)(unsafe.Pointer(C.CString(name)))
defer C.g_free(C.gpointer(unsafe.Pointer(pName)))
pName := C.CString(name)
defer C.free(unsafe.Pointer(pName))
}

gstElt := C.gst_pipeline_new(pName)
gstElt := C.gst_pipeline_new((*C.gchar)(pName))
if gstElt == nil {
err = errors.New(fmt.Sprintf("could not create a Gstreamer pipeline name %s", name))
return
Expand Down
Loading