2008年11月02日

Cに戸惑いを感じつつアプリの基本仕様をつめる。

今日はspcaviewのユーザーアプリケーションの構造を把握した。
基本的にはspca5xx.cにインターフェース関数が書かれていて
条件分岐でセンサー別の関数に分岐する構造を取っていた。
とりあえずLogicoolのカメラについてわざと違うセンサーにしたらうまく動作しなかったので
QV-30SVは現状の ブリッジ ZC3XX + センサー HV7131R データタイプJPGH で間違いないようだ。
jpeg出力は最初できないと思っていたのだが640x480ではできた。
その場合ファイルサイズは40kbyte弱で176x144の転送量より小さい。
つまりspca5viewではVIDEO_PALETTE_RGB24が宣言されていて
RGBでとりだしているが640x480のjpegにしてロスレスで間引いて小さくする方が良さそうだ。
とりあえずQVP-30SVについてはドライバ部分は手を入れなくても現状よりマシなものができそうだが
ソースはみればみるほど気に入らない。if文でいちいちインターフェースごとの処理を分類しているのだ。
オブジェクト指向自体CPUからみると無駄が多いもののその歴史から得たものはあったはずだ。
C++を使いたくない場合、Cでもstractでプロトタイプを作ってプロシージャー型の変数に
関数をロードする形にするなどすればオーバーヘッドは少ない。
それはほとんどオブジェクト指向のやり方で
Cでそれはやるのはアホだといわれてもアセンブルベースで考える場合
結局同じ事だしC++の怪しげなリンクよりCの方が回収が楽ではある。

もっとも各センサーごとにプログラムを別にすればそんなこともかんがえなくてよい。
コア部分のソースは完全に1から作るかたちになりそうだ。

最初から大々的な変更をするとなかなか動かないので
最初はソースを膨らます方針を継承しようと思ったが見苦しいので
ドライバ関連、spca5xxはしばらくそのままでじわじわ他を削る路線でいこうと思う。

spca5viewはgtkをベースにしていた。
いまここでgtkに手を出すのは遠回りになるのでsdkで実装しようと思う。
但しjpegは素直にjpeglibを使う。
jpeg画像のロードにsdl_imageを使うことを考えていたのだが
今回のプロセスでnetpgmを使ってppmファイルをjpegで出力したりしたし
jpeglibし資料が多いわけだし640x480をロスレスで間引くような場合は有利だ。

scpa5shotで10回くらいスキャンしてから出力するのだが
EXPOSURE_TIMES というのが宣言されていてそれが10だった。
1にしたところ1回だけ撮影するようになったが画質がよろしくない。
ようするにカメラに電源が入ってカラーバランスと露出が安定するのに10回くらいひつようみたいだ。
アプリを分離するかキー入力で撮影するのがいいかもしれない。

ストレージだと低速だし排他処理の問題があるがひとつか二つの画像ファイルをどんどんアップデートしていくとか
共有メモリーを更新する実装も使いやすそうだ。

となるとカーネルドライバはusb関連とは関係なく実装できるということになる。
v4lインターフェースに固定画像を表示するようなものを作るところからやるべきだろう。

で、今回いちばんすっきりしなかったのはCの参照だ。

spca5shotではspca5xx.hをincludeしているが
spca5xx.cの関数を宣言している。
spca5xx.oは先にできているからそれをリンクして使うのにいるのだが
プロトタイプ宣言はhファイルで行わないといちいち宣言し直さないといけないことになる。
そういえばMinGWでのコードもwindprocをそうしていたっけ。
それでもいいのかそういうものなのかよくわからないが
pascal的文法でh+c=pasの構造で書いてだめならブロック化してみようと思う。

gspcaとpwcもみたけれど基本的には同じ耕造だったがつぎはぎなので
対応数を類似方法で増やすと手間取るのであとまわしにすることにした。

明日は現状よりましなspcaviewができそうではある。


ラベル:Webcam SPCA
posted by Xo_ox at 22:56| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。