This file is indexed.

/usr/bin/v4l2loopback-ctl is in v4l2loopback-utils 0.6.1-1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/bin/bash

usage() {
## ugly linebreaks in order to make help2man more happy
    cat <<!
Usage:
    $0 [command] [args]

Commands:
     set-fps <FPS> /dev/videoX  Set device fps (if format is already
                                negotiated).

     set-timeout-image <IMAGE> /dev/videoX  Set timeout on device, and 
                                            optionally the placeholder picture,
                                            instead of default null frame.

     set-caps <CAPS> /dev/videoX  Fix format for the device (using GStreamer
                                  caps), so it will be maintained until reset,
                                  regardless of future readers/writers.

Options:
    FPS      frames per second, either as integer ('30') or fraction ('50/2')
    IMAGE    image file ("no-input.png"), or 'videotestsrc'
    CAPS     GStreamer caps ("video/x-raw-yuv, width=640, height=480"),
             or 'any'
    /dev/videoX  the v4l2-loopback device file you want to act on
!
    exit 1
}

version() {
cat <<!
$0 0.6

Copyright (c) 2012 IOhannes m zmoelnig <zmoelnig@iem.at>
Copyright (c) 2012 Anton Novikov (random.plant@gmail.com)
!
    exit 1
}
die() {
    echo "$@" 1>&2
    exit 1
}

parse_device() {
    if [ -e "$1" ]; then
        device="$1"
    elif [ -e "/dev/video$1" ]; then
        device="/dev/video$1"
    else
        die "can't parse device"
    fi
    sysfs=/sys/devices/virtual/video4linux/${device##*/}
}

check_application() {
 which $1 > /dev/null || die "can't find $1"
}


set_fps() {
    fps="$1"
    parse_device "$2"
    [ -z "$fps" ] && usage

    echo "@$fps" | sudo tee "$sysfs/format" >/dev/null || die "Set fps failed"
    echo OK
}

set_caps() {
    caps="$1"
    parse_device "$2"
    [ -z "$caps" ] && usage

    [ "$caps" = 'any' ] && {
        check_application v4l2-ctl
        v4l2-ctl -d $device -c keep_format=0
        return
    }

    [ -n "`cat $sysfs/format`" ] && die "Device is busy"
    declare -a params
    declare -a nofps_params
    IFS=',' read -ra params <<< "$caps"
    for p in "${params[@]}"; do
        if echo "$p" | grep -q framerate; then
            fps=`echo "$p" | sed -r 's/.*(=|\))//g'`
            echo "$fps" | grep -q '[^0-9/]' && die "could not parse framerate param"
            echo "@$fps" | sudo tee $sysfs/format >/dev/null || die "could not set fps attr"
            #echo "fps: $fps"
        else
            nofps_params=("${nofps_params[@]}" "$p")
        fi
    done
    {
        IFS=','
        nofps_caps="${nofps_params[*]}"
    }
    #echo "nofps_caps: $nofps_caps"
    check_application v4l2-ctl
    check_application gst-launch-0.10

    v4l2-ctl -d $device -c keep_format=1 || exit 1
    v4l2-ctl -d $device -c sustain_framerate=1 || exit 1
    gst-launch-0.10 videotestsrc num-buffers=1 ! "$nofps_caps" ! v4l2sink device=$device || die "output to $device failed"
}

set_timeout_image() {
    imagefile="$1"
    parse_device "$2"

    [ -z "$imagefile" ] && return
    [ -n "`cat $sysfs/format`" ] || die "Device has no format negotiated"

    check_application v4l2-ctl
    check_application gst-launch-0.10

    v4l2-ctl -d $device -c timeout_image_io=1
    if [ "$imagefile" = 'videotestsrc' ]; then
        gst-launch-0.10 videotestsrc num-buffers=1 ! v4l2sink device=$device
    else
        uri="file://`readlink -f $imagefile`" || die "no file"
        echo "Reading from $uri"
        gst-launch-0.10 uridecodebin uri=$uri ! ffmpegcolorspace ! videoscale ! imagefreeze ! identity error-after=2 ! v4l2sink show-preroll-frame=false device=/dev/video0
    fi
}

command="$1"
shift
case "$command" in
    "-h"|"--help")
	usage
	;;
    "-v"|"--version")
	version
	;;
    "set-fps")
        set_fps "$@"
        ;;
    "set-caps")
        set_caps "$@"
        ;;
    "set-timeout-image")
        set_timeout_image "$@"
        ;;
    *)
        usage
        ;;
esac