GStreamer 0.10 to 1.0 porting guide
-----------------------------------

PREFACE

* All deprecated methods were removed. Recompile against 0.10 with
  DISABLE_DEPRECATED and fix issues before attempting to port to 1.0.

* API changes are usually easy to spot, because the compiler will
  generate a warning, at least if number of arguments or types differ

* Other changes are a bit more subtle. See checklist at the bottom
  for some "soft" changes which the compiler will not warn about.

* python developers may find https://wiki.ubuntu.com/Novacut/GStreamer1.0
  useful

* application developers may first want to have a look at the list of changes
  affecting applications in the Application Development Manual:
  http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-porting-1.0.html


CHANGES

* GST_BOILERPLATE is gone, use G_DEFINE_TYPE instead (note that the variable
  that used to be called parent_class is then called gst_foo_bar_parent_class)

* various methods take a gsize instead of a guint when talking about memory
  sizes.

* multifdsink, tcpclientsink, tcpclientsrc, tcpserversrc the protocol property
  is removed, use gdppay and gdpdepay.

* Presets and plugins moved to $XDG_DATA_HOME/gstreamer-1.0/ root
  directory. Registry moved to $XDG_CACHE_HOME/gstreamer-1.0/.
  XDG_CACHE_HOME usually points to $HOME/.cache and XDG_DATA_HOME
  usually is $HOME/.local/share/.

* GstObject:
    GST_OBJECT_DISPOSING flag removed
    GST_OBJECT_IS_DISPOSING removed
    GST_OBJECT_FLOATING flag remove, GstObject is now GInitiallyUnowned
    GST_OBJECT_IS_FLOATING removed, use g_object_is_floating()

    GST_CLASS_GET_LOCK, GST_CLASS_LOCK, GST_CLASS_TRYLOCK, GST_CLASS_UNLOCK,
    used to be a workaround for thread-unsafe glib < 2.8

    gst_object_ref_sink() has gpointer as result to make it more like the
    GObject version.

    gst_object_sink() removed, use gst_object_ref_sink() instead.

    gst_class_signal_connect() removed, was only used for XML

    parent-set and parent-unset signals removed. Use notify:parent. Currently
    still disabled because of deep notify locking issues.

* GstElement:
    GstElementDetails is removed and replaced with more generic metadata.

    gst_element_class_set_details_simple() -> gst_element_class_set_metadata()
    gst_element_class_set_documentation_uri -> gst_element_class_add_metadata
    gst_element_class_set_icon_name -> gst_element_class_add_metadata
    also gst_element_class_get_metadata()

    gst_element_factory_get_longname -> gst_element_factory_get_metadata
    gst_element_factory_get_klass -> gst_element_factory_get_metadata
    gst_element_factory_get_description -> gst_element_factory_get_metadata
    gst_element_factory_get_author -> gst_element_factory_get_metadata
    gst_element_factory_get_documentation_uri -> gst_element_factory_get_metadata
    gst_element_factory_get_icon_name -> gst_element_factory_get_metadata

    gstelementmetadata.h contains the keys for all standard metadata.

    gst_element_factory_can_{src,sink}_caps() => gst_element_factory_can_{src,sink}_{any,all}_caps()

    Element metadata and pad templates are inherited from parent classes and
    should be added in class_init instead of base_init.

    gst_element_class_add_pad_template() takes ownership of the template

    gst_element_class_add_static_pad_template (element_class, &src_template)
      => gst_element_class_add_pad_template (element_class,
             gst_static_pad_template_get (&src_template));

    Elements that change the duration must post DURATION messages on the
    bus when the duration changes in PAUSED or PLAYING.

    gst_element_lost_state_full() -> gst_element_lost_state()
    gst_element_lost_state() -> gst_element_lost_state(, TRUE)

    request_new_pad_full() -> request_new_pad()

    gst_element_found_tags() and gst_element_found_tags_for_pad() are gone, just
    push the tag event.

