| Lazy Caps |
| ========= |
| |
| The idea is to have caps where we evaluate the structures as needed. We can have |
| these variants of lazy caps: |
| |
| - construction (e.g. from_string) |
| - need user_data (the string/string-array) |
| - need a free_func for the user_data |
| - need a get_structure_func to fill structure slots as needed |
| - we can more easily make this iterator based too |
| - operations (e.g. intersect) (see [1]). |
| - need user_data (the iterator) |
| - need a free_func for the user_data |
| - need a get_structure_func to fill structure slots as needed |
| |
| We should add PERFORMANCE category logging to methods that cause lazy caps to be |
| fully evaluated. To get maximum speed benefit we need to inspect places that |
| loop over structures of a caps and turn them into while() loops where possible. |
| |
| We can use GST_CAPS_FLAGS_LAZY to indicate that caps are not fully constructed. |
| Once caps are fully evaluated, we can remove the flag (and call the free_func). |
| |
| Lazy caps might need a lock to protect multiple threads requesting a structure |
| (get_structure_func). |
| |
| Accessors |
| --------- |
| guint gst_caps_get_size (const GstCaps *caps); |
| - needs to fully evaluate the caps if iterator based :/ |
| |
| GstStructure *gst_caps_get_structure (const GstCaps *caps, guint index);- needs to fully evaluate the caps if iterator based :/ |
| - needs to evaluate all entries up to index if iterator based |
| - needs to only evaluate requested index if e.g. parse based |
| |
| gchar *gst_caps_to_string (const GstCaps * caps) |
| - needs to fully evaluate the caps |
| - it is used in debugging and serialisation |
| |
| Construction |
| ------------ |
| |
| Manipulation |
| ------------ |
| void gst_caps_append (GstCaps *caps1, GstCaps *caps2); |
| - use an iterator |
| |
| void gst_caps_merge (GstCaps *caps1, GstCaps *caps2); |
| - use an iterator |
| |
| void gst_caps_append_structure (GstCaps *caps, GstStructure *structure); |
| void gst_caps_remove_structure (GstCaps *caps, guint idx); |
| void gst_caps_merge_structure (GstCaps *caps, |
| - fully evaluate caps? |
| |
| GstCaps * gst_caps_copy_nth (const GstCaps *caps, guint nth); |
| - eval stucture and copy |
| |
| void gst_caps_truncate (GstCaps *caps); |
| - eval first structure as needed and remove GST_CAPS_FLAGS_LAZY + call free_func |
| |
| void gst_caps_set_value (GstCaps *caps, const char *field, const GValue *value); |
| void gst_caps_set_simple (GstCaps *caps, const char *field, ...); |
| void gst_caps_set_simple_valist (GstCaps *caps, const char *field, va_list varargs); |
| - fully evaluate caps |
| |
| |
| Operations |
| ---------- |
| |
| |
| [1] https://bugzilla.gnome.org/show_bug.cgi?id=618853 |