CVO capturer feature: allow unrotated frame flows through the capture pipeline.

split from https://webrtc-codereview.appspot.com/37029004/

This is based on clean up code change at https://webrtc-codereview.appspot.com/37129004

BUG=4145
R=perkj@webrtc.org, pthatcher@webrtc.org, stefan@webrtc.org, tommi@webrtc.org

Committed: https://code.google.com/p/webrtc/source/detail?r=8337

Review URL: https://webrtc-codereview.appspot.com/39799004

Cr-Commit-Position: refs/heads/master@{#8338}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8338 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/media/base/fakevideocapturer.h b/talk/media/base/fakevideocapturer.h
index c9dce2c..e8d49c0 100644
--- a/talk/media/base/fakevideocapturer.h
+++ b/talk/media/base/fakevideocapturer.h
@@ -49,8 +49,7 @@
       : running_(false),
         initial_unix_timestamp_(time(NULL) * rtc::kNumNanosecsPerSec),
         next_timestamp_(rtc::kNumNanosecsPerMillisec),
-        is_screencast_(false),
-        rotation_(webrtc::kVideoRotation_0) {
+        is_screencast_(false) {
 #ifdef HAVE_WEBRTC_VIDEO
     set_frame_factory(new cricket::WebRtcVideoFrameFactory());
 #endif
@@ -116,7 +115,6 @@
     memset(reinterpret_cast<uint8*>(frame.data) + (size / 2), 2,
          size - (size / 2));
     memcpy(frame.data, reinterpret_cast<const uint8*>(&fourcc), 4);
-    frame.rotation = rotation_;
     // TODO(zhurunz): SignalFrameCaptured carry returned value to be able to
     // capture results from downstream.
     SignalFrameCaptured(this, &frame);
@@ -150,18 +148,11 @@
     return true;
   }
 
-  void SetRotation(webrtc::VideoRotation rotation) {
-    rotation_ = rotation;
-  }
-
-  webrtc::VideoRotation GetRotation() { return rotation_; }
-
  private:
   bool running_;
   int64 initial_unix_timestamp_;
   int64 next_timestamp_;
   bool is_screencast_;
-  webrtc::VideoRotation rotation_;
 };
 
 }  // namespace cricket
diff --git a/talk/media/base/videocapturer.cc b/talk/media/base/videocapturer.cc
index abef449..d47c8f2 100644
--- a/talk/media/base/videocapturer.cc
+++ b/talk/media/base/videocapturer.cc
@@ -110,8 +110,7 @@
     : thread_(rtc::Thread::Current()),
       adapt_frame_drops_data_(kMaxAccumulatorSize),
       effect_frame_drops_data_(kMaxAccumulatorSize),
-      frame_time_data_(kMaxAccumulatorSize),
-      apply_rotation_(true) {
+      frame_time_data_(kMaxAccumulatorSize) {
   Construct();
 }
 
@@ -119,8 +118,7 @@
     : thread_(thread),
       adapt_frame_drops_data_(kMaxAccumulatorSize),
       effect_frame_drops_data_(kMaxAccumulatorSize),
-      frame_time_data_(kMaxAccumulatorSize),
-      apply_rotation_(true) {
+      frame_time_data_(kMaxAccumulatorSize) {
   Construct();
 }
 
@@ -256,14 +254,6 @@
   return Pause(false);
 }
 
-bool VideoCapturer::SetApplyRotation(bool enable) {
-  apply_rotation_ = enable;
-  if (frame_factory_) {
-    frame_factory_->SetApplyRotation(apply_rotation_);
-  }
-  return true;
-}
-
 void VideoCapturer::SetSupportedFormats(
     const std::vector<VideoFormat>& formats) {
   supported_formats_ = formats;
@@ -350,13 +340,6 @@
   return ss.str();
 }
 
-void VideoCapturer::set_frame_factory(VideoFrameFactory* frame_factory) {
-  frame_factory_.reset(frame_factory);
-  if (frame_factory) {
-    frame_factory->SetApplyRotation(apply_rotation_);
-  }
-}
-
 void VideoCapturer::GetStats(VariableInfo<int>* adapt_drops_stats,
                              VariableInfo<int>* effect_drops_stats,
                              VariableInfo<double>* frame_time_stats,
diff --git a/talk/media/base/videocapturer.h b/talk/media/base/videocapturer.h
index 9e43aaa..55a8923 100644
--- a/talk/media/base/videocapturer.h
+++ b/talk/media/base/videocapturer.h
@@ -225,13 +225,6 @@
     return capture_state_;
   }
 
-  // Tells videocapturer whether to apply the pending rotation. By default, the
-  // rotation is applied and the generated frame is up right. When set to false,
-  // generated frames will carry the rotation information from
-  // SetCaptureRotation. Return value indicates whether this operation succeeds.
-  virtual bool SetApplyRotation(bool enable);
-  virtual bool GetApplyRotation() { return apply_rotation_; }
-
   // Adds a video processor that will be applied on VideoFrames returned by
   // |SignalVideoFrame|. Multiple video processors can be added. The video
   // processors will be applied in the order they were added.
@@ -308,7 +301,9 @@
   }
 
   // Takes ownership.
