OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 if (!capturer_) { | 179 if (!capturer_) { |
180 LOG(LS_WARNING) << "OnMemoryBufferFrame() called for closed capturer."; | 180 LOG(LS_WARNING) << "OnMemoryBufferFrame() called for closed capturer."; |
181 return; | 181 return; |
182 } | 182 } |
183 int adapted_width; | 183 int adapted_width; |
184 int adapted_height; | 184 int adapted_height; |
185 int crop_width; | 185 int crop_width; |
186 int crop_height; | 186 int crop_height; |
187 int crop_x; | 187 int crop_x; |
188 int crop_y; | 188 int crop_y; |
| 189 int64_t translated_camera_time_us; |
189 | 190 |
190 if (!capturer_->AdaptFrame(width, height, timestamp_ns, | 191 if (!capturer_->AdaptFrame(width, height, |
| 192 timestamp_ns / rtc::kNumNanosecsPerMicrosec, |
| 193 rtc::TimeMicros(), |
191 &adapted_width, &adapted_height, | 194 &adapted_width, &adapted_height, |
192 &crop_width, &crop_height, &crop_x, &crop_y)) { | 195 &crop_width, &crop_height, &crop_x, &crop_y, |
| 196 &translated_camera_time_us)) { |
193 return; | 197 return; |
194 } | 198 } |
195 | 199 |
196 int rotated_width = crop_width; | 200 int rotated_width = crop_width; |
197 int rotated_height = crop_height; | 201 int rotated_height = crop_height; |
198 | 202 |
199 if (capturer_->apply_rotation() && (rotation == 90 || rotation == 270)) { | 203 if (capturer_->apply_rotation() && (rotation == 90 || rotation == 270)) { |
200 std::swap(adapted_width, adapted_height); | 204 std::swap(adapted_width, adapted_height); |
201 std::swap(rotated_width, rotated_height); | 205 std::swap(rotated_width, rotated_height); |
202 } | 206 } |
(...skipping 18 matching lines...) Expand all Loading... |
221 buffer->MutableDataU(), buffer->StrideU(), | 225 buffer->MutableDataU(), buffer->StrideU(), |
222 crop_width, crop_height, static_cast<libyuv::RotationMode>( | 226 crop_width, crop_height, static_cast<libyuv::RotationMode>( |
223 capturer_->apply_rotation() ? rotation : 0)); | 227 capturer_->apply_rotation() ? rotation : 0)); |
224 | 228 |
225 if (adapted_width != buffer->width() || adapted_height != buffer->height()) { | 229 if (adapted_width != buffer->width() || adapted_height != buffer->height()) { |
226 rtc::scoped_refptr<webrtc::I420Buffer> scaled_buffer( | 230 rtc::scoped_refptr<webrtc::I420Buffer> scaled_buffer( |
227 post_scale_pool_.CreateBuffer(adapted_width, adapted_height)); | 231 post_scale_pool_.CreateBuffer(adapted_width, adapted_height)); |
228 scaled_buffer->ScaleFrom(buffer); | 232 scaled_buffer->ScaleFrom(buffer); |
229 buffer = scaled_buffer; | 233 buffer = scaled_buffer; |
230 } | 234 } |
231 // TODO(nisse): Use microsecond time instead. | |
232 capturer_->OnFrame(cricket::WebRtcVideoFrame( | 235 capturer_->OnFrame(cricket::WebRtcVideoFrame( |
233 buffer, timestamp_ns, | 236 buffer, |
234 capturer_->apply_rotation() | 237 capturer_->apply_rotation() |
235 ? webrtc::kVideoRotation_0 | 238 ? webrtc::kVideoRotation_0 |
236 : static_cast<webrtc::VideoRotation>(rotation)), | 239 : static_cast<webrtc::VideoRotation>(rotation), |
| 240 translated_camera_time_us), |
237 width, height); | 241 width, height); |
238 } | 242 } |
239 | 243 |
240 void AndroidVideoCapturerJni::OnTextureFrame(int width, | 244 void AndroidVideoCapturerJni::OnTextureFrame(int width, |
241 int height, | 245 int height, |
242 int rotation, | 246 int rotation, |
243 int64_t timestamp_ns, | 247 int64_t timestamp_ns, |
244 const NativeHandleImpl& handle) { | 248 const NativeHandleImpl& handle) { |
245 RTC_DCHECK(rotation == 0 || rotation == 90 || rotation == 180 || | 249 RTC_DCHECK(rotation == 0 || rotation == 90 || rotation == 180 || |
246 rotation == 270); | 250 rotation == 270); |
247 rtc::CritScope cs(&capturer_lock_); | 251 rtc::CritScope cs(&capturer_lock_); |
248 if (!capturer_) { | 252 if (!capturer_) { |
249 LOG(LS_WARNING) << "OnTextureFrame() called for closed capturer."; | 253 LOG(LS_WARNING) << "OnTextureFrame() called for closed capturer."; |
250 surface_texture_helper_->ReturnTextureFrame(); | 254 surface_texture_helper_->ReturnTextureFrame(); |
251 return; | 255 return; |
252 } | 256 } |
253 int adapted_width; | 257 int adapted_width; |
254 int adapted_height; | 258 int adapted_height; |
255 int crop_width; | 259 int crop_width; |
256 int crop_height; | 260 int crop_height; |
257 int crop_x; | 261 int crop_x; |
258 int crop_y; | 262 int crop_y; |
| 263 int64_t translated_camera_time_us; |
259 | 264 |
260 if (!capturer_->AdaptFrame(width, height, timestamp_ns, | 265 if (!capturer_->AdaptFrame(width, height, |
| 266 timestamp_ns / rtc::kNumNanosecsPerMicrosec, |
| 267 rtc::TimeMicros(), |
261 &adapted_width, &adapted_height, | 268 &adapted_width, &adapted_height, |
262 &crop_width, &crop_height, &crop_x, &crop_y)) { | 269 &crop_width, &crop_height, &crop_x, &crop_y, |
| 270 &translated_camera_time_us)) { |
263 surface_texture_helper_->ReturnTextureFrame(); | 271 surface_texture_helper_->ReturnTextureFrame(); |
264 return; | 272 return; |
265 } | 273 } |
266 | 274 |
267 Matrix matrix = handle.sampling_matrix; | 275 Matrix matrix = handle.sampling_matrix; |
268 | 276 |
269 matrix.Crop(crop_width / static_cast<float>(width), | 277 matrix.Crop(crop_width / static_cast<float>(width), |
270 crop_height / static_cast<float>(height), | 278 crop_height / static_cast<float>(height), |
271 crop_x / static_cast<float>(width), | 279 crop_x / static_cast<float>(width), |
272 crop_y / static_cast<float>(height)); | 280 crop_y / static_cast<float>(height)); |
273 | 281 |
274 if (capturer_->apply_rotation()) { | 282 if (capturer_->apply_rotation()) { |
275 if (rotation == webrtc::kVideoRotation_90 || | 283 if (rotation == webrtc::kVideoRotation_90 || |
276 rotation == webrtc::kVideoRotation_270) { | 284 rotation == webrtc::kVideoRotation_270) { |
277 std::swap(adapted_width, adapted_height); | 285 std::swap(adapted_width, adapted_height); |
278 } | 286 } |
279 matrix.Rotate(static_cast<webrtc::VideoRotation>(rotation)); | 287 matrix.Rotate(static_cast<webrtc::VideoRotation>(rotation)); |
280 } | 288 } |
281 | 289 |
282 // TODO(nisse): Use microsecond time instead. | |
283 capturer_->OnFrame( | 290 capturer_->OnFrame( |
284 cricket::WebRtcVideoFrame( | 291 cricket::WebRtcVideoFrame( |
285 surface_texture_helper_->CreateTextureFrame( | 292 surface_texture_helper_->CreateTextureFrame( |
286 adapted_width, adapted_height, | 293 adapted_width, adapted_height, |
287 NativeHandleImpl(handle.oes_texture_id, matrix)), | 294 NativeHandleImpl(handle.oes_texture_id, matrix)), |
288 timestamp_ns, capturer_->apply_rotation() | 295 capturer_->apply_rotation() |
289 ? webrtc::kVideoRotation_0 | 296 ? webrtc::kVideoRotation_0 |
290 : static_cast<webrtc::VideoRotation>(rotation)), | 297 : static_cast<webrtc::VideoRotation>(rotation), |
| 298 translated_camera_time_us), |
291 width, height); | 299 width, height); |
292 } | 300 } |
293 | 301 |
294 void AndroidVideoCapturerJni::OnOutputFormatRequest(int width, | 302 void AndroidVideoCapturerJni::OnOutputFormatRequest(int width, |
295 int height, | 303 int height, |
296 int fps) { | 304 int fps) { |
297 AsyncCapturerInvoke(RTC_FROM_HERE, | 305 AsyncCapturerInvoke(RTC_FROM_HERE, |
298 &webrtc::AndroidVideoCapturer::OnOutputFormatRequest, | 306 &webrtc::AndroidVideoCapturer::OnOutputFormatRequest, |
299 width, height, fps); | 307 width, height, fps); |
300 } | 308 } |
(...skipping 30 matching lines...) Expand all Loading... |
331 | 339 |
332 JOW(void, VideoCapturer_00024NativeObserver_nativeOnOutputFormatRequest) | 340 JOW(void, VideoCapturer_00024NativeObserver_nativeOnOutputFormatRequest) |
333 (JNIEnv* jni, jclass, jlong j_capturer, jint j_width, jint j_height, | 341 (JNIEnv* jni, jclass, jlong j_capturer, jint j_width, jint j_height, |
334 jint j_fps) { | 342 jint j_fps) { |
335 LOG(LS_INFO) << "NativeObserver_nativeOnOutputFormatRequest"; | 343 LOG(LS_INFO) << "NativeObserver_nativeOnOutputFormatRequest"; |
336 reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer)->OnOutputFormatRequest( | 344 reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer)->OnOutputFormatRequest( |
337 j_width, j_height, j_fps); | 345 j_width, j_height, j_fps); |
338 } | 346 } |
339 | 347 |
340 } // namespace webrtc_jni | 348 } // namespace webrtc_jni |
OLD | NEW |