<chapter id="chapter-porting">
  <title>Porting 0.8 applications to 0.9</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.9, 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.9 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 threadsafety. 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.
        </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
          mainloop, 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.
        </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.9. In 0.9, 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 -> caps-filter.
        </para>
      </listitem>
      <listitem>
        <para>
          libgstgconf-0.9.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>
    </itemizedlist>
  </sect1>
</chapter>