Optional properties in caps: During the 0.8 series of GStreamer, we regularly felt the need to add properties to caps, thereby sometimes breaking specific caps negotiation cases or annoying developers. This document outlines problems it could lead to and tries to explain in which cases properties can be added and when they can't. It also explains when properties can be optional (both temporarily and permanently) and when they cannot. -- There's two cases where optional properties could be added: 1) to fix an issue that makes any case fail 2) to fix an issue that makes some cases fail Case 1 can be compared to not providing extra_data in caps for WMA. The caps are defined, but it will never work because you cannot decode WMA audio without the sequence header. In this case, adding the property breaks caps compatibility, but it is still allowed because there is no regression and it fixes a bug. No optional property should be added here, it should be made a required property directly. Another example here is channel-positions for channels>2. Case 2 is more complex. There's various subcases: a] not providing this property means ANY (or don't care, or unknown, each of which is another way of saying ANY) b] not providing this property means a specific value .] adding this property will lead to unwanted behaviour .] adding this property will not lead to unwanted behaviour An example case for 2a is the buffer-frames property in float audio or the frames property in MPEG audio. Buffer-frames is 0 (which should be removed) means ANY. The reason that it should not be zero is because connecting an element with buffer-frames=SOME_VALUE should be allowed to connect to any element out there that has no buffer-frames requirement. The opposite is true reversely: an element with no buffer-frames property should never be allowed to connect to any element requesting a specific buffer-frames value. For MPEG audio, it is TRUE likewise. Mathematically, buffer-frames=0 does not exist. It implies ANY. Similarly, framed=FALSE cannot exist, because it implies framed={FALSE,TRUE} (in words: an element cannot require non-framed MPEG audio, because framed MPEG audio is a subset of non-framed MPEG audio and thus valid input). In all those cases for 2a, optional properties are fine. Subtraction will not work, but as explained, values are subsets of another value and thus subtraction is irrelevant (because the mathematical value of the subtraction has no real value). This same principle is true for rate/channels on (for example) MPEG audio. Our caps negotiation already allows for all of this, and optional properties are already being used for this. 2b is complex, since subtraction actually has a value here, and addition of such properties may lead to regressions or crashes. Let's give another two examples: stride (for raw video; not providing this value implies 4-byte aligned video) and pixel-aspect-ratio (default value being 1/1). Adding p-a-r was in this case an example of 2bII, whereas stride is 2bI. The reason for this is simple: adding pixel-aspect-ratio to some element and not to others could lead to misunderstanding size. However, this is not a regression, because not adding it altogether would lead to the same misunderstanding. In both cases, the result would be wrongly sized video. Therefore, there is no regression and there is a bugfix, so this is fine. Obviously, the optional property is in this case very specifically a temporary solution. As soon as we can, this property should become obligatory. Stride is different, because elements have implicit associated behaviour based on the previous beahviour. This hebaviour could break if some elements do implement stride and others still don't. Therefore, adding an optional property as a temporary hack is, in this case, not a good idea and should be disallowed. A proper fix should be done in the same timeframe as 2bII. In this case, optional properties should not be added. Another example of this case was adding channel-positions to audio caps with channels=1,2, which was rejected for the same reason: it would break a perfectly-working set of rules in a stable series. -- Obviously, with all of the above, people will start fighting about which group their specific properties change belongs to. General consensus is the only way to get around that problem. Long live politics.