static GstCaps * gst_basertppayload_sink_getcaps (GstPad * pad) { GstBaseRTPPayload *basertppayload; GstBaseRTPPayloadClass *basertppayload_class; GstCaps *caps = NULL; GST_DEBUG_OBJECT (pad, "getting caps"); basertppayload = GST_BASE_RTP_PAYLOAD (gst_pad_get_parent (pad)); basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload); if (basertppayload_class->get_caps) caps = basertppayload_class->get_caps (basertppayload, pad); if (!caps) { caps = GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad)); GST_DEBUG_OBJECT (pad, "using pad template %p with caps %p %" GST_PTR_FORMAT, GST_PAD_PAD_TEMPLATE (pad), caps, caps); caps = gst_caps_ref (caps); } gst_object_unref (basertppayload); return caps; }
static void gst_vaapi_decode_bin_init (GstVaapiDecodeBin * vaapidecbin) { GstPad *pad, *ghostpad; vaapidecbin->deinterlace_method = DEFAULT_DEINTERLACE_METHOD; vaapidecbin->disable_vpp = (g_getenv ("GST_VAAPI_DISABLE_VPP") != NULL); /* create the decoder */ vaapidecbin->decoder = g_object_new (g_type_from_name ("GstVaapiDecode"), NULL); g_assert (vaapidecbin->decoder); /* create the queue */ vaapidecbin->queue = gst_element_factory_make ("queue", "vaapi-queue"); if (!vaapidecbin->queue) { g_clear_object (&vaapidecbin->decoder); post_missing_element_message (vaapidecbin, "queue"); return; } gst_bin_add_many (GST_BIN (vaapidecbin), vaapidecbin->decoder, vaapidecbin->queue, NULL); if (!gst_element_link (vaapidecbin->decoder, vaapidecbin->queue)) { g_clear_object (&vaapidecbin->decoder); g_clear_object (&vaapidecbin->queue); g_critical ("failed to link decoder and queue"); return; } /* create ghost pad sink */ pad = gst_element_get_static_pad (vaapidecbin->decoder, "sink"); ghostpad = gst_ghost_pad_new_from_template ("sink", pad, GST_PAD_PAD_TEMPLATE (pad)); gst_object_unref (pad); if (!gst_element_add_pad (GST_ELEMENT (vaapidecbin), ghostpad)) g_critical ("failed to add decoder sink pad to bin"); /* create ghost pad src */ pad = gst_element_get_static_pad (GST_ELEMENT (vaapidecbin->queue), "src"); ghostpad = gst_ghost_pad_new_from_template ("src", pad, GST_PAD_PAD_TEMPLATE (pad)); gst_object_unref (pad); if (!gst_element_add_pad (GST_ELEMENT (vaapidecbin), ghostpad)) g_critical ("failed to add queue source pad to bin"); }
static GstCaps * gst_rtp_base_payload_getcaps_default (GstRTPBasePayload * rtpbasepayload, GstPad * pad, GstCaps * filter) { GstCaps *caps; caps = GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad)); GST_DEBUG_OBJECT (pad, "using pad template %p with caps %p %" GST_PTR_FORMAT, GST_PAD_PAD_TEMPLATE (pad), caps, caps); if (filter) caps = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); else caps = gst_caps_ref (caps); return caps; }
static GstCaps * gst_jpeg_parse_src_getcaps (GstPad * pad, GstCaps * filter) { GstCaps *result; if ((result = gst_pad_get_current_caps (pad))) { GST_DEBUG_OBJECT (pad, "using pad caps %" GST_PTR_FORMAT, result); } else { result = gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad))); GST_DEBUG_OBJECT (pad, "using pad template caps %" GST_PTR_FORMAT, result); } return result; }
static GstCaps * gst_proxy_pad_do_getcaps (GstPad * pad) { GstPad *target = gst_proxy_pad_get_target (pad); GstCaps *res; GstPadTemplate *templ = GST_PAD_PAD_TEMPLATE (pad); if (target) { /* if we have a real target, proxy the call */ res = gst_pad_get_caps (target); gst_object_unref (target); GST_DEBUG_OBJECT (pad, "get caps of target: %" GST_PTR_FORMAT, res); /* filter against the template */ if (templ && res) { GstCaps *filt, *tmp; filt = GST_PAD_TEMPLATE_CAPS (templ); if (filt) { tmp = gst_caps_intersect (filt, res); gst_caps_unref (res); res = tmp; GST_DEBUG_OBJECT (pad, "filtered against template gives %" GST_PTR_FORMAT, res); } } } else { /* else, if we have a template, use its caps. */ if (templ) { res = GST_PAD_TEMPLATE_CAPS (templ); GST_DEBUG_OBJECT (pad, "using pad template %p with caps %p %" GST_PTR_FORMAT, templ, res, res); res = gst_caps_ref (res); goto done; } /* last resort, any caps */ GST_DEBUG_OBJECT (pad, "pad has no template, returning ANY"); res = gst_caps_new_any (); } done: return res; }
static void gst_vaapi_decode_bin_init (GstVaapiDecodeBin * vaapidecbin) { GstPad *element_pad, *ghost_pad; /* let's assume we have VPP until we prove the opposite */ vaapidecbin->has_vpp = TRUE; if (!gst_vaapi_decode_bin_configure (vaapidecbin)) return; /* create ghost pad sink */ element_pad = gst_element_get_static_pad (GST_ELEMENT (vaapidecbin->decoder), "sink"); ghost_pad = gst_ghost_pad_new_from_template ("sink", element_pad, GST_PAD_PAD_TEMPLATE (element_pad)); gst_object_unref (element_pad); gst_element_add_pad (GST_ELEMENT (vaapidecbin), ghost_pad); }
static gboolean gst_vaapi_decode_bin_configure (GstVaapiDecodeBin * vaapidecbin) { gchar *missing_factory = NULL; GstPad *pad, *ghostpad; GstPadTemplate *tmpl; /* create the decoder */ vaapidecbin->decoder = gst_element_factory_make ("vaapidecode", "vaapidecode"); if (!vaapidecbin->decoder) { missing_factory = "vaapidecode"; goto error_element_missing; } /* create the queue */ vaapidecbin->queue = gst_element_factory_make ("queue", "queue"); if (!vaapidecbin->queue) { missing_factory = "queue"; goto error_element_missing; } g_object_set (G_OBJECT (vaapidecbin->queue), "max-size-bytes", vaapidecbin->max_size_bytes, "max-size-buffers", vaapidecbin->max_size_buffers, "max-size-time", vaapidecbin->max_size_time, NULL); gst_bin_add_many (GST_BIN (vaapidecbin), vaapidecbin->decoder, vaapidecbin->queue, NULL); if (!gst_element_link_many (vaapidecbin->decoder, vaapidecbin->queue, NULL)) goto error_link_pad; /* create ghost pad sink */ pad = gst_element_get_static_pad (GST_ELEMENT (vaapidecbin->decoder), "sink"); ghostpad = gst_ghost_pad_new_from_template ("sink", pad, GST_PAD_PAD_TEMPLATE (pad)); gst_object_unref (pad); if (!gst_element_add_pad (GST_ELEMENT (vaapidecbin), ghostpad)) goto error_adding_pad; /* create ghost pad src */ pad = gst_element_get_static_pad (GST_ELEMENT (vaapidecbin->queue), "src"); tmpl = gst_static_pad_template_get (&gst_vaapi_decode_bin_src_factory); ghostpad = gst_ghost_pad_new_from_template ("src", pad, tmpl); gst_object_unref (pad); gst_object_unref (tmpl); if (!gst_element_add_pad (GST_ELEMENT (vaapidecbin), ghostpad)) goto error_adding_pad; return TRUE; error_element_missing: { post_missing_element_message (vaapidecbin, missing_factory); return FALSE; } error_link_pad: { GST_ELEMENT_ERROR (vaapidecbin, CORE, PAD, (NULL), ("Failed to configure the vaapidecodebin.")); return FALSE; } error_adding_pad: { GST_ELEMENT_ERROR (vaapidecbin, CORE, PAD, (NULL), ("Failed to adding pads.")); return FALSE; } }
static gboolean gst_mxf_mux_set_caps (GstMXFMux * mux, GstMXFMuxPad * pad, GstCaps * caps) { gboolean ret = TRUE; MXFUUID d_instance_uid = { {0,} }; MXFMetadataFileDescriptor *old_descriptor = pad->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); pad->descriptor = NULL; g_free (pad->mapping_data); pad->mapping_data = NULL; } pad->descriptor = pad->writer->get_descriptor (GST_PAD_PAD_TEMPLATE (pad), caps, &pad->write_func, &pad->mapping_data); if (!pad->descriptor) { GST_ERROR_OBJECT (mux, "Couldn't get descriptor for pad '%s' with caps %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps); return FALSE; } if (mxf_uuid_is_zero (&d_instance_uid)) mxf_uuid_init (&d_instance_uid, mux->metadata); memcpy (&MXF_METADATA_BASE (pad->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 = pad->descriptor; break; } } } else { mux->metadata_list = g_list_prepend (mux->metadata_list, pad->descriptor); } g_hash_table_replace (mux->metadata, &MXF_METADATA_BASE (pad->descriptor)->instance_uid, pad->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 (pad->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 (pad->descriptor); memcpy (&package->descriptor_uid, &d_instance_uid, 16); } } } } return ret; }