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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 { | 74 enum WiFiDisplayMediaPipeline::InitializationStep : unsigned { |
75 INITIALIZE_FIRST, | 75 INITIALIZE_FIRST, |
76 INITIALIZE_MEDIA_PACKETIZER = INITIALIZE_FIRST, | 76 INITIALIZE_VIDEO_ENCODER = INITIALIZE_FIRST, |
77 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(!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: | |
107 DCHECK(!packetizer_); | |
108 CreateMediaPacketizer(); | |
109 init_step_callback.Run(true); | |
110 break; | |
111 case INITIALIZE_VIDEO_ENCODER: | 106 case INITIALIZE_VIDEO_ENCODER: |
112 DCHECK(!video_encoder_); | 107 DCHECK(!video_encoder_); |
113 if (type_ & wds::VideoSession) { | 108 if (type_ & wds::VideoSession) { |
114 auto result_callback = | 109 auto result_callback = |
115 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, | 110 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, |
116 weak_factory_.GetWeakPtr(), init_step_callback); | 111 weak_factory_.GetWeakPtr(), init_step_callback); |
117 WiFiDisplayVideoEncoder::Create(video_parameters_, result_callback); | 112 WiFiDisplayVideoEncoder::Create(video_parameters_, result_callback); |
118 } else { | 113 } else { |
119 init_step_callback.Run(true); | 114 init_step_callback.Run(true); |
120 } | 115 } |
121 break; | 116 break; |
| 117 case INITIALIZE_MEDIA_PACKETIZER: |
| 118 DCHECK(!packetizer_); |
| 119 CreateMediaPacketizer(); |
| 120 init_step_callback.Run(true); |
| 121 break; |
122 case INITIALIZE_MEDIA_SERVICE: | 122 case INITIALIZE_MEDIA_SERVICE: |
123 service_callback_.Run( | 123 service_callback_.Run( |
124 mojo::GetProxy(&media_service_), | 124 mojo::GetProxy(&media_service_), |
125 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, | 125 base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, |
126 weak_factory_.GetWeakPtr(), callback)); | 126 weak_factory_.GetWeakPtr(), callback)); |
127 break; | 127 break; |
128 } | 128 } |
129 } | 129 } |
130 | 130 |
131 void WiFiDisplayMediaPipeline::CreateMediaPacketizer() { | 131 void WiFiDisplayMediaPipeline::CreateMediaPacketizer() { |
132 DCHECK(!packetizer_); | 132 DCHECK(!packetizer_); |
133 std::vector<WiFiDisplayElementaryStreamInfo> stream_infos; | 133 std::vector<WiFiDisplayElementaryStreamInfo> stream_infos; |
| 134 |
134 if (type_ & wds::VideoSession) { | 135 if (type_ & wds::VideoSession) { |
135 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors; | 136 DCHECK(video_encoder_); |
136 descriptors.emplace_back( | 137 stream_infos.push_back(video_encoder_->CreateElementaryStreamInfo()); |
137 WiFiDisplayElementaryStreamDescriptor::AVCTimingAndHRD::Create()); | |
138 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::VIDEO_H264, | |
139 std::move(descriptors)); | |
140 } | 138 } |
141 | 139 |
142 if (type_ & wds::AudioSession) { | 140 if (type_ & wds::AudioSession) { |
143 using LPCMAudioStreamDescriptor = | 141 using LPCMAudioStreamDescriptor = |
144 WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream; | 142 WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream; |
145 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors; | 143 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors; |
146 descriptors.emplace_back( | 144 descriptors.emplace_back( |
147 LPCMAudioStreamDescriptor::Create( | 145 LPCMAudioStreamDescriptor::Create( |
148 audio_codec_.modes.test(wds::LPCM_48K_16B_2CH) | 146 audio_codec_.modes.test(wds::LPCM_48K_16B_2CH) |
149 ? LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_48K | 147 ? LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_48K |
150 : LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_44_1K, | 148 : LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_44_1K, |
151 LPCMAudioStreamDescriptor::BITS_PER_SAMPLE_16, | 149 LPCMAudioStreamDescriptor::BITS_PER_SAMPLE_16, |
152 false, // emphasis_flag | 150 false, // emphasis_flag |
153 LPCMAudioStreamDescriptor::NUMBER_OF_CHANNELS_STEREO)); | 151 LPCMAudioStreamDescriptor::NUMBER_OF_CHANNELS_STEREO)); |
154 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::AUDIO_LPCM, | 152 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::AUDIO_LPCM, |
155 std::move(descriptors)); | 153 std::move(descriptors)); |
156 } | 154 } |
157 | 155 |
158 packetizer_.reset(new WiFiDisplayMediaPacketizer( | 156 packetizer_.reset(new WiFiDisplayMediaPacketizer( |
159 base::TimeDelta::FromMilliseconds(200), | 157 base::TimeDelta::FromMilliseconds(200), stream_infos, |
160 std::move(stream_infos), | |
161 base::Bind(&WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket, | 158 base::Bind(&WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket, |
162 base::Unretained(this)))); | 159 base::Unretained(this)))); |
163 } | 160 } |
164 | 161 |
165 void WiFiDisplayMediaPipeline::OnVideoEncoderCreated( | 162 void WiFiDisplayMediaPipeline::OnVideoEncoderCreated( |
166 const InitStepCompletionCallback& callback, | 163 const InitStepCompletionCallback& callback, |
167 scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) { | 164 scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) { |
168 DCHECK(!video_encoder_); | 165 DCHECK(!video_encoder_); |
169 | 166 |
170 if (!video_encoder) { | 167 if (!video_encoder) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 } | 201 } |
205 | 202 |
206 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket( | 203 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket( |
207 WiFiDisplayMediaDatagramPacket media_datagram_packet) { | 204 WiFiDisplayMediaDatagramPacket media_datagram_packet) { |
208 DCHECK(media_service_); | 205 DCHECK(media_service_); |
209 media_service_->SendMediaPacket(std::move(media_datagram_packet)); | 206 media_service_->SendMediaPacket(std::move(media_datagram_packet)); |
210 return true; | 207 return true; |
211 } | 208 } |
212 | 209 |
213 } // namespace extensions | 210 } // namespace extensions |
OLD | NEW |