Conversation

Jarkko Sakkinen

Edited 14 days 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 13 days 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