create_element (const gchar * factory_name, GstElement ** element,
GError ** err);
+static GstElement *get_encoder (GstCaps * caps);
+
GstBuffer *
gst_play_sink_convert_frame (GstElement * playsink, GstCaps * caps)
{
return FALSE;
}
-/* takes ownership of the input buffer */
-GstBuffer *
-gst_play_frame_conv_convert (GstBuffer * buf, GstCaps * to_caps)
+GstElement *
+get_encoder (GstCaps * caps)
{
- GstElement *src, *csp, *vscale, *sink, *encoder, *pipeline;
- GstMessage *msg;
- GstBuffer *result = NULL;
- GError *error = NULL;
- GstBus *bus;
- GstCaps *from_caps;
- GstFlowReturn ret;
GValueArray *encoders = NULL;
GValueArray *filtered = NULL;
GValue *factory_value = NULL;
GstElementFactory *factory = NULL;
+ GstElement *encoder;
encoders =
gst_factory_list_get_elements (GST_FACTORY_LIST_ENCODER |
GST_INFO ("got factory list %p", encoders);
gst_factory_list_debug (encoders);
if (!(encoders && encoders->n_values))
- goto no_encoder;
+ goto fail;
- filtered = gst_factory_list_filter (encoders, to_caps, GST_PAD_SRC, FALSE);
+ filtered = gst_factory_list_filter (encoders, caps, GST_PAD_SRC, FALSE);
GST_INFO ("got filtered list %p", filtered);
gst_factory_list_debug (filtered);
if (!(filtered && filtered->n_values))
- goto no_encoder;
+ goto fail;
factory_value = g_value_array_get_nth (filtered, 0);
factory = (GstElementFactory *) g_value_get_object (factory_value);
GST_INFO ("got factory %p", factory);
if (!factory)
- goto no_encoder;
+ goto fail;
+ encoder = gst_element_factory_create (factory, NULL);
+
+ GST_INFO ("created encoder element %p, %s", encoder,
+ gst_element_get_name (encoder));
+
+ if (!encoder)
+ goto fail;
g_value_array_free (filtered);
g_value_array_free (encoders);
+ gst_object_unref (factory);
- encoder = gst_element_factory_create (factory, NULL);
+ return encoder;
- GST_INFO ("created encoder element %p, %s", encoder,
- gst_element_get_name (encoder));
+fail:
+ if (encoders)
+ g_value_array_free (encoders);
+ if (filtered)
+ g_value_array_free (filtered);
+ if (factory)
+ gst_object_unref (factory);
+
+ return NULL;
+}
+
+/* takes ownership of the input buffer */
+GstBuffer *
+gst_play_frame_conv_convert (GstBuffer * buf, GstCaps * to_caps)
+{
+ GstElement *src, *csp, *vscale, *sink, *encoder, *pipeline;
+ GstMessage *msg;
+ GstBuffer *result = NULL;
+ GError *error = NULL;
+ GstBus *bus;
+ GstCaps *from_caps;
+ GstFlowReturn ret;
+ encoder = get_encoder (to_caps);
if (!encoder)
goto no_encoder;
no_encoder:
{
g_warning ("could not find an encoder for provided caps");
- if (encoders)
- g_value_array_free (encoders);
- if (filtered)
- g_value_array_free (encoders);
return NULL;
}
no_elements: