So I've thought about this patch some more, and since the goal here is to make adding push-mode support more streamlined, I'm thinking that a bigger rework than this would be preferred. In the current patch, we simply merge _create and _connect, having the read thread spin until the parser is ready (just like previously it spinned until sink_connect was true). However, in push mode, we need to return from the creation function and move on to ::ProcessInput and ::ProcessOutput, so maybe it would be a better idea to have _create() handle everything to gst_element_set_state(pipeline, PAUSED), and restructure other functions (i.e. get_stream_count, get_stream, get_stream_duration) to block on the corresponding step of initialization.
This would keep the pull mode functions fundamentally the same, since they query for all this data right after the parser is initialized, but allow push-mode transforms to yield control to the consumer of the transform when gstreamer wants data.
I'm going to start work on this now, but if there are any better ideas, I'd love to hear them.