diff --git a/board/common/mkimage.sh b/board/common/mkimage.sh index 68c37e3fbd..b20f23578e 100755 --- a/board/common/mkimage.sh +++ b/board/common/mkimage.sh @@ -22,7 +22,7 @@ ROOT_START="100" # MB ROOT_SRC=${IMG_DIR}/rootfs.tar ROOT=${IMG_DIR}/.root ROOT_IMG=${IMG_DIR}/root.img -ROOT_SIZE="200" # MB +ROOT_SIZE="220" # MB GUARD_SIZE="10" # MB DISK_SIZE=$((ROOT_START + ROOT_SIZE + GUARD_SIZE)) diff --git a/board/raspberrypi/overlay/usr/bin/streameye.sh b/board/raspberrypi/overlay/usr/bin/streameye.sh index 612ad76ea1..7afe858225 100755 --- a/board/raspberrypi/overlay/usr/bin/streameye.sh +++ b/board/raspberrypi/overlay/usr/bin/streameye.sh @@ -2,6 +2,7 @@ RASPIMJPEG_CONF=/data/etc/raspimjpeg.conf RASPIMJPEG_LOG=/var/log/raspimjpeg.log +GSTREAMER_LOG=/var/log/gstreamer.log MOTIONEYE_CONF=/data/etc/motioneye.conf STREAMEYE_CONF=/data/etc/streameye.conf STREAMEYE_LOG=/var/log/streameye.log @@ -11,45 +12,230 @@ test -r ${RASPIMJPEG_CONF} || exit 1 test -r ${STREAMEYE_CONF} || exit 1 watch() { + source ${STREAMEYE_CONF} count=0 while true; do sleep 5 - if ! ps aux | grep raspimjpeg.py | grep -v grep &>/dev/null; then - logger -t streameye -s "not running, respawning" - start + if [ "${PROTO}" = "rtsp" ]; then + if ! ps aux | grep test-launch | grep -v grep &>/dev/null; then + logger -t streameye -s "not running, respawning" + start + fi + else + if ! ps aux | grep raspimjpeg.py | grep -v grep &>/dev/null; then + logger -t streameye -s "not running, respawning" + start + fi fi done } -function start() { - pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) - if [ -n "${pid}" ]; then - return +function configure_v4l2_cam() { + video_arg="-d $1" + + horizontal_flip="0" + hflip=$(grep -e ^hflip ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${hflip}" = "true" ]; then horizontal_flip="1"; fi + v4l2-ctl ${video_arg} --set-ctrl=horizontal_flip=${horizontal_flip} &>/dev/null + + vertical_flip="0" + vflip=$(grep -e ^vflip ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${vflip}" = "true" ]; then vertical_flip="1"; fi + v4l2-ctl ${video_arg} --set-ctrl=vertical_flip=${vertical_flip} &>/dev/null + + rotate=$(grep -e ^rotation ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${rotate}" ]; then rotate="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=rotate=${rotate} &>/dev/null + + brightness=$(grep -e ^brightness ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${brightness}" ]; then brightness="50"; fi + v4l2-ctl ${video_arg} --set-ctrl=brightness=${brightness} &>/dev/null + + contrast=$(grep -e ^contrast ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${contrast}" ]; then contrast="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=contrast=${contrast} &>/dev/null + + saturation=$(grep -e ^saturation ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${saturation}" ]; then saturation="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=saturation=${saturation} &>/dev/null + + sharpness=$(grep -e ^sharpness ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${sharpness}" ]; then sharpness="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=sharpness=${sharpness} &>/dev/null + + vstab=$(grep -e ^vstab ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${vstab}" ]; then vstab="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=image_stabilization=${vstab} &>/dev/null + + shutter=$(grep -e ^shutter ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${shutter}" ]; then shutter="0"; fi + if [ "${#shutter}" -gt 2 ]; then shutter=$(echo ${shutter/%??/}); else shutter="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=exposure_time_absolute=${shutter} &>/dev/null + + iso=$(grep -e ^iso ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${iso}" ]; then iso="0"; fi + if [ "${iso}" -ge 800 ]; then iso="4" + elif [ "${iso}" -ge 400 ]; then iso="3" + elif [ "${iso}" -ge 200 ]; then iso="2" + elif [ "${iso}" -ge 100 ]; then iso="1" + else iso="0" fi + v4l2-ctl ${video_arg} --set-ctrl=iso_sensitivity=${iso} &>/dev/null - raspimjpeg_opts="" - while read line; do - if echo "${line}" | grep false &>/dev/null; then - continue - fi - if echo "${line}" | grep true &>/dev/null; then - line=$(echo ${line} | cut -d ' ' -f 1) - fi - raspimjpeg_opts="${raspimjpeg_opts} --${line}" - done < ${RASPIMJPEG_CONF} + awb=$(grep -e ^awb ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${awb}" = "off" ]; then awb="0" + elif [ "${awb}" = "auto" ]; then awb="1" + elif [ "${awb}" = "sunlight" ]; then awb="6" + elif [ "${awb}" = "cloudy" ]; then awb="8" + elif [ "${awb}" = "shade" ]; then awb="9" + elif [ "${awb}" = "tungsten" ]; then awb="4" + elif [ "${awb}" = "fluorescent" ]; then awb="3" + elif [ "${awb}" = "incandescent" ]; then awb="2" + elif [ "${awb}" = "flash" ]; then awb="7" + elif [ "${awb}" = "horizon" ]; then awb="5" + else awb="1" + fi + v4l2-ctl ${video_arg} --set-ctrl=white_balance_auto_preset=${awb} &>/dev/null + metering=$(grep -e ^metering ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${metering}" = "spot" ]; then metering="2" + elif [ "${metering}" = "center" ]; then metering="1" + else metering="0" + fi + v4l2-ctl ${video_arg} --set-ctrl=exposure_metering_mode=${awb} &>/dev/null + + scene="0" + exposure=$(grep -e ^exposure ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${exposure}" = "off" ]; then + exposure="1" + else + if [ "${exposure}" = "night" ]; then scene="8" + elif [ "${exposure}" = "backlight" ]; then scene="1" + elif [ "${exposure}" = "sports" ]; then scene="11" + elif [ "${exposure}" = "snow" ]; then scene="2" + elif [ "${exposure}" = "beach" ]; then scene="2" + elif [ "${exposure}" = "fireworks" ]; then scene="6" + fi + exposure="0" + fi + v4l2-ctl ${video_arg} --set-ctrl=auto_exposure=${exposure} &>/dev/null + v4l2-ctl ${video_arg} --set-ctrl=scene_mode=${scene} &>/dev/null + + ev=$(grep -e ^ev ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${ev}" ]; then ev="0"; fi + ev=$(expr ${ev} + 25) + ev=$(expr ${ev} / 2) + if [ "${ev}" -gt 24 ]; then ev="24"; fi + v4l2-ctl ${video_arg} --set-ctrl=auto_exposure_bias=${ev} &>/dev/null + + video_bitrate=$(grep -e ^bitrate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${video_bitrate}" ]; then video_bitrate="1000000"; fi + v4l2-ctl ${video_arg} --set-ctrl=video_bitrate=${video_bitrate} &>/dev/null +} + +invalid_opt () { + local e match="$1" + shift + for e; do [[ "${e}" == "${match}" ]] && return 1; done + return 0 +} + +function start() { source ${STREAMEYE_CONF} streameye_opts="-p ${PORT}" if [ -n "${CREDENTIALS}" ] && [ "${AUTH}" = "basic" ]; then streameye_opts="${streameye_opts} -a basic -c ${CREDENTIALS}" fi - if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then - raspimjpeg_opts="${raspimjpeg_opts} -d" - streameye_opts="${streameye_opts} -d" - fi + if [ "${PROTO}" = "rtsp" ]; then + pid=$(ps | grep test-launch | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + if [ -n "${pid}" ]; then + return + fi - raspimjpeg.py ${raspimjpeg_opts} 2>${RASPIMJPEG_LOG} | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + iptables -A INPUT -p tcp -s localhost --dport 554 -j ACCEPT + iptables -A INPUT -p tcp --dport 554 -j DROP + + audio_opts="" + if [ -n "${AUDIO_DEV}" ]; then + audio_bitrate=$(grep -e ^audio_bitrate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + audio_channels=$(grep -e ^audio_channels ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + audio_extras="" + if [ -n "${audio_bitrate}" ]; then + audio_extras="${audio_extras},rate=${audio_bitrate}" + fi + if [ -n "${audio_channels}" ]; then + audio_extras="${audio_extras},channels=${audio_channels}" + fi + audio_opts="alsasrc device=${AUDIO_DEV} ! audioresample ! audio/x-raw${audio_extras} ! queue ! voaacenc ! rtpmp4gpay pt=97 name=pay1" + fi + video_path="/dev/video0" + if [ -n "${VIDEO_DEV}" ]; then + video_path=${VIDEO_DEV} + fi + if [ -e "${video_path}" ]; then + # Only configure camera if it is a Pi Cam + if v4l2-ctl -d ${video_path} -D | grep -q 'bm2835 mmal'; then + configure_v4l2_cam ${video_path} + fi + width=$(grep -e ^width ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + height=$(grep -e ^height ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + framerate=$(grep -e ^framerate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + video_extras="" + if [ -n "${width}" ]; then + video_extras="${video_extras},width=${width}" + fi + if [ -n "${height}" ]; then + video_extras="${video_extras},height=${height}" + fi + if [ -n "${framerate}" ]; then + video_extras="${video_extras},framerate=${framerate}/1" + fi + video_opts="v4l2src device=${video_path} ! video/x-h264${video_extras} ! h264parse ! rtph264pay name=pay0 pt=96" + + if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then + streameye_opts="${streameye_opts} -d" + fi + + test-launch -p 554 -m h264 "\"( ${video_opts} ${audio_opts} )\"" &>${GSTREAMER_LOG} & + sleep 10 + gst-launch-1.0 -v rtspsrc location=rtsp://127.0.0.1:554/h264 latency=0 drop-on-latency=1 ! rtph264depay ! h264parse ! omxh264dec ! videorate ! video/x-raw,framerate=5/1 ! jpegenc ! filesink location=/dev/stdout | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + sleep 5 + fi + + iptables -D INPUT -p tcp --dport 554 -j DROP + iptables -D INPUT -p tcp -s localhost --dport 554 -j ACCEPT + + else + pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + if [ -n "${pid}" ]; then + return + fi + + valid_opts=("awb" "brightness" "contrast" "denoise" "drc" "ev" "exposure" "framerate" "height" "hflip" "imxfx" "iso" "metering" "preview" "quality" "rotation" "saturation" "sharpness" "shutter" "vflip" "vstab" "width" "zoom") + raspimjpeg_opts="" + while read line; do + key=$(echo ${line} | cut -d ' ' -f 1) + if invalid_opt "${key}" "${valid_opts[@]}"; then + continue + fi + if echo "${line}" | grep false &>/dev/null; then + continue + fi + if echo "${line}" | grep true &>/dev/null; then + line=${key} + fi + raspimjpeg_opts="${raspimjpeg_opts} --${line}" + done < ${RASPIMJPEG_CONF} + + if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then + raspimjpeg_opts="${raspimjpeg_opts} -d" + streameye_opts="${streameye_opts} -d" + fi + + raspimjpeg.py ${raspimjpeg_opts} 2>${RASPIMJPEG_LOG} | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + + fi } function stop() { @@ -57,18 +243,41 @@ function stop() { ps | grep streameye.sh | grep -v $$ | grep -v S94streameye| grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1 | xargs -r kill # stop the raspimjpeg process - pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) - if [ -z "${pid}" ]; then - return + raspimjpeg_pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + # stop the gst-launch-1.0 process + gst_launch_pid=$(ps | grep gst-launch-1.0 | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + # stop the test-launch process + test_launch_pid=$(ps | grep test-launch | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + + if [ -n "${raspimjpeg_pid}" ]; then + kill -HUP "${raspimjpeg_pid}" &>/dev/null + count=0 + while kill -0 "${raspimjpeg_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${raspimjpeg_pid}" &>/dev/null || true fi - kill -HUP "${pid}" &>/dev/null - count=0 - while kill -0 "${pid}" &>/dev/null && [ ${count} -lt 5 ]; do - sleep 1 - count=$((${count} + 1)) - done - kill -KILL "${pid}" &>/dev/null || true + if [ -n "${gst_launch_pid}" ]; then + kill -HUP "${gst_launch_pid}" &>/dev/null + count=0 + while kill -0 "${gst_launch_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${gst_launch_pid}" &>/dev/null || true + fi + + if [ -n "${test_launch_pid}" ]; then + kill -HUP "${test_launch_pid}" &>/dev/null + count=0 + while kill -0 "${test_launch_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${test_launch_pid}" &>/dev/null || true + fi } case "$1" in diff --git a/board/raspberrypi2/overlay/usr/bin/streameye.sh b/board/raspberrypi2/overlay/usr/bin/streameye.sh index 612ad76ea1..7afe858225 100755 --- a/board/raspberrypi2/overlay/usr/bin/streameye.sh +++ b/board/raspberrypi2/overlay/usr/bin/streameye.sh @@ -2,6 +2,7 @@ RASPIMJPEG_CONF=/data/etc/raspimjpeg.conf RASPIMJPEG_LOG=/var/log/raspimjpeg.log +GSTREAMER_LOG=/var/log/gstreamer.log MOTIONEYE_CONF=/data/etc/motioneye.conf STREAMEYE_CONF=/data/etc/streameye.conf STREAMEYE_LOG=/var/log/streameye.log @@ -11,45 +12,230 @@ test -r ${RASPIMJPEG_CONF} || exit 1 test -r ${STREAMEYE_CONF} || exit 1 watch() { + source ${STREAMEYE_CONF} count=0 while true; do sleep 5 - if ! ps aux | grep raspimjpeg.py | grep -v grep &>/dev/null; then - logger -t streameye -s "not running, respawning" - start + if [ "${PROTO}" = "rtsp" ]; then + if ! ps aux | grep test-launch | grep -v grep &>/dev/null; then + logger -t streameye -s "not running, respawning" + start + fi + else + if ! ps aux | grep raspimjpeg.py | grep -v grep &>/dev/null; then + logger -t streameye -s "not running, respawning" + start + fi fi done } -function start() { - pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) - if [ -n "${pid}" ]; then - return +function configure_v4l2_cam() { + video_arg="-d $1" + + horizontal_flip="0" + hflip=$(grep -e ^hflip ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${hflip}" = "true" ]; then horizontal_flip="1"; fi + v4l2-ctl ${video_arg} --set-ctrl=horizontal_flip=${horizontal_flip} &>/dev/null + + vertical_flip="0" + vflip=$(grep -e ^vflip ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${vflip}" = "true" ]; then vertical_flip="1"; fi + v4l2-ctl ${video_arg} --set-ctrl=vertical_flip=${vertical_flip} &>/dev/null + + rotate=$(grep -e ^rotation ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${rotate}" ]; then rotate="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=rotate=${rotate} &>/dev/null + + brightness=$(grep -e ^brightness ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${brightness}" ]; then brightness="50"; fi + v4l2-ctl ${video_arg} --set-ctrl=brightness=${brightness} &>/dev/null + + contrast=$(grep -e ^contrast ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${contrast}" ]; then contrast="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=contrast=${contrast} &>/dev/null + + saturation=$(grep -e ^saturation ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${saturation}" ]; then saturation="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=saturation=${saturation} &>/dev/null + + sharpness=$(grep -e ^sharpness ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${sharpness}" ]; then sharpness="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=sharpness=${sharpness} &>/dev/null + + vstab=$(grep -e ^vstab ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${vstab}" ]; then vstab="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=image_stabilization=${vstab} &>/dev/null + + shutter=$(grep -e ^shutter ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${shutter}" ]; then shutter="0"; fi + if [ "${#shutter}" -gt 2 ]; then shutter=$(echo ${shutter/%??/}); else shutter="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=exposure_time_absolute=${shutter} &>/dev/null + + iso=$(grep -e ^iso ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${iso}" ]; then iso="0"; fi + if [ "${iso}" -ge 800 ]; then iso="4" + elif [ "${iso}" -ge 400 ]; then iso="3" + elif [ "${iso}" -ge 200 ]; then iso="2" + elif [ "${iso}" -ge 100 ]; then iso="1" + else iso="0" fi + v4l2-ctl ${video_arg} --set-ctrl=iso_sensitivity=${iso} &>/dev/null - raspimjpeg_opts="" - while read line; do - if echo "${line}" | grep false &>/dev/null; then - continue - fi - if echo "${line}" | grep true &>/dev/null; then - line=$(echo ${line} | cut -d ' ' -f 1) - fi - raspimjpeg_opts="${raspimjpeg_opts} --${line}" - done < ${RASPIMJPEG_CONF} + awb=$(grep -e ^awb ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${awb}" = "off" ]; then awb="0" + elif [ "${awb}" = "auto" ]; then awb="1" + elif [ "${awb}" = "sunlight" ]; then awb="6" + elif [ "${awb}" = "cloudy" ]; then awb="8" + elif [ "${awb}" = "shade" ]; then awb="9" + elif [ "${awb}" = "tungsten" ]; then awb="4" + elif [ "${awb}" = "fluorescent" ]; then awb="3" + elif [ "${awb}" = "incandescent" ]; then awb="2" + elif [ "${awb}" = "flash" ]; then awb="7" + elif [ "${awb}" = "horizon" ]; then awb="5" + else awb="1" + fi + v4l2-ctl ${video_arg} --set-ctrl=white_balance_auto_preset=${awb} &>/dev/null + metering=$(grep -e ^metering ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${metering}" = "spot" ]; then metering="2" + elif [ "${metering}" = "center" ]; then metering="1" + else metering="0" + fi + v4l2-ctl ${video_arg} --set-ctrl=exposure_metering_mode=${awb} &>/dev/null + + scene="0" + exposure=$(grep -e ^exposure ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${exposure}" = "off" ]; then + exposure="1" + else + if [ "${exposure}" = "night" ]; then scene="8" + elif [ "${exposure}" = "backlight" ]; then scene="1" + elif [ "${exposure}" = "sports" ]; then scene="11" + elif [ "${exposure}" = "snow" ]; then scene="2" + elif [ "${exposure}" = "beach" ]; then scene="2" + elif [ "${exposure}" = "fireworks" ]; then scene="6" + fi + exposure="0" + fi + v4l2-ctl ${video_arg} --set-ctrl=auto_exposure=${exposure} &>/dev/null + v4l2-ctl ${video_arg} --set-ctrl=scene_mode=${scene} &>/dev/null + + ev=$(grep -e ^ev ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${ev}" ]; then ev="0"; fi + ev=$(expr ${ev} + 25) + ev=$(expr ${ev} / 2) + if [ "${ev}" -gt 24 ]; then ev="24"; fi + v4l2-ctl ${video_arg} --set-ctrl=auto_exposure_bias=${ev} &>/dev/null + + video_bitrate=$(grep -e ^bitrate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${video_bitrate}" ]; then video_bitrate="1000000"; fi + v4l2-ctl ${video_arg} --set-ctrl=video_bitrate=${video_bitrate} &>/dev/null +} + +invalid_opt () { + local e match="$1" + shift + for e; do [[ "${e}" == "${match}" ]] && return 1; done + return 0 +} + +function start() { source ${STREAMEYE_CONF} streameye_opts="-p ${PORT}" if [ -n "${CREDENTIALS}" ] && [ "${AUTH}" = "basic" ]; then streameye_opts="${streameye_opts} -a basic -c ${CREDENTIALS}" fi - if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then - raspimjpeg_opts="${raspimjpeg_opts} -d" - streameye_opts="${streameye_opts} -d" - fi + if [ "${PROTO}" = "rtsp" ]; then + pid=$(ps | grep test-launch | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + if [ -n "${pid}" ]; then + return + fi - raspimjpeg.py ${raspimjpeg_opts} 2>${RASPIMJPEG_LOG} | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + iptables -A INPUT -p tcp -s localhost --dport 554 -j ACCEPT + iptables -A INPUT -p tcp --dport 554 -j DROP + + audio_opts="" + if [ -n "${AUDIO_DEV}" ]; then + audio_bitrate=$(grep -e ^audio_bitrate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + audio_channels=$(grep -e ^audio_channels ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + audio_extras="" + if [ -n "${audio_bitrate}" ]; then + audio_extras="${audio_extras},rate=${audio_bitrate}" + fi + if [ -n "${audio_channels}" ]; then + audio_extras="${audio_extras},channels=${audio_channels}" + fi + audio_opts="alsasrc device=${AUDIO_DEV} ! audioresample ! audio/x-raw${audio_extras} ! queue ! voaacenc ! rtpmp4gpay pt=97 name=pay1" + fi + video_path="/dev/video0" + if [ -n "${VIDEO_DEV}" ]; then + video_path=${VIDEO_DEV} + fi + if [ -e "${video_path}" ]; then + # Only configure camera if it is a Pi Cam + if v4l2-ctl -d ${video_path} -D | grep -q 'bm2835 mmal'; then + configure_v4l2_cam ${video_path} + fi + width=$(grep -e ^width ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + height=$(grep -e ^height ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + framerate=$(grep -e ^framerate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + video_extras="" + if [ -n "${width}" ]; then + video_extras="${video_extras},width=${width}" + fi + if [ -n "${height}" ]; then + video_extras="${video_extras},height=${height}" + fi + if [ -n "${framerate}" ]; then + video_extras="${video_extras},framerate=${framerate}/1" + fi + video_opts="v4l2src device=${video_path} ! video/x-h264${video_extras} ! h264parse ! rtph264pay name=pay0 pt=96" + + if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then + streameye_opts="${streameye_opts} -d" + fi + + test-launch -p 554 -m h264 "\"( ${video_opts} ${audio_opts} )\"" &>${GSTREAMER_LOG} & + sleep 10 + gst-launch-1.0 -v rtspsrc location=rtsp://127.0.0.1:554/h264 latency=0 drop-on-latency=1 ! rtph264depay ! h264parse ! omxh264dec ! videorate ! video/x-raw,framerate=5/1 ! jpegenc ! filesink location=/dev/stdout | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + sleep 5 + fi + + iptables -D INPUT -p tcp --dport 554 -j DROP + iptables -D INPUT -p tcp -s localhost --dport 554 -j ACCEPT + + else + pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + if [ -n "${pid}" ]; then + return + fi + + valid_opts=("awb" "brightness" "contrast" "denoise" "drc" "ev" "exposure" "framerate" "height" "hflip" "imxfx" "iso" "metering" "preview" "quality" "rotation" "saturation" "sharpness" "shutter" "vflip" "vstab" "width" "zoom") + raspimjpeg_opts="" + while read line; do + key=$(echo ${line} | cut -d ' ' -f 1) + if invalid_opt "${key}" "${valid_opts[@]}"; then + continue + fi + if echo "${line}" | grep false &>/dev/null; then + continue + fi + if echo "${line}" | grep true &>/dev/null; then + line=${key} + fi + raspimjpeg_opts="${raspimjpeg_opts} --${line}" + done < ${RASPIMJPEG_CONF} + + if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then + raspimjpeg_opts="${raspimjpeg_opts} -d" + streameye_opts="${streameye_opts} -d" + fi + + raspimjpeg.py ${raspimjpeg_opts} 2>${RASPIMJPEG_LOG} | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + + fi } function stop() { @@ -57,18 +243,41 @@ function stop() { ps | grep streameye.sh | grep -v $$ | grep -v S94streameye| grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1 | xargs -r kill # stop the raspimjpeg process - pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) - if [ -z "${pid}" ]; then - return + raspimjpeg_pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + # stop the gst-launch-1.0 process + gst_launch_pid=$(ps | grep gst-launch-1.0 | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + # stop the test-launch process + test_launch_pid=$(ps | grep test-launch | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + + if [ -n "${raspimjpeg_pid}" ]; then + kill -HUP "${raspimjpeg_pid}" &>/dev/null + count=0 + while kill -0 "${raspimjpeg_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${raspimjpeg_pid}" &>/dev/null || true fi - kill -HUP "${pid}" &>/dev/null - count=0 - while kill -0 "${pid}" &>/dev/null && [ ${count} -lt 5 ]; do - sleep 1 - count=$((${count} + 1)) - done - kill -KILL "${pid}" &>/dev/null || true + if [ -n "${gst_launch_pid}" ]; then + kill -HUP "${gst_launch_pid}" &>/dev/null + count=0 + while kill -0 "${gst_launch_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${gst_launch_pid}" &>/dev/null || true + fi + + if [ -n "${test_launch_pid}" ]; then + kill -HUP "${test_launch_pid}" &>/dev/null + count=0 + while kill -0 "${test_launch_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${test_launch_pid}" &>/dev/null || true + fi } case "$1" in diff --git a/board/raspberrypi3/overlay/usr/bin/streameye.sh b/board/raspberrypi3/overlay/usr/bin/streameye.sh index 612ad76ea1..7afe858225 100755 --- a/board/raspberrypi3/overlay/usr/bin/streameye.sh +++ b/board/raspberrypi3/overlay/usr/bin/streameye.sh @@ -2,6 +2,7 @@ RASPIMJPEG_CONF=/data/etc/raspimjpeg.conf RASPIMJPEG_LOG=/var/log/raspimjpeg.log +GSTREAMER_LOG=/var/log/gstreamer.log MOTIONEYE_CONF=/data/etc/motioneye.conf STREAMEYE_CONF=/data/etc/streameye.conf STREAMEYE_LOG=/var/log/streameye.log @@ -11,45 +12,230 @@ test -r ${RASPIMJPEG_CONF} || exit 1 test -r ${STREAMEYE_CONF} || exit 1 watch() { + source ${STREAMEYE_CONF} count=0 while true; do sleep 5 - if ! ps aux | grep raspimjpeg.py | grep -v grep &>/dev/null; then - logger -t streameye -s "not running, respawning" - start + if [ "${PROTO}" = "rtsp" ]; then + if ! ps aux | grep test-launch | grep -v grep &>/dev/null; then + logger -t streameye -s "not running, respawning" + start + fi + else + if ! ps aux | grep raspimjpeg.py | grep -v grep &>/dev/null; then + logger -t streameye -s "not running, respawning" + start + fi fi done } -function start() { - pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) - if [ -n "${pid}" ]; then - return +function configure_v4l2_cam() { + video_arg="-d $1" + + horizontal_flip="0" + hflip=$(grep -e ^hflip ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${hflip}" = "true" ]; then horizontal_flip="1"; fi + v4l2-ctl ${video_arg} --set-ctrl=horizontal_flip=${horizontal_flip} &>/dev/null + + vertical_flip="0" + vflip=$(grep -e ^vflip ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${vflip}" = "true" ]; then vertical_flip="1"; fi + v4l2-ctl ${video_arg} --set-ctrl=vertical_flip=${vertical_flip} &>/dev/null + + rotate=$(grep -e ^rotation ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${rotate}" ]; then rotate="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=rotate=${rotate} &>/dev/null + + brightness=$(grep -e ^brightness ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${brightness}" ]; then brightness="50"; fi + v4l2-ctl ${video_arg} --set-ctrl=brightness=${brightness} &>/dev/null + + contrast=$(grep -e ^contrast ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${contrast}" ]; then contrast="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=contrast=${contrast} &>/dev/null + + saturation=$(grep -e ^saturation ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${saturation}" ]; then saturation="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=saturation=${saturation} &>/dev/null + + sharpness=$(grep -e ^sharpness ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${sharpness}" ]; then sharpness="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=sharpness=${sharpness} &>/dev/null + + vstab=$(grep -e ^vstab ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${vstab}" ]; then vstab="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=image_stabilization=${vstab} &>/dev/null + + shutter=$(grep -e ^shutter ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${shutter}" ]; then shutter="0"; fi + if [ "${#shutter}" -gt 2 ]; then shutter=$(echo ${shutter/%??/}); else shutter="0"; fi + v4l2-ctl ${video_arg} --set-ctrl=exposure_time_absolute=${shutter} &>/dev/null + + iso=$(grep -e ^iso ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${iso}" ]; then iso="0"; fi + if [ "${iso}" -ge 800 ]; then iso="4" + elif [ "${iso}" -ge 400 ]; then iso="3" + elif [ "${iso}" -ge 200 ]; then iso="2" + elif [ "${iso}" -ge 100 ]; then iso="1" + else iso="0" fi + v4l2-ctl ${video_arg} --set-ctrl=iso_sensitivity=${iso} &>/dev/null - raspimjpeg_opts="" - while read line; do - if echo "${line}" | grep false &>/dev/null; then - continue - fi - if echo "${line}" | grep true &>/dev/null; then - line=$(echo ${line} | cut -d ' ' -f 1) - fi - raspimjpeg_opts="${raspimjpeg_opts} --${line}" - done < ${RASPIMJPEG_CONF} + awb=$(grep -e ^awb ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${awb}" = "off" ]; then awb="0" + elif [ "${awb}" = "auto" ]; then awb="1" + elif [ "${awb}" = "sunlight" ]; then awb="6" + elif [ "${awb}" = "cloudy" ]; then awb="8" + elif [ "${awb}" = "shade" ]; then awb="9" + elif [ "${awb}" = "tungsten" ]; then awb="4" + elif [ "${awb}" = "fluorescent" ]; then awb="3" + elif [ "${awb}" = "incandescent" ]; then awb="2" + elif [ "${awb}" = "flash" ]; then awb="7" + elif [ "${awb}" = "horizon" ]; then awb="5" + else awb="1" + fi + v4l2-ctl ${video_arg} --set-ctrl=white_balance_auto_preset=${awb} &>/dev/null + metering=$(grep -e ^metering ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${metering}" = "spot" ]; then metering="2" + elif [ "${metering}" = "center" ]; then metering="1" + else metering="0" + fi + v4l2-ctl ${video_arg} --set-ctrl=exposure_metering_mode=${awb} &>/dev/null + + scene="0" + exposure=$(grep -e ^exposure ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ "${exposure}" = "off" ]; then + exposure="1" + else + if [ "${exposure}" = "night" ]; then scene="8" + elif [ "${exposure}" = "backlight" ]; then scene="1" + elif [ "${exposure}" = "sports" ]; then scene="11" + elif [ "${exposure}" = "snow" ]; then scene="2" + elif [ "${exposure}" = "beach" ]; then scene="2" + elif [ "${exposure}" = "fireworks" ]; then scene="6" + fi + exposure="0" + fi + v4l2-ctl ${video_arg} --set-ctrl=auto_exposure=${exposure} &>/dev/null + v4l2-ctl ${video_arg} --set-ctrl=scene_mode=${scene} &>/dev/null + + ev=$(grep -e ^ev ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${ev}" ]; then ev="0"; fi + ev=$(expr ${ev} + 25) + ev=$(expr ${ev} / 2) + if [ "${ev}" -gt 24 ]; then ev="24"; fi + v4l2-ctl ${video_arg} --set-ctrl=auto_exposure_bias=${ev} &>/dev/null + + video_bitrate=$(grep -e ^bitrate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + if [ -z "${video_bitrate}" ]; then video_bitrate="1000000"; fi + v4l2-ctl ${video_arg} --set-ctrl=video_bitrate=${video_bitrate} &>/dev/null +} + +invalid_opt () { + local e match="$1" + shift + for e; do [[ "${e}" == "${match}" ]] && return 1; done + return 0 +} + +function start() { source ${STREAMEYE_CONF} streameye_opts="-p ${PORT}" if [ -n "${CREDENTIALS}" ] && [ "${AUTH}" = "basic" ]; then streameye_opts="${streameye_opts} -a basic -c ${CREDENTIALS}" fi - if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then - raspimjpeg_opts="${raspimjpeg_opts} -d" - streameye_opts="${streameye_opts} -d" - fi + if [ "${PROTO}" = "rtsp" ]; then + pid=$(ps | grep test-launch | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + if [ -n "${pid}" ]; then + return + fi - raspimjpeg.py ${raspimjpeg_opts} 2>${RASPIMJPEG_LOG} | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + iptables -A INPUT -p tcp -s localhost --dport 554 -j ACCEPT + iptables -A INPUT -p tcp --dport 554 -j DROP + + audio_opts="" + if [ -n "${AUDIO_DEV}" ]; then + audio_bitrate=$(grep -e ^audio_bitrate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + audio_channels=$(grep -e ^audio_channels ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + audio_extras="" + if [ -n "${audio_bitrate}" ]; then + audio_extras="${audio_extras},rate=${audio_bitrate}" + fi + if [ -n "${audio_channels}" ]; then + audio_extras="${audio_extras},channels=${audio_channels}" + fi + audio_opts="alsasrc device=${AUDIO_DEV} ! audioresample ! audio/x-raw${audio_extras} ! queue ! voaacenc ! rtpmp4gpay pt=97 name=pay1" + fi + video_path="/dev/video0" + if [ -n "${VIDEO_DEV}" ]; then + video_path=${VIDEO_DEV} + fi + if [ -e "${video_path}" ]; then + # Only configure camera if it is a Pi Cam + if v4l2-ctl -d ${video_path} -D | grep -q 'bm2835 mmal'; then + configure_v4l2_cam ${video_path} + fi + width=$(grep -e ^width ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + height=$(grep -e ^height ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + framerate=$(grep -e ^framerate ${RASPIMJPEG_CONF} | cut -d ' ' -f 2) + video_extras="" + if [ -n "${width}" ]; then + video_extras="${video_extras},width=${width}" + fi + if [ -n "${height}" ]; then + video_extras="${video_extras},height=${height}" + fi + if [ -n "${framerate}" ]; then + video_extras="${video_extras},framerate=${framerate}/1" + fi + video_opts="v4l2src device=${video_path} ! video/x-h264${video_extras} ! h264parse ! rtph264pay name=pay0 pt=96" + + if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then + streameye_opts="${streameye_opts} -d" + fi + + test-launch -p 554 -m h264 "\"( ${video_opts} ${audio_opts} )\"" &>${GSTREAMER_LOG} & + sleep 10 + gst-launch-1.0 -v rtspsrc location=rtsp://127.0.0.1:554/h264 latency=0 drop-on-latency=1 ! rtph264depay ! h264parse ! omxh264dec ! videorate ! video/x-raw,framerate=5/1 ! jpegenc ! filesink location=/dev/stdout | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + sleep 5 + fi + + iptables -D INPUT -p tcp --dport 554 -j DROP + iptables -D INPUT -p tcp -s localhost --dport 554 -j ACCEPT + + else + pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + if [ -n "${pid}" ]; then + return + fi + + valid_opts=("awb" "brightness" "contrast" "denoise" "drc" "ev" "exposure" "framerate" "height" "hflip" "imxfx" "iso" "metering" "preview" "quality" "rotation" "saturation" "sharpness" "shutter" "vflip" "vstab" "width" "zoom") + raspimjpeg_opts="" + while read line; do + key=$(echo ${line} | cut -d ' ' -f 1) + if invalid_opt "${key}" "${valid_opts[@]}"; then + continue + fi + if echo "${line}" | grep false &>/dev/null; then + continue + fi + if echo "${line}" | grep true &>/dev/null; then + line=${key} + fi + raspimjpeg_opts="${raspimjpeg_opts} --${line}" + done < ${RASPIMJPEG_CONF} + + if [ -r ${MOTIONEYE_CONF} ] && grep 'log-level debug' ${MOTIONEYE_CONF} >/dev/null; then + raspimjpeg_opts="${raspimjpeg_opts} -d" + streameye_opts="${streameye_opts} -d" + fi + + raspimjpeg.py ${raspimjpeg_opts} 2>${RASPIMJPEG_LOG} | streameye ${streameye_opts} &>${STREAMEYE_LOG} & + + fi } function stop() { @@ -57,18 +243,41 @@ function stop() { ps | grep streameye.sh | grep -v $$ | grep -v S94streameye| grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1 | xargs -r kill # stop the raspimjpeg process - pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) - if [ -z "${pid}" ]; then - return + raspimjpeg_pid=$(ps | grep raspimjpeg.py | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + # stop the gst-launch-1.0 process + gst_launch_pid=$(ps | grep gst-launch-1.0 | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + # stop the test-launch process + test_launch_pid=$(ps | grep test-launch | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1) + + if [ -n "${raspimjpeg_pid}" ]; then + kill -HUP "${raspimjpeg_pid}" &>/dev/null + count=0 + while kill -0 "${raspimjpeg_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${raspimjpeg_pid}" &>/dev/null || true fi - kill -HUP "${pid}" &>/dev/null - count=0 - while kill -0 "${pid}" &>/dev/null && [ ${count} -lt 5 ]; do - sleep 1 - count=$((${count} + 1)) - done - kill -KILL "${pid}" &>/dev/null || true + if [ -n "${gst_launch_pid}" ]; then + kill -HUP "${gst_launch_pid}" &>/dev/null + count=0 + while kill -0 "${gst_launch_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${gst_launch_pid}" &>/dev/null || true + fi + + if [ -n "${test_launch_pid}" ]; then + kill -HUP "${test_launch_pid}" &>/dev/null + count=0 + while kill -0 "${test_launch_pid}" &>/dev/null && [ ${count} -lt 5 ]; do + sleep 1 + count=$((${count} + 1)) + done + kill -KILL "${test_launch_pid}" &>/dev/null || true + fi } case "$1" in diff --git a/configs/raspberrypi2_defconfig b/configs/raspberrypi2_defconfig index f35b56db42..5a00a991d4 100644 --- a/configs/raspberrypi2_defconfig +++ b/configs/raspberrypi2_defconfig @@ -20,11 +20,60 @@ BR2_PACKAGE_BUSYBOX_CONFIG="board/common/busybox.config" BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y BR2_PACKAGE_MOTIONEYE=y BR2_PACKAGE_ALSA_UTILS=y +BR2_PACKAGE_ALSA_UTILS_ALSACTL=y +BR2_PACKAGE_ALSA_UTILS_ALSAMIXER=y +BR2_PACKAGE_ALSA_UTILS_AMIXER=y BR2_PACKAGE_ALSA_UTILS_APLAY=y BR2_PACKAGE_FFMPEG=y BR2_PACKAGE_FFMPEG_GPL=y BR2_PACKAGE_FFMPEG_NONFREE=y BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_GSTREAMER1=y +BR2_PACKAGE_GSTREAMER1_CHECK=y +BR2_PACKAGE_GSTREAMER1_PARSE=y +BR2_PACKAGE_GSTREAMER1_TRACE=y +BR2_PACKAGE_GSTREAMER1_PLUGIN_REGISTRY=y +BR2_PACKAGE_GSTREAMER1_INSTALL_TOOLS=y +BR2_PACKAGE_GST1_PLUGINS_BASE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ADDER=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_APP=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOCONVERT=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOMIXER=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIORATE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOTESTSRC=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ENCODING=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOCONVERT=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_PLAYBACK=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIORESAMPLE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_TCP=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_TYPEFIND=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOTESTSRC=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEORATE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOSCALE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VOLUME=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ALSA=y +BR2_PACKAGE_GST1_PLUGINS_GOOD=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_JPEG=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUDIOPARSERS=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUTODETECT=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_IMAGEFREEZE=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_ISOMP4=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_MULTIPART=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTPMANAGER=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTSP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_UDP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2_PROBE=y +BR2_PACKAGE_GST1_PLUGINS_BAD=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_VIDEOPARSERS=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_FDK_AAC=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_VOAACENC=y +BR2_PACKAGE_GST1_INTERPIPE=y +BR2_PACKAGE_GST1_LIBAV=y +BR2_PACKAGE_GST1_RTSP_SERVER=y +BR2_PACKAGE_GST_OMX=y +BR2_PACKAGE_GSTREAMER1_EDITING_SERVICES=y BR2_PACKAGE_LIBWEBCAM=y BR2_PACKAGE_MOTION=y BR2_PACKAGE_STREAMEYE=y @@ -64,6 +113,11 @@ BR2_PACKAGE_PYTHON_RPI_GPIO=y BR2_PACKAGE_PYTHON_SMBUS_CFFI=y BR2_PACKAGE_PYTHON_TORNADO=y BR2_PACKAGE_PYTHON_VERSIONTOOLS=y +BR2_PACKAGE_ALSA_LIB=y +BR2_PACKAGE_ALSA_LIB_MIXER=y +BR2_PACKAGE_FDK_AAC=y +BR2_PACKAGE_LIBVORBIS=y +BR2_PACKAGE_VO_AACENC=y BR2_PACKAGE_CA_CERTIFICATES=y BR2_PACKAGE_LIBSSH2=y BR2_PACKAGE_LIBFUSE=y diff --git a/configs/raspberrypi3_defconfig b/configs/raspberrypi3_defconfig index e5b31a64f6..ea356dedeb 100644 --- a/configs/raspberrypi3_defconfig +++ b/configs/raspberrypi3_defconfig @@ -20,11 +20,60 @@ BR2_PACKAGE_BUSYBOX_CONFIG="board/common/busybox.config" BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y BR2_PACKAGE_MOTIONEYE=y BR2_PACKAGE_ALSA_UTILS=y +BR2_PACKAGE_ALSA_UTILS_ALSACTL=y +BR2_PACKAGE_ALSA_UTILS_ALSAMIXER=y +BR2_PACKAGE_ALSA_UTILS_AMIXER=y BR2_PACKAGE_ALSA_UTILS_APLAY=y BR2_PACKAGE_FFMPEG=y BR2_PACKAGE_FFMPEG_GPL=y BR2_PACKAGE_FFMPEG_NONFREE=y BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_GSTREAMER1=y +BR2_PACKAGE_GSTREAMER1_CHECK=y +BR2_PACKAGE_GSTREAMER1_PARSE=y +BR2_PACKAGE_GSTREAMER1_TRACE=y +BR2_PACKAGE_GSTREAMER1_PLUGIN_REGISTRY=y +BR2_PACKAGE_GSTREAMER1_INSTALL_TOOLS=y +BR2_PACKAGE_GST1_PLUGINS_BASE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ADDER=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_APP=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOCONVERT=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOMIXER=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIORATE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOTESTSRC=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ENCODING=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOCONVERT=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_PLAYBACK=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIORESAMPLE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_TCP=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_TYPEFIND=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOTESTSRC=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEORATE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOSCALE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VOLUME=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ALSA=y +BR2_PACKAGE_GST1_PLUGINS_GOOD=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_JPEG=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUDIOPARSERS=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUTODETECT=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_IMAGEFREEZE=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_ISOMP4=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_MULTIPART=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTPMANAGER=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTSP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_UDP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2_PROBE=y +BR2_PACKAGE_GST1_PLUGINS_BAD=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_VIDEOPARSERS=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_FDK_AAC=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_VOAACENC=y +BR2_PACKAGE_GST1_INTERPIPE=y +BR2_PACKAGE_GST1_LIBAV=y +BR2_PACKAGE_GST1_RTSP_SERVER=y +BR2_PACKAGE_GST_OMX=y +BR2_PACKAGE_GSTREAMER1_EDITING_SERVICES=y BR2_PACKAGE_LIBWEBCAM=y BR2_PACKAGE_MOTION=y BR2_PACKAGE_STREAMEYE=y @@ -64,6 +113,11 @@ BR2_PACKAGE_PYTHON_RPI_GPIO=y BR2_PACKAGE_PYTHON_SMBUS_CFFI=y BR2_PACKAGE_PYTHON_TORNADO=y BR2_PACKAGE_PYTHON_VERSIONTOOLS=y +BR2_PACKAGE_ALSA_LIB=y +BR2_PACKAGE_ALSA_LIB_MIXER=y +BR2_PACKAGE_FDK_AAC=y +BR2_PACKAGE_LIBVORBIS=y +BR2_PACKAGE_VO_AACENC=y BR2_PACKAGE_CA_CERTIFICATES=y BR2_PACKAGE_LIBSSH2=y BR2_PACKAGE_LIBFUSE=y diff --git a/configs/raspberrypi_defconfig b/configs/raspberrypi_defconfig index 8c769b2af8..88175b0be5 100644 --- a/configs/raspberrypi_defconfig +++ b/configs/raspberrypi_defconfig @@ -27,11 +27,60 @@ BR2_PACKAGE_BUSYBOX_CONFIG="board/common/busybox.config" BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y BR2_PACKAGE_MOTIONEYE=y BR2_PACKAGE_ALSA_UTILS=y +BR2_PACKAGE_ALSA_UTILS_ALSACTL=y +BR2_PACKAGE_ALSA_UTILS_ALSAMIXER=y +BR2_PACKAGE_ALSA_UTILS_AMIXER=y BR2_PACKAGE_ALSA_UTILS_APLAY=y BR2_PACKAGE_FFMPEG=y BR2_PACKAGE_FFMPEG_GPL=y BR2_PACKAGE_FFMPEG_NONFREE=y BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_GSTREAMER1=y +BR2_PACKAGE_GSTREAMER1_CHECK=y +BR2_PACKAGE_GSTREAMER1_PARSE=y +BR2_PACKAGE_GSTREAMER1_TRACE=y +BR2_PACKAGE_GSTREAMER1_PLUGIN_REGISTRY=y +BR2_PACKAGE_GSTREAMER1_INSTALL_TOOLS=y +BR2_PACKAGE_GST1_PLUGINS_BASE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ADDER=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_APP=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOCONVERT=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOMIXER=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIORATE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOTESTSRC=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ENCODING=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOCONVERT=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_PLAYBACK=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIORESAMPLE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_TCP=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_TYPEFIND=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOTESTSRC=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEORATE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOSCALE=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VOLUME=y +BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ALSA=y +BR2_PACKAGE_GST1_PLUGINS_GOOD=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_JPEG=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUDIOPARSERS=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUTODETECT=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_IMAGEFREEZE=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_ISOMP4=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_MULTIPART=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTPMANAGER=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTSP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_UDP=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2=y +BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2_PROBE=y +BR2_PACKAGE_GST1_PLUGINS_BAD=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_VIDEOPARSERS=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_FDK_AAC=y +BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_VOAACENC=y +BR2_PACKAGE_GST1_INTERPIPE=y +BR2_PACKAGE_GST1_LIBAV=y +BR2_PACKAGE_GST1_RTSP_SERVER=y +BR2_PACKAGE_GST_OMX=y +BR2_PACKAGE_GSTREAMER1_EDITING_SERVICES=y BR2_PACKAGE_LIBWEBCAM=y BR2_PACKAGE_MOTION=y BR2_PACKAGE_STREAMEYE=y @@ -71,6 +120,11 @@ BR2_PACKAGE_PYTHON_RPI_GPIO=y BR2_PACKAGE_PYTHON_SMBUS_CFFI=y BR2_PACKAGE_PYTHON_TORNADO=y BR2_PACKAGE_PYTHON_VERSIONTOOLS=y +BR2_PACKAGE_ALSA_LIB=y +BR2_PACKAGE_ALSA_LIB_MIXER=y +BR2_PACKAGE_FDK_AAC=y +BR2_PACKAGE_LIBVORBIS=y +BR2_PACKAGE_VO_AACENC=y BR2_PACKAGE_CA_CERTIFICATES=y BR2_PACKAGE_LIBSSH2=y BR2_PACKAGE_LIBFUSE=y diff --git a/package/gstreamer1/gst1-rtsp-server/001-test-launch-cmdline-mount-point.patch b/package/gstreamer1/gst1-rtsp-server/001-test-launch-cmdline-mount-point.patch new file mode 100644 index 0000000000..5e5bae6596 --- /dev/null +++ b/package/gstreamer1/gst1-rtsp-server/001-test-launch-cmdline-mount-point.patch @@ -0,0 +1,56 @@ +diff -rupEbBN gst1-rtsp-server-1.14.2.org/examples/test-launch.c gst1-rtsp-server-1.14.2/examples/test-launch.c +--- gst1-rtsp-server-1.14.2.org/examples/test-launch.c 2019-01-02 10:35:38.025452322 +1100 ++++ gst1-rtsp-server-1.14.2/examples/test-launch.c 2019-01-02 10:56:01.127536126 +1100 +@@ -22,12 +22,16 @@ + #include + + #define DEFAULT_RTSP_PORT "8554" ++#define DEFAULT_RTSP_MOUNT_POINT "stream" + + static char *port = (char *) DEFAULT_RTSP_PORT; ++static char *mount_point = (char *) DEFAULT_RTSP_MOUNT_POINT; + + static GOptionEntry entries[] = { + {"port", 'p', 0, G_OPTION_ARG_STRING, &port, + "Port to listen on (default: " DEFAULT_RTSP_PORT ")", "PORT"}, ++ {"mount", 'm', 0, G_OPTION_ARG_STRING, &mount_point, ++ "Stream mount point (default: " DEFAULT_RTSP_MOUNT_POINT ")", "MOUNT"}, + {NULL} + }; + +@@ -53,6 +57,14 @@ main (int argc, char *argv[]) + } + g_option_context_free (optctx); + ++ char *mount_string = malloc(strlen(mount_point)+2); ++ if (!mount_string) { ++ g_printerr ("Error allocating memory\n"); ++ return -1; ++ } ++ mount_string[0] = '/'; ++ strcpy(mount_string+1, mount_point); ++ + loop = g_main_loop_new (NULL, FALSE); + + /* create a server instance */ +@@ -72,7 +84,7 @@ main (int argc, char *argv[]) + gst_rtsp_media_factory_set_shared (factory, TRUE); + + /* attach the test factory to the /test url */ +- gst_rtsp_mount_points_add_factory (mounts, "/test", factory); ++ gst_rtsp_mount_points_add_factory (mounts, mount_string, factory); + + /* don't need the ref to the mapper anymore */ + g_object_unref (mounts); +@@ -81,8 +93,10 @@ main (int argc, char *argv[]) + gst_rtsp_server_attach (server, NULL); + + /* start serving */ +- g_print ("stream ready at rtsp://127.0.0.1:%s/test\n", port); ++ g_print ("stream ready at rtsp://127.0.0.1:%s%s\n", port, mount_string); + g_main_loop_run (loop); + ++ free(mount_string); ++ + return 0; + } diff --git a/package/gstreamer1/gst1-rtsp-server/gst1-rtsp-server.mk b/package/gstreamer1/gst1-rtsp-server/gst1-rtsp-server.mk index 0dc2917685..a4cc5a6b36 100644 --- a/package/gstreamer1/gst1-rtsp-server/gst1-rtsp-server.mk +++ b/package/gstreamer1/gst1-rtsp-server/gst1-rtsp-server.mk @@ -24,4 +24,10 @@ ifeq ($(BR2_PACKAGE_GST1_PLUGINS_BAD),y) GST1_RTSP_SERVER_DEPENDENCIES += gst1-plugins-bad endif +define GST1_RTSP_SERVER_INSTALL_EXAMPLES + $(INSTALL) -D -m 0755 $(@D)/examples/test-launch $(TARGET_DIR)/usr/sbin +endef + +GST1_RTSP_SERVER_POST_INSTALL_TARGET_HOOKS += GST1_RTSP_SERVER_INSTALL_EXAMPLES + $(eval $(autotools-package))