static gboolean gst_mxf_mux_handle_sink_event (GstPad * pad, GstEvent * event) { GstMXFMux *mux = GST_MXF_MUX (gst_pad_get_parent (pad)); gboolean ret = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG: /* TODO: do something with the tags */ break; case GST_EVENT_NEWSEGMENT: /* We don't support NEWSEGMENT events */ ret = FALSE; gst_event_unref (event); break; default: break; } /* now GstCollectPads can take care of the rest, e.g. EOS */ if (ret) ret = mux->collect_event (pad, event); gst_object_unref (mux); return ret; }
static gboolean gst_mxf_mux_sink_event (GstAggregator * aggregator, GstAggregatorPad * aggpad, GstEvent * event) { GstMXFMux *mux = GST_MXF_MUX (aggregator); gboolean ret = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG: /* TODO: do something with the tags */ break; case GST_EVENT_CAPS:{ GstCaps *caps; gst_event_parse_caps (event, &caps); ret = gst_mxf_mux_set_caps (mux, GST_MXF_MUX_PAD (aggpad), caps); break; } default: break; } /* now GstAggregator can take care of the rest, e.g. EOS */ if (ret) ret = GST_AGGREGATOR_CLASS (parent_class)->sink_event (aggregator, aggpad, event); return ret; }
static GstPad * gst_mxf_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * pad_name) { GstMXFMux *mux = GST_MXF_MUX (element); GstMXFMuxPad *cpad; GstPad *pad = NULL; guint pad_number; gchar *name = NULL; const MXFEssenceElementWriter *writer; if (mux->state != GST_MXF_MUX_STATE_HEADER) { GST_WARNING_OBJECT (mux, "Can't request pads after writing header"); return NULL; } writer = mxf_essence_element_writer_find (templ); if (!writer) { GST_ERROR_OBJECT (mux, "Not our template"); return NULL; } pad_number = g_atomic_int_exchange_and_add ((gint *) & mux->n_pads, 1); name = gst_mxf_mux_create_pad_name (templ, pad_number); GST_DEBUG_OBJECT (mux, "Creating pad '%s'", name); pad = gst_pad_new_from_template (templ, name); g_free (name); cpad = (GstMXFMuxPad *) gst_collect_pads_add_pad (mux->collect, pad, sizeof (GstMXFMuxPad)); cpad->last_timestamp = 0; cpad->adapter = gst_adapter_new (); cpad->writer = writer; /* FIXME: hacked way to override/extend the event function of * GstCollectPads; because it sets its own event function giving the * element no access to events. */ mux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (pad); gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_mxf_mux_handle_sink_event)); gst_pad_set_setcaps_function (pad, gst_mxf_mux_setcaps); gst_pad_use_fixed_caps (pad); gst_pad_set_active (pad, TRUE); gst_element_add_pad (element, pad); return pad; }
static void gst_mxf_mux_finalize (GObject * object) { GstMXFMux *mux = GST_MXF_MUX (object); gst_mxf_mux_reset (mux); if (mux->metadata) { g_hash_table_destroy (mux->metadata); mux->metadata = NULL; g_list_free (mux->metadata_list); mux->metadata_list = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); }
static GstPad * gst_mxf_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * pad_name, const GstCaps * caps) { GstMXFMux *mux = GST_MXF_MUX (element); GstMXFMuxPad *cpad; GstPad *pad = NULL; guint pad_number; gchar *name = NULL; const MXFEssenceElementWriter *writer; if (mux->state != GST_MXF_MUX_STATE_HEADER) { GST_WARNING_OBJECT (mux, "Can't request pads after writing header"); return NULL; } writer = mxf_essence_element_writer_find (templ); if (!writer) { GST_ERROR_OBJECT (mux, "Not our template"); return NULL; } pad_number = g_atomic_int_add ((gint *) & mux->n_pads, 1); name = gst_mxf_mux_create_pad_name (templ, pad_number); GST_DEBUG_OBJECT (mux, "Creating pad '%s'", name); pad = gst_pad_new_from_template (templ, name); g_free (name); cpad = (GstMXFMuxPad *) gst_collect_pads_add_pad (mux->collect, pad, sizeof (GstMXFMuxPad), NULL, TRUE); cpad->last_timestamp = 0; cpad->adapter = gst_adapter_new (); cpad->writer = writer; gst_pad_use_fixed_caps (pad); gst_pad_set_active (pad, TRUE); gst_element_add_pad (element, pad); return pad; }
static GstAggregatorPad * gst_mxf_mux_create_new_pad (GstAggregator * aggregator, GstPadTemplate * templ, const gchar * pad_name, const GstCaps * caps) { GstMXFMux *mux = GST_MXF_MUX (aggregator); GstMXFMuxPad *pad; guint pad_number; gchar *name = NULL; const MXFEssenceElementWriter *writer; if (mux->state != GST_MXF_MUX_STATE_HEADER) { GST_WARNING_OBJECT (mux, "Can't request pads after writing header"); return NULL; } writer = mxf_essence_element_writer_find (templ); if (!writer) { GST_ERROR_OBJECT (mux, "Not our template"); return NULL; } pad_number = g_atomic_int_add ((gint *) & mux->n_pads, 1); name = gst_mxf_mux_create_pad_name (templ, pad_number); GST_DEBUG_OBJECT (mux, "Creating pad '%s'", name); pad = g_object_new (GST_TYPE_MXF_MUX_PAD, "name", name, "direction", GST_PAD_SINK, "template", templ, NULL); g_free (name); pad->last_timestamp = 0; pad->adapter = gst_adapter_new (); pad->writer = writer; gst_pad_use_fixed_caps (GST_PAD_CAST (pad)); return GST_AGGREGATOR_PAD (pad); }
static gboolean gst_mxf_mux_setcaps (GstPad * pad, GstCaps * caps) { GstMXFMux *mux = GST_MXF_MUX (gst_pad_get_parent (pad)); GstMXFMuxPad *cpad = (GstMXFMuxPad *) gst_pad_get_element_private (pad); gboolean ret = TRUE; MXFUUID d_instance_uid = { {0,} }; MXFMetadataFileDescriptor *old_descriptor = cpad->descriptor; GList *l; GST_DEBUG_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, caps); if (old_descriptor) { memcpy (&d_instance_uid, &MXF_METADATA_BASE (old_descriptor)->instance_uid, 16); cpad->descriptor = NULL; g_free (cpad->mapping_data); cpad->mapping_data = NULL; } cpad->descriptor = cpad->writer->get_descriptor (gst_pad_get_pad_template (pad), caps, &cpad->write_func, &cpad->mapping_data); if (!cpad->descriptor) { GST_ERROR_OBJECT (mux, "Couldn't get descriptor for pad '%s' with caps %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps); gst_object_unref (mux); return FALSE; } if (mxf_uuid_is_zero (&d_instance_uid)) mxf_uuid_init (&d_instance_uid, mux->metadata); memcpy (&MXF_METADATA_BASE (cpad->descriptor)->instance_uid, &d_instance_uid, 16); if (old_descriptor) { for (l = mux->metadata_list; l; l = l->next) { MXFMetadataBase *tmp = l->data; if (mxf_uuid_is_equal (&d_instance_uid, &tmp->instance_uid)) { l->data = cpad->descriptor; break; } } } else { mux->metadata_list = g_list_prepend (mux->metadata_list, cpad->descriptor); } g_hash_table_replace (mux->metadata, &MXF_METADATA_BASE (cpad->descriptor)->instance_uid, cpad->descriptor); if (old_descriptor) { if (mux->preface && mux->preface->content_storage && mux->preface->content_storage->packages) { guint i, j; for (i = 0; i < mux->preface->content_storage->n_packages; i++) { MXFMetadataSourcePackage *package; if (!MXF_IS_METADATA_SOURCE_PACKAGE (mux->preface->content_storage-> packages[i])) continue; package = MXF_METADATA_SOURCE_PACKAGE (mux->preface->content_storage-> packages[i]); if (!package->descriptor) continue; if (MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (package->descriptor)) { MXFMetadataMultipleDescriptor *tmp = MXF_METADATA_MULTIPLE_DESCRIPTOR (package->descriptor); for (j = 0; j < tmp->n_sub_descriptors; j++) { if (tmp->sub_descriptors[j] == MXF_METADATA_GENERIC_DESCRIPTOR (old_descriptor)) { tmp->sub_descriptors[j] = MXF_METADATA_GENERIC_DESCRIPTOR (cpad->descriptor); memcpy (&tmp->sub_descriptors_uids[j], &d_instance_uid, 16); } } } else if (package->descriptor == MXF_METADATA_GENERIC_DESCRIPTOR (old_descriptor)) { package->descriptor = MXF_METADATA_GENERIC_DESCRIPTOR (cpad->descriptor); memcpy (&package->descriptor_uid, &d_instance_uid, 16); } } } } gst_object_unref (mux); return ret; }