gst_element_set_state question
Jorge Fernandez Monteagudo
jorgefm at cirsa.com
Tue Apr 4 12:35:08 UTC 2017
Hi!
Thanks for your answer! And is there any way to check if the state change has hit an error? Maybe capturing the
'GST_MESSAGE_ERROR' event? I supposse I have to wait until the pipeline has change its state, isn't it?
________________________________
De: gstreamer-devel <gstreamer-devel-bounces at lists.freedesktop.org> en nombre de Thornton, Keith <keith.thornton at zeiss.com>
Enviado: martes, 4 de abril de 2017 14:30:31
Para: Discussion of the development of and with GStreamer
Asunto: AW: gst_element_set_state question
Hi, you should create a listener for the message bus. Every element posts its state changed message on the bus. When complete, the pipeline also posts a state changed message on the bus. There are examples in the user manual
Von: gstreamer-devel [mailto:gstreamer-devel-bounces at lists.freedesktop.org] Im Auftrag von Jorge Fernandez Monteagudo
Gesendet: Dienstag, 4. April 2017 12:59
An: gstreamer-devel at lists.freedesktop.org
Betreff: gst_element_set_state question
Hi all!
I would like to know what the correct way to wait for a state change in gstreamer.
I'm using a typical code doing a polling after the 'gst_element_set_state' call but
sometimes, with the machine under a heavy load, I get a timeout but gstreamer
is still working and finally changes the state.
Is there a better way? Is it possible to wait without timeout and look for some
error trying to change the state? What timeout is considered safe?
The code waiting for a state change with a 10 seconds timeout
bool poll_for_state_change( GstState new_state )
{
GTimeVal tfthen, tfnow;
GstClockTimeDiff diff;
GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
GstState current;
gint32 timeescap = 0;
gst_element_get_state( pipeline, ¤t, NULL, GST_SECOND );
printf( "%s - change state from %s to %s\n",
__FUNCTION__, gst_element_state_get_name( current ),
gst_element_state_get_name( new_state ) );
if( current == new_state )
return true;
g_get_current_time( &tfthen );
result = gst_element_set_state( pipeline, new_state );
if( result == GST_STATE_CHANGE_FAILURE )
return false;
while( 1 ) {
gst_element_get_state( pipeline, ¤t, NULL, GST_SECOND );
g_get_current_time( &tfnow );
diff = GST_TIMEVAL_TO_TIME( tfnow ) - GST_TIMEVAL_TO_TIME( tfthen );
diff /= (1000 * 1000);
timeescap = (unsigned int) diff;
if( new_state == current )
break;
if( timeescap > 10000 ) {
printf( "%s - Time out in state transferring from %s to %s\n",
__FUNCTION__, gst_element_state_get_name( current ),
gst_element_state_get_name( new_state ) );
return false;
}
}
return true;
}
Thanks!
Jorge
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20170404/08b2a2d8/attachment-0001.html>
More information about the gstreamer-devel
mailing list