1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *  Use of this source code is governed by a BSD-style license
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *  that can be found in the LICENSE file in the root of the source
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *  tree. An additional intellectual property rights grant can be found
79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod *  in the file PATENTS.  All contributing project authors may
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *  be found in the AUTHORS file in the root of the source tree.
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <assert.h>
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace webrtc {
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace test {
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectuint32_t RtpGenerator::GetRtpHeader(uint8_t payload_type,
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    size_t payload_length_samples,
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    WebRtcRTPHeader* rtp_header) {
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  assert(rtp_header);
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  if (!rtp_header) {
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return 0;
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  rtp_header->header.sequenceNumber = seq_number_++;
26727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  rtp_header->header.timestamp = timestamp_;
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  timestamp_ += static_cast<uint32_t>(payload_length_samples);
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  rtp_header->header.payloadType = payload_type;
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  rtp_header->header.markerBit = false;
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  rtp_header->header.ssrc = ssrc_;
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  rtp_header->header.numCSRCs = 0;
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  rtp_header->frameType = kAudioFrameSpeech;
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  uint32_t this_send_time = next_send_time_ms_;
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  assert(samples_per_ms_ > 0);
36727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  next_send_time_ms_ += ((1.0 + drift_factor_) * payload_length_samples) /
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      samples_per_ms_;
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  return this_send_time;
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid RtpGenerator::set_drift_factor(double factor) {
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  if (factor > -1.0) {
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    drift_factor_ = factor;
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectuint32_t TimestampJumpRtpGenerator::GetRtpHeader(uint8_t payload_type,
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                 size_t payload_length_samples,
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                 WebRtcRTPHeader* rtp_header) {
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  uint32_t ret = RtpGenerator::GetRtpHeader(
51aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      payload_type, payload_length_samples, rtp_header);
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  if (timestamp_ - static_cast<uint32_t>(payload_length_samples) <=
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          jump_from_timestamp_ &&
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      timestamp_ > jump_from_timestamp_) {
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    // We just moved across the |jump_from_timestamp_| timestamp. Do the jump.
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    timestamp_ = jump_to_timestamp_;
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  return ret;
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}  // namespace test
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}  // namespace webrtc
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project