昨日は次のコマンドにてラズパイのカメラ映像をストリーミングしてPC上で表示させた。
gst-launch-1.0 -v rtspsrc location=rtsp://192.168.1.204:9000/ ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink
ライズパイのストリーミングをUltra96で受信して、メモリにブチ込むためにappsinkでgstreamerのプログラムを組むことを考えたけど、それはそれで面倒でしょ。
たかが、FPGAの画像処理モジュールの検証環境を作るためにgstreamerの開発から作るのも面倒だしね。
そこでfdsinkで横着する。
つまり、コマンドは次のようにする。
gst-launch-1.0 -v rtspsrc location=rtsp://192.168.1.204:9000/ ! rtph264depay ! avdec_h264 ! videoconvert ! capsfilter caps="video/x-raw,format=RGBx" ! fdsink fd=1
FPGAの回路はRGBAの32bitなので処理にしているのでfdsinkで出力させるのはRGBxで32bitにする。
横着して次のプログラムを組む。
fdsinkで標準出力に出した画像データを標準入力で読み込んでメモリに保存する。
#define WIDTH 640
#define HEIGHT 480
int main() {
size_t frame_size = WIDTH*HEIGHT*sizeof(unsigned int);
unsigned int *frame = malloc(frame_size);
unsigned int *buf;
fd = open( "/dev/mem", O_RDWR | O_SYNC );
if( fd == -1 ){
printf( "Can't open /dev/mem.\n" );
return 0;
}
buf = mmap( NULL, MAP_LENG,
PROT_READ | PROT_WRITE,
MAP_SHARED, fd,
offset & 0xFFFF0000);
if( buf == MAP_FAILED ){
printf( "Error: mmap()\n" );
return 0;
}
while(fread(frame, frame_size, 1, stdin) == 1) {
fwrite(buf, frame, frame_size);
}
return 0;
}
転送コストがかかるけど、検証用の環境だから良いのよ。
これでFPGAモジュールの実機検証ができたら、4カメラ入力のボードをどうするか本格的に考えることにしよう。