我想在C中使用libturbojpeg将平面4:2:0YUV缓冲区压缩为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_framen");
return 0;
}
fp = fopen("planar_352x288.raw", "rb");
if( NULL == fp ) {
printf("fopen errorn");
return 0;
}
j = fread( ucp_frame, 1, width * height * 3 / 2, fp);
if( j != width * height * 3 / 2 ) {
printf("fread errorn");
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()
返回的错误字符串为"伪输入颜色空间"。
我尝试链接libturbojpeg版本1.4.2和1.4.90。
任何帮助我们都将不胜感激,
感谢
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。
好的,问题出在包含我发布的代码的程序中,在一个较小的测试程序中,tjBufSizeYUV2
调用按预期执行。
附带说明一下,如果在调用tjBufSizeYUV2
之前预先分配了jpegBuf
,则传递给tjBufSizeYUV2
的flag
参数必须包含TJFLAG_NOREALLOC
,否则即使稍后调用tjFree(jpegBuf);
,jpegBuf
也不会被释放。
#define PADDING 4
jpegBuf = tjAlloc(width*height*3/2);