DirectShow グラフにプッシュする前に、IP カメラからの画像 (MJPEG ストリームで送信) をデコードするために、libjpeg (Windows Mobile 6.5 での C/C++ プログラミング) を使用しています。
これまで、私は単一の関数を使用してきました: ストリームの受信、手動での解析 (JPEG データの開始点と終了点を見つけるため)、データのデコード (つまり、libjpeg 構造の初期化、JPEG ヘッダーの読み取り、実際のデコードを行います...)そして最後にそれをグラフにプッシュします。これは適切に機能しますが、物事をよりスムーズで整頓するために、デコード/プッシュ用に別の関数 (後でスレッド) を呼び出す受信用の関数を使用したいと思います。
したがって、最初のステップとして、ストリーム内のデータを見つけた直後にすべての JPEG 作業を行う代わりに、JPEG 構造の init / ヘッダーの読み取り / デコード / プッシュを担当する別の関数を呼び出すだけです。
そして、これは私が解読できないエラーが発生する場所です:「状態205のjpegライブラリへの不適切な呼び出し」。
// わかりやすくするために編集
今のところ、私のコードは次のようになります。
void receive1() { ながら(1) { if(recvfrom(/* ... */) > 0) { /* JPEG の開始と終了について受信データを解析します */ /* JPEG をデコードします */ //宣言 struct jpeg_decompress_struct cinfo; struct my_error_mgr jerr; // ステップ 1: 割り当て / 初期化 cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if(setjmp(jerr.setjmp_buffer)) { printf("--エラー LIBJPEG\n"); /* エラーコードで終了 */ } // 次のステップ: デコードと表示に進みます... jpeg_create_decompress(&cinfo); /* ... */ } } }
コードを次のようにしたい:
void receive2() { ながら(1) { if(recvfrom(/* ... */) > 0) { /* JPEG の開始と終了について受信データを解析します */ デコード (データ); } } } int デコード (char* データ) { /* JPEG をデコードします */ //宣言 struct jpeg_decompress_struct cinfo; struct my_error_mgr jerr; // ステップ 1: 割り当て / 初期化 cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if(setjmp(jerr.setjmp_buffer)) // ここで「状態 205」エラーが発生します { printf("--エラー LIBJPEG\n"); /* エラーコードで終了 */ } // 次のステップ: デコードと表示に進みます... jpeg_create_decompress(&cinfo); /* ... */ 0 を返します。 }
ここで何か助けていただければ幸いです。どうもありがとう !
// 編集
元の投稿でかなり多くの情報を省略していることに気付きました。ここにいくつかの(おそらく)役立つ詳細があります:
- 私は VS2008 を使用していますが、さまざまな理由から、組み込みのデバッガーやエミュレーターは使用していません。代わりに、カスタム dos に似たコマンド プロンプトを使用して、exe ファイルが Windows Mobile デバイスに直接展開され、テストされます。
- libjpeg はもともとファイルの読み取りと書き込みを行いますが、パッチ (およびカスタム エラー ハンドラー) を使用して、ファイルを開かずにバッファーから直接データを読み取ることができるようにしています。コードはここにあります。この方法で定義された「拡張エラー ハンドラ」を使用します。
typedef struct my_error_mgr * my_error_ptr; 構造体 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; /* 常にメッセージを表示します。*/ (*cinfo->err->output_message) (cinfo); /* コントロールを setjmp ポイントに戻す */ longjmp(myerr->setjmp_buffer, 1); }