17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* 27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License. 67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at 77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and 147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License. 157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file M4TRAN_transition.c 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * OSAL (memset and memcpy) ***/ 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h" 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VFL_transition.h" 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <string.h> 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef LITTLE_ENDIAN 327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VFL_SWAP_SHORT(a) a = ((a & 0xFF) << 8) | ((a & 0xFF00) >> 8) 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VFL_SWAP_SHORT(a) 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LUM_FACTOR_MAX 10 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiunsigned char M4VFL_modifyLumaByStep(M4ViComImagePlane *plane_in, M4ViComImagePlane *plane_out, 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VFL_ModifLumParam *lum_param, void *user_data) 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned short *p_src, *p_dest, *p_src_line, *p_dest_line; 447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned long pix_src; 457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned long u_outpx, u_outpx2; 467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned long u_width, u_stride, u_stride_out,u_height, pix; 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned long lf1, lf2, lf3; 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi long i, j; 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (lum_param->copy_chroma != 0) 517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* copy chroma plane */ 537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* apply luma factor */ 577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_width = plane_in[0].u_width; 587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_height = plane_in[0].u_height; 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_stride = (plane_in[0].u_stride >> 1); 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_stride_out = (plane_out[0].u_stride >> 1); 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest = (unsigned short *) &plane_out[0].pac_data[plane_out[0].u_topleft]; 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_src = (unsigned short *) &plane_in[0].pac_data[plane_in[0].u_topleft]; 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest_line = p_dest; 647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_src_line = p_src; 657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(lum_param->lum_factor) 677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 0: 697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* very specific case : set luma plane to 16 */ 707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (j = u_height; j != 0; j--) 717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memset((void *)p_dest,16, u_width); 737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest += u_stride_out; 747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 0; 767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 1: 787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 0.25 */ 797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lf1 = 6; lf2 = 6; lf3 = 7; 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 2: 827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 0.375 */ 837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lf1 = 7; lf2 = 7; lf3 = 7; 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 3: 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 0.5 */ 877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lf1 = 7; lf2 = 7; lf3 = 8; 887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 4: 907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 0.625 */ 917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lf1 = 7; lf2 = 8; lf3 = 8; 927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 5: 947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 0.75 */ 957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lf1 = 8; lf2 = 8; lf3 = 8; 967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 6: 987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 0.875 */ 997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lf1 = 9; lf2 = 8; lf3 = 7; 1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lf1 = 8; lf2 = 8; lf3 = 9; 1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (j = u_height; j != 0; j--) 1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest = p_dest_line; 1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_src = p_src_line; 1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i = (u_width >> 1); i != 0; i--) 1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pix_src = (unsigned long) *p_src++; 1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pix = pix_src & 0xFF; 1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_outpx = (((pix << lf1) + (pix << lf2) + (pix << lf3) ) >> LUM_FACTOR_MAX); 1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pix = ((pix_src & 0xFF00) >> 8); 1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_outpx2 = ((((pix << lf1) + (pix << lf2) + (pix << lf3) ) >> LUM_FACTOR_MAX)<< 8) ; 1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *p_dest++ = (unsigned short) (u_outpx2 | u_outpx); 1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest_line += u_stride_out; 1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_src_line += u_stride; 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 0; 1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiunsigned char M4VFL_modifyLumaWithScale(M4ViComImagePlane *plane_in, 1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ViComImagePlane *plane_out, 1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned long lum_factor, 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi void *user_data) 1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned short *p_src, *p_dest, *p_src_line, *p_dest_line; 1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned char *p_csrc, *p_cdest, *p_csrc_line, *p_cdest_line; 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned long pix_src; 1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned long u_outpx, u_outpx2; 1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unsigned long u_width, u_stride, u_stride_out,u_height, pix; 1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi long i, j; 1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* copy or filter chroma */ 1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_width = plane_in[1].u_width; 1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_height = plane_in[1].u_height; 1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_stride = plane_in[1].u_stride; 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_stride_out = plane_out[1].u_stride; 1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest_line = (unsigned char *) &plane_out[1].pac_data[plane_out[1].u_topleft]; 1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc_line = (unsigned char *) &plane_in[1].pac_data[plane_in[1].u_topleft]; 1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (lum_factor > 256) 1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest = (unsigned char *) &plane_out[2].pac_data[plane_out[2].u_topleft]; 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc = (unsigned char *) &plane_in[2].pac_data[plane_in[2].u_topleft]; 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* copy chroma */ 1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (j = u_height; j != 0; j--) 1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i = u_width; i != 0; i--) 1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)p_cdest_line, (void *)p_csrc_line, u_width); 15632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)p_cdest,(void *) p_csrc, u_width); 1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest_line += u_stride_out; 1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest += u_stride_out; 1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc_line += u_stride; 1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc += u_stride; 1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* filter chroma */ 1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pix = (1024 - lum_factor) << 7; 1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (j = u_height; j != 0; j--) 1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest = p_cdest_line; 1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc = p_csrc_line; 1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i = u_width; i != 0; i--) 1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *p_cdest++ = ((pix + (*p_csrc++ & 0xFF) * lum_factor) >> LUM_FACTOR_MAX); 1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest_line += u_stride_out; 1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc_line += u_stride; 1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest_line = (unsigned char *) &plane_out[2].pac_data[plane_out[2].u_topleft]; 1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc_line = (unsigned char *) &plane_in[2].pac_data[plane_in[2].u_topleft]; 1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (j = u_height; j != 0; j--) 1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest = p_cdest_line; 1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc = p_csrc_line; 1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i = u_width; i != 0; i--) 1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *p_cdest++ = ((pix + (*p_csrc & 0xFF) * lum_factor) >> LUM_FACTOR_MAX); 1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_cdest_line += u_stride_out; 1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_csrc_line += u_stride; 1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* apply luma factor */ 1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_width = plane_in[0].u_width; 1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_height = plane_in[0].u_height; 1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_stride = (plane_in[0].u_stride >> 1); 1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_stride_out = (plane_out[0].u_stride >> 1); 1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest = (unsigned short *) &plane_out[0].pac_data[plane_out[0].u_topleft]; 1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_src = (unsigned short *) &plane_in[0].pac_data[plane_in[0].u_topleft]; 2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest_line = p_dest; 2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_src_line = p_src; 2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (j = u_height; j != 0; j--) 2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest = p_dest_line; 2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_src = p_src_line; 2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i = (u_width >> 1); i != 0; i--) 2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pix_src = (unsigned long) *p_src++; 2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pix = pix_src & 0xFF; 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_outpx = ((pix * lum_factor) >> LUM_FACTOR_MAX); 2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pix = ((pix_src & 0xFF00) >> 8); 2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u_outpx2 = (((pix * lum_factor) >> LUM_FACTOR_MAX)<< 8) ; 2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *p_dest++ = (unsigned short) (u_outpx2 | u_outpx); 2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_dest_line += u_stride_out; 2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi p_src_line += u_stride; 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 0; 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************************************* 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VIFI_ImageBlendingonYUV420 (void *pUserData, 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4VIFI_ImagePlane *pPlaneIn1, 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4VIFI_ImagePlane *pPlaneIn2, 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4VIFI_ImagePlane *pPlaneOut, 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * UInt32 Progress) 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Blends two YUV 4:2:0 Planar images. 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note Blends YUV420 planar images, 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Map the value of progress from (0 - 1000) to (0 - 1024) 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the range of blendingfactor, 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 1. from 0 to (Progress << 1) ;for Progress <= 512 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 2. from (( Progress - 512)<< 1) to 1024 ;otherwise 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the increment of blendingfactor for each element in the image row by the factor, 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * = (Range-1) / (image width-1) ;for width >= range 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * = (Range) / (image width) ;otherwise 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Loop on each(= i) row of output Y plane (steps of 2) 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Loop on each(= j) column of output Y plane (steps of 2) 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Get four Y samples and one U & V sample from two input YUV4:2:0 images and 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Compute four Y sample and one U & V sample for output YUV4:2:0 image 2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * using the following, 2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Out(i,j) = blendingfactor(i,j) * In1(i,j)+ (l - blendingfactor(i,j)) *In2(i,j) 2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * end loop column 2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * end loop row. 2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pUserData: (IN) User Specific Parameter 2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pPlaneIn1: (IN) Pointer to an array of image plane structures maintained 2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * for Y, U and V planes. 2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pPlaneIn2: (IN) Pointer to an array of image plane structures maintained 2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * for Y, U and V planes. 2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pPlaneOut: (OUT) Pointer to an array of image plane structures maintained 2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * for Y, U and V planes. 2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param Progress: (IN) Progress value (varies between 0 and 1000) 2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4VIFI_OK: No error 2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4VIFI_ILLEGAL_FRAME_HEIGHT: Error in height 2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4VIFI_ILLEGAL_FRAME_WIDTH: Error in width 2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************************************* 2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** Check for value is EVEN */ 2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef IS_EVEN 2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define IS_EVEN(a) (!(a & 0x01)) 2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** Used for fixed point implementation */ 2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef MAX_SHORT 2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define MAX_SHORT 0x10000 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef NULL 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define NULL 0 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef FALSE 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define FALSE 0 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define TRUE !FALSE 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiunsigned char M4VIFI_ImageBlendingonYUV420 (void *pUserData, 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ViComImagePlane *pPlaneIn1, 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ViComImagePlane *pPlaneIn2, 2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ViComImagePlane *pPlaneOut, 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt32 Progress) 2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt8 *pu8_data_Y_start1,*pu8_data_U_start1,*pu8_data_V_start1; 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt8 *pu8_data_Y_start2,*pu8_data_U_start2,*pu8_data_V_start2; 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt8 *pu8_data_Y_start3,*pu8_data_U_start3,*pu8_data_V_start3; 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt8 *pu8_data_Y_current1, *pu8_data_Y_next1, *pu8_data_U1, *pu8_data_V1; 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt8 *pu8_data_Y_current2, *pu8_data_Y_next2, *pu8_data_U2, *pu8_data_V2; 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt8 *pu8_data_Y_current3,*pu8_data_Y_next3, *pu8_data_U3, *pu8_data_V3; 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt32 u32_stride_Y1, u32_stride2_Y1, u32_stride_U1, u32_stride_V1; 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt32 u32_stride_Y2, u32_stride2_Y2, u32_stride_U2, u32_stride_V2; 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt32 u32_stride_Y3, u32_stride2_Y3, u32_stride_U3, u32_stride_V3; 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt32 u32_height, u32_width; 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt32 u32_blendfactor, u32_startA, u32_endA, u32_blend_inc, u32_x_accum; 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt32 u32_col, u32_row, u32_rangeA, u32_progress; 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi UInt32 u32_U1,u32_V1,u32_U2,u32_V2, u32_Y1, u32_Y2; 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check the Y plane height is EVEN and image plane heights are same */ 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( (IS_EVEN(pPlaneIn1[0].u_height) == FALSE) || 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (IS_EVEN(pPlaneIn2[0].u_height) == FALSE) || 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (IS_EVEN(pPlaneOut[0].u_height) == FALSE) || 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pPlaneIn1[0].u_height != pPlaneOut[0].u_height) || 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pPlaneIn2[0].u_height != pPlaneOut[0].u_height) ) 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VIFI_ILLEGAL_FRAME_HEIGHT; 3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check the Y plane width is EVEN and image plane widths are same */ 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( (IS_EVEN(pPlaneIn1[0].u_width) == FALSE) || 3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (IS_EVEN(pPlaneIn2[0].u_width) == FALSE) || 3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (IS_EVEN(pPlaneOut[0].u_width) == FALSE) || 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pPlaneIn1[0].u_width != pPlaneOut[0].u_width) || 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pPlaneIn2[0].u_width != pPlaneOut[0].u_width) ) 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VIFI_ILLEGAL_FRAME_WIDTH; 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the pointer to the beginning of the input1 YUV420 image planes */ 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_start1 = pPlaneIn1[0].pac_data + pPlaneIn1[0].u_topleft; 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U_start1 = pPlaneIn1[1].pac_data + pPlaneIn1[1].u_topleft; 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V_start1 = pPlaneIn1[2].pac_data + pPlaneIn1[2].u_topleft; 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the pointer to the beginning of the input2 YUV420 image planes */ 3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_start2 = pPlaneIn2[0].pac_data + pPlaneIn2[0].u_topleft; 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U_start2 = pPlaneIn2[1].pac_data + pPlaneIn2[1].u_topleft; 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V_start2 = pPlaneIn2[2].pac_data + pPlaneIn2[2].u_topleft; 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the pointer to the beginning of the output YUV420 image planes */ 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_start3 = pPlaneOut[0].pac_data + pPlaneOut[0].u_topleft; 3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U_start3 = pPlaneOut[1].pac_data + pPlaneOut[1].u_topleft; 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V_start3 = pPlaneOut[2].pac_data + pPlaneOut[2].u_topleft; 3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the stride for the next row in each input1 YUV420 plane */ 3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_Y1 = pPlaneIn1[0].u_stride; 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_U1 = pPlaneIn1[1].u_stride; 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_V1 = pPlaneIn1[2].u_stride; 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the stride for the next row in each input2 YUV420 plane */ 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_Y2 = pPlaneIn2[0].u_stride; 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_U2 = pPlaneIn2[1].u_stride; 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_V2 = pPlaneIn2[2].u_stride; 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the stride for the next row in each output YUV420 plane */ 3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_Y3 = pPlaneOut[0].u_stride; 3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_U3 = pPlaneOut[1].u_stride; 3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride_V3 = pPlaneOut[2].u_stride; 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride2_Y1 = u32_stride_Y1 << 1; 3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride2_Y2 = u32_stride_Y2 << 1; 3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_stride2_Y3 = u32_stride_Y3 << 1; 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get the size of the output image */ 3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_height = pPlaneOut[0].u_height; 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_width = pPlaneOut[0].u_width; 3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* User Specified Progress value */ 3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_progress = Progress; 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Map Progress value from (0 - 1000) to (0 - 1024) -> for optimisation */ 3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(u32_progress < 1000) 3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_progress = ((u32_progress << 10) / 1000); 3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_progress = 1024; 3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the range of blendingfactor */ 3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(u32_progress <= 512) 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_startA = 0; 3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_endA = (u32_progress << 1); 3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /* u32_progress > 512 */ 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_startA = (u32_progress - 512) << 1; 3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_endA = 1024; 3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_rangeA = u32_endA - u32_startA; 3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the increment of blendingfactor for each element in the image row */ 3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((u32_width >= u32_rangeA) && (u32_rangeA > 0) ) 3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_blend_inc = ((u32_rangeA-1) * MAX_SHORT) / (u32_width - 1); 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /* (u32_width < u32_rangeA) || (u32_rangeA < 0) */ 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_blend_inc = (u32_rangeA * MAX_SHORT) / (u32_width); 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Two YUV420 rows are computed at each pass */ 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (u32_row = u32_height; u32_row != 0; u32_row -=2) 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set pointers to the beginning of the row for each input image1 plane */ 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_current1 = pu8_data_Y_start1; 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U1 = pu8_data_U_start1; 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V1 = pu8_data_V_start1; 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set pointers to the beginning of the row for each input image2 plane */ 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_current2 = pu8_data_Y_start2; 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U2 = pu8_data_U_start2; 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V2 = pu8_data_V_start2; 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set pointers to the beginning of the row for each output image plane */ 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_current3 = pu8_data_Y_start3; 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U3 = pu8_data_U_start3; 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V3 = pu8_data_V_start3; 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set pointers to the beginning of the next row for image luma plane */ 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_next1 = pu8_data_Y_current1 + u32_stride_Y1; 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_next2 = pu8_data_Y_current2 + u32_stride_Y2; 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_next3 = pu8_data_Y_current3 + u32_stride_Y3; 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Initialise blendfactor */ 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_blendfactor = u32_startA; 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Blendfactor Increment accumulator */ 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum = 0; 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Loop on each column of the output image */ 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (u32_col = u32_width; u32_col != 0 ; u32_col -=2) 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update the blending factor */ 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_blendfactor = u32_startA + (u32_x_accum >> 16); 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get Luma value (x,y) of input Image1 */ 4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_Y1 = *pu8_data_Y_current1++; 4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get chrominance2 value */ 4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_U1 = *pu8_data_U1++; 4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_V1 = *pu8_data_V1++; 4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get Luma value (x,y) of input Image2 */ 4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_Y2 = *pu8_data_Y_current2++; 4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get chrominance2 value */ 4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_U2 = *pu8_data_U2++; 4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_V2 = *pu8_data_V2++; 4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute Luma value (x,y) of Output image */ 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_Y_current3++ = (UInt8)((u32_blendfactor * u32_Y2 + 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (1024 - u32_blendfactor)*u32_Y1) >> 10); 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute chroma(U) value of Output image */ 4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_U3++ = (UInt8)((u32_blendfactor * u32_U2 + 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (1024 - u32_blendfactor)*u32_U1) >> 10); 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute chroma(V) value of Output image */ 4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_V3++ = (UInt8)((u32_blendfactor * u32_V2 + 4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (1024 - u32_blendfactor)*u32_V1) >> 10); 4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get Luma value (x,y+1) of input Image1 */ 4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_Y1 = *pu8_data_Y_next1++; 4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get Luma value (x,y+1) of input Image2 */ 4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_Y2 = *pu8_data_Y_next2++; 4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute Luma value (x,y+1) of Output image*/ 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_Y_next3++ = (UInt8)((u32_blendfactor * u32_Y2 + 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (1024 - u32_blendfactor)*u32_Y1) >> 10); 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update accumulator */ 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum += u32_blend_inc; 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update the blending factor */ 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_blendfactor = u32_startA + (u32_x_accum >> 16); 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get Luma value (x+1,y) of input Image1 */ 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_Y1 = *pu8_data_Y_current1++; 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get Luma value (x+1,y) of input Image2 */ 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_Y2 = *pu8_data_Y_current2++; 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute Luma value (x+1,y) of Output image*/ 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_Y_current3++ = (UInt8)((u32_blendfactor * u32_Y2 + 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (1024 - u32_blendfactor)*u32_Y1) >> 10); 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get Luma value (x+1,y+1) of input Image1 */ 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_Y1 = *pu8_data_Y_next1++; 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get Luma value (x+1,y+1) of input Image2 */ 4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_Y2 = *pu8_data_Y_next2++; 4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute Luma value (x+1,y+1) of Output image*/ 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_Y_next3++ = (UInt8)((u32_blendfactor * u32_Y2 + 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (1024 - u32_blendfactor)*u32_Y1) >> 10); 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update accumulator */ 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum += u32_blend_inc; 4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Working pointers are incremented just after each storage */ 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi }/* End of row scanning */ 4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update working pointer of input image1 for next row */ 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_start1 += u32_stride2_Y1; 4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U_start1 += u32_stride_U1; 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V_start1 += u32_stride_V1; 4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update working pointer of input image2 for next row */ 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_start2 += u32_stride2_Y2; 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U_start2 += u32_stride_U2; 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V_start2 += u32_stride_V2; 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update working pointer of output image for next row */ 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_Y_start3 += u32_stride2_Y3; 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_U_start3 += u32_stride_U3; 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_V_start3 += u32_stride_V3; 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi }/* End of column scanning */ 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VIFI_OK; 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* End of file M4VIFI_ImageBlendingonYUV420.c */ 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 511