hiriscの日記 RSSフィード

 

2013-06-07

DirectShowで録画再生アプリとフィルタを開発しました

| 20:22 |  DirectShowで録画再生アプリとフィルタを開発しましたを含むブックマーク

ググりまくった結果得られたノウハウ的なもののメモです。以下、駆け足で。

64bit版Windows7だとWindows SDK7.1付属のGraphEditで自作アプリのフィルタ接続がアタッチできなくて困ってた。調べたらWindowsSDK7.1のフォルダにあるproppage.dllwindowsフォルダ下のSysWOW64にコピーして、管理者権限のコマンドプロンプトからregsvr32.exe proppage.dllすれば動くらしい。ていうか動いた。

オーディオキャプチャ、手持ちのWeb Camのマイクだとデフォルトで0.5秒分のPCMデータが1つのバッファで送られて来る仕様だった。このサイズはアプリ側から変更できる(可能性がある)。ICaptureGraphBuilder2のIAMBufferNegotiationインタフェースに所望のサイズを指定する。本当にそのサイズになっているか確認もできる。

	ALLOCATOR_PROPERTIES prop = {
		16, 2048 * channel, 16, 0
	};
	IAMBufferNegotiation *conf;
	builder->FindInterface(&PIN_CATEGORY_CAPTURE, NULL, audio_capture, IID_IAMBufferNegotiation, reinterpret_cast<void **>(&conf));
	conf->SuggestAllocatorProperties(&prop);
	conf->GetAllocatorProperties(&prop);

プレーヤーに巻戻し等のシーク機能が必要な場合、グラフ内のフィルタ全てにIMediaSeekingインタフェースが必要。CTransformFilter等を継承した場合は出力ピンにパススルー機能が入っているのですでに対応済。具体的にはtranfrm.cppのCTransformOutputPin::NonDelegatingQueryInterface()。

CBaseFilterから独自に作成したフィルタの場合、パススルー動作で済むなら上記のCTransformOutputPin::NonDelegatingQueryInterface()コピペでいいと思う。しかし例えばファイルから直接読み出すデマルチプレクサ等の場合、IMediaSeekingインタフェースを実装し、出力ピンとフィルタ本体のNonDelegatingQueryInterface()で公開する必要がある。

ファイル読込でURL Readerフィルタから入力を受けるフィルタを自作する場合、相手ピンのIAsyncReaderインタフェースを利用する必要がある。具体的にはBaseInputPin::CheckConnect()で相手ピンから

	pin->QueryInterface(IID_IAsyncReader, reinterpret_cast<void**>(&reader));

してreaderを持っておく。以後readerを使ってreader->Length()とかreader->SyncRead()とかできる。

他のフィルタと異なり、IAsyncReaderからの入力は下流側からデータを読みに行かなくてはならない。なので下流側フィルタの出力ピンか何かにCAMThreadクラスを継承して、ThreadProc()内で「reader->SyncRead()して適宜加工し出力ピンからDeliver()する」ループ動作にすることになると思う。

#include <Dshow.h>すると"warning C4995: 'gets': name was marked as #pragma deprecated"みたいな警告がいくつか出る場合、その前に#include <iostream>を入れると消える。

#include <iostream> // to eliminate warnings....
#include <Dshow.h>

YUVtoRGB変換だとAVI Decompressorフィルタがあるけど、YUVから別のYUVフォーマットに変換するフィルタ探したらCColorconvertDMOというのが使えた。ただ、カメラに直結した時にプレビューピンが先につながってると接続に失敗した。プレビューと録画のpinって実際にはSmart Teeフィルタが自動挿入されるようなので、そのへんの再接続動作で何かあるんだと思う。プレビュー接続を後回しにしたらあっさり繋がった。

	IBaseFilter *filter;
	CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&filter));
	IDMOWrapperFilter *dmowrapper;
	IMediaObject *media;
	filter->QueryInterface(IID_IDMOWrapperFilter, reinterpret_cast<void**>(&dmowrapper));
	dmowrapper->Init(CLSID_CColorConvertDMO, DMOCATEGORY_VIDEO_EFFECT);
	dmowrapper->QueryInterface(IID_IMediaObject, reinterpret_cast<void **>(&media));
	media->SetInputType(0, src_format, 0);
	media->SetOutputType(0, &dst, 0);
	graph->AddFilter(conv, L"DMO YUV");
トラックバック - http://d.hatena.ne.jp/hirisc/20130607

2011-01-13 このエントリーを含むブックマーク

MacBook Air 11インチ欲しい!

近日中にSHCでBoostコンパイル、みたいな記事を書ければいいなー

トラックバック - http://d.hatena.ne.jp/hirisc/20110113

2010-05-04

WEB+DB PRESS vol.56に載ってたベイジアンフィルタをやってみる

| 10:13 |  WEB+DB PRESS vol.56に載ってたベイジアンフィルタをやってみるを含むブックマーク

text2vec() 関数はこんな感じ?

面倒なので形態素解析Yahoo APIのを使いました…。

#! /bin/ruby

$KCODE="u"
require 'rexml/document'
require 'open-uri'

def text2vec(text)
  appid = 'YahooAPIのappid'
  uri	= 'http://jlp.yahooapis.jp/MAService/V1/parse'
  result = {}
  body = open("#{uri}?appid=#{appid}&results=uniq&sentence="+URI.encode("#{text}"))
  doc = REXML::Document.new(body).elements['ResultSet/uniq_result/word_list/']
  doc.elements.each('word') { |item|
    case item.elements['pos'].text
    when  '名詞', '動詞', '形容詞', '副詞'
      result[item.elements['surface'].text] = item.elements['count'].text.to_i
    end
  }
  result
end

続きは後で。

トラックバック - http://d.hatena.ne.jp/hirisc/20100504

2009-11-21

Windows7の64bit版でCygwinの挙動が怪しい

| 21:54 | Windows7の64bit版でCygwinの挙動が怪しいを含むブックマーク

Windows7が悪いのか64bit版なのが悪いのかわからないけど、configure中に刺さったりファイルのパーミッションがいつの間にか000になったり不便すぎた。

こんなときこそ Windows7 Professional の売りであるところのXPモードだろう、と思って使ってみた。VirtualPCXPモードのイメージをマイクロソフトのサイトからダウンロードしてインスコして、Cygwin入れたらふつうに動いた。

不便な点としては、せっかくVirtualBox上に入れたUbuntu64が同時に動かないこと。VirtualPCは32ビットモードしかないみたいなのでVirtualPCに統一するわけにもいかないし…

AES128とAES256の復号ライブラリをCodeReposにコミットしたよ

| 23:52 | AES128とAES256の復号ライブラリをCodeReposにコミットしたよを含むブックマーク

いろいろテーブルルックアップを最適化した。C記述ではたぶんこれ以上は劇的に速くはならないと思う。テーブル引きとXORの単なる繰り返しになっちゃいました。

トラックバック - http://d.hatena.ne.jp/hirisc/20091121

2009-11-18 このエントリーを含むブックマーク

はてなパーカー欲しい!

バーガンディのSがほしいです。

トラックバック - http://d.hatena.ne.jp/hirisc/20091118