我目前正在从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
吗?
您不能保证“压缩”形式的大小小于或等于输入的大小。考虑一下纯随机数据的最坏情况,它不能以任何方式压缩,最好的情况下,将压缩到其原始大小的100%;除此以外,还需要添加一些压缩元数据或转义序列,从而导致例如100%+ 5个字节。
实际上,通常不会自动将不可压缩的数据“压缩”为原始大小的“仅” 100%。如果算法只是尝试正常压缩输入,则结果甚至可能大大大于输入。智能压缩工具会检测到这种情况,然后回退以发送未压缩的数据块,然后添加一些元数据以至少指示该数据块未压缩。
您分配的缓冲区必须足够大以包含最坏情况下的“压缩”字节数,因此需要一些“余量”。
使用send()函数发送消息所花的时间不会比发送原始缓冲区多得多
是的,会的。这就是为什么您不发送整个(已分配)缓冲区,而是仅发送该缓冲区中压缩函数指示已使用的字节数的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句