-  void set_frame_factory(VideoFrameFactory* frame_factory);
+  void set_frame_factory(VideoFrameFactory* frame_factory) {
+    frame_factory_.reset(frame_factory);
+  }
 
   // Gets statistics for tracked variables recorded since the last call to
   // GetStats.  Note that calling GetStats resets any gathered data so it
@@ -417,9 +412,6 @@
   rtc::CriticalSection crit_;
   VideoProcessors video_processors_;
 
-  // Whether capturer should apply rotation to the frame before signaling it.
-  bool apply_rotation_;
-
   DISALLOW_COPY_AND_ASSIGN(VideoCapturer);
 };
 
diff --git a/talk/media/base/videocapturer_unittest.cc b/talk/media/base/videocapturer_unittest.cc
index 4f6739e..1760d8a 100644
--- a/talk/media/base/videocapturer_unittest.cc
+++ b/talk/media/base/videocapturer_unittest.cc
@@ -83,26 +83,16 @@
       : capture_state_(cricket::CS_STOPPED),
         num_state_changes_(0),
         video_frames_received_(0),
-        last_frame_elapsed_time_(0),
-        expects_rotation_applied_(true) {
+        last_frame_elapsed_time_(0) {
     capturer_.SignalVideoFrame.connect(this, &VideoCapturerTest::OnVideoFrame);
     capturer_.SignalStateChange.connect(this,
                                         &VideoCapturerTest::OnStateChange);
   }
 
-  void set_expected_compensation(bool compensation) {
-    expects_rotation_applied_ = compensation;
-  }
-
  protected:
   void OnVideoFrame(cricket::VideoCapturer*, const cricket::VideoFrame* frame) {
     ++video_frames_received_;
     last_frame_elapsed_time_ = frame->GetElapsedTime();
-    if (expects_rotation_applied_) {
-      EXPECT_EQ(webrtc::kVideoRotation_0, frame->GetRotation());
-    } else {
-      EXPECT_EQ(capturer_.GetRotation(), frame->GetRotation());
-    }
     renderer_.RenderFrame(frame);
   }
   void OnStateChange(cricket::VideoCapturer*,
@@ -123,7 +113,6 @@
   int video_frames_received_;
   int64 last_frame_elapsed_time_;
   cricket::FakeVideoRenderer renderer_;
-  bool expects_rotation_applied_;
 };
 
 TEST_F(VideoCapturerTest, CaptureState) {
@@ -287,107 +276,6 @@
   EXPECT_EQ(1, renderer_.num_rendered_frames());
 }
 
-TEST_F(VideoCapturerTest, TestRotationPending) {
-  int kWidth = 800;
-  int kHeight = 400;
-  int frame_count = 0;
-
-  std::vector<cricket::VideoFormat> formats;
-  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
-                                         cricket::VideoFormat::FpsToInterval(5),
-                                         cricket::FOURCC_I420));
-
-  capturer_.ResetSupportedFormats(formats);
-  // capturer_ should compensate rotation as default.
-  capturer_.UpdateAspectRatio(400, 200);
-
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer_.Start(cricket::VideoFormat(
-                kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30),
-                cricket::FOURCC_I420)));
-  EXPECT_TRUE(capturer_.IsRunning());
-  EXPECT_EQ(0, renderer_.num_rendered_frames());
-
-  // If the frame's rotation is compensated anywhere in the pipeline based on
-  // the rotation information, the renderer should be given the right dimension
-  // such that the frame could be rendered.
-
-  // Swap the dimension for the next 2 frames which are rotated by 90 and 270
-  // degree.
-  int expected_width = kHeight;
-  int expected_height = kWidth;
-  NormalizeVideoSize(&expected_width, &expected_height);
-  renderer_.SetSize(expected_width, expected_height, 0);
-
-  capturer_.SetRotation(webrtc::kVideoRotation_90);
-  EXPECT_TRUE(capturer_.CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-
-  capturer_.SetRotation(webrtc::kVideoRotation_270);
-  EXPECT_TRUE(capturer_.CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-
-  // Reset the renderer to have corresponding width and height.
-  expected_width = kWidth;
-  expected_height = kHeight;
-  NormalizeVideoSize(&expected_width, &expected_height);
-  renderer_.SetSize(expected_width, expected_height, 0);
-
-  capturer_.SetRotation(webrtc::kVideoRotation_180);
-  EXPECT_TRUE(capturer_.CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-}
-
-TEST_F(VideoCapturerTest, TestRotationApplied) {
-  int kWidth = 800;
-  int kHeight = 400;
-
-  std::vector<cricket::VideoFormat> formats;
-  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
-                                         cricket::VideoFormat::FpsToInterval(5),
-                                         cricket::FOURCC_I420));
-
-  capturer_.ResetSupportedFormats(formats);
-  // capturer_ should not compensate rotation.
-  capturer_.SetApplyRotation(false);
-  capturer_.UpdateAspectRatio(400, 200);
-  set_expected_compensation(false);
-
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer_.Start(cricket::VideoFormat(
-                kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30),
-                cricket::FOURCC_I420)));
-  EXPECT_TRUE(capturer_.IsRunning());
-  EXPECT_EQ(0, renderer_.num_rendered_frames());
-
-  int expected_width = kWidth;
-  int expected_height = kHeight;
-  NormalizeVideoSize(&expected_width, &expected_height);
-  renderer_.SetSize(expected_width, expected_height, 0);
-
-  // If the frame's rotation is compensated anywhere in the pipeline, the frame
-  // won't have its original dimension out from capturer. Since the renderer
-  // here has the same dimension as the capturer, it will skip that frame as the
-  // resolution won't match anymore.
-
-  int frame_count = 0;
-  capturer_.SetRotation(webrtc::kVideoRotation_0);
-  EXPECT_TRUE(capturer_.CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-
-  capturer_.SetRotation(webrtc::kVideoRotation_90);
-  EXPECT_TRUE(capturer_.CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-
-  capturer_.SetRotation(webrtc::kVideoRotation_180);
-  EXPECT_TRUE(capturer_.CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-
-  capturer_.SetRotation(webrtc::kVideoRotation_270);
-  EXPECT_TRUE(capturer_.CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-}
-
 TEST_F(VideoCapturerTest, ScreencastScaledSuperLarge) {
   capturer_.SetScreencast(true);
 
diff --git a/talk/media/base/videoframe.h b/talk/media/base/videoframe.h
index 7c5ce5b..3496840 100644
--- a/talk/media/base/videoframe.h
+++ b/talk/media/base/videoframe.h
@@ -118,13 +118,11 @@
 
   // Indicates the rotation angle in degrees.
   // TODO(guoweis): Remove this function, rename GetVideoRotation and remove the
-  // skeleton implementation of GetRotation once chrome is updated.
+  // skeleton implementation to GetRotation once chrome is updated.
   virtual int GetRotation() const { return GetVideoRotation(); }
   virtual webrtc::VideoRotation GetVideoRotation() const {
     return webrtc::kVideoRotation_0;
   }
-  // TODO(guoweis): Remove the skeleton implementation once chrome is updated.
-  virtual void SetRotation(webrtc::VideoRotation rotation) {}
 
   // Make a shallow copy of the frame. The frame buffer itself is not copied.
   // Both the current and new VideoFrame will share a single reference-counted
diff --git a/talk/media/base/videoframefactory.h b/talk/media/base/videoframefactory.h
index b0dbf16..45e0831 100644
--- a/talk/media/base/videoframefactory.h
+++ b/talk/media/base/videoframefactory.h
@@ -40,7 +40,7 @@
 // depending on the subclass of VideoFrameFactory.
 class VideoFrameFactory {
  public:
-  VideoFrameFactory() : apply_rotation_(true) {}
+  VideoFrameFactory() {}
   virtual ~VideoFrameFactory() {}
 
   // The returned frame aliases the aliased_frame if the input color
@@ -65,11 +65,6 @@
                                          int output_width,
                                          int output_height) const;
 
-  void SetApplyRotation(bool enable) { apply_rotation_ = enable; }
-
- protected:
-  bool apply_rotation_;
-
  private:
   // An internal frame buffer to avoid reallocations. It is mutable because it
   // does not affect behaviour, only performance.
diff --git a/talk/media/webrtc/fakewebrtcvideocapturemodule.h b/talk/media/webrtc/fakewebrtcvideocapturemodule.h
index 55a5157..7085a3d 100644
--- a/talk/media/webrtc/fakewebrtcvideocapturemodule.h
+++ b/talk/media/webrtc/fakewebrtcvideocapturemodule.h
@@ -100,12 +100,6 @@
       webrtc::VideoCaptureRotation rotation) OVERRIDE {
     return -1;  // not implemented
   }
-  virtual bool SetApplyRotation(bool enable) OVERRIDE {
-    return false;  // not implemented
-  }
-  virtual bool GetApplyRotation() OVERRIDE {
-    return true;  // Rotation compensation is turned on.
-  }
   virtual VideoCaptureEncodeInterface* GetEncodeInterface(
       const webrtc::VideoCodec& codec) OVERRIDE {
     return NULL;  // not implemented
diff --git a/talk/media/webrtc/webrtcvideocapturer.cc b/talk/media/webrtc/webrtcvideocapturer.cc
index 259f53a..c86abcc 100644
--- a/talk/media/webrtc/webrtcvideocapturer.cc
+++ b/talk/media/webrtc/webrtcvideocapturer.cc
@@ -213,10 +213,6 @@
   module_->AddRef();
   SetId(device.id);
   SetSupportedFormats(supported);
-
-  // Ensure these 2 have the same value.
-  SetApplyRotation(module_->GetApplyRotation());
-
   return true;
 }
 
@@ -253,16 +249,6 @@
   }
   return true;
 }
-bool WebRtcVideoCapturer::SetApplyRotation(bool enable) {
-  rtc::CritScope cs(&critical_section_stopping_);
-
-  assert(module_);
-
-  if (!VideoCapturer::SetApplyRotation(enable)) {
-    return false;
-  }
-  return module_->SetApplyRotation(enable);
-}
 
 CaptureState WebRtcVideoCapturer::Start(const VideoFormat& capture_format) {
   if (!module_) {
@@ -395,7 +381,6 @@
   time_stamp = elapsed_time;
   data_size = rtc::checked_cast<uint32>(length);
   data = buffer;
-  rotation = sample.rotation();
 }
 
 }  // namespace cricket
diff --git a/talk/media/webrtc/webrtcvideocapturer.h b/talk/media/webrtc/webrtcvideocapturer.h
index e7d870b..631aa17 100644
--- a/talk/media/webrtc/webrtcvideocapturer.h
+++ b/talk/media/webrtc/webrtcvideocapturer.h
@@ -72,7 +72,6 @@
   virtual void Stop();
   virtual bool IsRunning();
   virtual bool IsScreencast() const { return false; }
-  virtual bool SetApplyRotation(bool enable);
 
  protected:
   // Override virtual methods of the parent class VideoCapturer.
diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc
index 7fbb8de..56ee28c 100644
--- a/talk/media/webrtc/webrtcvideoengine.cc
+++ b/talk/media/webrtc/webrtcvideoengine.cc
@@ -394,24 +394,6 @@
     if (!renderer_) {
       return 0;
     }
-    if (!webrtc_frame->native_handle()) {
-      WebRtcVideoRenderFrame cricket_frame(webrtc_frame, elapsed_time_ms);
-      return renderer_->RenderFrame(&cricket_frame) ? 0 : -1;
-    } else {
-      return DeliverTextureFrame(
-          webrtc_frame->native_handle(),
-          webrtc_frame->render_time_ms() * rtc::kNumNanosecsPerMillisec,
-          elapsed_time_ms * rtc::kNumNanosecsPerMillisec);
-    }
-  }
-
-  virtual bool IsTextureSupported() { return true; }
-
-  int DeliverBufferFrame(unsigned char* buffer, size_t buffer_size,
-                         int64 time_stamp, int64 elapsed_time) {
-    WebRtcVideoFrame video_frame;
-    video_frame.Alias(buffer, buffer_size, width_, height_, 1, 1, elapsed_time,
-                      time_stamp, webrtc::kVideoRotation_0);
 
     WebRtcVideoRenderFrame cricket_frame(&webrtc_frame, elapsed_time_ms);
     return renderer_->RenderFrame(&cricket_frame) ? 0 : -1;
diff --git a/talk/media/webrtc/webrtcvideoframe.cc b/talk/media/webrtc/webrtcvideoframe.cc
index 6a49d9b..e99930c 100644
--- a/talk/media/webrtc/webrtcvideoframe.cc
+++ b/talk/media/webrtc/webrtcvideoframe.cc
@@ -139,13 +139,9 @@
                frame->time_stamp, frame->GetRotation());
 }
 
