diff --git a/webrtc/common_video/include/video_frame_buffer.h b/webrtc/common_video/include/video_frame_buffer.h index 984bd50d67..890922f21b 100644 --- a/webrtc/common_video/include/video_frame_buffer.h +++ b/webrtc/common_video/include/video_frame_buffer.h @@ -87,8 +87,18 @@ class I420Buffer : public VideoFrameBuffer { public: I420Buffer(int width, int height); I420Buffer(int width, int height, int stride_y, int stride_u, int stride_v); + + // Sets all three planes to all zeros. Used to work around for + // quirks in memory checkers + // (https://bugs.chromium.org/p/libyuv/issues/detail?id=377) and + // ffmpeg (http://crbug.com/390941). + // TODO(nisse): Should be deleted if/when those issues are resolved + // in a better way. void InitializeData(); + // Sets the frame buffer to all black. + void SetToBlack(); + int width() const override; int height() const override; const uint8_t* DataY() const override; diff --git a/webrtc/common_video/video_frame_buffer.cc b/webrtc/common_video/video_frame_buffer.cc index 34213e4656..27aea3efc5 100644 --- a/webrtc/common_video/video_frame_buffer.cc +++ b/webrtc/common_video/video_frame_buffer.cc @@ -200,6 +200,14 @@ rtc::scoped_refptr I420Buffer::Copy( return copy; } +void I420Buffer::SetToBlack() { + RTC_CHECK(libyuv::I420Rect(MutableDataY(), StrideY(), + MutableDataU(), StrideU(), + MutableDataV(), StrideV(), + 0, 0, width(), height(), + 0, 128, 128) == 0); +} + NativeHandleBuffer::NativeHandleBuffer(void* native_handle, int width, int height) diff --git a/webrtc/media/base/fakevideorenderer.h b/webrtc/media/base/fakevideorenderer.h index 7398bbaa8b..9f03ea9d16 100644 --- a/webrtc/media/base/fakevideorenderer.h +++ b/webrtc/media/base/fakevideorenderer.h @@ -33,8 +33,11 @@ class FakeVideoRenderer : public rtc::VideoSinkInterface { virtual void OnFrame(const VideoFrame& frame) { rtc::CritScope cs(&crit_); // TODO(zhurunz) Check with VP8 team to see if we can remove this - // tolerance on Y values. - black_frame_ = CheckFrameColorYuv(6, 48, 128, 128, 128, 128, &frame); + // tolerance on Y values. Some unit tests produce Y values close + // to 16 rather than close to zero, for supposedly black frames. + // Largest value observed is 34, e.g., running + // P2PTestConductor.LocalP2PTest16To9 (peerconnection_unittests). + black_frame_ = CheckFrameColorYuv(0, 48, 128, 128, 128, 128, &frame); // Treat unexpected frame size as error. ++num_rendered_frames_; width_ = frame.width(); diff --git a/webrtc/media/base/videobroadcaster.cc b/webrtc/media/base/videobroadcaster.cc index 20e8c976c7..ef5c49b4a1 100644 --- a/webrtc/media/base/videobroadcaster.cc +++ b/webrtc/media/base/videobroadcaster.cc @@ -54,7 +54,9 @@ void VideoBroadcaster::OnFrame(const cricket::VideoFrame& frame) { rtc::CritScope cs(&sinks_and_wants_lock_); for (auto& sink_pair : sink_pairs()) { if (sink_pair.wants.black_frames) { - sink_pair.sink->OnFrame(GetBlackFrame(frame)); + sink_pair.sink->OnFrame(cricket::WebRtcVideoFrame( + GetBlackFrameBuffer(frame.width(), frame.height()), + frame.rotation(), frame.timestamp_us())); } else { sink_pair.sink->OnFrame(frame); } @@ -93,20 +95,17 @@ void VideoBroadcaster::UpdateWants() { current_wants_ = wants; } -const cricket::VideoFrame& VideoBroadcaster::GetBlackFrame( - const cricket::VideoFrame& frame) { - if (black_frame_ && black_frame_->width() == frame.width() && - black_frame_->height() == frame.height() && - black_frame_->rotation() == frame.rotation()) { - black_frame_->set_timestamp_us(frame.timestamp_us()); - return *black_frame_; +const rtc::scoped_refptr& +VideoBroadcaster::GetBlackFrameBuffer(int width, int height) { + if (!black_frame_buffer_ || black_frame_buffer_->width() != width || + black_frame_buffer_->height() != height) { + rtc::scoped_refptr buffer = + new RefCountedObject(width, height); + buffer->SetToBlack(); + black_frame_buffer_ = buffer; } - black_frame_.reset(new cricket::WebRtcVideoFrame( - new rtc::RefCountedObject(frame.width(), - frame.height()), - frame.rotation(), frame.timestamp_us())); - black_frame_->SetToBlack(); - return *black_frame_; + + return black_frame_buffer_; } } // namespace rtc diff --git a/webrtc/media/base/videobroadcaster.h b/webrtc/media/base/videobroadcaster.h index 764c749b0c..5d4e2ae658 100644 --- a/webrtc/media/base/videobroadcaster.h +++ b/webrtc/media/base/videobroadcaster.h @@ -49,14 +49,15 @@ class VideoBroadcaster : public VideoSourceBase, protected: void UpdateWants() EXCLUSIVE_LOCKS_REQUIRED(sinks_and_wants_lock_); - const cricket::VideoFrame& GetBlackFrame(const cricket::VideoFrame& frame) + const rtc::scoped_refptr& GetBlackFrameBuffer( + int width, int height) EXCLUSIVE_LOCKS_REQUIRED(sinks_and_wants_lock_); ThreadChecker thread_checker_; rtc::CriticalSection sinks_and_wants_lock_; VideoSinkWants current_wants_ GUARDED_BY(sinks_and_wants_lock_); - std::unique_ptr black_frame_; + rtc::scoped_refptr black_frame_buffer_; }; } // namespace rtc diff --git a/webrtc/media/base/videobroadcaster_unittest.cc b/webrtc/media/base/videobroadcaster_unittest.cc index e4e6d32564..d2948bb437 100644 --- a/webrtc/media/base/videobroadcaster_unittest.cc +++ b/webrtc/media/base/videobroadcaster_unittest.cc @@ -131,13 +131,16 @@ TEST(VideoBroadcasterTest, SinkWantsBlackFrames) { FakeVideoRenderer sink2; VideoSinkWants wants2; - wants1.black_frames = false; + wants2.black_frames = false; broadcaster.AddOrUpdateSink(&sink2, wants2); - cricket::WebRtcVideoFrame frame1; - frame1.InitToBlack(100, 200, 10000 /*ts*/); - // Make it not all-black - frame1.video_frame_buffer()->MutableDataU()[0] = 0; + rtc::scoped_refptr buffer( + new rtc::RefCountedObject(100, 200)); + // Makes it not all black. + buffer->InitializeData(); + + cricket::WebRtcVideoFrame frame1( + buffer, webrtc::kVideoRotation_0, 10 /* timestamp_us */); broadcaster.OnFrame(frame1); EXPECT_TRUE(sink1.black_frame()); EXPECT_EQ(10000, sink1.timestamp()); @@ -150,10 +153,8 @@ TEST(VideoBroadcasterTest, SinkWantsBlackFrames) { wants2.black_frames = true; broadcaster.AddOrUpdateSink(&sink2, wants2); - cricket::WebRtcVideoFrame frame2; - frame2.InitToBlack(100, 200, 30000 /*ts*/); - // Make it not all-black - frame2.video_frame_buffer()->MutableDataU()[0] = 0; + cricket::WebRtcVideoFrame frame2( + buffer, webrtc::kVideoRotation_0, 30 /* timestamp_us */); broadcaster.OnFrame(frame2); EXPECT_FALSE(sink1.black_frame()); EXPECT_EQ(30000, sink1.timestamp()); diff --git a/webrtc/media/base/videoframe.cc b/webrtc/media/base/videoframe.cc index e876d74e31..40cced1154 100644 --- a/webrtc/media/base/videoframe.cc +++ b/webrtc/media/base/videoframe.cc @@ -148,18 +148,6 @@ void VideoFrame::StretchToFrame(VideoFrame* dst, dst->set_rotation(rotation()); } -bool VideoFrame::SetToBlack() { - return libyuv::I420Rect(video_frame_buffer()->MutableDataY(), - video_frame_buffer()->StrideY(), - video_frame_buffer()->MutableDataU(), - video_frame_buffer()->StrideU(), - video_frame_buffer()->MutableDataV(), - video_frame_buffer()->StrideV(), - 0, 0, - width(), height(), - 16, 128, 128) == 0; -} - static const size_t kMaxSampleSize = 1000000000u; // Returns whether a sample is valid. bool VideoFrame::Validate(uint32_t fourcc, diff --git a/webrtc/media/base/videoframe.h b/webrtc/media/base/videoframe.h index a8e3e4d116..c0d9e6658e 100644 --- a/webrtc/media/base/videoframe.h +++ b/webrtc/media/base/videoframe.h @@ -91,9 +91,6 @@ class VideoFrame { virtual void StretchToFrame(VideoFrame *target, bool interpolate, bool crop) const; - // Sets the video frame to black. - virtual bool SetToBlack(); - // Tests if sample is valid. Returns true if valid. static bool Validate(uint32_t fourcc, int w, diff --git a/webrtc/media/base/videoframe_unittest.h b/webrtc/media/base/videoframe_unittest.h index 6ceba833b5..720634b9d1 100644 --- a/webrtc/media/base/videoframe_unittest.h +++ b/webrtc/media/base/videoframe_unittest.h @@ -254,25 +254,28 @@ class VideoFrameTest : public testing::Test { // Simple conversion routines to verify the optimized VideoFrame routines. // Converts from the specified colorspace to I420. - bool ConvertYuv422(const rtc::MemoryStream* ms, - uint32_t fourcc, - uint32_t width, - uint32_t height, - T* frame) { + std::unique_ptr ConvertYuv422(const rtc::MemoryStream* ms, + uint32_t fourcc, + uint32_t width, + uint32_t height) { int y1_pos, y2_pos, u_pos, v_pos; if (!GetYuv422Packing(fourcc, &y1_pos, &y2_pos, &u_pos, &v_pos)) { - return false; + return nullptr; } + rtc::scoped_refptr buffer( + new rtc::RefCountedObject(width, height)); + + buffer->SetToBlack(); + const uint8_t* start = reinterpret_cast(ms->GetBuffer()); int awidth = (width + 1) & ~1; - frame->InitToBlack(width, height, 0); - int stride_y = frame->video_frame_buffer()->StrideY(); - int stride_u = frame->video_frame_buffer()->StrideU(); - int stride_v = frame->video_frame_buffer()->StrideV(); - uint8_t* plane_y = frame->video_frame_buffer()->MutableDataY(); - uint8_t* plane_u = frame->video_frame_buffer()->MutableDataU(); - uint8_t* plane_v = frame->video_frame_buffer()->MutableDataV(); + int stride_y = buffer->StrideY(); + int stride_u = buffer->StrideU(); + int stride_v = buffer->StrideV(); + uint8_t* plane_y = buffer->MutableDataY(); + uint8_t* plane_u = buffer->MutableDataU(); + uint8_t* plane_v = buffer->MutableDataV(); for (uint32_t y = 0; y < height; ++y) { for (uint32_t x = 0; x < width; x += 2) { const uint8_t* quad1 = start + (y * awidth + x) * 2; @@ -292,19 +295,18 @@ class VideoFrameTest : public testing::Test { } } } - return true; + return std::unique_ptr(new T(buffer, 0, webrtc::kVideoRotation_0)); } // Convert RGB to 420. // A negative height inverts the image. - bool ConvertRgb(const rtc::MemoryStream* ms, - uint32_t fourcc, - int32_t width, - int32_t height, - T* frame) { + std::unique_ptr ConvertRgb(const rtc::MemoryStream* ms, + uint32_t fourcc, + int32_t width, + int32_t height) { int r_pos, g_pos, b_pos, bytes; if (!GetRgbPacking(fourcc, &r_pos, &g_pos, &b_pos, &bytes)) { - return false; + return nullptr; } int pitch = width * bytes; const uint8_t* start = reinterpret_cast(ms->GetBuffer()); @@ -313,13 +315,17 @@ class VideoFrameTest : public testing::Test { start = start + pitch * (height - 1); pitch = -pitch; } - frame->InitToBlack(width, height, 0); - int stride_y = frame->video_frame_buffer()->StrideY(); - int stride_u = frame->video_frame_buffer()->StrideU(); - int stride_v = frame->video_frame_buffer()->StrideV(); - uint8_t* plane_y = frame->video_frame_buffer()->MutableDataY(); - uint8_t* plane_u = frame->video_frame_buffer()->MutableDataU(); - uint8_t* plane_v = frame->video_frame_buffer()->MutableDataV(); + rtc::scoped_refptr buffer( + new rtc::RefCountedObject(width, height)); + + buffer->SetToBlack(); + + int stride_y = buffer->StrideY(); + int stride_u = buffer->StrideU(); + int stride_v = buffer->StrideV(); + uint8_t* plane_y = buffer->MutableDataY(); + uint8_t* plane_u = buffer->MutableDataU(); + uint8_t* plane_v = buffer->MutableDataV(); for (int32_t y = 0; y < height; y += 2) { for (int32_t x = 0; x < width; x += 2) { const uint8_t* rgb[4]; @@ -348,7 +354,7 @@ class VideoFrameTest : public testing::Test { (yuv[0][2] + yuv[1][2] + yuv[2][2] + yuv[3][2] + 2) / 4; } } - return true; + return std::unique_ptr(new T(buffer, 0, webrtc::kVideoRotation_0)); } // Simple and slow RGB->YUV conversion. From NTSC standard, c/o Wikipedia. @@ -506,7 +512,7 @@ class VideoFrameTest : public testing::Test { static bool IsBlack(const cricket::VideoFrame& frame) { return !IsNull(frame) && - *frame.video_frame_buffer()->DataY() == 16 && + *frame.video_frame_buffer()->DataY() <= 16 && *frame.video_frame_buffer()->DataU() == 128 && *frame.video_frame_buffer()->DataV() == 128; } @@ -613,29 +619,29 @@ class VideoFrameTest : public testing::Test { // Test constructing an image from a wide YUY2 buffer. // Normal is 1280x720. Wide is 12800x72 void ConstructYuy2Wide() { - T frame1, frame2; std::unique_ptr ms( CreateYuv422Sample(cricket::FOURCC_YUY2, kWidth * 10, kHeight / 10)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertYuv422(ms.get(), cricket::FOURCC_YUY2, - kWidth * 10, kHeight / 10, - &frame1)); + std::unique_ptr frame1 = ConvertYuv422(ms.get(), cricket::FOURCC_YUY2, + kWidth * 10, kHeight / 10); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YUY2, kWidth * 10, kHeight / 10, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 0)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 0)); } // Test constructing an image from a UYVY buffer. void ConstructUyvy() { - T frame1, frame2; std::unique_ptr ms( CreateYuv422Sample(cricket::FOURCC_UYVY, kWidth, kHeight)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertYuv422(ms.get(), cricket::FOURCC_UYVY, kWidth, kHeight, - &frame1)); + std::unique_ptr frame1 = ConvertYuv422(ms.get(), cricket::FOURCC_UYVY, + kWidth, kHeight); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_UYVY, kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 0)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 0)); } // Test constructing an image from a random buffer. @@ -670,85 +676,91 @@ class VideoFrameTest : public testing::Test { // Test constructing an image from a ABGR buffer // Due to rounding, some pixels may differ slightly from the VideoFrame impl. void ConstructABGR() { - T frame1, frame2; std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_ABGR, kWidth, kHeight)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ABGR, kWidth, kHeight, - &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ABGR, + kWidth, kHeight); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ABGR, kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 2)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); } // Test constructing an image from a ARGB buffer // Due to rounding, some pixels may differ slightly from the VideoFrame impl. void ConstructARGB() { - T frame1, frame2; std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_ARGB, kWidth, kHeight)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, kWidth, kHeight, - &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB, + kWidth, kHeight); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 2)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); } // Test constructing an image from a wide ARGB buffer // Normal is 1280x720. Wide is 12800x72 void ConstructARGBWide() { - T frame1, frame2; std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_ARGB, kWidth * 10, kHeight / 10)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, - kWidth * 10, kHeight / 10, &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB, + kWidth * 10, kHeight / 10); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, kWidth * 10, kHeight / 10, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 2)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); } // Test constructing an image from an BGRA buffer. // Due to rounding, some pixels may differ slightly from the VideoFrame impl. void ConstructBGRA() { - T frame1, frame2; std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_BGRA, kWidth, kHeight)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_BGRA, kWidth, kHeight, - &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_BGRA, + kWidth, kHeight); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_BGRA, kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 2)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); } // Test constructing an image from a 24BG buffer. // Due to rounding, some pixels may differ slightly from the VideoFrame impl. void Construct24BG() { - T frame1, frame2; std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_24BG, kWidth, kHeight)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_24BG, kWidth, kHeight, - &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_24BG, + kWidth, kHeight); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_24BG, kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 2)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); } // Test constructing an image from a raw RGB buffer. // Due to rounding, some pixels may differ slightly from the VideoFrame impl. void ConstructRaw() { - T frame1, frame2; std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_RAW, kWidth, kHeight)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_RAW, kWidth, kHeight, - &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_RAW, + kWidth, kHeight); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_RAW, kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 2)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); } // Test constructing an image from a RGB565 buffer @@ -818,7 +830,7 @@ class VideoFrameTest : public testing::Test { data_size, 0, webrtc::kVideoRotation_0)); \ int width_rotate = frame1.width(); \ int height_rotate = frame1.height(); \ - EXPECT_TRUE(frame3.InitToBlack(width_rotate, height_rotate, 0)); \ + frame3.InitToEmptyBuffer(width_rotate, height_rotate, 0); \ libyuv::I420Mirror(frame2.video_frame_buffer()->DataY(), \ frame2.video_frame_buffer()->StrideY(), \ frame2.video_frame_buffer()->DataU(), \ @@ -856,7 +868,7 @@ class VideoFrameTest : public testing::Test { data_size, 0, webrtc::kVideoRotation_0)); \ int width_rotate = frame1.width(); \ int height_rotate = frame1.height(); \ - EXPECT_TRUE(frame3.InitToBlack(width_rotate, height_rotate, 0)); \ + frame3.InitToEmptyBuffer(width_rotate, height_rotate, 0); \ libyuv::I420Rotate(frame2.video_frame_buffer()->DataY(), \ frame2.video_frame_buffer()->StrideY(), \ frame2.video_frame_buffer()->DataU(), \ @@ -1080,16 +1092,17 @@ class VideoFrameTest : public testing::Test { // Test constructing an image from an ARGB buffer with horizontal cropping. void ConstructARGBCropHorizontal() { - T frame1, frame2; std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_ARGB, kWidth, kHeight)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, kWidth, kHeight, - &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB, + kWidth, kHeight); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, kWidth, kHeight, kWidth * 3 / 4, kHeight, webrtc::kVideoRotation_0, &frame2)); - EXPECT_TRUE(IsEqualWithCrop(frame2, frame1, kWidth / 8, 0, 2)); + EXPECT_TRUE(IsEqualWithCrop(frame2, *frame1, kWidth / 8, 0, 2)); } // Test constructing an image from an I420 buffer, cropping top and bottom. @@ -1346,16 +1359,6 @@ class VideoFrameTest : public testing::Test { EXPECT_EQ(frame1.video_frame_buffer(), frame2.video_frame_buffer()); } - // Test creating an empty image and initing it to black. - void ConstructBlack() { - T frame; - for (int i = 0; i < repeat_; ++i) { - EXPECT_TRUE(frame.InitToBlack(kWidth, kHeight, 0)); - } - EXPECT_TRUE(IsSize(frame, kWidth, kHeight)); - EXPECT_TRUE(IsBlack(frame)); - } - // Test constructing an image from a YUY2 buffer with a range of sizes. // Only tests that conversion does not crash or corrupt heap. void ConstructYuy2AllSizes() { @@ -1377,17 +1380,18 @@ class VideoFrameTest : public testing::Test { // Test constructing an image from a ARGB buffer with a range of sizes. // Only tests that conversion does not crash or corrupt heap. void ConstructARGBAllSizes() { - T frame1, frame2; for (int height = kMinHeightAll; height <= kMaxHeightAll; ++height) { for (int width = kMinWidthAll; width <= kMaxWidthAll; ++width) { std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_ARGB, width, height)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, width, height, - &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB, + width, height); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, width, height, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 64)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 64)); } } // Test a practical window size for screencasting usecase. @@ -1398,12 +1402,13 @@ class VideoFrameTest : public testing::Test { std::unique_ptr ms( CreateRgbSample(cricket::FOURCC_ARGB, kOddWidth + i, kOddHeight + j)); ASSERT_TRUE(ms.get() != NULL); - EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, - kOddWidth + i, kOddHeight + j, - &frame1)); + std::unique_ptr frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB, + kOddWidth + i, kOddHeight + j); + ASSERT_TRUE(frame1); + T frame2; EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, kOddWidth + i, kOddHeight + j, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 64)); + EXPECT_TRUE(IsEqual(*frame1, frame2, 64)); } } } @@ -1453,7 +1458,7 @@ class VideoFrameTest : public testing::Test { out, out_size, stride)); } - EXPECT_TRUE(frame2.InitToBlack(kWidth, kHeight, 0)); + frame2.InitToEmptyBuffer(kWidth, kHeight, 0); for (int i = 0; i < repeat_from; ++i) { EXPECT_EQ(0, RGBToI420(out, stride, frame2.video_frame_buffer()->MutableDataY(), @@ -1808,8 +1813,12 @@ class VideoFrameTest : public testing::Test { void StretchToFrame() { // Create the source frame as a black frame. - T source; - EXPECT_TRUE(source.InitToBlack(kWidth * 2, kHeight * 2, 0)); + rtc::scoped_refptr buffer( + new rtc::RefCountedObject(kWidth * 2, kHeight * 2)); + + buffer->SetToBlack(); + T source(buffer, 0, webrtc::kVideoRotation_0); + EXPECT_TRUE(IsSize(source, kWidth * 2, kHeight * 2)); // Create the target frame by loading from a file. diff --git a/webrtc/media/engine/webrtcvideoframe.cc b/webrtc/media/engine/webrtcvideoframe.cc index 3ca6db12d0..4f89c8b85d 100644 --- a/webrtc/media/engine/webrtcvideoframe.cc +++ b/webrtc/media/engine/webrtcvideoframe.cc @@ -65,12 +65,6 @@ bool WebRtcVideoFrame::Init(const CapturedFrame* frame, int dw, int dh, frame->rotation, apply_rotation); } -bool WebRtcVideoFrame::InitToBlack(int w, int h, - int64_t time_stamp_ns) { - InitToEmptyBuffer(w, h, time_stamp_ns); - return SetToBlack(); -} - 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 da8f11b816..487e32ef9a 100644 --- a/webrtc/media/engine/webrtcvideoframe.h +++ b/webrtc/media/engine/webrtcvideoframe.h @@ -63,8 +63,6 @@ class WebRtcVideoFrame : public VideoFrame { void InitToEmptyBuffer(int w, int h); void InitToEmptyBuffer(int w, int h, int64_t time_stamp_ns); - bool InitToBlack(int w, int h, int64_t time_stamp_ns); - int width() const override; int height() const override; diff --git a/webrtc/media/engine/webrtcvideoframe_unittest.cc b/webrtc/media/engine/webrtcvideoframe_unittest.cc index 3f924a441a..6d1d810934 100644 --- a/webrtc/media/engine/webrtcvideoframe_unittest.cc +++ b/webrtc/media/engine/webrtcvideoframe_unittest.cc @@ -20,15 +20,24 @@ namespace { class WebRtcVideoTestFrame : public cricket::WebRtcVideoFrame { public: + WebRtcVideoTestFrame() {} + WebRtcVideoTestFrame( + const rtc::scoped_refptr& buffer, + int64_t time_stamp_ns, + webrtc::VideoRotation rotation) + : WebRtcVideoFrame(buffer, time_stamp_ns, rotation) {} + // The ApplyRotationToFrame test needs this as a public method. using cricket::WebRtcVideoFrame::set_rotation; virtual VideoFrame* CreateEmptyFrame(int w, int h, int64_t time_stamp) const override { - WebRtcVideoTestFrame* frame = new WebRtcVideoTestFrame(); - frame->InitToBlack(w, h, time_stamp); - return frame; + rtc::scoped_refptr buffer( + new rtc::RefCountedObject(w, h)); + buffer->SetToBlack(); + return new WebRtcVideoTestFrame( + buffer, time_stamp, webrtc::kVideoRotation_0); } }; @@ -145,7 +154,6 @@ TEST_WEBRTCVIDEOFRAME(ConstructI420CropVertical) // TODO(juberti): WebRtcVideoFrame is not currently refcounted. // TEST_WEBRTCVIDEOFRAME(ConstructCopy) // TEST_WEBRTCVIDEOFRAME(ConstructCopyIsRef) -TEST_WEBRTCVIDEOFRAME(ConstructBlack) // TODO(fbarchard): Implement Jpeg // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI420) TEST_WEBRTCVIDEOFRAME(ConstructMjpgI422)