aravisを使ってみる (その3) 

# はじめに

前回はaravisで使用するコマンド,エラー対策等を紹介しました。

https://qiita.com/hoshianaaa/items/26247d84f6b5cd87160e

今回からプログラムを解析していきます。

まず,aravisののプログラム構成は大まかに以下に分類できると思われます。

```
1.src: 本体プログラムとテストツール,設定ツール,フェイクカメラプログラム
2.viewer: viewerのプログラム
3.gst: gstremerとつなぐためのプログラム
4.tests: 単体テストプログラム
```

今回は一番取っ掛かりやすそうな`4.test`のプログラムを解析していきます.

# 解析

## ビルド設定ファイル

まず,今回の対象となるプログラムの場所ですが以下のディレクトリ内にあります。

- ソースコートディレクトリ: `aravis-0.8.19/tests`
- コンパイル済みバイナリディレクトリ: `aravis-0.8.19/build/tests`

そして,aravisではmesonというビルドシステムを採用しており

その設定ファイルは以下のようになっています。

これを見ることで,以下一部抜き出したコードとなりますが,生成バイナリー名とソースコードの対応が取れると思われます。

```python:aravis-0.8.19/tests/meson.build
...

	examples = [
		['arv-network-test',		'arvnetworktest.c'],
		['arv-device-test',		'arvdevicetest.c'],
		['arv-genicam-test',		'arvgenicamtest.c'],
		['arv-evaluator-test',		'arvevaluatortest.c'],
		['arv-zip-test',		'arvziptest.c'],
		['arv-chunk-parser-test',	'arvchunkparsertest.c'],
		['arv-heartbeat-test',		'arvheartbeattest.c'],
		['arv-acquisition-test',	'arvacquisitiontest.c'],
		['arv-example',			'arvexample.c'],
		['arv-auto-packet-size-test',	'arvautopacketsizetest.c'],
		['arv-device-scan-test',	'arvdevicescantest.c'],
		['arv-roi-test',		'arvroitest.c'],
		['time-test',			'timetest.c'],
		['load-http-test',		'loadhttptest.c'],
		['cpp-test',			'cpp.cc']
	]

...
```

この設定ファイルの上にあるものから順番に見ていきましょう。

## 1.arvnetworktest.c 
- 実行ファイル

```
./aravis-0.8.19/build/tests/arv-network-test 
```

- 実行してみる

まず,genIcamを接続しないで実行してみました。
その結果は以下のようになり,ローカルループバックとwifiのネットワーク情報が取得できました。

```bash:単体実行
$ ./arv-network-test
proto          address             mask        broadcast  interface
 IPv4        127.0.0.1        255.0.0.0        127.0.0.1  lo
 IPv4     10.0.169.212      255.254.0.0     10.1.255.255  wlp0s20f3
```

次にfakecameraを実行してから実行してみましたが,特に変化無しでした。genIcamに対してなにかするものではないようです.



interfafeの情報を取得する関数は,`16行目`の`ifaces = arv_enumerate_network_interfaces ()`のようです。そしてこの関数は`src/arvnetwork.c`の`106行目`に定義されています。
この関数内部は,cでインタフェース情報を取得する内容となっていて以下の記事など参考になりそうです。

https://qiita.com/cielavenir/items/603680454cbec202bdf2

## 2.arvdevicetest.c

- 実行バイナリ

```
./aravis-0.8.19/build/tests/arv-device-test
```

- 実行してみる

単体実行した時の結果です

```
Looking for the first available camera
No device found
```

次にフェイクカメラ実行後に実行した結果です

```
Looking for the first available camera
vendor        = Aravis
model         = Fake
device id     = GV01
sensor width  = 2048
sensor height = 2048
image width   = 512 (max:2048)
image height  = 512 (max:2048)
horizontal binning  = 1 (min:1 - max:16)
vertical binning    = 1 (min:1 - max:16)
exposure            = 10000 (min:10 - max:1e+07)
gain                = 0 (min:0 - max:10)
gain auto mode      = Off
trigger selector    = FrameStart
payload size  = 262144 (0x40000)
stream port = 60676 (60676)
Frame rate = 0 Hz
Frame rate = 0 Hz
Frame rate = 0 Hz
```

デバイスの情報を取得することができました。
が,フレームの取得には失敗したようです。

## 3.arvgenicamtest.c

このプログラムは引数にxml形式のファイル名を入れるようなので以下のようにfakeカメラのxmlを入れてみましたが,

```
./arv-genicam-test ../../src/arv-fake-camera.xml
```

loadingと言われただけで,プログラム内部で`55行目`の`arv_gc_get_node`に失敗したようで,今の所,デバイス情報の表示はされませんでした。使い方が不明です。

```
Loading '../../src/arv-fake-camera.xml'.
```

## 4.arvevaluatortest.c

これも使い方不明.引数に何らかを与えて使うのかな?

```
$ ./arv-evaluator-test 
Missing expression.
```

## 5.arvziptest.c

これもzipファイルを引数に入れるみたいだが,どういったzipを入れて使うのかよくわからない.

## 6.arvchunkparsertest.c

フェイクカメラがある場合は以下のように値を出力したけど何をしているかよくわからない.

```
$ ./arv-chunk-parser-test 
ChunkWidth = 0
ChunkHeight = 0
```

## 7.arvheartbeattest.c

fakeカメラを起動しておいて実行すると動作した.
最終的に以下のような値を出力,内部プログラムを見ると最後にstream情報の統計を取得しておりその結果が出力されるみたい.

```
Completed buffers = 985
Failures          = 1
Underruns         = 0
```

## 8.arvacquisitiontest.c

これもフェイクカメラ実行してテスト.

一つのイメージのbufferだけ取得するプログラム,特にファイルにそれを出力してくれるわけではないけど自分で変換すればできそう.

成功すると以下のように出力される.

```
Image successfully acquired
```

## 9.arvexample.c

これは映像取得のプログラムを作る際に結構参考になりそう.

これもフェイクカメラ実行してテスト.
以下のようにカメラのフレームレートを1秒毎に表示してくれる.
`104行目`のg_timeout_add_seconds`でタイマー割り込み関数を設定している.
streamに映像が来たときの割り込み関数も設定しており,それは`95行目`の`g_signal_connect`この２つの関数はbuffer数を共有している.GMainLoopという型の変数も共有しているがこれの意味は不明.

```
$ ./arv-example 
Frame rate = 12 Hz
Frame rate = 10 Hz
Frame rate = 10 Hz
Frame rate = 10 Hz
Frame rate = 10 Hz
```

## 10.arvautopacketsizetest.c

aravisには自動でパケットサイズを設定する関数が用意されていて,その関数をテストしている.

## 11.arvdevicescantest.c

10秒毎に割り込みでデバイス検索を行っている.

## 12.arvroitest.c

映像を取得と平行して,あらゆるパターンのroi領域を設定している.

## 13.timetest.c

よくわかりません.

## 14.loadhttptest.c

http URLを引数に取る.genicamデバイスもURLから設定する方法があるのか?

## 15.cpp.cc

arv.hの読み込みがc++でできるかのテスト