From: Ryan N. <wxp...@co...> - 2006-02-08 04:31:41
|
It's that time again - I've updated for 0.10 and have some notes here that will hopefully aid future implementors.... 1) "desired-size-changed" from GstXOverlay is gone and is essentailly replaced by "notify::stream-info" in playbin (only 0.8-->0.10 change I'm mentioning, mostly because the docs are hard to find for this...) also in terms of type for the video pad my check that seems to work the best for both 0.8 and 0.10 is if (!strncasecmp(val->value_name, "video", 5) || !strncmp(val->value_name, "GST_STREAM_TYPE_VIDEO", 21)) 2) Unfortunately there are some implementation issues with async callbacks and GstBus (i.e. gst_bus_add_watch) in that often the async handler won't get called when it should and gets bottled up the queue, so calling the async callback in the sync callback "fixes" this ok, however it requires careful thread safety... (also do not return ASYNC at all from the sync handler as it can lock up the application quite easily) 3) As for GstXOverlay, even though it recommends you use sync handler for setting the XWindow id of it that often doesn't get called - the best thing to do that works in my testing is just to set it both in the sync handler and right after you get the xoverlay from the videosink 4) If you want to have syncronous state changes you are going to run into problems - and there are basically three ways: 4a)gst_element_get_state with a timeout 4b)gst_bus_poll 4c)custom In my testing gst_bus_poll unfortunately shows "critical warnings" in normal operation (i.e. timeout expired) and in such I found the best way was to have a somewhat simple custom implementation if(gst_bus_have_pending(bus) == FALSE) { if(llTimeWaited >= llTimeout) return true; //Reached timeout... assume success llTimeWaited += 10*GST_MSECOND; wxMilliSleep(10); //Sleep for 10 milliseconds continue; } message = gst_bus_pop(bus); Which seems to work better then the other two possibilities Good work on the 0.10 API guys! Ryan |