-bool WebRtcVideoFrame::Alias(const CapturedFrame* frame,
-                             int dw,
-                             int dh,
-                             bool apply_rotation) {
+bool WebRtcVideoFrame::Alias(const CapturedFrame* frame, int dw, int dh) {
   if (CanonicalFourCC(frame->fourcc) != FOURCC_I420 ||
-      (apply_rotation &&
-       frame->GetRotation() != webrtc::kVideoRotation_0) ||
+      (frame->GetRotation() != webrtc::kVideoRotation_0) ||
       frame->width != dw || frame->height != dh) {
     // TODO(fbarchard): Enable aliasing of more formats.
     return Init(frame, dw, dh);
diff --git a/talk/media/webrtc/webrtcvideoframe.h b/talk/media/webrtc/webrtcvideoframe.h
index 4e89897..2493026 100644
--- a/talk/media/webrtc/webrtcvideoframe.h
+++ b/talk/media/webrtc/webrtcvideoframe.h
@@ -72,10 +72,7 @@
 
   // Aliases this WebRtcVideoFrame to a CapturedFrame. |frame| must outlive
   // this WebRtcVideoFrame.
-  bool Alias(const CapturedFrame* frame,
-             int dw,
-             int dh,
-             bool apply_rotation);
+  bool Alias(const CapturedFrame* frame, int dw, int dh);
 
   bool InitToBlack(int w, int h, size_t pixel_width, size_t pixel_height,
                    int64_t elapsed_time, int64_t time_stamp);
@@ -132,9 +129,6 @@
   virtual void SetTimeStamp(int64_t time_stamp) { time_stamp_ = time_stamp; }
 
   virtual webrtc::VideoRotation GetVideoRotation() const { return rotation_; }
-  virtual void SetRotation(webrtc::VideoRotation rotation) {
-    rotation_ = rotation;
-  }
 
   virtual VideoFrame* Copy() const;
   virtual bool MakeExclusive();
diff --git a/talk/media/webrtc/webrtcvideoframefactory.cc b/talk/media/webrtc/webrtcvideoframefactory.cc
index 2ac5adc..07b6663 100755
--- a/talk/media/webrtc/webrtcvideoframefactory.cc
+++ b/talk/media/webrtc/webrtcvideoframefactory.cc
@@ -36,7 +36,7 @@
   // TODO(pthatcher): Move Alias logic into the VideoFrameFactory and
   // out of the VideoFrame.
   rtc::scoped_ptr<WebRtcVideoFrame> frame(new WebRtcVideoFrame());
-  if (!frame->Alias(aliased_frame, width, height, apply_rotation_)) {
+  if (!frame->Alias(aliased_frame, width, height)) {
     LOG(LS_ERROR) <<
         "Failed to create WebRtcVideoFrame in CreateAliasedFrame.";
     return NULL;
diff --git a/webrtc/common_video/i420_video_frame.cc b/webrtc/common_video/i420_video_frame.cc
index 8dbbe3a..fdc2bbc 100644
--- a/webrtc/common_video/i420_video_frame.cc
+++ b/webrtc/common_video/i420_video_frame.cc
@@ -21,9 +21,7 @@
       height_(0),
       timestamp_(0),
       ntp_time_ms_(0),
-      render_time_ms_(0),
-      rotation_(kVideoRotation_0) {
-}
+      render_time_ms_(0) {}
 
 I420VideoFrame::~I420VideoFrame() {}
 
@@ -44,7 +42,6 @@
   timestamp_ = 0;
   ntp_time_ms_ = 0;
   render_time_ms_ = 0;
-  rotation_ = kVideoRotation_0;
   return 0;
 }
 
@@ -53,23 +50,6 @@
                                 int size_v, const uint8_t* buffer_v,
                                 int width, int height,
                                 int stride_y, int stride_u, int stride_v) {
-  return CreateFrame(size_y, buffer_y, size_u, buffer_u, size_v, buffer_v,
-                     width, height, stride_y, stride_u, stride_v,
-                     kVideoRotation_0);
-}
-
-int I420VideoFrame::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,
-                                int width,
-                                int height,
-                                int stride_y,
-                                int stride_u,
-                                int stride_v,
-                                VideoRotation rotation) {
   if (size_y < 1 || size_u < 1 || size_v < 1)
     return -1;
   if (CheckDimensions(width, height, stride_y, stride_u, stride_v) < 0)
@@ -79,7 +59,6 @@
   v_plane_.Copy(size_v, stride_v, buffer_v);
   width_ = width;
   height_ = height;
-  rotation_ = rotation;
   return 0;
 }
 
@@ -98,7 +77,6 @@
   timestamp_ = videoFrame.timestamp_;
   ntp_time_ms_ = videoFrame.ntp_time_ms_;
   render_time_ms_ = videoFrame.render_time_ms_;
-  rotation_ = videoFrame.rotation_;
   return 0;
 }
 
@@ -120,7 +98,6 @@
   std::swap(timestamp_, videoFrame->timestamp_);
   std::swap(ntp_time_ms_, videoFrame->ntp_time_ms_);
   std::swap(render_time_ms_, videoFrame->render_time_ms_);
-  std::swap(rotation_, videoFrame->rotation_);
 }
 
 uint8_t* I420VideoFrame::buffer(PlaneType type) {
diff --git a/webrtc/common_video/i420_video_frame_unittest.cc b/webrtc/common_video/i420_video_frame_unittest.cc
index 6c3cb9c..ca01fd0 100644
--- a/webrtc/common_video/i420_video_frame_unittest.cc
+++ b/webrtc/common_video/i420_video_frame_unittest.cc
@@ -29,7 +29,6 @@
   I420VideoFrame frame;
   // Invalid arguments - one call for each variable.
   EXPECT_TRUE(frame.IsZeroSize());
-  EXPECT_EQ(kVideoRotation_0, frame.rotation());
   EXPECT_EQ(-1, frame.CreateEmptyFrame(0, 10, 10, 14, 14));
   EXPECT_EQ(-1, frame.CreateEmptyFrame(10, -1, 10, 90, 14));
   EXPECT_EQ(-1, frame.CreateEmptyFrame(10, 10, 0, 14, 18));
@@ -101,23 +100,22 @@
   const int kSizeY = 225;
   const int kSizeU = 80;
   const int kSizeV = 80;
-  const VideoRotation kRotation = VideoFrameRotation_270;
   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);
