More ARM support.

This commit is contained in:
Scott Duensing 2026-09-10 20:17:28 -05:00
parent 18bdd0a1e3
commit e3ae4eec95
1040 changed files with 331759 additions and 141 deletions

View file

@ -660,6 +660,33 @@ API Changes
written against it behaves the same here; note that library names its
sumhexa hexsum.
- The Raspberry Pi build target is now linux-aarch64 and its binary is
Singe-v3.00-Linux-aarch64. Nothing in it was ever Pi specific: the
V4L2 decoder it builds talks to any memory-to-memory device, so the
same binary serves Amlogic, Exynos, Qualcomm and other ARM64 Linux
boards whose kernel offers one. The build system now decides by
architecture, and by whether a sysroot is in use, rather than by a
platform name that stood for both. cmake/zig/piPackages.cmake is
cmake/zig/arm64Packages.cmake, and the command is
./build-all.sh linux aarch64.
- src/main.c now includes windows.h where it reads the processor name
out of the registry, which the Windows build had been failing without.
- A hardware decoded frame stays NV12 the whole way to the texture
instead of being converted to planar YUV on the CPU first. The picture
is identical: the GPU does the same conversion when it samples either
way. Measured on an RX 7900 XTX at 720x480 the difference was inside
the noise, so this is for the small ARM machines where a per-frame
conversion is worth more than it is on a desktop; it has not been
measured on one.
- Rockchip's rkmpp decoders are built and used when the Rockchip Media
Process Platform library is present, and ignored everywhere else. The
superbuild probes for rockchip_mpp with pkg-config rather than asking
for --enable-rkmpp unconditionally, which would fail every configure on
a machine without it. Untested: no Rockchip hardware here.
- The manual now says plainly that the Hypseus API is for compatibility
and not for new games, in the Lua API Reference introduction and again
at the head of the Hypseus Compatibility section. Every Hypseus name,

View file

@ -571,20 +571,20 @@ target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Platform specific system libraries.
if(KANGAROO_OS STREQUAL "linux")
# ffmpeg's vdpau hardware context is always compiled in on X11 hosts.
set(SYSTEM_LIBS -lX11 -lvdpau -ldl -rdynamic) # -rdynamic gives the crash backtrace function names
if(KANGAROO_ARCH MATCHES "^(aarch64|armhf)$")
set(SYSTEM_LIBS -ldl)
# An ARM board decodes video through its V4L2 memory-to-memory device (videoPlayer.c).
# Nothing here is particular to a Raspberry Pi: any board whose kernel offers one is served.
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE SINGE_V4L2_DECODE)
else()
# ffmpeg's vdpau hardware context is always compiled in on X11 hosts.
set(SYSTEM_LIBS -lX11 -lvdpau -ldl -rdynamic) # -rdynamic gives the crash backtrace function names
endif()
# Release binaries are stripped; the crash backtrace reads the dynamic symbols -rdynamic exports,
# which stripping keeps.
if(CMAKE_BUILD_TYPE STREQUAL "Release")
list(APPEND SYSTEM_LIBS -s)
endif()
elseif(KANGAROO_OS STREQUAL "pi")
set(SYSTEM_LIBS -ldl)
# The Pi decodes video through its V4L2 memory-to-memory device (videoPlayer.c).
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE SINGE_V4L2_DECODE)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
list(APPEND SYSTEM_LIBS -s)
endif()
elseif(KANGAROO_OS STREQUAL "macos")
set(SYSTEM_LIBS
-Wl,-framework,CoreVideo
@ -741,6 +741,17 @@ add_custom_command(
target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${guiShaderHeader})
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_BINARY_DIR}/generated)
# Rockchip's hardware decoders are reached by name (videoPlayer.c), and only exist when FFmpeg was
# built against the Rockchip MPP library. Asking FFmpeg itself is what decides it.
execute_process(COMMAND ${CMAKE_COMMAND} -E echo "" OUTPUT_QUIET)
if(EXISTS ${BUILD_DIR}/lib/pkgconfig/libavcodec.pc)
file(READ ${BUILD_DIR}/lib/pkgconfig/libavcodec.pc avcodecPc)
if(avcodecPc MATCHES "rockchip_mpp")
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE SINGE_RKMPP_DECODE)
message(STATUS "FFmpeg carries the rkmpp decoders; enabling them in the player")
endif()
endif()
# Jolt Physics comes with the compile definitions it was built with (SIMD level, layer bits) through
# its exported target; the one C++ file in the tree (physicsJolt.cpp) needs them. Its C++ runtime is
# zig's own libc++, linked statically, or the host's libstdc++ under gcc; macOS already lists -lc++.

View file