* GstPad:
    gst_pad_get_caps() was replaced by gst_pad_query_caps(), it
    does not return writable caps anymore and an explicit
    gst_caps_make_writable() needs to be performed. This was the functionality
    of gst_pad_get_caps_reffed(), which is removed now.

    A similar change was done for gst_pad_peer_get_caps() and
    gst_pad_peer_get_caps_reffed()

    gst_pad_set_bufferalloc_function(), gst_pad_alloc_buffer() and
    gst_pad_alloc_buffer_and_set_caps() are removed. Use the ALLOCATION query
    now when negotiating formats to obtain a reference to a bufferpool object
    that can be used to allocate buffers using gst_buffer_pool_acquire_buffer().

    gst_pad_set_setcaps_function() => GST_EVENT_CAPS in event handler

    gst_pad_set_getcaps_function() => GST_QUERY_CAPS in query handler

    gst_pad_set_acceptcaps_function() => GST_QUERY_ACCEPT_CAPS in query handler

    removed sched_private, it should not be used, use g_object_set_qdata() or
    use element_private.

    Removed GST_PAD_CAPS() use gst_pad_get_current_caps() to get a handle to the
    currently configured caps.

    gst_pad_get_pad_template_caps() and gst_pad_get_pad_template()
    return a new reference of the caps or template now and the return
    value needs to be unreffed after usage.

    gst_pad_set_caps() now pushes a CAPS event for backward compatibility.
    Consider sending the CAPS event yourself. It is not possible anymore to set
    NULL caps.

    gst_pad_set_checkgetrange_function() and gst_pad_check_pull_range() are
    gone, use the SCHEDULING query now.

    gst_pad_set_blocked(), gst_pad_set_blocked_async(),
    gst_pad_set_blocked_async_full() are removed, use the gst_pad_add_probe()
    method with the GST_PAD_PROBE_TYPE_BLOCK to get the same result as the async
    blocking version. There is no more sync version of blocking, this is in
    general dangerous and can be implemented using the callbacks if needed.

    gst_pad_add_data_probe(), gst_pad_add_data_probe_full(),
    gst_pad_remove_data_probe(), gst_pad_add_event_probe(),
    gst_pad_add_event_probe_full(), gst_pad_remove_event_probe(),
    gst_pad_add_buffer_probe(), gst_pad_add_buffer_probe_full(),
    gst_pad_remove_buffer_probe() are removed. Use gst_pad_add_probe() and
    gst_pad_remove_probe() for equivalent functionality.

    The have-data signal was removed from pads, it was never supposed to be used
    without calling the _add_.*_probe() methods.

    The request-link signal was removed. It was never used.

    gst_pad_get_negotiated_caps() -> gst_pad_get_current_caps()

    GST_FLOW_UNEXPECTED -> GST_FLOW_EOS

    GST_FLOW_WRONG_STATE -> GST_FLOW_FLUSHING

    GstActivateMode -> GstPadMode, GST_ACTIVATE_* -> GST_PAD_MODE_*
    gst_pad_activate_{pull,push}() -> gst_pad_activate_mode()

    The GstPadAcceptCapsFunction was removed and replaced with a
    GST_QUERY_ACCEPT_CAPS query.

    The GstPadFixateCapsFunction was removed. It has no replacement, you can
    simply do the fixation in the element or use a vmethod from the base class
    if appropriate.

    The GstPadGetCapsFunction was removed and replaced with a GST_QUERY_CAPS
    query. The query takes a GstCaps* parameter to inform the other side about
    the possible caps and preferences.  

    gst_pad_proxy_getcaps() -> gst_pad_proxy_query_caps()
    gst_pad_get_caps() -> gst_pad_query_caps()
    gst_pad_peer_get_caps() -> gst_pad_peer_query_caps()
    gst_pad_accept_caps() -> gst_pad_query_accept_caps()
    gst_pad_peer_accept_caps() -> gst_pad_peer_query_accept_caps()
    gst_pad_query_peer_*() -> gst_pad_peer_query_*()

    GstPadFlags: GST_PAD_* -> GST_PAD_FLAG_*

* GstPadTemplate
    gst_pad_template_get_caps() returns a new reference of the caps
    and the return value needs to be unreffed after usage.

    gst_pad_template_new() does not take ownership of the caps anymore.

    GstPadTemplate is now created with a floating ref and
    gst_element_class_add_pad_template() takes ownership of this floating ref.

    GstPadTemplate instances are considered immutable and must not be
    changed.

