/*
 *  Copyright (c) 2013 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 <assert.h>

#include "modules/audio_coding/neteq/tools/rtp_generator.h"

namespace webrtc {
namespace test {

uint32_t RtpGenerator::GetRtpHeader(uint8_t payload_type,
                                    size_t payload_length_samples,
                                    RTPHeader* rtp_header) {
  assert(rtp_header);
  if (!rtp_header) {
    return 0;
  }
  rtp_header->sequenceNumber = seq_number_++;
  rtp_header->timestamp = timestamp_;
  timestamp_ += static_cast<uint32_t>(payload_length_samples);
  rtp_header->payloadType = payload_type;
  rtp_header->markerBit = false;
  rtp_header->ssrc = ssrc_;
  rtp_header->numCSRCs = 0;

  uint32_t this_send_time = next_send_time_ms_;
  assert(samples_per_ms_ > 0);
  next_send_time_ms_ += ((1.0 + drift_factor_) * payload_length_samples) /
      samples_per_ms_;
  return this_send_time;
}

void RtpGenerator::set_drift_factor(double factor) {
  if (factor > -1.0) {
    drift_factor_ = factor;
  }
}

uint32_t TimestampJumpRtpGenerator::GetRtpHeader(uint8_t payload_type,
                                                 size_t payload_length_samples,
                                                 RTPHeader* rtp_header) {
  uint32_t ret = RtpGenerator::GetRtpHeader(
      payload_type, payload_length_samples, rtp_header);
  if (timestamp_ - static_cast<uint32_t>(payload_length_samples) <=
          jump_from_timestamp_ &&
      timestamp_ > jump_from_timestamp_) {
    // We just moved across the |jump_from_timestamp_| timestamp. Do the jump.
    timestamp_ = jump_to_timestamp_;
  }
  return ret;
}

}  // namespace test
}  // namespace webrtc
