shithub: openh264

Download patch

ref: ba02f113094c74a5ab5903138a1b3d03c4641724
parent: a4cecd80048e187033fc4ee084abb4d6c7a79e66
parent: b3c45946ffc0c125b34c5a307f88670981cec098
author: Licai Guo <[email protected]>
date: Fri Mar 7 11:35:47 EST 2014

Merge pull request #438 from ruil2/encoder_update

    dump file refactor

--- a/codec/api/svc/codec_app_def.h
+++ b/codec/api/svc/codec_app_def.h
@@ -89,7 +89,8 @@
   ENCODER_OPTION_ENABLE_PREFIX_NAL_ADDING,   //enable prefix: true--enable prefix; false--disable prefix
   ENCODER_OPTION_ENABLE_SPS_PPS_ID_ADDITION, //disable pSps/pPps id addition: true--disable pSps/pPps id; false--enable pSps/pPps id addistion
 
-  ENCODER_OPTION_CURRENT_PATH
+  ENCODER_OPTION_CURRENT_PATH,
+  ENCODER_OPTION_DUMP_FILE
 } ENCODER_OPTION;
 
 /* Option types introduced in decoder application */
@@ -295,5 +296,8 @@
   long long uiTimeStamp;
 } SSourcePicture;
 
-
+typedef struct Dump_Layer_s{
+	int iLayer;
+	char *pFileName;
+}SDumpLayer;
 #endif//WELS_VIDEO_CODEC_APPLICATION_DEFINITION_H__
--- a/codec/console/enc/inc/read_config.h
+++ b/codec/console/enc/inc/read_config.h
@@ -48,9 +48,8 @@
 typedef struct tagFilesSet {
   string strBsFile;
   string strSeqFile;	// for cmd lines
-  struct {
-    string strLayerCfgFile;
-  } sSpatialLayers[MAX_DEPENDENCY_LAYER];
+  string strLayerCfgFile[MAX_DEPENDENCY_LAYER];
+  char	 sRecFileName[MAX_DEPENDENCY_LAYER][MAX_FNAME_LEN];
 } SFilesSet;
 
 
