blob: dd59f8a9214615f92d914e1bc8e25e5fab7da363 [file] [log] [blame]
/*
* Copyright (c) 2011 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_TRANSMISSION_BUCKET_H_
#define WEBRTC_MODULES_RTP_RTCP_TRANSMISSION_BUCKET_H_
#include <vector>
#include "typedefs.h"
namespace webrtc
{
class CriticalSectionWrapper;
class RtpRtcpClock;
class TransmissionBucket {
public:
TransmissionBucket(RtpRtcpClock* clock);
~TransmissionBucket();
// Resets members to initial state.
void Reset();
// Adds packet to be sent.
void Fill(uint16_t seq_num, uint32_t timestamp, uint16_t num_bytes);
// Returns true if there is no packet to be sent.
bool Empty();
// Updates the number of bytes that can be sent for the next time interval.
void UpdateBytesPerInterval(uint32_t delta_time_in_ms,
uint16_t target_bitrate_kbps);
// Checks if next packet in line can be transmitted. Returns the sequence
// number of the packet on success, -1 otherwise. The packet is removed from
// the vector on success.
int32_t GetNextPacket();
private:
struct Packet {
Packet(uint16_t seq_number,
uint32_t time_stamp,
uint16_t length_in_bytes,
int64_t now)
: sequence_number(seq_number),
timestamp(time_stamp),
length(length_in_bytes),
stored_ms(now),
transmitted_ms(0) {
}
uint16_t sequence_number;
uint32_t timestamp;
uint16_t length;
int64_t stored_ms;
int64_t transmitted_ms;
};
bool SameFrameAndPacketIntervalTimeElapsed(const Packet& current_packet);
bool NewFrameAndFrameIntervalTimeElapsed(const Packet& current_packet);
RtpRtcpClock* clock_;
CriticalSectionWrapper* critsect_;
uint32_t accumulator_;
int32_t bytes_rem_interval_;
std::vector<Packet> packets_;
Packet last_transmitted_packet_;
};
} // namespace webrtc
#endif // WEBRTC_MODULES_RTP_RTCP_TRANSMISSION_BUCKET_H_