| Index: webrtc/video/end_to_end_tests.cc
 | 
| diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc
 | 
| index dbaa87b1b2f1aade0dc39d026a062f0503392344..af9dfe15bf134de4a2aee2805d670d4fbb8a7a6a 100644
 | 
| --- a/webrtc/video/end_to_end_tests.cc
 | 
| +++ b/webrtc/video/end_to_end_tests.cc
 | 
| @@ -195,34 +195,22 @@ TEST_P(EndToEndTest, RendersSingleDelayedFrame) {
 | 
|    // This constant is chosen to be higher than the timeout in the video_render
 | 
|    // module. This makes sure that frames aren't dropped if there are no other
 | 
|    // frames in the queue.
 | 
| -  static const int kDelayRenderCallbackMs = 1000;
 | 
| +  static const int kRenderDelayMs = 1000;
 | 
|  
 | 
|    class Renderer : public rtc::VideoSinkInterface<VideoFrame> {
 | 
|     public:
 | 
|      Renderer() : event_(false, false) {}
 | 
|  
 | 
| -    void OnFrame(const VideoFrame& video_frame) override { event_.Set(); }
 | 
| +    void OnFrame(const VideoFrame& video_frame) override {
 | 
| +      SleepMs(kRenderDelayMs);
 | 
| +      event_.Set();
 | 
| +    }
 | 
|  
 | 
|      bool Wait() { return event_.Wait(kDefaultTimeoutMs); }
 | 
|  
 | 
|      rtc::Event event_;
 | 
|    } renderer;
 | 
|  
 | 
| -  class TestFrameCallback : public I420FrameCallback {
 | 
| -   public:
 | 
| -    TestFrameCallback() : event_(false, false) {}
 | 
| -
 | 
| -    bool Wait() { return event_.Wait(kDefaultTimeoutMs); }
 | 
| -
 | 
| -   private:
 | 
| -    void FrameCallback(VideoFrame* frame) override {
 | 
| -      SleepMs(kDelayRenderCallbackMs);
 | 
| -      event_.Set();
 | 
| -    }
 | 
| -
 | 
| -    rtc::Event event_;
 | 
| -  };
 | 
| -
 | 
|    CreateCalls(Call::Config(&event_log_), Call::Config(&event_log_));
 | 
|  
 | 
|    test::DirectTransport sender_transport(sender_call_.get());
 | 
| @@ -233,8 +221,6 @@ TEST_P(EndToEndTest, RendersSingleDelayedFrame) {
 | 
|    CreateSendConfig(1, 0, 0, &sender_transport);
 | 
|    CreateMatchingReceiveConfigs(&receiver_transport);
 | 
|  
 | 
| -  TestFrameCallback pre_render_callback;
 | 
| -  video_receive_configs_[0].pre_render_callback = &pre_render_callback;
 | 
|    video_receive_configs_[0].renderer = &renderer;
 | 
|  
 | 
|    CreateVideoStreams();
 | 
| @@ -249,8 +235,6 @@ TEST_P(EndToEndTest, RendersSingleDelayedFrame) {
 | 
|        &frame_forwarder, VideoSendStream::DegradationPreference::kBalanced);
 | 
|  
 | 
|    frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame());
 | 
| -  EXPECT_TRUE(pre_render_callback.Wait())
 | 
| -      << "Timed out while waiting for pre-render callback.";
 | 
|    EXPECT_TRUE(renderer.Wait())
 | 
|        << "Timed out while waiting for the frame to render.";
 | 
|  
 | 
| @@ -1052,7 +1036,7 @@ TEST_P(EndToEndTest, ReceivedUlpfecPacketsNotNacked) {
 | 
|  void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) {
 | 
|    static const int kDroppedFrameNumber = 10;
 | 
|    class RetransmissionObserver : public test::EndToEndTest,
 | 
| -                                 public I420FrameCallback {
 | 
| +                                 public rtc::VideoSinkInterface<VideoFrame> {
 | 
|     public:
 | 
|      RetransmissionObserver(bool enable_rtx, bool enable_red)
 | 
|          : EndToEndTest(kDefaultTimeoutMs),
 | 
| @@ -1108,11 +1092,12 @@ void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) {
 | 
|        return SEND_PACKET;
 | 
|      }
 | 
|  
 | 
| -    void FrameCallback(VideoFrame* frame) override {
 | 
| +    void OnFrame(const VideoFrame& frame) override {
 | 
|        rtc::CritScope lock(&crit_);
 | 
| -      if (frame->timestamp() == retransmitted_timestamp_)
 | 
| +      if (frame.timestamp() == retransmitted_timestamp_)
 | 
|          observation_complete_.Set();
 | 
| -      rendered_timestamps_.push_back(frame->timestamp());
 | 
| +      rendered_timestamps_.push_back(frame.timestamp());
 | 
| +      orig_renderer_->OnFrame(frame);
 | 
|      }
 | 
|  
 | 
|      void ModifyVideoConfigs(
 | 
| @@ -1120,7 +1105,13 @@ void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) {
 | 
|          std::vector<VideoReceiveStream::Config>* receive_configs,
 | 
|          VideoEncoderConfig* encoder_config) override {
 | 
|        send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
 | 
| -      (*receive_configs)[0].pre_render_callback = this;
 | 
| +
 | 
| +      // Insert ourselves into the rendering pipeline.
 | 
| +      RTC_DCHECK(!orig_renderer_);
 | 
| +      orig_renderer_ = (*receive_configs)[0].renderer;
 | 
| +      RTC_DCHECK(orig_renderer_);
 | 
| +      (*receive_configs)[0].renderer = this;
 | 
| +
 | 
|        (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
 | 
|  
 | 
|        if (payload_type_ == kRedPayloadType) {
 | 
| @@ -1168,6 +1159,7 @@ void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) {
 | 
|      }
 | 
|  
 | 
|      rtc::CriticalSection crit_;
 | 
| +    rtc::VideoSinkInterface<VideoFrame>* orig_renderer_ = nullptr;
 | 
|      const int payload_type_;
 | 
|      const uint32_t retransmission_ssrc_;
 | 
|      const int retransmission_payload_type_;
 | 
| 
 |