From 89e8ffb3956ca7cdaa9c1d225eefaf2e3616503f Mon Sep 17 00:00:00 2001 From: "wuchengli@chromium.org" Date: Tue, 27 May 2014 14:12:58 +0000 Subject: [PATCH] Revert "Add support of texture frames for video capturer." This reverts commit 83c89cd003be75d7d06ef9a2b139588f08d280ca. Reason: The Buildbot has detected a new failure on builder Android Chromium-APK Tests. BUG=chromium:362437 TBR=fischman@webrtc.org, perkj@webrtc.org, stefan@webrtc.org, wu@webrtc.org Review URL: https://webrtc-codereview.appspot.com/12599004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6253 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/common_video/i420_video_frame.cc | 11 - .../common_video/i420_video_frame_unittest.cc | 68 ++--- .../common_video/interface/i420_video_frame.h | 10 +- .../interface/texture_video_frame.h | 1 - webrtc/common_video/texture_video_frame.cc | 5 - .../texture_video_frame_unittest.cc | 23 +- .../interface/mock/mock_process_thread.h | 29 -- .../utility/source/video_frames_queue.cc | 7 +- .../include/mock/mock_video_capture.h | 50 ---- .../modules/video_capture/video_capture.gypi | 1 - .../video_render/video_render_frames.cc | 7 +- .../encoder_state_feedback_unittest.cc | 21 +- .../mock/mock_vie_frame_provider_base.h | 33 --- webrtc/video_engine/video_engine_core.gypi | 1 - webrtc/video_engine/vie_capturer.cc | 39 +-- webrtc/video_engine/vie_capturer.h | 4 +- webrtc/video_engine/vie_capturer_unittest.cc | 263 ------------------ webrtc/video_engine/vie_encoder.cc | 4 - webrtc/video_engine/vie_remb_unittest.cc | 17 +- 19 files changed, 81 insertions(+), 513 deletions(-) delete mode 100644 webrtc/modules/utility/interface/mock/mock_process_thread.h delete mode 100644 webrtc/modules/video_capture/include/mock/mock_video_capture.h delete mode 100644 webrtc/video_engine/mock/mock_vie_frame_provider_base.h delete mode 100644 webrtc/video_engine/vie_capturer_unittest.cc diff --git a/webrtc/common_video/i420_video_frame.cc b/webrtc/common_video/i420_video_frame.cc index fdc2bbc23..5b9543b60 100644 --- a/webrtc/common_video/i420_video_frame.cc +++ b/webrtc/common_video/i420_video_frame.cc @@ -10,8 +10,6 @@ #include "webrtc/common_video/interface/i420_video_frame.h" -#include - #include // swap namespace webrtc { @@ -80,15 +78,6 @@ int I420VideoFrame::CopyFrame(const I420VideoFrame& videoFrame) { return 0; } -I420VideoFrame* I420VideoFrame::CloneFrame() const { - scoped_ptr new_frame(new I420VideoFrame()); - if (new_frame->CopyFrame(*this) == -1) { - // CopyFrame failed. - return NULL; - } - return new_frame.release(); -} - void I420VideoFrame::SwapFrame(I420VideoFrame* videoFrame) { y_plane_.Swap(videoFrame->y_plane_); u_plane_.Swap(videoFrame->u_plane_); diff --git a/webrtc/common_video/i420_video_frame_unittest.cc b/webrtc/common_video/i420_video_frame_unittest.cc index ca01fd0cd..29578c73d 100644 --- a/webrtc/common_video/i420_video_frame_unittest.cc +++ b/webrtc/common_video/i420_video_frame_unittest.cc @@ -19,8 +19,8 @@ namespace webrtc { -bool EqualFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2); +bool EqualFrames(const I420VideoFrame& videoFrame1, + const I420VideoFrame& videoFrame2); bool EqualFramesExceptSize(const I420VideoFrame& frame1, const I420VideoFrame& frame2); int ExpectedSize(int plane_stride, int image_height, PlaneType type); @@ -122,29 +122,6 @@ TEST(TestI420VideoFrame, CopyFrame) { EXPECT_TRUE(EqualFrames(frame1, frame2)); } -TEST(TestI420VideoFrame, CloneFrame) { - I420VideoFrame frame1; - scoped_ptr frame2; - const int kSizeY = 225; - const int kSizeU = 80; - const int kSizeV = 80; - uint8_t buffer_y[kSizeY]; - uint8_t buffer_u[kSizeU]; - uint8_t buffer_v[kSizeV]; - memset(buffer_y, 16, kSizeY); - memset(buffer_u, 8, kSizeU); - memset(buffer_v, 4, kSizeV); - frame1.CreateFrame( - kSizeY, buffer_y, kSizeU, buffer_u, kSizeV, buffer_v, 20, 20, 20, 10, 10); - frame1.set_timestamp(1); - frame1.set_ntp_time_ms(2); - frame1.set_render_time_ms(3); - - frame2.reset(frame1.CloneFrame()); - EXPECT_TRUE(frame2.get() != NULL); - EXPECT_TRUE(EqualFrames(frame1, *frame2)); -} - TEST(TestI420VideoFrame, CopyBuffer) { I420VideoFrame frame1, frame2; int width = 15; @@ -257,24 +234,29 @@ TEST(TestI420VideoFrame, RefCountedInstantiation) { bool EqualFrames(const I420VideoFrame& frame1, const I420VideoFrame& frame2) { - return (EqualFramesExceptSize(frame1, frame2) && - (frame1.allocated_size(kYPlane) == frame2.allocated_size(kYPlane)) && - (frame1.allocated_size(kUPlane) == frame2.allocated_size(kUPlane)) && - (frame1.allocated_size(kVPlane) == frame2.allocated_size(kVPlane))); + if (!EqualFramesExceptSize(frame1, frame2)) + return false; + // Compare allocated memory size. + bool ret = true; + ret |= (frame1.allocated_size(kYPlane) == frame2.allocated_size(kYPlane)); + ret |= (frame1.allocated_size(kUPlane) == frame2.allocated_size(kUPlane)); + ret |= (frame1.allocated_size(kVPlane) == frame2.allocated_size(kVPlane)); + return ret; } bool EqualFramesExceptSize(const I420VideoFrame& frame1, const I420VideoFrame& frame2) { - if ((frame1.width() != frame2.width()) || - (frame1.height() != frame2.height()) || - (frame1.stride(kYPlane) != frame2.stride(kYPlane)) || - (frame1.stride(kUPlane) != frame2.stride(kUPlane)) || - (frame1.stride(kVPlane) != frame2.stride(kVPlane)) || - (frame1.timestamp() != frame2.timestamp()) || - (frame1.ntp_time_ms() != frame2.ntp_time_ms()) || - (frame1.render_time_ms() != frame2.render_time_ms())) { + bool ret = true; + ret |= (frame1.width() == frame2.width()); + ret |= (frame1.height() == frame2.height()); + ret |= (frame1.stride(kYPlane) == frame2.stride(kYPlane)); + ret |= (frame1.stride(kUPlane) == frame2.stride(kUPlane)); + ret |= (frame1.stride(kVPlane) == frame2.stride(kVPlane)); + ret |= (frame1.timestamp() == frame2.timestamp()); + ret |= (frame1.ntp_time_ms() == frame2.ntp_time_ms()); + ret |= (frame1.render_time_ms() == frame2.render_time_ms()); + if (!ret) return false; - } // Memory should be the equal for the minimum of the two sizes. int size_y = std::min(frame1.allocated_size(kYPlane), frame2.allocated_size(kYPlane)); @@ -282,9 +264,13 @@ bool EqualFramesExceptSize(const I420VideoFrame& frame1, frame2.allocated_size(kUPlane)); int size_v = std::min(frame1.allocated_size(kVPlane), frame2.allocated_size(kVPlane)); - return (memcmp(frame1.buffer(kYPlane), frame2.buffer(kYPlane), size_y) == 0 && - memcmp(frame1.buffer(kUPlane), frame2.buffer(kUPlane), size_u) == 0 && - memcmp(frame1.buffer(kVPlane), frame2.buffer(kVPlane), size_v) == 0); + int ret_val = 0; + ret_val += memcmp(frame1.buffer(kYPlane), frame2.buffer(kYPlane), size_y); + ret_val += memcmp(frame1.buffer(kUPlane), frame2.buffer(kUPlane), size_u); + ret_val += memcmp(frame1.buffer(kVPlane), frame2.buffer(kVPlane), size_v); + if (ret_val == 0) + return true; + return false; } int ExpectedSize(int plane_stride, int image_height, PlaneType type) { diff --git a/webrtc/common_video/interface/i420_video_frame.h b/webrtc/common_video/interface/i420_video_frame.h index 5f7a572bd..3f90a8e27 100644 --- a/webrtc/common_video/interface/i420_video_frame.h +++ b/webrtc/common_video/interface/i420_video_frame.h @@ -51,13 +51,13 @@ class I420VideoFrame { // on set dimensions - height and plane stride. // If required size is bigger than the allocated one, new buffers of adequate // size will be allocated. - // Return value: 0 on success, -1 on error. + // Return value: 0 on success ,-1 on error. virtual int CreateEmptyFrame(int width, int height, int stride_y, int stride_u, int stride_v); // CreateFrame: Sets the frame's members and buffers. If required size is // bigger than allocated one, new buffers of adequate size will be allocated. - // Return value: 0 on success, -1 on error. + // Return value: 0 on success ,-1 on error. virtual int CreateFrame(int size_y, const uint8_t* buffer_y, int size_u, const uint8_t* buffer_u, int size_v, const uint8_t* buffer_v, @@ -66,13 +66,9 @@ class I420VideoFrame { // Copy frame: If required size is bigger than allocated one, new buffers of // adequate size will be allocated. - // Return value: 0 on success, -1 on error. + // Return value: 0 on success ,-1 on error. virtual int CopyFrame(const I420VideoFrame& videoFrame); - // Make a copy of |this|. The caller owns the returned frame. - // Return value: a new frame on success, NULL on error. - virtual I420VideoFrame* CloneFrame() const; - // Swap Frame. virtual void SwapFrame(I420VideoFrame* videoFrame); diff --git a/webrtc/common_video/interface/texture_video_frame.h b/webrtc/common_video/interface/texture_video_frame.h index 2c625ab57..e905ea733 100644 --- a/webrtc/common_video/interface/texture_video_frame.h +++ b/webrtc/common_video/interface/texture_video_frame.h @@ -49,7 +49,6 @@ class TextureVideoFrame : public I420VideoFrame { int stride_u, int stride_v) OVERRIDE; virtual int CopyFrame(const I420VideoFrame& videoFrame) OVERRIDE; - virtual I420VideoFrame* CloneFrame() const OVERRIDE; virtual void SwapFrame(I420VideoFrame* videoFrame) OVERRIDE; virtual uint8_t* buffer(PlaneType type) OVERRIDE; virtual const uint8_t* buffer(PlaneType type) const OVERRIDE; diff --git a/webrtc/common_video/texture_video_frame.cc b/webrtc/common_video/texture_video_frame.cc index f301d19c8..2dd6cadbe 100644 --- a/webrtc/common_video/texture_video_frame.cc +++ b/webrtc/common_video/texture_video_frame.cc @@ -57,11 +57,6 @@ int TextureVideoFrame::CopyFrame(const I420VideoFrame& videoFrame) { return -1; } -I420VideoFrame* TextureVideoFrame::CloneFrame() const { - return new TextureVideoFrame( - handle_, width(), height(), timestamp(), render_time_ms()); -} - void TextureVideoFrame::SwapFrame(I420VideoFrame* videoFrame) { assert(false); // Should not be called. } diff --git a/webrtc/common_video/texture_video_frame_unittest.cc b/webrtc/common_video/texture_video_frame_unittest.cc index 408f5f612..04e09a67d 100644 --- a/webrtc/common_video/texture_video_frame_unittest.cc +++ b/webrtc/common_video/texture_video_frame_unittest.cc @@ -8,10 +8,9 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "webrtc/common_video/interface/texture_video_frame.h" - #include "testing/gtest/include/gtest/gtest.h" #include "webrtc/common_video/interface/native_handle.h" +#include "webrtc/common_video/interface/texture_video_frame.h" namespace webrtc { @@ -28,9 +27,6 @@ class NativeHandleImpl : public NativeHandle { int32_t ref_count_; }; -bool EqualTextureFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2); - TEST(TestTextureVideoFrame, InitialValues) { NativeHandleImpl handle; TextureVideoFrame frame(&handle, 640, 480, 100, 10); @@ -59,21 +55,4 @@ TEST(TestTextureVideoFrame, RefCount) { EXPECT_EQ(0, handle.ref_count()); } -TEST(TestTextureVideoFrame, CloneFrame) { - NativeHandleImpl handle; - TextureVideoFrame frame1(&handle, 640, 480, 100, 200); - scoped_ptr frame2(frame1.CloneFrame()); - EXPECT_TRUE(frame2.get() != NULL); - EXPECT_TRUE(EqualTextureFrames(frame1, *frame2)); -} - -bool EqualTextureFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2) { - return ((frame1.native_handle() == frame2.native_handle()) && - (frame1.width() == frame2.width()) && - (frame1.height() == frame2.height()) && - (frame1.timestamp() == frame2.timestamp()) && - (frame1.render_time_ms() == frame2.render_time_ms())); -} - } // namespace webrtc diff --git a/webrtc/modules/utility/interface/mock/mock_process_thread.h b/webrtc/modules/utility/interface/mock/mock_process_thread.h deleted file mode 100644 index fc0c1fb1c..000000000 --- a/webrtc/modules/utility/interface/mock/mock_process_thread.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef WEBRTC_MODULES_UTILITY_INTERFACE_MOCK_PROCESS_THREAD_H_ -#define WEBRTC_MODULES_UTILITY_INTERFACE_MOCK_PROCESS_THREAD_H_ - -#include "webrtc/modules/utility/interface/process_thread.h" - -#include "testing/gmock/include/gmock/gmock.h" - -namespace webrtc { - -class MockProcessThread : public ProcessThread { - public: - MOCK_METHOD0(Start, int32_t()); - MOCK_METHOD0(Stop, int32_t()); - MOCK_METHOD1(RegisterModule, int32_t(Module* module)); - MOCK_METHOD1(DeRegisterModule, int32_t(const Module* module)); -}; - -} // namespace webrtc -#endif // WEBRTC_MODULES_UTILITY_INTERFACE_MOCK_PROCESS_THREAD_H_ diff --git a/webrtc/modules/utility/source/video_frames_queue.cc b/webrtc/modules/utility/source/video_frames_queue.cc index 9ade8b51a..63afbe9b7 100644 --- a/webrtc/modules/utility/source/video_frames_queue.cc +++ b/webrtc/modules/utility/source/video_frames_queue.cc @@ -38,7 +38,12 @@ VideoFramesQueue::~VideoFramesQueue() { int32_t VideoFramesQueue::AddFrame(const I420VideoFrame& newFrame) { if (newFrame.native_handle() != NULL) { - _incomingFrames.push_back(newFrame.CloneFrame()); + _incomingFrames.push_back(new TextureVideoFrame( + static_cast(newFrame.native_handle()), + newFrame.width(), + newFrame.height(), + newFrame.timestamp(), + newFrame.render_time_ms())); return 0; } diff --git a/webrtc/modules/video_capture/include/mock/mock_video_capture.h b/webrtc/modules/video_capture/include/mock/mock_video_capture.h deleted file mode 100644 index 8ad74a238..000000000 --- a/webrtc/modules/video_capture/include/mock/mock_video_capture.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ -#ifndef WEBRTC_MODULES_VIDEO_CAPTURE_INCLUDE_MOCK_MOCK_VIDEO_CAPTURE_H_ -#define WEBRTC_MODULES_VIDEO_CAPTURE_INCLUDE_MOCK_MOCK_VIDEO_CAPTURE_H_ - -#include "webrtc/modules/video_capture/include/video_capture.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace webrtc { - -class MockVideoCaptureModule : public VideoCaptureModule { - public: - // from Module - MOCK_METHOD0(TimeUntilNextProcess, int32_t()); - MOCK_METHOD0(Process, int32_t()); - - // from RefCountedModule - MOCK_METHOD0(AddRef, int32_t()); - MOCK_METHOD0(Release, int32_t()); - - // from VideoCaptureModule - MOCK_METHOD1(RegisterCaptureDataCallback, - void(VideoCaptureDataCallback& dataCallback)); - MOCK_METHOD0(DeRegisterCaptureDataCallback, void()); - MOCK_METHOD1(RegisterCaptureCallback, void(VideoCaptureFeedBack& callBack)); - MOCK_METHOD0(DeRegisterCaptureCallback, void()); - MOCK_METHOD1(StartCapture, int32_t(const VideoCaptureCapability& capability)); - MOCK_METHOD0(StopCapture, int32_t()); - MOCK_CONST_METHOD0(CurrentDeviceName, const char*()); - MOCK_METHOD0(CaptureStarted, bool()); - MOCK_METHOD1(CaptureSettings, int32_t(VideoCaptureCapability& settings)); - MOCK_METHOD1(SetCaptureDelay, void(int32_t delayMS)); - MOCK_METHOD0(CaptureDelay, int32_t()); - MOCK_METHOD1(SetCaptureRotation, int32_t(VideoCaptureRotation rotation)); - MOCK_METHOD1(GetEncodeInterface, - VideoCaptureEncodeInterface*(const VideoCodec& codec)); - MOCK_METHOD1(EnableFrameRateCallback, void(const bool enable)); - MOCK_METHOD1(EnableNoPictureAlarm, void(const bool enable)); -}; - -} // namespace webrtc - -#endif // WEBRTC_MODULES_VIDEO_CAPTURE_INCLUDE_MOCK_MOCK_VIDEO_CAPTURE_H_ diff --git a/webrtc/modules/video_capture/video_capture.gypi b/webrtc/modules/video_capture/video_capture.gypi index b13b27b37..6df062a81 100644 --- a/webrtc/modules/video_capture/video_capture.gypi +++ b/webrtc/modules/video_capture/video_capture.gypi @@ -60,7 +60,6 @@ 'link_settings': { 'xcode_settings': { 'OTHER_LDFLAGS': [ - '-framework CoreVideo', '-framework QTKit', ], }, diff --git a/webrtc/modules/video_render/video_render_frames.cc b/webrtc/modules/video_render/video_render_frames.cc index d790877e3..7025d62a7 100644 --- a/webrtc/modules/video_render/video_render_frames.cc +++ b/webrtc/modules/video_render/video_render_frames.cc @@ -55,7 +55,12 @@ int32_t VideoRenderFrames::AddFrame(I420VideoFrame* new_frame) { } if (new_frame->native_handle() != NULL) { - incoming_frames_.push_back(new_frame->CloneFrame()); + incoming_frames_.push_back(new TextureVideoFrame( + static_cast(new_frame->native_handle()), + new_frame->width(), + new_frame->height(), + new_frame->timestamp(), + new_frame->render_time_ms())); return static_cast(incoming_frames_.size()); } diff --git a/webrtc/video_engine/encoder_state_feedback_unittest.cc b/webrtc/video_engine/encoder_state_feedback_unittest.cc index 4e15752fd..f85d98979 100644 --- a/webrtc/video_engine/encoder_state_feedback_unittest.cc +++ b/webrtc/video_engine/encoder_state_feedback_unittest.cc @@ -17,17 +17,26 @@ #include "webrtc/common.h" #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" -#include "webrtc/modules/utility/interface/mock/mock_process_thread.h" +#include "webrtc/modules/utility/interface/process_thread.h" #include "webrtc/system_wrappers/interface/scoped_ptr.h" #include "webrtc/video_engine/vie_encoder.h" -using ::testing::NiceMock; - namespace webrtc { +// TODO(mflodman) Create a common mock in module utility. +class TestProcessThread : public ProcessThread { + public: + TestProcessThread() {} + ~TestProcessThread() {} + virtual int32_t Start() { return 0; } + virtual int32_t Stop() { return 0; } + virtual int32_t RegisterModule(Module* module) { return 0; } + virtual int32_t DeRegisterModule(const Module* module) { return 0; } +}; + class MockVieEncoder : public ViEEncoder { public: - explicit MockVieEncoder(ProcessThread* process_thread) + explicit MockVieEncoder(TestProcessThread* process_thread) : ViEEncoder(1, 1, 1, config_, *process_thread, NULL) {} ~MockVieEncoder() {} @@ -46,10 +55,10 @@ class MockVieEncoder : public ViEEncoder { class VieKeyRequestTest : public ::testing::Test { protected: virtual void SetUp() { - process_thread_.reset(new NiceMock); + process_thread_.reset(new TestProcessThread()); encoder_state_feedback_.reset(new EncoderStateFeedback()); } - scoped_ptr process_thread_; + scoped_ptr process_thread_; scoped_ptr encoder_state_feedback_; }; diff --git a/webrtc/video_engine/mock/mock_vie_frame_provider_base.h b/webrtc/video_engine/mock/mock_vie_frame_provider_base.h deleted file mode 100644 index d4e17f4d2..000000000 --- a/webrtc/video_engine/mock/mock_vie_frame_provider_base.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ -#ifndef WEBRTC_VIDEO_ENGINE_MOCK_MOCK_VIE_FRAME_PROVIDER_BASE_H_ -#define WEBRTC_VIDEO_ENGINE_MOCK_MOCK_VIE_FRAME_PROVIDER_BASE_H_ - -#include "webrtc/video_engine/vie_frame_provider_base.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace webrtc { - -class MockViEFrameCallback : public ViEFrameCallback { - public: - MOCK_METHOD4(DeliverFrame, - void(int id, - I420VideoFrame* video_frame, - int num_csrcs, - const uint32_t CSRC[kRtpCsrcSize])); - MOCK_METHOD2(DelayChanged, void(int id, int frame_delay)); - MOCK_METHOD3(GetPreferedFrameSettings, - int(int* width, int* height, int* frame_rate)); - MOCK_METHOD1(ProviderDestroyed, void(int id)); -}; - -} // namespace webrtc - -#endif // WEBRTC_VIDEO_ENGINE_MOCK_MOCK_VIE_FRAME_PROVIDER_BASE_H_ diff --git a/webrtc/video_engine/video_engine_core.gypi b/webrtc/video_engine/video_engine_core.gypi index dfb48b4e9..57cdecd8f 100644 --- a/webrtc/video_engine/video_engine_core.gypi +++ b/webrtc/video_engine/video_engine_core.gypi @@ -131,7 +131,6 @@ 'encoder_state_feedback_unittest.cc', 'overuse_frame_detector_unittest.cc', 'stream_synchronization_unittest.cc', - 'vie_capturer_unittest.cc', 'vie_codec_unittest.cc', 'vie_remb_unittest.cc', ], diff --git a/webrtc/video_engine/vie_capturer.cc b/webrtc/video_engine/vie_capturer.cc index 30d663357..867de9b14 100644 --- a/webrtc/video_engine/vie_capturer.cc +++ b/webrtc/video_engine/vie_capturer.cc @@ -10,7 +10,6 @@ #include "webrtc/video_engine/vie_capturer.h" -#include "webrtc/common_video/interface/texture_video_frame.h" #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" #include "webrtc/modules/interface/module_common_types.h" #include "webrtc/modules/utility/interface/process_thread.h" @@ -347,16 +346,11 @@ void ViECapturer::OnIncomingCapturedFrame(const int32_t capture_id, TRACE_EVENT_ASYNC_BEGIN1("webrtc", "Video", video_frame.render_time_ms(), "render_time", video_frame.render_time_ms()); - if (video_frame.native_handle() != NULL) { - captured_frame_.reset(video_frame.CloneFrame()); - } else { - if (captured_frame_ == NULL || captured_frame_->native_handle() != NULL) - captured_frame_.reset(new I420VideoFrame()); - captured_frame_->SwapFrame(&video_frame); - } + captured_frame_.SwapFrame(&video_frame); capture_event_.Set(); - overuse_detector_->FrameCaptured(captured_frame_->width(), - captured_frame_->height()); + overuse_detector_->FrameCaptured(captured_frame_.width(), + captured_frame_.height()); + return; } void ViECapturer::OnCaptureDelayChanged(const int32_t id, @@ -479,9 +473,7 @@ bool ViECapturer::ViECaptureProcess() { deliver_cs_->Enter(); if (SwapCapturedAndDeliverFrameIfAvailable()) { encode_start_time = Clock::GetRealTimeClock()->TimeInMilliseconds(); - DeliverI420Frame(deliver_frame_.get()); - if (deliver_frame_->native_handle() != NULL) - deliver_frame_.reset(); // Release the texture so it can be reused. + DeliverI420Frame(&deliver_frame_); } deliver_cs_->Leave(); if (current_brightness_level_ != reported_brightness_level_) { @@ -502,11 +494,6 @@ bool ViECapturer::ViECaptureProcess() { } void ViECapturer::DeliverI420Frame(I420VideoFrame* video_frame) { - if (video_frame->native_handle() != NULL) { - ViEFrameProviderBase::DeliverFrame(video_frame); - return; - } - // Apply image enhancement and effect filter. if (deflicker_frame_stats_) { if (image_proc_module_->GetFrameStats(deflicker_frame_stats_, @@ -621,21 +608,11 @@ void ViECapturer::OnNoPictureAlarm(const int32_t id, bool ViECapturer::SwapCapturedAndDeliverFrameIfAvailable() { CriticalSectionScoped cs(capture_cs_.get()); - if (captured_frame_ == NULL) + if (captured_frame_.IsZeroSize()) return false; - if (captured_frame_->native_handle() != NULL) { - deliver_frame_.reset(captured_frame_.release()); - return true; - } - - if (captured_frame_->IsZeroSize()) - return false; - - if (deliver_frame_ == NULL) - deliver_frame_.reset(new I420VideoFrame()); - deliver_frame_->SwapFrame(captured_frame_.get()); - captured_frame_->ResetSize(); + deliver_frame_.SwapFrame(&captured_frame_); + captured_frame_.ResetSize(); return true; } diff --git a/webrtc/video_engine/vie_capturer.h b/webrtc/video_engine/vie_capturer.h index 8e893577b..9ac5f8312 100644 --- a/webrtc/video_engine/vie_capturer.h +++ b/webrtc/video_engine/vie_capturer.h @@ -169,8 +169,8 @@ class ViECapturer EventWrapper& capture_event_; EventWrapper& deliver_event_; - scoped_ptr captured_frame_; - scoped_ptr deliver_frame_; + I420VideoFrame captured_frame_; + I420VideoFrame deliver_frame_; // Image processing. ViEEffectFilter* effect_filter_; diff --git a/webrtc/video_engine/vie_capturer_unittest.cc b/webrtc/video_engine/vie_capturer_unittest.cc deleted file mode 100644 index edaf13b54..000000000 --- a/webrtc/video_engine/vie_capturer_unittest.cc +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -// This file includes unit tests for ViECapturer. - -#include "webrtc/video_engine/vie_capturer.h" - -#include - -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "webrtc/common.h" -#include "webrtc/common_video/interface/native_handle.h" -#include "webrtc/common_video/interface/texture_video_frame.h" -#include "webrtc/modules/utility/interface/mock/mock_process_thread.h" -#include "webrtc/modules/video_capture/include/mock/mock_video_capture.h" -#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" -#include "webrtc/system_wrappers/interface/event_wrapper.h" -#include "webrtc/system_wrappers/interface/ref_count.h" -#include "webrtc/system_wrappers/interface/scoped_ptr.h" -#include "webrtc/system_wrappers/interface/scoped_vector.h" -#include "webrtc/video_engine/mock/mock_vie_frame_provider_base.h" - -using ::testing::_; -using ::testing::Invoke; -using ::testing::NiceMock; -using ::testing::Return; -using ::testing::WithArg; - -// If an output frame does not arrive in 500ms, the test will fail. -#define FRAME_TIMEOUT_MS 500 - -namespace webrtc { - -bool EqualFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2); -bool EqualTextureFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2); -bool EqualBufferFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2); -bool EqualFramesVector(const ScopedVector& frames1, - const ScopedVector& frames2); -I420VideoFrame* CreateI420VideoFrame(uint8_t length); - -class FakeNativeHandle : public NativeHandle { - public: - FakeNativeHandle() {} - virtual ~FakeNativeHandle() {} - virtual void* GetHandle() { return NULL; } -}; - -class ViECapturerTest : public ::testing::Test { - protected: - ViECapturerTest() - : mock_capture_module_(new NiceMock()), - mock_process_thread_(new NiceMock), - mock_frame_callback_(new NiceMock), - data_callback_(NULL), - output_frame_event_(EventWrapper::Create()) { - } - - virtual void SetUp() { - EXPECT_CALL(*mock_capture_module_, RegisterCaptureDataCallback(_)) - .WillRepeatedly(Invoke(this, &ViECapturerTest::SetCaptureDataCallback)); - EXPECT_CALL(*mock_frame_callback_, DeliverFrame(_, _, _, _)) - .WillRepeatedly( - WithArg<1>(Invoke(this, &ViECapturerTest::AddOutputFrame))); - - Config config; - vie_capturer_.reset( - ViECapturer::CreateViECapture( - 0, 0, config, mock_capture_module_.get(), *mock_process_thread_)); - vie_capturer_->RegisterFrameCallback(0, mock_frame_callback_.get()); - } - - virtual void TearDown() { - // ViECapturer accesses |mock_process_thread_| in destructor and should - // be deleted first. - vie_capturer_.reset(); - } - - void SetCaptureDataCallback(VideoCaptureDataCallback& data_callback) { - data_callback_ = &data_callback; - } - - void AddInputFrame(I420VideoFrame* frame) { - data_callback_->OnIncomingCapturedFrame(0, *frame); - } - - void AddOutputFrame(I420VideoFrame* frame) { - if (frame->native_handle() == NULL) - output_frame_ybuffers_.push_back(frame->buffer(kYPlane)); - // Clone the frames because ViECapturer owns the frames. - output_frames_.push_back(frame->CloneFrame()); - output_frame_event_->Set(); - } - - void WaitOutputFrame() { - EXPECT_EQ(kEventSignaled, output_frame_event_->Wait(FRAME_TIMEOUT_MS)); - } - - scoped_ptr mock_capture_module_; - scoped_ptr mock_process_thread_; - scoped_ptr mock_frame_callback_; - - // Used to send input capture frames to ViECapturer. - VideoCaptureDataCallback* data_callback_; - - scoped_ptr vie_capturer_; - - // Input capture frames of ViECapturer. - ScopedVector input_frames_; - - // Indicate an output frame has arrived. - scoped_ptr output_frame_event_; - - // Output delivered frames of ViECaptuer. - ScopedVector output_frames_; - - // The pointers of Y plane buffers of output frames. This is used to verify - // the frame are swapped and not copied. - std::vector output_frame_ybuffers_; -}; - -TEST_F(ViECapturerTest, TestTextureFrames) { - const int kNumFrame = 3; - for (int i = 0 ; i < kNumFrame; ++i) { - webrtc::RefCountImpl* handle = - new webrtc::RefCountImpl(); - input_frames_.push_back(new TextureVideoFrame(handle, i, i, i, i)); - AddInputFrame(input_frames_[i]); - WaitOutputFrame(); - } - - EXPECT_TRUE(EqualFramesVector(input_frames_, output_frames_)); -} - -TEST_F(ViECapturerTest, TestI420Frames) { - const int kNumFrame = 4; - ScopedVector copied_input_frames; - std::vector ybuffer_pointers; - for (int i = 0; i < kNumFrame; ++i) { - input_frames_.push_back(CreateI420VideoFrame(static_cast(i + 1))); - ybuffer_pointers.push_back(input_frames_[i]->buffer(kYPlane)); - // Copy input frames because the buffer data will be swapped. - copied_input_frames.push_back(input_frames_[i]->CloneFrame()); - AddInputFrame(input_frames_[i]); - WaitOutputFrame(); - } - - EXPECT_TRUE(EqualFramesVector(copied_input_frames, output_frames_)); - // Make sure the buffer is swapped and not copied. - for (int i = 0; i < kNumFrame; ++i) - EXPECT_EQ(ybuffer_pointers[i], output_frame_ybuffers_[i]); - // The pipeline should be filled with frames with allocated buffers. Check - // the last input frame has the same allocated size after swapping. - EXPECT_EQ(input_frames_.back()->allocated_size(kYPlane), - copied_input_frames.back()->allocated_size(kYPlane)); -} - -TEST_F(ViECapturerTest, TestI420FrameAfterTextureFrame) { - webrtc::RefCountImpl* handle = - new webrtc::RefCountImpl(); - input_frames_.push_back(new TextureVideoFrame(handle, 1, 1, 1, 1)); - AddInputFrame(input_frames_[0]); - WaitOutputFrame(); - - input_frames_.push_back(CreateI420VideoFrame(1)); - scoped_ptr copied_input_frame(input_frames_[1]->CloneFrame()); - AddInputFrame(copied_input_frame.get()); - WaitOutputFrame(); - - EXPECT_TRUE(EqualFramesVector(input_frames_, output_frames_)); -} - -TEST_F(ViECapturerTest, TestTextureFrameAfterI420Frame) { - input_frames_.push_back(CreateI420VideoFrame(1)); - scoped_ptr copied_input_frame(input_frames_[0]->CloneFrame()); - AddInputFrame(copied_input_frame.get()); - WaitOutputFrame(); - - webrtc::RefCountImpl* handle = - new webrtc::RefCountImpl(); - input_frames_.push_back(new TextureVideoFrame(handle, 1, 1, 1, 1)); - AddInputFrame(input_frames_[1]); - WaitOutputFrame(); - - EXPECT_TRUE(EqualFramesVector(input_frames_, output_frames_)); -} - -bool EqualFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2) { - if (frame1.native_handle() != NULL || frame2.native_handle() != NULL) - return EqualTextureFrames(frame1, frame2); - return EqualBufferFrames(frame1, frame2); -} - -bool EqualTextureFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2) { - return ((frame1.native_handle() == frame2.native_handle()) && - (frame1.width() == frame2.width()) && - (frame1.height() == frame2.height()) && - (frame1.timestamp() == frame2.timestamp()) && - (frame1.render_time_ms() == frame2.render_time_ms())); -} - -bool EqualBufferFrames(const I420VideoFrame& frame1, - const I420VideoFrame& frame2) { - return ((frame1.width() == frame2.width()) && - (frame1.height() == frame2.height()) && - (frame1.stride(kYPlane) == frame2.stride(kYPlane)) && - (frame1.stride(kUPlane) == frame2.stride(kUPlane)) && - (frame1.stride(kVPlane) == frame2.stride(kVPlane)) && - (frame1.timestamp() == frame2.timestamp()) && - (frame1.ntp_time_ms() == frame2.ntp_time_ms()) && - (frame1.render_time_ms() == frame2.render_time_ms()) && - (frame1.allocated_size(kYPlane) == frame2.allocated_size(kYPlane)) && - (frame1.allocated_size(kUPlane) == frame2.allocated_size(kUPlane)) && - (frame1.allocated_size(kVPlane) == frame2.allocated_size(kVPlane)) && - (memcmp(frame1.buffer(kYPlane), frame2.buffer(kYPlane), - frame1.allocated_size(kYPlane)) == 0) && - (memcmp(frame1.buffer(kUPlane), frame2.buffer(kUPlane), - frame1.allocated_size(kUPlane)) == 0) && - (memcmp(frame1.buffer(kVPlane), frame2.buffer(kVPlane), - frame1.allocated_size(kVPlane)) == 0)); -} - -bool EqualFramesVector(const ScopedVector& frames1, - const ScopedVector& frames2) { - if (frames1.size() != frames2.size()) - return false; - for (size_t i = 0; i < frames1.size(); ++i) { - if (!EqualFrames(*frames1[i], *frames2[i])) - return false; - } - return true; -} - -I420VideoFrame* CreateI420VideoFrame(uint8_t data) { - I420VideoFrame* frame = new I420VideoFrame(); - const int width = 36; - const int height = 24; - const int kSizeY = width * height * 2; - const int kSizeUV = width * height; - uint8_t buffer[kSizeY]; - memset(buffer, data, kSizeY); - frame->CreateFrame( - kSizeY, buffer, kSizeUV, buffer, kSizeUV, buffer, width, height, width, - width / 2, width / 2); - frame->set_timestamp(data); - frame->set_ntp_time_ms(data); - frame->set_render_time_ms(data); - return frame; -} - -} // namespace webrtc diff --git a/webrtc/video_engine/vie_encoder.cc b/webrtc/video_engine/vie_encoder.cc index 40a61deb6..afb6d0c6e 100644 --- a/webrtc/video_engine/vie_encoder.cc +++ b/webrtc/video_engine/vie_encoder.cc @@ -487,10 +487,6 @@ void ViEEncoder::DeliverFrame(int id, } encoder_paused_and_dropped_frame_ = false; } - if (video_frame->native_handle() != NULL) { - // TODO(wuchengli): add texture support. http://crbug.com/362437 - return; - } // Convert render time, in ms, to RTP timestamp. const int kMsToRtpTimestamp = 90; diff --git a/webrtc/video_engine/vie_remb_unittest.cc b/webrtc/video_engine/vie_remb_unittest.cc index 1f0b70c51..cdfe39c78 100644 --- a/webrtc/video_engine/vie_remb_unittest.cc +++ b/webrtc/video_engine/vie_remb_unittest.cc @@ -18,26 +18,35 @@ #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" -#include "webrtc/modules/utility/interface/mock/mock_process_thread.h" +#include "webrtc/modules/utility/interface/process_thread.h" #include "webrtc/system_wrappers/interface/scoped_ptr.h" #include "webrtc/system_wrappers/interface/tick_util.h" #include "webrtc/video_engine/vie_remb.h" using ::testing::_; using ::testing::AnyNumber; -using ::testing::NiceMock; using ::testing::Return; namespace webrtc { +class TestProcessThread : public ProcessThread { + public: + explicit TestProcessThread() {} + ~TestProcessThread() {} + virtual int32_t Start() { return 0; } + virtual int32_t Stop() { return 0; } + virtual int32_t RegisterModule(Module* module) { return 0; } + virtual int32_t DeRegisterModule(const Module* module) { return 0; } +}; + class ViERembTest : public ::testing::Test { protected: virtual void SetUp() { TickTime::UseFakeClock(12345); - process_thread_.reset(new NiceMock); + process_thread_.reset(new TestProcessThread); vie_remb_.reset(new VieRemb()); } - scoped_ptr process_thread_; + scoped_ptr process_thread_; scoped_ptr vie_remb_; };