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