autovideoconvert: Add autoconvert child before chaining up to parent state change function
...and remove/unlink autoconvert child when going back to NULL.
This commit is contained in:
parent
0df8460419
commit
530eca9984
@ -166,16 +166,25 @@ gst_auto_video_convert_class_init (GstAutoVideoConvertClass * klass)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
gst_auto_video_convert_add_autoconvert (GstAutoVideoConvert * autovideoconvert)
|
gst_auto_video_convert_add_autoconvert (GstAutoVideoConvert * autovideoconvert)
|
||||||
{
|
{
|
||||||
GstPad *pad;
|
GstPad *pad;
|
||||||
|
|
||||||
|
if (autovideoconvert->autoconvert)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
autovideoconvert->autoconvert =
|
autovideoconvert->autoconvert =
|
||||||
gst_element_factory_make ("autoconvert", "autoconvertchild");
|
gst_element_factory_make ("autoconvert", "autoconvertchild");
|
||||||
|
if (!autovideoconvert->autoconvert) {
|
||||||
|
GST_ERROR_OBJECT (autovideoconvert,
|
||||||
|
"Could not create autoconvert instance");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* first add autoconvert in bin */
|
/* first add autoconvert in bin */
|
||||||
gst_bin_add (GST_BIN (autovideoconvert), autovideoconvert->autoconvert);
|
gst_bin_add (GST_BIN (autovideoconvert),
|
||||||
|
gst_object_ref (autovideoconvert->autoconvert));
|
||||||
|
|
||||||
/* get sinkpad and link it to ghost sink pad */
|
/* get sinkpad and link it to ghost sink pad */
|
||||||
pad = gst_element_get_static_pad (autovideoconvert->autoconvert, "sink");
|
pad = gst_element_get_static_pad (autovideoconvert->autoconvert, "sink");
|
||||||
@ -187,6 +196,25 @@ gst_auto_video_convert_add_autoconvert (GstAutoVideoConvert * autovideoconvert)
|
|||||||
pad = gst_element_get_static_pad (autovideoconvert->autoconvert, "src");
|
pad = gst_element_get_static_pad (autovideoconvert->autoconvert, "src");
|
||||||
gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (autovideoconvert->srcpad), pad);
|
gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (autovideoconvert->srcpad), pad);
|
||||||
gst_object_unref (pad);
|
gst_object_unref (pad);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_auto_video_convert_remove_autoconvert (GstAutoVideoConvert *
|
||||||
|
autovideoconvert)
|
||||||
|
{
|
||||||
|
if (!autovideoconvert->autoconvert)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (autovideoconvert->srcpad),
|
||||||
|
NULL);
|
||||||
|
gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (autovideoconvert->sinkpad),
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
gst_bin_remove (GST_BIN (autovideoconvert), autovideoconvert->autoconvert);
|
||||||
|
gst_object_unref (autovideoconvert->autoconvert);
|
||||||
|
autovideoconvert->autoconvert = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -221,23 +249,34 @@ gst_auto_video_convert_change_state (GstElement * element,
|
|||||||
GstAutoVideoConvert *autovideoconvert = GST_AUTO_VIDEO_CONVERT (element);
|
GstAutoVideoConvert *autovideoconvert = GST_AUTO_VIDEO_CONVERT (element);
|
||||||
GstStateChangeReturn ret;
|
GstStateChangeReturn ret;
|
||||||
|
|
||||||
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
|
||||||
if (ret == GST_STATE_CHANGE_FAILURE)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
{
|
{
|
||||||
/* create and add autoconvert in bin */
|
/* create and add autoconvert in bin */
|
||||||
gst_auto_video_convert_add_autoconvert (autovideoconvert);
|
if (!gst_auto_video_convert_add_autoconvert (autovideoconvert)) {
|
||||||
|
ret = GST_STATE_CHANGE_FAILURE;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
/* get an updated list of factories */
|
/* get an updated list of factories */
|
||||||
gst_auto_video_convert_update_factory_list (autovideoconvert);
|
gst_auto_video_convert_update_factory_list (autovideoconvert);
|
||||||
GST_DEBUG_OBJECT (autovideoconvert, "set factories list");
|
GST_DEBUG_OBJECT (autovideoconvert, "set factories list");
|
||||||
/* give factory list to autoconvert */
|
/* give factory list to autoconvert */
|
||||||
g_object_set (GST_ELEMENT (autovideoconvert->autoconvert), "factories",
|
g_object_set (GST_ELEMENT (autovideoconvert->autoconvert), "factories",
|
||||||
factories, NULL);
|
factories, NULL);
|
||||||
/* synchronize autoconvert state with parent state */
|
break;
|
||||||
gst_element_sync_state_with_parent (autovideoconvert->autoconvert);
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
||||||
|
if (ret == GST_STATE_CHANGE_FAILURE)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
switch (transition) {
|
||||||
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
|
{
|
||||||
|
gst_auto_video_convert_remove_autoconvert (autovideoconvert);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user