C语言 libjpeg turbo tjCompressFromYUV



我想在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图像的大小。因此,您可以选择:

  1. 使用#tjAlloc()预分配任意大小的JPEG缓冲区,然后让TurboJPEG根据需要增加缓冲区,

  2. 将*jpegBuf设置为NULL以告知TurboJPEG分配缓冲区为您,或

  3. 将缓冲区预分配到通过调用确定的"最坏情况"大小tjBufSize()。这应确保缓冲区永远不必重新分配(设置#TJFLAG_NOREALLOC保证了这一点。)

    如果选择选项1,*jpegSize应设置为预先分配的缓冲区。在任何情况下,除非您设置了#TJFLAG_NOREALLOC,您应该在从该函数返回时始终检查*jpegBuf,如下所示它可能已经改变了。

因此,通过使用2-nd选项,不需要调用tjBufSizeYUV2和tjAlloc,只需在调用tjCompressFromYUV之前使jpegBuf=NULL,并在压缩后执行tjFree。

好的,问题出在包含我发布的代码的程序中,在一个较小的测试程序中,tjBufSizeYUV2调用按预期执行。

附带说明一下,如果在调用tjBufSizeYUV2之前预先分配了jpegBuf,则传递给tjBufSizeYUV2flag参数必须包含TJFLAG_NOREALLOC,否则即使稍后调用tjFree(jpegBuf);jpegBuf也不会被释放。

#define PADDING 4
jpegBuf = tjAlloc(width*height*3/2);

相关内容

  • 没有找到相关文章

最新更新