PrepareOneSrcFrame(); iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR)); GetValidEncParamBase (&sEncParamBase); iResult = pPtrEnc->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_BASE, &sEncParamBase); PrepareOneSrcFrame(); iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->Uninitialize(); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));} TEST_F (EncoderInterfaceTest, BasicInitializeTestFalse) { int iResult; SEncParamBase sEncParamBase; int uiTraceLevel = WELS_LOG_QUIET; pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel); //iUsageType GetValidEncParamBase (&sEncParamBase); sEncParamBase.iUsageType = static_cast<EUsageType> (2); iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //iPicWidth GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicWidth = 0; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicWidth = -1; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //TODO: add checking max in interface and then enable this checking //GetValidEncParamBase(&sEncParamBase); //sEncParamBase.iPicWidth = rand()+(MAX_WIDTH+1); //iResult = pPtrEnc->Initialize (&sEncParamBase); //EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //iPicHeight GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicHeight = 0; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicHeight = -1; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //TODO: add checking max in interface and then enable this checking //GetValidEncParamBase(&sEncParamBase); //sEncParamBase.iPicWidth = rand()+(MAX_HEIGHT+1); //iResult = pPtrEnc->Initialize (&sEncParamBase); //EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //iTargetBitrate GetValidEncParamBase (&sEncParamBase); sEncParamBase.iTargetBitrate = 0; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); GetValidEncParamBase (&sEncParamBase); sEncParamBase.iTargetBitrate = -1; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); uiTraceLevel = WELS_LOG_ERROR; pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);} TEST_F (EncoderInterfaceTest, BasicInitializeTestAutoAdjustment) { SEncParamBase sEncParamBase; // large fMaxFrameRate GetValidEncParamBase (&sEncParamBase); sEncParamBase.fMaxFrameRate = 50000; EncodeOneFrame (&sEncParamBase); EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0); EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0); // fMaxFrameRate = 0 GetValidEncParamBase (&sEncParamBase); sEncParamBase.fMaxFrameRate = 0; EncodeOneFrame (&sEncParamBase); EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0); EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0); // fMaxFrameRate = -1 GetValidEncParamBase (&sEncParamBase); sEncParamBase.fMaxFrameRate = -1; EncodeOneFrame (&sEncParamBase); EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0); EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0);} TEST_F (EncoderInterfaceTest, ForceIntraFrame) { SEncParamBase sEncParamBase; GetValidEncParamBase (&sEncParamBase); int iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight, sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate); } PrepareOneSrcFrame(); bool bIDR = true; pPtrEnc->ForceIntraFrame (bIDR); EncodeOneIDRandP (pPtrEnc); //call next frame to be IDR pPtrEnc->ForceIntraFrame (bIDR); EncodeOneIDRandP (pPtrEnc); pPtrEnc->Uninitialize(); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));} TEST_F (EncoderInterfaceTest, ForceIntraFrameWithTemporal) { SEncParamExt sEncParamExt; pPtrEnc->GetDefaultParams (&sEncParamExt); sEncParamExt.iUsageType = CAMERA_VIDEO_REAL_TIME; sEncParamExt.iPicWidth = MB_SIZE + abs ((rand() * 2) % (MAX_WIDTH - MB_SIZE)); sEncParamExt.iPicHeight = MB_SIZE + abs ((rand() * 2) % (MAX_HEIGHT - MB_SIZE)); sEncParamExt.iTargetBitrate = rand() + 1; //!=0 int32_t iLevelMaxBitrate = WelsCommon::g_ksLevelLimits[LEVEL_5_0 - 1].uiMaxBR * CpbBrNalFactor; if (sEncParamExt.iTargetBitrate > iLevelMaxBitrate) sEncParamExt.iTargetBitrate = iLevelMaxBitrate; sEncParamExt.iRCMode = RC_BITRATE_MODE; //-1, 0, 1, 2 sEncParamExt.fMaxFrameRate = rand() + 0.5f; //!=0 sEncParamExt.sSpatialLayers[0].iVideoWidth = sEncParamExt.iPicWidth; sEncParamExt.sSpatialLayers[0].iVideoHeight = sEncParamExt.iPicHeight; sEncParamExt.sSpatialLayers[0].iSpatialBitrate = sEncParamExt.iTargetBitrate; int iTargetTemporalLayerNum = rand() % MAX_TEMPORAL_LAYER_NUM; sEncParamExt.iTemporalLayerNum = (iTargetTemporalLayerNum > 2) ? iTargetTemporalLayerNum : 2; int iResult = pPtrEnc->InitializeExt (&sEncParamExt); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamExt.iUsageType, sEncParamExt.iPicWidth, sEncParamExt.iPicHeight, sEncParamExt.iTargetBitrate, sEncParamExt.iRCMode, sEncParamExt.fMaxFrameRate); } PrepareOneSrcFrame(); bool bIDR = true; EncodeOneIDRandP (pPtrEnc); //call next frame to be IDR pPtrEnc->ForceIntraFrame (bIDR); EncodeOneIDRandP (pPtrEnc); pPtrEnc->Uninitialize(); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));} TEST_F (EncoderInterfaceTest, EncodeParameterSets) { SEncParamBase sEncParamBase; GetValidEncParamBase (&sEncParamBase); int iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight, sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate); } PrepareOneSrcFrame(); EncodeOneIDRandP (pPtrEnc); //try EncodeParameterSets pPtrEnc->EncodeParameterSets (&sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeInvalid)); //check the result int iNalType = 0; SLayerBSInfo* pLayerBsInfo; for (int i = 0; i < sFbi.iLayerNum; i++) { pLayerBsInfo = & (sFbi.sLayerInfo[i]); EXPECT_EQ (pLayerBsInfo->uiLayerType , static_cast<int> (NON_VIDEO_CODING_LAYER)); iNalType = GET_NAL_TYPE (pLayerBsInfo->pBsBuf); EXPECT_EQ (true, IS_PARASET (iNalType)); for (int j = 0; j < (pLayerBsInfo->iNalCount - 1); j++) { iNalType = GET_NAL_TYPE (pLayerBsInfo->pBsBuf + pLayerBsInfo->pNalLengthInByte[j]); EXPECT_EQ (true, IS_PARASET (iNalType)); } } //try another P to make sure no impact on succeeding frames iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_NE (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR)); iResult = pPtrEnc->Uninitialize(); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));} TEST_F (EncoderInterfaceTest, BasicReturnTypeTest) { //TODO} void EncoderInterfaceTest::ChangeResolutionAndCheckStatistics (const SEncParamBase& sEncParamBase, SEncoderStatistics* pEncoderStatistics) { unsigned int uiExistingFrameCount = pEncoderStatistics->uiInputFrameCount; unsigned int uiExistingIDR = pEncoderStatistics->uiIDRSentNum; unsigned int uiExistingResolutionChange = pEncoderStatistics->uiResolutionChangeTimes; // 1, get the existing param int iResult = pPtrEnc->GetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParamExt); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); // 2, change setting unsigned int uiKnownResolutionChangeTimes = uiExistingResolutionChange; bool bCheckIDR = false; if (pParamExt->iPicWidth != sEncParamBase.iPicWidth || pParamExt->iPicHeight != sEncParamBase.iPicHeight) { uiKnownResolutionChangeTimes += 1; bCheckIDR = true; } pParamExt->iPicWidth = pParamExt->sSpatialLayers[0].iVideoWidth = sEncParamBase.iPicWidth; pParamExt->iPicHeight = pParamExt->sSpatialLayers[0].iVideoHeight = sEncParamBase.iPicHeight; pPtrEnc->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParamExt); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); // 3, code one frame PrepareOneSrcFrame(); pSrcPic->uiTimeStamp = 30 * pEncoderStatistics->uiInputFrameCount; iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, pEncoderStatistics); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (pEncoderStatistics->uiInputFrameCount, uiExistingFrameCount + 1); EXPECT_EQ (pEncoderStatistics->uiResolutionChangeTimes, uiKnownResolutionChangeTimes); if (bCheckIDR) { EXPECT_EQ (pEncoderStatistics->uiIDRSentNum, uiExistingIDR + 1); } EXPECT_EQ (pEncoderStatistics->uiWidth, static_cast<unsigned int> (sEncParamBase.iPicWidth)); EXPECT_EQ (pEncoderStatistics->uiHeight, static_cast<unsigned int> (sEncParamBase.iPicHeight));} TEST_F (EncoderInterfaceTest, GetStatistics) { SEncParamBase sEncParamBase; GetValidEncParamBase (&sEncParamBase); int iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight, sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate); } PrepareOneSrcFrame(); EncodeOneIDRandP (pPtrEnc); SEncoderStatistics sEncoderStatistics; iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, &sEncoderStatistics); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (sEncoderStatistics.uiInputFrameCount, static_cast<unsigned int> (2)); EXPECT_EQ (sEncoderStatistics.uiIDRSentNum, static_cast<unsigned int> (1)); EXPECT_EQ (sEncoderStatistics.uiResolutionChangeTimes, static_cast<unsigned int> (0)); EXPECT_EQ (sEncoderStatistics.uiWidth, static_cast<unsigned int> (sEncParamBase.iPicWidth)); EXPECT_EQ (sEncoderStatistics.uiHeight, static_cast<unsigned int> (sEncParamBase.iPicHeight)); // try param change GetValidEncParamBase (&sEncParamBase); ChangeResolutionAndCheckStatistics (sEncParamBase, &sEncoderStatistics); GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicWidth = (sEncParamBase.iPicWidth % 16) + 1; //try 1~16 sEncParamBase.iPicHeight = (sEncParamBase.iPicHeight % 16) + 1; //try 1~16 ChangeResolutionAndCheckStatistics (sEncParamBase, &sEncoderStatistics); // try timestamp and frame rate pSrcPic->uiTimeStamp = 1000; iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, &sEncoderStatistics); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (static_cast<unsigned int> (sEncoderStatistics.fAverageFrameRate), sEncoderStatistics.uiInputFrameCount); // 4, change log interval int32_t iInterval = 0; iResult = pPtrEnc->GetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (iInterval, 5000); int32_t iInterval2 = 2000; iResult = pPtrEnc->SetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval2); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (iInterval, iInterval2); iInterval2 = 0; iResult = pPtrEnc->SetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval2); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (iInterval, iInterval2); // finish pPtrEnc->Uninitialize();} TEST_F (EncoderInterfaceTest, FrameSizeCheck) { SEncParamBase sEncParamBase; GetValidEncParamBase (&sEncParamBase); int iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight, sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate); } PrepareOneSrcFrame(); iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); int length = 0; for (int i = 0; i < sFbi.iLayerNum; ++i) { for (int j = 0; j < sFbi.sLayerInfo[i].iNalCount; ++j) { length += sFbi.sLayerInfo[i].pNalLengthInByte[j]; } } EXPECT_EQ (length, sFbi.iFrameSizeInBytes); // finish pPtrEnc->Uninitialize();}Lines 501–853 of 853. Previous lines
PrepareOneSrcFrame(); iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR)); GetValidEncParamBase (&sEncParamBase); iResult = pPtrEnc->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_BASE, &sEncParamBase); PrepareOneSrcFrame(); iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->Uninitialize(); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); } TEST_F (EncoderInterfaceTest, BasicInitializeTestFalse) { int iResult; SEncParamBase sEncParamBase; int uiTraceLevel = WELS_LOG_QUIET; pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel); //iUsageType GetValidEncParamBase (&sEncParamBase); sEncParamBase.iUsageType = static_cast<EUsageType> (2); iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //iPicWidth GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicWidth = 0; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicWidth = -1; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //TODO: add checking max in interface and then enable this checking //GetValidEncParamBase(&sEncParamBase); //sEncParamBase.iPicWidth = rand()+(MAX_WIDTH+1); //iResult = pPtrEnc->Initialize (&sEncParamBase); //EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //iPicHeight GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicHeight = 0; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicHeight = -1; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //TODO: add checking max in interface and then enable this checking //GetValidEncParamBase(&sEncParamBase); //sEncParamBase.iPicWidth = rand()+(MAX_HEIGHT+1); //iResult = pPtrEnc->Initialize (&sEncParamBase); //EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); //iTargetBitrate GetValidEncParamBase (&sEncParamBase); sEncParamBase.iTargetBitrate = 0; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); GetValidEncParamBase (&sEncParamBase); sEncParamBase.iTargetBitrate = -1; iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmInitParaError)); uiTraceLevel = WELS_LOG_ERROR; pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel); } TEST_F (EncoderInterfaceTest, BasicInitializeTestAutoAdjustment) { SEncParamBase sEncParamBase; // large fMaxFrameRate GetValidEncParamBase (&sEncParamBase); sEncParamBase.fMaxFrameRate = 50000; EncodeOneFrame (&sEncParamBase); EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0); EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0); // fMaxFrameRate = 0 GetValidEncParamBase (&sEncParamBase); sEncParamBase.fMaxFrameRate = 0; EncodeOneFrame (&sEncParamBase); EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0); EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0); // fMaxFrameRate = -1 GetValidEncParamBase (&sEncParamBase); sEncParamBase.fMaxFrameRate = -1; EncodeOneFrame (&sEncParamBase); EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0); EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0); } TEST_F (EncoderInterfaceTest, ForceIntraFrame) { SEncParamBase sEncParamBase; GetValidEncParamBase (&sEncParamBase); int iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight, sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate); } PrepareOneSrcFrame(); bool bIDR = true; pPtrEnc->ForceIntraFrame (bIDR); EncodeOneIDRandP (pPtrEnc); //call next frame to be IDR pPtrEnc->ForceIntraFrame (bIDR); EncodeOneIDRandP (pPtrEnc); pPtrEnc->Uninitialize(); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); } TEST_F (EncoderInterfaceTest, ForceIntraFrameWithTemporal) { SEncParamExt sEncParamExt; pPtrEnc->GetDefaultParams (&sEncParamExt); sEncParamExt.iUsageType = CAMERA_VIDEO_REAL_TIME; sEncParamExt.iPicWidth = MB_SIZE + abs ((rand() * 2) % (MAX_WIDTH - MB_SIZE)); sEncParamExt.iPicHeight = MB_SIZE + abs ((rand() * 2) % (MAX_HEIGHT - MB_SIZE)); sEncParamExt.iTargetBitrate = rand() + 1; //!=0 int32_t iLevelMaxBitrate = WelsCommon::g_ksLevelLimits[LEVEL_5_0 - 1].uiMaxBR * CpbBrNalFactor; if (sEncParamExt.iTargetBitrate > iLevelMaxBitrate) sEncParamExt.iTargetBitrate = iLevelMaxBitrate; sEncParamExt.iRCMode = RC_BITRATE_MODE; //-1, 0, 1, 2 sEncParamExt.fMaxFrameRate = rand() + 0.5f; //!=0 sEncParamExt.sSpatialLayers[0].iVideoWidth = sEncParamExt.iPicWidth; sEncParamExt.sSpatialLayers[0].iVideoHeight = sEncParamExt.iPicHeight; sEncParamExt.sSpatialLayers[0].iSpatialBitrate = sEncParamExt.iTargetBitrate; int iTargetTemporalLayerNum = rand() % MAX_TEMPORAL_LAYER_NUM; sEncParamExt.iTemporalLayerNum = (iTargetTemporalLayerNum > 2) ? iTargetTemporalLayerNum : 2; int iResult = pPtrEnc->InitializeExt (&sEncParamExt); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamExt.iUsageType, sEncParamExt.iPicWidth, sEncParamExt.iPicHeight, sEncParamExt.iTargetBitrate, sEncParamExt.iRCMode, sEncParamExt.fMaxFrameRate); } PrepareOneSrcFrame(); bool bIDR = true; EncodeOneIDRandP (pPtrEnc); //call next frame to be IDR pPtrEnc->ForceIntraFrame (bIDR); EncodeOneIDRandP (pPtrEnc); pPtrEnc->Uninitialize(); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); } TEST_F (EncoderInterfaceTest, EncodeParameterSets) { SEncParamBase sEncParamBase; GetValidEncParamBase (&sEncParamBase); int iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight, sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate); } PrepareOneSrcFrame(); EncodeOneIDRandP (pPtrEnc); //try EncodeParameterSets pPtrEnc->EncodeParameterSets (&sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeInvalid)); //check the result int iNalType = 0; SLayerBSInfo* pLayerBsInfo; for (int i = 0; i < sFbi.iLayerNum; i++) { pLayerBsInfo = & (sFbi.sLayerInfo[i]); EXPECT_EQ (pLayerBsInfo->uiLayerType , static_cast<int> (NON_VIDEO_CODING_LAYER)); iNalType = GET_NAL_TYPE (pLayerBsInfo->pBsBuf); EXPECT_EQ (true, IS_PARASET (iNalType)); for (int j = 0; j < (pLayerBsInfo->iNalCount - 1); j++) { iNalType = GET_NAL_TYPE (pLayerBsInfo->pBsBuf + pLayerBsInfo->pNalLengthInByte[j]); EXPECT_EQ (true, IS_PARASET (iNalType)); } } //try another P to make sure no impact on succeeding frames iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_NE (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR)); iResult = pPtrEnc->Uninitialize(); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); } TEST_F (EncoderInterfaceTest, BasicReturnTypeTest) { //TODO } void EncoderInterfaceTest::ChangeResolutionAndCheckStatistics (const SEncParamBase& sEncParamBase, SEncoderStatistics* pEncoderStatistics) { unsigned int uiExistingFrameCount = pEncoderStatistics->uiInputFrameCount; unsigned int uiExistingIDR = pEncoderStatistics->uiIDRSentNum; unsigned int uiExistingResolutionChange = pEncoderStatistics->uiResolutionChangeTimes; // 1, get the existing param int iResult = pPtrEnc->GetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParamExt); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); // 2, change setting unsigned int uiKnownResolutionChangeTimes = uiExistingResolutionChange; bool bCheckIDR = false; if (pParamExt->iPicWidth != sEncParamBase.iPicWidth || pParamExt->iPicHeight != sEncParamBase.iPicHeight) { uiKnownResolutionChangeTimes += 1; bCheckIDR = true; } pParamExt->iPicWidth = pParamExt->sSpatialLayers[0].iVideoWidth = sEncParamBase.iPicWidth; pParamExt->iPicHeight = pParamExt->sSpatialLayers[0].iVideoHeight = sEncParamBase.iPicHeight; pPtrEnc->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParamExt); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); // 3, code one frame PrepareOneSrcFrame(); pSrcPic->uiTimeStamp = 30 * pEncoderStatistics->uiInputFrameCount; iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, pEncoderStatistics); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (pEncoderStatistics->uiInputFrameCount, uiExistingFrameCount + 1); EXPECT_EQ (pEncoderStatistics->uiResolutionChangeTimes, uiKnownResolutionChangeTimes); if (bCheckIDR) { EXPECT_EQ (pEncoderStatistics->uiIDRSentNum, uiExistingIDR + 1); } EXPECT_EQ (pEncoderStatistics->uiWidth, static_cast<unsigned int> (sEncParamBase.iPicWidth)); EXPECT_EQ (pEncoderStatistics->uiHeight, static_cast<unsigned int> (sEncParamBase.iPicHeight)); } TEST_F (EncoderInterfaceTest, GetStatistics) { SEncParamBase sEncParamBase; GetValidEncParamBase (&sEncParamBase); int iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight, sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate); } PrepareOneSrcFrame(); EncodeOneIDRandP (pPtrEnc); SEncoderStatistics sEncoderStatistics; iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, &sEncoderStatistics); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (sEncoderStatistics.uiInputFrameCount, static_cast<unsigned int> (2)); EXPECT_EQ (sEncoderStatistics.uiIDRSentNum, static_cast<unsigned int> (1)); EXPECT_EQ (sEncoderStatistics.uiResolutionChangeTimes, static_cast<unsigned int> (0)); EXPECT_EQ (sEncoderStatistics.uiWidth, static_cast<unsigned int> (sEncParamBase.iPicWidth)); EXPECT_EQ (sEncoderStatistics.uiHeight, static_cast<unsigned int> (sEncParamBase.iPicHeight)); // try param change GetValidEncParamBase (&sEncParamBase); ChangeResolutionAndCheckStatistics (sEncParamBase, &sEncoderStatistics); GetValidEncParamBase (&sEncParamBase); sEncParamBase.iPicWidth = (sEncParamBase.iPicWidth % 16) + 1; //try 1~16 sEncParamBase.iPicHeight = (sEncParamBase.iPicHeight % 16) + 1; //try 1~16 ChangeResolutionAndCheckStatistics (sEncParamBase, &sEncoderStatistics); // try timestamp and frame rate pSrcPic->uiTimeStamp = 1000; iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, &sEncoderStatistics); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (static_cast<unsigned int> (sEncoderStatistics.fAverageFrameRate), sEncoderStatistics.uiInputFrameCount); // 4, change log interval int32_t iInterval = 0; iResult = pPtrEnc->GetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (iInterval, 5000); int32_t iInterval2 = 2000; iResult = pPtrEnc->SetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval2); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (iInterval, iInterval2); iInterval2 = 0; iResult = pPtrEnc->SetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval2); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); EXPECT_EQ (iInterval, iInterval2); // finish pPtrEnc->Uninitialize(); } TEST_F (EncoderInterfaceTest, FrameSizeCheck) { SEncParamBase sEncParamBase; GetValidEncParamBase (&sEncParamBase); int iResult = pPtrEnc->Initialize (&sEncParamBase); EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)); if (iResult != cmResultSuccess) { fprintf (stderr, "Unexpected ParamBase? \ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n", sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight, sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate); } PrepareOneSrcFrame(); iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); int length = 0; for (int i = 0; i < sFbi.iLayerNum; ++i) { for (int j = 0; j < sFbi.sLayerInfo[i].iNalCount; ++j) { length += sFbi.sLayerInfo[i].pNalLengthInByte[j]; } } EXPECT_EQ (length, sFbi.iFrameSizeInBytes); // finish pPtrEnc->Uninitialize(); }