1 /* 2 * libjingle 3 * Copyright 2011 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include "talk/media/base/videoframe_unittest.h" 29 #include "talk/media/webrtc/webrtcvideoframe.h" 30 31 class WebRtcVideoFrameTest : public VideoFrameTest<cricket::WebRtcVideoFrame> { 32 public: 33 WebRtcVideoFrameTest() { 34 } 35 36 void TestInit(int cropped_width, int cropped_height) { 37 const int frame_width = 1920; 38 const int frame_height = 1080; 39 40 // Build the CapturedFrame. 41 cricket::CapturedFrame captured_frame; 42 captured_frame.fourcc = cricket::FOURCC_I420; 43 captured_frame.pixel_width = 1; 44 captured_frame.pixel_height = 1; 45 captured_frame.elapsed_time = 1234; 46 captured_frame.time_stamp = 5678; 47 captured_frame.rotation = 0; 48 captured_frame.width = frame_width; 49 captured_frame.height = frame_height; 50 captured_frame.data_size = (frame_width * frame_height) + 51 ((frame_width + 1) / 2) * ((frame_height + 1) / 2) * 2; 52 rtc::scoped_ptr<uint8[]> captured_frame_buffer( 53 new uint8[captured_frame.data_size]); 54 captured_frame.data = captured_frame_buffer.get(); 55 56 // Create the new frame from the CapturedFrame. 57 cricket::WebRtcVideoFrame frame; 58 EXPECT_TRUE(frame.Init(&captured_frame, cropped_width, cropped_height)); 59 60 // Verify the new frame. 61 EXPECT_EQ(1u, frame.GetPixelWidth()); 62 EXPECT_EQ(1u, frame.GetPixelHeight()); 63 EXPECT_EQ(1234, frame.GetElapsedTime()); 64 EXPECT_EQ(5678, frame.GetTimeStamp()); 65 EXPECT_EQ(0, frame.GetRotation()); 66 // The size of the new frame should have been cropped to multiple of 4. 67 EXPECT_EQ(static_cast<size_t>(cropped_width & ~3), frame.GetWidth()); 68 EXPECT_EQ(static_cast<size_t>(cropped_height & ~3), frame.GetHeight()); 69 } 70 }; 71 72 #define TEST_WEBRTCVIDEOFRAME(X) TEST_F(WebRtcVideoFrameTest, X) { \ 73 VideoFrameTest<cricket::WebRtcVideoFrame>::X(); \ 74 } 75 76 TEST_WEBRTCVIDEOFRAME(ConstructI420) 77 TEST_WEBRTCVIDEOFRAME(ConstructI422) 78 TEST_WEBRTCVIDEOFRAME(ConstructYuy2) 79 TEST_WEBRTCVIDEOFRAME(ConstructYuy2Unaligned) 80 TEST_WEBRTCVIDEOFRAME(ConstructYuy2Wide) 81 TEST_WEBRTCVIDEOFRAME(ConstructYV12) 82 TEST_WEBRTCVIDEOFRAME(ConstructUyvy) 83 TEST_WEBRTCVIDEOFRAME(ConstructM420) 84 TEST_WEBRTCVIDEOFRAME(ConstructQ420) 85 TEST_WEBRTCVIDEOFRAME(ConstructNV21) 86 TEST_WEBRTCVIDEOFRAME(ConstructNV12) 87 TEST_WEBRTCVIDEOFRAME(ConstructABGR) 88 TEST_WEBRTCVIDEOFRAME(ConstructARGB) 89 TEST_WEBRTCVIDEOFRAME(ConstructARGBWide) 90 TEST_WEBRTCVIDEOFRAME(ConstructBGRA) 91 TEST_WEBRTCVIDEOFRAME(Construct24BG) 92 TEST_WEBRTCVIDEOFRAME(ConstructRaw) 93 TEST_WEBRTCVIDEOFRAME(ConstructRGB565) 94 TEST_WEBRTCVIDEOFRAME(ConstructARGB1555) 95 TEST_WEBRTCVIDEOFRAME(ConstructARGB4444) 96 97 TEST_WEBRTCVIDEOFRAME(ConstructI420Mirror) 98 TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate0) 99 TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate90) 100 TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate180) 101 TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate270) 102 TEST_WEBRTCVIDEOFRAME(ConstructYV12Rotate0) 103 TEST_WEBRTCVIDEOFRAME(ConstructYV12Rotate90) 104 TEST_WEBRTCVIDEOFRAME(ConstructYV12Rotate180) 105 TEST_WEBRTCVIDEOFRAME(ConstructYV12Rotate270) 106 TEST_WEBRTCVIDEOFRAME(ConstructNV12Rotate0) 107 TEST_WEBRTCVIDEOFRAME(ConstructNV12Rotate90) 108 TEST_WEBRTCVIDEOFRAME(ConstructNV12Rotate180) 109 TEST_WEBRTCVIDEOFRAME(ConstructNV12Rotate270) 110 TEST_WEBRTCVIDEOFRAME(ConstructNV21Rotate0) 111 TEST_WEBRTCVIDEOFRAME(ConstructNV21Rotate90) 112 TEST_WEBRTCVIDEOFRAME(ConstructNV21Rotate180) 113 TEST_WEBRTCVIDEOFRAME(ConstructNV21Rotate270) 114 TEST_WEBRTCVIDEOFRAME(ConstructUYVYRotate0) 115 TEST_WEBRTCVIDEOFRAME(ConstructUYVYRotate90) 116 TEST_WEBRTCVIDEOFRAME(ConstructUYVYRotate180) 117 TEST_WEBRTCVIDEOFRAME(ConstructUYVYRotate270) 118 TEST_WEBRTCVIDEOFRAME(ConstructYUY2Rotate0) 119 TEST_WEBRTCVIDEOFRAME(ConstructYUY2Rotate90) 120 TEST_WEBRTCVIDEOFRAME(ConstructYUY2Rotate180) 121 TEST_WEBRTCVIDEOFRAME(ConstructYUY2Rotate270) 122 TEST_WEBRTCVIDEOFRAME(ConstructI4201Pixel) 123 TEST_WEBRTCVIDEOFRAME(ConstructI4205Pixel) 124 // TODO(juberti): WebRtcVideoFrame does not support horizontal crop. 125 // Re-evaluate once it supports 3 independent planes, since we might want to 126 // just Init normally and then crop by adjusting pointers. 127 // TEST_WEBRTCVIDEOFRAME(ConstructI420CropHorizontal) 128 TEST_WEBRTCVIDEOFRAME(ConstructI420CropVertical) 129 // TODO(juberti): WebRtcVideoFrame is not currently refcounted. 130 // TEST_WEBRTCVIDEOFRAME(ConstructCopy) 131 // TEST_WEBRTCVIDEOFRAME(ConstructCopyIsRef) 132 TEST_WEBRTCVIDEOFRAME(ConstructBlack) 133 // TODO(fbarchard): Implement Jpeg 134 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI420) 135 TEST_WEBRTCVIDEOFRAME(ConstructMjpgI422) 136 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI444) 137 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI411) 138 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI400) 139 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI420) 140 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI422) 141 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI444) 142 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI411) 143 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI400) 144 TEST_WEBRTCVIDEOFRAME(ValidateI420) 145 TEST_WEBRTCVIDEOFRAME(ValidateI420SmallSize) 146 TEST_WEBRTCVIDEOFRAME(ValidateI420LargeSize) 147 TEST_WEBRTCVIDEOFRAME(ValidateI420HugeSize) 148 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI420InvalidSize) 149 // TEST_WEBRTCVIDEOFRAME(ValidateI420InvalidSize) 150 151 // TODO(fbarchard): WebRtcVideoFrame does not support odd sizes. 152 // Re-evaluate once WebRTC switches to libyuv 153 // TEST_WEBRTCVIDEOFRAME(ConstructYuy2AllSizes) 154 // TEST_WEBRTCVIDEOFRAME(ConstructARGBAllSizes) 155 TEST_WEBRTCVIDEOFRAME(Reset) 156 TEST_WEBRTCVIDEOFRAME(ConvertToABGRBuffer) 157 TEST_WEBRTCVIDEOFRAME(ConvertToABGRBufferStride) 158 TEST_WEBRTCVIDEOFRAME(ConvertToABGRBufferInverted) 159 TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555Buffer) 160 TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555BufferStride) 161 TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555BufferInverted) 162 TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444Buffer) 163 TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444BufferStride) 164 TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444BufferInverted) 165 TEST_WEBRTCVIDEOFRAME(ConvertToARGBBuffer) 166 TEST_WEBRTCVIDEOFRAME(ConvertToARGBBufferStride) 167 TEST_WEBRTCVIDEOFRAME(ConvertToARGBBufferInverted) 168 TEST_WEBRTCVIDEOFRAME(ConvertToBGRABuffer) 169 TEST_WEBRTCVIDEOFRAME(ConvertToBGRABufferStride) 170 TEST_WEBRTCVIDEOFRAME(ConvertToBGRABufferInverted) 171 TEST_WEBRTCVIDEOFRAME(ConvertToRAWBuffer) 172 TEST_WEBRTCVIDEOFRAME(ConvertToRAWBufferStride) 173 TEST_WEBRTCVIDEOFRAME(ConvertToRAWBufferInverted) 174 TEST_WEBRTCVIDEOFRAME(ConvertToRGB24Buffer) 175 TEST_WEBRTCVIDEOFRAME(ConvertToRGB24BufferStride) 176 TEST_WEBRTCVIDEOFRAME(ConvertToRGB24BufferInverted) 177 TEST_WEBRTCVIDEOFRAME(ConvertToRGB565Buffer) 178 TEST_WEBRTCVIDEOFRAME(ConvertToRGB565BufferStride) 179 TEST_WEBRTCVIDEOFRAME(ConvertToRGB565BufferInverted) 180 TEST_WEBRTCVIDEOFRAME(ConvertToBayerBGGRBuffer) 181 TEST_WEBRTCVIDEOFRAME(ConvertToBayerBGGRBufferStride) 182 TEST_WEBRTCVIDEOFRAME(ConvertToBayerBGGRBufferInverted) 183 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGRBGBuffer) 184 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGRBGBufferStride) 185 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGRBGBufferInverted) 186 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGBRGBuffer) 187 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGBRGBufferStride) 188 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGBRGBufferInverted) 189 TEST_WEBRTCVIDEOFRAME(ConvertToBayerRGGBBuffer) 190 TEST_WEBRTCVIDEOFRAME(ConvertToBayerRGGBBufferStride) 191 TEST_WEBRTCVIDEOFRAME(ConvertToBayerRGGBBufferInverted) 192 TEST_WEBRTCVIDEOFRAME(ConvertToI400Buffer) 193 TEST_WEBRTCVIDEOFRAME(ConvertToI400BufferStride) 194 TEST_WEBRTCVIDEOFRAME(ConvertToI400BufferInverted) 195 TEST_WEBRTCVIDEOFRAME(ConvertToYUY2Buffer) 196 TEST_WEBRTCVIDEOFRAME(ConvertToYUY2BufferStride) 197 TEST_WEBRTCVIDEOFRAME(ConvertToYUY2BufferInverted) 198 TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBuffer) 199 TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBufferStride) 200 TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBufferInverted) 201 TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBuffer) 202 TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBufferStride) 203 TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBufferInverted) 204 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555Buffer) 205 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555BufferStride) 206 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555BufferInverted) 207 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444Buffer) 208 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444BufferStride) 209 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444BufferInverted) 210 TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBuffer) 211 TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBufferStride) 212 TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBufferInverted) 213 TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABuffer) 214 TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABufferStride) 215 TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABufferInverted) 216 TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBuffer) 217 TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBufferStride) 218 TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBufferInverted) 219 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24Buffer) 220 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24BufferStride) 221 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24BufferInverted) 222 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565Buffer) 223 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565BufferStride) 224 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565BufferInverted) 225 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerBGGRBuffer) 226 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerBGGRBufferStride) 227 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerBGGRBufferInverted) 228 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGRBGBuffer) 229 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGRBGBufferStride) 230 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGRBGBufferInverted) 231 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGBRGBuffer) 232 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGBRGBufferStride) 233 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGBRGBufferInverted) 234 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerRGGBBuffer) 235 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerRGGBBufferStride) 236 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerRGGBBufferInverted) 237 TEST_WEBRTCVIDEOFRAME(ConvertFromI400Buffer) 238 TEST_WEBRTCVIDEOFRAME(ConvertFromI400BufferStride) 239 TEST_WEBRTCVIDEOFRAME(ConvertFromI400BufferInverted) 240 TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2Buffer) 241 TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2BufferStride) 242 TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2BufferInverted) 243 TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBuffer) 244 TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBufferStride) 245 TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBufferInverted) 246 // TEST_WEBRTCVIDEOFRAME(ConvertToI422Buffer) 247 TEST_WEBRTCVIDEOFRAME(ConvertARGBToBayerGRBG) 248 TEST_WEBRTCVIDEOFRAME(ConvertARGBToBayerGBRG) 249 TEST_WEBRTCVIDEOFRAME(ConvertARGBToBayerBGGR) 250 TEST_WEBRTCVIDEOFRAME(ConvertARGBToBayerRGGB) 251 TEST_WEBRTCVIDEOFRAME(CopyToBuffer) 252 TEST_WEBRTCVIDEOFRAME(CopyToFrame) 253 TEST_WEBRTCVIDEOFRAME(Write) 254 TEST_WEBRTCVIDEOFRAME(CopyToBuffer1Pixel) 255 // TEST_WEBRTCVIDEOFRAME(ConstructARGBBlackWhitePixel) 256 257 TEST_WEBRTCVIDEOFRAME(StretchToFrame) 258 TEST_WEBRTCVIDEOFRAME(Copy) 259 TEST_WEBRTCVIDEOFRAME(CopyIsRef) 260 TEST_WEBRTCVIDEOFRAME(MakeExclusive) 261 262 // These functions test implementation-specific details. 263 TEST_F(WebRtcVideoFrameTest, Alias) { 264 cricket::WebRtcVideoFrame frame1, frame2; 265 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 266 const int64 time_stamp = INT64_C(0x7FFFFFFFFFFFFFF0); 267 frame1.SetTimeStamp(time_stamp); 268 EXPECT_EQ(time_stamp, frame1.GetTimeStamp()); 269 frame2.Alias(frame1.frame()->Buffer(), frame1.frame()->Size(), 270 kWidth, kHeight, 1, 1, 271 frame1.GetElapsedTime(), frame1.GetTimeStamp(), 0); 272 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 273 } 274 275 // Tests the Init function with different cropped size. 276 TEST_F(WebRtcVideoFrameTest, InitEvenSize) { 277 TestInit(640, 360); 278 } 279 280 TEST_F(WebRtcVideoFrameTest, InitOddWidth) { 281 TestInit(601, 480); 282 } 283 284 TEST_F(WebRtcVideoFrameTest, InitOddHeight) { 285 TestInit(360, 765); 286 } 287 288 TEST_F(WebRtcVideoFrameTest, InitOddWidthHeight) { 289 TestInit(355, 1021); 290 } 291