From 26af3aa7bc33dcc84a53e5f811d3a6548f550a51 Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Sat, 7 May 2022 01:23:49 -0700 Subject: [PATCH] rtsp fixes --- README.md | 13 +- SD_ROOT/wz_mini/bin/cmd | 2 + SD_ROOT/wz_mini/lib/libcallback.so | Bin 10591 -> 40313 bytes SD_ROOT/wz_mini/run_mmc.sh | 2 + libcallback_avonly/Makefile | 11 - libcallback_avonly/libcallback.so | Bin 10591 -> 0 bytes libcallback_wz_mod/Makefile | 11 + .../audio_callback.c | 19 +- libcallback_wz_mod/audio_play.c | 107 ++++++++++ libcallback_wz_mod/command.c | 192 ++++++++++++++++++ libcallback_wz_mod/curl.c | 125 ++++++++++++ libcallback_wz_mod/freopen.c | 18 ++ libcallback_wz_mod/gmtime_r.c | 25 +++ libcallback_wz_mod/irled.c | 24 +++ libcallback_wz_mod/jpeg.c | 118 +++++++++++ libcallback_wz_mod/libcallback.so | Bin 0 -> 40313 bytes libcallback_wz_mod/mmc_format.c | 7 + libcallback_wz_mod/motor.c | 68 +++++++ libcallback_wz_mod/opendir.c | 24 +++ libcallback_wz_mod/remove.c | 20 ++ libcallback_wz_mod/setlinebuf.c | 5 + .../video_callback.c | 21 +- libcallback_wz_mod/wait_motion.c | 111 ++++++++++ 23 files changed, 899 insertions(+), 24 deletions(-) create mode 100755 SD_ROOT/wz_mini/bin/cmd delete mode 100644 libcallback_avonly/Makefile delete mode 100755 libcallback_avonly/libcallback.so create mode 100644 libcallback_wz_mod/Makefile rename {libcallback_avonly => libcallback_wz_mod}/audio_callback.c (82%) create mode 100644 libcallback_wz_mod/audio_play.c create mode 100644 libcallback_wz_mod/command.c create mode 100644 libcallback_wz_mod/curl.c create mode 100644 libcallback_wz_mod/freopen.c create mode 100644 libcallback_wz_mod/gmtime_r.c create mode 100644 libcallback_wz_mod/irled.c create mode 100644 libcallback_wz_mod/jpeg.c create mode 100755 libcallback_wz_mod/libcallback.so create mode 100644 libcallback_wz_mod/mmc_format.c create mode 100644 libcallback_wz_mod/motor.c create mode 100644 libcallback_wz_mod/opendir.c create mode 100644 libcallback_wz_mod/remove.c create mode 100644 libcallback_wz_mod/setlinebuf.c rename {libcallback_avonly => libcallback_wz_mod}/video_callback.c (83%) create mode 100644 libcallback_wz_mod/wait_motion.c diff --git a/README.md b/README.md index 45b565d..6426e7d 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Using this project can potentially expose your device to the open internet depen * Tethering to android phones via RNDIS * USB Mass storage enabled, mount USB SSD/HDD/flash drives * CIFS Supported +* Play .WAV files using "aplay " command * Inspired by HclX and WyzeHacks! Bless you for all your work! You are the master! @@ -40,7 +41,6 @@ Using this project can potentially expose your device to the open internet depen * ??? ## How you can help! -* RTSP Server: Live view in the app doesn't work when set to "HD" or "SD", need to check libcallback sources to see why this happens, if you can help with this, check it out. * Vertical Tilt on the PANv2 doesn't work properly. Only does this on the modified kernel. Need investigation why this happens. ## Prerequisites @@ -52,11 +52,7 @@ Using this project can potentially expose your device to the open internet depen ## What Works / What Doesn't Work * Everything works except: - 1. v3/Pan V2: RTSP support is experimental and has several drawbacks: - - Live view in the app only works at 360p - - Recording to microsd card doesn't work properly - - RTSP playback only works properly via VLC - 2. PAN v2: + 1. PAN v2: - Tilt (Vertical) only works at motor speed 9 ## Setup @@ -163,8 +159,6 @@ ENABLE_CIFS="false" ``` --- -__WARNING: RTSP support is experimental and I consider it to be broken. Use it only if you know what you are doing! The outdated stock RTSP firmware works much better at the moment.__ - To enable RTSP streaming, change the following lines, you can choose to enable or disable audio. Set your login credentials here, you can also change the port the server listens on. ``` @@ -178,12 +172,11 @@ the stream will be located at ```rtsp://login:password@IP_ADDRESS:8554/unicast`` Note: 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. Huge credit to @mnakada for his libcallback library: [https://github.com/mnakada/atomcam_tools](https://github.com/mnakada/atomcam_tools) -__WARNING__: If using the wyze app to view the live stream, viewing in "HD" or "SD" will not work. Select 360p to view the live stram in the app. Recording to micro sd is also broken. - --- ## Latest Updates +* 05-07-22: RTSP Server fixed, ported latest full libcallback from @mnakada with modifications. * 05-01-22: Removed dropbearmulti, replaced with individual binaries. dropbear dbclient dropbearkey dropbearconvert scp now included. * 04-30-22: Recompiled uClibc with LD_DEBUG enabled. Enable in v3_post.sh, for debugging. * 04-30-22: Move built-in kernel stuff to modules, usb_direct kernel no longer needed, modules now included. Added usb-storage support for usb hdd/ssd/flash drive, cifs support, and rndis support for tethering camera directly to a mobile device. diff --git a/SD_ROOT/wz_mini/bin/cmd b/SD_ROOT/wz_mini/bin/cmd new file mode 100755 index 0000000..7e47055 --- /dev/null +++ b/SD_ROOT/wz_mini/bin/cmd @@ -0,0 +1,2 @@ +#!/bin/sh +echo "$*" | /opt/wz_mini/bin/busybox nc localhost 4000 diff --git a/SD_ROOT/wz_mini/lib/libcallback.so b/SD_ROOT/wz_mini/lib/libcallback.so index f4048b62f1126e664e810b7b20779f294b0e2358..4f0c74970d31a0d80b8114e54de79f3726d896b7 100644 GIT binary patch literal 40313 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 diff --git a/SD_ROOT/wz_mini/run_mmc.sh b/SD_ROOT/wz_mini/run_mmc.sh index a656138..4da3b78 100755 --- a/SD_ROOT/wz_mini/run_mmc.sh +++ b/SD_ROOT/wz_mini/run_mmc.sh @@ -189,6 +189,8 @@ if [[ "$RTSP_ENABLED" == "true" ]]; then swap_enable mkdir /tmp/alsa cp /media/mmc/wz_mini/etc/alsa.conf /tmp/alsa + /opt/wz_mini/bin/cmd video on + /opt/wz_mini/bin/cmd audio on if [[ "$RTSP_PASSWORD" = "" ]]; then RTSP_PASSWORD=$(cat /opt/wz_mini/tmp/wlan0_mac) diff --git a/libcallback_avonly/Makefile b/libcallback_avonly/Makefile deleted file mode 100644 index 6677dae..0000000 --- a/libcallback_avonly/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# libcallback.so - -CC = /openmiko/build/mips-gcc472-glibc216-64bit/bin/mips-linux-uclibc-gnu-gcc -CFLAGS = -fPIC -std=gnu99 -shared -ldl -lm -CC_SRCS = video_callback.c audio_callback.c -TARGET = libcallback.so - -all: ${TARGET} - -${TARGET}: ${CC_SRCS} - ${CC} ${CFLAGS} -o ${TARGET} ${CC_SRCS} diff --git a/libcallback_avonly/libcallback.so b/libcallback_avonly/libcallback.so deleted file mode 100755 index f4048b62f1126e664e810b7b20779f294b0e2358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10591 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 diff --git a/libcallback_wz_mod/Makefile b/libcallback_wz_mod/Makefile new file mode 100644 index 0000000..554540f --- /dev/null +++ b/libcallback_wz_mod/Makefile @@ -0,0 +1,11 @@ +# libcallback.so + +CC = /openmiko/build/mips-gcc472-glibc216-64bit/bin/mips-linux-uclibc-gnu-gcc +CFLAGS = -fPIC -std=gnu99 -shared -ldl -ltinyalsa -lm -pthread +CC_SRCS = video_callback.c audio_callback.c jpeg.c setlinebuf.c mmc_format.c curl.c freopen.c opendir.c remove.c motor.c command.c gmtime_r.c wait_motion.c irled.c audio_play.c +TARGET = libcallback.so + +all: ${TARGET} + +${TARGET}: ${CC_SRCS} + ${CC} ${CFLAGS} -o ${TARGET} ${CC_SRCS} diff --git a/libcallback_avonly/audio_callback.c b/libcallback_wz_mod/audio_callback.c similarity index 82% rename from libcallback_avonly/audio_callback.c rename to libcallback_wz_mod/audio_callback.c index d82b91a..3f63725 100644 --- a/libcallback_avonly/audio_callback.c +++ b/libcallback_wz_mod/audio_callback.c @@ -17,7 +17,24 @@ typedef int (* framecb)(struct frames_st *); static uint32_t (*real_local_sdk_audio_set_pcm_frame_callback)(int ch, void *callback); static void *audio_pcm_cb = NULL; -static int AudioCaptureEnable = 1; +static int AudioCaptureEnable = 0; + +char *AudioCapture(int fd, char *tokenPtr) { + + char *p = strtok_r(NULL, " \t\r\n", &tokenPtr); + if(!p) return AudioCaptureEnable ? "on" : "off"; + if(!strcmp(p, "on")) { + AudioCaptureEnable = 1; + fprintf(stderr, "[command] audio capute on\n", p); + return "ok"; + } + if(!strcmp(p, "off")) { + AudioCaptureEnable = 0; + fprintf(stderr, "[command] audio capute off\n", p); + return "ok"; + } + return "error"; +} static uint32_t audio_pcm_capture(struct frames_st *frames) { diff --git a/libcallback_wz_mod/audio_play.c b/libcallback_wz_mod/audio_play.c new file mode 100644 index 0000000..f1ee155 --- /dev/null +++ b/libcallback_wz_mod/audio_play.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include + +extern void local_sdk_speaker_set_pa_mode(int mode); +extern void local_sdk_speaker_clean_buf_data(); +extern void local_sdk_speaker_set_volume(int volume); +extern int local_sdk_speaker_feed_pcm_data(unsigned char *buf, int size); +extern void local_sdk_speaker_finish_buf_data(); +extern void CommandResponse(int fd, const char *res); + +static pthread_mutex_t AudioPlayMutex = PTHREAD_MUTEX_INITIALIZER; +static int AudioPlayFd = -1; +static char waveFile[256]; +static int Volume = 0; + +int PlayPCM(char *file, int vol) { + + static const int waveHeaderLength = 44; + static const int bufLength = 640; + unsigned char buf[bufLength]; + const unsigned char cmp[] = { + 0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x80, 0x3e, 0x00, 0x00, + 0x02, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61 + }; + + fprintf(stderr, "[command] aplay: file:%s\n", file); + FILE *fp = fopen(file, "rb"); + if(fp == NULL) { + fprintf(stderr, "[command] aplay err: fopen %s failed!\n", file); + return -1; + } else { + size_t size = fread(buf, 1, waveHeaderLength, fp); + if(size != waveHeaderLength) { + fprintf(stderr, "[command] aplay err: header size error\n"); + } + buf[4] = buf[5] = buf[6] = buf[7] = 0; + if(memcmp(buf, cmp, waveHeaderLength - 4)) { + fprintf(stderr, "[command] aplay err: header error\n"); + } + local_sdk_speaker_clean_buf_data(); + local_sdk_speaker_set_volume(vol); + local_sdk_speaker_set_pa_mode(3); + + while(!feof(fp)) { + size = fread(buf, 1, bufLength, fp); + if (size <= 0) break; + while(local_sdk_speaker_feed_pcm_data(buf, size)) usleep(100 * 1000); + } + fclose(fp); + usleep(2 * 1000 * 1000); + local_sdk_speaker_finish_buf_data(); + local_sdk_speaker_set_volume(0); + local_sdk_speaker_set_pa_mode(0); + } + fprintf(stderr, "[command] aplay: finish\n"); + return 0; +} + +static void *AudioPlayThread() { + + while(1) { + pthread_mutex_lock(&AudioPlayMutex); + if(AudioPlayFd >= 0) { + int res = PlayPCM(waveFile, Volume); + CommandResponse(AudioPlayFd, res ? "error" : "ok"); + } + AudioPlayFd = -1; + } +} + +char *AudioPlay(int fd, char *tokenPtr) { + + if(AudioPlayFd >= 0) { + fprintf(stderr, "[command] aplay err: Previous file is still playing. %d %d\n", AudioPlayFd, fd); + return "error"; + } + + char *p = strtok_r(NULL, " \t\r\n", &tokenPtr); + if(!p) { + fprintf(stderr, "[command] aplay err: usage : aplay []\n"); + return "error"; + } + strncpy(waveFile, p, 255); + + p = strtok_r(NULL, " \t\r\n", &tokenPtr); + Volume = 40; + if(p) Volume = atoi(p); + + AudioPlayFd = fd; + pthread_mutex_unlock(&AudioPlayMutex); + return NULL; +} + +static void __attribute ((constructor)) AudioPlayInit(void) { + + pthread_mutex_lock(&AudioPlayMutex); + pthread_t thread; + if(pthread_create(&thread, NULL, AudioPlayThread, NULL)) { + fprintf(stderr, "pthread_create error\n"); + pthread_mutex_unlock(&AudioPlayMutex); + return; + } +} diff --git a/libcallback_wz_mod/command.c b/libcallback_wz_mod/command.c new file mode 100644 index 0000000..27c5e15 --- /dev/null +++ b/libcallback_wz_mod/command.c @@ -0,0 +1,192 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const unsigned short CommandPort = 4000; +static int SelfPipe[2]; + +extern char *JpegCapture(int fd, char *tokenPtr); +extern char *VideoCapture(int fd, char *tokenPtr); +extern char *AudioCapture(int fd, char *tokenPtr); +extern char *MotorMove(int fd, char *tokenPtr); +extern char *WaitMotion(int fd, char *tokenPtr); +extern char *IrLed(int fd, char *tokenPtr); +extern char *AudioPlay(int fd, char *tokenPtr); + +struct CommandTableSt { + const char *cmd; + char * (*func)(int, char *); +}; + +struct CommandTableSt CommandTable[] = { + { "video", &VideoCapture }, + { "audio", &AudioCapture }, + { "jpeg", &JpegCapture }, + { "move", &MotorMove }, + { "waitMotion", &WaitMotion }, + { "irled", &IrLed }, + { "aplay", &AudioPlay }, +}; + +void CommandResponse(int fd, const char *res) { + + unsigned char buf[256]; + buf[0] = strlen(res) + 1; + buf[1] = fd; + strncpy((char *)buf + 2, res, 253); + write(SelfPipe[1], &buf, buf[0] + 2); +} + +static void *CommandThread(void *arg) { + + static const int MaxConnect = 255; + int maxFd = 0; + fd_set targetFd; + + int listenSocket = socket(AF_INET, SOCK_STREAM, 0); + if(listenSocket < 0) { + fprintf(stderr, "socket : %s\n", strerror(errno)); + return NULL; + } + int sock_optval = 1; + if(setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, + &sock_optval, sizeof(sock_optval)) == -1) { + fprintf(stderr, "setsockopt : %s\n", strerror(errno)); + close(listenSocket); + return NULL; + } + + struct sockaddr_in saddr; + saddr.sin_family = AF_INET; + saddr.sin_port = htons(CommandPort); + saddr.sin_addr.s_addr = htonl(INADDR_ANY); + if(bind(listenSocket, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { + fprintf(stderr, "bind : %s\n", strerror(errno)); + close(listenSocket); + return NULL; + } + + if(listen(listenSocket, MaxConnect) == -1) { + fprintf(stderr, "listen : %s\n", strerror(errno)); + close(listenSocket); + return NULL; + } + + FD_ZERO(&targetFd); + FD_SET(listenSocket, &targetFd); + maxFd = listenSocket; + FD_SET(SelfPipe[0], &targetFd); + maxFd = (SelfPipe[0] > maxFd) ? SelfPipe[0] : maxFd; + if(maxFd >= MaxConnect) maxFd = MaxConnect - 1; + + while(1) { + fd_set checkFDs; + memcpy(&checkFDs, &targetFd, sizeof(targetFd)); + if(select(maxFd + 1, &checkFDs, NULL, NULL, NULL) == -1) { + fprintf(stderr, "select error : %s\n", strerror(errno)); + } else { + for(int fd = maxFd; fd >= 0; fd--) { + if(FD_ISSET(fd, &checkFDs)) { + if(fd == SelfPipe[0]) { + while(1) { + unsigned char buf[256]; + int length = read(SelfPipe[0], buf, 2); + if(length <= 1) break; + int resSize = buf[0]; + int resFd = buf[1]; + length = read(SelfPipe[0], buf, resSize); + if(length < resSize) break; + char *res = (char *)buf; + if(strlen(res)) { + strcat(res, "\n"); + send(resFd, res, strlen(res) + 1, 0); + } + close(resFd); + FD_CLR(resFd, &targetFd); + } + } else if(fd == listenSocket) { + struct sockaddr_in dstAddr; + int len = sizeof(dstAddr); + int newSocket = accept(fd, (struct sockaddr *)&dstAddr, (socklen_t *)&len); + if(newSocket < 0) { + fprintf(stderr, "Socket::Accept Error\n"); + continue; + } + if(strcmp(inet_ntoa(dstAddr.sin_addr), "127.0.0.1")) { + fprintf(stderr, "Rejected request from %s\n", inet_ntoa(dstAddr.sin_addr)); + close(newSocket); + continue; + } + int flag = fcntl(newSocket, F_GETFL, 0); + fcntl(newSocket, F_SETFL, O_NONBLOCK|flag); + FD_SET(newSocket, &targetFd); + maxFd = (newSocket > maxFd) ? newSocket : maxFd; + if(maxFd >= MaxConnect) maxFd = MaxConnect - 1; + } else { + char buf[256]; + int size = recv(fd, buf, 255, 0); + if(!size) { + FD_CLR(fd, &targetFd); + break; + } + if(size < 0) { + close(fd); + FD_CLR(fd, &targetFd); + break; + } + buf[size] = 0; + char *tokenPtr; + char *p = strtok_r(buf, " \t\r\n", &tokenPtr); + if(!p) continue; + int executed = 0; + for(int i = 0; i < sizeof(CommandTable) / sizeof(struct CommandTableSt); i++) { + if(!strcasecmp(p, CommandTable[i].cmd)) { + char *res = (*CommandTable[i].func)(fd, tokenPtr); + if(res) { + send(fd, res, strlen(res) + 1, 0); + char cr = '\n'; + send(fd, &cr, 1, 0); + close(fd); + FD_CLR(fd, &targetFd); + } + executed = 1; + break; + } + } + if(!executed) { + char *res = "error"; + send(fd, res, strlen(res) + 1, 0); + close(fd); + FD_CLR(fd, &targetFd); + fprintf(stderr, "command error : %s\n", p); + } + } + } + } + } + } +} + +static void __attribute ((constructor)) command_init(void) { + + if(pipe(SelfPipe)) { + fprintf(stderr, "pipe error\n"); + return; + } + int flag = fcntl(SelfPipe[0], F_GETFL, 0); + fcntl(SelfPipe[0], F_SETFL, O_NONBLOCK|flag); + flag = fcntl(SelfPipe[1], F_GETFL, 0); + fcntl(SelfPipe[1], F_SETFL, O_NONBLOCK|flag); + + pthread_t thread; + pthread_create(&thread, NULL, CommandThread, NULL); +} diff --git a/libcallback_wz_mod/curl.c b/libcallback_wz_mod/curl.c new file mode 100644 index 0000000..64624b5 --- /dev/null +++ b/libcallback_wz_mod/curl.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include + +typedef void CURL; +typedef int CURLcode; +typedef long long curl_off_t; +typedef enum { + HTTPREQ_NONE, + HTTPREQ_GET, + HTTPREQ_POST, + HTTPREQ_POST_FORM, + HTTPREQ_POST_MIME, + HTTPREQ_PUT, + HTTPREQ_HEAD, + HTTPREQ_OPTIONS, + HTTPREQ_LAST +} Curl_HttpReq; + +static const int CURL_OK = 0; +const char *methods[] = { + "NONE", "GET", "POST", "POST_FORM", "POST_MIME", "PUT", "HEAD", "OPTIONS", "LAST", "" +}; +static const char *AlarmPath = "/device/v1/alarm/add"; +static const char *DummyRes = "{\"ts\":1641390551000,\"code\":\"1\",\"msg\":\"\",\"data\":{\"alarm_file_list\":[{\"file_type\":1,\"file_suffix\":\"jpg\",\"file_url\":\"https://localhost/hoge.jpg\",\"encryption_algorithm\":0,\"encryption_password\":\"\"},{\"file_type\":2,\"file_suffix\":\"mp4\",\"file_url\":\"https://localhost/fuga.mp4\",\"encryption_algorithm\":0,\"encryption_password\":\"\"}]}}"; +static const char *DummyHost = "https://localhost/"; + +typedef int (*curl_seek_callback)(void *instream, int offset, int origin); +typedef int (*curl_write_callback)(char *buffer, int size, int nitems, void *outstream); + +struct SessionHandle { + unsigned char padding0[1392]; + unsigned char padding1[16]; + void *out; // offset 1392 + 16 + unsigned char padding2[40]; + void *postfields; // offset 1392 + 60 + unsigned char padding3[8]; + curl_off_t postfieldsize; // offset offset 1392 + 72 + unsigned char padding4[8]; + curl_write_callback fwrite_func; // offset 1392 + 88 + unsigned char padding5[568]; + Curl_HttpReq httpreq; // offset 1392 + 660 + unsigned char padding6[664]; + char *url; // offset 2720 + 0 + unsigned char padding7[16]; + unsigned char padding8[988]; + int httpcode; // offset 3728 + 0 +}; + +static CURLcode (*original_curl_easy_perform)(CURL *curl); +static int curl_hook_enable = 0; + +static void __attribute ((constructor)) curl_hook_init(void) { + original_curl_easy_perform = dlsym(dlopen("/thirdlib/libcurl.so", RTLD_LAZY), "curl_easy_perform"); + char *p = getenv("MINIMIZE_ALARM_CYCLE"); + curl_hook_enable = p && !strcmp(p, "on"); +} + +static void Dump(const char *str, void *start, int size) { + printf("[curl-debug] Dump %s\n", str); + for(int i = 0; i < size; i+= 16) { + char buf1[256]; + char buf2[256]; + sprintf(buf1, "%08x : ", start + i); + for(int j = 0; j < 16; j++) { + if(i + j >= size) break; + unsigned char d = ((unsigned char *)start)[i + j]; + sprintf(buf1 + strlen(buf1), "%02x ", d); + if((d < 0x20) || (d > 0x7f)) d = '.'; + sprintf(buf2 + j, "%c", d); + } + printf("%s %s\n", buf1, buf2); + } +} + +CURLcode curl_easy_perform(struct SessionHandle *data) { + + if(!curl_hook_enable) return original_curl_easy_perform(data); + + unsigned int ra = 0; + asm volatile( + "ori %0, $31, 0\n" + : "=r"(ra) + ); + + int method = data->httpreq; + if(method > HTTPREQ_LAST) method = HTTPREQ_LAST; + printf("[curl-debug] %s %s ra=0x%08x\n", methods[method], data->url, ra); + if(data->postfields) { + if(data->postfieldsize > 0) { + Dump("[curl-debug] post", data->postfields, data->postfieldsize); + } else { + printf("[curl-debug] post : %s\n", data->postfields); + } + } + + if(data->url && !strcmp(data->url + strlen(data->url) - strlen(AlarmPath), AlarmPath)) { + static time_t lastAccess = 0; + struct timeval now; + gettimeofday(&now, NULL); + if(now.tv_sec - lastAccess < 300) { + printf("[curl-debug] Dismiss short cycle alarms.\n"); + memcpy(data->out, DummyRes, strlen(DummyRes)); + data->httpcode = 200; + return CURL_OK; + } + CURLcode res = original_curl_easy_perform(data); + printf("[curl-debug] res=%d\n", res); + if(!res) lastAccess = now.tv_sec; + return res; + } + + if(data->url && !strncmp(data->url, DummyHost, strlen(DummyHost))) { + printf("[curl-debug] skip http-post.\n"); + data->httpcode = 200; + return CURL_OK; + } + + CURLcode res = original_curl_easy_perform(data); + if(data->out) printf("[curl-debug] res : %s\n", data->out); + printf("[curl-debug] ret: %d\n", res); + return res; +} diff --git a/libcallback_wz_mod/freopen.c b/libcallback_wz_mod/freopen.c new file mode 100644 index 0000000..f5c106c --- /dev/null +++ b/libcallback_wz_mod/freopen.c @@ -0,0 +1,18 @@ +#include +#include +#include + +static FILE * (*original_freopen)(const char *pathname, const char *mode, FILE *stream); + +static void __attribute ((constructor)) freopen_hook_init(void) { + + original_freopen = dlsym(dlopen ("/lib/libc.so.0", RTLD_LAZY), "freopen"); +} + +FILE *freopen(const char *pathname, const char *mode, FILE *stream) { + + if(stream == stdout) return stdout; + return original_freopen(pathname, mode, stream); +} + + diff --git a/libcallback_wz_mod/gmtime_r.c b/libcallback_wz_mod/gmtime_r.c new file mode 100644 index 0000000..bca5547 --- /dev/null +++ b/libcallback_wz_mod/gmtime_r.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include + +extern int MotorFd; +extern struct timeval MotorLastMovedTime; + +static struct tm *(*original_gmtime_r)(const time_t *timep, struct tm *result); + +static void __attribute ((constructor)) gmtime_r_hook_init(void) { + + original_gmtime_r = dlsym(dlopen ("/lib/libc.so.0", RTLD_LAZY), "gmtime_r"); +} + +struct tm *gmtime_r(const time_t *timep, struct tm *result) { + + original_gmtime_r(timep, result); + // While the camera is moving, the AI process is disabled by returning a day of the week that does not exist when motion is detected. + struct timeval tv; + gettimeofday(&tv, NULL); + timersub(&tv, &MotorLastMovedTime, &tv); + if(MotorFd || !tv.tv_sec) result->tm_wday = 8; + return result; +} diff --git a/libcallback_wz_mod/irled.c b/libcallback_wz_mod/irled.c new file mode 100644 index 0000000..8ec00d7 --- /dev/null +++ b/libcallback_wz_mod/irled.c @@ -0,0 +1,24 @@ +#include +#include +#include + +extern int local_sdk_close_night_light(); +extern int local_sdk_open_night_light(); +extern int local_sdk_auto_night_light(); +extern void CommandResponse(int fd, const char *res); + +char *IrLed(int fd, char *tokenPtr) { + + char *p = strtok_r(NULL, " \t\r\n", &tokenPtr); + if(!p) return "error"; + if(!strcmp(p, "on")) { + local_sdk_open_night_light(); + } else if(!strcmp(p, "off")) { + local_sdk_close_night_light(); + } else if(!strcmp(p, "auto")) { + local_sdk_auto_night_light(); + } else { + return "error"; + } + return "ok"; +} diff --git a/libcallback_wz_mod/jpeg.c b/libcallback_wz_mod/jpeg.c new file mode 100644 index 0000000..81ae16e --- /dev/null +++ b/libcallback_wz_mod/jpeg.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include +#include + +struct channelConfigSt { + uint dummy[4]; + int state; + int encoder; +}; +extern struct channelConfigSt *get_enc_chn_config(int ch); +extern int get_video_run_state(int ch); +extern void video_param_set_mutex_lock(); +extern int IMP_Encoder_StartRecvPic(int ch); +extern int IMP_Encoder_PollingStream(int ch, int timeoutMSec); +extern int IMP_Encoder_GetStream(int ch, uint *stream, int); +extern int IMP_Encoder_ReleaseStream(int ch, int *stream); +extern int IMP_Encoder_StopRecvPic(int ch); +extern int save_jpeg(int fd, int *stream); +extern void video_param_set_mutex_unlock(); +extern void CommandResponse(int fd, const char *res); + +static const char *HttpResHeader = "Cache-Control: no-cache\nContent-Type: image/jpeg\n\n"; +static const char *HttpErrorHeader = "Cache-Control: no-cache\nStatus: 503\n\n"; +static pthread_mutex_t JpegDataMutex = PTHREAD_MUTEX_INITIALIZER; +static int JpegCaptureFd = -1; + +char *JpegCapture(int fd, char *tokenPtr) { + + if(JpegCaptureFd >= 0) { + fprintf(stderr, "[command] jpeg capture error %d %d\n", JpegCaptureFd, fd); + write(fd, HttpErrorHeader, strlen(HttpErrorHeader)); + CommandResponse(fd, "error : jpeg capture error"); + return NULL; + } + JpegCaptureFd = fd; + pthread_mutex_unlock(&JpegDataMutex); + return NULL; +} + +static int GetJpegData(int fd) { + + struct channelConfigSt *chConfig = get_enc_chn_config(0); + if (!chConfig->state) { + fprintf(stderr, "[command] jpeg err: ch0 is not enable jpeg!\n"); + return -1; + } + int state = get_video_run_state(0); + if (state < 5) { + fprintf(stderr, "[command] jpeg err: U should call 'video_run' before this func\n"); + return -1; + } + + video_param_set_mutex_lock(1); + int encoder = chConfig->encoder; + int ret = 0; + + if(IMP_Encoder_StartRecvPic(encoder) < 0) { + fprintf(stderr, "[command] jpeg err: IMP_Encoder_StartRecvPic(%d) failed\n", encoder); + ret = -1; + goto error1; + } + + if(IMP_Encoder_PollingStream(encoder, 2000) < 0) { + fprintf(stderr, "[command] jpeg err: Polling stream(chn%d) timeout\n", encoder); + ret = -1; + goto error2; + } + + uint stream[17]; + memset(stream, 0, 60); + if(IMP_Encoder_GetStream(encoder, stream, 1) < 0) { + fprintf(stderr, "[command] jpeg err: IMP_Encoder_GetStream(chn%d) failed\n", encoder); + ret = -1; + goto error2; + } + + write(JpegCaptureFd, HttpResHeader, strlen(HttpResHeader)); + if(save_jpeg(fd, stream) < 0) { + fprintf(stderr, "[command] jpeg err: save_jpeg(%d) failed\n", fd); + ret = -2; + } + IMP_Encoder_ReleaseStream(encoder, stream); + +error2: + if(IMP_Encoder_StopRecvPic(encoder) < 0) { + fprintf(stderr, "[command] jpeg err: IMP_Encoder_StopRecvPic(chn%d) failed\n", encoder); + } + +error1: + video_param_set_mutex_unlock(1); + if(ret == -1) write(JpegCaptureFd, HttpErrorHeader, strlen(HttpErrorHeader)); + return ret; +} + +static void *JpegCaptureThread() { + + while(1) { + pthread_mutex_lock(&JpegDataMutex); + if(JpegCaptureFd >= 0) { + int res = GetJpegData(JpegCaptureFd); + CommandResponse(JpegCaptureFd, res >= 0 ? "" : "error : buffer size error"); + } + JpegCaptureFd = -1; + } +} + +static void __attribute ((constructor)) JpegInit(void) { + + pthread_mutex_lock(&JpegDataMutex); + pthread_t thread; + if(pthread_create(&thread, NULL, JpegCaptureThread, NULL)) { + fprintf(stderr, "pthread_create error\n"); + pthread_mutex_unlock(&JpegDataMutex); + return; + } +} diff --git a/libcallback_wz_mod/libcallback.so b/libcallback_wz_mod/libcallback.so new file mode 100755 index 0000000000000000000000000000000000000000..4f0c74970d31a0d80b8114e54de79f3726d896b7 GIT binary patch literal 40313 zcmcJ24|H7BdFRzg#>O}>V3P=>q-~H})zx(Iix$l?v^z5yvsS)O?73&1i{N+Nl!hiCJ z5Nm@X(<&TsfoK*V7WE{}yn{c+@d;g>cBRzt09RK|xiu2i$n@2-8idt|b+tk~aG^l@ zylO-Me>Wfzj!v5{{LS4|Em2l zFvsVgg1-TNH{|mH`19a|X(GB{`5N$$g_j*MUf$5kljGL_*^unKj`#2ow zJ_yHaM0xUW9DhFq$8xhwqj0ywT>?j$JPOC_5#`ChEPqJj2etoE_&eZOmInQda-e*8 zb-@kEJ0UvZkLmlHwf{@-_ru)=w;k>(I9^x6eFUx%t__aY#c=n*Mc^oRUc2BZd+Ir_ z7C2O^ygr7%ABMYCLHU=mzER_Qw9k6l3^xq77moF0uIq7g9o#m!190PThvBY;y93UF zGgsQ&RPb-Xb2Jfg1Ka>y58NTRYv7vUegTfx6>xdDeFXZFN`(78=7Hs3jr+Uc?uXlA zJ#W(Y?eMAZ)a9GtCgFJPgu7SXt^C7w$mgMJqI^J1HhKpry|J_GuKh5wtRRDT?J0i>U?!at4l`Yl`^5Te(@7lGf1h5s7# zVGI9H&^s31SqHgV_|w3`!iPb>IH>p`|IJAMjD>#>^a~dLRpd8s;ZrE@oP~cExPV4^ z2=OTY&7e0IZR)SoLS7dA+rZ+H8fnKbMSX7rKQmVNhY`PE;ok+$Shx-O^jo+I^6a(n zUm`qW;U0vCE&Lx0bMPIw?MUCT!oQC41TFk@Er=|f2L0jyp5dbWJ}B?h9|zux2tQ+m ze-r5~Soli_pSLh=pt&~V<|XhyXNA9v__G$iHvoBA`0JoASoj}+GZy|E@ZWFY5#--% z;cp^5V&NB&U)aL$AiNIsrTR#;Ps1$y&2U`-$j_qRVTC)m|24|f3ZDgk!ouGKUW}?p zl;^dSpM@Vq{`0U;>~GlqT0p;Gg-?Ti-ogh_-*Xl|p^}z=H{+m`izC|LimD({}AcTTX+uPa~A$I!e=df6zR=a z*a3e93*QU*WGs9X>GfOq^OTo`KZfv#h5r}jW#L~(evXB21HHLuU#>%VuwOl4c`pMN z77l@*MRwk}7`_$wjD_1kzhL1nQ63g%Ka|0MuK+sQw+#r7gutW5WAMWm_)!lTz6QQi zU&3REfBXRrVhJp+&!Q6S2W z^NG}CG?|O?!45tcRYCV8V)1lmG?O38#ziil&8H8$S>6neX5fLLtQg8<6RG@=7>$qS z;(3us59X61nI4QL-CXRjJI*9rgt+n4U^*7ptRpx%5FI=$V##zSo`RQ~92L9AVu|Ja zGJ~V83>$hRo5;t}`;5AY9Ap=bO-eABOy|_&(a~tejgChXNf|JV++y)$RFMr#=Hodx zpH?~NB!x^dVX+xy&XP@LqpD?@$J;XTVM_{0@Y|V2o~hV@crKGpk&FBY8FNR+^6?3G zECm4^7UTn^b_YjN?qE7Klo*zelt{8;DL0poqF@SVqR<7&fl5QBuy22_yGP0`>mJNU zv-tz@!SUY2ps)ja)5&BaHGD7+4o1sDZjI;l(_C~s?mmQal!YINC*#mJpO^>p>5R$C zpFds3@`6jI&7(o^gW^F?(qnl66&N2F8?s~`i;pJ;C_pgWY#jz;q$GnUUmk@6$y zSdOBKr^ZE2>(}5|HtB-fNjDSElAZ+l#ArM{6hloz{RT6W)Xfx?b0`~^y3+@Oo@gc) z?~Ue11Ruo`QiD^Z&c;X6<8iS+olj@?#+2U^&E@ywX^c_TBSMSsQIfl?+)O%`$S2Y% z5zVKE_{UZ$MaB%==s?bmriNi8wB9I-ac?w%tYiZFvOV#b(*Is6ZVvi`*5tZqVyU#t z_9W?0K0HaI2=P2=(wV#%$wLL@-=r8wq+)2mFit6uB;$h=JRU^{2jd`3q`-A5pN@*5 z!4%qQ7V0G1GqiwW%Oo;!F+57KqMBIRT@J(h|MEh|5CJm%&S z!?1JZ&zN595tPk!L zmx)IY!@3Sa-%~Es&_yYtJ_IyW1e0Aq) z1iR@T?e}WGPy2_o|A6-UwI9>|i1w4(&uBld{WpEqkito=6aN3`Fq{a%AH?`6C$Vl1Gv z(jUVZg+3N;LiDkq)kl8<@}!T&kaqf5@Ct~A_U0dap{eoAZ`Ph!dbuemUOLerzI~z| zK34oNvQRX2lIBab&4u4APJHO*rcdfH&=+mGxBixCDY{?GijL6L!7i~@bZo5^k>Dxh$2jEUXG_jT`s;)vG1Ex; zq`~-41OwtE2D*)yICM4#Afwq$>mIM3mZQ^JfE=2|ADn0?e6~n=Y=t~}#|M5rB%VLv zh_6FFb0=CvWK-<%qs2Ag(E;xJL($H7IidllI2?PK*pEr3W z)7(-?rf(qc%fQ1NWO%741O<2!;%FftI+{0tN3qNorw4%$%JCJHr-Ui_KO0iAnkr7^j!s{I_&uPj6RMs`GljfO*{MHuAH2EgaqvPNVjhc{ z*R3cg)BiET$S?Wq)qK8*`V65C9r3Lbjf=CjNbf|mIE8wB74BqHql0!=c%m4L$3ue?hKs12EQVC9W5z zP=BP^6M721H~o!Px@ei9iSf?k$3Q1U$8@6;k?A{#TQ6QK*8A|swA+y%rV(ZNHB`tC zI%Ab1vLdg@dE{l6^#SDFcy_)Pa)wTQ3;OkPlWDiCi&KBCbVi^q&Y>>ewdz9DoH{{y z9)UbRY4Jr|BRWGWtn)a_7(+g+3$JW4RrsasYs8w+Qq2XSKBVE5ePew@*5^#F^EmUG z$#qO`5WA)A^X4;MC7))gOA*nCg@)7Og3t>-c?HmhKzE|BHV}gDooK5Igu?J|Yz?$` z@91c4#eGD~!}bP3ZMbj8{q`M!_WSPcXzc=4{B=&Ny!yrI`P%k1_rzPNw=ekUMFZnN zZ!4AOILgydL8rWV)fH;nFZ=(<>&;d3>X^PpM5NrAH`~`{-M&Q4N!b>hWf^o$t7o0k zuVXuD?iZ9p$VUz##0!a6ii|_r4PrpH6L0;Bp*^8c6?x>r6ZCbZ4ng;!*G1?x@+jB+ z*Z->2zru#Wj+E?>13MIg9rE%~4?Z055fb0=ZSRmn@e18mSgvjnXzxAU(Yi?tEVpYu z&yO2B(m73;lK)1hU)sC=A!Y9>*^}c}bU+qL=Q4-~Uct|+zGbIvM!C@T%gcWHFDsY5 znQd*TE5x?B=+jn=-8&9h%=?AwcAG&NX?y&5pe^P_8x+yJoNs?{M$6}X`-5YUk=-Ah z9V+h+-Ujye2WL^X^XU(cp^RP~Sw!4w{lSLemHoln74ozDgJa_>`-9-{>Ur7y!B*s5 ztv`6-4W$<|=ns-;6C-F7F^sEB|C~X)$Uw*0|Iyx4cc&p=*XkdLP5&?r`7~&|NgF}? zN!@M3Gulwv)GoMgxE{D(xIVZ;a1X#4dt10A5Nby}0lOT5Ux##PcOx}{P!FH4!59iY z+ZOC|Qv=$B!#05h$HumZDEQc(<^F{{Qs=?mg#^H=Hq z-K4`d@&%tfIp(6?+jI*)>Dl=o()n+!lD|o>OWS2)>V3q*ET81dCqMRmCJoZO?nA?V z(Wdb$ANx#2(<|-T%y{QC^+omruy2jc5s~zfOQRzK^|HPqqTeTP_P=ly`^zNSL2H%% zVG3o3?)utD=y?%(UWA?(Gaftn%zv+JCoA<41@N+3AF;{O1M2M5xUnOuKOn!RKX`q( zdVlcJRi*x*fOzkxKX_@Oaygq(AMXsW-X8=GSI$nOgyN`B21`fR52LQd)H3o>3r9P-gY{1=#E(u-Ox^*?G)|GnUK> zu-j;3qRxjeGZqcPrU!lO-&-Tf{%x&df0mX4p|^C|n9muXve5o>e6$90VB}La&ZC{( zkWl%2VwHSO>U{8~Ih66qhvVu^C=2_Udh{V7)XNc{atABSC3+H-$C@lB`@N%@2d2HS zc1`HT_mKXv^GF}B-KBi&xl23b;x~684f&vLtpQE`J@E3T7b@8LpX>UuWfJqz5y~se3Izc^r zz$cG-v~TLm<<{7LHmBrwKK5oc`9Tkhv<+zUMYQ=M+C2KNxnjZ7hn@K|Wgl#NYHX>j zQ`nxo5C5vZJEniZn)@lcs@6R+TQHWydd%Pc+^l=4^%xbebDI2N+%4ygw2S=@m5;k) zz_iiSTR(frbe5KCL$r~9f%PMSi}Qux`z#Om!J1M;t^<&tnQQlAJcm80K6-%ud4+u{ zJf!T?lv?tk%~uPv$rOdgc5m zr`dmj-N*y6cl^|8e~#uiNLC8Ra&!z*nz_3>g|uV&rv z4W#Qg&#Tk@Am<+eZU5L8H=v(7H9jE6F_qTTGT%}1T=*H*LIdAE(HtnPD})25PP7JI zJ<%3;?F9LK6a0n)uNI&2<$3-@zs{Syw+3D*a@{;s^9uA>traXL)!1elX?fSrIPb!~ zQ>n+aMeG+F>jy+z;AHVSq_b;T7CH>iOdim&8T8dphiX)t@f#0GK9C;hK5O`Sw+cU` zbMXGa$QJmCT5aQ7AZO-B9x)znBA<4;c>gBXfc?vP66=T^STDoe1MxAAX?|r%&9hA1 zQP;^Y#sp1VL$4d13Ym2&f7#1)WM5C&8JT@ir%Sy@-4;=|#c-f}Z6))ns{eV6$J#L- zYr}Y~72~n6H6Dv#JVsk_3gh+l)?8p77-1{w@?T6Jj5@`xmzx^I!ifmVTDMNk!>Jz^ zqTF~lBj=avAW!Oi!{bjB8CJl17wQgnJ|q2;#o6^8)0D#oOAZYfAN$FI^vBn5Jf&+9|Jbqo-sG*~MY^0O zPsWKb4*G~nys<2Yt$b(K_b!)__TEo-8;_~A<+D}BFINXQ2O8@G0oIeEQ+<`6y|`V= z-5#&Kgm~UI$uU3EdmZ(BHR@w)O-J+9ns>_N(5Szyr9292)Y#!|J@$IL3h(yVVZz6@ zFum9DK4a!$Wj7Zd>X?oi9RnYg^w5D$keX9t&QH0$nMyxR%+nc%AzluMp-hVG5ztz@qMQTsgwcG{tua)|G z@^ECnG7k=H9oN#E#cLvR=%%$h%fSou#hyeye)@%$`U6 z%&k&Ci>uVn>6aA`tJP0X*H5sjTsenT>q36@bD^Tjz?syuvQKYp>lfbfSv}s-o4lys)SV3zE7!+Lbdlrd zkT&NwFM-z9P0~=m)IJG}yDXbXy?XbLE9;fv!Pskq$rJVcEcD554yx!X^Ta&})of8r z^E8LL=s{g{TXoS3yVwW2*eBySMO(KzohM8T7#do{7B|i<&)b6QpPTzMJa6&w>yKI^GT)_lvVe|D;XnLr3U{ z=JUPQ57s=SJvQk)^gheWcPZibSYFaI-*fMyypi`&UhbQ~xK8TjIz1L*y^eqfZ`&mu zTrr^Md=BO^#CSKfJa4Jh>6!Lf_TDzt5&Dqkk>R~4E9NuDFGL)^A7Z&D+B&c==_@kb zP4Ksh)87e;?|z5xh8SMB>DJJ!4{vRVPrYJWMmxng^;<~4G_RvB@uHoX`KGorKYzKY zp$7W~YD)8a2YY5hHLt>*D*DYkmP7}BUeFPuk9pbC4)#6p{tDb*sn@3vzxcBXeKXro zaFXpwuCIL-`^iF_dt;8;WahIWPn%k{Q8m~LP=mbyo_!GW-%#Z_g!PJNuwF5X^@=Y9 z)cY3p8P8$Of^`+ZI%fcT0vf~korfn6+8WjYT=BzY>$bhqNgsKeHLMw*bQ&EIkn_H@ zvW4D#5V9XYUH$KXvNv3#`62R#YpTPX2EXJ3AE&T(xTdvEu8&1T&@Z3*2=@F1LXCPH zdJKG`Wbd2b-YWc(pNNkfsB`nW9BfNx#mV2Ho{DtGlkA%&eB%5)Xdol;L!Yp>AqS+< z#QfMN1X2D?er5kRs-xKZEb|k(%q(kNreoUh`=(Es_@4gXvYs;UljnOh&oRiC_9BEf zf!|Q02Kl@2SJ*#W>nxGu#BA&ErG4bu7xr+r_)?@Tlm*9#uZS zO4^7up}OE6vBf#6Y0$p0UI3coq@gXN0OX?T;GG(|&rjCV+F&Qv;5)+K zsfkEEF!E$PSMzP2ZIWxLs@wsz%XfWry&ZYOp^xlne!fQO3gUe>g6EgR?}D$=>zc;1 z;wG*I>-}|=(|ZN$2Wrjti={N1x{($f=K+NVq4@8H-8kgKSGQ1e$MvwU=yPXlFrKSK zOP%jRI^CGN^IbXXx67w~N#kb|QAXdk!RNLmdjoT~~7w zdt6^>f{(rAw2`O}@Yw3ZANLi(6)!2Xm1>RW$#nI1LDcyUtwZOK&vQO9HFJ;S>6Pyw z7$0MHsZ+-gm;F-ZbX0%&Vio=FsUYhsG>;6g)qQ)n53jwD1svWjcC?bVPSRq|;X_NA z`Pn2sx9iW(wvmSGKGN=>ZY$ZNf3U{bwmtfhw#RI1s(#UT$T5HrPx;hwAIb$++-TCP zz&qQs&3h%?`{SQ0yTLTC(0W5Y{Pdh@`pM~h^P08tTDDDSm$V5Rw5{Pd>J6I6?bYr9sr%69inYv8V{^uTh^nk2Ww6~4Y#ZZ=3S|uE&BJWBaThCqHOE5 zJSj_-0Y2n>vdG`ld{vJLKv%rM=pkhLR=Ok954!$UWYNEhEdIU9rtFehw`>N#KZG4S z^-G=Rm;t_AkGS^dyXC%sfBczhFPwK_?oq_tqlmdj@j1^swT7>$If}hrXYXMM zPIiUbJ?)$G9=r#zY^bu`?`qq9k+ci``#IZneW|`ym9dh2G`~YJ{XFJ%(oS-WQ^`&; zj!qkMx%ZO(^4#zI^3ZciuBWk%=009|&jahgtlips%s9R^mz@7TS9zU{c?2`7udh3q zJ)wEf+IB$BQ!(bFT%5_ys_z>%Xde9Z0s4-4|EqGGn{YTy-lp`NgIhVhBdTBEAd zSBmGr3+JkQR|k5$UslgpXMENmpYh$R(r4B^_1w^2g8l!Ij*eE2-AQZKHR^ObC%w66 z`(KCgRXx@;cz?e2A%3TF+puNPk2UO#K6@qk+`PXJXVjd#(q2i{Z(pV(WcC$+PsmWM zU1oG#Z$D$&2g{1JaM>QY|6;_a{sX$*abC>57P0)maq2@1Jg&!>n7^r`E*_KhqV{?+ z%Rq~(38t(&G<2{5m-ahdH z#!G*I@#FItV}Jcbmwxx}U_Ax)9DC|t#oqeYq>fVl7uQ6jJv92Uz9u5ytHb^m*Xl95 zlC{6SIw&94I&FOgy<9)!Go!Dj-!b}1J)^!FT3cU9%kZ^YSGl&h7W(XbxucbH!oSnc zW1#tST`#Q|TenG_Kp&4Wf_F`te40MsOFI4t;&WdDeQ67^_oER9f2chRoj8O{{sxn4 z0PTg3sTAiUOc~G6GtV~IAeM2RF6#zq z_gU70;P`4DzcsxYWxpD8@aLZI2wn7z+V*eum&(XJG5+NYU|suDvW&ZR8BqtwPw|^4 zzpIqf=9lz#{E7EiUeYtZs@J=8z4l6fo#>PP260fXb%_3>UB^BBHg%+NCW18;)Ln(} zAlla^w6A)!uLi91(nb`}ekt!a(6=;(vG=r11ibH~m^RLJk~YMvcO$S#>%^zP-zogg zUlUW9Eb_FHS+ zv}wm@l}&pcHmwylEv(;L@i)56kG3)o-`jti^5Y$qv}fq^s`jz$PZ>wraJ1bJ^u|Fs z8tV&a|F!t-bworitwo#YL_5JRh0so#K?Axb_7A<2u@L>%N!4$4`S4T^daREZKZCLO zMb?^(E%%_0+}UT4H|{}YAMq#F9@ObCRq1mPr{Uq%$3Sh!v)ULaj4@C(S)*LbvZd~v zI#_vZ=eM8r(8JZ&FiiO?_KW8^UhMxbRb+*}(EEGu!o#XAtBoV<^~hrnul)Vq3}pM1 zk1pUHm0W*4=4nSPYm;u1W^d?|tEAE9lZLS^CXJ_7Nn?Xg8f!EktW%b)*21&EmBu3M zr`UEEzu-3>DgA!Nj6WKk+1kcJ0rP^X;?~?0)^w*Z_B?gM;Kp!4uHALuAinuSYsHpB zzbfW?acZxoXTQ~mzPAIXM$C8DiY?v0BIYA#pWu5d_HJQr8#>8;4esi*U%~JDzXB1f zeVU}f*tDrX+le`0<+Wqh%Q4V$49>AS){XX+d($WT!<}_$tgzvRaj{Jz+j!xks%ZYrt#d9ta0}C{O$3OS`sA51R&zGYiUp>&&&9cXgX= zsxmi)P34$uR{5PX^e+&d62q5xjmGdL#`{8qE7_3eb8;?TT04Hrhi9CrV2!oa+}X)0 zn^EnzkOiN#V#qtqaW3s{F~pZ#=K z>y!@-8G;QxEv0_kEmw!L%5D+$a7=z)NAupOZ|CJdhd<>OJ!q(m1BaZo~mre*-sT7tvn{kV2<+s%12J@x0!Axzx-PgDOc*lv23|roB=j<=C_ZB>98M1TF2k8`tehr zuUsa3?o9su=FWU>=AKVxRlikj?o7V-Yu(1&YI*LwpyO8S^RTyC^<5~7soyts{qCw# zzeZl$Oq)Xdr%+e?y=|pEfbWGj%C;Hn7Ee9ac^q|C#C~>JPnG8Q=6BbmS8-oq9m{*_ z(EFK#pZkr<^~gLb>85uK_2&KWZ49+3cYb52isf2m48{K3(Pd*fxZcGvcs_R@`fL7{ zp6BPNvyX5>??#?&w6t_-D3c3b!*hDhEd{Ts6IcA&xuxycI)mRpU=CoPEyQ&`J~vko z=lnEIoT+8poTv}kIP1X=dvL~s(;l4i;G_p1_TYy+IN`w~9z5*9LmnLW;Ft#wdN5Y} z%E}-0VC=dn3wJ&E0S~_4gYWa;Lmqsu2jAntcYAQ32Osp{10H;r2jA(zcX;rA55C=l zZ}Z@N9^CE0dp)?*gF8HUw+BZ&_!Ay{iwA$)gWEm$V;+372e*0fO&)xM2e*3gP7mJU z!C?>H=D{r?+IOM@sd+=rtZuDTsgRk=7k9hDecyNOU<69wR z?d?hrzQTh)h#lH&X%0RO!wmO+IY;#ryZVS=_Oe&?oRQLVTR)rN;_Ed zrcO{raxt4$AC>Cdv#)F4ot^H%z5{!9@4xd7MJCj_uZ}zn*O3g9o%Pnqm+I(Oo_iVh zJH6N8air1F&XIkwk8g=>g@Dwlz8?=yY?*)zQiIOW82%(u58=E}9F*$t99qS(NpWyM zQ$tp{NgP}{x(x>q)5-HPafUEXz{EMtX(WDLCkh+wz?i;beahp0tJG(CxLuz^%k_k^ zf+y$$j-E|tCmqy)gM&y>nI#%om+~P`1XZUFQ__$Y=t^a(cKq-vLPl{b$yue!oJ&GJ zKN(l!rzGFb=-^2F`p$GJpG_xsIjQvZgM6}{PvWWk^?j3>_%0_g8Xb;r7aBg#xGZ05@qcx5oIcoTN-}v?+&GzZd&0AvEI!Z|@ z=B*EP)|KCkBcvIL2kGK4WyC7k9$9+HubtoW(a$F8D)}uR5ba@ZwS26DqJ46LZt}EZ z)Dh0y9g1h291cKNl?a)a9~7+~OM$RLaODmsGES+HtUNDTk(K?u6~pZp|bxUxi$H`-G+rma8E`<9j;pZ!>I^f$i!wC|36`}h6g z9(Q-o?gRVX&iguhWWBTRzMm1UkHrVZh97jg#zr%;SHm}s!fg{!Mff`=9PqGZ5H6E(4-&#Z*$SoN9G%ZH@PK!)R#?nHDO4rJdZPXJHy;BoIt|44jbB%MC|ptM)6Ova6mqf5{gp)<77vhr)eaAPb(5--2{ zxOV^a)mhqQ8EhGHwqPixY!K2j;{j3ldMDlzcg|jd?{e|`1PGHo9(-C;ctRcw51*%& z>oeL#B8wp!o<%b}q8;{09@1_k54?OPd+8YuWH(5i%We?qc|g0ed*fiPqH?@TEZ#(V}#5tV8XfYdqcr2dFJ44y@s4lrFqqMuA)kD;>OnAz>v9?Q~ zF_%}~%Ll=0f>K{VsW>>`oPPH!4b6Bo zIc9p57`_?+nM!u-zm%a**!9l!>jh7Rr;v4eBz;d~QSZ6<75g=%cOBF{=3(Sv>dMSJ zc*Z@$ImfWClH8;Q?sC{e?4rfN_tgeyGt7KNhEtNDkz-I;G&KO=XvddMeSgI2pzSe@ zm7b=PJg-cPJn>9>DZ>N%_F`WLz7@Coo;^dOd4~&){L*3s2QU_H;rp+kU>CVu{<1lh zm1l1j9dUXLWk7*Bgv;d<$)v+(i1}2Ds^|5~^7Jj=SPsKbv@(@!`y-r)Fu7Zt``gut z|F=8{t}E4D0WTi5vM`=&3D-0D0N)E&3(7lw1-f^Y(E5&ioaxCOX*xH&j}BaPQA z?)m+*89sx{!1crR!bRZ1aJ(G&LEghHqK)x71AhT-UgJ6Vvv4zT1-J}cKU^aL+49A8s*<^x*jIga!I=b8x(7;m^Po;4*OiaJ_I5xGRPH+xfplCPYnHI0rH&{^`vOFOTowfeEJ#!BrOD!2=Uc`Fqp1^UrKy zcx_qy0-l)oGuJY_JbgPp?N_yM+BR>vg9j#ke*Y0yS^f?lm~h%fTxH>Q{^I(T;o(3j zzWkV~r+g7aG3nFh;wnqu!2=V{?@i*W7*2a#Eu7!KtR{cjdR!IL=l40Q#V_2%@bdU! zJTUxEw5<$xtZ=qPTxI$9TH)G0l!ZH1`pnmCug9`x3++PK}A0wYaIP5iR&=T0S}eAKzw^{)oBb=iu;JInffE zOhrfW#juui~QVOi~Pz^%l>`62a)F3Ku)x9JO{G0{Nhkc zd_;X5O|%T+BUlKIDes{{q@_rP(|ItY?)gok7LH0W_Y*Cd7>K}sOEjO)CI+yUj?hs# zPj871BzEqgbk6hoFz7Bow*>Vp`xd#0UWXfY7c`lm6QtV!U8g&X`!#U9NVg7-riagD zdZ2j+ZlYF&rJKOLxeWaQJTP?pzAv5pNVX;3*bTgn^#4~dl`TYhS==6dd zzZUZ9+mbdN^ZqT1j^m{6@lqK{Yxw&z?#Va#>jhm8=&*fn`7-%_6;GINSci}i}=*<3n2KXrKRPO``lxtx?)_D#wqKb&*wpBUxw~dJY*TnMY``B0N>Ej zr>>ambOGZ{*taY3;8Spv3(L&5VW)R|Muy@!&o<7h zR_DOBtgxyTwpoQ$0NbX*s$%qb7O`oMbz6g9t2I!zDT!GM)pqFDiuLqlJE31IEsAOj z3abKA?-f>zP`?#c4U2lLFa(E-`pTN9Nr7hr9gOk_y!Z+os z5toRAz|xk%4?w;n@asN^Ke&jgj=dKC3^CdfB~XL%&BE^kX3Y}+KKu!}%SOfjBj7^_ zXP?1vFaNKRUdxyK{|{iB-@gO4`TYrSFYGEW@~3J-Vali0dO*AhIAihG37og^LEs4s z4*_$&a}KI3%MX0S3g`F2sSm2WLGgKD&TpnPKfecTF6RFdaKVay7I@0S{{(!@!t0PP z=R4T;FY~_=c-jiT4tU1GJApaBG5OyLY%b=12k@N5?*pW_a1wYH>6!X@l-LSC2F&@7 zg91|?PXcqkvw%#9zY5Ix%^MoyfSlz^mLHh&o0tw?@Pz-32mcUw0i7PQL)~5^-UjCP z3Kb5De+K4v3k_ZZUbOIqklVZ^A8s5!W#JouIbT}T{B!}!K?>4gdG-OnZqeVzaDA~n zgTM<`cpjMZqbblZ{--_kGr(so`Y$sa_QUZ1HDG>k(cl+=IbSmAy+(R{G5_xYFM87B zcN$InA0V9bB@=(q6aQUc&WGMbn&fvKB5s&~63YJ@#TCGu4?U^FuV*;dSakR;z~&-9 z-NfkSAU;`NeZaxV8l+6TQ9KCD`Oh8u3_k{JE~fukUk0U%|@$;X7pF+6M`F)NUYf&sF`S~L7 z)?7(`$AQBZJ_*eEl4+0M2j=|8V8a`I@^=Q|raui}RPYmE)1TKM{GWkKYlc5v`WIl+ z|KZ!3;sSKpW^IxE%|>93$9UDCKXe$5@+th&r5k}we(Wtd7UNnNFXDTE&sg{&V6K_* zVt5u<^uysIehfI+Po(fshU<&H^RED#{yT{Ndj{C)R|JgzMPO6DjVSL|fx}k#?=gHo z%77y9`{myNj#%NZ0{2?@y9^H@4Nd>oz+9g?i@X@0Q_OygejRYe!dC+qEPNgCjD>ds z&sw+#c+SEHf#)rp0A8^0!@!*HzX63JKc4|UV}(D0WjBAp&Zbjjp8T3jurk6aM;5C3LLR;Jq(NeJ^C%cy;k^j zz;ZpLM)9{3nBz$#;28`574WQu{}y=8!ao8w*Jj+T!<1m&3cn0^ z!NT>xXDoaTu(=%EbO0|};oS@$R1_@l-N5oa2JVUP2kz1KF9`h}26ilZ?s4RLYfQJl z0^@u%b*y{ z=CL?AG=y8%?d-erfZMYVJG@+=t}?Wz+ueI$_x?R@$DUjF-608X>s+Re#koj|9j940 zk1dkPbPDT{K95{CmUf4e=>cp&mCK!ObZmkfD>6xJHi)&{aMR8kF;+`w-9&7Hs0}-7 zqN8y)Ha0psDbfSnt%2vQZHC=FcXUZ+6mtfVHFICeQLeMf9M%3qY=cb>Lc(EG1MysUJPIX{Xb(5qXnY%py09-{KUSzG1d*1~-k89?N)v2{^o^i0V)Ds8 zC@QxCB@-#^K%d!u;O zkIieNlVDWcbaUGo_V;0B9~HlHSDbvpjaR5-?iN=Y=i~!fG299#lF?kAn~QR}mK|+3 z?KGRfz{PUPL)kbtjhG;}l!D&jWfPlCU){)8^1Pp$$mE?4vf`^9Ty}K5r%QPjB{mnO zvmlhd%iUOLg{ip0kO;&G{BVL|aWI}7>cw6t z^H5jf{^$gDFsImPciwzsn~AIx$n1%-%V3@fb7Pf*`<1{xcS_k&ysg%|h3MYpZD-KA zKDFytlpZS0EMf2)6U=JA%t^~<=k}Z0tVp_e%qok*Sxm}}ZD3C~E^Mm-kd3bw_bRhx z2!^6hvC+7In)k$0!}*bxojZ5zkin`cm7Z=drKkB=PEa-&m+zeL1BJUg z4#JLi-FL_C{rftFJDh>d?AzbDY#611U$&CDv^x?_#lVSsYtNk>yU~31?mf7t&+XgY z(X+=D_Ks-1qxzuy$%06v2lL6&ZXd|c%_WA>u0%4M9!tfB1mC2gDP=__n@Ht}*@T5V zBwuaOLM3t#WHdHOHr-evmw`nd9JeH1N*{FjIFnR+oh+Mjp1%SR!{}>L;}$hrmzzoq zkL0nb7=OiBE*Xz!X#ZS>l@;FJevZ#GjSgle%fgqpi_=(*qdu*SRKMcYP-ZhQiC1`T zKCRvf<^+BolS6$CPDHWU8M4G?Z_~D*l9_ZW7Z*eE^bq7E_g5}&I+rTm!|kThaHx%y zdVi$Fi82O|go}N!3AU-SE&>tI3``>ws==08S}qfh9!6)661r-~m*7rFD}9Usa`7^m zMqw#4`LeFEOm5cpcNBbi@SysCzJPTHqB+>_m0YNOaxO&eN`;a?4iV8jq%#`NkECNc zF{Cw*dq_*ohc!e2rNLJzS?(Du*;|`ed&_`C-?#i{BKugXz>zVi-y- zU;JXEQyLSkCWbiM8Q~Co!FP{ zK_^tI8>4tb@p#N7!?MCl;YzJ#9~T|SxzW@x3>xW1N23`xI*y+lNohh*W_#i&hbHb= z3W*#RvSMJC+2|4?r?o~tWmO?AM3NP><@ha<4`bW_n<}YdiL;eIxfoJ<>c(Xmphq!T zyHHj=Xej4U@~0|26UCrdHa^9?402s?mP*S}tZdI{0Ew~|b^tv()aalx+mwp>8I>M- zdQ;URf$}AxP*NdF#W58@3y_JTTaMYSU$MzBvJ+h;zkEka + +// disable mmc format +int local_sdk_device_mmc_format() { + printf("skip local_sdk_device_mmc_format\n"); + return 0; +} diff --git a/libcallback_wz_mod/motor.c b/libcallback_wz_mod/motor.c new file mode 100644 index 0000000..66f16e4 --- /dev/null +++ b/libcallback_wz_mod/motor.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include + +extern int local_sdk_motor_get_position(float *step,float *angle); +extern int local_sdk_motor_move_abs_angle(float pan, float tilt, int speed, void (*done)(float a, float b), void (*canceled)(void), int mode); +extern void CommandResponse(int fd, const char *res); + +int MotorFd = 0; +struct timeval MotorLastMovedTime = { 0, 0 }; + +static void motor_move_done(float pan, float tilt) { + + if(MotorFd) { + static char motorResBuf[256]; + sprintf(motorResBuf, "%f %f\n", pan, tilt); + CommandResponse(MotorFd, motorResBuf); + } + MotorFd = 0; + struct timeval tv; + gettimeofday(&MotorLastMovedTime, NULL); +} + +static void motor_move_canceled() { + + if(MotorFd) CommandResponse(MotorFd, "error"); + MotorFd = 0; + gettimeofday(&MotorLastMovedTime, NULL); +} + +char *MotorMove(int fd, char *tokenPtr) { + + char *p = strtok_r(NULL, " \t\r\n", &tokenPtr); + if(!p) { + float pan; // 0-355 + float tilt; // 0-180 + int ret = local_sdk_motor_get_position(&pan, &tilt); + static char motorResBuf[256]; + if(!ret) { + sprintf(motorResBuf, "%f %f\n", pan, tilt); + } else { + sprintf(motorResBuf, "- -\n"); + } + return motorResBuf; + } + float pan = atof(p); // 0-355 + if((pan < 0.0) || (pan > 355.0)) return "error"; + + p = strtok_r(NULL, " \t\r\n", &tokenPtr); + if(!p) return "error"; + float tilt = atof(p); // 0-180 + if((tilt < 0.0) || (tilt > 180.0)) return "error"; + + p = strtok_r(NULL, " \t\r\n", &tokenPtr); + int pri = 2; // 0: high - 3: low + if(p) pri = atoi(p); + if(pri < 0) pri = 0; + if(pri > 3) pri = 3; + + if(MotorFd) return "error"; + MotorFd = fd; + + int speed = 9; + int res = local_sdk_motor_move_abs_angle(pan, tilt, speed, &motor_move_done, &motor_move_canceled, pri); + return NULL; +} diff --git a/libcallback_wz_mod/opendir.c b/libcallback_wz_mod/opendir.c new file mode 100644 index 0000000..f942e76 --- /dev/null +++ b/libcallback_wz_mod/opendir.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include + +static DIR * (*original_opendir)(const char *pathname); +static const char *HookPath = "/media/mmc/time_lapse/time_Task_"; +static const char *MediaPath = "/media/mmc/"; +char TimeLapsePath[256]; + +static void __attribute ((constructor)) opendir_hook_init(void) { + + original_opendir = dlsym(dlopen ("/lib/libc.so.0", RTLD_LAZY), "opendir"); +} + +DIR *opendir(const char *pathname) { + + if(!strncmp(pathname, HookPath, strlen(HookPath))) { + strncpy(TimeLapsePath, pathname + strlen(MediaPath), 255); + printf("[webhook] time_lapse_event %s\n", TimeLapsePath); + } + return original_opendir(pathname); +} diff --git a/libcallback_wz_mod/remove.c b/libcallback_wz_mod/remove.c new file mode 100644 index 0000000..43fab86 --- /dev/null +++ b/libcallback_wz_mod/remove.c @@ -0,0 +1,20 @@ +#include +#include +#include + +static int (*original_remove)(const char *pathname); +static const char *HookPath = "/media/mmc/time_lapse/.setup"; +extern char TimeLapsePath[256]; + +static void __attribute ((constructor)) remove_hook_init(void) { + + original_remove = dlsym(dlopen ("/lib/libc.so.0", RTLD_LAZY), "remove"); +} + +int remove(const char *pathname) { + + if(!strncmp(pathname, HookPath, strlen(HookPath))) printf("[webhook] time_lapse_finish %s\n", TimeLapsePath); + return original_remove(pathname); +} + + diff --git a/libcallback_wz_mod/setlinebuf.c b/libcallback_wz_mod/setlinebuf.c new file mode 100644 index 0000000..f99d4e6 --- /dev/null +++ b/libcallback_wz_mod/setlinebuf.c @@ -0,0 +1,5 @@ +#include + +static void __attribute ((constructor)) setStdoutLineBuffer(void) { + setvbuf(stdout, NULL, _IOLBF, 0); +} diff --git a/libcallback_avonly/video_callback.c b/libcallback_wz_mod/video_callback.c similarity index 83% rename from libcallback_avonly/video_callback.c rename to libcallback_wz_mod/video_callback.c index 183c8e6..35f35f3 100644 --- a/libcallback_avonly/video_callback.c +++ b/libcallback_wz_mod/video_callback.c @@ -19,7 +19,24 @@ 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 int VideoCaptureEnable = 1; +static int VideoCaptureEnable = 0; + +char *VideoCapture(int fd, char *tokenPtr) { + + char *p = strtok_r(NULL, " \t\r\n", &tokenPtr); + if(!p) return VideoCaptureEnable ? "on" : "off"; + if(!strcmp(p, "on")) { + VideoCaptureEnable = 1; + fprintf(stderr, "[command] video capute on\n", p); + return "ok"; + } + if(!strcmp(p, "off")) { + VideoCaptureEnable = 0; + fprintf(stderr, "[command] video capute off\n", p); + return "ok"; + } + return "error"; +} static uint32_t video_encode_capture(struct frames_st *frames) { @@ -60,7 +77,7 @@ static uint32_t video_encode_capture(struct frames_st *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); - if(ch == 0) { + if( (ch == 0) && callback == 0x48cc50) { video_encode_cb = callback; fprintf(stderr,"enc func injection save video_encode_cb=0x%x\n", video_encode_cb); callback = video_encode_capture; diff --git a/libcallback_wz_mod/wait_motion.c b/libcallback_wz_mod/wait_motion.c new file mode 100644 index 0000000..50b5264 --- /dev/null +++ b/libcallback_wz_mod/wait_motion.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +extern void CommandResponse(int fd, const char *res); +extern int local_sdk_motor_get_position(float *step,float *angle); +extern int MotorFd; +extern struct timeval MotorLastMovedTime; + +struct RectInfoSt { + int left; + int right; + int top; + int bottom; + int dummy1; + int dummt2; +}; + +static int (*original_local_sdk_video_osd_update_rect)(int ch, int display, struct RectInfoSt *rectInfo); +static int WaitMotionFd = -1; +static int Timeout = -1; +static pthread_mutex_t WaitMotionMutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t WaitMotionCond = PTHREAD_COND_INITIALIZER; + +char *WaitMotion(int fd, char *tokenPtr) { + + if(WaitMotionFd >= 0) { + fprintf(stderr, "[command] wait motion error %d %d\n", WaitMotionFd, fd); + return "error : wait motion error"; + } + char *p = strtok_r(NULL, " \t\r\n", &tokenPtr); + Timeout = p ? atoi(p) : 0; + if(Timeout < 10) { + fprintf(stderr, "[command] wait motion timeout error timeout = %d\n", Timeout); + return "error : wait motion timeout value error"; + } + + WaitMotionFd = fd; + pthread_mutex_unlock(&WaitMotionMutex); + return NULL; +} + +int local_sdk_video_osd_update_rect(int ch, int display, struct RectInfoSt *rectInfo) { + + if((WaitMotionFd >= 0) && (MotorFd <= 0) && !ch) { + struct timeval tv; + gettimeofday(&tv, NULL); + timersub(&tv, &MotorLastMovedTime, &tv); + if(tv.tv_sec || (tv.tv_usec >= 500000)) { + if(display) { + float pan; // 0-355 + float tilt; // 0-180 + int ret = local_sdk_motor_get_position(&pan, &tilt); + static char waitMotionResBuf[256]; + if(!ret) { + pan += (rectInfo->left + rectInfo->right - 320 * 2) * 85 / (2 * 640); + if(pan < 0.0) pan = 0.0; + if(pan > 355.0) pan = 355; + tilt -= (rectInfo->top + rectInfo->bottom - 180 * 2) * 55 / (2 * 360); + if(tilt < 45.0) tilt = 45.0; + if(tilt > 180.0) tilt = 180.0; + sprintf(waitMotionResBuf, "detect %d %d %d %d %d %d\n", + rectInfo->left, rectInfo->right, rectInfo->top, rectInfo->bottom, lroundf(pan), lroundf(tilt)); + } else { + sprintf(waitMotionResBuf, "detect %d %d %d %d - -\n", + rectInfo->left, rectInfo->right, rectInfo->top, rectInfo->bottom); + } + CommandResponse(WaitMotionFd, waitMotionResBuf); + } else { + CommandResponse(WaitMotionFd, "clear\n"); + } + pthread_cond_signal(&WaitMotionCond); + } + } + return original_local_sdk_video_osd_update_rect(ch, display, rectInfo); +} + +static void *WaitMotionThread() { + + while(1) { + pthread_mutex_lock(&WaitMotionMutex); + if(WaitMotionFd >= 0) { + struct timeval now; + struct timespec timeout; + gettimeofday(&now, NULL); + timeout.tv_sec = now.tv_sec + Timeout; + timeout.tv_nsec = now.tv_usec * 1000; + int ret = pthread_cond_timedwait(&WaitMotionCond, &WaitMotionMutex, &timeout); + if(ret == ETIMEDOUT) CommandResponse(WaitMotionFd, "timeout\n"); + } + WaitMotionFd = -1; + } +} + +static void __attribute ((constructor)) osd_rect_hook_init(void) { + + original_local_sdk_video_osd_update_rect = dlsym(dlopen ("/system/lib/liblocalsdk.so", RTLD_LAZY), "local_sdk_video_osd_update_rect"); + + pthread_mutex_lock(&WaitMotionMutex); + pthread_t thread; + if(pthread_create(&thread, NULL, WaitMotionThread, NULL)) { + fprintf(stderr, "pthread_create error\n"); + pthread_mutex_unlock(&WaitMotionMutex); + return; + } +}