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