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 之前被预先分配,则传递给tjBufSizeYUV2flag 参数必须包含TJFLAG_NOREALLOC,否则jpegBuf 将不会被释放即使后来调用了tjFree(jpegBuf);

【讨论】:

【参考方案3】:

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

【讨论】:

请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。 请关注contribution guideline如何回答问题。

以上是关于libjpeg turbo tjCompressFromYUV的主要内容,如果未能解决你的问题,请参考以下文章

windows 10上源码编译libjpeg-turbo和使用教程 | compile and use libjpeg-turbo on windows 10

libjpeg-turbo的压缩速度和我程序中的libjpeg没有区别

libjpeg-turbo java 编码 jpeg

Go初接触之libjpeg-turbo

markdown 的libjpeg-turbo.repo

如何让 libjpeg-turbo 的 java 包装器实际压缩?