shithub: openh264

Download patch

ref: f22c47ca5dcb2bcd815c63b1b3b595c5665348d4
parent: 3d25c25aeafcf7c186ff449201ef7c061db00192
parent: af0427d0651b9c92122d5da864de7e9b23dcdda1
author: HaiboZhu <haibozhu@cisco.com>
date: Tue Sep 6 10:36:59 EDT 2016

Merge pull request #2550 from sijchen/add_size_test2

[UT] add more special resolution and slice-mode tests

--- a/test/api/encode_decode_api_test.h
+++ b/test/api/encode_decode_api_test.h
@@ -29,7 +29,7 @@
 #define TEMPORAL_LAYER_NUM_RANGE (2*MAX_TEMPORAL_LAYER_NUM)
 #define SAVED_NALUNIT_NUM        ( (MAX_SPATIAL_LAYER_NUM*MAX_QUALITY_LAYER_NUM) + 1 + MAX_SPATIAL_LAYER_NUM )
 #define MAX_SLICES_NUM           ( ( MAX_NAL_UNITS_IN_LAYER - SAVED_NALUNIT_NUM ) / 3 )
-#define SLICE_MODE_NUM           (6)
+#define SLICE_MODE_NUM           (SM_RESERVED)
 #define LOOP_FILTER_IDC_NUM      (3)
 #define LOOF_FILTER_OFFSET_RANGE (6)
 #define MAX_REF_PIC_COUNT        (16)
