OUTDATED -------- You might start by creating a source element and put it into a pipeline. At this point both element's state would be GST_STATE_NEW, since they don't have enough state to actually run yet. At this point you can set the filename of the source, and possibly bytesperread and other things. Then you'd want to discover the data type of the file you're sourcing. This will typically be handled by the pipeline itself by calling gst_pipeline_autoplug(), or gst_pipeline_find_pad_type(), or somesuch. The pipeline would first set its state to GST_STATE_DISCOVERY. A gstfindtype sink would be added to the pipeline and connected to the source. Its HAVE_TYPE signal would be connected to a private pipeline function. The pipeline would then set the the src state to GST_STATE_DISCOVERY, and call the src's push() function until a the type is set by the function connected to the gstfindtype element's signal. At this point the pipeline would disconnect the gstfindtype element from the src, set the type of the pad to the type returned by the gstfindtype element. At disconnection of the find element, the src's state automatically reverts to NEW. (The trick with the sources when they do DISCOVERY is that synchronous sources can't go back and read data again. So perhaps I should set up a wrapper function for the push() function that uses either a sync or async function as provided by the src instance to provide DISCOVERY and normal operations. It would use a [GstBufferCache] to read ahead into memory if necessary, creating baby buffers as necessary to answer the needs of each DISCOVERY sequence.) If you called find_pad_type(), it would return right about now, with the ID of the type it found. At the same time, if you have connected a signal to the pad's SET_TYPE signal, it would fire right as the type is set by the find_pad_type() function. This would allow your application to do its own selection of filters to connect to the pad. If you called autoplug(), the pipeline would make a selection of element to connect. The element would be created (state=NEW), added to the pipeline, and the appropriate sink pad connected to the src in question. (Note that multi-sink elements won't be supported unless there's a really good and obvious way to do so) The whole process would repeat until the recently added element no longer has a src pad.