<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic V4L2 VIDIOC_REQBUFS cannot allocate enough memory in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/V4L2-VIDIOC-REQBUFS-cannot-allocate-enough-memory/m-p/1293188#M175592</link>
    <description>&lt;P&gt;&lt;SPAN&gt;Dear,&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I&amp;nbsp;&lt;/SPAN&gt;am writing a MIPI driver without using the I2C functionality, since it is not possible for me to use it. I am writing this for the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://coral.ai/" target="_blank" rel="nofollow noopener noreferrer"&gt;Google Coral&lt;/A&gt;. To write this new driver I looked at&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://gist.github.com/maxlapshin/1253534" target="_blank" rel="nofollow noopener noreferrer"&gt;this example&lt;/A&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and adjusted it to only use the MMAP functionality. My new code is this:&lt;/P&gt;&lt;PRE&gt;    &lt;SPAN class="hljs-comment"&gt;/*
 *  V4L2 video capture example
 *
 *  This program can be used and distributed without restrictions.
 *
 *      This program is provided with the V4L2 API
 * see http://linuxtv.org/docs.php for more information
 */&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;stdio.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;string.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;assert.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;getopt.h&amp;gt;&lt;/SPAN&gt;             &lt;SPAN class="hljs-comment"&gt;/* getopt_long() */&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/SPAN&gt;              &lt;SPAN class="hljs-comment"&gt;/* low-level i/o */&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;unistd.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;errno.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/time.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/mman.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/ioctl.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;linux/videodev2.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;


&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; CLEAR(x) memset(&amp;amp;(x), 0, sizeof(x))&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifndef&lt;/SPAN&gt; V4L2_PIX_FMT_H264&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; V4L2_PIX_FMT_H264     v4l2_fourcc(&lt;SPAN class="hljs-meta-string"&gt;'H'&lt;/SPAN&gt;, &lt;SPAN class="hljs-meta-string"&gt;'2'&lt;/SPAN&gt;, &lt;SPAN class="hljs-meta-string"&gt;'6'&lt;/SPAN&gt;, &lt;SPAN class="hljs-meta-string"&gt;'4'&lt;/SPAN&gt;) &lt;SPAN class="hljs-comment"&gt;/* H264 with start codes */&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buffer&lt;/SPAN&gt; {&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;   *start;
        &lt;SPAN class="hljs-keyword"&gt;size_t&lt;/SPAN&gt;  length;
};