--- a/codec/console/enc/src/welsenc.cpp
+++ b/codec/console/enc/src/welsenc.cpp
@@ -281,7 +281,7 @@
         }
       } else if (strTag[0].compare ("LayerCfg") == 0) {
         if (strTag[1].length() > 0)
-          sFileSet.sSpatialLayers[iLayerCount].strLayerCfgFile	= strTag[1];
+          sFileSet.strLayerCfgFile[iLayerCount]	= strTag[1];
 //				pSvcParam.sDependencyLayers[iLayerCount].uiDependencyId	= iLayerCount;
         ++ iLayerCount;
       } else if (strTag[0].compare ("PrefixNALAddingCtrl") == 0) {
@@ -305,7 +305,7 @@
 
   for (int8_t iLayer = 0; iLayer < kiActualLayerNum; ++ iLayer) {
     SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
-    CReadConfig cRdLayerCfg (sFileSet.sSpatialLayers[iLayer].strLayerCfgFile);
+    CReadConfig cRdLayerCfg (sFileSet.strLayerCfgFile[iLayer]);
     if (-1==ParseLayerConfig( cRdLayerCfg, iLayer, pSvcParam ))
     {
       iRet = 1;
@@ -477,11 +477,11 @@
       pSvcParam.iSpatialLayerNum = atoi (argv[n++]);
       for (int ln = 0 ; (ln < pSvcParam.iSpatialLayerNum) && (n < argc) ; ln++) {
 //				pSvcParam.sDependencyLayers[ln].uiDependencyId = ln;
-        sFileSet.sSpatialLayers[ln].strLayerCfgFile.assign (argv[n++]);
+        sFileSet.strLayerCfgFile[ln].assign (argv[n++]);
       }
 
       for (int8_t iLayer = 0; iLayer < pSvcParam.iSpatialLayerNum; ++ iLayer) {
-        CReadConfig cRdLayerCfg (sFileSet.sSpatialLayers[iLayer].strLayerCfgFile);
+        CReadConfig cRdLayerCfg (sFileSet.strLayerCfgFile[iLayer]);
         if (-1==ParseLayerConfig( cRdLayerCfg, iLayer, pSvcParam ))
         {
           return 1;
@@ -489,19 +489,13 @@
       }
     }
     else if (!strcmp (pCommand, "-drec") && (n + 1 < argc)) {
-#ifdef ENABLE_FRAME_DUMP
       unsigned int	iLayer = atoi (argv[n++]);
       const int iLen = strlen (argv[n]);
-      SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
-      if (iLen >= sizeof(pDLayer->sRecFileName))
+      if (iLen >= sizeof(sFileSet.sRecFileName[iLayer]))
         return 1;
-      pDLayer->sRecFileName[iLen] = '\0';
-      strncpy (pDLayer->sRecFileName, argv[n++], iLen);	// confirmed_safe_unsafe_usage
-#else
-      n += 2;
-#endif//ENABLE_FRAME_DUMP
+      sFileSet.sRecFileName[iLayer][iLen] = '\0';
+      strncpy (sFileSet.sRecFileName[iLayer], argv[n++], iLen);	// confirmed_safe_unsafe_usage
     }
-
     else if (!strcmp (pCommand, "-dw") && (n + 1 < argc)) {
       unsigned int	iLayer = atoi (argv[n++]);
       SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
@@ -700,7 +694,6 @@
 	ret = 1;
     goto ERROR_RET;
    }
-
   iPicLumaSize = sSvcParam.iPicWidth * sSvcParam.iPicHeight;
   switch (sSvcParam.iInputCsp) {
     int iStride;
@@ -852,7 +845,7 @@
 
   memset (&sFbi, 0, sizeof (SFrameBSInfo));
   memset (&sSvcParam, 0, sizeof (SEncParamExt));
-
+  memset (&fs,0,sizeof(SFilesSet));
   sSvcParam.iInputCsp	= videoFormatI420;	// I420 in default
   sSvcParam.sSpatialLayers[0].uiProfileIdc	= PRO_BASELINE;
 //	svc_cfg->sDependencyLayers[0].frext_mode	= 0;
@@ -917,6 +910,18 @@
     fprintf (stderr, "SVC encoder Initialize failed\n");
     iRet = 1;
     goto INSIDE_MEM_FREE;
+  }
+  for(int iLayer = 0;iLayer<MAX_DEPENDENCY_LAYER;iLayer++){
+    if(fs.sRecFileName[iLayer][0]!=0){
+      SDumpLayer sDumpLayer;
+      sDumpLayer.iLayer = iLayer;
+      sDumpLayer.pFileName = fs.sRecFileName[iLayer];
+      if(cmResultSuccess!=pPtrEnc->SetOption(ENCODER_OPTION_DUMP_FILE,&sDumpLayer)){
+        fprintf (stderr, "SetOption ENCODER_OPTION_DUMP_FILE failed!\n");
+        iRet = 1;
+        goto INSIDE_MEM_FREE;
+      }
+    }
   }
   // Inactive with sink with output file handler
   if (fs.strBsFile.length() > 0) {
--- a/codec/encoder/plus/src/welsEncoderExt.cpp
+++ b/codec/encoder/plus/src/welsEncoderExt.cpp
@@ -938,6 +938,15 @@
     }
   }
   break;
+  case ENCODER_OPTION_DUMP_FILE:{
+#ifdef ENABLE_FRAME_DUMP
+    if(m_pEncContext->pSvcParam!=NULL){
+      SDumpLayer*pDump = (static_cast<SDumpLayer *>(pOption));
+      WelsStrncpy(m_pEncContext->pSvcParam->sDependencyLayers[pDump->iLayer].sRecFileName, pDump->pFileName, sizeof(m_pEncContext->pSvcParam->sDependencyLayers[pDump->iLayer].sRecFileName))
+    }
+#endif
+  }
+  break;
   default:
     return cmInitParaError;
   }