<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>VB2 - Tag - 枕石的个人博客</title><link>https://blog.zsmgc.love/tags/vb2/</link><description>VB2 - Tag - 枕石的个人博客</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>3499129952@qq.com (枕石)</managingEditor><webMaster>3499129952@qq.com (枕石)</webMaster><lastBuildDate>Fri, 30 Jan 2026 00:14:45 +0800</lastBuildDate><atom:link href="https://blog.zsmgc.love/tags/vb2/" rel="self" type="application/rss+xml"/><item><title>V4l2loopback实现笔记（五）:VB2 缓冲区管理</title><link>https://blog.zsmgc.love/posts/v4l2loopback%E5%AE%9E%E7%8E%B0%E7%AC%94%E8%AE%B0vb2%E7%BC%93%E5%86%B2%E5%8C%BA%E7%AE%A1%E7%90%86/</link><pubDate>Fri, 30 Jan 2026 00:14:45 +0800</pubDate><author>枕石</author><guid>https://blog.zsmgc.love/posts/v4l2loopback%E5%AE%9E%E7%8E%B0%E7%AC%94%E8%AE%B0vb2%E7%BC%93%E5%86%B2%E5%8C%BA%E7%AE%A1%E7%90%86/</guid><description><![CDATA[<p>本模块演示 videobuf2 (VB2) 框架的使用，这是 Linux 内核中处理视频流的标准方法。</p>
<h3 id="实现的功能">实现的功能</h3>
<ul>
<li>VB2 队列初始化 (<code>vb2_queue_init</code>)</li>
<li>缓冲区操作回调 (<code>vb2_ops</code>)</li>
<li>缓冲区请求和查询 (<code>REQBUFS</code>, <code>QUERYBUF</code>)</li>
<li>缓冲区入队和出队 (<code>QBUF</code>, <code>DQBUF</code>)</li>
<li>流控制 (<code>STREAMON</code>, <code>STREAMOFF</code>)</li>
<li>多种 I/O 模式支持 (<code>MMAP</code>, <code>USERPTR</code>, <code>READ/WRITE</code>)</li>
</ul>
<h2 id="学习要点">学习要点</h2>
<ol>
<li>理解 VB2 框架的设计目标和优势</li>
<li>理解 <code>vb2_ops</code> 各回调的调用时机</li>
<li>理解缓冲区状态机</li>
<li>理解为什么 <code>stop_streaming</code> 必须返回所有缓冲区</li>
<li>理解 VB2 与自定义缓冲区管理的权衡</li>
</ol>
<h2 id="代码解析">代码解析</h2>
<h3 id="结构体定义">结构体定义</h3>
<h4 id="1-struct-vb2fw_format">1. struct vb2fw_format</h4>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-c">
        <span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">struct</span> <span class="n">vb2fw_format</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">u32</span> <span class="n">fourcc</span><span class="p">;</span>           <span class="cm">/* V4L2 FourCC 代码 */</span>
</span></span><span class="line"><span class="cl">    <span class="n">u32</span> <span class="n">depth</span><span class="p">;</span>            <span class="cm">/* 每像素位数 */</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">name</span><span class="p">;</span>     <span class="cm">/* 格式名称 */</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">static</span> <span class="k">const</span> <span class="k">struct</span> <span class="n">vb2fw_format</span> <span class="n">vb2fw_formats</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">fourcc</span> <span class="o">=</span> <span class="n">V4L2_PIX_FMT_YUYV</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">depth</span>  <span class="o">=</span> <span class="mi">16</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">name</span>   <span class="o">=</span> <span class="s">&#34;YUYV 4:2:2&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">fourcc</span> <span class="o">=</span> <span class="n">V4L2_PIX_FMT_UYVY</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">depth</span>  <span class="o">=</span> <span class="mi">16</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">name</span>   <span class="o">=</span> <span class="s">&#34;UYVY 4:2:2&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">fourcc</span> <span class="o">=</span> <span class="n">V4L2_PIX_FMT_RGB24</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">depth</span>  <span class="o">=</span> <span class="mi">24</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">name</span>   <span class="o">=</span> <span class="s">&#34;RGB24&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">fourcc</span> <span class="o">=</span> <span class="n">V4L2_PIX_FMT_BGR24</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">depth</span>  <span class="o">=</span> <span class="mi">24</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">name</span>   <span class="o">=</span> <span class="s">&#34;BGR24&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">fourcc</span> <span class="o">=</span> <span class="n">V4L2_PIX_FMT_YUV420</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">depth</span>  <span class="o">=</span> <span class="mi">12</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">name</span>   <span class="o">=</span> <span class="s">&#34;YUV 4:2:0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">fourcc</span> <span class="o">=</span> <span class="n">V4L2_PIX_FMT_NV12</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">depth</span>  <span class="o">=</span> <span class="mi">12</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">name</span>   <span class="o">=</span> <span class="s">&#34;NV12&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span></span></span></code></pre></div></div>
<p>将 V4L2 标准的 fourcc 码（如 V4L2_PIX_FMT_YUYV）与驱动计算所需的参数（如 depth 像素深度）关联起来。当用户调用 S_FMT 设置分辨率时，你需要计算 sizeimage = width * height * (depth / 8)。这个结构体让你能通过简单的循环找到当前格式对应的计算权重。</p>]]></description></item></channel></rss>