Transceiverに続き、このデバイスと時刻同期し、かつ複数のカメラ映像をフレーム単位で同期させて録画できるカメラデバイスの開発を行なっています。Chip)の採用を検討しています。このSoCには様々なコアが搭載されており、その中でもマルチメディア処理を担当するIVA(ハードウェアアクセラレータ)は1080p60の映像を処理できる優れものです。30fpsのH.264エンコードをしてみた話をハードウェアエンジニアの塩出がお届けします。プロセッサシリーズの1つです。プロセッサは産業用途向けに開発されたチップで、AM5728はマルチメディア処理用のハードウェアアクセラレータが乗ったシリーズになります。AM5728の搭載機能を把握するには、以下のブロック図を見るのが一番早いと思います。特徴として以下のようにかなり機能モリモリなSoCです。評価モジュールとこれに接続できるカメラモジュールを使用しました。合わせて8万円程度でした。このパッケージにlinuxイメージが入ったSDカードが同封されており、開封後すぐに機能評価を始められます。カメラモジュールはリビジョンによって使用されているイメージセンサが異なり、リビジョンA1はMT9T11、リビジョンC1はOV10635CSPとなっています。今回手元に届いたのはMT9T11でした。このカメラモジュールでは解像度によって30fpsまでの出力が可能です。データシートはこちらから参照ください。評価モジュールの商品ページよりどうやってIVAを使うのか?TIのwikiページに説明があります。ここではかいつまんで説明したいと思います。前提SMPモード動作しているA15コアでlinuxが動いています。2つあるM4の片方はIPUMMと呼ばれるTI社が提供しているマルチメディア処理用のファームウェアが動いています。このファームウェアはTI社製のRTOSをベースとしています。linuxとRTOS間の通信はremotoprocとRPMsgを使用しています。IVAにはTI社製のコーデックが乗っているようですが、ソースコードは公開されていないので詳細はわかりません。EngineというTI社が提供しているRTOSパッケージを介して行なっています。EngineはXDAIS準拠のアルゴリズムを実行するためのAPI群で、おそらくIVAに乗っているコーデックがXDAIS準拠のアルゴリズムになっていると思われます。Engineを通じて実行しているものと考えられます。XDAISに関しては詳しく調査しておりませんので詳細は触れません。下の図は先ほどのwikiページから抜粋した、マルチメディア処理のソフトウェアスタック説明図です。青色がTI社が提供しているソフトウェアですが、色分けする意味がほとんどないくらいほぼ青色です。マルチメディア処理のフレームワークには,Gstreamerが採用されています。30fpsのH.264エンコードをとりあえず動かしてみます。location=test.h264エンコードされたデータはffplayで再生できますが、am5728には入っていなかったのでffplayが使えるPCにコピーして再生します。test.h264実行結果は以下のような感じで、とりあえずのエンコードはできました。1920x1080に変換しているので引き伸ばされている感があります。コマンドの説明v4l2srcまずはカメラモジュールからデータを取得するために、v4l2srcを使っています。/dev/video1はこのカメラモジュールのことを直接意味してる訳ではなく、VIPと呼ばれるパラレルなビデオ信号を受け取るためのペリフェラルのディスクリプタです。このVIPは結構優れもので、色空間変換やスケーリングなども行えます。video/x-rawで指定しているフォーマット、サイズがカメラモジュール側で対応していなければ、それに合うようにカメラモジュールからの画像を変換した状態で受け取ってくれます。ここでは4を指定しています。この4はdmabufを意味しています。これにより、VIPで受け取った画像データをユーザ空間のメモリにコピーすることなく下流にpushするようにしてくれます。vpevpeはM2Mデバイスで、メモリにある画像データを色空間変換、スケーリングしてくれるペリフェラルです。ここでは、YUY2からNV12へのフォーマット変換とサイズの変換を行なっています。フォーマット変換をしているのは、IVAのエンコーダがNV12のみに対応しているからです。ducatih264encこれがH.264エンコードするプラグインです。profileやlevel、IDRフレームの間隔などを指示しています。1920x1080のフルHD画質をエンコードするために、profileはhigh、levelは51を指定しています。ここら辺はH.264のフォーマットの話なので、詳しいことは割愛します。下流はfilesinkでH.264データをそのまま保存するという形です。60fpsを処理できるのか?上記のコードを実行すると以下のようなログが得られ、エンコード時間がわかります。60fpsの処理を達成できると思われます。H.264エンコードをしてみました。使用したカメラモジュールが30fpsしか出ないものでしたが、エンコード時間から60fpsでも問題なくエンコードできそうなことがわかりました。今後はこのSoCを使って取得したデータを弊社フレームワークのintdashで扱えるようにしたり、並行して製作しているFPGAを搭載したカメラモジュール側と結合したりしていきます。今回はエンコードしてみたというゆるい内容になってしまいましたが、メモリの動きやTI製のRTOSの使い方、H.264エンコードにメタデータを含める方法、M4とA15の通信など書けそうなことは多々あるので、時間を見つけて書いていきたいと思います。読んでいただきありがとうございました。2019の12日目担当の塩出でした。2019の10日目の記事です。(1)月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。