| <chapter id="chapter-porting"> |
| <title>Porting 0.8 applications to 0.10</title> |
| <para> |
| This section of the appendix will discuss shortly what changes to |
| applications will be needed to quickly and conveniently port most |
| applications from &GStreamer;-0.8 to &GStreamer;-0.10, with references |
| to the relevant sections in this Application Development Manual |
| where needed. With this list, it should be possible to port simple |
| applications to &GStreamer;-0.10 in less than a day. |
| </para> |
| |
| <sect1 id="section-porting-objects"> |
| <title>List of changes</title> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Most functions returning an object or an object property have |
| been changed to return its own reference rather than a constant |
| reference of the one owned by the object itself. The reason for |
| this change is primarily thread safety. This means, effectively, |
| that return values of functions such as |
| <function>gst_element_get_pad ()</function>, |
| <function>gst_pad_get_name ()</function> and many more like these |
| have to be free'ed or unreferenced after use. Check the API |
| references of each function to know for sure whether return |
| values should be free'ed or not. It is important that all objects |
| derived from GstObject are ref'ed/unref'ed using gst_object_ref() |
| and gst_object_unref() respectively (instead of g_object_ref/unref). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Applications should no longer use signal handlers to be notified |
| of errors, end-of-stream and other similar pipeline events. |
| Instead, they should use the <classname>GstBus</classname>, which |
| has been discussed in <xref linkend="chapter-bus"/>. The bus will |
| take care that the messages will be delivered in the context of a |
| main loop, which is almost certainly the application's main thread. |
| The big advantage of this is that applications no longer need to |
| be thread-aware; they don't need to use <function>g_idle_add |
| ()</function> in the signal handler and do the actual real work |
| in the idle-callback. &GStreamer; now does all that internally. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Related to this, <function>gst_bin_iterate ()</function> has been |
| removed. Pipelines will iterate in their own thread, and applications |
| can simply run a <classname>GMainLoop</classname> (or call the |
| mainloop of their UI toolkit, such as <function>gtk_main |
| ()</function>). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| State changes can be delayed (ASYNC). Due to the new fully threaded |
| nature of GStreamer-0.10, state changes are not always immediate, |
| in particular changes including the transition from READY to PAUSED |
| state. This means two things in the context of porting applications: |
| first of all, it is no longer always possible to do |
| <function>gst_element_set_state ()</function> and check for a return |
| value of GST_STATE_CHANGE_SUCCESS, as the state change might be |
| delayed (ASYNC) and the result will not be known until later. You |
| should still check for GST_STATE_CHANGE_FAILURE right away, it is |
| just no longer possible to assume that everything that is not SUCCESS |
| means failure. Secondly, state changes might not be immediate, so |
| your code needs to take that into account. You can wait for a state |
| change to complete if you use GST_CLOCK_TIME_NONE as timeout interval |
| with <function>gst_element_get_state ()</function>. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| In 0.8, events and queries had to manually be sent to sinks in |
| pipelines (unless you were using playbin). This is no longer |
| the case in 0.10. In 0.10, queries and events can be sent to |
| toplevel pipelines, and the pipeline will do the dispatching |
| internally for you. This means less bookkeeping in your |
| application. For a short code example, see <xref |
| linkend="chapter-queryevents"/>. Related, seeking is now |
| threadsafe, and your video output will show the new video |
| position's frame while seeking, providing a better user |
| experience. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| The <classname>GstThread</classname> object has been removed. |
| Applications can now simply put elements in a pipeline with |
| optionally some <quote>queue</quote> elements in between for |
| buffering, and &GStreamer; will take care of creating threads |
| internally. It is still possible to have parts of a pipeline |
| run in different threads than others, by using the |
| <quote>queue</quote> element. See <xref linkend="chapter-threads"/> |
| for details. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Filtered caps -> capsfilter element (the pipeline syntax for |
| gst-launch has not changed though). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| libgstgconf-0.10.la does not exist. Use the |
| <quote>gconfvideosink</quote> and <quote>gconfaudiosink</quote> |
| elements instead, which will do live-updates and require no library |
| linking. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| The <quote>new-pad</quote> and <quote>state-change</quote> signals on |
| <classname>GstElement</classname> were renamed to |
| <quote>pad-added</quote> and <quote>state-changed</quote>. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <function>gst_init_get_popt_table ()</function> has been removed |
| in favour of the new GOption command line option API that was |
| added to GLib 2.6. <function>gst_init_get_option_group ()</function> |
| is the new GOption-based equivalent to |
| <function>gst_init_get_ptop_table ()</function>. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </sect1> |
| </chapter> |
| <chapter id="chapter-porting-1.0"> |
| <title>Porting 0.10 applications to 1.0</title> |
| |
| <para>This section outlines some of the changes necessary to port |
| applications from &GStreamer;-0.10 to &GStreamer;-1.0. For a |
| comprehensive and up-to-date list, see the separate <ulink |
| type="http" |
| url="http://cgit.freedesktop.org/gstreamer/gstreamer/plain/docs/random/porting-to-1.0.txt"> |
| Porting to 1.0</ulink> document. |
| </para> |
| <para> |
| It should be possible to port simple applications to |
| &GStreamer;-1.0 in less than a day. |
| </para> |
| |
| <sect1 id="section-porting-objects-1.0"> |
| <title>List of changes</title> |
| <itemizedlist> |
| <listitem> |
| <para> |
| All deprecated methods were removed. Recompile against 0.10 with |
| GST_DISABLE_DEPRECATED defined (such as by adding |
| -DGST_DISABLE_DEPRECATED to the compiler flags) and fix issues |
| before attempting to port to 1.0. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| "playbin2" has been renamed to "playbin", with similar API |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| "decodebin2" has been renamed to "decodebin", with similar API. Note |
| that there is no longer a "new-decoded-pad" signal, just use GstElement's |
| "pad-added" signal instead (but don't forget to remove the 'gboolean last' |
| argument from your old signal callback functino signature). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| the names of some "formatted" pad templates has been changed from e.g. |
| "src%d" to "src%u" or "src_%u" or similar, since we don't want to see |
| negative numbers in pad names. This mostly affects applications that |
| create request pads from elements. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| some elements that used to have a single dynamic source pad have a |
| source pad now. Example: wavparse, id3demux, iceydemux, apedemux. |
| (This does not affect applications using decodebin or playbin). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| playbin now proxies the GstVideoOverlay (former GstXOverlay) interface, |
| so most applications can just remove the sync bus handler where they |
| would set the window ID, and instead just set the window ID on playbin |
| from the application thread before starting playback. |
| </para> |
| <para> |
| playbin also proxies the GstColorBalance and GstNavigation interfaces, |
| so applications that use this don't need to go fishing for elements |
| that may implement those any more, but can just use on playbin |
| unconditionally. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| multifdsink, tcpclientsink, tcpclientsrc, tcpserversrc the protocol property |
| is removed, use gdppay and gdpdepay. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| XML serialization was removed. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Probes and pad blocking was merged into new pad probes. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Position, duration and convert functions no longer use an inout parameter |
| for the destination format. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Video and audio caps were simplified. audio/x-raw-int and audio/x-raw-float |
| are now all under the audio/x-raw media type. Similarly, video/x-raw-rgb |
| and video/x-raw-yuv are now video/x-raw. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| ffmpegcolorspace was removed and replaced with videoconvert. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| GstMixerInterface / GstTunerInterface were removed without replacement. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| The GstXOverlay interface was renamed to GstVideoOverlay, and now part |
| of the video library in gst-plugins-base, as the interfaces library |
| no longer exists. |
| </para> |
| <para> |
| The name of the GstXOverlay "prepare-xwindow-id" message has changed |
| to "prepare-window-handle" (and GstXOverlay has been renamed to |
| GstVideoOverlay). Code that checks for the string directly should be |
| changed to use gst_is_video_overlay_prepare_window_handle_message(message) |
| instead. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| The GstPropertyProbe interface was removed. the is no replacement yet, |
| but a more featureful replacement for device discovery and feature |
| querying is planned, see https://bugzilla.gnome.org/show_bug.cgi?id=678402 |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| gst_uri_handler_get_uri() and the get_uri vfunc now return a copy of |
| the URI string |
| </para> |
| <para> |
| gst_uri_handler_set_uri() and the set_uri vfunc now take an additional |
| GError argument so the handler can notify the caller why it didn't |
| accept a particular URI. |
| </para> |
| <para> |
| gst_uri_handler_set_uri() now checks if the protocol of the URI passed |
| is one of the protocols advertised by the uri handler, so set_uri vfunc |
| implementations no longer need to check that as well. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| GstTagList is now an opaque mini object instead of being typedefed to a |
| GstStructure. While it was previously okay (and in some cases required because of |
| missing taglist API) to cast a GstTagList to a GstStructure or use |
| gst_structure_* API on taglists, you can no longer do that. Doing so will |
| cause crashes. |
| </para> |
| <para> |
| Also, tag lists are refcounted now, and can therefore not be freely |
| modified any longer. Make sure to call gst_tag_list_make_writable (taglist) |
| before adding, removing or changing tags in the taglist. |
| </para> |
| <para> |
| GST_TAG_IMAGE, GST_TAG_PREVIEW_IMAGE, GST_TAG_ATTACHMENT: many tags that |
| used to be of type GstBuffer are now of type GstSample (which is basically |
| a struct containing a buffer alongside caps and some other info). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| GstController has now been merged into GstObject. It does not exists as an |
| individual object anymore. In addition core contains a GstControlSource base |
| class and the GstControlBinding. The actual control sources are in the controller |
| library as before. The 2nd big change is that control sources generate |
| a sequence of gdouble values and those are mapped to the property type and |
| value range by GstControlBindings. |
| </para> |
| <para> |
| The whole gst_controller_* API is gone and now available in simplified form |
| under gst_object_*. ControlSources are now attached via GstControlBinding |
| to properties. There are no GValue arguments used anymore when programming |
| control sources. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </sect1> |
| </chapter> |