/*
 *  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.
 */

#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_PRODUCER_FEC_H_
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_PRODUCER_FEC_H_

#include <list>
#include <vector>

#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"

namespace webrtc {

class RedPacket {
 public:
  explicit RedPacket(size_t length);
  ~RedPacket();
  void CreateHeader(const uint8_t* rtp_header, size_t header_length,
                    int red_pl_type, int pl_type);
  void SetSeqNum(int seq_num);
  void AssignPayload(const uint8_t* payload, size_t length);
  void ClearMarkerBit();
  uint8_t* data() const;
  size_t length() const;

 private:
  uint8_t* data_;
  size_t length_;
  size_t header_length_;
};

class ProducerFec {
 public:
  explicit ProducerFec(ForwardErrorCorrection* fec);
  ~ProducerFec();

  void SetFecParameters(const FecProtectionParams* params,
                        int max_fec_frames);

  // The caller is expected to delete the memory when done.
  RedPacket* BuildRedPacket(const uint8_t* data_buffer,
                            size_t payload_length,
                            size_t rtp_header_length,
                            int red_pl_type);

  int AddRtpPacketAndGenerateFec(const uint8_t* data_buffer,
                                 size_t payload_length,
                                 size_t rtp_header_length);

  bool ExcessOverheadBelowMax();

  bool MinimumMediaPacketsReached();

  bool FecAvailable() const;
  size_t NumAvailableFecPackets() const;

  // GetFecPackets allocates memory and creates FEC packets, but the caller is
  // assumed to delete the memory when done with the packets.
  std::vector<RedPacket*> GetFecPackets(int red_pl_type,
                                        int fec_pl_type,
                                        uint16_t first_seq_num,
                                        size_t rtp_header_length);

 private:
  void DeletePackets();
  int Overhead() const;
  ForwardErrorCorrection* fec_;
  std::list<ForwardErrorCorrection::Packet*> media_packets_fec_;
  std::list<ForwardErrorCorrection::Packet*> fec_packets_;
  int num_frames_;
  int num_first_partition_;
  int minimum_media_packets_fec_;
  FecProtectionParams params_;
  FecProtectionParams new_params_;
};

}  // namespace webrtc

#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_PRODUCER_FEC_H_
