libjpeg turbo tjCompressFromYUV
Posted
技术标签:
【中文标题】libjpeg turbo tjCompressFromYUV【英文标题】: 【发布时间】:2016-03-23 10:55:36 【问题描述】:我想在 C 中使用 libturbojpeg 将平面 4:2:0 YUV 缓冲区压缩为 jpeg 图像,但我在使用 tjCompressFromYUV()
函数时遇到了问题。
这是我的代码:
#define PADDING 2
tjhandle tjh;
unsigned long buf_size;
unsigned char *jpegBuf = NULL;
unsigned long jpegSize;
int width = 352;
int height = 288;
int quality = 70;
unsigned char *ucp_frame;
int j;
FILE *fp = NULL;
ucp_frame = malloc(width * height * 3 / 2);
if ( NULL == ucp_frame )
printf("malloc error ucp_frame\n");
return 0;
fp = fopen("planar_352x288.raw", "rb");
if( NULL == fp )
printf("fopen error\n");
return 0;
j = fread( ucp_frame, 1, width * height * 3 / 2, fp);
if( j != width * height * 3 / 2 )
printf("fread error\n");
return 0;
fclose(fp);
tjh = tjInitCompress();
if( NULL == tjh )
printf("tjInitCompress error '%s'\n", tjGetErrorStr() );
return 0;
buf_size = tjBufSizeYUV2( width, PADDING, height, TJSAMP_420);
jpegBuf = tjAlloc(buf_size);
if( tjCompressFromYUV( tjh, ucp_frame, width, PADDING, height,
TJSAMP_420, &jpegBuf, &jpegSize, quality,
TJFLAG_NOREALLOC ) )
printf("tjCompressFromYUV error '%s'\n", tjGetErrorStr() );
tjGetErrorStr()
返回的错误字符串是“Bogus input colorspace”。
我尝试链接 libturbojpeg 版本 1.4.2 和 1.4.90。
任何帮助都将不胜感激,
谢谢
【问题讨论】:
【参考方案1】:Turbojpeg API tjCompressFromYUV 允许您为 jpegBuf 提供这样的选项:
@param jpegBuf 指向将接收图像缓冲区的指针的地址 JPEG 图像。 TurboJPEG 能够将 JPEG 缓冲区重新分配给 适应JPEG图像的大小。因此,您可以选择:
使用 #tjAlloc() 预分配任意大小的 JPEG 缓冲区和 让 TurboJPEG 根据需要增加缓冲区,
将 *jpegBuf 设置为 NULL 以告诉 TurboJPEG 分配缓冲区 给你,或者
将缓冲区预分配到“最坏情况”大小,由调用确定 tjBufSize()。这应该确保缓冲区永远不必 重新分配(设置 #TJFLAG_NOREALLOC 保证这一点。)
如果您选择选项 1,*jpegSize 应设置为您的大小 预分配的缓冲区。无论如何,除非你设置了#TJFLAG_NOREALLOC, 你应该总是在从这个函数返回时检查 *jpegBuf,因为 它可能已经改变了。
所以通过使用 2-nd 选项,不需要调用 tjBufSizeYUV2 和 tjAlloc,只需在调用 tjCompressFromYUV 之前让 jpegBuf=NULL 并在压缩之后执行 tjFree。
【讨论】:
【参考方案2】:好的,原来问题出在包含我发布的代码的程序中,在一个较小的测试程序中,tjBufSizeYUV2
调用按预期执行。
附带说明,如果jpegBuf
在调用tjBufSizeYUV2
之前被预先分配,则传递给tjBufSizeYUV2
的flag
参数必须包含TJFLAG_NOREALLOC
,否则jpegBuf
将不会被释放即使后来调用了tjFree(jpegBuf);
。
【讨论】:
【参考方案3】:#define PADDING 4
jpegBuf = tjAlloc(width*height*3/2);
【讨论】:
请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。 请关注contribution guideline如何回答问题。以上是关于libjpeg turbo tjCompressFromYUV的主要内容,如果未能解决你的问题,请参考以下文章
windows 10上源码编译libjpeg-turbo和使用教程 | compile and use libjpeg-turbo on windows 10