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" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 base::TimeTicks reference_time) { | 64 base::TimeTicks reference_time) { |
65 DCHECK(video_encoder_); | 65 DCHECK(video_encoder_); |
66 video_encoder_->InsertRawVideoFrame(video_frame, reference_time); | 66 video_encoder_->InsertRawVideoFrame(video_frame, reference_time); |
67 } | 67 } |
68 | 68 |
69 void WiFiDisplayMediaPipeline::RequestIDRPicture() { | 69 void WiFiDisplayMediaPipeline::RequestIDRPicture() { |
70 DCHECK(video_encoder_); | 70 DCHECK(video_encoder_); |
71 video_encoder_->RequestIDRPicture(); | 71 video_encoder_->RequestIDRPicture(); |
72 } | 72 } |
73 | 73 |
| 74 enum WiFiDisplayMediaPipeline::InitializationStep : unsigned { |
| 75 INITIALIZE_FIRST, |
| 76 INITIALIZE_MEDIA_PACKETIZER = INITIALIZE_FIRST, |
| 77 INITIALIZE_VIDEO_ENCODER, |
| 78 INITIALIZE_MEDIA_SERVICE, |
| 79 INITIALIZE_LAST = INITIALIZE_MEDIA_SERVICE |
| 80 }; |
| 81 |
74 void WiFiDisplayMediaPipeline::Initialize( | 82 void WiFiDisplayMediaPipeline::Initialize( |
75 const InitCompletionCallback& callback) { | 83 const InitCompletionCallback& callback) { |
76 DCHECK(init_completion_callback_.is_null()); | 84 DCHECK(!video_encoder_ && !packetizer_); |
77 init_completion_callback_ = callback; | 85 OnInitialize(callback, INITIALIZE_FIRST, true); |
| 86 } |
78 | 87 |
79 CreateMediaPacketizer(); | 88 void WiFiDisplayMediaPipeline::OnInitialize( |
80 | 89 const InitCompletionCallback& callback, |
81 if (type_ & wds::VideoSession) { | 90 InitializationStep current_step, |
82 CreateVideoEncoder(); | 91 bool success) { |
| 92 if (!success) { |
| 93 callback.Run(false); |
83 return; | 94 return; |
84 } | 95 } |
85 | 96 |
86 service_callback_.Run( | 97 InitStepCompletionCallback init_step_callback; |
87 mojo::GetProxy(&media_service_), | 98 if (current_step < INITIALIZE_LAST) { |
88 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, | 99 InitializationStep next_step = |
89 weak_factory_.GetWeakPtr())); | 100 static_cast<InitializationStep>(current_step + 1u); |
90 } | 101 init_step_callback = base::Bind(&WiFiDisplayMediaPipeline::OnInitialize, |
| 102 weak_factory_.GetWeakPtr(), callback, next_step); |
| 103 } |
91 | 104 |
92 void WiFiDisplayMediaPipeline::CreateVideoEncoder() { | 105 switch (current_step) { |
93 DCHECK(!video_encoder_); | 106 case INITIALIZE_MEDIA_PACKETIZER: |
94 auto result_callback = | 107 DCHECK(!packetizer_); |
95 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, | 108 CreateMediaPacketizer(); |
96 weak_factory_.GetWeakPtr()); | 109 init_step_callback.Run(true); |
97 WiFiDisplayVideoEncoder::Create(video_parameters_, | 110 break; |
98 result_callback); | 111 case INITIALIZE_VIDEO_ENCODER: |
| 112 DCHECK(!video_encoder_); |
| 113 if (type_ & wds::VideoSession) { |
| 114 auto result_callback = |
| 115 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, |
| 116 weak_factory_.GetWeakPtr(), init_step_callback); |
| 117 WiFiDisplayVideoEncoder::Create(video_parameters_, result_callback); |
| 118 } else { |
| 119 init_step_callback.Run(true); |
| 120 } |
| 121 break; |
| 122 case INITIALIZE_MEDIA_SERVICE: |
| 123 service_callback_.Run( |
| 124 mojo::GetProxy(&media_service_), |
| 125 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, |
| 126 weak_factory_.GetWeakPtr(), callback)); |
| 127 break; |
| 128 } |
99 } | 129 } |
100 | 130 |
101 void WiFiDisplayMediaPipeline::CreateMediaPacketizer() { | 131 void WiFiDisplayMediaPipeline::CreateMediaPacketizer() { |
102 DCHECK(!packetizer_); | 132 DCHECK(!packetizer_); |
103 std::vector<WiFiDisplayElementaryStreamInfo> stream_infos; | 133 std::vector<WiFiDisplayElementaryStreamInfo> stream_infos; |
104 if (type_ & wds::VideoSession) { | 134 if (type_ & wds::VideoSession) { |
105 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors; | 135 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors; |
106 descriptors.emplace_back( | 136 descriptors.emplace_back( |
107 WiFiDisplayElementaryStreamDescriptor::AVCTimingAndHRD::Create()); | 137 WiFiDisplayElementaryStreamDescriptor::AVCTimingAndHRD::Create()); |
108 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::VIDEO_H264, | 138 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::VIDEO_H264, |
(...skipping 17 matching lines...) Expand all Loading... |
126 } | 156 } |
127 | 157 |
128 packetizer_.reset(new WiFiDisplayMediaPacketizer( | 158 packetizer_.reset(new WiFiDisplayMediaPacketizer( |
129 base::TimeDelta::FromMilliseconds(200), | 159 base::TimeDelta::FromMilliseconds(200), |
130 std::move(stream_infos), | 160 std::move(stream_infos), |
131 base::Bind(&WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket, | 161 base::Bind(&WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket, |
132 base::Unretained(this)))); | 162 base::Unretained(this)))); |
133 } | 163 } |
134 | 164 |
135 void WiFiDisplayMediaPipeline::OnVideoEncoderCreated( | 165 void WiFiDisplayMediaPipeline::OnVideoEncoderCreated( |
| 166 const InitStepCompletionCallback& callback, |
136 scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) { | 167 scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) { |
| 168 DCHECK(!video_encoder_); |
| 169 |
137 if (!video_encoder) { | 170 if (!video_encoder) { |
138 init_completion_callback_.Run(false); | 171 callback.Run(false); |
139 return; | 172 return; |
140 } | 173 } |
| 174 |
141 video_encoder_ = std::move(video_encoder); | 175 video_encoder_ = std::move(video_encoder); |
142 auto encoded_callback = base::Bind( | 176 auto encoded_callback = base::Bind( |
143 &WiFiDisplayMediaPipeline::OnEncodedVideoFrame, | 177 &WiFiDisplayMediaPipeline::OnEncodedVideoFrame, |
144 weak_factory_.GetWeakPtr()); | 178 weak_factory_.GetWeakPtr()); |
145 auto error_callback = base::Bind(error_callback_, kErrorVideoEncoderError); | 179 auto error_callback = base::Bind(error_callback_, kErrorVideoEncoderError); |
146 video_encoder_->SetCallbacks(encoded_callback, error_callback); | 180 video_encoder_->SetCallbacks(encoded_callback, error_callback); |
147 | 181 |
148 service_callback_.Run( | 182 callback.Run(true); |
149 mojo::GetProxy(&media_service_), | |
150 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, | |
151 weak_factory_.GetWeakPtr())); | |
152 } | 183 } |
153 | 184 |
154 void WiFiDisplayMediaPipeline::OnMediaServiceRegistered() { | 185 void WiFiDisplayMediaPipeline::OnMediaServiceRegistered( |
| 186 const InitCompletionCallback& callback) { |
155 DCHECK(media_service_); | 187 DCHECK(media_service_); |
156 auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia); | 188 auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia); |
157 media_service_.set_connection_error_handler(error_callback); | 189 media_service_.set_connection_error_handler(error_callback); |
158 media_service_->SetDesinationPoint( | 190 media_service_->SetDesinationPoint( |
159 sink_ip_address_, | 191 sink_ip_address_, |
160 static_cast<int32_t>(sink_rtp_ports_.first), | 192 static_cast<int32_t>(sink_rtp_ports_.first), |
161 init_completion_callback_); | 193 callback); |
162 } | 194 } |
163 | 195 |
164 void WiFiDisplayMediaPipeline::OnEncodedVideoFrame( | 196 void WiFiDisplayMediaPipeline::OnEncodedVideoFrame( |
165 const WiFiDisplayEncodedFrame& frame) { | 197 const WiFiDisplayEncodedFrame& frame) { |
166 DCHECK(packetizer_); | 198 DCHECK(packetizer_); |
167 if (!packetizer_->EncodeElementaryStreamUnit( | 199 if (!packetizer_->EncodeElementaryStreamUnit( |
168 0u, frame.bytes(), frame.data.size(), frame.key_frame, frame.pts, | 200 0u, frame.bytes(), frame.data.size(), frame.key_frame, frame.pts, |
169 frame.dts, true)) { | 201 frame.dts, true)) { |
170 DVLOG(1) << "Couldn't write video mpegts packet"; | 202 DVLOG(1) << "Couldn't write video mpegts packet"; |
171 } | 203 } |
172 } | 204 } |
173 | 205 |
174 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket( | 206 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket( |
175 WiFiDisplayMediaDatagramPacket media_datagram_packet) { | 207 WiFiDisplayMediaDatagramPacket media_datagram_packet) { |
176 DCHECK(media_service_); | 208 DCHECK(media_service_); |
177 media_service_->SendMediaPacket(std::move(media_datagram_packet)); | 209 media_service_->SendMediaPacket(std::move(media_datagram_packet)); |
178 return true; | 210 return true; |
179 } | 211 } |
180 | 212 |
181 } // namespace extensions | 213 } // namespace extensions |
OLD | NEW |