低 MIPS 视频编码器

信息处理 视频压缩 硬件实现
2021-12-31 02:38:06

我正在寻找一种低 MIPS、低压缩率的视频编码器。这是针对 10fps、VGA 类型的质量压缩。我有哪些选择?我需要能够使用支持浮点的 150MHz ARM M4 CPU 进行这种压缩。(STM32F4)..

我的想法是通过并行总线将这些压缩数据从 CPU 中推出,不会对数据进行任何处理。压缩率明智,尽可能地,我只想看到边界。这是一个低成本的闭路电视应用程序,我想看看我可以用一个 5 美元的 cpu 和大量的传输频带来实现什么,而一个 30 美元的编码器具有低数据传输 bw。

10fps,VGA 将产生大约 25Mbit/sec 的数据。对于那里的任何东西来说,这都是相当高的数据速率。如果我能把它降低到 5Mbit/sec,我想我可以建立一个成本很低的闭路电视系统。一旦我把数据拿到基地,我就可以重新编码数据,因此压缩机制是什么并不重要,只要它不是很有损。

单色视频比彩色视频更重要。

更新

  • 这个 CPU 有 120MHz 分配给这个任务。
  • 内存接口是 16 位的,因此与内部存储器相比,外部存储器的写入/读取速度较慢。
  • 内部存储器为 120KByte,具有 32 位访问快速访问。在这两种情况下,内存都是通过 AHB 总线访问的,我们应该假设 60MHz 作为时钟频率。
  • 预计以下数据流:
    1. 相机 -> DMA -> 外部存储器(不涉及 CPU)
    2. 外部存储器 -> CPU -> 压缩 -> 内部存储器
    3. 内部存储器 -> DMA -> 数据总线 -> 外部设备

CPU 只会读取一大块数据压缩并写入其内部存储器(压缩数据),稍后开始 DMA 传输。

2个回答

您的第一个问题是内存-即使该处理器的最大版本也没有那么多内部 SRAM(在视频方面-与许多相比,它是一个令人震惊的嵌入式处理器!)-VGA 帧为 300kB,而处理器中为 100ishkB . 这意味着您必须在它进入时对其进行处理——比如以 8 或 16 行块的形式进行处理,这使得它更像是一个“硬实时”问题,因为截止日期在它们中的松弛度较小。

目前尚不清楚您将如何捕获数据,但我假设您将从 ADC 或某个数字端口获得某种 DMA,否则您将花费​​一半的时间来洗牌数据!

针对较低的压缩比,您可能只想查看沿线或 3x3 正方形的像素之间的增量编码,然后对其进行算术编码。

另请参阅简单的流式无损图像压缩- 尽管我要求明确的无损压缩,但那里可能有一些想法。

作为数据点,我的一位同事在 60MHz 32 位微控制器中实现了 320x240 8 位单声道 JPG 压缩,带有浮点单元和小型缓存。他使用了一些参考代码(即针对可读性而非性能进行了优化)并且相当轻松地获得了 5 fps。压缩比约为 10 倍 IIRC。图像捕获是通过外部硬件总线控制数据到微的外部 RAM 来完成的。

1. 分类你需要低 MIPS 还是低复杂度
让我冒昧地把这个问题分成两部分。

  1. 低复杂度编码 - 允许较低的资源(特别是内存中的)使其在给定系统中快速响应编码。
  2. 计算中的低显式 (MIPS)。- 仅涉及最小可能的 CPU 周期。

还有第三个标准 - 人们谈论“低延迟” - 对于像视频会议这样的应用程序,计算资源可能不重要 - 但是编码引入的总体延迟

重要的是要注意,在较低复杂度的系统中 - 访问内存(内存总线速度和宽度)以及有时 IO 通常非常慢,这就是为什么 MPEG 类算法会受到影响,即使计算算法可能很简单。

在您对编解码器的要求做出判断之前 - 您应该尝试根据 -

一种。每秒的 CPU 周期。
湾。最大内存吞吐量。
C。IO 延迟

2. 您应该自定义 MPEG 而不是重新发明
一般而言 - MPEG 类编解码器为您提供了非常灵活的机制来执行此操作。从这个意义上说,您不必像您宁愿定制MPEG 2 或 MPEG 4 来完成您的工作那样重新发明编解码器。

首先,让我们说一下使压缩成为可能的所有元素并按复杂程度排列它们:

  1. 运动估计和运动补偿。1.a. 前向预测(P 帧) 1.b。双预测(B 帧) 1.c. 高分辨率运动矢量
  2. 帧内编码 - DCT (+ IDCT)
  3. 量化 - 和编码器模式选择
  4. VLC - 可变长度编码。(H.264 中的 CABAC)
  5. 系数预测 [在 mpeg2 中只有 DC 预测 - MPEG4 有更多]

在 MPEG 类算法中,基于 DCT 的编码和 VLC 在没有太多选择的情况下变得非常强制性 - 但所有机制的其余部分都非常重要

例如,运动估计和运动补偿是 MIPS 消耗最高的元素之一。如果您没有资源来执行此操作 - 您可以简单地将所有帧编码为 I 帧(这使得它非常像 MJPEG - 但标准 MPEG 解码器可以对此进行解码)。如果你能负担得起更多的资源——你可以使用帧差来进行微不足道的运动补偿——而不是将每一帧作为帧内发送,你可以从它的前一帧块中减去每个块;如果差异高于原始信号,则将其作为 Intra 发送。

当然 - 所有这一切都意味着您将失去上述编码器所承诺的一些效率 - 但我认为您愿意放弃这一点!


编辑:
您可以将以下编解码器视为很好的参考点:

  1. MSSG:http
    ://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html 有助于理解,但可能是世界上最慢的。

  2. FFMPEG: http: //ffmpeg.org/ 可能是地球上最快的。最好从黑盒开始,但不要尝试从内部更改代码。当你使用库 API 时,可能会给你很好的选择来控制东西。它已经移植到许多平台上——但在新平台上进行移植可能是一项任务。

  3. FAME: http: //fame.sourceforge.net/ 这最初的目的与您描述的相同。虽然,我有点脱节 - 但你可以试试这个。

  4. Xvid:http ://www.xvid.org/ 这是 MPEG-4。这是干净代码和合理速度之间的最佳平衡之一。如果您最终住在编码器内部,应该是最容易使用的。

  5. JPEG:http ://www.ijg.org/ 这是 JPEG。这是跨平台移植它的最佳库之一。此外,JPEG 本质上比 MPEG 的某些方面更简单 - 所以您可能应该先尝试一下。世界上大多数相机可能都按原样使用了这个库——而不是创建自己的东西!

可能是我在使用 MPEG 时错了!但这是一种值得冒的风险。

检查这是否可行的最佳方法可能是 - 只需尝试对图像进行量化的标准 8x8 DCT;优化这个。如果您能够接近您的实时要求,那么我认为您对所有所有 JPEG 帧或所有 I 帧 MPEG 编解码器都做得很好。如果您偏离目标 - 那就不值得了。