[gst-devel] dynamic change element's parameter

Chandler Li lichandler116 at gmail.com
Tue Sep 14 15:37:02 CEST 2010


Thank you,
I paste the key point code to there,

the old one caps:
               caps1 = gst_caps_new_simple ("video/x-raw-yuv",
  	      "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
	      "width", G_TYPE_INT, 123,
	      "height", G_TYPE_INT, 456,
	      "framerate", GST_TYPE_FRACTION, 30, 1,
	      NULL);
the new one caps:
              caps2 = gst_caps_new_simple ("video/x-raw-yuv",
  	      "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
	      "width", G_TYPE_INT, 456,
	      "height", G_TYPE_INT, 789,
	      "framerate", GST_TYPE_FRACTION, 30, 1,
	      NULL);
and the folowing code change caps:
                gst_pad_set_blocked_async(pad,TRUE,my_blocked_callback,NULL);
		gst_element_set_state(GST_ELEMENT(capsfilter2), GST_STATE_NULL);
		g_object_set (G_OBJECT (capsfilter2), "caps",caps2,NULL);
		gst_element_set_state(GST_ELEMENT(capsfilter2), GST_STATE_PLAYING);
		gst_pad_set_blocked_async(pad,FALSE,my_blocked_callback,NULL);

First, I block the videoscale's src pad. Then turn the the element
capsfilter2 to NULL , give it new caps with different width and
height.
After that, I turn the element capsfilter2 to PLAYING, and unblock the
videoscale's src pad.

after doing these, I get wrong message
               ** ERROR **: Internal data flow error.
               aborting...

But if I let the caps2's format same with caps1:
              caps2 = gst_caps_new_simple ("video/x-raw-yuv",
  	      "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
	      "width", G_TYPE_INT, 123,
	      "height", G_TYPE_INT, 456,
	      "framerate", GST_TYPE_FRACTION, 30, 1,
	      NULL);

The streaming still works. It's really strange.
I think it's because of the videoscale problem.
Did I lose any detail in the code?

Thank you!
Best regards,
Chandler Lee.

2010/9/14 Stefan Kost <ensonic at hora-obscura.de>:
> On 14.09.2010 10:48, Chandler Li wrote:
>> I have read the mail Nicola and Stefan given, and that really inspired
>> me a lot.
>> Thank you!
>> In the first, I try to replace some elements and encounter some
>> problem, the following I will show my target first.
>> Because I want to stream webcam frame on the internet,
>> and dynamically change the frame size without stopping the pipeline.
>>
>> According to my experience, if the v4l2src element opens webcam
>> device, it only captures one size at one time.
>> if I want to change the size of webcam, I need to restart it.
>>
>
> v4l2src does not support changing the resolution on the fly. This is a
> v4l2 interface limitation right now - one needs to stop streaming, set
> new format and restart streaming. So your observation is correct.
>
>> So I try another architecture of gstreamer,
>>
>>     v4l2src  ->  capsfilter1  ->  videoscale -> capsfilter2  ->
>> ffmpegcolorspace ->   .... (to internet)
>>
>> videoscale links two filters, the first filter (capsfilter1)
>> negotiates with v4l2src in a static frame size,
>> I want to change the size I assigned in the second filter (capsfilter2) ,
>>
>> BUT I get an error message after I change the capsfilter2 to the new filter,
>>
>>     videoscale can't link to new capsfilter,
>>
>
> that should work. Can you paste a few lines of the code here. You should
> create new caps and just set the new format on capsfilter2.
>
> Stefan
>> I don't know what's happened? does anyone know that?
>> Thank you!
>>
>> Best regards,
>> Chandler Lee.
>>
>> 2010/9/14 Stefan Kost <ensonic at hora-obscura.de>:
>>
>>> Am 12.09.2010 09:01, schrieb Chandler Li:
>>>
>>>> Hi all,
>>>>     I'm new to use gstreamer,
>>>>     and I have a problem don't know how to solve for a long time,
>>>>
>>>>     Is there possible to dynamic change the parameter in elements or pads?
>>>>
>>> gobject parameters -> g_object_set or use GstController
>>>
>>>
>>>
>>>>     For example,
>>>>     In a playing state streaming,
>>>>     could I dynamic change the size of video without stop the streaming?
>>>>
>>> yes you can. if you resize the video window for xvimagesink the video adjusts if
>>> it can. So if you run gst-launch videotestsrc ! xvimagesink, the videotest is
>>> sending videoframes in the native resolution instead of xvimagesink scaling them.
>>>
>>> Stefan
>>>
>>>
>>>>     hopes that's not a stupid question,
>>>>     and very hopefully for your reply,
>>>>     Thank you
>>>>
>>>>     Chandler Lee
>>>>
>>>> ------------------------------------------------------------------------------
>>>> Start uncovering the many advantages of virtual appliances
>>>> and start using them to simplify application deployment and
>>>> accelerate your shift to cloud computing
>>>> http://p.sf.net/sfu/novell-sfdev2dev
>>>> _______________________________________________
>>>> gstreamer-devel mailing list
>>>> gstreamer-devel at lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>>>>
>>>
>>>
>
>




More information about the gstreamer-devel mailing list