8月 23rd, 2010

2年ぶり。あれから自転車乗ってるからラクになってるだろう、とタカをくくっていたがそうでもなかった。
特に前日の睡眠不足が響いた。まともに寝たのは1時間くらい。
そして補給の失敗が重なる。眠い→高山病→食欲減退という連鎖。空腹感、疲労感が出る前に補給、休憩というのは私のような初心者には難しいのに、もうグダグダ。
それでもどうにか山頂へ到達! しかし日が陰ってきたため達成感も味わう暇もなく、すぐに下山開始。前回の体験から下山が辛いことが分かっていたので、脚を残しておいたのが良かったか。下りは前回より明らかに楽になっていた気がする。
山頂以外寒くなかったことと、天候に恵まれ、雨具の出番が無かったのが救い。
もう登らなくていいかな。自分には自転車のほうが合っているようだ。
Edge 500 を持っていったのだが、意外とハートレートが100%になることは無かった。だいたい80%くらい。ちょうどいい負荷だったかもしれない??
Comment » | OffTopic
8月 23rd, 2010
今週末はどうしようか、と。
六本木の東京ミッドタウンでPACIFIC PEDAL LIFE DESIGNをやってるとのこと。それなら行ってみるか、と思ったが、せっかくだから国立新美術館で何かやってないかな、と検索してみたらマン・レイ展をやっていた。

ミッドタウンなんてアウェイもいいとこ。ちょっとお金持ってそうだったり、感度の高そうだったり、そんな人が多かった。
展示はDESIGN SIGHTでやってたので5Fへ。
DAHON の古いバイクが展示してあったけど、どこで折りたたんでいいのかさっぱり分からなかったな。

で、マン・レイ展へ。といっても彼のことはさっぱり知らない。せめて予備知識でも身につけてから行けばよかったが、そうもせず。ただ感じるままに見た。

