Armadilloフォーラム

Armadillo840 jpegデータの送信

jmacs-ts

2018年1月30日 21時32分

お世話になります
松本と申します。

Armadillo840 + アナログカメラ接続キット (ATB-A800NTSC-Kit) を使用して、カメラ映像をjpegデータに圧縮し、PC側で画像表示する為の C++ にてプログラムを作成しています。

プログラムの流れとしては下記動作を目標としているのですが、UDPにて送信する部分で詰まっています。

①カメラ映像の取得(YUYV)
    ↓
②YUV形式に変換
    ↓
③libjpeg を使用して圧縮
    ↓
④圧縮データをUDPにて送信

試験的にYUV形式よりjpeg画像を作成することはできたのですが、jpeg形式にエンコードしたデータを取得できずにいます。調べたところ、libjpeg の jpeg_mem_dest() にてエンコード後の結果をメモリに格納できるようですが、うまくいっていません。
libjpeg ではメモリ上のデータを読み出すようなことは可能なのでしょうか?

現状でのソースファイルを添付致します。ご教示よろしくお願い申し上げます。

ファイル ファイルの説明
camera_jpeg.cpp
コメント

at_ohsawa

2018年1月31日 17時10分

あまりlibjpegに詳しくないので、これ以外も問題が
あるかもしれませんが、すくなくとも下記2点 APIの
呼び方が原因で期待した動作になっていないです。

1つめは、jpeg_mem_dest()で格納先をバッファにしたのに
すぐ後でjpeg_stdio_dest()でfile descriptorに出力先を
変えてしまっています。これだと後者にしか書かれません。
ファイルと、バッファの両方に書くのであれば、出力先は
バッファにして、udpなりで転送した後に、同じバッファを
ファイルにwriteすると良いかと思います。

2つめは、(1つめを直しても)jpeg_finish_compress()
より前にSendDataでアクセスしても圧縮結果入ってないです。

補足です。
Armadillo-840のCPUにはNEON(ARMのSIMD命令)がサポート
されているので、libjpeg-turboを使った方が実行速度が早くなります。

更に言うと、JPEGに変換する前にYUV画像の解析等をせず、単に
jpeg圧縮してudpで転送+ファイルに保存したいだけであれば、
gstreamerを使えばプログラムを書く必要がありません。

jmacs-ts

2018年1月31日 18時24分

お世話になります
松本です

> あまりlibjpegに詳しくないので、これ以外も問題が
> あるかもしれませんが、すくなくとも下記2点 APIの
> 呼び方が原因で期待した動作になっていないです。
>
> 1つめは、jpeg_mem_dest()で格納先をバッファにしたのに
> すぐ後でjpeg_stdio_dest()でfile descriptorに出力先を
> 変えてしまっています。これだと後者にしか書かれません。
> ファイルと、バッファの両方に書くのであれば、出力先は
> バッファにして、udpなりで転送した後に、同じバッファを
> ファイルにwriteすると良いかと思います。
>
> 2つめは、(1つめを直しても)jpeg_finish_compress()
> より前にSendDataでアクセスしても圧縮結果入ってないです。

ご回答ありがとうございます。早速確認させて頂きます。

> 補足です。
> Armadillo-840のCPUにはNEON(ARMのSIMD命令)がサポート
> されているので、libjpeg-turboを使った方が実行速度が早くなります。
>
> 更に言うと、JPEGに変換する前にYUV画像の解析等をせず、単に
> jpeg圧縮してudpで転送+ファイルに保存したいだけであれば、
> gstreamerを使えばプログラムを書く必要がありません。

今回の場合「jpeg圧縮してudpで転送」を目的としていますので
是非確認してみたいと思います。
貴重なご意見ありがとうございました。