* GstMiniObject
    A miniobject is now a simple refcounted structure holding the information
    common to buffers, events, messages, queries and caps.

    There is no more GST_TYPE_MINIOBJECT as the type for subclasses.
    G_TYPE_BOXED can be used as the type of all GstMiniObject based types such
    as buffers, events, messages, caps, etc. Signals, for example, would use the
    boxed type if the argument include GstMiniObject derived types.

    gst_mini_object_new() is removed. You would allocate memory with the
    methods specific for the derived type.

    GstParamSpecMiniObject is removed, use boxed param spec now with the GType
    of the specific GstMiniObject derived type. Also
    gst_param_spec_mini_object().

    gst_param_spec_mini_object() -> g_param_spec_boxed()

    The specific gst_value_*_mini_object() methods are removed, used the generic
    boxed methods instead.

    gst_value_set_mini_object() -> g_value_set_boxed()
    gst_value_take_mini_object() -> g_value_take_boxed()
    gst_value_take_get_object() -> g_value_get_boxed()
    gst_value_take_dup_object() -> g_value_dup_boxed()

    GST_VALUE_HOLDS_MINI_OBJECT() was removed, use G_VALUE_HOLDS_BOXED() or
    type-specific GST_VALUE_HOLDS_{BUFFER,CAPS,etc.}() instead.

    The GST_MINI_OBJECT_READONLY flag was removed as it used to mark the
    memory in buffers as READONLY. Marking memory READONLY can now be done
    with the GstMemory API. Writability of miniobjects is now either done
    by using the refcount or by using exclusive locking.

* GstBuffer
    A GstBuffer is now a simple boxed type this means that subclassing is not
    possible anymore. 

    To add data to the buffer you would now use gst_buffer_insert_memory() with
    a GstMemory object containing the data. Multiple memory blocks can added to
    a GstBuffer that can then be retrieved with gst_buffer_peek_memory().

    GST_BUFFER_DATA(), GST_BUFFER_MALLOCDATA(), GST_BUFFER_FREE_FUNC() and
    GST_BUFFER_SIZE() are gone, along with the fields in GstBuffer.

    The most common way to access all the data in a buffer is by using
    gst_buffer_map() and gst_buffer_unmap(). These calls require you to specify
    the access mode required to the data and will automatically merge and return
    a writable copy of the data.

    GST_BUFFER_SIZE() can be replaced with gst_buffer_get_size() but if also
    access to the data is required, gst_buffer_map() can return both the size
    and data in one go.

    The buffer must be writable (gst_buffer_is_writable()) in order to modify
    the fields, metadata or buffer memory. gst_buffer_make_writable() will not
    automatically make a writable copy of the memory but will instead increase
    the refcount of the memory. The _map() and _peek_memory() methods will
    automatically create writable copies when needed.
    
    gst_buffer_make_metadata_writable() is gone, you can replace this safely
    with gst_buffer_make_writable().
    
    gst_buffer_copy_metadata() is gone, use gst_buffer_copy_into() instead and
    mind use GST_BUFFER_COPY_METADATA instead of the former GST_BUFFER_COPY_ALL.

    gst_buffer_create_sub() is gone and can be safely replaced with
    gst_buffer_copy_region(). 

    Changing the size of the buffer data can be done with gst_buffer_resize(),
    which will also update the metadata fields correctly. gst_buffer_set_size()
    is #defined to a special case of gst_buffer_resize() with a 0 offset.

    gst_buffer_try_new_and_alloc() is replaced with gst_buffer_new_and_alloc(),
    which now returns NULL when memory allocation fails.

    GST_BUFFER_CAPS() is gone, caps are not set on buffers anymore but are set
    on the pads where the buffer is pushed on. Likewise GST_BUFFER_COPY_CAPS is
    not needed anymore. gst_buffer_get/set_caps() are gone too.

    GST_BUFFER_TIMESTAMP is gone, use GST_BUFFER_PTS or GST_BUFFER_DTS instead.
    Likewise GST_BUFFER_TIMESTAMP_IS_VALID() was changed to
    GST_BUFFER_PTS_IS_VALID and GST_BUFFER_DTS_IS_VALID

    gst_buffer_join() was renamed to gst_buffer_append() and the memory is not
    directly merged but appended.

    gst_buffer_merge() was removed, it is the same as gst_buffer_join() but
    without taking ownership of the arguments. Caller code should ref themselves
    when needed. Note that the extra refs might force slower paths in
    gst_buffer_join().

    gst_buffer_is_span() and gst_buffer_span() are removed, use
    gst_buffer_merge() and gst_buffer_resize() for the same effect. Merging and
    spanning is delayed until the buffer is mapped and in some cases no merging
    of memory is needed at all when the element can deal with individual memory
    chunks.

