MN #16 - Debugging ZSL Continues

04:55. 家庭の事情で少し就寝が遅れ、結果として少し寝坊。

今日は ZSL フレームレート出ない問題をなんとかしたい。

TEMPLATE_ZERO_SHUTTER_LAG というのを使ってみたがやはり 15fps しかでない。

Systrace をとる。cameraserver の getBuffer() が遅い。しかしこれは単に Surface で同期をして待っているから、というだけの話に思える。つまりここから先(HAL)が遅い . Camera HAL のぷロセスをみると、CAM_PREVIEW というスレッドと CAM_RAW というスレッドが別々にあるなー。なにしてるのかしらんが、なんとなく変じゃね?こういうもんだっけ?

2つのストリームの間に不整合がある? PixelFormat... は SurfaceView のデフォルトは OPAQUE だと書いてるので問題ないはず。Aspect ratio... も特に疑わしくないなあ・・・。

AOSP に古い Camera2 アプリのコードがあり、そいつが ZSL してる気配。そのコードから CaptureRequest のパラメタをコピーしてみる・・・がだめ。

Preview ストリームだけの Systrace を見ると、なんか見慣れた感じになるなあ。そしてとにかく HAL が遅いせいなのはたしかなようである。

Systrace の sched をつけわすれていた。つけてみると... わーお CAM_RAW スレッド super busy なんですけど。なにしてんのこれ。CAM_PREVIEWの圧倒的ヒマさを踏まえるになにかよからぬことが起きてるなー・・・。

ImageFormat#RAW_SENSOR がダメなのかなと RAW_PRIVATE にしてみたら・・・直った!まじかー。しかし RAW_PRIVATE 中身わからんからだめじゃん。と RAW10 を試すと、これも 30fps でるな。つまり RAW10 を使えということか・・・。しかし DngCreator は RAW_SENSOR しか受け付けない。ということは DNG を使いたいなら ZSL できなくね?なんで Google Camera は大丈夫の?というと、HDR+ が RAW10 なり RAW_PRIVATE なりをマージして RAW_SENSOR 相当の結果を返してくれるからなのだろうなあ。ZSL を実装するの、思ったより大変なのだね。


自分はオフラインで簡単な RAW の hello work をしたいとおもっていただけで、別に burst のマージとかをやりたいわけではない。ので別に ZSL でなくても良いといえば良い。一方で DNG を使わず RAW10 の画像を適当にベタっとファイルに書き出してそれをオフラインで加工してもよい。

あまり深く考えてなかったけど DNG をよむのには libraw/rawpy を使う必要があり、若干かったるそうではある。ただ DNG を書き出す hello をしておきたい気分もある。

まあ DNG は深入りすると手間取りそうだし、今はとりあえず RAW10 をダンプする路線で先にすすむとしよう。DNG しゅつ力はそのうち気が向いたら試す。ZSL のコードは、RAW_SENSOR にすると遅くなっちゃうけどせっかくなんで使いますかね。

といったところでつづきは明日。