1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CAST_STREAMING_CONSTANTS_H_
6 #define CAST_STREAMING_CONSTANTS_H_
7 
8 ////////////////////////////////////////////////////////////////////////////////
9 // NOTE: This file should only contain constants that are reasonably globally
10 // used (i.e., by many modules, and in all or nearly all subdirs).  Do NOT add
11 // non-POD constants, functions, interfaces, or any logic to this module.
12 ////////////////////////////////////////////////////////////////////////////////
13 
14 #include <chrono>
15 #include <ratio>
16 
17 namespace openscreen {
18 namespace cast {
19 
20 // Default target playout delay. The playout delay is the window of time between
21 // capture from the source until presentation at the receiver.
22 constexpr std::chrono::milliseconds kDefaultTargetPlayoutDelay(400);
23 
24 // Default UDP port, bound at the Receiver, for Cast Streaming. An
25 // implementation is required to use the port specified by the Receiver in its
26 // ANSWER control message, which may or may not match this port number here.
27 constexpr int kDefaultCastStreamingPort = 2344;
28 
29 // Default TCP port, bound at the TLS server socket level, for Cast Streaming.
30 // An implementation must use the port specified in the DNS-SD published record
31 // for connecting over TLS, which may or may not match this port number here.
32 constexpr int kDefaultCastPort = 8010;
33 
34 // Target number of milliseconds between the sending of RTCP reports.  Both
35 // senders and receivers regularly send RTCP reports to their peer.
36 constexpr std::chrono::milliseconds kRtcpReportInterval(500);
37 
38 // This is an important system-wide constant.  This limits how much history
39 // the implementation must retain in order to process the acknowledgements of
40 // past frames.
41 //
42 // This value is carefully choosen such that it fits in the 8-bits range for
43 // frame IDs. It is also less than half of the full 8-bits range such that
44 // logic can handle wrap around and compare two frame IDs meaningfully.
45 constexpr int kMaxUnackedFrames = 120;
46 
47 // The network must support a packet size of at least this many bytes.
48 constexpr int kRequiredNetworkPacketSize = 256;
49 
50 // The spec declares RTP timestamps must always have a timebase of 90000 ticks
51 // per second for video.
52 constexpr int kRtpVideoTimebase = 90000;
53 
54 // Minimum resolution is 320x240.
55 constexpr int kMinVideoHeight = 240;
56 constexpr int kMinVideoWidth = 320;
57 
58 // The default frame rate for capture options is 30FPS.
59 constexpr int kDefaultFrameRate = 30;
60 
61 // The default audio sample rate is 48kHz, slightly higher than standard
62 // consumer audio.
63 constexpr int kDefaultAudioSampleRate = 48000;
64 
65 // The default audio number of channels is set to stereo.
66 constexpr int kDefaultAudioChannels = 2;
67 
68 // Codecs known and understood by cast senders and receivers. Note: receivers
69 // are required to implement the following codecs to be Cast V2 compliant: H264,
70 // VP8, AAC, Opus. Senders have to implement at least one codec for audio and
71 // video to start a session.
72 enum class AudioCodec { kAac, kOpus };
73 enum class VideoCodec { kH264, kVp8, kHevc, kVp9 };
74 
75 }  // namespace cast
76 }  // namespace openscreen
77 
78 #endif  // CAST_STREAMING_CONSTANTS_H_
79