diff options
Diffstat (limited to 'ext/libmng/gstmngenc.c')
-rw-r--r-- | ext/libmng/gstmngenc.c | 117 |
1 files changed, 30 insertions, 87 deletions
diff --git a/ext/libmng/gstmngenc.c b/ext/libmng/gstmngenc.c index c6e34326..1d60d792 100644 --- a/ext/libmng/gstmngenc.c +++ b/ext/libmng/gstmngenc.c @@ -26,8 +26,7 @@ #define MAX_HEIGHT 4096 - -static const GstElementDetails gst_mngenc_details = +static const GstElementDetails gst_mng_enc_details = GST_ELEMENT_DETAILS ("MNG video encoder", "Codec/Encoder/Video", "Encode a video frame to an .mng video", @@ -45,49 +44,19 @@ enum enum { - ARG_0, - ARG_SNAPSHOT, - ARG_NEWMEDIA + ARG_0 }; -static void gst_mngenc_base_init (gpointer g_class); -static void gst_mngenc_class_init (GstMngEncClass * klass); -static void gst_mngenc_init (GstMngEnc * mngenc); -static void gst_mngenc_set_property (GObject * object, +static void gst_mng_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_mngenc_get_property (GObject * object, +static void gst_mng_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static void gst_mngenc_chain (GstPad * pad, GstData * _data); +static GstFlowReturn gst_mng_enc_chain (GstPad * pad, GstBuffer * buf); GstPadTemplate *mngenc_src_template, *mngenc_sink_template; -static GstElementClass *parent_class = NULL; - - -GType -gst_mngenc_get_type (void) -{ - static GType mngenc_type = 0; - - if (!mngenc_type) { - static const GTypeInfo mngenc_info = { - sizeof (GstMngEncClass), - gst_mngenc_base_init, - NULL, - (GClassInitFunc) gst_mngenc_class_init, - NULL, - NULL, - sizeof (GstMngEnc), - 0, - (GInstanceInitFunc) gst_mngenc_init, - }; - - mngenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstMngEnc", - &mngenc_info, 0); - } - return mngenc_type; -} +GST_BOILERPLATE (GstMngEnc, gst_mng_enc, GstElement, GST_TYPE_ELEMENT); static GstCaps * mng_caps_factory (void) @@ -106,7 +75,7 @@ raw_caps_factory (void) } static void -gst_mngenc_base_init (gpointer g_class) +gst_mng_enc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstCaps *raw_caps, *mng_caps; @@ -122,11 +91,11 @@ gst_mngenc_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, mngenc_sink_template); gst_element_class_add_pad_template (element_class, mngenc_src_template); - gst_element_class_set_details (element_class, &gst_mngenc_details); + gst_element_class_set_details (element_class, &gst_mng_enc_details); } static void -gst_mngenc_class_init (GstMngEncClass * klass) +gst_mng_enc_class_init (GstMngEncClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; @@ -134,32 +103,18 @@ gst_mngenc_class_init (GstMngEncClass * klass) gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_peek_parent (klass); - - g_object_class_install_property (gobject_class, ARG_SNAPSHOT, - g_param_spec_boolean ("snapshot", "Snapshot", - "Send EOS after encoding a frame, useful for snapshots", - DEFAULT_SNAPSHOT, (GParamFlags) G_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, ARG_NEWMEDIA, - g_param_spec_boolean ("newmedia", "newmedia", - "Send new media discontinuity after encoding each frame", - FALSE, (GParamFlags) G_PARAM_READWRITE)); - - gstelement_class->get_property = gst_mngenc_get_property; - gstelement_class->set_property = gst_mngenc_set_property; + gobject_class->get_property = gst_mng_enc_get_property; + gobject_class->set_property = gst_mng_enc_set_property; } - -static GstPadLinkReturn -gst_mngenc_sinklink (GstPad * pad, const GstCaps * caps) +static gboolean +gst_mng_enc_sink_setcaps (GstPad * pad, GstCaps * caps) { GstMngEnc *mngenc; gdouble fps; GstStructure *structure; - GstPadLinkReturn result; - mngenc = GST_MNGENC (gst_pad_get_parent (pad)); + mngenc = GST_MNG_ENC (gst_pad_get_parent (pad)); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &mngenc->width); @@ -172,14 +127,16 @@ gst_mngenc_sinklink (GstPad * pad, const GstCaps * caps) "width", G_TYPE_INT, mngenc->width, "height", G_TYPE_INT, mngenc->height, NULL); - result = gst_pad_try_set_caps (mngenc->srcpad, caps); + gst_pad_set_caps (mngenc->srcpad, caps); + gst_caps_unref (caps); + gst_object_unref (mngenc); - return result; + return TRUE; } static void -gst_mngenc_init (GstMngEnc * mngenc) +gst_mng_enc_init (GstMngEnc * mngenc, GstMngEncClass * gclass) { mngenc->sinkpad = gst_pad_new_from_template (mngenc_sink_template, "sink"); gst_element_add_pad (GST_ELEMENT (mngenc), mngenc->sinkpad); @@ -187,43 +144,35 @@ gst_mngenc_init (GstMngEnc * mngenc) mngenc->srcpad = gst_pad_new ("src", GST_PAD_SRC); gst_element_add_pad (GST_ELEMENT (mngenc), mngenc->srcpad); - gst_pad_set_chain_function (mngenc->sinkpad, gst_mngenc_chain); - gst_pad_set_link_function (mngenc->sinkpad, gst_mngenc_sinklink); - - mngenc->snapshot = DEFAULT_SNAPSHOT; - mngenc->newmedia = FALSE; + gst_pad_set_chain_function (mngenc->sinkpad, gst_mng_enc_chain); + gst_pad_set_setcaps_function (mngenc->sinkpad, gst_mng_enc_sink_setcaps); } -static void -gst_mngenc_chain (GstPad * pad, GstData * _data) +static GstFlowReturn +gst_mng_enc_chain (GstPad * pad, GstBuffer * buf) { - GstBuffer *buf = GST_BUFFER (_data); GstMngEnc *mngenc; - mngenc = GST_MNGENC (gst_pad_get_parent (pad)); + mngenc = GST_MNG_ENC (gst_pad_get_parent (pad)); /* FIXME, do something here */ gst_buffer_unref (buf); gst_object_unref (mngenc); + + return GST_FLOW_NOT_SUPPORTED; } static void -gst_mngenc_get_property (GObject * object, +gst_mng_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMngEnc *mngenc; - mngenc = GST_MNGENC (object); + mngenc = GST_MNG_ENC (object); switch (prop_id) { - case ARG_SNAPSHOT: - g_value_set_boolean (value, mngenc->snapshot); - break; - case ARG_NEWMEDIA: - g_value_set_boolean (value, mngenc->newmedia); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -232,20 +181,14 @@ gst_mngenc_get_property (GObject * object, static void -gst_mngenc_set_property (GObject * object, +gst_mng_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMngEnc *mngenc; - mngenc = GST_MNGENC (object); + mngenc = GST_MNG_ENC (object); switch (prop_id) { - case ARG_SNAPSHOT: - mngenc->snapshot = g_value_get_boolean (value); - break; - case ARG_NEWMEDIA: - mngenc->newmedia = g_value_get_boolean (value); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; |