* GstBufferList
    The GstBufferList object is much simplified because most of the
    functionality in the groups is now part of the GstMemory in buffers.
    
    The object is reduced to encapsulating an array of buffers that you can send
    with the regular gst_pad_push_list. The iterator is not needed anymore
    because you can simply use gst_buffer_list_length() and gst_buffer_list_get()
    to iterate the array.

    For dealing with the groups, it's now needed to add the memory blocks to
    GstBuffer and use the normal buffer API to get and merge the groups.

    gst_buffer_list_sized_new() -> gst_buffer_list_new_sized()
    gst_buffer_list_len() -> gst_buffer_list_length()

* GstStructure

    The GArray of the structure fields are moved to private part and are not
    accessible from the application anymore. Use the methods to retrieve and
    modify fields from the array.

    gst_structure_empty_new() -> gst_structure_new_empty()
    gst_structure_id_empty_new() -> gst_structure_new_id_empty()
    gst_structure_id_new() -> gst_structure_new_id()

* GstEvent
    Boxed types derived from GstMiniObject.

    GST_EVENT_SRC is removed. Don't use this anymore.

    gst_event_new_qos_full() -> gst_event_new_qos()
    gst_event_parse_qos_full() -> gst_event_parse_qos()

    The GstStructure is removed from the public API, use the getters to get
    a handle to a GstStructure.

    GST_EVENT_NEWSEGMENT -> GST_EVENT_SEGMENT

    gst_event_new_new_segment () -> gst_event_new_segment() and it takes a
    GstSegment structure as an argument.
    gst_event_parse_new_segment() -> gst_event_parse_segment() to retrieve the
    GstSegment structure from the event.
    gst_event_copy_segment() to fill a GstSegment structure.
    
    gst_event_new_flush_stop() now takes a boolean, which in most cases should
    be TRUE

* GstQuery
    Boxed types derived from GstMiniObject.

    The GstStructure is removed from the public API, use the getters to get
    a handle to a GstStructure.

    gst_query_new_application() -> gst_query_new_custom()

    gst_query_parse_formats_length() -> gst_query_parse_n_formats()
    gst_query_parse_formats_nth() -> gst_query_parse_nth_format()

    Some query utility functions no longer use an inout parameter for the
    destination/query format:

      - gst_pad_query_position()
      - gst_pad_query_duration()
      - gst_pad_query_convert()
      - gst_pad_query_peer_position()
      - gst_pad_query_peer_duration()
      - gst_pad_query_peer_convert()
      - gst_element_query_position()
      - gst_element_query_duration()
      - gst_element_query_convert()

    gst_element_get_query_types() and gst_pad_get_query_types() with associated
    functions were removed.

* GstBufferList
    Is now a boxed type derived from GstMiniObject.

* GstMessage
    Is now a boxed type derived from GstMiniObject

    The GstStructure is removed from the public API, use the getters to get
    a handle to a GstStructure.

    GST_MESSAGE_DURATION -> GST_MESSAGE_DURATION_CHANGED

    gst_message_parse_duration() was removed (not needed any longer, do
    a duration query to query the updated duration)

