www.pudn.com > modifyencini.rar > CODEC_GetDevParam.h


// must use g++ to compile 
#ifndef _CODEC_GET_DEV_PARAM_H_ 
#define _CODEC_GET_DEV_PARAM_H_ 
 
#include "./CODEC_API.h" 
#include "./CodecParamStruct.h" 
#include "./ConfigParamStruct.h" 
#include "./ComParamStruct.h" 
#include "./types.h" 
 
#include  // string class 
#include  // strcpy 
#include  
 
using namespace std; 
 
/**initialize Struct*/ 
void API_InitDevParamStruct (LPVOID pParam) { 
    printf("++API_InitDevParamStruct()\n"); 
    DevParamStruct *param = (DevParamStruct *) pParam; 
    memset(param, 0, sizeof(DevParamStruct)); 
} 
 
void API_InitConfigParamStruct(LPVOID pParam) { 
    printf("++API_InitConfigParamStruct()\n"); 
    ConfigParamStruct *param = (ConfigParamStruct *)pParam; 
    memset(param, 0, sizeof(ConfigParamStruct)); 
} 
 
void API_InitCodecParamStruct(LPVOID pParam) { 
    printf("++API_InitCodecParamStruct()\n"); 
    CodecParamStruct *param = (CodecParamStruct *)pParam; 
    memset(param, 0, sizeof(CodecParamStruct)); 
} 
 
void API_InitComConfigStruct(LPVOID pParam) { 
    printf("++API_InitComConfigStruct()\n"); 
    ComConfigStruct *param = (ComConfigStruct *)pParam; 
    memset(param, 0, sizeof(ComConfigStruct)); 
} 
 
/** given an entry in the format of =, parse it accordingly */ 
int API_ParseEntry(const string &entry, string &name, string &val) { 
    int eq_pos = entry.find("="); 
 
    // check to see if entry is valid, can't find "=" 
    if (eq_pos == string::npos) { 
    	// entry.c_str() Conversion to C Style Strings 
        printf("expected = entry, got %s instead\n",entry.c_str()); 
        return FAILURE; 
    } 
 
    // get name 
    name.assign(entry,0,eq_pos); 
    // get value, return the substring behind index eq_pos 
    val = entry.substr(eq_pos+1); 
     
    return SUCCESS; 
} 
 
/** given a val in the format of ipaddr:port,parse it accordingly */ 
int API_ParseColon (const string &val, char *pIpaddr, int &port) { 
    string val_ipaddr, val_port; 
 
    int colon_pos = val.find(":"); 
 
    // check to see if entry is valid, can't find "=" 
    if (colon_pos == string::npos) { 
    	// entry.c_str() Conversion to C Style Strings 
        printf("expected ipaddr:port entry, got %s instead\n",val.c_str()); 
        return FAILURE; 
    } 
 
    // get ipaddr and port 
    val_ipaddr.assign(val,0,colon_pos); 
    val_port = val.substr(colon_pos+1); 
 
    sscanf(val_ipaddr.c_str(), "%s", pIpaddr); 
    sscanf(val_port.c_str(), "%d", &port); 
 
    return SUCCESS; 
} 
 
/** Given an entry in the format of =,... parse it accordingly.*/ 
int API_ParseArray( const string &val_num,Net_Addr *pSendlist,int &send_nums) { 
 
    string val = val_num; 
    int colon_pos = val.find(":"); 
 
    // check to see if entry is valid 
    if (colon_pos == string::npos) { 
        printf("expected name:value entry, got %s instead\n",val.c_str()); 
        return FAILURE; 
    } 
 
    string str; 
    send_nums = 0; 
    int semicolon_pos = colon_pos; // init !=0 
 
    while (semicolon_pos != string::npos && send_nums < MAX_UCAST_LIST) { 
	semicolon_pos = val.find(","); 
	str.assign(val, 0, semicolon_pos); 
	API_ParseColon(str,pSendlist[send_nums].sIP,pSendlist[send_nums].nPort); 
        send_nums++; 
        val = val.substr(semicolon_pos+1); 
    } 
 
//    printf("it finds %d destinations in send target list.\n",send_nums); 
     
    return SUCCESS; 
} 
 
