組み込みLinux SoCからビデオデバイスをインポートする

組み込みLinux SoCからビデオデバイスをインポートする

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

これにはいくつかの興味深い結果があります。私のファイルシステムのデバイスや何も指していません。

Cannot open video deviceffmpegでこれらのデバイスを名前として単に参照すると、これらの名前が実際のデバイスではないため明らかになります。

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

多くの排他的なスクリプトとバイナリ。エルフツールと16進エディタ(fetch_av、、、miio_stream)を使用して一部を分析しましたが、miio_record役に立つものが見つかりませんでした。

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

答え1

dmesg以下に基づいた非常に一方的な答えです。msc313e データシート:

カメラモジュール自体は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と比較することができます。

関連情報