Index: content/browser/renderer_host/media/video_capture_controller.cc |
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc |
index 454864cc1b9ce5dcefe45875d4f47aae7c233e62..ac39c3a4106781ff3b1c1a144d671410d9d978d1 100644 |
--- a/content/browser/renderer_host/media/video_capture_controller.cc |
+++ b/content/browser/renderer_host/media/video_capture_controller.cc |
@@ -139,6 +139,14 @@ class VideoCaptureController::VideoCaptureDeviceClient |
// Tracks the current frame format. |
media::VideoCaptureCapability frame_info_; |
+ |
+ // For NV21 we have to do color conversion into the intermediate buffer and |
+ // from there the rotations. This variable won't be needed after |
+ // http://crbug.com/292400 . |
scherkus (not reviewing)
2013/09/17 01:52:56
nit: remove trailing " ."
mcasas
2013/09/17 15:38:36
Done.
|
+#if defined(OS_IOS) || defined(OS_ANDROID) |
+ scoped_ptr<uint8[]> i420_intermediate_buffer_; |
+#endif // #if defined(OS_IOS) || defined(OS_ANDROID) |
+ |
scherkus (not reviewing)
2013/09/17 01:52:56
remove extra blank line
mcasas
2013/09/17 15:38:36
Done.
|
}; |
VideoCaptureController::VideoCaptureController() |
@@ -405,6 +413,7 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedFrame( |
bool flip_horiz) { |
DCHECK(frame_info_.color == media::PIXEL_FORMAT_I420 || |
frame_info_.color == media::PIXEL_FORMAT_YV12 || |
+ frame_info_.color == media::PIXEL_FORMAT_NV21 || |
(rotation == 0 && !flip_vert && !flip_horiz)); |
TRACE_EVENT0("video", "VideoCaptureController::OnIncomingCapturedFrame"); |
@@ -439,11 +448,21 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedFrame( |
data, yplane, vplane, uplane, frame_info_.width, frame_info_.height, |
rotation, flip_vert, flip_horiz); |
break; |
- case media::PIXEL_FORMAT_NV21: |
+ case media::PIXEL_FORMAT_NV21: { |
DCHECK(!chopped_width_ && !chopped_height_); |
- media::ConvertNV21ToYUV(data, yplane, uplane, vplane, frame_info_.width, |
+ int num_pixels = frame_info_.width * frame_info_.height; |
+ media::ConvertNV21ToYUV(data, |
+ &i420_intermediate_buffer_[0], |
+ &i420_intermediate_buffer_[num_pixels], |
+ &i420_intermediate_buffer_[num_pixels * 5 / 4], |
+ frame_info_.width, |
frame_info_.height); |
- break; |
+ RotatePackedYV12Frame( |
+ &i420_intermediate_buffer_[0], yplane, uplane, vplane, |
scherkus (not reviewing)
2013/09/17 01:52:56
i420_intermedia_buffer_.get() ?
mcasas
2013/09/17 15:38:36
Done.
|
+ frame_info_.width, frame_info_.height, |
+ rotation, flip_vert, flip_horiz); |
+ break; |
+ } |
case media::PIXEL_FORMAT_YUY2: |
DCHECK(!chopped_width_ && !chopped_height_); |
if (frame_info_.width * frame_info_.height * 2 != length) { |
@@ -619,6 +638,13 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnFrameInfo( |
} else { |
chopped_height_ = 0; |
} |
+#if defined(OS_IOS) || defined(OS_ANDROID) |
+ if ((frame_info_.color == media::PIXEL_FORMAT_NV21) && |
scherkus (not reviewing)
2013/09/17 01:52:56
drop extra ( ) around comparisons
mcasas
2013/09/17 15:38:36
Done.
|
+ (i420_intermediate_buffer_.get() == NULL)) { |
scherkus (not reviewing)
2013/09/17 01:52:56
scoped_ptr<T> allows pointers to be testable, so y
mcasas
2013/09/17 15:38:36
Done.
|
+ i420_intermediate_buffer_.reset( |
+ new uint8[frame_info_.width * frame_info_.height * 12 / 8]); |
+ } |
+#endif // #if defined(OS_IOS) || defined(OS_ANDROID) |
DCHECK(!buffer_pool_.get()); |