* GstCaps
    Is now a boxed type derived from GstMiniObject.

    GST_VIDEO_CAPS_xxx -> GST_VIDEO_CAPS_MAKE(xxx)

    Some caps functions now take ownership of the input argument, for
    efficiency reasons (to avoid unnecessary copies to make them writable):

      gst_caps_normalize (caps)          =>   caps = gst_caps_normalize (caps)
      gst_caps_do_simplify (caps)        =>   caps = gst_caps_simplify (caps)
      gst_caps_merge (caps,caps2)        =>   caps = gst_caps_merge (caps,caps2)
      gst_caps_merge_structure (caps,st) =>   caps = gst_caps_merge_structure (caps,st)
      gst_caps_truncate (caps)           =>   caps = gst_caps_truncate (caps)

    The compiler should warn about unused return values from these functions,
    which may help find the places that need to be updated.

    Removed functions:

      gst_caps_union() -> gst_caps_merge():  Be careful because _merge takes
                 ownership of the arguments.

* GstClock
    gst_clock_id_wait_async_full() was renamed to gst_clock_id_wait_async() and
    the old gst_clock_id_wait_async() function was removed.

* GstSegment
    abs_rate was removed from the public fields, it can be trivially calculated
    from the rate field.

    Also segment accumulation was removed from the segment event. This means
    that now the source/demuxer/parser needs to add the elapsed time of the
    previous segment themselves (this must be added to segment->base). If this
    is not done, looped playback wont work.

    accum was renamed to base. last_stop was renamed to position.

    The segment info now contains all the information needed to convert buffer
    timestamps to running_time and stream_time. There is no more segment
    accumulation, the GstSegment is completely self contained.

    gst_segment_set_duration() and gst_segment_set_last_stop() are removed,
    simply modify the structure members duration and position respectively.

    gst_segment_set_newsegment() is removed, it was used to accumulate segments
    and is not needed anymore, use gst_segment_copy_into() or modify the segment
    values directly.

    gst_segment_set_seek() -> gst_segment_do_seek(). Updates the segment values
    with seek parameters.

* GstPluginFeature
    GST_PLUGIN_FEATURE_NAME() was removed, use GST_OBJECT_NAME() instead.

* GstTypeFind
    gst_type_find_peek() returns a const guint8 * now.

* GstTask
    gst_task_create() -> gst_task_new()

* GstAudio
    GstBaseAudioSink -> GstAudioBaseSink
    GstBaseAudioSrc -> GstAudioBaseSrc
    ...

* GstAdapter
    gst_adapter_peek() is removed, use gst_adapter_map() and gst_adapter_unmap()
    to get access to raw data from the adapter.

    Arguments changed from guint to gsize.

    gst_adapter_prev_timestamp() is removed and should be replaced with
    gst_adapter_prev_pts() and gst_adapter_prev_dts().

* GstBitReader, GstByteReader, GstByteWriter
    gst_*_reader_new_from_buffer(), gst_*_reader_init_from_buffer() removed, get
    access to the buffer data with _map() and then use the _new() functions.

    gst_byte_reader_new_from_buffer() and gst_byte_reader_init_from_buffer()
    removed, get access to the buffer data and then use the _new() functions.

* GstCollectPads
    gst_collect_pads_read() removed, use _read_buffer() or _take_buffer() and
    then use the memory API to get to the memory.

* GstBaseSrc, GstBaseTransform, GstBaseSink
    GstBaseSrc::get_caps(), GstBaseTransform::transform_caps() and
    GstBaseSink::get_caps() now take a filter GstCaps* parameter to
    filter the caps and allow better negotiation decisions.

* GstBaseSrc
    When overriding GstBaseTransform::fixate() one should chain up to the parent
    implementation.
 
* GstBaseTransform
    GstBaseTransform::transform_caps() now gets the complete caps passed
    instead of getting it passed structure by structure.

    GstBaseTransform::event() was renamed to sink_event(). The old function
    uses the return value to determine if the event should be forwarded or not.
    The new function has a default implementation that always forwards the event
    and the return value is simply returned as a result from the event handler.
    The semantics of the sink_event are thus the same as those for the src_event
    function.

* GstImplementsInterface
    has been removed. Interfaces need to be updated to either have
    is_ready/usable/available() methods, or have GError arguments
    to their methods so we can return an appropriate error if a
    particular interface isn't supported for a particular device.

* GstIterator
    uses a GValue based API now that is similar to the 0.10 API but
    allows bindings to properly use GstIterator and prevents complex
    return value ownership issues.

