| Index: webrtc/media/base/videoframe_unittest.h
 | 
| diff --git a/webrtc/media/base/videoframe_unittest.h b/webrtc/media/base/videoframe_unittest.h
 | 
| index 8f945f3f3faacc237ebeff777db82e8ee1a84a15..2cd0931cef77a8129e57bdeef526007a35acc06d 100644
 | 
| --- a/webrtc/media/base/videoframe_unittest.h
 | 
| +++ b/webrtc/media/base/videoframe_unittest.h
 | 
| @@ -161,6 +161,19 @@
 | 
|      }
 | 
|  
 | 
|      return ms.release();
 | 
| +  }
 | 
| +
 | 
| +  // Write an I420 frame out to disk.
 | 
| +  bool DumpFrame(const std::string& prefix,
 | 
| +                 const cricket::VideoFrame& frame) {
 | 
| +    char filename[256];
 | 
| +    rtc::sprintfn(filename, sizeof(filename), "%s.%dx%d_P420.yuv",
 | 
| +                        prefix.c_str(), frame.GetWidth(), frame.GetHeight());
 | 
| +    size_t out_size = cricket::VideoFrame::SizeOf(frame.GetWidth(),
 | 
| +                                                  frame.GetHeight());
 | 
| +    rtc::scoped_ptr<uint8_t[]> out(new uint8_t[out_size]);
 | 
| +    frame.CopyToBuffer(out.get(), out_size);
 | 
| +    return DumpSample(filename, out.get(), out_size);
 | 
|    }
 | 
|  
 | 
|    bool DumpSample(const std::string& filename, const void* buffer, int size) {
 | 
| @@ -1818,6 +1831,21 @@
 | 
|      EXPECT_NE(target->GetVPlane(), source->GetVPlane());
 | 
|    }
 | 
|  
 | 
| +  void CopyToBuffer() {
 | 
| +    T frame;
 | 
| +    rtc::scoped_ptr<rtc::MemoryStream> ms(
 | 
| +        LoadSample(kImageFilename));
 | 
| +    ASSERT_TRUE(ms.get() != NULL);
 | 
| +    ASSERT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_I420, kWidth, kHeight,
 | 
| +                          &frame));
 | 
| +    size_t out_size = kWidth * kHeight * 3 / 2;
 | 
| +    rtc::scoped_ptr<uint8_t[]> out(new uint8_t[out_size]);
 | 
| +    for (int i = 0; i < repeat_; ++i) {
 | 
| +      EXPECT_EQ(out_size, frame.CopyToBuffer(out.get(), out_size));
 | 
| +    }
 | 
| +    EXPECT_EQ(0, memcmp(out.get(), ms->GetBuffer(), out_size));
 | 
| +  }
 | 
| +
 | 
|    void CopyToFrame() {
 | 
|      T source;
 | 
|      rtc::scoped_ptr<rtc::MemoryStream> ms(
 | 
| @@ -1835,6 +1863,44 @@
 | 
|      source.CopyToFrame(&target);
 | 
|  
 | 
|      EXPECT_TRUE(IsEqual(source, target, 0));
 | 
| +  }
 | 
| +
 | 
| +  void Write() {
 | 
| +    T frame;
 | 
| +    rtc::scoped_ptr<rtc::MemoryStream> ms(
 | 
| +        LoadSample(kImageFilename));
 | 
| +    ASSERT_TRUE(ms.get() != NULL);
 | 
| +    rtc::MemoryStream ms2;
 | 
| +    size_t size;
 | 
| +    ASSERT_TRUE(ms->GetSize(&size));
 | 
| +    ASSERT_TRUE(ms2.ReserveSize(size));
 | 
| +    ASSERT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_I420, kWidth, kHeight,
 | 
| +                          &frame));
 | 
| +    for (int i = 0; i < repeat_; ++i) {
 | 
| +      ms2.SetPosition(0u);  // Useful when repeat_ > 1.
 | 
| +      int error;
 | 
| +      EXPECT_EQ(rtc::SR_SUCCESS, frame.Write(&ms2, &error));
 | 
| +    }
 | 
| +    size_t out_size = cricket::VideoFrame::SizeOf(kWidth, kHeight);
 | 
| +    EXPECT_EQ(0, memcmp(ms2.GetBuffer(), ms->GetBuffer(), out_size));
 | 
| +  }
 | 
| +
 | 
| +  void CopyToBuffer1Pixel() {
 | 
| +    size_t out_size = 3;
 | 
| +    rtc::scoped_ptr<uint8_t[]> out(new uint8_t[out_size + 1]);
 | 
| +    memset(out.get(), 0xfb, out_size + 1);  // Fill buffer
 | 
| +    uint8_t pixel[3] = {1, 2, 3};
 | 
| +    T frame;
 | 
| +    EXPECT_TRUE(frame.Init(cricket::FOURCC_I420, 1, 1, 1, 1, pixel,
 | 
| +                           sizeof(pixel), 0,
 | 
| +                           webrtc::kVideoRotation_0));
 | 
| +    for (int i = 0; i < repeat_; ++i) {
 | 
| +      EXPECT_EQ(out_size, frame.CopyToBuffer(out.get(), out_size));
 | 
| +    }
 | 
| +    EXPECT_EQ(1, out.get()[0]);  // Check Y.  Should be 1.
 | 
| +    EXPECT_EQ(2, out.get()[1]);  // Check U.  Should be 2.
 | 
| +    EXPECT_EQ(3, out.get()[2]);  // Check V.  Should be 3.
 | 
| +    EXPECT_EQ(0xfb, out.get()[3]);  // Check sentinel is still intact.
 | 
|    }
 | 
|  
 | 
|    void StretchToFrame() {
 | 
| 
 |