/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <stdio.h>

#include <memory>

#include "webrtc/api/video/i420_buffer.h"
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
#include "webrtc/modules/video_coding/codecs/test/video_codec_test.h"
#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
#include "webrtc/rtc_base/checks.h"
#include "webrtc/rtc_base/optional.h"
#include "webrtc/rtc_base/timeutils.h"
#include "webrtc/test/field_trial.h"
#include "webrtc/test/frame_utils.h"
#include "webrtc/test/gtest.h"
#include "webrtc/test/testsupport/fileutils.h"
#include "webrtc/test/video_codec_settings.h"

namespace webrtc {

namespace {
constexpr uint32_t kInitialTimestampRtp = 123;
constexpr int64_t kTestNtpTimeMs = 456;
constexpr int64_t kInitialTimestampMs = 789;
constexpr uint32_t kTimestampIncrement = 3000;
constexpr int kNumCores = 1;
constexpr size_t kMaxPayloadSize = 1440;
constexpr int kMinPixelsPerFrame = 12345;
constexpr int kDefaultMinPixelsPerFrame = 320 * 180;
constexpr int kWidth = 172;
constexpr int kHeight = 144;

void Calc16ByteAlignedStride(int width, int* stride_y, int* stride_uv) {
  *stride_y = 16 * ((width + 15) / 16);
  *stride_uv = 16 * ((width + 31) / 32);
}
}  // namespace

class EncodedImageCallbackTestImpl : public webrtc::EncodedImageCallback {
 public:
  Result OnEncodedImage(const EncodedImage& encoded_frame,
                        const CodecSpecificInfo* codec_specific_info,
                        const RTPFragmentationHeader* fragmentation) override {
    EXPECT_GT(encoded_frame._length, 0u);
    VerifyQpParser(encoded_frame);

    if (encoded_frame_._size != encoded_frame._size) {
      delete[] encoded_frame_._buffer;
      frame_buffer_.reset(new uint8_t[encoded_frame._size]);
    }
    RTC_DCHECK(frame_buffer_);
    memcpy(frame_buffer_.get(), encoded_frame._buffer, encoded_frame._length);
    encoded_frame_ = encoded_frame;
    encoded_frame_._buffer = frame_buffer_.get();

    // Skip |codec_name|, to avoid allocating.
    EXPECT_STREQ("libvpx", codec_specific_info->codec_name);
    EXPECT_EQ(kVideoCodecVP8, codec_specific_info->codecType);
    EXPECT_EQ(0u, codec_specific_info->codecSpecific.VP8.simulcastIdx);
    codec_specific_info_.codecType = codec_specific_info->codecType;
    codec_specific_info_.codecSpecific = codec_specific_info->codecSpecific;
    complete_ = true;
    return Result(Result::OK, 0);
  }

  void VerifyQpParser(const EncodedImage& encoded_frame) const {
    int qp;
    ASSERT_TRUE(vp8::GetQp(encoded_frame._buffer, encoded_frame._length, &qp));
    EXPECT_EQ(encoded_frame.qp_, qp) << "Encoder QP != parsed bitstream QP.";
  }

  bool EncodeComplete() {
    if (complete_) {
      complete_ = false;
      return true;
    }
    return false;
  }

  EncodedImage encoded_frame_;
  CodecSpecificInfo codec_specific_info_;
  std::unique_ptr<uint8_t[]> frame_buffer_;
  bool complete_ = false;
};

class DecodedImageCallbackTestImpl : public webrtc::DecodedImageCallback {
 public:
  int32_t Decoded(VideoFrame& frame) override {
    RTC_NOTREACHED();
    return -1;
  }
  int32_t Decoded(VideoFrame& frame, int64_t decode_time_ms) override {
    RTC_NOTREACHED();
    return -1;
  }
  void Decoded(VideoFrame& frame,
               rtc::Optional<int32_t> decode_time_ms,
               rtc::Optional<uint8_t> qp) override {
    EXPECT_GT(frame.width(), 0);
    EXPECT_GT(frame.height(), 0);
    EXPECT_TRUE(qp);
    frame_ = rtc::Optional<VideoFrame>(frame);
    qp_ = qp;
    complete_ = true;
  }

  bool DecodeComplete() {
    if (complete_) {
      complete_ = false;
      return true;
    }
    return false;
  }

