static void gst_vtdec_base_init (GstVTDecClass * klass) { const GstVTDecoderDetails *codec_details = GST_VTDEC_CLASS_GET_CODEC_DETAILS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); const int min_width = 1, max_width = G_MAXINT; const int min_height = 1, max_height = G_MAXINT; const int min_fps_n = 0, max_fps_n = G_MAXINT; const int min_fps_d = 1, max_fps_d = 1; GstPadTemplate *sink_template, *src_template; GstCaps *sink_caps; gchar *longname, *description; longname = g_strdup_printf ("%s decoder", codec_details->name); description = g_strdup_printf ("%s decoder", codec_details->name); gst_element_class_set_metadata (element_class, longname, "Codec/Decoder/Video", description, "Ole André Vadla Ravnås <*****@*****.**>"); g_free (longname); g_free (description); sink_caps = gst_caps_new_simple (codec_details->mimetype, "width", GST_TYPE_INT_RANGE, min_width, max_width, "height", GST_TYPE_INT_RANGE, min_height, max_height, "framerate", GST_TYPE_FRACTION_RANGE, min_fps_n, min_fps_d, max_fps_n, max_fps_d, NULL); if (codec_details->format_id == kVTFormatH264) { gst_structure_set (gst_caps_get_structure (sink_caps, 0), "stream-format", G_TYPE_STRING, "avc", NULL); } else if (codec_details->format_id == kVTFormatMPEG2) { gst_structure_set (gst_caps_get_structure (sink_caps, 0), "mpegversion", GST_TYPE_INT_RANGE, 1, 2, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); } sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps); gst_element_class_add_pad_template (element_class, sink_template); src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, GST_VTDEC_VIDEO_FORMAT_STR, "width", GST_TYPE_INT_RANGE, min_width, max_width, "height", GST_TYPE_INT_RANGE, min_height, max_height, "framerate", GST_TYPE_FRACTION_RANGE, min_fps_n, min_fps_d, max_fps_n, max_fps_d, NULL)); gst_element_class_add_pad_template (element_class, src_template); }
static void gst_vtdec_init (GstVTDec * self) { GstVTDecClass *klass = (GstVTDecClass *) G_OBJECT_GET_CLASS (self); GstElementClass *element_klass = GST_ELEMENT_CLASS (klass); GstElement *element = GST_ELEMENT (self); self->details = GST_VTDEC_CLASS_GET_CODEC_DETAILS (klass); self->sinkpad = gst_pad_new_from_template (gst_element_class_get_pad_template (element_klass, "sink"), "sink"); gst_element_add_pad (element, self->sinkpad); gst_pad_set_event_function (self->sinkpad, gst_vtdec_sink_event); gst_pad_set_chain_function (self->sinkpad, gst_vtdec_chain); self->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (element_klass, "src"), "src"); gst_element_add_pad (element, self->srcpad); }