📄 configfile.c
字号:
int IntContent; int i;// Stage one: Generate an argc/argv-type list in items[], without comments and whitespace.// This is context insensitive and could be done most easily with lex(1). while (p < bufend) { switch (*p) { case 13: p++; break; case '#': // Found comment *p = '\0'; // Replace '#' with '\0' in case of comment immediately following integer or string while (*p != '\n' && p < bufend) // Skip till EOL or EOF, whichever comes first p++; InString = 0; InItem = 0; break; case '\n': InItem = 0; InString = 0; *p++='\0'; break; case ' ': case '\t': // Skip whitespace, leave state unchanged if (InString) p++; else { // Terminate non-strings once whitespace is found *p++ = '\0'; InItem = 0; } break; case '"': // Begin/End of String *p++ = '\0'; if (!InString) { items[item++] = p; InItem = ~InItem; } else InItem = 0; InString = ~InString; // Toggle break; default: if (!InItem) { items[item++] = p; InItem = ~InItem; } p++; } } item--; for (i=0; i<item; i+= 3) { if (0 > (MapIdx = ParameterNameToMapIndex (items[i]))) { snprintf (errortext, ET_SIZE, " Parsing error in config file: Parameter Name '%s' not recognized.", items[i]); error (errortext, 300); } if (strcmp ("=", items[i+1])) { snprintf (errortext, ET_SIZE, " Parsing error in config file: '=' expected as the second token in each line."); error (errortext, 300); } // Now interprete the Value, context sensitive... switch (Map[MapIdx].Type) { case 0: // Numerical if (1 != sscanf (items[i+2], "%d", &IntContent)) { snprintf (errortext, ET_SIZE, " Parsing error: Expected numerical value for Parameter of %s, found '%s'.", items[i], items[i+2]); error (errortext, 300); } * (int *) (Map[MapIdx].Place) = IntContent; printf ("."); break; case 1: strcpy ((char *) Map[MapIdx].Place, items [i+2]); printf ("."); break; default: assert ("Unknown value type in the map definition of configfile.h"); } } memcpy (input, &configinput, sizeof (InputParameters)); PatchInp();}/*! *********************************************************************** * \brief * Returns the index number from Map[] for a given parameter name. * \param s * parameter name string * \return * the index number if the string is a valid parameter name, \n * -1 for error *********************************************************************** */static int ParameterNameToMapIndex (char *s){ int i = 0; while (Map[i].TokenName != NULL) if (0==strcmp (Map[i].TokenName, s)) return i; else i++; return -1;};/*! *********************************************************************** * \brief * Checks the input parameters for consistency. *********************************************************************** */static void PatchInp (){ // consistency check of QPs if (input->qp0 > 31 || input->qp0 < 0) { snprintf(errortext, ET_SIZE, "Error input parameter quant_0,check configuration file"); error (errortext, 400); } if (input->qpN > 31 || input->qpN < 0) { snprintf(errortext, ET_SIZE, "Error input parameter quant_n,check configuration file"); error (errortext, 400); } if (input->qpB > 31 || input->qpB < 0) { snprintf(errortext, ET_SIZE, "Error input parameter quant_B,check configuration file"); error (errortext, 400); } if (input->qpsp > 31 || input->qpsp < 0) { snprintf(errortext, ET_SIZE, "Error input parameter quant_sp,check configuration file"); error (errortext, 400); } if (input->qpsp_pred > 31 || input->qpsp_pred < 0) { snprintf(errortext, ET_SIZE, "Error input parameter quant_sp_pred,check configuration file"); error (errortext, 400); } if (input->sp_periodicity <0) { snprintf(errortext, ET_SIZE, "Error input parameter sp_periodicity,check configuration file"); error (errortext, 400); } // consistency check Search_range if (input->search_range > 39) // StW { snprintf(errortext, ET_SIZE, "Error in input parameter search_range, check configuration file"); error (errortext, 400); } // consistency check no_multpred if (input->no_multpred<1) input->no_multpred=1; // consistency check size information if (input->img_height % 16 != 0 || input->img_width % 16 != 0) { snprintf(errortext, ET_SIZE, "Unsupported image format x=%d,y=%d, must be a multiple of 16",input->img_width,input->img_height); error (errortext, 400); }#ifdef _LEAKYBUCKET_ // consistency check for Number of Leaky Bucket parameters if(input->NumberLeakyBuckets < 2 || input->NumberLeakyBuckets > 255) { snprintf(errortext, ET_SIZE, "Number of Leaky Buckets should be between 2 and 255 but is %d \n", input->NumberLeakyBuckets); error(errortext, 400); }#endif // Set block sizes // First, initialize input->blc_size to all zeros memset (input->blc_size,0, 4*8*2); // set individual items if (input->InterSearch16x16) { input->blc_size[1][0]=16; input->blc_size[1][1]=16; } if (input->InterSearch16x8) { input->blc_size[2][0]=16; input->blc_size[2][1]= 8; } if (input->InterSearch8x16) { input->blc_size[3][0]= 8; input->blc_size[3][1]=16; } if (input->InterSearch8x8) { input->blc_size[4][0]= 8; input->blc_size[4][1]= 8; } if (input->InterSearch8x4) { input->blc_size[5][0]= 8; input->blc_size[5][1]= 4; } if (input->InterSearch4x8) { input->blc_size[6][0]= 4; input->blc_size[6][1]= 8; } if (input->InterSearch4x4) { input->blc_size[7][0]= 4; input->blc_size[7][1]= 4; } if (input->partition_mode < 0 || input->partition_mode > 1) { snprintf(errortext, ET_SIZE, "Unsupported Partition mode, must be between 0 and 1"); error (errortext, 400); } if (input->of_mode < 0 || input->of_mode > 3) { snprintf(errortext, ET_SIZE, "Unsupported Outpout file mode, must be between 0 and 2"); error (errortext, 400); } // B picture consistency check if(input->successive_Bframe > input->jumpd) { snprintf(errortext, ET_SIZE, "Number of B-frames %d can not exceed the number of frames skipped", input->successive_Bframe); error (errortext, 400); } // Cabac/UVLC consistency check if (input->symbol_mode != UVLC && input->symbol_mode != CABAC) { snprintf (errortext, ET_SIZE, "Unsupported symbol mode=%d, use UVLC=0 or CABAC=1",input->symbol_mode); error (errortext, 400); } // Open Files#ifndef H26L_LIB if ((p_in=fopen(input->infile,"rb"))==NULL) { snprintf(errortext, ET_SIZE, "Input file %s does not exist",input->infile); error (errortext, 500); }#endif if (strlen (input->ReconFile) > 0 && (p_dec=fopen(input->ReconFile, "wb"))==NULL) { snprintf(errortext, ET_SIZE, "Error open file %s", input->ReconFile); error (errortext, 500); } if (strlen (input->TraceFile) > 0 && (p_trace=fopen(input->TraceFile,"w"))==NULL) { snprintf(errortext, ET_SIZE, "Error open file %s", input->TraceFile); error (errortext, 500); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -