ひでみのアイデア帳

くだらないことなんだけど、忘れないために・・・

ラズパイストリーミングをUltra96でメモリに保存する

昨日は次のコマンドにてラズパイのカメラ映像をストリーミングして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カメラ入力のボードをどうするか本格的に考えることにしよう。