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