画像データもバッファリングする
PCMデータはリングバッファにバッファリングするようにしました。画像(JPEG)データは基本的にBrynhildrサーバから一枚分送られてきたら、すぐに表示してデータは廃棄する、という方針でした。
ところが、画像データの表示とPCMデータの再生がズレるので同期を取る必要がありそうです。現状の実装では、JPEGデータはクライアント到着直後に問答無用で表示しているので、同期タイミングの選択の余地がありません。これを改善するためには、画像データの保持と表示のタイミングをもう少し分離して、任意のタイミングで表示を可能にすることが必要となります。
で、まず画像データもPCMデータと同様に複数枚分保持するような管理方法に変更します。リングバッファっぽいクラスを用意し、画像データが届くたびにとりあえずバッファへ保存するようにします。表示する時はこのバッファから順次取り出して、Qtに表示を指示すればよいはずです。
画像データ用のソケット通信で送られてくる画像(JPEG)データは順次バッファへコピー後保存されるので、あとは表示のタイミングをどのようにするかが問題となりますね…
PCMデータの時のようにタイマーで関数を起動して、一定時間ごとに表示するのがいいのか、それともPCMデータの再生バッファへの書き込みタイミングとなんらかの形でリンクするのがいいのか、検討が必要そうです。
まず画像データ保存用のバッファの仕様みたいなものを書き出してみます。
・1枚JPEGデータが届いたら、GraphicsBuffer(以下GB)へ順次格納(put())する。
・GBは複数のJPEGデータを順に格納できる。(リング状にする)
・GBは順にJPEGデータを取り出せる。(FIFOで)
メモリの先頭へのポインタとデータのサイズが得られるようにする。バッファが空ならば、ポインタ、サイズは0, 0。
・データ格納時にバッファのオーバーフローをチェックする。エラー時は例外を送出する(?)
・JPEGデータはローカルバッファの境界は跨がないように配置する。
とりあえず、この方針でGBクラスを実装してみます。
« コマンドラインオプションを用意したい | トップページ | 画像データもバッファリングする その2 »
コメント