Libjpeg错误 - 状态205中的不正确呼叫

时间:2010-10-25 09:31:00

标签: c++ c windows-mobile libjpeg

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

到目前为止,我一直在使用单一功能:接收流,手动解析(为了找到JPEG数据的起点和终点),解码数据(即初始化libjpeg结构,读取JPEG标题,进行实际解码...)并最终将其推入图形。这样可以正常工作,但是为了使事情变得更加平滑和整洁,我想使用一个函数进行接收,调用另一个函数(后来,一个线程)进行解码/推送。

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

这就是我得到错误的地方我无法破译:“状态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);
}

2 个答案:

答案 0 :(得分:1)

205是0xCD,这是VS在调整模式下在单位化内存中放置的标准值,所以我认为你的cinfo在调用解码器时没有正确初始化。使用它时发布代码。

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

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

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

此处保存的状态在您调用实际解码器时无效。对于MT案例,您必须从与setjump()相同的帖子中调用longjmp()

答案 1 :(得分:0)

找到我的问题的答案,部分归功于ruslik。事实证明,我确实在两个函数之间初始化cinfo和jerr。

但是当我纠正这一点时,我仍然有“状态205”错误,并认为它在同一个地方。在我的日志中挖掘,我发现稍后在代码执行中发出错误消息,并且由函数指针的问题引起。我自己的丑陋错误......

非常感谢!