* GstNavigationInterface
    Now part of the video library in gst-plugins-base, and the interfaces
    library no longer exists.

* GstMixerInterface / GstTunerInterface
    Removed - no replacement?

* GstXOverlay interface
    Renamed to GstVideoOverlay, and now part of the video library in
    gst-plugins-base, as the interfaces library no longer exists.

* GstPropertyProbe interface
    Removed - no replacement in 1.0.x and 1.2.x, but since 1.4 there is
    a more featureful replacement for device discovery and feature querying,
    provided by GstDeviceMonitor, GstDevice, and friends. See the
    "GStreamer Device Discovery and Device Probing" documentation at
    http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-device-probing.html

* GstURIHandler
    gst_uri_handler_get_uri() and the get_uri vfunc now return a copy of
    the URI string

    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.

    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.

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

    Also, tag lists are refcounted now, and can therefore not be freely
    modified any longer. Make sure to call

      taglist = gst_tag_list_make_writable (taglist);

    before adding, removing or changing tags in the taglist.

    gst_tag_list_new() has been renamed to gst_tag_list_new_empty().
    gst_tag_list_new_full*() have been renamed to gst_tag_list_new*().
    gst_tag_list_free() has been replaced by gst_tag_list_unref().

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

    gst_tag_list_get_buffer() => gst_tag_list_get_sample()

    gst_is_tag_list() => GST_IS_TAG_LIST ()

* GstController:
    has now been merged into GstObject. It does not exists as a 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.
    
    For plugins the effect is that gst_controller_init() is gone and
    gst_object_sync_values() is taking a GstObject * instead of GObject *.
    
    For applications the effect is larger. 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.

    A simple way to attach a ControlSource to a property is:
    gst_object_add_control_binding (object,
      gst_direct_control_binding_new (object, property_name, control_source));
      
    gst_controller_set_property_disabled ->
      gst_object_set_control_binding_disabled

    gst_object_get_value_arrays has been removed. Loop over the controlled
    properties fetch the value array. Also GstValueArray is gone. The fields of
    GstValueArray are now passed directly to gst_object_get_value_array as
    arguments.
    
    GstInterpolationControlSource has been split. There is a new 
    GstTimedValueControlSource baseclass and 2 sub classes: 
    GstInterpolationControlSource and GstTriggerControlSource. The API for setting
    and getting the timestamps is in GstTimedValueControlSource.
    
    gst_interpolation_control_source_set_interpolation_mode() has been removed.
    Set the "mode" gobject property on the control-source instead. The possible
    enum values have been renamed from GST_INTERPOLATE_XXX to
    GST_INTERPOLATION_MODE_XXX.

* GstRegistry

    gst_registry_get_default() -> gst_registry_get()
    gst_default_registry_*(...) -> gst_registry_*(gst_registry_get(), ...)

* GstValue

    GST_TYPE_DATE -> G_TYPE_DATE
    GST_VALUE_HOLDS_DATE(value) -> G_VALUE_HOLDS(value,G_TYPE_DATE)
    gst_value_set_date() -> g_value_set_boxed()
    gst_value_get_date() -> g_value_get_boxed()

* GError/GstGError

    GstGError -> GError
    GST_TYPE_G_ERROR / gst_g_error_get_type() -> G_TYPE_ERROR

* GstVideo

    GstXOverlay interface -> renamed to GstVideoOverlay, and now part of
    the video library in gst-plugins-base, as the interfaces library
    no longer exists.

    gst_video_format_parse_caps() -> use gst_video_info_from_caps() and
        then GstVideoInfo.

* GstChildProxy

    gst_child_proxy_lookup() can no longer be called on GObjects that
    do not implement the GstChildProxy interface. Use
      g_object_class_find_property (G_OBJECT_GET_CLASS (obj), "foo")
    instead for non-childproxy objects.

* "codec-data" and "streamheader" field in GstCaps (not implemented yet!)

    codec-data and stream headers are no longer in GstCaps, but sent as
    part of a STREAM CONFIG event (which should be sent after the initial
    CAPS event if needed).

=============================================================================
  Porting checklist - "soft" API changes
