Reland of Delete VideoFrameFactory, CapturedFrame, and related code. (patchset #1 id:1 of https://codereview.webrtc.org/2357113002/ )

Reason for revert:
Downstream code is being fixed.

Original issue's description:
> Revert of Delete VideoFrameFactory, CapturedFrame, and related code. (patchset #9 id:160001 of https://codereview.webrtc.org/2262443003/ )
>
> Reason for revert:
> Breaks downstream testcode, still using CapturedFrame.
>
> Original issue's description:
> > Delete VideoFrameFactory, CapturedFrame, and related code.
> >
> > BUG=webrtc:5682
> >
> > Committed: https://crrev.com/66ac50e58c790624d51ede10ae438cbadbca9d2e
> > Cr-Commit-Position: refs/heads/master@{#14315}
>
> TBR=pthatcher@webrtc.org,perkj@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:5682
>
> Committed: https://crrev.com/66492210e57ee8efce2ad4d45a8781df1fcaa5e3
> Cr-Commit-Position: refs/heads/master@{#14320}

TBR=pthatcher@webrtc.org,perkj@webrtc.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=webrtc:5682

Review-Url: https://codereview.webrtc.org/2370993003
Cr-Commit-Position: refs/heads/master@{#14453}
diff --git a/webrtc/media/BUILD.gn b/webrtc/media/BUILD.gn
index 33e5421..963c49d 100644
--- a/webrtc/media/BUILD.gn
+++ b/webrtc/media/BUILD.gn
@@ -85,8 +85,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",
@@ -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",
@@ -320,7 +316,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 2ad4ed8..cc4b33e 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 d13a6dc..c478c0a 100644
--- a/webrtc/media/engine/webrtcvideoframe.cc
+++ b/webrtc/media/engine/webrtcvideoframe.cc
@@ -62,14 +62,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 dd28b38..24cfcc8 100644
--- a/webrtc/media/media.gyp
+++ b/webrtc/media/media.gyp
@@ -64,8 +64,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',
@@ -88,8 +86,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',