Delete VideoFrameFactory, CapturedFrame, and related code. BUG=webrtc:5682 Review-Url: https://codereview.webrtc.org/2262443003 Cr-Commit-Position: refs/heads/master@{#14315}
diff --git a/webrtc/media/BUILD.gn b/webrtc/media/BUILD.gn index 6179f67..14a3e2f 100644 --- a/webrtc/media/BUILD.gn +++ b/webrtc/media/BUILD.gn
@@ -84,8 +84,6 @@ "base/videocommon.h", "base/videoframe.cc", "base/videoframe.h", - "base/videoframefactory.cc", - "base/videoframefactory.h", "base/videorenderer.h", "base/videosourcebase.cc", "base/videosourcebase.h", @@ -108,8 +106,6 @@ "engine/webrtcvideoengine2.h", "engine/webrtcvideoframe.cc", "engine/webrtcvideoframe.h", - "engine/webrtcvideoframefactory.cc", - "engine/webrtcvideoframefactory.h", "engine/webrtcvoe.h", "engine/webrtcvoiceengine.cc", "engine/webrtcvoiceengine.h", @@ -323,7 +319,6 @@ "engine/webrtcvideocapturer_unittest.cc", "engine/webrtcvideoengine2_unittest.cc", "engine/webrtcvideoframe_unittest.cc", - "engine/webrtcvideoframefactory_unittest.cc", "engine/webrtcvoiceengine_unittest.cc", "sctp/sctpdataengine_unittest.cc", ]
diff --git a/webrtc/media/base/fakevideocapturer.h b/webrtc/media/base/fakevideocapturer.h index 8ba56f1..0f2d8ed 100644 --- a/webrtc/media/base/fakevideocapturer.h +++ b/webrtc/media/base/fakevideocapturer.h
@@ -20,9 +20,6 @@ #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 { @@ -35,9 +32,6 @@ 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, @@ -81,46 +75,37 @@ if (!running_) { return false; } - // 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. - } + RTC_CHECK(fourcc == FOURCC_I420); + RTC_CHECK(width > 0); + RTC_CHECK(height > 0); - cricket::CapturedFrame frame; - frame.width = width; - frame.height = height; - frame.fourcc = fourcc; - frame.data_size = size; - frame.time_stamp = initial_timestamp_ + next_timestamp_; + 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); + } 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; cricket::CaptureState Start(const cricket::VideoFormat& format) override {
diff --git a/webrtc/media/base/videoadapter_unittest.cc b/webrtc/media/base/videoadapter_unittest.cc index e805679..444ef54 100644 --- a/webrtc/media/base/videoadapter_unittest.cc +++ b/webrtc/media/base/videoadapter_unittest.cc
@@ -31,18 +31,18 @@ capture_format_.interval = VideoFormat::FpsToInterval(30); listener_.reset(new VideoCapturerListener(&adapter_)); - capturer_->SignalFrameCaptured.connect( - listener_.get(), &VideoCapturerListener::OnFrameCaptured); + capturer_->AddOrUpdateSink(listener_.get(), rtc::VideoSinkWants()); } virtual void TearDown() { // Explicitly disconnect the VideoCapturer before to avoid data races // (frames delivered to VideoCapturerListener while it's being destructed). - capturer_->SignalFrameCaptured.disconnect_all(); + capturer_->RemoveSink(listener_.get()); } protected: - class VideoCapturerListener: public sigslot::has_slots<> { + class VideoCapturerListener + : public rtc::VideoSinkInterface<cricket::VideoFrame> { public: struct Stats { int captured_frames; @@ -62,19 +62,18 @@ last_adapt_was_no_op_(false) { } - void OnFrameCaptured(VideoCapturer* capturer, - const CapturedFrame* captured_frame) { + void OnFrame(const cricket::VideoFrame& frame) { rtc::CritScope lock(&crit_); - const int in_width = captured_frame->width; - const int in_height = abs(captured_frame->height); + const int in_width = frame.width(); + const int in_height = frame.height(); int cropped_width; int cropped_height; int out_width; int out_height; - if (video_adapter_->AdaptFrameResolution(in_width, in_height, - captured_frame->time_stamp, - &cropped_width, &cropped_height, - &out_width, &out_height)) { + if (video_adapter_->AdaptFrameResolution( + in_width, in_height, + frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec, + &cropped_width, &cropped_height, &out_width, &out_height)) { cropped_width_ = cropped_width; cropped_height_ = cropped_height; out_width_ = out_width; @@ -183,7 +182,7 @@ capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 2); - EXPECT_EQ(0, listener_->GetStats().dropped_frames); + EXPECT_EQ(1, listener_->GetStats().dropped_frames); capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 3); @@ -191,7 +190,7 @@ capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 4); - EXPECT_EQ(1, listener_->GetStats().dropped_frames); + EXPECT_EQ(2, listener_->GetStats().dropped_frames); capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 5); @@ -199,7 +198,7 @@ capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 6); - EXPECT_EQ(2, listener_->GetStats().dropped_frames); + EXPECT_EQ(3, listener_->GetStats().dropped_frames); capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 7); @@ -207,7 +206,7 @@ capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 8); - EXPECT_EQ(3, listener_->GetStats().dropped_frames); + EXPECT_EQ(4, listener_->GetStats().dropped_frames); capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 9); @@ -215,7 +214,7 @@ capturer_->CaptureFrame(); EXPECT_GE(listener_->GetStats().captured_frames, 10); - EXPECT_EQ(4, listener_->GetStats().dropped_frames); + EXPECT_EQ(5, listener_->GetStats().dropped_frames); } // Adapt the frame rate to be two thirds of the capture rate at the beginning.
diff --git a/webrtc/media/base/videocapturer.cc b/webrtc/media/base/videocapturer.cc index c340760..1d81d49 100644 --- a/webrtc/media/base/videocapturer.cc +++ b/webrtc/media/base/videocapturer.cc
@@ -18,9 +18,7 @@ #include "webrtc/base/common.h" #include "webrtc/base/logging.h" #include "webrtc/base/systeminfo.h" -#include "webrtc/media/base/videoframefactory.h" #include "webrtc/media/engine/webrtcvideoframe.h" -#include "webrtc/media/engine/webrtcvideoframefactory.h" namespace cricket { @@ -34,29 +32,6 @@ } // namespace ///////////////////////////////////////////////////////////////////// -// Implementation of struct CapturedFrame -///////////////////////////////////////////////////////////////////// -CapturedFrame::CapturedFrame() - : width(0), - height(0), - fourcc(0), - pixel_width(0), - pixel_height(0), - time_stamp(0), - data_size(0), - rotation(webrtc::kVideoRotation_0), - data(NULL) {} - -// TODO(fbarchard): Remove this function once lmimediaengine stops using it. -bool CapturedFrame::GetDataSize(uint32_t* size) const { - if (!size || data_size == CapturedFrame::kUnknownDataSize) { - return false; - } - *size = data_size; - return true; -} - -///////////////////////////////////////////////////////////////////// // Implementation of class VideoCapturer ///////////////////////////////////////////////////////////////////// VideoCapturer::VideoCapturer() : apply_rotation_(false) { @@ -67,16 +42,9 @@ void VideoCapturer::Construct() { enable_camera_list_ = false; capture_state_ = CS_STOPPED; - SignalFrameCaptured.connect(this, &VideoCapturer::OnFrameCaptured); scaled_width_ = 0; scaled_height_ = 0; enable_video_adapter_ = true; - // There are lots of video capturers out there that don't call - // set_frame_factory. We can either go change all of them, or we - // can set this default. - // TODO(pthatcher): Remove this hack and require the frame factory - // to be passed in the constructor. - set_frame_factory(new WebRtcVideoFrameFactory()); } const std::vector<VideoFormat>* VideoCapturer::GetSupportedFormats() const { @@ -152,29 +120,6 @@ UpdateFilteredSupportedFormats(); } -std::string VideoCapturer::ToString(const CapturedFrame* captured_frame) const { - std::string fourcc_name = GetFourccName(captured_frame->fourcc) + " "; - for (std::string::const_iterator i = fourcc_name.begin(); - i < fourcc_name.end(); ++i) { - // Test character is printable; Avoid isprint() which asserts on negatives. - if (*i < 32 || *i >= 127) { - fourcc_name = ""; - break; - } - } - - std::ostringstream ss; - ss << fourcc_name << captured_frame->width << "x" << captured_frame->height; - return ss.str(); -} - -void VideoCapturer::set_frame_factory(VideoFrameFactory* frame_factory) { - frame_factory_.reset(frame_factory); - if (frame_factory) { - frame_factory->SetApplyRotation(apply_rotation_); - } -} - bool VideoCapturer::GetInputSize(int* width, int* height) { rtc::CritScope cs(&frame_stats_crit_); if (!input_size_valid_) { @@ -204,9 +149,6 @@ void VideoCapturer::OnSinkWantsChanged(const rtc::VideoSinkWants& wants) { RTC_DCHECK(thread_checker_.CalledOnValidThread()); apply_rotation_ = wants.rotation_applied; - if (frame_factory_) { - frame_factory_->SetApplyRotation(apply_rotation_); - } if (video_adapter()) { video_adapter()->OnResolutionRequest(wants.max_pixel_count, @@ -254,54 +196,31 @@ return true; } -void VideoCapturer::OnFrameCaptured(VideoCapturer*, - const CapturedFrame* captured_frame) { - int out_width; - int out_height; - int crop_width; - int crop_height; - int crop_x; - int crop_y; - - // TODO(nisse): We don't do timestamp translation on this input - // path. It seems straight-forward to enable translation, but that - // breaks the WebRtcVideoEngine2Test.PropagatesInputFrameTimestamp - // test. Probably not worth the effort to fix, instead, try to - // delete or refactor all code using VideoFrameFactory and - // SignalCapturedFrame. - if (!AdaptFrame(captured_frame->width, captured_frame->height, - captured_frame->time_stamp / rtc::kNumNanosecsPerMicrosec, - 0, - &out_width, &out_height, - &crop_width, &crop_height, &crop_x, &crop_y, nullptr)) { - return; - } - - if (!frame_factory_) { - LOG(LS_ERROR) << "No video frame factory."; - return; - } - - // TODO(nisse): Reorganize frame factory methods. crop_x and crop_y - // are ignored for now. - std::unique_ptr<VideoFrame> adapted_frame(frame_factory_->CreateAliasedFrame( - captured_frame, crop_width, crop_height, out_width, out_height)); - - if (!adapted_frame) { - // TODO(fbarchard): LOG more information about captured frame attributes. - LOG(LS_ERROR) << "Couldn't convert to I420! " - << "From " << ToString(captured_frame) << " To " - << out_width << " x " << out_height; - return; - } - - OnFrame(*adapted_frame, captured_frame->width, captured_frame->height); -} - void VideoCapturer::OnFrame(const VideoFrame& frame, int orig_width, int orig_height) { - broadcaster_.OnFrame(frame); + // For a child class which implements rotation itself, we should + // always have apply_rotation_ == false or frame.rotation() == 0. + // Except possibly during races where apply_rotation_ is changed + // mid-stream. + if (apply_rotation_ && frame.rotation() != webrtc::kVideoRotation_0) { + rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer( + frame.video_frame_buffer()); + if (buffer->native_handle()) { + // Sources producing native frames must handle apply_rotation + // themselves. But even if they do, we may occasionally end up + // in this case, for frames in flight at the time + // applied_rotation is set to true. In that case, we just drop + // the frame. + LOG(LS_WARNING) << "Native frame requiring rotation. Discarding."; + return; + } + broadcaster_.OnFrame(WebRtcVideoFrame( + webrtc::I420Buffer::Rotate(buffer, frame.rotation()), + webrtc::kVideoRotation_0, frame.timestamp_us())); + } else { + broadcaster_.OnFrame(frame); + } UpdateInputSize(orig_width, orig_height); }
diff --git a/webrtc/media/base/videocapturer.h b/webrtc/media/base/videocapturer.h index eb868d9..bb25d2a 100644 --- a/webrtc/media/base/videocapturer.h +++ b/webrtc/media/base/videocapturer.h
@@ -28,7 +28,6 @@ #include "webrtc/media/base/videoadapter.h" #include "webrtc/media/base/videobroadcaster.h" #include "webrtc/media/base/videocommon.h" -#include "webrtc/media/base/videoframefactory.h" namespace cricket { @@ -45,38 +44,6 @@ class VideoFrame; -struct CapturedFrame { - static const uint32_t kFrameHeaderSize = 40; // Size from width to data_size. - static const uint32_t kUnknownDataSize = 0xFFFFFFFF; - - CapturedFrame(); - - // Get the number of bytes of the frame data. If data_size is known, return - // it directly. Otherwise, calculate the size based on width, height, and - // fourcc. Return true if succeeded. - bool GetDataSize(uint32_t* size) const; - - // The width and height of the captured frame could be different from those - // of VideoFormat. Once the first frame is captured, the width, height, - // fourcc, pixel_width, and pixel_height should keep the same over frames. - int width; // in number of pixels - int height; // in number of pixels - uint32_t fourcc; // compression - uint32_t pixel_width; // width of a pixel, default is 1 - uint32_t pixel_height; // height of a pixel, default is 1 - int64_t time_stamp; // timestamp of when the frame was captured, in unix - // time with nanosecond units. - uint32_t data_size; // number of bytes of the frame data - - webrtc::VideoRotation rotation; // rotation in degrees of the frame. - - void* data; // pointer to the frame data. This object allocates the - // memory or points to an existing memory. - - private: - RTC_DISALLOW_COPY_AND_ASSIGN(CapturedFrame); -}; - // VideoCapturer is an abstract class that defines the interfaces for video // capturing. The subclasses implement the video capturer for various types of // capturers and various platforms. @@ -204,13 +171,6 @@ // Signal all capture state changes that are not a direct result of calling // Start(). sigslot::signal2<VideoCapturer*, CaptureState> SignalStateChange; - // Frame callbacks are multithreaded to allow disconnect and connect to be - // called concurrently. It also ensures that it is safe to call disconnect - // at any time which is needed since the signal may be called from an - // unmarshalled thread owned by the VideoCapturer. - // Signal the captured frame to downstream. - sigslot::signal2<VideoCapturer*, const CapturedFrame*, - sigslot::multi_threaded_local> SignalFrameCaptured; // If true, run video adaptation. By default, video adaptation is enabled // and users must call video_adapter()->OnOutputFormatRequest() @@ -220,9 +180,6 @@ enable_video_adapter_ = enable_video_adapter; } - // Takes ownership. - void set_frame_factory(VideoFrameFactory* frame_factory); - bool GetInputSize(int* width, int* height); // Implements VideoSourceInterface @@ -263,10 +220,6 @@ int* crop_y, int64_t* translated_camera_time_us); - // Callback attached to SignalFrameCaptured where SignalVideoFrames is called. - void OnFrameCaptured(VideoCapturer* video_capturer, - const CapturedFrame* captured_frame); - // Called when a frame has been captured and converted to a // VideoFrame. OnFrame can be called directly by an implementation // that does not use SignalFrameCaptured or OnFrameCaptured. The @@ -291,7 +244,6 @@ } void SetSupportedFormats(const std::vector<VideoFormat>& formats); - VideoFrameFactory* frame_factory() { return frame_factory_.get(); } private: void Construct(); @@ -301,9 +253,6 @@ int64_t GetFormatDistance(const VideoFormat& desired, const VideoFormat& supported); - // Convert captured frame to readable string for LOG messages. - std::string ToString(const CapturedFrame* frame) const; - // Updates filtered_supported_formats_ so that it contains the formats in // supported_formats_ that fulfill all applied restrictions. void UpdateFilteredSupportedFormats(); @@ -315,7 +264,6 @@ rtc::ThreadChecker thread_checker_; std::string id_; CaptureState capture_state_; - std::unique_ptr<VideoFrameFactory> frame_factory_; std::unique_ptr<VideoFormat> capture_format_; std::vector<VideoFormat> supported_formats_; std::unique_ptr<VideoFormat> max_format_; @@ -335,7 +283,8 @@ int input_width_ GUARDED_BY(frame_stats_crit_); int input_height_ GUARDED_BY(frame_stats_crit_); - // Whether capturer should apply rotation to the frame before signaling it. + // Whether capturer should apply rotation to the frame before + // passing it on to the registered sinks. bool apply_rotation_; // State for the timestamp translation.
diff --git a/webrtc/media/base/videocapturer_unittest.cc b/webrtc/media/base/videocapturer_unittest.cc index 25230b5..821de58 100644 --- a/webrtc/media/base/videocapturer_unittest.cc +++ b/webrtc/media/base/videocapturer_unittest.cc
@@ -91,14 +91,14 @@ std::vector<cricket::VideoFormat> formats; formats.push_back(cricket::VideoFormat(kWidth, kHeight, - cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB)); + cricket::VideoFormat::FpsToInterval(5), + cricket::FOURCC_I420)); capturer_->ResetSupportedFormats(formats); - EXPECT_EQ(cricket::CS_RUNNING, capturer_->Start(cricket::VideoFormat( - kWidth, - kHeight, - cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_ARGB))); + EXPECT_EQ(cricket::CS_RUNNING, + capturer_->Start(cricket::VideoFormat( + kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), + cricket::FOURCC_ANY))); EXPECT_TRUE(capturer_->IsRunning()); EXPECT_EQ(0, renderer_.num_rendered_frames()); EXPECT_TRUE(capturer_->CaptureFrame()); @@ -245,6 +245,10 @@ EXPECT_EQ(webrtc::kVideoRotation_0, renderer2.rotation()); } +// TODO(nisse): This test doesn't quite fit here. It tests two things: +// Aggregation of VideoSinkWants, which is the responsibility of +// VideoBroadcaster, and translation of VideoSinkWants to actual +// resolution, which is the responsibility of the VideoAdapter. TEST_F(VideoCapturerTest, SinkWantsMaxPixelAndMaxPixelCountStepUp) { EXPECT_EQ(cricket::CS_RUNNING, capturer_->Start(cricket::VideoFormat(
diff --git a/webrtc/media/base/videoframefactory.cc b/webrtc/media/base/videoframefactory.cc deleted file mode 100644 index a4eeece..0000000 --- a/webrtc/media/base/videoframefactory.cc +++ /dev/null
@@ -1,51 +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. - */ - -#include "webrtc/media/base/videoframefactory.h" - -#include <algorithm> -#include "webrtc/media/base/videocapturer.h" - -namespace cricket { - -VideoFrame* VideoFrameFactory::CreateAliasedFrame( - const CapturedFrame* input_frame, - int cropped_input_width, - int cropped_input_height, - int output_width, - int output_height) const { - std::unique_ptr<VideoFrame> cropped_input_frame(CreateAliasedFrame( - input_frame, cropped_input_width, cropped_input_height)); - if (!cropped_input_frame) - return nullptr; - - if (cropped_input_width == output_width && - cropped_input_height == output_height) { - // No scaling needed. - return cropped_input_frame.release(); - } - - // If the frame is rotated, we need to switch the width and height. - if (apply_rotation_ && - (input_frame->rotation == webrtc::kVideoRotation_90 || - input_frame->rotation == webrtc::kVideoRotation_270)) { - std::swap(output_width, output_height); - } - - rtc::scoped_refptr<webrtc::I420Buffer> scaled_buffer( - pool_.CreateBuffer(output_width, output_height)); - scaled_buffer->CropAndScaleFrom(cropped_input_frame->video_frame_buffer()); - - return new WebRtcVideoFrame(scaled_buffer, cropped_input_frame->rotation(), - cropped_input_frame->timestamp_us(), - cropped_input_frame->transport_frame_id()); -} - -} // namespace cricket
diff --git a/webrtc/media/base/videoframefactory.h b/webrtc/media/base/videoframefactory.h deleted file mode 100644 index 985199f..0000000 --- a/webrtc/media/base/videoframefactory.h +++ /dev/null
@@ -1,63 +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_MEDIA_BASE_VIDEOFRAMEFACTORY_H_ -#define WEBRTC_MEDIA_BASE_VIDEOFRAMEFACTORY_H_ - -#include <memory> - -#include "webrtc/common_video/include/i420_buffer_pool.h" -#include "webrtc/media/base/videoframe.h" - -namespace cricket { - -struct CapturedFrame; -class VideoFrame; - -// Creates cricket::VideoFrames, or a subclass of cricket::VideoFrame -// depending on the subclass of VideoFrameFactory. -class VideoFrameFactory { - public: - VideoFrameFactory() : apply_rotation_(false) {} - virtual ~VideoFrameFactory() {} - - // The returned frame aliases the aliased_frame if the input color - // space allows for aliasing, otherwise a color conversion will - // occur. Returns NULL if conversion fails. - - // The returned frame will be a center crop of |input_frame| with - // size |cropped_width| x |cropped_height|. - virtual VideoFrame* CreateAliasedFrame(const CapturedFrame* input_frame, - int cropped_width, - int cropped_height) const = 0; - - // The returned frame will be a center crop of |input_frame| with size - // |cropped_width| x |cropped_height|, scaled to |output_width| x - // |output_height|. - virtual VideoFrame* CreateAliasedFrame(const CapturedFrame* input_frame, - int cropped_input_width, - int cropped_input_height, - int output_width, - int output_height) const; - - void SetApplyRotation(bool enable) { apply_rotation_ = enable; } - - protected: - bool apply_rotation_; - - private: - // An internal pool to avoid reallocations. It is mutable because it - // does not affect behaviour, only performance. - mutable webrtc::I420BufferPool pool_; -}; - -} // namespace cricket - -#endif // WEBRTC_MEDIA_BASE_VIDEOFRAMEFACTORY_H_
diff --git a/webrtc/media/engine/webrtcvideocapturer.cc b/webrtc/media/engine/webrtcvideocapturer.cc index ba44b13..2b1b62b 100644 --- a/webrtc/media/engine/webrtcvideocapturer.cc +++ b/webrtc/media/engine/webrtcvideocapturer.cc
@@ -19,7 +19,6 @@ #include "webrtc/base/thread.h" #include "webrtc/base/timeutils.h" #include "webrtc/media/engine/webrtcvideoframe.h" -#include "webrtc/media/engine/webrtcvideoframefactory.h" #include "webrtc/base/win32.h" // Need this to #include the impl files. #include "webrtc/modules/video_capture/video_capture_factory.h" @@ -113,18 +112,14 @@ module_(nullptr), captured_frames_(0), start_thread_(nullptr), - async_invoker_(nullptr) { - set_frame_factory(new WebRtcVideoFrameFactory()); -} + async_invoker_(nullptr) {} WebRtcVideoCapturer::WebRtcVideoCapturer(WebRtcVcmFactoryInterface* factory) : factory_(factory), module_(nullptr), captured_frames_(0), start_thread_(nullptr), - async_invoker_(nullptr) { - set_frame_factory(new WebRtcVideoFrameFactory()); -} + async_invoker_(nullptr) {} WebRtcVideoCapturer::~WebRtcVideoCapturer() {}
diff --git a/webrtc/media/engine/webrtcvideoengine2.h b/webrtc/media/engine/webrtcvideoengine2.h index b8d17e8..e568c1e 100644 --- a/webrtc/media/engine/webrtcvideoengine2.h +++ b/webrtc/media/engine/webrtcvideoengine2.h
@@ -60,7 +60,6 @@ class WebRtcVoiceEngine; class WebRtcVoiceMediaChannel; -struct CapturedFrame; struct Device; // Exposed here for unittests.
diff --git a/webrtc/media/engine/webrtcvideoframe.cc b/webrtc/media/engine/webrtcvideoframe.cc index f35a45a..dfe012b 100644 --- a/webrtc/media/engine/webrtcvideoframe.cc +++ b/webrtc/media/engine/webrtcvideoframe.cc
@@ -66,14 +66,6 @@ true /*apply_rotation*/); } -bool WebRtcVideoFrame::Init(const CapturedFrame* frame, int dw, int dh, - bool apply_rotation) { - return Reset(frame->fourcc, frame->width, frame->height, dw, dh, - static_cast<uint8_t*>(frame->data), frame->data_size, - frame->time_stamp / rtc::kNumNanosecsPerMicrosec, - frame->rotation, apply_rotation); -} - int WebRtcVideoFrame::width() const { return video_frame_buffer_ ? video_frame_buffer_->width() : 0; }
diff --git a/webrtc/media/engine/webrtcvideoframe.h b/webrtc/media/engine/webrtcvideoframe.h index d0034e2..79ad571 100644 --- a/webrtc/media/engine/webrtcvideoframe.h +++ b/webrtc/media/engine/webrtcvideoframe.h
@@ -22,8 +22,6 @@ namespace cricket { -struct CapturedFrame; - // TODO(nisse): This class will be deleted when the cricket::VideoFrame and // webrtc::VideoFrame classes are merged. See // https://bugs.chromium.org/p/webrtc/issues/detail?id=5682. Try to use only the @@ -55,6 +53,10 @@ ~WebRtcVideoFrame(); + // TODO(nisse): Init (and its helpers Reset and Validate) are used + // only by the LoadFrame function used in the VideoFrame unittests. + // Rewrite tests, and delete this function. + // Creates a frame from a raw sample with FourCC "format" and size "w" x "h". // "h" can be negative indicating a vertically flipped image. // "dh" is destination height if cropping is desired and is always positive. @@ -69,15 +71,6 @@ int64_t timestamp_ns, webrtc::VideoRotation rotation); - // TODO(nisse): We're moving to have all timestamps use the same - // time scale as rtc::TimeMicros. However, this method is used by - // WebRtcVideoFrameFactory::CreateAliasedFrame this code path - // currently does not conform to the new timestamp conventions and - // may use the camera's own clock instead. It's unclear if this - // should be fixed, or if instead all of the VideoFrameFactory - // abstraction should be eliminated. - bool Init(const CapturedFrame* frame, int dw, int dh, bool apply_rotation); - void InitToEmptyBuffer(int w, int h); int width() const override;
diff --git a/webrtc/media/engine/webrtcvideoframe_unittest.cc b/webrtc/media/engine/webrtcvideoframe_unittest.cc index 3743e87..2385e44 100644 --- a/webrtc/media/engine/webrtcvideoframe_unittest.cc +++ b/webrtc/media/engine/webrtcvideoframe_unittest.cc
@@ -22,52 +22,6 @@ public: WebRtcVideoFrameTest() {} - void TestInit(int cropped_width, int cropped_height, - webrtc::VideoRotation frame_rotation, - bool apply_rotation) { - const int frame_width = 1920; - const int frame_height = 1080; - - // Build the CapturedFrame. - CapturedFrame captured_frame; - captured_frame.fourcc = FOURCC_I420; - captured_frame.time_stamp = rtc::TimeNanos(); - captured_frame.rotation = frame_rotation; - captured_frame.width = frame_width; - captured_frame.height = frame_height; - captured_frame.data_size = (frame_width * frame_height) + - ((frame_width + 1) / 2) * ((frame_height + 1) / 2) * 2; - std::unique_ptr<uint8_t[]> captured_frame_buffer( - new uint8_t[captured_frame.data_size]); - // Initialize memory to satisfy DrMemory tests. - memset(captured_frame_buffer.get(), 0, captured_frame.data_size); - captured_frame.data = captured_frame_buffer.get(); - - // Create the new frame from the CapturedFrame. - WebRtcVideoFrame frame; - EXPECT_TRUE( - frame.Init(&captured_frame, cropped_width, cropped_height, - apply_rotation)); - - // Verify the new frame. - EXPECT_EQ(captured_frame.time_stamp / rtc::kNumNanosecsPerMicrosec, - frame.timestamp_us()); - if (apply_rotation) - EXPECT_EQ(webrtc::kVideoRotation_0, frame.rotation()); - else - EXPECT_EQ(frame_rotation, frame.rotation()); - // If |apply_rotation| and the frame rotation is 90 or 270, width and - // height are flipped. - if (apply_rotation && (frame_rotation == webrtc::kVideoRotation_90 - || frame_rotation == webrtc::kVideoRotation_270)) { - EXPECT_EQ(cropped_width, frame.height()); - EXPECT_EQ(cropped_height, frame.width()); - } else { - EXPECT_EQ(cropped_width, frame.width()); - EXPECT_EQ(cropped_height, frame.height()); - } - } - void SetFrameRotation(WebRtcVideoFrame* frame, webrtc::VideoRotation rotation) { frame->rotation_ = rotation; @@ -154,32 +108,6 @@ // TEST_WEBRTCVIDEOFRAME(ConvertToI422Buffer) // TEST_WEBRTCVIDEOFRAME(ConstructARGBBlackWhitePixel) -// These functions test implementation-specific details. -// Tests the Init function with different cropped size. -TEST_F(WebRtcVideoFrameTest, InitEvenSize) { - TestInit(640, 360, webrtc::kVideoRotation_0, true); -} - -TEST_F(WebRtcVideoFrameTest, InitOddWidth) { - TestInit(601, 480, webrtc::kVideoRotation_0, true); -} - -TEST_F(WebRtcVideoFrameTest, InitOddHeight) { - TestInit(360, 765, webrtc::kVideoRotation_0, true); -} - -TEST_F(WebRtcVideoFrameTest, InitOddWidthHeight) { - TestInit(355, 1021, webrtc::kVideoRotation_0, true); -} - -TEST_F(WebRtcVideoFrameTest, InitRotated90ApplyRotation) { - TestInit(640, 360, webrtc::kVideoRotation_90, true); -} - -TEST_F(WebRtcVideoFrameTest, InitRotated90DontApplyRotation) { - TestInit(640, 360, webrtc::kVideoRotation_90, false); -} - TEST_F(WebRtcVideoFrameTest, TextureInitialValues) { webrtc::test::FakeNativeHandle* dummy_handle = new webrtc::test::FakeNativeHandle();
diff --git a/webrtc/media/engine/webrtcvideoframefactory.cc b/webrtc/media/engine/webrtcvideoframefactory.cc deleted file mode 100644 index 2c08c63..0000000 --- a/webrtc/media/engine/webrtcvideoframefactory.cc +++ /dev/null
@@ -1,30 +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. - */ - -#include <memory> - -#include "webrtc/base/logging.h" -#include "webrtc/media/engine/webrtcvideoframe.h" -#include "webrtc/media/engine/webrtcvideoframefactory.h" - -namespace cricket { - -VideoFrame* WebRtcVideoFrameFactory::CreateAliasedFrame( - const CapturedFrame* aliased_frame, int width, int height) const { - std::unique_ptr<WebRtcVideoFrame> frame(new WebRtcVideoFrame()); - if (!frame->Init(aliased_frame, width, height, apply_rotation_)) { - LOG(LS_ERROR) << - "Failed to create WebRtcVideoFrame in CreateAliasedFrame."; - return NULL; - } - return frame.release(); -} - -} // namespace cricket
diff --git a/webrtc/media/engine/webrtcvideoframefactory.h b/webrtc/media/engine/webrtcvideoframefactory.h deleted file mode 100644 index 39d813f..0000000 --- a/webrtc/media/engine/webrtcvideoframefactory.h +++ /dev/null
@@ -1,35 +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_MEDIA_ENGINE_WEBRTCVIDEOFRAMEFACTORY_H_ -#define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOFRAMEFACTORY_H_ - -#include "webrtc/media/base/videoframefactory.h" - -namespace cricket { - -struct CapturedFrame; - -// Creates instances of cricket::WebRtcVideoFrame. -class WebRtcVideoFrameFactory : public VideoFrameFactory { - public: - // Note: Overriding a method name overrides all overloaded versions. - // Without this using-declaration, we would hide the 5-argument - // method we want to inherit. - using VideoFrameFactory::CreateAliasedFrame; - - VideoFrame* CreateAliasedFrame(const CapturedFrame* aliased_frame, - int width, - int height) const override; -}; - -} // namespace cricket - -#endif // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOFRAMEFACTORY_H_
diff --git a/webrtc/media/engine/webrtcvideoframefactory_unittest.cc b/webrtc/media/engine/webrtcvideoframefactory_unittest.cc deleted file mode 100644 index 197784b..0000000 --- a/webrtc/media/engine/webrtcvideoframefactory_unittest.cc +++ /dev/null
@@ -1,109 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include <string.h> - -#include <memory> - -#include "webrtc/base/gunit.h" -#include "webrtc/media/base/videocapturer.h" -#include "webrtc/media/engine/webrtcvideoframe.h" -#include "webrtc/media/engine/webrtcvideoframefactory.h" - -class WebRtcVideoFrameFactoryTest : public testing::Test { - public: - WebRtcVideoFrameFactoryTest() {} - - void InitFrame(webrtc::VideoRotation frame_rotation) { - const int frame_width = 1920; - const int frame_height = 1080; - - // Build the CapturedFrame. - captured_frame_.fourcc = cricket::FOURCC_I420; - captured_frame_.pixel_width = 1; - captured_frame_.pixel_height = 1; - captured_frame_.time_stamp = rtc::TimeNanos(); - captured_frame_.rotation = frame_rotation; - captured_frame_.width = frame_width; - captured_frame_.height = frame_height; - captured_frame_.data_size = - (frame_width * frame_height) + - ((frame_width + 1) / 2) * ((frame_height + 1) / 2) * 2; - captured_frame_buffer_.reset(new uint8_t[captured_frame_.data_size]); - // Initialize memory to satisfy DrMemory tests. - memset(captured_frame_buffer_.get(), 0, captured_frame_.data_size); - captured_frame_.data = captured_frame_buffer_.get(); - } - - void VerifyFrame(cricket::VideoFrame* dest_frame, - webrtc::VideoRotation src_rotation, - int src_width, - int src_height, - bool apply_rotation) { - if (!apply_rotation) { - EXPECT_EQ(dest_frame->rotation(), src_rotation); - EXPECT_EQ(dest_frame->width(), src_width); - EXPECT_EQ(dest_frame->height(), src_height); - } else { - EXPECT_EQ(dest_frame->rotation(), webrtc::kVideoRotation_0); - if (src_rotation == webrtc::kVideoRotation_90 || - src_rotation == webrtc::kVideoRotation_270) { - EXPECT_EQ(dest_frame->width(), src_height); - EXPECT_EQ(dest_frame->height(), src_width); - } else { - EXPECT_EQ(dest_frame->width(), src_width); - EXPECT_EQ(dest_frame->height(), src_height); - } - } - } - - void TestCreateAliasedFrame(bool apply_rotation) { - cricket::VideoFrameFactory& factory = factory_; - factory.SetApplyRotation(apply_rotation); - InitFrame(webrtc::kVideoRotation_270); - const cricket::CapturedFrame& captured_frame = get_captured_frame(); - // Create the new frame from the CapturedFrame. - std::unique_ptr<cricket::VideoFrame> frame; - int new_width = captured_frame.width / 2; - int new_height = captured_frame.height / 2; - frame.reset(factory.CreateAliasedFrame(&captured_frame, new_width, - new_height, new_width, new_height)); - VerifyFrame(frame.get(), webrtc::kVideoRotation_270, new_width, new_height, - apply_rotation); - - frame.reset(factory.CreateAliasedFrame( - &captured_frame, new_width, new_height, new_width / 2, new_height / 2)); - VerifyFrame(frame.get(), webrtc::kVideoRotation_270, new_width / 2, - new_height / 2, apply_rotation); - - // Reset the frame first so it's exclusive hence we could go through the - // StretchToFrame code path in CreateAliasedFrame. - frame.reset(); - frame.reset(factory.CreateAliasedFrame( - &captured_frame, new_width, new_height, new_width / 2, new_height / 2)); - VerifyFrame(frame.get(), webrtc::kVideoRotation_270, new_width / 2, - new_height / 2, apply_rotation); - } - - const cricket::CapturedFrame& get_captured_frame() { return captured_frame_; } - - private: - cricket::CapturedFrame captured_frame_; - std::unique_ptr<uint8_t[]> captured_frame_buffer_; - cricket::WebRtcVideoFrameFactory factory_; -}; - -TEST_F(WebRtcVideoFrameFactoryTest, NoApplyRotation) { - TestCreateAliasedFrame(false); -} - -TEST_F(WebRtcVideoFrameFactoryTest, ApplyRotation) { - TestCreateAliasedFrame(true); -}
diff --git a/webrtc/media/media.gyp b/webrtc/media/media.gyp index 9a9fbbb..9528441 100644 --- a/webrtc/media/media.gyp +++ b/webrtc/media/media.gyp
@@ -63,8 +63,6 @@ 'base/videocommon.h', 'base/videoframe.cc', 'base/videoframe.h', - 'base/videoframefactory.cc', - 'base/videoframefactory.h', 'base/videosourcebase.cc', 'base/videosourcebase.h', 'devices/videorendererfactory.h', @@ -87,8 +85,6 @@ 'engine/webrtcvideoengine2.h', 'engine/webrtcvideoframe.cc', 'engine/webrtcvideoframe.h', - 'engine/webrtcvideoframefactory.cc', - 'engine/webrtcvideoframefactory.h', 'engine/webrtcvoe.h', 'engine/webrtcvoiceengine.cc', 'engine/webrtcvoiceengine.h',