10c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/* 20c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 30c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * 40c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 50c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * you may not use this file except in compliance with the License. 60c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * You may obtain a copy of the License at 70c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * 80c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 90c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * 100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * See the License for the specific language governing permissions and 140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * limitations under the License. 150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi */ 160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/** 170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ****************************************************************************** 180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @file M4TRAN_transition.c 190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief 200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ****************************************************************************** 210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/ 220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/** 240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * OSAL (memset and memcpy) ***/ 250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_Memory.h" 260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4VFL_transition.h" 280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <string.h> 300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifdef LITTLE_ENDIAN 320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define M4VFL_SWAP_SHORT(a) a = ((a & 0xFF) << 8) | ((a & 0xFF00) >> 8) 330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#else 340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define M4VFL_SWAP_SHORT(a) 350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif 360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define LUM_FACTOR_MAX 10 380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiunsigned char M4VFL_modifyLumaByStep(M4ViComImagePlane *plane_in, M4ViComImagePlane *plane_out, 410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4VFL_ModifLumParam *lum_param, void *user_data) 420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi{ 430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned short *p_src, *p_dest, *p_src_line, *p_dest_line; 440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned long pix_src; 450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned long u_outpx, u_outpx2; 460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned long u_width, u_stride, u_stride_out,u_height, pix; 470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned long lf1, lf2, lf3; 480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi long i, j; 490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if (lum_param->copy_chroma != 0) 510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* copy chroma plane */ 530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* apply luma factor */ 570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_width = plane_in[0].u_width; 580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_height = plane_in[0].u_height; 590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_stride = (plane_in[0].u_stride >> 1); 600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_stride_out = (plane_out[0].u_stride >> 1); 610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest = (unsigned short *) &plane_out[0].pac_data[plane_out[0].u_topleft]; 620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_src = (unsigned short *) &plane_in[0].pac_data[plane_in[0].u_topleft]; 630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest_line = p_dest; 640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_src_line = p_src; 650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi switch(lum_param->lum_factor) 670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi case 0: 690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* very specific case : set luma plane to 16 */ 700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (j = u_height; j != 0; j--) 710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 729d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu memset((void *)p_dest,16, u_width); 730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest += u_stride_out; 740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi return 0; 760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi case 1: 780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* 0.25 */ 790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi lf1 = 6; lf2 = 6; lf3 = 7; 800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi break; 810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi case 2: 820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* 0.375 */ 830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi lf1 = 7; lf2 = 7; lf3 = 7; 840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi break; 850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi case 3: 860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* 0.5 */ 870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi lf1 = 7; lf2 = 7; lf3 = 8; 880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi break; 890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi case 4: 900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* 0.625 */ 910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi lf1 = 7; lf2 = 8; lf3 = 8; 920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi break; 930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi case 5: 940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* 0.75 */ 950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi lf1 = 8; lf2 = 8; lf3 = 8; 960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi break; 970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi case 6: 980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* 0.875 */ 990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi lf1 = 9; lf2 = 8; lf3 = 7; 1000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi break; 1010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi default: 1020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi lf1 = 8; lf2 = 8; lf3 = 9; 1030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi break; 1040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 1060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (j = u_height; j != 0; j--) 1070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest = p_dest_line; 1090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_src = p_src_line; 1100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (i = (u_width >> 1); i != 0; i--) 1110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pix_src = (unsigned long) *p_src++; 1130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pix = pix_src & 0xFF; 1140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_outpx = (((pix << lf1) + (pix << lf2) + (pix << lf3) ) >> LUM_FACTOR_MAX); 1150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pix = ((pix_src & 0xFF00) >> 8); 1160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_outpx2 = ((((pix << lf1) + (pix << lf2) + (pix << lf3) ) >> LUM_FACTOR_MAX)<< 8) ; 1170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *p_dest++ = (unsigned short) (u_outpx2 | u_outpx); 1180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest_line += u_stride_out; 1200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_src_line += u_stride; 1210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi return 0; 1230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi} 1240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 1250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 1260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiunsigned char M4VFL_modifyLumaWithScale(M4ViComImagePlane *plane_in, 1270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4ViComImagePlane *plane_out, 1280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned long lum_factor, 1290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi void *user_data) 1300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi{ 1310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned short *p_src, *p_dest, *p_src_line, *p_dest_line; 1320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned char *p_csrc, *p_cdest, *p_csrc_line, *p_cdest_line; 1330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned long pix_src; 1340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned long u_outpx, u_outpx2; 1350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi unsigned long u_width, u_stride, u_stride_out,u_height, pix; 1360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi long i, j; 1370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 1380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* copy or filter chroma */ 1390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_width = plane_in[1].u_width; 1400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_height = plane_in[1].u_height; 1410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_stride = plane_in[1].u_stride; 1420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_stride_out = plane_out[1].u_stride; 1430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest_line = (unsigned char *) &plane_out[1].pac_data[plane_out[1].u_topleft]; 1440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc_line = (unsigned char *) &plane_in[1].pac_data[plane_in[1].u_topleft]; 1450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 1460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if (lum_factor > 256) 1470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest = (unsigned char *) &plane_out[2].pac_data[plane_out[2].u_topleft]; 1490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc = (unsigned char *) &plane_in[2].pac_data[plane_in[2].u_topleft]; 1500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* copy chroma */ 1510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (j = u_height; j != 0; j--) 1520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (i = u_width; i != 0; i--) 1540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1559d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu memcpy((void *)p_cdest_line, (void *)p_csrc_line, u_width); 1569d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu memcpy((void *)p_cdest,(void *) p_csrc, u_width); 1570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest_line += u_stride_out; 1590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest += u_stride_out; 1600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc_line += u_stride; 1610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc += u_stride; 1620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi else 1650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* filter chroma */ 1670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pix = (1024 - lum_factor) << 7; 1680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (j = u_height; j != 0; j--) 1690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest = p_cdest_line; 1710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc = p_csrc_line; 1720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (i = u_width; i != 0; i--) 1730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *p_cdest++ = ((pix + (*p_csrc++ & 0xFF) * lum_factor) >> LUM_FACTOR_MAX); 1750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest_line += u_stride_out; 1770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc_line += u_stride; 1780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest_line = (unsigned char *) &plane_out[2].pac_data[plane_out[2].u_topleft]; 1800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc_line = (unsigned char *) &plane_in[2].pac_data[plane_in[2].u_topleft]; 1810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (j = u_height; j != 0; j--) 1820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest = p_cdest_line; 1840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc = p_csrc_line; 1850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (i = u_width; i != 0; i--) 1860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 1870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *p_cdest++ = ((pix + (*p_csrc & 0xFF) * lum_factor) >> LUM_FACTOR_MAX); 1880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_cdest_line += u_stride_out; 1900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_csrc_line += u_stride; 1910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 1930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* apply luma factor */ 1940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_width = plane_in[0].u_width; 1950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_height = plane_in[0].u_height; 1960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_stride = (plane_in[0].u_stride >> 1); 1970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_stride_out = (plane_out[0].u_stride >> 1); 1980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest = (unsigned short *) &plane_out[0].pac_data[plane_out[0].u_topleft]; 1990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_src = (unsigned short *) &plane_in[0].pac_data[plane_in[0].u_topleft]; 2000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest_line = p_dest; 2010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_src_line = p_src; 2020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 2030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (j = u_height; j != 0; j--) 2040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 2050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest = p_dest_line; 2060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_src = p_src_line; 2070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (i = (u_width >> 1); i != 0; i--) 2080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 2090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pix_src = (unsigned long) *p_src++; 2100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pix = pix_src & 0xFF; 2110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_outpx = ((pix * lum_factor) >> LUM_FACTOR_MAX); 2120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pix = ((pix_src & 0xFF00) >> 8); 2130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u_outpx2 = (((pix * lum_factor) >> LUM_FACTOR_MAX)<< 8) ; 2140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *p_dest++ = (unsigned short) (u_outpx2 | u_outpx); 2150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 2160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_dest_line += u_stride_out; 2170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi p_src_line += u_stride; 2180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 2190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 2200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi return 0; 2210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi} 2220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 2230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/** 2240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************************************* 2250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * M4OSA_ERR M4VIFI_ImageBlendingonYUV420 (void *pUserData, 2260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * M4VIFI_ImagePlane *pPlaneIn1, 2270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * M4VIFI_ImagePlane *pPlaneIn2, 2280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * M4VIFI_ImagePlane *pPlaneOut, 2290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * UInt32 Progress) 2300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief Blends two YUV 4:2:0 Planar images. 2310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @note Blends YUV420 planar images, 2320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Map the value of progress from (0 - 1000) to (0 - 1024) 2330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Set the range of blendingfactor, 2340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * 1. from 0 to (Progress << 1) ;for Progress <= 512 2350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * 2. from (( Progress - 512)<< 1) to 1024 ;otherwise 2360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Set the increment of blendingfactor for each element in the image row by the factor, 2370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * = (Range-1) / (image width-1) ;for width >= range 2380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * = (Range) / (image width) ;otherwise 2390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Loop on each(= i) row of output Y plane (steps of 2) 2400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Loop on each(= j) column of output Y plane (steps of 2) 2410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Get four Y samples and one U & V sample from two input YUV4:2:0 images and 2420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Compute four Y sample and one U & V sample for output YUV4:2:0 image 2430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * using the following, 2440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Out(i,j) = blendingfactor(i,j) * In1(i,j)+ (l - blendingfactor(i,j)) *In2(i,j) 2450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * end loop column 2460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * end loop row. 2470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param pUserData: (IN) User Specific Parameter 2480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param pPlaneIn1: (IN) Pointer to an array of image plane structures maintained 2490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * for Y, U and V planes. 2500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param pPlaneIn2: (IN) Pointer to an array of image plane structures maintained 2510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * for Y, U and V planes. 2520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param pPlaneOut: (OUT) Pointer to an array of image plane structures maintained 2530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * for Y, U and V planes. 2540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param Progress: (IN) Progress value (varies between 0 and 1000) 2550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return M4VIFI_OK: No error 2560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return M4VIFI_ILLEGAL_FRAME_HEIGHT: Error in height 2570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return M4VIFI_ILLEGAL_FRAME_WIDTH: Error in width 2580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************************************* 2590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/ 2600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 2610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/** Check for value is EVEN */ 2620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifndef IS_EVEN 2630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define IS_EVEN(a) (!(a & 0x01)) 2640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif 2650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 2660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/** Used for fixed point implementation */ 2670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifndef MAX_SHORT 2680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define MAX_SHORT 0x10000 2690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif 2700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 2710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifndef NULL 2720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define NULL 0 2730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif 2740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 2750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifndef FALSE 2760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define FALSE 0 2770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define TRUE !FALSE 2780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif 2790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 2800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiunsigned char M4VIFI_ImageBlendingonYUV420 (void *pUserData, 2810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4ViComImagePlane *pPlaneIn1, 2820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4ViComImagePlane *pPlaneIn2, 2830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4ViComImagePlane *pPlaneOut, 2840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt32 Progress) 2850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi{ 2860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt8 *pu8_data_Y_start1,*pu8_data_U_start1,*pu8_data_V_start1; 2870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt8 *pu8_data_Y_start2,*pu8_data_U_start2,*pu8_data_V_start2; 2880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt8 *pu8_data_Y_start3,*pu8_data_U_start3,*pu8_data_V_start3; 2890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt8 *pu8_data_Y_current1, *pu8_data_Y_next1, *pu8_data_U1, *pu8_data_V1; 2900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt8 *pu8_data_Y_current2, *pu8_data_Y_next2, *pu8_data_U2, *pu8_data_V2; 2910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt8 *pu8_data_Y_current3,*pu8_data_Y_next3, *pu8_data_U3, *pu8_data_V3; 2920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt32 u32_stride_Y1, u32_stride2_Y1, u32_stride_U1, u32_stride_V1; 2930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt32 u32_stride_Y2, u32_stride2_Y2, u32_stride_U2, u32_stride_V2; 2940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt32 u32_stride_Y3, u32_stride2_Y3, u32_stride_U3, u32_stride_V3; 2950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt32 u32_height, u32_width; 2960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt32 u32_blendfactor, u32_startA, u32_endA, u32_blend_inc, u32_x_accum; 2970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt32 u32_col, u32_row, u32_rangeA, u32_progress; 2980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi UInt32 u32_U1,u32_V1,u32_U2,u32_V2, u32_Y1, u32_Y2; 2990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Check the Y plane height is EVEN and image plane heights are same */ 3020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if( (IS_EVEN(pPlaneIn1[0].u_height) == FALSE) || 3030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (IS_EVEN(pPlaneIn2[0].u_height) == FALSE) || 3040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (IS_EVEN(pPlaneOut[0].u_height) == FALSE) || 3050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (pPlaneIn1[0].u_height != pPlaneOut[0].u_height) || 3060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (pPlaneIn2[0].u_height != pPlaneOut[0].u_height) ) 3070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 3080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi return M4VIFI_ILLEGAL_FRAME_HEIGHT; 3090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 3100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Check the Y plane width is EVEN and image plane widths are same */ 3120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if( (IS_EVEN(pPlaneIn1[0].u_width) == FALSE) || 3130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (IS_EVEN(pPlaneIn2[0].u_width) == FALSE) || 3140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (IS_EVEN(pPlaneOut[0].u_width) == FALSE) || 3150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (pPlaneIn1[0].u_width != pPlaneOut[0].u_width) || 3160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (pPlaneIn2[0].u_width != pPlaneOut[0].u_width) ) 3170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 3180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi return M4VIFI_ILLEGAL_FRAME_WIDTH; 3190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 3200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set the pointer to the beginning of the input1 YUV420 image planes */ 3220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_start1 = pPlaneIn1[0].pac_data + pPlaneIn1[0].u_topleft; 3230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U_start1 = pPlaneIn1[1].pac_data + pPlaneIn1[1].u_topleft; 3240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V_start1 = pPlaneIn1[2].pac_data + pPlaneIn1[2].u_topleft; 3250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set the pointer to the beginning of the input2 YUV420 image planes */ 3270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_start2 = pPlaneIn2[0].pac_data + pPlaneIn2[0].u_topleft; 3280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U_start2 = pPlaneIn2[1].pac_data + pPlaneIn2[1].u_topleft; 3290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V_start2 = pPlaneIn2[2].pac_data + pPlaneIn2[2].u_topleft; 3300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set the pointer to the beginning of the output YUV420 image planes */ 3320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_start3 = pPlaneOut[0].pac_data + pPlaneOut[0].u_topleft; 3330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U_start3 = pPlaneOut[1].pac_data + pPlaneOut[1].u_topleft; 3340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V_start3 = pPlaneOut[2].pac_data + pPlaneOut[2].u_topleft; 3350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set the stride for the next row in each input1 YUV420 plane */ 3370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_Y1 = pPlaneIn1[0].u_stride; 3380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_U1 = pPlaneIn1[1].u_stride; 3390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_V1 = pPlaneIn1[2].u_stride; 3400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set the stride for the next row in each input2 YUV420 plane */ 3420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_Y2 = pPlaneIn2[0].u_stride; 3430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_U2 = pPlaneIn2[1].u_stride; 3440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_V2 = pPlaneIn2[2].u_stride; 3450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set the stride for the next row in each output YUV420 plane */ 3470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_Y3 = pPlaneOut[0].u_stride; 3480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_U3 = pPlaneOut[1].u_stride; 3490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride_V3 = pPlaneOut[2].u_stride; 3500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride2_Y1 = u32_stride_Y1 << 1; 3520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride2_Y2 = u32_stride_Y2 << 1; 3530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_stride2_Y3 = u32_stride_Y3 << 1; 3540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get the size of the output image */ 3560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_height = pPlaneOut[0].u_height; 3570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_width = pPlaneOut[0].u_width; 3580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* User Specified Progress value */ 3600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_progress = Progress; 3610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Map Progress value from (0 - 1000) to (0 - 1024) -> for optimisation */ 3630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if(u32_progress < 1000) 3640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_progress = ((u32_progress << 10) / 1000); 3650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi else 3660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_progress = 1024; 3670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set the range of blendingfactor */ 3690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if(u32_progress <= 512) 3700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 3710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_startA = 0; 3720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_endA = (u32_progress << 1); 3730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 3740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi else /* u32_progress > 512 */ 3750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 3760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_startA = (u32_progress - 512) << 1; 3770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_endA = 1024; 3780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 3790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_rangeA = u32_endA - u32_startA; 3800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set the increment of blendingfactor for each element in the image row */ 3820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if ((u32_width >= u32_rangeA) && (u32_rangeA > 0) ) 3830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 3840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_blend_inc = ((u32_rangeA-1) * MAX_SHORT) / (u32_width - 1); 3850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 3860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi else /* (u32_width < u32_rangeA) || (u32_rangeA < 0) */ 3870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 3880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_blend_inc = (u32_rangeA * MAX_SHORT) / (u32_width); 3890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 3900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Two YUV420 rows are computed at each pass */ 3920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (u32_row = u32_height; u32_row != 0; u32_row -=2) 3930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 3940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set pointers to the beginning of the row for each input image1 plane */ 3950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_current1 = pu8_data_Y_start1; 3960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U1 = pu8_data_U_start1; 3970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V1 = pu8_data_V_start1; 3980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 3990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set pointers to the beginning of the row for each input image2 plane */ 4000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_current2 = pu8_data_Y_start2; 4010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U2 = pu8_data_U_start2; 4020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V2 = pu8_data_V_start2; 4030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set pointers to the beginning of the row for each output image plane */ 4050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_current3 = pu8_data_Y_start3; 4060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U3 = pu8_data_U_start3; 4070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V3 = pu8_data_V_start3; 4080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Set pointers to the beginning of the next row for image luma plane */ 4100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_next1 = pu8_data_Y_current1 + u32_stride_Y1; 4110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_next2 = pu8_data_Y_current2 + u32_stride_Y2; 4120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_next3 = pu8_data_Y_current3 + u32_stride_Y3; 4130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Initialise blendfactor */ 4150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_blendfactor = u32_startA; 4160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Blendfactor Increment accumulator */ 4170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_x_accum = 0; 4180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Loop on each column of the output image */ 4200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (u32_col = u32_width; u32_col != 0 ; u32_col -=2) 4210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 4220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Update the blending factor */ 4230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_blendfactor = u32_startA + (u32_x_accum >> 16); 4240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get Luma value (x,y) of input Image1 */ 4260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_Y1 = *pu8_data_Y_current1++; 4270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get chrominance2 value */ 4290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_U1 = *pu8_data_U1++; 4300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_V1 = *pu8_data_V1++; 4310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get Luma value (x,y) of input Image2 */ 4330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_Y2 = *pu8_data_Y_current2++; 4340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get chrominance2 value */ 4360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_U2 = *pu8_data_U2++; 4370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_V2 = *pu8_data_V2++; 4380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Compute Luma value (x,y) of Output image */ 4400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *pu8_data_Y_current3++ = (UInt8)((u32_blendfactor * u32_Y2 + 4410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (1024 - u32_blendfactor)*u32_Y1) >> 10); 4420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Compute chroma(U) value of Output image */ 4430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *pu8_data_U3++ = (UInt8)((u32_blendfactor * u32_U2 + 4440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (1024 - u32_blendfactor)*u32_U1) >> 10); 4450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Compute chroma(V) value of Output image */ 4460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *pu8_data_V3++ = (UInt8)((u32_blendfactor * u32_V2 + 4470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (1024 - u32_blendfactor)*u32_V1) >> 10); 4480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get Luma value (x,y+1) of input Image1 */ 4500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_Y1 = *pu8_data_Y_next1++; 4510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get Luma value (x,y+1) of input Image2 */ 4530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_Y2 = *pu8_data_Y_next2++; 4540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Compute Luma value (x,y+1) of Output image*/ 4560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *pu8_data_Y_next3++ = (UInt8)((u32_blendfactor * u32_Y2 + 4570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (1024 - u32_blendfactor)*u32_Y1) >> 10); 4580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Update accumulator */ 4590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_x_accum += u32_blend_inc; 4600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Update the blending factor */ 4620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_blendfactor = u32_startA + (u32_x_accum >> 16); 4630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get Luma value (x+1,y) of input Image1 */ 4650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_Y1 = *pu8_data_Y_current1++; 4660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get Luma value (x+1,y) of input Image2 */ 4680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_Y2 = *pu8_data_Y_current2++; 4690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Compute Luma value (x+1,y) of Output image*/ 4710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *pu8_data_Y_current3++ = (UInt8)((u32_blendfactor * u32_Y2 + 4720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (1024 - u32_blendfactor)*u32_Y1) >> 10); 4730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get Luma value (x+1,y+1) of input Image1 */ 4750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_Y1 = *pu8_data_Y_next1++; 4760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Get Luma value (x+1,y+1) of input Image2 */ 4780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_Y2 = *pu8_data_Y_next2++; 4790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Compute Luma value (x+1,y+1) of Output image*/ 4810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *pu8_data_Y_next3++ = (UInt8)((u32_blendfactor * u32_Y2 + 4820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi (1024 - u32_blendfactor)*u32_Y1) >> 10); 4830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Update accumulator */ 4840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi u32_x_accum += u32_blend_inc; 4850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Working pointers are incremented just after each storage */ 4870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi }/* End of row scanning */ 4890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Update working pointer of input image1 for next row */ 4910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_start1 += u32_stride2_Y1; 4920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U_start1 += u32_stride_U1; 4930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V_start1 += u32_stride_V1; 4940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 4950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Update working pointer of input image2 for next row */ 4960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_start2 += u32_stride2_Y2; 4970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U_start2 += u32_stride_U2; 4980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V_start2 += u32_stride_V2; 4990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 5000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Update working pointer of output image for next row */ 5010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_Y_start3 += u32_stride2_Y3; 5020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_U_start3 += u32_stride_U3; 5030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi pu8_data_V_start3 += u32_stride_V3; 5040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 5050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi }/* End of column scanning */ 5060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 5070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi return M4VIFI_OK; 5080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi} 5090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/* End of file M4VIFI_ImageBlendingonYUV420.c */ 5100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 511