  rtc::Optional<VideoFrame> frame_;
  rtc::Optional<uint8_t> qp_;
  bool complete_ = false;
};

class TestVp8Impl : public ::testing::Test {
 public:
  TestVp8Impl() : TestVp8Impl("") {}
  explicit TestVp8Impl(const std::string& field_trials)
      : override_field_trials_(field_trials),
        encoder_(VP8Encoder::Create()),
        decoder_(VP8Decoder::Create()) {}
  virtual ~TestVp8Impl() {}

 protected:
  virtual void SetUp() {
    encoder_->RegisterEncodeCompleteCallback(&encoded_cb_);
    decoder_->RegisterDecodeCompleteCallback(&decoded_cb_);
    SetupCodecSettings();
    SetupInputFrame();
  }

  void SetupInputFrame() {
    // Using a QCIF image (aligned stride (u,v planes) > width).
    // Processing only one frame.
    FILE* file = fopen(test::ResourcePath("paris_qcif", "yuv").c_str(), "rb");
    ASSERT_TRUE(file != nullptr);
    rtc::scoped_refptr<I420BufferInterface> compact_buffer(
        test::ReadI420Buffer(kWidth, kHeight, file));
    ASSERT_TRUE(compact_buffer);

    // Setting aligned stride values.
    int stride_uv;
    int stride_y;
    Calc16ByteAlignedStride(kWidth, &stride_y, &stride_uv);
    EXPECT_EQ(stride_y, 176);
    EXPECT_EQ(stride_uv, 96);
    rtc::scoped_refptr<I420Buffer> stride_buffer(
        I420Buffer::Create(kWidth, kHeight, stride_y, stride_uv, stride_uv));

    // No scaling in our case, just a copy, to add stride to the image.
    stride_buffer->ScaleFrom(*compact_buffer);

    input_frame_.reset(new VideoFrame(stride_buffer, kInitialTimestampRtp,
                                      kInitialTimestampMs, kVideoRotation_0));
    fclose(file);
  }

  void SetupCodecSettings() {
    webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings_);
    codec_settings_.maxBitrate = 4000;
    codec_settings_.width = kWidth;
    codec_settings_.height = kHeight;
    codec_settings_.VP8()->denoisingOn = true;
    codec_settings_.VP8()->frameDroppingOn = false;
    codec_settings_.VP8()->automaticResizeOn = false;
    codec_settings_.VP8()->complexity = kComplexityNormal;
    codec_settings_.VP8()->tl_factory = &tl_factory_;
  }

  void InitEncodeDecode() {
    EXPECT_EQ(
        WEBRTC_VIDEO_CODEC_OK,
        encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
    EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
              decoder_->InitDecode(&codec_settings_, kNumCores));
  }

  void EncodeFrame() {
    EXPECT_FALSE(encoded_cb_.EncodeComplete());
    EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
              encoder_->Encode(*input_frame_, nullptr, nullptr));
    EXPECT_TRUE(encoded_cb_.EncodeComplete());
  }

  void ExpectFrameWith(int16_t picture_id,
                       int tl0_pic_idx,
                       uint8_t temporal_idx) {
    EXPECT_EQ(picture_id % (1 << 15),
              encoded_cb_.codec_specific_info_.codecSpecific.VP8.pictureId);
    EXPECT_EQ(tl0_pic_idx % (1 << 8),
              encoded_cb_.codec_specific_info_.codecSpecific.VP8.tl0PicIdx);
    EXPECT_EQ(temporal_idx,
              encoded_cb_.codec_specific_info_.codecSpecific.VP8.temporalIdx);
  }

  test::ScopedFieldTrials override_field_trials_;
  EncodedImageCallbackTestImpl encoded_cb_;
  DecodedImageCallbackTestImpl decoded_cb_;
  std::unique_ptr<VideoFrame> input_frame_;
  const std::unique_ptr<VideoEncoder> encoder_;
  const std::unique_ptr<VideoDecoder> decoder_;
  VideoCodec codec_settings_;
  TemporalLayersFactory tl_factory_;
};

TEST_F(TestVp8Impl, SetRateAllocation) {
  const int kBitrateBps = 300000;
  BitrateAllocation bitrate_allocation;
  bitrate_allocation.SetBitrate(0, 0, kBitrateBps);
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_UNINITIALIZED,
            encoder_->SetRateAllocation(bitrate_allocation,
                                        codec_settings_.maxFramerate));
  InitEncodeDecode();
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            encoder_->SetRateAllocation(bitrate_allocation,
                                        codec_settings_.maxFramerate));
}

