我正在使用 libjpeg(Windows Mobile 6.5 上的 C/C++ 编程)来解码来自 IP 摄像机的图像(以 MJPEG 流形式发送),然后再将它们推送到 DirectShow 图形中。
到目前为止,我一直在使用一个函数:接收流,手动解析它(以便找到 JPEG 数据的起点和终点),解码数据(即初始化 libjpeg 结构,读取 JPEG 标头,进行实际解码...)并最终将其推入图表。这可以正常工作,但为了使事情更顺畅和更整洁,我想使用一个函数进行接收,该函数调用另一个函数(后来是一个线程)进行解码/推送。
因此,作为第一步,我不是在找到流中的数据后立即执行所有 JPEG 工作,而是简单地调用另一个函数来负责 JPEG 结构的初始化/标头读取/解码/推送。
这就是我得到一个我无法破译的错误的地方:“在状态 205 中对 jpeg 库的调用不当”。
// 为清晰而编辑
现在,我的代码如下所示:
无效接收1(){ 而(1) { if(recvfrom(/* ... */) > 0) { /* 解析接收到的 JPEG 开始和结束数据 */ /* 解码 JPEG */ //声明 结构 jpeg_decompress_struct cinfo; 结构 my_error_mgr jerr; // 第一步:分配/初始化 cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; 如果(setjmp(jerr.setjmp_buffer)) { printf("--错误 LIBJPEG\n"); /* 退出并返回错误码 */ } // 下一步:继续解码和显示... jpeg_create_decompress(&cinfo); /* ... */ } } }
我想让我的代码看起来像:
无效接收2(){ 而(1) { if(recvfrom(/* ... */) > 0) { /* 解析接收到的 JPEG 开始和结束数据 */ 解码(数据); } } } 诠释解码(字符*数据){ /* 解码 JPEG */ //声明 结构 jpeg_decompress_struct cinfo; 结构 my_error_mgr jerr; // 第一步:分配/初始化 cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if(setjmp(jerr.setjmp_buffer)) // 这就是“state 205”错误发生的地方 { printf("--错误 LIBJPEG\n"); /* 退出并返回错误码 */ } // 下一步:继续解码和显示... jpeg_create_decompress(&cinfo); /* ... */ 返回0; }
任何帮助将不胜感激。非常感谢 !
// 编辑
我意识到我在原始帖子中省略了很多信息。以下是一些(也许)有用的细节:
- 我正在使用 VS2008,但由于许多原因,我不使用内置调试器或仿真器。而是直接在 Windows Mobile 设备上部署和测试 exe 文件,使用自定义的类似 dos 的命令提示符。
- libjpeg 最初读取和写入文件,但我使用的是补丁(和自定义错误处理程序),可以直接从缓冲区读取数据,而无需打开文件。代码可以在这里找到,它使用以这种方式定义的“扩展错误处理程序”:
typedef 结构 my_error_mgr * my_error_ptr; 结构 my_error_mgr { 结构 jpeg_error_mgr pub; jmp_buf setjmp_buffer; }; 方法(无效)my_error_exit(j_common_ptr cinfo) { my_error_ptr myerr = (my_error_ptr) cinfo->err; /* 始终显示消息。*/ (*cinfo->err->output_message) (cinfo); /* 将控制返回到 setjmp 点 */ longjmp(myerr->setjmp_buffer, 1); }