Revert "Add concept of whether video renderer supports rotation."

This reverts commit 0ad48935fc5b92be6e10924a9ee3b0dc39c79104.

TBR=guoweis@webrtc.org

BUG=

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

Cr-Commit-Position: refs/heads/master@{#8663}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8663 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTest.java b/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTest.java
index 688ce96..1b0983a 100644
--- a/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTest.java
+++ b/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTest.java
@@ -41,7 +41,8 @@
     private int framesRendered = 0;
     private Object frameLock = 0;
 
-    private void setSize(int width, int height) {
+    @Override
+    public void setSize(int width, int height) {
     }
 
     @Override
diff --git a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
index ef0fbc6..05def73 100644
--- a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
+++ b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
@@ -528,14 +528,10 @@
       }
     }
 
-    private void setSize(final int width, final int height) {
-      if (width == videoWidth && height == videoHeight) {
-          return;
-      }
-
+    @Override
+    public void setSize(final int width, final int height) {
       Log.d(TAG, "ID: " + id + ". YuvImageRenderer.setSize: " +
           width + " x " + height);
-
       videoWidth = width;
       videoHeight = height;
       int[] strides = { width, width / 2, width / 2  };
@@ -554,7 +550,6 @@
 
     @Override
     public synchronized void renderFrame(I420Frame frame) {
-      setSize(frame.width, frame.height);
       long now = System.nanoTime();
       framesReceived++;
       // Skip rendering of this frame if setSize() was not called.
diff --git a/talk/app/webrtc/java/jni/peerconnection_jni.cc b/talk/app/webrtc/java/jni/peerconnection_jni.cc
index 5e26eaa..ed5fbc7 100644
--- a/talk/app/webrtc/java/jni/peerconnection_jni.cc
+++ b/talk/app/webrtc/java/jni/peerconnection_jni.cc
@@ -696,23 +696,21 @@
 
   virtual ~VideoRendererWrapper() {}
 
-  // This wraps VideoRenderer which still has SetSize.
-  void RenderFrame(const cricket::VideoFrame* video_frame) override {
+  void SetSize(int width, int height) override {
     ScopedLocalRefFrame local_ref_frame(AttachCurrentThreadIfNeeded());
-    const cricket::VideoFrame* frame =
-      video_frame->GetCopyWithRotationApplied();
-    if (width_ != frame->GetWidth() || height_ != frame->GetHeight()) {
-      width_ = frame->GetWidth();
-      height_ = frame->GetHeight();
-      renderer_->SetSize(width_, height_, 0);
-    }
+    const bool kNotReserved = false;  // What does this param mean??
+    renderer_->SetSize(width, height, kNotReserved);
+  }
+
+  void RenderFrame(const cricket::VideoFrame* frame) override {
+    ScopedLocalRefFrame local_ref_frame(AttachCurrentThreadIfNeeded());
     renderer_->RenderFrame(frame);
   }
 
  private:
   explicit VideoRendererWrapper(cricket::VideoRenderer* renderer)
-    : renderer_(renderer), width_(0), height_(0) {}
-  int width_, height_;
+      : renderer_(renderer) {}
+
   scoped_ptr<cricket::VideoRenderer> renderer_;
 };
 
@@ -722,6 +720,8 @@
  public:
   JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks)
       : j_callbacks_(jni, j_callbacks),
+        j_set_size_id_(GetMethodID(
+            jni, GetObjectClass(jni, j_callbacks), "setSize", "(II)V")),
         j_render_frame_id_(GetMethodID(
             jni, GetObjectClass(jni, j_callbacks), "renderFrame",
             "(Lorg/webrtc/VideoRenderer$I420Frame;)V")),
@@ -738,13 +738,14 @@
 
   virtual ~JavaVideoRendererWrapper() {}
 
-  void RenderFrame(const cricket::VideoFrame* video_frame) override {
+  void SetSize(int width, int height) override {
     ScopedLocalRefFrame local_ref_frame(jni());
+    jni()->CallVoidMethod(*j_callbacks_, j_set_size_id_, width, height);
+    CHECK_EXCEPTION(jni());
+  }
 
-    // TODO(guoweis): Remove once the java implementation supports rotation.
-    const cricket::VideoFrame* frame =
-      video_frame->GetCopyWithRotationApplied();
-
+  void RenderFrame(const cricket::VideoFrame* frame) override {
+    ScopedLocalRefFrame local_ref_frame(jni());
     if (frame->GetNativeHandle() != NULL) {
       jobject j_frame = CricketToJavaTextureFrame(frame);
       jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame);
@@ -797,6 +798,7 @@
   }
 
   ScopedGlobalRef<jobject> j_callbacks_;
+  jmethodID j_set_size_id_;
   jmethodID j_render_frame_id_;
   ScopedGlobalRef<jclass> j_frame_class_;
   jmethodID j_i420_frame_ctor_id_;
diff --git a/talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java b/talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java
index 45fafa5..2dc9279 100644
--- a/talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java
+++ b/talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java
@@ -144,8 +144,7 @@
 
   /** The real meat of VideoRendererInterface. */
   public static interface Callbacks {
-    // |frame| might have pending rotation and implementation of Callbacks
-    // should handle that by applying rotation during rendering.
+    public void setSize(int width, int height);
     public void renderFrame(I420Frame frame);
   }
 
diff --git a/talk/app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java b/talk/app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java
index 4e364b5..ab0510a 100644
--- a/talk/app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java
+++ b/talk/app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java
@@ -59,6 +59,7 @@
     private int expectedIceCandidates = 0;
     private int expectedErrors = 0;
     private int expectedRenegotiations = 0;
+    private int expectedSetSize = 0;
     private int previouslySeenWidth = 0;
     private int previouslySeenHeight = 0;
     private int expectedFramesDelivered = 0;
@@ -112,8 +113,19 @@
       gotIceCandidates.add(candidate);
     }
 
-    private synchronized void setSize(int width, int height) {
+    public synchronized void expectSetSize() {
+      if (RENDER_TO_GUI) {
+        // When new frames are delivered to the GUI renderer we don't get
+        // notified of frame size info.
+        return;
+      }
+      ++expectedSetSize;
+    }
+
+    @Override
+    public synchronized void setSize(int width, int height) {
       assertFalse(RENDER_TO_GUI);
+      assertTrue(--expectedSetSize >= 0);
       // Because different camera devices (fake & physical) produce different
       // resolutions, we only sanity-check the set sizes,
       assertTrue(width > 0);
@@ -134,7 +146,6 @@
 
     @Override
     public synchronized void renderFrame(VideoRenderer.I420Frame frame) {
-      setSize(frame.width, frame.height);
       --expectedFramesDelivered;
     }
 
@@ -304,6 +315,9 @@
         stillWaitingForExpectations.add(
             "expectedRemoveStreamLabels: " + expectedRemoveStreamLabels.size());
       }
+      if (expectedSetSize != 0) {
+        stillWaitingForExpectations.add("expectedSetSize");
+      }
       if (expectedFramesDelivered > 0) {
         stillWaitingForExpectations.add(
             "expectedFramesDelivered: " + expectedFramesDelivered);
@@ -422,7 +436,8 @@
     public int height = -1;
     public int numFramesDelivered = 0;
 
-    private void setSize(int width, int height) {
+    @Override
+    public void setSize(int width, int height) {
       assertEquals(this.width, -1);
       assertEquals(this.height, -1);
       this.width = width;
@@ -527,6 +542,7 @@
     VideoSource videoSource = factory.createVideoSource(
         VideoCapturer.create(""), new MediaConstraints());
 
+    offeringExpectations.expectSetSize();
     offeringExpectations.expectRenegotiationNeeded();
     WeakReference<MediaStream> oLMS = addTracksToPC(
         factory, offeringPC, videoSource, "offeredMediaStream",
@@ -558,6 +574,7 @@
     assertTrue(sdpLatch.await());
     assertNull(sdpLatch.getSdp());
 
+    answeringExpectations.expectSetSize();
     answeringExpectations.expectRenegotiationNeeded();
     WeakReference<MediaStream> aLMS = addTracksToPC(
         factory, answeringPC, videoSource, "answeredMediaStream",
@@ -619,6 +636,8 @@
       // chosen arbitrarily).
       offeringExpectations.expectFramesDelivered(10);
       answeringExpectations.expectFramesDelivered(10);
+      offeringExpectations.expectSetSize();
+      answeringExpectations.expectSetSize();
     }
 
     offeringExpectations.expectStateChange(DataChannel.State.OPEN);
diff --git a/talk/app/webrtc/mediastreaminterface.h b/talk/app/webrtc/mediastreaminterface.h
index 4de0648..ce5e045 100644
--- a/talk/app/webrtc/mediastreaminterface.h
+++ b/talk/app/webrtc/mediastreaminterface.h
@@ -115,27 +115,9 @@
 // Interface for rendering VideoFrames from a VideoTrack
 class VideoRendererInterface {
  public:
-  // TODO(guoweis): Remove this function.  Obsolete. The implementation of
-  // VideoRendererInterface should be able to handle different frame size as
-  // well as pending rotation. If it can't apply the frame rotation by itself,
-  // it should call |frame|.GetCopyWithRotationApplied() to get a frame that has
-  // the rotation applied.
-  virtual void SetSize(int width, int height) {}
-
-  // |frame| may have pending rotation. For clients which can't apply rotation,
-  // |frame|->GetCopyWithRotationApplied() will return a frame that has the
-  // rotation applied.
+  virtual void SetSize(int width, int height) = 0;
   virtual void RenderFrame(const cricket::VideoFrame* frame) = 0;
 
-  // TODO(guoweis): Remove this function. This is added as a temporary solution
-  // until chrome renderers can apply rotation.
-  // Whether the VideoRenderer has the ability to rotate the frame before being
-  // displayed. The rotation of a frame is carried by
-  // VideoFrame.GetVideoRotation() and is the clockwise angle the frames must be
-  // rotated in order to display the frames correctly. If returning false, the
-  // frame's rotation must be applied before being delivered by RenderFrame.
-  virtual bool CanApplyRotation() { return false; }
-
  protected:
   // The destructor is protected to prevent deletion via the interface.
   // This is so that we allow reference counted classes, where the destructor
diff --git a/talk/app/webrtc/test/fakevideotrackrenderer.h b/talk/app/webrtc/test/fakevideotrackrenderer.h
index 8bd98fa..d636a56 100644
--- a/talk/app/webrtc/test/fakevideotrackrenderer.h
+++ b/talk/app/webrtc/test/fakevideotrackrenderer.h
@@ -35,55 +35,34 @@
 
 class FakeVideoTrackRenderer : public VideoRendererInterface {
  public:
-  FakeVideoTrackRenderer(VideoTrackInterface* video_track)
-      : video_track_(video_track),
-        can_apply_rotation_(true),
-        last_frame_(NULL) {
-    video_track_->AddRenderer(this);
-  }
-  FakeVideoTrackRenderer(VideoTrackInterface* video_track,
-                         bool can_apply_rotation)
-      : video_track_(video_track),
-        can_apply_rotation_(can_apply_rotation),
-        last_frame_(NULL) {
+  explicit FakeVideoTrackRenderer(VideoTrackInterface* video_track)
+      : video_track_(video_track) {
     video_track_->AddRenderer(this);
   }
   ~FakeVideoTrackRenderer() {
     video_track_->RemoveRenderer(this);
   }
 
-  virtual void RenderFrame(const cricket::VideoFrame* video_frame) override {
-    last_frame_ = const_cast<cricket::VideoFrame*>(video_frame);
-
-    const cricket::VideoFrame* frame =
-        can_apply_rotation_ ? video_frame
-                            : video_frame->GetCopyWithRotationApplied();
-
-    if (!fake_renderer_.SetSize(static_cast<int>(frame->GetWidth()),
-                                static_cast<int>(frame->GetHeight()), 0)) {
-      return;
-    }
-
-    fake_renderer_.RenderFrame(frame);
+  // Implements VideoRendererInterface
+  virtual void SetSize(int width, int height) {
+    fake_renderer_.SetSize(width, height, 0);
   }
 
-  virtual bool CanApplyRotation() override { return can_apply_rotation_; }
+  virtual void RenderFrame(const cricket::VideoFrame* frame) {
+    fake_renderer_.RenderFrame(frame);
+  }
 
   int errors() const { return fake_renderer_.errors(); }
   int width() const { return fake_renderer_.width(); }
   int height() const { return fake_renderer_.height(); }
+  int num_set_sizes() const { return fake_renderer_.num_set_sizes(); }
   int num_rendered_frames() const {
     return fake_renderer_.num_rendered_frames();
   }
-  const cricket::VideoFrame* last_frame() const { return last_frame_; }
 
  private:
   cricket::FakeVideoRenderer fake_renderer_;
   rtc::scoped_refptr<VideoTrackInterface> video_track_;
-  bool can_apply_rotation_;
-
-  // Weak reference for frame pointer comparison only.
-  cricket::VideoFrame* last_frame_;
 };
 
 }  // namespace webrtc
diff --git a/talk/app/webrtc/videotrack_unittest.cc b/talk/app/webrtc/videotrack_unittest.cc
index 529866d..263fefc 100644
--- a/talk/app/webrtc/videotrack_unittest.cc
+++ b/talk/app/webrtc/videotrack_unittest.cc
@@ -43,132 +43,57 @@
 using webrtc::VideoTrack;
 using webrtc::VideoTrackInterface;
 
-namespace {
-
-class WebRtcVideoTestFrame : public cricket::WebRtcVideoFrame {
- public:
-  using cricket::WebRtcVideoFrame::SetRotation;
-};
-
-}  // namespace
-
-class VideoTrackTest : public testing::Test {
- public:
-  VideoTrackTest() {
-    static const char kVideoTrackId[] = "track_id";
-
-    channel_manager_.reset(new cricket::ChannelManager(
-        new cricket::FakeMediaEngine(), new cricket::FakeDeviceManager(),
-        rtc::Thread::Current()));
-    EXPECT_TRUE(channel_manager_->Init());
-    video_track_ = VideoTrack::Create(
-        kVideoTrackId,
-        VideoSource::Create(channel_manager_.get(),
-                            new webrtc::RemoteVideoCapturer(), NULL));
-  }
-
- protected:
-  rtc::scoped_ptr<cricket::ChannelManager> channel_manager_;
-  rtc::scoped_refptr<VideoTrackInterface> video_track_;
-};
-
 // Test adding renderers to a video track and render to them by providing
 // frames to the source.
-TEST_F(VideoTrackTest, RenderVideo) {
-  // FakeVideoTrackRenderer register itself to |video_track_|
-  rtc::scoped_ptr<FakeVideoTrackRenderer> renderer_1(
-      new FakeVideoTrackRenderer(video_track_.get()));
+TEST(VideoTrack, RenderVideo) {
+  static const char kVideoTrackId[] = "track_id";
 
-  cricket::VideoRenderer* renderer_input =
-      video_track_->GetSource()->FrameInput();
-  ASSERT_FALSE(renderer_input == NULL);
+  rtc::scoped_ptr<cricket::ChannelManager> channel_manager_;
+  channel_manager_.reset(
+    new cricket::ChannelManager(new cricket::FakeMediaEngine(),
+                                new cricket::FakeDeviceManager(),
+                                rtc::Thread::Current()));
+  ASSERT_TRUE(channel_manager_->Init());
+  rtc::scoped_refptr<VideoTrackInterface> video_track(
+      VideoTrack::Create(kVideoTrackId,
+                         VideoSource::Create(channel_manager_.get(),
+                                             new webrtc::RemoteVideoCapturer(),
+                                             NULL)));
+  // FakeVideoTrackRenderer register itself to |video_track|
+  rtc::scoped_ptr<FakeVideoTrackRenderer> renderer_1(
+      new FakeVideoTrackRenderer(video_track.get()));
+
+  cricket::VideoRenderer* render_input = video_track->GetSource()->FrameInput();
+  ASSERT_FALSE(render_input == NULL);
 
   cricket::WebRtcVideoFrame frame;
   frame.InitToBlack(123, 123, 1, 1, 0, 0);
-  renderer_input->RenderFrame(&frame);
+  render_input->RenderFrame(&frame);
   EXPECT_EQ(1, renderer_1->num_rendered_frames());
 
+  EXPECT_EQ(1, renderer_1->num_set_sizes());
   EXPECT_EQ(123, renderer_1->width());
   EXPECT_EQ(123, renderer_1->height());
 
-  // FakeVideoTrackRenderer register itself to |video_track_|
+  // FakeVideoTrackRenderer register itself to |video_track|
   rtc::scoped_ptr<FakeVideoTrackRenderer> renderer_2(
-      new FakeVideoTrackRenderer(video_track_.get()));
+      new FakeVideoTrackRenderer(video_track.get()));
 
-  renderer_input->RenderFrame(&frame);
+  render_input->RenderFrame(&frame);
 
+  EXPECT_EQ(1, renderer_1->num_set_sizes());
   EXPECT_EQ(123, renderer_1->width());
   EXPECT_EQ(123, renderer_1->height());
+  EXPECT_EQ(1, renderer_2->num_set_sizes());
   EXPECT_EQ(123, renderer_2->width());
   EXPECT_EQ(123, renderer_2->height());
 
   EXPECT_EQ(2, renderer_1->num_rendered_frames());
   EXPECT_EQ(1, renderer_2->num_rendered_frames());
 
-  video_track_->RemoveRenderer(renderer_1.get());
-  renderer_input->RenderFrame(&frame);
+  video_track->RemoveRenderer(renderer_1.get());
+  render_input->RenderFrame(&frame);
 
   EXPECT_EQ(2, renderer_1->num_rendered_frames());
   EXPECT_EQ(2, renderer_2->num_rendered_frames());
 }
-
-// Test adding renderers which support and don't support rotation and receive
-// the right frame.
-TEST_F(VideoTrackTest, RenderVideoWithPendingRotation) {
-  const size_t kWidth = 800;
-  const size_t kHeight = 400;
-
-  // Add a renderer which supports rotation.
-  rtc::scoped_ptr<FakeVideoTrackRenderer> rotating_renderer(
-      new FakeVideoTrackRenderer(video_track_.get(), true));
-
-  cricket::VideoRenderer* renderer_input =
-      video_track_->GetSource()->FrameInput();
-  ASSERT_FALSE(renderer_input == NULL);
-
-  // Create a frame with rotation 90 degree.
-  WebRtcVideoTestFrame frame;
-  frame.InitToBlack(kWidth, kHeight, 1, 1, 0, 0);
-  frame.SetRotation(webrtc::kVideoRotation_90);
-
-  // rotating_renderer should see the frame unrotated.
-  renderer_input->RenderFrame(&frame);
-  EXPECT_EQ(1, rotating_renderer->num_rendered_frames());
-  EXPECT_EQ(kWidth, rotating_renderer->width());
-  EXPECT_EQ(kHeight, rotating_renderer->height());
-  EXPECT_EQ(&frame, rotating_renderer->last_frame());
-
-  // Add 2nd renderer which doesn't support rotation.
-  rtc::scoped_ptr<FakeVideoTrackRenderer> non_rotating_renderer(
-      new FakeVideoTrackRenderer(video_track_.get(), false));
-
-  // Render the same 90 degree frame.
-  renderer_input->RenderFrame(&frame);
-
-  // rotating_renderer should see the same frame.
-  EXPECT_EQ(kWidth, rotating_renderer->width());
-  EXPECT_EQ(kHeight, rotating_renderer->height());
-  EXPECT_EQ(&frame, rotating_renderer->last_frame());
-
-  // non_rotating_renderer should see the frame rotated.
-  EXPECT_EQ(kHeight, non_rotating_renderer->width());
-  EXPECT_EQ(kWidth, non_rotating_renderer->height());
-  EXPECT_NE(&frame, non_rotating_renderer->last_frame());
-
-  // Render the same 90 degree frame the 3rd time.
-  renderer_input->RenderFrame(&frame);
-
-  // Now render a frame without rotation.
-  frame.SetRotation(webrtc::kVideoRotation_0);
-  renderer_input->RenderFrame(&frame);
-
-  // rotating_renderer should still only have 1 setsize.
-  EXPECT_EQ(kWidth, rotating_renderer->width());
-  EXPECT_EQ(kHeight, rotating_renderer->height());
-  EXPECT_EQ(&frame, rotating_renderer->last_frame());
-
-  // render_2 should have a new size but should have the same frame.
-  EXPECT_EQ(kWidth, non_rotating_renderer->width());
-  EXPECT_EQ(kHeight, non_rotating_renderer->height());
-  EXPECT_EQ(&frame, non_rotating_renderer->last_frame());
-}
diff --git a/talk/app/webrtc/videotrackrenderers.cc b/talk/app/webrtc/videotrackrenderers.cc
index 08bf05a..03f080d 100644
--- a/talk/app/webrtc/videotrackrenderers.cc
+++ b/talk/app/webrtc/videotrackrenderers.cc
@@ -26,21 +26,19 @@
  */
 
 #include "talk/app/webrtc/videotrackrenderers.h"
-#include "talk/media/base/videoframe.h"
 
 namespace webrtc {
 
 VideoTrackRenderers::VideoTrackRenderers()
-    : enabled_(true) {
+    : width_(0),
+      height_(0),
+      enabled_(true) {
 }
 
 VideoTrackRenderers::~VideoTrackRenderers() {
 }
 
 void VideoTrackRenderers::AddRenderer(VideoRendererInterface* renderer) {
-  if (!renderer) {
-    return;
-  }
   rtc::CritScope cs(&critical_section_);
   std::vector<RenderObserver>::iterator it =  renderers_.begin();
   for (; it != renderers_.end(); ++it) {
@@ -67,6 +65,14 @@
 }
 
 bool VideoTrackRenderers::SetSize(int width, int height, int reserved) {
+  rtc::CritScope cs(&critical_section_);
+  width_ = width;
+  height_ = height;
+  std::vector<RenderObserver>::iterator it = renderers_.begin();
+  for (; it != renderers_.end(); ++it) {
+    it->renderer_->SetSize(width, height);
+    it->size_set_ = true;
+  }
   return true;
 }
 
@@ -75,14 +81,13 @@
   if (!enabled_) {
     return true;
   }
-
   std::vector<RenderObserver>::iterator it = renderers_.begin();
   for (; it != renderers_.end(); ++it) {
-    if (it->can_apply_rotation_) {
-      it->renderer_->RenderFrame(frame);
-    } else {
-      it->renderer_->RenderFrame(frame->GetCopyWithRotationApplied());
+    if (!it->size_set_) {
+      it->renderer_->SetSize(width_, height_);
+      it->size_set_ = true;
     }
+    it->renderer_->RenderFrame(frame);
   }
   return true;
 }
diff --git a/talk/app/webrtc/videotrackrenderers.h b/talk/app/webrtc/videotrackrenderers.h
index 02d610f..5bec347 100644
--- a/talk/app/webrtc/videotrackrenderers.h
+++ b/talk/app/webrtc/videotrackrenderers.h
@@ -33,7 +33,6 @@
 #include "talk/app/webrtc/mediastreaminterface.h"
 #include "talk/media/base/videorenderer.h"
 #include "webrtc/base/criticalsection.h"
-#include "webrtc/base/scoped_ptr.h"
 
 namespace webrtc {
 
@@ -59,11 +58,14 @@
   struct RenderObserver {
     explicit RenderObserver(VideoRendererInterface* renderer)
         : renderer_(renderer),
-          can_apply_rotation_(renderer->CanApplyRotation()) {}
+          size_set_(false) {
+    }
     VideoRendererInterface* renderer_;
-    bool can_apply_rotation_;
+    bool size_set_;
   };
 
+  int width_;
+  int height_;
   bool enabled_;
   std::vector<RenderObserver> renderers_;