| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 // Windows RGB24 defines blue at lowest byte, | 181 // Windows RGB24 defines blue at lowest byte, |
| 182 // see https://msdn.microsoft.com/en-us/library/windows/desktop/dd407253 | 182 // see https://msdn.microsoft.com/en-us/library/windows/desktop/dd407253 |
| 183 #if defined(OS_LINUX) | 183 #if defined(OS_LINUX) |
| 184 origin_colorspace = libyuv::FOURCC_RAW; | 184 origin_colorspace = libyuv::FOURCC_RAW; |
| 185 #elif defined(OS_WIN) | 185 #elif defined(OS_WIN) |
| 186 origin_colorspace = libyuv::FOURCC_24BG; | 186 origin_colorspace = libyuv::FOURCC_24BG; |
| 187 #else | 187 #else |
| 188 NOTREACHED() << "RGB24 is only available in Linux and Windows platforms"; | 188 NOTREACHED() << "RGB24 is only available in Linux and Windows platforms"; |
| 189 #endif | 189 #endif |
| 190 #if defined(OS_WIN) | 190 #if defined(OS_WIN) |
| 191 // TODO(wjia): Currently, for RGB24 on WIN, capture device always | 191 // TODO(wjia): Currently, for RGB24 on WIN, capture device always passes |
| 192 // passes in positive src_width and src_height. Remove this hardcoded | 192 // in positive src_width and src_height. Remove this hardcoded value when |
| 193 // value when nagative src_height is supported. The negative src_height | 193 // negative src_height is supported. The negative src_height indicates |
| 194 // indicates that vertical flipping is needed. | 194 // that vertical flipping is needed. |
| 195 flip = true; | 195 flip = true; |
| 196 #endif | 196 #endif |
| 197 break; | 197 break; |
| 198 case media::PIXEL_FORMAT_RGB32: | 198 case media::PIXEL_FORMAT_RGB32: |
| 199 // Fallback to PIXEL_FORMAT_ARGB setting |flip| in Windows | 199 // Fallback to PIXEL_FORMAT_ARGB setting |flip| in Windows |
| 200 // platforms. | 200 // platforms. |
| 201 #if defined(OS_WIN) | 201 #if defined(OS_WIN) |
| 202 flip = true; | 202 flip = true; |
| 203 #endif | 203 #endif |
| 204 case media::PIXEL_FORMAT_ARGB: | 204 case media::PIXEL_FORMAT_ARGB: |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 << media::VideoPixelFormatToString(frame_format.pixel_format); | 249 << media::VideoPixelFormatToString(frame_format.pixel_format); |
| 250 return; | 250 return; |
| 251 } | 251 } |
| 252 | 252 |
| 253 const VideoCaptureFormat output_format = VideoCaptureFormat( | 253 const VideoCaptureFormat output_format = VideoCaptureFormat( |
| 254 dimensions, frame_format.frame_rate, | 254 dimensions, frame_format.frame_rate, |
| 255 media::PIXEL_FORMAT_I420, output_pixel_storage); | 255 media::PIXEL_FORMAT_I420, output_pixel_storage); |
| 256 OnIncomingCapturedBuffer(std::move(buffer), output_format, timestamp); | 256 OnIncomingCapturedBuffer(std::move(buffer), output_format, timestamp); |
| 257 } | 257 } |
| 258 | 258 |
| 259 void VideoCaptureDeviceClient::OnIncomingCapturedYuvData( | |
| 260 const uint8_t* y_data, | |
| 261 const uint8_t* u_data, | |
| 262 const uint8_t* v_data, | |
| 263 size_t y_stride, | |
| 264 size_t u_stride, | |
| 265 size_t v_stride, | |
| 266 const VideoCaptureFormat& frame_format, | |
| 267 int clockwise_rotation, | |
| 268 const base::TimeTicks& timestamp) { | |
| 269 TRACE_EVENT0("video", "VideoCaptureDeviceClient::OnIncomingCapturedYuvData"); | |
| 270 DCHECK_EQ(media::PIXEL_FORMAT_I420, frame_format.pixel_format); | |
| 271 DCHECK_EQ(media::PIXEL_STORAGE_CPU, frame_format.pixel_storage); | |
| 272 DCHECK_EQ(0, clockwise_rotation) << "Rotation not supported"; | |
| 273 | |
| 274 uint8_t *y_plane_data, *u_plane_data, *v_plane_data; | |
| 275 scoped_ptr<Buffer> buffer(ReserveI420OutputBuffer( | |
| 276 frame_format.frame_size, frame_format.pixel_storage, &y_plane_data, | |
| 277 &u_plane_data, &v_plane_data)); | |
| 278 if (!buffer.get()) | |
| 279 return; | |
| 280 | |
| 281 const size_t dst_y_stride = | |
| 282 VideoFrame::RowBytes(VideoFrame::kYPlane, media::PIXEL_FORMAT_I420, | |
| 283 frame_format.frame_size.width()); | |
| 284 const size_t dst_u_stride = | |
| 285 VideoFrame::RowBytes(VideoFrame::kUPlane, media::PIXEL_FORMAT_I420, | |
| 286 frame_format.frame_size.width()); | |
| 287 const size_t dst_v_stride = | |
| 288 VideoFrame::RowBytes(VideoFrame::kVPlane, media::PIXEL_FORMAT_I420, | |
| 289 frame_format.frame_size.width()); | |
| 290 DCHECK_GE(y_stride, dst_y_stride); | |
| 291 DCHECK_GE(u_stride, dst_u_stride); | |
| 292 DCHECK_GE(v_stride, dst_v_stride); | |
| 293 | |
| 294 if (libyuv::I420Copy(y_data, y_stride, | |
| 295 u_data, u_stride, | |
| 296 v_data, v_stride, | |
| 297 y_plane_data, dst_y_stride, | |
| 298 u_plane_data, dst_u_stride, | |
| 299 v_plane_data, dst_v_stride, | |
| 300 frame_format.frame_size.width(), | |
| 301 frame_format.frame_size.height())) { | |
| 302 DLOG(WARNING) << "Failed to copy buffer"; | |
| 303 return; | |
| 304 } | |
| 305 | |
| 306 OnIncomingCapturedBuffer(std::move(buffer), frame_format, timestamp); | |
| 307 }; | |
| 308 | |
| 309 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> | 259 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> |
| 310 VideoCaptureDeviceClient::ReserveOutputBuffer( | 260 VideoCaptureDeviceClient::ReserveOutputBuffer( |
| 311 const gfx::Size& frame_size, | 261 const gfx::Size& frame_size, |
| 312 media::VideoPixelFormat pixel_format, | 262 media::VideoPixelFormat pixel_format, |
| 313 media::VideoPixelStorage pixel_storage) { | 263 media::VideoPixelStorage pixel_storage) { |
| 314 DCHECK_GT(frame_size.width(), 0); | 264 DCHECK_GT(frame_size.width(), 0); |
| 315 DCHECK_GT(frame_size.height(), 0); | 265 DCHECK_GT(frame_size.height(), 0); |
| 316 // Currently, only I420 pixel format is supported. | 266 // Currently, only I420 pixel format is supported. |
| 317 DCHECK_EQ(media::PIXEL_FORMAT_I420, pixel_format); | 267 DCHECK_EQ(media::PIXEL_FORMAT_I420, pixel_format); |
| 318 | 268 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 reinterpret_cast<uint8_t*>(buffer->data(VideoFrame::kUPlane)); | 406 reinterpret_cast<uint8_t*>(buffer->data(VideoFrame::kUPlane)); |
| 457 *v_plane_data = | 407 *v_plane_data = |
| 458 reinterpret_cast<uint8_t*>(buffer->data(VideoFrame::kVPlane)); | 408 reinterpret_cast<uint8_t*>(buffer->data(VideoFrame::kVPlane)); |
| 459 return buffer; | 409 return buffer; |
| 460 } | 410 } |
| 461 NOTREACHED(); | 411 NOTREACHED(); |
| 462 return scoped_ptr<Buffer>(); | 412 return scoped_ptr<Buffer>(); |
| 463 } | 413 } |
| 464 | 414 |
| 465 } // namespace content | 415 } // namespace content |
| OLD | NEW |