&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;char&lt;/SPAN&gt;            *dev_name;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              fd = &lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt;;
&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buffer&lt;/SPAN&gt;          *&lt;SPAN class="hljs-title"&gt;buffers&lt;/SPAN&gt;;&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;     n_buffers;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              out_buf;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              force_format;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              frame_count = &lt;SPAN class="hljs-number"&gt;200&lt;/SPAN&gt;;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              frame_number = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;;

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;errno_exit&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;char&lt;/SPAN&gt; *s)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s error %d, %s\n"&lt;/SPAN&gt;, s, errno, strerror(errno));
        &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;xioctl&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; fh, &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; request, &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *arg)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; r;

        &lt;SPAN class="hljs-keyword"&gt;do&lt;/SPAN&gt; {
                r = ioctl(fh, request, arg);
        } &lt;SPAN class="hljs-keyword"&gt;while&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == r &amp;amp;&amp;amp; EINTR == errno);

        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; r;
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;process_image&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *p, &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; size)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"processing image\n"&lt;/SPAN&gt;);
        frame_number++;
        &lt;SPAN class="hljs-keyword"&gt;char&lt;/SPAN&gt; filename[&lt;SPAN class="hljs-number"&gt;15&lt;/SPAN&gt;];
        &lt;SPAN class="hljs-built_in"&gt;sprintf&lt;/SPAN&gt;(filename, &lt;SPAN class="hljs-string"&gt;"frame-%d.raw"&lt;/SPAN&gt;, frame_number);    &lt;SPAN class="hljs-comment"&gt;// filename becomes frame-x.raw&lt;/SPAN&gt;
        FILE *fp=fopen(filename,&lt;SPAN class="hljs-string"&gt;"wb"&lt;/SPAN&gt;);

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (out_buf)
                fwrite(p, size, &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;, fp);                     &lt;SPAN class="hljs-comment"&gt;// write data to file fp&lt;/SPAN&gt;

        fflush(fp);
        fclose(fp);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;read_frame&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"reading frame\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buffer&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buf&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i;

        CLEAR(buf);

        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        buf.memory = V4L2_MEMORY_MMAP;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_DQBUF, &amp;amp;buf)) {
                &lt;SPAN class="hljs-keyword"&gt;switch&lt;/SPAN&gt; (errno) {
                &lt;SPAN class="hljs-keyword"&gt;case&lt;/SPAN&gt; EAGAIN:
                        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;;

                &lt;SPAN class="hljs-keyword"&gt;case&lt;/SPAN&gt; EIO:
                        &lt;SPAN class="hljs-comment"&gt;/* Could ignore EIO, see spec. */&lt;/SPAN&gt;

                        &lt;SPAN class="hljs-comment"&gt;/* fall through */&lt;/SPAN&gt;

                &lt;SPAN class="hljs-keyword"&gt;default&lt;/SPAN&gt;:
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_DQBUF"&lt;/SPAN&gt;);
                }
        }

        assert(buf.index &amp;lt; n_buffers);

        process_image(buffers[buf.index].start, buf.bytesused);

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_QBUF, &amp;amp;buf))
                errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_QBUF"&lt;/SPAN&gt;);

        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;;
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;mainloop&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"mainloop\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; count;

        count = frame_count;

        &lt;SPAN class="hljs-keyword"&gt;while&lt;/SPAN&gt; (count-- &amp;gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) {
                &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"count number = %d\n"&lt;/SPAN&gt;, count );
                &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (;;) {
                        fd_set fds;
                        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;timeval&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;tv&lt;/SPAN&gt;;&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; r;

                        FD_ZERO(&amp;amp;fds);      &lt;SPAN class="hljs-comment"&gt;// clear file descriptor&lt;/SPAN&gt;
                        FD_SET(fd, &amp;amp;fds);   &lt;SPAN class="hljs-comment"&gt;// set file descriptors to the descriptor fd&lt;/SPAN&gt;

                        &lt;SPAN class="hljs-comment"&gt;/* Timeout. */&lt;/SPAN&gt;
                        tv.tv_sec = &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;;
                        tv.tv_usec = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;;

                        r = select(fd + &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;, &amp;amp;fds, &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;, &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;, &amp;amp;tv);    &lt;SPAN class="hljs-comment"&gt;// select uses a timeout, allows program to monitor file descriptors waiting untill files becomes "ready"&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-comment"&gt;// returns the number of file descriptors changed. This maybe zero if timeout expires.&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-comment"&gt;// probably watching reafds descriptor to change?&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == r) {
                                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (EINTR == errno)
                                        &lt;SPAN class="hljs-keyword"&gt;continue&lt;/SPAN&gt;;
                                errno_exit(&lt;SPAN class="hljs-string"&gt;"select"&lt;/SPAN&gt;);
                        }

                        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt; == r) {
                                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"select timeout\n"&lt;/SPAN&gt;);
                                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
                        }

                        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (read_frame())   &lt;SPAN class="hljs-comment"&gt;// if one of the descriptors is set, a frame can be read.&lt;/SPAN&gt;
                                &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;;
                        &lt;SPAN class="hljs-comment"&gt;/* EAGAIN - continue select loop. */&lt;/SPAN&gt;
                }
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"mainloop ended\n"&lt;/SPAN&gt;);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;stop_capturing&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"stop capturing\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;enum&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buf_type&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;type&lt;/SPAN&gt;;&lt;/SPAN&gt;

        type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_STREAMOFF, &amp;amp;type))
                errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_STREAMOFF"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"capturing stopped\n"&lt;/SPAN&gt;);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;start_capturing&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"initiating capturing\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i;
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;enum&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buf_type&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;type&lt;/SPAN&gt;;&lt;/SPAN&gt;

        &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; n_buffers; ++i) {
                &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buffer&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buf&lt;/SPAN&gt;;&lt;/SPAN&gt;

                CLEAR(buf);
                buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                buf.memory = V4L2_MEMORY_MMAP;
                buf.index = i;

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_QBUF, &amp;amp;buf))
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_QBUF"&lt;/SPAN&gt;);
        }

        type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_STREAMON, &amp;amp;type)){
                errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_STREAMON"&lt;/SPAN&gt;);
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"capturing initiated\n"&lt;/SPAN&gt;);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;uninit_device&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i;

        &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; n_buffers; ++i){
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == munmap(buffers[i].start, buffers[i].length)){
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"munmap"&lt;/SPAN&gt;);
                }
        }

        &lt;SPAN class="hljs-built_in"&gt;free&lt;/SPAN&gt;(buffers);
}


&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;init_mmap&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"initiating mmap buffer\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_requestbuffers&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;req&lt;/SPAN&gt;;&lt;/SPAN&gt;   &lt;SPAN class="hljs-comment"&gt;//struct with details of the buffer to compose&lt;/SPAN&gt;

        CLEAR(req);

        req.count = &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;;
        req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        req.memory = V4L2_MEMORY_MMAP;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_REQBUFS, &amp;amp;req)) { &lt;SPAN class="hljs-comment"&gt;// initiate buffer&lt;/SPAN&gt;
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (EINVAL == errno) {
                        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s does not support "&lt;/SPAN&gt;
                                 &lt;SPAN class="hljs-string"&gt;"memory mapping\n"&lt;/SPAN&gt;, dev_name);
                        &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
                } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_REQBUFS"&lt;/SPAN&gt;);
                }
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"memory allocated\n"&lt;/SPAN&gt;);

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (req.count &amp;lt; &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Insufficient buffer memory on %s\n"&lt;/SPAN&gt;,
                         dev_name);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        buffers = &lt;SPAN class="hljs-built_in"&gt;calloc&lt;/SPAN&gt;(req.count, &lt;SPAN class="hljs-keyword"&gt;sizeof&lt;/SPAN&gt;(*buffers));    &lt;SPAN class="hljs-comment"&gt;// make the amount of buffers available&lt;/SPAN&gt;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!buffers) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Out of memory\n"&lt;/SPAN&gt;);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (n_buffers = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; n_buffers &amp;lt; req.count; ++n_buffers) {   &lt;SPAN class="hljs-comment"&gt;// go through buffers and adjust struct in it&lt;/SPAN&gt;
                &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buffer&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buf&lt;/SPAN&gt;;&lt;/SPAN&gt;

                CLEAR(buf);

                buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                buf.memory      = V4L2_MEMORY_MMAP;
                buf.index       = n_buffers;

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_QUERYBUF, &amp;amp;buf))
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_QUERYBUF"&lt;/SPAN&gt;);

                buffers[n_buffers].length = buf.length;
                buffers[n_buffers].start =
                        mmap(&lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt; &lt;SPAN class="hljs-comment"&gt;/* start anywhere */&lt;/SPAN&gt;,
                              buf.length,
                              PROT_READ | PROT_WRITE &lt;SPAN class="hljs-comment"&gt;/* required */&lt;/SPAN&gt;,
                              MAP_SHARED &lt;SPAN class="hljs-comment"&gt;/* recommended */&lt;/SPAN&gt;,
                              fd, buf.m.offset);

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (MAP_FAILED == buffers[n_buffers].start)
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"mmap"&lt;/SPAN&gt;);
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"mmap buffer initiated\n"&lt;/SPAN&gt;);
}


