shithub: openh264

Download patch

ref: 9b46788676e7adf2b26a652e73a416a972451b79
parent: e801b58bf8a91184b523658164aef31850efaa6f
parent: d43e91a8a6a63d855920edc7b9faf9aa49097caf
author: Ethan Hugg <ethanhugg@gmail.com>
date: Mon Jan 6 06:33:13 EST 2014

Merge pull request #85 from varunbpatil/safe_param_parse

Safe parsing of command line parameters in enc console app

--- a/codec/console/enc/src/welsenc.cpp
+++ b/codec/console/enc/src/welsenc.cpp
@@ -121,31 +121,22 @@
         continue;
       if (strTag[0].compare ("OutputFile") == 0) {
         sFileSet.strBsFile	= strTag[1];
-        continue;
       } else if (strTag[0].compare ("MaxFrameRate") == 0) {
         pSvcParam.fMaxFrameRate	= (float)atof (strTag[1].c_str());
-        continue;
       } else if (strTag[0].compare ("FramesToBeEncoded") == 0) {
         pSvcParam.uiFrameToBeCoded	= atoi (strTag[1].c_str());
-        continue;
       } else if (strTag[0].compare ("SourceSequenceInRGB24") == 0) {
         pSvcParam.iInputCsp	= atoi (strTag[1].c_str()) == 0 ? videoFormatI420 : videoFormatRGB;
-        continue;
       } else if (strTag[0].compare ("GOPSize") == 0) {
         pSvcParam.uiGopSize	= atoi (strTag[1].c_str());
-        continue;
       } else if (strTag[0].compare ("IntraPeriod") == 0) {
         pSvcParam.uiIntraPeriod	= atoi (strTag[1].c_str());
-        continue;
       } else if (strTag[0].compare ("EnableSpsPpsIDAddition") == 0) {
         pSvcParam.bEnableSpsPpsIdAddition	= atoi (strTag[1].c_str()) ? true : false;
-        continue;
       } else if (strTag[0].compare ("EnableScalableSEI") == 0) {
         pSvcParam.bEnableSSEI	= atoi (strTag[1].c_str()) ? true : false;
-        continue;
       } else if (strTag[0].compare ("EnableFrameCropping") == 0) {
         pSvcParam.bEnableFrameCroppingFlag = (atoi (strTag[1].c_str()) != 0);
-        continue;
       } else if (strTag[0].compare ("LoopFilterDisableIDC") == 0) {
         pSvcParam.iLoopFilterDisableIdc	= (int8_t)atoi (strTag[1].c_str());
         if (pSvcParam.iLoopFilterDisableIdc > 6 || pSvcParam.iLoopFilterDisableIdc < 0) {
@@ -153,7 +144,6 @@
           iRet = 1;
           break;
         }
-        continue;
       } else if (strTag[0].compare ("LoopFilterAlphaC0Offset") == 0) {
         pSvcParam.iLoopFilterAlphaC0Offset	= (int8_t)atoi (strTag[1].c_str());
         if (pSvcParam.iLoopFilterAlphaC0Offset < -6)
@@ -160,7 +150,6 @@
           pSvcParam.iLoopFilterAlphaC0Offset	= -6;
         else if (pSvcParam.iLoopFilterAlphaC0Offset > 6)
           pSvcParam.iLoopFilterAlphaC0Offset	= 6;
-        continue;
       } else if (strTag[0].compare ("LoopFilterBetaOffset") == 0) {
         pSvcParam.iLoopFilterBetaOffset	= (int8_t)atoi (strTag[1].c_str());
         if (pSvcParam.iLoopFilterBetaOffset < -6)
@@ -167,7 +156,6 @@
           pSvcParam.iLoopFilterBetaOffset	= -6;
         else if (pSvcParam.iLoopFilterBetaOffset > 6)
           pSvcParam.iLoopFilterBetaOffset	= 6;
-        continue;
       } else if (strTag[0].compare ("InterLayerLoopFilterDisableIDC") == 0) {
         pSvcParam.iInterLayerLoopFilterDisableIdc = (int8_t)atoi (strTag[1].c_str());
         if (pSvcParam.iInterLayerLoopFilterDisableIdc > 6 || pSvcParam.iInterLayerLoopFilterDisableIdc < 0) {
@@ -176,7 +164,6 @@
           iRet = 1;
           break;
         }
-        continue;
       } else if (strTag[0].compare ("InterLayerLoopFilterAlphaC0Offset") == 0) {
         pSvcParam.iInterLayerLoopFilterAlphaC0Offset	= (int8_t)atoi (strTag[1].c_str());
         if (pSvcParam.iInterLayerLoopFilterAlphaC0Offset < -6)
@@ -183,7 +170,6 @@
           pSvcParam.iInterLayerLoopFilterAlphaC0Offset	= -6;
         else if (pSvcParam.iInterLayerLoopFilterAlphaC0Offset > 6)
           pSvcParam.iInterLayerLoopFilterAlphaC0Offset	= 6;
-        continue;
       } else if (strTag[0].compare ("InterLayerLoopFilterBetaOffset") == 0) {
         pSvcParam.iInterLayerLoopFilterBetaOffset	= (int8_t)atoi (strTag[1].c_str());
         if (pSvcParam.iInterLayerLoopFilterBetaOffset < -6)
@@ -190,7 +176,6 @@
           pSvcParam.iInterLayerLoopFilterBetaOffset	= -6;
         else if (pSvcParam.iInterLayerLoopFilterBetaOffset > 6)
           pSvcParam.iInterLayerLoopFilterBetaOffset	= 6;
-        continue;
       } else if (strTag[0].compare ("MultipleThreadIdc") == 0) {
         // # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
         pSvcParam.iMultipleThreadIdc	= atoi (strTag[1].c_str());
@@ -198,13 +183,10 @@
           pSvcParam.iMultipleThreadIdc = 0;
         else if (pSvcParam.iMultipleThreadIdc > MAX_THREADS_NUM)
           pSvcParam.iMultipleThreadIdc = MAX_THREADS_NUM;
-        continue;
       } else if (strTag[0].compare ("EnableRC") == 0) {
         pSvcParam.bEnableRc	= atoi (strTag[1].c_str()) ? true : false;
-        continue;
       } else if (strTag[0].compare ("RCMode") == 0) {
         pSvcParam.iRCMode	= atoi (strTag[1].c_str());
-        continue;
       } else if (strTag[0].compare ("TargetBitrate") == 0) {
         pSvcParam.iTargetBitrate	= 1000 * atoi (strTag[1].c_str());
         if (pSvcParam.bEnableRc && pSvcParam.iTargetBitrate <= 0) {
@@ -214,25 +196,18 @@
         if (pSvcParam.bEnableRc) {
           iLeftTargetBitrate	= pSvcParam.iTargetBitrate;
         }
-        continue;
       } else if (strTag[0].compare ("EnableDenoise") == 0) {
         pSvcParam.bEnableDenoise	= atoi (strTag[1].c_str()) ? true : false;
-        continue;
       } else if (strTag[0].compare ("EnableSceneChangeDetection") == 0) {
         pSvcParam.bEnableSceneChangeDetect	= atoi (strTag[1].c_str()) ? true : false;
-        continue;
       } else if (strTag[0].compare ("EnableBackgroundDetection") == 0) {
         pSvcParam.bEnableBackgroundDetection	= atoi (strTag[1].c_str()) ? true : false;
-        continue;
       } else if (strTag[0].compare ("EnableAdaptiveQuantization") == 0) {
         pSvcParam.bEnableAdaptiveQuant	= atoi (strTag[1].c_str()) ? true : false;
-        continue;
       } else if (strTag[0].compare ("EnableLongTermReference") == 0) {
         pSvcParam.bEnableLongTermReference	= atoi (strTag[1].c_str()) ? true : false;
-        continue;
       } else if (strTag[0].compare ("LtrMarkPeriod") == 0) {
         pSvcParam.uiLtrMarkPeriod	= (uint32_t)atoi (strTag[1].c_str());
-        continue;
       } else if (strTag[0].compare ("NumLayers") == 0) {
         pSvcParam.iNumDependencyLayer	= (int8_t)atoi (strTag[1].c_str());
         if (pSvcParam.iNumDependencyLayer > MAX_DEPENDENCY_LAYER || pSvcParam.iNumDependencyLayer <= 0) {
@@ -240,13 +215,11 @@
           iRet = 1;
           break;
         }
-        continue;
       } else if (strTag[0].compare ("LayerCfg") == 0) {
         if (strTag[1].length() > 0)
           sFileSet.sSpatialLayers[iLayerCount].strLayerCfgFile	= strTag[1];
 //				pSvcParam.sDependencyLayers[iLayerCount].uiDependencyId	= iLayerCount;
         ++ iLayerCount;
-        continue;
       } else if (strTag[0].compare ("PrefixNALAddingCtrl") == 0) {
         int ctrl_flag = atoi (strTag[1].c_str());
         if (ctrl_flag > 1)
@@ -254,7 +227,6 @@
         else if (ctrl_flag < 0)
           ctrl_flag	= 0;
         pSvcParam.bPrefixNalAddingCtrl	= ctrl_flag ? true : false;
-        continue;
       }
     }
   }
