<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>