&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;init_device&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"initiating device\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_capability&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;cap&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_cropcap&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;cropcap&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_crop&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;crop&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_format&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;fmt&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; min;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_QUERYCAP, &amp;amp;cap)) {  &lt;SPAN class="hljs-comment"&gt;// gets information about driver and harware capabilities&lt;/SPAN&gt;
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (EINVAL == errno) {                  &lt;SPAN class="hljs-comment"&gt;// driver is not compatible with specifications&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s is no V4L2 device\n"&lt;/SPAN&gt;,
                                 dev_name);
                        &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
                } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_QUERYCAP"&lt;/SPAN&gt;);
                }
        }

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!(cap.capabilities &amp;amp; V4L2_CAP_VIDEO_CAPTURE)) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s is no video capture device\n"&lt;/SPAN&gt;,
                         dev_name);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!(cap.capabilities &amp;amp; V4L2_CAP_STREAMING)) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s does not support streaming i/o\n"&lt;/SPAN&gt;,
                         dev_name);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        &lt;SPAN class="hljs-comment"&gt;/* Select video input, video standard and tune here. */&lt;/SPAN&gt;

        CLEAR(cropcap);

        cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt; == xioctl(fd, VIDIOC_CROPCAP, &amp;amp;cropcap)) {  &lt;SPAN class="hljs-comment"&gt;// used to get cropping limits, pixel aspects, ... fill in type field and get all this information back&lt;/SPAN&gt;
                crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                crop.c = cropcap.defrect; &lt;SPAN class="hljs-comment"&gt;/* reset to default */&lt;/SPAN&gt;

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_S_CROP, &amp;amp;crop)) { &lt;SPAN class="hljs-comment"&gt;// get cropping rectangle&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-keyword"&gt;switch&lt;/SPAN&gt; (errno) {
                        &lt;SPAN class="hljs-keyword"&gt;case&lt;/SPAN&gt; EINVAL:
                                &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"EINVAL in VIDIOC_S_CROP\n"&lt;/SPAN&gt;);
                                &lt;SPAN class="hljs-comment"&gt;/* Cropping not supported. */&lt;/SPAN&gt;
                                &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;;
                        &lt;SPAN class="hljs-keyword"&gt;default&lt;/SPAN&gt;:
                                &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"other error in VIDIOC_S_CROP\n"&lt;/SPAN&gt;);
                                &lt;SPAN class="hljs-comment"&gt;/* Errors ignored. */&lt;/SPAN&gt;
                                &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;;
                        }
                }
        } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                &lt;SPAN class="hljs-comment"&gt;/* Errors ignored. */&lt;/SPAN&gt;
        }


        CLEAR(fmt);   &lt;SPAN class="hljs-comment"&gt;// set the format of the v4l2 video&lt;/SPAN&gt;

        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (force_format) {
                  &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Set H264\r\n"&lt;/SPAN&gt;);
                fmt.fmt.pix.width       = &lt;SPAN class="hljs-number"&gt;640&lt;/SPAN&gt;; &lt;SPAN class="hljs-comment"&gt;//replace&lt;/SPAN&gt;
                fmt.fmt.pix.height      = &lt;SPAN class="hljs-number"&gt;480&lt;/SPAN&gt;; &lt;SPAN class="hljs-comment"&gt;//replace&lt;/SPAN&gt;
                fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_H264; &lt;SPAN class="hljs-comment"&gt;//replace&lt;/SPAN&gt;
                fmt.fmt.pix.field       = V4L2_FIELD_ANY;

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_S_FMT, &amp;amp;fmt))
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_S_FMT"&lt;/SPAN&gt;);

                &lt;SPAN class="hljs-comment"&gt;/* Note VIDIOC_S_FMT may change width and height. */&lt;/SPAN&gt;
        } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                &lt;SPAN class="hljs-comment"&gt;/* Preserve original settings as set by v4l2-ctl for example */&lt;/SPAN&gt;
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_G_FMT, &amp;amp;fmt))
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_G_FMT"&lt;/SPAN&gt;);
        }

        &lt;SPAN class="hljs-comment"&gt;/* Buggy driver paranoia. */&lt;/SPAN&gt;
        min = fmt.fmt.pix.width * &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (fmt.fmt.pix.bytesperline &amp;lt; min)
                fmt.fmt.pix.bytesperline = min;

        min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (fmt.fmt.pix.sizeimage &amp;lt; min)
                fmt.fmt.pix.sizeimage = min;

        init_mmap();
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"device inititiated\n"&lt;/SPAN&gt;);
}


&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;close_device&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"closing device\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == close(fd))
                errno_exit(&lt;SPAN class="hljs-string"&gt;"close"&lt;/SPAN&gt;);

        fd = &lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt;;
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"device closed\n"&lt;/SPAN&gt;);
}


