Index: webrtc/media/base/fakevideocapturer.h |
diff --git a/webrtc/media/base/fakevideocapturer.h b/webrtc/media/base/fakevideocapturer.h |
index 0f2d8edc30a9d252bb5430b1e862a47c4e1e252f..8ba56f1e6f1971ee1e27aefcd823316598ff818d 100644 |
--- a/webrtc/media/base/fakevideocapturer.h |
+++ b/webrtc/media/base/fakevideocapturer.h |
@@ -20,6 +20,9 @@ |
#include "webrtc/media/base/videocapturer.h" |
#include "webrtc/media/base/videocommon.h" |
#include "webrtc/media/base/videoframe.h" |
+#ifdef HAVE_WEBRTC_VIDEO |
+#include "webrtc/media/engine/webrtcvideoframefactory.h" |
+#endif |
namespace cricket { |
@@ -32,6 +35,9 @@ |
next_timestamp_(rtc::kNumNanosecsPerMillisec), |
is_screencast_(is_screencast), |
rotation_(webrtc::kVideoRotation_0) { |
+#ifdef HAVE_WEBRTC_VIDEO |
+ set_frame_factory(new cricket::WebRtcVideoFrameFactory()); |
+#endif |
// Default supported formats. Use ResetSupportedFormats to over write. |
std::vector<cricket::VideoFormat> formats; |
formats.push_back(cricket::VideoFormat(1280, 720, |
@@ -75,35 +81,44 @@ |
if (!running_) { |
return false; |
} |
- RTC_CHECK(fourcc == FOURCC_I420); |
- RTC_CHECK(width > 0); |
- RTC_CHECK(height > 0); |
+ // Currently, |fourcc| is always I420 or ARGB. |
+ uint32_t size = 0u; |
+ if (fourcc == cricket::FOURCC_ARGB) { |
+ size = width * 4 * height; |
+ } else if (fourcc == cricket::FOURCC_I420) { |
+ size = width * height + 2 * ((width + 1) / 2) * ((height + 1) / 2); |
+ } else { |
+ return false; // Unsupported FOURCC. |
+ } |
+ if (size == 0u) { |
+ return false; // Width and/or Height were zero. |
+ } |
- int adapted_width; |
- int adapted_height; |
- int crop_width; |
- int crop_height; |
- int crop_x; |
- int crop_y; |
- |
- // TODO(nisse): It's a bit silly to have this logic in a fake |
- // class. Child classes of VideoCapturer are expected to call |
- // AdaptFrame, and the test case |
- // VideoCapturerTest.SinkWantsMaxPixelAndMaxPixelCountStepUp |
- // depends on this. |
- if (AdaptFrame(width, height, 0, 0, &adapted_width, &adapted_height, |
- &crop_width, &crop_height, &crop_x, &crop_y, nullptr)) { |
- rtc::scoped_refptr<webrtc::I420Buffer> buffer( |
- webrtc::I420Buffer::Create(adapted_width, adapted_height)); |
- buffer->InitializeData(); |
- |
- OnFrame(WebRtcVideoFrame(buffer, rotation_, |
- next_timestamp_ / rtc::kNumNanosecsPerMicrosec), |
- width, height); |
- } |
+ cricket::CapturedFrame frame; |
+ frame.width = width; |
+ frame.height = height; |
+ frame.fourcc = fourcc; |
+ frame.data_size = size; |
+ frame.time_stamp = initial_timestamp_ + next_timestamp_; |
next_timestamp_ += timestamp_interval; |
+ std::unique_ptr<char[]> data(new char[size]); |
+ frame.data = data.get(); |
+ // Copy something non-zero into the buffer so Validate wont complain that |
+ // the frame is all duplicate. |
+ memset(frame.data, 1, size / 2); |
+ memset(reinterpret_cast<uint8_t*>(frame.data) + (size / 2), 2, |
+ size - (size / 2)); |
+ memcpy(frame.data, reinterpret_cast<const uint8_t*>(&fourcc), 4); |
+ frame.rotation = rotation_; |
+ // TODO(zhurunz): SignalFrameCaptured carry returned value to be able to |
+ // capture results from downstream. |
+ SignalFrameCaptured(this, &frame); |
return true; |
+ } |
+ |
+ void SignalCapturedFrame(cricket::CapturedFrame* frame) { |
+ SignalFrameCaptured(this, frame); |
} |
sigslot::signal1<FakeVideoCapturer*> SignalDestroyed; |