SDK 8.6
我使用带有随机值的 nv12图像进行编码。 我发现 wave5将报告错误、

0x05意味着什么?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
SDK 8.6
我使用带有随机值的 nv12图像进行编码。 我发现 wave5将报告错误、

0x05意味着什么?
Enguo、
我不确定该误差究竟意味着什么。 我也不确定我是否完全理解你要做的事。
testpic 是一个将随机值插入到的奇异图片数组吗? 您说这是 nv12图像、但该方法如何分离该格式的亮度和色度分量? 它看起来像一维阵列而不是二维阵列,我认为这将是正确的一个随机图像的正确方法。 使用 nv12格式范围内的有效值填充宽度 x 高度 x 1.5的每个条目。
如果可以将其与您所说的正常图像一起使用、那么我认为问题一定在于生成此随机图像的方式、而不是编码器排队的方式。
此致!
布兰登
我刚刚使用以下命令进行了尝试、并出现了相同的错误。
gst-launch-1.0文件 rc location=./testpic ! rawvideoparse width=1024 height=640 format=nv12帧速率=30/1! v4l2h265enc! filesink location=./video sync=true
因此、您也可以使用 gstreamer
我已将日志更改为执行 pr_info。 如果它到达那里、我就知道。 但是、我尝试对这个单个随机帧进行编码并不会获得任何日志。 我正在使用的管线为:
gst-launch-1.0文件 rc 位置=testpic blocksize=983040! video/x-raw,width=1024,height=640,framerate=30/1, interlace-mode=progressive, colorimetry=bt601,format=NV12! v4l2h265enc! fakesink
您与我分享的管线无法正常工作。 由于驱动程序非常相似、我一直使用9.0 SDK、 其中最显著的 区别是用户空间。 尤其是 gstreamer 版本。 请给我时间与 Cnm(wave5制造商)一起工作,我将通过进一步的步骤返回给您。
为了方便测试、我修改了测试文件。 将在第六个帧中发生错误。 您也可以在此处尝试。
gst-launch-1.0 filesrc location=./testyuv ! rawvideoparse width=1024 height=640 format=nv12 framerate=30/1 ! v4l2h265enc ! filesink location=./video sync=true
文件名为testyuv,
tidrive.ext.ti.com/.../be05e7f1-198f-48ce-9b1f-20e46e62352f
访问代码:redj282、
不确定此 SDK 版本中的驱动程序是否有差异。 在8.6至9.0之间、驱动程序实际上非常相似。 最可能的区别是 gstreamer 版本、因为 gstreamer 的核心架构发生了多大的变化。
我最近将这个补丁发送到我们的内核: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/?h=ti-linux-6.1.y-cicd&id=12598d7a3ca52f5166b67cc714329029b4502543。
您能否将它应用到您的诊断树、看看它是否解决了此处的问题?
谢谢。
布兰登
您好!
我对您的问题有点困惑。 您能否澄清一下"确保图像尺寸不大于当前值"的含义? 你说电流值是什么意思? 对 gstreamer 值或驱动器值的引用。 它是在输出(原始流)侧请求2M 还是在捕获(编码流)侧请求?
您目前遇到的问题是什么? 没有为位流缓冲区分配足够的存储器?
我共享的映像大小补丁直接来自 CNM。 他们要么使用 gstreamer 请求、要么根据他们认为的需要计算值。 但是、gstreamer 有时可以请求更多的数据、因为 Cnm 算法没有考虑其他参数、因此我们采用了最大值。 我将询问 Cnm 团队、他们是否有其他考虑了其他参数的图像尺寸计算方法。
此致!
布兰登
我已经测试并发现 gstreamer 在捕获(编码流)侧设置了固定的大小2M。 当原始图形为小分辨率图像时、这不是问题、但当原始图形为大分辨率图像时、可能会出现问题
问题是,我使用的是1024*640图像(后来发现编码生成的帧大小是778635),它比编码驱动程序中的 sizeimage=height*weight/8*3大得多,甚至比高和重量高。 导致编码驱动程序卡住(在后续输入其他图像后不会中断)
我尝试将编码流的大小改为与输入流相同的大小,即高度*weight*3/2,工作正常。 但是、这会导致内存占用过多、无法满足我们编码的业务需求。 因此、我想提出以下问题、
应设置什么大小的映像以确保编码流不会超过 buf 大小?
2、编码流大小与图像质量的关系。 能否通过修改图像质量来解决此问题? 但我不知道具体的设置值。
3.是否有办法限制如此大的图像生成?
4.如果出现此问题,是否有办法稍后恢复? 中断将不再被触发。
您好!
感谢您的澄清。 在回答问题之前、我想和 Chips-n-Media (Cnm)团队一起探讨这个问题。 原因是、即使在上游提交中、他们也做出了使用与先前版本的原始驱动程序中相同的数学表达式来设置捕获(编码数据)大小图像的设计决定。 但是、解码器输出(要解码的传入编码数据)取数学表达式或任何 gstreamer 请求的最大值。 我想向他们报告并了解他们的意见、以便我们能够制定更高效的算法、使您的内存不会受到太大影响。
我亦会就上游提交的资料发表意见。 请给我几天时间再回复这一问题。 我现在将和他们一起买票,明天将与他们见面,我可以得到更多的细节。
谢谢。
布兰登
尊敬的 EnGuo:
我和 Chips-N-Media (CNM)的工程师一直在讨论如何确定图像大小的正确算法。 问题是 v4l2 API 使其变得有点困难。 当在输出和捕获队列中调用 S_FMT ioclts 时,驱动程序还不知道为特定流上下文设置的编码参数。 我现在要问的是、是否可以调用此 wave5_update_pix_fmt (设置 sizeimage) 在所有 s_ctrl 调用完成后-或者每次 s_ctrl 调用完成后、因为我不确定 v4l2是否有方法向驱动程序传达哪个控制是最后一个控制。
CNM 提供的另一种解决方案是仅使用 编解码器规格中使用的 MaxCpbSize 公式。 但是 、这会在大多数情况下分配过多的存储器、并且不适合您的用例。
我想告诉您、我最近移植了最新版本的上游驱动程序、以便与我们的内核版本(6.1)匹配。 如本线程前面所述、我看到了使用此流水线的一般单帧编码情况中存在的问题:
gst-launch-1.0 filesrc location=testpic blocksize=983040 ! video/x-raw,width=1024,height=640,framerate=30/1,interlace-mode=progressive,colorimetry=bt601,format=NV12 ! v4l2h265enc ! filesink location=video.265
使用更新的驱动器、可以正常处理单帧编码。 但是、再说一次、该版本的驱动程序仍然使用以前的方法、即根据我之前在此线程中共享的补丁来分配压缩的缓冲区大小。 我只是想和你们分享这个,因为这个版本的驱动程序已经被上游接受。 据信它更加稳健和可靠。 它很快将成为我们公共内核的一部分。
我会促请 CNM 把这列为高度优先的事项、以便我们能够更快地找到解决方案。 但考虑到 v4l2 API 的实现方式、在缓冲区分配时并非所有信息都可用、这一点很复杂。 我已经通过其他几个上游驱动器了解他们是如何做到的,我还没有发现它在任何地方都这样做。 从我所看到的内容来看、很多驱动程序都在使用默认 sizeimage (随附其应用程序分配的任何内容)。
在您的用例中、您是否使用设定的分辨率和比特率进行编码? 如果是这种情况、如果默认情况是此时分配了过多的存储器、那么我建议您在驱动程序中对大小映像进行硬编码、以适合您的用例。 我知道这个主题刚刚讨论过1024x640、但我不确定是否有其他分辨率需要支持。
由于您没有将 gstreamer 用作主机应用程序、因此无法仅使用您自己的算法来设置那里的大小映像、因为您将知道要设置的所有参数? 我正在寻找此类算法的示例、但尚未找到任何将所有这些参数关联到适当压缩缓冲区大小的表达式。 如果我能够找到此主题、或者 CNM 是否为我提供适用于其硬件的建议、我将更新此主题。
此致!
布兰登