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