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