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/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