TEST_F(TestVp8Impl, EncodeFrameAndRelease) {
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
  EncodeFrame();
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_UNINITIALIZED,
            encoder_->Encode(*input_frame_, nullptr, nullptr));
}

TEST_F(TestVp8Impl, InitDecode) {
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->Release());
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            decoder_->InitDecode(&codec_settings_, kNumCores));
}

TEST_F(TestVp8Impl, OnEncodedImageReportsInfo) {
  InitEncodeDecode();
  EncodeFrame();
  EXPECT_EQ(kInitialTimestampRtp, encoded_cb_.encoded_frame_._timeStamp);
  EXPECT_EQ(kInitialTimestampMs, encoded_cb_.encoded_frame_.capture_time_ms_);
  EXPECT_EQ(kWidth, static_cast<int>(encoded_cb_.encoded_frame_._encodedWidth));
  EXPECT_EQ(kHeight,
            static_cast<int>(encoded_cb_.encoded_frame_._encodedHeight));
  EXPECT_EQ(-1,  // Disabled for single stream.
            encoded_cb_.encoded_frame_.adapt_reason_.bw_resolutions_disabled);
}

// We only test the encoder here, since the decoded frame rotation is set based
// on the CVO RTP header extension in VCMDecodedFrameCallback::Decoded.
// TODO(brandtr): Consider passing through the rotation flag through the decoder
// in the same way as done in the encoder.
TEST_F(TestVp8Impl, EncodedRotationEqualsInputRotation) {
  InitEncodeDecode();
  input_frame_->set_rotation(kVideoRotation_0);
  EncodeFrame();
  EXPECT_EQ(kVideoRotation_0, encoded_cb_.encoded_frame_.rotation_);

  input_frame_->set_rotation(kVideoRotation_90);
  EncodeFrame();
  EXPECT_EQ(kVideoRotation_90, encoded_cb_.encoded_frame_.rotation_);
}

TEST_F(TestVp8Impl, DecodedQpEqualsEncodedQp) {
  InitEncodeDecode();
  EncodeFrame();
  // First frame should be a key frame.
  encoded_cb_.encoded_frame_._frameType = kVideoFrameKey;
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
  EXPECT_TRUE(decoded_cb_.DecodeComplete());
  EXPECT_GT(I420PSNR(input_frame_.get(), &*decoded_cb_.frame_), 36);
  EXPECT_EQ(encoded_cb_.encoded_frame_.qp_, *decoded_cb_.qp_);
}

#if defined(WEBRTC_ANDROID)
#define MAYBE_AlignedStrideEncodeDecode DISABLED_AlignedStrideEncodeDecode
#else
#define MAYBE_AlignedStrideEncodeDecode AlignedStrideEncodeDecode
#endif
TEST_F(TestVp8Impl, MAYBE_AlignedStrideEncodeDecode) {
  InitEncodeDecode();
  EncodeFrame();
  // First frame should be a key frame.
  encoded_cb_.encoded_frame_._frameType = kVideoFrameKey;
  encoded_cb_.encoded_frame_.ntp_time_ms_ = kTestNtpTimeMs;
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
  EXPECT_TRUE(decoded_cb_.DecodeComplete());
  // Compute PSNR on all planes (faster than SSIM).
  EXPECT_GT(I420PSNR(input_frame_.get(), &*decoded_cb_.frame_), 36);
  EXPECT_EQ(kInitialTimestampRtp, decoded_cb_.frame_->timestamp());
  EXPECT_EQ(kTestNtpTimeMs, decoded_cb_.frame_->ntp_time_ms());
}

#if defined(WEBRTC_ANDROID)
#define MAYBE_DecodeWithACompleteKeyFrame DISABLED_DecodeWithACompleteKeyFrame
#else
#define MAYBE_DecodeWithACompleteKeyFrame DecodeWithACompleteKeyFrame
#endif
TEST_F(TestVp8Impl, MAYBE_DecodeWithACompleteKeyFrame) {
  InitEncodeDecode();
  EncodeFrame();
  // Setting complete to false -> should return an error.
  encoded_cb_.encoded_frame_._completeFrame = false;
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR,
            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
  // Setting complete back to true. Forcing a delta frame.
  encoded_cb_.encoded_frame_._frameType = kVideoFrameDelta;
  encoded_cb_.encoded_frame_._completeFrame = true;
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR,
            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
  // Now setting a key frame.
  encoded_cb_.encoded_frame_._frameType = kVideoFrameKey;
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
  ASSERT_TRUE(decoded_cb_.frame_);
  EXPECT_GT(I420PSNR(input_frame_.get(), &*decoded_cb_.frame_), 36);
}

