Linuxv4l2架构学习总链接gitee源码VIDIOC_QUERYBUF同样的还是先看从应用调用vivi驱动分析v4l2–查询缓存信息在vb2_querybuf中,之前没有分析__verify_planes_arraystaticint__verify_planes_array{/*非NPLANE这里直接返回*/if)return0;
所以说,对于MPLANE,这里加了一个判断,接着看__fill_v4l2_buffer
static void __fill_v4l2_buffer(struct vb2_buffer *vb, void *pb)
{
struct v4l2_buffer *b = pb;
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
struct vb2_queue *q = vb->vb2_queue;
unsigned int plane;
<span class="token comment">/* Copy back data such as timestamp, flags, etc. */</span>
b<span class="token operator">-></span>index <span class="token operator">=</span> vb<span class="token operator">-></span>index<span class="token punctuation">;</span>
b<span class="token operator">-></span>type <span class="token operator">=</span> vb<span class="token operator">-></span>type<span class="token punctuation">;</span>
b<span class="token operator">-></span>memory <span class="token operator">=</span> vb<span class="token operator">-></span>memory<span class="token punctuation">;</span>
b<span class="token operator">-></span>bytesused <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
b<span class="token operator">-></span>flags <span class="token operator">=</span> vbuf<span class="token operator">-></span>flags<span class="token punctuation">;</span>
b<span class="token operator">-></span>field <span class="token operator">=</span> vbuf<span class="token operator">-></span>field<span class="token punctuation">;</span>
b<span class="token operator">-></span>timestamp <span class="token operator">=</span> <span class="token function">ns_to_timeval</span><span class="token punctuation">(</span>vb<span class="token operator">-></span>timestamp<span class="token punctuation">)</span><span class="token punctuation">;</span>
b<span class="token operator">-></span>timecode <span class="token operator">=</span> vbuf<span class="token operator">-></span>timecode<span class="token punctuation">;</span>
b<span class="token operator">-></span>sequence <span class="token operator">=</span> vbuf<span class="token operator">-></span>sequence<span class="token punctuation">;</span>
b<span class="token operator">-></span>reserved2 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
b<span class="token operator">-></span>reserved <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token comment">/* 重点看这里 */</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>q<span class="token operator">-></span>is_multiplanar<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token comment">/*
* Fill in plane-related data if userspace provided an array
* for it. The caller has already verified memory and size.
*/</span>
<span class="token comment">/* 对于length,这里直接被赋值 num_planes
* 所以说应用传入的时候要大于等于num_planes
*/</span>
b<span class="token operator">-></span>length <span class="token operator">=</span> vb<span class="token operator">-></span>num_planes<span class="token punctuation">;</span>
<span class="token comment">/* 应用代码中要根据planes的数量,合理申请m.planes的空间大小 */</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>plane <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> plane <span class="token operator"><</span> vb<span class="token operator">-></span>num_planes<span class="token punctuation">;</span> <span class="token operator">++</span>plane<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token comment">/* pdst是用户空间传入的 */</span>
<span class="token keyword">struct</span> <span class="token class-name">v4l2_plane</span> <span class="token operator">*</span>pdst <span class="token operator">=</span> <span class="token operator">&</span>b<span class="token operator">-></span>m<span class="token punctuation">.</span>planes<span class="token punctuation">[</span>plane<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token comment">/* psrc是内核空间已经申请的 */</span>
<span class="token keyword">struct</span> <span class="token class-name">vb2_plane</span> <span class="token operator">*</span>psrc <span class="token operator">=</span> <span class="token operator">&</span>vb<span class="token operator">-></span>planes<span class="token punctuation">[</span>plane<span class="token punctuation">]</span><span class="token punctuation">;</span>
pdst<span class="token operator">-></span>bytesused <span class="token operator">=</span> psrc<span class="token operator">-></span>bytesused<span class="token punctuation">;</span>
pdst<span class="token operator">-></span>length <span class="token operator">=</span> psrc<span class="token operator">-></span>length<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>q<span class="token operator">-></span>memory <span class="token operator">==</span> VB2_MEMORY_MMAP<span class="token punctuation">)</span>
<span class="token comment">/* 可以看到 offset是放在m.mem_offset中返回用户空间的 */</span>
pdst<span class="token operator">-></span>m<span class="token punctuation">.</span>mem_offset <span class="token operator">=</span> psrc<span class="token operator">-></span>m<span class="token punctuation">.</span>offset<span class="token punctuation">;</span>
<span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>q<span class="token operator">-></span>memory <span class="token operator">==</span> VB2_MEMORY_USERPTR<span class="token punctuation">)</span>
pdst<span class="token operator">-></span>m<span class="token punctuation">.</span>userptr <span class="token operator">=</span> psrc<span class="token operator">-></span>m<span class="token punctuation">.</span>userptr<span class="token punctuation">;</span>
<span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>q<span class="token operator">-></span>memory <span class="token operator">==</span> VB2_MEMORY_DMABUF<span class="token punctuation">)</span>
pdst<span class="token operator">-></span>m<span class="token punctuation">.</span>fd <span class="token operator">=</span> psrc<span class="token operator">-></span>m<span class="token punctuation">.</span>fd<span class="token punctuation">;</span>
<span class="token comment">/* 对于data_offset, 没有看到相关的操作
* 对于这个变量,注释如下
* @data_offset: offset in the plane to the start of data; usually 0,
* unless there is a header in front of the data
*/</span>
pdst<span class="token operator">-></span>data_offset <span class="token operator">=</span> psrc<span class="token operator">-></span>data_offset<span class="token punctuation">;</span>
<span class="token function">memset</span><span class="token punctuation">(</span>pdst<span class="token operator">-></span>reserved<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>pdst<span class="token operator">-></span>reserved<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{<!-- --></span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token punctuation">}</span>
文章为作者独立观点,不代表股票配资公司观点