1. 程式人生 > >linux裝置上的Onvif 實現9:檢查是否支援該裝置

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;
}