docs: go over design docs and fix things
[platform/upstream/gstreamer.git] / docs / design / part-TODO.txt
index fa82fb2..6e5bab8 100644 (file)
@@ -1,36 +1,86 @@
+TODO - Future Development
+-------------------------
 
-- changing an object's name after construction is not allowed. Checks are performed
-  when adding objects to parents that no duplicate names are used, changing the name
-  to a duplicate name after adding it is therefore allowed and voids internal
-  consistency.
+API/ABI
+~~~~~~~
 
-- implement return values from events in addition to the gboolean. This should be
-  done by making the event contain a GstStructure with input/output values, similar
-  to GstQuery. A typical use case is performing a non-accurate seek to a keyframe,
-  after the seek you want to get the new stream time that will actually be used to
-  update the slider bar.
+- implement return values from events in addition to the gboolean. This should
+  be done by making the event contain a GstStructure with input/output values,
+  similar to GstQuery. A typical use case is performing a non-accurate seek to a
+  keyframe, after the seek you want to get the new stream time that will
+  actually be used to update the slider bar.
 
-- unlinking pads in the PAUSED state needs to make sure the stream thread is not
-  executing code. Can this be done with a flush to unlock all downstream chain
-  functions? Do we do this automatically or let the app handle this?
+- make gst_pad_push_event() return a GstFlowReturn so that we can resend
+  NEWSEGMENT and other events.
+
+- GstEvent, GstMessage register like GstFormat or GstQuery.
+
+- query POSITION/DURATION return accuracy. Just a flag or accuracy percentage.
+
+- use | instead of + as divider in serialization of Flags
+  (gstvalue/gststructure)
+
+- rethink how we handle dynamic replugging wrt segments and other events that
+  already got pushed and need to be pushed again. Might need GstFlowReturn from
+  gst_pad_push_event(). FIXED in 0.11 with sticky events.
+
+- Optimize negotiation. We currently do a get_caps() call when we link pads,
+  which could potentially generate a huge list of caps and all their
+  combinations, we need to avoid generating these huge lists by generating them
+  incrementaly when needed. We can do this with a gst_pad_iterate_caps() call.
+  We also need to incrementally return intersections etc, for this. somewhat
+  FIXED in 0.11 with a filter on getcaps functions.
 
-- implement clock selection as explained in part-gstpipeline.txt. 
+- Elements in a bin have no clue about the final state of the parent element
+  since the bin sets the target state on its children in small steps. This
+  causes problems for elements that like to know the final state (rtspsrc going
+  to PAUSED or READY is different in that we can avoid sending the useless
+  PAUSED request).
 
-- when a pipeline with a live source goes to PAUSED again, a sample is prerolled
-  in the sinks. This sample should be discarded, possibly with a flush event
-  started from the source.
+- Make serialisation of structures more consistent, readable and nicer code-wise.
 
-- convert framerate to GstFraction in GstCaps.
+- pad block has several issues: 
+  * can't block on selected things, like push, pull, pad_alloc, events, ...
+  * can't check why the block happened. We should also be able to get the item/
+    reason that blocked the pad. 
+  * it only blocks on datapassing. When EOS, the block never happens but ideally
+    should because pad block should inform the app when there is no dataflow.
+  * the same goes for segment seeks that don't push in-band EOS events. Maybe
+    segment seeks should also send an EOS event when they're done.
+  * blocking should only happen from one thread. If one thread does pad_alloc
+    and another a push, the push might be busy while the block callback is done.
+  * maybe this name is overloaded. We need to look at some more use cases before
+    trying to fix this.
+  FIXED in 0.11 with BLOCKING probes. Not everything is implemented yet, though.
 
-- implement latency calculation for live sources.
+- rethink the way we do upstream renegotiation. Currently it's done with
+  pad_alloc but this has many issues such as only being able to suggest 1 format
+  and the need to allocate a buffer of this suggested format (some elements such
+  as capsfilter only know about the format, not the size). We would ideally like
+  to let upstream renegotiate a new format just like it did when it started.
+  This could, for example, easily be triggered with a RENEGOTIATE event.
+  FIXED in 0.11 with RECONFIGURE events.
 
-- implement master/slave clocks.
+- Remove the result format value in queries.
 
-- implement QOS.
+- Try to minimize the amount of acceptcaps calls when pushing buffers around.
+  The element pushing the buffer usually negotiated already and decided on the
+  format.
+  The element receiving the buffer usually has to accept the caps anyway.
+
+
+IMPLEMENTATION
+~~~~~~~~~~~~~~
+
+- implement more QOS, see part-qos.txt.
 
 - implement BUFFERSIZE.
 
-- make bin_bus_handler a vmethod so subclasses can use their own implementation
-  or chain to the parent.
 
-- make it possible to seek on other formats than bytes in basesrc.
+DESIGN
+~~~~~~
+
+- unlinking pads in the PAUSED state needs to make sure the stream thread is not
+  executing code. Can this be done with a flush to unlock all downstream chain
+  functions? Do we do this automatically or let the app handle this?
+