What to do when a plugin is missing
-----------------------------------

The mechanism and API described in this document requires GStreamer core and
gst-plugins-base versions >= 0.10.12. Further information on some aspects of
this document can be found in the libgstbaseutils API reference.

We only discuss playback pipelines for now.

A three step process:

1) GStreamer level

 - elements will use a "missing-plugin" element message to report missing
   plugins, with the following fields set:

     - type: (string) { "urisource", "urisink", "decoder", "encoder", "element" }
         (we do not distinguish between demuxer/decoders/parsers etc.)
     - detail: (string) or (caps) depending on the type { ANY }
         ex: "mms, "mmsh", "audio/x-mp3,rate=48000,..."
     - name: (string) { ANY }
         ex: "MMS protocol handler",..

 - missing uri handler 
  
  ex. mms://foo.bar/file.asf

  When no protocol handler is installed for mms://, the application will not be
  able to instantiate an element for that uri (gst_element_make_from_uri()
  returns NULL).

  Playbin will post a "missing-plugin" element message with the type set to 
  "urisource", detail set to "mms". Optionally the friendly name can be filled
  in as well.

 - missing typefind function

  We don't recognize the type of the file, this should normally not happen
  because all the typefinders are in the basic GStreamer installation.
  There is not much useful information we can give about how to resolve this 
  issue. It is possible to use the first N bytes of the data to determine the
  type (and needed plugin) on the server. We don't explore this option in this
  document yet, but the proposal is flexible enough to accommodate this in the
  future should the need arise.

 - missing demuxer

  Typically after running typefind on the data we determine the type of the 
  file. If there is no plugin found for the type, a "missing-plugin" element
  message is posted by decodebin with the following fields: Type set to
  "decoder", detail set to the caps for witch no plugin was found. Optionally
  the friendly name can be filled in as well.

 - missing decoder 

  The demuxer will dynamically create new pads with specific caps while it 
  figures out the contents of the container format. Decodebin tries to find the
  decoders for these formats in the registry. If there is no decoder found, a
  "missing-plugin" element message is posted by decodebin with the following
  fields: Type set to "decoder", detail set to the caps for which no plugin
  was found. Optionally the friendly name can be filled in as well. There is
  no distinction made between the missing demuxer and decoder at the
  application level.

 - missing element

  Decodebin and playbin will create a set of helper elements when they set up
  their decoding pipeline. These elements are typically colorspace, sample rate,
  audio sinks,... Their presence on the system is required for the functionality
  of decodebin. It is typically a package dependency error if they are not
  present but in case of a corrupted system the following "missing-plugin"
  element message will be emitted: type set to "element", detail set to the
  element factory name and the friendly name optionally set to a description
  of the element's functionality in the decoding pipeline.

 Except for reporting the missing plugins, no further policy is enforced at the
 GStreamer level. It is up to the application to decide whether a missing
 plugin constitutes a problem or not.


2) application level

 The application's job is to listen for the "missing-plugin" element messages
 and to decide on a policy to handle them. Following cases exist:

 - partially missing plugins

 The application will be able to complete a state change to PAUSED but there 
 will be a "missing-plugin" element message on the GstBus. 

 This means that it will be possible to play back part of the media file but not
 all of it. 

 For example: suppose we have an .avi file with mp3 audio and divx video. If we 
 have the mp3 audio decoder but not the divx video decoder, it will be possible
 to play only the audio part but not the video part. For an audio playback
 application, this is not a problem but a video player might want to decide on:

   - require the use to install the additionally required plugins. 
   - inform the user that only the audio will be played back
   - ask the user if it should download the additional codec or only play the 
     audio part.
   - ...

 - completely unplayable stream

 The application will receive an ERROR message from GStreamer informing it that
 playback stopped (before it could reach PAUSED). This happens because none of
 the streams is connected to a decoder. The error code and domain should be one
 of the following in this case:
    - GST_CORE_ERROR_MISSING_PLUGIN (domain: GST_CORE_ERROR)
    - GST_STREAM_ERROR_CODEC_NOT_FOUND (domain: GST_STREAM_ERROR)

 The application can then see that there are a set of "missing-plugin" element
 messages on the GstBus and can decide to trigger the download procedure. It
 does that as described in the following section.

 "missing-plugin" element messages can be identified using the function
 gst_is_missing_plugin_message().


