#include
intmain{intfd;fd_setfds;FILEfile_fd;structtimevaltv;intret=-1,i,j,r;intnum_planes;structv4l2_capabilitycap;structv4l2_formatfmt;structv4l2_requestbuffersreq;structv4l2_bufferbuf;structv4l2_planeplanes_buffer;structplane_startplane_start;structbufferbuffers;enumv4l2_buf_typetype;
<span class="token keyword">if</span> <span class="token punctuation">(</span>argc <span class="token operator">!=</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Usage: v4l2_test <device> <frame_num> <save_file>
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"example: v4l2_test /dev/video0 10 test.yuv
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> ret<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
fd <span class="token operator">=</span> <span class="token function">open</span><span class="token punctuation">(</span>argv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> O_RDWR<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>fd <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"open device: %s fail
"</span><span class="token punctuation">,</span> argv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">goto</span> err<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
file_fd <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span>argv<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"wb+"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>file_fd<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"open save_file: %s fail
"</span><span class="token punctuation">,</span> argv<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">goto</span> err1<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">ioctl</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_QUERYCAP<span class="token punctuation">,</span> <span class="token operator">&</span>cap<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Get video capability error!
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">goto</span> err1<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span>cap<span class="token punctuation">.</span>device_caps <span class="token operator">&</span> V4L2_CAP_VIDEO_CAPTURE_MPLANE<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Video device not support capture!
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">goto</span> err1<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Support capture!
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">memset</span><span class="token punctuation">(</span><span class="token operator">&</span>fmt<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">struct</span> <span class="token class-name">v4l2_format</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
fmt<span class="token punctuation">.</span>type <span class="token operator">=</span> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE<span class="token punctuation">;</span>
fmt<span class="token punctuation">.</span>fmt<span class="token punctuation">.</span>pix_mp<span class="token punctuation">.</span>width <span class="token operator">=</span> <span class="token number">2400</span><span class="token punctuation">;</span>
fmt<span class="token punctuation">.</span>fmt<span class="token punctuation">.</span>pix_mp<span class="token punctuation">.</span>height <span class="token operator">=</span> <span class="token number">1920</span><span class="token punctuation">;</span>
fmt<span class="token punctuation">.</span>fmt<span class="token punctuation">.</span>pix_mp<span class="token punctuation">.</span>pixelformat <span class="token operator">=</span> V4L2_PIX_FMT_SRGGB12<span class="token punctuation">;</span>
fmt<span class="token punctuation">.</span>fmt<span class="token punctuation">.</span>pix_mp<span class="token punctuation">.</span>field <span class="token operator">=</span> V4L2_FIELD_ANY<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">ioctl</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_S_FMT<span class="token punctuation">,</span> <span class="token operator">&</span>fmt<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Set format fail
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">goto</span> err1<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"width = %d
"</span><span class="token punctuation">,</span> fmt<span class="token punctuation">.</span>fmt<span class="token punctuation">.</span>pix_mp<span class="token punctuation">.</span>width<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"height = %d
"</span><span class="token punctuation">,</span> fmt<span class="token punctuation">.</span>fmt<span class="token punctuation">.</span>pix_mp<span class="token punctuation">.</span>height<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"nmplane = %d
"</span><span class="token punctuation">,</span> fmt<span class="token punctuation">.</span>fmt<span class="token punctuation">.</span>pix_mp<span class="token punctuation">.</span>num_planes<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//memset(&fmt, 0, sizeof(struct v4l2_format));</span>
<span class="token comment">//fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;</span>
<span class="token comment">//if (ioctl(fd, VIDIOC_G_FMT, &fmt) < 0) {<!-- --></span>
<span class="token comment">// printf("Set format fail
");</span>
<span class="token comment">// goto err;</span>
<span class="token comment">//}</span>
<span class="token comment">//printf("nmplane = %d
", fmt.fmt.pix_mp.num_planes);</span>
req<span class="token punctuation">.</span>count <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span>
req<span class="token punctuation">.</span>type <span class="token operator">=</span> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE<span class="token punctuation">;</span>
req<span class="token punctuation">.</span>memory <span class="token operator">=</span> V4L2_MEMORY_MMAP<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">ioctl</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_REQBUFS<span class="token punctuation">,</span> <span class="token operator">&</span>req<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Reqbufs fail
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">goto</span> err1<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"buffer number: %d
"</span><span class="token punctuation">,</span> req<span class="token punctuation">.</span>count<span class="token punctuation">)</span><span class="token punctuation">;</span>
num_planes <span class="token operator">=</span> fmt<span class="token punctuation">.</span>fmt<span class="token punctuation">.</span>pix_mp<span class="token punctuation">.</span>num_planes<span class="token punctuation">;</span>
buffers <span class="token operator">=</span> <span class="token function">malloc</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>count <span class="token operator">*</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token operator">*</span>buffers<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> req<span class="token punctuation">.</span>count<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">memset</span><span class="token punctuation">(</span><span class="token operator">&</span>buf<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
planes_buffer <span class="token operator">=</span> <span class="token function">calloc</span><span class="token punctuation">(</span>num_planes<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token operator">*</span>planes_buffer<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
plane_start <span class="token operator">=</span> <span class="token function">calloc</span><span class="token punctuation">(</span>num_planes<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token operator">*</span>plane_start<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">memset</span><span class="token punctuation">(</span>planes_buffer<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token operator">*</span>planes_buffer<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>type <span class="token operator">=</span> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>memory <span class="token operator">=</span> V4L2_MEMORY_MMAP<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>m<span class="token punctuation">.</span>planes <span class="token operator">=</span> planes_buffer<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>length <span class="token operator">=</span> num_planes<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>index <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span> <span class="token operator">==</span> <span class="token function">ioctl</span> <span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_QUERYBUF<span class="token punctuation">,</span> <span class="token operator">&</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Querybuf fail
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
req<span class="token punctuation">.</span>count <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token keyword">goto</span> err2<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">(</span>buffers <span class="token operator">+</span> i<span class="token punctuation">)</span><span class="token operator">-></span>planes_buffer <span class="token operator">=</span> planes_buffer<span class="token punctuation">;</span>
<span class="token punctuation">(</span>buffers <span class="token operator">+</span> i<span class="token punctuation">)</span><span class="token operator">-></span>plane_start <span class="token operator">=</span> plane_start<span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span>j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> num_planes<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"plane[%d]: length = %d
"</span><span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token punctuation">(</span>planes_buffer <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>length<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"plane[%d]: offset = %d
"</span><span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token punctuation">(</span>planes_buffer <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>m<span class="token punctuation">.</span>mem_offset<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">(</span>plane_start <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>start <span class="token operator">=</span> <span class="token function">mmap</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token comment">/* start anywhere */</span><span class="token punctuation">,</span>
<span class="token punctuation">(</span>planes_buffer <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>length<span class="token punctuation">,</span>
PROT_READ <span class="token operator">|</span> PROT_WRITE <span class="token comment">/* required */</span><span class="token punctuation">,</span>
MAP_SHARED <span class="token comment">/* recommended */</span><span class="token punctuation">,</span>
fd<span class="token punctuation">,</span>
<span class="token punctuation">(</span>planes_buffer <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>m<span class="token punctuation">.</span>mem_offset<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>MAP_FAILED <span class="token operator">==</span> <span class="token punctuation">(</span>plane_start <span class="token operator">+</span>j<span class="token punctuation">)</span><span class="token operator">-></span>start<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span> <span class="token punctuation">(</span><span class="token string">"mmap failed
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
req<span class="token punctuation">.</span>count <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token keyword">goto</span> unmmap<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> req<span class="token punctuation">.</span>count<span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">memset</span><span class="token punctuation">(</span><span class="token operator">&</span>buf<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>type <span class="token operator">=</span> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>memory <span class="token operator">=</span> V4L2_MEMORY_MMAP<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>length <span class="token operator">=</span> num_planes<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>index <span class="token operator">=</span> i<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>m<span class="token punctuation">.</span>planes <span class="token operator">=</span> <span class="token punctuation">(</span>buffers <span class="token operator">+</span> i<span class="token punctuation">)</span><span class="token operator">-></span>planes_buffer<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">ioctl</span> <span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_QBUF<span class="token punctuation">,</span> <span class="token operator">&</span>buf<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token function">printf</span> <span class="token punctuation">(</span><span class="token string">"VIDIOC_QBUF failed
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
type <span class="token operator">=</span> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">ioctl</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_STREAMON<span class="token punctuation">,</span> <span class="token operator">&</span>type<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token function">printf</span> <span class="token punctuation">(</span><span class="token string">"VIDIOC_STREAMON failed
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> num <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">struct</span> <span class="token class-name">v4l2_plane</span> <span class="token operator">*</span>tmp_plane<span class="token punctuation">;</span>
tmp_plane <span class="token operator">=</span> <span class="token function">calloc</span><span class="token punctuation">(</span>num_planes<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token operator">*</span>tmp_plane<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token punctuation">{<!-- --></span>
<span class="token function">FD_ZERO</span> <span class="token punctuation">(</span><span class="token operator">&</span>fds<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">FD_SET</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> <span class="token operator">&</span>fds<span class="token punctuation">)</span><span class="token punctuation">;</span>
tv<span class="token punctuation">.</span>tv_sec <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span>
tv<span class="token punctuation">.</span>tv_usec <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
r <span class="token operator">=</span> <span class="token function">select</span> <span class="token punctuation">(</span>fd <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">&</span>fds<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token operator">&</span>tv<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span> <span class="token operator">==</span> r<span class="token punctuation">)</span>
<span class="token punctuation">{<!-- --></span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>EINTR <span class="token operator">==</span> errno<span class="token punctuation">)</span>
<span class="token keyword">continue</span><span class="token punctuation">;</span>
<span class="token function">printf</span> <span class="token punctuation">(</span><span class="token string">"select err
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token number">0</span> <span class="token operator">==</span> r<span class="token punctuation">)</span>
<span class="token punctuation">{<!-- --></span>
<span class="token function">fprintf</span> <span class="token punctuation">(</span><span class="token constant">stderr</span><span class="token punctuation">,</span> <span class="token string">"select timeout
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">exit</span> <span class="token punctuation">(</span>EXIT_FAILURE<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">memset</span><span class="token punctuation">(</span><span class="token operator">&</span>buf<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>type <span class="token operator">=</span> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>memory <span class="token operator">=</span> V4L2_MEMORY_MMAP<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>m<span class="token punctuation">.</span>planes <span class="token operator">=</span> tmp_plane<span class="token punctuation">;</span>
buf<span class="token punctuation">.</span>length <span class="token operator">=</span> num_planes<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">ioctl</span> <span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_DQBUF<span class="token punctuation">,</span> <span class="token operator">&</span>buf<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"dqbuf fail
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> num_planes<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"plane[%d] start = %p, bytesused = %d
"</span><span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>buffers <span class="token operator">+</span> buf<span class="token punctuation">.</span>index<span class="token punctuation">)</span><span class="token operator">-></span>plane_start <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>start<span class="token punctuation">,</span> <span class="token punctuation">(</span>tmp_plane <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>bytesused<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>buffers <span class="token operator">+</span> buf<span class="token punctuation">.</span>index<span class="token punctuation">)</span><span class="token operator">-></span>plane_start <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>start<span class="token punctuation">,</span> <span class="token punctuation">(</span>tmp_plane <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token operator">-></span>bytesused<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> file_fd<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
num<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>num <span class="token operator">>=</span> <span class="token function">atoi</span><span class="token punctuation">(</span>argv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">ioctl</span> <span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_QBUF<span class="token punctuation">,</span> <span class="token operator">&</span>buf<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"failture VIDIOC_QBUF
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
type <span class="token operator">=</span> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">ioctl</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> VIDIOC_STREAMOFF<span class="token punctuation">,</span> <span class="token operator">&</span>type<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"VIDIOC_STREAMOFF fail
"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">free</span><span class="token punctuation">(</span>tmp_plane<span class="token punctuation">)</span><span class="token punctuation">;</span>
ret <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
unmmap:err2:for{for{if->plane_start+j)->start){if->plane_start+j)->start,->planes_buffer+j)->length))printf;}}}
<span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> req<span class="token punctuation">.</span>count<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">free</span><span class="token punctuation">(</span><span class="token punctuation">(</span>buffers <span class="token operator">+</span> i<span class="token punctuation">)</span><span class="token operator">-></span>planes_buffer<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">free</span><span class="token punctuation">(</span><span class="token punctuation">(</span>buffers <span class="token operator">+</span> i<span class="token punctuation">)</span><span class="token operator">-></span>plane_start<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">free</span><span class="token punctuation">(</span>buffers<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">fclose</span><span class="token punctuation">(</span>file_fd<span class="token punctuation">)</span><span class="token punctuation">;</span>
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点