&lt;SPAN class="hljs-comment"&gt;/*
struct stat {
               dev_t     st_dev;         ID of device containing file
               ino_t     st_ino;         Inode number
               mode_t    st_mode;        File type and mode
               nlink_t   st_nlink;       Number of hard links
               uid_t     st_uid;         User ID of owner
               gid_t     st_gid;         Group ID of owner
               dev_t     st_rdev;        Device ID (if special file)
               off_t     st_size;        Total size, in bytes
               blksize_t st_blksize;     Block size for filesystem I/O
               blkcnt_t  st_blocks;      Number of 512B blocks allocated

                  Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES.

               struct timespec st_atim;  Time of last access
               struct timespec st_mtim;  Time of last modification
               struct timespec st_ctim;  Time of last status change

           #define st_atime st_atim.tv_sec      Backward compatibility
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };
*/&lt;/SPAN&gt;

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;open_device&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"openening device\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;stat&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;st&lt;/SPAN&gt;;&lt;/SPAN&gt;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == stat(dev_name, &amp;amp;st)) {                              &lt;SPAN class="hljs-comment"&gt;// stat() returns info about file into struct&lt;/SPAN&gt;
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Cannot identify '%s': %d, %s\n"&lt;/SPAN&gt;,
                         dev_name, errno, strerror(errno));
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!S_ISCHR(st.st_mode)) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s is no device\n"&lt;/SPAN&gt;, dev_name);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        fd = open(dev_name, O_RDWR &lt;SPAN class="hljs-comment"&gt;/* required */&lt;/SPAN&gt; | O_NONBLOCK, &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;);   &lt;SPAN class="hljs-comment"&gt;// open the file dev/video0, returns a file descriptor&lt;/SPAN&gt;

        &lt;SPAN class="hljs-comment"&gt;// if fd == -1, the file could not be opened.&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == fd) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Cannot open '%s': %d, %s\n"&lt;/SPAN&gt;,
                         dev_name, errno, strerror(errno));
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"device opened\n"&lt;/SPAN&gt;);
}


&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;main&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; argc, &lt;SPAN class="hljs-keyword"&gt;char&lt;/SPAN&gt; **argv)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"main begins\n"&lt;/SPAN&gt;);
        dev_name = &lt;SPAN class="hljs-string"&gt;"/dev/video0"&lt;/SPAN&gt;;

        &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (;;) {
                &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"back here\n"&lt;/SPAN&gt;);
                &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;;
        }

        open_device();
        init_device();
        start_capturing();
        mainloop();
        stop_capturing();
        uninit_device();
        close_device();
        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;;
}&lt;/PRE&gt;&lt;P&gt;However I get the following error:&lt;/P&gt;&lt;PRE&gt;VIDIOC_REQBUFS error &lt;SPAN class="hljs-number"&gt;12&lt;/SPAN&gt;, Cannot allocate memory&lt;/PRE&gt;&lt;P&gt;The entire output is:&lt;/P&gt;&lt;PRE&gt;main begins
back here
openening device
device opened
initiating device
initiating mmap buffer
VIDIOC_REQBUFS error &lt;SPAN class="hljs-number"&gt;12&lt;/SPAN&gt;, Cannot allocate memory
make: *** [makefile:&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;: all] Error &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;P&gt;In the above code this is caused by:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_REQBUFS, &amp;amp;req)) { &lt;SPAN class="hljs-comment"&gt;// initiate buffer&lt;/SPAN&gt;
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (EINVAL == errno) {
                        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s does not support "&lt;/SPAN&gt;
                                 &lt;SPAN class="hljs-string"&gt;"memory mapping\n"&lt;/SPAN&gt;, dev_name);
                        &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
                } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_REQBUFS"&lt;/SPAN&gt;);
                }
        }&lt;/PRE&gt;&lt;P&gt;Thus the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;ioctl(fd, VIDIOC_REQBUFS, &amp;amp;req)&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;causes this error. I have already looked on StackOverflow and found 1 other person with the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://stackoverflow.com/questions/38637371/vidioc-reqbufs-error-12-when-opening-multiple-v4l2-sources" target="_blank" rel="noopener"&gt;same mistake&lt;/A&gt;. He suggested to change CONFIG_CMA_SIZE_MBYTES to 32 from 16. I tried this by looking where I could find this setting. I found it in: boot/config-4.14.98-imx . However, it was already 320. (yes tenfold). I am now rather stuck on this. Is there a problem in my code, or do I need to change the setting from 320 to 32 (which seems counterintuitive).&lt;/P&gt;&lt;P&gt;With kind regards.&lt;/P&gt;</description>
    <pubDate>Wed, 16 Jun 2021 10:29:03 GMT</pubDate>
    <dc:creator>DYD</dc:creator>
    <dc:date>2021-06-16T10:29:03Z</dc:date>
    <item>
      <title>V4L2 VIDIOC_REQBUFS cannot allocate enough memory</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/V4L2-VIDIOC-REQBUFS-cannot-allocate-enough-memory/m-p/1293188#M175592</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Dear,&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I&amp;nbsp;&lt;/SPAN&gt;am writing a MIPI driver without using the I2C functionality, since it is not possible for me to use it. I am writing this for the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://coral.ai/" target="_blank" rel="nofollow noopener noreferrer"&gt;Google Coral&lt;/A&gt;. To write this new driver I looked at&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://gist.github.com/maxlapshin/1253534" target="_blank" rel="nofollow noopener noreferrer"&gt;this example&lt;/A&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and adjusted it to only use the MMAP functionality. My new code is this:&lt;/P&gt;&lt;PRE&gt;    &lt;SPAN class="hljs-comment"&gt;/*
 *  V4L2 video capture example
 *
 *  This program can be used and distributed without restrictions.
 *
 *      This program is provided with the V4L2 API
 * see http://linuxtv.org/docs.php for more information
 */&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;stdio.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;string.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;assert.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;getopt.h&amp;gt;&lt;/SPAN&gt;             &lt;SPAN class="hljs-comment"&gt;/* getopt_long() */&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/SPAN&gt;              &lt;SPAN class="hljs-comment"&gt;/* low-level i/o */&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;unistd.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;errno.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/time.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/mman.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;sys/ioctl.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;linux/videodev2.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;


&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; CLEAR(x) memset(&amp;amp;(x), 0, sizeof(x))&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifndef&lt;/SPAN&gt; V4L2_PIX_FMT_H264&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; V4L2_PIX_FMT_H264     v4l2_fourcc(&lt;SPAN class="hljs-meta-string"&gt;'H'&lt;/SPAN&gt;, &lt;SPAN class="hljs-meta-string"&gt;'2'&lt;/SPAN&gt;, &lt;SPAN class="hljs-meta-string"&gt;'6'&lt;/SPAN&gt;, &lt;SPAN class="hljs-meta-string"&gt;'4'&lt;/SPAN&gt;) &lt;SPAN class="hljs-comment"&gt;/* H264 with start codes */&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buffer&lt;/SPAN&gt; {&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;   *start;
        &lt;SPAN class="hljs-keyword"&gt;size_t&lt;/SPAN&gt;  length;
};

&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;char&lt;/SPAN&gt;            *dev_name;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              fd = &lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt;;
&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buffer&lt;/SPAN&gt;          *&lt;SPAN class="hljs-title"&gt;buffers&lt;/SPAN&gt;;&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;     n_buffers;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              out_buf;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              force_format;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              frame_count = &lt;SPAN class="hljs-number"&gt;200&lt;/SPAN&gt;;
&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;              frame_number = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;;

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;errno_exit&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;char&lt;/SPAN&gt; *s)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s error %d, %s\n"&lt;/SPAN&gt;, s, errno, strerror(errno));
        &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;xioctl&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; fh, &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; request, &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *arg)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; r;

        &lt;SPAN class="hljs-keyword"&gt;do&lt;/SPAN&gt; {
                r = ioctl(fh, request, arg);
        } &lt;SPAN class="hljs-keyword"&gt;while&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == r &amp;amp;&amp;amp; EINTR == errno);

        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; r;
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;process_image&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *p, &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; size)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"processing image\n"&lt;/SPAN&gt;);
        frame_number++;
        &lt;SPAN class="hljs-keyword"&gt;char&lt;/SPAN&gt; filename[&lt;SPAN class="hljs-number"&gt;15&lt;/SPAN&gt;];
        &lt;SPAN class="hljs-built_in"&gt;sprintf&lt;/SPAN&gt;(filename, &lt;SPAN class="hljs-string"&gt;"frame-%d.raw"&lt;/SPAN&gt;, frame_number);    &lt;SPAN class="hljs-comment"&gt;// filename becomes frame-x.raw&lt;/SPAN&gt;
        FILE *fp=fopen(filename,&lt;SPAN class="hljs-string"&gt;"wb"&lt;/SPAN&gt;);

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (out_buf)
                fwrite(p, size, &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;, fp);                     &lt;SPAN class="hljs-comment"&gt;// write data to file fp&lt;/SPAN&gt;

        fflush(fp);
        fclose(fp);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;read_frame&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"reading frame\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buffer&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buf&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i;

        CLEAR(buf);

        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        buf.memory = V4L2_MEMORY_MMAP;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_DQBUF, &amp;amp;buf)) {
                &lt;SPAN class="hljs-keyword"&gt;switch&lt;/SPAN&gt; (errno) {
                &lt;SPAN class="hljs-keyword"&gt;case&lt;/SPAN&gt; EAGAIN:
                        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;;

                &lt;SPAN class="hljs-keyword"&gt;case&lt;/SPAN&gt; EIO:
                        &lt;SPAN class="hljs-comment"&gt;/* Could ignore EIO, see spec. */&lt;/SPAN&gt;

                        &lt;SPAN class="hljs-comment"&gt;/* fall through */&lt;/SPAN&gt;

                &lt;SPAN class="hljs-keyword"&gt;default&lt;/SPAN&gt;:
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_DQBUF"&lt;/SPAN&gt;);
                }
        }

        assert(buf.index &amp;lt; n_buffers);

        process_image(buffers[buf.index].start, buf.bytesused);

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_QBUF, &amp;amp;buf))
                errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_QBUF"&lt;/SPAN&gt;);

        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;;
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;mainloop&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"mainloop\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; count;

        count = frame_count;

        &lt;SPAN class="hljs-keyword"&gt;while&lt;/SPAN&gt; (count-- &amp;gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) {
                &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"count number = %d\n"&lt;/SPAN&gt;, count );
                &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (;;) {
                        fd_set fds;
                        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;timeval&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;tv&lt;/SPAN&gt;;&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; r;

                        FD_ZERO(&amp;amp;fds);      &lt;SPAN class="hljs-comment"&gt;// clear file descriptor&lt;/SPAN&gt;
                        FD_SET(fd, &amp;amp;fds);   &lt;SPAN class="hljs-comment"&gt;// set file descriptors to the descriptor fd&lt;/SPAN&gt;

                        &lt;SPAN class="hljs-comment"&gt;/* Timeout. */&lt;/SPAN&gt;
                        tv.tv_sec = &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;;
                        tv.tv_usec = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;;

                        r = select(fd + &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;, &amp;amp;fds, &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;, &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;, &amp;amp;tv);    &lt;SPAN class="hljs-comment"&gt;// select uses a timeout, allows program to monitor file descriptors waiting untill files becomes "ready"&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-comment"&gt;// returns the number of file descriptors changed. This maybe zero if timeout expires.&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-comment"&gt;// probably watching reafds descriptor to change?&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == r) {
                                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (EINTR == errno)
                                        &lt;SPAN class="hljs-keyword"&gt;continue&lt;/SPAN&gt;;
                                errno_exit(&lt;SPAN class="hljs-string"&gt;"select"&lt;/SPAN&gt;);
                        }

                        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt; == r) {
                                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"select timeout\n"&lt;/SPAN&gt;);
                                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
                        }

                        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (read_frame())   &lt;SPAN class="hljs-comment"&gt;// if one of the descriptors is set, a frame can be read.&lt;/SPAN&gt;
                                &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;;
                        &lt;SPAN class="hljs-comment"&gt;/* EAGAIN - continue select loop. */&lt;/SPAN&gt;
                }
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"mainloop ended\n"&lt;/SPAN&gt;);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;stop_capturing&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"stop capturing\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;enum&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buf_type&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;type&lt;/SPAN&gt;;&lt;/SPAN&gt;

        type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_STREAMOFF, &amp;amp;type))
                errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_STREAMOFF"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"capturing stopped\n"&lt;/SPAN&gt;);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;start_capturing&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"initiating capturing\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i;
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;enum&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buf_type&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;type&lt;/SPAN&gt;;&lt;/SPAN&gt;

        &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; n_buffers; ++i) {
                &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buffer&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buf&lt;/SPAN&gt;;&lt;/SPAN&gt;

                CLEAR(buf);
                buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                buf.memory = V4L2_MEMORY_MMAP;
                buf.index = i;

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_QBUF, &amp;amp;buf))
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_QBUF"&lt;/SPAN&gt;);
        }

        type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_STREAMON, &amp;amp;type)){
                errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_STREAMON"&lt;/SPAN&gt;);
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"capturing initiated\n"&lt;/SPAN&gt;);
}

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;uninit_device&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i;

        &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; n_buffers; ++i){
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == munmap(buffers[i].start, buffers[i].length)){
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"munmap"&lt;/SPAN&gt;);
                }
        }

        &lt;SPAN class="hljs-built_in"&gt;free&lt;/SPAN&gt;(buffers);
}


