Conversation

Jarkko Sakkinen

Edited 1 month ago
Video streamed with ffmpeg, and played with ffplay through with my WiP V4L2 loopback driver.

The next step is to detach the producer from /dev/videoX fops and instead return anonymous inode, which owns a file where the capture device can write the video stream.

The video resolution in this smoke test is 640x480, and the encoder scales it up in real-time to 1280x720.

#linux #kernel #media #video4linux
1
4
5

“Capture” for the next step, i.e. BuildRoot build for headless test.

wget https://file-examples.com/storage/fe3abb0cc967520c59b97f1/2018/04/file_example_AVI_640_800kB.avi
ffmpeg -stream_loop -1 -re -i file_example_AVI_640_800kB.avi -s 1280x720 -f v4l2 /dev/video0

Due to change for “/dev/video0” part (because capture device is a file descriptor eventually). Then I just need playback and comparison to get success/failure condition…

1
0
0

Jarkko Sakkinen

Edited 1 month ago

Early, rudimentary and unpolished skeleton of a “server side”:

import ctypes
import fcntl
import os
import sys

V4L2_LOOPBACK_DEVICE_FILE = "/dev/v4l2loopback"

V4L2_LOOPBACK_MAGIC = 0x4C
V4L2_LOOPBACK_IOC_ADD = 0xC0004C00


class V4L2LoopbackAdd(ctypes.Structure):
    _fields_ = [
        ("card_label", ctypes.c_uint64),
        ("flags", ctypes.c_uint16),
        ("device_nr", ctypes.c_uint16),
        ("card_fd", ctypes.c_uint32),
    ]


def main():
    try:
        fd = os.open(V4L2_LOOPBACK_DEVICE_FILE, os.O_RDWR)
    except FileNotFoundError:
        sys.exit(1)

    loopback = V4L2LoopbackAdd()
    ctypes.memset(ctypes.addressof(loopback), 0, ctypes.sizeof(loopback))

    try:
        fcntl.ioctl(fd, V4L2_LOOPBACK_IOC_ADD, loopback)
        print(f"{loopback.device_nr} {loopback.card_fd}")
    except OSError:
        sys.exit(1)
    finally:
        os.close(fd)


if __name__ == "__main__":
    main()

Anyway shows the gist. The device name is due to change…

0
0
1