@@ -291,21 +263,16 @@
         if (strTag[0].compare ("SourceWidth") == 0) {
           pDLayer->iFrameWidth	= atoi (strTag[1].c_str());
           pDLayer->iActualWidth = pDLayer->iFrameWidth;
-          continue;
         } else if (strTag[0].compare ("SourceHeight") == 0) {
           pDLayer->iFrameHeight	= atoi (strTag[1].c_str());
           pDLayer->iActualHeight	= pDLayer->iFrameHeight;
-          continue;
         } else if (strTag[0].compare ("FrameRateIn") == 0) {
           pDLayer->fInputFrameRate	= (float)atof (strTag[1].c_str());
-          continue;
         } else if (strTag[0].compare ("FrameRateOut") == 0) {
           pDLayer->fOutputFrameRate = (float)atof (strTag[1].c_str());
-          continue;
         } else if (strTag[0].compare ("InputFile") == 0) {
           if (strTag[1].length() > 0)
             sFileSet.sSpatialLayers[iLayer].strSeqFile	= strTag[1];
-          continue;
         } else if (strTag[0].compare ("ReconFile") == 0) {
           const int kiLen = strTag[1].length();
           if (kiLen >= MAX_FNAME_LEN)
@@ -314,16 +281,11 @@
           pDLayer->sRecFileName[kiLen] = '\0';
           strncpy (pDLayer->sRecFileName, strTag[1].c_str(), kiLen);	// confirmed_safe_unsafe_usage
 #endif//ENABLE_FRAME_DUMP
-          continue;
         } else if (strTag[0].compare ("ProfileIdc") == 0) {
           pDLayer->uiProfileIdc	= atoi (strTag[1].c_str());
-          continue;
         } else if (strTag[0].compare ("FRExt") == 0) {
 //					pDLayer->frext_mode	= (bool_t)atoi(strTag[1].c_str());
-          continue;
-        }
-
-        if (strTag[0].compare ("SpatialBitrate") == 0) {
+        } else if (strTag[0].compare ("SpatialBitrate") == 0) {
           pDLayer->iSpatialBitrate	= 1000 * atoi (strTag[1].c_str());
           if (pSvcParam.bEnableRc && pDLayer->iSpatialBitrate <= 0) {
             fprintf (stderr, "Invalid spatial bitrate(%d) in dependency layer #%d.\n", pDLayer->iSpatialBitrate, iLayer);
@@ -335,27 +297,20 @@
             return 1;
           }
           iLeftSpatialBitrate[iLayer]	= pDLayer->iSpatialBitrate;
-          continue;
-        }
-        if (strTag[0].compare ("InitialQP") == 0) {
+        } else if (strTag[0].compare ("InitialQP") == 0) {
           sLayerCtx.iDLayerQp	= atoi (strTag[1].c_str());
-          continue;
-        }
-        if (strTag[0].compare ("SliceMode") == 0) {
+        } else if (strTag[0].compare ("SliceMode") == 0) {
           sLayerCtx.sMso.uiSliceMode	= (SliceMode)atoi (strTag[1].c_str());
-          continue;
         } else if (strTag[0].compare ("SliceSize") == 0) { //SM_DYN_SLICE
           sLayerCtx.sMso.sSliceArgument.uiSliceSizeConstraint	= (SliceMode)atoi (strTag[1].c_str());
           continue;
         } else if (strTag[0].compare ("SliceNum") == 0) {
           sLayerCtx.sMso.sSliceArgument.iSliceNum = atoi (strTag[1].c_str());
-          continue;
         } else if (strTag[0].compare (0, kiSize, str_) == 0) {
           const char* kpString = strTag[0].c_str();
           int uiSliceIdx = atoi (&kpString[kiSize]);
           assert (uiSliceIdx < MAX_SLICES_NUM);
           sLayerCtx.sMso.sSliceArgument.uiSliceMbNum[uiSliceIdx] = atoi (strTag[1].c_str());
-          continue;
         }
       }
     }
