Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package v4l2loopback for openSUSE:Factory checked in at 2025-06-03 17:54:36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/v4l2loopback (Old) and /work/SRC/openSUSE:Factory/.v4l2loopback.new.16005 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "v4l2loopback" Tue Jun 3 17:54:36 2025 rev:24 rq:1282195 version:0.15.0 Changes: -------- --- /work/SRC/openSUSE:Factory/v4l2loopback/v4l2loopback.changes 2025-03-13 15:08:28.679939431 +0100 +++ /work/SRC/openSUSE:Factory/.v4l2loopback.new.16005/v4l2loopback.changes 2025-06-03 17:55:29.514463558 +0200 @@ -1,0 +2,32 @@ +Tue Jun 03 06:44:50 UTC 2025 - mun...@googlemail.com + +- Update to version 0.15.0: + * Release v0.15.0 + * DKMS: dummy 'clean' rule + * Replace 'Skype' with 'Zoom' + * [github] note on "exact" v4l2loopback version + * [github] fix name of ArchLinux job + * publish build-state.svg directly to the Wiki + * [github] use current data for rolling releaeses + * [github] case-insensitive sort + * [github] drop openSUSE/leap + * [github] build more Fedora releases, and ArchLinux + * [github] support ArchLinux + * [github] DNF>=5 supports the "--skip-unavailable" flag + * [github] build on openSUSE + * [github] rename "not_${os}" to "not_${packager}" + * run CI against more kernels + * Create a badge with all kernels tested in the CI + * [github] 2nd attempt on testing with more kernels + * [github] also install kernels without a debrevision in the name + * only use `timer_delete_sync` compat macro for linux<6.2.0 + * added functionality for linux 6.15+ (#626) + * use fixed-size types in public API + * [meta] pre-commit config to automatically run clang-format before committing + * v4l2loopback-ctl: (also) query the module version via ioctl + * change public ioctl numbers! + * V4L2LOOPBACK_CTL_VERSION ioctl + * order ioctl's by value + * dkms.conf updates + +------------------------------------------------------------------- Old: ---- v4l2loopback-0.14.0.tar.xz New: ---- v4l2loopback-0.15.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ v4l2loopback.spec ++++++ --- /var/tmp/diff_new_pack.xXIblr/_old 2025-06-03 17:55:30.402500379 +0200 +++ /var/tmp/diff_new_pack.xXIblr/_new 2025-06-03 17:55:30.406500545 +0200 @@ -30,7 +30,7 @@ %{!?_modulesloaddir: %define _modulesloaddir /usr/lib/modules-load.d/} Name: v4l2loopback -Version: 0.14.0 +Version: 0.15.0 Release: 0 Summary: A kernel module to create V4L2 loopback devices License: GPL-2.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.xXIblr/_old 2025-06-03 17:55:30.442502037 +0200 +++ /var/tmp/diff_new_pack.xXIblr/_new 2025-06-03 17:55:30.450502369 +0200 @@ -4,7 +4,7 @@ <param name="scm">git</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> - <param name="revision">v0.14.0</param> + <param name="revision">v0.15.0</param> <param name="changesgenerate">enable</param> </service> <service name="recompress" mode="manual"> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.xXIblr/_old 2025-06-03 17:55:30.470503199 +0200 +++ /var/tmp/diff_new_pack.xXIblr/_new 2025-06-03 17:55:30.474503365 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/umlaeute/v4l2loopback</param> - <param name="changesrevision">60a0315c6db154597dc733ea42139cf159644a7a</param></service></servicedata> + <param name="changesrevision">b9d5c7591ae96db3919c6f56b884955ae2f37236</param></service></servicedata> (No newline at EOF) ++++++ v4l2loopback-0.14.0.tar.xz -> v4l2loopback-0.15.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/.gitattributes new/v4l2loopback-0.15.0/.gitattributes --- old/v4l2loopback-0.14.0/.gitattributes 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/.gitattributes 2025-05-27 23:11:33.000000000 +0200 @@ -1,2 +1,3 @@ .git* export-ignore .travis.yml export-ignore +.pre-commit-config.yaml export-ignore diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/.github/ISSUE_TEMPLATE/bug.yml new/v4l2loopback-0.15.0/.github/ISSUE_TEMPLATE/bug.yml --- old/v4l2loopback-0.14.0/.github/ISSUE_TEMPLATE/bug.yml 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/.github/ISSUE_TEMPLATE/bug.yml 2025-05-27 23:11:33.000000000 +0200 @@ -40,7 +40,6 @@ Use [Markdown](https://docs.github.com/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) for formatting. placeholder: | What did you do (step by step)? What did you expect? What happened? - render: markdown validations: required: true @@ -49,7 +48,8 @@ attributes: label: v4l2loopback version description: | - What is the exact version of v4l2loopback you are using? (e.g. as reported by `sudo dmesg | grep -i "v4l2loopback driver version"` or `git describe`) + What is the exact version of v4l2loopback you are using? (e.g. as reported by `sudo dmesg | grep -i "v4l2loopback driver version"` or `git describe`). + Please do **not** use a generic version like `latest from main` as this will change over time. placeholder: | e.g. v0.13.1-10-g2014627 validations: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/.github/workflows/kmod-compatibility-checks.yml new/v4l2loopback-0.15.0/.github/workflows/kmod-compatibility-checks.yml --- old/v4l2loopback-0.14.0/.github/workflows/kmod-compatibility-checks.yml 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/.github/workflows/kmod-compatibility-checks.yml 2025-05-27 23:11:33.000000000 +0200 @@ -1,3 +1,4 @@ +--- name: kmod compatibility checks on: pull_request: @@ -8,9 +9,11 @@ branches: - develop - main + schedule: + - cron: '37 5 * * 1' jobs: - get_debuntu_releases: + get_distro_releases: runs-on: ubuntu-latest steps: - name: install dependencies @@ -26,20 +29,38 @@ # - drop some blacklisted releases (e.g. 'bionic', 'xenial') # - format as a JSON array run: | - blacklist="bionic|xenial" - echo matrix=$(true; (curl -s "https://hub.docker.com/v2/repositories/library/buildpack-deps/tags?page_size=1000" | jq -r '.results[] | .name' | sort -u; for url in http://archive.ubuntu.com/ubuntu; do curl -s "${url}/dists/" | grep "href=" | sed -e 's|.*a href="||' -e 's|".*||' -e 's|/$||'; done | sort -u; for d in unstable testing stable oldstable; do echo $d; done) | grep -vE "^(${blacklist})$" | sort | uniq -d | while read x; do echo -n '"'${x}'" '; done | sed -e 's|^ *|[|' -e 's| *$|]|' -e 's| *|,|g') | tee -a $GITHUB_OUTPUT + ubuntu_blacklist="bionic|xenial" + # debian (hardcoded) + debimages="unstable testing stable oldstable" + # ubuntu (based on availability) + debimages="${debimages} $(true; (curl -s "https://hub.docker.com/v2/repositories/library/buildpack-deps/tags?page_size=1000" | jq -r '.results[] | .name' | sort -u; curl -s "http://archive.ubuntu.com/ubuntu/dists/" | grep "href=" | sed -e 's|.*a href="||' -e 's|".*||' -e 's|/$||') | sort | uniq -d | grep -vE "^(${ubuntu_blacklist})$")" + + # last 5 fedora images + fedversions="$(curl -s "https://hub.docker.com/v2/repositories/library/fedora/tags?page_size=20" | jq -r '.results[] | .name' | sort -u | egrep "^[0-9]*$" | sort -n | tail -5)" + + # make images + images="" + # Debian: prefix deb-images with 'buildpack-deps:' + images="$(for i in ${debimages}; do echo "${i} buildpack-deps:${i}"; done) ${images}" + # Fedora + images="$(for i in ${fedversions}; do echo "fedora${i} fedora:${i}"; done) ${images}" + + # more images in name/container pairs + images="alpine openebs/alpine-bash archlinux archlinux:base-devel tumbleweed opensuse/tumbleweed ${images}" + + # create a JSON matrix + echo matrix=$(echo ${images} | xargs -n2 echo | jq -Rn '{include: [inputs] | map( split(" ") | { name:.[0], image:.[1] } )}') | tee -a ${GITHUB_OUTPUT} id: set-matrix outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} kmod-compile: runs-on: ubuntu-latest - needs: get_debuntu_releases + needs: get_distro_releases strategy: - matrix: - series: ${{ fromJson(needs.get_debuntu_releases.outputs.matrix) }} + matrix: ${{ fromJson(needs.get_distro_releases.outputs.matrix) }} fail-fast: false - container: buildpack-deps:${{ matrix.series }} + container: ${{ matrix.image }} env: JOB_KNOWN_FAILURES: "3.13 3.16 3.19 4.2" steps: @@ -48,29 +69,74 @@ - name: Compile against all available kernel header versions shell: bash run: | - apt-get update --quiet; - apt-get install --yes --no-install-recommends kmod - apt-get install --yes --no-install-recommends dkms || true - apt-cache search "linux-headers-[0-9.]*-[0-9]*-" | cut -d " " -f1 \ + echo "name '${{ matrix.name }}' on image '${{ matrix.image }}'" + + # Debian and derivatives + not_apt=true; if which apt-get >/dev/null 2>/dev/null; then not_apt=false; fi + ${not_apt} || echo "running apt-based distribution (Debian and derivatives)" + deb_packages="kmod dkms lsb-release dctrl-tools linux-headers-generic linux-headers" + ${not_apt} || apt-get update --quiet + ${not_apt} || apt-cache show ${deb_packages} \ + | sed -e '/^Package:/!d' -e 's|^Package:[[:space:]]*||' | sort -u \ + | xargs apt-get install --yes --no-install-recommends || true + ${not_apt} || grep-aptavail -n -s Package -F Provides -X linux-headers -o -F Provides -X linux-headers-generic \ + | xargs apt-get install --yes --no-install-recommends || true + ${not_apt} || apt-cache search "linux-headers-[0-9.]*-[0-9]*-" | cut -d " " -f1 \ | sed -e 's|linux-headers-\([0-9.]*\)-[0-9]*-\(.*\)|\0 \1 \2|' | sort -t- -k3,4 -V -r | sort -u -k2,3 -V | cut -d " " -f1 \ - | xargs apt-get install --yes --no-install-recommends + | xargs apt-get install --yes --no-install-recommends || true + + # Alpine + not_apkg=true; if which apk >/dev/null 2>/dev/null; then not_apkg=false; fi + ${not_apkg} || echo "running apk-based distribution (Alpine,...)" + ${not_apkg} || apk add lsb-release build-base linux-headers linux-firmware-none + ${not_apkg} || apk search "linux-*-dev" | grep "^linux" | sed -e 's|-dev-.*|-dev|' | xargs -n1 apk add + + # Fedora + not_dnf5=true; if dnf5 --version >/dev/null; then not_dnf5=false; fi + ${not_dnf5} || echo "running dnf5-based distribution (Fedora>=41,...)" + ${not_dnf5} || dnf5 upgrade -y --refresh + ${not_dnf5} || dnf5 install -y --setopt=install_weak_deps=False --skip-unavailable lsb-release dkms kernel-devel kernel-headers kernel-modules-core + not_dnf=true; if ${not_dnf5} && dnf --version>/dev/null; then not_dnf=false; fi + ${not_dnf} || echo "running dnf-based distribution (Fedora<41,...)" + ${not_dnf} || dnf upgrade -y --refresh + ${not_dnf} || dnf install -y --setopt=install_weak_deps=False lsb-release dkms kernel-devel kernel-headers kernel-modules-core + + # openSUSE + not_zypper=true; if zypper --version >/dev/null; then not_zypper=false; fi + ${not_zypper} || echo "running zypper-based distribution (openSUSE,...)" + ${not_zypper} || zypper update --no-confirm + ${not_zypper} || zypper --ignore-unknown install --no-confirm --no-recommends dkms lsb-release kernel-devel + + # Arch + not_pacman=true; if pacman --version >/dev/null; then not_pacman=false; fi + ${not_pacman} || echo "running pacman-based distribution (ArchLinux,...)" + ${not_pacman} || pacman --noconfirm -Suy dkms lsb-release + ${not_pacman} || pacman -Si dkms | sed -n '/^Optional/{ s/[^:]*: //;:a;s/:.*//p;n;/^[^ \t]/q;ba;}' | sort -u | xargs pacman -S --noconfirm + + # run the actual builds + lsb_release -a failed="" + soft_failed="" succeeded="" skipped="" for kbuild in /lib/modules/*/build; do test -d $kbuild || continue kver=${kbuild%/build} kver=${kver##*/} + echo "=== Preparing ${kver} ==="; + touch "/lib/modules/${kver}/modules.builtin" + depmod ${kver} echo "=== Testing ${kver} ==="; - ret=$(make KERNELRELEASE="${kver}" >&2; echo $?); + ret=$(make KERNELRELEASE="${kver}" >&2; echo $?) if [ ${ret} -eq 0 ]; then succeeded="${succeeded} ${kver}" - modinfo v4l2loopback.ko; - else + test ! -e /lib/modules/${kver}/modules.dep || ret=$(modinfo -k ${kver} v4l2loopback.ko >&2; echo $?) + fi + if [ ${ret} -ne 0 ]; then case " ${JOB_KNOWN_FAILURES} " in *" ${kver%.*} "*) echo "#### Skipped known failure ${kver}"; - skipped="${skipped} ${kver}"; + soft_failed="${soft_failed} ${kver}"; ;; *) if test -e "${kbuild}/.config" && ! grep -qE "^(CONFIG_VIDEO_DEV|CONFIG_VIDEO_V4L2)=" "${kbuild}/.config"; then @@ -85,11 +151,84 @@ fi; make KERNELRELEASE="${kver}" clean || test ${ret} -ne 0 done + + # record & report the build state + statefile=buildstate.txt + osname="$(lsb_release -si)" + osversion="$(lsb_release -sr)" + osrelease="$(lsb_release -sc)" + test "${osrelease}" != "n/a" || osrelease="${osversion}" + test "${osrelease}" != "rolling" || osrelease="$(date +%Y%m%d)" + rm -rf "${statefile}" + for k in ${succeeded}; do + echo "${osname} ${osversion} ${osrelease} ${k} success" + done >> "${statefile}" + for k in ${skipped}; do + echo "${osname} ${osversion} ${osrelease} ${k} skip" + done >> "${statefile}" + for k in ${soft_failed}; do + echo "${osname} ${osversion} ${osrelease} ${k} softfail" + done >> "${statefile}" + for k in ${failed}; do + echo "${osname} ${osversion} ${osrelease} ${k} failure" + done >> "${statefile}" + echo "#### Successful builds for kernels: ${succeeded}"; + if [ "x${skipped}" != "x" ]; then + echo "#### Skipped kernels: ${skipped}"; + fi + if [ "x${soft_failed}" != "x" ]; then + echo "#### Skipped failed kernels: ${soft_failed}"; + fi if [ "x${failed}" != "x" ]; then echo "#### Failed kernels: ${failed}"; exit 1 fi - if [ "x${skipped}" != "x" ]; then - echo "#### Skipped kernels: ${skipped}"; - fi - echo "#### Successful builds for kernels: ${succeeded}"; + - name: Publish state + if: success() || failure() + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.name }} + path: buildstate.txt + + make_badges: + if: always() + needs: kmod-compile + runs-on: ubuntu-latest + steps: + - name: Checkout WIKI repository + uses: actions/checkout@v4 + with: + repository: v4l2loopback/v4l2loopback.wiki.git + ref: master + token: ${{ secrets.PUSH2REPO_TOKEN }} + - name: Get status artifacts + uses: actions/download-artifact@v4 + - name: Create badge + id: createbadge + shell: bash + run: | + badge=build-state.svg + echo "badge=${badge}" >> ${GITHUB_OUTPUT} + find */ -type f -name "buildstate.txt" -exec grep -h . {} + | sort -uf > allstates.txt + cat -n allstates.txt + numtests=$(grep -c . allstates.txt) + echo -n > "${badge}" + echo '<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" width="333" height="@height@">' | sed -e "s|@height@|$((numtests*22))|g">> "${badge}" + echo '<style>.success {fill:#4C1} .skip {fill:#D3D3D3} .softfail {fill:#FE7D37} .failure {fill:#E05D44}</style> <g fill="#fff" text-anchor="left" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> <linearGradient id="b" x2="0" y2="100%"> <stop offset="0" stop-color="#bbb" stop-opacity=".1"/> <stop offset="1" stop-opacity=".1"/> </linearGradient>' | sed -e "s|@height@|$((numtests * 22))|g" >> "${badge}" + cat -n allstates.txt | while read num os _ version kernel state; do + dy=$(((num-1)*22)) + echo '<g transform="translate(0 @dy@)" mask="url(#anybadge_1)"> <path fill="#555" d="M0 0h148v20H0z"/> <path class="@state@" d="M148 0h185v20H148z"/> <path fill="url(#b)" d="M0 0h333v20H0z"/> <text x="9.0" y="15" fill="#010101" fill-opacity=".3">@os@/@version@</text> <text x="8.0" y="14">@os@/@version@</text> <text x="156.5" y="15" fill="#010101" fill-opacity=".3">@kernel@</text> <text x="155.5" y="14">@kernel@</text> </g>' | sed -e "s|@dy@|${dy}|g" -e "s|@state@|${state}|g" -e "s|@os@|${os}|g" -e "s|@version@|${version}|g" -e "s|@kernel@|${kernel}|g" + done >> "${badge}" + echo '</g> </svg>' >> "${badge}" + cat "${badge}" + - name: Deploy badge to wiki + if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' + env: + badge: ${{ steps.createbadge.outputs.badge }} + run: | + echo "${badge}" + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add "${badge}" + git commit -m "Update build-state.svg for ${{ github.sha }}" + git push diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/.pre-commit-config.yaml new/v4l2loopback-0.15.0/.pre-commit-config.yaml --- old/v4l2loopback-0.14.0/.pre-commit-config.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/v4l2loopback-0.15.0/.pre-commit-config.yaml 2025-05-27 23:11:33.000000000 +0200 @@ -0,0 +1,6 @@ +--- +repos: +- repo: https://github.com/pre-commit/mirrors-clang-format + rev: v20.1.0 + hooks: + - id: clang-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/ChangeLog new/v4l2loopback-0.15.0/ChangeLog --- old/v4l2loopback-0.14.0/ChangeLog 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/ChangeLog 2025-05-27 23:11:33.000000000 +0200 @@ -1,3 +1,28 @@ +v4l2loopback (0.15.0) unstable; urgency=medium + + [ IOhannes m zmölnig ] + * change public ioctl numbers! + * add V4L2LOOPBACK_CTL_VERSION ioctl + + * use fixed-size types in public API + * order ioctl's by value + * v4l2loopback-ctl: (also) query the module version via ioctl + * [meta] pre-commit config to automatically run clang-format before committing + * only use `timer_delete_sync` compat macro for linux<6.2.0 + * [github] build on ArchLinux, Fedora, openSUSE + * [github] Create a badge with all kernels tested in the CI + * [github] note on "exact" v4l2loopback version in issue template + * README Replace 'Skype' with 'Zoom' + * DKMS: dummy 'clean' rule + + [ Theodore Chiu ] + * added functionality for linux 6.15+ (#626) + + [ Andreas Beckmann ] + * dkms.conf updates + + -- IOhannes m zmölnig (Debian/GNU) <umlae...@debian.org> Tue, 27 May 2025 22:46:46 +0200 + v4l2loopback (0.14.0) unstable; urgency=medium [ IOhannes m zmölnig ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/NEWS new/v4l2loopback-0.15.0/NEWS --- old/v4l2loopback-0.14.0/NEWS 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/NEWS 2025-05-27 23:11:33.000000000 +0200 @@ -1,3 +1,26 @@ +v4l2loopback (0.15.0) unstable; urgency=medium + + * Change public ioctl numbers! + + But retain compatibility + * Add V4L2LOOPBACK_CTL_VERSION ioctl + * Only use `timer_delete_sync` compat macro for linux<6.2.0 + * Added functionality for linux 6.15+ + * dkms.conf updates + + -- IOhannes m zmölnig (Debian/GNU) <umlae...@debian.org> Tue, 27 May 2025 22:46:46 +0200 + +v4l2loopback (0.14.0) unstable; urgency=medium + + * Refactor poll() + * Fix FIFO management + * V4L2 UAPI compliance in format negotation and stream activation + * Do not discard return value of vm_alloc_page + * Use atomic operations to count vm_open/close + * Simplify loop preparation cases in mmap() + * Code cleanup + + -- IOhannes m zmölnig (Debian/GNU) <umlae...@debian.org> Fri, 28 Feb 2025 09:48:06 +0100 + v4l2loopback-0.13.2 * V4L2 UAPI compliance in format negotation and stream activation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/README.md new/v4l2loopback-0.15.0/README.md --- old/v4l2loopback-0.14.0/README.md 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/README.md 2025-05-27 23:11:33.000000000 +0200 @@ -6,7 +6,7 @@ video devices, but the video will not be read from e.g. a capture card but instead it is generated by another application. This allows you for instance to apply some nifty video effects on your -Skype video... +Zoom video call... It also allows some more serious things (e.g. I've been using it to add streaming capabilities to an application by the means of hooking GStreamer into the loopback devices). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/dkms.conf new/v4l2loopback-0.15.0/dkms.conf --- old/v4l2loopback-0.14.0/dkms.conf 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/dkms.conf 2025-05-27 23:11:33.000000000 +0200 @@ -1,5 +1,8 @@ PACKAGE_NAME="v4l2loopback" -PACKAGE_VERSION="0.14.0" +PACKAGE_VERSION="0.15.0" + +# V4L2_COLORSPACE_DCI_P3 +BUILD_EXCLUSIVE_KERNEL_MIN="4.4" if [ -f $kernel_source_dir/.config ]; then . $kernel_source_dir/.config @@ -17,7 +20,7 @@ # Items below here should not have to change with each driver version MAKE[0]="make KERNEL_DIR=${kernel_source_dir} v4l2loopback" -CLEAN="make clean" +CLEAN=true BUILT_MODULE_NAME[0]="$PACKAGE_NAME" DEST_MODULE_LOCATION[0]="/extra" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/utils/v4l2loopback-ctl.c new/v4l2loopback-0.15.0/utils/v4l2loopback-ctl.c --- old/v4l2loopback-0.14.0/utils/v4l2loopback-ctl.c 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/utils/v4l2loopback-ctl.c 2025-05-27 23:11:33.000000000 +0200 @@ -1551,7 +1551,19 @@ if (len > 0) { if (len < sizeof(buf)) buf[len] = 0; - printf("v4l2loopback module v%s", buf); + printf("v4l2loopback sysfs v%s", buf); + } + close(fd); + } + fd = open_controldevice(); + if (fd >= 0) { + __u32 version = 0; + if (ioctl(fd, V4L2LOOPBACK_CTL_VERSION, &version) == + 0) { + printf("v4l2loopback module v%d.%d.%d\n", + (version >> 16) & 0xff, + (version >> 8) & 0xff, + (version >> 0) & 0xff); } } break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/v4l2loopback.c new/v4l2loopback-0.15.0/v4l2loopback.c --- old/v4l2loopback-0.14.0/v4l2loopback.c 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/v4l2loopback.c 2025-05-27 23:11:33.000000000 +0200 @@ -33,6 +33,10 @@ #include <linux/miscdevice.h> #include "v4l2loopback.h" +#define V4L2LOOPBACK_CTL_ADD_legacy 0x4C80 +#define V4L2LOOPBACK_CTL_REMOVE_legacy 0x4C81 +#define V4L2LOOPBACK_CTL_QUERY_legacy 0x4C82 + #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) #error This module is not supported on kernels before 4.0.0. #endif @@ -49,6 +53,10 @@ #define VFL_TYPE_VIDEO VFL_TYPE_GRABBER #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0) +#define timer_delete_sync del_timer_sync +#endif + #define V4L2LOOPBACK_VERSION_CODE \ KERNEL_VERSION(V4L2LOOPBACK_VERSION_MAJOR, V4L2LOOPBACK_VERSION_MINOR, \ V4L2LOOPBACK_VERSION_BUGFIX) @@ -1788,8 +1796,8 @@ static void buffer_written(struct v4l2_loopback_device *dev, struct v4l2l_buffer *buf) { - del_timer_sync(&dev->sustain_timer); - del_timer_sync(&dev->timeout_timer); + timer_delete_sync(&dev->sustain_timer); + timer_delete_sync(&dev->timeout_timer); spin_lock_bh(&dev->list_lock); list_move_tail(&buf->list_head, &dev->outbufs_list); @@ -2366,8 +2374,8 @@ } if (atomic_dec_and_test(&dev->open_count)) { - del_timer_sync(&dev->sustain_timer); - del_timer_sync(&dev->timeout_timer); + timer_delete_sync(&dev->sustain_timer); + timer_delete_sync(&dev->timeout_timer); if (!dev->keep_format) { mutex_lock(&dev->image_mutex); free_buffers(dev); @@ -2972,6 +2980,7 @@ struct v4l2_loopback_config *confptr = &conf; int device_nr, capture_nr, output_nr; int ret; + const __u32 version = V4L2LOOPBACK_VERSION_CODE; ret = mutex_lock_killable(&v4l2loopback_ctl_mutex); if (ret) @@ -2984,6 +2993,7 @@ break; /* add a v4l2loopback device (pair), based on the user-provided specs */ case V4L2LOOPBACK_CTL_ADD: + case V4L2LOOPBACK_CTL_ADD_legacy: if (parm) { if ((ret = copy_from_user(&conf, (void *)parm, sizeof(conf))) < 0) @@ -2996,7 +3006,8 @@ break; /* remove a v4l2loopback device (both capture and output) */ case V4L2LOOPBACK_CTL_REMOVE: - ret = v4l2loopback_lookup((int)parm, &dev); + case V4L2LOOPBACK_CTL_REMOVE_legacy: + ret = v4l2loopback_lookup((__u32)parm, &dev); if (ret >= 0 && dev) { ret = -EBUSY; if (dev->open_count.counter > 0) @@ -3009,6 +3020,7 @@ * this is mostly about limits (which cannot be queried directly with VIDIOC_G_FMT and friends */ case V4L2LOOPBACK_CTL_QUERY: + case V4L2LOOPBACK_CTL_QUERY_legacy: if (!parm) break; if ((ret = copy_from_user(&conf, (void *)parm, sizeof(conf))) < @@ -3059,6 +3071,15 @@ ret = -EFAULT; break; } + ret = 0; + break; + case V4L2LOOPBACK_CTL_VERSION: + if (!parm) + break; + if (copy_to_user((void *)parm, &version, sizeof(version))) { + ret = -EFAULT; + break; + } ret = 0; break; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/v4l2loopback-0.14.0/v4l2loopback.h new/v4l2loopback-0.15.0/v4l2loopback.h --- old/v4l2loopback-0.14.0/v4l2loopback.h 2025-02-28 10:40:50.000000000 +0100 +++ new/v4l2loopback-0.15.0/v4l2loopback.h 2025-05-27 23:11:33.000000000 +0200 @@ -11,7 +11,7 @@ #define _V4L2LOOPBACK_H #define V4L2LOOPBACK_VERSION_MAJOR 0 -#define V4L2LOOPBACK_VERSION_MINOR 14 +#define V4L2LOOPBACK_VERSION_MINOR 15 #define V4L2LOOPBACK_VERSION_BUGFIX 0 /* /dev/v4l2loopback interface */ @@ -32,8 +32,8 @@ * or one (and only one) of them must be -1 * */ - int output_nr; - int unused; /*capture_nr;*/ + __s32 output_nr; + __s32 unused; /*capture_nr;*/ /** * a nice name for your device @@ -45,27 +45,27 @@ * allowed frame size * if too low, default values are used */ - unsigned int min_width; - unsigned int max_width; - unsigned int min_height; - unsigned int max_height; + __u32 min_width; + __u32 max_width; + __u32 min_height; + __u32 max_height; /** * number of buffers to allocate for the queue * if set to <=0, default values are used */ - int max_buffers; + __s32 max_buffers; /** * how many consumers are allowed to open this device concurrently * if set to <=0, default values are used */ - int max_openers; + __s32 max_openers; /** * set the debugging level for this device */ - int debug; + __s32 debug; /** * whether to announce OUTPUT/CAPTURE capabilities exclusively @@ -74,9 +74,17 @@ * NOTE: this is going to be removed once separate output/capture * devices are implemented */ - int announce_all_caps; + __s32 announce_all_caps; }; +#define V4L2LOOPBACK_CTL_IOCTLMAGIC '~' + +/* a pointer to an (unsigned int) that - on success - will hold + * the version code of the v4l2loopback module + * as returned by KERNEL_VERSION(MAJOR, MINOR, BUGFIX) + */ +#define V4L2LOOPBACK_CTL_VERSION _IOR(V4L2LOOPBACK_CTL_IOCTLMAGIC, 0, __u32) + /* a pointer to a (struct v4l2_loopback_config) that has all values you wish to impose on the * to-be-created device set. * if the ptr is NULL, a new device is created with default values at the driver's discretion. @@ -84,15 +92,17 @@ * returns the device_nr of the OUTPUT device (which can be used with V4L2LOOPBACK_CTL_QUERY, * to get more information on the device) */ -#define V4L2LOOPBACK_CTL_ADD 0x4C80 +#define V4L2LOOPBACK_CTL_ADD \ + _IOW(V4L2LOOPBACK_CTL_IOCTLMAGIC, 1, struct v4l2_loopback_config) + +/* the device-number (either CAPTURE or OUTPUT) associated with the loopback-device */ +#define V4L2LOOPBACK_CTL_REMOVE _IOW(V4L2LOOPBACK_CTL_IOCTLMAGIC, 2, __u32) /* a pointer to a (struct v4l2_loopback_config) that has output_nr and/or capture_nr set * (the two values must either refer to video-devices associated with the same loopback device * or exactly one of them must be <0 */ -#define V4L2LOOPBACK_CTL_QUERY 0x4C82 - -/* the device-number (either CAPTURE or OUTPUT) associated with the loopback-device */ -#define V4L2LOOPBACK_CTL_REMOVE 0x4C81 +#define V4L2LOOPBACK_CTL_QUERY \ + _IOWR(V4L2LOOPBACK_CTL_IOCTLMAGIC, 3, struct v4l2_loopback_config) #endif /* _V4L2LOOPBACK_H */