/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 /**
 ******************************************************************************
 * @file        M4TRAN_transition.h
 * @brief
 * @note
 ******************************************************************************
*/

#ifndef __M4VFL_TRANSITION_H__
#define __M4VFL_TRANSITION_H__

#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned char UInt8;
typedef unsigned long UInt32;

typedef    struct S_M4ViComImagePlane
{
    UInt32        u_width;            /* active width, in pixels */
    UInt32        u_height;            /* active height, in lines */
    UInt32        u_topleft;            /* index of 1st active pixel */
    UInt32        u_stride;            /* line stride, in bytes */
    UInt8        *pac_data;            /* buffer address */
}    M4ViComImagePlane;

typedef struct S_M4VFL_modifLumParam
{
    unsigned short lum_factor;
    unsigned short copy_chroma;
} M4VFL_ModifLumParam;

#define     M4VIFI_OK                       0
#define     M4VIFI_ILLEGAL_FRAME_HEIGHT     8
#define     M4VIFI_ILLEGAL_FRAME_WIDTH      9

unsigned char M4VFL_modifyLumaByStep(M4ViComImagePlane *plane_in, M4ViComImagePlane *plane_out,
                                         M4VFL_ModifLumParam *lum_param, void *user_data);

unsigned char M4VFL_modifyLumaWithScale(M4ViComImagePlane *plane_in, M4ViComImagePlane *plane_out,
                                         unsigned long lum_factor, void *user_data);

/**
 *************************************************************************************************
 * M4OSA_ERR M4VIFI_ImageBlendingonYUV420 (void *pUserData,
 *                                                  M4VIFI_ImagePlane *pPlaneIn1,
 *                                                  M4VIFI_ImagePlane *pPlaneIn2,
 *                                                  M4VIFI_ImagePlane *pPlaneOut,
 *                                                  M4VIFI_UInt32 Progress)
 * @brief   Blends two YUV 4:2:0 Planar images.
 * @note    Blends YUV420 planar images,
 *          Map the value of progress from (0 - 1000) to (0 - 1024)
 *          Set the range of blendingfactor,
 *                  1. from 0 to (Progress << 1)            ;for Progress <= 512
 *                  2. from (( Progress - 512)<< 1) to 1024 ;otherwise
 *          Set the increment of blendingfactor for each element in the image row by the factor,
 *                  =  (Range-1) / (image width-1)  ;for width >= range
 *                  =  (Range) / (image width)      ;otherwise
 *          Loop on each(= i) row of output Y plane (steps of 2)
 *              Loop on each(= j) column of output Y plane (steps of 2)
 *                  Get four Y samples and one U & V sample from two input YUV4:2:0 images and
 *                  Compute four Y sample and one U & V sample for output YUV4:2:0 image
 *                      using the following,
 *                  Out(i,j) = blendingfactor(i,j) * In1(i,j)+ (l - blendingfactor(i,j)) * In2(i,j)
 *              end loop column
 *          end loop row.
 * @param   pUserData: (IN)  User Specific Parameter
 * @param   pPlaneIn1: (IN)  Pointer to an array of image plane structures maintained for Y, U
 *                            and V planes.
 * @param   pPlaneIn2: (IN)  Pointer to an array of image plane structures maintained for Y, U
 *                            and V planes.
 * @param   pPlaneOut: (OUT) Pointer to an array of image plane structures maintained for Y, U
 *                            and V planes.
 * @param   Progress:  (IN)  Progress value (varies between 0 and 1000)
 * @return  M4VIFI_OK: No error
 * @return  M4VIFI_ILLEGAL_FRAME_HEIGHT: Error in height
 * @return  M4VIFI_ILLEGAL_FRAME_WIDTH:  Error in width
 ***********************************************************************************************/
unsigned char M4VIFI_ImageBlendingonYUV420 (void *pUserData, M4ViComImagePlane *pPlaneIn1,
                                                M4ViComImagePlane *pPlaneIn2,
                                                M4ViComImagePlane *pPlaneOut, UInt32 Progress);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif // __M4VFL_TRANSITION_H__