OLD | NEW |
| (Empty) |
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 #include "chrome/renderer/media/cast_send_transport.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "chrome/renderer/media/cast_session.h" | |
9 #include "chrome/renderer/media/cast_udp_transport.h" | |
10 #include "media/cast/cast_config.h" | |
11 #include "media/cast/cast_defines.h" | |
12 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | |
13 | |
14 using media::cast::AudioSenderConfig; | |
15 using media::cast::VideoSenderConfig; | |
16 | |
17 namespace { | |
18 const char kCodecNameOpus[] = "OPUS"; | |
19 const char kCodecNameVp8[] = "VP8"; | |
20 | |
21 CastRtpPayloadParams DefaultOpusPayload() { | |
22 CastRtpPayloadParams payload; | |
23 payload.payload_type = 111; | |
24 payload.codec_name = kCodecNameOpus; | |
25 payload.clock_rate = 48000; | |
26 payload.channels = 2; | |
27 payload.min_bitrate = payload.max_bitrate = | |
28 media::cast::kDefaultAudioEncoderBitrate; | |
29 return payload; | |
30 } | |
31 | |
32 CastRtpPayloadParams DefaultVp8Payload() { | |
33 CastRtpPayloadParams payload; | |
34 payload.payload_type = 100; | |
35 payload.codec_name = kCodecNameVp8; | |
36 payload.clock_rate = 90000; | |
37 payload.width = 1280; | |
38 payload.height = 720; | |
39 payload.min_bitrate = 50 * 1000; | |
40 payload.max_bitrate = 2000 * 1000; | |
41 return payload; | |
42 } | |
43 | |
44 CastRtpCaps DefaultAudioCaps() { | |
45 CastRtpCaps caps; | |
46 caps.payloads.push_back(DefaultOpusPayload()); | |
47 // TODO(hclam): Fill in |rtcp_features| and |fec_mechanisms|. | |
48 return caps; | |
49 } | |
50 | |
51 CastRtpCaps DefaultVideoCaps() { | |
52 CastRtpCaps caps; | |
53 caps.payloads.push_back(DefaultVp8Payload()); | |
54 // TODO(hclam): Fill in |rtcp_features| and |fec_mechanisms|. | |
55 return caps; | |
56 } | |
57 | |
58 bool ToAudioSenderConfig(const CastRtpParams& params, | |
59 AudioSenderConfig* config) { | |
60 if (params.payloads.empty()) | |
61 return false; | |
62 const CastRtpPayloadParams& payload_params = params.payloads[0]; | |
63 config->sender_ssrc = payload_params.ssrc; | |
64 config->use_external_encoder = false; | |
65 config->frequency = payload_params.clock_rate; | |
66 config->channels = payload_params.channels; | |
67 config->bitrate = payload_params.max_bitrate; | |
68 config->codec = media::cast::kPcm16; | |
69 if (payload_params.codec_name == kCodecNameOpus) | |
70 config->codec = media::cast::kOpus; | |
71 else | |
72 return false; | |
73 return true; | |
74 } | |
75 | |
76 bool ToVideoSenderConfig(const CastRtpParams& params, | |
77 VideoSenderConfig* config) { | |
78 if (params.payloads.empty()) | |
79 return false; | |
80 const CastRtpPayloadParams& payload_params = params.payloads[0]; | |
81 config->sender_ssrc = payload_params.ssrc; | |
82 config->use_external_encoder = false; | |
83 config->width = payload_params.width; | |
84 config->height = payload_params.height; | |
85 config->min_bitrate = config->start_bitrate = payload_params.min_bitrate; | |
86 config->max_bitrate = payload_params.max_bitrate; | |
87 if (payload_params.codec_name == kCodecNameVp8) | |
88 config->codec = media::cast::kVp8; | |
89 else | |
90 return false; | |
91 return true; | |
92 } | |
93 } // namespace | |
94 | |
95 CastCodecSpecificParams::CastCodecSpecificParams() { | |
96 } | |
97 | |
98 CastCodecSpecificParams::~CastCodecSpecificParams() { | |
99 } | |
100 | |
101 CastRtpPayloadParams::CastRtpPayloadParams() | |
102 : payload_type(0), | |
103 ssrc(0), | |
104 clock_rate(0), | |
105 max_bitrate(0), | |
106 min_bitrate(0), | |
107 channels(0), | |
108 width(0), | |
109 height(0) { | |
110 } | |
111 | |
112 CastRtpPayloadParams::~CastRtpPayloadParams() { | |
113 } | |
114 | |
115 CastRtpCaps::CastRtpCaps() { | |
116 } | |
117 | |
118 CastRtpCaps::~CastRtpCaps() { | |
119 } | |
120 | |
121 CastSendTransport::CastSendTransport( | |
122 const blink::WebMediaStreamTrack& track, | |
123 const scoped_refptr<CastSession>& session) | |
124 : track_(track), | |
125 cast_session_(session) { | |
126 } | |
127 | |
128 CastSendTransport::~CastSendTransport() { | |
129 } | |
130 | |
131 CastRtpCaps CastSendTransport::GetCaps() { | |
132 if (IsAudio()) | |
133 return DefaultAudioCaps(); | |
134 else | |
135 return DefaultVideoCaps(); | |
136 } | |
137 | |
138 CastRtpParams CastSendTransport::GetParams() { | |
139 return params_; | |
140 } | |
141 | |
142 void CastSendTransport::Start(const CastRtpParams& params) { | |
143 if (IsAudio()) { | |
144 AudioSenderConfig config; | |
145 if (!ToAudioSenderConfig(params, &config)) { | |
146 DVLOG(1) << "Invalid parameters for audio."; | |
147 } | |
148 cast_session_->StartAudio(config); | |
149 } else { | |
150 VideoSenderConfig config; | |
151 if (!ToVideoSenderConfig(params, &config)) { | |
152 DVLOG(1) << "Invalid parameters for video."; | |
153 } | |
154 cast_session_->StartVideo(config); | |
155 } | |
156 } | |
157 | |
158 void CastSendTransport::Stop() { | |
159 NOTIMPLEMENTED(); | |
160 } | |
161 | |
162 bool CastSendTransport::IsAudio() const { | |
163 return track_.source().type() == blink::WebMediaStreamSource::TypeAudio; | |
164 } | |
OLD | NEW |