OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include <string.h> | |
12 | |
13 #include <memory> | |
14 | |
15 #include "webrtc/base/gunit.h" | |
16 #include "webrtc/media/base/videocapturer.h" | |
17 #include "webrtc/media/engine/webrtcvideoframe.h" | |
18 #include "webrtc/media/engine/webrtcvideoframefactory.h" | |
19 | |
20 class WebRtcVideoFrameFactoryTest : public testing::Test { | |
21 public: | |
22 WebRtcVideoFrameFactoryTest() {} | |
23 | |
24 void InitFrame(webrtc::VideoRotation frame_rotation) { | |
25 const int frame_width = 1920; | |
26 const int frame_height = 1080; | |
27 | |
28 // Build the CapturedFrame. | |
29 captured_frame_.fourcc = cricket::FOURCC_I420; | |
30 captured_frame_.pixel_width = 1; | |
31 captured_frame_.pixel_height = 1; | |
32 captured_frame_.time_stamp = rtc::TimeNanos(); | |
33 captured_frame_.rotation = frame_rotation; | |
34 captured_frame_.width = frame_width; | |
35 captured_frame_.height = frame_height; | |
36 captured_frame_.data_size = | |
37 (frame_width * frame_height) + | |
38 ((frame_width + 1) / 2) * ((frame_height + 1) / 2) * 2; | |
39 captured_frame_buffer_.reset(new uint8_t[captured_frame_.data_size]); | |
40 // Initialize memory to satisfy DrMemory tests. | |
41 memset(captured_frame_buffer_.get(), 0, captured_frame_.data_size); | |
42 captured_frame_.data = captured_frame_buffer_.get(); | |
43 } | |
44 | |
45 void VerifyFrame(cricket::VideoFrame* dest_frame, | |
46 webrtc::VideoRotation src_rotation, | |
47 int src_width, | |
48 int src_height, | |
49 bool apply_rotation) { | |
50 if (!apply_rotation) { | |
51 EXPECT_EQ(dest_frame->rotation(), src_rotation); | |
52 EXPECT_EQ(dest_frame->width(), src_width); | |
53 EXPECT_EQ(dest_frame->height(), src_height); | |
54 } else { | |
55 EXPECT_EQ(dest_frame->rotation(), webrtc::kVideoRotation_0); | |
56 if (src_rotation == webrtc::kVideoRotation_90 || | |
57 src_rotation == webrtc::kVideoRotation_270) { | |
58 EXPECT_EQ(dest_frame->width(), src_height); | |
59 EXPECT_EQ(dest_frame->height(), src_width); | |
60 } else { | |
61 EXPECT_EQ(dest_frame->width(), src_width); | |
62 EXPECT_EQ(dest_frame->height(), src_height); | |
63 } | |
64 } | |
65 } | |
66 | |
67 void TestCreateAliasedFrame(bool apply_rotation) { | |
68 cricket::VideoFrameFactory& factory = factory_; | |
69 factory.SetApplyRotation(apply_rotation); | |
70 InitFrame(webrtc::kVideoRotation_270); | |
71 const cricket::CapturedFrame& captured_frame = get_captured_frame(); | |
72 // Create the new frame from the CapturedFrame. | |
73 std::unique_ptr<cricket::VideoFrame> frame; | |
74 int new_width = captured_frame.width / 2; | |
75 int new_height = captured_frame.height / 2; | |
76 frame.reset(factory.CreateAliasedFrame(&captured_frame, new_width, | |
77 new_height, new_width, new_height)); | |
78 VerifyFrame(frame.get(), webrtc::kVideoRotation_270, new_width, new_height, | |
79 apply_rotation); | |
80 | |
81 frame.reset(factory.CreateAliasedFrame( | |
82 &captured_frame, new_width, new_height, new_width / 2, new_height / 2)); | |
83 VerifyFrame(frame.get(), webrtc::kVideoRotation_270, new_width / 2, | |
84 new_height / 2, apply_rotation); | |
85 | |
86 // Reset the frame first so it's exclusive hence we could go through the | |
87 // StretchToFrame code path in CreateAliasedFrame. | |
88 frame.reset(); | |
89 frame.reset(factory.CreateAliasedFrame( | |
90 &captured_frame, new_width, new_height, new_width / 2, new_height / 2)); | |
91 VerifyFrame(frame.get(), webrtc::kVideoRotation_270, new_width / 2, | |
92 new_height / 2, apply_rotation); | |
93 } | |
94 | |
95 const cricket::CapturedFrame& get_captured_frame() { return captured_frame_; } | |
96 | |
97 private: | |
98 cricket::CapturedFrame captured_frame_; | |
99 std::unique_ptr<uint8_t[]> captured_frame_buffer_; | |
100 cricket::WebRtcVideoFrameFactory factory_; | |
101 }; | |
102 | |
103 TEST_F(WebRtcVideoFrameFactoryTest, NoApplyRotation) { | |
104 TestCreateAliasedFrame(false); | |
105 } | |
106 | |
107 TEST_F(WebRtcVideoFrameFactoryTest, ApplyRotation) { | |
108 TestCreateAliasedFrame(true); | |
109 } | |
OLD | NEW |