| <title>Video Output Overlay Interface</title> |
| <subtitle>Also known as On-Screen Display (OSD)</subtitle> |
| |
| <para>Some video output devices can overlay a framebuffer image onto |
| the outgoing video signal. Applications can set up such an overlay |
| using this interface, which borrows structures and ioctls of the <link |
| linkend="overlay">Video Overlay</link> interface.</para> |
| |
| <para>The OSD function is accessible through the same character |
| special file as the <link linkend="capture">Video Output</link> function. |
| Note the default function of such a <filename>/dev/video</filename> device |
| is video capturing or output. The OSD function is only available after |
| calling the &VIDIOC-S-FMT; ioctl.</para> |
| |
| <section> |
| <title>Querying Capabilities</title> |
| |
| <para>Devices supporting the <wordasword>Video Output |
| Overlay</wordasword> interface set the |
| <constant>V4L2_CAP_VIDEO_OUTPUT_OVERLAY</constant> flag in the |
| <structfield>capabilities</structfield> field of &v4l2-capability; |
| returned by the &VIDIOC-QUERYCAP; ioctl.</para> |
| </section> |
| |
| <section> |
| <title>Framebuffer</title> |
| |
| <para>Contrary to the <wordasword>Video Overlay</wordasword> |
| interface the framebuffer is normally implemented on the TV card and |
| not the graphics card. On Linux it is accessible as a framebuffer |
| device (<filename>/dev/fbN</filename>). Given a V4L2 device, |
| applications can find the corresponding framebuffer device by calling |
| the &VIDIOC-G-FBUF; ioctl. It returns, amongst other information, the |
| physical address of the framebuffer in the |
| <structfield>base</structfield> field of &v4l2-framebuffer;. The |
| framebuffer device ioctl <constant>FBIOGET_FSCREENINFO</constant> |
| returns the same address in the <structfield>smem_start</structfield> |
| field of struct <structname>fb_fix_screeninfo</structname>. The |
| <constant>FBIOGET_FSCREENINFO</constant> ioctl and struct |
| <structname>fb_fix_screeninfo</structname> are defined in the |
| <filename>linux/fb.h</filename> header file.</para> |
| |
| <para>The width and height of the framebuffer depends on the |
| current video standard. A V4L2 driver may reject attempts to change |
| the video standard (or any other ioctl which would imply a framebuffer |
| size change) with an &EBUSY; until all applications closed the |
| framebuffer device.</para> |
| |
| <example> |
| <title>Finding a framebuffer device for OSD</title> |
| |
| <programlisting> |
| #include <linux/fb.h> |
| |
| &v4l2-framebuffer; fbuf; |
| unsigned int i; |
| int fb_fd; |
| |
| if (-1 == ioctl(fd, VIDIOC_G_FBUF, &fbuf)) { |
| perror("VIDIOC_G_FBUF"); |
| exit(EXIT_FAILURE); |
| } |
| |
| for (i = 0; i < 30; i++) { |
| char dev_name[16]; |
| struct fb_fix_screeninfo si; |
| |
| snprintf(dev_name, sizeof(dev_name), "/dev/fb%u", i); |
| |
| fb_fd = open(dev_name, O_RDWR); |
| if (-1 == fb_fd) { |
| switch (errno) { |
| case ENOENT: /* no such file */ |
| case ENXIO: /* no driver */ |
| continue; |
| |
| default: |
| perror("open"); |
| exit(EXIT_FAILURE); |
| } |
| } |
| |
| if (0 == ioctl(fb_fd, FBIOGET_FSCREENINFO, &si)) { |
| if (si.smem_start == (unsigned long)fbuf.base) |
| break; |
| } else { |
| /* Apparently not a framebuffer device. */ |
| } |
| |
| close(fb_fd); |
| fb_fd = -1; |
| } |
| |
| /* fb_fd is the file descriptor of the framebuffer device |
| for the video output overlay, or -1 if no device was found. */ |
| </programlisting> |
| </example> |
| </section> |
| |
| <section> |
| <title>Overlay Window and Scaling</title> |
| |
| <para>The overlay is controlled by source and target rectangles. |
| The source rectangle selects a subsection of the framebuffer image to |
| be overlaid, the target rectangle an area in the outgoing video signal |
| where the image will appear. Drivers may or may not support scaling, |
| and arbitrary sizes and positions of these rectangles. Further drivers |
| may support any (or none) of the clipping/blending methods defined for |
| the <link linkend="overlay">Video Overlay</link> interface.</para> |
| |
| <para>A &v4l2-window; defines the size of the source rectangle, |
| its position in the framebuffer and the clipping/blending method to be |
| used for the overlay. To get the current parameters applications set |
| the <structfield>type</structfield> field of a &v4l2-format; to |
| <constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY</constant> and call the |
| &VIDIOC-G-FMT; ioctl. The driver fills the |
| <structname>v4l2_window</structname> substructure named |
| <structfield>win</structfield>. It is not possible to retrieve a |
| previously programmed clipping list or bitmap.</para> |
| |
| <para>To program the source rectangle applications set the |
| <structfield>type</structfield> field of a &v4l2-format; to |
| <constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY</constant>, initialize |
| the <structfield>win</structfield> substructure and call the |
| &VIDIOC-S-FMT; ioctl. The driver adjusts the parameters against |
| hardware limits and returns the actual parameters as |
| <constant>VIDIOC_G_FMT</constant> does. Like |
| <constant>VIDIOC_S_FMT</constant>, the &VIDIOC-TRY-FMT; ioctl can be |
| used to learn about driver capabilities without actually changing |
| driver state. Unlike <constant>VIDIOC_S_FMT</constant> this also works |
| after the overlay has been enabled.</para> |
| |
| <para>A &v4l2-crop; defines the size and position of the target |
| rectangle. The scaling factor of the overlay is implied by the width |
| and height given in &v4l2-window; and &v4l2-crop;. The cropping API |
| applies to <wordasword>Video Output</wordasword> and <wordasword>Video |
| Output Overlay</wordasword> devices in the same way as to |
| <wordasword>Video Capture</wordasword> and <wordasword>Video |
| Overlay</wordasword> devices, merely reversing the direction of the |
| data flow. For more information see <xref linkend="crop" />.</para> |
| </section> |
| |
| <section> |
| <title>Enabling Overlay</title> |
| |
| <para>There is no V4L2 ioctl to enable or disable the overlay, |
| however the framebuffer interface of the driver may support the |
| <constant>FBIOBLANK</constant> ioctl.</para> |
| </section> |