GalaxyTabのカメラプレビューをKoboTouchで表示する。

2012/12/26 7M4MON

kobocam

年末にKoboTouchが安く出ていたので買ってみました。
巷では改造やらハッキングやらが流行っていたようなので、なにかしてみたいなぁと。
コボにはカメラが付いていないので、カメラを付けるのはどうだろうと。
と言う訳で、Android(GalaxyTab)のカメラプレビューをkoboで表示するプログラムを作ってみました。



作戦
1.800×600のプレビューを作成し、RGB565のRAWを作成
2.gzipで圧縮してFTPで転送。
3.Telnetでコマンドを叩き、画像を表示。→ zcatで表示。

1.プレビューの作成
KoboTouchはRGB565という形式の画像ファイルを受け付けてくれるようです。
カメラプレビューの作成形式をRGB565にします。

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Camera.Parameters parameters = myCamera.getParameters();
        parameters.setPreviewFormat(4);   //RGB565
        myCamera.setParameters(parameters);
        myCamera.startPreview();
}

この辺の画像形式は機種依存らしいです。
Galaxy TabはRGB565に指定できて正常にストリームは作成されますが、プレビューはYUVらしく、RGB565で指定するとプレビューは表示されません。

2.gzipとFTP
KoboTouchはzcatコマンドを内蔵しているので、gzipで画像を圧縮してから転送します。
実験したところ、gzipで圧縮時間 < 生データでの転送時間 でした。
高速化のため、カメラプレビューはファイル作成せず、Streamで処理します。
InputStreamとOutputStreamの受け渡しは下記のようにしたらうまくいきました。

ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos = (ByteArrayOutputStream) myKoboCam.compressStream(bais);//gzip圧縮関数。OutputStreamクラスを ByteArrayOutputStreamに型変換する。 static OutputStream compressStream (InputStream is){
ByteArrayInputStream bais2 = new ByteArrayInputStream(baos.toByteArray());//.toByteArray()でByteArrayOutputStreamを ByteArrayInputStreamにする。
myKoboCam.ftpUploadStream((InputStream)bais2);//ftpアップロード関数。ByteArrayInputStream bais2をInputStreamにキャスト。

また、普通にftpでアップロードすると時間がかかかる(50秒くらい)ので、 ftpClient.setBufferSize(960000); と してあげれば、劇的短縮(2秒くらい)です。
とても遅い
KoboTouchの"/tmp/"はRAMDISKらしい(/tmp tmpfs rw,relatime,size=16384k 0 0)ので、そこにアップロードします。SDカード上だと遅いし、書き換えによる寿命が心配です。

3.telnetとその他高速化。
telnet(とftp)は org.apache.commons.net を使用しています。
高速化のため、初回接続時に認証処理を行い、その後はコマンドを投げるだけにしています。
command = "zcat /tmp/kobocam.raw.gz | /usr/local/Kobo/pickel showpic\r";

LogCatでそれぞれのプロセスでかかっている時間を測ってみました。すると、プレビュー画面を用意するのに 387ms、gzip圧縮に461ms、
FTPアップロードに746ms、その他に70ms、合計 約1.6sかかっていることが判明しました。
FTPアップロード中に画面を用意すれば高速化できそうです。という訳で、FTPアップロードを別スレッドにしました。

で、冒頭の動画(約1fps)になったわけです。めでたしめでたし。


その他
Wi-Fiかんたん設定モデルを買ったのですが、(PCに変なソフトを入れたくないので)単体でWi-Fiにて設定しようとすると
「Server Error in '/704555' Application」とか出て設定できませんでした。



しょうがないから、USBで接続しようにもドライバは添付されてないので、インターネット経由でKoboSetup.exeをダウンロード して
インストールして設定しようとしたら、更新がかかり、結局、セットアップに1時間近くかかりました。