mod_CameraConfigManage.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410
  1. #include "stdafx.h"
  2. #include <tchar.h>
  3. #include "mod_CameraConfigManage.h"
  4. #include "Event.h"
  5. #include "rec_common.h"
  6. #include "SetupApi.h"
  7. #pragma comment(lib, "SetupAPI.lib")
  8. #include <algorithm>
  9. #include "mod_ScannerSet\ScannerSet_client_g.h"
  10. #include "mod_ScannerSet\ScannerSet_def_g.h"
  11. using namespace ScannerSet;
  12. using namespace CameraConfigManage;
  13. using namespace LibVideoEcho;
  14. static BOOL IsWow64()
  15. {
  16. BOOL bIsWow64 = FALSE;
  17. //IsWow64Process is not available on all supported versions of Windows.
  18. //Use GetModuleHandle to get a handle to the DLL that contains the function
  19. //and GetProcAddress to get a pointer to the function if available.
  20. typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
  21. LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
  22. GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
  23. if(NULL != fnIsWow64Process)
  24. {
  25. if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
  26. {
  27. //handle error
  28. }
  29. }
  30. return bIsWow64;
  31. }
  32. static GUID* StrToGUID(const WCHAR *guid_string)
  33. {
  34. char buffer[64];
  35. GUID* guid = (GUID*) buffer;
  36. WCHAR upperGuid[40+1]={0};
  37. for (int i =0 ; i < 40+1; i++)
  38. {
  39. upperGuid[i] = guid_string[i];
  40. if (upperGuid[i]>=L'a' && upperGuid[i]<=L'z')
  41. {
  42. upperGuid[i] += L'A' - L'a';
  43. }
  44. }
  45. swscanf_s(upperGuid, L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
  46. &guid->Data1,
  47. &guid->Data2,
  48. &guid->Data3,
  49. &guid->Data4[0],
  50. &guid->Data4[1],
  51. &guid->Data4[2],
  52. &guid->Data4[3],
  53. &guid->Data4[4],
  54. &guid->Data4[5],
  55. &guid->Data4[6],
  56. &guid->Data4[7]);
  57. return guid;
  58. }
  59. void CCameraConfigManageEntity::OnPreStart(
  60. CAutoArray<CSimpleStringA> strArgs,
  61. CSmartPointer<ITransactionContext> pTransactionContext )
  62. {
  63. m_eDeviceType = eStand2sType;
  64. g_eDeviceType = eStand2sType;
  65. LOG_FUNCTION();
  66. ErrorCodeEnum Error;
  67. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  68. CSystemStaticInfo stStaticinfo;
  69. spFunction->GetSystemStaticInfo(stStaticinfo);
  70. if (stricmp(stStaticinfo.strMachineType,"RVC.PAD")==0)
  71. {
  72. if (stricmp(stStaticinfo.strSite,"CMB.FLB")==0)
  73. {
  74. LOG_TRACE("the type is mobile pad");
  75. m_eDeviceType = eMobilePadType;
  76. }
  77. else
  78. {
  79. LOG_TRACE("the type is pad");
  80. m_eDeviceType = ePadtype;
  81. }
  82. }
  83. else if (stricmp(stStaticinfo.strMachineType,"RVC.Desk2S")==0)
  84. {
  85. LOG_TRACE("the type is Desk2S");
  86. m_eDeviceType = eDesk2SType;
  87. }
  88. else if (stricmp(stStaticinfo.strMachineType,"RPM.Stand1S")==0)
  89. {
  90. LOG_TRACE("the type is RPM.Stand1S");
  91. m_eDeviceType = eRpm1sType;
  92. }
  93. else
  94. {
  95. LOG_TRACE("the type is standard");
  96. m_eDeviceType = eStand2sType;
  97. }
  98. g_eDeviceType = m_eDeviceType;
  99. memset(&m_conf,0,sizeof(capture_config_t));
  100. Error = (ErrorCodeEnum)capture_lib_init();
  101. if (Error == Error_Succeed)
  102. {
  103. LoadConfig(&m_conf);
  104. }
  105. else
  106. {
  107. LOG_TRACE("capture_lib_init failed!");
  108. }
  109. int i = 0;
  110. m_arrListener.Init(2);
  111. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event,
  112. Severity_None, Error_IgnoreAll, EVENT_USB_CAMER_INPUT, NULL, false);
  113. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event,
  114. Severity_None, Error_IgnoreAll, EVENT_USB_CAMER_OUTPUT, NULL, false);
  115. GetFunction()->RegistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA,this);
  116. GetFunction()->RegistSysVarEvent(SYSVAR_CAMERASTATE,this);
  117. CSimpleStringA strValue;
  118. GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
  119. m_iCameraState = strValue[0];
  120. if (strValue[0] == 'E')
  121. {
  122. m_nActiveCamera = CAMERA_TYPE_OPT;
  123. }
  124. else if (strValue[0] == 'O')
  125. {
  126. m_nActiveCamera = CAMERA_TYPE_ENV;
  127. }
  128. else if(strValue[0] == 'B') ///////显示贴图
  129. {
  130. m_nActiveCamera = CAMERA_TYPE_ERROR;
  131. }
  132. else if (strValue[0] == 'N')
  133. {
  134. m_nActiveCamera = CAMERA_TYPE_ENV;
  135. }
  136. m_camerasConfig.strEnvCamera = "$";
  137. m_camerasConfig.envCamera.strFriendlyName = "$";
  138. m_camerasConfig.envCamera.strDevPath = "$";
  139. m_camerasConfig.envCamera.strMd5Val = "$";
  140. m_camerasConfig.strOptCamera = "$";
  141. m_camerasConfig.optCamera.strFriendlyName = "$";
  142. m_camerasConfig.optCamera.strDevPath = "$";
  143. m_camerasConfig.optCamera.strMd5Val = "$";
  144. m_camerasConfig.strEwsCamera = "$";
  145. m_camerasConfig.ewsCamera.strFriendlyName = "$";
  146. m_camerasConfig.ewsCamera.strDevPath = "$";
  147. m_camerasConfig.ewsCamera.strMd5Val = "$";
  148. LoadConfig(&m_originConfig);
  149. m_camerasConfig.strEnvCamera = m_originConfig.strEnvCamera;
  150. m_camerasConfig.strOptCamera = m_originConfig.strOptCamera;
  151. m_camerasConfig.strEwsCamera = m_originConfig.strEwsCamera;
  152. SyncVideoConfig();
  153. pTransactionContext->SendAnswer(Error_Succeed);
  154. }
  155. void CCameraConfigManageEntity::OnStarted()
  156. {
  157. LOG_FUNCTION();
  158. RefreshCameras();
  159. }
  160. void CCameraConfigManageEntity::OnPreClose(
  161. EntityCloseCauseEnum eCloseCause,
  162. CSmartPointer<ITransactionContext> pTransactionContext )
  163. {
  164. LOG_FUNCTION();
  165. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  166. for (int i = 0; i < m_arrListener.GetCount(); ++i)
  167. {
  168. spFunction->UnsubscribeLog(m_arrListener[i]);
  169. }
  170. spFunction->UnregistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA);
  171. spFunction->UnregistSysVarEvent(SYSVAR_CAMERASTATE);
  172. }
  173. void CCameraConfigManageEntity::OnSysVarEvent(
  174. const char *pszKey,
  175. const char *pszValue,
  176. const char *pszOldValue,
  177. const char *pszEntityName )
  178. {
  179. if (_stricmp(pszKey, SYSVAR_CAMERASTATE) == 0)
  180. {
  181. Dbg("camera state from : %c to %c", pszOldValue[0], pszValue[0]);
  182. m_iCameraState = pszValue[0];
  183. if (pszValue[0] == 'E')
  184. {
  185. m_nActiveCamera = CAMERA_TYPE_OPT;
  186. }
  187. else if (pszValue[0] == 'O')
  188. {
  189. m_nActiveCamera = CAMERA_TYPE_ENV;
  190. }
  191. else if(pszValue[0] == 'B') ///////显示贴图
  192. {
  193. m_nActiveCamera = CAMERA_TYPE_ERROR;
  194. }
  195. else if (pszValue[0] == 'N')
  196. {
  197. m_nActiveCamera = CAMERA_TYPE_AUTO;
  198. }
  199. }
  200. else if (_stricmp(pszKey, SYSVAR_ACTIVETRACKINGCAMERA) == 0)
  201. {
  202. if (m_iCameraState == 'N')
  203. {
  204. if (pszValue[0] == 'E')
  205. {
  206. m_nActiveCamera = CAMERA_TYPE_ENV;
  207. }
  208. else if (pszValue[0] == 'O')
  209. {
  210. m_nActiveCamera = CAMERA_TYPE_OPT;
  211. }
  212. }
  213. }
  214. }
  215. void CCameraConfigManageEntity::OnLog(
  216. const CAutoArray<CUUID> &SubIDs,
  217. const CUUID nLogID,
  218. const LogTypeEnum eLogType,
  219. const SeverityLevelEnum eLevel,
  220. const DWORD dwSysError,
  221. const DWORD dwUserCode,
  222. const DWORD dwEntityInstanceID,
  223. const WORD wEntityDevelID,
  224. const CAutoArray<DWORD> &Param,
  225. const char *pszEntityName,
  226. const char *pszModuleName,
  227. const char *pszMessage )
  228. {
  229. LOG_TRACE("user_code = %08x", dwUserCode);
  230. if (dwUserCode == EVENT_USB_CAMER_INPUT)
  231. {
  232. ::Sleep(2000);
  233. capture_camera_t usbCam;
  234. int id = capture_get_video_device_id(pszMessage, usbCam);
  235. if (id != -1) {
  236. Dbg("[dbg] %s inserted!", usbCam.strFriendlyName.GetData());
  237. CameraInserted evt;
  238. evt.CameraName = CSimpleStringA::Format("%s;%s",
  239. usbCam.strFriendlyName.GetData(),usbCam.strMd5Val.GetData());
  240. SpSendBroadcast(GetFunction(), SP_MSG_OF(CameraInserted),
  241. SP_MSG_SIG_OF(CameraInserted), evt);
  242. Dbg("[dbg] CameraInserted broadcast sent!");
  243. m_cameras.push_back(usbCam);
  244. }
  245. }
  246. else if (dwUserCode == EVENT_USB_CAMER_OUTPUT)
  247. {
  248. //::Sleep(1000);
  249. std::vector<capture_camera_t> cams;
  250. GetAvailableCameras(cams);
  251. auto i = m_cameras.begin();
  252. for (; i != m_cameras.end(); ++i) {
  253. auto it = std::find_if(cams.begin(), cams.end(), [i](capture_camera_t &c)
  254. {
  255. return i->strFriendlyName == c.strFriendlyName &&
  256. i->strDevPath == c.strDevPath &&
  257. i->strMd5Val == c.strMd5Val;
  258. });
  259. if (it == cams.end())
  260. break;
  261. }
  262. if (i != m_cameras.end()) {
  263. Dbg("[dbg] %s removed!", i->strFriendlyName.GetData());
  264. CameraRemoved evt;
  265. evt.CameraName = CSimpleStringA::Format("%s;%s",
  266. i->strFriendlyName.GetData(),i->strMd5Val.GetData());
  267. SpSendBroadcast(GetFunction(), SP_MSG_OF(CameraRemoved),
  268. SP_MSG_SIG_OF(CameraRemoved), evt);
  269. Dbg("[dbg] CameraRemoved broadcast sent!");
  270. m_cameras.erase(i);
  271. }
  272. }
  273. }
  274. void CCameraConfigManageEntity::OnTimeout( DWORD dwTimerID )
  275. {
  276. }
  277. void CCameraConfigManageEntity::Debug( const char *fmt, ... )
  278. {
  279. va_list arg;
  280. va_start(arg, fmt);
  281. vDbg(fmt, arg);
  282. va_end(arg);
  283. }
  284. int CCameraConfigManageEntity::GetActiveCamera()
  285. {
  286. return m_nActiveCamera;
  287. }
  288. HINSTANCE CCameraConfigManageEntity::GetEntityHinstance()
  289. {
  290. return ModuleBase::GetModuleBase()->GetInstance();
  291. }
  292. ErrorCodeEnum CCameraConfigManageEntity::GetHSPCameras(
  293. CAutoArray<CSimpleStringA> &HSPCameras )
  294. {
  295. auto rc = Error_Succeed;
  296. auto pScannerSetClient = new ScannerService_ClientBase(this);
  297. if (pScannerSetClient->Connect() != Error_Succeed)
  298. {
  299. Dbg("连接ScannerSet实体失败");
  300. pScannerSetClient->SafeDelete();
  301. pScannerSetClient = NULL;
  302. rc = Error_DevConnFailed;
  303. }
  304. else
  305. {
  306. ScannerService_GetOnlineCameras_Req req = {};
  307. ScannerService_GetOnlineCameras_Ans ans = {};
  308. rc = pScannerSetClient->GetOnlineCameras(req, ans, 10000);
  309. if (rc != Error_Succeed)
  310. {
  311. Dbg("ScannerSet 调用 GetOnlineCameras 失败: 0x%x", rc);
  312. }
  313. else
  314. {
  315. Dbg("ScannerSet invokes GetOnlineCameras suc.");
  316. Dbg("Count: %d", ans.devCount);
  317. if (ans.devCount > 0) {
  318. for (int i = 0; i < ans.devFriendlyNames.GetCount(); ++i) {
  319. Dbg("[%d]%s(%d)", i, (LPCTSTR)ans.devFriendlyNames[i],
  320. ans.devType[i]);
  321. CapTypeEnum devType = (CapTypeEnum)ans.devType[i];
  322. if (devType == CAMTYPE_HSPS)
  323. {
  324. HSPCameras.Append(ans.devFriendlyNames, i, 1);
  325. }
  326. }
  327. }
  328. }
  329. pScannerSetClient->GetFunction()->CloseSession();
  330. pScannerSetClient = NULL;
  331. }
  332. return rc;
  333. }
  334. void CCameraConfigManageEntity::GetAvailableCameras(std::vector<capture_camera_t> &cams)
  335. {
  336. CAutoArray<CSimpleStringA> hspCams;
  337. auto rc = GetHSPCameras(hspCams);
  338. Dbg("[GetHSPCameras]: (0x%x,%d)", rc, hspCams.GetCount());
  339. capture_enum_cameras(cams, hspCams);
  340. }
  341. ErrorCodeEnum CCameraConfigManageEntity::LoadConfig( capture_config_t *conf )
  342. {
  343. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  344. CSmartPointer<IConfigInfo> spConfig;
  345. SpIniMappingTable table;
  346. ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig);
  347. if (Error == Error_Succeed)
  348. {
  349. table.AddEntryString("Audio", "handfree_in_dev", conf->strAudioIn, "$");
  350. table.AddEntryString("Video", "EnvCamera", conf->strVideo, "$");
  351. table.AddEntryInt("Video", "EnvRotate", conf->video_rotate, 0);
  352. table.Load(spConfig);
  353. }
  354. return Error_Succeed;
  355. }
  356. ErrorCodeEnum CCameraConfigManageEntity::LoadConfig( VideoConfig *conf )
  357. {
  358. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  359. CSmartPointer<IConfigInfo> spConfig;
  360. SpIniMappingTable table;
  361. ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig);
  362. if (Error == Error_Succeed)
  363. {
  364. table.AddEntryString("Video", "EnvCamera", conf->strEnvCamera, "$");
  365. table.AddEntryString("Video", "OptCamera", conf->strOptCamera, "$");
  366. table.AddEntryString("Video", "EwsCamera", conf->strEwsCamera, "$");
  367. table.Load(spConfig);
  368. }
  369. return Error_Succeed;
  370. }
  371. ErrorCodeEnum CCameraConfigManageEntity::HandleEditConfigReq(
  372. const CAutoArray<CEditConfigReq> &reqs )
  373. {
  374. Dbg("entity edit config");
  375. auto pFunc = this->GetFunction();
  376. for (int i = 0; i < reqs.GetCount(); ++i)
  377. {
  378. auto req = reqs[i];
  379. if (!stricmp(req.Value, "$"))
  380. {
  381. continue;
  382. }
  383. CSimpleStringA strEntityName = req.EntityName;
  384. CSimpleStringA strCfgPath;
  385. if (stricmp(strEntityName, "Silverlight") == 0 || stricmp(strEntityName, "DualActive") == 0 ||
  386. stricmp(strEntityName, "SpHost") == 0 || stricmp(strEntityName, "SysInit") == 0 ||
  387. stricmp(strEntityName, "SpBase") == 0 || stricmp(strEntityName, "guardian") == 0)
  388. {
  389. Dbg("entity \"%s\" has no config", strEntityName);
  390. return Error_NotExist;
  391. }
  392. if (stricmp(strEntityName, "Root") == 0)
  393. {
  394. auto rc = pFunc->GetPath("HardwareCfg", strCfgPath);
  395. assert(rc == Error_Succeed);
  396. strCfgPath += "\\Root.ini";
  397. }
  398. else
  399. {
  400. auto rc = pFunc->GetPath("Cfg", strCfgPath);
  401. assert(rc == Error_Succeed);
  402. strCfgPath += CSimpleStringA::Format("\\%s.ini", (const char*)strEntityName);
  403. }
  404. char cEditType = req.EditType;
  405. Dbg("edit config: entity = %s, type = %c, section = %s, key = %s, value = %s",
  406. (const char*)strEntityName, cEditType, req.Section, req.Key, req.Value);
  407. if (cEditType == 'A' || cEditType == 'U')
  408. {
  409. WritePrivateProfileStringA(req.Section, req.Key, req.Value, strCfgPath);
  410. }
  411. else if (cEditType == 'D')
  412. {
  413. WritePrivateProfileStringA(req.Section, req.Key, NULL, strCfgPath);
  414. }
  415. }
  416. return Error_Succeed;
  417. }
  418. void CCameraConfigManageEntity::SetCameraName( CSimpleStringA camName )
  419. {
  420. m_conf.strVideo = camName;
  421. }
  422. CSimpleStringA CCameraConfigManageEntity::GetCameraName()
  423. {
  424. return m_conf.strVideo;
  425. }
  426. BOOL CCameraConfigManageEntity::IsCameraStart()
  427. {
  428. return m_bStartCamera;
  429. }
  430. ErrorCodeEnum CCameraConfigManageEntity::StartCamera()
  431. {
  432. if (m_capture == NULL)
  433. {
  434. ErrorCodeEnum Error = Error_Succeed;
  435. m_conf.ref_capture_count = &m_lCaptureCount;
  436. Error = (ErrorCodeEnum)capture_create(&m_conf, &m_capture);
  437. if (Error == Error_Succeed)
  438. {
  439. Error = capture_start(m_capture);
  440. Dbg("Error code=0x%x",Error);
  441. if (Error != Error_Succeed)
  442. {
  443. m_bStartCamera = FALSE;
  444. if (Error == Error_EnvCamera)
  445. {
  446. capture_destroy(m_capture);
  447. m_capture = NULL;
  448. return Error;
  449. }
  450. else // Error_AudioIN
  451. {
  452. return Error;
  453. }
  454. }
  455. else
  456. {
  457. m_bStartCamera = TRUE;
  458. return Error_Succeed;
  459. }
  460. }
  461. else
  462. {
  463. m_bStartCamera = FALSE;
  464. Dbg("create capture failed! %d", Error);
  465. m_capture = NULL;
  466. return Error_Unexpect;
  467. }
  468. return Error;
  469. }
  470. else
  471. {
  472. Dbg("m_capture == NULL");
  473. return Error_Unexpect;
  474. }
  475. }
  476. void CCameraConfigManageEntity::StopCamera()
  477. {
  478. if ((ePadtype==m_eDeviceType||eDesk2SType==m_eDeviceType)&&m_bStartCamera)
  479. {
  480. Dbg("stop camera");
  481. if (m_capture)
  482. {
  483. capture_stop(m_capture);
  484. capture_destroy(m_capture);
  485. m_capture = NULL;
  486. }
  487. m_bStartCamera = FALSE;
  488. }
  489. }
  490. void CCameraConfigManageEntity::StartEchoVideo( int x, int y, int w, int h )
  491. {
  492. if (!m_bEchoVideo)
  493. {
  494. videoplay_session_conf_t video_conf;
  495. memset(&video_conf,0,sizeof(video_conf));
  496. video_conf.local_video_view_x = x;
  497. video_conf.local_video_view_y = y;
  498. video_conf.local_video_view_cx = w;
  499. video_conf.local_video_view_cy = h;
  500. video_conf.pHostApi = this;
  501. strcpy(video_conf.local_video_preview_queue0,REC_COMMON_VIDEO_ENV_SHM_PREVIEW_QUEUE);
  502. int rc = Local_videoplay_session_create(&video_conf, &m_pSession);
  503. if (rc != 0)
  504. {
  505. Dbg("create videoplay session failed! rc = %d", rc);
  506. }
  507. else
  508. {
  509. rc = Local_videoplay_session_start(m_pSession);
  510. if (rc != 0)
  511. {
  512. Dbg("start videoplay session failed! rc = %d", rc);
  513. Local_videoplay_session_destroy(m_pSession);
  514. m_pSession = NULL;
  515. }
  516. else
  517. {
  518. m_bEchoVideo = TRUE;
  519. Dbg("start videoplay session succed! rc = %d", rc);
  520. }
  521. }
  522. }
  523. }
  524. void CCameraConfigManageEntity::StopEchoVideo()
  525. {
  526. if (m_bEchoVideo&&m_pSession)
  527. {
  528. m_bEchoVideo = FALSE;
  529. Local_videoplay_session_stop(m_pSession);
  530. Local_videoplay_session_destroy(m_pSession);
  531. m_pSession = NULL;
  532. Dbg("videoplay session stopped!");
  533. }
  534. }
  535. bool CCameraConfigManageEntity::ConvertEwsCameraName(
  536. CSimpleStringA& strRetrievedName,
  537. const CSimpleStringA& strDirectShowName )
  538. {
  539. if(strDirectShowName.GetLength() <= 1) {
  540. return false;
  541. }
  542. CSimpleStringA md5str = strDirectShowName;
  543. int pos = md5str.IndexOf(";");
  544. if (pos < 0 || pos+1 >= md5str.GetLength()) {
  545. return false;
  546. }
  547. md5str = md5str.SubString(pos+1, md5str.GetLength()-pos-1);
  548. BOOL bFound = FALSE;
  549. CSimpleStringA strDevPath;
  550. for (int i = 0; i < m_cameras.size(); ++i) {
  551. if (m_cameras[i].strMd5Val == md5str) {
  552. strDevPath = m_cameras[i].strDevPath;
  553. bFound = TRUE;
  554. break;
  555. }
  556. }
  557. if (!bFound) {
  558. Dbg("md5str %s does not be found!", md5str.GetData());
  559. return false;
  560. }
  561. bool bRet = false;
  562. GUID deviceGuid[2] = {
  563. *StrToGUID(L"{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}"), // Image
  564. *StrToGUID(L"{CA3E7AB9-B4C3-4AE6-8251-579EF933890F}") // Camera
  565. };
  566. Dbg("Current EwsCamera: %s", strDevPath.GetData());
  567. for (int i = 0; i < 2; ++i) {
  568. Dbg("Enumerate %s devices", (0==i?"Image":"Camera"));
  569. HDEVINFO hDev = SetupDiGetClassDevs(&deviceGuid[i], NULL, NULL, DIGCF_PRESENT);
  570. if(INVALID_HANDLE_VALUE == hDev) {
  571. return bRet;
  572. }
  573. SP_CLASSIMAGELIST_DATA _spImageData = {0};
  574. _spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
  575. SetupDiGetClassImageList(&_spImageData);
  576. SP_DEVINFO_DATA DevInfo;
  577. ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
  578. DevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
  579. //if (IsWow64())
  580. // DevInfo.cbSize = 32;
  581. //else
  582. // DevInfo.cbSize = 28;
  583. DWORD DeviceIndex = 0;
  584. while(SetupDiEnumDeviceInfo(hDev, DeviceIndex, &DevInfo)) {
  585. int wImageIdx = 0;
  586. if (SetupDiGetClassImageIndex(&_spImageData, &DevInfo.ClassGuid, &wImageIdx)) {
  587. char szName[MAX_PATH] = {0};
  588. //获取设备实例路径
  589. if(SetupDiGetDeviceInstanceId(hDev, &DevInfo, szName, MAX_PATH - 1, NULL)) {
  590. Dbg("InstanceId: %s", szName);
  591. if (strstr(strDevPath.GetData(), szName)) {
  592. strRetrievedName = szName;
  593. bRet = strRetrievedName.GetLength() > 0;
  594. return bRet;
  595. }
  596. }else {
  597. if (SetupDiGetDeviceRegistryProperty(
  598. hDev,&DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szName, MAX_PATH - 1, 0)) {
  599. Dbg("RegistryProperty: %s", szName);
  600. if (strstr(strDevPath.GetData(), szName)) {
  601. strRetrievedName = szName;
  602. bRet = strRetrievedName.GetLength() > 0;
  603. return bRet;
  604. }
  605. }
  606. }
  607. }
  608. DeviceIndex++;
  609. }
  610. SetupDiDestroyClassImageList(&_spImageData);
  611. if(hDev) {
  612. SetupDiDestroyDeviceInfoList(hDev);
  613. }
  614. }
  615. return bRet;
  616. }
  617. bool getConfigCameraFriendlyName(const CSimpleStringA& strDirectShowName, CSimpleStringA &friendlyName){
  618. CSimpleStringA tmp = strDirectShowName;
  619. int pos = tmp.IndexOf(";");
  620. if (pos < 0 || pos+1 >= tmp.GetLength()) {
  621. return false;
  622. }
  623. friendlyName = tmp.SubString(0, pos);
  624. return true;
  625. }
  626. bool getConfigCameraMd5Str(const CSimpleStringA& strDirectShowName, CSimpleStringA &md5str){
  627. CSimpleStringA tmp = strDirectShowName;
  628. int pos = tmp.IndexOf(";");
  629. if (pos < 0 || pos+1 >= tmp.GetLength()) {
  630. return false;
  631. }
  632. md5str = tmp.SubString(pos+1, tmp.GetLength()-pos-1);
  633. return true;
  634. }
  635. bool CheckConfigCameraCanOpen(const CSimpleStringA strCam) {
  636. capture_camera_t cameraDetail;
  637. //check Ews device
  638. if (strCam.GetLength() > 1)
  639. { // is not "$"
  640. int camera_id = capture_get_video_device_id((LPCTSTR)strCam, cameraDetail);
  641. if (camera_id == -1)
  642. {
  643. Dbg("find strCam:%s(-1)", (LPCTSTR)strCam);
  644. return false;
  645. }
  646. }
  647. else
  648. {
  649. //摄像头未配置,此时也认为摄像头OK
  650. }
  651. return true;
  652. }
  653. //保证strEnvCamera与envCamera一致,都有配置信息
  654. void CCameraConfigManageEntity::SyncVideoConfig(){
  655. if ((m_camerasConfig.strEnvCamera.GetLength() > 1) && (m_camerasConfig.envCamera.strFriendlyName.GetLength() <= 1)){
  656. if (capture_get_video_device_id(m_camerasConfig.strEnvCamera, m_camerasConfig.envCamera) < 0){
  657. getConfigCameraFriendlyName(m_camerasConfig.strEnvCamera, m_camerasConfig.envCamera.strFriendlyName);
  658. getConfigCameraMd5Str(m_camerasConfig.strEnvCamera, m_camerasConfig.envCamera.strMd5Val);
  659. }
  660. Dbg("SyncVideoConfig, envCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  661. (LPCTSTR)m_camerasConfig.envCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.envCamera.strMd5Val,
  662. (LPCTSTR)m_camerasConfig.envCamera.strDevPath, (LPCTSTR)m_camerasConfig.strEnvCamera);
  663. }
  664. if ((m_camerasConfig.strOptCamera.GetLength() > 1) && (m_camerasConfig.optCamera.strFriendlyName.GetLength() <= 1)){
  665. if (capture_get_video_device_id(m_camerasConfig.strOptCamera, m_camerasConfig.optCamera) < 0){
  666. getConfigCameraFriendlyName(m_camerasConfig.strOptCamera, m_camerasConfig.optCamera.strFriendlyName);
  667. getConfigCameraMd5Str(m_camerasConfig.strOptCamera, m_camerasConfig.optCamera.strMd5Val);
  668. }
  669. Dbg("SyncVideoConfig, optCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  670. (LPCTSTR)m_camerasConfig.optCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.optCamera.strMd5Val,
  671. (LPCTSTR)m_camerasConfig.optCamera.strDevPath, (LPCTSTR)m_camerasConfig.strOptCamera);
  672. }
  673. if ((m_camerasConfig.strEwsCamera.GetLength() > 1) && (m_camerasConfig.ewsCamera.strFriendlyName.GetLength() <= 1)){
  674. capture_get_video_device_id(m_camerasConfig.strEwsCamera, m_camerasConfig.ewsCamera);
  675. Dbg("SyncVideoConfig, ewsCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  676. (LPCTSTR)m_camerasConfig.ewsCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.ewsCamera.strMd5Val,
  677. (LPCTSTR)m_camerasConfig.ewsCamera.strDevPath, (LPCTSTR)m_camerasConfig.strEwsCamera);
  678. }
  679. }
  680. void CCameraConfigManageEntity::RefreshCameras(){
  681. m_cameras.clear();
  682. CAutoArray<CSimpleStringA> hspCams;
  683. auto rc = GetHSPCameras(hspCams);
  684. Dbg("[GetHSPCameras]: (0x%x,%d)", rc, hspCams.GetCount());
  685. capture_enum_cameras(m_cameras, hspCams);
  686. for (int i = 0; i < m_cameras.size(); ++i)
  687. {
  688. Dbg("m_cameras[%d]:%s", i, m_cameras[i].strFriendlyName.GetData());
  689. }
  690. }
  691. //打开前检查配置摄像头配置名是否正确,不正确尝试自纠正(插拔摄像头会导致其名字变更,需要我们打开前纠正其名字)
  692. //注意配置的摄像头名由摄像头名+摄像头路径MD5两部分组成
  693. bool CCameraConfigManageEntity::AutoCorrectCameraConfig(VideoConfig *config) {
  694. int errorCameraCnt = 0;
  695. bool convertResult = true;
  696. bool envCanOpen = true;
  697. bool optCanOpen = true;
  698. bool ewsCanOpen = true;
  699. envCanOpen = CheckConfigCameraCanOpen(m_camerasConfig.strEnvCamera);
  700. if (!envCanOpen) {
  701. errorCameraCnt++;
  702. }
  703. optCanOpen = CheckConfigCameraCanOpen(m_camerasConfig.strOptCamera);
  704. if (!optCanOpen) {
  705. errorCameraCnt++;
  706. }
  707. ewsCanOpen = CheckConfigCameraCanOpen(m_camerasConfig.strEwsCamera);
  708. if (!ewsCanOpen) {
  709. errorCameraCnt++;
  710. }
  711. Dbg("AutoCorrectCameraConfig, before update check result envCanOpen:%d, optCanOpen:%d, ewsCanOpen:%d", envCanOpen, optCanOpen, ewsCanOpen);
  712. Dbg("AutoCorrectCameraConfig, before update originConfig Env:%s, Opt:%s, Ews:%s",
  713. (LPCSTR)m_originConfig.strEnvCamera, (LPCSTR)m_originConfig.strOptCamera, (LPCSTR)m_originConfig.strEwsCamera);
  714. Dbg("AutoCorrectCameraConfig, before update config Env:%s, Opt:%s, Ews:%s",
  715. (LPCSTR)m_camerasConfig.strEnvCamera, (LPCSTR)m_camerasConfig.strOptCamera, (LPCSTR)m_camerasConfig.strEwsCamera);
  716. SyncVideoConfig();
  717. if (errorCameraCnt > 0) {
  718. bool envCanCorrect = true;
  719. bool optCanCorrect = true;
  720. bool ewsCanCorrect = true;
  721. bool envCorrected = false;
  722. bool optCorrected = false;
  723. bool ewsCorrected = false;
  724. CAutoArray<CSimpleStringA> hspCams;
  725. CSimpleStringA old_ews_str = m_camerasConfig.strEwsCamera;
  726. capture_camera_t old_ews;
  727. old_ews.strFriendlyName = m_camerasConfig.ewsCamera.strFriendlyName;
  728. old_ews.strMd5Val = m_camerasConfig.ewsCamera.strMd5Val;
  729. old_ews.strDevPath = m_camerasConfig.ewsCamera.strDevPath;
  730. GetHSPCameras(hspCams);
  731. //1.首先采用找到与配置中Friendly摄像头名相同的唯一设备来纠正
  732. if (!envCanOpen) {
  733. envCanOpen = AutoCorrectCameraByOnlyFriendlyName(m_camerasConfig.envCamera,
  734. optCanOpen, ewsCanOpen, m_camerasConfig.optCamera, m_camerasConfig.ewsCamera, hspCams);
  735. if (envCanOpen) {
  736. envCorrected = true;
  737. errorCameraCnt--;
  738. m_camerasConfig.strEnvCamera = CSimpleStringA::Format("%s;%s",
  739. m_camerasConfig.envCamera.strFriendlyName.GetData(), m_camerasConfig.envCamera.strMd5Val.GetData());
  740. Dbg("AutoCorrectCameraConfig ByOnlyFriendlyName success, envCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  741. (LPCTSTR)m_camerasConfig.envCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.envCamera.strMd5Val,
  742. (LPCTSTR)m_camerasConfig.envCamera.strDevPath, (LPCTSTR)m_camerasConfig.strEnvCamera);
  743. }else{
  744. Dbg("AutoCorrectCameraConfig ByOnlyFriendlyName, strEnvCamera:%s failed!",
  745. (LPCTSTR)m_camerasConfig.strEnvCamera);
  746. }
  747. }
  748. if (!optCanOpen) {
  749. optCanOpen = AutoCorrectCameraByOnlyFriendlyName(m_camerasConfig.optCamera,
  750. envCanOpen, ewsCanOpen, m_camerasConfig.envCamera, m_camerasConfig.ewsCamera, hspCams);
  751. if (optCanOpen) {
  752. optCorrected = true;
  753. errorCameraCnt--;
  754. m_camerasConfig.strOptCamera = CSimpleStringA::Format("%s;%s",
  755. m_camerasConfig.optCamera.strFriendlyName.GetData(), m_camerasConfig.optCamera.strMd5Val.GetData());
  756. Dbg("AutoCorrectCameraConfig ByOnlyFriendlyName success, optCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  757. (LPCTSTR)m_camerasConfig.optCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.optCamera.strMd5Val,
  758. (LPCTSTR)m_camerasConfig.optCamera.strDevPath, (LPCTSTR)m_camerasConfig.strOptCamera);
  759. }else{
  760. Dbg("AutoCorrectCameraConfig ByOnlyFriendlyName, strOptCamera:%s failed!",
  761. (LPCTSTR)m_camerasConfig.strOptCamera);
  762. }
  763. }
  764. if (!ewsCanOpen) {
  765. ewsCanOpen = AutoCorrectCameraByOnlyFriendlyName(m_camerasConfig.ewsCamera,
  766. envCanOpen, optCanOpen, m_camerasConfig.envCamera, m_camerasConfig.optCamera, hspCams);
  767. if (ewsCanOpen) {
  768. CSimpleStringA tmp = CSimpleStringA::Format("%s;%s",
  769. m_camerasConfig.ewsCamera.strFriendlyName.GetData(), m_camerasConfig.ewsCamera.strMd5Val.GetData());
  770. RefreshCameras();//m_cameras maybe don't refresh
  771. convertResult = ConvertEwsCameraName(m_camerasConfig.strEwsCamera, tmp);
  772. //防止strEwsCamera与ewsCamera.strFriendlyName、ewsCamera.strMd5Val值不一致,回退
  773. if (!convertResult){
  774. m_camerasConfig.strEwsCamera = old_ews_str;
  775. m_camerasConfig.ewsCamera.strFriendlyName = old_ews.strFriendlyName;
  776. m_camerasConfig.ewsCamera.strMd5Val = old_ews.strMd5Val;
  777. m_camerasConfig.ewsCamera.strDevPath = old_ews.strDevPath;
  778. ewsCanOpen = false;
  779. Dbg("AutoCorrectCameraConfig ByOnlyFriendlyName, ConvertEwsCameraName failed, return Ews:%s",
  780. (LPCSTR)m_camerasConfig.strEwsCamera);
  781. }else{
  782. errorCameraCnt--;
  783. ewsCorrected = true;
  784. Dbg("AutoCorrectCameraConfig ByOnlyFriendlyName success, ewsCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  785. (LPCTSTR)m_camerasConfig.ewsCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.ewsCamera.strMd5Val,
  786. (LPCTSTR)m_camerasConfig.ewsCamera.strDevPath, (LPCTSTR)m_camerasConfig.strEwsCamera);
  787. }
  788. }else {
  789. Dbg("AutoCorrectCameraConfig ByOnlyFriendlyName, strEwsCamera:%s failed!",
  790. (LPCTSTR)m_camerasConfig.strEwsCamera);
  791. }
  792. }
  793. //2.采用排除法纠正(排除法用于只有唯一一个摄像头配置失败的场景,需要前面纠正后再来排除)
  794. if (errorCameraCnt == 1) {
  795. if (!envCanOpen) {
  796. envCanOpen = AutoCorrectCameraByOnlyOne(m_camerasConfig.envCamera,
  797. m_camerasConfig.optCamera, m_camerasConfig.ewsCamera, hspCams);
  798. if (envCanOpen) {
  799. envCorrected = true;
  800. errorCameraCnt--;
  801. m_camerasConfig.strEnvCamera = CSimpleStringA::Format("%s;%s",
  802. m_camerasConfig.envCamera.strFriendlyName.GetData(), m_camerasConfig.envCamera.strMd5Val.GetData());
  803. Dbg("AutoCorrectCameraConfig ByOnlyOne success, envCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  804. (LPCTSTR)m_camerasConfig.envCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.envCamera.strMd5Val,
  805. (LPCTSTR)m_camerasConfig.envCamera.strDevPath, (LPCTSTR)m_camerasConfig.strEnvCamera);
  806. } else {
  807. Dbg("AutoCorrectCameraConfig ByOnlyOne, strEnvCamera:%s failed!",
  808. (LPCTSTR)m_camerasConfig.strEnvCamera);
  809. }
  810. }
  811. else if (!optCanOpen) {
  812. optCanOpen = AutoCorrectCameraByOnlyOne(m_camerasConfig.optCamera,
  813. m_camerasConfig.envCamera, m_camerasConfig.ewsCamera, hspCams);
  814. if (optCanOpen) {
  815. optCorrected = true;
  816. errorCameraCnt--;
  817. m_camerasConfig.strOptCamera = CSimpleStringA::Format("%s;%s",
  818. m_camerasConfig.optCamera.strFriendlyName.GetData(), m_camerasConfig.optCamera.strMd5Val.GetData());
  819. Dbg("AutoCorrectCameraConfig ByOnlyOne success, optCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  820. (LPCTSTR)m_camerasConfig.optCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.optCamera.strMd5Val,
  821. (LPCTSTR)m_camerasConfig.optCamera.strDevPath, (LPCTSTR)m_camerasConfig.strOptCamera);
  822. } else {
  823. Dbg("AutoCorrectCameraConfig ByOnlyOne, strOptCamera:%s failed!",
  824. (LPCTSTR)m_camerasConfig.strOptCamera);
  825. }
  826. }
  827. else if (!ewsCanOpen) {
  828. ewsCanOpen = AutoCorrectCameraByOnlyOne(m_camerasConfig.ewsCamera,
  829. m_camerasConfig.envCamera, m_camerasConfig.optCamera, hspCams);
  830. if(ewsCanOpen){
  831. CSimpleStringA tmp = CSimpleStringA::Format("%s;%s",
  832. m_camerasConfig.ewsCamera.strFriendlyName.GetData(), m_camerasConfig.ewsCamera.strMd5Val.GetData());
  833. RefreshCameras();//m_cameras maybe don't refresh
  834. convertResult = ConvertEwsCameraName(m_camerasConfig.strEwsCamera, tmp);
  835. //防止strEwsCamera与ewsCamera.strFriendlyName、ewsCamera.strMd5Val值不一致,回退
  836. if (!convertResult){
  837. m_camerasConfig.strEwsCamera = old_ews_str;
  838. m_camerasConfig.ewsCamera.strFriendlyName = old_ews.strFriendlyName;
  839. m_camerasConfig.ewsCamera.strMd5Val = old_ews.strMd5Val;
  840. m_camerasConfig.ewsCamera.strDevPath = old_ews.strDevPath;
  841. ewsCanOpen = false;
  842. Dbg("AutoCorrectCameraConfig ByOnlyOne, ConvertEwsCameraName failed, return Ews:%s",
  843. (LPCSTR)m_camerasConfig.strEwsCamera);
  844. }else{
  845. errorCameraCnt--;
  846. ewsCorrected = true;
  847. Dbg("AutoCorrectCameraConfig ByOnlyOne success, ewsCamera:FriendlyName:%s Md5Val:%s DevPath:%s Name:%s",
  848. (LPCTSTR)m_camerasConfig.ewsCamera.strFriendlyName, (LPCTSTR)m_camerasConfig.ewsCamera.strMd5Val,
  849. (LPCTSTR)m_camerasConfig.ewsCamera.strDevPath, (LPCTSTR)m_camerasConfig.strEwsCamera);
  850. }
  851. } else {
  852. Dbg("AutoCorrectCameraConfig ByOnlyOne, strEwsCamera:%s failed!",
  853. (LPCTSTR)m_camerasConfig.strEwsCamera);
  854. }
  855. }
  856. }
  857. //注意:strEwsCamera记录的广角设备路径ID无法唯一标识设备(),导致出现纠正后strEwsCamera与env/opt设备路径ID一致而无法打开的情况
  858. //而strDevPath能唯一标识设备
  859. //这里对此种场景做特殊处理,对于纠正后广角与env/opt设备路径ID一致的回退不纠正
  860. if (ewsCorrected){
  861. CSimpleStringA tmpEnv = "$";
  862. CSimpleStringA tmpOpt = "$";
  863. ConvertEwsCameraName(tmpEnv, m_camerasConfig.strEnvCamera);
  864. ConvertEwsCameraName(tmpOpt, m_camerasConfig.strOptCamera);
  865. if((strcmp((LPCTSTR)m_camerasConfig.strEwsCamera, (LPCTSTR)tmpEnv) == 0) ||
  866. (strcmp((LPCTSTR)m_camerasConfig.strEwsCamera, (LPCTSTR)tmpOpt) == 0)){
  867. m_camerasConfig.strEwsCamera = old_ews_str;
  868. m_camerasConfig.ewsCamera.strFriendlyName = old_ews.strFriendlyName;
  869. m_camerasConfig.ewsCamera.strMd5Val = old_ews.strMd5Val;
  870. m_camerasConfig.ewsCamera.strDevPath = old_ews.strDevPath;
  871. ewsCanOpen = false;
  872. ewsCorrected = false;
  873. Dbg("AutoCorrectCameraConfig, Corrected Ews Same With Env or Opt, return Ews:%s",
  874. (LPCSTR)m_camerasConfig.strEwsCamera);
  875. }
  876. }
  877. Dbg("AutoCorrectCameraConfig, after update config Env:%s, Opt:%s, Ews:%s",
  878. (LPCSTR)m_camerasConfig.strEnvCamera, (LPCSTR)m_camerasConfig.strOptCamera, (LPCSTR)m_camerasConfig.strEwsCamera);
  879. //update to root.ini
  880. if (envCorrected || optCorrected || ewsCorrected){
  881. CAutoArray<CEditConfigReq> reqs(3);
  882. for (int i = 0; i < 3; ++i) {
  883. reqs[i].EditType = 'U';
  884. strcpy(reqs[i].EntityName, "Root");
  885. strcpy(reqs[i].Section, "Video");
  886. }
  887. if (m_camerasConfig.strEnvCamera.GetLength() <= 1) {
  888. m_camerasConfig.strEnvCamera = "$";
  889. }
  890. if (m_camerasConfig.strOptCamera.GetLength() <= 1) {
  891. m_camerasConfig.strOptCamera = "$";
  892. }
  893. if (m_camerasConfig.strEwsCamera.GetLength() <= 1) {
  894. m_camerasConfig.strEwsCamera = "$";
  895. }
  896. strcpy(reqs[0].Key, "EnvCamera");
  897. strcpy(reqs[0].Value, (LPCTSTR)m_camerasConfig.strEnvCamera);
  898. strcpy(reqs[1].Key, "OptCamera");
  899. strcpy(reqs[1].Value, (LPCTSTR)m_camerasConfig.strOptCamera);
  900. strcpy(reqs[2].Key, "EwsCamera");
  901. strcpy(reqs[2].Value, (LPCTSTR)m_camerasConfig.strEwsCamera);
  902. HandleEditConfigReq(reqs);
  903. }
  904. }
  905. config->strEnvCamera = m_camerasConfig.strEnvCamera;
  906. config->strOptCamera = m_camerasConfig.strOptCamera;
  907. config->strEwsCamera = m_camerasConfig.strEwsCamera;
  908. return errorCameraCnt == 0;
  909. }
  910. //尝试自纠正一个摄像头配置名,采用配置名中设备名(FriendlyName)纠正
  911. bool CCameraConfigManageEntity::AutoCorrectCameraByOnlyFriendlyName(capture_camera_t &correct_camera,
  912. bool camera1_can_open, bool camera2_can_open,
  913. const capture_camera_t &exclude_camera1, const capture_camera_t &exclude_camera2,
  914. const CAutoArray<CSimpleStringA> &hspCams) {
  915. bool result = false;
  916. do {
  917. capture_camera_t tmp;
  918. CAutoArray<CSimpleStringA> excludeCams;
  919. //opt
  920. if (strcmp((LPCTSTR)correct_camera.strFriendlyName, (LPCTSTR)exclude_camera1.strFriendlyName) == 0) {
  921. if (!camera1_can_open) {
  922. //两设备同名都无法打开,无法矫正
  923. Dbg("AutoCorrectCameraByOnlyFriendlyName, strFriendlyName:%s can't correct for exclude_camera1 sameName",
  924. (LPCSTR)correct_camera.strFriendlyName);
  925. break;
  926. }
  927. else {
  928. //去掉同名能正确打开设备
  929. excludeCams.Append(&exclude_camera1.strMd5Val, 0, 1);
  930. Dbg("AutoCorrectCameraByOnlyFriendlyName, correctCameraFriendlyName:%s add exclude camera1:%s",
  931. (LPCSTR)correct_camera.strFriendlyName, (LPCSTR)exclude_camera1.strFriendlyName);
  932. }
  933. }
  934. else {
  935. //两设备不同名,可以矫正
  936. }
  937. //ews
  938. if (strcmp((LPCTSTR)correct_camera.strFriendlyName, (LPCTSTR)exclude_camera2.strFriendlyName) == 0) {
  939. if (!camera2_can_open) {
  940. //两设备同名都无法打开,无法矫正
  941. Dbg("AutoCorrectCameraByOnlyFriendlyName, strFriendlyName:%s can't correct for exclude_camera2 sameName",
  942. (LPCSTR)correct_camera.strFriendlyName);
  943. break;
  944. }
  945. else {
  946. excludeCams.Append(&exclude_camera2.strMd5Val, 0, 1);
  947. Dbg("AutoCorrectCameraByOnlyFriendlyName, correctCameraFriendlyName:%s add exclude camera2:%s",
  948. (LPCSTR)correct_camera.strFriendlyName, (LPCSTR)exclude_camera2.strFriendlyName);
  949. }
  950. }
  951. else {
  952. //env与ews不同名,可以矫正
  953. }
  954. //矫正env
  955. result = capture_get_only_video_device_by_friendlyname(correct_camera.strFriendlyName,
  956. excludeCams, hspCams, tmp);
  957. if (result) {
  958. correct_camera.strFriendlyName = tmp.strFriendlyName;
  959. correct_camera.strDevPath = tmp.strDevPath;
  960. correct_camera.strMd5Val = tmp.strMd5Val;
  961. Dbg("AutoCorrectCameraByOnlyFriendlyName, find correct_camera strFriendlyName:%s strDevPath:%s strMd5Val:%s",
  962. (LPCSTR)correct_camera.strFriendlyName, (LPCSTR)correct_camera.strDevPath, (LPCSTR)correct_camera.strMd5Val);
  963. }
  964. } while (0);
  965. return result;
  966. }
  967. //尝试自纠正一个摄像头配置名,采用唯一性纠正
  968. bool CCameraConfigManageEntity::AutoCorrectCameraByOnlyOne(capture_camera_t &correct_camera,
  969. const capture_camera_t &exclude_camera1, const capture_camera_t &exclude_camera2,
  970. const CAutoArray<CSimpleStringA> &hspCams) {
  971. bool result = false;
  972. capture_camera_t tmp;
  973. CAutoArray<CSimpleStringA> excludeCams;
  974. //opt
  975. excludeCams.Append(&exclude_camera1.strMd5Val, 0, 1);
  976. //ews
  977. excludeCams.Append(&exclude_camera2.strMd5Val, 0, 1);
  978. Dbg("AutoCorrectCameraByOnlyOne, correctCameraFriendlyName:%s exclude camera1:%s",
  979. (LPCSTR)correct_camera.strFriendlyName, (LPCSTR)exclude_camera1.strFriendlyName);
  980. Dbg("AutoCorrectCameraByOnlyOne, correctCameraFriendlyName:%s exclude camera2:%s",
  981. (LPCSTR)correct_camera.strFriendlyName, (LPCSTR)exclude_camera2.strFriendlyName);
  982. //矫正env
  983. result = capture_get_only_video_device(excludeCams, hspCams, tmp);
  984. if (result) {
  985. correct_camera.strFriendlyName = tmp.strFriendlyName;
  986. correct_camera.strDevPath = tmp.strDevPath;
  987. correct_camera.strMd5Val = tmp.strMd5Val;
  988. Dbg("AutoCorrectCameraByOnlyOne, find correct_camera strFriendlyName:%s strDevPath:%s strMd5Val:%s",
  989. (LPCSTR)correct_camera.strFriendlyName, (LPCSTR)correct_camera.strDevPath, (LPCSTR)correct_camera.strMd5Val);
  990. }
  991. return result;
  992. }
  993. void CameraConfigManageServiceSession::Handle_BeginCameraConfigManage(
  994. SpOnewayCallContext<CameraConfigManageService_BeginCameraConfigManage_Info>::Pointer ctx )
  995. {
  996. m_pEntity->StopEchoVideo();
  997. m_pEntity->StopCamera();
  998. LogEvent(Severity_Middle,LOG_EVT_BEGIN_CAMERA_CONFIG,NULL);
  999. }
  1000. void CameraConfigManageServiceSession::Handle_EndCameraConfigManage(
  1001. SpOnewayCallContext<CameraConfigManageService_EndCameraConfigManage_Info>::Pointer ctx )
  1002. {
  1003. m_pEntity->StopEchoVideo();
  1004. m_pEntity->StopCamera();
  1005. LogEvent(Severity_Middle,LOG_EVT_END_CAMERA_CONFIG,NULL);
  1006. }
  1007. void CameraConfigManageServiceSession::Handle_GetCameraList(
  1008. SpReqAnsContext<CameraConfigManageService_GetCameraList_Req,
  1009. CameraConfigManageService_GetCameraList_Ans>::Pointer ctx )
  1010. {
  1011. std::vector<capture_camera_t> cams;
  1012. m_pEntity->GetAvailableCameras(cams);
  1013. if (!cams.empty()) {
  1014. int nCount = cams.size();
  1015. ctx->Ans.AvailableList.Init(nCount);
  1016. for (int i = 0; i < nCount; ++i) {
  1017. ctx->Ans.AvailableList[i] = CSimpleStringA::Format("%s;%s",
  1018. cams[i].strFriendlyName.GetData(),cams[i].strMd5Val.GetData());
  1019. }
  1020. }
  1021. VideoConfig m_videoConfig;
  1022. m_pEntity->LoadConfig(&m_videoConfig);
  1023. bool bNull = m_videoConfig.strEnvCamera.IsNullOrEmpty();
  1024. ctx->Ans.EnvCamera = bNull?"$":m_videoConfig.strEnvCamera;
  1025. bNull = m_videoConfig.strOptCamera.IsNullOrEmpty();
  1026. ctx->Ans.OptCamera = bNull?"$":m_videoConfig.strOptCamera;
  1027. bNull = m_videoConfig.strEwsCamera.IsNullOrEmpty();
  1028. ctx->Ans.EwsCamera = bNull?"$":m_videoConfig.strEwsCamera;
  1029. if (ctx->Ans.EwsCamera != CSimpleStringA("$")) {
  1030. BOOL bFound = FALSE;
  1031. for (int i = 0; i < cams.size(); ++i) {
  1032. if (strstr(cams[i].strDevPath.GetData(),m_videoConfig.strEwsCamera.GetData())) {
  1033. bFound = TRUE;
  1034. ctx->Ans.EwsCamera = CSimpleStringA::Format("%s;%s",
  1035. cams[i].strFriendlyName.GetData(),cams[i].strMd5Val.GetData());
  1036. break;
  1037. }
  1038. }
  1039. if (!bFound) {
  1040. Dbg("[dbg] failed to find ewscam");
  1041. }
  1042. else {
  1043. Dbg("[dbg] ewscamera:%s-->%s",m_videoConfig.strEwsCamera.GetData(),ctx->Ans.EwsCamera.GetData());
  1044. }
  1045. }
  1046. ctx->Answer(Error_Succeed);
  1047. }
  1048. void CameraConfigManageServiceSession::Handle_EchoSomeCamera(
  1049. SpReqAnsContext<CameraConfigManageService_EchoSomeCamera_Req,
  1050. CameraConfigManageService_EchoSomeCamera_Ans>::Pointer ctx )
  1051. {
  1052. if (ctx->Req.CameraName.GetLength() <= 1 ||
  1053. ctx->Req.WndParams.GetLength() <= 1)
  1054. {
  1055. ctx->Ans.Error_Code = 0x21D81001;
  1056. ctx->Ans.Error_Msg = "params cannot be omitted";
  1057. ctx->Answer(Error_Succeed);
  1058. return;
  1059. }
  1060. const char *wndParams = (LPCTSTR)(ctx->Req.WndParams);
  1061. Dbg("start to echo video, get pos = %s",wndParams);
  1062. int xPos,yPos,width,height;
  1063. int nsuc = sscanf(wndParams, "%d@%d@%d@%d", &xPos, &yPos, &width, &height);
  1064. if (nsuc != 4)
  1065. {
  1066. ctx->Ans.Error_Code = 0x21D81002;
  1067. ctx->Ans.Error_Msg = "WndParams is illegal";
  1068. ctx->Answer(Error_Succeed);
  1069. return;
  1070. }
  1071. Dbg("x=%d,y=%d,width=%d,height=%d",xPos,yPos,width,height);
  1072. int ScreenWidth = GetSystemMetrics(SM_CXSCREEN); //主屏幕宽度
  1073. int ScreenHeight = GetSystemMetrics(SM_CYSCREEN); //主屏幕高度
  1074. DeviceTypeEnum devType = m_pEntity->GetDeviceType();
  1075. if (eDesk2SType==devType) // 低柜双屏在客户经理屏操作
  1076. {
  1077. if (xPos<0||yPos<0||width<0||height<0||
  1078. xPos+width>2*ScreenWidth||yPos+height>ScreenHeight) //
  1079. {
  1080. // 弹出模态窗口提示回显参数不正确
  1081. ctx->Ans.Error_Code = 0x21D81003;
  1082. ctx->Ans.Error_Msg = "WndParams is illegal";
  1083. ctx->Answer(Error_Succeed);
  1084. MessageBoxA(NULL,(LPCSTR)("窗口参数不正确,无法进行视频回显!"),NULL,MB_SYSTEMMODAL);
  1085. return;
  1086. }
  1087. }
  1088. else
  1089. {
  1090. if (xPos<0||yPos<0||width<0||height<0||
  1091. xPos+width>ScreenWidth||yPos+height>ScreenHeight) //
  1092. {
  1093. // 弹出模态窗口提示回显参数不正确
  1094. ctx->Ans.Error_Code = 0x21D81003;
  1095. ctx->Ans.Error_Msg = "WndParams is illegal";
  1096. ctx->Answer(Error_Succeed);
  1097. MessageBoxA(NULL,(LPCSTR)("窗口参数不正确,无法进行视频回显!"),NULL,MB_SYSTEMMODAL);
  1098. return;
  1099. }
  1100. }
  1101. CSimpleStringA currentCamName = m_pEntity->GetCameraName();
  1102. if (currentCamName != ctx->Req.CameraName)
  1103. {
  1104. // 停止回显
  1105. m_pEntity->StopEchoVideo();
  1106. // 停止摄像头
  1107. m_pEntity->StopCamera();
  1108. // 摄像头赋值
  1109. m_pEntity->SetCameraName(ctx->Req.CameraName);
  1110. }
  1111. Dbg("ctx->Req.CameraName:%s",ctx->Req.CameraName.GetData());
  1112. if (!m_pEntity->IsCameraStart())
  1113. {
  1114. // 启动摄像头
  1115. ErrorCodeEnum error = m_pEntity->StartCamera();
  1116. if (error != Error_Succeed)
  1117. {
  1118. ctx->Ans.Error_Code = 0x21D81004;
  1119. ctx->Ans.Error_Msg = "failed to start camera";
  1120. ctx->Answer(Error_Succeed);
  1121. return;
  1122. }
  1123. }
  1124. // 开始回显画面
  1125. m_pEntity->StartEchoVideo(xPos, yPos, width, height);
  1126. ctx->Ans.Error_Code = 0;
  1127. ctx->Ans.Error_Msg = "";
  1128. ctx->Answer(Error_Succeed);
  1129. }
  1130. void CameraConfigManageServiceSession::Handle_SaveCameraConfig(
  1131. SpReqAnsContext<CameraConfigManageService_SaveCameraConfig_Req,
  1132. CameraConfigManageService_SaveCameraConfig_Ans>::Pointer ctx )
  1133. {
  1134. capture_camera_t camera;
  1135. if (ctx->Req.EnvCamera.GetLength() > 1 &&
  1136. capture_get_video_device_id(ctx->Req.EnvCamera.GetData(),camera) < 0) {
  1137. ctx->Ans.Error_Code = 0x21D82001;
  1138. ctx->Ans.Error_Msg = "EnvCamera does not exist";
  1139. ctx->Answer(Error_Succeed);
  1140. return;
  1141. }
  1142. if (ctx->Req.OptCamera.GetLength() > 1 &&
  1143. capture_get_video_device_id(ctx->Req.OptCamera.GetData(),camera) < 0) {
  1144. ctx->Ans.Error_Code = 0x21D82002;
  1145. ctx->Ans.Error_Msg = "OptCamera does not exist";
  1146. ctx->Answer(Error_Succeed);
  1147. return;
  1148. }
  1149. if (ctx->Req.EwsCamera.GetLength() > 1 &&
  1150. capture_get_video_device_id(ctx->Req.EwsCamera.GetData(),camera) < 0) {
  1151. ctx->Ans.Error_Code = 0x21D82003;
  1152. ctx->Ans.Error_Msg = "EwsCamera does not exist";
  1153. ctx->Answer(Error_Succeed);
  1154. return;
  1155. }
  1156. CAutoArray<CEditConfigReq> reqs(3);
  1157. for (int i = 0; i < 3; ++i) {
  1158. reqs[i].EditType = 'U';
  1159. strcpy(reqs[i].EntityName,"Root");
  1160. strcpy(reqs[i].Section,"Video");
  1161. }
  1162. if (ctx->Req.EnvCamera.GetLength() <= 1) {
  1163. ctx->Req.EnvCamera = "$";
  1164. }
  1165. if (ctx->Req.OptCamera.GetLength() <= 1) {
  1166. ctx->Req.OptCamera = "$";
  1167. }
  1168. if (ctx->Req.EwsCamera.GetLength() <= 1) {
  1169. ctx->Req.EwsCamera = "$";
  1170. }
  1171. strcpy(reqs[0].Key,"EnvCamera");
  1172. strcpy(reqs[0].Value,(LPCTSTR)ctx->Req.EnvCamera);
  1173. strcpy(reqs[1].Key,"OptCamera");
  1174. strcpy(reqs[1].Value,(LPCTSTR)ctx->Req.OptCamera);
  1175. strcpy(reqs[2].Key,"EwsCamera");
  1176. if (ctx->Req.EwsCamera.GetLength() > 1)
  1177. {
  1178. CSimpleStringA ewsCamName;
  1179. bool bRet = m_pEntity->ConvertEwsCameraName(ewsCamName,ctx->Req.EwsCamera);
  1180. Dbg("%s to ConvertEwsCameraName", (bRet ? "succeeded" : "failed"));
  1181. if (!bRet)
  1182. {
  1183. ctx->Ans.Error_Code = 0x21D82003;
  1184. ctx->Ans.Error_Msg = "EwsCamera does not exist";
  1185. ctx->Answer(Error_Succeed);
  1186. return;
  1187. }
  1188. strcpy(reqs[2].Value, ewsCamName.GetData());
  1189. }
  1190. else
  1191. {
  1192. strcpy(reqs[2].Value, ctx->Req.EwsCamera.GetData());
  1193. }
  1194. m_pEntity->HandleEditConfigReq(reqs);
  1195. ctx->Ans.Error_Code = 0;
  1196. ctx->Ans.Error_Msg = "";
  1197. ctx->Answer(Error_Succeed);
  1198. }
  1199. void CameraConfigManageServiceSession::Handle_StopEchoSomeCamera(
  1200. SpReqAnsContext<CameraConfigManageService_StopEchoSomeCamera_Req,
  1201. CameraConfigManageService_StopEchoSomeCamera_Ans>::Pointer ctx )
  1202. {
  1203. CSimpleStringA currentCamName = m_pEntity->GetCameraName();
  1204. if (currentCamName != ctx->Req.CameraName) {
  1205. ctx->Ans.Error_Code = 0x21D83001;
  1206. ctx->Ans.Error_Msg = "input camera name is incorrect";
  1207. ctx->Answer(Error_Succeed);
  1208. return;
  1209. }
  1210. m_pEntity->StopEchoVideo();
  1211. m_pEntity->StopCamera();
  1212. ctx->Ans.Error_Code = 0;
  1213. ctx->Ans.Error_Msg = "";
  1214. ctx->Answer(Error_Succeed);
  1215. }
  1216. void CameraConfigManageServiceSession::Handle_QueryCallState(
  1217. SpReqAnsContext<CameraConfigManageService_QueryCallState_Req,
  1218. CameraConfigManageService_QueryCallState_Ans>::Pointer ctx )
  1219. {
  1220. CSimpleStringA strValue;
  1221. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetSysVar("CallState", strValue);
  1222. Dbg("QueryCallState: %s", strValue.GetData());
  1223. if (Error != Error_Succeed)
  1224. {
  1225. strValue = "";
  1226. }
  1227. ctx->Ans.CallState = strValue;
  1228. ctx->Answer(Error_Succeed);
  1229. }
  1230. void CameraConfigManageServiceSession::Handle_QueryUIState(
  1231. SpReqAnsContext<CameraConfigManageService_QueryUIState_Req,
  1232. CameraConfigManageService_QueryUIState_Ans>::Pointer ctx )
  1233. {
  1234. CSimpleStringA strValue;
  1235. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetSysVar("UIState", strValue);
  1236. Dbg("QueryUIState: %s", strValue.GetData());
  1237. if (Error != Error_Succeed)
  1238. {
  1239. strValue = "";
  1240. }
  1241. ctx->Ans.UIState = strValue;
  1242. ctx->Answer(Error_Succeed);
  1243. }
  1244. void CameraConfigManageServiceSession::Handle_AutoCorrectCameraConfig(
  1245. SpReqAnsContext<CameraConfigManageService_AutoCorrectCameraConfig_Req,
  1246. CameraConfigManageService_AutoCorrectCameraConfig_Ans>::Pointer ctx) {
  1247. VideoConfig m_videoConfig;
  1248. m_pEntity->AutoCorrectCameraConfig(&m_videoConfig);
  1249. bool bNull = m_videoConfig.strEnvCamera.IsNullOrEmpty();
  1250. ctx->Ans.EnvCamera = bNull ? "$" : m_videoConfig.strEnvCamera;
  1251. bNull = m_videoConfig.strOptCamera.IsNullOrEmpty();
  1252. ctx->Ans.OptCamera = bNull ? "$" : m_videoConfig.strOptCamera;
  1253. bNull = m_videoConfig.strEwsCamera.IsNullOrEmpty();
  1254. ctx->Ans.EwsCamera = bNull ? "$" : m_videoConfig.strEwsCamera;
  1255. ctx->Answer(Error_Succeed);
  1256. }
  1257. SP_BEGIN_ENTITY_MAP()
  1258. SP_ENTITY(CCameraConfigManageEntity)
  1259. SP_END_ENTITY_MAP()