@@ -374,76 +329,55 @@
   char* pCmd;
   int i = 0;
 
-  if (argc <= 0) // no additional pCmd parameters
-    return 0;
-
   while (i < argc) {
-    pCmd = argv[i];
+    pCmd = argv[i++];
 
-    if (!strcmp (pCmd, "-numl")) {	// confirmed_safe_unsafe_usage
-      int  iNumSpatial = atoi (argv[i + 1]);
-      sParam.iSpatialLayerNum = iNumSpatial;
-      i += 2;
-    } else if (!strcmp (pCmd, "-numt")) {	// confirmed_safe_unsafe_usage
-      int  iNumTemporal = atoi (argv[i + 1]);
-      sParam.iTemporalLayerNum = iNumTemporal;
-      i += 2;
-    } else if (!strcmp (pCmd, "-iper")) {	// confirmed_safe_unsafe_usage
-      int iPeriod = atoi (argv[i + 1]);
-      sParam.iIntraPeriod = iPeriod;
-      i += 2;
-    } else if (!strcmp (pCmd, "-spsid")) {	// confirmed_safe_unsafe_usage
-      int iSpsPpsId = atoi (argv[i + 1]);
-      sParam.bEnableSpsPpsIdAddition = iSpsPpsId ? true : false;
-      i += 2;
-    } else if (!strcmp (pCmd, "-denois")) {	// confirmed_safe_unsafe_usage
-      int iDenois = atoi (argv[i + 1]);
-      sParam.bEnableDenoise = iDenois ? true : false;
-      i += 2;
-    } else if (!strcmp (pCmd, "-bgd")) {	// confirmed_safe_unsafe_usage
-      int iBgd = atoi (argv[i + 1]);
-      sParam.bEnableBackgroundDetection = iBgd ? true : false;
-      i += 2;
-    } else if (!strcmp (pCmd, "-aq")) {	// confirmed_safe_unsafe_usage
-      int iAq = atoi (argv[i + 1]);
-      sParam.bEnableAdaptiveQuant = iAq ? true : false;
-      i += 2;
-    } else if (!strcmp (pCmd, "-ltr")) {	// confirmed_safe_unsafe_usage
-      int iLtr = atoi (argv[i + 1]);
-      sParam.bEnableLongTermReference = iLtr ? true : false;
-      i += 2;
-    } else if (!strcmp (pCmd, "-ltrper")) {	// confirmed_safe_unsafe_usage
-      int iLtrPer = atoi (argv[i + 1]);
-      sParam.iLtrMarkPeriod = iLtrPer;
-      i += 2;
-    } else if (!strcmp (pCmd, "-rcm")) {	// confirmed_safe_unsafe_usage
-      int iRcMode = atoi (argv[i + 1]);
-      sParam.iRCMode = iRcMode;
-      i += 2;
-    } else if (!strcmp (pCmd, "-tarb")) {	// confirmed_safe_unsafe_usage
-      int iTarB = atoi (argv[i + 1]);
-      sParam.iTargetBitrate = iTarB;
-      i += 2;
-    } else if (!strcmp (pCmd, "-ltarb")) {	// confirmed_safe_unsafe_usage
-      int	iLayer = atoi (argv[i + 1]);
-      int iSpatialBitrate = atoi (argv[i + 2]);
-      sParam.sSpatialLayers[iLayer].iSpatialBitrate	= iSpatialBitrate;
-      i += 3;
-    } else if (!strcmp (pCmd, "-trace")) {
-      int32_t iLog = atoi (argv[i + 1]);
-      WelsStderrSetTraceLevel (iLog);
-      i += 2;
-    } else if (!strcmp (pCmd, "-sw")) {
-      int iWidth = atoi (argv[i + 1]);
-      sParam.iPicWidth = iWidth;
-      i += 2;
-    } else if (!strcmp (pCmd, "-sh")) {
-      int iHeight = atoi (argv[i + 1]);
-      sParam.iPicHeight = iHeight;
-      i += 2;
-    } else {
-      i ++;
+    if (!strcmp (pCmd, "-numl") && (i < argc))
+      sParam.iSpatialLayerNum = atoi (argv[i++]);
+
+    else if (!strcmp (pCmd, "-numt") && (i < argc))
+      sParam.iTemporalLayerNum = atoi (argv[i++]);
+
+    else if (!strcmp (pCmd, "-iper") && (i < argc))
+      sParam.iIntraPeriod = atoi (argv[i++]);
+
+    else if (!strcmp (pCmd, "-spsid") && (i < argc))
+      sParam.bEnableSpsPpsIdAddition = atoi (argv[i++]) ? true : false;
+
+    else if (!strcmp (pCmd, "-denois") && (i < argc))
+      sParam.bEnableDenoise = atoi (argv[i++]) ? true : false;
+
+    else if (!strcmp (pCmd, "-bgd") && (i < argc))
+      sParam.bEnableBackgroundDetection = atoi (argv[i++]) ? true : false;
+
+    else if (!strcmp (pCmd, "-aq") && (i < argc))
+      sParam.bEnableAdaptiveQuant = atoi (argv[i++]) ? true : false;
+
+    else if (!strcmp (pCmd, "-ltr") && (i < argc))
+      sParam.bEnableLongTermReference = atoi (argv[i++]) ? true : false;
+
+    else if (!strcmp (pCmd, "-ltrper") && (i < argc))
+      sParam.iLtrMarkPeriod = atoi (argv[i++]);
+
+    else if (!strcmp (pCmd, "-rcm") && (i < argc))
+      sParam.iRCMode = atoi (argv[i++]);
+
+    else if (!strcmp (pCmd, "-tarb") && (i < argc))
+      sParam.iTargetBitrate = atoi (argv[i++]);
+
+    else if (!strcmp (pCmd, "-ltarb") && (i + 1 < argc)) {
+      int iLayer = atoi (argv[i++]);
+      sParam.sSpatialLayers[iLayer].iSpatialBitrate = atoi (argv[i++]);
     }
+
+    else if (!strcmp (pCmd, "-trace") && (i < argc))
+      WelsStderrSetTraceLevel (atoi (argv[i++]));
+
+    else if (!strcmp (pCmd, "-sw") && (i < argc))
+      sParam.iPicWidth = atoi (argv[i++]);
+
+    else if (!strcmp (pCmd, "-sh") && (i < argc))
+      sParam.iPicHeight = atoi (argv[i++]);
   }
 
   return 0;
@@ -484,91 +418,58 @@
 
 int ParseCommandLine (int argc, char** argv, SWelsSvcCodingParam& pSvcParam, SFilesSet& sFileSet) {
   char* pCommand = NULL;
-  char* pTemp = NULL;
-  unsigned int uiQpChangeFlag[4] = {0};
-  unsigned int uiQlPredModeChangeFlag[4] = {0};
   SLayerPEncCtx sLayerCtx[3];
   int n = 0;
   string str_ ("SlicesAssign");
   const int kiSize = str_.size();
 
-  if (argc <= 0) // no additional pCmd parameters
-    return 0;
-
   while (n < argc) {
     pCommand = argv[n++];
-    if (!strcmp (pCommand, "-bf")) {	// confirmed_safe_unsafe_usage
-      sFileSet.strBsFile.assign (argv[n]);
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-frms")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.uiFrameToBeCoded = atoi (argv[n ]);
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-gop")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.uiGopSize = atoi (argv[n ]);
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-iper")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.uiIntraPeriod = atoi (argv[n ]);
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-spsid")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.bEnableSpsPpsIdAddition = atoi (argv[n ]) ? true : false;
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-denois")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.bEnableDenoise = atoi (argv[n ]) ? true : false;
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-scene")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.bEnableSceneChangeDetect = atoi (argv[n ]) ? true : false;
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-bgd")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.bEnableBackgroundDetection = atoi (argv[n ]) ? true : false;
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-aq")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.bEnableAdaptiveQuant = atoi (argv[n ]) ? true : false;
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-ltr")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.bEnableLongTermReference = atoi (argv[n ]) ? true : false;
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-ltrper")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.uiLtrMarkPeriod = atoi (argv[n ]);
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-rc")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.bEnableRc = atoi (argv[n ]) ? true : false;
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-tarb")) {	// confirmed_safe_unsafe_usage
-      pSvcParam.iTargetBitrate = atoi (argv[n ]);
-      ++ n;
-      continue;
-    }
-    if (!strcmp (pCommand, "-numl")) {	// confirmed_safe_unsafe_usage
-      bool_t bFound = false;
+
+    if (!strcmp (pCommand, "-bf") && (n < argc))
+      sFileSet.strBsFile.assign (argv[n++]);
+
+    else if (!strcmp (pCommand, "-frms") && (n < argc))
+      pSvcParam.uiFrameToBeCoded = atoi (argv[n++]);
+
+    else if (!strcmp (pCommand, "-gop") && (n < argc))
+      pSvcParam.uiGopSize = atoi (argv[n++]);
+
+    else if (!strcmp (pCommand, "-iper") && (n < argc))
+      pSvcParam.uiIntraPeriod = atoi (argv[n++]);
+
+    else if (!strcmp (pCommand, "-spsid") && (n < argc))
+      pSvcParam.bEnableSpsPpsIdAddition = atoi (argv[n++]) ? true : false;
+
+    else if (!strcmp (pCommand, "-denois") && (n < argc))
+      pSvcParam.bEnableDenoise = atoi (argv[n++]) ? true : false;
+
+    else if (!strcmp (pCommand, "-scene") && (n < argc))
+      pSvcParam.bEnableSceneChangeDetect = atoi (argv[n++]) ? true : false;
+
+    else if (!strcmp (pCommand, "-bgd") && (n < argc))
+      pSvcParam.bEnableBackgroundDetection = atoi (argv[n++]) ? true : false;
+
+    else if (!strcmp (pCommand, "-aq") && (n < argc))
+      pSvcParam.bEnableAdaptiveQuant = atoi (argv[n++]) ? true : false;
+
+    else if (!strcmp (pCommand, "-ltr") && (n < argc))
+      pSvcParam.bEnableLongTermReference = atoi (argv[n++]) ? true : false;
+
+    else if (!strcmp (pCommand, "-ltrper") && (n < argc))
+      pSvcParam.uiLtrMarkPeriod = atoi (argv[n++]);
+
+    else if (!strcmp (pCommand, "-rc") && (n < argc))
+      pSvcParam.bEnableRc = atoi (argv[n++]) ? true : false;
+
+    else if (!strcmp (pCommand, "-tarb") && (n < argc))
+      pSvcParam.iTargetBitrate = atoi (argv[n++]);
+
+    else if (!strcmp (pCommand, "-numl") && (n < argc)) {
       pSvcParam.iNumDependencyLayer = atoi (argv[n++]);
-      for (int ln = 0 ; ln < pSvcParam.iNumDependencyLayer ; ln++) {
+      for (int ln = 0 ; (ln < pSvcParam.iNumDependencyLayer) && (n < argc) ; ln++) {
 //				pSvcParam.sDependencyLayers[ln].uiDependencyId = ln;
-        sFileSet.sSpatialLayers[ln].strLayerCfgFile.assign (argv[n]);
-        ++ n;
+        sFileSet.sSpatialLayers[ln].strLayerCfgFile.assign (argv[n++]);
       }
 
       for (int8_t iLayer = 0; iLayer < pSvcParam.iNumDependencyLayer; ++ iLayer) {
@@ -596,21 +497,16 @@
             if (strTag[0].compare ("SourceWidth") == 0) {
               pDLayer->iFrameWidth	= atoi (strTag[1].c_str());
               pDLayer->iActualWidth = pDLayer->iFrameWidth;
-              continue;
             } else if (strTag[0].compare ("SourceHeight") == 0) {
               pDLayer->iFrameHeight	= atoi (strTag[1].c_str());
               pDLayer->iActualHeight	= pDLayer->iFrameHeight;
-              continue;
             } else if (strTag[0].compare ("FrameRateIn") == 0) {
               pDLayer->fInputFrameRate	= (float)atof (strTag[1].c_str());
-              continue;
             } else if (strTag[0].compare ("FrameRateOut") == 0) {
               pDLayer->fOutputFrameRate = (float)atof (strTag[1].c_str());
-              continue;
             } else if (strTag[0].compare ("InputFile") == 0) {
               if (strTag[1].length() > 0)
                 sFileSet.sSpatialLayers[iLayer].strSeqFile = strTag[1];
-              continue;
             } else if (strTag[0].compare ("ReconFile") == 0) {
 #ifdef ENABLE_FRAME_DUMP
               const int kiLen = strTag[1].length();
@@ -619,39 +515,25 @@
               pDLayer->sRecFileName[kiLen] = '\0';
               strncpy (pDLayer->sRecFileName, strTag[1].c_str(), kiLen);	// confirmed_safe_unsafe_usage
 #endif//ENABLE_FRAME_DUMP
-              continue;
             } else if (strTag[0].compare ("ProfileIdc") == 0) {
               pDLayer->uiProfileIdc	= atoi (strTag[1].c_str());
-              continue;
             } else if (strTag[0].compare ("FRExt") == 0) {
 //							pDLayer->frext_mode	= (bool_t)atoi(strTag[1].c_str());
-              continue;
-            }
-            if (strTag[0].compare ("SpatialBitrate") == 0) {
+            } else if (strTag[0].compare ("SpatialBitrate") == 0) {
               pDLayer->iSpatialBitrate	= 1000 * atoi (strTag[1].c_str());
-              continue;
-            }
-
-            if (strTag[0].compare ("InitialQP") == 0) {
+            } else if (strTag[0].compare ("InitialQP") == 0) {
               sLayerCtx.iDLayerQp	= atoi (strTag[1].c_str());
-              continue;
-            }
-
-            if (strTag[0].compare ("SliceMode") == 0) {
+            } else if (strTag[0].compare ("SliceMode") == 0) {
               sLayerCtx.sMso.uiSliceMode	= (SliceMode)atoi (strTag[1].c_str());
-              continue;
             } else if (strTag[0].compare ("SliceSize") == 0) { //SM_DYN_SLICE
               sLayerCtx.sMso.sSliceArgument.uiSliceSizeConstraint	= (SliceMode)atoi (strTag[1].c_str());
-              continue;
             } else if (strTag[0].compare ("SliceNum") == 0) {
               sLayerCtx.sMso.sSliceArgument.iSliceNum = atoi (strTag[1].c_str());
-              continue;
             } else if (strTag[0].compare (0, kiSize, str_) == 0) {
               const char* kpString = strTag[0].c_str();
               int uiSliceIdx = atoi (&kpString[kiSize]);
               assert (uiSliceIdx < MAX_SLICES_NUM);
               sLayerCtx.sMso.sSliceArgument.uiSliceMbNum[uiSliceIdx] = atoi (strTag[1].c_str());
-              continue;
             }
           }
         }
@@ -662,80 +544,67 @@
                 sizeof (sLayerCtx.sMso.sSliceArgument.uiSliceMbNum));	// confirmed_safe_unsafe_usage
 
       }
-      //n += 1;
-      continue;
     }
-    if (!strcmp (pCommand, "-org")) {	// confirmed_safe_unsafe_usage
+
+    else if (!strcmp (pCommand, "-org") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
-      sFileSet.sSpatialLayers[iLayer].strSeqFile.assign (argv[n]);
-      ++ n;
-      continue;
+      sFileSet.sSpatialLayers[iLayer].strSeqFile.assign (argv[n++]);
     }
-    if (!strcmp (pCommand, "-drec")) {	// confirmed_safe_unsafe_usage
+
+    else if (!strcmp (pCommand, "-drec") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
-      const int iLen = strlen (argv[n]);	// confirmed_safe_unsafe_usage
+      const int iLen = strlen (argv[n]);
 #ifdef ENABLE_FRAME_DUMP
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
       pDLayer->sRecFileName[iLen] = '\0';
-      strncpy (pDLayer->sRecFileName, argv[n], iLen);	// confirmed_safe_unsafe_usage
+      strncpy (pDLayer->sRecFileName, argv[n++], iLen);	// confirmed_safe_unsafe_usage
 #endif//ENABLE_FRAME_DUMP
-      ++ n;
-      continue;
     }
-    if (!strcmp (pCommand, "-sw")) {	// confirmed_safe_unsafe_usage
+
+    else if (!strcmp (pCommand, "-sw") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      pDLayer->iFrameWidth =  atoi (argv[n ]);
+      pDLayer->iFrameWidth =  atoi (argv[n++]);
       pDLayer->iActualWidth = pDLayer->iFrameWidth;
-      ++ n;
-      continue;
     }
-    if (!strcmp (pCommand, "-sh")) {	// confirmed_safe_unsafe_usage
+
+    else if (!strcmp (pCommand, "-sh") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      pDLayer->iFrameHeight =  atoi (argv[n ]);
+      pDLayer->iFrameHeight =  atoi (argv[n++]);
       pDLayer->iActualHeight = pDLayer->iFrameHeight;
-      ++ n;
-      continue;
     }
-    if (!strcmp (pCommand, "-frin")) {	// confirmed_safe_unsafe_usage
+
+    else if (!strcmp (pCommand, "-frin") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      pDLayer->fInputFrameRate = (float)atof (argv[n ]);
-      ++ n;
-      continue;
+      pDLayer->fInputFrameRate = (float)atof (argv[n++]);
     }
-    if (!strcmp (pCommand, "-frout")) {	// confirmed_safe_unsafe_usage
+
+    else if (!strcmp (pCommand, "-frout") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      pDLayer->fOutputFrameRate = (float)atof (argv[n ]);
-      ++ n;
-      continue;
+      pDLayer->fOutputFrameRate = (float)atof (argv[n++]);
     }
 
-    if (!strcmp (pCommand, "-lqp")) {	// confirmed_safe_unsafe_usage
+    else if (!strcmp (pCommand, "-lqp") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      uiQpChangeFlag[iLayer] = 1;
-      pDLayer->iDLayerQp = sLayerCtx[iLayer].iDLayerQp =  atoi (argv[n ]);
-      n += 1;
-      continue;
+      pDLayer->iDLayerQp = sLayerCtx[iLayer].iDLayerQp =  atoi (argv[n++]);
     }
     //sLayerCtx[iLayer].num_quality_layers = pDLayer->num_quality_layers = 1;
 
-    if (!strcmp (pCommand, "-ltarb")) {	// confirmed_safe_unsafe_usage
+    else if (!strcmp (pCommand, "-ltarb") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      pDLayer->iSpatialBitrate	= 1000 * atoi (argv[n ]);
-      ++ n;
-      continue;
+      pDLayer->iSpatialBitrate	= 1000 * atoi (argv[n++]);
     }
 
-    if (!strcmp (pCommand, "-slcmd")) {	// confirmed_safe_unsafe_usage
+    else if (!strcmp (pCommand, "-slcmd") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
 
-      switch (atoi (argv[n])) {
+      switch (atoi (argv[n++])) {
       case 0:
         pDLayer->sMso.uiSliceMode = SM_SINGLE_SLICE;
         break;
@@ -755,22 +624,18 @@
         pDLayer->sMso.uiSliceMode = SM_RESERVED;
         break;
       }
-      ++ n;
-      continue;
     }
-    if (!strcmp (pCommand, "-slcsize")) { //confirmed_safe_unsafe_usage
+
+    else if (!strcmp (pCommand, "-slcsize") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      pDLayer->sMso.sSliceArgument.uiSliceSizeConstraint = atoi (argv[n ]);
-      ++ n;
-      continue;
+      pDLayer->sMso.sSliceArgument.uiSliceSizeConstraint = atoi (argv[n++]);
     }
-    if (!strcmp (pCommand, "-slcnum")) { // confirmed_safe_unsafe_usage
+
+    else if (!strcmp (pCommand, "-slcnum") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      pDLayer->sMso.sSliceArgument.iSliceNum = atoi (argv[n ]);
-      ++ n;
-      continue;
+      pDLayer->sMso.sSliceArgument.iSliceNum = atoi (argv[n++]);
     }
   }
   return 0;