R-Mobile A1 の CEU に接続されたカメラから取り込んだ映像を
H.264 Encoder で圧縮し、これを RTP パケットとして送信するアプリケーションです。
※ H.264 Encoder のパラメータ調整や、フレームレートの調整の機能は 実装されていません。
- これらの調整を行う場合は、
ceu2rtp.c
のマクロ定義を修正し、 再コンパイルを行ってください。
Armadillo-810, Armadillo-840 で動作することを確認しています。
本アプリケーションは GStreamer 1.0 を使って書かれています。
GStreamer パイプラインは以下の通りです。
appsrc ! h264parse ! rtph264pay ! udpsink
appsrc
は、カメラから映像を取り込む処理とエンコード処理の2つを行っています。
appsrc
のコードを読まれる場合は、このファイル末尾の "開発者の方へ" を参照してから、
読むことをおすすめします。
その他のエレメントについては Overview of available plug-ins を参照してください。
- GStreamer1.0 の dev パッケージ
- Debian package version
1.0.8-1~bpo70+1
で動作確認済み
- Debian package version
- cross-compile
make
- native-compile
make KERNEL_DIR=/path/to/linux-3.4-at/include CROSS_COMPILE=
- 任意のカーネルヘッダファイルを使用したい場合
make KERNEL_DIR=/path/to/linux-3.4-at/include
-
ハードウェア
- Armadillo-810 または Armadillo-840
- 標準カメラモジュール (OP-A810-CAM01-00) または FullHD対応カメラモジュール (KBCR-S02TXG)
-
ソフトウェア
- カーネル
- CEU のデバイスドライバが DMABUF に対応していること
- linux-3.4_at15 以降
- KBCR-S02TXG を使用する場合は専用のデバイスドライバが入っていること
- CEU のデバイスドライバが DMABUF に対応していること
- ユーザーランド
- AVコーデックミドルウェア (ACM) が動作すること
- エンコーダーが有効化されていること
- AVコーデックミドルウェア (ACM) が動作すること
- カーネル
- Armadillo-810 + FullHD対応カメラモジュール (KBCR-S02TXG) で実行する
./ceu2rtp
※ オプション無しで実行すると localhost (127.0.0.1) に送信されます。
※ デフォルトで使用するポートは 5004 番です。
- 送信先の IP アドレスおよび、ポート番号を指定する
./ceu2rtp --ip 192.168.0.5 --port 1234
- Armadillo-810 + 標準カメラモジュール (OP-A810-CAM01-00) で実行する
./ceu2rtp --input-width 640 --input-height 480 --output-width 640 --output-height 480
- Armadillo-840 で実行する
- ACM のエンコーダーを有効化します
echo encoder > /sys/devices/platform/acm.0/codec
- CEU および、H.264 Encoder の デバイスファイルを適切に指定して実行します
./ceu2rtp -c /dev/video0 -e /dev/video1
-
アプリケーションの終了させるには
Ctrl-C
を押下してください。 -
PC (linux) で受信する際には以下のコマンドを参考にしてください。
gst-launch-1.0 \
rtpbin name=rtpbin \
udpsrc caps="application/x-rtp,\
media=video,clock-rate=90000,\
encoding-name=H264" \
port=5004 ! rtpbin.recv_rtp_sink_0 \
rtpbin. ! rtph264depay ! avdec_h264 \
! videoconvert ! fpsdisplaysink max-lateness=-1 sync=false
long option | short | 機能 |
---|---|---|
--ip | -i | IP アドレス |
--port | -p | ポート番号 |
--camera | -c | CEU のデバイスファイル |
--encoder | -e | H.264 Encoder のデバイスファイル |
--input-width | CEU 入力解像度 横 | |
--input-height | CEU 入力解像度 縦 | |
--output-width | Encoder 出力解像度 横 | |
--output-height | Encoder 出力解像度 縦 |
appsrc
の処理は v4l2src
と acmh264enc
を繋ぎあわせた場合と ほぼ同等 です。
しかし、v4l2src
と acmh264enc
は 2015/07/16 現在、
DMA 転送に対応していません。
そのため、カメラから高解像度の映像を取得した時、
メモリコピーがボトルネックとなりフレームレートが下がります。
このボトルネックを解消するために、appsrc
で R-Mobile A1 の CEU から取り込んだ映像を
H.264 Encoder に DMABUF で転送する処理を実装しています。
Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
video/x-h264
alignment: au
stream-format: byte-stream
C2rPipeline
|-- GstPipeline
`-- C2rAppsrc
|-- GstAppSrc
|-- C2rAppsrcSize
|-- C2rCamera
| |-- C2rDevice
| `-- C2rV4l2Buf : CAPTURE 用
|-- C2rEncoder
| |-- C2rDevice
| |-- C2rV4l2Buf : OUTPUT 用
| `-- C2rV4l2Buf : CAPTURE 用
|-- C2rTask : camera task
|-- C2rTask : output task
`-- C2rTask : capture task
- C2rPipeline
main()
が扱う Object- C2rPipeline を Play すると Streaming thread が動く
- メンバ
- Gstreamer の Pipeline
- C2rAppSrc (GstAppSrc の Wrapper)
- C2rAppsrc
- AppSrc のすべてを含んだ Object
- メンバ
- GstAppSrc
- Devices (Camera, Encoder)
- Tasks
- Size (I/O Width, Height)
c2r_appsrc_new()
した後に、各 GstTask をgst_task_start()
で 動かす必要がある
- C2rDevice
- C2rEncoder と C2rCamera の親 Object
- デバイスファイル名と fd だけを管理する
- C2rTask
- GstTask の Helper object
c2r_task_setup (C2rTask)
でgst_task_start()
出来る状態にする
- C2rV4l2Buf
- v4l2_buffer の管理を行う Object
- DMA 転送に必要な v4l2_exportbuffer もこの Object が持つ
C2rIndexQueue
というメンバにより、現在使用 (Enqueue) 可能な index を管理している