-  frame2.CreateFrame(kSizeY, buffer_y, kSizeU, buffer_u, kSizeV, buffer_v,
-                     width + 5, height + 5, stride_y + 5, stride_u, stride_v,
-                     kRotation);
+  frame2.CreateFrame(kSizeY, buffer_y,
+                     kSizeU, buffer_u,
+                     kSizeV, buffer_v,
+                     width + 5, height + 5, stride_y + 5, stride_u, stride_v);
   // Frame of smaller dimensions - allocated sizes should not vary.
   EXPECT_EQ(0, frame1.CopyFrame(frame2));
   EXPECT_TRUE(EqualFramesExceptSize(frame1, frame2));
   EXPECT_EQ(kSizeY, frame1.allocated_size(kYPlane));
   EXPECT_EQ(kSizeU, frame1.allocated_size(kUPlane));
   EXPECT_EQ(kSizeV, frame1.allocated_size(kVPlane));
-  EXPECT_EQ(kRotation, frame1.rotation());
   // Verify copy of all parameters.
   // Frame of larger dimensions - update allocated sizes.
   EXPECT_EQ(0, frame2.CopyFrame(frame1));
diff --git a/webrtc/common_video/interface/texture_video_frame.h b/webrtc/common_video/interface/texture_video_frame.h
index 9a1fee0..2c625ab 100644
--- a/webrtc/common_video/interface/texture_video_frame.h
+++ b/webrtc/common_video/interface/texture_video_frame.h
@@ -48,18 +48,6 @@
                           int stride_y,
                           int stride_u,
                           int stride_v) OVERRIDE;
