最適化

INTRAブロックの逆量子化がコード量のわりにかなり重く、なおかつ最適化されたMMX版があったので、iWMMXtに移植していた。半分くらい終わったとこで、IPPで同等の関数が提供されていることに気づいた。ショック。


% cumulative self self total
time seconds seconds calls s/call s/call name
3.33 172.43 11.57 6853500 0.00 0.00 dct_unquantize_h263_intra_c

これが、


% cumulative self self total
time seconds seconds calls s/call s/call name
0.30 310.35 0.96 6853500 0.00 0.00 dct_unquantize_h263_intra_iwmmxt
0.28 313.15 0.91 IPP_IQ_INTRA_ZERO
0.23 314.75 0.75 IPP_IQ_INTRA
0.15 317.55 0.48 ippiQuantInvIntra_Compact_H263_16s_I
0.02 323.77 0.05 IPP_IQ_INTRA_END

こんなに速くなるんだけど、画像に緑が掛かかるようになってしまった。渡すパラメータが違うのかなぁ。

うーん、わからん。そもそもMPlayerのC版とIPPのドキュメントに書かれているアルゴリズムを比較すると、似ているんだけど微妙に違う気がする。自分で書くか。


% cumulative self self total
time seconds seconds calls s/call s/call name
0.92 284.75 2.94 6853500 0.00 0.00 dct_unquantize_h263_intra_iwmmxt

よっしゃ。正常にデコードできる状態でIPPより速くなった。

Result Latencyを考えながら命令をスケジューリングするともの凄く可読性が低くなる。とりあえず可読性優先で書くかなぁ。

  • -

ドライバやIPPを使うプログラムを書いてるとよくOSごと固まるので、SL-C3000から追加されたリセットボタンが便利。

  • -

ふぅ。RL_XQ_480x640_1500_128.aviが-framedrop無し(すなわち強制的に全フレーム再生)で音声との同期が取れるほどになった。動きの激しいシーンで0.3秒程度ずれることがあるけど、すぐに追い付く。まだ最適化の余地があるので、それで少しデコードに余裕を持たせてその時間をローテート処理にまわせば640x480もいけるように……。

ぴろさんの日記のデータに加えるとこんな感じ。

kernel glibc normal soft-float mplayer-w100 fastfpe fastfpe fastfpe fastfpe bvdd
iwmmxt-ipp C700 iwmmxt-ipp
core freq 416MHz 416MHz 471MHz 416MHz 624MHz 520MHz 624MHz 624MHz
memoly controller freq (PX bus) 204MHz 204MHz 132.7MHz 204MHz 204MHz 260MHz 312MHz 312MHz
time 6分10秒 5分26秒 5分39秒 6分03秒 5分16秒 4分50秒 4分04秒 2分27秒

  • -

あと画面の書き換えがモロに見えて汚ないので、ダブルバッファリングをサポートしないとなぁ。

OSDをどうするか。ハードウェア側でOSDと映像の合成処理が出来そうなので、そのうち試してみたい。

  • -

まぁこれでVGADivXが実用になったとしても、現実的にはザウルスじゃどう足掻いてもWMV9は見られないので*1、そういうのを求める方はPocketPCを使うのが正解だと思います。僕はWMV/WMAは一切使わないし使いたくないので、全然構わないんですが。

*1:方法その1:資金のある企業が開発してくれる/その2:MPlayerx86版がやっているようにPocketPC用のDLLを強引にロードして使う