mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00

Bug: webrtc:5876 Change-Id: I0c92f9410fcf0832bfa321229b3437134255dba6 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/128085 Commit-Queue: Niels Moller <nisse@webrtc.org> Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27190}
273 lines
8.2 KiB
C++
273 lines
8.2 KiB
C++
/*
|
|
* 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 COMMON_TYPES_H_
|
|
#define COMMON_TYPES_H_
|
|
|
|
#include <stddef.h> // For size_t
|
|
#include <cstdint>
|
|
|
|
// TODO(bugs.webrtc.org/7660): Delete include once downstream code is updated.
|
|
#include "api/video/video_codec_type.h"
|
|
// TODO(bugs.webrtc.org/5876): For AudioFrameType. Delete when downstream code
|
|
// is updated.
|
|
#include "modules/audio_coding/include/audio_coding_module_typedefs.h"
|
|
|
|
#if defined(_MSC_VER)
|
|
// Disable "new behavior: elements of array will be default initialized"
|
|
// warning. Affects OverUseDetectorOptions.
|
|
#pragma warning(disable : 4351)
|
|
#endif
|
|
|
|
namespace webrtc {
|
|
|
|
// TODO(bugs.webrtc.org/6883): This type should be split into separate types for
|
|
// audio and video, and then moved out of this file.
|
|
enum FrameTypeDeprecated {
|
|
kEmptyFrame = 0,
|
|
kAudioFrameSpeech = 1,
|
|
kAudioFrameCN = 2,
|
|
kVideoFrameKey = 3,
|
|
kVideoFrameDelta = 4,
|
|
};
|
|
|
|
// Can't use RTC_DEPRECATED until Chromium is updated.
|
|
typedef FrameTypeDeprecated FrameType;
|
|
|
|
using VideoFrameType = FrameTypeDeprecated;
|
|
|
|
// Statistics for RTCP packet types.
|
|
struct RtcpPacketTypeCounter {
|
|
RtcpPacketTypeCounter()
|
|
: first_packet_time_ms(-1),
|
|
nack_packets(0),
|
|
fir_packets(0),
|
|
pli_packets(0),
|
|
nack_requests(0),
|
|
unique_nack_requests(0) {}
|
|
|
|
void Add(const RtcpPacketTypeCounter& other) {
|
|
nack_packets += other.nack_packets;
|
|
fir_packets += other.fir_packets;
|
|
pli_packets += other.pli_packets;
|
|
nack_requests += other.nack_requests;
|
|
unique_nack_requests += other.unique_nack_requests;
|
|
if (other.first_packet_time_ms != -1 &&
|
|
(other.first_packet_time_ms < first_packet_time_ms ||
|
|
first_packet_time_ms == -1)) {
|
|
// Use oldest time.
|
|
first_packet_time_ms = other.first_packet_time_ms;
|
|
}
|
|
}
|
|
|
|
void Subtract(const RtcpPacketTypeCounter& other) {
|
|
nack_packets -= other.nack_packets;
|
|
fir_packets -= other.fir_packets;
|
|
pli_packets -= other.pli_packets;
|
|
nack_requests -= other.nack_requests;
|
|
unique_nack_requests -= other.unique_nack_requests;
|
|
if (other.first_packet_time_ms != -1 &&
|
|
(other.first_packet_time_ms > first_packet_time_ms ||
|
|
first_packet_time_ms == -1)) {
|
|
// Use youngest time.
|
|
first_packet_time_ms = other.first_packet_time_ms;
|
|
}
|
|
}
|
|
|
|
int64_t TimeSinceFirstPacketInMs(int64_t now_ms) const {
|
|
return (first_packet_time_ms == -1) ? -1 : (now_ms - first_packet_time_ms);
|
|
}
|
|
|
|
int UniqueNackRequestsInPercent() const {
|
|
if (nack_requests == 0) {
|
|
return 0;
|
|
}
|
|
return static_cast<int>((unique_nack_requests * 100.0f / nack_requests) +
|
|
0.5f);
|
|
}
|
|
|
|
int64_t first_packet_time_ms; // Time when first packet is sent/received.
|
|
uint32_t nack_packets; // Number of RTCP NACK packets.
|
|
uint32_t fir_packets; // Number of RTCP FIR packets.
|
|
uint32_t pli_packets; // Number of RTCP PLI packets.
|
|
uint32_t nack_requests; // Number of NACKed RTP packets.
|
|
uint32_t unique_nack_requests; // Number of unique NACKed RTP packets.
|
|
};
|
|
|
|
class RtcpPacketTypeCounterObserver {
|
|
public:
|
|
virtual ~RtcpPacketTypeCounterObserver() {}
|
|
virtual void RtcpPacketTypesCounterUpdated(
|
|
uint32_t ssrc,
|
|
const RtcpPacketTypeCounter& packet_counter) = 0;
|
|
};
|
|
|
|
// Callback, used to notify an observer whenever new rates have been estimated.
|
|
class BitrateStatisticsObserver {
|
|
public:
|
|
virtual ~BitrateStatisticsObserver() {}
|
|
|
|
virtual void Notify(uint32_t total_bitrate_bps,
|
|
uint32_t retransmit_bitrate_bps,
|
|
uint32_t ssrc) = 0;
|
|
};
|
|
|
|
struct FrameCounts {
|
|
FrameCounts() : key_frames(0), delta_frames(0) {}
|
|
int key_frames;
|
|
int delta_frames;
|
|
};
|
|
|
|
// Callback, used to notify an observer whenever frame counts have been updated.
|
|
class FrameCountObserver {
|
|
public:
|
|
virtual ~FrameCountObserver() {}
|
|
virtual void FrameCountUpdated(const FrameCounts& frame_counts,
|
|
uint32_t ssrc) = 0;
|
|
};
|
|
|
|
// Callback, used to notify an observer whenever the send-side delay is updated.
|
|
class SendSideDelayObserver {
|
|
public:
|
|
virtual ~SendSideDelayObserver() {}
|
|
virtual void SendSideDelayUpdated(int avg_delay_ms,
|
|
int max_delay_ms,
|
|
uint32_t ssrc) = 0;
|
|
};
|
|
|
|
// Callback, used to notify an observer whenever a packet is sent to the
|
|
// transport.
|
|
// TODO(asapersson): This class will remove the need for SendSideDelayObserver.
|
|
// Remove SendSideDelayObserver once possible.
|
|
class SendPacketObserver {
|
|
public:
|
|
virtual ~SendPacketObserver() {}
|
|
virtual void OnSendPacket(uint16_t packet_id,
|
|
int64_t capture_time_ms,
|
|
uint32_t ssrc) = 0;
|
|
};
|
|
|
|
// Callback, used to notify an observer when the overhead per packet
|
|
// has changed.
|
|
class OverheadObserver {
|
|
public:
|
|
virtual ~OverheadObserver() = default;
|
|
virtual void OnOverheadChanged(size_t overhead_bytes_per_packet) = 0;
|
|
};
|
|
|
|
// RTP
|
|
enum { kRtpCsrcSize = 15 }; // RFC 3550 page 13
|
|
|
|
// ==================================================================
|
|
// Video specific types
|
|
// ==================================================================
|
|
|
|
// TODO(nisse): Delete, and switch to fourcc values everywhere?
|
|
// Supported video types.
|
|
enum class VideoType {
|
|
kUnknown,
|
|
kI420,
|
|
kIYUV,
|
|
kRGB24,
|
|
kABGR,
|
|
kARGB,
|
|
kARGB4444,
|
|
kRGB565,
|
|
kARGB1555,
|
|
kYUY2,
|
|
kYV12,
|
|
kUYVY,
|
|
kMJPEG,
|
|
kNV21,
|
|
kNV12,
|
|
kBGRA,
|
|
};
|
|
|
|
// TODO(magjed): Move this and other H264 related classes out to their own file.
|
|
namespace H264 {
|
|
|
|
enum Profile {
|
|
kProfileConstrainedBaseline,
|
|
kProfileBaseline,
|
|
kProfileMain,
|
|
kProfileConstrainedHigh,
|
|
kProfileHigh,
|
|
};
|
|
|
|
} // namespace H264
|
|
|
|
struct SpatialLayer {
|
|
bool operator==(const SpatialLayer& other) const;
|
|
bool operator!=(const SpatialLayer& other) const { return !(*this == other); }
|
|
|
|
unsigned short width;
|
|
unsigned short height;
|
|
float maxFramerate; // fps.
|
|
unsigned char numberOfTemporalLayers;
|
|
unsigned int maxBitrate; // kilobits/sec.
|
|
unsigned int targetBitrate; // kilobits/sec.
|
|
unsigned int minBitrate; // kilobits/sec.
|
|
unsigned int qpMax; // minimum quality
|
|
bool active; // encoded and sent.
|
|
};
|
|
|
|
// Simulcast is when the same stream is encoded multiple times with different
|
|
// settings such as resolution.
|
|
typedef SpatialLayer SimulcastStream;
|
|
|
|
// Bandwidth over-use detector options. These are used to drive
|
|
// experimentation with bandwidth estimation parameters.
|
|
// See modules/remote_bitrate_estimator/overuse_detector.h
|
|
// TODO(terelius): This is only used in overuse_estimator.cc, and only in the
|
|
// default constructed state. Can we move the relevant variables into that
|
|
// class and delete this? See also disabled warning at line 27
|
|
struct OverUseDetectorOptions {
|
|
OverUseDetectorOptions()
|
|
: initial_slope(8.0 / 512.0),
|
|
initial_offset(0),
|
|
initial_e(),
|
|
initial_process_noise(),
|
|
initial_avg_noise(0.0),
|
|
initial_var_noise(50) {
|
|
initial_e[0][0] = 100;
|
|
initial_e[1][1] = 1e-1;
|
|
initial_e[0][1] = initial_e[1][0] = 0;
|
|
initial_process_noise[0] = 1e-13;
|
|
initial_process_noise[1] = 1e-3;
|
|
}
|
|
double initial_slope;
|
|
double initial_offset;
|
|
double initial_e[2][2];
|
|
double initial_process_noise[2];
|
|
double initial_avg_noise;
|
|
double initial_var_noise;
|
|
};
|
|
|
|
// Minimum and maximum playout delay values from capture to render.
|
|
// These are best effort values.
|
|
//
|
|
// A value < 0 indicates no change from previous valid value.
|
|
//
|
|
// min = max = 0 indicates that the receiver should try and render
|
|
// frame as soon as possible.
|
|
//
|
|
// min = x, max = y indicates that the receiver is free to adapt
|
|
// in the range (x, y) based on network jitter.
|
|
//
|
|
// Note: Given that this gets embedded in a union, it is up-to the owner to
|
|
// initialize these values.
|
|
struct PlayoutDelay {
|
|
int min_ms;
|
|
int max_ms;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // COMMON_TYPES_H_
|