Home | History | Annotate | Download | only in base
      1 /*
      2  * libjingle
      3  * Copyright 2008 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/gunit.h"
     29 #include "talk/media/base/videocommon.h"
     30 
     31 namespace cricket {
     32 
     33 TEST(VideoCommonTest, TestCanonicalFourCC) {
     34   // Canonical fourccs are not changed.
     35   EXPECT_EQ(FOURCC_I420, CanonicalFourCC(FOURCC_I420));
     36   // The special FOURCC_ANY value is not changed.
     37   EXPECT_EQ(FOURCC_ANY, CanonicalFourCC(FOURCC_ANY));
     38   // Aliases are translated to the canonical equivalent.
     39   EXPECT_EQ(FOURCC_I420, CanonicalFourCC(FOURCC_IYUV));
     40   EXPECT_EQ(FOURCC_I422, CanonicalFourCC(FOURCC_YU16));
     41   EXPECT_EQ(FOURCC_I444, CanonicalFourCC(FOURCC_YU24));
     42   EXPECT_EQ(FOURCC_YUY2, CanonicalFourCC(FOURCC_YUYV));
     43   EXPECT_EQ(FOURCC_YUY2, CanonicalFourCC(FOURCC_YUVS));
     44   EXPECT_EQ(FOURCC_UYVY, CanonicalFourCC(FOURCC_HDYC));
     45   EXPECT_EQ(FOURCC_UYVY, CanonicalFourCC(FOURCC_2VUY));
     46   EXPECT_EQ(FOURCC_MJPG, CanonicalFourCC(FOURCC_JPEG));
     47   EXPECT_EQ(FOURCC_MJPG, CanonicalFourCC(FOURCC_DMB1));
     48   EXPECT_EQ(FOURCC_BGGR, CanonicalFourCC(FOURCC_BA81));
     49   EXPECT_EQ(FOURCC_RAW, CanonicalFourCC(FOURCC_RGB3));
     50   EXPECT_EQ(FOURCC_24BG, CanonicalFourCC(FOURCC_BGR3));
     51   EXPECT_EQ(FOURCC_BGRA, CanonicalFourCC(FOURCC_CM32));
     52   EXPECT_EQ(FOURCC_RAW, CanonicalFourCC(FOURCC_CM24));
     53 }
     54 
     55 // Test conversion between interval and fps
     56 TEST(VideoCommonTest, TestVideoFormatFps) {
     57   EXPECT_EQ(VideoFormat::kMinimumInterval, VideoFormat::FpsToInterval(0));
     58   EXPECT_EQ(talk_base::kNumNanosecsPerSec / 20, VideoFormat::FpsToInterval(20));
     59   EXPECT_EQ(20, VideoFormat::IntervalToFps(talk_base::kNumNanosecsPerSec / 20));
     60 }
     61 
     62 // Test IsSize0x0
     63 TEST(VideoCommonTest, TestVideoFormatIsSize0x0) {
     64   VideoFormat format;
     65   EXPECT_TRUE(format.IsSize0x0());
     66   format.width = 320;
     67   EXPECT_FALSE(format.IsSize0x0());
     68 }
     69 
     70 // Test ToString: print fourcc when it is printable.
     71 TEST(VideoCommonTest, TestVideoFormatToString) {
     72   VideoFormat format;
     73   EXPECT_EQ("0x0x10000", format.ToString());
     74 
     75   format.fourcc = FOURCC_I420;
     76   format.width = 640;
     77   format.height = 480;
     78   format.interval = VideoFormat::FpsToInterval(20);
     79   EXPECT_EQ("I420 640x480x20", format.ToString());
     80 
     81   format.fourcc = FOURCC_ANY;
     82   format.width = 640;
     83   format.height = 480;
     84   format.interval = VideoFormat::FpsToInterval(20);
     85   EXPECT_EQ("640x480x20", format.ToString());
     86 }
     87 
     88 // Test comparison.
     89 TEST(VideoCommonTest, TestVideoFormatCompare) {
     90   VideoFormat format(640, 480, VideoFormat::FpsToInterval(20), FOURCC_I420);
     91   VideoFormat format2;
     92   EXPECT_NE(format, format2);
     93 
     94   // Same pixelrate, different fourcc.
     95   format2 = format;
     96   format2.fourcc = FOURCC_YUY2;
     97   EXPECT_NE(format, format2);
     98   EXPECT_FALSE(format.IsPixelRateLess(format2) ||
     99                format2.IsPixelRateLess(format2));
    100 
    101   format2 = format;
    102   format2.interval /= 2;
    103   EXPECT_TRUE(format.IsPixelRateLess(format2));
    104 
    105   format2 = format;
    106   format2.width *= 2;
    107   EXPECT_TRUE(format.IsPixelRateLess(format2));
    108 }
    109 
    110 TEST(VideoCommonTest, TestComputeScaleWithLowFps) {
    111   int scaled_width, scaled_height;
    112 
    113   // Request small enough. Expect no change.
    114   ComputeScale(2560, 1600, 5, &scaled_width, &scaled_height);
    115   EXPECT_EQ(2560, scaled_width);
    116   EXPECT_EQ(1600, scaled_height);
    117 
    118   // Request too many pixels. Expect 1/2 size.
    119   ComputeScale(4096, 2560, 5, &scaled_width, &scaled_height);
    120   EXPECT_EQ(2048, scaled_width);
    121   EXPECT_EQ(1280, scaled_height);
    122 
    123   // Request too many pixels and too wide and tall. Expect 1/4 size.
    124   ComputeScale(16000, 10000, 5, &scaled_width, &scaled_height);
    125   EXPECT_EQ(2000, scaled_width);
    126   EXPECT_EQ(1250, scaled_height);
    127 
    128   // Request too wide. (two 30 inch monitors). Expect 1/2 size.
    129   ComputeScale(5120, 1600, 5, &scaled_width, &scaled_height);
    130   EXPECT_EQ(2560, scaled_width);
    131   EXPECT_EQ(800, scaled_height);
    132 
    133   // Request too wide but not too many pixels. Expect 1/2 size.
    134   ComputeScale(8192, 1024, 5, &scaled_width, &scaled_height);
    135   EXPECT_EQ(4096, scaled_width);
    136   EXPECT_EQ(512, scaled_height);
    137 
    138   // Request too tall. Expect 1/4 size.
    139   ComputeScale(1024, 8192, 5, &scaled_width, &scaled_height);
    140   EXPECT_EQ(256, scaled_width);
    141   EXPECT_EQ(2048, scaled_height);
    142 }
    143 
    144 // Same as TestComputeScale but with 15 fps instead of 5 fps.
    145 TEST(VideoCommonTest, TestComputeScaleWithHighFps) {
    146   int scaled_width, scaled_height;
    147 
    148   // Request small enough but high fps. Expect 1/2 size.
    149   ComputeScale(2560, 1600, 15, &scaled_width, &scaled_height);
    150   EXPECT_EQ(1280, scaled_width);
    151   EXPECT_EQ(800, scaled_height);
    152 
    153   // Request too many pixels. Expect 1/2 size.
    154   ComputeScale(4096, 2560, 15, &scaled_width, &scaled_height);
    155   EXPECT_EQ(2048, scaled_width);
    156   EXPECT_EQ(1280, scaled_height);
    157 
    158   // Request too many pixels and too wide and tall. Expect 1/16 size.
    159   ComputeScale(64000, 40000, 15, &scaled_width, &scaled_height);
    160   EXPECT_EQ(4000, scaled_width);
    161   EXPECT_EQ(2500, scaled_height);
    162 
    163   // Request too wide. (two 30 inch monitors). Expect 1/2 size.
    164   ComputeScale(5120, 1600, 15, &scaled_width, &scaled_height);
    165   EXPECT_EQ(2560, scaled_width);
    166   EXPECT_EQ(800, scaled_height);
    167 
    168   // Request too wide but not too many pixels. Expect 1/2 size.
    169   ComputeScale(8192, 1024, 15, &scaled_width, &scaled_height);
    170   EXPECT_EQ(4096, scaled_width);
    171   EXPECT_EQ(512, scaled_height);
    172 
    173   // Request too tall. Expect 1/4 size.
    174   ComputeScale(1024, 8192, 15, &scaled_width, &scaled_height);
    175   EXPECT_EQ(256, scaled_width);
    176   EXPECT_EQ(2048, scaled_height);
    177 }
    178 
    179 TEST(VideoCommonTest, TestComputeCrop) {
    180   int cropped_width, cropped_height;
    181 
    182   // Request 16:9 to 16:9.  Expect no cropping.
    183   ComputeCrop(1280, 720,  // Crop size 16:9
    184               640, 360,  // Frame is 4:3
    185               1, 1,  // Normal 1:1 pixels
    186               0,
    187               &cropped_width, &cropped_height);
    188   EXPECT_EQ(640, cropped_width);
    189   EXPECT_EQ(360, cropped_height);
    190 
    191   // Request 4:3 to 16:9.  Expect vertical.
    192   ComputeCrop(640, 360,  // Crop size 16:9
    193               640, 480,  // Frame is 4:3
    194               1, 1,  // Normal 1:1 pixels
    195               0,
    196               &cropped_width, &cropped_height);
    197   EXPECT_EQ(640, cropped_width);
    198   EXPECT_EQ(360, cropped_height);
    199 
    200   // Request 16:9 to 4:3.  Expect horizontal crop.
    201   ComputeCrop(640, 480,  // Crop size 4:3
    202               640, 360,  // Frame is 16:9
    203               1, 1,  // Normal 1:1 pixels
    204               0,
    205               &cropped_width, &cropped_height);
    206   EXPECT_EQ(480, cropped_width);
    207   EXPECT_EQ(360, cropped_height);
    208 
    209   // Request 16:9 but VGA has 3:8 pixel aspect ratio. Expect no crop.
    210   // This occurs on HP4110 on OSX 10.5/10.6/10.7
    211   ComputeCrop(640, 360,  // Crop size 16:9
    212               640, 480,  // Frame is 4:3
    213               3, 8,  // Pixel aspect ratio is tall
    214               0,
    215               &cropped_width, &cropped_height);
    216   EXPECT_EQ(640, cropped_width);
    217   EXPECT_EQ(480, cropped_height);
    218 
    219   // Request 16:9 but QVGA has 15:11 pixel aspect ratio. Expect horizontal crop.
    220   // This occurs on Logitech B910 on OSX 10.5/10.6/10.7 in Hangouts.
    221   ComputeCrop(640, 360,  // Crop size 16:9
    222               320, 240,  // Frame is 4:3
    223               15, 11,  // Pixel aspect ratio is wide
    224               0,
    225               &cropped_width, &cropped_height);
    226   EXPECT_EQ(312, cropped_width);
    227   EXPECT_EQ(240, cropped_height);
    228 
    229   // Request 16:10 but QVGA has 15:11 pixel aspect ratio.
    230   // Expect horizontal crop.
    231   // This occurs on Logitech B910 on OSX 10.5/10.6/10.7 in gmail.
    232   ComputeCrop(640, 400,  // Crop size 16:10
    233               320, 240,  // Frame is 4:3
    234               15, 11,  // Pixel aspect ratio is wide
    235               0,
    236               &cropped_width, &cropped_height);
    237   EXPECT_EQ(280, cropped_width);
    238   EXPECT_EQ(240, cropped_height);
    239 
    240   // Request 16:9 but VGA has 6:5 pixel aspect ratio. Expect vertical crop.
    241   // This occurs on Logitech QuickCam Pro C9000 on OSX
    242   ComputeCrop(640, 360,  // Crop size 16:9
    243               640, 480,  // Frame is 4:3
    244               6, 5,  // Pixel aspect ratio is wide
    245               0,
    246               &cropped_width, &cropped_height);
    247   EXPECT_EQ(640, cropped_width);
    248   EXPECT_EQ(432, cropped_height);
    249 
    250   // Request 16:10 but HD is 16:9. Expect horizontal crop.
    251   // This occurs in settings and local preview with HD experiment.
    252   ComputeCrop(1280, 800,  // Crop size 16:10
    253               1280, 720,  // Frame is 4:3
    254               1, 1,  // Pixel aspect ratio is wide
    255               0,
    256               &cropped_width, &cropped_height);
    257   EXPECT_EQ(1152, cropped_width);
    258   EXPECT_EQ(720, cropped_height);
    259 
    260   // Request 16:9 but HD has 3:4 pixel aspect ratio. Expect vertical crop.
    261   // This occurs on Logitech B910 on OSX 10.5/10.6.7 but not OSX 10.6.8 or 10.7
    262   ComputeCrop(1280, 720,  // Crop size 16:9
    263               1280, 720,  // Frame is 4:3
    264               3, 4,  // Pixel aspect ratio is wide
    265               0,
    266               &cropped_width, &cropped_height);
    267   EXPECT_EQ(1280, cropped_width);
    268   EXPECT_EQ(540, cropped_height);
    269 
    270   // Request 16:9 to 3:4 (portrait).  Expect no cropping.
    271   ComputeCrop(640, 360,  // Crop size 16:9
    272               640, 480,  // Frame is 3:4 portrait
    273               1, 1,  // Normal 1:1 pixels
    274               90,
    275               &cropped_width, &cropped_height);
    276   EXPECT_EQ(640, cropped_width);
    277   EXPECT_EQ(480, cropped_height);
    278 
    279   // Cropped size 0x0.  Expect no cropping.
    280   // This is used when adding multiple capturers
    281   ComputeCrop(0, 0,  // Crop size 0x0
    282               1024, 768,  // Frame is 3:4 portrait
    283               1, 1,  // Normal 1:1 pixels
    284               0,
    285               &cropped_width, &cropped_height);
    286   EXPECT_EQ(1024, cropped_width);
    287   EXPECT_EQ(768, cropped_height);
    288 }
    289 
    290 }  // namespace cricket
    291