From e5cff5a3ef373a5090f45cd1dfb0b85d9c851d5d Mon Sep 17 00:00:00 2001 From: FuJuntang <strongtiger_001@163.com> Date: 星期三, 06 七月 2022 10:04:09 +0800 Subject: [PATCH] Add video recorder and playback support. --- service/ptz/ptz.c | 164 +++++++++++++++++++++++++----------------------------- 1 files changed, 75 insertions(+), 89 deletions(-) diff --git a/service/ptz/ptz.c b/service/ptz/ptz.c index c7991f0..5921a42 100644 --- a/service/ptz/ptz.c +++ b/service/ptz/ptz.c @@ -2,6 +2,7 @@ #include <stdlib.h> #include <unistd.h> #include <semaphore.h> +#include <string.h> #include <pthread.h> #include <signal.h> #include <errno.h> @@ -22,9 +23,9 @@ int ret; SOAP_ASSERT(DevData != NULL); - SOAP_ASSERT(DevData->profilesToken != NULL); + SOAP_ASSERT(DevData->profiles != NULL); - ret = DevData->profilesToken->venc.Width; + ret = DevData->profiles->venc.Width; return ret; } @@ -35,14 +36,17 @@ int ret; SOAP_ASSERT(DevData != NULL); - SOAP_ASSERT(DevData->profilesToken != NULL); + SOAP_ASSERT(DevData->profiles != NULL); - ret = DevData->profilesToken->venc.Height; + ret = DevData->profiles->venc.Height; return ret; } static void cb_probe(char *DeviceXAddr) { + + int len; + char *pos_s, *pos_e; if (gPtzDevs == NULL) { @@ -51,10 +55,15 @@ SOAP_ASSERT(gPtzDevs != NULL); memset(gPtzDevs, 0x00, sizeof(PtzDevs)); + + pos_s = strstr(DeviceXAddr, ADDR_PREFIX); + pos_e = strstr(DeviceXAddr + strlen(ADDR_PREFIX), ADDR_LAST); + len = pos_e - DeviceXAddr - strlen(ADDR_PREFIX); + memcpy(gPtzDevs->ip, DeviceXAddr + strlen(ADDR_PREFIX), len); } proto_GetCapabilities(DeviceXAddr, &(gPtzDevs->capa), USERNAME, PASSWORD); - proto_GetProfiles(gPtzDevs->capa.MediaXAddr, &(gPtzDevs->profilesToken), USERNAME, PASSWORD); + proto_GetProfiles(gPtzDevs->capa.MediaXAddr, &(gPtzDevs->profiles), USERNAME, PASSWORD); } @@ -76,7 +85,7 @@ ret = sem_init(&(gPtzDevs->sem_tour), 0, 0); SOAP_ASSERT(ret == 0); - timer_init(&(gPtzDevs->timer_id)); + timer_init(&(gPtzDevs->timer_id), ptz_timer_handler); gPtzDevs->dev_stat = DISABLE; pthread_mutex_init(&(gPtzDevs->node_mutex), NULL); @@ -93,7 +102,7 @@ timer_destroy(gPtzDevs->timer_id); - free(gPtzDevs->profilesToken); + free(gPtzDevs->profiles); free(gPtzDevs); @@ -194,70 +203,20 @@ } /*the timer process heandler*/ -static void timer_handler(union sigval para) { +void ptz_timer_handler(union sigval para) { if (gPtzDevs != NULL) { + + pthread_mutex_lock(&(gPtzDevs->node_mutex)); gPtzDevs->wt_stat = DISABLE; pthread_cond_signal(&(gPtzDevs->cond)); + + pthread_mutex_unlock(&(gPtzDevs->node_mutex)); } return; -} - -static int timer_init(timer_t *timer_index) { - struct sigevent event; - timer_t timer; - int ret; - - memset(&event, 0x00, sizeof(event)); - event.sigev_value.sival_int = ENABLE; - event.sigev_value.sival_ptr = NULL; - event.sigev_notify = SIGEV_THREAD; - event.sigev_notify_function = timer_handler; - - ret = timer_create(CLOCK_REALTIME, &event, &timer); - if (ret) { - return -1; - } - - if (timer_index != NULL) { - *timer_index = timer; - } - - return 0; -} - -static int timer_start(timer_t timer_index, int sec) { - int ret; - struct itimerspec ts; - - ts.it_interval.tv_sec = 0; - ts.it_interval.tv_nsec = 0; - ts.it_value.tv_sec = sec; - ts.it_value.tv_nsec = 0; - ret = timer_settime(timer_index, 0, &ts, NULL); - if (ret) { - return -1; - } - - return ret; -} - -static int timer_stop(timer_t timer_index) { - - int ret = timer_start(timer_index, 0); - - return ret; -} - -static int timer_destroy(timer_t timer_index) { - int ret; - - ret = timer_delete(timer_index); - - return ret; } /*initialize the PTZ*/ @@ -355,7 +314,7 @@ struct _tptz__GetStatusResponse *getStatusResponse = NULL; SOAP_ASSERT(DevData != NULL); - SOAP_ASSERT(NULL != DevData->profilesToken); + SOAP_ASSERT(NULL != DevData->profiles); SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT))); getStatus = soap_new__tptz__GetStatus(soap, 1); @@ -364,7 +323,7 @@ strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE); proto_SetAuthInfo(soap, username, passwd); - getStatus->ProfileToken = DevData->profilesToken->token; + getStatus->ProfileToken = DevData->profiles->token; result = soap_call___tptz__GetStatus(soap, PTZXAddr, NULL, getStatus, getStatusResponse); SOAP_CHECK_ERROR(result, soap, "proto_PTZ_GetStatus"); @@ -614,7 +573,7 @@ char PTZXAddr[PROTO_ADDRESS_SIZE] = { 0x00 }; SOAP_ASSERT(DevData != NULL); - SOAP_ASSERT(NULL != DevData->profilesToken); + SOAP_ASSERT(NULL != DevData->profiles); SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT))); proto_PTZ_GetStatus(DevData, &pos_get, username, passwd); @@ -628,7 +587,7 @@ strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE); proto_SetAuthInfo(soap, username, passwd); - absMove->ProfileToken = DevData->profilesToken->token; + absMove->ProfileToken = DevData->profiles->token; absMove->Position = soap_new_tt__PTZVector(soap, 1); absMove->Position->PanTilt = soap_new_tt__Vector2D(soap, 1); @@ -660,7 +619,7 @@ enum xsd__boolean xsd_false = xsd__boolean__false_; SOAP_ASSERT(DevData != NULL); - SOAP_ASSERT(NULL != DevData->profilesToken); + SOAP_ASSERT(NULL != DevData->profiles); SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT))); struct _tptz__Stop *tptzStop = soap_new__tptz__Stop(soap, 1); @@ -668,7 +627,7 @@ strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE); proto_SetAuthInfo(soap, username, passwd); - tptzStop->ProfileToken = DevData->profilesToken->token; + tptzStop->ProfileToken = DevData->profiles->token; tptzStop->PanTilt = &xsd_true; tptzStop->Zoom = &xsd_false; @@ -693,7 +652,7 @@ char PTZXAddr[PROTO_ADDRESS_SIZE] = { 0x00 }; SOAP_ASSERT(DevData != NULL); - SOAP_ASSERT(NULL != DevData->profilesToken); + SOAP_ASSERT(NULL != DevData->profiles); SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT))); struct _tptz__ContinuousMove* contMove = soap_new__tptz__ContinuousMove(soap, 1); @@ -705,7 +664,7 @@ strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE); proto_SetAuthInfo(soap, username, passwd); - contMove->ProfileToken = DevData->profilesToken->token; + contMove->ProfileToken = DevData->profiles->token; contMove->Velocity = soap_new_tt__PTZSpeed(soap, 1); memset(contMove->Velocity, 0x00, sizeof(struct tt__PTZSpeed)); contMove->Velocity->PanTilt = soap_new_tt__Vector2D(soap, 1); @@ -863,7 +822,7 @@ char PTZXAddr[PROTO_ADDRESS_SIZE] = { 0x00 }; SOAP_ASSERT(DevData != NULL); - SOAP_ASSERT(NULL != DevData->profilesToken); + SOAP_ASSERT(NULL != DevData->profiles); SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT))); pos_p = para_check(pos_p); @@ -875,7 +834,7 @@ strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE); proto_SetAuthInfo(soap, username, passwd); - relMove->ProfileToken = DevData->profilesToken->token; + relMove->ProfileToken = DevData->profiles->token; relMove->Translation = (struct tt__PTZVector *)soap_malloc(soap, sizeof(struct tt__PTZVector)); memset(relMove->Translation, 0x00, sizeof(struct tt__PTZVector)); relMove->Translation->PanTilt = soap_new_tt__Vector2D(soap, 1); @@ -953,7 +912,7 @@ } /*set the focus-on functionality*/ -int proto_PTZ_ImagingSet(PtzDevs *DevData, float speed, const char *username, const char *passwd) { +int proto_PTZ_ImagingSet(PtzDevs *DevData, enum PTZCMD cmd, float speed, const char *username, const char *passwd) { int result = 0; float speed_val; struct soap *soap = NULL; @@ -961,34 +920,61 @@ struct tt__ContinuousFocus *stContFocus = NULL; struct _timg__Move *stMoveReq = NULL; struct _timg__MoveResponse *stMoveRes = NULL; + struct _timg__Stop *stStopReq = NULL; + struct _timg__StopResponse *stStopRes = NULL; SOAP_ASSERT(NULL != DevData); - SOAP_ASSERT(NULL != DevData->profilesToken); + SOAP_ASSERT(NULL != DevData->profiles); SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT))); stFocusMove = soap_new_tt__FocusMove(soap, 1); stContFocus = soap_new_tt__ContinuousFocus(soap, 1); - - proto_SetAuthInfo(soap, username, passwd); - + stMoveReq = soap_new__timg__Move(soap, 1); stMoveRes = soap_new__timg__MoveResponse(soap, 1); + + stStopReq = soap_new__timg__Stop(soap, 1); + stStopRes = soap_new__timg__StopResponse(soap, 1); memset(stMoveReq, 0x00, sizeof(struct _timg__Move)); memset(stMoveRes, 0x00, sizeof(struct _timg__MoveResponse)); - speed_val = pos_res_z(speed); + memset(stStopReq, 0x00, sizeof(struct _timg__Stop)); + memset(stStopRes, 0x00, sizeof(struct _timg__StopResponse)); - stContFocus->Speed = speed_val; + stMoveReq->Focus = stFocusMove; + stMoveReq->Focus->Continuous = stContFocus; + + stMoveReq->VideoSourceToken = DevData->profiles->videoCfg.sourceToken; + stStopReq->VideoSourceToken = DevData->profiles->videoCfg.sourceToken; + + proto_SetAuthInfo(soap, username, passwd); + + speed_val = pos_res_z(speed); + switch(cmd) { + case PTZ_CMD_FOCUS_IN: + stContFocus->Speed = speed_val; + + break; + + case PTZ_CMD_FOCUS_OUT: + stContFocus->Speed = speed_val * (-1); + + break; + + default: + result = soap_call___timg__Stop(soap, DevData->capa.MediaXAddr, NULL, stStopReq, stStopRes); + SOAP_CHECK_ERROR(result, soap, "proto_PTZ_ImagingSet"); + + break; + } + stFocusMove->Continuous = stContFocus; stFocusMove->Absolute = NULL; stFocusMove->Relative = NULL; - stMoveReq->Focus = stFocusMove; - stMoveReq->VideoSourceToken = DevData->profilesToken->videoCfg.token; - - result = soap_call___timg__Move(soap, DevData->profilesToken->token, NULL, stMoveReq, stMoveRes); - SOAP_CHECK_ERROR(result, soap, "proto_PTZ_FocusSet"); + result = soap_call___timg__Move(soap, DevData->capa.MediaXAddr, NULL, stMoveReq, stMoveRes); + SOAP_CHECK_ERROR(result, soap, "proto_PTZ_ImagingSet"); EXIT: if (NULL != soap) { @@ -1007,7 +993,7 @@ char PTZXAddr[PROTO_ADDRESS_SIZE] = { 0x00 }; SOAP_ASSERT(DevData != NULL); - SOAP_ASSERT(NULL != DevData->profilesToken); + SOAP_ASSERT(NULL != DevData->profiles); SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT))); strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE); @@ -1020,7 +1006,7 @@ memset(setPreset, 0x00, sizeof(struct _tptz__SetPreset)); memset(setPresetRes, 0x00, sizeof(struct _tptz__SetPresetResponse)); - setPreset->ProfileToken = DevData->profilesToken->token; + setPreset->ProfileToken = DevData->profiles->token; if (posName != NULL) { setPreset->PresetName = (char *)posName; } @@ -1039,7 +1025,7 @@ memset(getPresets, 0x00, sizeof(struct _tptz__GetPresets)); memset(getPresetsRes, 0x00, sizeof(struct _tptz__GetPresetsResponse)); - getPresets->ProfileToken = DevData->profilesToken->token; + getPresets->ProfileToken = DevData->profiles->token; result = soap_call___tptz__GetPresets(soap, PTZXAddr, NULL, getPresets, getPresetsRes); SOAP_CHECK_ERROR(result, soap, "proto_PTZPreset"); @@ -1055,7 +1041,7 @@ memset(gotoPreset, 0x00, sizeof(struct _tptz__GotoPreset)); memset(gotoPresetRes, 0x00, sizeof(struct _tptz__GotoPresetResponse)); - gotoPreset->ProfileToken = DevData->profilesToken->token; + gotoPreset->ProfileToken = DevData->profiles->token; if (posToken != NULL) { sprintf(buf, "%d", *posToken); @@ -1072,7 +1058,7 @@ memset(rmPreset, 0x00, sizeof(struct _tptz__RemovePreset)); memset(rmPresetRes, 0x00, sizeof(struct _tptz__RemovePresetResponse)); - rmPreset->ProfileToken = DevData->profilesToken->token; + rmPreset->ProfileToken = DevData->profiles->token; if (posToken != NULL) { sprintf(buf, "%d", *posToken); rmPreset->PresetToken = buf; -- Gitblit v1.8.0