/*
 *  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_VIDEO_CODING_TEST_RTP_PLAYER_H_
#define WEBRTC_MODULES_VIDEO_CODING_TEST_RTP_PLAYER_H_

#include "typedefs.h"
#include "rtp_rtcp.h"
#include "critical_section_wrapper.h"
#include "video_coding_defines.h"
#include "modules/video_coding/main/source/tick_time_base.h"

#include <stdio.h>
#include <list>
#include <string>

#define HDR_SIZE 8 // rtpplay packet header size in bytes
#define FIRSTLINELEN 40
#define RAND_VEC_LENGTH 4096

struct PayloadCodecTuple;

struct RawRtpPacket
{
public:
    RawRtpPacket(WebRtc_UWord8* rtp_data, WebRtc_UWord16 rtp_length);
    ~RawRtpPacket();

    uint8_t* data;
    uint16_t length;
    int64_t resend_time_ms;
};

typedef std::list<PayloadCodecTuple*> PayloadTypeList;
typedef std::list<RawRtpPacket*> RtpPacketList;
typedef RtpPacketList::iterator RtpPacketIterator;
typedef RtpPacketList::const_iterator ConstRtpPacketIterator;

class LostPackets {
 public:
  LostPackets();
  ~LostPackets();

  void AddPacket(RawRtpPacket* packet);
  void SetResendTime(uint16_t sequenceNumber,
                     int64_t resendTime,
                     int64_t nowMs);
  RawRtpPacket* NextPacketToResend(int64_t timeNow);
  int NumberOfPacketsToResend() const;
  void SetPacketResent(uint16_t seqNo, int64_t nowMs);
  void Print() const;

 private:
  webrtc::CriticalSectionWrapper* crit_sect_;
  int loss_count_;
  FILE* debug_file_;
  RtpPacketList packets_;
};

struct PayloadCodecTuple
{
    PayloadCodecTuple(WebRtc_UWord8 plType, std::string codecName, webrtc::VideoCodecType type) :
        name(codecName), payloadType(plType), codecType(type) {};
    const std::string name;
    const WebRtc_UWord8 payloadType;
    const webrtc::VideoCodecType codecType;
};

class RTPPlayer : public webrtc::VCMPacketRequestCallback
{
public:
    RTPPlayer(const char* filename,
              webrtc::RtpData* callback,
              webrtc::TickTimeBase* clock);
    virtual ~RTPPlayer();

    WebRtc_Word32 Initialize(const PayloadTypeList* payloadList);
    WebRtc_Word32 NextPacket(const WebRtc_Word64 timeNow);
    WebRtc_UWord32 TimeUntilNextPacket() const;
    WebRtc_Word32 SimulatePacketLoss(float lossRate, bool enableNack = false, WebRtc_UWord32 rttMs = 0);
    WebRtc_Word32 SetReordering(bool enabled);
    WebRtc_Word32 ResendPackets(const WebRtc_UWord16* sequenceNumbers, WebRtc_UWord16 length);
    void Print() const;

private:
    WebRtc_Word32 SendPacket(WebRtc_UWord8* rtpData, WebRtc_UWord16 rtpLen);
    WebRtc_Word32 ReadPacket(WebRtc_Word16* rtpdata, WebRtc_UWord32* offset);
    WebRtc_Word32 ReadHeader();
    webrtc::TickTimeBase* _clock;
    FILE*              _rtpFile;
    webrtc::RtpRtcp&   _rtpModule;
    WebRtc_UWord32     _nextRtpTime;
    webrtc::RtpData*   _dataCallback;
    bool               _firstPacket;
    float              _lossRate;
    bool               _nackEnabled;
    LostPackets        _lostPackets;
    WebRtc_UWord32     _resendPacketCount;
    WebRtc_Word32      _noLossStartup;
    bool               _endOfFile;
    WebRtc_UWord32     _rttMs;
    WebRtc_Word64      _firstPacketRtpTime;
    WebRtc_Word64      _firstPacketTimeMs;
    RawRtpPacket*      _reorderBuffer;
    bool               _reordering;
    WebRtc_Word16      _nextPacket[8000];
    WebRtc_Word32      _nextPacketLength;
    int                _randVec[RAND_VEC_LENGTH];
    int                _randVecPos;
};

#endif // WEBRTC_MODULES_VIDEO_CODING_TEST_RTP_PLAYER_H_