&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;init_mmap&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"initiating mmap buffer\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_requestbuffers&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;req&lt;/SPAN&gt;;&lt;/SPAN&gt;   &lt;SPAN class="hljs-comment"&gt;//struct with details of the buffer to compose&lt;/SPAN&gt;

        CLEAR(req);

        req.count = &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;;
        req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        req.memory = V4L2_MEMORY_MMAP;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_REQBUFS, &amp;amp;req)) { &lt;SPAN class="hljs-comment"&gt;// initiate buffer&lt;/SPAN&gt;
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (EINVAL == errno) {
                        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s does not support "&lt;/SPAN&gt;
                                 &lt;SPAN class="hljs-string"&gt;"memory mapping\n"&lt;/SPAN&gt;, dev_name);
                        &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
                } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_REQBUFS"&lt;/SPAN&gt;);
                }
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"memory allocated\n"&lt;/SPAN&gt;);

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (req.count &amp;lt; &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Insufficient buffer memory on %s\n"&lt;/SPAN&gt;,
                         dev_name);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        buffers = &lt;SPAN class="hljs-built_in"&gt;calloc&lt;/SPAN&gt;(req.count, &lt;SPAN class="hljs-keyword"&gt;sizeof&lt;/SPAN&gt;(*buffers));    &lt;SPAN class="hljs-comment"&gt;// make the amount of buffers available&lt;/SPAN&gt;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!buffers) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Out of memory\n"&lt;/SPAN&gt;);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (n_buffers = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; n_buffers &amp;lt; req.count; ++n_buffers) {   &lt;SPAN class="hljs-comment"&gt;// go through buffers and adjust struct in it&lt;/SPAN&gt;
                &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_buffer&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;buf&lt;/SPAN&gt;;&lt;/SPAN&gt;

                CLEAR(buf);

                buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                buf.memory      = V4L2_MEMORY_MMAP;
                buf.index       = n_buffers;

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_QUERYBUF, &amp;amp;buf))
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_QUERYBUF"&lt;/SPAN&gt;);

                buffers[n_buffers].length = buf.length;
                buffers[n_buffers].start =
                        mmap(&lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt; &lt;SPAN class="hljs-comment"&gt;/* start anywhere */&lt;/SPAN&gt;,
                              buf.length,
                              PROT_READ | PROT_WRITE &lt;SPAN class="hljs-comment"&gt;/* required */&lt;/SPAN&gt;,
                              MAP_SHARED &lt;SPAN class="hljs-comment"&gt;/* recommended */&lt;/SPAN&gt;,
                              fd, buf.m.offset);

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (MAP_FAILED == buffers[n_buffers].start)
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"mmap"&lt;/SPAN&gt;);
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"mmap buffer initiated\n"&lt;/SPAN&gt;);
}


