Home | History | Annotate | Download | only in webrtc
      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