1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <math.h> 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h> 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 15026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "webrtc/common_video/interface/i420_video_frame.h" 16026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 17026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 18026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h" 19026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h" 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 233bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.orgint PrintBuffer(const uint8_t* buffer, int width, int height, int stride) { 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (buffer == NULL) 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 263bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int k; 273bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org const uint8_t* tmp_buffer = buffer; 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < height; i++) { 293bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org k = 0; 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int j = 0; j < width; j++) { 313bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org printf("%d ", tmp_buffer[k++]); 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 333bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org tmp_buffer += stride; 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf(" \n"); 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf(" \n"); 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 413bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.orgint PrintFrame(const I420VideoFrame* frame, const char* str) { 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (frame == NULL) 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 443bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org printf("%s %dx%d \n", str, frame->width(), frame->height()); 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int ret = 0; 473bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org for (int plane_num = 0; plane_num < kNumOfPlanes; ++plane_num) { 483bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org PlaneType plane_type = static_cast<PlaneType>(plane_num); 493bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int width = (plane_num ? (frame->width() + 1) / 2 : frame->width()); 503bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int height = (plane_num ? (frame->height() + 1) / 2 : frame->height()); 513bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org ret += PrintBuffer(frame->buffer(plane_type), width, height, 523bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org frame->stride(plane_type)); 533bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org } 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return ret; 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Create an image from on a YUV frame. Every plane value starts with a start 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// value, and will be set to increasing values. 603bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.orgvoid CreateImage(I420VideoFrame* frame, int plane_offset[kNumOfPlanes]) { 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (frame == NULL) 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 633bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org for (int plane_num = 0; plane_num < kNumOfPlanes; ++plane_num) { 643bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int width = (plane_num != kYPlane ? (frame->width() + 1) / 2 : 653bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org frame->width()); 663bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int height = (plane_num != kYPlane ? (frame->height() + 1) / 2 : 673bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org frame->height()); 683bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org PlaneType plane_type = static_cast<PlaneType>(plane_num); 693bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org uint8_t *data = frame->buffer(plane_type); 703bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org for (int i = 0; i < height; i++) { 713bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org for (int j = 0; j < width; j++) { 723bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org data[j] = static_cast<uint8_t>(i + plane_offset[plane_num] + j); 733bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org } 743bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org data += frame->stride(plane_type); 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass TestLibYuv : public ::testing::Test { 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TestLibYuv(); 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void SetUp(); 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void TearDown(); 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FILE* source_file_; 865be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org I420VideoFrame orig_frame_; 87ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> orig_buffer_; 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const int width_; 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const int height_; 905be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org const int size_y_; 915be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org const int size_uv_; 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const int frame_length_; 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTestLibYuv::TestLibYuv() 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org : source_file_(NULL), 975be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org orig_frame_(), 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org width_(352), 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org height_(288), 1005be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org size_y_(width_ * height_), 1015be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org size_uv_(((width_ + 1 ) / 2) * ((height_ + 1) / 2)), 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame_length_(CalcBufferSize(kI420, 352, 288)) { 1035be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org orig_buffer_.reset(new uint8_t[frame_length_]); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid TestLibYuv::SetUp() { 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string input_file_name = webrtc::test::ProjectRootPath() + 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "resources/foreman_cif.yuv"; 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org source_file_ = fopen(input_file_name.c_str(), "rb"); 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ASSERT_TRUE(source_file_ != NULL) << "Cannot read file: "<< 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org input_file_name << "\n"; 1125be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 1135be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(fread(orig_buffer_.get(), 1, frame_length_, source_file_), 1145be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org static_cast<unsigned int>(frame_length_)); 1155be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, orig_frame_.CreateFrame(size_y_, orig_buffer_.get(), 1165be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org size_uv_, orig_buffer_.get() + size_y_, 1175be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org size_uv_, orig_buffer_.get() + 1185be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org size_y_ + size_uv_, 1195be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org width_, height_, 1205be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org width_, (width_ + 1) / 2, 1215be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org (width_ + 1) / 2)); 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid TestLibYuv::TearDown() { 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (source_file_ != NULL) { 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ASSERT_EQ(0, fclose(source_file_)); 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org source_file_ = NULL; 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(TestLibYuv, ConvertSanityTest) { 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO(mikhal) 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(TestLibYuv, ConvertTest) { 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Reading YUV frame - testing on the first frame of the foreman sequence 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int j = 0; 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string output_file_name = webrtc::test::OutputPath() + 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "LibYuvTest_conversion.yuv"; 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FILE* output_file = fopen(output_file_name.c_str(), "wb"); 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ASSERT_TRUE(output_file != NULL); 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1435be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org double psnr = 0.0; 1445be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 1455be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org I420VideoFrame res_i420_frame; 1465be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0,res_i420_frame.CreateEmptyFrame(width_, height_, width_, 1475be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org (width_ + 1) / 2, 1485be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org (width_ + 1) / 2)); 1495be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org printf("\nConvert #%d I420 <-> I420 \n", j); 150ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]); 1515be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertFromI420(orig_frame_, kI420, 0, 1525be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org out_i420_buffer.get())); 1535be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kI420, out_i420_buffer.get(), 0, 0, 1545be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org width_, height_, 1555be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 0, kRotateNone, &res_i420_frame)); 1565be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 1575be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) { 1585be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org return; 1595be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org } 1605be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org psnr = I420PSNR(&orig_frame_, &res_i420_frame); 1615be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(48.0, psnr); 1625be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org j++; 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1643bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org printf("\nConvert #%d I420 <-> RGB24\n", j); 165ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> res_rgb_buffer2(new uint8_t[width_ * height_ * 3]); 1667012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org // Align the stride values for the output frame. 1677012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org int stride_y = 0; 1687012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org int stride_uv = 0; 1697012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org Calc16ByteAlignedStride(width_, &stride_y, &stride_uv); 1707012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org res_i420_frame.CreateEmptyFrame(width_, height_, stride_y, 1717012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org stride_uv, stride_uv); 1725be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertFromI420(orig_frame_, kRGB24, 0, res_rgb_buffer2.get())); 1733bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org 1743bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kRGB24, res_rgb_buffer2.get(), 0, 0, width_, 1753bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org height_, 0, kRotateNone, &res_i420_frame)); 1763bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org 1773bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) { 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1805be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org psnr = I420PSNR(&orig_frame_, &res_i420_frame); 1813bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Optimization Speed- quality trade-off => 45 dB only (platform dependant). 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_GT(ceil(psnr), 44); 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org j++; 1853bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org 1863bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org printf("\nConvert #%d I420 <-> UYVY\n", j); 187ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> out_uyvy_buffer(new uint8_t[width_ * height_ * 2]); 1885be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertFromI420(orig_frame_, kUYVY, 0, out_uyvy_buffer.get())); 1893bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kUYVY, out_uyvy_buffer.get(), 0, 0, width_, 1903bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org height_, 0, kRotateNone, &res_i420_frame)); 1915be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org psnr = I420PSNR(&orig_frame_, &res_i420_frame); 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(48.0, psnr); 1933bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) { 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org j++; 1973bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org 1983bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org printf("\nConvert #%d I420 <-> YV12\n", j); 199ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> outYV120Buffer(new uint8_t[frame_length_]); 200ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> res_i420_buffer(new uint8_t[frame_length_]); 2013bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org I420VideoFrame yv12_frame; 2025be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertFromI420(orig_frame_, kYV12, 0, outYV120Buffer.get())); 2035be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org yv12_frame.CreateFrame(size_y_, outYV120Buffer.get(), 2045be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org size_uv_, outYV120Buffer.get() + size_y_, 2055be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org size_uv_, outYV120Buffer.get() + size_y_ + size_uv_, 2063bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org width_, height_, 2073bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org width_, (width_ + 1) / 2, (width_ + 1) / 2); 2083bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, ConvertFromYV12(yv12_frame, kI420, 0, res_i420_buffer.get())); 2093bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (fwrite(res_i420_buffer.get(), 1, frame_length_, 2103bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org output_file) != static_cast<unsigned int>(frame_length_)) { 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2149787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org ConvertToI420(kI420, res_i420_buffer.get(), 0, 0, 2159787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org width_, height_, 0, kRotateNone, &res_i420_frame); 2169787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org psnr = I420PSNR(&orig_frame_, &res_i420_frame); 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(48.0, psnr); 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org j++; 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2203bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org printf("\nConvert #%d I420 <-> YUY2\n", j); 221ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> out_yuy2_buffer(new uint8_t[width_ * height_ * 2]); 2225be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertFromI420(orig_frame_, kYUY2, 0, out_yuy2_buffer.get())); 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2243bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kYUY2, out_yuy2_buffer.get(), 0, 0, width_, 2253bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org height_, 0, kRotateNone, &res_i420_frame)); 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2273bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) { 2285be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org return; 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 2303bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org 2315be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org psnr = I420PSNR(&orig_frame_, &res_i420_frame); 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(48.0, psnr); 2333bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org printf("\nConvert #%d I420 <-> RGB565\n", j); 234ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> out_rgb565_buffer(new uint8_t[width_ * height_ * 2]); 2355be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertFromI420(orig_frame_, kRGB565, 0, 2363bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org out_rgb565_buffer.get())); 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2383bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kRGB565, out_rgb565_buffer.get(), 0, 0, width_, 2393bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org height_, 0, kRotateNone, &res_i420_frame)); 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2413bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) { 2425be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org return; 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 2443bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org j++; 2453bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org 2465be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org psnr = I420PSNR(&orig_frame_, &res_i420_frame); 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO(leozwang) Investigate the right psnr should be set for I420ToRGB565, 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Another example is I420ToRGB24, the psnr is 44 2495be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org // TODO(mikhal): Add psnr for RGB565, 1555, 4444, convert to ARGB. 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_GT(ceil(psnr), 40); 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2523bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org printf("\nConvert #%d I420 <-> ARGB8888\n", j); 253ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> out_argb8888_buffer(new uint8_t[width_ * height_ * 4]); 2545be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertFromI420(orig_frame_, kARGB, 0, 2553bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org out_argb8888_buffer.get())); 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2573bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kARGB, out_argb8888_buffer.get(), 0, 0, width_, 2583bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org height_, 0, kRotateNone, &res_i420_frame)); 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2603bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) { 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 2633bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org 2645be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org psnr = I420PSNR(&orig_frame_, &res_i420_frame); 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO(leozwang) Investigate the right psnr should be set for I420ToARGB8888, 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_GT(ceil(psnr), 42); 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ASSERT_EQ(0, fclose(output_file)); 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 271052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.orgTEST_F(TestLibYuv, ConvertAlignedFrame) { 272052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org // Reading YUV frame - testing on the first frame of the foreman sequence 273052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org std::string output_file_name = webrtc::test::OutputPath() + 274052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org "LibYuvTest_conversion.yuv"; 275052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org FILE* output_file = fopen(output_file_name.c_str(), "wb"); 276052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org ASSERT_TRUE(output_file != NULL); 277052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org 278052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org double psnr = 0.0; 279052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org 280052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org I420VideoFrame res_i420_frame; 281052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org int stride_y = 0; 282052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org int stride_uv = 0; 283052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org Calc16ByteAlignedStride(width_, &stride_y, &stride_uv); 284052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org EXPECT_EQ(0,res_i420_frame.CreateEmptyFrame(width_, height_, 285052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org stride_y, stride_uv, stride_uv)); 286ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]); 287052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org EXPECT_EQ(0, ConvertFromI420(orig_frame_, kI420, 0, 288052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org out_i420_buffer.get())); 289052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kI420, out_i420_buffer.get(), 0, 0, 290052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org width_, height_, 291052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org 0, kRotateNone, &res_i420_frame)); 292052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org 293052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) { 294052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org return; 295052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org } 296052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org psnr = I420PSNR(&orig_frame_, &res_i420_frame); 297052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org EXPECT_EQ(48.0, psnr); 298052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org} 299052382e915c61ec2c59ca066d1498dafe5754424mikhal@webrtc.org 3005be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 3015be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.orgTEST_F(TestLibYuv, RotateTest) { 3025be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org // Use ConvertToI420 for multiple roatations - see that nothing breaks, all 3035be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org // memory is properly allocated and end result is equal to the starting point. 3045be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org I420VideoFrame rotated_res_i420_frame; 3055be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org int rotated_width = height_; 3065be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org int rotated_height = width_; 3075be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org int stride_y ; 3085be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org int stride_uv; 3095be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org Calc16ByteAlignedStride(rotated_width, &stride_y, &stride_uv); 3105be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0,rotated_res_i420_frame.CreateEmptyFrame(rotated_width, 3115be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org rotated_height, 3125be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org stride_y, 3135be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org stride_uv, 3145be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org stride_uv)); 3155be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer_.get(), 0, 0, 3165be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org width_, height_, 3175be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 0, kRotate90, &rotated_res_i420_frame)); 3185be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer_.get(), 0, 0, 3195be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org width_, height_, 3205be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 0, kRotate270, &rotated_res_i420_frame)); 3215be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0,rotated_res_i420_frame.CreateEmptyFrame(width_, height_, 3225be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org width_, (width_ + 1) / 2, 3235be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org (width_ + 1) / 2)); 3245be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer_.get(), 0, 0, 3255be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org width_, height_, 3265be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 0, kRotate180, &rotated_res_i420_frame)); 3275be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org} 3285be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org 3293bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.orgTEST_F(TestLibYuv, MirrorTest) { 3305be3165fad82f4b8b5d986fa567dde21584a13f8mikhal@webrtc.org // TODO(mikhal): Add an automated test to confirm output. 331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string str; 332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int width = 16; 3333bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int half_width = (width + 1) / 2; 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int height = 8; 3353bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int half_height = (height + 1) / 2; 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 3373bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org I420VideoFrame test_frame; 3383bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org test_frame.CreateEmptyFrame(width, height, width, 3393bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org half_width, half_width); 3403bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org memset(test_frame.buffer(kYPlane), 255, width * height); 3413bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org memset(test_frame.buffer(kUPlane), 255, half_width * half_height); 3423bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org memset(test_frame.buffer(kVPlane), 255, half_width * half_height); 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create input frame. 3453bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org I420VideoFrame in_frame, test_in_frame; 3463bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org in_frame.CreateEmptyFrame(width, height, width, 3473bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org half_width ,half_width); 3483bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int plane_offset[kNumOfPlanes]; 3493bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org plane_offset[kYPlane] = 10; 3503bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org plane_offset[kUPlane] = 100; 3513bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org plane_offset[kVPlane] = 200; 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CreateImage(&in_frame, plane_offset); 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, PrintFrame(&in_frame, "InputFrame")); 3543bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org test_in_frame.CopyFrame(in_frame); 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 3563bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org I420VideoFrame out_frame, test_out_frame; 3573bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org out_frame.CreateEmptyFrame(width, height, width, 3583bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org half_width ,half_width); 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CreateImage(&out_frame, plane_offset); 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_out_frame.CopyFrame(out_frame); 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Left-Right. 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Test Mirror function: LeftRight" << std::endl; 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, MirrorI420LeftRight(&in_frame, &out_frame)); 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, PrintFrame(&out_frame, "OutputFrame")); 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, MirrorI420LeftRight(&out_frame, &in_frame)); 367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 3683bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, memcmp(in_frame.buffer(kYPlane), 3693bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org test_in_frame.buffer(kYPlane), width * height)); 3703bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, memcmp(in_frame.buffer(kUPlane), 3713bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org test_in_frame.buffer(kUPlane), half_width * half_height)); 3723bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, memcmp(in_frame.buffer(kVPlane), 3733bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org test_in_frame.buffer(kVPlane), half_width * half_height)); 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // UpDown 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Test Mirror function: UpDown" << std::endl; 377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, MirrorI420UpDown(&in_frame, &out_frame)); 3785bf4e7d9eb702fec1945f848cf1e9738f51d70b6mikhal@webrtc.org EXPECT_EQ(0, PrintFrame(&out_frame, "OutputFrame")); 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, MirrorI420UpDown(&out_frame, &test_frame)); 3803bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, memcmp(in_frame.buffer(kYPlane), 3813bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org test_in_frame.buffer(kYPlane), width * height)); 3823bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, memcmp(in_frame.buffer(kUPlane), 3833bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org test_in_frame.buffer(kUPlane), half_width * half_height)); 3843bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org EXPECT_EQ(0, memcmp(in_frame.buffer(kVPlane), 3853bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org test_in_frame.buffer(kVPlane), half_width * half_height)); 386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO(mikhal): Write to a file, and ask to look at the file. 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Do the mirrored frames look correct?" << std::endl; 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(TestLibYuv, alignment) { 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int value = 0x3FF; // 1023 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0x400, AlignInt(value, 128)); // Low 7 bits are zero. 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0x400, AlignInt(value, 64)); // Low 6 bits are zero. 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0x400, AlignInt(value, 32)); // Low 5 bits are zero. 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 3997012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.orgTEST_F(TestLibYuv, StrideAlignment) { 4007012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org int stride_y = 0; 4017012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org int stride_uv = 0; 4027012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org int width = 52; 4037012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org Calc16ByteAlignedStride(width, &stride_y, &stride_uv); 4047012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org EXPECT_EQ(64, stride_y); 4057012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org EXPECT_EQ(32, stride_uv); 4067012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org width = 128; 4077012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org Calc16ByteAlignedStride(width, &stride_y, &stride_uv); 4087012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org EXPECT_EQ(128, stride_y); 4097012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org EXPECT_EQ(64, stride_uv); 4107012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org width = 127; 4117012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org Calc16ByteAlignedStride(width, &stride_y, &stride_uv); 4127012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org EXPECT_EQ(128, stride_y); 4137012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org EXPECT_EQ(64, stride_uv); 4147012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org} 4157012d2b0a89b5697dea51f17643bd40f2552a601mikhal@webrtc.org 416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace 417