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   M4MCS_VideoPreProcessing.c
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief  MCS implementation
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note   This file implements the encoder callback of the MCS.
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *************************************************************************
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **/
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************************************************************
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Includes
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************************************************************
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* OSAL headers */
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h"       /* OSAL memory management */
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"        /* OSAL debug management */
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Core headers */
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalTypes.h"
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_ErrorCodes.h"
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Video preprocessing interface definition */
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VPP_API.h"
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Video filters */
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VIFI_FiltersAPI.h" /**< for M4VIFI_ResizeBilinearYUV420toYUV420() */
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4MCS_AUDIOONLY
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4AIR_API.h"
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_AUDIOONLY*/
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**/
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intApplyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn,
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                               M4VIFI_ImagePlane* pPlaneOut)
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Do the video rendering and the resize (if needed)
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    It is called by the video encoder
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext    (IN) VPP context, which actually is the MCS internal context in our case
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pPlaneIn    (IN) Contains the image
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pPlaneOut    (IN/OUT) Pointer to an array of 3 planes that will contain the output
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                  YUV420 image
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4MCS_ERR_VIDEO_DECODE_ERROR: the video decoding failed
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4MCS_ERR_RESIZE_ERROR: the resizing failed
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    Any error returned by an underlaying module
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_intApplyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn,
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             M4VIFI_ImagePlane* pPlaneOut)
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR        err = M4NO_ERROR;
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* This part is used only if video codecs are compiled*/
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4MCS_AUDIOONLY
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * The VPP context is actually the MCS context! */
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext*)(pContext);
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_MediaTime mtCts = pC->dViDecCurrentCts;
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * When Closing after an error occured, it may happen that pReaderVideoAU->m_dataAddress has
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * not been allocated yet. When closing in pause mode, the decoder can be null.
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * We don't want an error to be returned because it would interrupt the close process and
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * thus some resources would be locked. So we return M4NO_ERROR.
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     */
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Initialize to black plane the output plane if the media rendering
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     is black borders */
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(pC->MediaRendering == M4MCS_kBlackBorders)
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
9332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memset((void *)pPlaneOut[0].pac_data,Y_PLANE_BORDER_VALUE,
9432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (pPlaneOut[0].u_height*pPlaneOut[0].u_stride));
9532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memset((void *)pPlaneOut[1].pac_data,U_PLANE_BORDER_VALUE,
9632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (pPlaneOut[1].u_height*pPlaneOut[1].u_stride));
9732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memset((void *)pPlaneOut[2].pac_data,V_PLANE_BORDER_VALUE,
9832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (pPlaneOut[2].u_height*pPlaneOut[2].u_stride));
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if ((M4OSA_NULL == pC->ReaderVideoAU.m_dataAddress) ||
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             (M4OSA_NULL == pC->pViDecCtxt))
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * We must fill the input of the encoder with a dummy image, because
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * encoding noise leads to a huge video AU, and thus a writer buffer overflow. */
10632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memset((void *)pPlaneOut[0].pac_data,0,
10732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu             pPlaneOut[0].u_stride * pPlaneOut[0].u_height);
10832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memset((void *)pPlaneOut[1].pac_data,0,
10932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu             pPlaneOut[1].u_stride * pPlaneOut[1].u_height);
11032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memset((void *)pPlaneOut[2].pac_data,0,
11132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu             pPlaneOut[2].u_stride * pPlaneOut[2].u_height);
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0("M4MCS_intApplyVPP: pReaderVideoAU->m_dataAddress is M4OSA_NULL,\
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                       returning M4NO_ERROR");
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(pC->isRenderDup == M4OSA_FALSE)
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         *    m_pPreResizeFrame different than M4OSA_NULL means that resizing is needed */
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL != pC->pPreResizeFrame)
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /** FB 2008/10/20:
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Used for cropping and black borders*/
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4AIR_Params Params;
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_0("M4MCS_intApplyVPP: Need to resize");
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pVideoDecoder->m_pFctRender(pC->pViDecCtxt, &mtCts,
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPreResizeFrame, M4OSA_TRUE);
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err)
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1("M4MCS_intApplyVPP: m_pFctRender returns 0x%x!", err);
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(pC->MediaRendering == M4MCS_kResizing)
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /*
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * Call the resize filter. From the intermediate frame to the encoder
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * image plane
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 */
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VIFI_ResizeBilinearYUV420toYUV420(M4OSA_NULL,
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPreResizeFrame, pPlaneOut);
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (M4NO_ERROR != err)
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4MCS_intApplyVPP: M4ViFilResizeBilinearYUV420toYUV420\
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   returns 0x%x!", err);
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VIFI_ImagePlane pImagePlanesTemp[3];
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VIFI_ImagePlane* pPlaneTemp;
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt8* pOutPlaneY = pPlaneOut[0].pac_data +
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                          pPlaneOut[0].u_topleft;
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt8* pOutPlaneU = pPlaneOut[1].pac_data +
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                          pPlaneOut[1].u_topleft;
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt8* pOutPlaneV = pPlaneOut[2].pac_data +
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                          pPlaneOut[2].u_topleft;
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt8* pInPlaneY = M4OSA_NULL;
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt8* pInPlaneU = M4OSA_NULL;
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt8* pInPlaneV = M4OSA_NULL;
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 i = 0;
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /*FB 2008/10/20: to keep media aspect ratio*/
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /*Initialize AIR Params*/
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Params.m_inputCoord.m_x = 0;
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Params.m_inputCoord.m_y = 0;
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Params.m_inputSize.m_height = pC->pPreResizeFrame->u_height;
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Params.m_inputSize.m_width = pC->pPreResizeFrame->u_width;
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Params.m_outputSize.m_width = pPlaneOut->u_width;
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Params.m_outputSize.m_height = pPlaneOut->u_height;
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Params.m_bOutputStripe = M4OSA_FALSE;
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Params.m_outputOrientation = M4COMMON_kOrientationTopLeft;
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Media rendering: Black borders*/
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(pC->MediaRendering == M4MCS_kBlackBorders)
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[0].u_width = pPlaneOut[0].u_width;
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[0].u_height = pPlaneOut[0].u_height;
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[0].u_stride = pPlaneOut[0].u_width;
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[0].u_topleft = 0;
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[1].u_width = pPlaneOut[1].u_width;
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[1].u_height = pPlaneOut[1].u_height;
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[1].u_stride = pPlaneOut[1].u_width;
1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[1].u_topleft = 0;
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[2].u_width = pPlaneOut[2].u_width;
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[2].u_height = pPlaneOut[2].u_height;
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[2].u_stride = pPlaneOut[2].u_width;
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[2].u_topleft = 0;
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* Allocates plan in local image plane structure */
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[0].pac_data =
199694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(pImagePlanesTemp[0]\
2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        .u_width * pImagePlanesTemp[0].u_height, M4VS,
2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_Char *)"M4xVSS_PictureCallbackFct: temporary plane bufferY") ;
2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(pImagePlanesTemp[0].pac_data == M4OSA_NULL)
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_0("Error alloc in M4MCS_intApplyVPP");
2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[1].pac_data =
208694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(pImagePlanesTemp[1]\
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        .u_width * pImagePlanesTemp[1].u_height, M4VS,
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_Char *)"M4xVSS_PictureCallbackFct: temporary plane bufferU") ;
2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(pImagePlanesTemp[1].pac_data == M4OSA_NULL)
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_0("Error alloc in M4MCS_intApplyVPP");
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[2].pac_data =
217694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(pImagePlanesTemp[2]\
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        .u_width * pImagePlanesTemp[2].u_height,
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VS,(M4OSA_Char *)"M4xVSS_PictureCallbackFct: temporary plane bufferV") ;
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(pImagePlanesTemp[2].pac_data == M4OSA_NULL)
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_0("Error alloc in M4MCS_intApplyVPP");
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pInPlaneY = pImagePlanesTemp[0].pac_data ;
2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pInPlaneU = pImagePlanesTemp[1].pac_data ;
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pInPlaneV = pImagePlanesTemp[2].pac_data ;
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memset((void *)pImagePlanesTemp[0].pac_data,Y_PLANE_BORDER_VALUE,
23132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (pImagePlanesTemp[0].u_height*pImagePlanesTemp[0].u_stride));
23232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memset((void *)pImagePlanesTemp[1].pac_data,U_PLANE_BORDER_VALUE,
23332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (pImagePlanesTemp[1].u_height*pImagePlanesTemp[1].u_stride));
23432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memset((void *)pImagePlanesTemp[2].pac_data,V_PLANE_BORDER_VALUE,
23532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (pImagePlanesTemp[2].u_height*pImagePlanesTemp[2].u_stride));
2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if((M4OSA_UInt32)((pC->pPreResizeFrame->u_height * pPlaneOut->u_width)\
2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         /pC->pPreResizeFrame->u_width) <= pPlaneOut->u_height)
2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         //Params.m_inputSize.m_height < Params.m_inputSize.m_width)
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /*it is height so black borders will be on the top and on the bottom side*/
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_outputSize.m_width = pPlaneOut->u_width;
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_outputSize.m_height =
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4OSA_UInt32)
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             ((pC->pPreResizeFrame->u_height * pPlaneOut->u_width)\
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             /pC->pPreResizeFrame->u_width);
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /*number of lines at the top*/
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[0].u_topleft =
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4MCS_ABS((M4OSA_Int32)
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (pImagePlanesTemp[0].u_height\
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             -Params.m_outputSize.m_height)>>1)) *
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             pImagePlanesTemp[0].u_stride;
2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[0].u_height = Params.m_outputSize.m_height;
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[1].u_topleft =
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4MCS_ABS((M4OSA_Int32)(pImagePlanesTemp[1].u_height\
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             -(Params.m_outputSize.m_height>>1)))>>1)\
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             * pImagePlanesTemp[1].u_stride;
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[1].u_height = Params.m_outputSize.m_height>>1;
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[2].u_topleft =
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4MCS_ABS((M4OSA_Int32)(pImagePlanesTemp[2].u_height\
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             -(Params.m_outputSize.m_height>>1)))>>1)\
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             * pImagePlanesTemp[2].u_stride;
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[2].u_height = Params.m_outputSize.m_height>>1;
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /*it is width so black borders will be on the left and right side*/
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_outputSize.m_height = pPlaneOut->u_height;
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_outputSize.m_width =
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4OSA_UInt32)((pC->pPreResizeFrame->u_width
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             * pPlaneOut->u_height)\
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             /pC->pPreResizeFrame->u_height);
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[0].u_topleft =
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4MCS_ABS((M4OSA_Int32)(pImagePlanesTemp[0].u_width-\
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                Params.m_outputSize.m_width)>>1));
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[0].u_width = Params.m_outputSize.m_width;
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[1].u_topleft =
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4MCS_ABS((M4OSA_Int32)(pImagePlanesTemp[1].u_width-\
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (Params.m_outputSize.m_width>>1)))>>1);
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[1].u_width = Params.m_outputSize.m_width>>1;
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[2].u_topleft =
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4MCS_ABS((M4OSA_Int32)(pImagePlanesTemp[2].u_width-\
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (Params.m_outputSize.m_width>>1)))>>1);
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pImagePlanesTemp[2].u_width = Params.m_outputSize.m_width>>1;
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*Width and height have to be even*/
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Params.m_outputSize.m_width = (Params.m_outputSize.m_width>>1)<<1;
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Params.m_outputSize.m_height = (Params.m_outputSize.m_height>>1)<<1;
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1;
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1;
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[0].u_width = (pImagePlanesTemp[0].u_width>>1)<<1;
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[1].u_width = (pImagePlanesTemp[1].u_width>>1)<<1;
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[2].u_width = (pImagePlanesTemp[2].u_width>>1)<<1;
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[0].u_height = (pImagePlanesTemp[0].u_height>>1)<<1;
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[1].u_height = (pImagePlanesTemp[1].u_height>>1)<<1;
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pImagePlanesTemp[2].u_height = (pImagePlanesTemp[2].u_height>>1)<<1;
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*Check that values are coherent*/
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(Params.m_inputSize.m_height == Params.m_outputSize.m_height)
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_inputSize.m_width = Params.m_outputSize.m_width;
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if(Params.m_inputSize.m_width == Params.m_outputSize.m_width)
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_inputSize.m_height = Params.m_outputSize.m_height;
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pPlaneTemp = pImagePlanesTemp;
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Media rendering: Cropping*/
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(pC->MediaRendering == M4MCS_kCropping)
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Params.m_outputSize.m_height = pPlaneOut->u_height;
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Params.m_outputSize.m_width = pPlaneOut->u_width;
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if((Params.m_outputSize.m_height * Params.m_inputSize.m_width)\
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         /Params.m_outputSize.m_width<Params.m_inputSize.m_height)
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /*height will be cropped*/
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_inputSize.m_height =
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4OSA_UInt32)((Params.m_outputSize.m_height \
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             * Params.m_inputSize.m_width) /
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             Params.m_outputSize.m_width);
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_inputSize.m_height =
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (Params.m_inputSize.m_height>>1)<<1;
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_inputCoord.m_y =
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_Int32)((M4OSA_Int32)
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            ((pC->pPreResizeFrame->u_height\
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            - Params.m_inputSize.m_height))>>1);
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /*width will be cropped*/
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_inputSize.m_width =
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (M4OSA_UInt32)((Params.m_outputSize.m_width\
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 * Params.m_inputSize.m_height) /
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 Params.m_outputSize.m_height);
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_inputSize.m_width =
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             (Params.m_inputSize.m_width>>1)<<1;
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Params.m_inputCoord.m_x =
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_Int32)((M4OSA_Int32)
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            ((pC->pPreResizeFrame->u_width\
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            - Params.m_inputSize.m_width))>>1);
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pPlaneTemp = pPlaneOut;
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * Call AIR functions */
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(M4OSA_NULL == pC->m_air_context)
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = M4AIR_create(&pC->m_air_context, M4AIR_kYUV420P);
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(err != M4NO_ERROR)
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct:\
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         Error when initializing AIR: 0x%x", err);
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4AIR_configure(pC->m_air_context, &Params);
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(err != M4NO_ERROR)
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct:\
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     Error when configuring AIR: 0x%x", err);
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4AIR_cleanUp(pC->m_air_context);
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4AIR_get(pC->m_air_context, pC->pPreResizeFrame,
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pPlaneTemp);
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(err != M4NO_ERROR)
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct:\
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     Error when getting AIR plane: 0x%x", err);
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4AIR_cleanUp(pC->m_air_context);
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(pC->MediaRendering == M4MCS_kBlackBorders)
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    for(i=0; i<pPlaneOut[0].u_height; i++)
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
38532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        memcpy(   (void *)pOutPlaneY,
38632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                                        (void *)pInPlaneY,
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        pPlaneOut[0].u_width);
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pInPlaneY += pPlaneOut[0].u_width;
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pOutPlaneY += pPlaneOut[0].u_stride;
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    for(i=0; i<pPlaneOut[1].u_height; i++)
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
39332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        memcpy(   (void *)pOutPlaneU,
39432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                                        (void *)pInPlaneU,
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        pPlaneOut[1].u_width);
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pInPlaneU += pPlaneOut[1].u_width;
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pOutPlaneU += pPlaneOut[1].u_stride;
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    for(i=0; i<pPlaneOut[2].u_height; i++)
4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
40132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        memcpy(   (void *)pOutPlaneV,
40232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                                        (void *)pInPlaneV,
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        pPlaneOut[2].u_width);
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pInPlaneV += pPlaneOut[2].u_width;
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pOutPlaneV += pPlaneOut[2].u_stride;
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    for(i=0; i<3; i++)
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if(pImagePlanesTemp[i].pac_data != M4OSA_NULL)
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
412694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                            free(
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        pImagePlanesTemp[i].pac_data);
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pImagePlanesTemp[i].pac_data = M4OSA_NULL;
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_0("M4MCS_intApplyVPP: Don't need resizing");
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pVideoDecoder->m_pFctRender(pC->pViDecCtxt,
4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                    &mtCts, pPlaneOut,
4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                    M4OSA_TRUE);
4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err)
4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1("M4MCS_intApplyVPP: m_pFctRender returns 0x%x!", err);
4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->lastDecodedPlane = pPlaneOut;
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Copy last decoded plane to output plane */
43732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pPlaneOut[0].pac_data,
43832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (void *)pC->lastDecodedPlane[0].pac_data,
4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         (pPlaneOut[0].u_height * pPlaneOut[0].u_width));
44032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pPlaneOut[1].pac_data,
44132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (void *)pC->lastDecodedPlane[1].pac_data,
4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                          (pPlaneOut[1].u_height * pPlaneOut[1].u_width));
44332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pPlaneOut[2].pac_data,
44432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (void *)pC->lastDecodedPlane[2].pac_data,
4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                          (pPlaneOut[2].u_height * pPlaneOut[2].u_width));
4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->lastDecodedPlane = pPlaneOut;
4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_AUDIOONLY*/
4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intApplyVPP: returning M4NO_ERROR");
4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
456