#include <gtest/gtest.h>
#include "codec_def.h"
#include "codec_api.h"
#include "utils/BufferedData.h"
#include "utils/FileInputStream.h"
#include "BaseEncoderTest.h"

class EncInterfaceCallTest : public ::testing::Test, public BaseEncoderTest {
 public:
  virtual void SetUp() {
    BaseEncoderTest::SetUp();
  };
  virtual void TearDown() {
    BaseEncoderTest::TearDown();
  };

  virtual void onEncodeFrame (const SFrameBSInfo& frameInfo) {
    //nothing
  }
  //testing case

};


TEST_F (EncInterfaceCallTest, BaseParameterVerify) {
  int uiTraceLevel = WELS_LOG_QUIET;
  encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);

  int ret = cmResultSuccess;
  SEncParamBase baseparam;
  memset (&baseparam, 0, sizeof (SEncParamBase));

  baseparam.iPicWidth = 0;
  baseparam.iPicHeight = 7896;

  ret =  encoder_->Initialize (&baseparam);
  EXPECT_EQ (ret, static_cast<int> (cmInitParaError));

  uiTraceLevel = WELS_LOG_ERROR;
  encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);
}

void outputData() {

}

TEST_F (EncInterfaceCallTest, SetOptionLTR) {

  int iTotalFrameNum = 100;
  int iFrameNum = 0;
  int frameSize = 0;
  int ret = cmResultSuccess;
  int width = 320;
  int height = 192;


  SEncParamBase baseparam;
  memset (&baseparam, 0, sizeof (SEncParamBase));

  baseparam.iUsageType = CAMERA_VIDEO_REAL_TIME;
  baseparam.fMaxFrameRate = 12;
  baseparam.iPicWidth = width;
  baseparam.iPicHeight = height;
  baseparam.iTargetBitrate = 5000000;
  encoder_->Initialize (&baseparam);

  frameSize = width * height * 3 / 2;

  BufferedData buf;
  buf.SetLength (frameSize);
  ASSERT_TRUE (buf.Length() == (size_t)frameSize); //include memory fail (-1) case

  SFrameBSInfo info;
  memset (&info, 0, sizeof (SFrameBSInfo));

  SSourcePicture pic;
  memset (&pic, 0, sizeof (SSourcePicture));
  pic.iPicWidth = width;
  pic.iPicHeight = height;
  pic.iColorFormat = videoFormatI420;
  pic.iStride[0] = pic.iPicWidth;
  pic.iStride[1] = pic.iStride[2] = pic.iPicWidth >> 1;
  pic.pData[0] = buf.data();
  pic.pData[1] = pic.pData[0] + width * height;
  pic.pData[2] = pic.pData[1] + (width * height >> 2);

  SLTRConfig config;
  config.bEnableLongTermReference = true;
  config.iLTRRefNum = rand() % 4;
  encoder_->SetOption (ENCODER_OPTION_LTR, &config);
  do {
    FileInputStream fileStream;
    ASSERT_TRUE (fileStream.Open ("res/CiscoVT2people_320x192_12fps.yuv"));

    while (fileStream.read (buf.data(), frameSize) == frameSize) {
      ret = encoder_->EncodeFrame (&pic, &info);
      ASSERT_TRUE (ret == cmResultSuccess);
      if (info.eFrameType != videoFrameTypeSkip) {
        this->onEncodeFrame (info);
        iFrameNum++;
      }
    }
  } while (iFrameNum < iTotalFrameNum);

}