-  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,
-                          int width,
-                          int height,
-                          int stride_y,
-                          int stride_u,
-                          int stride_v,
-                          webrtc::VideoRotation rotation) OVERRIDE;
   virtual int CopyFrame(const I420VideoFrame& videoFrame) OVERRIDE;
   virtual I420VideoFrame* CloneFrame() const OVERRIDE;
   virtual void SwapFrame(I420VideoFrame* videoFrame) OVERRIDE;
diff --git a/webrtc/common_video/rotation.h b/webrtc/common_video/rotation.h
index 46a9ecc..61825d8 100644
--- a/webrtc/common_video/rotation.h
+++ b/webrtc/common_video/rotation.h
@@ -11,6 +11,8 @@
 #ifndef WEBRTC_COMMON_VIDEO_ROTATION_H_
 #define WEBRTC_COMMON_VIDEO_ROTATION_H_
 
+#include "webrtc/base/common.h"
+
 namespace webrtc {
 
 // enum for clockwise rotation.
diff --git a/webrtc/common_video/texture_video_frame.cc b/webrtc/common_video/texture_video_frame.cc
index ce6a040..f301d19 100644
--- a/webrtc/common_video/texture_video_frame.cc
+++ b/webrtc/common_video/texture_video_frame.cc
@@ -52,22 +52,6 @@
   return -1;
 }
 