--- a/test/api/encode_options_test.cpp
+++ b/test/api/encode_options_test.cpp
@@ -1204,30 +1204,42 @@
   {true, true, false, 30, 140, 196, 51, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
   {true, true, false, 30, 110, 296, 50, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
   {true, true, false, 30, 104, 416, 44, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
-  {true, true, false, 30, 16, 16, 2, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
+  {true, true, false, 30, 16, 16, 2, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""}, //5
   {true, false, true, 30, 600, 460, 1, SM_SIZELIMITED_SLICE, 450, 15.0, 1, ""},
   {true, false, true, 30, 340, 96, 24, SM_SIZELIMITED_SLICE, 1000, 30.0, 1, ""},
   {true, false, true, 30, 140, 196, 51, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
   {true, false, true, 30, 110, 296, 50, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
-  {true, false, true, 30, 104, 416, 44, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
+  {true, false, true, 30, 104, 416, 44, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""}, //10
   {true, false, true, 30, 16, 16, 2, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
   {true, true, true, 30, 600, 460, 1, SM_SIZELIMITED_SLICE, 450, 15.0, 1, ""},
   {true, true, true, 30, 340, 96, 24, SM_SIZELIMITED_SLICE, 1000, 30.0, 1, ""},
   {true, true, true, 30, 140, 196, 51, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
-  {true, true, true, 30, 110, 296, 50, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
+  {true, true, true, 30, 110, 296, 50, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""}, //15
   {true, true, true, 30, 104, 416, 44, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
   {true, true, true, 30, 16, 16, 2, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
-  {false, false, true, 3, 4096, 2304, 2, SM_SINGLE_SLICE, 0, 7.5, 1, ""}, // large picture size
   {false, true, false, 30, 32, 16, 2, SM_SIZELIMITED_SLICE, 500, 7.5, 1, ""},
   {false, true, false, 30, 600, 460, 1, SM_SIZELIMITED_SLICE, 450, 15.0, 4, ""},
-  {false, true, false, 30, 340, 96, 24, SM_SIZELIMITED_SLICE, 1000, 30.0, 2, ""},
+  {false, true, false, 30, 340, 96, 24, SM_SIZELIMITED_SLICE, 1000, 30.0, 2, ""}, //20
   {false, true, false, 30, 140, 196, 51, SM_SIZELIMITED_SLICE, 500, 7.5, 3, ""},
   {false, true, false, 30, 110, 296, 50, SM_SIZELIMITED_SLICE, 500, 7.5, 2, ""},
   {false, true, false, 30, 104, 416, 44, SM_SIZELIMITED_SLICE, 500, 7.5, 2, ""},
   {false, true, false, 30, 16, 16, 2, SM_SIZELIMITED_SLICE, 500, 7.5, 3, ""},
-  {false, true, false, 30, 32, 16, 2, SM_SIZELIMITED_SLICE, 500, 7.5, 3, ""},
+  {false, true, false, 30, 32, 16, 2, SM_SIZELIMITED_SLICE, 500, 7.5, 3, ""}, //25
   {false, false, true, 30, 600, 460, 1, SM_FIXEDSLCNUM_SLICE, 0, 15.0, 4, ""},
   {false, false, true, 30, 600, 460, 1, SM_FIXEDSLCNUM_SLICE, 0, 15.0, 8, ""},
+  //for large size tests
+  {true, false, true, 30, 4096, 2304, 1, SM_RESERVED, 0, 7.5, 1, ""}, // large picture size
+  {true, false, true, 30, 2304, 4096, 1, SM_RESERVED, 0, 15.0, 1, ""},
+  {true, false, true, 30, 3072, 3072, 1, SM_RESERVED, 0, 15.0, 1, ""},
+  //{true, false, true, 30, 3072, 3072, 1, SM_RESERVED, 0, 15.0, 4, ""}, //14760
+  {false, false, true, 30, 1072, 8576, 1, SM_RESERVED, 0, 15.0, 1, ""},
+  //{false, true, true, 30, 8576, 1072, 24, SM_SINGLE_SLICE, 0, 15.0, 1, ""}, //14754
+  //{false, false, false, 2, 8576, 1088, 24, SM_SINGLE_SLICE, 0, 15.0, 1, ""}, //14755
+  //{false, false, false, 2, 1088, 8576, 24, SM_SINGLE_SLICE, 0, 15.0, 1, ""}, //14755
+  {false, false, true, 1, 8688, 1072, 24, SM_SINGLE_SLICE, 0, 15.0, 1, ""}, //Annex A: PicWidthInMbs <= sqrt(36864*8) = 543; 543*16=8688; 36864/543=67; 67*16=1072
+  {false, false, true, 1, 1072, 8688, 24, SM_SINGLE_SLICE, 0, 15.0, 1, ""}, //Annex A: FrameHeightInMbs <= sqrt(36864*8) = 543; 543*16=8688; 36864/543=67; 67*16=1072
+  //{false, false, true, 30, 589824, 16, 24, SM_RESERVED, 0, 15.0, 1, ""},
+  //{false, false, true, 30, 589824, 16, 24, SM_RESERVED, 0, 15.0, 1, ""},
 };
 
 class EncodeTestAPI : public ::testing::TestWithParam<EncodeOptionParam>, public ::EncodeDecodeTestAPIBase {
@@ -1259,10 +1271,6 @@
 
 TEST_P (EncodeTestAPI, SetEncOptionSize) {
   EncodeOptionParam p = GetParam();
-  FILE* pFile = NULL;
-  if (p.sFileSave != NULL && strlen (p.sFileSave) > 0) {
-    pFile = fopen (p.sFileSave, "wb");
-  }
   memset (&param_, 0, sizeof (SEncParamExt));
   encoder_->GetDefaultParams (&param_);
   param_.uiMaxNalSize = p.uiMaxNalLen;
@@ -1275,66 +1283,95 @@
   param_.iRCMode = RC_OFF_MODE; //rc off
   param_.iMultipleThreadIdc = p.iThreads;
   param_.iNumRefFrame = AUTO_REF_PIC_COUNT;
-  param_.sSpatialLayers[0].iVideoWidth = p.iWidth ;
+  param_.sSpatialLayers[0].iVideoWidth = p.iWidth;
   param_.sSpatialLayers[0].iVideoHeight = p.iHeight;
   param_.sSpatialLayers[0].fFrameRate = p.fFramerate;
-  param_.sSpatialLayers[0].sSliceArgument.uiSliceMode = p.eSliceMode;
-  if (SM_FIXEDSLCNUM_SLICE == p.eSliceMode) {
-    param_.sSpatialLayers[0].sSliceArgument.uiSliceNum = 8;
+
+  int iSliceModeTestNum = 1;
+  if (SM_RESERVED == p.eSliceMode) {
+    iSliceModeTestNum = SLICE_MODE_NUM;
   }
 
-  encoder_->Uninitialize();
-  int rv = encoder_->InitializeExt (&param_);
-  ASSERT_TRUE (rv == cmResultSuccess);
-  InitialEncDec (p.iWidth, p.iHeight);
+  for (int iSliceIdx = 0; iSliceIdx < iSliceModeTestNum; iSliceIdx++) {
+    if (1 == iSliceModeTestNum) {
+      param_.sSpatialLayers[0].sSliceArgument.uiSliceMode = p.eSliceMode;
+    } else {
+      param_.sSpatialLayers[0].sSliceArgument.uiSliceMode = static_cast<SliceModeEnum> (iSliceIdx);
+    }
 
-  int32_t iTraceLevel = WELS_LOG_QUIET;
-  encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
-  decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
-  int32_t iSpsPpsIdAddition = 1;
-  encoder_->SetOption (ENCODER_OPTION_ENABLE_SPS_PPS_ID_ADDITION, &iSpsPpsIdAddition);
-  int32_t iIDRPeriod = (int32_t) pow (2.0f, (param_.iTemporalLayerNum - 1)) * ((rand() % 5) + 1);
-  encoder_->SetOption (ENCODER_OPTION_IDR_INTERVAL, &iIDRPeriod);
-  int iIdx = 0;
-  int iLen;
-  unsigned char* pData[3] = { NULL };
+    FILE* pFile = NULL;
+    if (p.sFileSave != NULL && strlen (p.sFileSave) > 0) {
+      pFile = fopen (p.sFileSave, "wb");
+    }
 
-  //FIXME: remove this after the multi-thread case is correctly handled in encoder
-  if (p.iThreads > 1 && SM_SIZELIMITED_SLICE == p.eSliceMode) {
-    p.bAllRandom = false;
-  }
+    if (SM_FIXEDSLCNUM_SLICE == param_.sSpatialLayers[0].sSliceArgument.uiSliceMode) {
+      param_.sSpatialLayers[0].sSliceArgument.uiSliceNum = 8;
+    } else if (SM_RASTER_SLICE == param_.sSpatialLayers[0].sSliceArgument.uiSliceMode) {
+      param_.sSpatialLayers[0].sSliceArgument.uiSliceMbNum[0] =
+        param_.sSpatialLayers[0].sSliceArgument.uiSliceMbNum[1] =
+          param_.sSpatialLayers[0].sSliceArgument.uiSliceMbNum[2] =
+            param_.sSpatialLayers[0].sSliceArgument.uiSliceMbNum[3] = ((p.iWidth * p.iHeight) >> 10);
+    } else if (SM_SIZELIMITED_SLICE == param_.sSpatialLayers[0].sSliceArgument.uiSliceMode && 450 > p.uiMaxNalLen) {
+      param_.uiMaxNalSize = 450;
+      param_.sSpatialLayers[0].sSliceArgument.uiSliceSizeConstraint = 450;
+    }
 
-  while (iIdx <= p.iNumframes) {
-    EncodeOneFrameRandom (0, p.bAllRandom);
-    encToDecData (info, iLen);
-    if (pFile) {
-      fwrite (info.sLayerInfo[0].pBsBuf, iLen, 1, pFile);
-      fflush (pFile);
+    int32_t iTraceLevel = WELS_LOG_QUIET;
+    encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
+    decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
+
+    encoder_->Uninitialize();
+    int rv = encoder_->InitializeExt (&param_);
+    ASSERT_TRUE (rv == cmResultSuccess);
+    InitialEncDec (p.iWidth, p.iHeight);
+
+
+    int32_t iSpsPpsIdAddition = 1;
+    encoder_->SetOption (ENCODER_OPTION_ENABLE_SPS_PPS_ID_ADDITION, &iSpsPpsIdAddition);
+    int32_t iIDRPeriod = (int32_t) pow (2.0f, (param_.iTemporalLayerNum - 1)) * ((rand() % 5) + 1);
+    encoder_->SetOption (ENCODER_OPTION_IDR_INTERVAL, &iIDRPeriod);
+    int iIdx = 0;
+    int iLen;
+    unsigned char* pData[3] = { NULL };
+
+    //FIXME: remove this after the multi-thread case is correctly handled in encoder
+    if (p.iThreads > 1 && SM_SIZELIMITED_SLICE == p.eSliceMode) {
+      p.bAllRandom = false;
     }
-    memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
-    if (iLen && p.bTestDecoder) {
-      rv = decoder_->DecodeFrameNoDelay (info.sLayerInfo[0].pBsBuf, iLen, pData, &dstBufInfo_);
-      ASSERT_EQ (rv, 0);
-      ASSERT_EQ (dstBufInfo_.iBufferStatus, 1);
-    }
-    int iLayer = 0;
-    while (iLayer < info.iLayerNum) {
-      SLayerBSInfo* pLayerBsInfo = &info.sLayerInfo[iLayer];
-      if (pLayerBsInfo != NULL) {
-        int iNalIdx = WELS_MAX (pLayerBsInfo->iNalCount - 2, 0); // ignore last slice under single slice mode
-        do {
-          if (p.bTestNalSize) { // ignore the case that 2 MBs in one picture, and the multithreads case, enable them when code is ready
-            ASSERT_GE (((int)param_.uiMaxNalSize), pLayerBsInfo->pNalLengthInByte[iNalIdx]);
-          }
-          -- iNalIdx;
-        } while (iNalIdx >= 0);
+
+    while (iIdx <= p.iNumframes) {
+      EncodeOneFrameRandom (0, p.bAllRandom);
+      encToDecData (info, iLen);
+      if (pFile) {
+        fwrite (info.sLayerInfo[0].pBsBuf, iLen, 1, pFile);
+        fflush (pFile);
       }
-      ++ iLayer;
+      memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
+      if (iLen && p.bTestDecoder) {
+        rv = decoder_->DecodeFrameNoDelay (info.sLayerInfo[0].pBsBuf, iLen, pData, &dstBufInfo_);
+        ASSERT_EQ (rv, 0);
+        ASSERT_EQ (dstBufInfo_.iBufferStatus, 1);
+      }
+      int iLayer = 0;
+      while (iLayer < info.iLayerNum) {
+        SLayerBSInfo* pLayerBsInfo = &info.sLayerInfo[iLayer];
+        if (pLayerBsInfo != NULL) {
+          int iNalIdx = WELS_MAX (pLayerBsInfo->iNalCount - 2, 0); // ignore last slice under single slice mode
+          do {
+            if (SM_SIZELIMITED_SLICE == p.eSliceMode
+                && p.bTestNalSize) { // ignore the case that 2 MBs in one picture, and the multithreads case, enable them when code is ready
+              ASSERT_GE (((int)param_.uiMaxNalSize), pLayerBsInfo->pNalLengthInByte[iNalIdx]);
+            }
+            -- iNalIdx;
+          } while (iNalIdx >= 0);
+        }
+        ++ iLayer;
+      }
+      iIdx++;
     }
-    iIdx++;
-  }
-  if (pFile) {
-    fclose (pFile);
+    if (pFile) {
+      fclose (pFile);
+    }
   }
 }