gpt4 book ai didi

c++ - Libjpeg 错误 - 在状态 205 中调用不当

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:35 25 4
gpt4 key购买 nike

我正在使用 libjpeg(Windows Mobile 6.5 上的 C/C++ 编程),以便在将它们插入 DirectShow 图形之前解码来自 IP 摄像机的图像(以 MJPEG 流发送)。

直到现在,我一直在使用一个函数:接收流、手动解析它(为了找到 JPEG 数据的起点和终点)、解码数据(即初始化 libjpeg 结构、读取JPEG header ,进行实际解码...),最后将其插入图表中。这工作正常,但为了使事情更顺利和更整洁,我想使用一个函数来接收,调用另一个函数(后来,一个线程)来解码/推送。

因此,作为第一步,我没有在流中找到数据后立即执行所有 JPEG 工作,而是简单地调用另一个负责 JPEG 结构初始化/ header 读取/解码/推送的函数。

这就是我遇到无法破译的错误的地方:“在状态 205 中对 jpeg 库的不正确调用”

//编辑清晰

目前,我的代码如下所示:

void receive1() {    while(1)    {        if(recvfrom(/* ... */) > 0)        {            /* parse the received data for JPEG start and end */            /* decode the JPEG */            //Declarations            struct jpeg_decompress_struct cinfo;            struct my_error_mgr jerr;            // Step 1: allocation / initialization            cinfo.err = jpeg_std_error(&jerr.pub);            jerr.pub.error_exit = my_error_exit;            if(setjmp(jerr.setjmp_buffer))            {                printf("--ERROR LIBJPEG\n");                /* quit with error code */            }            // Next steps : proceed with the decoding and displaying...            jpeg_create_decompress(&cinfo);            /* ... */        }    }}

我想让我的代码看起来像:

void receive2() {  while(1)  {    if(recvfrom(/* ... */) > 0)    {        /* parse the received data for JPEG start and end */        decode(data);    }  }}  int decode(char* data) {    /* decode the JPEG */    //Declarations    struct jpeg_decompress_struct cinfo;    struct my_error_mgr jerr;    // Step 1: allocation / initialization    cinfo.err = jpeg_std_error(&jerr.pub);    jerr.pub.error_exit = my_error_exit;    if(setjmp(jerr.setjmp_buffer)) // This is where the "state 205" error occurs    {        printf("--ERROR LIBJPEG\n");        /* quit with error code */    }    // Next steps : proceed with the decoding and displaying...    jpeg_create_decompress(&cinfo);    /* ... */    return 0;}

如有任何帮助,我们将不胜感激。非常感谢!

//编辑

我意识到我在原来的帖子中遗漏了很多信息。这里有一些(可能)有用的细节:

  • 我使用的是 VS2008,但出于多种原因我没有使用内置的调试器或模拟器。相反,使用自定义的类似 dos 的命令提示符,直接在 Windows Mobile 设备上部署和测试 exe 文件。
  • libjpeg 最初读取和写入文件,但我使用了一个补丁(和自定义错误处理程序),可以直接从缓冲区读取数据,而无需打开文件。可以查到代码here ,它使用这样定义的“扩展错误处理程序”:
typedef struct my_error_mgr * my_error_ptr;  struct my_error_mgr {    struct jpeg_error_mgr pub;    jmp_buf setjmp_buffer;};  METHODDEF(void) my_error_exit (j_common_ptr cinfo){    my_error_ptr myerr = (my_error_ptr) cinfo->err;       /* Always display the message. */    (*cinfo->err->output_message) (cinfo);    /* Return control to the setjmp point */    longjmp(myerr->setjmp_buffer, 1);}

最佳答案

205 是 0xCD,这是 VS 在 Debug模式下放入初始化内存的标准值,所以我认为你的 cinfo 在调用解码器时没有正确初始化。使用时贴出代码。

此外,您使用的 setjump() 让我认为它是 IJG 库。请小心使用它,因为它不是标准功能。当您进行调用时,它会记住线程和堆栈的确切状态,并且能够从任何地方返回到该位置,除非该状态不再有效,例如:

int init_fn(){
if (setjump(my_state)){
// ERROR!
};
return 0;
};

int decode(){
init_fn();
do_work();
};

此处保存的状态在您调用实际解码器时无效。对于 MT 情况,您必须从与 longjmp() 相同的线程调用 setjump()

关于c++ - Libjpeg 错误 - 在状态 205 中调用不当,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4013296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com