我正在使用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; }
这里有任何帮助。非常感谢!
//编辑
我意识到我在原帖中省略了很多信息。以下是一些(可能)有用的细节:
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); }
答案 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”错误,并认为它在同一个地方。在我的日志中挖掘,我发现稍后在代码执行中发出错误消息,并且由函数指针的问题引起。我自己的丑陋错误......
非常感谢!