| #include <gtest/gtest.h> |
| #include "utils/HashFunctions.h" |
| #include "BaseEncoderTest.h" |
| #include <string> |
| |
| static void UpdateHashFromFrame (const SFrameBSInfo& info, SHA1Context* ctx) { |
| for (int i = 0; i < info.iLayerNum; ++i) { |
| const SLayerBSInfo& layerInfo = info.sLayerInfo[i]; |
| int layerSize = 0; |
| for (int j = 0; j < layerInfo.iNalCount; ++j) { |
| layerSize += layerInfo.pNalLengthInByte[j]; |
| } |
| SHA1Input (ctx, layerInfo.pBsBuf, layerSize); |
| } |
| } |
| |
| class EncoderInitTest : public ::testing::Test, public BaseEncoderTest { |
| public: |
| virtual void SetUp() { |
| BaseEncoderTest::SetUp(); |
| } |
| virtual void TearDown() { |
| BaseEncoderTest::TearDown(); |
| } |
| }; |
| |
| TEST_F (EncoderInitTest, JustInit) {} |
| |
| struct EncodeFileParam { |
| const char* pkcFileName; |
| const char* pkcHashStr[2]; |
| EUsageType eUsageType; |
| int iWidth; |
| int iHeight; |
| float fFrameRate; |
| SliceModeEnum eSliceMode; |
| bool bDenoise; |
| int iLayerNum; |
| bool bLossless; |
| bool bEnableLtr; |
| bool bCabac; |
| // unsigned short iMultipleThreadIdc; |
| }; |
| |
| void EncFileParamToParamExt (EncodeFileParam* pEncFileParam, SEncParamExt* pEnxParamExt) { |
| ASSERT_TRUE (NULL != pEncFileParam && NULL != pEnxParamExt); |
| pEnxParamExt->iUsageType = pEncFileParam->eUsageType; |
| pEnxParamExt->iPicWidth = pEncFileParam->iWidth; |
| pEnxParamExt->iPicHeight = pEncFileParam->iHeight; |
| pEnxParamExt->fMaxFrameRate = pEncFileParam->fFrameRate; |
| pEnxParamExt->iSpatialLayerNum = pEncFileParam->iLayerNum; |
| |
| pEnxParamExt->bEnableDenoise = pEncFileParam->bDenoise; |
| pEnxParamExt->bIsLosslessLink = pEncFileParam->bLossless; |
| pEnxParamExt->bEnableLongTermReference = pEncFileParam->bEnableLtr; |
| pEnxParamExt->iEntropyCodingModeFlag = pEncFileParam->bCabac ? 1 : 0; |
| |
| for (int i = 0; i < pEnxParamExt->iSpatialLayerNum; i++) { |
| pEnxParamExt->sSpatialLayers[i].sSliceArgument.uiSliceMode = pEncFileParam->eSliceMode; |
| } |
| |
| } |
| |
| class EncoderOutputTest : public ::testing::WithParamInterface<EncodeFileParam>, |
| public EncoderInitTest , public BaseEncoderTest::Callback { |
| public: |
| virtual void SetUp() { |
| EncoderInitTest::SetUp(); |
| if (HasFatalFailure()) { |
| return; |
| } |
| SHA1Reset (&ctx_); |
| } |
| virtual void onEncodeFrame (const SFrameBSInfo& frameInfo) { |
| UpdateHashFromFrame (frameInfo, &ctx_); |
| } |
| |
| protected: |
| SHA1Context ctx_; |
| }; |
| |
| |
| TEST_P (EncoderOutputTest, CompareOutput) { |
| EncodeFileParam p = GetParam(); |
| SEncParamExt EnxParamExt; |
| |
| EncFileParamToParamExt (&p, &EnxParamExt); |
| |
| #if defined(ANDROID_NDK) |
| std::string filename = std::string ("/sdcard/") + p.pkcFileName; |
| EncodeFile (p.pkcFileName, &EnxParamExt, this); |
| #else |
| EncodeFile (p.pkcFileName, &EnxParamExt, this); |
| #endif |
| //will remove this after screen content algorithms are ready, |
| //because the bitstream output will vary when the different algorithms are added. |
| unsigned char digest[SHA_DIGEST_LENGTH]; |
| SHA1Result (&ctx_, digest); |
| if (!HasFatalFailure()) { |
| CompareHashAnyOf (digest, p.pkcHashStr, sizeof p.pkcHashStr / sizeof *p.pkcHashStr); |
| } |
| } |
| static const EncodeFileParam kFileParamArray[] = { |
| { |
| "res/CiscoVT2people_320x192_12fps.yuv", |
| {"672a52fb6b6e6d52b5b3f3480d13d44e88481fb9"}, CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 1, false, false, false |
| }, |
| { |
| "res/CiscoVT2people_160x96_6fps.yuv", |
| {"08ade1853e4e49d50be675393780e75519586143"}, CAMERA_VIDEO_REAL_TIME, 160, 96, 6.0f, SM_SINGLE_SLICE, false, 1, false, false, false |
| }, |
| { |
| "res/Static_152_100.yuv", |
| {"e60f12e3c24500d4306d812b0811d3c21855dd1c"}, CAMERA_VIDEO_REAL_TIME, 152, 100, 6.0f, SM_SINGLE_SLICE, false, 1, false, false, false |
| }, |
| { |
| "res/CiscoVT2people_320x192_12fps.yuv", |
| {"266de2d059a00ad2f28304e7eb378543ea7d85ab"}, CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_RASTER_SLICE, false, 1, false, false, false // One slice per MB row |
| }, |
| { |
| "res/CiscoVT2people_320x192_12fps.yuv", |
| {"913e49c787a0abdb378e9bc55bcffc27da89b965"}, CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, true, 1, false, false, false |
| }, |
| { |
| "res/CiscoVT2people_320x192_12fps.yuv", |
| // Allow for different output depending on whether averaging is done |
| // vertically or horizontally first when downsampling. |
| { "e626f7efa3d54da15794407c15b7c694f7ddd383", "eb4adc831563ce4f02f2942f52c992da760b4113" }, |
| CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 2, false, false, false |
| }, |
| { |
| "res/Cisco_Absolute_Power_1280x720_30fps.yuv", |
| {"53f5681a0c2b7068f4edc94538d6133a657df25d"}, CAMERA_VIDEO_REAL_TIME, 1280, 720, 30.0f, SM_SIZELIMITED_SLICE, false, 1, false, false, false |
| }, |
| { |
| "res/Cisco_Absolute_Power_1280x720_30fps.yuv", |
| // Allow for different output depending on whether averaging is done |
| // vertically or horizontally first when downsampling. |
| { "0d4bf6a3b6f09d6de7bbce6daf8002c614ee6241", "a32db3cfa66568e231d1f580d239d6468d26ce9a" }, |
| CAMERA_VIDEO_REAL_TIME, 1280, 720, 30.0f, SM_SINGLE_SLICE, false, 4, false, false, false |
| }, |
| |
| // the following values may be adjusted for times since we start tuning the strategy |
| { |
| "res/CiscoVT2people_320x192_12fps.yuv", |
| {"fd57470eebb9b334e8edcb8b47f7fb5b5868f111"}, SCREEN_CONTENT_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 1, false, false, false |
| }, |
| { |
| "res/CiscoVT2people_160x96_6fps.yuv", |
| {"5f63e723c3ec82fad186b48fcbcfb54730ce3b26"}, SCREEN_CONTENT_REAL_TIME, 160, 96, 6.0f, SM_SINGLE_SLICE, false, 1, false, false, false |
| }, |
| { |
| "res/Static_152_100.yuv", |
| {"e77a5b0ffb48753556e617544616fb06a049e9be"}, SCREEN_CONTENT_REAL_TIME, 152, 100, 6.0f, SM_SINGLE_SLICE, false, 1, false, false, false |
| }, |
| { |
| "res/Cisco_Absolute_Power_1280x720_30fps.yuv", |
| {"f01e41426ca49932a8f1f67ad59a1700a3fa7fee"}, SCREEN_CONTENT_REAL_TIME, 1280, 720, 30.0f, SM_SIZELIMITED_SLICE, false, 1, false, false, false |
| }, |
| //for different strategy |
| { |
| "res/Cisco_Absolute_Power_1280x720_30fps.yuv", |
| {"4684962979bc306e35de93bed58cc84938abcdee"}, SCREEN_CONTENT_REAL_TIME, 1280, 720, 30.0f, SM_SIZELIMITED_SLICE, false, 1, true, true, false |
| }, |
| { |
| "res/CiscoVT2people_320x192_12fps.yuv", |
| {"d31a72395a4ca760c5b86a06901a2557e0373e76"}, CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 1, false, false, true //turn on cabac |
| }, |
| |
| { |
| "res/Cisco_Absolute_Power_1280x720_30fps.yuv", |
| {"8bef37fa5965d5e650c1170d938423269f7406ac"}, CAMERA_VIDEO_REAL_TIME, 1280, 720, 30.0f, SM_SIZELIMITED_SLICE, false, 1, false, false, true |
| }, |
| |
| { |
| "res/Cisco_Absolute_Power_1280x720_30fps.yuv", |
| {"c5cb4a6f55c10485aa90f8b237fcb8697ba70d43"}, CAMERA_VIDEO_REAL_TIME, 1280, 720, 30.0f, SM_FIXEDSLCNUM_SLICE, false, 1, false, false, true |
| }, |
| |
| }; |
| |
| INSTANTIATE_TEST_CASE_P (EncodeFile, EncoderOutputTest, |
| ::testing::ValuesIn (kFileParamArray)); |