Some notes on the error handling introduced after 0.7.3

- there are four domains for errors:
  - CORE: core GStreamer errors
  - LIBRARY: supporting library errors
  - RESOURCE: errors accessing resources (files, network, memory, ...)
  - STREAM: errors in the data stream
- Each error in GStreamer or plug-ins can be put under one of these four.
- the enum is called Gst(Domain)Error and has GST_(DOMAIN)_ERROR_(CODE) members
  (see GError API docs for rationale)
- each of the enums starts with _FAILED at 1 (with FAILED being the generic
  error if none of the others applies)
- second in the enum is TOO_LAZY, which allows us to keep track of those errors
  that we haven't categorized yet.  This means they really should either move
  to another one, or a new one ought to be created.
- each enum ends with NUM_ERRORS

- elements call gst_element_error to signal an error:
  gst_element_error (element, domain, code, message, debug);
  With :
  - element being the one signalling the error
  - domain one of CORE, LIBRARY, RESOURCE, STREAM
  - code one of the suffixes in the Gst(Domain)Error enum
  - message is either NULL (to signal the standard error message for the
    given domain and code), or a printf-like set with the format being
    marked for translation.
    The string should start with a capital and end in a period so it forms
    a complete sentence.
    The string can/should be shown to the user of an application.
  - debug is either NULL or a non-translated debug string, which can be used
    to diagnose errors after they've happened.
    The string can be shown to the user when he asks for additional debug info.
    A useful macro is GST_ERROR_SYSTEM, which prints out the system error
    that explains the failure by using g_strerror.

- Some example calls:

      gst_element_error (src, RESOURCE, OPEN_READ,
        (_("Could not open file \"%s\" for reading"), src->filename),
        GST_ERROR_SYSTEM);

      The message is specified since we have more information:
          - the resource is a file 
          - we know the file name

      gst_element_error (element, CORE, NEGOTIATION, NULL, NULL);
 
      This is a simple negotiation error.  The default message will be
      signaled, telling the user that GStreamer had an internal error.

      gst_element_error (ebml, RESOURCE, READ, NULL,
                         ("Read error at position %llu (0x%llx)",
                         pos, pos));

      The plugin asked to read on the underlying resource (using bytestream),
      but failed.  The user will get a generic read error.  The debug info
      will contain the exact position in the stream at which the read error
      occured.

