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}