我目前正在致力于从 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% 其原始大小通常不会自动发生。如果算法只是尝试正常压缩输入,结果甚至可能明显大于输入。智能压缩工具会检测到这种情况,然后回退以发送未压缩的数据 block ,然后添加一些元数据以至少指示该 block 未压缩。
您分配的缓冲区必须足够大,以包含最坏情况下的“压缩”字节数,因此需要一些“净空”。
wouldn't that take more time to send using send() function than sending raw buffer
是的,会的。这就是为什么您不发送整个(分配的)缓冲区,而只发送该缓冲区中压缩函数指示已使用的字节数。
关于ffmpeg - 为什么 LZW 压缩中压缩缓冲区需要大于输入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36568587/