summaryrefslogtreecommitdiffstats
path: root/sec_mm/sec_omx/sec_codecs/video/mfc_c110/csc/color_space_convertor.c
diff options
context:
space:
mode:
Diffstat (limited to 'sec_mm/sec_omx/sec_codecs/video/mfc_c110/csc/color_space_convertor.c')
-rw-r--r--sec_mm/sec_omx/sec_codecs/video/mfc_c110/csc/color_space_convertor.c1092
1 files changed, 0 insertions, 1092 deletions
diff --git a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/csc/color_space_convertor.c b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/csc/color_space_convertor.c
deleted file mode 100644
index c1ac638..0000000
--- a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/csc/color_space_convertor.c
+++ /dev/null
@@ -1,1092 +0,0 @@
-/*
- *
- * Copyright 2011 Samsung Electronics S.LSI Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file color_space_convertor.c
- * @brief SEC_OMX specific define
- * @author ShinWon Lee (shinwon.lee@samsung.com)
- * @version 1.0
- * @history
- * 2011.7.01 : Create
- */
-
-#include "stdlib.h"
-#include "color_space_convertor.h"
-
-#define TILED_SIZE 64*32
-
-/*
- * De-interleaves src to dest1, dest2
- *
- * @param dest1
- * Address of de-interleaved data[out]
- *
- * @param dest2
- * Address of de-interleaved data[out]
- *
- * @param src
- * Address of interleaved data[in]
- *
- * @param src_size
- * Size of interleaved data[in]
- */
-void csc_deinterleave_memcpy(char *dest1, char *dest2, char *src, int src_size)
-{
- int i = 0;
- for(i=0; i<src_size/2; i++) {
- dest1[i] = src[i*2];
- dest2[i] = src[i*2+1];
- }
-}
-
-/*
- * Interleaves src1, src2 to dest
- *
- * @param dest
- * Address of interleaved data[out]
- *
- * @param src1
- * Address of de-interleaved data[in]
- *
- * @param src2
- * Address of de-interleaved data[in]
- *
- * @param src_size
- * Size of de-interleaved data[in]
- */
-void csc_interleave_memcpy(char *dest, char *src1, char *src2, int src_size)
-{
- int i = 0;
- for(i=0; i<src_size; i++) {
- dest[i*2] = src1[i];
- dest[i*2+1] = src2[i];
- }
-}
-
-/*
- * Converts tiled data to linear.
- * 1. Y of NV12T to Y of YUV420P
- * 2. Y of NV12T to Y of YUV420S
- * 3. UV of NV12T to UV of YUV420S
- *
- * @param yuv420_dest
- * Y or UV plane address of YUV420[out]
- *
- * @param nv12t_src
- * Y or UV plane address of NV12T[in]
- *
- * @param yuv420_width
- * Width of YUV420[in]
- *
- * @param yuv420_height
- * Y: Height of YUV420, UV: Height/2 of YUV420[in]
- */
-void csc_tiled_to_linear(char *yuv420_dest, char *nv12t_src, int yuv420_width, int yuv420_height)
-{
- unsigned int i, j;
- unsigned int tiled_x_index = 0, tiled_y_index = 0;
- unsigned int aligned_x_size = 0;
- unsigned int tiled_offset = 0, tiled_offset1 = 0, tiled_offset2 = 0, tiled_offset3 = 0;
- unsigned int temp1 = 0, temp2 = 0;
-
- if (yuv420_width >= 1024) {
- for (i=0; i<yuv420_height; i=i+1) {
- tiled_offset = 0;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+2;
- tiled_offset = tiled_offset<<11;
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- temp2 = 8;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- /* even fomula: x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- if ((i+32)<temp2) {
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*6;
- tiled_offset3 = tiled_offset+2048*7;
- temp2 = 8;
- } else {
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- temp2 = 4;
- }
- }
- temp1 = i&0x1F;
- memcpy(yuv420_dest+yuv420_width*(i), nv12t_src+tiled_offset+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*1, nv12t_src+tiled_offset1+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*2, nv12t_src+tiled_offset2+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*3, nv12t_src+tiled_offset3+64*(temp1), 64);
-
- tiled_offset = tiled_offset+temp2*2048;
- tiled_offset1 = tiled_offset1+temp2*2048;
- tiled_offset2 = tiled_offset2+temp2*2048;
- tiled_offset3 = tiled_offset3+temp2*2048;
- memcpy(yuv420_dest+yuv420_width*(i)+64*4, nv12t_src+tiled_offset+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*5, nv12t_src+tiled_offset1+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*6, nv12t_src+tiled_offset2+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*7, nv12t_src+tiled_offset3+64*(temp1), 64);
-
- tiled_offset = tiled_offset+temp2*2048;
- tiled_offset1 = tiled_offset1+temp2*2048;
- tiled_offset2 = tiled_offset2+temp2*2048;
- tiled_offset3 = tiled_offset3+temp2*2048;
- memcpy(yuv420_dest+yuv420_width*(i)+64*8, nv12t_src+tiled_offset+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*9, nv12t_src+tiled_offset1+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*10, nv12t_src+tiled_offset2+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*11, nv12t_src+tiled_offset3+64*(temp1), 64);
-
- tiled_offset = tiled_offset+temp2*2048;
- tiled_offset1 = tiled_offset1+temp2*2048;
- tiled_offset2 = tiled_offset2+temp2*2048;
- tiled_offset3 = tiled_offset3+temp2*2048;
- memcpy(yuv420_dest+yuv420_width*(i)+64*12, nv12t_src+tiled_offset+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*13, nv12t_src+tiled_offset1+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*14, nv12t_src+tiled_offset2+64*(temp1), 64);
- memcpy(yuv420_dest+yuv420_width*(i)+64*15, nv12t_src+tiled_offset3+64*(temp1), 64);
- }
- aligned_x_size = 1024;
- }
-
- if ((yuv420_width-aligned_x_size) >= 512) {
- for (i=0; i<yuv420_height; i=i+1) {
- tiled_offset = 0;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+2;
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- temp2 = 8;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- /* even fomula: x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- if ((i+32)<temp2) {
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*6;
- tiled_offset3 = tiled_offset+2048*7;
- temp2 = 8;
- } else {
- temp1 = aligned_x_size>>6;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- temp2 = 4;
- }
- }
- temp1 = i&0x1F;
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i), nv12t_src+tiled_offset+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*1, nv12t_src+tiled_offset1+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*2, nv12t_src+tiled_offset2+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*3, nv12t_src+tiled_offset3+64*(temp1), 64);
-
- tiled_offset = tiled_offset+temp2*2048;
- tiled_offset1 = tiled_offset1+temp2*2048;
- tiled_offset2 = tiled_offset2+temp2*2048;
- tiled_offset3 = tiled_offset3+temp2*2048;
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*4, nv12t_src+tiled_offset+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*5, nv12t_src+tiled_offset1+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*6, nv12t_src+tiled_offset2+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*7, nv12t_src+tiled_offset3+64*(temp1), 64);
- }
- aligned_x_size = aligned_x_size+512;
- }
-
- if ((yuv420_width-aligned_x_size) >= 256) {
- for (i=0; i<yuv420_height; i=i+1) {
- tiled_offset = 0;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+2;
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- /* even fomula: x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- if ((i+32)<temp2) {
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*6;
- tiled_offset3 = tiled_offset+2048*7;
- } else {
- temp1 = aligned_x_size>>6;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- }
- }
- temp1 = i&0x1F;
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i), nv12t_src+tiled_offset+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*1, nv12t_src+tiled_offset1+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*2, nv12t_src+tiled_offset2+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64*3, nv12t_src+tiled_offset3+64*(temp1), 64);
- }
- aligned_x_size = aligned_x_size+256;
- }
-
- if ((yuv420_width-aligned_x_size) >= 128) {
- for (i=0; i<yuv420_height; i=i+2) {
- tiled_offset = 0;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+2;
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- tiled_offset1 = tiled_offset+2048*1;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- /* even fomula: x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- if ((i+32)<temp2) {
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- } else {
- temp1 = aligned_x_size>>6;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- }
- }
- temp1 = i&0x1F;
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i), nv12t_src+tiled_offset+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i)+64, nv12t_src+tiled_offset1+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i+1), nv12t_src+tiled_offset+64*(temp1+1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i+1)+64, nv12t_src+tiled_offset1+64*(temp1+1), 64);
- }
- aligned_x_size = aligned_x_size+128;
- }
-
- if ((yuv420_width-aligned_x_size) >= 64) {
- for (i=0; i<yuv420_height; i=i+4) {
- tiled_offset = 0;
- tiled_x_index = aligned_x_size>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
-
- temp1 = i&0x1F;
- temp2 = aligned_x_size&0x3F;
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i), nv12t_src+tiled_offset+temp2+64*(temp1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i+1), nv12t_src+tiled_offset+temp2+64*(temp1+1), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i+2), nv12t_src+tiled_offset+temp2+64*(temp1+2), 64);
- memcpy(yuv420_dest+aligned_x_size+yuv420_width*(i+3), nv12t_src+tiled_offset+temp2+64*(temp1+3), 64);
- }
- aligned_x_size = aligned_x_size+64;
- }
-
- if (yuv420_width != aligned_x_size) {
- for (i=0; i<yuv420_height; i=i+4) {
- for (j=aligned_x_size; j<yuv420_width; j=j+4) {
- tiled_offset = 0;
- tiled_x_index = j>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
-
- temp1 = i&0x1F;
- temp2 = j&0x3F;
- memcpy(yuv420_dest+j+yuv420_width*(i), nv12t_src+tiled_offset+temp2+64*(temp1), 4);
- memcpy(yuv420_dest+j+yuv420_width*(i+1), nv12t_src+tiled_offset+temp2+64*(temp1+1), 4);
- memcpy(yuv420_dest+j+yuv420_width*(i+2), nv12t_src+tiled_offset+temp2+64*(temp1+2), 4);
- memcpy(yuv420_dest+j+yuv420_width*(i+3), nv12t_src+tiled_offset+temp2+64*(temp1+3), 4);
- }
- }
- }
-}
-
-/*
- * Converts and Deinterleaves tiled data to linear
- * 1. UV of NV12T to UV of YUV420P
- *
- * @param yuv420_u_dest
- * U plane address of YUV420P[out]
- *
- * @param yuv420_v_dest
- * V plane address of YUV420P[out]
- *
- * @param nv12t_src
- * UV plane address of NV12T[in]
- *
- * @param yuv420_width
- * Width of YUV420[in]
- *
- * @param yuv420_uv_height
- * Height/2 of YUV420[in]
- */
-void csc_tiled_to_linear_deinterleave(char *yuv420_u_dest, char *yuv420_v_dest, char *nv12t_uv_src, int yuv420_width, int yuv420_uv_height)
-{
- unsigned int i, j;
- unsigned int tiled_x_index = 0, tiled_y_index = 0;
- unsigned int aligned_x_size = 0;
- unsigned int tiled_offset = 0, tiled_offset1 = 0, tiled_offset2 = 0, tiled_offset3 = 0;
- unsigned int temp1 = 0, temp2 = 0;
-
- if (yuv420_width >= 1024) {
- for (i=0; i<yuv420_uv_height; i=i+1) {
- tiled_offset = 0;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+2;
- tiled_offset = tiled_offset<<11;
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- temp2 = 8;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- /* even fomula: x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- if ((i+32)<temp2) {
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*6;
- tiled_offset3 = tiled_offset+2048*7;
- temp2 = 8;
- } else {
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- temp2 = 4;
- }
- }
- temp1 = i&0x1F;
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i), yuv420_v_dest+yuv420_width/2*(i), nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*1, yuv420_v_dest+yuv420_width/2*(i)+32*1, nv12t_uv_src+tiled_offset1+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*2, yuv420_v_dest+yuv420_width/2*(i)+32*2, nv12t_uv_src+tiled_offset2+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*3, yuv420_v_dest+yuv420_width/2*(i)+32*3, nv12t_uv_src+tiled_offset3+64*(temp1), 64);
-
- tiled_offset = tiled_offset+temp2*2048;
- tiled_offset1 = tiled_offset1+temp2*2048;
- tiled_offset2 = tiled_offset2+temp2*2048;
- tiled_offset3 = tiled_offset3+temp2*2048;
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*4, yuv420_v_dest+yuv420_width/2*(i)+32*4, nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*5, yuv420_v_dest+yuv420_width/2*(i)+32*5, nv12t_uv_src+tiled_offset1+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*6, yuv420_v_dest+yuv420_width/2*(i)+32*6, nv12t_uv_src+tiled_offset2+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*7, yuv420_v_dest+yuv420_width/2*(i)+32*7, nv12t_uv_src+tiled_offset3+64*(temp1), 64);
-
- tiled_offset = tiled_offset+temp2*2048;
- tiled_offset1 = tiled_offset1+temp2*2048;
- tiled_offset2 = tiled_offset2+temp2*2048;
- tiled_offset3 = tiled_offset3+temp2*2048;
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*8, yuv420_v_dest+yuv420_width/2*(i)+32*8, nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*9, yuv420_v_dest+yuv420_width/2*(i)+32*9, nv12t_uv_src+tiled_offset1+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*10, yuv420_v_dest+yuv420_width/2*(i)+32*10, nv12t_uv_src+tiled_offset2+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*11, yuv420_v_dest+yuv420_width/2*(i)+32*11, nv12t_uv_src+tiled_offset3+64*(temp1), 64);
-
- tiled_offset = tiled_offset+temp2*2048;
- tiled_offset1 = tiled_offset1+temp2*2048;
- tiled_offset2 = tiled_offset2+temp2*2048;
- tiled_offset3 = tiled_offset3+temp2*2048;
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*12, yuv420_v_dest+yuv420_width/2*(i)+32*12, nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*13, yuv420_v_dest+yuv420_width/2*(i)+32*13, nv12t_uv_src+tiled_offset1+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*14, yuv420_v_dest+yuv420_width/2*(i)+32*14, nv12t_uv_src+tiled_offset2+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+yuv420_width/2*(i)+32*15, yuv420_v_dest+yuv420_width/2*(i)+32*15, nv12t_uv_src+tiled_offset3+64*(temp1), 64);
- }
- aligned_x_size = 1024;
- }
-
- if ((yuv420_width-aligned_x_size) >= 512) {
- for (i=0; i<yuv420_uv_height; i=i+1) {
- tiled_offset = 0;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+2;
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- temp2 = 8;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- /* even fomula: x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- if ((i+32)<temp2) {
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*6;
- tiled_offset3 = tiled_offset+2048*7;
- temp2 = 8;
- } else {
- temp1 = aligned_x_size>>6;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- temp2 = 4;
- }
- }
- temp1 = i&0x1F;
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i), yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i), nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*1, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*1, nv12t_uv_src+tiled_offset1+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*2, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*2, nv12t_uv_src+tiled_offset2+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*3, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*3, nv12t_uv_src+tiled_offset3+64*(temp1), 64);
-
- tiled_offset = tiled_offset+temp2*2048;
- tiled_offset1 = tiled_offset1+temp2*2048;
- tiled_offset2 = tiled_offset2+temp2*2048;
- tiled_offset3 = tiled_offset3+temp2*2048;
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*4, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*4, nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*5, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*5, nv12t_uv_src+tiled_offset1+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*6, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*6, nv12t_uv_src+tiled_offset2+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*7, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*7, nv12t_uv_src+tiled_offset3+64*(temp1), 64);
- }
- aligned_x_size = aligned_x_size+512;
- }
-
- if ((yuv420_width-aligned_x_size) >= 256) {
- for (i=0; i<yuv420_uv_height; i=i+1) {
- tiled_offset = 0;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+2;
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- /* even fomula: x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- if ((i+32)<temp2) {
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*6;
- tiled_offset3 = tiled_offset+2048*7;
- } else {
- temp1 = aligned_x_size>>6;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- tiled_offset2 = tiled_offset+2048*2;
- tiled_offset3 = tiled_offset+2048*3;
- }
- }
- temp1 = i&0x1F;
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i), yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i), nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*1, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*1, nv12t_uv_src+tiled_offset1+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*2, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*2, nv12t_uv_src+tiled_offset2+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*3, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*3, nv12t_uv_src+tiled_offset3+64*(temp1), 64);
- }
- aligned_x_size = aligned_x_size+256;
- }
-
- if ((yuv420_width-aligned_x_size) >= 128) {
- for (i=0; i<yuv420_uv_height; i=i+2) {
- tiled_offset = 0;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+2;
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- tiled_offset1 = tiled_offset+2048*1;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- /* even fomula: x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- if ((i+32)<temp2) {
- temp1 = aligned_x_size>>5;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- } else {
- temp1 = aligned_x_size>>6;
- tiled_offset = tiled_offset+(temp1<<11);
- tiled_offset1 = tiled_offset+2048*1;
- }
- }
- temp1 = i&0x1F;
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i), yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i), nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i)+32*1, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i)+32*1, nv12t_uv_src+tiled_offset1+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i+1), yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i+1), nv12t_uv_src+tiled_offset+64*(temp1+1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i+1)+32*1, yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i+1)+32*1, nv12t_uv_src+tiled_offset1+64*(temp1+1), 64);
- }
- aligned_x_size = aligned_x_size+128;
- }
-
- if ((yuv420_width-aligned_x_size) >= 64) {
- for (i=0; i<yuv420_uv_height; i=i+2) {
- tiled_offset = 0;
- tiled_x_index = aligned_x_size>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
- temp1 = i&0x1F;
- temp2 = aligned_x_size&0x3F;
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i), yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i), nv12t_uv_src+tiled_offset+64*(temp1), 64);
- csc_deinterleave_memcpy(yuv420_u_dest+aligned_x_size/2+yuv420_width/2*(i+1), yuv420_v_dest+aligned_x_size/2+yuv420_width/2*(i+1), nv12t_uv_src+tiled_offset+64*(temp1+1), 64);
- }
- aligned_x_size = aligned_x_size+64;
- }
-
- if (yuv420_width != aligned_x_size) {
- for (i=0; i<yuv420_uv_height; i=i+2) {
- for (j=aligned_x_size; j<yuv420_width; j=j+4) {
- tiled_offset = 0;
- tiled_x_index = j>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
- temp1 = i&0x1F;
- temp2 = j&0x3F;
- csc_deinterleave_memcpy(yuv420_u_dest+j/2+yuv420_width/2*(i), yuv420_v_dest+j/2+yuv420_width/2*(i), nv12t_uv_src+tiled_offset+temp2+64*(temp1), 4);
- csc_deinterleave_memcpy(yuv420_u_dest+j/2+yuv420_width/2*(i+1), yuv420_v_dest+j/2+yuv420_width/2*(i+1), nv12t_uv_src+tiled_offset+temp2+64*(temp1+1), 4);
- }
- }
- }
-}
-
-/*
- * Converts linear data to tiled.
- * 1. Y of YUV420P to Y of NV12T
- * 2. Y of YUV420S to Y of NV12T
- * 3. UV of YUV420S to UV of NV12T
- *
- * @param nv12t_dest
- * Y or UV plane address of NV12T[out]
- *
- * @param yuv420_src
- * Y or UV plane address of YUV420P(S)[in]
- *
- * @param yuv420_width
- * Width of YUV420[in]
- *
- * @param yuv420_height
- * Y: Height of YUV420, UV: Height/2 of YUV420[in]
- */
-void csc_linear_to_tiled(char *nv12t_dest, char *yuv420_src, int yuv420_width, int yuv420_height)
-{
- unsigned int i, j;
- unsigned int tiled_x_index = 0, tiled_y_index = 0;
- unsigned int aligned_x_size = 0, aligned_y_size = 0;
- unsigned int tiled_offset = 0;
- unsigned int temp1 = 0, temp2 = 0;
-
- aligned_y_size = (yuv420_height>>5)<<5;
- aligned_x_size = (yuv420_width>>6)<<6;
-
- for (i=0; i<aligned_y_size; i=i+32) {
- for (j=0; j<aligned_x_size; j=j+64) {
- tiled_offset = 0;
- tiled_x_index = j>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
-
- memcpy(nv12t_dest+tiled_offset, yuv420_src+j+yuv420_width*(i), 64);
- memcpy(nv12t_dest+tiled_offset+64*1, yuv420_src+j+yuv420_width*(i+1), 64);
- memcpy(nv12t_dest+tiled_offset+64*2, yuv420_src+j+yuv420_width*(i+2), 64);
- memcpy(nv12t_dest+tiled_offset+64*3, yuv420_src+j+yuv420_width*(i+3), 64);
- memcpy(nv12t_dest+tiled_offset+64*4, yuv420_src+j+yuv420_width*(i+4), 64);
- memcpy(nv12t_dest+tiled_offset+64*5, yuv420_src+j+yuv420_width*(i+5), 64);
- memcpy(nv12t_dest+tiled_offset+64*6, yuv420_src+j+yuv420_width*(i+6), 64);
- memcpy(nv12t_dest+tiled_offset+64*7, yuv420_src+j+yuv420_width*(i+7), 64);
- memcpy(nv12t_dest+tiled_offset+64*8, yuv420_src+j+yuv420_width*(i+8), 64);
- memcpy(nv12t_dest+tiled_offset+64*9, yuv420_src+j+yuv420_width*(i+9), 64);
- memcpy(nv12t_dest+tiled_offset+64*10, yuv420_src+j+yuv420_width*(i+10), 64);
- memcpy(nv12t_dest+tiled_offset+64*11, yuv420_src+j+yuv420_width*(i+11), 64);
- memcpy(nv12t_dest+tiled_offset+64*12, yuv420_src+j+yuv420_width*(i+12), 64);
- memcpy(nv12t_dest+tiled_offset+64*13, yuv420_src+j+yuv420_width*(i+13), 64);
- memcpy(nv12t_dest+tiled_offset+64*14, yuv420_src+j+yuv420_width*(i+14), 64);
- memcpy(nv12t_dest+tiled_offset+64*15, yuv420_src+j+yuv420_width*(i+15), 64);
- memcpy(nv12t_dest+tiled_offset+64*16, yuv420_src+j+yuv420_width*(i+16), 64);
- memcpy(nv12t_dest+tiled_offset+64*17, yuv420_src+j+yuv420_width*(i+17), 64);
- memcpy(nv12t_dest+tiled_offset+64*18, yuv420_src+j+yuv420_width*(i+18), 64);
- memcpy(nv12t_dest+tiled_offset+64*19, yuv420_src+j+yuv420_width*(i+19), 64);
- memcpy(nv12t_dest+tiled_offset+64*20, yuv420_src+j+yuv420_width*(i+20), 64);
- memcpy(nv12t_dest+tiled_offset+64*21, yuv420_src+j+yuv420_width*(i+21), 64);
- memcpy(nv12t_dest+tiled_offset+64*22, yuv420_src+j+yuv420_width*(i+22), 64);
- memcpy(nv12t_dest+tiled_offset+64*23, yuv420_src+j+yuv420_width*(i+23), 64);
- memcpy(nv12t_dest+tiled_offset+64*24, yuv420_src+j+yuv420_width*(i+24), 64);
- memcpy(nv12t_dest+tiled_offset+64*25, yuv420_src+j+yuv420_width*(i+25), 64);
- memcpy(nv12t_dest+tiled_offset+64*26, yuv420_src+j+yuv420_width*(i+26), 64);
- memcpy(nv12t_dest+tiled_offset+64*27, yuv420_src+j+yuv420_width*(i+27), 64);
- memcpy(nv12t_dest+tiled_offset+64*28, yuv420_src+j+yuv420_width*(i+28), 64);
- memcpy(nv12t_dest+tiled_offset+64*29, yuv420_src+j+yuv420_width*(i+29), 64);
- memcpy(nv12t_dest+tiled_offset+64*30, yuv420_src+j+yuv420_width*(i+30), 64);
- memcpy(nv12t_dest+tiled_offset+64*31, yuv420_src+j+yuv420_width*(i+31), 64);
- }
- }
-
- for (i=aligned_y_size; i<yuv420_height; i=i+4) {
- for (j=0; j<aligned_x_size; j=j+64) {
- tiled_offset = 0;
- tiled_x_index = j>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
-
- temp1 = i&0x1F;
- memcpy(nv12t_dest+tiled_offset+64*(temp1), yuv420_src+j+yuv420_width*(i), 64);
- memcpy(nv12t_dest+tiled_offset+64*(temp1+1), yuv420_src+j+yuv420_width*(i+1), 64);
- memcpy(nv12t_dest+tiled_offset+64*(temp1+2), yuv420_src+j+yuv420_width*(i+2), 64);
- memcpy(nv12t_dest+tiled_offset+64*(temp1+3), yuv420_src+j+yuv420_width*(i+3), 64);
- }
- }
-
- for (i=0; i<yuv420_height; i=i+4) {
- for (j=aligned_x_size; j<yuv420_width; j=j+4) {
- tiled_offset = 0;
- tiled_x_index = j>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
-
- temp1 = i&0x1F;
- temp2 = j&0x3F;
- memcpy(nv12t_dest+tiled_offset+temp2+64*(temp1), yuv420_src+j+yuv420_width*(i), 4);
- memcpy(nv12t_dest+tiled_offset+temp2+64*(temp1+1), yuv420_src+j+yuv420_width*(i+1), 4);
- memcpy(nv12t_dest+tiled_offset+temp2+64*(temp1+2), yuv420_src+j+yuv420_width*(i+2), 4);
- memcpy(nv12t_dest+tiled_offset+temp2+64*(temp1+3), yuv420_src+j+yuv420_width*(i+3), 4);
- }
- }
-}
-
-/*
- * Converts and Interleaves linear to tiled
- * 1. UV of YUV420P to UV of NV12T
- *
- * @param nv12t_uv_dest
- * UV plane address of NV12T[out]
- *
- * @param yuv420p_u_src
- * U plane address of YUV420P[in]
- *
- * @param yuv420p_v_src
- * V plane address of YUV420P[in]
- *
- * @param yuv420_width
- * Width of YUV420[in]
- *
- * @param yuv420_uv_height
- * Height/2 of YUV420[in]
- */
-void csc_linear_to_tiled_interleave(char *nv12t_uv_dest, char *yuv420p_u_src, char *yuv420p_v_src, int yuv420_width, int yuv420_uv_height)
-{
- unsigned int i, j;
- unsigned int tiled_x_index = 0, tiled_y_index = 0;
- unsigned int aligned_x_size = 0, aligned_y_size = 0;
- unsigned int tiled_offset = 0;
- unsigned int temp1 = 0, temp2 = 0;
-
- aligned_y_size = (yuv420_uv_height>>5)<<5;
- aligned_x_size = ((yuv420_width)>>6)<<6;
-
- for (i=0; i<aligned_y_size; i=i+32) {
- for (j=0; j<aligned_x_size; j=j+64) {
- tiled_offset = 0;
- tiled_x_index = j>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset, yuv420p_u_src+j/2+yuv420_width/2*(i), yuv420p_v_src+j/2+yuv420_width/2*(i), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*1, yuv420p_u_src+j/2+yuv420_width/2*(i+1), yuv420p_v_src+j/2+yuv420_width/2*(i+1), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*2, yuv420p_u_src+j/2+yuv420_width/2*(i+2), yuv420p_v_src+j/2+yuv420_width/2*(i+2), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*3, yuv420p_u_src+j/2+yuv420_width/2*(i+3), yuv420p_v_src+j/2+yuv420_width/2*(i+3), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*4, yuv420p_u_src+j/2+yuv420_width/2*(i+4), yuv420p_v_src+j/2+yuv420_width/2*(i+4), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*5, yuv420p_u_src+j/2+yuv420_width/2*(i+5), yuv420p_v_src+j/2+yuv420_width/2*(i+5), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*6, yuv420p_u_src+j/2+yuv420_width/2*(i+6), yuv420p_v_src+j/2+yuv420_width/2*(i+6), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*7, yuv420p_u_src+j/2+yuv420_width/2*(i+7), yuv420p_v_src+j/2+yuv420_width/2*(i+7), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*8, yuv420p_u_src+j/2+yuv420_width/2*(i+8), yuv420p_v_src+j/2+yuv420_width/2*(i+8), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*9, yuv420p_u_src+j/2+yuv420_width/2*(i+9), yuv420p_v_src+j/2+yuv420_width/2*(i+9), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*10, yuv420p_u_src+j/2+yuv420_width/2*(i+10), yuv420p_v_src+j/2+yuv420_width/2*(i+10), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*11, yuv420p_u_src+j/2+yuv420_width/2*(i+11), yuv420p_v_src+j/2+yuv420_width/2*(i+11), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*12, yuv420p_u_src+j/2+yuv420_width/2*(i+12), yuv420p_v_src+j/2+yuv420_width/2*(i+12), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*13, yuv420p_u_src+j/2+yuv420_width/2*(i+13), yuv420p_v_src+j/2+yuv420_width/2*(i+13), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*14, yuv420p_u_src+j/2+yuv420_width/2*(i+14), yuv420p_v_src+j/2+yuv420_width/2*(i+14), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*15, yuv420p_u_src+j/2+yuv420_width/2*(i+15), yuv420p_v_src+j/2+yuv420_width/2*(i+15), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*16, yuv420p_u_src+j/2+yuv420_width/2*(i+16), yuv420p_v_src+j/2+yuv420_width/2*(i+16), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*17, yuv420p_u_src+j/2+yuv420_width/2*(i+17), yuv420p_v_src+j/2+yuv420_width/2*(i+17), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*18, yuv420p_u_src+j/2+yuv420_width/2*(i+18), yuv420p_v_src+j/2+yuv420_width/2*(i+18), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*19, yuv420p_u_src+j/2+yuv420_width/2*(i+19), yuv420p_v_src+j/2+yuv420_width/2*(i+19), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*20, yuv420p_u_src+j/2+yuv420_width/2*(i+20), yuv420p_v_src+j/2+yuv420_width/2*(i+20), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*21, yuv420p_u_src+j/2+yuv420_width/2*(i+21), yuv420p_v_src+j/2+yuv420_width/2*(i+21), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*22, yuv420p_u_src+j/2+yuv420_width/2*(i+22), yuv420p_v_src+j/2+yuv420_width/2*(i+22), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*23, yuv420p_u_src+j/2+yuv420_width/2*(i+23), yuv420p_v_src+j/2+yuv420_width/2*(i+23), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*24, yuv420p_u_src+j/2+yuv420_width/2*(i+24), yuv420p_v_src+j/2+yuv420_width/2*(i+24), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*25, yuv420p_u_src+j/2+yuv420_width/2*(i+25), yuv420p_v_src+j/2+yuv420_width/2*(i+25), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*26, yuv420p_u_src+j/2+yuv420_width/2*(i+26), yuv420p_v_src+j/2+yuv420_width/2*(i+26), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*27, yuv420p_u_src+j/2+yuv420_width/2*(i+27), yuv420p_v_src+j/2+yuv420_width/2*(i+27), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*28, yuv420p_u_src+j/2+yuv420_width/2*(i+28), yuv420p_v_src+j/2+yuv420_width/2*(i+28), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*29, yuv420p_u_src+j/2+yuv420_width/2*(i+29), yuv420p_v_src+j/2+yuv420_width/2*(i+29), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*30, yuv420p_u_src+j/2+yuv420_width/2*(i+30), yuv420p_v_src+j/2+yuv420_width/2*(i+30), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*31, yuv420p_u_src+j/2+yuv420_width/2*(i+31), yuv420p_v_src+j/2+yuv420_width/2*(i+31), 32);
- }
- }
-
- for (i=aligned_y_size; i<yuv420_uv_height; i=i+4) {
- for (j=0; j<aligned_x_size; j=j+64) {
- tiled_offset = 0;
- tiled_x_index = j>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
- temp1 = i&0x1F;
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*(temp1), yuv420p_u_src+j/2+yuv420_width/2*(i), yuv420p_v_src+j/2+yuv420_width/2*(i), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*(temp1+1), yuv420p_u_src+j/2+yuv420_width/2*(i+1), yuv420p_v_src+j/2+yuv420_width/2*(i+1), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*(temp1+2), yuv420p_u_src+j/2+yuv420_width/2*(i+2), yuv420p_v_src+j/2+yuv420_width/2*(i+2), 32);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+64*(temp1+3), yuv420p_u_src+j/2+yuv420_width/2*(i+3), yuv420p_v_src+j/2+yuv420_width/2*(i+3), 32);
- }
- }
-
- for (i=0; i<yuv420_uv_height; i=i+4) {
- for (j=aligned_x_size; j<yuv420_width; j=j+4) {
- tiled_offset = 0;
- tiled_x_index = j>>6;
- tiled_y_index = i>>5;
- if (tiled_y_index & 0x1) {
- /* odd fomula: 2+x+(x>>2)<<2+x_block_num*(y-1) */
- tiled_offset = tiled_y_index-1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset+2;
- temp1 = (tiled_x_index>>2)<<2;
- tiled_offset = tiled_offset+temp1;
- tiled_offset = tiled_offset<<11;
- } else {
- temp2 = ((yuv420_uv_height+31)>>5)<<5;
- if ((i+32)<temp2) {
- /* even1 fomula: x+((x+2)>>2)<<2+x_block_num*y */
- temp1 = tiled_x_index+2;
- temp1 = (temp1>>2)<<2;
- tiled_offset = tiled_x_index+temp1;
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_offset+tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset<<11;
- } else {
- /* even2 fomula: x+x_block_num*y */
- temp1 = ((yuv420_width+127)>>7)<<7;
- tiled_offset = tiled_y_index*(temp1>>6);
- tiled_offset = tiled_offset+tiled_x_index;
- tiled_offset = tiled_offset<<11;
- }
- }
- temp1 = i&0x1F;
- temp2 = j&0x3F;
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+temp2+64*(temp1), yuv420p_u_src+j/2+yuv420_width/2*(i), yuv420p_v_src+j/2+yuv420_width/2*(i), 2);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+temp2+64*(temp1+1), yuv420p_u_src+j/2+yuv420_width/2*(i+1), yuv420p_v_src+j/2+yuv420_width/2*(i+1), 2);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+temp2+64*(temp1+2), yuv420p_u_src+j/2+yuv420_width/2*(i+2), yuv420p_v_src+j/2+yuv420_width/2*(i+2), 2);
- csc_interleave_memcpy(nv12t_uv_dest+tiled_offset+temp2+64*(temp1+3), yuv420p_u_src+j/2+yuv420_width/2*(i+3), yuv420p_v_src+j/2+yuv420_width/2*(i+3), 2);
- }
- }
-}
-