OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_media
_pipeline.h" | 5 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_media
_pipeline.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "content/public/renderer/render_thread.h" | 8 #include "content/public/renderer/render_thread.h" |
9 #include "content/public/renderer/video_encode_accelerator.h" | 9 #include "content/public/renderer/video_encode_accelerator.h" |
10 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_eleme
ntary_stream_descriptor.h" | 10 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_eleme
ntary_stream_descriptor.h" |
11 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_eleme
ntary_stream_info.h" | 11 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_eleme
ntary_stream_info.h" |
12 | 12 |
13 namespace extensions { | 13 namespace extensions { |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 const char kErrorVideoEncoderError[] = "Unrepairable video encoder error"; | 17 const char kErrorVideoEncoderError[] = "Unrepairable video encoder error"; |
| 18 const char kErrorUnableSendMedia[] = "Unable to send media"; |
18 | 19 |
19 } // namespace | 20 } // namespace |
20 | 21 |
21 WiFiDisplayMediaPipeline::WiFiDisplayMediaPipeline( | 22 WiFiDisplayMediaPipeline::WiFiDisplayMediaPipeline( |
22 wds::SessionType type, | 23 wds::SessionType type, |
23 const WiFiDisplayVideoEncoder::InitParameters& video_parameters, | 24 const WiFiDisplayVideoEncoder::InitParameters& video_parameters, |
24 const wds::AudioCodec& audio_codec, | 25 const wds::AudioCodec& audio_codec, |
| 26 const std::string& sink_ip_address, |
| 27 const std::pair<int, int>& sink_rtp_ports, |
| 28 const RegisterMediaServiceCallback& service_callback, |
25 const ErrorCallback& error_callback) | 29 const ErrorCallback& error_callback) |
26 : type_(type), | 30 : type_(type), |
27 video_parameters_(video_parameters), | 31 video_parameters_(video_parameters), |
28 audio_codec_(audio_codec), | 32 audio_codec_(audio_codec), |
| 33 sink_ip_address_(sink_ip_address), |
| 34 sink_rtp_ports_(sink_rtp_ports), |
| 35 service_callback_(service_callback), |
29 error_callback_(error_callback), | 36 error_callback_(error_callback), |
30 weak_factory_(this) { | 37 weak_factory_(this) { |
31 } | 38 } |
32 | 39 |
33 // static | 40 // static |
34 std::unique_ptr<WiFiDisplayMediaPipeline> WiFiDisplayMediaPipeline::Create( | 41 std::unique_ptr<WiFiDisplayMediaPipeline> WiFiDisplayMediaPipeline::Create( |
35 wds::SessionType type, | 42 wds::SessionType type, |
36 const WiFiDisplayVideoEncoder::InitParameters& video_parameters, | 43 const WiFiDisplayVideoEncoder::InitParameters& video_parameters, |
37 const wds::AudioCodec& audio_codec, | 44 const wds::AudioCodec& audio_codec, |
| 45 const std::string& sink_ip_address, |
| 46 const std::pair<int, int>& sink_rtp_ports, |
| 47 const RegisterMediaServiceCallback& service_callback, |
38 const ErrorCallback& error_callback) { | 48 const ErrorCallback& error_callback) { |
39 return std::unique_ptr<WiFiDisplayMediaPipeline>( | 49 return std::unique_ptr<WiFiDisplayMediaPipeline>( |
40 new WiFiDisplayMediaPipeline(type, | 50 new WiFiDisplayMediaPipeline(type, |
41 video_parameters, | 51 video_parameters, |
42 audio_codec, | 52 audio_codec, |
| 53 sink_ip_address, |
| 54 sink_rtp_ports, |
| 55 service_callback, |
43 error_callback)); | 56 error_callback)); |
44 } | 57 } |
45 | 58 |
46 WiFiDisplayMediaPipeline::~WiFiDisplayMediaPipeline() { | 59 WiFiDisplayMediaPipeline::~WiFiDisplayMediaPipeline() { |
47 } | 60 } |
48 | 61 |
49 void WiFiDisplayMediaPipeline::InsertRawVideoFrame( | 62 void WiFiDisplayMediaPipeline::InsertRawVideoFrame( |
50 const scoped_refptr<media::VideoFrame>& video_frame, | 63 const scoped_refptr<media::VideoFrame>& video_frame, |
51 base::TimeTicks reference_time) { | 64 base::TimeTicks reference_time) { |
52 DCHECK(video_encoder_); | 65 DCHECK(video_encoder_); |
(...skipping 10 matching lines...) Expand all Loading... |
63 DCHECK(init_completion_callback_.is_null()); | 76 DCHECK(init_completion_callback_.is_null()); |
64 init_completion_callback_ = callback; | 77 init_completion_callback_ = callback; |
65 | 78 |
66 CreateMediaPacketizer(); | 79 CreateMediaPacketizer(); |
67 | 80 |
68 if (type_ & wds::VideoSession) { | 81 if (type_ & wds::VideoSession) { |
69 CreateVideoEncoder(); | 82 CreateVideoEncoder(); |
70 return; | 83 return; |
71 } | 84 } |
72 | 85 |
73 init_completion_callback_.Run(true); | 86 service_callback_.Run( |
| 87 mojo::GetProxy(&media_service_), |
| 88 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, |
| 89 weak_factory_.GetWeakPtr())); |
74 } | 90 } |
75 | 91 |
76 void WiFiDisplayMediaPipeline::CreateVideoEncoder() { | 92 void WiFiDisplayMediaPipeline::CreateVideoEncoder() { |
77 DCHECK(!video_encoder_); | 93 DCHECK(!video_encoder_); |
78 auto result_callback = | 94 auto result_callback = |
79 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, | 95 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, |
80 weak_factory_.GetWeakPtr()); | 96 weak_factory_.GetWeakPtr()); |
81 WiFiDisplayVideoEncoder::Create(video_parameters_, | 97 WiFiDisplayVideoEncoder::Create(video_parameters_, |
82 result_callback); | 98 result_callback); |
83 } | 99 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 if (!video_encoder) { | 137 if (!video_encoder) { |
122 init_completion_callback_.Run(false); | 138 init_completion_callback_.Run(false); |
123 return; | 139 return; |
124 } | 140 } |
125 video_encoder_ = std::move(video_encoder); | 141 video_encoder_ = std::move(video_encoder); |
126 auto encoded_callback = base::Bind( | 142 auto encoded_callback = base::Bind( |
127 &WiFiDisplayMediaPipeline::OnEncodedVideoFrame, | 143 &WiFiDisplayMediaPipeline::OnEncodedVideoFrame, |
128 weak_factory_.GetWeakPtr()); | 144 weak_factory_.GetWeakPtr()); |
129 auto error_callback = base::Bind(error_callback_, kErrorVideoEncoderError); | 145 auto error_callback = base::Bind(error_callback_, kErrorVideoEncoderError); |
130 video_encoder_->SetCallbacks(encoded_callback, error_callback); | 146 video_encoder_->SetCallbacks(encoded_callback, error_callback); |
131 init_completion_callback_.Run(true); | 147 |
| 148 service_callback_.Run( |
| 149 mojo::GetProxy(&media_service_), |
| 150 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, |
| 151 weak_factory_.GetWeakPtr())); |
| 152 } |
| 153 |
| 154 void WiFiDisplayMediaPipeline::OnMediaServiceRegistered() { |
| 155 DCHECK(media_service_); |
| 156 auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia); |
| 157 media_service_.set_connection_error_handler(error_callback); |
| 158 media_service_->SetDesinationPoint( |
| 159 sink_ip_address_, |
| 160 static_cast<int32_t>(sink_rtp_ports_.first), |
| 161 init_completion_callback_); |
132 } | 162 } |
133 | 163 |
134 void WiFiDisplayMediaPipeline::OnEncodedVideoFrame( | 164 void WiFiDisplayMediaPipeline::OnEncodedVideoFrame( |
135 const WiFiDisplayEncodedFrame& frame) { | 165 const WiFiDisplayEncodedFrame& frame) { |
136 DCHECK(packetizer_); | 166 DCHECK(packetizer_); |
137 if (!packetizer_->EncodeElementaryStreamUnit( | 167 if (!packetizer_->EncodeElementaryStreamUnit( |
138 0u, frame.bytes(), frame.data.size(), frame.key_frame, frame.pts, | 168 0u, frame.bytes(), frame.data.size(), frame.key_frame, frame.pts, |
139 frame.dts, true)) { | 169 frame.dts, true)) { |
140 DVLOG(1) << "Couldn't write video mpegts packet"; | 170 DVLOG(1) << "Couldn't write video mpegts packet"; |
141 } | 171 } |
142 } | 172 } |
143 | 173 |
144 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket( | 174 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket( |
145 WiFiDisplayMediaDatagramPacket media_datagram_packet) { | 175 WiFiDisplayMediaDatagramPacket media_datagram_packet) { |
146 NOTIMPLEMENTED(); | 176 DCHECK(media_service_); |
| 177 media_service_->SendMediaPacket(std::move(media_datagram_packet)); |
147 return true; | 178 return true; |
148 } | 179 } |
149 | 180 |
150 } // namespace extensions | 181 } // namespace extensions |
OLD | NEW |