/** parse a given config file */ 
int API_ParseConfigFile(const char* filename, ConfigParamStruct *pParam) { 
    printf("++API_ParseConfigFile()\n"); 
	 
    FILE *file = fopen(filename, "r");	// open the config file 
    if (file==NULL) { 
  	printf("Cannot find config file: %s\n",filename); 
	return FAILURE; 
    } 
	 
    ConfigParamStruct *appparam = NULL; 
    appparam = pParam; 
 
    string line, name,val,valTemp1,valTemp2; 
    char lineTemp[8*1024]; 
 
    // read the file content line by line 
    // fgets() return when encounter enter 
    while (fgets(lineTemp, sizeof(lineTemp), file)!=NULL) { 
 
        if (lineTemp[strlen(lineTemp)-1]=='\n') lineTemp[strlen(lineTemp)-1] = '\0'; 
 
	// string class: add "using namespace std" and include  
	// member func: swap(),erase(),insert(),clear(),replace()... 
        line.erase(); // clear character string 
        line.insert(0, lineTemp); // insert character string on position index 0 
 
	// find function returns the index. If nothing's found, string::npos returned 
        if (line.find_first_not_of(" \t\n\r")==string::npos) continue; // skip ahead if line is empty 
         
        if (line[0]=='#') continue; // skip ahead if the line is a comment 
         
        API_ParseEntry(line,name,val);	// use line informaton to splits up name and value 
 
        if (name=="device_type") { 
            if (val == "CODEC") { 
                appparam->DevType=DEV_CODEC; 
            } else if (val == "ENCODER"){ 
                appparam->DevType=DEV_ENCODER; 
            } else if (val == "DECODER"){ 
                appparam->DevType=DEV_DECODER; 
	    } else { 
       	        printf("unknow device type definition detected!\n"); 
        	continue; 
            } 
        } else if (name=="device_ID") { 
            sscanf(val.c_str(), "%d", &appparam->DevID); 
        } else if (name=="media_type") { 
            if (val == "VES") { 
                appparam->MediaType = MEDIA_VES; 
            } else if (val == "PS") { 
            	appparam->MediaType = MEDIA_PS; 
            } else if (val == "TS") { 
                appparam->MediaType = MEDIA_TS; 
            } else { 
                printf("unknow media type definition detected!\n"); 
        	continue; 
            } 
        } else if (name=="transport_protocol") { 
            if (val == "UDP") { 
         	appparam->TransProto=PROTO_UDP; 
            } else if (val == "RTP"){ 
         	appparam->TransProto=PROTO_RTP; 
            } else { 
        	printf("unknow transport protocol definition detected!\n"); 
        	continue; 
            } 
        } else if (name=="local_network_ipaddr") { 
	    strcpy(appparam->local_network_ipaddr,val.c_str()); 
        } else if (name=="local_network_mask") { 
	    strcpy(appparam->local_network_mask,val.c_str()); 
        } else if (name=="local_network_gateway") { 
	    strcpy(appparam->local_network_gateway,val.c_str()); 
        } else if (name=="my_port") { 
             sscanf(val.c_str(), "%d", &appparam->my_port);  
        } else if (name=="server_address") { 
	    API_ParseColon (val,appparam->server_address.sIP,appparam->server_address.nPort); 
        } else if (name=="control_ipaddr") { 
	    strcpy(appparam->control_ipaddr,val.c_str()); 
        } else if (name=="doMulticast") { 
            appparam->doMulticast=(val=="TRUE") || (val=="true"); 
        } else if (name=="multicast_address") { 
	    API_ParseColon (val,appparam->multicast_address.sIP,appparam->multicast_address.nPort); 
        } else if (name=="doNetSend") { 
            appparam->doNetSend=(val=="TRUE") || (val=="true"); 
        } else if (name=="send_target_list") { 
            API_ParseArray(val,appparam->send_target_list,appparam->iSendNum); 
        } else if (name=="doFileWrite") { 
            appparam->doFileWrite=(val=="TRUE") || (val=="true"); 
        } else { 
        	continue; 
        } 
    } 
     
    if (fclose(file)!=0) printf("Cannot close config file\n"); 
 
    return SUCCESS; 
} 
 
