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/base/flags.h" 29 #include "talk/media/base/videoframe_unittest.h" 30 #include "talk/media/webrtc/webrtcvideoframe.h" 31 32 extern int FLAG_yuvconverter_repeat; // From lmivideoframe_unittest.cc. 33 34 class WebRtcVideoFrameTest : public VideoFrameTest<cricket::WebRtcVideoFrame> { 35 public: 36 WebRtcVideoFrameTest() { 37 repeat_ = FLAG_yuvconverter_repeat; 38 } 39 40 void TestInit(int cropped_width, int cropped_height) { 41 const int frame_width = 1920; 42 const int frame_height = 1080; 43 44 // Build the CapturedFrame. 45 cricket::CapturedFrame captured_frame; 46 captured_frame.fourcc = cricket::FOURCC_I420; 47 captured_frame.pixel_width = 1; 48 captured_frame.pixel_height = 1; 49 captured_frame.elapsed_time = 1234; 50 captured_frame.time_stamp = 5678; 51 captured_frame.rotation = 0; 52 captured_frame.width = frame_width; 53 captured_frame.height = frame_height; 54 captured_frame.data_size = (frame_width * frame_height) + 55 ((frame_width + 1) / 2) * ((frame_height + 1) / 2) * 2; 56 talk_base::scoped_array<uint8> captured_frame_buffer( 57 new uint8[captured_frame.data_size]); 58 captured_frame.data = captured_frame_buffer.get(); 59 60 // Create the new frame from the CapturedFrame. 61 cricket::WebRtcVideoFrame frame; 62 EXPECT_TRUE(frame.Init(&captured_frame, cropped_width, cropped_height)); 63 64 // Verify the new frame. 65 EXPECT_EQ(1u, frame.GetPixelWidth()); 66 EXPECT_EQ(1u, frame.GetPixelHeight()); 67 EXPECT_EQ(1234, frame.GetElapsedTime()); 68 EXPECT_EQ(5678, frame.GetTimeStamp()); 69 EXPECT_EQ(0, frame.GetRotation()); 70 // The size of the new frame should have been cropped to multiple of 4. 71 EXPECT_EQ(static_cast<size_t>(cropped_width & ~3), frame.GetWidth()); 72 EXPECT_EQ(static_cast<size_t>(cropped_height & ~3), frame.GetHeight()); 73 } 74 }; 75 76 #define TEST_WEBRTCVIDEOFRAME(X) TEST_F(WebRtcVideoFrameTest, X) { \ 77 VideoFrameTest<cricket::WebRtcVideoFrame>::X(); \ 78 } 79 80 TEST_WEBRTCVIDEOFRAME(ConstructI420) 81 TEST_WEBRTCVIDEOFRAME(ConstructI422) 82 TEST_WEBRTCVIDEOFRAME(ConstructYuy2) 83 TEST_WEBRTCVIDEOFRAME(ConstructYuy2Unaligned) 84 TEST_WEBRTCVIDEOFRAME(ConstructYuy2Wide) 85 TEST_WEBRTCVIDEOFRAME(ConstructYV12) 86 TEST_WEBRTCVIDEOFRAME(ConstructUyvy) 87 TEST_WEBRTCVIDEOFRAME(ConstructM420) 88 TEST_WEBRTCVIDEOFRAME(ConstructQ420) 89 TEST_WEBRTCVIDEOFRAME(ConstructNV21) 90 TEST_WEBRTCVIDEOFRAME(ConstructNV12) 91 TEST_WEBRTCVIDEOFRAME(ConstructABGR) 92 TEST_WEBRTCVIDEOFRAME(ConstructARGB) 93 TEST_WEBRTCVIDEOFRAME(ConstructARGBWide) 94 TEST_WEBRTCVIDEOFRAME(ConstructBGRA) 95 TEST_WEBRTCVIDEOFRAME(Construct24BG) 96 TEST_WEBRTCVIDEOFRAME(ConstructRaw) 97 TEST_WEBRTCVIDEOFRAME(ConstructRGB565) 98 TEST_WEBRTCVIDEOFRAME(ConstructARGB1555) 99 TEST_WEBRTCVIDEOFRAME(ConstructARGB4444) 100 101 TEST_WEBRTCVIDEOFRAME(ConstructI420Mirror) 102 TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate0) 103 TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate90) 104 TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate180) 105 TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate270) 106 TEST_WEBRTCVIDEOFRAME(ConstructYV12Rotate0) 107 TEST_WEBRTCVIDEOFRAME(ConstructYV12Rotate90) 108 TEST_WEBRTCVIDEOFRAME(ConstructYV12Rotate180) 109 TEST_WEBRTCVIDEOFRAME(ConstructYV12Rotate270) 110 TEST_WEBRTCVIDEOFRAME(ConstructNV12Rotate0) 111 TEST_WEBRTCVIDEOFRAME(ConstructNV12Rotate90) 112 TEST_WEBRTCVIDEOFRAME(ConstructNV12Rotate180) 113 TEST_WEBRTCVIDEOFRAME(ConstructNV12Rotate270) 114 TEST_WEBRTCVIDEOFRAME(ConstructNV21Rotate0) 115 TEST_WEBRTCVIDEOFRAME(ConstructNV21Rotate90) 116 TEST_WEBRTCVIDEOFRAME(ConstructNV21Rotate180) 117 TEST_WEBRTCVIDEOFRAME(ConstructNV21Rotate270) 118 TEST_WEBRTCVIDEOFRAME(ConstructUYVYRotate0) 119 TEST_WEBRTCVIDEOFRAME(ConstructUYVYRotate90) 120 TEST_WEBRTCVIDEOFRAME(ConstructUYVYRotate180) 121 TEST_WEBRTCVIDEOFRAME(ConstructUYVYRotate270) 122 TEST_WEBRTCVIDEOFRAME(ConstructYUY2Rotate0) 123 TEST_WEBRTCVIDEOFRAME(ConstructYUY2Rotate90) 124 TEST_WEBRTCVIDEOFRAME(ConstructYUY2Rotate180) 125 TEST_WEBRTCVIDEOFRAME(ConstructYUY2Rotate270) 126 TEST_WEBRTCVIDEOFRAME(ConstructI4201Pixel) 127 TEST_WEBRTCVIDEOFRAME(ConstructI4205Pixel) 128 // TODO(juberti): WebRtcVideoFrame does not support horizontal crop. 129 // Re-evaluate once it supports 3 independent planes, since we might want to 130 // just Init normally and then crop by adjusting pointers. 131 // TEST_WEBRTCVIDEOFRAME(ConstructI420CropHorizontal) 132 TEST_WEBRTCVIDEOFRAME(ConstructI420CropVertical) 133 // TODO(juberti): WebRtcVideoFrame is not currently refcounted. 134 // TEST_WEBRTCVIDEOFRAME(ConstructCopy) 135 // TEST_WEBRTCVIDEOFRAME(ConstructCopyIsRef) 136 TEST_WEBRTCVIDEOFRAME(ConstructBlack) 137 // TODO(fbarchard): Implement Jpeg 138 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI420) 139 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI422) 140 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI444) 141 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI411) 142 // TEST_WEBRTCVIDEOFRAME(ConstructMjpgI400) 143 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI420) 144 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI422) 145 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI444) 146 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI411) 147 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI400) 148 TEST_WEBRTCVIDEOFRAME(ValidateI420) 149 TEST_WEBRTCVIDEOFRAME(ValidateI420SmallSize) 150 TEST_WEBRTCVIDEOFRAME(ValidateI420LargeSize) 151 TEST_WEBRTCVIDEOFRAME(ValidateI420HugeSize) 152 // TEST_WEBRTCVIDEOFRAME(ValidateMjpgI420InvalidSize) 153 // TEST_WEBRTCVIDEOFRAME(ValidateI420InvalidSize) 154 155 // TODO(fbarchard): WebRtcVideoFrame does not support odd sizes. 156 // Re-evaluate once WebRTC switches to libyuv 157 // TEST_WEBRTCVIDEOFRAME(ConstructYuy2AllSizes) 158 // TEST_WEBRTCVIDEOFRAME(ConstructARGBAllSizes) 159 TEST_WEBRTCVIDEOFRAME(Reset) 160 TEST_WEBRTCVIDEOFRAME(ConvertToABGRBuffer) 161 TEST_WEBRTCVIDEOFRAME(ConvertToABGRBufferStride) 162 TEST_WEBRTCVIDEOFRAME(ConvertToABGRBufferInverted) 163 TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555Buffer) 164 TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555BufferStride) 165 TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555BufferInverted) 166 TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444Buffer) 167 TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444BufferStride) 168 TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444BufferInverted) 169 TEST_WEBRTCVIDEOFRAME(ConvertToARGBBuffer) 170 TEST_WEBRTCVIDEOFRAME(ConvertToARGBBufferStride) 171 TEST_WEBRTCVIDEOFRAME(ConvertToARGBBufferInverted) 172 TEST_WEBRTCVIDEOFRAME(ConvertToBGRABuffer) 173 TEST_WEBRTCVIDEOFRAME(ConvertToBGRABufferStride) 174 TEST_WEBRTCVIDEOFRAME(ConvertToBGRABufferInverted) 175 TEST_WEBRTCVIDEOFRAME(ConvertToRAWBuffer) 176 TEST_WEBRTCVIDEOFRAME(ConvertToRAWBufferStride) 177 TEST_WEBRTCVIDEOFRAME(ConvertToRAWBufferInverted) 178 TEST_WEBRTCVIDEOFRAME(ConvertToRGB24Buffer) 179 TEST_WEBRTCVIDEOFRAME(ConvertToRGB24BufferStride) 180 TEST_WEBRTCVIDEOFRAME(ConvertToRGB24BufferInverted) 181 TEST_WEBRTCVIDEOFRAME(ConvertToRGB565Buffer) 182 TEST_WEBRTCVIDEOFRAME(ConvertToRGB565BufferStride) 183 TEST_WEBRTCVIDEOFRAME(ConvertToRGB565BufferInverted) 184 TEST_WEBRTCVIDEOFRAME(ConvertToBayerBGGRBuffer) 185 TEST_WEBRTCVIDEOFRAME(ConvertToBayerBGGRBufferStride) 186 TEST_WEBRTCVIDEOFRAME(ConvertToBayerBGGRBufferInverted) 187 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGRBGBuffer) 188 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGRBGBufferStride) 189 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGRBGBufferInverted) 190 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGBRGBuffer) 191 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGBRGBufferStride) 192 TEST_WEBRTCVIDEOFRAME(ConvertToBayerGBRGBufferInverted) 193 TEST_WEBRTCVIDEOFRAME(ConvertToBayerRGGBBuffer) 194 TEST_WEBRTCVIDEOFRAME(ConvertToBayerRGGBBufferStride) 195 TEST_WEBRTCVIDEOFRAME(ConvertToBayerRGGBBufferInverted) 196 TEST_WEBRTCVIDEOFRAME(ConvertToI400Buffer) 197 TEST_WEBRTCVIDEOFRAME(ConvertToI400BufferStride) 198 TEST_WEBRTCVIDEOFRAME(ConvertToI400BufferInverted) 199 TEST_WEBRTCVIDEOFRAME(ConvertToYUY2Buffer) 200 TEST_WEBRTCVIDEOFRAME(ConvertToYUY2BufferStride) 201 TEST_WEBRTCVIDEOFRAME(ConvertToYUY2BufferInverted) 202 TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBuffer) 203 TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBufferStride) 204 TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBufferInverted) 205 TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBuffer) 206 TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBufferStride) 207 TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBufferInverted) 208 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555Buffer) 209 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555BufferStride) 210 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555BufferInverted) 211 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444Buffer) 212 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444BufferStride) 213 TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444BufferInverted) 214 TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBuffer) 215 TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBufferStride) 216 TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBufferInverted) 217 TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABuffer) 218 TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABufferStride) 219 TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABufferInverted) 220 TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBuffer) 221 TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBufferStride) 222 TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBufferInverted) 223 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24Buffer) 224 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24BufferStride) 225 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24BufferInverted) 226 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565Buffer) 227 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565BufferStride) 228 TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565BufferInverted) 229 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerBGGRBuffer) 230 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerBGGRBufferStride) 231 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerBGGRBufferInverted) 232 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGRBGBuffer) 233 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGRBGBufferStride) 234 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGRBGBufferInverted) 235 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGBRGBuffer) 236 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGBRGBufferStride) 237 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerGBRGBufferInverted) 238 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerRGGBBuffer) 239 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerRGGBBufferStride) 240 TEST_WEBRTCVIDEOFRAME(ConvertFromBayerRGGBBufferInverted) 241 TEST_WEBRTCVIDEOFRAME(ConvertFromI400Buffer) 242 TEST_WEBRTCVIDEOFRAME(ConvertFromI400BufferStride) 243 TEST_WEBRTCVIDEOFRAME(ConvertFromI400BufferInverted) 244 TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2Buffer) 245 TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2BufferStride) 246 TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2BufferInverted) 247 TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBuffer) 248 TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBufferStride) 249 TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBufferInverted) 250 // TEST_WEBRTCVIDEOFRAME(ConvertToI422Buffer) 251 TEST_WEBRTCVIDEOFRAME(ConvertARGBToBayerGRBG) 252 TEST_WEBRTCVIDEOFRAME(ConvertARGBToBayerGBRG) 253 TEST_WEBRTCVIDEOFRAME(ConvertARGBToBayerBGGR) 254 TEST_WEBRTCVIDEOFRAME(ConvertARGBToBayerRGGB) 255 TEST_WEBRTCVIDEOFRAME(CopyToBuffer) 256 TEST_WEBRTCVIDEOFRAME(CopyToFrame) 257 TEST_WEBRTCVIDEOFRAME(Write) 258 TEST_WEBRTCVIDEOFRAME(CopyToBuffer1Pixel) 259 // TEST_WEBRTCVIDEOFRAME(ConstructARGBBlackWhitePixel) 260 261 TEST_WEBRTCVIDEOFRAME(StretchToFrame) 262 TEST_WEBRTCVIDEOFRAME(Copy) 263 TEST_WEBRTCVIDEOFRAME(CopyIsRef) 264 TEST_WEBRTCVIDEOFRAME(MakeExclusive) 265 266 // These functions test implementation-specific details. 267 TEST_F(WebRtcVideoFrameTest, AttachAndRelease) { 268 cricket::WebRtcVideoFrame frame1, frame2; 269 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 270 const int64 time_stamp = 0x7FFFFFFFFFFFFFF0LL; 271 frame1.SetTimeStamp(time_stamp); 272 EXPECT_EQ(time_stamp, frame1.GetTimeStamp()); 273 frame2.Attach(frame1.frame()->Buffer(), frame1.frame()->Size(), 274 kWidth, kHeight, 1, 1, 275 frame1.GetElapsedTime(), frame1.GetTimeStamp(), 0); 276 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 277 uint8* buffer; 278 size_t size; 279 frame2.Detach(&buffer, &size); 280 EXPECT_EQ(frame1.frame()->Buffer(), buffer); 281 EXPECT_EQ(frame1.frame()->Size(), size); 282 EXPECT_TRUE(IsNull(frame2)); 283 EXPECT_TRUE(IsSize(frame1, kWidth, kHeight)); 284 } 285 286 TEST_F(WebRtcVideoFrameTest, Transfer) { 287 cricket::WebRtcVideoFrame frame1, frame2; 288 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 289 uint8* buffer; 290 size_t size; 291 frame1.Detach(&buffer, &size); 292 frame2.Attach(buffer, size, kWidth, kHeight, 1, 1, 293 frame1.GetElapsedTime(), frame1.GetTimeStamp(), 0); 294 EXPECT_TRUE(IsNull(frame1)); 295 EXPECT_TRUE(IsSize(frame2, kWidth, kHeight)); 296 } 297 298 // Tests the Init function with different cropped size. 299 TEST_F(WebRtcVideoFrameTest, InitEvenSize) { 300 TestInit(640, 360); 301 } 302 303 TEST_F(WebRtcVideoFrameTest, InitOddWidth) { 304 TestInit(601, 480); 305 } 306 307 TEST_F(WebRtcVideoFrameTest, InitOddHeight) { 308 TestInit(360, 765); 309 } 310 311 TEST_F(WebRtcVideoFrameTest, InitOddWidthHeight) { 312 TestInit(355, 1021); 313 } 314