mirror of
https://github.com/go-gst/go-gst.git
synced 2025-10-07 00:43:29 +08:00
add tagsetter and tocsetter interfaces
This commit is contained in:
11
.github/workflows/tests.yml
vendored
11
.github/workflows/tests.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
|||||||
|
|
||||||
setup:
|
setup:
|
||||||
name: Tests
|
name: Tests
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Set up Go 1.15
|
- name: Set up Go 1.15
|
||||||
@@ -35,12 +35,11 @@ jobs:
|
|||||||
|
|
||||||
- name: Install gstreamer dependencies
|
- name: Install gstreamer dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y libgstreamer1.0-0 libgstreamer1.0-dev libgstreamer-plugins-base1.0-0 libgstreamer-plugins-base1.0-dev pkg-config build-essential
|
sudo apt-get update && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
||||||
|
libgstreamer1.0-0 libgstreamer1.0-dev \
|
||||||
|
libgstreamer-plugins-base1.0-0 libgstreamer-plugins-base1.0-dev \
|
||||||
|
pkg-config build-essential
|
||||||
|
|
||||||
- name: Lint all packages
|
- name: Lint all packages
|
||||||
run: |
|
run: |
|
||||||
CGO_ENABLED=1 make lint
|
CGO_ENABLED=1 make lint
|
||||||
|
|
||||||
# - name: Run all unit tests
|
|
||||||
# run: |
|
|
||||||
# CGO_ENABLED=1 make test
|
|
||||||
|
2
Makefile
2
Makefile
@@ -17,4 +17,4 @@ $(GOLANGCI_LINT):
|
|||||||
ln -s golangci-lint-$(GOLANGCI_VERSION)-$(shell uname | tr A-Z a-z)-amd64/golangci-lint $(GOLANGCI_LINT)
|
ln -s golangci-lint-$(GOLANGCI_VERSION)-$(shell uname | tr A-Z a-z)-amd64/golangci-lint $(GOLANGCI_LINT)
|
||||||
|
|
||||||
lint: $(GOLANGCI_LINT)
|
lint: $(GOLANGCI_LINT)
|
||||||
$(GOLANGCI_LINT) run -v
|
$(GOLANGCI_LINT) run -v
|
||||||
|
@@ -168,3 +168,23 @@ func (e *Element) GetURIProtocols() []string {
|
|||||||
size := C.sizeOfGCharArray(protocols)
|
size := C.sizeOfGCharArray(protocols)
|
||||||
return goStrings(size, protocols)
|
return goStrings(size, protocols)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TOCSetter returns a TOCSetter interface if implemented by this element. Otherwise it
|
||||||
|
// returns nil. Currently this only supports elements built through this package, however,
|
||||||
|
// inner application elements could still use the interface as a reference implementation.
|
||||||
|
func (e *Element) TOCSetter() TOCSetter {
|
||||||
|
if C.toTocSetter(e.Instance()) == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &gstTOCSetter{ptr: e.Instance()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TagSetter returns a TagSetter interface if implemented by this element. Otherwise it returns nil.
|
||||||
|
// This currently only supports elements built through this package's bindings, however, inner application
|
||||||
|
// elements can still implement the interface themselves if they want.
|
||||||
|
func (e *Element) TagSetter() TagSetter {
|
||||||
|
if C.toTagSetter(e.Instance()) == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &gstTagSetter{ptr: e.Instance()}
|
||||||
|
}
|
||||||
|
70
gst/gst_tag_setter.go
Normal file
70
gst/gst_tag_setter.go
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
package gst
|
||||||
|
|
||||||
|
// #include "gst.go.h"
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/gotk3/gotk3/glib"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TagSetter is an interface that elements can implement to provide Tag writing capabilities.
|
||||||
|
type TagSetter interface {
|
||||||
|
// Returns the current list of tags the setter uses. The list should not be modified or freed.
|
||||||
|
GetTagList() *TagList
|
||||||
|
// Adds the given tag/value pair using the given merge mode.
|
||||||
|
// TODO: Either an additional function or this one should be modified to accept go types.
|
||||||
|
AddTagValue(mergeMode TagMergeMode, tagKey string, tagValue *glib.Value)
|
||||||
|
// Merges a tag list with the given merge mode
|
||||||
|
MergeTags(*TagList, TagMergeMode)
|
||||||
|
// Resets the internal tag list. Elements should call this from within the state-change handler.
|
||||||
|
ResetTags()
|
||||||
|
// Queries the mode by which tags inside the setter are overwritten by tags from events
|
||||||
|
GetTagMergeMode() TagMergeMode
|
||||||
|
// Sets the given merge mode that is used for adding tags from events to tags specified by this interface.
|
||||||
|
// The default is TagMergeKeep, which keeps the tags set with this interface and discards tags from events.
|
||||||
|
SetTagMergeMode(TagMergeMode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// gstTocSetter implements a TagSetter that is backed by an Element from the C runtime.
|
||||||
|
type gstTagSetter struct {
|
||||||
|
ptr *C.GstElement
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instance returns the underlying TagSetter instance.
|
||||||
|
func (t *gstTagSetter) Instance() *C.GstTagSetter { return C.toTagSetter(t.ptr) }
|
||||||
|
|
||||||
|
func (t *gstTagSetter) GetTagList() *TagList {
|
||||||
|
tagList := C.gst_tag_setter_get_tag_list(t.Instance())
|
||||||
|
if tagList == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return wrapTagList(tagList)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *gstTagSetter) AddTagValue(mergeMode TagMergeMode, tagKey string, tagValue *glib.Value) {
|
||||||
|
ckey := C.CString(tagKey)
|
||||||
|
defer C.free(unsafe.Pointer(ckey))
|
||||||
|
C.gst_tag_setter_add_tag_value(
|
||||||
|
t.Instance(),
|
||||||
|
C.GstTagMergeMode(mergeMode),
|
||||||
|
(*C.gchar)(unsafe.Pointer(ckey)),
|
||||||
|
(*C.GValue)(tagValue.GetPointer()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *gstTagSetter) MergeTags(tagList *TagList, mergeMode TagMergeMode) {
|
||||||
|
C.gst_tag_setter_merge_tags(t.Instance(), tagList.Instance(), C.GstTagMergeMode(mergeMode))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *gstTagSetter) ResetTags() {
|
||||||
|
C.gst_tag_setter_reset_tags(t.Instance())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *gstTagSetter) GetTagMergeMode() TagMergeMode {
|
||||||
|
return TagMergeMode(C.gst_tag_setter_get_tag_merge_mode(t.Instance()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *gstTagSetter) SetTagMergeMode(mergeMode TagMergeMode) {
|
||||||
|
C.gst_tag_setter_set_tag_merge_mode(t.Instance(), C.GstTagMergeMode(mergeMode))
|
||||||
|
}
|
34
gst/gst_toc_setter.go
Normal file
34
gst/gst_toc_setter.go
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
package gst
|
||||||
|
|
||||||
|
// #include "gst.go.h"
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
// TOCSetter is an interface that elements can implement to provide TOC writing capabilities.
|
||||||
|
type TOCSetter interface {
|
||||||
|
// Return current TOC the setter uses. The TOC should not be modified without making it writable first.
|
||||||
|
GetTOC() *TOC
|
||||||
|
// Set the given TOC on the setter. Previously set TOC will be unreffed before setting a new one.
|
||||||
|
SetTOC(*TOC)
|
||||||
|
// Reset the internal TOC. Elements should call this from within the state-change handler.
|
||||||
|
Reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
// gstTocSetter implements a TOCSetter that is backed by an Element from the C runtime.
|
||||||
|
type gstTOCSetter struct {
|
||||||
|
ptr *C.GstElement
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *gstTOCSetter) Instance() *C.GstTocSetter {
|
||||||
|
return C.toTocSetter(g.ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *gstTOCSetter) GetTOC() *TOC {
|
||||||
|
toc := C.gst_toc_setter_get_toc(g.Instance())
|
||||||
|
if toc == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return wrapTOC(toc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *gstTOCSetter) SetTOC(toc *TOC) { C.gst_toc_setter_set_toc(g.Instance(), toc.Instance()) }
|
||||||
|
func (g *gstTOCSetter) Reset() { C.gst_toc_setter_reset(g.Instance()) }
|
@@ -3,7 +3,7 @@ package gst
|
|||||||
/*
|
/*
|
||||||
#include "gst.go.h"
|
#include "gst.go.h"
|
||||||
|
|
||||||
GValue * gvalPtrToGval (uintptr_t p)
|
GValue * gvalPtrToGval (gpointer p)
|
||||||
{
|
{
|
||||||
return (GValue*)(p);
|
return (GValue*)(p);
|
||||||
}
|
}
|
||||||
@@ -141,6 +141,10 @@ func init() {
|
|||||||
glib.RegisterGValueMarshalers(tm)
|
glib.RegisterGValueMarshalers(tm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func uintptrToGVal(p uintptr) *C.GValue {
|
||||||
|
return (*C.GValue)(unsafe.Pointer(p))
|
||||||
|
}
|
||||||
|
|
||||||
// Object wrappers
|
// Object wrappers
|
||||||
|
|
||||||
func wrapAllocator(obj *glib.Object) *Allocator { return &Allocator{wrapObject(obj)} }
|
func wrapAllocator(obj *glib.Object) *Allocator { return &Allocator{wrapObject(obj)} }
|
||||||
@@ -205,10 +209,6 @@ func durationToClockTime(dur time.Duration) ClockTime { return ClockTime(dur.Nan
|
|||||||
|
|
||||||
// Marshallers
|
// Marshallers
|
||||||
|
|
||||||
func uintptrToGVal(p uintptr) *C.GValue {
|
|
||||||
return C.gvalPtrToGval(C.ulong(p))
|
|
||||||
}
|
|
||||||
|
|
||||||
func marshalBufferingMode(p uintptr) (interface{}, error) {
|
func marshalBufferingMode(p uintptr) (interface{}, error) {
|
||||||
c := C.g_value_get_enum(uintptrToGVal(p))
|
c := C.g_value_get_enum(uintptrToGVal(p))
|
||||||
return BufferingMode(c), nil
|
return BufferingMode(c), nil
|
||||||
|
Reference in New Issue
Block a user