为什么在LZW压缩中压缩缓冲区需要大于输入缓冲区?

饮料先生爵士

我目前正在从FFmpeg源代码到我的项目中实施LZW压缩和解压缩方法。我偶然发现的是,输出缓冲区(将存储压缩数据的位置)的大小必须大于我们要压缩的输入缓冲区的大小。这与压缩本身并不矛盾吗?

代码的下一部分位于ff_lzw_encode()函数中,该函数是lzwenc.c源文件的一部分

if (insize * 3 > (s->bufsize - s->output_bytes) * 2)
{
    printf("Size of output buffer is too small!\n");
    return -1;
}

对于我的特定示例,我尝试在将原始视频帧发送到本地之前先对其进行压缩。但是,如果我为大小为的缓冲区分配内存(insize * 3) / 2(将在其中存储压缩数据),使用send()函数发送的时间不会比发送大小为的原始缓冲区花费更多的时间insize吗?

吉米·B

您不能保证“压缩”形式的大小小于或等于输入的大小。考虑一下纯随机数据的最坏情况,它不能以任何方式压缩,最好的情况下,将压缩到其原始大小的100%;除此以外,还需要添加一些压缩元数据或转义序列,从而导致例如100%+ 5个字节。

实际上,通常不会自动将不可压缩的数据“压缩”为原始大小的“仅” 100%。如果算法只是尝试正常压缩输入,则结果甚至可能大大大于输入。智能压缩工具会检测到这种情况,然后回退以发送未压缩的数据块,然后添加一些元数据以至少指示该数据块未压缩。

您分配的缓冲区必须足够大以包含最坏情况下的“压缩”字节数,因此需要一些“余量”。

使用send()函数发送消息所花的时间不会比发送原始缓冲区多得多

是的,会的。这就是为什么您不发送整个(已分配)缓冲区,而是仅发送该缓冲区中压缩函数指示已使用的字节数的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用Python解压缩缓冲区?

来自分类Dev

C ++用libzpaq压缩到char *缓冲区

来自分类Dev

为什么在Javascript中绝不转移传输的缓冲区?

来自分类Dev

为什么sscanf将\ n存储在缓冲区中

来自分类Dev

Pytorch中的缓冲区是什么?

来自分类Dev

当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

来自分类Dev

当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

来自分类Dev

struct.error:解压缩需要4个字节的缓冲区

来自分类Dev

使用GZInputStream和字节缓冲区在Java中解压缩.gz文件需要很长时间

来自分类Dev

处理大于缓冲区大小的帧

来自分类Dev

为什么从颜色缓冲区而不是位置缓冲区获取顶点位置?

来自分类Dev

为什么 Vim 选项被记录为由新缓冲区继承的“本地缓冲区”?

来自分类Dev

为什么位缓冲区和缓冲区给我不同的输出?

来自分类Dev

将缓冲区中的数据压缩为每个元素16位到12位

来自分类Dev

当缓冲区大于1byte时,动态流解压缩会导致伪像

来自分类Dev

当系统内存大于8GB时,为什么Linux禁用磁盘写缓冲区?

来自分类Dev

比较缓冲区

来自分类Dev

请求缓冲区

来自分类Dev

C ++-缓冲区和流都需要什么?

来自分类Dev

什么时候需要清除scanf缓冲区?

来自分类Dev

C ++-缓冲区和流都需要什么?

来自分类Dev

如何关闭不再需要的缓冲区

来自分类Dev

我需要多大的缓冲区?

来自分类Dev

Python:清除标准输入缓冲区

来自分类Dev

缓冲区溢出的参数输入

来自分类Dev

如何刷新SerialDevice的输入缓冲区

来自分类Dev

从 SuperpoweredAndroidAudioIO 输入读取缓冲区?

来自分类Dev

为什么fs.readFile返回缓冲区?

来自分类Dev

为什么固定大小的缓冲区只能是原始类型?

Related 相关文章

  1. 1

    用Python解压缩缓冲区?

  2. 2

    C ++用libzpaq压缩到char *缓冲区

  3. 3

    为什么在Javascript中绝不转移传输的缓冲区?

  4. 4

    为什么sscanf将\ n存储在缓冲区中

  5. 5

    Pytorch中的缓冲区是什么?

  6. 6

    当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

  7. 7

    当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

  8. 8

    struct.error:解压缩需要4个字节的缓冲区

  9. 9

    使用GZInputStream和字节缓冲区在Java中解压缩.gz文件需要很长时间

  10. 10

    处理大于缓冲区大小的帧

  11. 11

    为什么从颜色缓冲区而不是位置缓冲区获取顶点位置?

  12. 12

    为什么 Vim 选项被记录为由新缓冲区继承的“本地缓冲区”?

  13. 13

    为什么位缓冲区和缓冲区给我不同的输出?

  14. 14

    将缓冲区中的数据压缩为每个元素16位到12位

  15. 15

    当缓冲区大于1byte时,动态流解压缩会导致伪像

  16. 16

    当系统内存大于8GB时,为什么Linux禁用磁盘写缓冲区?

  17. 17

    比较缓冲区

  18. 18

    请求缓冲区

  19. 19

    C ++-缓冲区和流都需要什么?

  20. 20

    什么时候需要清除scanf缓冲区?

  21. 21

    C ++-缓冲区和流都需要什么?

  22. 22

    如何关闭不再需要的缓冲区

  23. 23

    我需要多大的缓冲区?

  24. 24

    Python:清除标准输入缓冲区

  25. 25

    缓冲区溢出的参数输入

  26. 26

    如何刷新SerialDevice的输入缓冲区

  27. 27

    从 SuperpoweredAndroidAudioIO 输入读取缓冲区?

  28. 28

    为什么fs.readFile返回缓冲区?

  29. 29

    为什么固定大小的缓冲区只能是原始类型?

热门标签

归档