shithub: openh264

Download patch

ref: 6f58a0c1f756e625169f67ff2d228cc2e39149be
parent: cb0053f8608a61a52f155ed7fe4c39093ae3f816
author: jwwang <jwwang@mozilla.com>
date: Tue Jan 7 05:23:44 EST 2014

Add encoder test

--- a/Makefile
+++ b/Makefile
@@ -70,7 +70,7 @@
 H264ENC_LDFLAGS = -L. -lencoder -lprocessing -lcommon
 H264ENC_DEPS = $(LIBPREFIX)encoder.$(LIBSUFFIX) $(LIBPREFIX)processing.$(LIBSUFFIX) $(LIBPREFIX)common.$(LIBSUFFIX)
 
-CODEC_UNITTEST_LDFLAGS = -L. -lgtest -ldecoder -lcommon -lcrypto
+CODEC_UNITTEST_LDFLAGS = -L. -lgtest -ldecoder -lcrypto -lencoder -lprocessing -lcommon
 CODEC_UNITTEST_DEPS = $(LIBPREFIX)gtest.$(LIBSUFFIX) $(LIBPREFIX)decoder.$(LIBSUFFIX) $(LIBPREFIX)common.$(LIBSUFFIX)
 
 .PHONY: test
--- /dev/null
+++ b/res/CiscoVT2people_160x96_6fps.yuv
@@ -1,0 +1,1 @@
+��������������������v]TQOOSVWTOLOIMRXUPc�����������������������������������������������������������������������������������������������������������������������鮮������������������a`QNPVYVSPLJLLFLOROL]����������������������������������������������������������������������������������������������������������������������鯯�����������������ahYRNTZTQSJJGGGIEHKHKM[���������������������������������������������������������������������������������������������������������������������鯯�����������������Vd[UX]WNQPMLIGGFIHKHKNO���������������������������������������������������������������������������������������������������������������������魭����������������jSb_^debdbc`b\PRJPQQQNQQk��������������������������������������������������������������������������������������������������������������������뭭����������������]S\Yc�������~ld\^jl_WONTQ�������������������������������������������������������������������������{edr���������������������������������������뮮����������������WPYU����ķ���������taSCPL|�����������������������������������������������������������������}z}�yj^VSNTWfo�����������������������������������뺴����������������STW]����������������p\KHJd��������������������������������������������������������������pb`^UQWRRRVYYSNWblp�����������������������������������ɺ����������������QT]m����Ȼ�����������o\BGZ������������������������������������������������������������ybLQ]L?BGMPUWWYVQQ]nf]��������������������������������빶����������������PZdz����Ȼ�����������wuEGZ�����������������������������������������������������������pTINYWD?HJJMRWWVSUalqjUP{�������������������������������벱����������������Tcp������ı�����������{TGY����������������������������������������������������������hQKKRUM@HWKBGPTSXUTcgnhRFRy������������������������������뭮����������������ajy������ǹ�����������xWHQ���������������������������������������������������������hRMBN_\F?NWO@DLSTUX^abSMRKEO������������������������������뫫����������������wq{���緜xz�����������|YEO��������������������������������������������������������rTOBDOXWICEQPJB>HV[^cgePBFHHLc�����������������������������몪�����������������r���仙��vp����h\bq��YGT�������������������������������������������������������|WZFEEFOZSGFSNHMPDMU^ki^PB?AAFO�����������������������������몪�����������������v������׸�����vgdg_i|�fKq�������������������������������������������������������d^OEFD>L[XKKQSSIVRKZ_ZTSJD>;>AGX����������������������������몪����������������ļ������ۭ�����rq����}�xH�������������������������������������������������������r_[RNB:AOX[PTSZZVPcbKiYGFC>>;>AGIv���������������������������먨�����������������Ϯ����͉EVn�٤�s�������^������������������������������������������������������xd`ZUNA@DHM[^knpsi^goUOUE==;>==>AHR���������������������������맧�����������������������翓���佖xePUi���ng�����������������������������������������������������gg__^LBMJHTh~����}wodXTKB<=><=<;DGOm��������������������������먨������������������������ģ����ơ�}������g�����������������������������������������������������teY]cWDOROTe��������m_XLL@;;==;>>ADJW��������������������������먨�����������������������׽�����ʤ��������q�����������������������������������������������������daZ\_TNYYVby�������t_^LLF??==;>A>DJT��������������������������륦�����������������������Կ�����̡�������y������������������������������������������������������k_YY[MTVQbg����ɿ��zsaZTLM>>==;;C@CEMt�������������������������륦������������������������ȼ����Ъ�������������������������������������������������������������wfZ\VQJTONav�����ǻ��ki]XPQG;<<>><?CELa�������������������������뢤�����������������������κ�������������������������������������������������������������������oa^WSGJNKRi�������¶�s`]ZTLJ;<<==;>@FMR�������������������������롤�����������������|������ѷ��i��cY������������������������������������������������������������i][TODGDHYw������ο���hZ]XUI:99==;><<GK�������������������������뤢��������������}}���������ƺ��|x�����������������������������������������������������������{b[ZQJ@CBLg��������ĵ���c][VQB6:9?;;::BK|������������������������뤢��������������||zys��������ɽ���������������������������������������������������������������x
\ No newline at end of file
--- /dev/null
+++ b/res/CiscoVT2people_320x192_12fps.yuv
@@ -1,0 +1,1 @@
+�����������������������������������������s^XSTTPQMMOPRTVZWTQROMNQNJFJQURY[XSOVj������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������豱��������������������������������������j``[SRPPQMNRSTUVSTTUNJHIOMJIIMPPUWVRNKMTx����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������议�������������������������������������y[^h`TNMPONRVXWVTQRRRPLJMMKKJFGKOORSRKLJLY{���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������譭�������������������������������������`gbaVTLJPOPTZ[YVUUSOMLHFHJKKLECFMJOQPPQNJJT|�������������������������������������Ļ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������谰������������������������������������yVbc\QQPMKMV[YXVTRXSMIJHGFHEEHIHECIJKMIIHIIMS������������������������������������ļ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������议������������������������������������]VmkaURQQOQY[WQPONQOJFKIHFHFFHHHFEEGHIEGKNNNEP�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������误�����������������������������������yR[ff^SSUVVY][SLMNONNKIGGECGFFGFFGHEFHIDHKNLPMKx����������������������������������Ŀ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������议�����������������������������������\QV^c`XUWY[^`ZRNORSQPPOPOMMGEEGDEHJHJLMHIIHMMQP`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������譭����������������������������������YNWdfc[U^Zdc`YX]ZWY\YXZXWUSLFOKHGHJKJLPMMLKPRQOM������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������뭭����������������������������������vWPU\bb\^fhjp]jlkmlkmifgljdaWTWTIOUXUVTRTSPONRRPSt�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������뭭����������������������������������hUSRX^^X`bu�|kz~�����{z{ukf^^WXOYabef`WZVROLQTRUS�����������������������������������������������������������������������������������������������������������������������������������������������������wy����������������������������������������������������������������������������������뭭����������������������������������_TTPZ]YRUt����������������sjik_aamsopqi[XTNJJOUUQJu������������������������������������������������������������������������������������������������������������������������������������������������vjVKOJJTbru~����������������������������������������������������������������������������묭����������������������������������[RMQV[\Qc������ƿ������������}�|��|z}�rpcXQPK?RPOK`�������������������������������������������������������������������������������������������������������������������������������������������~unc\USQODGNV[^hqx��������
\ No newline at end of file
--- a/test/decoder_test.cpp
+++ b/test/decoder_test.cpp
@@ -11,17 +11,7 @@
 #include "codec_api.h"
 
 #include "utils/BufferedData.h"
-
-static bool CompareHash(unsigned char(&digest)[SHA_DIGEST_LENGTH],
-    const char* hashStr) {
-
-  char hashStrCmp[SHA_DIGEST_LENGTH * 2 + 1];
-  for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) {
-    sprintf(&hashStrCmp[i*2], "%.2x", digest[i]);
-  }
-  hashStrCmp[SHA_DIGEST_LENGTH * 2] = '\0';
-  return strncmp(hashStr, hashStrCmp, SHA_DIGEST_LENGTH * 2) == 0;
-}
+#include "utils/HashFunctions.h"
 
 static void UpdateHashFromPlane(SHA_CTX* ctx, const uint8_t* plane,
     int width, int height, int stride) {
--- /dev/null
+++ b/test/encoder_test.cpp
@@ -1,0 +1,151 @@
+#include <gtest/gtest.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <limits.h>
+#include <fstream>
+
+#include "codec_def.h"
+#include "codec_app_def.h"
+#include "codec_api.h"
+
+#include "utils/BufferedData.h"
+#include "utils/HashFunctions.h"
+
+static int InitWithParam(ISVCEncoder* encoder, int width,
+    int height, float frameRate) {
+  SVCEncodingParam param;
+  memset (&param, 0, sizeof(SVCEncodingParam));
+
+  param.sSpatialLayers[0].iVideoWidth  = width;
+  param.sSpatialLayers[0].iVideoHeight = height;
+  param.sSpatialLayers[0].fFrameRate = frameRate;
+  param.sSpatialLayers[0].iQualityLayerNum = 1;
+  param.sSpatialLayers[0].iSpatialBitrate = 600000;
+
+  SSliceConfig* sliceCfg = &param.sSpatialLayers[0].sSliceCfg;
+  sliceCfg->sSliceArgument.uiSliceNum = 1;
+  sliceCfg->sSliceArgument.uiSliceSizeConstraint = 1500;
+  sliceCfg->sSliceArgument.uiSliceMbNum[0] = 960;
+
+  param.fFrameRate = param.sSpatialLayers[0].fFrameRate;
+  param.iPicWidth = param.sSpatialLayers[0].iVideoWidth;
+  param.iPicHeight = param.sSpatialLayers[0].iVideoHeight;
+  param.iTargetBitrate = 5000000;
+  param.iTemporalLayerNum = 3;
+  param.iSpatialLayerNum = 1;
+  param.bEnableBackgroundDetection = true;
+  param.bEnableLongTermReference = true;
+  param.iLtrMarkPeriod = 30;
+  param.iInputCsp = videoFormatI420;
+  param.bEnableSpsPpsIdAddition = true;
+
+  return encoder->Initialize(&param, INIT_TYPE_PARAMETER_BASED);
+}
+
+static void UpdateHashFromFrame(const SFrameBSInfo& info, SHA_CTX* 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.iNalLengthInByte[j];
+    }
+    SHA1_Update(ctx, layerInfo.pBsBuf, layerSize);
+  }
+}
+
+static void CompareFileToHash(ISVCEncoder* encoder,
+    const char* fileName, const char* hashStr,
+    int width, int height, float frameRate) {
+
+  std::ifstream file(fileName, std::ios::in | std::ios::binary);
+  ASSERT_TRUE(file.is_open());
+
+  int rv = InitWithParam(encoder, width, height, frameRate);
+  ASSERT_TRUE(rv == cmResultSuccess);
+
+  // I420: 1(Y) + 1/4(U) + 1/4(V)
+  int frameSize = width * height * 3 / 2;
+
+  BufferedData buf;
+  buf.SetLength(frameSize);
+  ASSERT_TRUE(buf.Length() == frameSize);
+  char* data = reinterpret_cast<char*>(buf.data());
+
+  SFrameBSInfo info;
+  memset(&info, 0, sizeof(SFrameBSInfo));
+
+  unsigned char digest[SHA_DIGEST_LENGTH];
+  SHA_CTX ctx;
+  SHA1_Init(&ctx);
+
+  while (file.read(data, frameSize), file.gcount() == frameSize) {
+    rv = encoder->EncodeFrame(buf.data(), &info);
+    if (rv == videoFrameTypeInvalid) {
+      SHA1_Final(digest, &ctx);
+      FAIL() << "unable to encode frame";
+    }
+    if (rv != videoFrameTypeSkip) {
+      UpdateHashFromFrame(info, &ctx);
+    }
+  }
+
+  SHA1_Final(digest, &ctx);
+  ASSERT_TRUE(CompareHash(digest, hashStr));
+}
+
+class EncoderInitTest : public ::testing::Test {
+public:
+  EncoderInitTest() : encoder_(NULL) {}
+
+  virtual void SetUp() {
+    int rv = CreateSVCEncoder(&encoder_);
+    ASSERT_EQ(0, rv);
+    ASSERT_TRUE(encoder_ != NULL);
+  }
+
+  virtual void TearDown() {
+    if (encoder_ != NULL) {
+      encoder_->Uninitialize();
+      DestroySVCEncoder(encoder_);
+    }
+  }
+
+protected:
+  ISVCEncoder* encoder_;
+};
+
+TEST_F(EncoderInitTest, JustInit) {
+}
+
+struct EncodeFileParam {
+  const char* fileName;
+  const char* hashStr;
+  int width;
+  int height;
+  float frameRate;
+};
+
+class EncoderOutputTest : public EncoderInitTest ,
+    public ::testing::WithParamInterface<EncodeFileParam> {
+};
+
+
+TEST_P(EncoderOutputTest, CompareOutput) {
+  EncodeFileParam p = GetParam();
+  CompareFileToHash(encoder_, p.fileName, p.hashStr, p.width, p.height, p.frameRate);
+}
+
+static const EncodeFileParam kFileParamArray[] = {
+  {
+      "res/CiscoVT2people_320x192_12fps.yuv",
+      "4df5751a59eb02153e086ade9b3ecfcb8845c30b", 320, 192, 12.0f
+  },
+  {
+      "res/CiscoVT2people_160x96_6fps.yuv",
+      "6eb53b6bfdb95dfca0575bd3efe81aa58163951c", 160, 96, 6.0f
+  },
+};
+
+INSTANTIATE_TEST_CASE_P(EncodeFile, EncoderOutputTest,
+    ::testing::ValuesIn(kFileParamArray));
--- /dev/null
+++ b/test/utils/HashFunctions.h
@@ -1,0 +1,15 @@
+#ifndef __HASHFUNCTIONS_H__
+#define __HASHFUNCTIONS_H__
+
+#include <openssl/sha.h>
+
+static bool CompareHash(const unsigned char* digest, const char* hashStr) {
+  char hashStrCmp[SHA_DIGEST_LENGTH * 2 + 1];
+  for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) {
+    sprintf(&hashStrCmp[i*2], "%.2x", digest[i]);
+  }
+  hashStrCmp[SHA_DIGEST_LENGTH * 2] = '\0';
+  return strncmp(hashStr, hashStrCmp, SHA_DIGEST_LENGTH * 2) == 0;
+}
+
+#endif //__HASHFUNCTIONS_H__