mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-11-20 02:21:00 +00:00
Create GStreamer plugin from Rust and have the plugin entry point written in Rust
This commit is contained in:
parent
cc183ea92e
commit
78450a035d
6 changed files with 65 additions and 44 deletions
2
build.rs
2
build.rs
|
@ -23,7 +23,7 @@ fn main() {
|
|||
let gstbase = pkg_config::probe_library("gstreamer-base-1.0").unwrap();
|
||||
let includes = [gstreamer.include_paths, gstbase.include_paths];
|
||||
|
||||
let files = ["src/plugin.c", "src/rssource.c", "src/rssink.c", "src/rsdemuxer.c"];
|
||||
let files = ["src/lib.c", "src/rssource.c", "src/rssink.c", "src/rsdemuxer.c"];
|
||||
|
||||
let mut config = gcc::Config::new();
|
||||
config.include("src");
|
||||
|
|
|
@ -22,32 +22,6 @@
|
|||
#include "rssink.h"
|
||||
#include "rsdemuxer.h"
|
||||
|
||||
static gboolean
|
||||
plugin_init (GstPlugin * plugin)
|
||||
{
|
||||
if (!gst_rs_source_plugin_init (plugin))
|
||||
return FALSE;
|
||||
|
||||
if (!gst_rs_sink_plugin_init (plugin))
|
||||
return FALSE;
|
||||
|
||||
if (!gst_rs_demuxer_plugin_init (plugin))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#define VERSION "1.0"
|
||||
#define PACKAGE "rsplugin"
|
||||
#define GST_PACKAGE_NAME PACKAGE
|
||||
#define GST_PACKAGE_ORIGIN "http://www.example.org"
|
||||
|
||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
||||
GST_VERSION_MINOR,
|
||||
rsplugin,
|
||||
"Rust Plugin", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME,
|
||||
GST_PACKAGE_ORIGIN);
|
||||
|
||||
void
|
||||
gst_rs_element_error (GstElement * element, GQuark error_domain,
|
||||
gint error_code, const gchar * message, const gchar * debug,
|
54
src/lib.rs
54
src/lib.rs
|
@ -96,8 +96,7 @@ unsafe fn source_register(plugin: *const c_void,
|
|||
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sources_register(plugin: *const c_void) -> GBoolean {
|
||||
unsafe fn sources_register(plugin: *const c_void) -> GBoolean {
|
||||
source_register(plugin,
|
||||
"rsfilesrc",
|
||||
"File Source",
|
||||
|
@ -163,8 +162,7 @@ unsafe fn sink_register(plugin: *const c_void,
|
|||
cprotocols.as_ptr());
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sinks_register(plugin: *const c_void) -> GBoolean {
|
||||
unsafe fn sinks_register(plugin: *const c_void) -> GBoolean {
|
||||
sink_register(plugin,
|
||||
"rsfilesink",
|
||||
"File Sink",
|
||||
|
@ -222,8 +220,7 @@ unsafe fn demuxer_register(plugin: *const c_void,
|
|||
coutput_formats.as_ptr());
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn demuxers_register(plugin: *const c_void) -> GBoolean {
|
||||
unsafe fn demuxers_register(plugin: *const c_void) -> GBoolean {
|
||||
demuxer_register(plugin,
|
||||
"rsflvdemux",
|
||||
"FLV Demuxer",
|
||||
|
@ -237,3 +234,48 @@ pub unsafe extern "C" fn demuxers_register(plugin: *const c_void) -> GBoolean {
|
|||
|
||||
GBoolean::True
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct GstPluginDesc {
|
||||
major_version: i32,
|
||||
minor_version: i32,
|
||||
name: *const u8,
|
||||
description: *const u8,
|
||||
plugin_init: extern "C" fn(plugin: *const c_void) -> GBoolean,
|
||||
version: *const u8,
|
||||
license: *const u8,
|
||||
source: *const u8,
|
||||
package: *const u8,
|
||||
origin: *const u8,
|
||||
release_datetime: *const u8,
|
||||
_gst_reserved: [usize; 4],
|
||||
}
|
||||
|
||||
unsafe impl Sync for GstPluginDesc {}
|
||||
|
||||
extern "C" fn plugin_init(plugin: *const c_void) -> GBoolean {
|
||||
unsafe {
|
||||
sources_register(plugin);
|
||||
sinks_register(plugin);
|
||||
demuxers_register(plugin);
|
||||
}
|
||||
|
||||
GBoolean::True
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
#[allow(non_upper_case_globals)]
|
||||
pub static gst_plugin_desc: GstPluginDesc = GstPluginDesc {
|
||||
major_version: 1,
|
||||
minor_version: 10,
|
||||
name: b"rsplugin\0" as *const u8,
|
||||
description: b"Rust Plugin\0" as *const u8,
|
||||
plugin_init: plugin_init,
|
||||
version: b"1.0\0" as *const u8,
|
||||
license: b"LGPL\0" as *const u8,
|
||||
source: b"rsplugin\0" as *const u8,
|
||||
package: b"rsplugin\0" as *const u8,
|
||||
origin: b"https://github.com/sdroege/rsplugin\0" as *const u8,
|
||||
release_datetime: b"2016-12-08\0" as *const u8,
|
||||
_gst_reserved: [0, 0, 0, 0],
|
||||
};
|
||||
|
|
|
@ -470,16 +470,14 @@ gst_rs_demuxer_remove_all_streams (GstRsDemuxer * demuxer)
|
|||
memset (demuxer->srcpads, 0, sizeof (demuxer->srcpads));
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_rs_demuxer_plugin_init (GstPlugin * plugin)
|
||||
static gpointer
|
||||
gst_rs_demuxer_init_class (gpointer data)
|
||||
{
|
||||
demuxers = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||
GST_DEBUG_CATEGORY_INIT (gst_rs_demuxer_debug, "rsdemux", 0,
|
||||
"rsdemux element");
|
||||
|
||||
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
||||
|
||||
return demuxers_register (plugin);
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@ -489,6 +487,7 @@ gst_rs_demuxer_register (GstPlugin * plugin, const gchar * name,
|
|||
void *create_instance, const gchar * input_format,
|
||||
const gchar * output_formats)
|
||||
{
|
||||
GOnce gonce = G_ONCE_INIT;
|
||||
GTypeInfo type_info = {
|
||||
sizeof (GstRsDemuxerClass),
|
||||
NULL,
|
||||
|
@ -504,6 +503,8 @@ gst_rs_demuxer_register (GstPlugin * plugin, const gchar * name,
|
|||
gchar *type_name;
|
||||
ElementData *data;
|
||||
|
||||
g_once (&gonce, gst_rs_demuxer_init_class, NULL);
|
||||
|
||||
data = g_new0 (ElementData, 1);
|
||||
data->long_name = g_strdup (long_name);
|
||||
data->description = g_strdup (description);
|
||||
|
|
|
@ -243,15 +243,13 @@ gst_rs_sink_uri_handler_init (gpointer g_iface, gpointer iface_data)
|
|||
iface->set_uri = gst_rs_sink_uri_set_uri;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_rs_sink_plugin_init (GstPlugin * plugin)
|
||||
static gpointer
|
||||
gst_rs_sink_init_class (gpointer data)
|
||||
{
|
||||
sinks = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||
GST_DEBUG_CATEGORY_INIT (gst_rs_sink_debug, "rssink", 0, "rssink element");
|
||||
|
||||
parent_class = g_type_class_ref (GST_TYPE_BASE_SINK);
|
||||
|
||||
return sinks_register (plugin);
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@ -260,6 +258,7 @@ gst_rs_sink_register (GstPlugin * plugin, const gchar * name,
|
|||
const gchar * classification, const gchar * author, GstRank rank,
|
||||
void *create_instance, const gchar * protocols)
|
||||
{
|
||||
static GOnce gonce = G_ONCE_INIT;
|
||||
GTypeInfo type_info = {
|
||||
sizeof (GstRsSinkClass),
|
||||
NULL,
|
||||
|
@ -280,6 +279,8 @@ gst_rs_sink_register (GstPlugin * plugin, const gchar * name,
|
|||
gchar *type_name;
|
||||
ElementData *data;
|
||||
|
||||
g_once (&gonce, gst_rs_sink_init_class, NULL);
|
||||
|
||||
data = g_new0 (ElementData, 1);
|
||||
data->name = g_strdup (name);
|
||||
data->long_name = g_strdup (long_name);
|
||||
|
|
|
@ -280,15 +280,15 @@ gst_rs_src_uri_handler_init (gpointer g_iface, gpointer iface_data)
|
|||
iface->set_uri = gst_rs_src_uri_set_uri;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_rs_source_plugin_init (GstPlugin * plugin)
|
||||
static gpointer
|
||||
gst_rs_source_init_class (gpointer data)
|
||||
{
|
||||
sources = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||
GST_DEBUG_CATEGORY_INIT (gst_rs_src_debug, "rssrc", 0, "rssrc element");
|
||||
|
||||
parent_class = g_type_class_ref (GST_TYPE_BASE_SRC);
|
||||
|
||||
return sources_register (plugin);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@ -297,6 +297,7 @@ gst_rs_source_register (GstPlugin * plugin, const gchar * name,
|
|||
const gchar * classification, const gchar * author, GstRank rank,
|
||||
void *create_instance, const gchar * protocols, gboolean push_only)
|
||||
{
|
||||
static GOnce gonce = G_ONCE_INIT;
|
||||
GTypeInfo type_info = {
|
||||
sizeof (GstRsSrcClass),
|
||||
NULL,
|
||||
|
@ -317,6 +318,8 @@ gst_rs_source_register (GstPlugin * plugin, const gchar * name,
|
|||
gchar *type_name;
|
||||
ElementData *data;
|
||||
|
||||
g_once (&gonce, gst_rs_source_init_class, NULL);
|
||||
|
||||
data = g_new0 (ElementData, 1);
|
||||
data->long_name = g_strdup (long_name);
|
||||
data->description = g_strdup (description);
|
||||
|
|
Loading…
Reference in a new issue