| .. -*- coding: utf-8; mode: rst -*- | |
| .. _selection-vs-crop: | |
| ******************************** | |
| Comparison with old cropping API | |
| ******************************** | |
| The selection API was introduced to cope with deficiencies of the | |
| older :ref:`CROP API <crop>`, that was designed to control simple | |
| capture devices. Later the cropping API was adopted by video output | |
| drivers. The ioctls are used to select a part of the display were the | |
| video signal is inserted. It should be considered as an API abuse | |
| because the described operation is actually the composing. The | |
| selection API makes a clear distinction between composing and cropping | |
| operations by setting the appropriate targets. | |
| The CROP API lacks any support for composing to and cropping from an | |
| image inside a memory buffer. The application could configure a | |
| capture device to fill only a part of an image by abusing V4L2 | |
| API. Cropping a smaller image from a larger one is achieved by setting | |
| the field ``bytesperline`` at struct :c:type:`v4l2_pix_format`. | |
| Introducing an image offsets could be done by modifying field | |
| ``m_userptr`` at struct :c:type:`v4l2_buffer` before calling | |
| :ref:`VIDIOC_QBUF <VIDIOC_QBUF>`. Those operations should be avoided | |
| because they are not portable (endianness), and do not work for | |
| macroblock and Bayer formats and mmap buffers. | |
| The selection API deals with configuration of buffer | |
| cropping/composing in a clear, intuitive and portable way. Next, with | |
| the selection API the concepts of the padded target and constraints | |
| flags are introduced. Finally, struct :c:type:`v4l2_crop` and struct | |
| :c:type:`v4l2_cropcap` have no reserved fields. Therefore there is no | |
| way to extend their functionality. The new struct | |
| :c:type:`v4l2_selection` provides a lot of place for future | |
| extensions. | |
| Driver developers are encouraged to implement only selection API. The | |
| former cropping API would be simulated using the new one. |