@ -54,10 +54,10 @@
}
},
{
"name": "pi-aarch64",
"displayName": "Raspberry Pi 64-bit (zig)",
"name": "linux-aarch64",
"displayName": "ARM64 Linux (zig)",
"inherits": "base",
"binaryDir": "${sourceDir}/.builddir/pi/aarch64/superbuild",
"binaryDir": "${sourceDir}/.builddir/linux/aarch64/superbuild",
"toolchainFile": "${sourceDir}/cmake/zig/aarch64-linux-gnu.cmake",
"cacheVariables": {
"SINGE_TRIPLE": "aarch64-linux-gnu",
@ -104,8 +104,8 @@
"configurePreset": "windows-x86_64"
},
{
"name": "pi-aarch64",
"configurePreset": "pi-aarch64"
"name": "linux-aarch64",
"configurePreset": "linux-aarch64"
},
{
"name": "macos-aarch64",

18
INSTALL
View file

@ -116,14 +116,18 @@ x86_64 Linux hosts; on another host, unpack a DirectX Shader Compiler
release (lib/libdxcompiler.so, lib/libdxil.so, include/dxc/dxcapi.h) at
that path yourself, or build it from source there.
The Raspberry Pi build (64-bit Raspberry Pi OS, glibc 2.31 or newer)
runs on any 64-bit Pi; 3D games need a Pi 4 or later, the Pi 3 has no
Vulkan driver and plays 2D games only. The build also uses zig. The platform headers and libraries it links against are
Debian bookworm arm64 packages listed in cmake/zig/piPackages.cmake,
fetched from snapshot.debian.org and unpacked with dpkg-deb into
The ARM64 Linux build targets any ARM64 Linux system with glibc 2.31 or
newer, the 64-bit Raspberry Pi OS among them. It is not Pi specific: the
decoder it builds talks to any V4L2 memory-to-memory device, so one binary
also serves Amlogic, Exynos, Qualcomm and other boards whose kernel offers
one, and it carries Rockchip's own decoders besides. 3D games need a Pi 4
or later; the Pi 3 has no Vulkan driver and plays 2D games only. The build
uses zig. The platform headers and libraries it links against are Debian
bookworm arm64 packages listed in cmake/zig/arm64Packages.cmake, fetched
from snapshot.debian.org and unpacked with dpkg-deb into
.builddir/toolchains/sysroot-aarch64-linux-gnu on first use:
./build-all.sh pi aarch64
./build-all.sh linux aarch64
Useful forms (anything after the platform goes to cmake --build):
@ -134,5 +138,5 @@ Without the wrapper:
cmake --preset linux-x86_64 && cmake --build --preset linux-x86_64
Presets: linux-x86_64, linux-x86_64-gcc, windows-x86_64, pi-aarch64,
Presets: linux-x86_64, linux-x86_64-gcc, windows-x86_64, linux-aarch64,
macos-aarch64 (CMakePresets.json).

View file

@ -222,6 +222,6 @@ if [[ $# -ge 2 ]]; then
else
buildAll linux x86_64 2>&1 | tee ${G_BUILDDIR}/linux-x86_64.log
buildAll macos universal 2>&1 | tee ${G_BUILDDIR}/macos-universal.log
buildAll pi aarch64 2>&1 | tee ${G_BUILDDIR}/pi-aarch64.log
buildAll linux aarch64 2>&1 | tee ${G_BUILDDIR}/linux-aarch64.log
buildAll windows x86_64 2>&1 | tee ${G_BUILDDIR}/windows-x86_64.log
fi

View file

@ -78,10 +78,12 @@ if(CMAKE_SYSROOT)
endif()
set(SB_CFLAGS "-I${SB_PREFIX}/include ${SB_CFLAGS_BASE}")
set(SB_PKG_CONFIG_LIBDIR "${SB_PREFIX}/lib/pkgconfig")
if(KANGAROO_OS STREQUAL "linux")
set(SB_PKG_CONFIG_LIBDIR "${SB_PKG_CONFIG_LIBDIR}:/usr/lib/${SINGE_TRIPLE}/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig")
elseif(KANGAROO_OS STREQUAL "pi")
# A cross build looks inside its sysroot; a build for this machine looks at this machine. The
# sysroot is what tells them apart, not the platform's name.
if(SINGE_SYSROOT)
set(SB_PKG_CONFIG_LIBDIR "${SB_PKG_CONFIG_LIBDIR}:${SINGE_SYSROOT}/usr/lib/${SINGE_TRIPLE}/pkgconfig:${SINGE_SYSROOT}/usr/lib/pkgconfig:${SINGE_SYSROOT}/usr/share/pkgconfig")
elseif(KANGAROO_OS STREQUAL "linux")
set(SB_PKG_CONFIG_LIBDIR "${SB_PKG_CONFIG_LIBDIR}:/usr/lib/${SINGE_TRIPLE}/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig")
elseif(DEFINED ENV{PKG_CONFIG_LIBDIR})
set(SB_PKG_CONFIG_LIBDIR "${SB_PKG_CONFIG_LIBDIR}:$ENV{PKG_CONFIG_LIBDIR}")
endif()
@ -103,7 +105,7 @@ function(singeStepEnv outVar cflags)
if(CMAKE_AR)
list(APPEND env "AR=${CMAKE_AR}")
endif()
if(KANGAROO_OS STREQUAL "pi")
if(SINGE_SYSROOT)
list(APPEND env "PKG_CONFIG_SYSROOT_DIR=${SINGE_SYSROOT}")
endif()
set(${outVar} ${env} PARENT_SCOPE)
@ -236,11 +238,15 @@ if(KANGAROO_OS STREQUAL "windows")
else()
set(opensslTarget mingw64)
endif()
elseif(KANGAROO_OS STREQUAL "pi")
elseif(KANGAROO_OS STREQUAL "linux")
if(KANGAROO_ARCH STREQUAL "aarch64")
set(opensslTarget linux-aarch64)
else()
elseif(KANGAROO_ARCH STREQUAL "armhf")
set(opensslTarget linux-armv4)
elseif(SINGE_ZIG_TARGET)
set(opensslTarget linux-x86_64)
else()
set(opensslTarget "")
endif()
elseif(KANGAROO_OS STREQUAL "macos")
if(KANGAROO_ARCH STREQUAL "aarch64")
@ -278,10 +284,50 @@ singeRebuildTarget(openssl)
# ===== FFmpeg (hardware decoding per platform; CMakeLists.txt reads its .pc files back) =====
# ===== Rockchip Media Process Platform (the vendor decode library for Rockchip SoCs) =====
# Rockchip's decoders are aarch64 only. Because the library links statically it costs nothing on a
# board that is not a Rockchip, so it is built for the aarch64 targets rather than needing one of
# its own; set SINGE_ROCKCHIP_MPP to override either way.
if(NOT DEFINED SINGE_ROCKCHIP_MPP)
if((KANGAROO_OS STREQUAL "linux") AND (KANGAROO_ARCH STREQUAL "aarch64"))
set(SINGE_ROCKCHIP_MPP ON)
else()
set(SINGE_ROCKCHIP_MPP OFF)
endif()
endif()
# MPP is packaged by no distribution, so it is vendored and built here like everything else. Only
# the static library is kept: linked statically the Singe binary carries no runtime dependency on
# it, so one ARM build runs on a Rockchip board and on anything else, where the decoder simply fails
# to open a device and the player falls back. A shared build would put librockchip_mpp.so in the
# binary's DT_NEEDED and stop it starting anywhere the library is absent.
set(rkmppFlag "")
set(rkmppDep "")
if(SINGE_ROCKCHIP_MPP)
# MPP strips its merged archive with ${CMAKE_STRIP}, and no cross strip here understands an ar
# archive: zig's objcopy is ELF only. The step only drops debug symbols from an intermediate
# library, so it is skipped; the release binary is stripped at its own link.
singeCmakeProject(rockchipMpp ${SB_THIRDPARTY}/rockchip-mpp "" "-DBUILD_SHARED_LIBS=OFF;-DBUILD_TEST=OFF;-DHAVE_DRM=ON;-DCMAKE_STRIP=/bin/true" "${SB_ENV}")
# Its install puts both the archive and the shared object down; the shared one is removed so
# that -lrockchip_mpp can only resolve to the archive.
ExternalProject_Add_Step(rockchipMpp staticOnly
COMMAND ${CMAKE_COMMAND} -E rm -f ${SB_PREFIX}/lib/librockchip_mpp.so ${SB_PREFIX}/lib/librockchip_mpp.so.0 ${SB_PREFIX}/lib/librockchip_mpp.so.1 ${SB_PREFIX}/lib/librockchip_vpu.so ${SB_PREFIX}/lib/librockchip_vpu.so.0 ${SB_PREFIX}/lib/librockchip_vpu.so.1
DEPENDEES install
COMMENT "Keeping only the static Rockchip MPP library"
)
set(rkmppFlag --enable-rkmpp)
set(rkmppDep rockchipMpp)
message(STATUS "Rockchip MPP will be built and linked statically; the rkmpp decoders are enabled")
endif()
if(KANGAROO_OS STREQUAL "linux")
set(hwaccel --enable-vaapi --enable-vdpau --enable-libdrm)
elseif(KANGAROO_OS STREQUAL "pi")
set(hwaccel --enable-v4l2-m2m --enable-libdrm)
# ARM boards decode through a V4L2 memory-to-memory device; desktops have VAAPI or VDPAU.
if(KANGAROO_ARCH MATCHES "^(aarch64|armhf)$")
set(hwaccel --enable-v4l2-m2m --enable-libdrm ${rkmppFlag})
else()
set(hwaccel --enable-vaapi --enable-vdpau --enable-libdrm ${rkmppFlag})
endif()
elseif(KANGAROO_OS STREQUAL "macos")
set(hwaccel --enable-videotoolbox)
elseif(KANGAROO_OS STREQUAL "windows")
@ -309,13 +355,14 @@ else()
endif()
# FFmpeg's configure sees sys/sysctl.h in the Pi sysroot and in zig's glibc header set, then its
# build cannot include it; an empty stand-in satisfies both (Linux uses sysconf, not sysctl).
if((KANGAROO_OS STREQUAL "pi") OR ((KANGAROO_OS STREQUAL "linux") AND SINGE_ZIG_TARGET))
if((KANGAROO_OS STREQUAL "linux") AND SINGE_ZIG_TARGET)
file(WRITE ${SB_PREFIX}/include/sys/sysctl.h "/* File no longer used */\n")
endif()
set(ffmpegBinary ${SB_PREFIX}/build/ffmpeg)
ExternalProject_Add(ffmpeg
SOURCE_DIR ${SB_THIRDPARTY}/ffmpeg
BINARY_DIR ${ffmpegBinary}
DEPENDS ${rkmppDep}
CONFIGURE_COMMAND ${SB_ENV} ${SB_THIRDPARTY}/ffmpeg/configure --enable-static --disable-shared --disable-debug --disable-muxers ${hwaccel} --disable-encoders --disable-filters --disable-network --disable-devices --disable-vulkan --disable-d3d12va --disable-bzlib --disable-lzma --disable-doc --disable-programs --enable-gpl --enable-version3 --extra-ldflags=-L${SB_PREFIX}/lib --prefix=${SB_PREFIX} --arch=${KANGAROO_ARCH} --target-os=${SINGE_CROSS_OS} ${ffmpegTools}
BUILD_COMMAND ${SB_ENV} make
INSTALL_COMMAND ${SB_ENV} make install

View file

@ -20,11 +20,11 @@
# Raspberry Pi (64-bit Raspberry Pi OS) with zig as the compiler. zig supplies glibc pinned to the
# version below plus the kernel headers; the platform libraries Singe, SDL3 and FFmpeg build against
# (libdrm, ALSA, X11, GBM/EGL/GLES, udev, ...) come from the Debian packages listed in
# piPackages.cmake, downloaded and unpacked into a sysroot under .builddir/toolchains on first use.
# arm64Packages.cmake, downloaded and unpacked into a sysroot under .builddir/toolchains on first use.
# Nothing outside the source tree is touched; dpkg-deb from the host does the unpacking.
include(${CMAKE_CURRENT_LIST_DIR}/zig.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/piPackages.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/arm64Packages.cmake)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
@ -32,32 +32,32 @@ set(CMAKE_SYSTEM_PROCESSOR aarch64)
# Raspberry Pi OS bullseye shipped glibc 2.31; a binary built against it runs there and on everything since.
set(SINGE_GLIBC_VERSION 2.31)
get_filename_component(piToolchains ${CMAKE_CURRENT_LIST_DIR}/../../.builddir/toolchains ABSOLUTE)
set(SINGE_SYSROOT ${piToolchains}/sysroot-aarch64-linux-gnu CACHE PATH "Pi platform headers and libraries" FORCE)
set(piDebs ${piToolchains}/debs-aarch64-linux-gnu)
set(piStamp ${SINGE_SYSROOT}/.complete)
get_filename_component(armToolchains ${CMAKE_CURRENT_LIST_DIR}/../../.builddir/toolchains ABSOLUTE)
set(SINGE_SYSROOT ${armToolchains}/sysroot-aarch64-linux-gnu CACHE PATH "ARM64 platform headers and libraries" FORCE)
set(armDebs ${armToolchains}/debs-aarch64-linux-gnu)
set(armStamp ${SINGE_SYSROOT}/.complete)
# The stamp holds the manifest that built the sysroot; a changed manifest rebuilds it.
string(SHA256 piManifest "${piPackages}")
string(SHA256 arm64Manifest "${arm64Packages}")
set(piHave "")
if(EXISTS ${piStamp})
file(READ ${piStamp} piHave)
if(EXISTS ${armStamp})
file(READ ${armStamp} piHave)
string(STRIP "${piHave}" piHave)
endif()
if(NOT piHave STREQUAL piManifest)
if(NOT piHave STREQUAL arm64Manifest)
find_program(SINGE_DPKG_DEB dpkg-deb)
if(NOT SINGE_DPKG_DEB)
message(FATAL_ERROR "dpkg-deb is needed to unpack the Pi sysroot packages (apt-get install dpkg).")
endif()
message(STATUS "Building the Pi sysroot in ${SINGE_SYSROOT}")
message(STATUS "Building the ARM64 sysroot in ${SINGE_SYSROOT}")
file(REMOVE_RECURSE ${SINGE_SYSROOT})
file(MAKE_DIRECTORY ${SINGE_SYSROOT} ${piDebs})
foreach(entry IN LISTS piPackages)
file(MAKE_DIRECTORY ${SINGE_SYSROOT} ${armDebs})
foreach(entry IN LISTS arm64Packages)
string(REGEX MATCH "^([^|]*)\\|(.*)$" unused "${entry}")
set(url ${CMAKE_MATCH_1})
set(sha ${CMAKE_MATCH_2})
get_filename_component(deb ${url} NAME)
set(debPath ${piDebs}/${deb})
set(debPath ${armDebs}/${deb})
if(NOT EXISTS ${debPath})
message(STATUS "Downloading ${deb}")
file(DOWNLOAD ${url} ${debPath} EXPECTED_HASH SHA256=${sha} STATUS status)
@ -72,13 +72,13 @@ if(NOT piHave STREQUAL piManifest)
message(FATAL_ERROR "Unpacking ${deb} failed.")
endif()
endforeach()
file(WRITE ${piStamp} "${piManifest}\n")
file(WRITE ${armStamp} "${arm64Manifest}\n")
endif()
# The sysroot's headers come after zig's own; its libraries are linked by name and left unresolved
# at link time (they are only stubs for what the Pi provides at run time).
set(piLibs ${SINGE_SYSROOT}/usr/lib/aarch64-linux-gnu)
singeZigToolchain(aarch64-linux-gnu.${SINGE_GLIBC_VERSION} "-idirafter ${SINGE_SYSROOT}/usr/include/aarch64-linux-gnu -idirafter ${SINGE_SYSROOT}/usr/include -L${piLibs} -L${SINGE_SYSROOT}/lib/aarch64-linux-gnu -Wl,--allow-shlib-undefined")
set(armLibs ${SINGE_SYSROOT}/usr/lib/aarch64-linux-gnu)
singeZigToolchain(aarch64-linux-gnu.${SINGE_GLIBC_VERSION} "-idirafter ${SINGE_SYSROOT}/usr/include/aarch64-linux-gnu -idirafter ${SINGE_SYSROOT}/usr/include -L${armLibs} -L${SINGE_SYSROOT}/lib/aarch64-linux-gnu -Wl,--allow-shlib-undefined")
# find_package and pkg-config look only in the sysroot; programs come from the host.
set(CMAKE_FIND_ROOT_PATH ${SINGE_SYSROOT})
@ -88,6 +88,6 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu CACHE STRING "" FORCE)
set(CMAKE_C_LIBRARY_ARCHITECTURE aarch64-linux-gnu CACHE STRING "" FORCE)
set(CMAKE_LIBRARY_PATH ${piLibs} CACHE PATH "" FORCE)
set(KANGAROO_OS pi)
set(CMAKE_LIBRARY_PATH ${armLibs} CACHE PATH "" FORCE)
set(KANGAROO_OS linux)
set(KANGAROO_ARCH aarch64)

View file

@ -0,0 +1,78 @@
# Debian bookworm arm64 packages that give the Pi build its platform headers and stub libraries
# (libdrm, ALSA, X11, GBM/EGL/GLES, udev, dbus, Wayland, PulseAudio). zig supplies libc and the
# kernel headers itself, so no libc6 package is here. Every line is a permanent snapshot.debian.org
# URL and the SHA-256 Debian publishes for it; regenerate against a newer snapshot when needed.
# Format: one "url|sha256" pair per list element.
set(arm64PackagesSnapshot "https://snapshot.debian.org/archive/debian/20250901T000000Z")
set(arm64Packages
"${arm64PackagesSnapshot}/pool/main/libd/libdrm/libdrm-dev_2.4.114-1+b1_arm64.deb|26d7d0dcbbda8ed023b57989e0fca7f0ff8372daaf654daf8b3a362557be5e21"
"${arm64PackagesSnapshot}/pool/main/libd/libdrm/libdrm2_2.4.114-1+b1_arm64.deb|f5f15a46d02cf5d9fa52d4f1c54b8cf80c398711ad771a9938b12399b8d8090c"
"${arm64PackagesSnapshot}/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.114-1+b1_arm64.deb|24692e933b98b2b8b80d87c45728efa2bc7176120ce9efcb8793407e508b5a32"
"${arm64PackagesSnapshot}/pool/main/libd/libdrm/libdrm-nouveau2_2.4.114-1+b1_arm64.deb|2acf0db609e8569dd89eea5f3e6f27968de50474d31213665901ad1c6d1133de"
"${arm64PackagesSnapshot}/pool/main/libd/libdrm/libdrm-radeon1_2.4.114-1+b1_arm64.deb|e53c2b4be53b4a8e6413887525c9172bdc95ed3a140a52ce23d6e1a68789aaa0"
"${arm64PackagesSnapshot}/pool/main/a/alsa-lib/libasound2-dev_1.2.8-1+b1_arm64.deb|263668e5ce831d3a8426bd342beba7e94925e893a4a5a285252b8f3ed6b3f5ee"
"${arm64PackagesSnapshot}/pool/main/a/alsa-lib/libasound2_1.2.8-1+b1_arm64.deb|9fa889400fcee4b92c8f4a2fafbb7f2cd33444d9ec1665a71002ab67c06114bb"
"${arm64PackagesSnapshot}/pool/main/a/alsa-lib/libasound2-data_1.2.8-1_all.deb|fe0780d2d3674b2977e0acb0d48b448ad72ba1642564b7dc537f55e839984c2d"
"${arm64PackagesSnapshot}/pool/main/libx/libx11/libx11-dev_1.8.4-2+deb12u2_arm64.deb|34bfc833561de983cfb4475523fedc13abb4faee14a876300de659591779add8"
"${arm64PackagesSnapshot}/pool/main/libx/libx11/libx11-6_1.8.4-2+deb12u2_arm64.deb|d1d533e983582282a9ea82c87ac5ce715a9b67bd6d1acbd2439a11c63c36549b"
"${arm64PackagesSnapshot}/pool/main/libx/libxcb/libxcb1-dev_1.15-1_arm64.deb|87b5c3f1bb130727df68295ecfaadc305ee10c150afeb1a183e95b9150e18db5"
"${arm64PackagesSnapshot}/pool/main/libx/libxcb/libxcb1_1.15-1_arm64.deb|041d9a68415c3ccf3ce8f4f8b88e4bbfb5dc1f0d97013c6ef8423e620ea50f84"
"${arm64PackagesSnapshot}/pool/main/libx/libxau/libxau-dev_1.0.9-1_arm64.deb|21db3761a8f388fc83707c00fac645d4332737a859dd727571e1e6ede003b048"
"${arm64PackagesSnapshot}/pool/main/libx/libxau/libxau6_1.0.9-1_arm64.deb|36c2bf400641a80521093771dc2562c903df4065f9eb03add50d90564337ea6c"
"${arm64PackagesSnapshot}/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_arm64.deb|6fd0bc51f3a4e6b7f944f24f15524a4c4ba68a4b0aa136c18bdb96a2d36988f2"
"${arm64PackagesSnapshot}/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_arm64.deb|e92569ac33247261aa09adfadc34ced3994ac301cf8b58de415a2d5dbf15ccfc"
"${arm64PackagesSnapshot}/pool/main/x/xorgproto/x11proto-dev_2022.1-1_all.deb|3cab66a6591774188a568f9b54c4e7956f18da76e0e0fc4a779db5f6bcc3f148"
"${arm64PackagesSnapshot}/pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb|168345058319094e475a87ace66f5fb6ae802109650ea8434d672117982b5d0a"
"${arm64PackagesSnapshot}/pool/main/libx/libxext/libxext-dev_1.3.4-1+b1_arm64.deb|07f5e3efeba9564071885b2d0d2ba277692fa309a9f05ef862688af0022b1fcf"
"${arm64PackagesSnapshot}/pool/main/libx/libxext/libxext6_1.3.4-1+b1_arm64.deb|5e9c0ad606eb4674c645fe8e0e64330c47d2729f7a59ed569848610efd5d5b62"
"${arm64PackagesSnapshot}/pool/main/libx/libxi/libxi-dev_1.8-1+b1_arm64.deb|4a5e7bc3b4e55c23281b2e500b572a61ae8869b1bc03fe14b4ae5a4c9e3c295c"
"${arm64PackagesSnapshot}/pool/main/libx/libxi/libxi6_1.8-1+b1_arm64.deb|b26383c9929d8bfba051eee22301e064d17039ed022bbf31990feb0d7a03b36c"
"${arm64PackagesSnapshot}/pool/main/libx/libxfixes/libxfixes-dev_6.0.0-2_arm64.deb|25266e1bd10c7624210abf3aa3eb85e3886b6c8c08b2ecc396b8a04f24c10082"
"${arm64PackagesSnapshot}/pool/main/libx/libxfixes/libxfixes3_6.0.0-2_arm64.deb|d47bda8fed01b19b41d503e2df05d9166c58e30e2376f2f8784ceb7a834befe6"
"${arm64PackagesSnapshot}/pool/main/libx/libxrandr/libxrandr-dev_1.5.2-2+b1_arm64.deb|f951a3813c525bc950e21e801837dfe447bdbef4d2610eddbd833d7d41f92c7c"
"${arm64PackagesSnapshot}/pool/main/libx/libxrandr/libxrandr2_1.5.2-2+b1_arm64.deb|f0bc7f79fee182caae176652fdb1bf349d13b9591b10ad4dc1c896521da8e49f"
"${arm64PackagesSnapshot}/pool/main/libx/libxrender/libxrender-dev_0.9.10-1.1_arm64.deb|26a3ef50910cae3422c20af90a4a4deb85e7da3680c9192e50efc01b7e1b2f8f"
"${arm64PackagesSnapshot}/pool/main/libx/libxrender/libxrender1_0.9.10-1.1_arm64.deb|f260193deb4eaf0b410a1c61e1f84804366ee3372b8bad9f38005f7dbcd89aae"
"${arm64PackagesSnapshot}/pool/main/libx/libxcursor/libxcursor-dev_1.2.1-1_arm64.deb|5d0a0e62fcb202d9afc08c95d6b44e28211e63a6f0763e05741561ac2580aaa1"
"${arm64PackagesSnapshot}/pool/main/libx/libxcursor/libxcursor1_1.2.1-1_arm64.deb|a93dd172bdd940de4ac6fd2b7a3f0213604c975f9f2f51eb3013f50886aaa87c"
"${arm64PackagesSnapshot}/pool/main/libx/libxtst/libxtst-dev_1.2.3-1.1_arm64.deb|4e205710dd04f9e9ee360da0161c155be01086e36462fead392b707b3857b4f2"
"${arm64PackagesSnapshot}/pool/main/libx/libxtst/libxtst6_1.2.3-1.1_arm64.deb|ef2a1b9ac3f2620d96e17744e41c4eefb7f491eee3bcc5bc1e592180b2d94128"
"${arm64PackagesSnapshot}/pool/main/libx/libxss/libxss-dev_1.2.3-1_arm64.deb|970b39c57df5c1307f905c6dd89967d548e9e2711a2099241de7b8e8831e40ca"
"${arm64PackagesSnapshot}/pool/main/libx/libxss/libxss1_1.2.3-1_arm64.deb|e0ff80e309eacda5face68b9a3bd56718fed2750af429324c35d7c9491c335f4"
"${arm64PackagesSnapshot}/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-3_arm64.deb|64c758aef152615d99bceead07c86b03f3737dca190230b5dde1d79403288341"
"${arm64PackagesSnapshot}/pool/main/libx/libxinerama/libxinerama1_1.1.4-3_arm64.deb|1dc5f458f6b3245b1b128897f905717d3cf7777a5697577b246042e25311d0df"
"${arm64PackagesSnapshot}/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.5.0-1_arm64.deb|7d39b34b202fe58e18992b439c79c149ebb1b821b58dfb863ff4898e06420699"
"${arm64PackagesSnapshot}/pool/main/libx/libxkbcommon/libxkbcommon0_1.5.0-1_arm64.deb|ec518d8a19796a399ab95e7bc4dfbb6bd2ed8e151f77b222df26208db412d852"
"${arm64PackagesSnapshot}/pool/main/m/mesa/libgbm-dev_22.3.6-1+deb12u1_arm64.deb|ba3f413f6f428b45e21d93fc5eb213bbc31ca1c15a7b265da3700100fd2475c8"
"${arm64PackagesSnapshot}/pool/main/m/mesa/libgbm1_22.3.6-1+deb12u1_arm64.deb|c76790e11aac46e328b6a13b34cccd3ef01fad79cfe80d2c4aa2384ac9ddb1f8"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libegl-dev_1.6.0-1_arm64.deb|8a3004f892785a5fa4c9f969c116f567a36d1c8e9b3d5fd0403055151e36c7d3"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libegl1_1.6.0-1_arm64.deb|707097a275155c600e2e9251c4ee7cdfdb2d8f50a678a850a2526a7bc9664166"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libgles-dev_1.6.0-1_arm64.deb|941e9963d64479544691f7183fe0eeae32b53b633df71c4c51263517ab2ea8f3"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libgles2_1.6.0-1_arm64.deb|efeb2717380f8411d66b3f669bb99bbd83ff09db3d4a1661533aa31af659608c"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libgl-dev_1.6.0-1_arm64.deb|56add9e710c072cf56504beed50a639f9f7c64f4e31e66958fa65a566084888c"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libgl1_1.6.0-1_arm64.deb|f4043ab47f52325973d2b608514b3469b055b65c744861c7f378755a32e799d6"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libglvnd-dev_1.6.0-1_arm64.deb|86cba4e243d10ae07cc6e769f23ecd097b2f87b722dc5ac48a48a3794cd29513"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libglvnd0_1.6.0-1_arm64.deb|d5063205fab5322ee686f33f87c6315b3fcd1335ea4e7bc8202b48ed4f9c9e83"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libglx-dev_1.6.0-1_arm64.deb|f3d6fca16c259743208df6f845aee3189eb54fed00e159811135089c16d0ad9c"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libglx0_1.6.0-1_arm64.deb|523f9b71f75e48ae605d8ef298a4b03ade26ade9a808a85329a3bd82a54b9b0d"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libopengl0_1.6.0-1_arm64.deb|4b3c6b3bc25530290cf231acac4c85b8806dda53ab6376ab22b3ec511b4fb7a0"
"${arm64PackagesSnapshot}/pool/main/libg/libglvnd/libopengl-dev_1.6.0-1_arm64.deb|b4ddc2d38103e9f0c3637d46334ccbf40c30e851c85f5348abc0aa37e3926822"
"${arm64PackagesSnapshot}/pool/main/s/systemd/libudev-dev_252.36-1~deb12u1_arm64.deb|62760a9e8fb87c2827333163efadc36c5ae66be59af18e7286d19813b8a72e03"
"${arm64PackagesSnapshot}/pool/main/s/systemd/libudev1_252.36-1~deb12u1_arm64.deb|5abfa6d6960f1b6a19c3d35373958d47a3a2f1221a5fe4652143fea0e0adc2ab"
"${arm64PackagesSnapshot}/pool/main/d/dbus/libdbus-1-dev_1.14.10-1~deb12u1_arm64.deb|817caa440feee88d53dd74432ce633af8d351552cd71014bcc8c98380c9ed88c"
"${arm64PackagesSnapshot}/pool/main/d/dbus/libdbus-1-3_1.14.10-1~deb12u1_arm64.deb|2a423794f44ee756f70fda67c6e47b15afe3dd22cd69e51f5d14d2ec9538f806"
"${arm64PackagesSnapshot}/pool/main/w/wayland/libwayland-dev_1.21.0-1_arm64.deb|932405c58195d299495230792e374ad304adadf3d3ffdc07eda3466b756adc33"
"${arm64PackagesSnapshot}/pool/main/w/wayland/libwayland-client0_1.21.0-1_arm64.deb|ae390cc04c2eb1de90b9a6373505b22c730ada5e72daa50c507b7f99c12faf06"
"${arm64PackagesSnapshot}/pool/main/w/wayland/libwayland-egl1_1.21.0-1_arm64.deb|c08124a4d9af24f058b45c88867a84697882e755ea94965795d152fe26fe57c9"
"${arm64PackagesSnapshot}/pool/main/w/wayland/libwayland-cursor0_1.21.0-1_arm64.deb|8c8d1a3942bc3fc9dd3ea7c679c1a314e59cdaaa700883d54d1bb3ec89db256b"
"${arm64PackagesSnapshot}/pool/main/w/wayland/libwayland-server0_1.21.0-1_arm64.deb|4d99e7e0503fdaa999e67d47d8612c0465e775eafa47819573da50bdb09064f2"
"${arm64PackagesSnapshot}/pool/main/w/wayland/libwayland-bin_1.21.0-1_arm64.deb|02e9361617b43b130ff032873a910258884160c169e89a1ca45d34d1150a2615"
"${arm64PackagesSnapshot}/pool/main/libd/libdecor-0/libdecor-0-dev_0.1.1-2_arm64.deb|e52fbcbbf6e755be2c642fcecc6154d9d071978d0797e7cf9ccf93d131bf4fc6"
"${arm64PackagesSnapshot}/pool/main/libd/libdecor-0/libdecor-0-0_0.1.1-2_arm64.deb|e88d3c2dd3336a97b8cf10ef270a264388fce81cedf8032b18f2a36b021bc6a3"
"${arm64PackagesSnapshot}/pool/main/p/pulseaudio/libpulse-dev_16.1+dfsg1-2+b1_arm64.deb|dac8f94dc214a77654cc62d0f1611cd4dee9cdefdc816e3056dd9fae5aa5d4a8"
"${arm64PackagesSnapshot}/pool/main/p/pulseaudio/libpulse0_16.1+dfsg1-2+b1_arm64.deb|26f17e3457c5fce0104a6b2f0efb75a3256b24b32ca7cfda6266373758a930cb"
"${arm64PackagesSnapshot}/pool/main/w/wayland/libwayland-egl-backend-dev_1.21.0-1_arm64.deb|0974da94059371e67e93d61398853c9967d0cc34cd7745b6d47d3aa47b88815d"
"${arm64PackagesSnapshot}/pool/main/libf/libffi/libffi-dev_3.4.4-1_arm64.deb|8ff6335f76752ef8659762435d0d88129ef0090a587520853238809bd10ef392"
"${arm64PackagesSnapshot}/pool/main/libf/libffi/libffi8_3.4.4-1_arm64.deb|80b5c36177dc0e29d531c7eddbed3cc7355cb490e49f8cfa5959572d161f27b3"
)

View file

@ -1,78 +0,0 @@
# Debian bookworm arm64 packages that give the Pi build its platform headers and stub libraries
# (libdrm, ALSA, X11, GBM/EGL/GLES, udev, dbus, Wayland, PulseAudio). zig supplies libc and the
# kernel headers itself, so no libc6 package is here. Every line is a permanent snapshot.debian.org
# URL and the SHA-256 Debian publishes for it; regenerate against a newer snapshot when needed.
# Format: one "url|sha256" pair per list element.
set(piPackagesSnapshot "https://snapshot.debian.org/archive/debian/20250901T000000Z")
set(piPackages
"${piPackagesSnapshot}/pool/main/libd/libdrm/libdrm-dev_2.4.114-1+b1_arm64.deb|26d7d0dcbbda8ed023b57989e0fca7f0ff8372daaf654daf8b3a362557be5e21"
"${piPackagesSnapshot}/pool/main/libd/libdrm/libdrm2_2.4.114-1+b1_arm64.deb|f5f15a46d02cf5d9fa52d4f1c54b8cf80c398711ad771a9938b12399b8d8090c"
"${piPackagesSnapshot}/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.114-1+b1_arm64.deb|24692e933b98b2b8b80d87c45728efa2bc7176120ce9efcb8793407e508b5a32"
"${piPackagesSnapshot}/pool/main/libd/libdrm/libdrm-nouveau2_2.4.114-1+b1_arm64.deb|2acf0db609e8569dd89eea5f3e6f27968de50474d31213665901ad1c6d1133de"
"${piPackagesSnapshot}/pool/main/libd/libdrm/libdrm-radeon1_2.4.114-1+b1_arm64.deb|e53c2b4be53b4a8e6413887525c9172bdc95ed3a140a52ce23d6e1a68789aaa0"
"${piPackagesSnapshot}/pool/main/a/alsa-lib/libasound2-dev_1.2.8-1+b1_arm64.deb|263668e5ce831d3a8426bd342beba7e94925e893a4a5a285252b8f3ed6b3f5ee"
"${piPackagesSnapshot}/pool/main/a/alsa-lib/libasound2_1.2.8-1+b1_arm64.deb|9fa889400fcee4b92c8f4a2fafbb7f2cd33444d9ec1665a71002ab67c06114bb"
"${piPackagesSnapshot}/pool/main/a/alsa-lib/libasound2-data_1.2.8-1_all.deb|fe0780d2d3674b2977e0acb0d48b448ad72ba1642564b7dc537f55e839984c2d"
"${piPackagesSnapshot}/pool/main/libx/libx11/libx11-dev_1.8.4-2+deb12u2_arm64.deb|34bfc833561de983cfb4475523fedc13abb4faee14a876300de659591779add8"
"${piPackagesSnapshot}/pool/main/libx/libx11/libx11-6_1.8.4-2+deb12u2_arm64.deb|d1d533e983582282a9ea82c87ac5ce715a9b67bd6d1acbd2439a11c63c36549b"
"${piPackagesSnapshot}/pool/main/libx/libxcb/libxcb1-dev_1.15-1_arm64.deb|87b5c3f1bb130727df68295ecfaadc305ee10c150afeb1a183e95b9150e18db5"
"${piPackagesSnapshot}/pool/main/libx/libxcb/libxcb1_1.15-1_arm64.deb|041d9a68415c3ccf3ce8f4f8b88e4bbfb5dc1f0d97013c6ef8423e620ea50f84"
"${piPackagesSnapshot}/pool/main/libx/libxau/libxau-dev_1.0.9-1_arm64.deb|21db3761a8f388fc83707c00fac645d4332737a859dd727571e1e6ede003b048"
"${piPackagesSnapshot}/pool/main/libx/libxau/libxau6_1.0.9-1_arm64.deb|36c2bf400641a80521093771dc2562c903df4065f9eb03add50d90564337ea6c"
"${piPackagesSnapshot}/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_arm64.deb|6fd0bc51f3a4e6b7f944f24f15524a4c4ba68a4b0aa136c18bdb96a2d36988f2"
"${piPackagesSnapshot}/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_arm64.deb|e92569ac33247261aa09adfadc34ced3994ac301cf8b58de415a2d5dbf15ccfc"
"${piPackagesSnapshot}/pool/main/x/xorgproto/x11proto-dev_2022.1-1_all.deb|3cab66a6591774188a568f9b54c4e7956f18da76e0e0fc4a779db5f6bcc3f148"
"${piPackagesSnapshot}/pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb|168345058319094e475a87ace66f5fb6ae802109650ea8434d672117982b5d0a"
"${piPackagesSnapshot}/pool/main/libx/libxext/libxext-dev_1.3.4-1+b1_arm64.deb|07f5e3efeba9564071885b2d0d2ba277692fa309a9f05ef862688af0022b1fcf"
"${piPackagesSnapshot}/pool/main/libx/libxext/libxext6_1.3.4-1+b1_arm64.deb|5e9c0ad606eb4674c645fe8e0e64330c47d2729f7a59ed569848610efd5d5b62"
"${piPackagesSnapshot}/pool/main/libx/libxi/libxi-dev_1.8-1+b1_arm64.deb|4a5e7bc3b4e55c23281b2e500b572a61ae8869b1bc03fe14b4ae5a4c9e3c295c"
"${piPackagesSnapshot}/pool/main/libx/libxi/libxi6_1.8-1+b1_arm64.deb|b26383c9929d8bfba051eee22301e064d17039ed022bbf31990feb0d7a03b36c"
"${piPackagesSnapshot}/pool/main/libx/libxfixes/libxfixes-dev_6.0.0-2_arm64.deb|25266e1bd10c7624210abf3aa3eb85e3886b6c8c08b2ecc396b8a04f24c10082"
"${piPackagesSnapshot}/pool/main/libx/libxfixes/libxfixes3_6.0.0-2_arm64.deb|d47bda8fed01b19b41d503e2df05d9166c58e30e2376f2f8784ceb7a834befe6"
"${piPackagesSnapshot}/pool/main/libx/libxrandr/libxrandr-dev_1.5.2-2+b1_arm64.deb|f951a3813c525bc950e21e801837dfe447bdbef4d2610eddbd833d7d41f92c7c"
"${piPackagesSnapshot}/pool/main/libx/libxrandr/libxrandr2_1.5.2-2+b1_arm64.deb|f0bc7f79fee182caae176652fdb1bf349d13b9591b10ad4dc1c896521da8e49f"
"${piPackagesSnapshot}/pool/main/libx/libxrender/libxrender-dev_0.9.10-1.1_arm64.deb|26a3ef50910cae3422c20af90a4a4deb85e7da3680c9192e50efc01b7e1b2f8f"
"${piPackagesSnapshot}/pool/main/libx/libxrender/libxrender1_0.9.10-1.1_arm64.deb|f260193deb4eaf0b410a1c61e1f84804366ee3372b8bad9f38005f7dbcd89aae"
"${piPackagesSnapshot}/pool/main/libx/libxcursor/libxcursor-dev_1.2.1-1_arm64.deb|5d0a0e62fcb202d9afc08c95d6b44e28211e63a6f0763e05741561ac2580aaa1"
"${piPackagesSnapshot}/pool/main/libx/libxcursor/libxcursor1_1.2.1-1_arm64.deb|a93dd172bdd940de4ac6fd2b7a3f0213604c975f9f2f51eb3013f50886aaa87c"
"${piPackagesSnapshot}/pool/main/libx/libxtst/libxtst-dev_1.2.3-1.1_arm64.deb|4e205710dd04f9e9ee360da0161c155be01086e36462fead392b707b3857b4f2"
"${piPackagesSnapshot}/pool/main/libx/libxtst/libxtst6_1.2.3-1.1_arm64.deb|ef2a1b9ac3f2620d96e17744e41c4eefb7f491eee3bcc5bc1e592180b2d94128"
"${piPackagesSnapshot}/pool/main/libx/libxss/libxss-dev_1.2.3-1_arm64.deb|970b39c57df5c1307f905c6dd89967d548e9e2711a2099241de7b8e8831e40ca"
"${piPackagesSnapshot}/pool/main/libx/libxss/libxss1_1.2.3-1_arm64.deb|e0ff80e309eacda5face68b9a3bd56718fed2750af429324c35d7c9491c335f4"
"${piPackagesSnapshot}/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-3_arm64.deb|64c758aef152615d99bceead07c86b03f3737dca190230b5dde1d79403288341"
"${piPackagesSnapshot}/pool/main/libx/libxinerama/libxinerama1_1.1.4-3_arm64.deb|1dc5f458f6b3245b1b128897f905717d3cf7777a5697577b246042e25311d0df"
"${piPackagesSnapshot}/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.5.0-1_arm64.deb|7d39b34b202fe58e18992b439c79c149ebb1b821b58dfb863ff4898e06420699"
"${piPackagesSnapshot}/pool/main/libx/libxkbcommon/libxkbcommon0_1.5.0-1_arm64.deb|ec518d8a19796a399ab95e7bc4dfbb6bd2ed8e151f77b222df26208db412d852"
"${piPackagesSnapshot}/pool/main/m/mesa/libgbm-dev_22.3.6-1+deb12u1_arm64.deb|ba3f413f6f428b45e21d93fc5eb213bbc31ca1c15a7b265da3700100fd2475c8"
"${piPackagesSnapshot}/pool/main/m/mesa/libgbm1_22.3.6-1+deb12u1_arm64.deb|c76790e11aac46e328b6a13b34cccd3ef01fad79cfe80d2c4aa2384ac9ddb1f8"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libegl-dev_1.6.0-1_arm64.deb|8a3004f892785a5fa4c9f969c116f567a36d1c8e9b3d5fd0403055151e36c7d3"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libegl1_1.6.0-1_arm64.deb|707097a275155c600e2e9251c4ee7cdfdb2d8f50a678a850a2526a7bc9664166"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libgles-dev_1.6.0-1_arm64.deb|941e9963d64479544691f7183fe0eeae32b53b633df71c4c51263517ab2ea8f3"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libgles2_1.6.0-1_arm64.deb|efeb2717380f8411d66b3f669bb99bbd83ff09db3d4a1661533aa31af659608c"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libgl-dev_1.6.0-1_arm64.deb|56add9e710c072cf56504beed50a639f9f7c64f4e31e66958fa65a566084888c"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libgl1_1.6.0-1_arm64.deb|f4043ab47f52325973d2b608514b3469b055b65c744861c7f378755a32e799d6"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libglvnd-dev_1.6.0-1_arm64.deb|86cba4e243d10ae07cc6e769f23ecd097b2f87b722dc5ac48a48a3794cd29513"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libglvnd0_1.6.0-1_arm64.deb|d5063205fab5322ee686f33f87c6315b3fcd1335ea4e7bc8202b48ed4f9c9e83"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libglx-dev_1.6.0-1_arm64.deb|f3d6fca16c259743208df6f845aee3189eb54fed00e159811135089c16d0ad9c"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libglx0_1.6.0-1_arm64.deb|523f9b71f75e48ae605d8ef298a4b03ade26ade9a808a85329a3bd82a54b9b0d"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libopengl0_1.6.0-1_arm64.deb|4b3c6b3bc25530290cf231acac4c85b8806dda53ab6376ab22b3ec511b4fb7a0"
"${piPackagesSnapshot}/pool/main/libg/libglvnd/libopengl-dev_1.6.0-1_arm64.deb|b4ddc2d38103e9f0c3637d46334ccbf40c30e851c85f5348abc0aa37e3926822"
"${piPackagesSnapshot}/pool/main/s/systemd/libudev-dev_252.36-1~deb12u1_arm64.deb|62760a9e8fb87c2827333163efadc36c5ae66be59af18e7286d19813b8a72e03"
"${piPackagesSnapshot}/pool/main/s/systemd/libudev1_252.36-1~deb12u1_arm64.deb|5abfa6d6960f1b6a19c3d35373958d47a3a2f1221a5fe4652143fea0e0adc2ab"
"${piPackagesSnapshot}/pool/main/d/dbus/libdbus-1-dev_1.14.10-1~deb12u1_arm64.deb|817caa440feee88d53dd74432ce633af8d351552cd71014bcc8c98380c9ed88c"
"${piPackagesSnapshot}/pool/main/d/dbus/libdbus-1-3_1.14.10-1~deb12u1_arm64.deb|2a423794f44ee756f70fda67c6e47b15afe3dd22cd69e51f5d14d2ec9538f806"
"${piPackagesSnapshot}/pool/main/w/wayland/libwayland-dev_1.21.0-1_arm64.deb|932405c58195d299495230792e374ad304adadf3d3ffdc07eda3466b756adc33"
"${piPackagesSnapshot}/pool/main/w/wayland/libwayland-client0_1.21.0-1_arm64.deb|ae390cc04c2eb1de90b9a6373505b22c730ada5e72daa50c507b7f99c12faf06"
"${piPackagesSnapshot}/pool/main/w/wayland/libwayland-egl1_1.21.0-1_arm64.deb|c08124a4d9af24f058b45c88867a84697882e755ea94965795d152fe26fe57c9"
"${piPackagesSnapshot}/pool/main/w/wayland/libwayland-cursor0_1.21.0-1_arm64.deb|8c8d1a3942bc3fc9dd3ea7c679c1a314e59cdaaa700883d54d1bb3ec89db256b"
"${piPackagesSnapshot}/pool/main/w/wayland/libwayland-server0_1.21.0-1_arm64.deb|4d99e7e0503fdaa999e67d47d8612c0465e775eafa47819573da50bdb09064f2"
"${piPackagesSnapshot}/pool/main/w/wayland/libwayland-bin_1.21.0-1_arm64.deb|02e9361617b43b130ff032873a910258884160c169e89a1ca45d34d1150a2615"
"${piPackagesSnapshot}/pool/main/libd/libdecor-0/libdecor-0-dev_0.1.1-2_arm64.deb|e52fbcbbf6e755be2c642fcecc6154d9d071978d0797e7cf9ccf93d131bf4fc6"
"${piPackagesSnapshot}/pool/main/libd/libdecor-0/libdecor-0-0_0.1.1-2_arm64.deb|e88d3c2dd3336a97b8cf10ef270a264388fce81cedf8032b18f2a36b021bc6a3"
"${piPackagesSnapshot}/pool/main/p/pulseaudio/libpulse-dev_16.1+dfsg1-2+b1_arm64.deb|dac8f94dc214a77654cc62d0f1611cd4dee9cdefdc816e3056dd9fae5aa5d4a8"
"${piPackagesSnapshot}/pool/main/p/pulseaudio/libpulse0_16.1+dfsg1-2+b1_arm64.deb|26f17e3457c5fce0104a6b2f0efb75a3256b24b32ca7cfda6266373758a930cb"
"${piPackagesSnapshot}/pool/main/w/wayland/libwayland-egl-backend-dev_1.21.0-1_arm64.deb|0974da94059371e67e93d61398853c9967d0cc34cd7745b6d47d3aa47b88815d"
"${piPackagesSnapshot}/pool/main/libf/libffi/libffi-dev_3.4.4-1_arm64.deb|8ff6335f76752ef8659762435d0d88129ef0090a587520853238809bd10ef392"
"${piPackagesSnapshot}/pool/main/libf/libffi/libffi8_3.4.4-1_arm64.deb|80b5c36177dc0e29d531c7eddbed3cc7355cb490e49f8cfa5959572d161f27b3"
)

View file

@ -57,7 +57,10 @@ function(singeZigToolchain target extra)
# -fno-sanitize=undefined: zig cc instruments for UBSan by default and expects its runtime at
# link time; a release build wants neither.
# extra goes after the caller's arguments so the caller's -L directories are searched first.
foreach(tool "cc;-target ${target} -fno-sanitize=undefined;${extra}" "c++;-target ${target} -fno-sanitize=undefined;${extra}" "ar;;" "ranlib;;" "rc;;")
# ld.lld and objcopy are here for vendored projects that shell out to a linker or a strip of
# their own rather than going through the compiler driver: Rockchip's MPP merges its archives
# with "ld -r" and then strips the result, and without these it would reach for the host's.
foreach(tool "cc;-target ${target} -fno-sanitize=undefined;${extra}" "c++;-target ${target} -fno-sanitize=undefined;${extra}" "ar;;" "ranlib;;" "rc;;" "ld.lld;;")
list(GET tool 0 name)
list(GET tool 1 args)
list(GET tool 2 after)
@ -69,5 +72,6 @@ function(singeZigToolchain target extra)
set(CMAKE_AR ${dir}/zig-ar CACHE FILEPATH "archiver" FORCE)
set(CMAKE_RANLIB ${dir}/zig-ranlib CACHE FILEPATH "ranlib" FORCE)
set(CMAKE_RC_COMPILER ${dir}/zig-rc CACHE FILEPATH "resource compiler" FORCE)
set(CMAKE_LINKER ${dir}/zig-ld.lld CACHE FILEPATH "linker" FORCE)
set(SINGE_ZIG_TARGET ${target} CACHE STRING "zig target triple" FORCE)
endfunction()

View file

@ -29,6 +29,8 @@
#include <math.h>
#include <sys/stat.h>
#ifdef _WIN32
// _describeCpu reads the processor name out of the registry, which needs the Windows headers.
#include <windows.h>
#include <io.h>
#else
#include <unistd.h>

View file

@ -87,6 +87,7 @@ typedef struct iso639_lang_t iso639_lang_t;
#define PERCENT_MAX 100
#define PERCENT_TO_SCALE 0.01f
#define PLANE_COUNT 3 // Y, U, V
#define NV12_PLANE_COUNT 2 // Y, then U and V interleaved
#define CHROMA_NEUTRAL 0x80 // U and V sample with no colour, for monochrome playback
#define FLASH_LUMA 0xd4 // videoFlash's white picture: 90 per cent luma, the value Hypseus flashes
#define LUMA_BLEND_TAPS 3 // videoSetBlend averages a luma sample with the rows above and below it
@ -101,6 +102,12 @@ typedef struct iso639_lang_t iso639_lang_t;
// The Pi has no VA-API or VDPAU; its decode hardware is a V4L2 memory-to-memory device driven by
// libavcodec's separate *_v4l2m2m decoders, which are chosen by name. Only the Pi build asks for
// them: on a desktop the probe would open every /dev/video* device.
#if defined(SINGE_RKMPP_DECODE)
#define RKMPP_DECODE true
#else
#define RKMPP_DECODE false
#endif
#if defined(SINGE_V4L2_DECODE)
#define V4L2_DECODE true
#else
@ -188,6 +195,7 @@ typedef struct VideoPlayerS {
bool packetPending; // videoPacket holds data the decoder refused (EAGAIN)
bool hwReported; // First hardware frame has been traced
bool v4l2; // Decoding through a V4L2 memory-to-memory device
bool nv12; // Frames stay NV12 to the texture: no conversion between the decoder and the GPU
bool videoHasAudio; // The video file carries an audio stream of its own
// Audio demuxer, decoder, and resampler. Owned by the main thread.
@ -279,6 +287,7 @@ static int64_t _streamTimeToMs(int64_t ts, AVRational timeBase);
static bool _takeDecodedFrame(VideoPlayerT *v);
static void _trackMixed(void *udata, MIX_Track *track, const SDL_AudioSpec *spec, float *pcm, int32_t samples);
static void _uploadFrame(VideoPlayerT *v);
static const AVCodec *_rkmppDecoder(const AVCodec *decoder);
static const AVCodec *_v4l2Decoder(const AVCodec *decoder);
static void _writeIndexCache(VideoPlayerT *v, const char *indexName, const IndexHeaderT *header);
@ -323,6 +332,15 @@ static void _allocateFrameBuffer(VideoPlayerT *v, FrameBufferT *buffer) {
if (!buffer->data[0]) {
utilDie("Unable to allocate frame buffer.");
}
} else if (v->nv12) {
// One luma plane and one chroma plane carrying U and V in pairs, so it is as wide as luma.
buffer->linesize[0] = FFALIGN(v->width, STRIDE_ALIGNMENT);
buffer->linesize[1] = buffer->linesize[0];
buffer->data[0] = av_malloc((size_t)buffer->linesize[0] * (size_t)v->height);
buffer->data[1] = av_malloc((size_t)buffer->linesize[1] * (size_t)chromaHeight);
if (!buffer->data[0] || !buffer->data[1]) {
utilDie("Unable to allocate frame buffer.");
}
} else {
buffer->linesize[0] = FFALIGN(v->width, STRIDE_ALIGNMENT);
buffer->linesize[1] = FFALIGN(chromaWidth, STRIDE_ALIGNMENT);
@ -760,8 +778,8 @@ static int _compareFrames(const void *a, const void *b) {
// Puts a decoded frame into our buffer in the player's format, converting only when the decoder's
// output differs (10 bit sources, 4:2:2, full range JPEG sources, hardware formats).
static void _convertFrame(VideoPlayerT *v, FrameBufferT *buffer, const AVFrame *frame) {
enum AVPixelFormat wanted = v->rgb ? AV_PIX_FMT_BGRA : AV_PIX_FMT_YUV420P;
int32_t planes = v->rgb ? 1 : PLANE_COUNT;
enum AVPixelFormat wanted = v->rgb ? AV_PIX_FMT_BGRA : (v->nv12 ? AV_PIX_FMT_NV12 : AV_PIX_FMT_YUV420P);
int32_t planes = v->rgb ? 1 : (v->nv12 ? NV12_PLANE_COUNT : PLANE_COUNT);
int32_t plane = 0;
int32_t rows = 0;
int32_t bytes = 0;
@ -769,7 +787,8 @@ static void _convertFrame(VideoPlayerT *v, FrameBufferT *buffer, const AVFrame *
if (frame->format == wanted) {
for (plane = 0; plane < planes; plane++) {
rows = (plane == 0) ? v->height : (v->height + 1) / 2;
bytes = v->rgb ? v->width * BYTES_PER_PIXEL : ((plane == 0) ? v->width : (v->width + 1) / 2);
// NV12's chroma plane holds a U and a V for every second pixel, so it is luma's width.
bytes = v->rgb ? v->width * BYTES_PER_PIXEL : (((plane == 0) || v->nv12) ? v->width : (v->width + 1) / 2);
av_image_copy_plane(buffer->data[plane], buffer->linesize[plane], frame->data[plane], frame->linesize[plane], bytes, rows);
}
} else {
@ -1250,7 +1269,10 @@ static void _openVideo(VideoPlayerT *v, const char *filename) {
v->fps.den = DEFAULT_FPS_DENOMINATOR;
}
v4l2 = _v4l2Decoder(decoder);
v4l2 = _rkmppDecoder(decoder);
if (v4l2 == NULL) {
v4l2 = _v4l2Decoder(decoder);
}
if ((v4l2 != NULL) && _openDecoder(v, v4l2, stream)) {
v->v4l2 = true;
utilTrace("Hardware decoding via %s.", v4l2->name);
@ -1496,7 +1518,12 @@ static void _uploadFrame(VideoPlayerT *v) {
cb = _neutralChroma(v);
cr = cb;
}
SDL_UpdateYUVTexture(v->videoTexture, NULL, luma, v->front.linesize[0], cb, v->front.linesize[1], cr, v->front.linesize[2]);
if (v->nv12) {
// The neutral plane is a run of CHROMA_NEUTRAL, which reads the same interleaved.
SDL_UpdateNVTexture(v->videoTexture, NULL, luma, v->front.linesize[0], cb, v->front.linesize[1]);
} else {
SDL_UpdateYUVTexture(v->videoTexture, NULL, luma, v->front.linesize[0], cb, v->front.linesize[1], cr, v->front.linesize[2]);
}
}
v->flashed = false;
v->uploadedFrame = v->front.frame;
@ -1505,6 +1532,30 @@ static void _uploadFrame(VideoPlayerT *v) {
// The V4L2 memory-to-memory decoder for the stream's codec on a Pi build, NULL when there is none or
// hardware decoding is off. Whether the device exists is found out when the decoder opens.
// Rockchip boards decode through the vendor's Media Process Platform, which FFmpeg exposes as named
// decoders in the same way as V4L2's. They exist only when FFmpeg was built against that library,
// which is why this is compiled out everywhere else. Tried before V4L2: a Rockchip running its
// vendor kernel has both, and the MPP path is the one that works there.
static const AVCodec *_rkmppDecoder(const AVCodec *decoder) {
static const V4l2DecoderT table[] = {
{ AV_CODEC_ID_H264, "h264_rkmpp" },
{ AV_CODEC_ID_HEVC, "hevc_rkmpp" }
};
size_t x = 0;
if (!RKMPP_DECODE || !_hardwareDecoding) {
return NULL;
}
for (x = 0; x < SDL_arraysize(table); x++) {
if (table[x].id == decoder->id) {
return avcodec_find_decoder_by_name(table[x].name);
}
}
return NULL;
}
static const AVCodec *_v4l2Decoder(const AVCodec *decoder) {
static const V4l2DecoderT table[] = {
{ AV_CODEC_ID_H263, "h263_v4l2m2m" },
@ -1563,7 +1614,11 @@ void videoFlash(int32_t playerHandle) {
luma = _lumaPlane(v);
chroma = _neutralChroma(v);
memset(luma, FLASH_LUMA, v->lumaBytes);
SDL_UpdateYUVTexture(v->videoTexture, NULL, luma, v->front.linesize[0], chroma, v->front.linesize[1], chroma, v->front.linesize[2]);
if (v->nv12) {
SDL_UpdateNVTexture(v->videoTexture, NULL, luma, v->front.linesize[0], chroma, v->front.linesize[1]);
} else {
SDL_UpdateYUVTexture(v->videoTexture, NULL, luma, v->front.linesize[0], chroma, v->front.linesize[1], chroma, v->front.linesize[2]);
}
v->flashed = true;
}
@ -1700,8 +1755,14 @@ bool videoGetPixel(int32_t playerHandle, int32_t x, int32_t y, uint8_t *r, uint8
} else {
// BT.601 limited range, the same conversion SDL applies on the GPU for SD video.
c = v->front.data[0][y * v->front.linesize[0] + x] - 16;
d = v->front.data[1][(y / 2) * v->front.linesize[1] + (x / 2)] - 128;
e = v->front.data[2][(y / 2) * v->front.linesize[2] + (x / 2)] - 128;
if (v->nv12) {
// U and V sit side by side for each chroma sample.
d = v->front.data[1][(y / 2) * v->front.linesize[1] + (x / 2) * 2] - 128;
e = v->front.data[1][(y / 2) * v->front.linesize[1] + (x / 2) * 2 + 1] - 128;
} else {
d = v->front.data[1][(y / 2) * v->front.linesize[1] + (x / 2)] - 128;
e = v->front.data[2][(y / 2) * v->front.linesize[2] + (x / 2)] - 128;
}
value = (298 * c + 409 * e + 128) >> 8;
*r = (uint8_t)((value < 0) ? 0 : ((value > 255) ? 255 : value));
value = (298 * c - 100 * d - 208 * e + 128) >> 8;
@ -1754,8 +1815,14 @@ bool videoGetYUVPixel(int32_t playerHandle, int32_t x, int32_t y, uint8_t *luma,
return false;
}
*luma = v->front.data[0][y * v->front.linesize[0] + x];
*cb = v->front.data[1][(y / 2) * v->front.linesize[1] + (x / 2)];
*cr = v->front.data[2][(y / 2) * v->front.linesize[2] + (x / 2)];
if (v->nv12) {
// One chroma plane with U and V side by side; there is no third plane to read.
*cb = v->front.data[1][(y / 2) * v->front.linesize[1] + (x / 2) * 2];
*cr = v->front.data[1][(y / 2) * v->front.linesize[1] + (x / 2) * 2 + 1];
} else {
*cb = v->front.data[1][(y / 2) * v->front.linesize[1] + (x / 2)];
*cr = v->front.data[2][(y / 2) * v->front.linesize[2] + (x / 2)];
}
return true;
}
@ -1834,11 +1901,15 @@ int32_t videoLoad(const char *videoFilename, const char *audioFilename, const ch
// Video: demuxer, frame table, decoder.
_openVideo(v, videoFilename);
// A hardware decoder hands its pictures back as NV12. Keeping them that way the whole distance
// spends no CPU on a colour conversion that the GPU does anyway when it samples the texture; the
// V4L2 path is left alone because what its drivers hand over varies.
v->nv12 = (!rgb) && (v->hwDevice != NULL);
_buildFrameTable(v, videoFilename, indexPath);
_reportKeyframes(v, videoFilename);
// Create video texture
v->videoTexture = SDL_CreateTexture(renderer, rgb ? SDL_PIXELFORMAT_BGRA32 : SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, v->width, v->height);
v->videoTexture = SDL_CreateTexture(renderer, rgb ? SDL_PIXELFORMAT_BGRA32 : (v->nv12 ? SDL_PIXELFORMAT_NV12 : SDL_PIXELFORMAT_IYUV), SDL_TEXTUREACCESS_STREAMING, v->width, v->height);
if (v->videoTexture == NULL) {
utilDie("%s", SDL_GetError());
}

111
thirdparty/rockchip-mpp/.gitignore vendored Normal file
View file

@ -0,0 +1,111 @@
#
# cache files
#
*~
*.swp
*.gc??
#
# gnu global files
#
GPATH
GRTAGS
GSYMS
GTAGS
ID
cscope.in.out
cscope.out
cscope.po.out
tags
.prjBuild.sh
.prjDebug.sh
prjBuild.sh
prjDebug.sh
debug.gdb
#
# GNU Autotools
#
aclocal.m4
autom4te.cache
config.h
config.h.in
config.h-new
config.log
config.status
config.guess
config.sub
config.rpath
configure
libtool
stamp-h
stamp-h.in
stamp-h1
ltmain.sh
missing
mkinstalldirs
compile
install-sh
depcomp
autoregen.sh
ABOUT-NLS
/INSTALL
_stdint.h
.dirstamp
/m4
.deps
.libs
*.lo
*.la
*.o
Makefile.in
Makefile
/m4
tmp-orc.c
*orc.h
#
# VS
#
Build
*.user
*.suo
*.ipch
*.sdf
*.opensdf
*.DS_Store
/test-driver
*.log
*.trs
/subprojects
#
# Building cache
#
/build
/mpp/version.h
#
# Debian
#
/obj-arm-linux-gnueabihf/
/obj-aarch64-linux-gnu/
#
# VSCode
#
.vscode/
.code-workspace
#
# Clangd
#
.cache
.clangd
.clang-format
compile_commands.json
# claude
.claude

View file

@ -0,0 +1 @@
0986d01294d5c2449c14cf13af9b740368c33967 2026-08-25

330
thirdparty/rockchip-mpp/Android.bp vendored Normal file
View file

@ -0,0 +1,330 @@
cc_defaults {
name: "mpp_defaults",
cflags: [
"-DENABLE_FASTPLAY_ONCE",
"-DHAVE_AV1D",
"-DHAVE_AVS2D",
"-DHAVE_AVSD",
"-DHAVE_H263D",
"-DHAVE_H264D",
"-DHAVE_H264E",
"-DHAVE_H265D",
"-DHAVE_H265E",
"-DHAVE_JPEGD",
"-DHAVE_JPEGE",
"-DHAVE_MPEG2D",
"-DHAVE_MPEG4D",
"-DHAVE_VP8D",
"-DHAVE_VP8E",
"-DHAVE_VP9D",
"-DHAVE_VPROC",
"-Wno-implicit-fallthrough",
"-Wno-pointer-arith",
"-Wno-typedef-redefinition",
"-Wno-unused-variable",
"-Wno-unused-parameter",
"-Wno-unused-function",
"-Wno-unused-label",
"-Wno-address-of-packed-member",
"-Wno-sometimes-uninitialized",
"-Wno-missing-field-initializers",
],
local_include_dirs: [
"mpp/base/inc",
"mpp/common",
"mpp/codec/inc",
"mpp/codec/dec/common",
"mpp/codec/enc/h264",
"mpp/codec/enc/h265",
"mpp/vproc/inc",
"mpp/hal/inc",
"mpp/hal/common",
"mpp/hal/common/av1",
"mpp/hal/common/h265",
"mpp/hal/common/h264",
"mpp/hal/common/jpeg",
"mpp/hal/rkenc/common",
"mpp/hal/rkenc/h265e",
"mpp/hal/rkenc/h264e",
"mpp/hal/rkenc/jpege",
"mpp/hal/rkdec/inc",
"mpp/hal/rkdec/av1d",
"mpp/hal/vpu/common",
"mpp/hal/vpu/jpege",
"mpp/hal/vpu/av1d",
"mpp/hal/vpu/h264e",
"mpp/inc",
"osal",
"osal/inc",
"osal/allocator",
"osal/driver/inc",
"kmpp/inc",
"kmpp/base/inc",
"inc",
"utils",
],
generated_headers: ["mpp_version_header"],
}
filegroup {
name: "mpp_base_srcs",
srcs: [
"mpp/base/*.c",
],
}
filegroup {
name: "mpp_codec_srcs",
srcs: [
"mpp/codec/*.c",
"mpp/codec/dec/**/*.c",
"mpp/codec/enc/**/*.c",
"mpp/codec/rc/*.c",
],
}
filegroup {
name: "mpp_hal_srcs",
srcs: [
"mpp/hal/*.c",
"mpp/hal/common/**/*.c",
"mpp/hal/vpu/**/*.c",
"mpp/hal/rkdec/**/*.c",
"mpp/hal/rkenc/common/*.c",
"mpp/hal/rkenc/h264e/hal_h264e_vepu541.c",
"mpp/hal/rkenc/h264e/hal_h264e_vepu580.c",
"mpp/hal/rkenc/h264e/hal_h264e_vepu540c.c",
"mpp/hal/rkenc/h264e/hal_h264e_vepu510.c",
"mpp/hal/rkenc/h264e/hal_h264e_vepu511.c",
"mpp/hal/rkenc/h265e/hal_h265e_vepu541.c",
"mpp/hal/rkenc/h265e/hal_h265e_vepu580.c",
"mpp/hal/rkenc/h265e/hal_h265e_vepu540c.c",
"mpp/hal/rkenc/h265e/hal_h265e_vepu510.c",
"mpp/hal/rkenc/h265e/hal_h265e_vepu511.c",
"mpp/hal/rkenc/jpege/hal_jpege_vepu540c.c",
"mpp/hal/rkenc/jpege/hal_jpege_vepu511.c",
"mpp/hal/rkenc/jpege/hal_jpege_vpu720.c",
"mpp/hal/dummy/*.c",
],
}
filegroup {
name: "mpp_vproc_srcs",
srcs: [
"mpp/vproc/*.c",
"mpp/vproc/iep/*.c",
"mpp/vproc/iep2/*.c",
"mpp/vproc/rga/*.c",
"mpp/vproc/vdpp/*.c",
],
}
filegroup {
name: "mpp_kmpp_srcs",
srcs: [
"kmpp/base/*.c",
"kmpp/*.c"
],
}
filegroup {
name: "mpp_osal_srcs",
srcs: [
"osal/*.c",
"osal/allocator/*.c",
"osal/android/*.c",
"osal/driver/*.c",
],
}
genrule {
name: "mpp_version_header",
srcs: ["build/cmake/version.in"],
out: ["version.h"],
cmd: "VERSION_INFO=`cd hardware/rockchip/libmpp; git log -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s\"`;" +
"HISTORY_0=`cd hardware/rockchip/libmpp; git log HEAD~0 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_1=`cd hardware/rockchip/libmpp; git log HEAD~1 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_2=`cd hardware/rockchip/libmpp; git log HEAD~2 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_3=`cd hardware/rockchip/libmpp; git log HEAD~3 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_4=`cd hardware/rockchip/libmpp; git log HEAD~4 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_5=`cd hardware/rockchip/libmpp; git log HEAD~5 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_6=`cd hardware/rockchip/libmpp; git log HEAD~6 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_7=`cd hardware/rockchip/libmpp; git log HEAD~7 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_8=`cd hardware/rockchip/libmpp; git log HEAD~8 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"HISTORY_9=`cd hardware/rockchip/libmpp; git log HEAD~9 -1 --oneline --date=short --pretty=format:\"%h author: %<|(30)%an %cd %s %d\"`;" +
"sed -e \"s|@VERSION_INFO@|\\\"$$VERSION_INFO\\\"|g\" " +
" -e \"s|@VERSION_CNT@|10|g\" " +
" -e \"s|@VERSION_HISTORY_0@|\\\"$$HISTORY_0\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_1@|\\\"$$HISTORY_1\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_2@|\\\"$$HISTORY_2\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_3@|\\\"$$HISTORY_3\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_4@|\\\"$$HISTORY_4\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_5@|\\\"$$HISTORY_5\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_6@|\\\"$$HISTORY_6\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_7@|\\\"$$HISTORY_7\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_8@|\\\"$$HISTORY_8\\\"|g\" " +
" -e \"s|@VERSION_HISTORY_9@|\\\"$$HISTORY_9\\\"|g\" " +
" $(in)>$(out)",
}
cc_library_static {
name: "libmpputils-static",
srcs: [
"utils/*.c",
],
export_include_dirs: [
"utils",
],
defaults: [
"mpp_defaults",
],
}
cc_library_headers {
name: "libmpp_headers",
export_include_dirs: [
"inc",
"osal/inc",
],
vendor_available: true,
}
cc_library {
name: "libmpp",
srcs: [
"mpp/*.c",
":mpp_base_srcs",
":mpp_codec_srcs",
":mpp_vproc_srcs",
":mpp_kmpp_srcs",
":mpp_hal_srcs",
":mpp_osal_srcs",
],
export_include_dirs: [
"inc",
"osal/inc",
],
shared_libs: [
"liblog",
],
defaults: [
"mpp_defaults",
],
vendor_available: true,
}
cc_library {
name: "libvpu",
srcs: [
"mpp/legacy/vpu.c",
"mpp/legacy/vpu_api.cpp",
"mpp/legacy/vpu_api_legacy.cpp",
"mpp/legacy/vpu_api_mlvec.cpp",
"mpp/legacy/vpu_mem_legacy.c",
"mpp/legacy/rk_list.cpp",
"mpp/mpp_info.c",
],
export_include_dirs: [
"inc"
],
shared_libs: [
"libmpp",
],
defaults: [
"mpp_defaults",
],
vendor_available: true,
}
cc_test {
name: "mpp_info_test",
srcs: ["test/mpp_info_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
cc_test {
name: "mpi_dec_test",
srcs: ["test/mpi_dec_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
cc_test {
name: "mpi_dec_mt_test",
srcs: ["test/mpi_dec_mt_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
cc_test {
name: "mpi_dec_nt_test",
srcs: ["test/mpi_dec_nt_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
cc_test {
name: "mpi_enc_test",
srcs: ["test/mpi_enc_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
cc_test {
name: "mpi_enc_mt_test",
srcs: ["test/mpi_enc_mt_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
cc_test {
name: "mpi_rc2_test",
srcs: ["test/mpi_rc2_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
cc_test {
name: "mpi_dec_multi_test",
srcs: ["test/mpi_dec_multi_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
/*
cc_test {
name: "mpi_dec_slt_test",
srcs: ["test/mpi_dec_slt_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
cc_test {
name: "mpi_enc_slt_test",
srcs: ["test/mpi_enc_slt_test.c"],
shared_libs: ["libmpp"],
static_libs: ["libmpputils-static"],
defaults: ["mpp_defaults"],
}
*/

1305
thirdparty/rockchip-mpp/CHANGELOG.md vendored Normal file

File diff suppressed because it is too large Load diff

384
thirdparty/rockchip-mpp/CMakeLists.txt vendored Normal file
View file

@ -0,0 +1,384 @@
# ----------------------------------------------------------------------------
# Root CMake file for Rockchip Media Process Platform (MPP)
#
# - 10:34 2015/7/27: Initial version <herman.chen@rock-chips.com>
#
# ----------------------------------------------------------------------------
# vim: syntax=cmake
set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
if(NOT CMAKE_BUILD_TYPE)
# default to Release build for GCC builds
set(CMAKE_BUILD_TYPE Debug CACHE STRING
"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
FORCE)
endif()
message(STATUS "cmake version ${CMAKE_VERSION}")
# Search packages for host system instead of packages for target system
# in case of cross compilation these macro should be defined by toolchain file
if(NOT COMMAND find_host_package)
macro(find_host_package)
find_package(${ARGN})
endmacro()
endif()
if(NOT COMMAND find_host_program)
macro(find_host_program)
find_program(${ARGN})
endmacro()
endif()
if(POLICY CMP0009)
cmake_policy(SET CMP0009 NEW)
endif()
cmake_minimum_required(VERSION 3.5)
project (rk_mpp)
include(CheckIncludeFiles)
include(CheckFunctionExists)
include(CheckSymbolExists)
include(CheckCXXCompilerFlag)
include(${PROJECT_SOURCE_DIR}/build/cmake/merge_objects.cmake)
# setup output library name
# Linux default name - rockchip_mpp and rockchip_vpu
# Android default name - mpp and vpu
# For historical reason libraries on Android is named as mpp and vpu. But for
# better naming rule on Linux it should add vendor prefix.
# So we use this ugly method to avoid massive maintain issue.
if (NOT MPP_PROJECT_NAME)
set(MPP_PROJECT_NAME rockchip_mpp)
endif()
set(MPP_STATIC ${MPP_PROJECT_NAME}_static)
set(MPP_SHARED ${MPP_PROJECT_NAME})
if (NOT VPU_PROJECT_NAME)
set(VPU_PROJECT_NAME rockchip_vpu)
endif()
set(VPU_STATIC ${VPU_PROJECT_NAME}_static)
set(VPU_SHARED ${VPU_PROJECT_NAME})
# ----------------------------------------------------------------------------
# set property to classify library kinds
# ----------------------------------------------------------------------------
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")
# ----------------------------------------------------------------------------
# enable test in this project
# ----------------------------------------------------------------------------
option(BUILD_TEST "enable test binary building)" ON)
# ----------------------------------------------------------------------------
# export json compile commands
# ----------------------------------------------------------------------------
set(CMAKE_EXPORT_COMPILE_COMMANDS true)
# ----------------------------------------------------------------------------
# System architecture detection
# ----------------------------------------------------------------------------
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC)
set(X86_ALIASES x86 i386 i686 x86_64 amd64)
list(FIND X86_ALIASES "${SYSPROC}" X86MATCH)
if("${CMAKE_C_COMPILER}" MATCHES "-buildroot-[^/]+$")
message(STATUS "Detected Buildroot toolchain")
# Use buildroot toolchain's default architecture settings
elseif("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1")
message(STATUS "Detected x86 system processor")
set(X86 true)
add_definitions(-DARCH_X86=1)
if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
set(X64 true)
add_definitions(-DARCH_X64=1)
message(STATUS "Define X86_64 to 1")
endif()
elseif(${SYSPROC} STREQUAL "armv6l")
message(STATUS "Detected ARMv6 system processor")
set(ARM true)
set(ARMEABI_V6 true)
elseif(${SYSPROC} STREQUAL "armv7-a")
message(STATUS "Detected ARMv7 system processor")
set(ARM true)
set(ARMEABI_V7A true)
elseif(${SYSPROC} STREQUAL "armv7-a_hardfp" OR ${SYSPROC} STREQUAL "armv7l")
message(STATUS "Detected ARMv7 system processor")
set(ARM true)
set(ARMEABI_V7A_HARDFP true)
elseif(${SYSPROC} STREQUAL "aarch64" OR ${SYSPROC} STREQUAL "armv8-a")
message(STATUS "Detected ARMv8 system processor")
set(ARM true)
set(ARMEABI_V8 true)
else()
message(STATUS "CMAKE_SYSTEM_PROCESSOR value `${CMAKE_SYSTEM_PROCESSOR}` is unknown")
message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}")
endif()
# ----------------------------------------------------------------------------
# Compiler detection
# ----------------------------------------------------------------------------
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(CLANG true)
endif()
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
set(GCC true)
endif()
if(${CMAKE_BUILD_TYPE} MATCHES "Release")
# remove -g option for high version ndk
string(REGEX REPLACE "(^|[ \t])-g([0-9]+)?([ \t]|$)" " " TMP "${CMAKE_C_FLAGS}")
string(REGEX REPLACE "[ ]+" " " CMAKE_C_FLAGS "${TMP}")
string(REGEX REPLACE "(^|[ \t])-g([0-9]+)?([ \t]|$)" " " TMP "${CMAKE_CXX_FLAGS}")
string(REGEX REPLACE "[ ]+" " " CMAKE_CXX_FLAGS "${TMP}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -DNDEBUG")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -DNDEBUG")
else()
add_definitions(-g)
endif()
if(GCC)
if(ARM)
if(ARMEABI_V6)
add_definitions(-march=armv6 -mfloat-abi=hard -mfpu=vfp)
elseif(ARMEABI_V7A)
add_definitions(-march=armv7-a -mfloat-abi=softfp -mfpu=neon)
elseif(ARMEABI_V7A_HARDFP)
add_definitions(-march=armv7-a -mfloat-abi=hard -mfpu=neon)
elseif(ARMEABI_V8)
add_definitions(-march=armv8-a)
endif()
else()
if(X86 AND NOT X64)
add_definitions(-march=i686)
endif()
endif()
# disable multichar warning
add_definitions(-Wno-multichar)
# add PIC flag
add_definitions(-fPIC)
# disable exception for C++
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
# save intermediate files
# add_definitions(-save-temps)
# check library mvec
find_library(LMVEC_LIB mvec)
if(LMVEC_LIB)
set(LIBM mvec m)
set(MPP_PKGCONFIG_DEPENDENT_LIBS "-lmvec -lm")
else()
set(LIBM m)
set(MPP_PKGCONFIG_DEPENDENT_LIBS "-lm")
add_definitions(-fno-builtin-pow)
endif()
option(ASAN_CHECK "enable Address Sanitizer (Asan)" OFF)
if(ASAN_CHECK)
add_definitions(-fsanitize=address -static-libasan -g)
set(ASAN_LIB libasan.a dl rt m)
set(ASAN_BIN dl rt m)
endif(ASAN_CHECK)
endif(GCC)
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
add_compile_options(
"$<$<COMPILE_LANGUAGE:C>:-Wall;-Wextra;-Wuninitialized;-Wmissing-field-initializers>"
)
endif()
# for libary linking
set(BEGIN_WHOLE_ARCHIVE -Wl,--whole-archive)
set(END_WHOLE_ARCHIVE -Wl,--no-whole-archive)
# ----------------------------------------------------------------------------
# Create git version information
# ----------------------------------------------------------------------------
set(VERSION_CNT 0)
set(VERSION_MAX_CNT 9)
set(VERSION_INFO "\"unknown mpp version for missing VCS info\"")
foreach (CNT RANGE ${VERSION_MAX_CNT})
set(VERSION_HISTORY_${CNT} "NULL")
endforeach(CNT)
if(EXISTS "${PROJECT_SOURCE_DIR}/.git")
find_host_package(Git)
if(GIT_FOUND)
# get current version info
set(GIT_LOG_FORMAT "%h author: %<|(30)%an %cd %s")
execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --oneline --date=short --pretty=format:${GIT_LOG_FORMAT}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_VARIABLE EXEC_OUT
ERROR_VARIABLE EXEC_ERROR
RESULT_VARIABLE EXEC_RET
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if (NOT EXEC_RET)
set(VERSION_INFO ${EXEC_OUT})
message(STATUS "current version:")
message(STATUS "${VERSION_INFO}")
string(REPLACE "\"" "\\\"" VERSION_INFO ${VERSION_INFO})
set(VERSION_INFO "\"${VERSION_INFO}\"")
else()
message(STATUS "git ret ${EXEC_RET}")
message(STATUS "${EXEC_ERROR}")
endif()
set(GIT_LOG_FORMAT "%h author: %<|(30)%an %cd %s %d")
# get history version information
# setup logs
message(STATUS "git version history:")
foreach (CNT RANGE ${VERSION_MAX_CNT})
execute_process(COMMAND ${GIT_EXECUTABLE} log HEAD~${CNT} -1 --oneline --date=short --pretty=format:${GIT_LOG_FORMAT}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_VARIABLE EXEC_OUT
ERROR_VARIABLE EXEC_ERROR
RESULT_VARIABLE EXEC_RET
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if (NOT EXEC_RET)
set(VERSION_LOG ${EXEC_OUT})
string(REPLACE "\"" "\\\"" VERSION_LOG ${VERSION_LOG})
message(STATUS ${VERSION_LOG})
set(VERSION_HISTORY_${CNT} "\"${VERSION_LOG}\"")
math(EXPR VERSION_CNT "${VERSION_CNT}+1")
endif()
endforeach(CNT)
message(STATUS "total ${VERSION_CNT} git version recorded")
endif()
# add git hooks
if (EXISTS "${PROJECT_SOURCE_DIR}/tools/hooks/")
set(GIT_HOOK_SRC "${PROJECT_SOURCE_DIR}/tools/hooks/")
if(EXISTS "${PROJECT_SOURCE_DIR}/.git/hooks")
set(GIT_HOOK_DST "${PROJECT_SOURCE_DIR}/.git/hooks/")
file(COPY ${GIT_HOOK_SRC} DESTINATION ${GIT_HOOK_DST})
message(STATUS "Install git hooks done")
endif(EXISTS "${PROJECT_SOURCE_DIR}/.git/hooks")
endif(EXISTS "${PROJECT_SOURCE_DIR}/tools/hooks/")
endif(EXISTS "${PROJECT_SOURCE_DIR}/.git")
configure_file(
"${PROJECT_SOURCE_DIR}/build/cmake/version.in"
"${PROJECT_SOURCE_DIR}/mpp/version.h"
)
# ----------------------------------------------------------------------------
# Build options
# ----------------------------------------------------------------------------
find_package(PkgConfig)
include(GNUInstallDirs)
pkg_search_module(PTHREAD pthread)
find_package(Threads)
# ----------------------------------------------------------------------------
# Set Warning as Error
# ----------------------------------------------------------------------------
option(WARNINGS_AS_ERRORS "Stop compiles on first warning" OFF)
if(WARNINGS_AS_ERRORS)
if(GCC)
add_definitions(-Werror)
elseif(MSVC)
add_definitions(/WX)
endif()
endif(WARNINGS_AS_ERRORS)
# ----------------------------------------------------------------------------
# look for stdint.h
# ----------------------------------------------------------------------------
if(MSVC)
check_include_files(stdint.h HAVE_STDINT_H)
if(NOT HAVE_STDINT_H)
include_directories(osal/windows)
endif(NOT HAVE_STDINT_H)
endif(MSVC)
# ----------------------------------------------------------------------------
# Share library option
# ----------------------------------------------------------------------------
option(BUILD_SHARED_LIBS "Build shared library" ON)
# ----------------------------------------------------------------------------
# scan all LOG_TAG for log information and generate module header file
# ----------------------------------------------------------------------------
set( module_list "" )
file ( GLOB_RECURSE ALL_SRC . *.c;*.cpp )
foreach( files ${ALL_SRC} )
file( STRINGS ${files} module_tag_line REGEX "MODULE_TAG( )+\".+\"" )
if(module_tag_line)
string( REGEX REPLACE "^(.)* MODULE_TAG( )+\"(.*)\"" \\3 module_tag ${module_tag_line} )
list( APPEND module_list ${module_tag} )
endif()
endforeach()
list( SORT module_list )
list( LENGTH module_list module_size )
#message(STATUS "module_list: ${module_list}")
#message(STATUS "module_size: ${module_size}")
# ----------------------------------------------------------------------------
# Start module definition
# ----------------------------------------------------------------------------
# project overall include file
include_directories(inc)
# small utile functions for test case
include_directories(utils)
# ----------------------------------------------------------------------------
# osal library
# ----------------------------------------------------------------------------
# Operation System Abstract Layer (OSAL) include
include_directories(osal/inc)
# OSAL is needed on all platform, do not need option
add_subdirectory(osal)
# Media Process Platform include
include_directories(mpp/inc)
include_directories(mpp/base/inc)
# Kernel Media Process Platform include
include_directories(kmpp/inc)
include_directories(kmpp/base/inc)
# ----------------------------------------------------------------------------
# utils for test case
# ----------------------------------------------------------------------------
add_subdirectory(utils)
# ----------------------------------------------------------------------------
# Kernel Media Process Platform library
# ----------------------------------------------------------------------------
add_subdirectory(kmpp)
# ----------------------------------------------------------------------------
# Media Process Platform library
# ----------------------------------------------------------------------------
add_subdirectory(mpp)
# ----------------------------------------------------------------------------
# test / demo
# ----------------------------------------------------------------------------
add_subdirectory(test)
# ----------------------------------------------------------------------------
# install headers
# ----------------------------------------------------------------------------
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/inc/
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/rockchip"
FILES_MATCHING PATTERN "*.h"
)
# ----------------------------------------------------------------------------
# pkgconfig
# ----------------------------------------------------------------------------
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/rockchip_mpp.pc.cmake"
"${CMAKE_BINARY_DIR}/rockchip_mpp.pc" @ONLY)
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/rockchip_vpu.pc.cmake"
"${CMAKE_BINARY_DIR}/rockchip_vpu.pc" @ONLY)
install(FILES "${CMAKE_BINARY_DIR}/rockchip_mpp.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/")
install(FILES "${CMAKE_BINARY_DIR}/rockchip_vpu.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/")

View file

@ -0,0 +1,183 @@
Valid-License-Identifier: Apache-2.0
SPDX-URL: https://spdx.org/licenses/Apache-2.0.html
Usage-Guide:
To use the Apache License version 2.0 put the following SPDX tag/value
pair into a comment according to the placement guidelines in the
licensing rules documentation:
SPDX-License-Identifier: Apache-2.0
License-Text:
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the
copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other
entities that control, are controlled by, or are under common control with
that entity. For the purposes of this definition, "control" means (i) the
power, direct or indirect, to cause the direction or management of such
entity, whether by contract or otherwise, or (ii) ownership of fifty
percent (50%) or more of the outstanding shares, or (iii) beneficial
ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising
permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation source,
and configuration files.
"Object" form shall mean any form resulting from mechanical transformation
or translation of a Source form, including but not limited to compiled
object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form,
made available under the License, as indicated by a copyright notice that
is included in or attached to the work (an example is provided in the
Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form,
that is based on (or derived from) the Work and for which the editorial
revisions, annotations, elaborations, or other modifications represent, as
a whole, an original work of authorship. For the purposes of this License,
Derivative Works shall not include works that remain separable from, or
merely link (or bind by name) to the interfaces of, the Work and Derivative
Works thereof.
"Contribution" shall mean any work of authorship, including the original
version of the Work and any modifications or additions to that Work or
Derivative Works thereof, that is intentionally submitted to Licensor for
inclusion in the Work by the copyright owner or by an individual or Legal
Entity authorized to submit on behalf of the copyright owner. For the
purposes of this definition, "submitted" means any form of electronic,
verbal, or written communication sent to the Licensor or its
representatives, including but not limited to communication on electronic
mailing lists, source code control systems, and issue tracking systems that
are managed by, or on behalf of, the Licensor for the purpose of discussing
and improving the Work, but excluding communication that is conspicuously
marked or otherwise designated in writing by the copyright owner as "Not a
Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on
behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of this
License, each Contributor hereby grants to You a perpetual, worldwide,
non-exclusive, no-charge, royalty-free, irrevocable copyright license to
reproduce, prepare Derivative Works of, publicly display, publicly
perform, sublicense, and distribute the Work and such Derivative Works
in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of this
License, each Contributor hereby grants to You a perpetual, worldwide,
non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
this section) patent license to make, have made, use, offer to sell,
sell, import, and otherwise transfer the Work, where such license
applies only to those patent claims licensable by such Contributor that
are necessarily infringed by their Contribution(s) alone or by
combination of their Contribution(s) with the Work to which such
Contribution(s) was submitted. If You institute patent litigation
against any entity (including a cross-claim or counterclaim in a
lawsuit) alleging that the Work or a Contribution incorporated within
the Work constitutes direct or contributory patent infringement, then
any patent licenses granted to You under this License for that Work
shall terminate as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the Work or
Derivative Works thereof in any medium, with or without modifications,
and in Source or Object form, provided that You meet the following
conditions:
a. You must give any other recipients of the Work or Derivative Works a
copy of this License; and
b. You must cause any modified files to carry prominent notices stating
that You changed the files; and
c. You must retain, in the Source form of any Derivative Works that You
distribute, all copyright, patent, trademark, and attribution notices
from the Source form of the Work, excluding those notices that do not
pertain to any part of the Derivative Works; and
d. If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained within
such NOTICE file, excluding those notices that do not pertain to any
part of the Derivative Works, in at least one of the following
places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if
provided along with the Derivative Works; or, within a display
generated by the Derivative Works, if and wherever such third-party
notices normally appear. The contents of the NOTICE file are for
informational purposes only and do not modify the License. You may
add Your own attribution notices within Derivative Works that You
distribute, alongside or as an addendum to the NOTICE text from the
Work, provided that such additional attribution notices cannot be
construed as modifying the License.
You may add Your own copyright statement to Your modifications and may
provide additional or different license terms and conditions for use,
reproduction, or distribution of Your modifications, or for any such
Derivative Works as a whole, provided Your use, reproduction, and
distribution of the Work otherwise complies with the conditions stated
in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, any
Contribution intentionally submitted for inclusion in the Work by You to
the Licensor shall be under the terms and conditions of this License,
without any additional terms or conditions. Notwithstanding the above,
nothing herein shall supersede or modify the terms of any separate
license agreement you may have executed with Licensor regarding such
Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or agreed to
in writing, Licensor provides the Work (and each Contributor provides
its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied, including, without limitation,
any warranties or conditions of TITLE, NON-INFRINGEMENT,
MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your
exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, whether
in tort (including negligence), contract, or otherwise, unless required
by applicable law (such as deliberate and grossly negligent acts) or
agreed to in writing, shall any Contributor be liable to You for
damages, including any direct, indirect, special, incidental, or
consequential damages of any character arising as a result of this
License or out of the use or inability to use the Work (including but
not limited to damages for loss of goodwill, work stoppage, computer
failure or malfunction, or any and all other commercial damages or
losses), even if such Contributor has been advised of the possibility of
such damages.
9. Accepting Warranty or Additional Liability. While redistributing the
Work or Derivative Works thereof, You may choose to offer, and charge a
fee for, acceptance of support, warranty, indemnity, or other liability
obligations and/or rights consistent with this License. However, in
accepting such obligations, You may act only on Your own behalf and on
Your sole responsibility, not on behalf of any other Contributor, and
only if You agree to indemnify, defend, and hold each Contributor
harmless for any liability incurred by, or claims asserted against, such
Contributor by reason of your accepting any such warranty or additional
liability.
END OF TERMS AND CONDITIONS

30
thirdparty/rockchip-mpp/LICENSES/MIT vendored Normal file
View file

@ -0,0 +1,30 @@
Valid-License-Identifier: MIT
SPDX-URL: https://spdx.org/licenses/MIT.html
Usage-Guide:
To use the MIT License put the following SPDX tag/value pair into a
comment according to the placement guidelines in the licensing rules
documentation:
SPDX-License-Identifier: MIT
License-Text:
MIT License
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

77
thirdparty/rockchip-mpp/SECURITY.md vendored Normal file
View file

@ -0,0 +1,77 @@
# Security Policy
## Supported Versions
The following versions of MPP are currently supported with security updates:
| Version | Supported |
| :--------------------------- | :----------------------------- |
| develop branch (latest) | ✅ Fully supported |
| release branch (latest) | ✅ Fully supported |
| Older release branches | ⚠️ Critical security fixes only |
| Archived versions (&lt; 1.0) | ❌ No longer supported |
## Reporting a Vulnerability
**Please do not** report security vulnerabilities through public GitHub issues, as this could expose the vulnerability to malicious actors.
If you discover a security vulnerability in MPP, please report it privately using the following methods:
### Reporting Channels
1. **Primary Contact** (Recommended)
- Email the maintainer at: **herman.chen@rock-chips.com**
- Subject format: `[SECURITY] MPP vulnerability report - [brief description]`
2. **Alternative Channel**
- If you cannot reach the primary maintainer, please email: rockchip-opensource@rock-chips.com
- Or submit a private ticket via [Rockchip Redmine](http://redmine.rockchip.com.cn)
### Report Content
Please include the following information to help us quickly locate and fix the issue:
- **Vulnerability Description**: Type of vulnerability (e.g., buffer overflow, use-after-free, integer overflow) and scope of impact
- **Affected Versions**: Specific MPP version or Git commit hash
- **Affected Components**: Specific modules (e.g., codec/parser/HAL/OSAL/allocator, etc.)
- **Environment Details**:
- Rockchip SoC model (e.g., RK3588, RK3568, etc.)
- Operating system (Linux/Android version)
- Kernel version
- **Reproduction Steps**: Detailed steps to reproduce or PoC (Proof of Concept) code
- **Suggested Fix** (optional): If you have a proposed fix, please include it
## Response Process
Upon receiving a security report, the maintenance team will follow this process:
| Timeframe | Action |
| :------------------ | :----------------------------------------------------------- |
| Within 48 hours | Acknowledge receipt and begin initial assessment |
| Within 7 days | Complete vulnerability verification and severity assessment, provide feedback |
| Within 30 days | Release security patch (critical vulnerabilities may be faster) |
| After patch release | Public disclosure of vulnerability details (coordinated disclosure) |
## Disclosure Policy
- **Coordinated Disclosure**: We follow coordinated disclosure principles. After the vulnerability is fixed, details will typically be publicly disclosed within 90 days, or adjusted according to the reporter's preferences
- **Acknowledgment**: Once the vulnerability is confirmed and fixed, we will credit the reporter in the release notes (unless you wish to remain anonymous)
- **CVE**: If a CVE identifier is needed, please let us know in advance and we will assist with the application
## Security Best Practices
When using MPP, the following security measures are recommended:
1. **Input Validation**: Ensure media streams passed to MPP come from trusted sources, or perform strict validation before decoding
2. **Memory Limits**: Use `mpp_buffer_group_limit_config` to limit memory usage and prevent resource exhaustion attacks
3. **Sandboxing**: Run MPP-related processes in a privilege-restricted environment
4. **Timely Updates**: Keep MPP updated to the latest version to receive the latest security fixes
5. **Kernel Security**: Ensure the underlying kernel drivers (vcodec_service/v4l2) are updated to the latest version
## Known Security Issues
View [GitHub Security Advisories](https://github.com/HermanChen/mpp/security/advisories) for publicly disclosed security announcements.
---
Thank you for contributing to MPP security!

View file

@ -0,0 +1,14 @@
/.debhelper/
/debhelper-build-stamp
/files
/librockchip-mpp-dev.substvars
/librockchip-mpp-dev/
/librockchip-mpp-static.substvars
/librockchip-mpp-static/
/librockchip-mpp1.substvars
/librockchip-mpp1/
/rockchip-mpp-demos.substvars
/rockchip-mpp-demos/
/librockchip-vpu0.substvars
/librockchip-vpu0/
/tmp/

View file

@ -0,0 +1,6 @@
mpp for Debian
--------------
<possible notes regarding this package - if none, delete this file>
-- Randy Li <randy.li@rock-chips.com> Wed, 03 Aug 2016 08:14:14 +0000

View file

@ -0,0 +1,10 @@
mpp for Debian
--------------
<this file describes information about the source package, see Debian policy
manual section 4.14. You WILL either need to modify or delete this file>
-- Randy Li <randy.li@rock-chips.com> Wed, 03 Aug 2016 08:14:14 +0000

256
thirdparty/rockchip-mpp/debian/changelog vendored Normal file
View file

@ -0,0 +1,256 @@
mpp (1.5.0-1) stable; urgency=critical
* [mpp_enc_impl]: Cleanup hal_task on empty eos task
...
-- Caesar Wang <wxt@rock-chips.com> Thu, 20 May 2021 09:40:00 +0800
mpp (1.4.0-1) stable; urgency=critical
[ Herman Chen ]
* [vp8d]: Remove unused table
[ timkingh.huang ]
* [h264e]: add SSE parameter check
[ Herman Chen ]
* [h264e]: Add qp min/max limit by bps max/min
[ timkingh.huang ]
* [h264e]: limit bit rate on movement scene
[ leo.ding ]
* [h264e]: fix bug: vepu1 h264 encode
* [h264d]: fix bug: when judge whether is end of frame
[ Herman Chen ]
* [rc]: Add bps information print
* [test]: Fix rc2 test rc_mode error
[ leo.ding ]
* [h264e]: fix bug: vepu h264 encode rate control
[ Herman Chen ]
* [osal]: Change mpp time print to us
* [h264e_rkv]: Fix error qp prev update
[ leo.ding ]
* [jpege]: add vepu1 jpeg encode support
* [osal]: linux: add -ldl -lct to link relative library
[ Herman Chen ]
* [oasl]: Add lock timing test
* [base]: Add mpp/base/test for task en/dequeue demo
[ Randy Li ]
* [jpege]: fix some compiler warnings
* [jpegd]: fix the compiler warnings and hide some symbols
* [osal]: fixup for a compiler warning
* [allocator]: force using drm allocator in Linux platform
* [vpu]: use the platform function to open device node
* [vp8d]: fix the vdpu2 decoding error
[ leo.ding ]
* [hal_vp9d]: change stride align to 256 odds
[ Randy Li ]
* [m2vd]: a various of fixup
[ Herman Chen ]
* [h264e]: Fix QP stuck error
[ timkingh.huang ]
* [h264e]: record rate control parameter
* [h264e]: tidy code
[ leo.ding ]
* [h264e]: fix bps check failed when mpi setup to fix_qp mode
[ Randy Li ]
* [jpege]: fixup mpp device
* Revert "[osal]: linux: add -ldl -lct to link relative library"
[ leo.ding ]
* [h265d]: fix bug: when has no short_rps, it should be has no rps
[ Randy Li ]
* [mpp_dec]: remove obsoleted code and format comments
* [mpp]: fixup for the deadlock in decoding
[ ayaka ]
* [test]: add timeout poll type sample code
[ leo.ding ]
* [h265d]: fix bug: malloc buffer matching
[ timkingh.huang ]
* [h264e]: fix rate-control bug
* [h264e]: allocate buffers before encoding
[ sliver.chen ]
* [h264]: fix xrgb encode bug
[ sayon.chen ]
* [h265d]: hiding the vps_id information
[ Randy Li ]
* [h264d]: add supporting for the interlace mode
[ leo.ding ]
* [mpg4d]: update spit mode in prepare
[ ZhouJing ]
* [m4vd]: add m4v decoder support for vdpu1
[ Randy Li ]
* [mpg4d]: fixup the compiler warnings
* .gitignore: ignore those debian generated files
[ timkingh.huang ]
* [h264e]: fix rate control bug
[ Randy Li ]
* [h264d]: move some variables to its scope
* [h264d]: handle svc_extension correctly
[ leo.ding ]
* [vpu_api_legacy]: disprese MPP_DEC_SET_FRAME_INFO function to each codec.
[ Randy Li ]
* [mpp]: wake up the parser thread in the correct place
[ sliver.chen ]
* [test]: add README.md for mpi unit test
* [test]: modify to avoid encode dead loop
[ leo.ding ]
* [avsd]: fix bugs: when video is field
* [mpp_buf_slot]: fix bug: should return the info_set frame back
* [avsd]: add dpb error marking
[ Randy Li ]
* [osal]: fixup for build in linux
* [mpp]: move header files into header directory
[ timkingh.huang ]
* [h264e]: add command of MPP_ENC_SET_QP_RANGE
* [h264e]: Clear OSD data when zero region number
[ sliver.chen ]
* [m2vd]: add m2vd parser mode
[ leo.ding ]
* [mpg4d]: fix hiding bugs when split mode
[ Herman Chen ]
* [base]: Remove misc buffer group creation
* [base]: Disable default print on exit
[ leo.ding ]
* [vpu_api]: add vpuCodecContext parameters
[ Randy Li ]
* [mpp_frame]: add complex formats and more comments
[ leo.ding ]
* [vp9d]: fix error: opening device should close, when deinit
[ Randy Li ]
* h264e: add supporting for more input pixel format
* [drm]: fix a various of bugs in drm allocator
* [drm]: use mmap() in native way for GNU Linux target
[ timkingh.huang ]
* [jpegd]: just scan parts of markers for rv1108
[ sliver.chen ]
* [h264e]: fix h264 xrgb encode bug
[ Herman Chen ]
* [ioctl]: Add compatible patch for different kernel
[ sayon.chen ]
* [rkvenc] modfiy ratecontrol to be more smooth
[ Randy Li ]
* [ion]: file descriptor for the external buffer
[ Herman Chen ]
* [hal_vp9d]: Fix buffer alignment conflict
[ sliver.chen ]
* [test]: add err info check when decode
* [osal]: force mpp use drm buffer when HAVE_DRM are defined.
[ timkingh.huang ]
* [h264e]: rate control for all intra stream
[ Randy Li ]
* [osal]: add queue data type
* [mpp]: use the blokcing queue on the input
* [mpp_list]: release the blocked thread at reset
[ leo.ding ]
* [hal_h264d]: add command for switch hard_mode
[ Randy Li ]
* [mpp]: silent lots of message
* [mpp_buf_slot]: return an error code when stride is invalid
* [jpegd]: stop the future work when the parser is error
* [osal]: add rk3036 platform
* [mpp]: rename and update build rules
* [legacy]: rename mpp legacy library
* [pkgconfig]: offer a sample for pkgconfig
* [build]: a simple build rules
-- Randy Li <randy.li@rock-chips.com> Tue, 21 Nov 2017 07:35:23 +0000
mpp (1.3.1-1) testing; urgency=medium
* [allocator]: force using drm allocator in Linux platform
* [mpp_buffer]: access the index field of buffer info
* [mpi]: decode_put_packet() would return the internal error
* [meta]: use fourcc format to store the meta data for those enum types
* [drm]: use mmap64() in native way for GNU Linux target
* [mpp/hal/vp8d]: rename and add device type info
* [mpp/hal/vp8d]: add support for VDPU1
* [mpp_frame]: export more functions to MppFrame fields
* [h264d]: make H.264 common data and functions together
* [h264d]: move the register table into the other file
* [test]: fix the align problem in decode_advanced()
* [jpegd] rename to its device type
* [jpegd]: isolate the common functions
* [jpegd]: add support for VDPU1
-- Randy Li <randy.li@rock-chips.com> Thu, 09 Mar 2017 09:52:21 +0000
mpp (1.3.0-1) testing; urgency=medium
* [mpp]: a fixup for wrong place scope symbols
* .gitignore: the intial version of gitignore
* build: support cross build in debian
* mpp: add pkgconfig file
* debian: support install for multiarch
* debian: add debian build rules
* utils: move the header files to common include directories
* osal: match system implementation with pre-defined marco
* osal: rename the directory of windows implementation
* osal: build: update the build system
* osal: build: use system default thread library
* osal: build: test: do not install unit test
* mpp: move header files into header directory
* mpp: test: build: rename the mpp library name in unit test
* mpp: legacy: rename mpp legacy library as rockchip_vpu
* mpp: build: update build rules
* build: a simple build rules
* mpp: install mpp library to target
* build: install development files
* build: add pkgconfig support
-- Randy Li <randy.li@rock-chips.com> Wed, 08 Feb 2017 08:37:49 +0000
mpp (73f2ee87a7f836daa6d09b3f65e5abd8e1380318-1) unstable; urgency=low
* The origin version from algorithmn group
-- Randy Li <randy.li@rock-chips.com> Sun, 05 Feb 2017 03:14:14 +0000

1
thirdparty/rockchip-mpp/debian/compat vendored Normal file
View file

@ -0,0 +1 @@
10

30
thirdparty/rockchip-mpp/debian/control vendored Normal file
View file

@ -0,0 +1,30 @@
Source: mpp
Priority: optional
Maintainer: Randy Li <randy.li@rock-chips.com>
Build-Depends: debhelper (>= 10), cmake, dh-exec
Standards-Version: 3.9.5
Section: libs
Homepage: http://www.rock-chips.com
#Vcs-Git: git://anonscm.debian.org/collab-maint/mpp.git
#Vcs-Browser: http://anonscm.debian.org/?p=collab-maint/mpp.git;a=summary
Package: librockchip-mpp-dev
Section: libdevel
Architecture: any
Depends: librockchip-mpp1 (= ${binary:Version}), ${misc:Depends}
Description: Media Process Platform
Package: librockchip-mpp1
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Media Process Platform
Package: librockchip-vpu0
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Media Process Platform
Package: rockchip-mpp-demos
Architecture: any
Depends: librockchip-mpp1 (= ${binary:Version}), librockchip-vpu0 (= ${binary:Version}), ${misc:Depends}
Description: Media Process Platform Demos

View file

@ -0,0 +1,18 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: Media Process Platform (MPP) module
Source: https://github.com/rockchip-linux/mpp
Files: *
Copyright: 2015 Herman Chen <herman.chen@rock-chips.com>
License: Apache-2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
.
http://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

2
thirdparty/rockchip-mpp/debian/docs vendored Normal file
View file

@ -0,0 +1,2 @@
readme.txt
readme.txt

View file

@ -0,0 +1,3 @@
#! /usr/bin/dh-exec
usr/include/*
usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/*

View file

@ -0,0 +1,3 @@
#! /usr/bin/dh-exec
usr/lib/${DEB_HOST_MULTIARCH}/librockchip_mpp.so
usr/lib/${DEB_HOST_MULTIARCH}/librockchip_mpp.so.*

View file

@ -0,0 +1,3 @@
#! /usr/bin/dh-exec
usr/lib/${DEB_HOST_MULTIARCH}/librockchip_vpu.so
usr/lib/${DEB_HOST_MULTIARCH}/librockchip_vpu.so.*

View file

@ -0,0 +1,2 @@
#! /usr/bin/dh-exec
usr/bin/*

32
thirdparty/rockchip-mpp/debian/rules vendored Executable file
View file

@ -0,0 +1,32 @@
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#DH_VERBOSE = 1
# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/*
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/default.mk
# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
export CMAKE_TOOLCHAIN_FILE=/etc/dpkg-cross/cmake/CMakeCross.txt
endif
# main packaging script based on dh7 syntax
%:
dh $@ --parallel --buildsystem=cmake
# debmake generated override targets
# This is example for Cmake (See http://bugs.debian.org/641051 )
override_dh_auto_configure:
dh_auto_configure -- \
-DCMAKE_BUILD_TYPE=Release \
-DARM_MIX_32_64=ON

View file

@ -0,0 +1 @@
3.0 (quilt)

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,112 @@
MPP (Media Process Platform) design (2016.10.12)
================================================================================
The mpp is a middleware library for Rockchip SoC's cross platform media process.
The main purpose of mpp is to provide very high performance, high flexibility
and expansibility on multimedia (mainly video and image) process.
The design target of mpp is to connect different Rockchip hardware kernel driver
and different userspace application.
Rockchip has two sets of hardware kernel driver.
The first one is vcodec_service/vpu_service/mpp_service which is a high
performance stateless frame base hardware kernel driver. This driver supports
all available codecs that hardware can provide. This driver is used on Android/
Linux.
The second one is v4l2 driver which is developed for ChromeOS. It currently
supports H.264/H.265/vp8/vp9. This driver is used on ChomeOS/Linux.
Mpp plans to support serval userspace applications including OpenMax,
gstreamer, libva.
Feature explaination
================================================================================
1. Cross Platform
The target OS platform including Android, Linux, ChromeOS and windows. Mpp uses
cmake to compile on different platform.
2. High Performance
Mpp supports sync / async interface to reduce the time blocked in interface. And
mpp internally make hardware and software run parallelly. When hardware is
running sofware will prepare next hardware task at the same time.
3. High Flexibility
mpi (Media Process Interface) is easy to extend by different control function.
The input/output element packet/frame/buffer is easy to extend different
components.
System Diagram
================================================================================
+---------------------------------------+
| |
| OpenMax / gstreamer / libva |
| |
+---------------------------------------+
+-------------------- MPP ----------------------+
| |
| +-------------------------+ +--------+ |
| | | | | |
| | MPI / MPP | | | |
| | buffer queue manage | | | |
| | | | | |
| +-------------------------+ | | |
| | | |
| +-------------------------+ | | |
| | | | | |
| | codec | | OSAL | |
| | decoder / encoder | | | |
| | | | | |
| +-------------------------+ | | |
| | | |
| +-----------+ +-----------+ | | |
| | | | | | | |
| | parser | | HAL | | | |
| | control | | reg_gen | | | |
| | | | | | | |
| +-----------+ +-----------+ +--------| |
| |
+-------------------- MPP ----------------------+
+---------------------------------------+
| |
| kernel |
| RK vcodec_service / v4l2 |
| |
+---------------------------------------+
Mpp is composed of four main sub-modules:
OSAL (Operation System Abstraction Layer)
This module shutters the differences between different operation systems and
provide basic components including memory, time, thread, log and hardware memory
allocator.
MPI (Media Process Interface) / MPP
This module is on charge of interaction with external user. Mpi layer has two
ways for user. The simple way - User can use put/get packet/frame function set.
The advanced way - User has to config MppTask and use dequeue/enqueue function
set to communicate with mpp. MppTask can carry different meta data and complete
complex work.
Codec (encoder / decoder)
This module implements the high efficiency internal work flow. The codec module
provides a general call flow for different video format. Software process will
be separated from hardware specified process. The software will communicate with
hardware with a common task interface which combines the buffer information and
codec specified infomation.
Parser/Controller and hal (Hardware Abstraction Layer)
This layer provides the implement function call of different video format and
different hardware. For decoder parser provide the video stream parse function
and output format related syntax structure to hal. The hal will translate the
syntax structure to register set on different hardware. Current hal supports
vcodec_service kernel driver and plan to support v4l2 driver later.

View file

@ -0,0 +1,70 @@
Hardware kernel driver design (2016.10.17)
================================================================================
Rockchip has two sets of hardware kernel driver.
The first one is vcodec_service/vpu_service/mpp_service which is a high
performance stateless frame base hardware kernel driver. This driver supports
all available codecs that hardware can provide. This driver is used on Android/
Linux.
Here is the vcodec_service kernel driver framework diagram.
+-------------+ +-------------+ +-------------+
| client A | | client B | | client C |
+-------------+ +-------------+ +-------------+
userspace
+------------------------------------------------------------------------------+
kernel
+-------------+ +-------------+ +-------------+
| session A | | session B | | session C |
+-------------+ +-------------+ +-------------+
| | | | | |
waiting done waiting done waiting done
| | | | | |
+---+---+ +---+---+ +---+---+ +---+---+ +---+---+
| task3 | | task0 | | task1 | | task0 | | task0 |
+---+---+ +-------+ +-------+ +-------+ +---+---+
| |
+---+---+ +---+---+
| task2 | | task1 |
+-------+ +-------+
+-----------+
| service |
+---------+-----------+---------+
| | |
waiting running done
| | |
+-----+-----+ +-----+-----+ +-----+-----+
| task A2 | | task A1 | | task C0 |
+-----+-----+ +-----------+ +-----+-----+
| |
+-----+-----+ +-----+-----+
| task B1 | | task C1 |
+-----+-----+ +-----+-----+
| |
+-----+-----+ +-----+-----+
| task A3 | | task A0 |
+-----------+ +-----+-----+
|
+-----+-----+
| task B0 |
+-----------+
The principle of this design is to separate user task handling and hardware
resource management and minimize the kernel serial process time between two
hardware process operation.
The driver uses session as communication channel. Each userspace client (client)
will have a kernel session. Client will commit tasks to session. Then hardware
is managed by service (vpu_service/vcodec_service). Service will provide the
ability to process tasks in sessions.
When client commits a task to kernel the task will be set to waiting status and
link to both session waiting list and service waiting list. Then service will
get task from waiting list to running list and run. When hardware finishs a task
the task will be moved to done list and put to both service done list and
session done list. Finally client will get the finished task from session.

View file

@ -0,0 +1,57 @@
Mpp buffer design (2016.10.12)
================================================================================
Mpp buffer is the warpper of the buffer used by hardware. Hardware usually can
not use the buffer malloc by cpu. Then we design MppBuffer for different memory
allocator on different platform. Currently it is designed for ion buffer on
Android and drm buffer on Linux. Later may support vb2_buffer in v4l2 devices.
In order to manage buffer usage in different user mpp buffer module introduces
MppBufferGroup as bufffer manager. All MppBuffer will connect to its manager.
MppBufferGroup provides allocator service and buffer reuse ability.
Different MppBufferGroup has different allocator. And besides normal malloc/free
function the allocator can also accept buffer from external file descriptor.
MppBufferGroup has two lists, unused buffer list and used buffer list. When
buffer is free buffer will not be released immediately. Buffer will be moved to
unused list for later reuse. There is a good reason for doing so. When video
resolution comes to 4K the buffer size will be above 12M. It will take a long
time to allocate buffer and generate map table for it. So reusing the buffer
will save the allocate/free time.
Here is the diagram of Mpp buffer status transaction.
+----------+ +---------+
| create | | commit |
+-----+----+ +----+----+
| |
| |
| +----v----+
+----------+ unused <-----------+
| +---------+ |
| | | |
| | | |
+-----v----+ | | +-----+----+
| malloc | | | | free |
+----------+ | | +----------+
| inc_ref | +---------+ | dec_ref |
+-----+----+ +-----^----+
| |
| |
| +---------+ |
+----------> used +-----------+
+---------+
| |
| |
| |
| |
| |
+----^----+
|
|
+----+----+
| import |
+---------+

View file

@ -0,0 +1,117 @@
MPP task design (2017.4.7)
================================================================================
Mpp task is the contain component for transaction with external user in advanced
mode. The target of advanced mode is to provide flexible, multiple input/output
content for extension.
Mpp task has mpp_meta as the rich content carrier. Mpp meta uses KEY and value
pair for extension. One task can carries multiple data into or out of mpp.
The typical case is encoder with OSD and motion detection. One task may contain
OSD buffer, motion detection buffer, frame buffer and stream buffer as input and
output stream buffer and motion detection buffer with data. And this case can
also be used on decoder if decoder wants to output some side information.
Mpp task transaction
================================================================================
1. Mpp task queue
Mpp task queue is the manager of tasks. Due to user may incorrectly use the task
we choose the design that hold all task inside mpp. Task queue will create and
release task. But task queue will not interact with user directly. We use port
and task status to control the transaction.
2. Mpp port
Mpp port is the transaction interface of task queue. External user and internal
worker thread will use mpp_port_poll / mpp_port_dequeue / mpp_port_enqueue
interface to poll / dequeue / enqueue the task task queue. Mpp advanced mode is
using port to connect external user, interface storage and internal process
thread. Each task queue has two port: input port and output port. And from a
global view the task will always flow from input port to output port.
3. Mpp task status
There are four status for one task. Mpp use list_head to represent the status.
INPUT_PORT : Initial status for input port user to dequeue. Or when output port
successfully enqueue a task then the task is on this status.
INPUT_HOLD : When input port user successfully dequeue a task then the task is
on this status.
OUTPUT_PORT: When input port user successfully enqueue a task then the task is
on OUTPUT_PORT status. And this task is ready for dequeue from
output port.
OUTPUT_HOLD: When output port user successfully dequeue a task then the task is
on this status.
4. Mpp task / port transaction
There are three transaction functions on a port: poll / dequeue / enqueue.
When port user call the transaction function task will be transfer from one
status to next status. The status transform flow is unidirectional from input
port to output port.
The overall relationship graph of task / port / status is shown below.
1. task queue
+------------------------------+
| |
+----+----+ +--------------+ +----+----+
| 4 | | 3 | | 2.1 |
+--------+ dequeue <--+ status <--+ enqueue <---------+
| | | | INPUT_PORT | | | |
| +---------+ | | +---------+ |
+------v-----+ | | +--------------+ | | +------+------+
| 3 | | 2 | | 2 | | 3 |
| status | | input | | output | | status |
| INPUT_HOLD | | port | | port | | OUTPUT_HOLD |
| | | | | | | |
+------+-----+ | | +--------------+ | | +------^------+
| +---------+ | 3 | +---------+ |
| | 4 | | status | | 2.1 | |
+--------> enqueue +--> INPUT_PORT +--> dequeue +---------+
| | | | | |
+----+----+ +--------------+ -----+----+
| |
+------------------------------+
Mpp task transaction of a complete work flow
================================================================================
On advanced mode mpp uses two task queue: input task queue and output task
queue.
Input task queue connects input side external user to internal worker thread.
Output task queue connects internal worker thread to output side external user.
Then there will be three threads to parallelize internal process and external
transation. This will maximize mpp efficiency.
The work flow is demonstrated as below graph.
+-------------------+ +-------------------+
| input side user | | output side user |
+----^---------+----+ +----^---------+----+
| | | |
+----+----+----v----+ +----+----+----v----+
| dequeue | enqueue | | dequeue | enqueue |
+----^----+----+----+ +----^----+----+----+
| | | |
+----+---------+----+ MPP +----+---------v----+
+---+ input port +-----------+ output port +---+
| +-------------------+ +-------------------+ |
| | input task queue | | output task queue | |
| +-------------------+ +-------------------+ |
| | output port | | input port | |
| +----+---------^----+ +----+---------^----+ |
| | | | | |
| +----v----+----+----+ +----v----+----+----+ |
| | dequeue | enqueue | | dequeue | enqueue | |
| +----+----+----^----+ +----+----+----^----+ |
| | | | | |
| +----v---------+---------------------v---------+----+ |
| | internal work thread | |
| +---------------------------------------------------+ |
| |
+-----------------------------------------------------------+

BIN
thirdparty/rockchip-mpp/doc/media/Figure01_MPP_system_framework.png (Stored with Git LFS) vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
thirdparty/rockchip-mpp/doc/media/Figure04_Normal_usage_of_MppBuffer.png (Stored with Git LFS) vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
thirdparty/rockchip-mpp/doc/media/Figure10_MppCtx_usage_process.png (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
thirdparty/rockchip-mpp/doc/media/Figure11_MPI_interface_range.png (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
thirdparty/rockchip-mpp/doc/media/Figure12_Decoder_multi_thread_usage.png (Stored with Git LFS) vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more