📄 consolesample.c
字号:
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include "mainprofile_error.h"
#include "typedef.h"
#ifdef _WIN32
#include <direct.h>
#include <io.h>
#define RECORD_ROOT_PATH "c:\\H263Files"
#define DECODER_ROOT_PATH "C:\\DecoderCbFile"
#define CHAR_PATH_SEP '\\'
#else
#include <pthread.h>
#include <sys/time.h>
#define RECORD_ROOT_PATH "H263Files"
#define DECODER_ROOT_PATH "DecoderCbFile"
#define CHAR_PATH_SEP '/'
#endif // _WIN32
#define _DO_FILE_IO
#define MAX_GOP_FILE_NUM 100
TCHANNEL_INFO g_Channel_Info[MAX_CHANNELS];
int g_iFocus = 0;
char g_szUpgradeFile[256];
#ifdef _WIN32
#define STRICMP stricmp
#define STRNINCMP strnicmp
CRITICAL_SECTION g_CS[MAX_CHANNELS];
#else
#define STRICMP strcasecmp
#define STRNICMP strncasecmp
pthread_mutex_t g_CS[MAX_CHANNELS];
#endif // _WIN32
//HANDLE g_ExitWait[MAX_CHANNELS];
BOOL g_bExitFlag[MAX_CHANNELS];
HANDLE g_hDataBroker;
HANDLE g_hAvSync;
int g_nMaxChannel = 1;
BOOL g_bExit = FALSE;
int g_nMaxDecoderFileNum = 50;
char g_szExtName[5] = "bmp";
int g_nType = 0;
int g_nTimeout = 0;
BOOL g_bFlushUart = FALSE;
int g_nUpgradeTimes = 1;
DWORD g_nUpgradeLoopWait = 5000;
BOOL g_bCBDecoder = TRUE;
#ifdef _AVSYNC
EPIXELFORMAT g_eAVRawType = PF_BMP24;
#endif // _AVSYNC
SCODE __stdcall DataBrokerAVCallBack(DWORD dwContext,TMediaDataPacketInfo *pMediaDataPacket);
SCODE __stdcall DataBrokerInputAVCallBack(DWORD dwContext,TMediaDataPacketInfo *pMediaDataPacket);
SCODE __stdcall DataBrokerStatusCallBack(DWORD dwContext, TDataBrokerStatusType tStatusType, PVOID pvParam1, PVOID pvParam2);
SCODE __stdcall DataBrokerInputStatusCallBack(DWORD dwContext, TDataBrokerStatusType tStatusType, PVOID pvParam1, PVOID pvParam2);
SCODE __stdcall DataBrokerNetPacketCallback(DWORD dwContext, DWORD dwMediaType, DWORD dwLen, BYTE *pbyPacket);
#ifdef _AVSYNC
SCODE __stdcall AvSynchronizerDecodeCallback(DWORD dwContext, TMediaType tFrameType, TFRAMEINFO * tframeinfo );
#endif // _AVSYNC
void OutputUsage(const char *pszProgName, int nType);
int Connect_Channel(void);
int Disconnect_Channel(int nIndex, BOOL bBlock);
int Release_Module(void);
int Initial_Module(void);
int HandleNormalConnect();
enum
{
connErrAuth,
connErrConnFailed,
connErrHttpRead,
connErrOutMemory,
connErrAccessName
} ELocConnectErrorType;
#ifdef _WIN32
BOOL WINAPI StaticControlHandler ( DWORD dwCtrlType )
{
switch( dwCtrlType )
{
case CTRL_BREAK_EVENT: // use Ctrl+C or Ctrl+Break to simulate
case CTRL_C_EVENT: // SERVICE_CONTROL_STOP in debug mode
printf("Stopping sample...\n");
Release_Module();
g_bExit = TRUE;
break;
}
return FALSE;
}
#endif // _WIN32
int MoreOptionsForNormalConnect(const char *pszArgument)
{
if (strncmp(pszArgument, "-P", 2) == 0) // protocol
{
g_Channel_Info[0].dwProtocol = atoi(&pszArgument[2]);
}
else if (strncmp(pszArgument, "-C", 2) == 0) // if test to use net callback in DataBroker
{
if (STRICMP(&pszArgument[2], "true") == 0 ||
STRICMP(&pszArgument[2], "yes") == 0)
g_Channel_Info[0].bNetPacketCallback = TRUE;
else if (STRICMP(&pszArgument[2], "false") == 0 ||
STRICMP(&pszArgument[2], "no") == 0)
g_Channel_Info[0].bNetPacketCallback = FALSE;
else
g_Channel_Info[0].bNetPacketCallback = (atoi(&pszArgument[2])?TRUE:FALSE);
}
#ifdef _AVSYNC
else if (strncmp(pszArgument, "-R", 2) == 0)
{
g_eAVRawType = atoi(&pszArgument[2]);
if (g_eAVRawType > PF_BGR16555)
g_eAVRawType = PF_BGR16555;
else if (g_eAVRawType < PF_YUY2)
g_eAVRawType = PF_YUY2;
switch (g_eAVRawType)
{
case PF_YUY2:
case PF_YUV:
strcpy(g_szExtName, "yuv");
break;
case PF_RGB16565:
case PF_RGB16555:
case PF_RGB32:
case PF_RGB24:
case PF_BGR16565:
case PF_BGR16555:
case PF_BGR32:
case PF_BGR24:
strcpy(g_szExtName, "raw");
break;
case PF_JPEG:
strcpy(g_szExtName, "jpg");
break;
case PF_BMP16565:
case PF_BMP24:
case PF_BMP32:
case PF_BMP16555:
default:
strcpy(g_szExtName, "bmp");
}
}
#endif // _AVSYNC
else
return -1;
return 0;
}
int MoreOptionsForUart(const char *pszArgument)
{
if (strncmp(pszArgument, "-O", 2) == 0) // timeout
{
g_nTimeout = atoi(&pszArgument[2]);
if (g_nTimeout > 25000)
g_nTimeout = 25000;
}
else if (strncmp(pszArgument, "-F", 2) == 0) // flush
{
if (STRICMP(&pszArgument[2], "true") == 0 ||
STRICMP(&pszArgument[2], "yes") == 0)
g_bFlushUart = TRUE;
else if (STRICMP(&pszArgument[2], "false") == 0 ||
STRICMP(&pszArgument[2], "no") == 0)
g_bFlushUart = FALSE;
else
g_bFlushUart = (atoi(&pszArgument[2])?TRUE:FALSE);
}
else
return -1;
return 0;
}
int MoreOptionsForUpgrade(const char *pszArgument)
{
if (strncmp(pszArgument, "-F", 2) == 0) // protocol
{
strcpy(g_szUpgradeFile, &pszArgument[2]);
}
else if (strncmp(pszArgument, "-L", 2) == 0) // loop times
{
g_nUpgradeTimes = atoi(&pszArgument[2]);
if (g_nUpgradeTimes < 1 || g_nUpgradeTimes > 1000)
g_nUpgradeTimes = 1;
}
else if (strncmp(pszArgument, "-W", 2) == 0) // loop times
{
g_nUpgradeLoopWait = atoi(&pszArgument[2]);
}
else
return -1;
return 0;
}
int ServerUtlConnectToServer(HANDLE *phServerUtl, HANDLE *phDevice, char *pszModelName)
{
TSERVERUTL_DEV_PROPERTY tDevProperty;
SCODE scRet;
memset(&tDevProperty, 0, sizeof(tDevProperty));
tDevProperty.lpszHost=g_Channel_Info[0].chHostIP;
tDevProperty.lpszPassword=g_Channel_Info[0].chPassword;
tDevProperty.lpszUserName=g_Channel_Info[0].chUserName;
tDevProperty.dwTimeout = 30000;
tDevProperty.dwHttpPort = g_Channel_Info[0].dwHTTPPort;
scRet = ServerUtl_Initial(phServerUtl, SERVERUTL_VERSION);
if (scRet != S_OK)
{
printf("ServerUtl_Initial failed %X\n", scRet);
return -1;
}
scRet = ServerUtl_CreateDevice(*phServerUtl, phDevice);
if (scRet != S_OK)
{
printf("ServerUtl_CreateDevice failed %X\n", scRet);
ServerUtl_Release(phServerUtl);
return -1;
}
scRet = ServerUtl_SetDeviceProperty(*phDevice, tDevProperty, FALSE);
if (scRet != S_OK)
{
if (scRet == SERVUTL_E_AUTH)
printf("User name or password incorrect\n");
else
printf("Can't connect to server\n");
ServerUtl_DeleteDevice(*phDevice);
ServerUtl_Release(phServerUtl);
return -1;
}
pszModelName[0] = 0;
scRet = ServerUtl_GetDeviceModel(*phDevice, pszModelName);
if (scRet != S_OK)
{
printf("ServerUtl_GetDeviceModel failed %X\n", scRet);
ServerUtl_DeleteDevice(*phDevice);
ServerUtl_Release(phServerUtl);
return -1;
}
scRet = ServerUtl_OpenDevice(*phDevice, pszModelName);
if (scRet != S_OK)
{
printf("ServerUtl_OpenDevice failed %X\n", scRet);
ServerUtl_DeleteDevice(*phDevice);
ServerUtl_Release(phServerUtl);
return -1;
}
return 0;
}
int HandleCommandLineArgument(int argc, char* argv[])
{
int nCnt;
if (argc < 2)
{
OutputUsage(argv[0], -1);
return -1;
}
if (strncmp(argv[1], "-Z", 2) != 0)
{
OutputUsage(argv[0], -1);
return -1;
}
g_nType = atoi(&argv[1][2]);
if (g_nType < 0)
{
OutputUsage(argv[0], -1);
return -1;
}
if (g_nType < 8)
{
if (argc < 5)
{
OutputUsage(argv[0], g_nType);
return -1;
}
// read the server info
memset(g_Channel_Info, 0, sizeof(g_Channel_Info));
g_Channel_Info[0].dwProtocol = 1;
g_Channel_Info[0].dwHTTPPort = 80;
for (nCnt = 2; nCnt < argc; nCnt++)
{
if (strncmp(argv[nCnt], "-N", 2) == 0) // server name or IP
{
strncpy(g_Channel_Info[0].chHostIP, &argv[nCnt][2], 63);
}
else if (strncmp(argv[nCnt], "-U", 2) == 0) // user name
{
strncpy(g_Channel_Info[0].chUserName, &argv[nCnt][2], 31);
}
else if (strncmp(argv[nCnt], "-S", 2) == 0) // pwssword
{
if (strlen(argv[nCnt]) > 2)
strncpy(g_Channel_Info[0].chPassword, &argv[nCnt][2], 31);
else
g_Channel_Info[0].chPassword[0] = 0;
}
else if (strncmp(argv[nCnt], "-T", 2) == 0) // server port (http)
{
g_Channel_Info[0].dwHTTPPort = atoi(&argv[nCnt][2]);
}
else if (strncmp(argv[nCnt], "-M", 2) == 0) // server model (friendly model name)
{
strncpy(g_Channel_Info[0].chServer_Type, &argv[nCnt][2], 31);
}
else if (strncmp(argv[nCnt], "-B", 2) == 0) // server model (friendly model name)
{
if (STRICMP(&argv[nCnt][2], "true") == 0 ||
STRICMP(&argv[nCnt][2], "yes") == 0)
g_bCBDecoder = FALSE;
else if (STRICMP(&argv[nCnt][2], "false") == 0 ||
STRICMP(&argv[nCnt][2], "no") == 0)
g_bCBDecoder = TRUE;
else
g_bCBDecoder = (atoi(&argv[nCnt][2])?FALSE:TRUE);
}
else
{
int nRet = 0;
if (g_nType == 0)
nRet = MoreOptionsForNormalConnect(argv[nCnt]);
else if (g_nType == 5)
nRet = MoreOptionsForUart(argv[nCnt]);
else if (g_nType == 7)
nRet = MoreOptionsForUpgrade(argv[nCnt]);
if (nRet < 0)
{
OutputUsage(argv[0], g_nType);
return -1;
}
}
}
}
return 0;
}
int HandleNormalConnect()
{
#ifdef _WIN32
CreateDirectory(RECORD_ROOT_PATH, NULL);
CreateDirectory(DECODER_ROOT_PATH, NULL);
#else
mkdir(RECORD_ROOT_PATH, 0);
mkdir(DECODER_ROOT_PATH, 0);
#endif // _WIN32
#ifdef _WIN32
SetConsoleCtrlHandler( StaticControlHandler, TRUE );
#endif // _WIN32
if (Initial_Module() != 0)
return 1;
#if defined(_AVSYNC) && !defined(_WIN32)
AvSynchronizer_UseAllCodecs ();
#endif // _AVSYNC
if (Connect_Channel() != 0)
return 1;
while (1)
{
if (g_bExit)
break;
#ifdef _WIN32
Sleep(500);
#else
sleep(1);
#endif // _WIN32
}
return 0;
}
int ListSupportedModel()
{
// List support Server_Model Name
char **pFriendlyNameList;
DWORD dwSrv_Model_Num;
int i;
SrvDepResource_EnumerateSupportingMode(&pFriendlyNameList,&dwSrv_Model_Num);
for ( i = 0; i < (int) dwSrv_Model_Num ; i++)
{
if ((i % 5) == 0)
{
if (i != 0)
printf("\n");
}
else
printf(", ");
printf(pFriendlyNameList[i]);
}
printf("\n\nTotal %d models\n", dwSrv_Model_Num);
SrvDepResource_FreeFriendlyNameList(&pFriendlyNameList);
return 0;
}
int DetectServerModel()
{
HANDLE hSrvUtl;
HANDLE hDevice;
char lpszModelName[64];
char FriendlyName[64];
if (ServerUtlConnectToServer(&hSrvUtl, &hDevice, lpszModelName) < 0)
return -1;
ServerUtl_DeleteDevice(hDevice);
ServerUtl_Release(&hSrvUtl);
if (lpszModelName[0] == 0)
{
printf("Get Model name failed");
return -1;
}
FriendlyName[0] = 0;
SrvDepResource_GetMappingFriendlyName(lpszModelName,FriendlyName);
printf("The server Model for %s is: %s\n", g_Channel_Info[0].chHostIP, FriendlyName);
return 0;
}
int TestGetSystemSettings()
{
HANDLE hSrvUtl;
HANDLE hDevice;
char lpszModelName[64];
char szInputBuf[256];
char szSection[256], szEntry[256];
char szContent[256];
int nNum;
SCODE scRet;
if (ServerUtlConnectToServer(&hSrvUtl, &hDevice, lpszModelName) < 0)
return -1;
// do a while loop to ask user for item to retrieve
while (1)
{
printf("To end this program, please press Enter directly.\n");
printf("Please select the info index to retrieve (range: %d to %d):",
eSystemResetSystem, eCamCtrlPatrolName);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -