首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libjpeg turbo tjCompressFromYUV

libjpeg turbo tjCompressFromYUV
EN

Stack Overflow用户
提问于 2016-03-23 10:55:36
回答 3查看 2K关注 0票数 1

我想使用C中的libturbojpeg将平面4:2:0的YUV缓冲区压缩到jpeg映像中,但是我在使用tjCompressFromYUV()函数时遇到了问题。

这是我的密码:

代码语言:javascript
复制
#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()返回的错误字符串是“伪输入颜色空间”。

我试着链接lib涡轮tried版本1.4.2和1.4.90。

任何帮助都值得感谢,

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-23 17:09:37

Turbojpeg API tjCompressFromYUV允许您为jpegBuf提供这样的选项:

@param jpegBuf地址指向将接收该图像的图像缓冲区的指针。TurboJPEG能够重新分配JPEG缓冲区以适应JPEG图像的大小。因此,您可以选择:

  1. 使用#tjAlloc()预先分配具有任意大小的JPEG缓冲区,并让TurboJPEG根据需要增长缓冲区,
  2. 将*jpegBuf设置为NULL,以告知TurboJPEG为您分配缓冲区,或
  3. 预先将缓冲区分配给调用tjBufSize()确定的“最坏情况”大小。这应该确保永远不需要重新分配缓冲区(设置#TJFLAG_NOREALLOC可以保证这一点)。 如果选择选项1,则应将*jpegSize设置为预分配缓冲区的大小。在任何情况下,除非设置了#TJFLAG_NOREALLOC,否则在从该函数返回时应该始终检查*jpegBuf,因为它可能已经更改。

因此,通过使用第二个选项,不需要调用tjBufSizeYUV2和tjAlloc,只需在调用tjCompressFromYUV之前拥有jpegBuf=NULL,在压缩后执行tjFree。

票数 1
EN

Stack Overflow用户

发布于 2016-03-24 08:28:28

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

另外,如果jpegBuf是在调用tjBufSizeYUV2之前预先分配的,那么传递给tjBufSizeYUV2flag参数必须包含TJFLAG_NOREALLOC,否则即使tjFree(jpegBuf);稍后被调用,jpegBuf也不会被释放。

票数 0
EN

Stack Overflow用户

发布于 2020-09-19 09:41:13

#define PADDING 4

jpegBuf = tjAlloc(width*height*3/2);

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36176222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档