/*
 *  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 <list>
#include <memory>
#include <utility>
#include <vector>

#include "webrtc/base/basictypes.h"
#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
#include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
#include "webrtc/modules/rtp_rtcp/source/ulpfec_generator.h"
#include "webrtc/test/gtest.h"

namespace webrtc {

namespace {
using test::fec::AugmentedPacket;
using test::fec::AugmentedPacketGenerator;

constexpr int kFecPayloadType = 96;
constexpr int kRedPayloadType = 97;
constexpr uint32_t kMediaSsrc = 835424;
}  // namespace

void VerifyHeader(uint16_t seq_num,
                  uint32_t timestamp,
                  int red_payload_type,
                  int fec_payload_type,
                  RedPacket* packet,
                  bool marker_bit) {
  EXPECT_GT(packet->length(), kRtpHeaderSize);
  EXPECT_TRUE(packet->data() != NULL);
  uint8_t* data = packet->data();
  // Marker bit not set.
  EXPECT_EQ(marker_bit ? 0x80 : 0, data[1] & 0x80);
  EXPECT_EQ(red_payload_type, data[1] & 0x7F);
  EXPECT_EQ(seq_num, (data[2] << 8) + data[3]);
  uint32_t parsed_timestamp =
      (data[4] << 24) + (data[5] << 16) + (data[6] << 8) + data[7];
  EXPECT_EQ(timestamp, parsed_timestamp);
  EXPECT_EQ(static_cast<uint8_t>(fec_payload_type), data[kRtpHeaderSize]);
}

class UlpfecGeneratorTest : public ::testing::Test {
 protected:
  UlpfecGeneratorTest() : packet_generator_(kMediaSsrc) {}

  UlpfecGenerator ulpfec_generator_;
  AugmentedPacketGenerator packet_generator_;
};

// Verifies bug found via fuzzing, where a gap in the packet sequence caused us
// to move past the end of the current FEC packet mask byte without moving to
// the next byte. That likely caused us to repeatedly read from the same byte,
// and if that byte didn't protect packets we would generate empty FEC.
TEST_F(UlpfecGeneratorTest, NoEmptyFecWithSeqNumGaps) {
  struct Packet {
    size_t header_size;
    size_t payload_size;
    uint16_t seq_num;
    bool marker_bit;
  };
  std::vector<Packet> protected_packets;
  protected_packets.push_back({15, 3, 41, 0});
  protected_packets.push_back({14, 1, 43, 0});
  protected_packets.push_back({19, 0, 48, 0});
  protected_packets.push_back({19, 0, 50, 0});
  protected_packets.push_back({14, 3, 51, 0});
  protected_packets.push_back({13, 8, 52, 0});
  protected_packets.push_back({19, 2, 53, 0});
  protected_packets.push_back({12, 3, 54, 0});
  protected_packets.push_back({21, 0, 55, 0});
  protected_packets.push_back({13, 3, 57, 1});
  FecProtectionParams params = {117, 3, kFecMaskBursty};
  ulpfec_generator_.SetFecParameters(params);
  uint8_t packet[28] = {0};
  for (Packet p : protected_packets) {
    if (p.marker_bit) {
      packet[1] |= 0x80;
    } else {
      packet[1] &= ~0x80;
    }
    ByteWriter<uint16_t>::WriteBigEndian(&packet[2], p.seq_num);
    ulpfec_generator_.AddRtpPacketAndGenerateFec(packet, p.payload_size,
                                                 p.header_size);
    size_t num_fec_packets = ulpfec_generator_.NumAvailableFecPackets();
    if (num_fec_packets > 0) {
      std::vector<std::unique_ptr<RedPacket>> fec_packets =
          ulpfec_generator_.GetUlpfecPacketsAsRed(
              kRedPayloadType, kFecPayloadType, 100, p.header_size);
      EXPECT_EQ(num_fec_packets, fec_packets.size());
    }
  }
}

TEST_F(UlpfecGeneratorTest, OneFrameFec) {
  // The number of media packets (|kNumPackets|), number of frames (one for
  // this test), and the protection factor (|params->fec_rate|) are set to make
  // sure the conditions for generating FEC are satisfied. This means:
  // (1) protection factor is high enough so that actual overhead over 1 frame
  // of packets is within |kMaxExcessOverhead|, and (2) the total number of
  // media packets for 1 frame is at least |minimum_media_packets_fec_|.
  constexpr size_t kNumPackets = 4;
  FecProtectionParams params = {15, 3, kFecMaskRandom};
  packet_generator_.NewFrame(kNumPackets);
  ulpfec_generator_.SetFecParameters(params);  // Expecting one FEC packet.
  uint32_t last_timestamp = 0;
  for (size_t i = 0; i < kNumPackets; ++i) {
    std::unique_ptr<AugmentedPacket> packet =
        packet_generator_.NextPacket(i, 10);
    EXPECT_EQ(0, ulpfec_generator_.AddRtpPacketAndGenerateFec(
                     packet->data, packet->length, kRtpHeaderSize));
    last_timestamp = packet->header.header.timestamp;
  }
  EXPECT_TRUE(ulpfec_generator_.FecAvailable());
  uint16_t seq_num = packet_generator_.NextPacketSeqNum();
  std::vector<std::unique_ptr<RedPacket>> red_packets =
      ulpfec_generator_.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType,
                                              seq_num, kRtpHeaderSize);
  EXPECT_FALSE(ulpfec_generator_.FecAvailable());
  ASSERT_EQ(1u, red_packets.size());
  VerifyHeader(seq_num, last_timestamp, kRedPayloadType, kFecPayloadType,
               red_packets.front().get(), false);
}

TEST_F(UlpfecGeneratorTest, TwoFrameFec) {
  // The number of media packets/frame (|kNumPackets|), the number of frames
  // (|kNumFrames|), and the protection factor (|params->fec_rate|) are set to
  // make sure the conditions for generating FEC are satisfied. This means:
  // (1) protection factor is high enough so that actual overhead over
  // |kNumFrames| is within |kMaxExcessOverhead|, and (2) the total number of
  // media packets for |kNumFrames| frames is at least
  // |minimum_media_packets_fec_|.
  constexpr size_t kNumPackets = 2;
  constexpr size_t kNumFrames = 2;

  FecProtectionParams params = {15, 3, kFecMaskRandom};
  ulpfec_generator_.SetFecParameters(params);  // Expecting one FEC packet.
  uint32_t last_timestamp = 0;
  for (size_t i = 0; i < kNumFrames; ++i) {
    packet_generator_.NewFrame(kNumPackets);
    for (size_t j = 0; j < kNumPackets; ++j) {
      std::unique_ptr<AugmentedPacket> packet =
          packet_generator_.NextPacket(i * kNumPackets + j, 10);
      EXPECT_EQ(0, ulpfec_generator_.AddRtpPacketAndGenerateFec(
                       packet->data, packet->length, kRtpHeaderSize));
      last_timestamp = packet->header.header.timestamp;
    }
  }
  EXPECT_TRUE(ulpfec_generator_.FecAvailable());
  uint16_t seq_num = packet_generator_.NextPacketSeqNum();
  std::vector<std::unique_ptr<RedPacket>> red_packets =
      ulpfec_generator_.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType,
                                              seq_num, kRtpHeaderSize);
  EXPECT_FALSE(ulpfec_generator_.FecAvailable());
  ASSERT_EQ(1u, red_packets.size());
  VerifyHeader(seq_num, last_timestamp, kRedPayloadType, kFecPayloadType,
               red_packets.front().get(), false);
}

TEST_F(UlpfecGeneratorTest, BuildRedPacket) {
  packet_generator_.NewFrame(1);
  std::unique_ptr<AugmentedPacket> packet = packet_generator_.NextPacket(0, 10);
  std::unique_ptr<RedPacket> red_packet = UlpfecGenerator::BuildRedPacket(
      packet->data, packet->length - kRtpHeaderSize, kRtpHeaderSize,
      kRedPayloadType);
  EXPECT_EQ(packet->length + 1, red_packet->length());
  VerifyHeader(packet->header.header.sequenceNumber,
               packet->header.header.timestamp, kRedPayloadType,
               packet->header.header.payloadType, red_packet.get(),
               true);  // Marker bit set.
  for (int i = 0; i < 10; ++i) {
    EXPECT_EQ(i, red_packet->data()[kRtpHeaderSize + 1 + i]);
  }
}

TEST_F(UlpfecGeneratorTest, BuildRedPacketWithEmptyPayload) {
  constexpr size_t kNumFrames = 1;
  constexpr size_t kPayloadLength = 0;
  constexpr size_t kRedForFecHeaderLength = 1;

  packet_generator_.NewFrame(kNumFrames);
  std::unique_ptr<AugmentedPacket> packet(
      packet_generator_.NextPacket(0, kPayloadLength));
  std::unique_ptr<RedPacket> red_packet = UlpfecGenerator::BuildRedPacket(
      packet->data, packet->length - kRtpHeaderSize, kRtpHeaderSize,
      kRedPayloadType);
  EXPECT_EQ(packet->length + kRedForFecHeaderLength, red_packet->length());
  VerifyHeader(packet->header.header.sequenceNumber,
               packet->header.header.timestamp, kRedPayloadType,
               packet->header.header.payloadType, red_packet.get(),
               true);  // Marker bit set.
}

}  // namespace webrtc
