<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>楓 software</title>
<link>http://www.kaede-software.com/</link>
<description></description>
<language>ja</language>
<copyright>Copyright 2008</copyright>
<lastBuildDate>Tue, 22 Jul 2008 16:34:49 +0900</lastBuildDate>
<generator>http://www.movabletype.org/?v=3.34</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs> 

<item>
<title>吉里吉里  ムービー拡張日誌2 :: α動画 SSE2対応など</title>
<description><![CDATA[<p>色変換と IDCT の SSE2 版を作った。<br />
Core2Duo で MMX に比べると 18% 程度速くなった。</p>

<p>IDCT は LLM を使っているけど、 ANN も試してみた。<br />
2%ぐらい速くなるが、誤差が大きいせいか汚い。<br />
補間があればもう少しましだろうか？<br />
ANN は使わないことにする。</p>

<p>ブロックが単色かどうかの判定は、AC 係数すべてを調べる必要があると思っていたが、よく考えればハフマン復号化の時にわかることに気付いた。<br />
JPEG では、係数行列の残りが全て 0 の時終端記号が入る。<br />
つまり、デコーダ内部の AC 係数の書き込み終端位置を覚えておけば、AC係数の要素数がわかる。<br />
AC 係数がなくて DC 係数のみの場合、DC 係数値を 8 で割った値が色になる。<br />
これを利用して輝度と色差の両方が DC 係数のみの場合、1度だけ色変換の計算を行って、後は全てその色をコピーすればよい。<br />
1ブロックは 64 要素なので、単色のブロックがある場合だいぶ高速化されるはず。<br />
単色のブロックは完全に透明なブロック以外にもところどころある様子。<br />
単色判定を入れて立ち絵の動画で試したところ 2% 程度速くなった。<br />
期待したほど速くならなかったが、IDCT や 色変換部分の処理が大幅に削減されるので、SSE2 が使えなくて MMX になるような環境であれば、もう少し効果があるはず。</p>

<p>他に考えられる高速化には、ジグザグ行列を転置済みのものにしておくというのがある。<br />
転置済みにしておけば、IDCT 時に1回転置が減る。<br />
SSE2 版で試したところほとんど速度差がない。<br />
MMX 版であればもう少し効果があるかもしれないが、かなり書き換える必要があるので、転置はいいか。</p>

<p>非 SIMD 版も計ろうと動かしたらバグってた。<br />
いつの間に。<br />
まず使うことはないだろうけど、一応修正。<br />
MMX と SSE では、IDCT 内でレベルシフトしていたけど、非 SIMD 版はそれをしていなかったのが原因で色がおかしくなってた様子。<br />
速度的には、SSE2 版より2倍遅い。<br />
非 SIMD 版はどちらかというと動作確認用みたいなものなので、それほど高速化などは考慮していない。</p>

<p>デコーダー側はこれで一通り完成かな。<br />
後は高速化の残骸などを消してソースコードを整理してテスト。</p>

<p><br />
エンコーダーはGUI版を作った。<br />
1個1個エンコードする時はGUI版の方が楽。<br />
エンコードのコア部分は DLL にしているので、コマンドライン版もその DLL を使うように書き換える予定。<br />
でも、こまごまデータもらいながら作るのなら、コマンドライン版はあんまりいらないかも。</p>]]></description>
<link>http://www.kaede-software.com/2008/07/_sse2_1.html</link>
<guid>http://www.kaede-software.com/2008/07/_sse2_1.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Tue, 22 Jul 2008 16:34:49 +0900</pubDate>
</item>
<item>
<title>吉里吉里  ムービー拡張日誌2 :: 完全透明ブロックの劣化を回避する</title>
<description><![CDATA[<p>エフェクト用の動画は圧縮率を上げても ( クオリティーを低くしても ) 気付きにくいということで、60% にして試してみたら、うっすらと枠のようなものが見えた。<br />
どうも、完全に透明な部分が劣化して、透明ではなくなってしまっているようだ。<br />
初め αチャンネルを非可逆圧縮にして圧縮率を上げたのが原因と考えて、αチャンネルと色を独立してクオリティーを指定できるようにしようと考えたが、よく考えるとそうではない気がした。<br />
吉里吉里側の演算負荷を下げるために、αチャンネルつき動画は画像を AddAlpha 形式で保持しているが、この形式の場合色に誤差があった場合でも、透明部分が透明でなくなってしまうはず。<br />
という事で、あんまりクオリティーを下げるのはまずいかと思ったが、よく考えれば完全に透明なブロックが劣化しないようにすればいい。<br />
一見、非可逆圧縮で劣化させないようにすることは矛盾しているようだが、完全に透明なブロックのみに限定するのであれば、これは可能だと考えられる。</p>

<p>あるブロックを DCT 変換すると、最初の係数にはそのブロックの平均色が入る。<br />
この係数は特別扱いし、DC (直流) 係数 と呼ぶ。<br />
もし、ブロックが1色のみの場合は、その色を表した係数がこの DC 係数に入る ( と思っているけど、間違ってるかも ) 。<br />
JPEG 圧縮で劣化する主な原因は、以前書いたと思うけど、この DCT 変換後の係数行列を量子化テーブルの値で割るためで、そこで小数点以下の値が失われてしまう。<br />
逆に言えば、小数点以下の値が出ないような値で割れば、劣化しないことになる。<br />
つまり、ブロックが完全に透明な色のみだった場合、その時の DC 係数値の約数を量子化テーブルの内の DC 係数の箇所に持ってくれば、完全に透明な色のみのブロックは劣化することなく復元できることになる。<br />
という事で、量子化テーブルの最初の値は、完全に透明なブロックを DCT 変換した時の各要素の値の約数になるようにしようと思う。<br />
クオリティーを指定して計算された量子化テーブルの最初の値を、その値より小さな約数値になるようにすることになるので、少し圧縮率は低下すると思うが、まあうっすらと枠が見えてしまうのは避けたいので仕方ない。</p>

<p>実際に試してみると、800x600 149フレーム のパーティクルの動画で 2.86MB が 2.96MB になったが、枠のようなものは見えなくなった。<br />
この程度の圧縮率の低下であればいいかな。<br />
まあ、エンコーダのオプションとして、有効/無効選べるようにしてもいいし。</p>

<p>2008/06/22 修正。<br />
DC 係数を AC と間違って書いていました。</p>]]></description>
<link>http://www.kaede-software.com/2008/06/post_540.html</link>
<guid>http://www.kaede-software.com/2008/06/post_540.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Sun, 22 Jun 2008 01:53:07 +0900</pubDate>
</item>
<item>
<title>吉里吉里  ムービー拡張日誌2 :: α動画基本動作OK</title>
<description><![CDATA[<p>α動画のエンコードとデコード(+再生)ができるようになった。<br />
640x480 80フレーム(2.6秒)の立ち絵動画をクオリティ95で圧縮すると、約 3.1 MBになった。<br />
立ち絵なので、αチャンネルは ZLib で圧縮されている。<br />
クオリティ80だと 1.8 MBになる。<br />
元の無圧縮 AVI ファイルは 96MB。<br />
ちなみに同じ動画を WMV 95% にすると 844KB。<br />
許せる範囲かな？<br />
ただ、640x480 とは言っても、立ち絵は半分くらいの領域を使っているのみ。<br />
α動画では、完全に透明ではないピクセルを含む最小矩形領域のみ保存しているので、占める矩形領域が小さいとかなり小さい動画を圧縮しているのと同じになる。<br />
また、この矩形サイズはデコード時も関係している。<br />
吉里吉里側のα合成の負荷を下げるため、レイヤーサイズもこの大きさに変更し、レイヤーにデコード画像を描いている。<br />
ただ、矩形領域なので、大の字のようなポーズだったりすると無駄が多い。</p>

<p>で、違う立ち絵の動画3つを Core2Duo E6750 で再生すると、CPU 負荷 10% ～ 15% 程度。<br />
まだ、MMX 化までしかしていないので、SSE2 まで対応するともっと下がると思う。<br />
ただ、SSE2 が使えない CPU では意味がない。<br />
1.5 GHz程度のマシンでどの程度の負荷かはまだ確かめていない。<br />
ほかに出来る MMX のみでの更なる高速化は、完全に透明なブロックの処理を省けるようにすることくらいかなぁ。<br />
ただ、あの特許申請中のものがなぁ……<br />
完全に透明かどうかではなく、ブロックが単一色かどうかは IDCT の前段階でわかる。<br />
AC 係数がすべて0であれば、そのブロックは単一色となる。<br />
単一色であれば、色変換は1ピクセルだけ行い、後はその色で塗りつぶせばいい。<br />
αチャンネルを ZLib で圧縮したバージョンのほうは、ブロックのαチャンネルをすべて調べるのと気にせず合成してしまうのでどちらが速いかは微妙。<br />
この方法で単一色ならブロックを塗りつぶすようにすれば、完全に透明などは関係なく、べたで塗られているところは高速化される。</p>

<p>今回作っているα動画は、krmovie.dll とは独立した機構になっている。<br />
元々は、高速化のためにレイヤーのサイズをフレームによって変更する必要があったので、別のプラグインとして作ることにした。<br />
それ以外にも制御の多くを TJS 側に持っていく形にした方が、いろいろと都合が良いだろうということもある。<br />
このプラグインでは、バックグラウンドで動画を順にデコードしてキューにためていくことしかしない。<br />
キューから取り出して描画を指示するのは TJS スクリプト側の仕事。<br />
つまり、再生速度のコントロールは TJS 側で行うことになっている。<br />
このような仕組みのため、プラグインを変更することなく、スクリプト側でより柔軟な制御が出来るようになるはず。<br />
ただ、現在デコード順は順方向のみなので、この辺りの指定をもっといろいろ出来るようにすると、さらにいろいろな再生が出来るようになると思う。<br />
また、ファイル終端までデコードが終了したら、指定した別ファイルを続けてデコードすることを可能にしたので、複数のムービーを滑らかにつなげるようになった。<br />
従来セグメントループなどの形で実現していたことを、別々のファイルで出来るので、動画制作時の取り扱いなどが楽になるはず。</p>]]></description>
<link>http://www.kaede-software.com/2008/06/ok.html</link>
<guid>http://www.kaede-software.com/2008/06/ok.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Thu, 19 Jun 2008 16:13:07 +0900</pubDate>
</item>
<item>
<title>吉里吉里  ムービー拡張日誌2 :: α動画圧縮の一連の流れ</title>
<description><![CDATA[<p>「ブロック分割→色変換→DCT→量子化→ハフマン符号化 ( ゼロランレングス符号化 ) →ハフマン復号化 ( ゼロランレングス符号化 ) →逆量子化→IDCT→色変換→ブロック合成」が出来るようになった<br />
この一連の流れが出来れば、後はそれほど難しい作業ではない。<br />
動画のファイルフォーマットは完全独自にする予定で、フォーマットの仕様は考えて簡単にまとめた。<br />
ただ、開発途中で問題に気付いて変更する可能性はある。</p>

<p>と言うことで、エンコーダーの開発に取り掛かろうと思う。<br />
エンコーダーは、連番 PNG か無圧縮 32bit AVI から、専用フォーマットの α付きモーション JPEG にエンコードする形になる予定。<br />
連番 PNG は、別に連番でなくても良くて、指定フォルダ内にある PNG ファイルを名前でソートして、それを動画としてひとつにまとめる形にするつもり。<br />
最初のバージョンでは、ハフマン符号化テーブルは固定にする。<br />
その後に 2パス圧縮をサポートしてテーブルを最適化し、圧縮率を高めるバージョンを作るかもしれない。<br />
出来上がったものの圧縮率や再生負荷を見て、後の改良は考える。</p>]]></description>
<link>http://www.kaede-software.com/2008/06/post_539.html</link>
<guid>http://www.kaede-software.com/2008/06/post_539.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Fri, 06 Jun 2008 23:05:42 +0900</pubDate>
</item>
<item>
<title>吉里吉里 その他の開発日誌 :: 吉里吉里2 + キャプチャープラグイン = 動画作成環境</title>
<description><![CDATA[<p>吉里吉里2 と キャプチャープラグイン の組み合わせが、動画作成環境としてかなり高機能な気がする。<br />
という事で、ゲーム画面動画キャプチャープラグインをリリース。</p>

<p><a href="http://kaede-software.com/krlm/plugin/">このページ</a>に置いておきます。</p>]]></description>
<link>http://www.kaede-software.com/2008/05/2_5.html</link>
<guid>http://www.kaede-software.com/2008/05/2_5.html</guid>
<category>吉里吉里 その他の開発日誌</category>
<pubDate>Wed, 28 May 2008 16:10:08 +0900</pubDate>
</item>
<item>
<title>吉里吉里 その他の開発日誌 :: プレイ画面の動画書き出し</title>
<description><![CDATA[<p>前々から動画の書き出し機能があると便利かなぁと思いつつも、需要があるのかどうかわからなかったので、特に手をつけていなかったんだけど、ある程度は使う人がいそうなのと、自分も使いそうなので作ることにした。</p>

<p>AVI で書き出すものはごうさんが既に作っていたけれど、AVI 2.0未対応で無圧縮で保存されるので、あっという間に2GB超え＆HDDへの書き出しが間に合ってなさげで、扱いづらかった。<br />
そこで、AVI 2.0 対応のために DirectShow を使用して書き出すことを考えていたが面倒くさい。<br />
あれこれ考えていて、ふと、WMV で書き出すものなら、さくっと出来る気がした。<br />
という事で、コーディング開始。<br />
さくっと…… と思ったけど、4時間ぐらいコーディングにかかった。<br />
動画系の API は手続きが多いので、いろいろと面倒だった。<br />
改めて考えると、DirectShow を使っても大差なかった気がする。</p>

<p>で、動かすと IWMWriter::BeginWriting でエラーが返ってくる。<br />
内容は、Video codec エラー ( An unexpected error occurred with the video codec ) 。<br />
さっぱり理由がわからない。<br />
サンプルのソースといろいろ見比べたり、サンプルをデバッガで動かして入っている値を見たりして修正するも改善せず。<br />
もしかして、スレッドを分離しているのが原因？ と思って、IWMWriter::BeginWriting を初期化側のスレッドとあわせるとエラーにならなくなった。<br />
別スレッドにしたらだめだったのか。<br />
でも、実際の書き出し部分はスレッドが分かれていても問題ない様子。<br />
バッググラウンドでひたすらエンコードしてもらう必要があるので、書き出し部分は別スレッドに出来ないと少し面倒なので、そこは良かった。</p>

<p>という事で、吉里吉里でゲーム画面の動画を書き出すプラグインを作った (結局１日かかった)。<br />
が、ここではまだ音に対応していない。<br />
吉里吉里の本体から直接音を得る方法はない様子。<br />
本体をいじるか、ループバックで録音するか。<br />
結局、ループバックで録音する方法で行くことにした。<br />
エラー音やクリック音などが鳴ると、一緒に録音されてしまうという難点があるが、まあそこは諦めるという事で。<br />
音のキャプチャー自体は、DirectShow を用いて行った。<br />
ここは特に問題なかったのだが、WMV 書き出しでまたうまく行かない。<br />
エンコードしていたら途中で落ちてしまう。<br />
エラーは The writer has received samples whose presentation times differ by an amount greater than the maximum synchronization tolerance. You can set the synchronization tolerance by calling IWMWriterAdvanced::SetSyncTolerance. とか。<br />
IWMWriterAdvanced::SetSyncTolerance で時間を長くすると、どんどんメモリに溜めていってなかなかエンコードしない様子。<br />
で、終わったものをみてもうまく撮れていない。<br />
なんなんだろう？ といろいろと調べていたら、書き出し時に指定するストリーム番号が設定されていなかった……<br />
絵だけや音だけの場合、そこがおかしくても問題ないけど、絵と音のように2つ以上ストリームがある場合はまずいようだ。<br />
というか、設定する部分を見逃していた。<br />
これで音も撮れるようになった。<br />
結局2日かかった。</p>

<p>ただ、これには問題がある。<br />
WMV をリアルタイムでエンコードする関係上、すごくCPUパワーが必要。<br />
640x480 30FPS では、Core 2 Duo E6750 (2.66GHz)、メモリ 4G、HDD RAID 0 でも間に合わない。<br />
動きの少ないシーンでは大丈夫のようだが、動画を再生しながらとなるとだめ。<br />
エンコードが間に合わない場合、メモリ上にひたすら画像を溜めていくのんだけど、どうも吉里吉里側の描画の方が処理落ちして、それであんまりメモリには溜まらずに進んでいく様子。<br />
プライオリティーをいじれば解決するかもしれないけど、4Gあっても1分程度しか撮れないのであまり効果はない。<br />
これはクアッドコア必須か。<br />
ただ、Video Codec を Windows Media Video V7 や V8 にすると負荷が下がり撮れる。<br />
というか、マルチスレッド化されておらず片方のコアをめいっぱい使っているだけのように見えるが、撮れることは撮れている様子。<br />
まあ、これでいいかなぁと思ったが、もっと速い CPU が欲しいと自分も周りもつぶやいていて、少し考える。</p>

<p>連番 JPEG 書き出しバージョンを作ろう！<br />
JPEG エンコードは、SIMD 拡張版 IJG JPEG library を使う。<br />
で、組む。<br />
1時間ぐらいで出来た。<br />
WAV でもいいから音入らない？ と言われる。<br />
で、組む。<br />
さらに1時間ぐらいで出来た。<br />
いい感じ。<br />
Core 2 Duo E6750 (2.66GHz) で CPU 負荷が 20 ～ 30% 程度。<br />
比較的軽い。<br />
WMV よりも容量が大きくなってしまうのは仕方ないが、バラバラのファイルになるので HDD 容量のみの問題だから、容量が大きくなるのはそれほど問題ではない。</p>

<p>実際のゲーム画面がキャプチャーされたものを見る。<br />
普通に見れる。<br />
というか、ゲームじゃなくてこっちでもいいとか思ったり。<br />
それはどうか…… と言う話なんだけど、字幕付きのアニメを見ている感覚で楽。<br />
これはちょっと考えさせられた。</p>

<p>このプラグインは少し使い方が厄介なので、マニュアルを少し書かないといけない。<br />
その辺り書けたら公開するかも。</p>]]></description>
<link>http://www.kaede-software.com/2008/05/post_538.html</link>
<guid>http://www.kaede-software.com/2008/05/post_538.html</guid>
<category>吉里吉里 その他の開発日誌</category>
<pubDate>Wed, 28 May 2008 13:31:22 +0900</pubDate>
</item>
<item>
<title>Misc. :: デジタルトキワ荘とSNS</title>
<description><![CDATA[<p>気付いたら<a href="http://www.gamecreators.net/" target="_blank">デジタルトキワ荘</a>が SNS になっていました。<br />
今月のはじめごろに登録し、活用しています(？)。</p>

<p>mixi とは異なり、クリエーターの方ばかりでいろいろと刺激があります。<br />
似たような悩みを持っている人や考えている人、開発上の話など、読みたいと思う日記が多いです。<br />
それで、よくぐおーーーっもっとかんばってもっと早く開発しなければ！と思います。<br />
負けず嫌いなので、すごい人とか見ると、絶対負けない、がんばると思います。</p>

<p>デジタルトキワ荘では、ブログと同じような日記を書いていますが、マニアックな内容は少し避けています。<br />
読んでもそのことに詳しいプログラマ以外わからないようなこともブログでは気にせずガンガン書いていますが、日記ではもう少し軽めです。<br />
後、ある程度クローズドなので、実験的に作ったものを適当に置いてみたりしてます。<br />
ここだと、ある程度しっかりしないと公開し辛い面がありますが、SNS なら、まっ、いっかと。<br />
日記も途中の段階であれこれ考えていることを書いています。<br />
ここのブログはそうじゃないときもありますが、ある程度まとまってから書くようにしているので、途絶えたりする時がありますが、日記ではこーかな？あーかな？と書いてたりします。</p>

<p>後、○○出来る人募集とか、探したりするのもやりやすそうです。<br />
これ出来る人いない？　こういう人探しているんだけどとか、今こういうことやってるけどうまくいかないなど、同じ開発者だからわかることや出来ることが出来そうで期待しています。<br />
似たような人たちだから距離も近く感じます。 <br />
また SNS をしている人はわかると思いますが、ブログよりも SNS の日記の方がコメントしやすいです。</p>

<p>ちなみに<a href="http://www.gamecreators.net/dgtkwsns/?m=pc&a=page_f_home&target_c_member_id=3234" target="_blank">私のページはここ</a>です。<br />
よほど変な人でなければ、マイフレンド申請してもらえば OK します。<br />
ただ、ある程度どんな人かわかるようにプロフィールなど書いておいて欲しいです。<br />
さすがにどんな人かわらないのに OK すること出来ないので。</p>

<p>ま、気が向いたら一度お試しあれ。</p>]]></description>
<link>http://www.kaede-software.com/2008/05/sns.html</link>
<guid>http://www.kaede-software.com/2008/05/sns.html</guid>
<category>Misc.</category>
<pubDate>Thu, 22 May 2008 13:34:51 +0900</pubDate>
</item>
<item>
<title>吉里吉里  ムービー拡張日誌2 :: JPEGの圧縮方法とハフマン復号化の高速化</title>
<description><![CDATA[<p>JPEG は、主に DCT、ハフマン符号、ゼロランレングスで出来ている。<br />
JPEG でハフマン符号化を行うのは値そのものではなく、その値を表すのに必要なビット数。<br />
ビット数のハフマン符号化行った後、その最低限必要なビット数で表した値を記録する。<br />
値を直接符号化すると、パターンが多く符号が長くなってしまうが、ビット数であれば 10 までの値を符号化すればいいので短くて済む。</p>

<p>ハフマン符号化 ( エンコード ) は、ある値を別の値に置き換える作業。<br />
これでなぜ圧縮できるかというと、出現頻度の高い値に短い符号を、低い値に長い符号を割り当てるため。<br />
つまり、「あ」はいっぱいあるから 01 にしよう、「ん」はほとんどないから 00000000001 にしようという具合に値を置き換えていく。<br />
こうすると、データの偏りが大きければ大きいほど圧縮される。</p>

<p>ランレングスは、同じ値が連続でつながっていた場合、その値が何個つながっているかを保存することで圧縮する方法。<br />
つまり、「あああああああい」となっていたら、「あ 7 い 1 」というように保存する。<br />
こうすれば元のデータより圧縮される。<br />
ただ、連続していない場合は、データが増える。<br />
JPEG では、ゼロの値についてのみランレングスで圧縮を行う。<br />
なぜゼロかというと、離散コサイン変換 ( DCT ) を行い、量子化を行ったデータにゼロが多く含まれるから。</p>

<p>離散コサイン変換とは、周波数領域に変換する作業。<br />
画像を離散コサイン変換し、高周波領域を削って元に戻しても、劣化があまりわからないことを利用して、圧縮する。<br />
削るのは割り算で行う。<br />
劣化がわかり辛い高周波領域ほど大きな値で割る。<br />
割り算は整数で演算するので、小数点以下はなくなる。<br />
圧縮率を大きくするということは、大きな値で割ることなので、ゼロが多くなる。<br />
JPEG では、この割る作業を量子化と言っている。<br />
元に戻す時は掛け算を行う。<br />
当然小数点以下は失われているので劣化していて、元の値には戻らない。</p>

<p>ハフマン復号化 ( デコード ) は、ハフマン符号化で変更した値を元に戻す作業。<br />
対応表に従って元に戻せばいいんだけど、符号値は可変長なので、まじめにやると1ビット読み込んで比較してなかったらもう1ビット読んで…… とちまちま比較していかないとならない。<br />
圧縮率が高い = 短い符号が多いということなので、高圧縮のデータは数回読めば比較は終了する。<br />
でも、そうでない場合は時間がかかる。<br />
一般的な高速化方法はテーブルを使うこと。<br />
まず最大長のハフマン符号ビット数分読み込んで、その値をインデックスとしてテーブルを引く。<br />
テーブルには値とその符号のビット数を記録しておけば、すぐにわかる。<br />
読み込みすぎた分は元に戻す。( 実際には、最初は参照し、ビット数がわかったらそのビット数分捨てるような作り。参照では読込み位置のポインタは進めない )<br />
ただ、最大長のハフマン符号が大きい時はテーブルが大きくなってしまう。<br />
JPEG では、16 ビットまであるので 65536 個のテーブルになってしまう。<br />
64KB なのでメモリ容量的にはそれほど大きくはないが、テーブルが大きいと遅くなってしまう。<br />
SIMD 拡張版 IJG JPEG library では、ある長さでテーブルを切っている。<br />
つまり、先頭数ビット分のテーブルのみ持ち、持っている長さ分読み込んでテーブルを引く。<br />
テーブルを引くと、その長さ以下の符号なのか、その長さでは足りない符号かわかる。<br />
もし、足りなければそれ以降は1ビットずつ読み込んで比較していく。<br />
ただ、長い符号はあまり出てこないはずなので、結果的にはほとんどテーブルを引くだけで済ませられると思われる。<br />
ハフマン復号化はこの方法を使おうと思う。<br />
もっと高速化できる方法があればいいんだけど……</p>]]></description>
<link>http://www.kaede-software.com/2008/05/jpeg_6.html</link>
<guid>http://www.kaede-software.com/2008/05/jpeg_6.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Thu, 22 May 2008 12:27:58 +0900</pubDate>
</item>
<item>
<title>Misc. :: ディジタル神話</title>
<description><![CDATA[<p>「音楽 CD は、バイナリがまったく同一でプレイヤーも同じなら音質は変わらない。」は間違いだ。<br />
これは事実として認識しても間違いないようだ。</p>

<p>事の発端はガラスで出来た CD の音が良いと言う話題から。<br />
そんなことはありえないと言う意見が多かったが、私は「ディジタルを構成しているものは全てアナログなのだから、何か影響があってもおかしくない」と言う意見だった。<br />
つまり、音は変わることはあり得るという考えだ。</p>

<p>まず、疑ったのは音楽 CD は、読み込みエラーが多いと言う考え。<br />
CD は、読み取りエラーが発生すると、エラー訂正によってほぼ元のデータに復元される。もし、それでも復元されなければ、補間によって、元のデータに近いと考えられるデータになる。<br />
つまり、補間がかかればデータが変わるのだ。<br />
だが、CD の読み取り面が綺麗で、CD プレイヤー自体も経年劣化などしてないければ、読み取りエラー自体発生しないようだ。<br />
また、通常使用時においても、エラー訂正で訂正できないレベル以上、つまり補間がかかることはまずないということが複数の検証サイトによって検証されている。<br />
補間がかかるというか、読み取りに失敗するのは、CD プレーヤー自体に衝撃が加わった時。<br />
これの対策としてポータブル CD プレイヤーには音飛び防止バッファが数十秒積まれている。<br />
ただ、カーオーディオにおいては、この音飛び防止バッファが削られていっているらしい。<br />
理由は至極納得できるもので、常に振動が加わる車では音飛び防止バッファがいくらあっても、バッファを使い切ってしまうと言うことのようだ。<br />
そのため、音飛び防止バッファに頼るのではなく、CD プレイヤーに加わる振動を軽減し、読み取りエラー自体が発生しないようにする方向に進んでいるんだとか。<br />
話がそれたが、エラーによって音が変わるということはなさそうだ。<br />
このエラー以外に音が変わる原因についての論拠は尽きたが、どうも釈然としないためさらにいろいろと調べた。</p>

<p>比較的信頼にたるソースとして、プレクスターの技術者が記者のインタビューに答えると言う記事が見付かった。<br />
プレクスターと言えば、高性能 CD-R ライタで有名だったメーカーだ。<br />
<a href="http://www.watch.impress.co.jp/av/docs/20010611/dal14.htm" target="_blank">第14回：迷信だらけのデジタルオーディオ［特別編］ ～ドライブメーカー「プレクスター」に聞く、CD-Rの変化～</a></p>

<p>CD-R に焼くと、どうも音がこもった感じがするような気がしていたが、その感覚は間違いではなさそうだ。<br />
さらに有名な検証サイトを以下にリンクしておく。<br />
かなり、長いので上の記事で納得できない人や興味のある人は読むといいと思う。</p>

<p>以下、<a href="http://www3.coara.or.jp/~tomoyaz/higawari.html" target="_blank">今日の必ず得する一言</a> より<br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9905.html#990523" target="_blank">音楽CDの音質とジッタの関係のナゾ(CDの神髄編)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9905.html#990526" target="_blank">音楽CDの音質とジッタの関係のナゾその２(原信号特性編)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9906.html#990601" target="_blank">音楽CDの音質とジッタの関係のナゾその3(ジッタ変動とスタビライザーX編)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9906.html#990607" target="_blank">音楽CDの音質とジッタの関係のナゾその4(みんなでジッタサウンド編)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9906.html#990610" target="_blank">音楽CDの音質とジッタの関係のナゾその5(ジッタの電源ライン波及編)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9906.html#990613" target="_blank">音楽CDの音質とジッタの関係のナゾその6(緑に塗ったりカットしたり編)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9906.html#990615" target="_blank">音楽CDの音質とジッタの関係のナゾその7(ジッタの影響はDACか？アンプか？)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9906.html#990620" target="_blank">音楽CDの音質とジッタの関係のナゾその8(ジッタ量とエラー訂正頻度)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9906.html#990625" target="_blank">音楽CDの音質とジッタの関係のナゾその9(TE信号とエラー信号記録法)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa9906.html#990630" target="_blank">音楽CDの音質とジッタの関係のナゾその10(山本式メカニカルダンパー変造)</a><br />
<a href="http://www3.coara.or.jp/~tomoyaz/higa0107.html#010715" target="_blank">CD-Rのジッタとメーカーの言い分のナゾ</a></p>

<p><a href="http://www.k3.dion.ne.jp/~kitt/main.html" target="_blank">A-1 DRIVE</a><br />
<a href="http://www.k3.dion.ne.jp/~kitt/craft/audio/er_count/index.html" target="_blank">CD（ディジタルオーディオ -S/PDIF） エラーカウンタ／ステータスモニタの製作</a></p>

<p>ジッタ計測などを行っているページ <a href="http://www.ne.jp/asahi/fa/efu/" target="_blank">efu's page</a></p>

<p>これらの記事を読んでどう判断するかは自由だが、私は音は変わるという意見になった。<br />
まあ、元々そうだったんだが……</p>]]></description>
<link>http://www.kaede-software.com/2008/05/post_495.html</link>
<guid>http://www.kaede-software.com/2008/05/post_495.html</guid>
<category>Misc.</category>
<pubDate>Thu, 22 May 2008 10:46:41 +0900</pubDate>
</item>
<item>
<title>吉里吉里  ムービー拡張日誌2 :: α動画をどう実装するか</title>
<description><![CDATA[<p><a href="http://www.kaede-software.com/2008/05/post_536.html">α動画の高速化を阻む特許</a>で書いた特許は、審査請求されていないそうで、まだ特許になっていないんだとか。<br />
イマイチ特許のシステムを理解していなかった。<br />
まあ、それはいいとして、現状まだ特許になるかどうなるかわからないようだ。<br />
請求項の範囲が広すぎるし、誰でも思い付きそうな方法だから特許にはならないんじゃないかなぁと思うんだけど、どうしよう。</p>

<p>ブロックが完全に透明かどうかで処理を分けるか否かに関わらず必要な処理は高速化しないといけないと思うので、まずは一通りの処理を書いて、速度を測ってみるか。<br />
後、ブロックが完全に透明かどうかで処理を分けるのも、一度書いてみよう。<br />
構造的に、ifdef で使うかどうか切り替えられると思うので、そのようにしておけばどっちになっても大丈夫か。<br />
でも、特許として認められるよりも早く製品を出した場合はどうなるんだろう？<br />
これはもっと特許について勉強しないといけないな。</p>

<p>それよりも何よりも、どの程度高速化するのかしないのかについて興味がある。<br />
たいして速くならないのならなくしてしまった方が安心と言えば安心。</p>]]></description>
<link>http://www.kaede-software.com/2008/05/post_537.html</link>
<guid>http://www.kaede-software.com/2008/05/post_537.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Sat, 17 May 2008 02:46:22 +0900</pubDate>
</item>
<item>
<title>吉里吉里  ムービー拡張日誌2 :: α動画の高速化を阻む特許</title>
<description><![CDATA[<p>α動画関係の特許を調べておくかと思って調べた。<br />
すぐに見つかったのは次の2つ。</p>

<p>1. <a href="http://www.j-tokkyo.com/2005/H04N/JP2005-160089.shtml" target="_blank">αチャンネル映像のための符号化ブロックパターン生成装置及び方法とそれを利用したαチャンネル映像符号化／復号化装置及び方法</a></p>

<p>2. <a href="http://www.j-tokkyo.com/2005/H04N/JP2005-253088.shtml" target="_blank">グレイアルファチャンネルを含んだ映像の符号化／復号化装置および方法</a></p>

<p>両方サムスンがとっているよう。<br />
ぱっと見意味不明だが、2の方が今回考えていた高速化に引っかかる。<br />
まず、1 の方は、αチャンネルと言っているが、1ビットのマスクを想定して書かれていて、ブロックが全て透明、全て不透明、混在の3つに分けて処理する方法が書かれている。<br />
そして、JPEG などでは 16x16 のブロック を 8x8 に分けて圧縮するが、このブロックの透明/不透明の3パーンの情報を 8x8 に付与し、16x16 の方は 8x8 の透明情報の論理和などを取って判断することが書かれている。<br />
つまり、8x8 単位で分類されているが、16x16 単位の段階でまず判断でき、そこで混在している場合は、8x8 単位で判断し処理できる。<br />
なるほど、これはよく考えられている。<br />
8x8 単位にすることは考えたが、そこで分けるよりも 16x16 単位にして処理してしまった方が速いだろうと思ってそうはしなかった。<br />
ただ、8x8 単位で考えていた場合は、この特許に引っかかっていたかもしれない。</p>

<p>問題は2番。<br />
ブロックのαチャンネル値が全て0の時、符号化処理を省く方法について書かれている。<br />
また、αチャンネル値が全て0かどうかで処理を分けること自体が封じられているようだ。<br />
なんてことだ。<br />
こんな簡単に思いつく方法を特許にしないでくれよ。<br />
1番はなるほどと思ったけど、2番はちょっと考えてすぐに思いついた方法と同じ。<br />
特許がとられた年を考えると、既にこの技術を使った製品などあってもおかしくなさそうだけど、特許の取り消しとか個人で何とかなるのか良くわからないし、時間もかかるだろうからこの方法は諦めるしかないか。<br />
何度か読んで回避方法も考えてみたが、請求項の範囲が広すぎてどうにもならないかと諦めることに。</p>

<p>仕方がない。<br />
深い部分に踏み込むのは止めて、JPEG に α情報を付与したものを出来るだけ高速にデコードするように頑張るか。<br />
1.5GHz で 3つ同時は辛いかもしれないなぁ。</p>

<p>2008/05/17 追記<br />
これはまだ特許になっていないそうな。<br />
審査請求されていないとか。<br />
<a href="http://oshiete1.goo.ne.jp/qa1404895.html" target="_blank">特許の審査未請求って？</a><br />
特許のシステムをイマイチ理解していなかった。<br />
もう少し勉強した方が良さそうだ。<br />
公開されていたから、特許かと思ってた。</p>]]></description>
<link>http://www.kaede-software.com/2008/05/post_536.html</link>
<guid>http://www.kaede-software.com/2008/05/post_536.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Fri, 16 May 2008 19:52:22 +0900</pubDate>
</item>
<item>
<title>吉里吉里  ムービー拡張日誌2 :: α動画圧縮の手前まで</title>
<description><![CDATA[<p>アルファ付き動画は、SIMD 拡張版 IJG JPEG library からいくつかの機能を切り出して、ある程度はそれを使い、残りは自分で組んで作ろうとしている。<br />
「ブロック分割→色変換→DCT→量子化→①→逆量子化→IDCT→色変換→ブロック合成」の①を除く処理の流れは出来た。<br />
①の部分は、ハフマン符号化とゼロランレングスによって圧縮し、伸張する処理。<br />
①の部分は可逆なので、それ以外の部分によって劣化具合がわかる。<br />
つまり、今作っている部分でどの程度劣化するかはわかる。<br />
アルファもこの流れで符号化/復号化してみたが、気になるほどエッジがぼけるということはないようだ。<br />
アルファは 1/4 サイズにするのは止めて等倍にした。<br />
以前書いたように、立ち絵のようなほとんど不透明/透明で構成されている画像の場合は、ZLib で圧縮した方が圧縮率が良くなるので、そちらで圧縮する。<br />
</p>]]></description>
<link>http://www.kaede-software.com/2008/05/post_535.html</link>
<guid>http://www.kaede-software.com/2008/05/post_535.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Fri, 16 May 2008 01:54:08 +0900</pubDate>
</item>
<item>
<title>吉里吉里  ムービー拡張日誌2 :: アルファ付き動画の高速化を考える</title>
<description><![CDATA[<p>現在のまま実装すると 1.5 GHz 程度の CPU では、2個同時ぐらいが限界になりそうなので、もう少し高速化する方法を考える。<br />
できれば、3個同時に再生したい。</p>

<p>SIMD 拡張版 IJG JPEG library では、数ラインずつデータを取得していくが、中を見るとそのラインに必要な分だけデコードしているっぽい。<br />
必要な分だけやっているとしたら、キャッシュの効率は良さそうだ。<br />
高速化するのなら他の部分や特性を考えないと難しそう。</p>

<p>IDCT のアセンブリソースを C に書き直していて気付いたけど、どうも一度 char サイズの YCrCb カラーに変換してから、RGB カラーに変換している ( IDCT の係数行列は short 型 )。<br />
YCrCb カラーから RGB カラーに変換する時、また一度 short に戻している。<br />
これは少し無駄に見える。<br />
元の IJG JPEG library の構造からくる制約だろうか？<br />
それか、一度 unsigned char にすることで飽和処理を用いて 255～0 の範囲に丸める必要があるのかもしれない。<br />
この辺りは実験した方が良さそう。</p>

<p>また、YCrCb カラーから RGB カラーに変換する部分でも、精度を重視したような実装になっている。<br />
四捨五入したり、2倍してから計算して半分に戻すなど。<br />
少しの誤差は気にしない方針にしてしまえば、ここも少し速く出来るかもしれない。</p>

<p>これ以上はアルファに注目して、高速化するのが良さそう。<br />
16x16 のブロックで全て透明のものは保持せず、ブロックが完全に透明かそれ以外かでフラグを保存しておけば、完全透明の時は単純にゼロフィルすればいいだけになる。<br />
また、色空間変換時にアルファ値を参照して 0 ならその部分の変換はスキップしてゼロフィルする。<br />
これが出来るだけでも、かなり速くなるのではないかと思う。<br />
画像にもよると思うが半分以上は透明なのではないかと思う。<br />
そうなると、その半分はほとんどの処理を飛ばせるのでかなり速くなるはず。<br />
ただ、完全に透明な領域が少ないと効果は少ない。<br />
そこは動画なのでフレームによって差があると思うので、先読み分である程度処理負荷を平均化出来るのではないかと考えている。</p>

<p>でも、これやるとなると IJG JPEG library にかなり手を入れるか一から作る必要があるのが大変。<br />
と言いつつ、SIMD 拡張版 IJG JPEG library のアセンブリソースを少しずつ C に直しているんだけど。</p>]]></description>
<link>http://www.kaede-software.com/2008/05/post_534.html</link>
<guid>http://www.kaede-software.com/2008/05/post_534.html</guid>
<category>吉里吉里  ムービー拡張日誌2</category>
<pubDate>Tue, 13 May 2008 23:13:31 +0900</pubDate>
</item>
<item>
<title>吉里吉里 その他の開発日誌 :: ボタンエッジ検出と長押し判定</title>
<description><![CDATA[<p>今作っているゲームパッドプラグインでは、単純に現在のボタンやキーの状態を取得するのみになっている( 厳密には、パッドの update メソッドをコールした時の状態 )。<br />
この機能のみあれば、スクリプトでエッジ検出や長押し判定することが出来る。<br />
ただ、エッジ検出や長押し判定は、よく使うと思うので、プラグイン内に入れてしまってもいいかもしれないと考え中。</p>

<p>update がコールされた時、対象のボタンが押されていれば 1加算、離された時 ( 押されておらず値が 0 より大きい時 ) -1 に、押されていない時 ( 値が 0 以下の時 ) は 0 にする。<br />
このようにすれば、0 より大きい時は押されていて、0 以下の時は離されているのがわかる。<br />
また、マイナスの時は離された瞬間、1 の時は押された瞬間とわかる。<br />
長押しは、どれぐらいの長さにするかによるが、値がいくつ以上かと判定することでわかる。<br />
仕組み的にはこんな感じで。<br />
もっといい方法があれば…… と考えていた気付いたけど、長い間押されていないのも判定できた方が良いだろうか？<br />
単純に 負の値の時に 1 減算していくことで、どれくらい長い間押されていないかはわかる。<br />
しばらく操作されていないとキャラクターがあくびするなどの時に使う…… ことはないか。<br />
操作されていないのであれば、全ボタンで判定した方が効率的。<br />
まあ、長押されてない判定もあってもいいかな。<br />
あって不都合はないし。</p>

<p>ボタンエッジ検出や長押し判定は、状態取得のクラスに入れるのではなく、そのクラスをラップして実現するのがいいかな。<br />
ゲームパッドの状態取得クラスは、IInputDevice インターフェイスを継承して作っている。<br />
これの派生クラスは、XInput 用、DirectInput 用、DirectInput フォースフィードバック対応用の3つある。<br />
継承関係の間に入れるという手もあるけれど、必ずしもボタンエッジ検出や長押し判定が必要とは限らないので、包含して拡張するのが良いかな。</p>

<p>ま、ボタンエッジ検出と長押し判定は入れよう。<br />
いずれかのボタンが押されている離されているも。<br />
</p>]]></description>
<link>http://www.kaede-software.com/2008/05/post_533.html</link>
<guid>http://www.kaede-software.com/2008/05/post_533.html</guid>
<category>吉里吉里 その他の開発日誌</category>
<pubDate>Tue, 13 May 2008 15:58:12 +0900</pubDate>
</item>
<item>
<title>吉里吉里 その他の開発日誌 :: ゲームパッド プラグインがとりあえず動くように</title>
<description><![CDATA[<p>DirectInput と XInput に対応し、複数パッドを扱えて、フォースフィードバックのバイブレーション対応、アナログスティック対応したゲームパッド プラグインがとりあえず動くようになった。<br />
XInput デバイス ( XBox360 コントローラ) と DirectInput デバイスをつなげて、両方のパッドからアナログスティックの情報を得られることを確認。<br />
アナログスティックは、-1.0 ～ 1.0 の値を返すようにしている。<br />
細かい部分のデバッグとボタン設定用のインターフェイスはまだ。<br />
DirectInput デバイスはパッドによってボタン配置が違うので、設定用のメソッドは必須だろう。<br />
アクション マッパーは使わない予定。</p>

<p>XInput デバイスはボタン固定なので、ボタン設定用のメソッドは持たない。<br />
このプラグインでは、あくまでパッド間の差異を吸収するための設定と考えている。<br />
でも、そしたらゲーム個別の設定が出来るようにしようとしたら、2回も設定が必要か……<br />
その辺りは少し考えないとダメかな。</p>]]></description>
<link>http://www.kaede-software.com/2008/05/post_532.html</link>
<guid>http://www.kaede-software.com/2008/05/post_532.html</guid>
<category>吉里吉里 その他の開発日誌</category>
<pubDate>Mon, 12 May 2008 23:33:53 +0900</pubDate>
</item>


</channel>
</rss>