/** parse a given codec file */ 
int API_ParseCodecFile(const char* filename, CodecParamStruct *pParam) { 
    printf("++API_ParseCodecFile()\n"); 
 
    FILE *file = fopen(filename, "r");	// open the config file 
    if (file==NULL) { 
  	printf("Cannot find codec file: %s\n",filename); 
	return FAILURE; 
    } 
 
    bool bPsFile=false, bTsFile=false,bEsFile=false; 
    if(strstr(filename,"ps")!=NULL) { 
        bPsFile=true; 
    } else if (strstr(filename,"ts")!=NULL) { 
        bTsFile=true; 
    } else if (strstr(filename,"es")!=NULL) { 
        bEsFile=true; 
    } else { 
        printf("codec file name format uncorrect, e.g codec_ps.ini\n"); 
        return FAILURE; 
    } 
 
    CodecParamStruct *appparam = NULL; 
    appparam = pParam; 
 
    string line, name,val,valTemp1,valTemp2; 
    char lineTemp[8*1024]; 
 
    // read the file content line by line 
    // fgets() return when encounter enter 
    while (fgets(lineTemp, sizeof(lineTemp), file)!=NULL) { 
 
        if (lineTemp[strlen(lineTemp)-1]=='\n') lineTemp[strlen(lineTemp)-1] = '\0'; 
		 
	// string class: add "using namespace std" and include  
	// member func: swap(),erase(),insert(),clear(),replace()... 
        line.erase(); // clear character string 
        line.insert(0, lineTemp); // insert character string on position index 0 
 
	// find function returns the index. If nothing's found, string::npos returned 
        if (line.find_first_not_of(" \t\n\r")==string::npos) continue; // skip ahead if line is empty 
         
        if (line[0]=='#') continue; // skip ahead if the line is a comment 
         
        API_ParseEntry(line,name,val); // use line informaton to splits up name and value 
        if (bPsFile || bEsFile) { 
            if (name=="vid_horizontal_size_value") { 
                sscanf(val.c_str(), "%d", &appparam->HResolu);  
            } else if (name=="vid_vertical_size_value") { 
                sscanf(val.c_str(), "%d", &appparam->VResolu);  
            } else if (name=="vid_bit_rate") { 
                sscanf(val.c_str(), "%d", &appparam->VidBitRate);  
            } else if (name=="vid_vbv_buffer_size") { 
                sscanf(val.c_str(), "%d", &appparam->VBVSize); 
            } else if (name=="vid_video_format") { 
                sscanf(val.c_str(), "%d", &appparam->VidFmt);  
            } else if (name=="vid_stream_type") { 
                sscanf(val.c_str(), "%d", &appparam->VidMpeg);  
            } else if (name=="aud_sampling_rate") { 
                sscanf(val.c_str(), "%d", &appparam->AudSamRate);  
            } else if (name=="aud_bit_rate") { 
                sscanf(val.c_str(), "%d", &appparam->AudBitRate); 
            } else if (name=="aud_mode") { 
                 sscanf(val.c_str(), "%d", &appparam->AudChnMode); 
            } else { 
                continue; 
            } 
        } else { 
            if (name=="video_horizontal_size") { 
                sscanf(val.c_str(), "%d", &appparam->HResolu);  
            } else if (name=="video_vertical_size") { 
                sscanf(val.c_str(), "%d", &appparam->VResolu);  
            } else if (name=="video_bit_rate") { 
                sscanf(val.c_str(), "%d", &appparam->VidBitRate);  
            } else if (name=="video_vbv_buffer_size") { 
                sscanf(val.c_str(), "%d", &appparam->VBVSize); 
            } else if (name=="vid_video_format") { 
                sscanf(val.c_str(), "%d", &appparam->VidFmt);  
            } else if (name=="mux_mpeg_coding_standard") { 
                sscanf(val.c_str(), "%d", &appparam->VidMpeg);  
            } else if (name=="audio_sampling_rate") { 
                sscanf(val.c_str(), "%d", &appparam->AudSamRate);  
            } else if (name=="audio_bit_rate") { 
                sscanf(val.c_str(), "%d", &appparam->AudBitRate); 
            } else if (name=="audio_channel") { 
                 sscanf(val.c_str(), "%d", &appparam->AudChnMode); 
            } else { 
                continue; 
            } 
        } 
    } 
     
    if (fclose(file)!=0) printf("Cannot close file\n"); 
 
    return SUCCESS; 
} 
 