3) Plugin download stage

  At this point the application has
    - collected one or more "missing-plugin" element messages
    - made a decision that additional plugins should be installed

  It will call a GStreamer utility function to convert each "missing-plugin"
  message into an identifier string describing the missing capability. This is
  done using the function gst_missing_plugin_message_get_installer_detail().

  The application will then pass these strings to gst_install_plugins_async()
  or gst_install_plugins_sync() to initiate the download. See the API
  documentation there (libgstbaseutils, part of gst-plugins-base) for more
  details.

  When new plugins have been installed, the application will have to initiate
  a re-scan of the GStreamer plugin registry using gst_update_registry().


4) Format of the (UTF-8) string ID passed to the external installer system

  The string is made up of several fields, separated by '|' characters.
  The fields are:

    - plugin system identifier, ie. "gstreamer"
      This identifier determines the format of the rest of the detail string.
      Automatic plugin installers should not process detail strings with
      unknown identifiers. This allows other plugin-based libraries to use
      the same mechanism for their automatic plugin installation needs, or
      for the format to be changed should it turn out to be insufficient.

    - plugin system version, e.g. "0.10"
      This is required so that when there is a GStreamer-0.12 or GStreamer-1.0
      at somem point in future, the different major versions can still co-exist
      and use the same plugin install mechanism in the same way.

    - application identifier, e.g. "totem"
      This may also be in the form of "pid/12345" if the program name can't
      be obtained for some reason.

    - human-readable localised description of the required component,
      e.g. "Vorbis audio decoder"

    - identifier string for the required component, e.g.

         - urisource-$(PROTOCOL_REQUIRED)
             e.g. urisource-http or urisource-mms

         - element-$(ELEMENT_REQUIRED),
             e.g. element-ffmpegcolorspace

         - decoder-$(CAPS_REQUIRED)
             e.g. decoder-audio/x-vorbis or
                  decoder-application/ogg or
                  decoder-audio/mpeg, mpegversion=(int)4 or
                  decoder-video/mpeg, systemstream=(boolean)true, mpegversion=(int)2

         - encoder-$(CAPS_REQUIRED)
             e.g. encoder-audio/x-vorbis

    - optional further fields not yet specified


  An entire ID string might then look like this, for example:

    gstreamer|0.10|totem|Vorbis audio decoder|decoder-audio/x-vorbis

  Plugin installers parsing this ID string should expect further fields also
  separated by '|' symbols and either ignore them, warn the user, or error
  out when encountering them.
 
  The human-readable description string is provided by the libgstbaseutils
  library that can be found in gst-plugins-base versions >= 0.10.12 and can
  also be used by demuxers to find out the codec names for taglists from given
  caps in a unified and consistent way.

  Applications can create these detail strings using the function
  gst_missing_plugin_message_get_installer_detail() on a given missing-plugin
  message.


5) Using missing-plugin messages for error reporting:

  Missing-plugin messages are also useful for error reporting purposes, either
  in the case where the application does not support libgimme-codec, or the
  external installer is not available or not able to install the required
  plugins.

  When creating error messages, applications may use the function
  gst_missing_plugin_message_get_description() to obtain a possibly translated
  description from each missing-plugin message (e.g. "Matroska demuxer" or
  "Theora video depayloader"). This can be used to report to the user exactly
  what it is that is missing.


6) Notes for packagers

 - An easy way to introspect plugin .so files is:

     $ gst-inspect --print-plugin-auto-install-info /path/to/libgstfoo.so

   The output will be something like:

     decoder-audio/x-vorbis
     element-vorbisdec
     element-vorbisenc
     element-vorbisparse
     element-vorbistag
     encoder-audio/x-vorbis

   BUT could also be like this (from the faad element in this case):

     decoder-audio/mpeg, mpegversion=(int){ 2, 4 }

   NOTE that this does not exactly match the caps string that the installer
   will get from the application. The application will always ever ask for
   one of

     decoder-audio/mpeg, mpegversion=(int)2
     decoder-audio/mpeg, mpegversion=(int)4


 - when introspecting, keep in mind that there are GStreamer plugins that
   in turn load external plugins. Examples of these are pitfdll, ladspa, or
   the GStreamer libvisual plugin. Those plugins will only announce elements
   for the currently installed external plugins at the time of introspection!
   With the exception of pitfdll, this is not really relevant to the playback
   case, but may become an issue in future when applications like buzztard,
   jokosher or pitivi start requestion elements by name, for example ladspa
   effect elements or so.
   
   This case could be handled if those wrapper plugins would also provide a
   gst-install-xxx-plugins-helper, where xxx={ladspa|visual|...}. Thus if the
   distro specific gst-install-plugins-helper can't resolve a request for e.g.
   element-bml-sonicverb it can forward the request to 
   gst-install-bml-plugins-helper (bml is the buzz machine loader).


7) Further references:

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gstreamer-base-utils.html
