Buffer mutability properties are the most important part of gst, and
similarly are the most complex.

The simple case is that a buffer is created, memory allocated, data put
in it, and passed to the next filter.  That filter reads the data, does
something (like creating a new buffer and decoding into it), and
unreferences the buffer.  This causes the data to be freed and the buffer
to be destroyed.

A more complex case is when the filter modifies the data in place.  It
does so and simply passes on the buffer to the next element.  This is just
as easy to deal with.

If the second filter adds metadata to the buffer, it just has to add the
pointer to the list.  The next element simply traverses the list and