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    M4PTO3GPP_VideoPreProcessing.c
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Picture to 3gpp Service video preprocessing management.
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    OSAL Debug utilities */
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    OSAL Memory management */
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h"
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    Definition of the M4PTO3GPP internal context */
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4PTO3GPP_InternalTypes.h"
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    Definition of the M4PTO3GPP errors */
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4PTO3GPP_ErrorCodes.h"
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* If time increment is too low then we have an infinite alloc loop into M4ViEncCaptureFrame() */
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Time increment should match 30 fps maximum */
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4PTO3GPP_MIN_TIME_INCREMENT 33.3333334
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PTO3GPP_applyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn,
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                 M4VIFI_ImagePlane* pPlaneOut)
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Call an external callback to get the picture to encode
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    It is called by the video encoder
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext    (IN) VPP context, which actually is the M4PTO3GPP internal context
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                            in our case
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pPlaneIn    (IN) Contains the image
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pPlaneOut    (IN/OUT) Pointer to an array of 3 planes that will contain the
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                        output YUV420 image read with the m_pPictureCallbackFct
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    Any error returned by an underlaying module
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************************************************/
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PTO3GPP_applyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn,
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             M4VIFI_ImagePlane* pPlaneOut)
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************************************************/
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR    err;
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Double mtDuration;
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 i;
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*** NOTE ***/
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* It's OK to get pPlaneIn == M4OSA_NULL here                        */
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* since it has been given NULL in the pFctEncode() call.            */
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* It's because we use the M4PTO3GPP internal context to            */
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* transmit the encoder input data.                                    */
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* The input data is the image read from the m_pPictureCallbackFct    */
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     *    The VPP context is actually the M4PTO3GPP context! */
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4PTO3GPP_InternalContext *pC = (M4PTO3GPP_InternalContext*)(pContext);
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *  Get the picture to encode */
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_FALSE == pC->m_bLastInternalCallBack)
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_Params.pPictureCallbackFct(pC->m_Params.pPictureCallbackCtxt, pPlaneOut,
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             &mtDuration);
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* In case of error when getting YUV to encode (ex: error when decoding a JPEG) */
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if((M4NO_ERROR != err) && (((M4OSA_UInt32)M4PTO3GPP_WAR_LAST_PICTURE) != err))
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * If end of encoding is asked by the size limitation system,
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * we must end the encoding the same way that when it is asked by the
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * picture callback (a.k.a. the integrator).
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * Thus we simulate the LastPicture code return: */
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_TRUE == pC->m_IsLastPicture)
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4PTO3GPP_WAR_LAST_PICTURE;
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(((M4OSA_UInt32)M4PTO3GPP_WAR_LAST_PICTURE) == err)
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_bLastInternalCallBack = M4OSA_TRUE; /* Toggle flag for the final call of the CB*/
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_IsLastPicture         = M4OSA_TRUE; /* To stop the encoder */
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pSavedPlane             = pPlaneOut;  /* Save the last YUV plane ptr */
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->uiSavedDuration         = (M4OSA_UInt32)mtDuration; /* Save the last duration */
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**< Not necessary here because the last frame duration is set to the-last-but-one by
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                the light writer */
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**< Only necessary for pC->m_mtNextCts below...*/
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mtDuration = pC->uiSavedDuration;
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /** Copy the last YUV plane into the current one
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * (the last pic is splited due to the callback extra-call... */
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for (i=0; i<3; i++)
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
12232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *)pPlaneOut[i].pac_data,
12332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                 (void *)pC->pSavedPlane[i].pac_data,
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     pPlaneOut[i].u_stride * pPlaneOut[i].u_height);
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* TimeIncrement should be 30 fps maximum */
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(mtDuration < M4PTO3GPP_MIN_TIME_INCREMENT)
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mtDuration = M4PTO3GPP_MIN_TIME_INCREMENT;
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_mtNextCts += mtDuration;
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4PTO3GPP_applyVPP: returning M4NO_ERROR");
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
140