17cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde/* 233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp * Copyright 2011 The LibYuv Project Authors. All rights reserved. 37cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde * 47cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde * Use of this source code is governed by a BSD-style license 57cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde * that can be found in the LICENSE file in the root of the source 67cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde * tree. An additional intellectual property rights grant can be found 77cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde * in the file PATENTS. All contributing project authors may 87cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde * be found in the AUTHORS file in the root of the source tree. 97cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde */ 107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde#include <stdlib.h> 127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde#include <time.h> 137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/rotate.h" 1533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "../unit_test/unit_test.h" 167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampnamespace libyuv { 187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampvoid PrintArray(uint8 *array, int w, int h) { 2033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (int i = 0; i < h; ++i) { 2133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (int j = 0; j < w; ++j) { 2233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp printf("%4d", (signed char)array[i * w + j]); 2333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("\n"); 257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, Transpose) { 297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 8; iw < rotate_max_w_ && !err; ++iw) { 3333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = ih; 367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = iw; 377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 3933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_1, ow * oh) 4033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_2, iw * ih) 417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i; 4433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde TransposePlane(input, iw, output_1, ow, iw, ih); 477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde TransposePlane(output_1, ow, output_2, oh, ow, oh); 487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 5033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i] != output_2[i]) { 517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 5233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", iw, ih); 5733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("transpose 1\n"); 6033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_1, ow, oh); 617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("transpose 2\n"); 6333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_2, iw, ih); 647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 6733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_1) 6833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_2) 697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 7033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 727cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 737cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, TransposeUV) { 767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 16; iw < rotate_max_w_ && !err; iw += 2) { 8033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 837cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = ih; 847cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = iw >> 1; 857cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 8733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_a1, ow * oh) 8833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_b1, ow * oh) 8933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_a2, iw * ih) 9033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_b2, iw * ih) 917cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; i += 2) { 937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i >> 1; 947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i + 1] = -(i >> 1); 957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde TransposeUV(input, iw, output_a1, ow, output_b1, ow, iw >> 1, ih); 987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde TransposePlane(output_a1, ow, output_a2, oh, ow, oh); 1007cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde TransposePlane(output_b1, ow, output_b2, oh, ow, oh); 1017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; i += 2) { 10333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i] != output_a2[i >> 1]) { 1047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 10533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 10633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i + 1] != output_b2[i >> 1]) { 1077cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 10833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 1097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 1107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 1127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", iw, ih); 11333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 1147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1157cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("transpose 1\n"); 11633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_a1, ow, oh); 11733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_b1, ow, oh); 1187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("transpose 2\n"); 12033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_a2, oh, ow); 12133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_b2, oh, ow); 1227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 1237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 12533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_a1) 12633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_b1) 12733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_a2) 12833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_b2) 1297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 13033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 1317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 1337cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 1347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotatePlane90) { 1367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 1377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 1387cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 8; iw < rotate_max_w_ && !err; ++iw) { 14033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 1417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 1427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = ih; 1447cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = iw; 1457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 14733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0, iw * ih) 14833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_90, ow * oh) 14933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180, iw * ih) 15033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_270, ow * oh) 1517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 1537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i; 15433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 1557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(input, iw, output_90, ow, iw, ih); 1577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_90, ow, output_180, oh, ow, oh); 1587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_180, oh, output_270, ow, oh, ow); 1597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_270, ow, output_0, iw, ow, oh); 1607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 16133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 16233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i] != output_0[i]) { 1637cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 16433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 1657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 1667cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 1687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", iw, ih); 16933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 1707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 90\n"); 17233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_90, ow, oh); 1737cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180\n"); 17533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180, iw, ih); 1767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 270\n"); 17833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_270, ow, oh); 1797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0\n"); 18133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0, iw, ih); 1827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 1837cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 18433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 18533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0) 18633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_90) 18733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180) 18833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_270) 1897cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 19033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 1917cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1927cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 1937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 1947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 1957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotateUV90) { 1967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 1977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 1987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 19933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 16; iw < rotate_max_w_ && !err; iw += 2) { 20033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 2017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 2027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = ih; 2047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = iw >> 1; 2057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 20633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 20733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0_u, ow * oh) 20833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0_v, ow * oh) 20933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_90_u, ow * oh) 21033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_90_v, ow * oh) 21133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180_u, ow * oh) 21233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180_v, ow * oh) 2137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 21433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; i += 2) { 2157cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i >> 1; 2167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i + 1] = -(i >> 1); 2177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 2187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotateUV90(input, iw, output_90_u, ow, output_90_v, ow, iw >> 1, ih); 2207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_90_u, ow, output_180_u, oh, ow, oh); 2227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_90_v, ow, output_180_v, oh, ow, oh); 2237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane180(output_180_u, ow, output_0_u, ow, ow, oh); 2257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane180(output_180_v, ow, output_0_v, ow, ow, oh); 2267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < (ow * oh); ++i) { 22833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (output_0_u[i] != (uint8)i) { 2297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 23033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 23133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (output_0_v[i] != (uint8)(-i)) { 2327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 23333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 2347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 2357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 2377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", iw, ih); 23833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 2397cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2407cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 90_u\n"); 24133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_90_u, ow, oh); 2427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 90_v\n"); 24433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_90_v, ow, oh); 2457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180_u\n"); 24733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180_u, oh, ow); 2487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2497cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180_v\n"); 25033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180_v, oh, ow); 2517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0_u\n"); 25333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0_u, oh, ow); 2547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0_v\n"); 25633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0_v, oh, ow); 2577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 2587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 25933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 26033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0_u) 26133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0_v) 26233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_90_u) 26333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_90_v) 26433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180_u) 26533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180_v) 2667cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 26733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 2687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 2707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 2717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2727cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotateUV180) { 2737cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 2747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 2757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 27633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 16; iw < rotate_max_w_ && !err; iw += 2) { 27733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 2787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 2797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = iw >> 1; 2817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = ih; 2827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 28333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 28433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0_u, ow * oh) 28533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0_v, ow * oh) 28633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_90_u, ow * oh) 28733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_90_v, ow * oh) 28833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180_u, ow * oh) 28933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180_v, ow * oh) 2907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 29133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; i += 2) { 2927cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i >> 1; 2937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i + 1] = -(i >> 1); 2947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 2957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotateUV180(input, iw, output_180_u, ow, output_180_v, ow, iw >> 1, ih); 2977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 2987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_180_u, ow, output_90_u, oh, ow, oh); 2997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_180_v, ow, output_90_v, oh, ow, oh); 3007cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_90_u, oh, output_0_u, ow, oh, ow); 3027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_90_v, oh, output_0_v, ow, oh, ow); 3037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < (ow * oh); ++i) { 30533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (output_0_u[i] != (uint8)i) { 3067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 30733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 30833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (output_0_v[i] != (uint8)(-i)) { 3097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 31033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 3117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 3127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 3147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", iw, ih); 31533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 3167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180_u\n"); 31833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180_u, oh, ow); 3197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180_v\n"); 32133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180_v, oh, ow); 3227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 90_u\n"); 32433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_90_u, oh, ow); 3257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 90_v\n"); 32733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_90_v, oh, ow); 3287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0_u\n"); 33033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0_u, ow, oh); 3317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0_v\n"); 33333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0_v, ow, oh); 3347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 3357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 33633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 33733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0_u) 33833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0_v) 33933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_90_u) 34033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_90_v) 34133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180_u) 34233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180_v) 3437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 34433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 3457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 3477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 3487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3497cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotateUV270) { 3507cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 3517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 3527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 35333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 16; iw < rotate_max_w_ && !err; iw += 2) { 35433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 3557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 3567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = ih; 3587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = iw >> 1; 3597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 36033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 36133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0_u, ow * oh) 36233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0_v, ow * oh) 36333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_270_u, ow * oh) 36433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_270_v, ow * oh) 36533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180_u, ow * oh) 36633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180_v, ow * oh) 3677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 36833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; i += 2) { 3697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i >> 1; 3707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i + 1] = -(i >> 1); 3717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 3727cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3737cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotateUV270(input, iw, output_270_u, ow, output_270_v, ow, 3747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih); 3757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(output_270_u, ow, output_180_u, oh, ow, oh); 3777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(output_270_v, ow, output_180_v, oh, ow, oh); 3787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane180(output_180_u, ow, output_0_u, ow, ow, oh); 3807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane180(output_180_v, ow, output_0_v, ow, ow, oh); 3817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < (ow * oh); ++i) { 38333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (output_0_u[i] != (uint8)i) { 3847cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 38533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 38633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (output_0_v[i] != (uint8)(-i)) { 3877cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 38833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 3897cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 3907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3917cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 3927cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", iw, ih); 39333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 3947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 270_u\n"); 39633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_270_u, ow, oh); 3977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 3987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 270_v\n"); 39933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_270_v, ow, oh); 4007cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180_u\n"); 40233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180_u, oh, ow); 4037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180_v\n"); 40533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180_v, oh, ow); 4067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4077cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0_u\n"); 40833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0_u, oh, ow); 4097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0_v\n"); 41133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0_v, oh, ow); 4127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 4137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 41433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 41533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0_u) 41633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0_v) 41733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_270_u) 41833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_270_v) 41933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180_u) 42033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180_v) 4217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 42233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 4237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 4257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 4267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotatePlane180) { 4287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 4297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 4307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 43133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 8; iw < rotate_max_w_ && !err; ++iw) 43233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 4337cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 4347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = iw; 4367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = ih; 4377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 43833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 43933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0, iw * ih) 44033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180, iw * ih) 4417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 44233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 4437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i; 44433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 4457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane180(input, iw, output_180, ow, iw, ih); 4477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane180(output_180, ow, output_0, iw, ow, oh); 4487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 44933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 45033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i] != output_0[i]) { 4517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 45233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 4537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 4547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 4567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", iw, ih); 45733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 4587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180\n"); 46033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180, iw, ih); 4617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0\n"); 46333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0, iw, ih); 4647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 4657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 46633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 46733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0) 46833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180) 4697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 4707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 4727cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 4737cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotatePlane270) { 4757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 4767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 4777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 47833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 8; iw < rotate_max_w_ && !err; ++iw) { 47933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 4807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 4817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = ih; 4837cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = iw; 4847cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 48533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 48633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0, iw * ih) 48733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_90, ow * oh) 48833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_180, iw * ih) 48933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_270, ow * oh) 4907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 49133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) 4927cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i; 4937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 4947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(input, iw, output_270, ow, iw, ih); 4957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(output_270, ow, output_180, oh, ow, oh); 4967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(output_180, oh, output_90, ow, oh, ow); 4977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(output_90, ow, output_0, iw, ow, oh); 4987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 49933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 50033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i] != output_0[i]) { 5017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 50233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 5037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 5047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 5067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", iw, ih); 50733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 5087cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 270\n"); 51033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_270, ow, oh); 5117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 180\n"); 51333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_180, iw, ih); 5147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5157cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 90\n"); 51633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_90, ow, oh); 5177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output 0\n"); 51933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0, iw, ih); 5207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 5217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 52233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 52333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0) 52433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_90) 52533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_180) 52633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_270) 5277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 52833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 5297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 5317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 5327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5337cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotatePlane90and270) { 5347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 5357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 5367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 53733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 16; iw < rotate_max_w_ && !err; iw += 4) 53833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 16; ih < rotate_max_h_ && !err; ih += 4) { 5397cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 54033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp 5417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = ih; 5427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = iw; 5437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 54433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 54533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0, iw * ih) 54633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_90, ow * oh) 5477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 54833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 5497cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i; 55033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 5517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(input, iw, output_90, ow, iw, ih); 5537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(output_90, ow, output_0, iw, ow, oh); 5547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 55533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 55633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i] != output_0[i]) { 5577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 55833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 5597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 5607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 5627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("intput %dx%d\n", iw, ih); 56333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 5647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output \n"); 56633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_90, ow, oh); 5677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output \n"); 56933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0, iw, ih); 5707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 5717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 57233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 57333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0) 57433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_90) 5757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 5767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 5787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 5797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotatePlane90Pitch) { 5817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih; 5827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 5837cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 58433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 16; iw < rotate_max_w_ && !err; iw += 4) 58533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 16; ih < rotate_max_h_ && !err; ih += 4) { 5867cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 58733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp 5887cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int ow = ih; 5897cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int oh = iw; 5907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 59133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 59233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0, iw * ih) 59333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_90, ow * oh) 5947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 59533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 5967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i; 59733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 5987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 5997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(input, iw, 6007cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde output_90 + (ow >> 1), ow, 6017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih >> 1); 6027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(input + (iw >> 1), iw, 6037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde output_90 + (ow >> 1) + ow * (oh >> 1), ow, 6047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih >> 1); 6057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(input + iw * (ih >> 1), iw, 6067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde output_90, ow, 6077cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih >> 1); 6087cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(input + (iw >> 1) + iw * (ih >> 1), iw, 6097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde output_90 + ow * (oh >> 1), ow, 6107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih >> 1); 6117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(output_90, ih, output_0, iw, ow, oh); 6137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 61433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 61533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i] != output_0[i]) { 6167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 61733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 6187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 6197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 6217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("intput %dx%d\n", iw, ih); 62233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 6237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output \n"); 62533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_90, ow, oh); 6267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output \n"); 62833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0, iw, ih); 6297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 6307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 63133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 63233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0) 63333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_90) 6347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 6357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 6377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 6387cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6397cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, RotatePlane270Pitch) { 6407cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int iw, ih, ow, oh; 6417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 6427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 64333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (iw = 16; iw < rotate_max_w_ && !err; iw += 4) { 64433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (ih = 16; ih < rotate_max_h_ && !err; ih += 4) { 6457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i; 6467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ow = ih; 6487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde oh = iw; 6497cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 65033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(input, iw * ih) 65133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_0, iw * ih) 65233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(output_270, ow * oh) 6537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 65433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 6557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde input[i] = i; 65633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 6577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(input, iw, 6597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde output_270 + ow * (oh >> 1), ow, 6607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih >> 1); 6617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(input + (iw >> 1), iw, 6627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde output_270, ow, 6637cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih >> 1); 6647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(input + iw * (ih >> 1), iw, 6657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde output_270 + (ow >> 1) + ow * (oh >> 1), ow, 6667cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih >> 1); 6677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane270(input + (iw >> 1) + iw * (ih >> 1), iw, 6687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde output_270 + (ow >> 1), ow, 6697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde iw >> 1, ih >> 1); 6707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde RotatePlane90(output_270, ih, output_0, iw, ow, oh); 6727cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 67333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (i = 0; i < iw * ih; ++i) { 67433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (input[i] != output_0[i]) { 6757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde err++; 67633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 6777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 6787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (err) { 6807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("intput %dx%d\n", iw, ih); 68133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(input, iw, ih); 6827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6837cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output \n"); 68433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_270, ow, oh); 6857cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6867cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("output \n"); 68733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(output_0, iw, ih); 6887cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 6897cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 69033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(input) 69133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_0) 69233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(output_270) 6937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 69433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 6957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 6977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 6987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 6997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, I420Rotate90) { 7007cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 7017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yw = 1024; 7037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yh = 768; 7047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int b = 128; 7057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvw = (yw + 1) >> 1; 7067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvh = (yh + 1) >> 1; 7077cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7087cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i, j; 7097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 71033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_plane_size = (yw + b * 2) * (yh + b * 2); 71133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 7127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde srandom(time(NULL)); 7147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 71533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_y, y_plane_size) 71633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_u, uv_plane_size) 71733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_v, uv_plane_size) 71833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_y, y_plane_size) 71933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_u, uv_plane_size) 72033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_v, uv_plane_size) 72133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_y, y_plane_size) 72233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_u, uv_plane_size) 72333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_v, uv_plane_size) 72433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_y, y_plane_size) 72533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_u, uv_plane_size) 72633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_v, uv_plane_size) 72733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_y, 0, y_plane_size); 72833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_u, 0, uv_plane_size); 72933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_v, 0, uv_plane_size); 73033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_y, 0, y_plane_size); 73133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_u, 0, uv_plane_size); 73233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_v, 0, uv_plane_size); 73333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_y, 0, y_plane_size); 73433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_u, 0, uv_plane_size); 73533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_v, 0, uv_plane_size); 73633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_y, 0, y_plane_size); 73733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_u, 0, uv_plane_size); 73833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_v, 0, uv_plane_size); 7397cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7407cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde // fill image buffers with random data 7417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (yh + b); ++i) { 7427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (yw + b); ++j) { 74333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_y[i * (yw + b * 2) + j] = random() & 0xff; 7447cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 7457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 7467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (uvh + b); ++i) { 7487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (uvw + b); ++j) { 74933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_u[i * (uvw + b * 2) + j] = random() & 0xff; 75033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_v[i * (uvw + b * 2) + j] = random() & 0xff; 7517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 7527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 7537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 75433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_0 = b * (yw + b * 2) + b; 75533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_0 = b * (uvw + b * 2) + b; 75633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_90 = b * (yh + b * 2) + b; 75733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_90 = b * (uvh + b * 2) + b; 7587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 75933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_0 = yw + b * 2; 76033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_0 = uvw + b * 2; 76133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_90 = yh + b * 2; 76233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_90 = uvh + b * 2; 7637cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(orig_y+y_off_0, y_st_0, 7657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_u+uv_off_0, uv_st_0, 7667cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_v+uv_off_0, uv_st_0, 7677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_y+y_off_90, y_st_90, 7687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_u+uv_off_90, uv_st_90, 7697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_v+uv_off_90, uv_st_90, 7707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, yh, 7717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateClockwise); 7727cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7737cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(ro90_y+y_off_90, y_st_90, 7747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_u+uv_off_90, uv_st_90, 7757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_v+uv_off_90, uv_st_90, 7767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_y+y_off_90, y_st_90, 7777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_u+uv_off_90, uv_st_90, 7787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_v+uv_off_90, uv_st_90, 7797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yh, yw, 7807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotate180); 7817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(ro270_y+y_off_90, y_st_90, 7837cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_u+uv_off_90, uv_st_90, 7847cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_v+uv_off_90, uv_st_90, 7857cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_y+y_off_0, y_st_0, 7867cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_u+uv_off_0, uv_st_0, 7877cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_v+uv_off_0, uv_st_0, 7887cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yh, yw, 7897cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateClockwise); 7907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7917cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < y_plane_size; ++i) { 79233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (orig_y[i] != ro0_y[i]) { 7937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 79433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 7957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 7967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 7977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < uv_plane_size; ++i) { 79833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (orig_u[i] != ro0_u[i]) { 7997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 80033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 80133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (orig_v[i] != ro0_v[i]) { 8027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 80333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 8047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 8057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 80633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_y) 80733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_u) 80833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_v) 80933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_y) 81033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_u) 81133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_v) 81233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_y) 81333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_u) 81433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_v) 81533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_y) 81633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_u) 81733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_v) 8187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 8207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 8217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, I420Rotate270) { 8237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 8247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yw = 1024; 8267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yh = 768; 8277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int b = 128; 8287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvw = (yw + 1) >> 1; 8297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvh = (yh + 1) >> 1; 8307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i, j; 8327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 83333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_plane_size = (yw + b * 2) * (yh + b * 2); 83433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 8357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde srandom(time(NULL)); 8377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 83833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_y, y_plane_size) 83933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_u, uv_plane_size) 84033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_v, uv_plane_size) 84133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_y, y_plane_size) 84233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_u, uv_plane_size) 84333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_v, uv_plane_size) 84433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_y, y_plane_size) 84533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_u, uv_plane_size) 84633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_v, uv_plane_size) 84733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_y, y_plane_size) 84833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_u, uv_plane_size) 84933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_v, uv_plane_size) 85033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_y, 0, y_plane_size); 85133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_u, 0, uv_plane_size); 85233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_v, 0, uv_plane_size); 85333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_y, 0, y_plane_size); 85433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_u, 0, uv_plane_size); 85533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_v, 0, uv_plane_size); 85633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_y, 0, y_plane_size); 85733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_u, 0, uv_plane_size); 85833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_v, 0, uv_plane_size); 85933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_y, 0, y_plane_size); 86033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_u, 0, uv_plane_size); 86133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_v, 0, uv_plane_size); 8627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8637cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde // fill image buffers with random data 8647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (yh + b); ++i) { 8657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (yw + b); ++j) { 86633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_y[i * (yw + b * 2) + j] = random() & 0xff; 8677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 8687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 8697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (uvh + b); ++i) { 8717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (uvw + b); ++j) { 87233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_u[i * (uvw + b * 2) + j] = random() & 0xff; 87333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_v[i * (uvw + b * 2) + j] = random() & 0xff; 8747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 8757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 8767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 87733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_0 = b * (yw + b * 2) + b; 87833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_0 = b * (uvw + b * 2) + b; 87933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_90 = b * (yh + b * 2) + b; 88033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_90 = b * (uvh + b * 2) + b; 8817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 88233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_0 = yw + b * 2; 88333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_0 = uvw + b * 2; 88433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_90 = yh + b * 2; 88533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_90 = uvh + b * 2; 8867cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8877cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(orig_y+y_off_0, y_st_0, 8887cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_u+uv_off_0, uv_st_0, 8897cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_v+uv_off_0, uv_st_0, 8907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_y+y_off_90, y_st_90, 8917cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_u+uv_off_90, uv_st_90, 8927cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_v+uv_off_90, uv_st_90, 8937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, yh, 8947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateCounterClockwise); 8957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 8967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(ro270_y+y_off_90, y_st_90, 8977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_u+uv_off_90, uv_st_90, 8987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_v+uv_off_90, uv_st_90, 8997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_y+y_off_90, y_st_90, 9007cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_u+uv_off_90, uv_st_90, 9017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_v+uv_off_90, uv_st_90, 9027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yh, yw, 9037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotate180); 9047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(ro90_y+y_off_90, y_st_90, 9067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_u+uv_off_90, uv_st_90, 9077cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_v+uv_off_90, uv_st_90, 9087cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_y+y_off_0, y_st_0, 9097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_u+uv_off_0, uv_st_0, 9107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_v+uv_off_0, uv_st_0, 9117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yh, yw, 9127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateCounterClockwise); 9137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < y_plane_size; ++i) { 91533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (orig_y[i] != ro0_y[i]) { 9167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 91733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 9187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 9197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < uv_plane_size; ++i) { 92133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (orig_u[i] != ro0_u[i]) { 9227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 92333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 92433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (orig_v[i] != ro0_v[i]) { 9257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 92633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 9277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 9287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 92933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_y) 93033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_u) 93133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_v) 93233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_y) 93333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_u) 93433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_v) 93533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_y) 93633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_u) 93733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_v) 93833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_y) 93933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_u) 94033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_v) 9417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 9437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 9447cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, NV12ToI420Rotate90) { 9467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 9477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yw = 1024; 9497cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yh = 768; 9507cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int b = 128; 9517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvw = (yw + 1) >> 1; 9527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvh = (yh + 1) >> 1; 9537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i, j; 9547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 95533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_plane_size = (yw + b * 2) * (yh + b * 2); 95633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 95733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 9587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde srandom(time(NULL)); 9607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 96133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_y, y_plane_size) 96233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_uv, o_uv_plane_size) 96333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_y, y_plane_size) 96433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_u, uv_plane_size) 96533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_v, uv_plane_size) 96633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_y, y_plane_size) 96733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_u, uv_plane_size) 96833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro90_v, uv_plane_size) 96933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_y, 0, y_plane_size); 97033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_uv, 0, uv_plane_size); 97133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_y, 0, y_plane_size); 97233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_u, 0, uv_plane_size); 97333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_v, 0, uv_plane_size); 97433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_y, 0, y_plane_size); 97533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_u, 0, uv_plane_size); 97633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro90_v, 0, uv_plane_size); 9777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde // fill image buffers with random data 9797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (yh + b); ++i) { 9807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (yw + b); ++j) { 98133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_y[i * (yw + b * 2) + j] = random() & 0xff; 9827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 9837cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 9847cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 9857cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (uvh + b); ++i) { 98633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (j = b; j < (uvw * 2 + b); j += 2) { 9877cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde uint8 random_number = random() & 0x7f; 98833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 98933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 9907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 9917cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 9927cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 99333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_0 = b * (yw + b * 2) + b; 99433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_0 = b * (uvw + b * 2) + b; 99533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_90 = b * (yh + b * 2) + b; 99633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_90 = b * (uvh + b * 2) + b; 9977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 99833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_0 = yw + b * 2; 99933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_0 = uvw + b * 2; 100033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_90 = yh + b * 2; 100133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_90 = uvh + b * 2; 10027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde NV12ToI420Rotate(orig_y+y_off_0, y_st_0, 10047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_uv+y_off_0, y_st_0, 10057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_y+y_off_90, y_st_90, 10067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_u+uv_off_90, uv_st_90, 10077cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_v+uv_off_90, uv_st_90, 10087cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, yh, 10097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateClockwise); 10107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(ro90_y+y_off_90, y_st_90, 10127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_u+uv_off_90, uv_st_90, 10137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro90_v+uv_off_90, uv_st_90, 10147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_y+y_off_0, y_st_0, 10157cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_u+uv_off_0, uv_st_0, 10167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_v+uv_off_0, uv_st_0, 10177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yh, yw, 10187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateCounterClockwise); 10197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < y_plane_size; ++i) { 10217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (orig_y[i] != ro0_y[i]) 10227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 10237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 10247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int zero_cnt = 0; 10267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < uv_plane_size; ++i) { 102833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if ((signed char)ro0_u[i] != -(signed char)ro0_v[i]) { 10297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 103033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 103133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (ro0_u[i] != 0) { 10327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++zero_cnt; 103333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 10347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 10357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 103633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (!zero_cnt) { 10377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 103833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 10397cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 104033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_y) 104133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_uv) 104233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_y) 104333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_u) 104433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_v) 104533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_y) 104633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_u) 104733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro90_v) 10487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10497cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 10507cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 10517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, NV12ToI420Rotate270) { 10537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 10547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yw = 1024; 10567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yh = 768; 10577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int b = 128; 10587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvw = (yw + 1) >> 1; 10597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvh = (yh + 1) >> 1; 10607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i, j; 10627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 106333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_plane_size = (yw + b * 2) * (yh + b * 2); 106433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 106533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 10667cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde srandom(time(NULL)); 10687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 106933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_y, y_plane_size) 107033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_uv, o_uv_plane_size) 107133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_y, y_plane_size) 107233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_u, uv_plane_size) 107333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_v, uv_plane_size) 107433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_y, y_plane_size) 107533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_u, uv_plane_size) 107633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro270_v, uv_plane_size) 107733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_y, 0, y_plane_size); 107833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_uv, 0, o_uv_plane_size); 107933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_y, 0, y_plane_size); 108033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_u, 0, uv_plane_size); 108133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_v, 0, uv_plane_size); 108233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_y, 0, y_plane_size); 108333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_u, 0, uv_plane_size); 108433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro270_v, 0, uv_plane_size); 10857cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10867cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde // fill image buffers with random data 10877cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (yh + b); ++i) { 10887cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (yw + b); ++j) { 108933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_y[i * (yw + b * 2) + j] = random() & 0xff; 10907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 10917cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 10927cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 10937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (uvh + b); ++i) { 109433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (j = b; j < (uvw * 2 + b); j += 2) { 10957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde uint8 random_number = random() & 0x7f; 109633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 109733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 10987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 10997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 11007cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 110133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_0 = b * (yw + b * 2) + b; 110233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_0 = b * (uvw + b * 2) + b; 110333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_270 = b * (yh + b * 2) + b; 110433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_270 = b * (uvh + b * 2) + b; 11057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 110633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_0 = yw + b * 2; 110733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_0 = uvw + b * 2; 110833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_270 = yh + b * 2; 110933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_270 = uvh + b * 2; 11107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde NV12ToI420Rotate(orig_y+y_off_0, y_st_0, 11127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_uv+y_off_0, y_st_0, 11137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_y+y_off_270, y_st_270, 11147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_u+uv_off_270, uv_st_270, 11157cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_v+uv_off_270, uv_st_270, 11167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, yh, 11177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateCounterClockwise); 11187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(ro270_y+y_off_270, y_st_270, 11207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_u+uv_off_270, uv_st_270, 11217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro270_v+uv_off_270, uv_st_270, 11227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_y+y_off_0, y_st_0, 11237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_u+uv_off_0, uv_st_0, 11247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_v+uv_off_0, uv_st_0, 11257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yh, yw, 11267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateClockwise); 11277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < y_plane_size; ++i) { 11297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (orig_y[i] != ro0_y[i]) 11307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 11317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 11327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11337cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int zero_cnt = 0; 11347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < uv_plane_size; ++i) { 113633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if ((signed char)ro0_u[i] != -(signed char)ro0_v[i]) { 11377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 113833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 113933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (ro0_u[i] != 0) { 11407cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++zero_cnt; 114133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 11427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 11437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 114433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (!zero_cnt) { 11457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 114633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 11477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 114833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_y) 114933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_uv) 115033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_y) 115133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_u) 115233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_v) 115333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_y) 115433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_u) 115533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro270_v) 11567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 11587cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 11597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, NV12ToI420Rotate180) { 11617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int err = 0; 11627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11637cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yw = 1024; 11647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yh = 768; 11657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int b = 128; 11667cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvw = (yw + 1) >> 1; 11677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvh = (yh + 1) >> 1; 11687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i, j; 11707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 117133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_plane_size = (yw + b * 2) * (yh + b * 2); 117233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 117333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 11747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde srandom(time(NULL)); 11767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 117733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_y, y_plane_size) 117833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_uv, o_uv_plane_size) 117933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_y, y_plane_size) 118033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_u, uv_plane_size) 118133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro0_v, uv_plane_size) 118233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro180_y, y_plane_size) 118333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro180_u, uv_plane_size) 118433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(ro180_v, uv_plane_size) 118533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_y, 0, y_plane_size); 118633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_uv, 0, o_uv_plane_size); 118733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_y, 0, y_plane_size); 118833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_u, 0, uv_plane_size); 118933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro0_v, 0, uv_plane_size); 119033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro180_y, 0, y_plane_size); 119133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro180_u, 0, uv_plane_size); 119233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(ro180_v, 0, uv_plane_size); 11937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 11947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde // fill image buffers with random data 11957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (yh + b); ++i) { 11967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (yw + b); ++j) { 119733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_y[i * (yw + b * 2) + j] = random() & 0xff; 11987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 11997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 12007cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (uvh + b); ++i) { 120233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (j = b; j < (uvw * 2 + b); j += 2) { 12037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde uint8 random_number = random() & 0x7f; 120433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 120533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 12067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 12077cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 12087cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 120933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off = b * (yw + b * 2) + b; 121033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off = b * (uvw + b * 2) + b; 12117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 121233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st = yw + b * 2; 121333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st = uvw + b * 2; 12147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12157cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde NV12ToI420Rotate(orig_y+y_off, y_st, 12167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_uv+y_off, y_st, 12177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro180_y+y_off, y_st, 12187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro180_u+uv_off, uv_st, 12197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro180_v+uv_off, uv_st, 12207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, yh, 12217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotate180); 12227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(ro180_y+y_off, y_st, 12247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro180_u+uv_off, uv_st, 12257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro180_v+uv_off, uv_st, 12267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_y+y_off, y_st, 12277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_u+uv_off, uv_st, 12287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ro0_v+uv_off, uv_st, 12297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, yh, 12307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotate180); 12317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < y_plane_size; ++i) { 123333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (orig_y[i] != ro0_y[i]) { 12347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 123533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 12367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 12377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12387cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int zero_cnt = 0; 12397cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12407cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < uv_plane_size; ++i) { 124133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if ((signed char)ro0_u[i] != -(signed char)ro0_v[i]) { 12427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 124333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 124433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (ro0_u[i] != 0) { 12457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++zero_cnt; 124633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 12477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 12487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 124933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (!zero_cnt) { 12507cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++err; 125133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 12527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 125333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_y) 125433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_uv) 125533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_y) 125633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_u) 125733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro0_v) 125833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro180_y) 125933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro180_u) 126033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(ro180_v) 12617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, err); 12637cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 12647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, NV12ToI420RotateNegHeight90) { 12667cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int y_err = 0, uv_err = 0; 12677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yw = 1024; 12697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yh = 768; 12707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int b = 128; 12717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvw = (yw + 1) >> 1; 12727cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvh = (yh + 1) >> 1; 12737cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i, j; 12747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 127533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_plane_size = (yw + b * 2) * (yh + b * 2); 127633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 127733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 12787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 12797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde srandom(time(NULL)); 12807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 128133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_y, y_plane_size) 128233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_uv, o_uv_plane_size) 128333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roa_y, y_plane_size) 128433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roa_u, uv_plane_size) 128533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roa_v, uv_plane_size) 128633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(rob_y, y_plane_size) 128733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(rob_u, uv_plane_size) 128833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(rob_v, uv_plane_size) 128933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roc_y, y_plane_size) 129033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roc_u, uv_plane_size) 129133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roc_v, uv_plane_size) 129233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_y, 0, y_plane_size); 129333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_uv, 0, o_uv_plane_size); 129433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roa_y, 0, y_plane_size); 129533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roa_u, 0, uv_plane_size); 129633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roa_v, 0, uv_plane_size); 129733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(rob_y, 0, y_plane_size); 129833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(rob_u, 0, uv_plane_size); 129933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(rob_v, 0, uv_plane_size); 130033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roc_y, 0, y_plane_size); 130133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roc_u, 0, uv_plane_size); 130233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roc_v, 0, uv_plane_size); 13037cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde // fill image buffers with random data 13057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (yh + b); ++i) { 13067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (yw + b); ++j) { 130733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_y[i * (yw + b * 2) + j] = random() & 0xff; 13087cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 13097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 13107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (uvh + b); ++i) { 131233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (j = b; j < (uvw * 2 + b); j += 2) { 13137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde uint8 random_number = random() & 0x7f; 131433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 131533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 13167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 13177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 13187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 131933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_0 = b * (yw + b * 2) + b; 132033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_0 = b * (uvw + b * 2) + b; 132133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off_90 = b * (yh + b * 2) + b; 132233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off_90 = b * (uvh + b * 2) + b; 13237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 132433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_0 = yw + b * 2; 132533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_0 = uvw + b * 2; 132633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st_90 = yh + b * 2; 132733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st_90 = uvh + b * 2; 13287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde NV12ToI420Rotate(orig_y+y_off_0, y_st_0, 13307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_uv+y_off_0, y_st_0, 13317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_y+y_off_90, y_st_90, 13327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_u+uv_off_90, uv_st_90, 13337cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_v+uv_off_90, uv_st_90, 13347cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, -yh, 13357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateClockwise); 13367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(roa_y+y_off_90, y_st_90, 13387cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_u+uv_off_90, uv_st_90, 13397cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_v+uv_off_90, uv_st_90, 13407cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde rob_y+y_off_0, y_st_0, 13417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde rob_u+uv_off_0, uv_st_0, 13427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde rob_v+uv_off_0, uv_st_0, 13437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yh, -yw, 13447cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotateCounterClockwise); 13457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(rob_y+y_off_0, y_st_0, 13477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde rob_u+uv_off_0, uv_st_0, 13487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde rob_v+uv_off_0, uv_st_0, 13497cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roc_y+y_off_0, y_st_0, 13507cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roc_u+uv_off_0, uv_st_0, 13517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roc_v+uv_off_0, uv_st_0, 13527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, yh, 13537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotate180); 13547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < y_plane_size; ++i) { 135633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (orig_y[i] != roc_y[i]) { 13577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++y_err; 135833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 13597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 13607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (y_err) { 13627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", yw, yh); 136333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(orig_y, y_st_0, yh + b * 2); 13647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate a\n"); 136633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roa_y, y_st_90, y_st_0); 13677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate b\n"); 136933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(rob_y, y_st_90, y_st_0); 13707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate c\n"); 137233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roc_y, y_st_0, y_st_90); 13737cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 13747cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int zero_cnt = 0; 13767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < uv_plane_size; ++i) { 137833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if ((signed char)roc_u[i] != -(signed char)roc_v[i]) { 13797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++uv_err; 138033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 138133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (rob_u[i] != 0) { 13827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++zero_cnt; 138333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 13847cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 13857cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 138633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (!zero_cnt) { 13877cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++uv_err; 138833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 13897cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (uv_err) { 139133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp printf("input %dx%d \n", uvw * 2, uvh); 139233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(orig_uv, y_st_0, uvh + b * 2); 13937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate a\n"); 139533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roa_u, uv_st_90, uv_st_0); 139633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roa_v, uv_st_90, uv_st_0); 13977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 13987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate b\n"); 139933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(rob_u, uv_st_90, uv_st_0); 140033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(rob_v, uv_st_90, uv_st_0); 14017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate c\n"); 140333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roc_u, uv_st_0, uv_st_90); 140433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roc_v, uv_st_0, uv_st_90); 14057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 14067cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 140733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_y) 140833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_uv) 140933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roa_y) 141033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roa_u) 141133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roa_v) 141233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(rob_y) 141333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(rob_u) 141433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(rob_v) 141533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roc_y) 141633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roc_u) 141733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roc_v) 14187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, y_err + uv_err); 14207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 14217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri BordeTEST_F(libyuvTest, NV12ToI420RotateNegHeight180) { 14237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int y_err = 0, uv_err = 0; 14247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14257cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yw = 1024; 14267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int yh = 768; 14277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int b = 128; 14287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvw = (yw + 1) >> 1; 14297cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int uvh = (yh + 1) >> 1; 14307cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int i, j; 14317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 143233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_plane_size = (yw + b * 2) * (yh + b * 2); 143333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 143433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 14357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde srandom(time(NULL)); 14377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 143833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_y, y_plane_size) 143933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(orig_uv, o_uv_plane_size) 144033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roa_y, y_plane_size) 144133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roa_u, uv_plane_size) 144233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(roa_v, uv_plane_size) 144333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(rob_y, y_plane_size) 144433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(rob_u, uv_plane_size) 144533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp align_buffer_16(rob_v, uv_plane_size) 144633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_y, 0, y_plane_size); 144733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(orig_uv, 0, o_uv_plane_size); 144833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roa_y, 0, y_plane_size); 144933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roa_u, 0, uv_plane_size); 145033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(roa_v, 0, uv_plane_size); 145133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(rob_y, 0, y_plane_size); 145233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(rob_u, 0, uv_plane_size); 145333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp memset(rob_v, 0, uv_plane_size); 14547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde // fill image buffers with random data 14567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (yh + b); ++i) { 14577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (j = b; j < (yw + b); ++j) { 145833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_y[i * (yw + b * 2) + j] = random() & 0xff; 14597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 14607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 14617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = b; i < (uvh + b); ++i) { 146333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp for (j = b; j < (uvw * 2 + b); j += 2) { 14647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde uint8 random_number = random() & 0x7f; 146533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 146633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 14677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 14687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 14697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 147033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_off = b * (yw + b * 2) + b; 147133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_off = b * (uvw + b * 2) + b; 14727cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 147333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int y_st = yw + b * 2; 147433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp int uv_st = uvw + b * 2; 14757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde NV12ToI420Rotate(orig_y+y_off, y_st, 14777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde orig_uv+y_off, y_st, 14787cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_y+y_off, y_st, 14797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_u+uv_off, uv_st, 14807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_v+uv_off, uv_st, 14817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, -yh, 14827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotate180); 14837cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14847cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde I420Rotate(roa_y+y_off, y_st, 14857cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_u+uv_off, uv_st, 14867cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde roa_v+uv_off, uv_st, 14877cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde rob_y+y_off, y_st, 14887cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde rob_u+uv_off, uv_st, 14897cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde rob_v+uv_off, uv_st, 14907cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde yw, -yh, 14917cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde kRotate180); 14927cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14937cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < y_plane_size; ++i) { 14947cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (orig_y[i] != rob_y[i]) 14957cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++y_err; 14967cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 14977cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 14987cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (y_err) { 14997cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("input %dx%d \n", yw, yh); 150033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(orig_y, y_st, yh + b * 2); 15017cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15027cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate a\n"); 150333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roa_y, y_st, yh + b * 2); 15047cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15057cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate b\n"); 150633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(rob_y, y_st, yh + b * 2); 15077cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 15087cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15097cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde int zero_cnt = 0; 15107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15117cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde for (i = 0; i < uv_plane_size; ++i) { 151233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if ((signed char)rob_u[i] != -(signed char)rob_v[i]) { 15137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++uv_err; 151433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 151533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (rob_u[i] != 0) { 15167cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++zero_cnt; 151733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 15187cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 15197cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 152033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp if (!zero_cnt) { 15217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde ++uv_err; 152233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp } 15237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde if (uv_err) { 152533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp printf("input %dx%d \n", uvw * 2, uvh); 152633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(orig_uv, y_st, uvh + b * 2); 15277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate a\n"); 152933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roa_u, uv_st, uvh + b * 2); 153033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(roa_v, uv_st, uvh + b * 2); 15317cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15327cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde printf("rotate b\n"); 153333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(rob_u, uv_st, uvh + b * 2); 153433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp PrintArray(rob_v, uv_st, uvh + b * 2); 15357cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde } 15367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 153733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_y) 153833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(orig_uv) 153933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roa_y) 154033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roa_u) 154133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(roa_v) 154233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(rob_y) 154333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(rob_u) 154433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp free_aligned_buffer_16(rob_v) 15457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde 15467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde EXPECT_EQ(0, y_err + uv_err); 15477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde} 154833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp 154933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp} // namespace libyuv 1550