&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;init_device&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"initiating device\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_capability&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;cap&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_cropcap&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;cropcap&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_crop&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;crop&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;v4l2_format&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;fmt&lt;/SPAN&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; min;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_QUERYCAP, &amp;amp;cap)) {  &lt;SPAN class="hljs-comment"&gt;// gets information about driver and harware capabilities&lt;/SPAN&gt;
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (EINVAL == errno) {                  &lt;SPAN class="hljs-comment"&gt;// driver is not compatible with specifications&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s is no V4L2 device\n"&lt;/SPAN&gt;,
                                 dev_name);
                        &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
                } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_QUERYCAP"&lt;/SPAN&gt;);
                }
        }

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!(cap.capabilities &amp;amp; V4L2_CAP_VIDEO_CAPTURE)) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s is no video capture device\n"&lt;/SPAN&gt;,
                         dev_name);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!(cap.capabilities &amp;amp; V4L2_CAP_STREAMING)) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s does not support streaming i/o\n"&lt;/SPAN&gt;,
                         dev_name);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        &lt;SPAN class="hljs-comment"&gt;/* Select video input, video standard and tune here. */&lt;/SPAN&gt;

        CLEAR(cropcap);

        cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt; == xioctl(fd, VIDIOC_CROPCAP, &amp;amp;cropcap)) {  &lt;SPAN class="hljs-comment"&gt;// used to get cropping limits, pixel aspects, ... fill in type field and get all this information back&lt;/SPAN&gt;
                crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                crop.c = cropcap.defrect; &lt;SPAN class="hljs-comment"&gt;/* reset to default */&lt;/SPAN&gt;

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_S_CROP, &amp;amp;crop)) { &lt;SPAN class="hljs-comment"&gt;// get cropping rectangle&lt;/SPAN&gt;
                        &lt;SPAN class="hljs-keyword"&gt;switch&lt;/SPAN&gt; (errno) {
                        &lt;SPAN class="hljs-keyword"&gt;case&lt;/SPAN&gt; EINVAL:
                                &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"EINVAL in VIDIOC_S_CROP\n"&lt;/SPAN&gt;);
                                &lt;SPAN class="hljs-comment"&gt;/* Cropping not supported. */&lt;/SPAN&gt;
                                &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;;
                        &lt;SPAN class="hljs-keyword"&gt;default&lt;/SPAN&gt;:
                                &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"other error in VIDIOC_S_CROP\n"&lt;/SPAN&gt;);
                                &lt;SPAN class="hljs-comment"&gt;/* Errors ignored. */&lt;/SPAN&gt;
                                &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;;
                        }
                }
        } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                &lt;SPAN class="hljs-comment"&gt;/* Errors ignored. */&lt;/SPAN&gt;
        }


        CLEAR(fmt);   &lt;SPAN class="hljs-comment"&gt;// set the format of the v4l2 video&lt;/SPAN&gt;

        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (force_format) {
                  &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Set H264\r\n"&lt;/SPAN&gt;);
                fmt.fmt.pix.width       = &lt;SPAN class="hljs-number"&gt;640&lt;/SPAN&gt;; &lt;SPAN class="hljs-comment"&gt;//replace&lt;/SPAN&gt;
                fmt.fmt.pix.height      = &lt;SPAN class="hljs-number"&gt;480&lt;/SPAN&gt;; &lt;SPAN class="hljs-comment"&gt;//replace&lt;/SPAN&gt;
                fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_H264; &lt;SPAN class="hljs-comment"&gt;//replace&lt;/SPAN&gt;
                fmt.fmt.pix.field       = V4L2_FIELD_ANY;

                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_S_FMT, &amp;amp;fmt))
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_S_FMT"&lt;/SPAN&gt;);

                &lt;SPAN class="hljs-comment"&gt;/* Note VIDIOC_S_FMT may change width and height. */&lt;/SPAN&gt;
        } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                &lt;SPAN class="hljs-comment"&gt;/* Preserve original settings as set by v4l2-ctl for example */&lt;/SPAN&gt;
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_G_FMT, &amp;amp;fmt))
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_G_FMT"&lt;/SPAN&gt;);
        }

        &lt;SPAN class="hljs-comment"&gt;/* Buggy driver paranoia. */&lt;/SPAN&gt;
        min = fmt.fmt.pix.width * &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (fmt.fmt.pix.bytesperline &amp;lt; min)
                fmt.fmt.pix.bytesperline = min;

        min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (fmt.fmt.pix.sizeimage &amp;lt; min)
                fmt.fmt.pix.sizeimage = min;

        init_mmap();
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"device inititiated\n"&lt;/SPAN&gt;);
}


&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;close_device&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"closing device\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == close(fd))
                errno_exit(&lt;SPAN class="hljs-string"&gt;"close"&lt;/SPAN&gt;);

        fd = &lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt;;
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"device closed\n"&lt;/SPAN&gt;);
}


&lt;SPAN class="hljs-comment"&gt;/*
struct stat {
               dev_t     st_dev;         ID of device containing file
               ino_t     st_ino;         Inode number
               mode_t    st_mode;        File type and mode
               nlink_t   st_nlink;       Number of hard links
               uid_t     st_uid;         User ID of owner
               gid_t     st_gid;         Group ID of owner
               dev_t     st_rdev;        Device ID (if special file)
               off_t     st_size;        Total size, in bytes
               blksize_t st_blksize;     Block size for filesystem I/O
               blkcnt_t  st_blocks;      Number of 512B blocks allocated

                  Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES.

               struct timespec st_atim;  Time of last access
               struct timespec st_mtim;  Time of last modification
               struct timespec st_ctim;  Time of last status change

           #define st_atime st_atim.tv_sec      Backward compatibility
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };
*/&lt;/SPAN&gt;

