• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 MEDIA_CAST_CAST_CONFIG_H_
6 #define MEDIA_CAST_CAST_CONFIG_H_
7 
8 #include <list>
9 #include <string>
10 #include <vector>
11 
12 #include "base/basictypes.h"
13 #include "base/callback.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/memory/shared_memory.h"
16 #include "base/single_thread_task_runner.h"
17 #include "media/cast/cast_defines.h"
18 #include "media/cast/transport/cast_transport_config.h"
19 
20 namespace media {
21 class VideoEncodeAccelerator;
22 
23 namespace cast {
24 
25 enum RtcpMode {
26   kRtcpCompound,     // Compound RTCP mode is described by RFC 4585.
27   kRtcpReducedSize,  // Reduced-size RTCP mode is described by RFC 5506.
28 };
29 
30 // TODO(miu): Merge AudioSenderConfig and VideoSenderConfig and make their
31 // naming/documentation consistent with FrameReceiverConfig.
32 struct AudioSenderConfig {
33   AudioSenderConfig();
34 
35   // The sender ssrc is in rtp_config.ssrc.
36   uint32 incoming_feedback_ssrc;
37 
38   int rtcp_interval;
39   std::string rtcp_c_name;
40   RtcpMode rtcp_mode;
41 
42   transport::RtpConfig rtp_config;
43 
44   bool use_external_encoder;
45   int frequency;
46   int channels;
47   int bitrate;  // Set to <= 0 for "auto variable bitrate" (libopus knows best).
48   transport::AudioCodec codec;
49 };
50 
51 struct VideoSenderConfig {
52   VideoSenderConfig();
53 
54   // The sender ssrc is in rtp_config.ssrc.
55   uint32 incoming_feedback_ssrc;
56 
57   int rtcp_interval;
58   std::string rtcp_c_name;
59   RtcpMode rtcp_mode;
60 
61   transport::RtpConfig rtp_config;
62 
63   bool use_external_encoder;
64   int width;  // Incoming frames will be scaled to this size.
65   int height;
66 
67   float congestion_control_back_off;
68   int max_bitrate;
69   int min_bitrate;
70   int start_bitrate;
71   int max_qp;
72   int min_qp;
73   int max_frame_rate;
74   int max_number_of_video_buffers_used;  // Max value depend on codec.
75   transport::VideoCodec codec;
76   int number_of_encode_threads;
77 };
78 
79 // TODO(miu): Naming and minor type changes are badly needed in a later CL.
80 struct FrameReceiverConfig {
81   FrameReceiverConfig();
82   ~FrameReceiverConfig();
83 
84   // The receiver's SSRC identifier.
85   uint32 feedback_ssrc;  // TODO(miu): Rename to receiver_ssrc for clarity.
86 
87   // The sender's SSRC identifier.
88   uint32 incoming_ssrc;  // TODO(miu): Rename to sender_ssrc for clarity.
89 
90   // Mean interval (in milliseconds) between RTCP reports.
91   // TODO(miu): Remove this since it's never not kDefaultRtcpIntervalMs.
92   int rtcp_interval;
93 
94   // CNAME representing this receiver.
95   // TODO(miu): Remove this since it should be derived elsewhere (probably in
96   // the transport layer).
97   std::string rtcp_c_name;
98 
99   // Determines amount of detail in RTCP reports.
100   // TODO(miu): Remove this since it's never anything but kRtcpReducedSize.
101   RtcpMode rtcp_mode;
102 
103   // The total amount of time between a frame's capture/recording on the sender
104   // and its playback on the receiver (i.e., shown to a user).  This is fixed as
105   // a value large enough to give the system sufficient time to encode,
106   // transmit/retransmit, receive, decode, and render; given its run-time
107   // environment (sender/receiver hardware performance, network conditions,
108   // etc.).
109   int rtp_max_delay_ms;  // TODO(miu): Change to TimeDelta target_playout_delay.
110 
111   // RTP payload type enum: Specifies the type/encoding of frame data.
112   int rtp_payload_type;
113 
114   // RTP timebase: The number of RTP units advanced per one second.  For audio,
115   // this is the sampling rate.  For video, by convention, this is 90 kHz.
116   int frequency;  // TODO(miu): Rename to rtp_timebase for clarity.
117 
118   // Number of channels.  For audio, this is normally 2.  For video, this must
119   // be 1 as Cast does not have support for stereoscopic video.
120   int channels;
121 
122   // The target frame rate.  For audio, this is normally 100 (i.e., frames have
123   // a duration of 10ms each).  For video, this is normally 30, but any frame
124   // rate is supported.
125   int max_frame_rate;  // TODO(miu): Rename to target_frame_rate.
126 
127   // Codec used for the compression of signal data.
128   // TODO(miu): Merge the AudioCodec and VideoCodec enums into one so this union
129   // is not necessary.
130   union MergedCodecPlaceholder {
131     transport::AudioCodec audio;
132     transport::VideoCodec video;
MergedCodecPlaceholder()133     MergedCodecPlaceholder() : audio(transport::kUnknownAudioCodec) {}
134   } codec;
135 
136   // The AES crypto key and initialization vector.  Each of these strings
137   // contains the data in binary form, of size kAesKeySize.  If they are empty
138   // strings, crypto is not being used.
139   std::string aes_key;
140   std::string aes_iv_mask;
141 };
142 
143 // import from media::cast::transport
144 typedef transport::Packet Packet;
145 typedef transport::PacketList PacketList;
146 
147 typedef base::Callback<void(CastInitializationStatus)>
148     CastInitializationCallback;
149 
150 typedef base::Callback<void(scoped_refptr<base::SingleThreadTaskRunner>,
151                             scoped_ptr<media::VideoEncodeAccelerator>)>
152     ReceiveVideoEncodeAcceleratorCallback;
153 typedef base::Callback<void(const ReceiveVideoEncodeAcceleratorCallback&)>
154     CreateVideoEncodeAcceleratorCallback;
155 
156 typedef base::Callback<void(scoped_ptr<base::SharedMemory>)>
157     ReceiveVideoEncodeMemoryCallback;
158 typedef base::Callback<void(size_t size,
159                             const ReceiveVideoEncodeMemoryCallback&)>
160     CreateVideoEncodeMemoryCallback;
161 
162 }  // namespace cast
163 }  // namespace media
164 
165 #endif  // MEDIA_CAST_CAST_CONFIG_H_
166