雑記


2004年8月12日(木)
KINO 0.7.3
・kino 0.7.3 とりあえず拾ってきて ./configureかけると
configure: error: Could not find xml2-config. Check that you have libxml2-devel installed

ftp://xmlsoft.org/ から tar.gz とりよせてコンパイルしようと思ったのですが、ちと疲れた...

・dvgrab は作者さまからお返事メールが来たので、多分次のバージョンでは直っているでしょう
もっと良い直し方をするそうです。:-)

2004年8月11日(水)
差分
一応 BUGレポートを英語で書いて作者に送っておきました。(無視されるかも)
--------------------------------------------
(1)
MediaClippingTime::MediaClippingTime( string time, float framerate ) :
        Time( 0L ),             // ADD
        m_framerate( framerate )

(2)
        if ( !remaining.empty() )
        {
                //cerr << "smil: this is an offset time value" << endl;
                offset = parseClockValue( time );
                timeType = SMIL_TIME_OFFSET;
                resolved = true;
                indefinite = false;     // ADD
        }
--------------------------------------------
・smilttime.cc の差分(未整理)
//////////////////////////////////////////////////////////////////////////////

Index: dvgrab/smiltime.cc
diff -c dvgrab/smiltime.cc:1.1 dvgrab/smiltime.cc:1.2
*** dvgrab/smiltime.cc:1.1  Sun Aug  1 23:32:22 2004
--- dvgrab/smiltime.cc  Wed Aug 11 21:19:34 2004
***************
*** 61,70 ****
--- 61,74 ----
  {
    Time( 0L );
    parseTimeValue( time );
+   // printf("%s:%d Time::Time( string time ) timeValue %d offset %d\n",__FILE__,__LINE__,timeValue,offset );
+   
  }
  
  void Time::parseTimeValue( string time )
  {
+   // printf("%s:%d Time::parseTimeValue() IN\n",__FILE__,__LINE__ );
+ 
    time = StringUtils::stripWhite( time );
  
    resolved = false;
***************
*** 99,104 ****
--- 103,111 ----
    }
    else
    {
+ 
+       // printf("%s:%d 時間文字列の展開\n",__FILE__,__LINE__ );
+ 
        std::ostringstream token;
        char c;
        string::size_type pos = 0;
***************
*** 159,164 ****
--- 166,172 ----
            }
        }
        string remaining = token.str();
+       // printf("%s:%d 時間文字列の展開結果 = |%s|\n",__FILE__,__LINE__ ,remaining.data() );
        //cerr << "smil: parsed remaining token '" << remaining << "'" << endl;
        if ( !remaining.empty() )
        {
***************
*** 166,171 ****
--- 174,181 ----
            offset = parseClockValue( time );
            timeType = SMIL_TIME_OFFSET;
            resolved = true;
+           // 追加 2004/08/08
+           indefinite = false;
        }
    }
  }
***************
*** 195,200 ****
--- 205,213 ----
    string milliseconds;
    string::size_type pos1, pos2;
  
+   // printf("%s:%d Time::parseClockValue() IN\n",__FILE__,__LINE__  );
+ 
+ 
    if ( ( pos1 = time.find( ':' ) ) != string::npos )
    {
        if ( ( pos2 = time.find( ':', pos1 + 1 ) ) != string::npos )
***************
*** 244,255 ****
--- 257,279 ----
    //  ", ms = " << (long) (atof(milliseconds.c_str()) * 1000) << endl;
    total += ( atol( hours.c_str() ) * 3600 + atol( minutes.c_str() ) * 60 +
               atol( seconds.c_str() ) ) * 1000 + ( long ) ( atof( milliseconds.c_str() ) * 1000 );
+ 
+ #if 0
+ printf("hours           = |%s|\n",hours.data());
+ printf("minutes         = |%s|\n",minutes.data());
+ printf("seconds         = |%s|\n",seconds.data());
+ printf("milliseconds    = |%s|\n",milliseconds.data());
+ 
+ printf("%s:%d Time::parseClockValue() 結果 = %ld\n",__FILE__,__LINE__,total );
+ #endif
+ 
    return total;
  }
  
  
  long Time::getResolvedOffset()
  {
+   // printf("%s:%d timeValue = %d offset = %d\n",__FILE__,__LINE__,timeValue,offset );
    return ( resolved ? ( timeValue + offset ) : 0 );
  }
  
***************
*** 294,304 ****
--- 318,331 ----
  
  string Time::toString( TimeFormat format )
  {
+ 
+   // printf("%s:%d Time::toString() IN\n",__FILE__,__LINE__ );
    long ms = getResolvedOffset();
    ostringstream str;
    
    if ( indefinite )
    {
+       // printf("%s:%d Time::toString() indefinite !!\n",__FILE__,__LINE__ );
        str << "indefinite";
    }
    else if ( !resolved )
***************
*** 364,372 ****
--- 391,404 ----
  }
  
  MediaClippingTime::MediaClippingTime( string time, float framerate ) :
+   Time( 0L ),         // add 2004/08/10
    m_framerate( framerate )
  {
+ 
+   // printf("%s:%d MediaClippingTime::MediaClippingTime framerate = %f time = %s\n",
+   //      __FILE__,__LINE__,framerate,time.data() );
    parseValue( time );
+   // printf("%s:%d 文字列に変換 = |%s|\n",__FILE__,__LINE__,(toString( ).data()) );
  }
  
  
***************
*** 391,396 ****
--- 423,429 ----
        parseTimeValue( time.substr( time.find( '=' ) + 1 ) );
    } else
    {
+       // printf("%s:%d MediaClippingTime::parseValue() 呼び出し\n",__FILE__,__LINE__ );
        parseTimeValue( time );
    }
  }
***************
*** 478,492 ****
  
  string MediaClippingTime::toString( TimeFormat format )
  {
    if ( format == TIME_FORMAT_SMPTE )
    {
!       if ( indefinite )
            return "indefinite";
!       else if ( !resolved )
            return "unresolved";
!       else
        {
            long ms = getResolvedOffset();
            int hh = ( ms / 3600000 );
            ms -= hh * 3600000;
            int mm = ( ms / 60000 );
--- 511,534 ----
  
  string MediaClippingTime::toString( TimeFormat format )
  {
+ 
+   // printf("%s:%d MediaClippingTime::toString() IN = %d\n",__FILE__,__LINE__,format );
+ 
    if ( format == TIME_FORMAT_SMPTE )
    {
!       if ( indefinite ){
! 
!           // printf("%s:%d MediaClippingTime::toString() indefinite\n",__FILE__,__LINE__ );
! 
            return "indefinite";
!       }else if ( !resolved ){
            return "unresolved";
!       }else
        {
+ 
+           // printf("%s:%d MediaClippingTime::toString() 計算部\n",__FILE__,__LINE__ );
            long ms = getResolvedOffset();
+           // printf("%s:%d MediaClippingTime::toString() ms = %ld\n",__FILE__,__LINE__,ms );
            int hh = ( ms / 3600000 );
            ms -= hh * 3600000;
            int mm = ( ms / 60000 );
***************
*** 510,515 ****
--- 552,558 ----
    }
    else
    {
+       //printf("MediaClippingTime::toString() Time::toString() Call\n" );
        return Time::toString( format );
    }
  }
//////////////////////////////////////////////////////////////////////////////

2004年8月10日(火)
ビンゴだね
・ dvgrab

ソース印刷してじっくり眺めてみたけど、やはりスーパークラスの初期化し忘れでした
という事で1行初期化を追加すると、正常にクリップが行われるようになりました。
MediaClippingTime::MediaClippingTime( string time, float framerate ) :
	Time( 0L ), 		// add 2004/08/10   
	m_framerate( framerate )
{
printf("%s:%d MediaClippingTime::MediaClippingTime framerate = %f time = %s\n",
	__FILE__,__LINE__,framerate,time.data() );
	parseValue( time );
}
あちこちにデバッグ文をばらまいたので整理してから、差分を作成します。

● 今の所の宿題
(1) 画質の向上と圧縮(フレームレートを落とすでも良い)
(2) 出来ればコーミングの対策も

2004年8月9日(月)
ちょっち酒飲んでサボり中

● 相変わらず smilttime.cc と格闘中

日付オフセット計算に失敗しているのかな?
miltime.cc:514 MediaClippingTime::toString() IN = 2
smiltime.cc:528 MediaClippingTime::toString() 計算部
smiltime.cc:532 MediaClippingTime::toString() ms = 1076103096 ← このあたりが既に
smiltime.cc:399 文字列に変換 = |298:55:03;02|
"aaa002.avi": 24.84 MB 206 frames timecode 00:33:14.28 date 2065.25.45 45:85:85


long Time::getResolvedOffset() にデバッグ文を入れると、
smiltime.cc:272 timeValue = 1076073096 offset = 30000
smiltime.cc:272 timeValue = 1076073096 offset = 30000
smiltime.cc:272 timeValue = 1076073096 offset = 30000
smiltime.cc:272 timeValue = 1076073096 offset = 30000
smiltime.cc:272 timeValue = 1076073096 offset = 30000
既に怪しい。

{
printf("%s:%d timeValue = %d offset = %d\n",__FILE__,__LINE__,timeValue,offset );

return ( resolved ? ( timeValue + offset ) : 0 );
}

そもそも現行のソースで timeValue が初期化されるタイミングがあるのか?

2004年8月8日(日)
● dvgrab

引数の調査
$ ./dvgrab --format dv2 --duration 00:00:30 aaa
dvgrab.cc:179
dvgrab.cc:372 キャプチャ時間 = |00:00:30|
Capture Started
dvgrab.cc:635 m_timeDuration = (nil)
"aaa003.avi": 31.35 MB 260 frames timecode 10:03:40.02 date 2065.25.45 45:85:85
Capture Stopped
$
日付データはきちんと渡っているなぁ

・ ここも問題無し
smiltime.cc:371 MediaClippingTime::MediaClippingTime framerate = 29.970030 time = 00:00:30

・ ここいらへんかな
smiltime.cc:371 MediaClippingTime::MediaClippingTime framerate = 29.970030 time = 00:00:30
smiltime.cc:376 文字列に変換 = |indefinite|

・ 調査してみると indefinite が false になるタイミングが無いなぁ
smiltime.cc:261 Time::parseClockValue() 結果 = 30000
smiltime.cc:510 MediaClippingTime::toString() IN = 2
smiltime.cc:516 MediaClippingTime::toString() indefinite
smiltime.cc:396 文字列に変換 = |indefinite|
"aaa003.avi": 10.73 MB 89 frames timecode 13:37:12.03 date 2065.25.45 45:85:85


2004年8月7日(土)
もうちょっと調査
● trnscode による XviD の再調査

変換オプションの -z と -k を外して変換してみる。
transcode -i testcap002.avi -o testcap_notrev.avi --accel sse2 -V -y xvid4

変換前に対して約4%ぐらいになっているし、色もおかしくない。
19980328 Aug 6 11:31 testcap002.avi
830050 Aug 7 08:10 testcap_notrev.avi
これでフレームレート落としてサイズ縮小出来れば、ターゲット圏内かな。


● ffmpeg
仔細検討してみると、-dv1394 set DV1394 grab なんてオプションも存在するなぁ...という事で
ffmpeg-0.4.9-pre1.tar.gz をダウンロードしてみる。

$ ffmpeg -dv1394 -t 30 -s 320x240 -r 29.97 -b 2500 -ab 224 -ac 2 -f mpeg movie.mpg
ffmpeg version 0.4.9-pre1, build 4718, Copyright (c) 2000-2004 Fabrice Bellard
built on Aug 7 2004 11:15:50, gcc: 2.95.3 20010315 (release)
File 'movie.mpg' already exists. Overwrite ? [y/N] y
Failed to open DV interface: No such file or directory
Could not find video grab device
$
可愛くないなぁ

マニュアルを読もうとしたら、texi2html なんて聴いたこと無いソフトを要求してくるし、
仕方がないので、http://www.mathematik.uni-kl.de/~obachman/Texi2html/ から texi2html-1.64.tar.gz
をダウンロードしてインストールしてみた。

書いている内容は、http://ffmpeg.sourceforge.net/ffmpeg-doc.html これと変わらない。orz
0.4.8 でも動作が変わらないですね。(video4linux 経由用にカーネル作り直す必要があるかも)

※ 色々テストしてみたけどキャプチャ関係で動いているのは、dvgrab だけという事に(泣)


2004年8月6日(金)
● MAlib の続き

エラーの詳細を調査
$ find . -name "*.[ch]" -print | xargs grep dc1394_dma_setup_capture
./malib/dc1394/dc1394manager.c: status = dc1394_dma_setup_capture (manager->handle, /* IEEE139
4 board or chip */
$ find /usr/local/ -name "*.[ch]" -print | xargs grep dc1394_dma_setu
p_capture
/usr/local/include/libdc1394/dc1394_control.h: dc1394_dma_setup_capture
/usr/local/include/libdc1394/dc1394_control.h:dc1394_dma_setup_capture(raw1394handle_t handle, nod
eid_t node,
$

※ libdc1394 の引数の違いらしいですねという事で、Change log を見ると
>Fri July 28 00:26:00 2002 
>    * dc1394_capture.c: added drop_frames boolean to
>      dc1394_dma_setup_capture().
っていうのが入っていますので、0.8.3 以前のバージョンに合わせて作っているのでしょうかねぇ。
※ 詳細に見ていると、drop_frames が落ちているのではなく do_extra_buffering が落ちている
みたいですね
status = dc1394_dma_setup_capture (manager->handle, /* IEEE1394 board or chip */
               nodeid,                                  /* # of camera node */
               channel,                                 /* channel */
               dc1394->camera_image_format,             /* usually FORMAT_VGA_NONCOMPRESSED */
               dc1394->format0_mode,                    /* ex. MODE_320x240_YUV422 */
               speed,                                   /* iso tx speed */
               dc1394->framerate,
               4,                                       /* frames of DMA ring buffer */
               1,                                       /* Do extra buffering ::add 2004/08/06 */   
               0,                                       /* drop frames */
               dma_device_file,                         /* ex. /dev/video1394 */
               &(manager->camera_capture [manager->num_ready++]));
という事で、libdc1394 の サンプルを参考にしながら引数を追加。
後は make && make install でインストール可能。

※ 仔細を見てみると、DV の IEEE1394カメラの方ではなく生画像を送信してくる方のIEEE1394カメラのライブラリかな。
このあたりは研究が必要ですね。

という訳で、現状調査終了。(^^;;


2004年8月6日(金)
調査
現状の調査を行う。

■ストリーミング関係だと FFmpeg http://ffmpeg.sourceforge.net/ というのも有名らしい
但し、これはv4l 用で、目的としているDV(IEEE1394)でのキャプチャには対応していない。
今は保留。

■ CORIANDER http://www.tele.ucl.ac.be/PEOPLE/DOUXCHAMPS/ieee1394/coriander/
スペックを見ていると IEEE1394 でも動作するみたい、要テストかな。ということで
http://sourceforge.net/projects/coriander から colriander-1.0.0-pre3.tar.gz と
coliander-doc-0.1.0.pdf をダウンロードしてみる。

(1)./configure してみると
gnome-libs-devel を要求して来るので
ftp://ftp.ring.gr.jp/pub/linux/Vine/Vine-2.6/i386/Vine/RPMS/ から
gnome-libs-1.4.2-0vl1.1.i386.rpm
gnome-libs-devel-1.4.2-0vl1.1.i386.rpm
をダウンロードして rpm -ivh でインストールする。
※ 更にパッケージを要求される場合がある。手持ち環境では、
ORBit-devel-0.5.17-0vl1.i386.rpm
esound-devel-0.2.29-0vl0.i386.rpm
などを要求してきた。

(2)もう一度 ./configure してみると今度は libdc1394 の 0.9.3 以上を要求してくる
http://sourceforge.net/projects/libdc1394 から libdc1394-0.9.5.tar.gz をダウンロード
して ./configure して make & make install で世話無しで libdc1394 はインストールされた。

(3)再度 ./configure すると一応完走したが、
ftplib is required for FTP support.
**************************************************************************
** Source tarball available at: http://nbpfaus.net/~pfau/ftplib/ **
** FTP SERVICE DISABLED **
**************************************************************************
とのメッセージが出る。FTP が出来るに越した事は無いので http://nbpfaus.net/~pfau/ftplib/
から ftplib-3.1-src.tar.gz と ftplib-3.1-1.patch を取って来て、patch -p0 < ftplib-3.1-1.patch
でパッチをあててから、linux ディレクトリで make && make install

(4) config.cache ファイルを削除してから、 ./configure を実行(消さないとftplibが存在しない事になってしまう)
今度は素直に configure が終了するので make && make install で終了

※ が、このキャプチャユニットには対応していないもよう(ダイアログが出て終了してしまう) orz
という事で、対応しているDVカメラが手に入るまで大切にしまっておこう。
http://www.tele.ucl.ac.be/PEOPLE/DOUXCHAMPS/ieee1394/cameras/

P.S
dvgrab の方は作動するのでハード障害では無いと思う。

■ MAlib
http://www.malib.net/index_j.html 最初は OpwnCV でごりごり書くつもりだったのだが、
比較的目的に合っているのかなという事で...調査してみる。
libmalib-0.5.8.tar.gzをダウンロードして、configure & make

dc1394manager.c: In function `malib_dc1394manager_dma_setup_capture':
dc1394manager.c:129: warning: passing arg 10 of `dc1394_dma_setup_capture' makes integer from poin
ter without a cast
dc1394manager.c:129: warning: passing arg 11 of `dc1394_dma_setup_capture' from incompatible point
er type
dc1394manager.c:129: too few arguments to function `dc1394_dma_setup_capture'
make[3]: *** [dc1394manager.lo] エラー 1
make[3]: 出ます ディレクトリ `/home/oda/linuxdv/libmalib-0.5.8/malib/dc1394'

先が長そうですね。





2004年8月5日(木)
宿題の消化
・Linuxでエンコードした DivX をWindows で表示出来ないのはとっても悲しいので
Windows 用 のCODEC を http://www.divx.com/divx/download/index.php から
DIVX52XP2K.EXE をダウンロードしてインストール。
※ google バーとかプレーヤーは無しでインストールする。

色が少し変。orz


2004年8月4日(水)
Mplayer
作成環境作ったら表示環境もいるよね〜って事でMplayerに挑戦
・ Mplayer本体のインストール
http://www.mplayerhq.hu/homepage/design7/news.html から
Mplayer-1.0pre5.tar.bz2 をダウンロードして、
bunzip2 MPlayer-1.0pre5.tar.bz2 で解凍

configure --langage all としても別に jp が出てくる訳ではないので オプション無しで起動
./configure && make && make install でインストール終了

X-Window で mplayer xxx.avi で キャプチャした動画が見える。(XviD エンコードされたものもOK)

・ Mplayer のフォントを追加
http://www.mplayerhq.hu/homepage/design7/dload.html から font-arial-iso-8859-1.tar.bz2
をダウンロードして bunzip2 で展開。
展開されたディレクトリの中でフォントをコピー
cp font-arial-18-iso-8859-1/* /usr/local/share/mplayer/font/

※ フォントに関してはこれで正しいかどうかはチェックしていない。(おい)

● 今の所の宿題
(1) dvgrab の --duration が怪しいのをデバッグ
(2) 画質の向上と圧縮(フレームレートを落とすでも良い)
(3) 出来ればコーミングの対策も

2004年8月3日(火)
cvs pserver
・Solaris9 の CVS を pserver モードで起動する。

(1) /etc/services に 以下の2行を追加する。
cvspserver 2401/tcp # CVS client/server operations
cvspserver 2401/udp # CVS client/server operations

(2) cvs co CVSROOT で cvsの設定ファイルを取得する。
bash-2.05$ cvs co CVSROOT
cvs checkout: Updating CVSROOT
U CVSROOT/checkoutlist
U CVSROOT/commitinfo
U CVSROOT/config
U CVSROOT/cvswrappers
U CVSROOT/editinfo
U CVSROOT/loginfo
U CVSROOT/modules
U CVSROOT/notify
U CVSROOT/rcsinfo
U CVSROOT/taginfo
U CVSROOT/verifymsg
bash-2.05$

(2) /usr/apache/bin/htpasswd で パスワードファイルを作成する
$/usr/apache/bin/htpasswd -c passwd cvssol9

※ cvssol9 が作成するCVSユーザー名
※ -c をつけるのは最初にファイルを作成する時だけ

(3) 作成したpasswd ファイルに UNIX のユーザー名を付け加える
cvssol9:w2q0OiYqvWsng:cvs
※ :cvs が追加した部分

(4) cvs release CVSROOT で CVSROOT を解放する
You have [0] altered files in this repository.
Are you sure you want to release (and delete) directory `CVSROOT': y

(5) /etc/inetd.conf を修正し cvs がサーバーとして起動されるようにする。
#
# cvsserver(2004/08/03)
#
cvspserver stream tcp nowait root /opt/sfw/bin/cvs -f --allow-root=/extra/CVSROOT pserver

修正したら inetd に HUP シグナルを送る
# ps -ef | grep inetd
root 170 1 0 21:39:02 ? 0:00 /usr/sbin/inetd -s
# kill -HUP 170

(6) localhost に対してtelnetで接続実験を行う

$ telnet localhost cvspserver
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
bash-2.05$ telnet localhost cvspserver
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

-f [pserver aborted]: bad auth protocol start:

Connection to localhost closed by foreign host.
$
で接続成功

(7) サーバーの設定を変更する
Linux と Soalris のパスワード同期がどうしてもうまくいかない。まぁLAN内で使用するものなので
当面システムパスワードを利用する事にする。
cvs co CVSROOT で 設定ファイルを取り寄せて config のコメントになっている SystemAuth=yes を有効にする。
※ サーバー内のユーザー認証を使用する。

(8)クライアント側の設定
~/.bashrc に定義してあるCVS 関連の定義をこの1行にする。
export CVSROOT=:pserver:username@hostname:/extra/CVSROOT

cvs login で ログインを行う。(上記username に対応するパスワードを要求して来る)

(9)クライアント側から編集
cvs co dvgrab でソースの取り寄せと cvs commit が作動する事を確認。

※ editor モード (CVSEDITOR )は何故か動作しないので commit 時は必ず -m をつける必要あり.

とりあえず、不満足な部分もあるけど今日の所はこれぐらいで勘弁してもらって作業再開かな

2004年8月2日(月)
コーミング
・コーミングの実例
DVは奇数ラインと偶数ラインを同一のフレームに収めるので、動きの速いものを
撮影してそのままエンコードするとエッジが櫛状になってしまう。
これをコーミングと呼びます。(インターレースで撮影していると現象が出る)

コーミング

・CVS管理をSUNに移管する。
ソース管理は、信頼性の高い(笑)..Solaris で一元管理をしたいので設定を行う

~/.bashrc に 以下の行を追加
# CVS関連
export CVS_RSH=ssh
export CVS_SERVER=/opt/sfw/bin/cvs
export CVSROOT=:ext:username@hostname:/extra/CVSROOT

~/.cvsrc を以下の内容で作成
update -d -P
release -d

※ で、運用しようとしたら...commit が出来ないでやんの orz
pserver に変更してみましょう。


2004年8月1日(日)
キャプチャ実験
・キャプチャユニットの接続確認
キャプチャユニットの詳細は /proc/bus/ieee1394/devices に書き込まれているので、
内容を確認してみる。GUID は後でボードを指定する時に重要。

$ cat /proc/bus/ieee1394/devices
Node[0-00:1023] GUID[00a0b00a00004a6a]: ← これが I/Fカード
Vendor ID: `Linux OHCI-1394' [0x004063]
Capabilities: 0x0083c0
Bus Options:
IRMC(1) CMC(1) ISC(1) BMC(0) PMC(0) GEN(0)
LSPD(2) MAX_REC(2048) CYC_CLK_ACC(0)
Host Node Status:
Host Driver : ohci1394
Nodes connected : 2
Nodes active : 2
SelfIDs received: 2
Irm ID : [0-01:1023]
BusMgr ID : [0-63:1023]
In Bus Reset : no
Root : no
Cycle Master : no
IRM : no
Bus Manager : no
Node[0-01:1023] GUID[00a0b0210000104c]: ← これが キャプチャユニット
Vendor ID: `I-O DATA' [0x00a0b0]
Capabilities: 0x0083c0
Bus Options:
IRMC(1) CMC(1) ISC(1) BMC(0) PMC(0) GEN(1)
LSPD(2) MAX_REC(512) CYC_CLK_ACC(100)
Unit Directory 0:
Vendor/Model ID: I-O DATA [00a0b0] / GV-MVP/IDV [002100]
Software Specifier ID: 00a02d
Software Version: 010001
Driver: raw1394 Driver
Length (in quads): 0
$

・ まずキャプチャしてみる。
30秒のつもりで、--duration を指定しているが効いていないみたいなので CTRL+C で
止める

$ dvgrab --format dv2 --duration 00:00:30 testcap
Capture Started
"testcap001.avi": 416.31 MB 3453 frames timecode 00:11:12.03 date 2065.25.45 45:85:85
Capture Stopped

$
-rw-r--r-- 1 xxx xxx 436647576 Aug 1 21:23 testcap001.avi
でかい(^^;;

・ キャプチャした内容をWindows メディアプレーヤーで表示してみる。
まぁ画質はともかく、特に問題なく表示できる。

・ transcode で情報を表示してみる。
$ transcode -i testcap001.avi
transcode v0.6.12 (C) 2001-2003 Thomas Oestreich, 2003-2004 T. Bitterberg
[transcode] (probe) suggested AV correction -D 0 (0 ms) | AV 0 ms | 0 ms
[transcode] auto-probing source testcap001.avi (ok)
[transcode] V: import format | Digital Video RIFF data, AVI (V=dv|A=avi)
[transcode] V: import frame | 720x480 1.50:1
[transcode] V: bits/pixel | 0.174
[transcode] V: decoding fps,frc | 29.970,4
[transcode] A: import format | 0x1 PCM [48000,16,2] 1536 kbps
[transcode] A: export | disabled
[transcode] V: encoding fps,frc | 29.970,4
[transcode] A: bytes per frame | 6408 (6406.400000)
[transcode] A: adjustment | -1600@1000
[transcode] V: IA32 accel mode | sse2 (sse2 sse mmxext mmx asm)
[transcode] warning : no option -o found, encoded frames send to "/dev/null"
[transcode] V: video buffer | 10 @ 720x480
[import_avi.so] v0.4.2 (2002-05-24) (video) * | (audio) *
[import_dv.so] v0.3.1 (2003-10-14) (video) DV | (audio) PCM
[export_null.so] v0.1.2 (2001-08-17) (video) null | (audio) null
[import_avi.so] format=0x1, rate=48000 Hz, bits=16, channels=2, bitrate=1536
[import_dv.so] tcextract -x dv -i "testcap001.avi" -d 0 | tcdecode -x dv -y rgb -d 0 -Q 5
encoding frames [000000-002727], 27.96 fps, EMT: 0:01:30, ( 0| 0| 0)

・ transcode で xvid エンコードしてみる。
$ transcode -i testcap001.avi -z -k -o testcap_xvid.avi -V -y xvid4
transcode v0.6.12 (C) 2001-2003 Thomas Oestreich, 2003-2004 T. Bitterberg
[transcode] (probe) suggested AV correction -D 0 (0 ms) | AV 0 ms | 0 ms
[transcode] auto-probing source testcap001.avi (ok)
[transcode] V: import format | Digital Video RIFF data, AVI (V=dv|A=avi)
[transcode] V: import frame | 720x480 1.50:1
[transcode] V: flip frame | yes
[transcode] V: rgb2bgr | yes
[transcode] V: bits/pixel | 0.174
[transcode] V: decoding fps,frc | 29.970,4
[transcode] V: Y'CbCr | YV12/I420
[transcode] A: import format | 0x1 PCM [48000,16,2] 1536 kbps
[transcode] A: export format | 0x55 MPEG layer-3 [48000,16,2] 128 kbps
[transcode] V: encoding fps,frc | 29.970,4
[transcode] A: bytes per frame | 6408 (6406.400000)
[transcode] A: adjustment | -1600@1000
[transcode] V: IA32 accel mode | sse2 (sse2 sse mmxext mmx asm)
[transcode] V: video buffer | 10 @ 720x480
[import_avi.so] v0.4.2 (2002-05-24) (video) * | (audio) *
[import_dv.so] v0.3.1 (2003-10-14) (video) DV | (audio) PCM
[export_xvid4.so] v0.0.5 (2003-12-05) (video) XviD 1.0.x series (aka API 4.0) | (audio) MPEG/AC3/PCM
[import_avi.so] format=0x1, rate=48000 Hz, bits=16, channels=2, bitrate=1536
[import_dv.so] tcextract -x dv -i "testcap001.avi" -d 0 | tcdecode -x dv -y yv12 -d 0 -Q 5
[export_xvid4.so] No libxvidcore API4 found
[transcode] warning : (encoder.c) video export module error: init failed
[transcode] critical: failed to init encoder

orz
※ /sbin/ldconfig を実行してから再実行。
--accel sse して 3.0fps 弱ぐらいの変換速度ですね。
終了するとこんな感じ
......
[encoder.c] Delaying audio (0)], 5.64 fps, EMT: 0:00:00, ( 0| 0| 2)
encoding frames [000000-003452], 2.90 fps, EMT: 0:01:55, ( 0| 0| 0)
clean up | frame threads | unload modules | cancel signal | internal threads | done
[transcode] encoded 3453 frames (0 dropped, 0 cloned), clip length 115.22 s
$

・ で、xvid コーディングしたファイルを WindowsMedia Player で表示しようとしたら
デコーダーが存在しない旨エラーが発生。....(この時点で目的から外れている)

● 今の所の宿題
(1) dvgrab の --duration が怪しいのをデバッグ
(2) 画質の向上と圧縮(フレームレートを落とすでも良い)
(3) 出来ればコーミングの対策も
(4) ソース管理を linux から Solaris に移管



2004年8月1日(日)
エンコーダーの追加
・XVID エンコーダーのインストール
http://www.xvid.org/downloads.html から xvidcore-1.0.1,tar.gz をダウンロードする。
configure は 解凍したディレクトリではなく ./xvidcore-1.0.1/build/generic で行う

こんな警告が出るので、
../../src/bitstream/bitstream.c: In function `read_video_packet_header':
../../src/bitstream/bitstream.c:140: warning: `time_increment' might be used uninitialized in this
143行目に time_increment = 0;を追加しておきませう。

---------------------------------------------------------------
XviD has been successfully built.

* Binaries are currently located in the '=build' directory
* To install them on your system, you can run '# make install'
as root.
---------------------------------------------------------------

# make install
D: /usr/local/lib
I: /usr/local/lib/libxvidcore.so.4.0
I: /usr/local/lib/libxvidcore.a
D: /usr/local/include
I: /usr/local/include/xvid.h
#
となったら終了。

・ nasm をインストール
transcode が nasm を要求して来るので
ftp://ftp.ring.gr.jp/pub/linux/Vine/VinePlus/2.6/RPMS/i386/ から
nasm-0.98.35-0vl1.i386.rpm
nasm-doc-0.98.35-0vl1.i386.rpm
nasm-rdoff-0.98.35-0vl1.i386.rpm
の3つのファイルをダウンロードして
rpm -ivh nasm-0.98.35-0vl1.i386.rpm nasm-doc-0.98.35-0vl1.i386.rpm nasm-rdoff-0.98.35-0vl1.i386.rpm
でインストール終了

・ transcode をインストール(1回目)
http://zebra.fh-weingarten.de/~transcode/ から transcode-0.6.12.tar.gz をダウンロード
nasm をインストールしてから configure を実行し、makeするとこんなのが出るねぇ

------------------------------------------------------------------------------------------
decode_dv.c: In function `decode_dv':
decode_dv.c:184: `frame_size_625_50' undeclared (first use in this function)
decode_dv.c:184: (Each undeclared identifier is reported only once
decode_dv.c:184: for each function it appears in.)
decode_dv.c:216: `frame_size_525_60' undeclared (first use in this function)
decode_dv.c:256: warning: passing arg 5 of `dv_decode_full_frame' from incompatible pointer type
decode_dv.c:273: warning: passing arg 5 of `dv_decode_full_frame' from incompatible pointer type
decode_dv.c:298: warning: passing arg 5 of `dv_decode_full_frame' from incompatible pointer type
decode_dv.c:306: warning: passing arg 5 of `dv_decode_full_frame' from incompatible pointer type
decode_dv.c: In function `probe_dv':
decode_dv.c:413: `frame_size_625_50' undeclared (first use in this function)
decode_dv.c:420: `frame_size_525_60' undeclared (first use in this function)
------------------------------------------------------------------------------------------
transcode-0.6.11.tar.gz でも同じなもよう

・ mjpegtools をインストール
http://sourceforge.net/projects/mjpeg から mjpegtools-1.6.2.tar.gz をダウンロードして
make && make install

・ transcode をインストール(2回目)
変わらない。orz
本来何処で定義されているものかを調査したら、livdv の dv_types.h らしい。
http://www.mip.informatik.uni-kiel.de/~wwwadmin/Software/Doc/html/dv__types_8h.html
より、
const gint header_size = 80 * 52 [static]
Definition at line 149 of file dv_types.h.
const gint frame_size_525_60 = 10 * 150 * 80 [static]
Definition at line 150 of file dv_types.h.
const gint frame_size_625_50 = 12 * 150 * 80 [static]
Definition at line 151 of file dv_types.h.


http://www.mip.informatik.uni-kiel.de/~wwwadmin/Software/Doc/html/dv__types_8h-source.html
ここのソースと見比べてみると、
00149 static const gint header_size = 80 * 52; // upto first audio AAUX AS
00150 static const gint frame_size_525_60 = 10 * 150 * 80;
00151 static const gint frame_size_625_50 = 12 * 150 * 80;
の行が無くなっている。

で、とりあえず import/decode_dv.c にパッチをあてた。
$ diff decode_dv.c decode_dv.c.org
40,44c40,42
< // PATCH 2004/08/01
< #define DV_PAL_SIZE (12 * 150 * 80)
< #define DV_NTSC_SIZE (10 * 150 * 80)
< #define DV_HEADER_SIZE (80 * 52)
< //
---
> #define DV_PAL_SIZE frame_size_625_50
> #define DV_NTSC_SIZE frame_size_525_60
> #define DV_HEADER_SIZE header_size
$

後は make && make install で完走した。


2004年7月31日(土)その2
続き...
うっかり動体監視機能付きのCCDカメラの前でパンツいっちょでうろうろ
していたら、きっちりキャプチャされてWEBにUPLOADされていた。orz
もちろんすぐ消したが...

続いて、DVからのキャプチャ関係のインストールって事で...

・ pkgconfig のインストール
libdv の configure が GTK+2 の pkgconfig を要求してくるので、http://www.freedesktop.org/Software/pkgconfig
からpkgconfig-0.15.0.tar.gzを取得する

prefix 付きで configure してmake && make install
./configure --prefix=/usr/local


・ livdvのインストール
http://sourceforge.net/projects/libdv/ からダウンロード出来る
※ インストールしたのは最新の 0.103 だが...問題ありかも
そのままだと 以下のようなエラーが出るので、必ず pkgconfig をインストールする事。
それ以外は make & make install で素直にインストール出来る。
------------------------------------------------
checking for pkg-config... no
*** The pkg-config script could not be found. Make sure it is
*** in your path, or set the PKG_CONFIG environment variable
*** to the full path to pkg-config.
*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config.
configure: error: Library requirements (glib >= 1.2.4 gtk+ >= 1.2.4) not met; consider adjusting t
he PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-confi
g can find them.
------------------------------------------------

・ dvgrab のインストール
キャプチャユニット本体。
http://kino.schirmacher.de/ から dvgrab-1.6.tar.gz をダウンロードしてくる。

configure して make するとこんなエラーが出る

------------------------------------------------
smiltime.cc: In method `class string SMIL::Time::toString(SMIL::Time::TimeFormat = TIME_FORMAT_CLO
CK)':
smiltime.cc:333: implicit declaration of function `int SMIL::round(...)'
smiltime.cc: In function `class string SMIL::framesToSmpte(int, int)':
smiltime.cc:570: implicit declaration of function `int SMIL::snprintf(...)'
make[1]: *** [smiltime.o] エラー 1
------------------------------------------------

で smiltime.cc に適当にパッチをあてる。(1.5ではもっと色々なエラーが出る)
# diff smiltime.cc smiltime.cc.org
31d30
< #include <stdio.h>
334c333
<                               (int)( ( float )( ms % 60000 ) / 6 ) << "min";
---
>                               round( ( float )( ms % 60000 ) / 6 ) << "min";
340c339
<                               (int)( ( float )( ms % 3600000 ) / 36 ) << "h";
---
>                               round( ( float )( ms % 3600000 ) / 36 ) << "h";
502c501
<                               (int)( m_framerate * ms / 1000.0 );
---
>                               round( m_framerate * ms / 1000.0 );
#
後はコンパイル出来るので make install 。

・ ダイナミックリンクのライブラリパスを修正
そのまま、キャプチャしようとすると以下のようなエラーが出る。
$ dvgrab --format dv2 --duration 00:00:30 aaa
dvgrab: error while loading shared libraries: libdv.so.4: cannot open shared object file: No such file or directory
ので、/etc/ld.so.conf に /usr/local/lib を追加して /sbin/ldconfig を実行する。

・ お試しでキャプチャ
dvgrab --format jpg aaa で Jpeg でキャプチャしてみる。(こっちはOK)
パッチが適当過ぎたみたいで --duration 00:00:30 が効いていない orz

● 残作業
(1) キャプチャしたAVIの圧縮工程
(2) dvgrab の --duration が怪しいのをデバッグ

2004年7月31日(土)
迷った時には
「困った時にはMATROXを使え」の格言通りに、朝から秋葉行って
Millennium G450 LowProfile を買って来て取り付けました。

流石 MATROX Millenium、X の認識も設定も一発で決まって画面が乱れたり動作がおかしくなったり
しませんね。これぞPnP(^^;;

# lspci
00:00.0 Host bridge: Intel Corp. 82845 845 (Brookdale) Chipset Host Bridge (rev 03)
00:01.0 PCI bridge: Intel Corp. 82845 845 (Brookdale) Chipset AGP Bridge (rev 03)
00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB/EB PCI Bridge (rev 12)
00:1f.0 ISA bridge: Intel Corp. 82801BA ISA Bridge (LPC) (rev 12)
00:1f.1 IDE interface: Intel Corp. 82801BA IDE U100 (rev 12)
00:1f.2 USB Controller: Intel Corp. 82801BA/BAM USB (Hub  (rev 12)
00:1f.3 SMBus: Intel Corp. 82801BA/BAM SMBus (rev 12)
00:1f.4 USB Controller: Intel Corp. 82801BA/BAM USB (Hub  (rev 12)
00:1f.5 Multimedia audio controller: Intel Corp. 82801BA/BAM AC'97 Audio (rev 12)
01:00.0 VGA compatible controller: Matrox Graphics, Inc. MGA G400 AGP (rev 85)       ← これ
02:07.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller (rev 46)
02:0c.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 78)
#


・ libraw1394をインストール
IEEE1394 デバイスを生で扱うためのライブラリ、libraw1394 をインストールします。
http://www.linux1394.org/download.php から libraw1394-0.10.1.tar.gz をダウンロードして以下の手順で作成。

tar xvzf libraw1394-0.10.1.tar.gz
cd ./libraw1394-0.10.1
./configure
root になって(su)
make && make install
make dev
chmod 666 /dev/raw1394
ls -l /dev/raw1394 で
crw-rw-rw- 1 root root 171, 0 Jul 31 17:04 /dev/raw1394
と見えたらこれは終わり。

・ 動作確認
modprobe raw1394 で rawデバイスを読み込みしてから、testlibraw を実行すると
正常に動作しているか判る。

# ./testlibraw
successfully got handle
current generation number: 1
1 card(s) found										     ← これ
  nodes on bus:  2, card name: ohci1394
using first card found: 2 nodes on bus, local ID is 0, IRM is 1

doing transactions with custom tag handler
trying to send read request to node 0... completed with value 0x7ba57c4b
trying to send read request to node 1... completed with value 0xa5a87c4b

using standard tag handler and synchronous calls
trying to read from node 0... completed with value 0xd7b17c4b
trying to read from node 1... completed with value 0x70b47c4b

testing FCP monitoring on local node
got fcp command from node 0 of 8 bytes: 01 23 45 67 89 ab cd ef			     ← これ
got fcp response from node 0 of 8 bytes: 01 23 45 67 89 ab cd ef
testing config rom stuff
get_config_rom returned 0, romsize 64, rom_version 0
here are the first 10 quadlets:
0. quadlet: 0xb1830404
1. quadlet: 0x34393331
2. quadlet: 0x02a200e0
3. quadlet: 0x0ab0a000
4. quadlet: 0x6a4a0000
5. quadlet: 0x80840300
6. quadlet: 0x63400003
7. quadlet: 0x02000081
8. quadlet: 0xc083000c
9. quadlet: 0xab030600
update_config_rom returned 0

polling for leftover messages

#


・ 毎回 modprobe raw1394 とするのも面倒臭いので、/etc/rc.d/rc.local の最後のコマンドの直前
に書いて自動起動するようにする。

### raw1394ドライバーのインストール
/sbin/modprobe raw1394                                 ← この行

touch /var/lock/subsys/local
(1)再起動し、dmesg の最後に以下のメッセージが出ているか?
raw1394: /dev/raw1394 device initialized
(2) lsmod で raw1394 が生えていればOK
# lsmod
Module                  Size  Used by    Tainted: P
raw1394                18892   0  (unused)			 ← これ
autofs                 10916   1  (autoclean)
3c59x                  27656   1
dv1394                 17120   0  (unused)
ohci1394               25312   0  [dv1394]
ieee1394              196448   0  [raw1394 dv1394 ohci1394]
usb-uhci               24068   0  (unused)
hid                    22528   0  (unused)
md                     60672   0  (unused)
encode-eucjp          242944   0  (unused)
i810_audio             24832   0
ac97_codec             14592   0  [i810_audio]
soundcore               5508   2  [i810_audio]
rtc                     7196   0  (autoclean)


・ libavc1394をインストール
http://sourceforge.net/projects/libavc1394/ から libavc1394-0.4.1.tar.gz をdownload する.
libraw1394 の時と同じく 一般ユーザーで configure して root で make && make install で終了。
※ この時 libraw1394の存在確認をするので、順番が逆だと多分インストール出来ない筈。


2004年7月30日(金)
カーネルアップデート
とりあえず、2.4カーネルのアップグレードはは出来てBOOT もできるように
なったのだが...
Xfree86 の方は相変わらず動作がおかしい...setupでXconfigurater を呼び出しても
DAC が呼び出せないみたい。orz

標準搭載の RAGE128 PRO を捨ててみようかしらん

PCIバスの認識状態(IEEE1394)はとりあえずOKのもよう
$ /sbin/lspci
00:00.0 Host bridge: Intel Corp. 82845 845 (Brookdale) Chipset Host Bridge (rev 03)
00:01.0 PCI bridge: Intel Corp. 82845 845 (Brookdale) Chipset AGP Bridge (rev 03)
00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB/EB PCI Bridge (rev 12)
00:1f.0 ISA bridge: Intel Corp. 82801BA ISA Bridge (LPC) (rev 12)
00:1f.1 IDE interface: Intel Corp. 82801BA IDE U100 (rev 12)
00:1f.2 USB Controller: Intel Corp. 82801BA/BAM USB (Hub  (rev 12)
00:1f.3 SMBus: Intel Corp. 82801BA/BAM SMBus (rev 12)
00:1f.4 USB Controller: Intel Corp. 82801BA/BAM USB (Hub  (rev 12)
00:1f.5 Multimedia audio controller: Intel Corp. 82801BA/BAM AC'97 Audio (rev 12)
01:00.0 VGA compatible controller: ATI Technologies Inc Rage 128 Pro Ultra TF
02:07.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller (rev 46)
02:0c.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 78)

キャプチャリングユニット(I/OデータのGV-MVP/IDV)を繋いでモジュールの読み込み状態を確認する
#/sbin/lsmod
Module                  Size  Used by    Tainted: P
autofs                 10916   1  (autoclean)
3c59x                  27656   1
dv1394                 17120   0  (unused)
ohci1394               25312   0  [dv1394]
ieee1394              196448   0  [dv1394 ohci1394]
usb-uhci               24068   0  (unused)
hid                    22528   0  (unused)
md                     60672   0  (unused)
encode-eucjp          242944   0  (unused)
i810_audio             24832   0
ac97_codec             14592   0  [i810_audio]
soundcore               5508   2  [i810_audio]
rtc                     7196   0  (autoclean)

2004年7月29日(木)
「LinuxでDVを」計画
ドメスティックバイオレンスじゃないよ(笑)

とりあえず必要なものは揃えたので、早速OSのインストールから始めたのだが..
※ ハードは Dell の GX240です
いきなり インストーラが SMPカーネルをぶち込んだらしく 2.4 カーネルが起動しない
2.4.22 カーネルに入れ替えてとりあえず起動するようにはなったけど
Rage128 な Xも終了できないし...いきなり挫けそうな予感 orz

果たして赤外線CCDカメラの寿命が尽きるまでに完成できるのか...

P.S
今は 2.4.22 のソースのダウンロードをしています。