&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;open_device&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"openening device\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;stat&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;st&lt;/SPAN&gt;;&lt;/SPAN&gt;

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == stat(dev_name, &amp;amp;st)) {                              &lt;SPAN class="hljs-comment"&gt;// stat() returns info about file into struct&lt;/SPAN&gt;
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Cannot identify '%s': %d, %s\n"&lt;/SPAN&gt;,
                         dev_name, errno, strerror(errno));
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!S_ISCHR(st.st_mode)) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s is no device\n"&lt;/SPAN&gt;, dev_name);
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }

        fd = open(dev_name, O_RDWR &lt;SPAN class="hljs-comment"&gt;/* required */&lt;/SPAN&gt; | O_NONBLOCK, &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;);   &lt;SPAN class="hljs-comment"&gt;// open the file dev/video0, returns a file descriptor&lt;/SPAN&gt;

        &lt;SPAN class="hljs-comment"&gt;// if fd == -1, the file could not be opened.&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == fd) {
                &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"Cannot open '%s': %d, %s\n"&lt;/SPAN&gt;,
                         dev_name, errno, strerror(errno));
                &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
        }
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"device opened\n"&lt;/SPAN&gt;);
}


&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;main&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; argc, &lt;SPAN class="hljs-keyword"&gt;char&lt;/SPAN&gt; **argv)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
        &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"main begins\n"&lt;/SPAN&gt;);
        dev_name = &lt;SPAN class="hljs-string"&gt;"/dev/video0"&lt;/SPAN&gt;;

        &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (;;) {
                &lt;SPAN class="hljs-built_in"&gt;printf&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"back here\n"&lt;/SPAN&gt;);
                &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;;
        }

        open_device();
        init_device();
        start_capturing();
        mainloop();
        stop_capturing();
        uninit_device();
        close_device();
        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"\n"&lt;/SPAN&gt;);
        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;;
}&lt;/PRE&gt;&lt;P&gt;However I get the following error:&lt;/P&gt;&lt;PRE&gt;VIDIOC_REQBUFS error &lt;SPAN class="hljs-number"&gt;12&lt;/SPAN&gt;, Cannot allocate memory&lt;/PRE&gt;&lt;P&gt;The entire output is:&lt;/P&gt;&lt;PRE&gt;main begins
back here
openening device
device opened
initiating device
initiating mmap buffer
VIDIOC_REQBUFS error &lt;SPAN class="hljs-number"&gt;12&lt;/SPAN&gt;, Cannot allocate memory
make: *** [makefile:&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;: all] Error &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;P&gt;In the above code this is caused by:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;-1&lt;/SPAN&gt; == xioctl(fd, VIDIOC_REQBUFS, &amp;amp;req)) { &lt;SPAN class="hljs-comment"&gt;// initiate buffer&lt;/SPAN&gt;
                &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (EINVAL == errno) {
                        &lt;SPAN class="hljs-built_in"&gt;fprintf&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;stderr&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"%s does not support "&lt;/SPAN&gt;
                                 &lt;SPAN class="hljs-string"&gt;"memory mapping\n"&lt;/SPAN&gt;, dev_name);
                        &lt;SPAN class="hljs-built_in"&gt;exit&lt;/SPAN&gt;(EXIT_FAILURE);
                } &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; {
                        errno_exit(&lt;SPAN class="hljs-string"&gt;"VIDIOC_REQBUFS"&lt;/SPAN&gt;);
                }
        }&lt;/PRE&gt;&lt;P&gt;Thus the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;ioctl(fd, VIDIOC_REQBUFS, &amp;amp;req)&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;causes this error. I have already looked on StackOverflow and found 1 other person with the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://stackoverflow.com/questions/38637371/vidioc-reqbufs-error-12-when-opening-multiple-v4l2-sources" target="_blank" rel="noopener"&gt;same mistake&lt;/A&gt;. He suggested to change CONFIG_CMA_SIZE_MBYTES to 32 from 16. I tried this by looking where I could find this setting. I found it in: boot/config-4.14.98-imx . However, it was already 320. (yes tenfold). I am now rather stuck on this. Is there a problem in my code, or do I need to change the setting from 320 to 32 (which seems counterintuitive).&lt;/P&gt;&lt;P&gt;With kind regards.&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jun 2021 10:29:03 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/V4L2-VIDIOC-REQBUFS-cannot-allocate-enough-memory/m-p/1293188#M175592</guid>
      <dc:creator>DYD</dc:creator>
      <dc:date>2021-06-16T10:29:03Z</dc:date>
    </item>
    <item>
      <title>Re: V4L2 VIDIOC_REQBUFS cannot allocate enough memory</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/V4L2-VIDIOC-REQBUFS-cannot-allocate-enough-memory/m-p/1298618#M176068</link>
      <description>&lt;P&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;It looks like the system has not enough memory for operation, unfortunately I cannot say much about the google coral, but you can look into the CMA memory in your dts and increase it if possible.&lt;BR /&gt;&lt;BR /&gt;I would recommend reaching Google trough their support options to see if they have additional information on how to handle this&lt;/P&gt;
&lt;P&gt;&lt;A href="https://coral.ai/support/" target="_blank"&gt;https://coral.ai/support/&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;Best regards,&lt;BR /&gt;Aldo.&lt;/P&gt;</description>
      <pubDate>Sat, 26 Jun 2021 02:28:03 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/V4L2-VIDIOC-REQBUFS-cannot-allocate-enough-memory/m-p/1298618#M176068</guid>
      <dc:creator>AldoG</dc:creator>
      <dc:date>2021-06-26T02:28:03Z</dc:date>
    </item>
  </channel>
</rss>

