shithub: openh264

Download patch

ref: 5b38a94c9ad9e0a192192a1f855191b4af79ee2c
parent: 758e89208eb59e08652134586425d790f59d7880
author: ruil2 <karinali2012@gmail.com>
date: Tue May 13 05:50:48 EDT 2014

cleanup encoder console app

--- a/codec/console/enc/src/welsenc.cpp
+++ b/codec/console/enc/src/welsenc.cpp
@@ -312,85 +312,6 @@
   return iRet;
 }
 
-int ParseCommandLine (int argc, char** argv, SEncParamExt& sParam) {
-  char* pCmd;
-  int i = 0;
-
-  while (i < argc) {
-    pCmd = argv[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.uiIntraPeriod = atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-nalsize") && (i < argc))
-      sParam.uiMaxNalSize = 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, "-fs") && (i < argc))
-      sParam.bEnableFrameSkip = atoi (argv[i++]) ? true : false;
-
-    else if (!strcmp (pCmd, "-ltr") && (i < argc))
-      sParam.bEnableLongTermReference = atoi (argv[i++]) ? true : false;
-
-    else if (!strcmp (pCmd, "-ltrnum") && (i < argc))
-      sParam.iLTRRefNum = atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-ltrper") && (i < argc))
-      sParam.iLtrMarkPeriod = atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-threadIdc") && (i < argc))
-      sParam.iMultipleThreadIdc= atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-deblockIdc") && (i < argc))
-      sParam.iLoopFilterDisableIdc = atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-alphaOffset") && (i < argc))
-      sParam.iLoopFilterAlphaC0Offset = atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-betaOffset") && (i < argc))
-      sParam.iLoopFilterBetaOffset = atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-rcm") && (i < argc))
-      sParam.iRCMode = (RC_MODES) atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-tarb") && (i < argc))
-      sParam.iTargetBitrate = 1000*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))
-      g_LevelSetting = atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-dw") && (i < argc))
-      sParam.iPicWidth = atoi (argv[i++]);
-
-    else if (!strcmp (pCmd, "-dh") && (i < argc))
-      sParam.iPicHeight = atoi (argv[i++]);
-  }
-
-  return 0;
-}
-
 void PrintHelp() {
   printf ("\n Wels SVC Encoder Usage:\n\n");
   printf (" Syntax: welsenc.exe -h\n");
@@ -421,6 +342,7 @@
   printf ("  -tarb	  Overall target bitrate\n");
   printf ("  -numl   Number Of Layers: Must exist with layer_cfg file and the number of input layer_cfg file must equal to the value set by this command\n");
   printf ("  The options below are layer-based: (need to be set with layer id)\n");
+  printf ("  -lconfig (Layer) (spatial layer configure file)\n");
   printf ("  -drec		(Layer) (reconstruction file);example: -drec 0 rec.yuv.  Setting the reconstruction file, this will only functioning when dumping reconstruction is enabled\n");
   printf ("  -dw		(Layer) (output width)\n");
   printf ("  -dh		(Layer) (output height)\n");
@@ -517,17 +439,14 @@
 
     else if (!strcmp (pCommand, "-numl") && (n < argc)) {
       pSvcParam.iSpatialLayerNum = atoi (argv[n++]);
-      for (int ln = 0 ; (ln < pSvcParam.iSpatialLayerNum) && (n < argc) ; ln++) {
-//				pSvcParam.sDependencyLayers[ln].uiDependencyId = ln;
-        sFileSet.strLayerCfgFile[ln].assign (argv[n++]);
+    }
+    else if (!strcmp (pCommand, "-lconfig") && (n < argc)) {
+      unsigned int	iLayer = atoi (argv[n++]);
+      sFileSet.strLayerCfgFile[iLayer].assign (argv[n++]);
+      CReadConfig cRdLayerCfg (sFileSet.strLayerCfgFile[iLayer]);
+      if (-1 == ParseLayerConfig (cRdLayerCfg, iLayer, pSvcParam, sFileSet)) {
+        return 1;
       }
-
-      for (int8_t iLayer = 0; iLayer < pSvcParam.iSpatialLayerNum; ++ iLayer) {
-        CReadConfig cRdLayerCfg (sFileSet.strLayerCfgFile[iLayer]);
-        if (-1 == ParseLayerConfig (cRdLayerCfg, iLayer, pSvcParam, sFileSet)) {
-          return 1;
-        }
-      }
     } else if (!strcmp (pCommand, "-drec") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       const unsigned int iLen = strlen (argv[n]);
@@ -632,9 +551,10 @@
   sParam.iInputCsp			= videoFormatI420;			// color space of input sequence
   sParam.uiIntraPeriod		= 320;		// period of Intra frame
   sParam.bEnableSpsPpsIdAddition = 1;
-  sParam.bPrefixNalAddingCtrl = 1;
+  sParam.bPrefixNalAddingCtrl = 0;
 
   int iIndexLayer = 0;
+  sParam.sSpatialLayers[iIndexLayer].uiProfileIdc	= PRO_BASELINE;
   sParam.sSpatialLayers[iIndexLayer].iVideoWidth	= 160;
   sParam.sSpatialLayers[iIndexLayer].iVideoHeight	= 90;
   sParam.sSpatialLayers[iIndexLayer].fFrameRate	= 7.5f;
@@ -642,6 +562,7 @@
   sParam.sSpatialLayers[iIndexLayer].sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
 
   ++ iIndexLayer;
+  sParam.sSpatialLayers[iIndexLayer].uiProfileIdc	= PRO_SCALABLE_BASELINE;
   sParam.sSpatialLayers[iIndexLayer].iVideoWidth	= 320;
   sParam.sSpatialLayers[iIndexLayer].iVideoHeight	= 180;
   sParam.sSpatialLayers[iIndexLayer].fFrameRate	= 15.0f;
@@ -649,6 +570,7 @@
   sParam.sSpatialLayers[iIndexLayer].sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
 
   ++ iIndexLayer;
+  sParam.sSpatialLayers[iIndexLayer].uiProfileIdc	= PRO_SCALABLE_BASELINE;
   sParam.sSpatialLayers[iIndexLayer].iVideoWidth	= 640;
   sParam.sSpatialLayers[iIndexLayer].iVideoHeight	= 360;
   sParam.sSpatialLayers[iIndexLayer].fFrameRate	= 30.0f;
@@ -657,6 +579,7 @@
   sParam.sSpatialLayers[iIndexLayer].sSliceCfg.sSliceArgument.uiSliceNum = 1;
 
   ++ iIndexLayer;
+  sParam.sSpatialLayers[iIndexLayer].uiProfileIdc	= PRO_SCALABLE_BASELINE;
   sParam.sSpatialLayers[iIndexLayer].iVideoWidth	= 1280;
   sParam.sSpatialLayers[iIndexLayer].iVideoHeight	= 720;
   sParam.sSpatialLayers[iIndexLayer].fFrameRate	= 30.0f;
@@ -674,174 +597,7 @@
   return 0;
 }
 
-/* For SVC Demo test */
-int ProcessEncodingSvcWithParam (ISVCEncoder* pPtrEnc, int argc, char** argv) {
-  const char* kpSrcFile = argv[1];
-  const char* kpStrBsFile = argv[2];
-
-  if (pPtrEnc == NULL || kpSrcFile == NULL || kpStrBsFile == NULL)
-    return 1;
-
-  FILE* pFpBs = NULL;
-  FILE* pFpSrc = NULL;
-  SFrameBSInfo sFbi;
-  SEncParamExt sSvcParam;
-  int64_t iStart = 0, iTotal = 0;
-  int32_t ret = 0;
-
-  int32_t iPicLumaSize = 0;
-  int32_t iFrameSize = 0;
-  uint8_t* pPlanes[3] = { 0 };
-  int32_t iFrame = 0;
-  SSourcePicture* pSrcPic = NULL;
-#if defined ( STICK_STREAM_SIZE )
-  FILE* fTrackStream = fopen ("coding_size.stream", "wb");;
-#endif
-
-  pFpSrc	= fopen (kpSrcFile, "rb");
-  if (NULL == pFpSrc)
-    return 1;
-  pFpBs	= fopen (kpStrBsFile, "wb");
-  if (NULL == pFpBs) {
-    fclose (pFpSrc);
-    pFpSrc = NULL;
-    return 1;
-  }
-
-  memset (&sFbi, 0, sizeof (SFrameBSInfo));
-  memset (&sSvcParam, 0, sizeof (SEncParamExt));
-
-  FillSpecificParameters (sSvcParam);
-
-  int iParsedNum = 3;
-  if (ParseCommandLine (argc - iParsedNum, argv + iParsedNum, sSvcParam) != 0) {
-    printf ("parse pCommand line failed\n");
-    ret = 1;
-    goto ERROR_RET;
-  }
-  pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &g_LevelSetting);
-  if (cmResultSuccess != pPtrEnc->InitializeExt (&sSvcParam)) {
-    fprintf (stderr, "Encoder Initialization failed!\n");
-    ret = 1;
-    goto ERROR_RET;
-  }
-  iPicLumaSize = sSvcParam.iPicWidth * sSvcParam.iPicHeight;
-  switch (sSvcParam.iInputCsp) {
-    int iStride;
-  case videoFormatI420:
-  case videoFormatYV12:
-    iFrameSize  = (3 * iPicLumaSize) >> 1;
-    pPlanes[0]	= new uint8_t[iFrameSize];
-    pPlanes[1]	= pPlanes[0] + iPicLumaSize;
-    pPlanes[2]	= pPlanes[1]	+ (iPicLumaSize >> 2);
-    break;
-  case videoFormatYUY2:
-  case videoFormatYVYU:
-  case videoFormatUYVY:
-    iStride      = CALC_BI_STRIDE (sSvcParam.iPicWidth,  16);
-    iFrameSize  = iStride * sSvcParam.iPicHeight;
-    pPlanes[0]   = new uint8_t[iFrameSize];
-    break;
-  case videoFormatRGB:
-  case videoFormatBGR:
-    iStride      = CALC_BI_STRIDE (sSvcParam.iPicWidth,  24);
-    iFrameSize  = iStride * sSvcParam.iPicHeight;
-    pPlanes[0]	= new uint8_t[iFrameSize];
-    break;
-  case videoFormatBGRA:
-  case videoFormatRGBA:
-  case videoFormatARGB:
-  case videoFormatABGR:
-    iStride = 4 * sSvcParam.iPicWidth;
-    iFrameSize  = iStride * sSvcParam.iPicHeight;
-    pPlanes[0]	= new uint8_t[iFrameSize];
-    break;
-  default:
-    ret = 1;
-    goto ERROR_RET;
-  }
-
-  pSrcPic = new SSourcePicture;
-  if (pSrcPic == NULL) {
-    ret = 1;
-    goto ERROR_RET;
-  }
-
-  pSrcPic->iColorFormat = sSvcParam.iInputCsp;
-  pSrcPic->iPicHeight = sSvcParam.iPicHeight;
-  pSrcPic->iPicWidth = sSvcParam.iPicWidth;
-  pSrcPic->iStride[0] = sSvcParam.iPicWidth;
-  pSrcPic->iStride[1] = pSrcPic->iStride[2] = sSvcParam.iPicWidth >> 1;
-
-  pSrcPic->pData[0] = pPlanes[0];
-  pSrcPic->pData[1] = pSrcPic->pData[0] + (sSvcParam.iPicWidth * sSvcParam.iPicHeight);
-  pSrcPic->pData[2] = pSrcPic->pData[1] + (sSvcParam.iPicWidth * sSvcParam.iPicHeight >> 2);
-
-  while (true) {
-    if (feof (pFpSrc))
-      break;
-#ifdef ONLY_ENC_FRAMES_NUM
-    if (iFrame >= ONLY_ENC_FRAMES_NUM)
-      break;
-#endif//ONLY_ENC_FRAMES_NUM
-    if (fread (pPlanes[0], sizeof (uint8_t), iFrameSize, pFpSrc) <= 0)
-      break;
-
-    iStart	= WelsTime();
-    long iEncode = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
-    iTotal += WelsTime() - iStart;
-    if (cmResultSuccess != iEncode) {
-      fprintf (stderr, "EncodeFrame() failed: %ld.\n", iEncode);
-      break;
-    }
-
-    /* Write bit-stream */
-    if (pFpBs != NULL && videoFrameTypeSkip != sFbi.eOutputFrameType) {	// file handler to write bit stream
-      int iLayer = 0;
-      while (iLayer < sFbi.iLayerNum) {
-        SLayerBSInfo* pLayerBsInfo = &sFbi.sLayerInfo[iLayer];
-        if (pLayerBsInfo != NULL) {
-          int iLayerSize = 0;
-          int iNalIdx = pLayerBsInfo->iNalCount - 1;
-          do {
-            iLayerSize += pLayerBsInfo->iNalLengthInByte[iNalIdx];
-            -- iNalIdx;
-          } while (iNalIdx >= 0);
-          fwrite (pLayerBsInfo->pBsBuf, 1, iLayerSize, pFpBs);	// write pure bit stream into file
-        }
-        ++ iLayer;
-      }
-      ++ iFrame;
-    }
-  }
-
-  if (iFrame > 0) {
-    double dElapsed = iTotal / 1e6;
-    printf ("Frames:		%d\nencode time:	%f sec\nFPS:		%f fps\n", iFrame, dElapsed, (iFrame * 1.0) / dElapsed);
-  }
-
-  if (NULL != pPlanes[0]) {
-    delete [] pPlanes[0];
-    pPlanes[0] = NULL;
-  }
-ERROR_RET:
-  if (pFpBs) {
-    fclose (pFpBs);
-    pFpBs = NULL;
-  }
-  if (pFpSrc) {
-    fclose (pFpSrc);
-    pFpSrc = NULL;
-  }
-  if (pSrcPic) {
-    delete pSrcPic;
-    pSrcPic = NULL;
-  }
-  return ret;
-}
-
-
-int ProcessEncodingSvcWithConfig (ISVCEncoder* pPtrEnc, int argc, char** argv) {
+int ProcessEncoding(ISVCEncoder* pPtrEnc, int argc, char** argv,bool bConfigFile) {
   int iRet				= 0;
 
   if (pPtrEnc == NULL)
@@ -871,24 +627,31 @@
   SFilesSet fs;
   // for configuration file
   CReadConfig cRdCfg;
-  int iParsedNum = 2;
+  int iParsedNum = 1;
 
   memset (&sFbi, 0, sizeof (SFrameBSInfo));
   memset (&sSvcParam, 0, sizeof (SEncParamExt));
   memset (&fs.sRecFileName[0][0], 0, sizeof (fs.sRecFileName));
-  sSvcParam.iInputCsp	= videoFormatI420;	// I420 in default
-  sSvcParam.sSpatialLayers[0].uiProfileIdc	= PRO_BASELINE;
-//	svc_cfg->sDependencyLayers[0].frext_mode	= 0;
 
-  // for configuration file
-  cRdCfg.Openf (argv[1]);
-  if (!cRdCfg.ExistFile()) {
-    fprintf (stderr, "Specified file: %s not exist, maybe invalid path or parameter settting.\n",
-             cRdCfg.GetFileName().c_str());
-    iRet = 1;
-    goto INSIDE_MEM_FREE;
-  }
+  FillSpecificParameters (sSvcParam);
 
+  // if configure file exit, reading configure file firstly
+  if(bConfigFile){
+    iParsedNum = 2;
+    cRdCfg.Openf (argv[1]);
+    if (!cRdCfg.ExistFile()) {
+      fprintf (stderr, "Specified file: %s not exist, maybe invalid path or parameter settting.\n",
+               cRdCfg.GetFileName().c_str());
+      iRet = 1;
+      goto INSIDE_MEM_FREE;
+    }
+    iRet = ParseConfig (cRdCfg, pSrcPic, sSvcParam, fs);
+    if (iRet) {
+      fprintf (stderr, "parse svc parameter config file failed.\n");
+      iRet = 1;
+      goto INSIDE_MEM_FREE;
+    }
+  }
   pSrcPic = new SSourcePicture;
   if (pSrcPic == NULL) {
     iRet = 1;
@@ -897,19 +660,29 @@
   //fill default pSrcPic
   pSrcPic->iColorFormat = videoFormatI420;
   pSrcPic->uiTimeStamp = 0;
-  iRet = ParseConfig (cRdCfg, pSrcPic, sSvcParam, fs);
-  if (iRet) {
-    fprintf (stderr, "parse svc parameter config file failed.\n");
-    iRet = 1;
-    goto INSIDE_MEM_FREE;
-  }
 
+  // if configure file exit, reading configure file firstly
+  if(bConfigFile){
+    iParsedNum = 2;
+    cRdCfg.Openf (argv[1]);
+    if (!cRdCfg.ExistFile()) {
+      fprintf (stderr, "Specified file: %s not exist, maybe invalid path or parameter settting.\n",
+               cRdCfg.GetFileName().c_str());
+      iRet = 1;
+      goto INSIDE_MEM_FREE;
+    }
+    iRet = ParseConfig (cRdCfg, pSrcPic, sSvcParam, fs);
+    if (iRet) {
+      fprintf (stderr, "parse svc parameter config file failed.\n");
+      iRet = 1;
+      goto INSIDE_MEM_FREE;
+    }
+  }
   if (ParseCommandLine (argc - iParsedNum, argv + iParsedNum, pSrcPic, sSvcParam, fs) != 0) {
     printf ("parse pCommand line failed\n");
     iRet = 1;
     goto INSIDE_MEM_FREE;
   }
-
   //finish reading the configurations
   iSourceWidth = pSrcPic->iPicWidth;
   iSourceHeight = pSrcPic->iPicHeight;
@@ -930,6 +703,8 @@
   pSrcPic->pData[2] = pSrcPic->pData[1] + (iSourceWidth * iSourceHeight >> 2);
 
   //update sSvcParam
+  sSvcParam.iPicWidth = 0;
+  sSvcParam.iPicHeight = 0;
   for (int iLayer = 0; iLayer < sSvcParam.iSpatialLayerNum; iLayer++) {
     SSpatialLayerConfig* pDLayer = &sSvcParam.sSpatialLayers[iLayer];
     sSvcParam.iPicWidth = WELS_MAX (sSvcParam.iPicWidth, pDLayer->iVideoWidth);
@@ -1176,7 +951,7 @@
   } else {
     if (!strstr (argv[1], ".cfg")) { // check configuration type (like .cfg?)
       if (argc > 2) {
-        iRet = ProcessEncodingSvcWithParam (pSVCEncoder, argc, argv);
+        iRet = ProcessEncoding(pSVCEncoder, argc, argv,false);
         if (iRet != 0)
           goto exit;
       } else if (argc == 2 && ! strcmp (argv[1], "-h"))
@@ -1186,7 +961,7 @@
         goto exit;
       }
     } else {
-      iRet = ProcessEncodingSvcWithConfig (pSVCEncoder, argc, argv);
+      iRet = ProcessEncoding(pSVCEncoder, argc, argv,true);
       if (iRet > 0)
         goto exit;
     }