Tech と Culture

テクノロジーとカルチャー

ネットワーク上のmotionJPEG再生

サーバー側の準備が整ったので、クライアント側を考えます。

FPGA上のプログラム djpeg で、ソケットをきちんと作成すれば、後は普通にファイルを読むようにデータをネットワーク越しに読み込めるはず。以下のようなシステムが動くはずです。
ネット再生
djpegの中で、ファイルからデータを読んでいる部分は、 jdatasrc.c の中にある fill_input_buffer()という所です。普通のjpeg処理中はもっと上位の関数でバッファに読み込み済みのデータを1バイトづつ呼んでいきます。その際にバッファが空になった時にこの関数が呼び出されて、バッファサイズ分のデータをファイルから読み込みます。
実際に読み込んでいるコードは、

nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE);

の部分です。JFREADは、所謂freadのマクロです。
よって、メインの処理が始まる前にしっかりソケット作成しておけば、ただ単にこの部分をファイルではなくソケットを読み込むようにすればよいはず。

nbytes = read(cinfo->socket, src->buffer, INPUT_BUF_SIZE);

とするだけです。

ffserverは httpサーバーなので、ソケット作成部分は以下のコードをほんの少し改変して作りました。
HTTPクライアントの作成
ポートは 8090 を指定し、 "GET /" の部分は "GET /video.mjpeg" に変更します。
また、jpegファイルが始まる前に、HTTPヘッダーがサーバーから到着しますので、その分は先に読み出しておきます。

たったこれだけの変更でネットワーク越しにデータが読めるはず。さすがネットワークネイティブなOSです。

実際に動作させた結果は、、、、、、


見事に再生されました!
まだちょっとバグが残っているけど、基本的にネットワークmotionJPEGビューワーが動きました!

spartan3 40MHz , SDRAM にしてはなかなか。
ソフトウェアでjpegモジュールにデバイスドライバ越しにデータを送る部分がボトルネックになっているので、ここを頑張ればもう少し性能あがるかも。