-int TextureVideoFrame::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,
-                                   int width,
-                                   int height,
-                                   int stride_y,
-                                   int stride_u,
-                                   int stride_v,
-                                   webrtc::VideoRotation rotation) {
-  assert(false);  // Should not be called.
-  return -1;
-}
-
 int TextureVideoFrame::CopyFrame(const I420VideoFrame& videoFrame) {
   assert(false);  // Should not be called.
   return -1;
diff --git a/webrtc/modules/video_capture/include/mock/mock_video_capture.h b/webrtc/modules/video_capture/include/mock/mock_video_capture.h
index 9013820..7938b01 100644
--- a/webrtc/modules/video_capture/include/mock/mock_video_capture.h
+++ b/webrtc/modules/video_capture/include/mock/mock_video_capture.h
@@ -39,8 +39,6 @@
   MOCK_METHOD1(SetCaptureDelay, void(int32_t delayMS));
   MOCK_METHOD0(CaptureDelay, int32_t());
   MOCK_METHOD1(SetCaptureRotation, int32_t(VideoCaptureRotation rotation));
-  MOCK_METHOD1(SetApplyRotation, bool(bool));
-  MOCK_METHOD0(GetApplyRotation, bool());
   MOCK_METHOD1(GetEncodeInterface,
                VideoCaptureEncodeInterface*(const VideoCodec& codec));
   MOCK_METHOD1(EnableFrameRateCallback, void(const bool enable));
diff --git a/webrtc/modules/video_capture/include/video_capture.h b/webrtc/modules/video_capture/include/video_capture.h
index 4f94317..50539ea 100644
--- a/webrtc/modules/video_capture/include/video_capture.h
+++ b/webrtc/modules/video_capture/include/video_capture.h
@@ -135,15 +135,6 @@
   // displayed correctly if rendered.
   virtual int32_t SetCaptureRotation(VideoCaptureRotation rotation) = 0;
 
-  // Tells the capture module whether to apply the pending rotation. By default,
-  // the rotation is applied and the generated frame is up right. When set to
-  // false, generated frames will carry the rotation information from
-  // SetCaptureRotation. Return value indicates whether this operation succeeds.
-  virtual bool SetApplyRotation(bool enable) = 0;
-
-  // Return whether the rotation is applied or left pending.
-  virtual bool GetApplyRotation() = 0;
-
   // Gets a pointer to an encode interface if the capture device supports the
   // requested type and size.  NULL otherwise.
   virtual VideoCaptureEncodeInterface* GetEncodeInterface(
diff --git a/webrtc/modules/video_capture/video_capture_impl.cc b/webrtc/modules/video_capture/video_capture_impl.cc
index ec88ecd..d7a6642 100644
--- a/webrtc/modules/video_capture/video_capture_impl.cc
+++ b/webrtc/modules/video_capture/video_capture_impl.cc
@@ -24,23 +24,6 @@
 
 namespace webrtc
 {
-
-// Converting the rotation mode from capturemodule's to I420VideoFrame's define.
-VideoRotation ConvertRotation(VideoRotationMode rotation) {
-  switch (rotation) {
-    case kRotateNone:
-      return kVideoRotation_0;
-    case kRotate90:
-      return kVideoRotation_90;
-    case kRotate180:
-      return kVideoRotation_180;
-    case kRotate270:
-      return kVideoRotation_270;
-  }
-  assert(false);
-  return kVideoRotation_0;
-}
-
 namespace videocapturemodule
 {
 VideoCaptureModule* VideoCaptureImpl::Create(
@@ -176,8 +159,7 @@
       last_capture_time_(0),
       delta_ntp_internal_ms_(
           Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() -
-          TickTime::MillisecondTimestamp()),
-      apply_rotation_(true) {
+          TickTime::MillisecondTimestamp()) {
     _requestedCapability.width = kDefaultWidth;
     _requestedCapability.height = kDefaultHeight;
     _requestedCapability.maxFPS = 30;
@@ -296,15 +278,11 @@
         int stride_uv = (width + 1) / 2;
         int target_width = width;
         int target_height = height;
-
-        if (apply_rotation_) {
-          // Rotating resolution when for 90/270 degree rotations.
-          if (_rotateFrame == kRotate90 || _rotateFrame == kRotate270) {
-            target_width = abs(height);
-            target_height = width;
-          }
+        // Rotating resolution when for 90/270 degree rotations.
+        if (_rotateFrame == kRotate90 || _rotateFrame == kRotate270)  {
+          target_width = abs(height);
+          target_height = width;
         }
-
         // TODO(mikhal): Update correct aligned stride values.
         //Calc16ByteAlignedStride(target_width, &stride_y, &stride_uv);
         // Setting absolute height (in case it was negative).
@@ -320,24 +298,19 @@
                              "happen due to bad parameters.";
             return -1;
         }
-        const int conversionResult = ConvertToI420(
-            commonVideoType, videoFrame, 0, 0,  // No cropping
-            width, height, videoFrameLength,
-            apply_rotation_ ? _rotateFrame : kRotateNone,
-            &_captureFrame);
+        const int conversionResult = ConvertToI420(commonVideoType,
+                                                   videoFrame,
+                                                   0, 0,  // No cropping
+                                                   width, height,
+                                                   videoFrameLength,
+                                                   _rotateFrame,
+                                                   &_captureFrame);
         if (conversionResult < 0)
         {
           LOG(LS_ERROR) << "Failed to convert capture frame from type "
                         << frameInfo.rawType << "to I420.";
             return -1;
         }
-
-        if (!apply_rotation_) {
-          _captureFrame.set_rotation(ConvertRotation(_rotateFrame));
-        } else {
-          _captureFrame.set_rotation(kVideoRotation_0);
-        }
-
         DeliverCapturedFrame(_captureFrame, captureTime);
     }
     else // Encoded format
@@ -391,14 +364,6 @@
     }
 }
 
-bool VideoCaptureImpl::SetApplyRotation(bool enable) {
-  CriticalSectionScoped cs(&_apiCs);
-  CriticalSectionScoped cs2(&_callBackCs);
-  // The effect of this is the last caller wins.
-  apply_rotation_ = enable;
-  return true;
-}
-
 void VideoCaptureImpl::EnableNoPictureAlarm(const bool enable) {
     CriticalSectionScoped cs(&_apiCs);
     CriticalSectionScoped cs2(&_callBackCs);
diff --git a/webrtc/modules/video_capture/video_capture_impl.h b/webrtc/modules/video_capture/video_capture_impl.h
index aba15f2..75fe7e5 100644
--- a/webrtc/modules/video_capture/video_capture_impl.h
+++ b/webrtc/modules/video_capture/video_capture_impl.h
@@ -68,10 +68,6 @@
     virtual void SetCaptureDelay(int32_t delayMS);
     virtual int32_t CaptureDelay();
     virtual int32_t SetCaptureRotation(VideoCaptureRotation rotation);
-    virtual bool SetApplyRotation(bool enable);
-    virtual bool GetApplyRotation() {
-      return apply_rotation_;
-    }
 
     virtual void EnableFrameRateCallback(const bool enable);
     virtual void EnableNoPictureAlarm(const bool enable);
@@ -144,9 +140,6 @@
 
     // Delta used for translating between NTP and internal timestamps.
     const int64_t delta_ntp_internal_ms_;
-
-    // Indicate whether rotation should be applied before delivered externally.
-    bool apply_rotation_;
 };
 }  // namespace videocapturemodule
 }  // namespace webrtc
diff --git a/webrtc/video_frame.h b/webrtc/video_frame.h
index 2dd7c61..95bcca0 100644
--- a/webrtc/video_frame.h
+++ b/webrtc/video_frame.h
@@ -18,7 +18,6 @@
 // used).
 #include "webrtc/system_wrappers/interface/scoped_refptr.h"
 #include "webrtc/typedefs.h"
-#include "webrtc/common_video/rotation.h"
 
 namespace webrtc {
 
@@ -74,20 +73,6 @@
                           int stride_u,
                           int stride_v);
 
-  // TODO(guoweis): remove the previous CreateFrame when chromium has this code.
-  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,
-                          int width,
-                          int height,
-                          int stride_y,
-                          int stride_u,
-                          int stride_v,
-                          VideoRotation rotation);
-
   // 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.
@@ -137,21 +122,6 @@
   // Get capture ntp time in miliseconds.
   virtual int64_t ntp_time_ms() const { return ntp_time_ms_; }
 
-  // Naming convention for Coordination of Video Orientation. Please see
-  // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf
-  //
-  // "pending rotation" or "pending" = a frame that has a VideoRotation > 0.
-  //
-  // "not pending" = a frame that has a VideoRotation == 0.
-  //
-  // "apply rotation" = modify a frame from being "pending" to being "not
-  //                    pending" rotation (a no-op for "unrotated").
-  //
-  virtual VideoRotation rotation() const { return rotation_; }
-  virtual void set_rotation(VideoRotation rotation) {
-    rotation_ = rotation;
-  }
-
   // Set render time in miliseconds.
   virtual void set_render_time_ms(int64_t render_time_ms) {
     render_time_ms_ = render_time_ms;
@@ -195,7 +165,6 @@
   uint32_t timestamp_;
   int64_t ntp_time_ms_;
   int64_t render_time_ms_;
-  VideoRotation rotation_;
 };
 
 enum VideoFrameType {