そういえば、ここの建築家は誰だったっけ?と調べたら、「黒川紀章」氏とのこと。こんな素敵な空間で、ちょっと休憩とか言ってコーヒー飲んだり、とか。なんて優雅なんだ。
Comment » | VisualArt,VJ,Club
8月 12th, 2010
毎月恒例のWindows Updateだが、DirectShow に関するものが含まれている。
Continue reading »
Comment » | DirectShow,MF,CoreAudio
7月 29th, 2010
通常、EVR Custom Presenter (カスタムプレゼンタ)はcoclass として実装し、DLL としてコンパイルする。この方法はバージョンアップが容易であったり、コンパイル無しに再利用できたりするメリットがある。しかし、配布ファイル数が多くなる、他のアプリケーションから参照されやすいといったデメリットもあり、プライベートで使用するのであれば DLL ではなく実行ファイル(.EXE)に内蔵することを検討したい。
Media Foundation においては、Activation Object (アクティベーションオブジェクト) を実装することにより、実行ファイルに EVR Custom Presenter を内蔵することができる。
Activation Object を実装する
Activation ObjectとはCOMにおけるクラスファクトリに似ている。IMFActivateインターフェイスを実装したクラスであり、coclass のインスタンスを作成したり、シャットダウンする役割がある。
もっとも重要なのはIMFActivate::ActivateObjectでCoCreateInstanceのような役割がある。インスタンスを作成し、そのインターフェイスのポインタを返すメソッドである。
EVR Custom Presenter のクラスをCEvrPresとすると、このインスタンスを作成するためのIMFActivate::ActivateObjectは以下のように実装できる。
IMFActivate::ActivateObject
CComPtr<CEvrPres> m_CustomPres; // メンバ変数
HRESULT STDMETHODCALLTYPE ActivateObject(REFIID riid, void **ppv) {
if (riid != __uuidof(IMFVideoPresenter)) {
return MF_E_CANNOT_CREATE_SINK;
}
if (ppv == NULL) {
return E_POINTER;
}
if (m_CustomPres != NULL) {
CComQIPtr<IMFVideoPresenter> mfvp(m_CustomPres);
*ppv = mfvp;
mfvp.p->AddRef();
return S_OK;
}
CComObject<CEvrPres> * object;
CComObject<CEvrPres>::CreateInstance(&object);
m_CustomPres.Attach(object);
m_CustomPres.p->AddRef();
CComQIPtr<IMFVideoPresenter> mfvp(object);
if (mfvp == NULL) {
return MF_E_CANNOT_CREATE_SINK;
}
*ppv = mfvp;
mfvp.p->AddRef();
return S_OK;
}
このコードの流れをざっと説明すると、はじめに、引数riidが__uuidof(IMFVideoPresenter)かどうか確認する。EVR Custom Presenter の Activation Object に対してこのメソッドが呼ばれるとき IMFVideoPresenter インターフェイスが要求される。そして、CEvrPresクラスのインスタンスを作成し、IMFVideoPresenterインターフェイスを問い合わせる(QueryInterface)。最後に、戻り値ppvに代入して完了。
CoCreateInstanceとIMFActivate::ActivateObjectの違いは、作成したインスタンスを Activation Object が記憶していることだ。これはIMFActivate::ActivateObjectを再度呼び出したとき、IMFActivate::ShutdownとIMFActivate::DetachObjectのいずれかが呼ばれるまで同じインスタンスを示すポインタを返す必要があるからだ。
After the first call to ActivateObject, subsequent calls return a pointer to the same instance, until the client calls either ShutdownObject or IMFActivate::DetachObject.
IMFActivate::ActivateObject Method
EVR Custom Presenter の Activation Object を EVR に設定する
EVR の Activation Object を作成するAPIはMFCreateVideoRendererActivateである。これで作成した Activation Object の MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_ACTIVATE 属性に EVR Custom Presenter の Activation Object を設定する。
Activation Object を設定
CComPtr<IMFActivate> &activate;
hr = MFCreateVideoRendererActivate(m_hWnd, &activate);
CComObject<CMyActivateObj> * my_activate_obj;
CComObject<CMyActivateObj>::CreateInstance(&my_activate_obj);
CComPtr<IUnknown> unk(my_activate_obj);
hr = activate->SetUnknown(MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_ACTIVATE, unk);
あとは Topology のノードに、この Activation Object を追加すれば、内蔵した EVR Custom Presenter が使われるようになる。
Comment » | DirectShow,MF,CoreAudio
7月 26th, 2010
Windows SDK には、EVR Custom Presenter の実装サンプルである EVRPresenter がある。Standard EVR Presenter のように Direct3D9 を初期化し、サーフェイスにデコード済フレームをバッファし、画面にレンダリングする。
しかし、そのままでは正常に動作しない。メディアタイプのネゴシエーションを行っている途中で、MediaType::CopyFromで例外が発生してしまう。
例外メッセージ
MFPlayer.exe の 0×5956bdc2 (mfplat.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0×00000000 を読み込み中にアクセス違反が発生しました。
スタックトレース
>EVRPresenter.dll!MediaFoundationSamples::MediaType::CopyFrom(IMFMediaType * pType) 行 182 + 0×1a バイト
EVRPresenter.dll!EVRCustomPresenter::CreateOptimalVideoType(IMFMediaType * pProposedType, IMFMediaType * * ppOptimalType) 行 1414 + 0xc バイト
EVRPresenter.dll!EVRCustomPresenter::RenegotiateMediaType() 行 1071 + 0×10 バイト
EVRPresenter.dll!EVRCustomPresenter::ProcessMessage(MFVP_MESSAGE_TYPE eMessage, unsigned long ulParam) 行 334 + 0xb バイト
正しく動作させるには、以下のようにCreateEmptyTypeを呼び出すように直す。
Presenter.cpp 1400行目付近
HRESULT EVRCustomPresenter::CreateOptimalVideoType(IMFMediaType* pProposedType, IMFMediaType **ppOptimalType)
{
HRESULT hr = S_OK;
RECT rcOutput;
ZeroMemory(&rcOutput, sizeof(rcOutput));
MFVideoArea displayArea;
ZeroMemory(&displayArea, sizeof(displayArea));
// Helper object to manipulate the optimal type.
VideoType mtOptimal;
mtOptimal.CreateEmptyType(); // ★追加★ 内部で MFCreateMediaType を呼び出す.
// Clone the proposed type.
CHECK_HR(hr = mtOptimal.CopyFrom(pProposedType));
(以下略)
これは Windows SDK v7.1 でも発生する。
Comment » | DirectShow,MF,CoreAudio
7月 21st, 2010
津久井湖 – 道志みち – 山中湖のルートでCAAD9で行ってみた。そういえばブログにCAAD9のこと書くのは初めて。
プロフィールマップ
予め走るルートの勾配は確認していったのだが、体力の無さと暑さで完全に脚が売り切れた状態での走行になってしまった。
- 津久井湖から山伏トンネルまでの約45km。その間はほとんど登りだが、極端にキツい勾配が続くわけではないので、前半で頑張りすぎてしまう。ほんとに辛いのは道の駅から。
- せっかく保冷ボトルに氷とドリンクを入れて持って行ったのに、その場で買ったペットボトルの水ばっかり飲んでて、実質単なる重りになってた。何やってんだ自分。
- 明らかに補給が間に合ってなかった。ハンガーノックに近かったか??
- Edge500の心拍ゾーン設定が誤ってた。ゾーン1の下限とゾーン5の上限が同じ値になってた。何故?
そんなことを考えながら、山伏トンネルに到着。

今までのアップダウンを考えると引き返す気力もなく、山中湖に抜けることにした。

富士吉田から輪行して帰宅。
大月まで下りなんだから走っていけばよかったな。富士急の運賃高いし。
Comment » | Mu-P8
7月 16th, 2010
忘れてないように、このブログにメモして手元に置いておく。
Media Foundation のデバッグログをイベントビューアに出力することができる。
1. スタートメニューを開いてイベントビューアを起動する。(画面は Windows 7 英語版)

2. メニュー[View]-[Show Analytic and Debug Logs] を有効にする。
3. 「Applications and Services Logs\Microsoft\Windows」に次の4つの項目が登場。
- MediaFoundation
- MediaFoundation-MFReadWrite
- MediaFoundation-Performance
- MediaFoundation-Platform
- MediaFoundation-PlayAPI
4.いずれかの項目を開き、[Actions]ペインにある[Enable Log]を選択する。

5.デバッグしたいアプリケーションを実行すると、イベントログが記録されていきます。
Comment » | DirectShow,MF,CoreAudio
7月 13th, 2010
Visual Studio 2010 Ultimate with MSDN プレゼントします。
そうです。Visual Studio 2010 の最上位エディションとMSDNサブスクリプションのセットです。これを1名様にプレゼントしちゃいます。私個人が、このブログで行っているものですから当選確率は高いですよ!
今回は、Visual Studio 2010 UltimateやMSDNの素晴らしい体験をまだ味わったことが無い個人向けに企画したものです。既にMSDNを利用している方や、タダだから何となく応募してみるかという方はご遠慮頂きたいと思います。詳細は以下。

要項
概要
Microsoft Visual Studio 2010 Ultimate with MSDN相当品を 1 名様にプレゼント致します。実物のパッケージではなく、アクティベーションコードによる提供となりますのでオンラインで手続きを取って頂きます。アクティベーションコードはメールまたはTwitterのDirect Messageでお送りします。
締切
2010年7月20日 23時59分 (日本時間)
応募資格
以下の項目をすべて満たすこと。
- 有効なTwitterアカウントを所持しており、私のTwitterアカウント(@syu5)をフォローしていること。
- MSDN サブスクリプションを所持または使用したことがないこと。Microsoft のMSDNサブスクリプションが利用できる優待プログラム(BizSpark 等)も含みます。
- 第三者が確認できるWebサイト、ブログを用いて、開発者向け情報を発信していること(※1)。ただし、法人サイト、ログインしなければ閲覧できないサイト、有料サイト、Microsoft に対してネガティブな立場で記述しているサイトは不可。2010年9月30日までにVisual Studio 2010 Ultimate with MSDN の使用レポートを当該Webサイト、ブログで公開し、そのURLを私にTwitterのDirect Messageまたはメールで知らせること。
応募方法
応募資格を全て満たしていることを確認し、私のTwitterアカウントに以下の内容を書いたDirect Messageを送ってください。
- 応募資格 ※1 を確認できるWebサイト、ブログのURL。(短縮URL可)
- 字数に余裕があれば、なにか一言。
注意事項
- 当選者にはTwitterのDirect Messageで通知します。2010年7月21日頃を予定しています。
- 当選後に受け取るアクティベーションコードをもとに、当選者本人が2010年6月10日から180日以内にオンラインアクティベートして頂きます。
- 転売、譲渡は禁止です。使用できるのは当選者本人に限定されます。
- サポートインシデント、MSDNマガジンの購読特典はありません。
- Office製品含め、使用目的は開発、設計、デモンストレーションおよびテストに限定されます。
- ランダムに選ぶのではありません。Webサイト、ブログの内容を確認し、私の独断と偏見で当選者を決定します。
Comment » | OffTopic
6月 10th, 2010
Out of memory errors with the Windows Media Format SDK というエントリーがブログ Windows Media and DirectShow tips, gotchas and code bits にアップされていた。
ポイントとしては、以下のようなところ。
- 32ビットのWindows OSでアプリケーションが確保できるメモリは最大2GB。
- Media Format SDK は自身のヒープを作成し、それが2GBを超えないように注意しながらメモリを使う。
- ところがエンコーディングアプリケーションのフットプリントを合わせると、(プロセス全体で)2GB超えちゃう。
- VC 1 codec はフレームの前後を参照するのでHDビデオをエンコードすると大量にメモリを消費する。30fpsで5秒だと1.2GB。
- Media Format SDKはエンコーディング前に利用可能メモリを確認し、ヒープを確保する。CRTのような他のヒープは管理しない。
- 空きメモリがあってもヒープにフラグメンテーションが発生している場合もOut of memoryとなる。CPUに負荷がかかってる状態ではOSはヒープコンパクトをしない。
- 結 果 。 Out of memory になってしまう。
で、対策。
- プロセスを分割する。
- x64プラットフォームを使用する。
- エンコーディング設定を見直して消費メモリを抑える。→ バッファサイズを1秒にする、キーフレームの間隔を2,3秒にする。
HDビデオを扱うなら x86 環境はかなり厳しい。x64プラットフォームに移行するのがベストか。前後のフレームを参照するようなcodecだと、非圧縮の状態でフレームをメモリに置かなければならないのであっという間に2GB制限にひっかかってしまう。編集となると更にレイヤーの数だけメモリが消費されるから大変だな…
Comment » | DirectShow,MF,CoreAudio
6月 9th, 2010
恒例の Windows Update の日。
Microsoft が公開されているセキュリティ情報を見てみると、メディア解凍の脆弱性により、リモートでコードが実行される (979902)が公開されていた。
ユーザーが特別に細工されたメディア ファイルを開くか、または Web サイトや Web コンテンツを配信するアプリケーションから特別な細工がされたストリーミング コンテンツを受け取った場合、リモートでコードが実行される可能性があります。
とのこと。最新のOSである、Windows 7とWindows Server 2008 R2も対象となっているので適用しておきたい。またWindows 2000も対象となっているが、延長サポートは2010/7/13で終了することに注意しておきたい。
Comment » | DirectShow,MF,CoreAudio