/** parse a given com config file */ 
int API_ParseComConfigFile(const char* filename, ComConfigStruct *pParam) { 
    printf("++API_ParseComConfigFile()\n"); 
	 
    FILE *file = fopen(filename, "r");	// open the config file 
    if (file==NULL) { 
  	printf("Cannot find com config file: %s\n",filename); 
	return FAILURE; 
    } 
	 
    ComConfigStruct *appparam = NULL; 
    appparam = pParam; 
 
    string line, name,val,valTemp1,valTemp2; 
    char lineTemp[8*1024]; 
 
    // read the file content line by line 
    // fgets() return when encounter enter 
    while (fgets(lineTemp, sizeof(lineTemp), file)!=NULL) { 
 
        if (lineTemp[strlen(lineTemp)-1]=='\n') lineTemp[strlen(lineTemp)-1] = '\0'; 
 
	// string class: add "using namespace std" and include  
	// member func: swap(),erase(),insert(),clear(),replace()... 
        line.erase(); // clear character string 
        line.insert(0, lineTemp); // insert character string on position index 0 
 
	// find function returns the index. If nothing's found, string::npos returned 
        if (line.find_first_not_of(" \t\n\r")==string::npos) continue; // skip ahead if line is empty 
         
        if (line[0]=='#') continue; // skip ahead if the line is a comment 
         
        API_ParseEntry(line,name,val);	// use line informaton to splits up name and value 
 
        if (name=="com1_baud_rate") { 
            sscanf(val.c_str(), "%d", &appparam->COM1.BaudRate); 
        } else if (name=="com1_parity_type") { 
             sscanf(val.c_str(), "%c", &appparam->COM1.ParityType);  
        } else if (name=="com1_data_bit") { 
            sscanf(val.c_str(), "%d", &appparam->COM1.DataBitLen); 
        } else if (name=="com1_stop_bit") { 
            sscanf(val.c_str(), "%d", &appparam->COM1.StopBitLen); 
        } else if (name=="com1_hard_flow_ctrl") { 
            appparam->COM1.bHardFlowCtrl=(val=="TRUE") || (val=="true"); 
        } else if (name=="com1_soft_flow_ctrl") { 
            appparam->COM1.bSoftFlowCtrl=(val=="TRUE") || (val=="true"); 
        } else if (name=="com2_baud_rate") { 
            sscanf(val.c_str(), "%d", &appparam->COM2.BaudRate); 
        } else if (name=="com2_parity_type") { 
             sscanf(val.c_str(), "%c", &appparam->COM2.ParityType);  
        } else if (name=="com2_data_bit") { 
            sscanf(val.c_str(), "%d", &appparam->COM2.DataBitLen); 
        } else if (name=="com2_stop_bit") { 
            sscanf(val.c_str(), "%d", &appparam->COM2.StopBitLen); 
        } else if (name=="com2_hard_flow_ctrl") { 
            appparam->COM2.bHardFlowCtrl=(val=="TRUE") || (val=="true"); 
        } else if (name=="com2_soft_flow_ctrl") { 
            appparam->COM2.bSoftFlowCtrl=(val=="TRUE") || (val=="true"); 
        } else if (name=="local_alarm_com") { 
            sscanf(val.c_str(), "%d", &appparam->LocalAlarmCom); 
        } else if (name=="com_remote_address") { 
	    API_ParseColon (val,appparam->ComRemoteAddr.sIP,appparam->ComRemoteAddr.nPort); 
        } else { 
        	continue; 
        } 
    } 
     
    if (fclose(file)!=0) printf("Cannot close com config file\n"); 
 
    return SUCCESS; 
} 
/** get config info from config.ini 
 @pParam = pointer to Struct 
 @returen SUCCESS or FAILURE 
*/ 
int CODEC_GetDevParam (LPVOID pParam) { 
    printf("++CODEC_GetDevParam()\n"); 
 
    DevParamStruct *dev_param = (DevParamStruct *)pParam; 
    ConfigParamStruct cfg_param; 
    CodecParamStruct  codec_param; 
    ComConfigStruct   com_cfg; 
 
    int reval; 
    // initialization 
    API_InitDevParamStruct(dev_param); 
    API_InitConfigParamStruct(&cfg_param); 
    API_InitCodecParamStruct(&codec_param); 
    API_InitComConfigStruct(&com_cfg); 
 
    // get config param 
    reval = API_ParseConfigFile("./conf/config.ini", &cfg_param); 
    if(reval == FAILURE) { 
        printf("parse config file error, quiting...\n"); 
        return FAILURE; 
    } 
 
    // get codec param 
    _MEDIA_TYPE_ media_type; 
    char filename[MAX_FILE_NAME_LEN]; 
    media_type = cfg_param.MediaType; 
    if (MEDIA_VES == media_type) { 
        strcpy(filename,"./conf/codec_es.ini"); 
    } else if (MEDIA_PS == media_type) { 
        strcpy(filename,"./conf/codec_ps.ini"); 
    } else if (MEDIA_TS == media_type) { 
        strcpy(filename,"./conf/codec_ts.ini"); 
    } else { 
        printf("CODEC_GetDevParam(): check media type unmatch\n"); 
        return FAILURE; 
    } 
    reval = API_ParseCodecFile(filename, &codec_param); 
    if(reval == FAILURE) { 
        printf("parse codec file error, quiting...\n"); 
        return FAILURE; 
    } 
 
    // get com config param 
    reval = API_ParseComConfigFile("./conf/config.ini", &com_cfg); 
    if(reval == FAILURE) { 
        printf("parse com config file error, quiting...\n"); 
        return FAILURE; 
    } 
 
    // get device param 
    // config param 
    dev_param->DevType    = cfg_param.DevType; 
    dev_param->DevID      = cfg_param.DevID; 
    dev_param->MediaType  = cfg_param.MediaType; 
    dev_param->TransProto = cfg_param.TransProto; 
    strcpy(dev_param->local_network_ipaddr ,cfg_param.local_network_ipaddr); 
    strcpy(dev_param->local_network_mask   ,cfg_param.local_network_mask); 
    strcpy(dev_param->local_network_gateway,cfg_param.local_network_gateway); 
    dev_param->my_port              = cfg_param.my_port; 
    memcpy(&(dev_param->server_address), (char *)&(cfg_param.server_address),sizeof(Net_Addr)); 
    strcpy(dev_param->control_ipaddr, cfg_param.control_ipaddr); 
    dev_param->doMulticast          = cfg_param.doMulticast; 
    memcpy(&(dev_param->multicast_address), (char *)&(cfg_param.multicast_address),sizeof(Net_Addr)); 
    dev_param->doNetSend            = cfg_param.doNetSend; 
    dev_param->iSendNum             = cfg_param.iSendNum; 
    memcpy(&(dev_param->send_target_list), (char *)&(cfg_param.send_target_list), sizeof(cfg_param.send_target_list)); 
    dev_param->doFileWrite          = cfg_param.doFileWrite; 
    // video/audio param 
    dev_param->HResolu    = codec_param.HResolu; 
    dev_param->VResolu    = codec_param.VResolu; 
    dev_param->VidBitRate = codec_param.VidBitRate; 
    dev_param->VBVSize    = codec_param.VBVSize; 
    dev_param->VidFmt     = codec_param.VidFmt; 
    dev_param->VidMpeg    = codec_param.VidMpeg; 
    dev_param->AudSamRate = codec_param.AudSamRate; 
    dev_param->AudBitRate = codec_param.AudBitRate; 
    dev_param->AudChnMode = codec_param.AudChnMode; 
    // com config param 
    dev_param->com1_baud_rate   = com_cfg.COM1.BaudRate; 
    dev_param->com1_parity_type = com_cfg.COM1.ParityType; 
    dev_param->com1_data_bit    = com_cfg.COM1.DataBitLen; 
    dev_param->com1_stop_bit    = com_cfg.COM1.StopBitLen; 
    dev_param->com2_baud_rate   = com_cfg.COM2.BaudRate; 
    dev_param->com2_parity_type = com_cfg.COM2.ParityType; 
    dev_param->com2_data_bit    = com_cfg.COM2.DataBitLen; 
    dev_param->com2_stop_bit    = com_cfg.COM2.StopBitLen; 
    dev_param->local_alarm_com  = com_cfg.LocalAlarmCom; 
    memcpy(&(dev_param->com_remote_address), (char *)&(com_cfg.ComRemoteAddr), sizeof(Net_Addr)); 
 
    return SUCCESS; 
} 
 
#endif