| 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. |