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

时间:2016-04-12 09:08:36

标签: ffmpeg compression libavcodec libav 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

1 个答案:

答案 0 :(得分:3)

您不能保证'压缩'形式与输入的大小相同或甚至相等。想想无法以任何方式压缩的纯随机数据的最坏情况,最好的情况是,压缩到其原始大小的100%;除此之外,还需要添加一些压缩元数据或转义序列,从而导致例如100%+ 5个字节。

事实上,'压缩'不可压缩的数据只有"只有" 100%它的原始大小通常不会自动发生。如果算法只是尝试正常压缩输入,结果甚至可能比输入显着更大。智能压缩工具检测到这种情况,然后回退发送未解压缩的数据块,然后添加一些元数据,至少表明块未被压缩。

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

  

不会花费更多时间使用send()函数发送   发送原始缓冲区

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