web-dev-qa-db-ja.com

組み込みLinuxSoCでビデオデバイスを入手する

IPカメラ(Linuxを実行)のカメラモジュールデバイスを見つけようとしていますが、あまり成功していません。

私の主な目的は、カメラストリームを見つけることです。これにより、RTSPサーバーを接続できます。

2019年2月26日更新

OpenMAX(OMX)に関連するライブラリが見つかりました。 GStreamerをgst-omxとクロスコンパイルして、これで何ができるかを確認しようとしていますが、それでも成功しません。

いくつかのポインタを与えることを気にしないOMXに精通している人はいますか?

$ find / -iname "*omx*"
/lib/libOMX_VSRC.so
/lib/libOMX_AVQE_A.so
/lib/libOMX_BELA.so
/lib/libOMX_IJPE_ENC_HW.so
/lib/libOMX_VMFE.so
/lib/libOMX_VSPL.so
/lib/libOMX_IJPE.so
/lib/libOMX_VVHE.so
/lib/libOMX_ASPL.so
/lib/libOMX_IJPE_MEM_MGR.so
/lib/libOMX_ALSA.so
/lib/libOMX_IJPE_ENC_SW.so
/lib/libOMX_ACODEC.so

私が試したこと

1。 /devでビデオデバイスを探しています

$ ls /dev | grep -i video
$

何も...完全ls /devここ

2。 ffmpegを使用してデバイスを一覧表示します

$ ffmpeg -devices
ffmpeg version 3.2-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.1 (Debian 5.4.1-3) 20161019
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-5 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libass --enable-libebur128 --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.100 / 57. 64.100
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Devices:
 D. = Demuxing supported
 .E = Muxing supported
 --
 D  dv1394          DV1394 A/V grab
 DE fbdev           Linux framebuffer
 D  lavfi           Libavfilter virtual input device
 DE oss             OSS (Open Sound System) playback
  E v4l2            Video4Linux2 output device
 D  video4linux2,v4l2 Video4Linux2 device grab
 D  x11grab         X11 screen capture, using XCB

ここにいくつかの興味深い結果がありますが、ファイルシステム上のデバイスなどを指し示すものは何もありません。

これらの名前は実際のデバイスではないため、ffmpeg内でこれらのデバイスを名前で参照するだけで、明らかなCannot open video deviceがスローされます。

3。 v4l2-utilsを試しました

$ v4l2-ctl --list-devices
Failed to open /dev/video0: No such file or directory
$ v4l2-sysfs-path
Alsa playback device(s): hw:0,0

4。ファイルシステム全体で何かを検索してみました

私が推測するものだけが独自のソリューションであることがわかりました。

$ ls /run | grep video
video_mainstream
video_rawstream
video_substream

$ ls -la /run/video_mainstream/
total 0
drwx------    2 root     root            60 Feb 23 17:03 .
drwxr-xr-x   14 root     root           360 Jan  1  1970 ..
srwxrwxrwx    1 root     root             0 Jan  1  1970 control

この空のcontrolファイルが何であるかわかりません。

$ ls /mnt/data/bin/
agent_client                  log2tf.sh                     miio_client                   miio_nas_syncer               miio_sdcard                   network_governor.sh           wifi_start.sh
factory                       log_diag.sh                   miio_client_helper_nomqtt.sh  miio_ota                      miio_send_line                play_audio_test
fetch_av                      miio_agent                    miio_devicekit                miio_qrcode                   miio_stream                   post-ota.sh
ipc_client                    miio_alarm                    miio_md                       miio_record                   mortoxc                       pre-ota.sh
log2mi.sh                     miio_algo                     miio_nas                      miio_recv_line                mortoxd                       shbf_client

多くの独自のスクリプトとバイナリ。 elfツールと16進エディター(fetch_avmiio_streammiio_record)を使用していくつかを分析しましたが、有用なものは見つかりませんでした。

追伸:カメラはXiaomi mjsxj02cm(SoC msc313e、カメラセンサーSC2235)で、Linuxベースのファームウェアを使用しています。

2
Telmo Marques

dmesgmsc313eデータシート に基づく非常に部分的な回答:

カメラモジュール自体はI2Cを介して制御され、DVP/MIPIを介して画像データを転送し、いくつかのハードウェア画像エンコーダー、色処理ブロックなどがあります。

から

MSYS: DMEM request: [S1:VENCDMP1]:0x00069AE0
MSYS: DMEM request: [S1:VENCDMP0]:0x00069AE0
MSYS: DMEM request: [S1:VENCDMOUT]:0x0000A100
MSYS: DMEM request: [S0:VENCDMP1]:0x0007F800
MSYS: DMEM request: [S0:VENCDMP0]:0x0007F800
MSYS: DMEM request: [S0:VENCDMOUT]:0x0000A800

VENCは「ビデオエンコーダー」を意味すると思います。 DMAのもの、「RTMPQ」(キュー)などもたくさんあります。

したがって、ワークフローはハードウェアとDMA転送に基づいていると思います。CPUはこれらの転送を設定するだけで、ハードウェアブロックに処理を実行させます。

これがどのように接続されているかは言わなかったが、USBカメラデバイスとして機能する場合、1つのオプションは、USBドライバーが他のハードウェアブロックによって生成されたエンコードされた画像の宛先として専用のメモリ領域を持っていることです。画像を読み取ってUSB経由で転送するだけです。

これにアクセスして変更するのは難しいでしょうが、少なくとも/dev/memを介して既知のアドレスを持つメモリ領域を検査し、それらを画像として受け取ったものと比較することができます。

2
dirkt