Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Side by Side Diff: extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc

Issue 1905243003: [chrome.displaySource] Integrate audio encoders into media pipeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_eleme ntary_stream_info.h"
12 10
13 namespace extensions { 11 namespace extensions {
14 12
15 namespace { 13 namespace {
16 14
15 const char kErrorAudioEncoderError[] = "Unrepairable audio encoder error";
17 const char kErrorVideoEncoderError[] = "Unrepairable video encoder error"; 16 const char kErrorVideoEncoderError[] = "Unrepairable video encoder error";
18 const char kErrorUnableSendMedia[] = "Unable to send media"; 17 const char kErrorUnableSendMedia[] = "Unable to send media";
19 18
20 } // namespace 19 } // namespace
21 20
22 WiFiDisplayMediaPipeline::WiFiDisplayMediaPipeline( 21 WiFiDisplayMediaPipeline::WiFiDisplayMediaPipeline(
23 wds::SessionType type, 22 wds::SessionType type,
24 const WiFiDisplayVideoEncoder::InitParameters& video_parameters, 23 const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
25 const wds::AudioCodec& audio_codec, 24 const wds::AudioCodec& audio_codec,
26 const std::string& sink_ip_address, 25 const std::string& sink_ip_address,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 video_encoder_->InsertRawVideoFrame(video_frame, reference_time); 65 video_encoder_->InsertRawVideoFrame(video_frame, reference_time);
67 } 66 }
68 67
69 void WiFiDisplayMediaPipeline::RequestIDRPicture() { 68 void WiFiDisplayMediaPipeline::RequestIDRPicture() {
70 DCHECK(video_encoder_); 69 DCHECK(video_encoder_);
71 video_encoder_->RequestIDRPicture(); 70 video_encoder_->RequestIDRPicture();
72 } 71 }
73 72
74 enum WiFiDisplayMediaPipeline::InitializationStep : unsigned { 73 enum WiFiDisplayMediaPipeline::InitializationStep : unsigned {
75 INITIALIZE_FIRST, 74 INITIALIZE_FIRST,
76 INITIALIZE_MEDIA_PACKETIZER = INITIALIZE_FIRST, 75 INITIALIZE_AUDIO_ENCODER = INITIALIZE_FIRST,
77 INITIALIZE_VIDEO_ENCODER, 76 INITIALIZE_VIDEO_ENCODER,
77 INITIALIZE_MEDIA_PACKETIZER,
78 INITIALIZE_MEDIA_SERVICE, 78 INITIALIZE_MEDIA_SERVICE,
79 INITIALIZE_LAST = INITIALIZE_MEDIA_SERVICE 79 INITIALIZE_LAST = INITIALIZE_MEDIA_SERVICE
80 }; 80 };
81 81
82 void WiFiDisplayMediaPipeline::Initialize( 82 void WiFiDisplayMediaPipeline::Initialize(
83 const InitCompletionCallback& callback) { 83 const InitCompletionCallback& callback) {
84 DCHECK(!video_encoder_ && !packetizer_); 84 DCHECK(!audio_encoder_ && !video_encoder_ && !packetizer_);
85 OnInitialize(callback, INITIALIZE_FIRST, true); 85 OnInitialize(callback, INITIALIZE_FIRST, true);
86 } 86 }
87 87
88 void WiFiDisplayMediaPipeline::OnInitialize( 88 void WiFiDisplayMediaPipeline::OnInitialize(
89 const InitCompletionCallback& callback, 89 const InitCompletionCallback& callback,
90 InitializationStep current_step, 90 InitializationStep current_step,
91 bool success) { 91 bool success) {
92 if (!success) { 92 if (!success) {
93 callback.Run(false); 93 callback.Run(false);
94 return; 94 return;
95 } 95 }
96 96
97 InitStepCompletionCallback init_step_callback; 97 InitStepCompletionCallback init_step_callback;
98 if (current_step < INITIALIZE_LAST) { 98 if (current_step < INITIALIZE_LAST) {
99 InitializationStep next_step = 99 InitializationStep next_step =
100 static_cast<InitializationStep>(current_step + 1u); 100 static_cast<InitializationStep>(current_step + 1u);
101 init_step_callback = base::Bind(&WiFiDisplayMediaPipeline::OnInitialize, 101 init_step_callback = base::Bind(&WiFiDisplayMediaPipeline::OnInitialize,
102 weak_factory_.GetWeakPtr(), callback, next_step); 102 weak_factory_.GetWeakPtr(), callback, next_step);
103 } 103 }
104 104
105 switch (current_step) { 105 switch (current_step) {
106 case INITIALIZE_MEDIA_PACKETIZER: 106 case INITIALIZE_AUDIO_ENCODER:
107 DCHECK(!packetizer_); 107 DCHECK(!audio_encoder_);
108 CreateMediaPacketizer(); 108 if (type_ & wds::AudioSession) {
109 init_step_callback.Run(true); 109 auto result_callback =
110 base::Bind(&WiFiDisplayMediaPipeline::OnAudioEncoderCreated,
111 weak_factory_.GetWeakPtr(), init_step_callback);
112 WiFiDisplayAudioEncoder::Create(audio_codec_, result_callback);
113 } else {
114 init_step_callback.Run(true);
115 }
110 break; 116 break;
111 case INITIALIZE_VIDEO_ENCODER: 117 case INITIALIZE_VIDEO_ENCODER:
112 DCHECK(!video_encoder_); 118 DCHECK(!video_encoder_);
113 if (type_ & wds::VideoSession) { 119 if (type_ & wds::VideoSession) {
114 auto result_callback = 120 auto result_callback =
115 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, 121 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated,
116 weak_factory_.GetWeakPtr(), init_step_callback); 122 weak_factory_.GetWeakPtr(), init_step_callback);
117 WiFiDisplayVideoEncoder::Create(video_parameters_, result_callback); 123 WiFiDisplayVideoEncoder::Create(video_parameters_, result_callback);
118 } else { 124 } else {
119 init_step_callback.Run(true); 125 init_step_callback.Run(true);
120 } 126 }
121 break; 127 break;
128 case INITIALIZE_MEDIA_PACKETIZER:
129 DCHECK(!packetizer_);
130 CreateMediaPacketizer();
131 init_step_callback.Run(true);
132 break;
122 case INITIALIZE_MEDIA_SERVICE: 133 case INITIALIZE_MEDIA_SERVICE:
123 service_callback_.Run( 134 service_callback_.Run(
124 mojo::GetProxy(&media_service_), 135 mojo::GetProxy(&media_service_),
125 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, 136 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered,
126 weak_factory_.GetWeakPtr(), callback)); 137 weak_factory_.GetWeakPtr(), callback));
127 break; 138 break;
128 } 139 }
129 } 140 }
130 141
131 void WiFiDisplayMediaPipeline::CreateMediaPacketizer() { 142 void WiFiDisplayMediaPipeline::CreateMediaPacketizer() {
132 DCHECK(!packetizer_); 143 DCHECK(!packetizer_);
133 std::vector<WiFiDisplayElementaryStreamInfo> stream_infos; 144 std::vector<WiFiDisplayElementaryStreamInfo> stream_infos;
134 if (type_ & wds::VideoSession) { 145 if (type_ & wds::VideoSession) {
135 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors; 146 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors;
136 descriptors.emplace_back( 147 descriptors.emplace_back(
137 WiFiDisplayElementaryStreamDescriptor::AVCTimingAndHRD::Create()); 148 WiFiDisplayElementaryStreamDescriptor::AVCTimingAndHRD::Create());
138 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::VIDEO_H264, 149 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::VIDEO_H264,
139 std::move(descriptors)); 150 std::move(descriptors));
140 } 151 }
141 152
142 if (type_ & wds::AudioSession) { 153 if (type_ & wds::AudioSession) {
143 using LPCMAudioStreamDescriptor = 154 DCHECK(audio_encoder_);
144 WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream; 155 stream_infos.push_back(audio_encoder_->CreateElementaryStreamInfo());
145 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors;
146 descriptors.emplace_back(
147 LPCMAudioStreamDescriptor::Create(
148 audio_codec_.modes.test(wds::LPCM_48K_16B_2CH)
149 ? LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_48K
150 : LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_44_1K,
151 LPCMAudioStreamDescriptor::BITS_PER_SAMPLE_16,
152 false, // emphasis_flag
153 LPCMAudioStreamDescriptor::NUMBER_OF_CHANNELS_STEREO));
154 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::AUDIO_LPCM,
155 std::move(descriptors));
156 } 156 }
157 157
158 packetizer_.reset(new WiFiDisplayMediaPacketizer( 158 packetizer_.reset(new WiFiDisplayMediaPacketizer(
159 base::TimeDelta::FromMilliseconds(200), 159 base::TimeDelta::FromMilliseconds(200),
160 std::move(stream_infos), 160 std::move(stream_infos),
161 base::Bind(&WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket, 161 base::Bind(&WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket,
162 base::Unretained(this)))); 162 base::Unretained(this))));
163 } 163 }
164 164
165 void WiFiDisplayMediaPipeline::OnAudioEncoderCreated(
166 const InitStepCompletionCallback& callback,
167 scoped_refptr<WiFiDisplayAudioEncoder> audio_encoder) {
168 DCHECK(!audio_encoder_);
169
170 if (!audio_encoder) {
171 callback.Run(false);
172 return;
173 }
174
175 audio_encoder_ = std::move(audio_encoder);
176 auto encoded_callback =
177 base::Bind(&WiFiDisplayMediaPipeline::OnEncodedAudioUnit,
178 weak_factory_.GetWeakPtr());
179 auto error_callback = base::Bind(error_callback_, kErrorAudioEncoderError);
180 audio_encoder_->SetCallbacks(encoded_callback, error_callback);
181
182 callback.Run(true);
183 }
184
165 void WiFiDisplayMediaPipeline::OnVideoEncoderCreated( 185 void WiFiDisplayMediaPipeline::OnVideoEncoderCreated(
166 const InitStepCompletionCallback& callback, 186 const InitStepCompletionCallback& callback,
167 scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) { 187 scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) {
168 DCHECK(!video_encoder_); 188 DCHECK(!video_encoder_);
169 189
170 if (!video_encoder) { 190 if (!video_encoder) {
171 callback.Run(false); 191 callback.Run(false);
172 return; 192 return;
173 } 193 }
174 194
(...skipping 11 matching lines...) Expand all
186 const InitCompletionCallback& callback) { 206 const InitCompletionCallback& callback) {
187 DCHECK(media_service_); 207 DCHECK(media_service_);
188 auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia); 208 auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia);
189 media_service_.set_connection_error_handler(error_callback); 209 media_service_.set_connection_error_handler(error_callback);
190 media_service_->SetDesinationPoint( 210 media_service_->SetDesinationPoint(
191 sink_ip_address_, 211 sink_ip_address_,
192 static_cast<int32_t>(sink_rtp_ports_.first), 212 static_cast<int32_t>(sink_rtp_ports_.first),
193 callback); 213 callback);
194 } 214 }
195 215
216 void WiFiDisplayMediaPipeline::OnEncodedAudioUnit(
217 std::unique_ptr<WiFiDisplayEncodedFrame> unit) {
218 DCHECK(packetizer_);
219 const unsigned stream_index = (type_ & wds::VideoSession) ? 1u : 0u;
220 if (!packetizer_->EncodeElementaryStreamUnit(stream_index, unit->bytes(),
221 unit->size(), unit->key_frame,
222 unit->pts, unit->dts, true)) {
223 DVLOG(1) << "Couldn't write audio mpegts packet";
224 }
225 }
226
196 void WiFiDisplayMediaPipeline::OnEncodedVideoFrame( 227 void WiFiDisplayMediaPipeline::OnEncodedVideoFrame(
197 std::unique_ptr<WiFiDisplayEncodedFrame> frame) { 228 std::unique_ptr<WiFiDisplayEncodedFrame> frame) {
198 DCHECK(packetizer_); 229 DCHECK(packetizer_);
199 if (!packetizer_->EncodeElementaryStreamUnit(0u, frame->bytes(), 230 if (!packetizer_->EncodeElementaryStreamUnit(0u, frame->bytes(),
200 frame->size(), frame->key_frame, 231 frame->size(), frame->key_frame,
201 frame->pts, frame->dts, true)) { 232 frame->pts, frame->dts, true)) {
202 DVLOG(1) << "Couldn't write video mpegts packet"; 233 DVLOG(1) << "Couldn't write video mpegts packet";
203 } 234 }
204 } 235 }
205 236
206 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket( 237 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket(
207 WiFiDisplayMediaDatagramPacket media_datagram_packet) { 238 WiFiDisplayMediaDatagramPacket media_datagram_packet) {
208 DCHECK(media_service_); 239 DCHECK(media_service_);
209 media_service_->SendMediaPacket(std::move(media_datagram_packet)); 240 media_service_->SendMediaPacket(std::move(media_datagram_packet));
210 return true; 241 return true;
211 } 242 }
212 243
213 } // namespace extensions 244 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698