TEST_F(TestVp8Impl, EncoderWith2TemporalLayersRetainsRtpStateAfterRelease) {
  codec_settings_.VP8()->numberOfTemporalLayers = 2;
  InitEncodeDecode();

  // Temporal layer 0.
  EncodeFrame();
  EXPECT_EQ(0, encoded_cb_.codec_specific_info_.codecSpecific.VP8.temporalIdx);
  int16_t picture_id =
      encoded_cb_.codec_specific_info_.codecSpecific.VP8.pictureId;
  int tl0_pic_idx =
      encoded_cb_.codec_specific_info_.codecSpecific.VP8.tl0PicIdx;
  // Temporal layer 1.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 1, tl0_pic_idx + 0, 1);
  // Temporal layer 0.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 2, tl0_pic_idx + 1, 0);
  // Temporal layer 1.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 3, tl0_pic_idx + 1, 1);

  // Reinit.
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));

  // Temporal layer 0.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 4, tl0_pic_idx + 2, 0);
  // Temporal layer 1.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 5, tl0_pic_idx + 2, 1);
  // Temporal layer 0.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 6, tl0_pic_idx + 3, 0);
  // Temporal layer 1.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 7, tl0_pic_idx + 3, 1);
}

TEST_F(TestVp8Impl, EncoderWith3TemporalLayersRetainsRtpStateAfterRelease) {
  codec_settings_.VP8()->numberOfTemporalLayers = 3;
  InitEncodeDecode();

  // Temporal layer 0.
  EncodeFrame();
  EXPECT_EQ(0, encoded_cb_.codec_specific_info_.codecSpecific.VP8.temporalIdx);
  int16_t picture_id =
      encoded_cb_.codec_specific_info_.codecSpecific.VP8.pictureId;
  int tl0_pic_idx =
      encoded_cb_.codec_specific_info_.codecSpecific.VP8.tl0PicIdx;
  // Temporal layer 2.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 1, tl0_pic_idx + 0, 2);
  // Temporal layer 1.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 2, tl0_pic_idx + 0, 1);
  // Temporal layer 2.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 3, tl0_pic_idx + 0, 2);

  // Reinit.
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));

  // Temporal layer 0.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 4, tl0_pic_idx + 1, 0);
  // Temporal layer 2.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 5, tl0_pic_idx + 1, 2);
  // Temporal layer 1.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 6, tl0_pic_idx + 1, 1);
  // Temporal layer 2.
  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
  EncodeFrame();
  ExpectFrameWith(picture_id + 7, tl0_pic_idx + 1, 2);
}

TEST_F(TestVp8Impl, ScalingDisabledIfAutomaticResizeOff) {
  codec_settings_.VP8()->frameDroppingOn = true;
  codec_settings_.VP8()->automaticResizeOn = false;
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));

  VideoEncoder::ScalingSettings settings = encoder_->GetScalingSettings();
  EXPECT_FALSE(settings.enabled);
}

TEST_F(TestVp8Impl, ScalingEnabledIfAutomaticResizeOn) {
  codec_settings_.VP8()->frameDroppingOn = true;
  codec_settings_.VP8()->automaticResizeOn = true;
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));

  VideoEncoder::ScalingSettings settings = encoder_->GetScalingSettings();
  EXPECT_TRUE(settings.enabled);
  EXPECT_EQ(kDefaultMinPixelsPerFrame, settings.min_pixels_per_frame);
}

class TestVp8ImplWithForcedFallbackEnabled : public TestVp8Impl {
 public:
  TestVp8ImplWithForcedFallbackEnabled()
      : TestVp8Impl("WebRTC-VP8-Forced-Fallback-Encoder/Enabled-1,2,3," +
                    std::to_string(kMinPixelsPerFrame) + "/") {}
};

TEST_F(TestVp8ImplWithForcedFallbackEnabled, MinPixelsPerFrameConfigured) {
  codec_settings_.VP8()->frameDroppingOn = true;
  codec_settings_.VP8()->automaticResizeOn = true;
  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));

  VideoEncoder::ScalingSettings settings = encoder_->GetScalingSettings();
  EXPECT_TRUE(settings.enabled);
  EXPECT_EQ(kMinPixelsPerFrame, settings.min_pixels_per_frame);
}

}  // namespace webrtc
