linux裝置上的Onvif 實現9:檢查是否支援該裝置
前文獲取了攝像頭的2個通道的視訊解析度、幀率、位元速率、編碼格式等資訊,目的是為了判斷我的linux裝置能否支援該視訊解碼顯示。 如果能夠支援那麼就大吉大利,一切OK!如果兩個通道都不支援,那麼就需要更麻煩的自動修改配置引數過程了,詳細修改過程見後文說明。
2 我的判斷函式
我的判斷標準是:
#define MAXWIDTH 640
#define MAXHEIGHT 480
#define MAXBITRATELIMIT 1536
#define MAXFRAMERATE 25
/******************************************************************************
* Name: MyIsSupportDevice
*
* Desc: 判斷是否支援指定節點裝置
* Param:
int index, 指定節點序號
* Return: BOOL, TRUE: support, FALSE: not support
* Global:
* Note: 如果兩個通道都不滿足要求才認定是不支援的裝置
* Author: Tom-hongtao.gao
* -------------------------------------
* Log: 2013/07/24, Create this function by Tom-hongtao.gao
******************************************************************************/
BOOL MyIsSupportDevice(int index)
{
BOOL bret=FALSE;
int i;
int support=0; //支援的通道總數
DEVICENODE * deviceode = DLFindbyIndex(index);
if(!deviceode)
{
printf("--Error: DLFindbyIndex(%d) return NULL! \n", index);
return FALSE;
}
for(i=0;i<2;i++)
{
/* 檢查編碼格式H264 */
if(deviceode->profile[i].Encoding!=2)
{
printf("--Error: deviceode[%d]->profile[%d].Encoding is not H264! \n",index,i);
continue;
}
/* 檢查編碼引數H264Profile */
if(deviceode->profile[i].H264Profile<0)
{
printf("--Error: deviceode[%d]->profile[%d].H264Profile is not unkonwn! \n",index,i);
continue;
}
/* 檢查解析度640x480 */
if(deviceode->profile[i].Width > MAXWIDTH)
{
printf("--Error: deviceode[%d]->profile[%d].Width is more than %d! \n",index,i, MAXWIDTH);
continue;
}
if(deviceode->profile[i].Height > MAXHEIGHT)
{
printf("--Error: deviceode[%d]->profile[%d].Height is more than %d! \n",index,i,MAXHEIGHT);
continue;
}
/* 檢查幀率25 */
if(deviceode->profile[i].FrameRateLimit > MAXFRAMERATE)
{
printf("--Error: deviceode[%d]->profile[%d].FrameRateLimit is more than %d fps! \n",index,i, MAXFRAMERATE);
continue;
}
/* 檢查位元速率1.5M */
/* 發現各種攝像頭分包數、分包大小不同。
有的每包1422byte,分包數超過15包
有的每包8000byte,分包數隨位元速率而變,
512K 下分為3包,解碼正常
1024K下分為4包,I幀偶爾超過30K
1280K下分為5包,I幀經常超過30K
1536K下分為7包,I幀超過40K
*/
if(deviceode->profile[i].BitrateLimit > MAXBITRATELIMIT)
{
printf("--Error: deviceode[%d]->profile[%d].BitrateLimit is more than %d Kbs! \n",index,i,MAXBITRATELIMIT);
continue;
}
deviceode->profile[i].support=1; //通過檢查設定為支援
printf("--Find support profile: deviceode[%d]->profile[%d]. \n",index,i);
support++;
}
if(support > 0)
bret=TRUE;
else
bret=FALSE;
return bret;
}