19b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 29b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 39b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD 49b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 59b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 69b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * you may not use this file except in compliance with the License. 79b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * You may obtain a copy of the License at 89b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 99b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * http://www.apache.org/licenses/LICENSE-2.0 109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Unless required by applicable law or agreed to in writing, software 129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * See the License for the specific language governing permissions and 159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * limitations under the License. 169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @file swconvertor.c 209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @brief SEC_OMX specific define. It support MFC 6.x tiled. 229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @author ShinWon Lee (shinwon.lee@samsung.com) 249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @version 1.0 269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @history 289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 2012.02.01 : Create 299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang#include "stdio.h" 329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang#include "stdlib.h" 339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang#include "swconverter.h" 349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 2D Configurable tiled memory access (TM) 369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Return the linear address from tiled position (x, y) */ 379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changunsigned int Tile2D_To_Linear( 389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int width, 399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int height, 409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int xpos, 419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int ypos, 429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int crFlag) 439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int tileNumX; 459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int tileX, tileY; 469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int tileAddr; 479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int offset; 489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int addr; 499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang width = ((width + 15) / 16) * 16; 519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tileNumX = width / 16; 529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang /* crFlag - 0: Y plane, 1: CbCr plane */ 549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (crFlag == 0) { 559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tileX = xpos / 16; 569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tileY = ypos / 16; 579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tileAddr = tileY * tileNumX + tileX; 589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang offset = (ypos & 15) * 16 + (xpos & 15); 599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang addr = (tileAddr << 8) | offset; 609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } else { 619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tileX = xpos / 16; 629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tileY = ypos / 8; 639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tileAddr = tileY * tileNumX + tileX; 649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang offset = (ypos & 7) * 16 + (xpos & 15); 659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang addr = (tileAddr << 7) | offset; 669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang return addr; 699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * De-interleaves src to dest1, dest2 739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param dest1 759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of de-interleaved data[out] 769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param dest2 789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of de-interleaved data[out] 799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src 819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of interleaved data[in] 829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src_size 849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Size of interleaved data[in] 859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_deinterleave_memcpy( 879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *dest1, 889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *dest2, 899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *src, 909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int src_size) 919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i = 0; 939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for(i=0; i<src_size/2; i++) { 949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dest1[i] = src[i*2]; 959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dest2[i] = src[i*2+1]; 969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 1009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Interleaves src1, src2 to dest 1019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param dest 1039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of interleaved data[out] 1049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src1 1069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of de-interleaved data[in] 1079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src2 1099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of de-interleaved data[in] 1109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src_size 1129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Size of de-interleaved data[in] 1139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 1149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_interleave_memcpy( 1159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *dest, 1169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *src1, 1179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *src2, 1189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int src_size) 1199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 1209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i = 0; 1219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for(i=0; i<src_size; i++) { 1229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dest[i*2] = src1[i]; 1239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dest[i*2+1] = src2[i]; 1249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 1259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 1269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 1279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 1289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts tiled data to linear for mfc 6.x tiled 1299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1. y of nv12t to y of yuv420p 1309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 2. y of nv12t to y of yuv420s 1319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param dst 1339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * y address of yuv420[out] 1349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src 1369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * y address of nv12t[in] 1379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_width 1399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real width of yuv420[in] 1409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * it should be even 1419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_height 1439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real height of yuv420[in] 1449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * it should be even. 1459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 1479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_tiled_to_linear_y( 1489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *y_dst, 1499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *y_src, 1509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int width, 1519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int height) 1529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 1539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i, j, k; 1549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int aligned_width, aligned_height; 1559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int tiled_width; 1569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int src_offset, dst_offset; 1579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 1589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang aligned_height = height & (~0xF); 1599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang aligned_width = width & (~0xF); 1609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tiled_width = ((width + 15) >> 4) << 4; 1619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 1629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (i = 0; i < aligned_height; i = i + 16) { 1639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j<aligned_width; j = j + 16) { 1649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 4); 1659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = width * i + j; 1669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < 8; k++) { 1679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(y_dst + dst_offset, y_src + src_offset, 16); 1689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 1699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 1709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(y_dst + dst_offset, y_src + src_offset, 16); 1719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 1729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 1739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 1749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 1759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_width != width) { 1769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 4); 1779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = width * i + j; 1789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < 8; k++) { 1799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(y_dst + dst_offset, y_src + src_offset, width - j); 1809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 1819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 1829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(y_dst + dst_offset, y_src + src_offset, width - j); 1839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 1849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 1859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 1869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 1879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 1889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 1899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_height != height) { 1909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j<aligned_width; j = j + 16) { 1919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 4); 1929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = width * i + j; 1939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < height - aligned_height; k = k + 2) { 1949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(y_dst + dst_offset, y_src + src_offset, 16); 1959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 1969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 1979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(y_dst + dst_offset, y_src + src_offset, 16); 1989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 1999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_width != width) { 2039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 4); 2049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = width * i + j; 2059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < height - aligned_height; k = k + 2) { 2069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(y_dst + dst_offset, y_src + src_offset, width - j); 2079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 2089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(y_dst + dst_offset, y_src + src_offset, width - j); 2109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 2119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 2169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 2179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 2189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts tiled data to linear for mfc 6.x tiled 2199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1. uv of nv12t to uv of yuv420s 2209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 2219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param dst 2229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * uv address of yuv420s[out] 2239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 2249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src 2259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * uv address of nv12t[in] 2269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 2279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_width 2289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real width of yuv420s[in] 2299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 2309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_height 2319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real height of yuv420s[in] 2329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 2339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 2349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_tiled_to_linear_uv( 2359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *uv_dst, 2369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *uv_src, 2379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int width, 2389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int height) 2399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 2409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i, j, k; 2419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int aligned_width, aligned_height; 2429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int tiled_width; 2439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int src_offset, dst_offset; 2449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 2459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang aligned_height = height & (~0x7); 2469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang aligned_width = width & (~0xF); 2479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tiled_width = ((width + 15) >> 4) << 4; 2489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 2499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (i = 0; i < aligned_height; i = i + 8) { 2509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j<aligned_width; j = j + 16) { 2519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 3); 2529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = width * i + j; 2539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < 4; k++) { 2549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(uv_dst + dst_offset, uv_src + src_offset, 16); 2559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 2569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(uv_dst + dst_offset, uv_src + src_offset, 16); 2589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 2599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_width != width) { 2639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 3); 2649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = width * i + j; 2659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < 4; k++) { 2669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(uv_dst + dst_offset, uv_src + src_offset, width - j); 2679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 2689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(uv_dst + dst_offset, uv_src + src_offset, width - j); 2709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 2719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 2769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_height != height) { 2779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j<aligned_width; j = j + 16) { 2789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 3); 2799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = width * i + j; 2809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < height - aligned_height; k = k + 1) { 2819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(uv_dst + dst_offset, uv_src + src_offset, 16); 2829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 2839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_width != width) { 2879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 3); 2889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = width * i + j; 2899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < height - aligned_height; k = k + 1) { 2909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang memcpy(uv_dst + dst_offset, uv_src + src_offset, width - j); 2919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 2929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width; 2939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 2969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 2979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 2989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 2999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts tiled data to linear for mfc 6.x tiled 3009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1. uv of nt12t to uv of yuv420p 3019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 3029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param u_dst 3039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * u address of yuv420p[out] 3049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 3059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param v_dst 3069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * v address of yuv420p[out] 3079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 3089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param uv_src 3099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * uv address of nt12t[in] 3109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 3119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_width 3129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real width of yuv420p[in] 3139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 3149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_height 3159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real height of yuv420p[in] 3169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 3179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_tiled_to_linear_uv_deinterleave( 3189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *u_dst, 3199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *v_dst, 3209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *uv_src, 3219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int width, 3229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int height) 3239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 3249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i, j, k; 3259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int aligned_width, aligned_height; 3269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int tiled_width; 3279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int src_offset, dst_offset; 3289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 3299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang aligned_height = height & (~0x7); 3309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang aligned_width = width & (~0xF); 3319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tiled_width = ((width + 15) >> 4) << 4; 3329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 3339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (i = 0; i < aligned_height; i = i + 8) { 3349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j<aligned_width; j = j + 16) { 3359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 3); 3369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = (width >> 1) * i + (j >> 1); 3379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < 4; k++) { 3389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset, 3399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang uv_src + src_offset, 16); 3409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 3419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width >> 1; 3429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset, 3439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang uv_src + src_offset, 16); 3449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 3459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width >> 1; 3469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_width != width) { 3499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 3); 3509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = (width >> 1) * i + (j >> 1); 3519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < 4; k++) { 3529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset, 3539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang uv_src + src_offset, width - j); 3549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 3559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width >> 1; 3569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset, 3579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang uv_src + src_offset, width - j); 3589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 3599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width >> 1; 3609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_height != height) { 3649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j<aligned_width; j = j + 16) { 3659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 3); 3669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = (width >> 1) * i + (j >> 1); 3679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < height - aligned_height; k = k + 1) { 3689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset, 3699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang uv_src + src_offset, 16); 3709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 3719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width >> 1; 3729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if (aligned_width != width) { 3759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset = (tiled_width * i) + (j << 3); 3769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset = (width >> 1) * i + (j >> 1); 3779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; k < height - aligned_height; k = k + 1) { 3789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset, 3799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang uv_src + src_offset, width - j); 3809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang src_offset += 16; 3819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang dst_offset += width >> 1; 3829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 3859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 3869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 3879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 3889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts linear data to tiled 3899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * It supports mfc 6.x tiled 3909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1. y of yuv420 to y of nv12t 3919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 3929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param dst 3939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * y address of nv12t[out] 3949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 3959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src 3969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * y address of yuv420[in] 3979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 3989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_width 3999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real width of yuv420[in] 4009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * it should be even 4019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_height 4039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real height of yuv420[in] 4049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * it should be even. 4059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 4079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_linear_to_tiled_y( 4089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *y_dst, 4099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *y_src, 4109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int width, 4119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int height) 4129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 4139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 4149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 4159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 4169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 4179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts and interleaves linear data to tiled 4189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * It supports mfc 6.x tiled 4199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1. uv of nv12t to uv of yuv420 4209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param dst 4229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * uv address of nv12t[out] 4239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src 4259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * u address of yuv420[in] 4269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param src 4289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * v address of yuv420[in] 4299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_width 4319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real width of yuv420[in] 4329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_height 4349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * real height of yuv420[in] 4359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 4379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_linear_to_tiled_uv( 4389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *uv_dst, 4399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *u_src, 4409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *v_src, 4419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int width, 4429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int height) 4439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 4449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 4459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 4469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 4479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid Tile2D_To_YUV420(unsigned char *Y_plane, unsigned char *Cb_plane, unsigned char *Cr_plane, 4489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int y_addr, unsigned int c_addr, unsigned int width, unsigned int height) 4499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 4509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int x, y, j, k, l; 4519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int out_of_width, actual_width; 4529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int base_addr, data; 4539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 4549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang // y: 0, 16, 32, ... 4559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (y = 0; y < height; y += 16) { 4569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang // x: 0, 16, 32, ... 4579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (x = 0; x < width; x += 16) { 4589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang out_of_width = (x + 16) > width ? 1 : 0; 4599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang base_addr = y_addr + Tile2D_To_Linear(width, height, x, y, 0); 4609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 4619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; (k < 16) && ((y + k) < height); k++) { 4629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang actual_width = out_of_width ? ((width%4)?((width%16) / 4 + 1) : ((width%16) / 4)) : 4; 4639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (l = 0; l < actual_width; l++) { 4649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang data = *((unsigned int*)(base_addr + 16*k + l*4)); 4659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; (j < 4) && (x + l*4 + j) < width; j++) { 4669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y_plane[(y+k)*width + x + l*4 +j] = (data>>(8*j))&0xff; 4679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 4739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (y = 0; y < height/2; y += 8) { 4749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (x = 0; x < width; x += 16) { 4759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang out_of_width = (x + 16) > width ? 1 : 0; 4769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang base_addr = c_addr + Tile2D_To_Linear(width, height/2, x, y, 1); 4779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (k = 0; (k < 8) && ((y+k) < height/2); k++) { 4789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang actual_width = out_of_width ? ((width%4) ? ((width%16) / 4 + 1) : ((width%16) / 4)) : 4; 4799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (l = 0; l < actual_width; l++) { 4809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang data = *((unsigned int*)(base_addr + 16*k + l*4)); 4819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; (j < 2) && (x/2 + l*2 +j) < width/2; j++) { 4829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Cb_plane[(y+k)*width/2 + x/2 + l*2 +j] = (data>> (8*2*j))&0xff; 4839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Cr_plane[(y+k)*width/2 + x/2 + l*2 +j] = (data>>(8*2*j+8))&0xff; 4849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 4899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 4909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 4919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 4929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts RGB565 to YUV420P 4939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param y_dst 4959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Y plane address of YUV420P[out] 4969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 4979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param u_dst 4989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * U plane address of YUV420P[out] 4999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param v_dst 5019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * V plane address of YUV420P[out] 5029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param rgb_src 5049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of RGB565[in] 5059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param width 5079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Width of RGB565[in] 5089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param height 5109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Height of RGB565[in] 5119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 5129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_RGB565_to_YUV420P( 5139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *y_dst, 5149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *u_dst, 5159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *v_dst, 5169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *rgb_src, 5179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int width, 5189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int height) 5199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 5209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i, j; 5219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int tmp; 5229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int R, G, B; 5249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int Y, U, V; 5259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int offset1 = width * height; 5279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int offset2 = width/2 * height/2; 5289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned short int *pSrc = (unsigned short int *)rgb_src; 5309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstY = (unsigned char *)y_dst; 5329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstU = (unsigned char *)u_dst; 5339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstV = (unsigned char *)v_dst; 5349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int yIndex = 0; 5369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int uIndex = 0; 5379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int vIndex = 0; 5389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j < height; j++) { 5409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (i = 0; i < width; i++) { 5419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tmp = pSrc[j * width + i]; 5429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang R = (tmp & 0x0000F800) >> 8; 5449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang G = (tmp & 0x000007E0) >> 3; 5459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang B = (tmp & 0x0000001F); 5469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang B = B << 3; 5479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y = ((66 * R) + (129 * G) + (25 * B) + 128); 5499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y = Y >> 8; 5509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y += 16; 5519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstY[yIndex++] = (unsigned char)Y; 5539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if ((j % 2) == 0 && (i % 2) == 0) { 5559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U = ((-38 * R) - (74 * G) + (112 * B) + 128); 5569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U = U >> 8; 5579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U += 128; 5589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V = ((112 * R) - (94 * G) - (18 * B) + 128); 5599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V = V >> 8; 5609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V += 128; 5619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstU[uIndex++] = (unsigned char)U; 5639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstV[vIndex++] = (unsigned char)V; 5649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 5659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 5669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 5679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 5689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 5709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts RGB565 to YUV420SP 5719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param y_dst 5739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Y plane address of YUV420SP[out] 5749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param uv_dst 5769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * UV plane address of YUV420SP[out] 5779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param rgb_src 5799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of RGB565[in] 5809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param width 5829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Width of RGB565[in] 5839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 5849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param height 5859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Height of RGB565[in] 5869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 5879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_RGB565_to_YUV420SP( 5889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *y_dst, 5899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *uv_dst, 5909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *rgb_src, 5919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int width, 5929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang int height) 5939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 5949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i, j; 5959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int tmp; 5969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 5979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int R, G, B; 5989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int Y, U, V; 5999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int offset = width * height; 6019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned short int *pSrc = (unsigned short int *)rgb_src; 6039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstY = (unsigned char *)y_dst; 6059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstUV = (unsigned char *)uv_dst; 6069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int yIndex = 0; 6089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int uvIndex = 0; 6099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j < height; j++) { 6119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (i = 0; i < width; i++) { 6129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tmp = pSrc[j * width + i]; 6139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang R = (tmp & 0x0000F800) >> 11; 6159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang R = R * 8; 6169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang G = (tmp & 0x000007E0) >> 5; 6179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang G = G * 4; 6189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang B = (tmp & 0x0000001F); 6199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang B = B * 8; 6209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y = ((66 * R) + (129 * G) + (25 * B) + 128); 6229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y = Y >> 8; 6239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y += 16; 6249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstY[yIndex++] = (unsigned char)Y; 6269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if ((j % 2) == 0 && (i % 2) == 0) { 6289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U = ((-38 * R) - (74 * G) + (112 * B) + 128); 6299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U = U >> 8; 6309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U += 128; 6319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V = ((112 * R) - (94 * G) - (18 * B) + 128); 6329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V = V >> 8; 6339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V += 128; 6349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstUV[uvIndex++] = (unsigned char)U; 6369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstUV[uvIndex++] = (unsigned char)V; 6379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 6389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 6399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 6409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 6419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 6439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts RGB8888 to YUV420P 6449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 6459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param y_dst 6469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Y plane address of YUV420P[out] 6479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 6489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param u_dst 6499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * U plane address of YUV420P[out] 6509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 6519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param v_dst 6529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * V plane address of YUV420P[out] 6539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 6549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param rgb_src 6559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of ARGB8888[in] 6569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 6579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param width 6589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Width of ARGB8888[in] 6599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 6609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param height 6619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Height of ARGB8888[in] 6629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 6639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_ARGB8888_to_YUV420P( 6649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *y_dst, 6659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *u_dst, 6669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *v_dst, 6679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *rgb_src, 6689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int width, 6699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int height) 6709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 6719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i, j; 6729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int tmp; 6739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int R, G, B; 6759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int Y, U, V; 6769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int offset1 = width * height; 6789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int offset2 = width/2 * height/2; 6799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int *pSrc = (unsigned int *)rgb_src; 6819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstY = (unsigned char *)y_dst; 6839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstU = (unsigned char *)u_dst; 6849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstV = (unsigned char *)v_dst; 6859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int yIndex = 0; 6879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int uIndex = 0; 6889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int vIndex = 0; 6899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j < height; j++) { 6919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (i = 0; i < width; i++) { 6929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tmp = pSrc[j * width + i]; 6939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang R = (tmp & 0x00FF0000) >> 16; 6959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang G = (tmp & 0x0000FF00) >> 8; 6969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang B = (tmp & 0x000000FF); 6979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 6989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y = ((66 * R) + (129 * G) + (25 * B) + 128); 6999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y = Y >> 8; 7009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y += 16; 7019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstY[yIndex++] = (unsigned char)Y; 7039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if ((j % 2) == 0 && (i % 2) == 0) { 7059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U = ((-38 * R) - (74 * G) + (112 * B) + 128); 7069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U = U >> 8; 7079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U += 128; 7089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V = ((112 * R) - (94 * G) - (18 * B) + 128); 7099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V = V >> 8; 7109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V += 128; 7119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstU[uIndex++] = (unsigned char)U; 7139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstV[vIndex++] = (unsigned char)V; 7149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 7159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 7169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 7179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang} 7189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/* 7219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts ARGB8888 to YUV420S 7229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 7239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param y_dst 7249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Y plane address of YUV420S[out] 7259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 7269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param uv_dst 7279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * UV plane address of YUV420S[out] 7289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 7299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param rgb_src 7309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Address of ARGB8888[in] 7319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 7329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param width 7339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Width of ARGB8888[in] 7349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 7359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param height 7369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Height of ARGB8888[in] 7379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */ 7389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changvoid csc_ARGB8888_to_YUV420SP( 7399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *y_dst, 7409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *uv_dst, 7419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *rgb_src, 7429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int width, 7439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int height) 7449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang{ 7459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int i, j; 7469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int tmp; 7479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int R, G, B; 7499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int Y, U, V; 7509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int offset = width * height; 7529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int *pSrc = (unsigned int *)rgb_src; 7549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstY = (unsigned char *)y_dst; 7569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned char *pDstUV = (unsigned char *)uv_dst; 7579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int yIndex = 0; 7599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang unsigned int uvIndex = 0; 7609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (j = 0; j < height; j++) { 7629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang for (i = 0; i < width; i++) { 7639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang tmp = pSrc[j * width + i]; 7649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang R = (tmp & 0x00FF0000) >> 16; 7669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang G = (tmp & 0x0000FF00) >> 8; 7679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang B = (tmp & 0x000000FF); 7689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y = ((66 * R) + (129 * G) + (25 * B) + 128); 7709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y = Y >> 8; 7719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang Y += 16; 7729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstY[yIndex++] = (unsigned char)Y; 7749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang if ((j % 2) == 0 && (i % 2) == 0) { 7769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U = ((-38 * R) - (74 * G) + (112 * B) + 128); 7779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U = U >> 8; 7789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang U += 128; 7799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V = ((112 * R) - (94 * G) - (18 * B) + 128); 7809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V = V >> 8; 7819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang V += 128; 7829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang 7839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstUV[uvIndex++] = (unsigned char)U; 7849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang pDstUV[uvIndex++] = (unsigned char)V; 7859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 7869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 7879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang } 7889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang}