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/media/base/videocommon.h" 29 #include "webrtc/base/gunit.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(rtc::kNumNanosecsPerSec / 20, VideoFormat::FpsToInterval(20)); 59 EXPECT_EQ(20, VideoFormat::IntervalToFps(rtc::kNumNanosecsPerSec / 20)); 60 EXPECT_EQ(0, VideoFormat::IntervalToFps(0)); 61 } 62 63 // Test IsSize0x0 64 TEST(VideoCommonTest, TestVideoFormatIsSize0x0) { 65 VideoFormat format; 66 EXPECT_TRUE(format.IsSize0x0()); 67 format.width = 320; 68 EXPECT_FALSE(format.IsSize0x0()); 69 } 70 71 // Test ToString: print fourcc when it is printable. 72 TEST(VideoCommonTest, TestVideoFormatToString) { 73 VideoFormat format; 74 EXPECT_EQ("0x0x0", format.ToString()); 75 76 format.fourcc = FOURCC_I420; 77 format.width = 640; 78 format.height = 480; 79 format.interval = VideoFormat::FpsToInterval(20); 80 EXPECT_EQ("I420 640x480x20", format.ToString()); 81 82 format.fourcc = FOURCC_ANY; 83 format.width = 640; 84 format.height = 480; 85 format.interval = VideoFormat::FpsToInterval(20); 86 EXPECT_EQ("640x480x20", format.ToString()); 87 } 88 89 // Test comparison. 90 TEST(VideoCommonTest, TestVideoFormatCompare) { 91 VideoFormat format(640, 480, VideoFormat::FpsToInterval(20), FOURCC_I420); 92 VideoFormat format2; 93 EXPECT_NE(format, format2); 94 95 // Same pixelrate, different fourcc. 96 format2 = format; 97 format2.fourcc = FOURCC_YUY2; 98 EXPECT_NE(format, format2); 99 EXPECT_FALSE(format.IsPixelRateLess(format2) || 100 format2.IsPixelRateLess(format2)); 101 102 format2 = format; 103 format2.interval /= 2; 104 EXPECT_TRUE(format.IsPixelRateLess(format2)); 105 106 format2 = format; 107 format2.width *= 2; 108 EXPECT_TRUE(format.IsPixelRateLess(format2)); 109 } 110 111 TEST(VideoCommonTest, TestComputeScaleWithLowFps) { 112 int scaled_width, scaled_height; 113 114 // Request small enough. Expect no change. 115 ComputeScale(2560, 1600, 5, &scaled_width, &scaled_height); 116 EXPECT_EQ(2560, scaled_width); 117 EXPECT_EQ(1600, scaled_height); 118 119 // Request too many pixels. Expect 1/2 size. 120 ComputeScale(4096, 2560, 5, &scaled_width, &scaled_height); 121 EXPECT_EQ(2048, scaled_width); 122 EXPECT_EQ(1280, scaled_height); 123 124 // Request too many pixels and too wide and tall. Expect 1/4 size. 125 ComputeScale(16000, 10000, 5, &scaled_width, &scaled_height); 126 EXPECT_EQ(2000, scaled_width); 127 EXPECT_EQ(1250, scaled_height); 128 129 // Request too wide. (two 30 inch monitors). Expect 1/2 size. 130 ComputeScale(5120, 1600, 5, &scaled_width, &scaled_height); 131 EXPECT_EQ(2560, scaled_width); 132 EXPECT_EQ(800, scaled_height); 133 134 // Request too wide but not too many pixels. Expect 1/2 size. 135 ComputeScale(8192, 1024, 5, &scaled_width, &scaled_height); 136 EXPECT_EQ(4096, scaled_width); 137 EXPECT_EQ(512, scaled_height); 138 139 // Request too tall. Expect 1/4 size. 140 ComputeScale(1024, 8192, 5, &scaled_width, &scaled_height); 141 EXPECT_EQ(256, scaled_width); 142 EXPECT_EQ(2048, scaled_height); 143 } 144 145 // Same as TestComputeScale but with 15 fps instead of 5 fps. 146 TEST(VideoCommonTest, TestComputeScaleWithHighFps) { 147 int scaled_width, scaled_height; 148 149 // Request small enough but high fps. Expect 1/2 size. 150 ComputeScale(2560, 1600, 15, &scaled_width, &scaled_height); 151 EXPECT_EQ(1280, scaled_width); 152 EXPECT_EQ(800, scaled_height); 153 154 // Request too many pixels. Expect 1/2 size. 155 ComputeScale(4096, 2560, 15, &scaled_width, &scaled_height); 156 EXPECT_EQ(2048, scaled_width); 157 EXPECT_EQ(1280, scaled_height); 158 159 // Request too many pixels and too wide and tall. Expect 1/16 size. 160 ComputeScale(64000, 40000, 15, &scaled_width, &scaled_height); 161 EXPECT_EQ(4000, scaled_width); 162 EXPECT_EQ(2500, scaled_height); 163 164 // Request too wide. (two 30 inch monitors). Expect 1/2 size. 165 ComputeScale(5120, 1600, 15, &scaled_width, &scaled_height); 166 EXPECT_EQ(2560, scaled_width); 167 EXPECT_EQ(800, scaled_height); 168 169 // Request too wide but not too many pixels. Expect 1/2 size. 170 ComputeScale(8192, 1024, 15, &scaled_width, &scaled_height); 171 EXPECT_EQ(4096, scaled_width); 172 EXPECT_EQ(512, scaled_height); 173 174 // Request too tall. Expect 1/4 size. 175 ComputeScale(1024, 8192, 15, &scaled_width, &scaled_height); 176 EXPECT_EQ(256, scaled_width); 177 EXPECT_EQ(2048, scaled_height); 178 } 179 180 TEST(VideoCommonTest, TestComputeCrop) { 181 int cropped_width, cropped_height; 182 183 // Request 16:9 to 16:9. Expect no cropping. 184 ComputeCrop(1280, 720, // Crop size 16:9 185 640, 360, // Frame is 4:3 186 1, 1, // Normal 1:1 pixels 187 0, 188 &cropped_width, &cropped_height); 189 EXPECT_EQ(640, cropped_width); 190 EXPECT_EQ(360, cropped_height); 191 192 // Request 4:3 to 16:9. Expect vertical. 193 ComputeCrop(640, 360, // Crop size 16:9 194 640, 480, // Frame is 4:3 195 1, 1, // Normal 1:1 pixels 196 0, 197 &cropped_width, &cropped_height); 198 EXPECT_EQ(640, cropped_width); 199 EXPECT_EQ(360, cropped_height); 200 201 // Request 16:9 to 4:3. Expect horizontal crop. 202 ComputeCrop(640, 480, // Crop size 4:3 203 640, 360, // Frame is 16:9 204 1, 1, // Normal 1:1 pixels 205 0, 206 &cropped_width, &cropped_height); 207 EXPECT_EQ(480, cropped_width); 208 EXPECT_EQ(360, cropped_height); 209 210 // Request 16:9 but VGA has 3:8 pixel aspect ratio. Expect no crop. 211 // This occurs on HP4110 on OSX 10.5/10.6/10.7 212 ComputeCrop(640, 360, // Crop size 16:9 213 640, 480, // Frame is 4:3 214 3, 8, // Pixel aspect ratio is tall 215 0, 216 &cropped_width, &cropped_height); 217 EXPECT_EQ(640, cropped_width); 218 EXPECT_EQ(480, cropped_height); 219 220 // Request 16:9 but QVGA has 15:11 pixel aspect ratio. Expect horizontal crop. 221 // This occurs on Logitech B910 on OSX 10.5/10.6/10.7 in Hangouts. 222 ComputeCrop(640, 360, // Crop size 16:9 223 320, 240, // Frame is 4:3 224 15, 11, // Pixel aspect ratio is wide 225 0, 226 &cropped_width, &cropped_height); 227 EXPECT_EQ(312, cropped_width); 228 EXPECT_EQ(240, cropped_height); 229 230 // Request 16:10 but QVGA has 15:11 pixel aspect ratio. 231 // Expect horizontal crop. 232 // This occurs on Logitech B910 on OSX 10.5/10.6/10.7 in gmail. 233 ComputeCrop(640, 400, // Crop size 16:10 234 320, 240, // Frame is 4:3 235 15, 11, // Pixel aspect ratio is wide 236 0, 237 &cropped_width, &cropped_height); 238 EXPECT_EQ(280, cropped_width); 239 EXPECT_EQ(240, cropped_height); 240 241 // Request 16:9 but VGA has 6:5 pixel aspect ratio. Expect vertical crop. 242 // This occurs on Logitech QuickCam Pro C9000 on OSX 243 ComputeCrop(640, 360, // Crop size 16:9 244 640, 480, // Frame is 4:3 245 6, 5, // Pixel aspect ratio is wide 246 0, 247 &cropped_width, &cropped_height); 248 EXPECT_EQ(640, cropped_width); 249 EXPECT_EQ(432, cropped_height); 250 251 // Request 16:10 but HD is 16:9. Expect horizontal crop. 252 // This occurs in settings and local preview with HD experiment. 253 ComputeCrop(1280, 800, // Crop size 16:10 254 1280, 720, // Frame is 4:3 255 1, 1, // Pixel aspect ratio is wide 256 0, 257 &cropped_width, &cropped_height); 258 EXPECT_EQ(1152, cropped_width); 259 EXPECT_EQ(720, cropped_height); 260 261 // Request 16:9 but HD has 3:4 pixel aspect ratio. Expect vertical crop. 262 // This occurs on Logitech B910 on OSX 10.5/10.6.7 but not OSX 10.6.8 or 10.7 263 ComputeCrop(1280, 720, // Crop size 16:9 264 1280, 720, // Frame is 4:3 265 3, 4, // Pixel aspect ratio is wide 266 0, 267 &cropped_width, &cropped_height); 268 EXPECT_EQ(1280, cropped_width); 269 EXPECT_EQ(540, cropped_height); 270 271 // Request 16:9 to 3:4 (portrait). Expect no cropping. 272 ComputeCrop(640, 360, // Crop size 16:9 273 640, 480, // Frame is 3:4 portrait 274 1, 1, // Normal 1:1 pixels 275 90, 276 &cropped_width, &cropped_height); 277 EXPECT_EQ(640, cropped_width); 278 EXPECT_EQ(480, cropped_height); 279 280 // Request 9:16 from VGA rotated (portrait). Expect crop. 281 ComputeCrop(360, 640, // Crop size 9:16 282 640, 480, // Frame is 3:4 portrait 283 1, 1, // Normal 1:1 pixels 284 90, 285 &cropped_width, &cropped_height); 286 EXPECT_EQ(640, cropped_width); 287 EXPECT_EQ(360, cropped_height); 288 289 // Cropped size 0x0. Expect no cropping. 290 // This is used when adding multiple capturers 291 ComputeCrop(0, 0, // Crop size 0x0 292 1024, 768, // Frame is 3:4 portrait 293 1, 1, // Normal 1:1 pixels 294 0, 295 &cropped_width, &cropped_height); 296 EXPECT_EQ(1024, cropped_width); 297 EXPECT_EQ(768, cropped_height); 298 } 299 300 TEST(VideoCommonTest, TestComputeScaleToSquarePixels) { 301 int scaled_width, scaled_height; 302 303 // Pixel aspect ratio is 4:3. Logical aspect ratio is 16:9. Expect scale 304 // to square pixels with physical aspect ratio of 16:9. 305 ComputeScaleToSquarePixels(640, 480, 306 4, 3, // 4 x 3 pixel aspect ratio 307 &scaled_width, &scaled_height); 308 EXPECT_EQ(640, scaled_width); 309 EXPECT_EQ(360, scaled_height); 310 311 // Pixel aspect ratio is 3:8. Physical aspect ratio is 4:3. Expect scale 312 // to square pixels with logical aspect ratio of 1:2. 313 // Note that 640x1280 will be scaled down by video adapter to view request 314 // of 640*360 and will end up using 320x640. 315 ComputeScaleToSquarePixels(640, 480, 316 3, 8, // 4 x 3 pixel aspect ratio 317 &scaled_width, &scaled_height); 318 EXPECT_EQ(640, scaled_width); 319 EXPECT_EQ(1280, scaled_height); 320 } 321 322 } // namespace cricket 323