=============================================================================

 * the "ffmpegcolorspace" element has been replaced by "videoconvert"

 * "playbin2" has been renamed to "playbin", with similar API

 * "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 function signature).

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

 * some elements that used to have a single dynamic source pad have a
   static source pad now. Example: wavparse, id3demux, iceydemux, apedemux.
   (This does not affect applications using decodebin or playbin).

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

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

 * 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 them unconditionally.
   
 * level sendy the per channel values as a GValueArray instead of a GstValueList
   see gst-plugins-good/test/examples/level/level-example.c

 * media type / caps changes:

      audio/x-raw-int   -> audio/x-raw
      audio/x-raw-float -> audio/x-raw

      video/x-raw-rgb   -> video/x-raw
      video/x-raw-yuv   -> video/x-raw
      video/x-raw-bayer -> video/x-bayer

      video/x-dvd-subpicture -> subpicture/x-dvd

      application/ogg  -> audio/ogg or video/ogg (or application/ogg)

      video/x-matroska -> audio/x-matroska or video/x-matroska or video/x-matroska-3d

      video/webm -> audio/webm or video/webm

      text/plain          -> text/x-raw, format=utf8
      text/x-pango-markup -> text/x-raw, format=pango-markup

 * element name changes/replacements:

      playbin2   -> playbin
      decodebin2 -> decodebin
      camerabin2 -> camerabin

      ffmpegcolorspace -> videoconvert

      mp3parse         -> mpegaudioparse
      legacyh264parse  -> h264parse (note: properties gone, use downstream caps)
      lame             -> lamemp3enc
      jp2k{enc,dec}    -> openjpeg{enc,dec}

      ffenc_*   -> avenc_*
      ffdec_*   -> avdec_*
      ffdemux_* -> avdemux_*
      ffmux_*   -> avmux_*

 * property type changes (very nasty for code using the C g_object_set/get API)

      - playbin2::connection-speed:
        changed from a plain unsigned integer to an unsigned 64-bit integer

 * property default value changes

      - souphttpsrc now by default asks the server to send icecast metadata
        if available (from internet radio streams usually). This has
        implications for hand-rolled pipelines, which may require an icydemux
        element now to parse that metadata (without that the data might be
        garbled). Since 1.0.7 the "iradio-mode" property has been re-added
        to allow users to switch off the default behaviour of requesting
        icecast metadata.
      - fakesink, identity and fakesrc's "silent" property default value
        changed from FALSE to TRUE. This means that "gst-launch-1.0 -v" will
        not show messages from any of these elements unless you explicitly
        request them with "silent=false". This change was made for efficiency
        reasons.

 * decoders now require parsers in front of them

      - in 1.0 many decoders require parsers in front of them in many
        situation. This is to simplify decoders and move a lot of the
        "intelligence" into the parser. This makes it easier to write
        decoders and minimises behavioural differences between different
        decoders (both for the same format and different formats). So e.g.

          filesrc ! flacdec ! audioconvert ! pulsesink

        now becomes

          filesrc ! flacparse ! flacdec ! audioconvert ! pulsesink

        but better just use

          filesrc ! decodebin ! audioconvert ! pulsesink

        or even

          playbin uri=file:///path/to/foo.flac audio-sink=pulsesink

 * non-time-based sources do not provide presentation timestamps anymore

      - Sources based on BYTEs instead of TIME (like filesrc or souphttpsrc)
        do not provide PTS anymore. In the 0.10 API they provided a PTS with
        value 0 for the first buffer. This was needed for legacy operation but
        has been removed in the 1.0 API. These sources will usually still put
        a 0 DTS (decoding timestamp) on the first buffer even if PTS is unset.

=============================================================================
  Troubleshooting
=============================================================================

 * GLib-GObject-WARNING **: cannot register existing type `GstObject'

   If you get this warning, this usually means your plugin or application
   is linked against both libgstreamer-1.0.so and libgstreamer-0.10.so.
   Make sure you have changed all -0.10 references in your configure.ac,
   pkg-config invocations or Makefile.am/Makefile to -1.0.

   While both versions can co-exist without problems on the same system, it
   is not possible to use both versions at the same time in a single running
   process. In most cases this would also not be the desired behaviour.

