Signed-off-by: Roger Dammit <rogerdammit@gmail.com>lilik-openwrt-22.03
@ -0,0 +1,85 @@ | |||||
# | |||||
# Copyright (C) 2017 OpenWrt.org | |||||
# | |||||
# This is free software, licensed under the GNU General Public License v2. | |||||
# See /LICENSE for more information. | |||||
include $(TOPDIR)/rules.mk | |||||
PKG_SOURCE_PROTO:=git | |||||
PKG_SOURCE_URL:=https://github.com/mpromonet/v4l2rtspserver.git | |||||
PKG_SOURCE_VERSION:=d7e8dd4d35a802219222642a2e3b28f2dc5069c1 | |||||
PKG_DATE:=2017-12-20 | |||||
PKG_NAME:=v4l2rtspserver | |||||
PKG_VERSION:=$(PKG_DATE)-$(PKG_SOURCE_VERSION) | |||||
PKG_RELEASE:=1 | |||||
PKG_MAINTAINER:=Roger Dammit <rogerdammit@gmail.com> | |||||
LIVE555_VERSION:=2017.10.28 | |||||
LIVE555_MD5SUM:=a5acd14c4fa7b50f7270304d3b4a70ae | |||||
LIVE555_FILE:=live.$(LIVE555_VERSION).tar.gz | |||||
CMAKE_INSTALL:=1 | |||||
include $(INCLUDE_DIR)/package.mk | |||||
include $(INCLUDE_DIR)/cmake.mk | |||||
define Package/v4l2rtspserver | |||||
SECTION:=multimedia | |||||
CATEGORY:=Multimedia | |||||
TITLE:=v4l2rtspserver | |||||
DEPENDS:=+libstdcpp | |||||
URL:=https://github.com/mpromonet/v4l2rtspserver | |||||
endef | |||||
define Package/v4l2rtspserver/description | |||||
RTSP server for v4L2 video sources | |||||
endef | |||||
define Package/v4l2rtspserver/conffiles | |||||
/etc/config/v4l2rtspserver | |||||
endef | |||||
define Download/live555 | |||||
URL:=https://download.videolan.org/pub/contrib/live555/ | |||||
FILE:=$(LIVE555_FILE) | |||||
MD5SUM:=$(LIVE555_MD5SUM) | |||||
endef | |||||
define Build/Prepare | |||||
$(Build/Prepare/Default) | |||||
## need to compile some dependencies so that cmake will find them | |||||
# build live555 | |||||
$(eval $(call Download,live555)) | |||||
mkdir -p $(PKG_BUILD_DIR)/live555 | |||||
$(TAR) -xf $(DL_DIR)/$(LIVE555_FILE) --strip=1 -C $(PKG_BUILD_DIR)/live555 | |||||
$(CP) files/config.openwrt $(PKG_BUILD_DIR)/live555 | |||||
( cd $(PKG_BUILD_DIR)/live555; ./genMakefiles openwrt ) | |||||
$(MAKE) $(MAKE_FLAGS) -C $(PKG_BUILD_DIR)/live555 | |||||
$(MAKE) -C $(PKG_BUILD_DIR)/live555 PREFIX="$(STAGING_DIR)/usr/" install | |||||
# build v4l2wrapper | |||||
$(MAKE) $(MAKE_FLAGS) -C $(PKG_BUILD_DIR)/v4l2wrapper CFLAGS="$(TARGET_CFLAGS) -I $(PKG_BUILD_DIR)/v4l2wrapper/inc" | |||||
$(CP) $(PKG_BUILD_DIR)/v4l2wrapper/libv4l2wrapper.a $(PKG_BUILD_DIR) | |||||
# patch cmake file | |||||
$(SED) 's/DEBUG/RELEASE/' $(PKG_BUILD_DIR)/CMakeLists.txt | |||||
endef | |||||
define Package/v4l2rtspserver/install | |||||
$(INSTALL_DIR) $(1)/usr/bin | |||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/v4l2rtspserver-$(PKG_VERSION) $(1)/usr/bin/ | |||||
mv $(1)/usr/bin/v4l2rtspserver-$(PKG_VERSION) $(1)/usr/bin/v4l2rtspserver | |||||
$(INSTALL_DIR) $(1)/etc/init.d | |||||
$(INSTALL_BIN) files/v4l2rtspserver.init $(1)/etc/init.d/v4l2rtspserver | |||||
$(INSTALL_DIR) $(1)/etc/config | |||||
$(INSTALL_CONF) files/v4l2rtspserver.config $(1)/etc/config/v4l2rtspserver | |||||
endef | |||||
$(eval $(call BuildPackage,v4l2rtspserver)) |
@ -0,0 +1,19 @@ | |||||
COMPILE_OPTS = $(INCLUDES) -I. -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DLOCALE_NOT_USED -DNO_SSTREAM=1 -DALLOW_RTSP_SERVER_PORT_REUSE=1 | |||||
C = c | |||||
C_COMPILER = $(GCC) | |||||
CFLAGS += $(COMPILE_OPTS) | |||||
C_FLAGS = $(CFLAGS) | |||||
CPP = cpp | |||||
CPLUSPLUS_COMPILER = $(AS) # optimizations are only in AR apparently, so use instead of CXX | |||||
CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 | |||||
CPLUSPLUS_FLAGS += $(CPPFLAGS) -fexceptions | |||||
OBJ = o | |||||
LINK = $(CXX) -o | |||||
LINK_OPTS = -L. $(LDFLAGS) | |||||
CONSOLE_LINK_OPTS = $(LINK_OPTS) | |||||
LIBRARY_LINK = $(AR) cr | |||||
LIBRARY_LINK_OPTS = | |||||
LIB_SUFFIX = a | |||||
LIBS_FOR_CONSOLE_APPLICATION = $(CXXLIBS) | |||||
LIBS_FOR_GUI_APPLICATION = $(LIBS_FOR_CONSOLE_APPLICATION) | |||||
EXE = |
@ -0,0 +1,10 @@ | |||||
config v4l2rtspserver 'core' | |||||
option enabled '0' | |||||
option device '/dev/video0' | |||||
option port '554' | |||||
option resolution '640x480' | |||||
option fps '15' | |||||
option path 'stream' | |||||
option username 'openwrt' | |||||
option password 'openwrt' | |||||
option format 'h264' |
@ -0,0 +1,83 @@ | |||||
#!/bin/sh /etc/rc.common | |||||
# Copyright (C) 2017 OpenWrt.org | |||||
# TODO: | |||||
# * support start multiple streams with one server | |||||
# * support multiple usernames | |||||
# * support HLS, etc. | |||||
START=90 | |||||
STOP=10 | |||||
USE_PROCD=1 | |||||
SERVICE=v4l2rtspserver | |||||
PROG=/usr/bin/$SERVICE | |||||
error() { | |||||
logger -t "$SERVICE" "$@" | |||||
} | |||||
start_instance() { | |||||
local s="$1" | |||||
config_get_bool enabled "$1" 'enabled' 0 | |||||
[ $enabled -eq 0 ] && return | |||||
# validate device | |||||
config_get device "$s" 'device' | |||||
if [ ! -c "$device" ]; then | |||||
error "device '$device' does not exist" | |||||
return 1 | |||||
fi | |||||
# get options | |||||
config_get port "$s" 'port' | |||||
config_get resolution "$s" 'resolution' | |||||
config_get fps "$s" 'fps' | |||||
config_get username "$s" 'username' | |||||
config_get password "$s" 'password' | |||||
config_get path "$s" 'path' | |||||
config_get format "$s" 'format' | |||||
# pull out resolution width and height from string | |||||
local w="$(echo $resolution | cut -d'x' -f1)" | |||||
local h="$(echo $resolution | cut -d'x' -f2)" | |||||
# make sure format is uppercase | |||||
format="$(echo $format | tr a-z A-Z)" | |||||
# build args | |||||
local args="-s" | |||||
args="$args -P $port" | |||||
args="$args -u ${path}" | |||||
args="$args -F $fps" | |||||
args="$args -W $w" | |||||
args="$args -H $h" | |||||
args="$args -f$format" | |||||
args="$args -c" # fixes issue with corrupt frames with H264 | |||||
if [ -n "$username" ]; then | |||||
args="$args -U ${username}:${password}" | |||||
fi | |||||
cmd="$PROG $args $device" | |||||
# procd stuff | |||||
procd_open_instance | |||||
procd_set_param file /etc/config/$SERVICE | |||||
procd_set_param command $cmd | |||||
procd_set_param stdout 1 | |||||
procd_set_param stderr 1 | |||||
procd_add_mdns "rtsp" "tcp" "$port" "daemon=$SERVICE" "path=/$path" | |||||
procd_close_instance | |||||
} | |||||
start_service() { | |||||
config_load "$SERVICE" | |||||
config_foreach start_instance "$SERVICE" | |||||
} | |||||
service_triggers() { | |||||
procd_add_reload_trigger "$SERVICE" | |||||
} |