| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/browser/renderer_host/media/video_capture_device_client.h" | 5 #include "content/browser/renderer_host/media/video_capture_device_client.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 #include "content/browser/renderer_host/media/video_capture_buffer_pool.h" | 10 #include "content/browser/renderer_host/media/video_capture_buffer_pool.h" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 rotation_mode = libyuv::kRotate270; | 98 rotation_mode = libyuv::kRotate270; |
| 99 | 99 |
| 100 const gfx::Size dimensions(destination_width, destination_height); | 100 const gfx::Size dimensions(destination_width, destination_height); |
| 101 if (!VideoFrame::IsValidConfig(VideoFrame::I420, | 101 if (!VideoFrame::IsValidConfig(VideoFrame::I420, |
| 102 dimensions, | 102 dimensions, |
| 103 gfx::Rect(dimensions), | 103 gfx::Rect(dimensions), |
| 104 dimensions)) { | 104 dimensions)) { |
| 105 return; | 105 return; |
| 106 } | 106 } |
| 107 | 107 |
| 108 scoped_refptr<Buffer> buffer = ReserveOutputBuffer(VideoFrame::I420, | 108 scoped_refptr<Buffer> buffer = |
| 109 dimensions); | 109 ReserveOutputBuffer(media::PIXEL_FORMAT_I420, dimensions); |
| 110 if (!buffer.get()) | 110 if (!buffer.get()) |
| 111 return; | 111 return; |
| 112 | 112 |
| 113 uint8* const yplane = reinterpret_cast<uint8*>(buffer->data()); | 113 uint8* const yplane = reinterpret_cast<uint8*>(buffer->data()); |
| 114 uint8* const uplane = | 114 uint8* const uplane = |
| 115 yplane + VideoFrame::PlaneAllocationSize(VideoFrame::I420, | 115 yplane + VideoFrame::PlaneAllocationSize(VideoFrame::I420, |
| 116 VideoFrame::kYPlane, dimensions); | 116 VideoFrame::kYPlane, dimensions); |
| 117 uint8* const vplane = | 117 uint8* const vplane = |
| 118 uplane + VideoFrame::PlaneAllocationSize(VideoFrame::I420, | 118 uplane + VideoFrame::PlaneAllocationSize(VideoFrame::I420, |
| 119 VideoFrame::kUPlane, dimensions); | 119 VideoFrame::kUPlane, dimensions); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 size_t y_stride, | 236 size_t y_stride, |
| 237 size_t u_stride, | 237 size_t u_stride, |
| 238 size_t v_stride, | 238 size_t v_stride, |
| 239 const VideoCaptureFormat& frame_format, | 239 const VideoCaptureFormat& frame_format, |
| 240 int clockwise_rotation, | 240 int clockwise_rotation, |
| 241 const base::TimeTicks& timestamp) { | 241 const base::TimeTicks& timestamp) { |
| 242 TRACE_EVENT0("video", "VideoCaptureController::OnIncomingCapturedYuvData"); | 242 TRACE_EVENT0("video", "VideoCaptureController::OnIncomingCapturedYuvData"); |
| 243 DCHECK_EQ(frame_format.pixel_format, media::PIXEL_FORMAT_I420); | 243 DCHECK_EQ(frame_format.pixel_format, media::PIXEL_FORMAT_I420); |
| 244 DCHECK_EQ(clockwise_rotation, 0) << "Rotation not supported"; | 244 DCHECK_EQ(clockwise_rotation, 0) << "Rotation not supported"; |
| 245 | 245 |
| 246 scoped_refptr<Buffer> buffer = ReserveOutputBuffer(VideoFrame::I420, | 246 scoped_refptr<Buffer> buffer = |
| 247 frame_format.frame_size); | 247 ReserveOutputBuffer(frame_format.pixel_format, frame_format.frame_size); |
| 248 if (!buffer.get()) | 248 if (!buffer.get()) |
| 249 return; | 249 return; |
| 250 | 250 |
| 251 // Blit (copy) here from y,u,v into buffer.data()). Needed so we can return | 251 // Blit (copy) here from y,u,v into buffer.data()). Needed so we can return |
| 252 // the parameter buffer synchronously to the driver. | 252 // the parameter buffer synchronously to the driver. |
| 253 const size_t y_plane_size = VideoFrame::PlaneAllocationSize(VideoFrame::I420, | 253 const size_t y_plane_size = VideoFrame::PlaneAllocationSize(VideoFrame::I420, |
| 254 VideoFrame::kYPlane, frame_format.frame_size); | 254 VideoFrame::kYPlane, frame_format.frame_size); |
| 255 const size_t u_plane_size = VideoFrame::PlaneAllocationSize( | 255 const size_t u_plane_size = VideoFrame::PlaneAllocationSize( |
| 256 VideoFrame::I420, VideoFrame::kUPlane, frame_format.frame_size); | 256 VideoFrame::I420, VideoFrame::kUPlane, frame_format.frame_size); |
| 257 uint8* const dst_y = reinterpret_cast<uint8*>(buffer->data()); | 257 uint8* const dst_y = reinterpret_cast<uint8*>(buffer->data()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 FROM_HERE, | 294 FROM_HERE, |
| 295 base::Bind( | 295 base::Bind( |
| 296 &VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread, | 296 &VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread, |
| 297 controller_, | 297 controller_, |
| 298 buffer, | 298 buffer, |
| 299 video_frame, | 299 video_frame, |
| 300 timestamp)); | 300 timestamp)); |
| 301 }; | 301 }; |
| 302 | 302 |
| 303 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> | 303 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> |
| 304 VideoCaptureDeviceClient::ReserveOutputBuffer(VideoFrame::Format format, | 304 VideoCaptureDeviceClient::ReserveOutputBuffer(media::VideoPixelFormat format, |
| 305 const gfx::Size& dimensions) { | 305 const gfx::Size& dimensions) { |
| 306 const size_t frame_bytes = VideoFrame::AllocationSize(format, dimensions); | 306 DCHECK(format == media::PIXEL_FORMAT_TEXTURE || |
| 307 if (format == VideoFrame::NATIVE_TEXTURE) { | 307 format == media::PIXEL_FORMAT_I420 || |
| 308 DCHECK_EQ(dimensions.width(), 0); | 308 format == media::PIXEL_FORMAT_ARGB); |
| 309 DCHECK_EQ(dimensions.height(), 0); | 309 DCHECK_GT(dimensions.width(), 0); |
| 310 } else { | 310 DCHECK_GT(dimensions.height(), 0); |
| 311 DLOG_IF(ERROR, frame_bytes == 0) << "Error calculating allocation size"; | |
| 312 } | |
| 313 | 311 |
| 314 int buffer_id_to_drop = VideoCaptureBufferPool::kInvalidId; | 312 int buffer_id_to_drop = VideoCaptureBufferPool::kInvalidId; |
| 315 const int buffer_id = | 313 const int buffer_id = |
| 316 buffer_pool_->ReserveForProducer(frame_bytes, &buffer_id_to_drop); | 314 buffer_pool_->ReserveForProducer(format, dimensions, &buffer_id_to_drop); |
| 317 if (buffer_id == VideoCaptureBufferPool::kInvalidId) | 315 if (buffer_id == VideoCaptureBufferPool::kInvalidId) |
| 318 return NULL; | 316 return NULL; |
| 319 void* data; | 317 void* data; |
| 320 size_t size; | 318 size_t size; |
| 321 buffer_pool_->GetBufferInfo(buffer_id, &data, &size); | 319 buffer_pool_->GetBufferInfo(buffer_id, &data, &size); |
| 322 | 320 |
| 323 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> output_buffer( | 321 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> output_buffer( |
| 324 new AutoReleaseBuffer(buffer_pool_, buffer_id, data, size)); | 322 new AutoReleaseBuffer(buffer_pool_, buffer_id, data, size)); |
| 325 | 323 |
| 326 if (buffer_id_to_drop != VideoCaptureBufferPool::kInvalidId) { | 324 if (buffer_id_to_drop != VideoCaptureBufferPool::kInvalidId) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 } | 362 } |
| 365 | 363 |
| 366 void VideoCaptureDeviceClient::OnLog( | 364 void VideoCaptureDeviceClient::OnLog( |
| 367 const std::string& message) { | 365 const std::string& message) { |
| 368 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 366 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 369 base::Bind(&VideoCaptureController::DoLogOnIOThread, | 367 base::Bind(&VideoCaptureController::DoLogOnIOThread, |
| 370 controller_, message)); | 368 controller_, message)); |
| 371 } | 369 } |
| 372 | 370 |
| 373 } // namespace content | 371 } // namespace content |
| OLD | NEW |