From ad426704389e73a5a8f4f424f1677dd678d1eb12 Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Sun, 15 May 2022 18:36:36 -0700 Subject: [PATCH] add second stream to rtsp --- README.md | 27 ++++++--- SD_ROOT/wz_mini/etc/init.d/v3_post.sh | 16 +++++- SD_ROOT/wz_mini/lib/libcallback.so | Bin 40782 -> 43813 bytes SD_ROOT/wz_mini/run_mmc.sh | 75 +++++++++++++++++++----- libcallback_wz_mod/libcallback.so | Bin 40782 -> 43813 bytes libcallback_wz_mod/video_callback.c | 80 ++++++++++++++++++++++++-- 6 files changed, 168 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index f3c22e9..b6c3eb3 100644 --- a/README.md +++ b/README.md @@ -183,23 +183,31 @@ ENABLE_NFSv4="true" --- RTSP streaming: -You can choose to enable or disable audio. Set your login credentials here, server listening port, and the stream bitrate. -(RTSP_ENC_PARAMETER variable accepts numbers only. 0=FIXQP, 1=CBR, 2=VBR, 4=CAPPED VBR, 8=CAPPED QUALITY. Currently only 2, 4, and 8 are working) +The RTSP server outputs the two supported video streams from the camera, 1080p/360p (1296p/480p for the DB3). You can choose to enable a single stream of your choice, or both. Audio is also available. Set your login credentials here, server listening port, and the stream bitrate. +(ENC_PARAMETER variable accepts numbers only. 0=FIXQP, 1=CBR, 2=VBR, 4=CAPPED VBR, 8=CAPPED QUALITY. Currently only 2, 4, and 8 are working) ``` -RTSP_ENABLED="true" -RTSP_ENABLE_AUDIO="true" RTSP_LOGIN="admin" RTSP_PASSWORD="" -RTSP_PORT="8554" -RTSP_MAX_BITRATE="2048" -RTSP_TARGET_BITRATE="1024" -RTSP_ENC_PARAMETER="2" + +RTSP_HI_RES_ENABLED="true" +RTSP_HI_RES_ENABLE_AUDIO="true" +RTSP_HI_RES_PORT="8554" +RTSP_HI_RES_MAX_BITRATE="2048" +RTSP_HI_RES_TARGET_BITRATE="1024" +RTSP_HI_RES_ENC_PARAMETER="2" + +RTSP_LOW_RES_ENABLED="false" +RTSP_LOW_RES_ENABLE_AUDIO="false" +RTSP_LOW_RES_PORT="8555" +RTSP_LOW_RES_MAX_BITRATE="" +RTSP_LOW_RES_TARGET_BITRATE="" +RTSP_LOW_RES_ENC_PARAMETER="" ``` the stream will be located at ```rtsp://login:password@IP_ADDRESS:8554/unicast``` -Notes: If you don't set the password, then the password will be the unique MAC address of the camera, in all uppercase, including the colons... for example:. AA:BB:CC:00:11:22. It's typically printed on the camera. VLC seems to work fine for playback, ffmpeg and others have severe artifacts in the stream during playback. +Notes: If you don't set the password, then the password will be the unique MAC address of the camera, in all uppercase, including the colons... for example:. AA:BB:CC:00:11:22. It's typically printed on the camera. Higher video bitrates may overload your Wi-Fi connection, so a wired connection is recommended. Huge credit to @mnakada for his libcallback library: [https://github.com/mnakada/atomcam_tools](https://github.com/mnakada/atomcam_tools) @@ -207,6 +215,7 @@ Huge credit to @mnakada for his libcallback library: [https://github.com/mnakada ## Latest Updates +* 05-15-22: patched libcallback to support both video streams from the camera. Added support for them in run_mmc.sh. * 05-14-22: Added ability to specify RTSP bitrate parameters. Note that changing bitrate in the mobile app will briefly reset the bitrate for the RTSP stream. * 05-14-22: Update v4l2rtspserver, tinyalsa, alsa-lib. Patch busybox for older official FW's failing to run scripts, fix choppy/static audio in libcallback * 05-09-22: fix bug in run_mmc.sh that did not store the wlan mac when using a wired usb or ethernet connection for the rtsp server diff --git a/SD_ROOT/wz_mini/etc/init.d/v3_post.sh b/SD_ROOT/wz_mini/etc/init.d/v3_post.sh index 6eebc52..57272f2 100755 --- a/SD_ROOT/wz_mini/etc/init.d/v3_post.sh +++ b/SD_ROOT/wz_mini/etc/init.d/v3_post.sh @@ -11,11 +11,21 @@ set -x echo "v3_post.sh exec" -if [[ $(cat /opt/wz_mini/run_mmc.sh | grep "RTSP_ENABLED\=") == "RTSP_ENABLED\=\"true\"" ]] && ! [[ -e /tmp/dbgflag ]]; then + +if [[ $(cat /opt/wz_mini/run_mmc.sh | grep "RTSP_HI_RES_ENABLED\=") == "RTSP_HI_RES_ENABLED\=\"true\"" ]] || [[ $(cat /opt/wz_mini/run_mmc.sh | grep "RTSP_LOW_RES_ENABLED\=") == "RTSP_LOW_RES_ENABLED\=\"true\"" ]] && ! [[ -e /tmp/dbgflag ]]; then + if [[ $(cat /opt/wz_mini/run_mmc.sh | grep "RTSP_LOW_RES_ENABLED\=") == "RTSP_LOW_RES_ENABLED\=\"true\"" ]] && [[ $(cat /opt/wz_mini/run_mmc.sh | grep "RTSP_HI_RES_ENABLED\=") == "RTSP_HI_RES_ENABLED\=\"true\"" ]]; then + echo "load video loopback driver at video1 video2" + insmod /opt/wz_mini/lib/modules/v4l2loopback.ko video_nr=1,2 + elif [[ $(cat /opt/wz_mini/run_mmc.sh | grep "RTSP_LOW_RES_ENABLED\=") == "RTSP_LOW_RES_ENABLED\=\"true\"" ]]; then + echo "load video loopback driver at video2" + insmod /opt/wz_mini/lib/modules/v4l2loopback.ko video_nr=2 + elif [[ $(cat /opt/wz_mini/run_mmc.sh | grep "RTSP_HI_RES_ENABLED\=") == "RTSP_HI_RES_ENABLED\=\"true\"" ]]; then + echo "load video loopback driver at video1" + insmod /opt/wz_mini/lib/modules/v4l2loopback.ko video_nr=1 + fi + cp /system/bin/iCamera /opt/wz_mini/tmp/.storage/ mount -o ro,bind /opt/wz_mini/usr/bin/iCamera /system/bin/iCamera - echo "load video loopback driver at video1" - insmod /opt/wz_mini/lib/modules/v4l2loopback.ko video_nr=1 fi ##LIBRARY DEBUG diff --git a/SD_ROOT/wz_mini/lib/libcallback.so b/SD_ROOT/wz_mini/lib/libcallback.so index 5075b1ef50a97ea6e970b753a0fa34a995f90b65..d7b110ae8d8dd91016c89194ff4550ae1ab0cb61 100644 GIT binary patch delta 13805 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 delta 12876 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 diff --git a/SD_ROOT/wz_mini/run_mmc.sh b/SD_ROOT/wz_mini/run_mmc.sh index e92a20c..599e338 100755 --- a/SD_ROOT/wz_mini/run_mmc.sh +++ b/SD_ROOT/wz_mini/run_mmc.sh @@ -30,14 +30,22 @@ REMOTE_SPOTLIGHT="false" REMOTE_SPOTLIGHT_HOST="0.0.0.0" #####VIDEO STREAM##### -RTSP_ENABLED="false" -RTSP_ENABLE_AUDIO="false" RTSP_LOGIN="admin" RTSP_PASSWORD="" -RTSP_PORT="8554" -RTSP_MAX_BITRATE="" -RTSP_TARGET_BITRATE="" -RTSP_ENC_PARAMETER="" + +RTSP_HI_RES_ENABLED="false" +RTSP_HI_RES_ENABLE_AUDIO="false" +RTSP_HI_RES_PORT="8554" +RTSP_HI_RES_MAX_BITRATE="" +RTSP_HI_RES_TARGET_BITRATE="" +RTSP_HI_RES_ENC_PARAMETER="" + +RTSP_LOW_RES_ENABLED="false" +RTSP_LOW_RES_ENABLE_AUDIO="false" +RTSP_LOW_RES_PORT="8555" +RTSP_LOW_RES_MAX_BITRATE="" +RTSP_LOW_RES_TARGET_BITRATE="" +RTSP_LOW_RES_ENC_PARAMETER="" #####GENERAL##### ENABLE_SWAP="true" @@ -345,7 +353,7 @@ else echo "remote accessory disabled" fi -if [[ "$RTSP_ENABLED" == "true" ]]; then +if [[ "$RTSP_HI_RES_ENABLED" == "true" ]]; then if [[ "$ENABLE_SWAP" == "true" ]]; then echo "swap already enabled" @@ -361,23 +369,22 @@ if [[ "$RTSP_ENABLED" == "true" ]]; then RTSP_PASSWORD=$(cat /opt/wz_mini/tmp/wlan0_mac) fi - if [[ "$RTSP_ENABLE_AUDIO" == "true" ]]; then - LD_LIBRARY_PATH=/media/mmc/wz_mini/lib /media/mmc/wz_mini/bin/v4l2rtspserver -C 1 -a S16_LE /dev/video1,hw:Loopback,0 -U $RTSP_LOGIN:$RTSP_PASSWORD -P $RTSP_PORT & + if [[ "$RTSP_HI_RES_ENABLE_AUDIO" == "true" ]]; then + LD_LIBRARY_PATH=/media/mmc/wz_mini/lib /media/mmc/wz_mini/bin/v4l2rtspserver -C 1 -a S16_LE /dev/video1,hw:Loopback,0 -U $RTSP_LOGIN:$RTSP_PASSWORD -P $RTSP_HI_RES_PORT & else echo "rtsp audio disabled" - LD_LIBRARY_PATH=/media/mmc/wz_mini/lib /media/mmc/wz_mini/bin/v4l2rtspserver -s /dev/video1 -U $RTSP_LOGIN:$RTSP_PASSWORD -P $RTSP_PORT & + LD_LIBRARY_PATH=/media/mmc/wz_mini/lib /media/mmc/wz_mini/bin/v4l2rtspserver -s /dev/video1 -U $RTSP_LOGIN:$RTSP_PASSWORD -P $RTSP_HI_RES_PORT & fi - - if [[ "$RTSP_ENC_PARAMETER" != "" ]]; then + if [[ "$RTSP_HI_RES_ENC_PARAMETER" != "" ]]; then watch -n5 -t "/system/bin/impdbg --enc_rc_s 0:44:4:$RTSP_ENC_PARAMETER" > /dev/null 2>&1 & fi - if [[ "$RTSP_MAX_BITRATE" != "" ]]; then + if [[ "$RTSP_HI_RES_MAX_BITRATE" != "" ]]; then watch -n5 -t "/system/bin/impdbg --enc_rc_s 0:48:4:$RTSP_MAX_BITRATE" > /dev/null 2>&1 & fi - if [[ "$RTSP_TARGET_BITRATE" != "" ]]; then + if [[ "$RTSP_HI_RES_TARGET_BITRATE" != "" ]]; then watch -n5 -t "/system/bin/impdbg --enc_rc_s 0:52:4:$RTSP_TARGET_BITRATE" > /dev/null 2>&1 & fi @@ -386,6 +393,46 @@ if [[ "$RTSP_ENABLED" == "true" ]]; then fi +if [[ "$RTSP_LOW_RES_ENABLED" == "true" ]]; then + + if [[ "$ENABLE_SWAP" == "true" ]]; then + echo "swap already enabled" + else + swap_enable + fi + + /opt/wz_mini/bin/cmd video on1 + /opt/wz_mini/bin/cmd audio on + + + if [[ "$RTSP_PASSWORD" = "" ]]; then + RTSP_PASSWORD=$(cat /opt/wz_mini/tmp/wlan0_mac) + fi + + if [[ "$RTSP_LOW_RES_ENABLE_AUDIO" == "true" ]]; then + LD_LIBRARY_PATH=/media/mmc/wz_mini/lib /media/mmc/wz_mini/bin/v4l2rtspserver -C 1 -a S16_LE /dev/video2,hw:Loopback,0 -U $RTSP_LOGIN:$RTSP_PASSWORD -P $RTSP_LOW_RES_PORT & + else + echo "rtsp audio disabled" + LD_LIBRARY_PATH=/media/mmc/wz_mini/lib /media/mmc/wz_mini/bin/v4l2rtspserver -s /dev/video2 -U $RTSP_LOGIN:$RTSP_PASSWORD -P $RTSP_LOW_RES_PORT & + fi + + if [[ "$RTSP_LOW_RES_ENC_PARAMETER" != "" ]]; then + watch -n5 -t "/system/bin/impdbg --enc_rc_s 1:44:4:$RTSP_ENC_PARAMETER" > /dev/null 2>&1 & + fi + + if [[ "$RTSP_LOW_RES_MAX_BITRATE" != "" ]]; then + watch -n5 -t "/system/bin/impdbg --enc_rc_s 1:48:4:$RTSP_MAX_BITRATE" > /dev/null 2>&1 & + fi + + if [[ "$RTSP_LOW_RES_TARGET_BITRATE" != "" ]]; then + watch -n5 -t "/system/bin/impdbg --enc_rc_s 1:52:4:$RTSP_TARGET_BITRATE" > /dev/null 2>&1 & + fi + + else + echo "rtsp disabled" + +fi + touch /opt/wz_mini/tmp/.run_mmc_firstrun sync;echo 3 > /proc/sys/vm/drop_caches sleep 3 diff --git a/libcallback_wz_mod/libcallback.so b/libcallback_wz_mod/libcallback.so index 5075b1ef50a97ea6e970b753a0fa34a995f90b65..d7b110ae8d8dd91016c89194ff4550ae1ab0cb61 100755 GIT binary patch delta 13805 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 delta 12876 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 diff --git a/libcallback_wz_mod/video_callback.c b/libcallback_wz_mod/video_callback.c index 3532afa..53e665f 100644 --- a/libcallback_wz_mod/video_callback.c +++ b/libcallback_wz_mod/video_callback.c @@ -19,7 +19,9 @@ typedef int (* framecb)(struct frames_st *); static int (*real_local_sdk_video_set_encode_frame_callback)(int ch, void *callback); static void *video_encode_cb = NULL; +static void *video_encode_cb1 = NULL; static int VideoCaptureEnable = 0; +static int VideoCaptureEnable1 = 0; char *VideoCapture(int fd, char *tokenPtr) { @@ -27,12 +29,22 @@ char *VideoCapture(int fd, char *tokenPtr) { if(!p) return VideoCaptureEnable ? "on" : "off"; if(!strcmp(p, "on")) { VideoCaptureEnable = 1; - fprintf(stderr, "[command] video capute on\n", p); + fprintf(stderr, "[command] video capture ch0 on\n", p); + return "ok"; + } + if(!strcmp(p, "on1")) { + VideoCaptureEnable1 = 1; + fprintf(stderr, "[command] video capture ch1 on\n", p); return "ok"; } if(!strcmp(p, "off")) { VideoCaptureEnable = 0; - fprintf(stderr, "[command] video capute off\n", p); + fprintf(stderr, "[command] video capture ch0 off\n", p); + return "ok"; + } + if(!strcmp(p, "off1")) { + VideoCaptureEnable1 = 0; + fprintf(stderr, "[command] video capture ch1 off\n", p); return "ok"; } return "error"; @@ -43,6 +55,7 @@ static uint32_t video_encode_capture(struct frames_st *frames) { static int firstEntry = 0; static int v4l2Fd = -1; +//primary stream 0 if(!firstEntry) { firstEntry++; int err; @@ -86,19 +99,78 @@ static uint32_t video_encode_capture(struct frames_st *frames) { return ((framecb)video_encode_cb)(frames); } +//secondary stream 1 +static uint32_t video_encode_capture1(struct frames_st *frames) { + + static int firstEntry = 0; + static int v4l2Fd = -1; + + if(!firstEntry) { + firstEntry++; + int err; + const char *v4l2_device_path = "/dev/video2"; + const char *productf="/configs/.product_db3"; + fprintf(stderr,"Opening V4L2 device: %s \n", v4l2_device_path); + v4l2Fd = open(v4l2_device_path, O_WRONLY, 0777); + if(v4l2Fd < 0) fprintf(stderr,"Failed to open V4L2 device: %s\n", v4l2_device_path); + struct v4l2_format vid_format; + memset(&vid_format, 0, sizeof(vid_format)); + vid_format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + + if( access( productf, F_OK ) == 0 ) { + /* doorbell resolution */ + printf("[command] video product 640x480"); + vid_format.fmt.pix.width = 640; + vid_format.fmt.pix.height = 480; + } else { + /* v3 and panv2 res */ + printf("[command] video product 640x320"); + vid_format.fmt.pix.width = 640; + vid_format.fmt.pix.height = 320; + } + + vid_format.fmt.pix.pixelformat = V4L2_PIX_FMT_H264; + vid_format.fmt.pix.sizeimage = 0; + vid_format.fmt.pix.field = V4L2_FIELD_NONE; + vid_format.fmt.pix.bytesperline = 0; + vid_format.fmt.pix.colorspace = V4L2_PIX_FMT_YUV420; + err = ioctl(v4l2Fd, VIDIOC_S_FMT, &vid_format); + if(err < 0) fprintf(stderr,"Unable to set V4L2 device video format: %d\n", err); + err = ioctl(v4l2Fd, VIDIOC_STREAMON, &vid_format); + if(err < 0) fprintf(stderr,"Unable to perform VIDIOC_STREAMON: %d\n", err); + } + + if( (v4l2Fd >= 0) && VideoCaptureEnable) { + uint32_t *buf = frames->buf; + int size = write(v4l2Fd, frames->buf, frames->length); + if(size != frames->length) fprintf(stderr,"Stream write error: %s\n", size); + } + return ((framecb)video_encode_cb1)(frames); +} + + + int local_sdk_video_set_encode_frame_callback(int ch, void *callback) { fprintf(stderr, "local_sdk_video_set_encode_frame_callback streamChId=%d, callback=0x%x\n", ch, callback); static int ch_count = 0; -/* two callbacks typically detected, unknown what the difference is between them, but if they are both hooked, the app breaks. grab just one of them. */ - +/* two callbacks for video stream 0 are typically detected, unknown what the difference is between them, but if they are both hooked, the app breaks. grab just one of them. */ + //stream 0 if( (ch == 0) && ch_count == 2) { video_encode_cb = callback; fprintf(stderr,"enc func injection save video_encode_cb=0x%x\n", video_encode_cb); callback = video_encode_capture; } fprintf(stderr,"ch count is %x\n", ch_count); + + //stream 1 + if( (ch == 1) && ch_count == 1) { + video_encode_cb1 = callback; + fprintf(stderr,"enc func injection save video_encode_cb=0x%x\n", video_encode_cb1); + callback = video_encode_capture1; + } + ch_count=ch_count+1; return real_local_sdk_video_set_encode_frame_callback(ch, callback);