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 M4VSS3GPP_EditVideo.c 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Video Studio Service 3GPP edit API implementation. 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 233e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong#undef M4OSA_TRACE_LEVEL 243e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong#define M4OSA_TRACE_LEVEL 1 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************/ 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*** Includes ***/ 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************/ 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "NXPSW_CompilerSwitches.h" 317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Our header */ 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_API.h" 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalTypes.h" 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalFunctions.h" 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalConfig.h" 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_ErrorCodes.h" 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// StageFright encoders require %16 resolution 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4ENCODER_common.h" 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * OSAL headers */ 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h" /**< OSAL memory management */ 447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h" /**< OSAL debug management */ 457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * component includes */ 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VFL_transition.h" /**< video effects */ 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*for transition behaviour*/ 517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <math.h> 526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury#include "M4AIR_API.h" 536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury#include "M4VSS3GPP_Extended_API.h" 546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury/** Determine absolute value of a. */ 556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury#define M4xVSS_ABS(a) ( ( (a) < (0) ) ? (-(a)) : (a) ) 566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury#define Y_PLANE_BORDER_VALUE 0x00 576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury#define U_PLANE_BORDER_VALUE 0x80 586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury#define V_PLANE_BORDER_VALUE 0x80 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/************************************************************************/ 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Static local functions */ 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/************************************************************************/ 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intCheckVideoMode( 657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_InternalEditContext *pC ); 667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void 677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_intCheckVideoEffects( M4VSS3GPP_InternalEditContext *pC, 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiClipNumber ); 69eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Tengstatic M4OSA_ERR M4VSS3GPP_intApplyVideoEffect( 70eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_InternalEditContext *pC, M4VIFI_ImagePlane *pPlaneIn, 71eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VIFI_ImagePlane *pPlaneOut, M4OSA_Bool bSkipFramingEffect); 72eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR 747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_intVideoTransition( M4VSS3GPP_InternalEditContext *pC, 757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane *pPlaneOut ); 767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void 787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_intUpdateTimeInfo( M4VSS3GPP_InternalEditContext *pC, 797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_AccessUnit *pAU ); 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void M4VSS3GPP_intSetH263TimeCounter( M4OSA_MemAddr8 pAuDataBuffer, 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiCts ); 827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void M4VSS3GPP_intSetMPEG4Gov( M4OSA_MemAddr8 pAuDataBuffer, 837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiCtsSec ); 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void M4VSS3GPP_intGetMPEG4Gov( M4OSA_MemAddr8 pAuDataBuffer, 857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 *pCtsSec ); 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAllocateYUV420( M4VIFI_ImagePlane *pPlanes, 877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiWidth, M4OSA_UInt32 uiHeight ); 886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdurystatic M4OSA_ERR M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420( 896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_Void* pFileIn, M4OSA_FileReadPointer* pFileReadPtr, 906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane* pImagePlanes, 916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt32 width,M4OSA_UInt32 height); 926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdurystatic M4OSA_ERR M4VSS3GPP_intApplyRenderingMode( 936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_InternalEditContext *pC, 946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4xVSS_MediaRendering renderingMode, 956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane* pInplane, 966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane* pOutplane); 976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdurystatic M4OSA_ERR M4VSS3GPP_intSetYuv420PlaneFromARGB888 ( 996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_InternalEditContext *pC, 1006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_ClipContext* pClipCtxt); 1016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdurystatic M4OSA_ERR M4VSS3GPP_intRenderFrameWithEffect( 1026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_InternalEditContext *pC, 1036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_ClipContext* pClipCtxt, 104d125366181feab7e45905a8051c94ab5a845e503Chih-Chung Chang M4_MediaTime ts, 1056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_Bool bIsClip1, 1066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pResizePlane, 1076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pPlaneNoResize, 1086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pPlaneOut); 1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 110e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdurystatic M4OSA_ERR M4VSS3GPP_intRotateVideo(M4VIFI_ImagePlane* pPlaneIn, 111e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_UInt32 rotationDegree); 112e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 113e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdurystatic M4OSA_ERR M4VSS3GPP_intSetYUV420Plane(M4VIFI_ImagePlane* planeIn, 114e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_UInt32 width, M4OSA_UInt32 height); 115e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 116eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Tengstatic M4OSA_ERR M4VSS3GPP_intApplyVideoOverlay ( 117eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_InternalEditContext *pC, 118eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VIFI_ImagePlane *pPlaneIn, 119eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VIFI_ImagePlane *pPlaneOut); 120eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intEditStepVideo() 1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief One step of video processing 1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pC (IN/OUT) Internal edit context 1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intEditStepVideo( M4VSS3GPP_InternalEditContext *pC ) 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 iCts, iNextCts; 1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_FrameMode FrameMode; 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bSkipFrame; 1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt16 offset; 1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 137f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes * Check if we reached end cut. Decorrelate input and output encoding 138f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes * timestamp to handle encoder prefetch 139f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes */ 140f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes if ( ((M4OSA_Int32)(pC->ewc.dInputVidCts) - pC->pC1->iVoffset 141f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes + pC->iInOutTimeOffset) >= pC->pC1->iEndTime ) 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Re-adjust video to precise cut time */ 144f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes pC->iInOutTimeOffset = ((M4OSA_Int32)(pC->ewc.dInputVidCts)) 145f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes - pC->pC1->iVoffset + pC->iInOutTimeOffset - pC->pC1->iEndTime; 146f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes if ( pC->iInOutTimeOffset < 0 ) { 147f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes pC->iInOutTimeOffset = 0; 148f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes } 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Video is done for this clip */ 1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intReachedEndOfVideo(pC); 1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* RC: to know when a file has been processed */ 1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err && err != M4VSS3GPP_WAR_SWITCH_CLIP) 1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: M4VSS3GPP_intReachedEndOfVideo returns 0x%x", 1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Don't change the states if we are in decodeUpTo() */ 1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( (M4VSS3GPP_kClipStatus_DECODE_UP_TO != pC->pC1->Vstatus) 1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (( pC->pC2 == M4OSA_NULL) 1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kClipStatus_DECODE_UP_TO != pC->pC2->Vstatus)) ) 1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check Video Mode, depending on the current output CTS */ 1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intCheckVideoMode( 1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC); /**< This function change the pC->Vstate variable! */ 1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: M4VSS3GPP_intCheckVideoMode returns 0x%x!", 1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pC->Vstate ) 1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* _________________ */ 1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| |*/ 1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| READ_WRITE MODE |*/ 1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*|_________________|*/ 1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kEditVideoState_READ_WRITE: 1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kEditVideoState_AFTER_CUT: 1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intEditStepVideo READ_WRITE"); 1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bSkipFrame = M4OSA_FALSE; 1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If we were decoding the clip, we must jump to be sure 2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * to get to the good position. */ 2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kClipStatus_READ != pC->pC1->Vstatus ) 2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Jump to target video time (tc = to-T) */ 2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iCts = (M4OSA_Int32)(pC->ewc.dInputVidCts) - pC->pC1->iVoffset; 2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->pC1->ShellAPI.m_pReader->m_pFctJump( 2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->pReaderContext, 2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pC->pC1->pVideoStream, &iCts); 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo:\ 2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi READ_WRITE: m_pReader->m_pFctJump(V1) returns 0x%x!", 2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->pC1->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->pReaderContext, 2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pC->pC1->pVideoStream, 2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pC->pC1->VideoAU); 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) ) 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo:\ 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi READ_WRITE: m_pReader->m_pFctGetNextAu returns 0x%x!", 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_3("A .... read : cts = %.0f + %ld [ 0x%x ]", 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->VideoAU.m_CTS, pC->pC1->iVoffset, 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->VideoAU.m_size); 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* This frame has been already written in BEGIN CUT step -> skip it */ 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->pC1->VideoAU.m_CTS == iCts 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && pC->pC1->iVideoRenderCts >= iCts ) 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bSkipFrame = M4OSA_TRUE; 2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* This frame has been already written in BEGIN CUT step -> skip it */ 2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( pC->Vstate == M4VSS3GPP_kEditVideoState_AFTER_CUT) 2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (pC->pC1->VideoAU.m_CTS 2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + pC->pC1->iVoffset <= pC->ewc.WriterVideoAU.CTS) ) 2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bSkipFrame = M4OSA_TRUE; 2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Remember the clip reading state */ 2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->Vstatus = M4VSS3GPP_kClipStatus_READ; 2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Rounding is to compensate reader imprecision (m_CTS is actually an integer) 2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iCts = ((M4OSA_Int32)pC->ewc.dInputVidCts) - pC->pC1->iVoffset - 1; 2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iNextCts = iCts + ((M4OSA_Int32)pC->dOutputFrameDuration) + 1; 2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Avoid to write a last frame of duration 0 */ 2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( iNextCts > pC->pC1->iEndTime ) 2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iNextCts = pC->pC1->iEndTime; 2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If the AU is good to be written, write it, else just skip it */ 2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4OSA_FALSE == bSkipFrame) 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (( pC->pC1->VideoAU.m_CTS >= iCts) 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (pC->pC1->VideoAU.m_CTS < iNextCts) 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (pC->pC1->VideoAU.m_size > 0)) ) 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Get the output AU to write into */ 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pWriterDataFcts->pStartAU( 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.p3gpWriterContext, 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_WRITER_VIDEO_STREAM_ID, 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pC->ewc.WriterVideoAU); 2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: READ_WRITE:\ 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pWriterDataFcts->pStartAU(Video) returns 0x%x!", 2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copy the input AU to the output AU */ 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.WriterVideoAU.attribute = pC->pC1->VideoAU.m_attribute; 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.WriterVideoAU.CTS = (M4OSA_Time)pC->pC1->VideoAU.m_CTS + 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Time)pC->pC1->iVoffset; 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.dInputVidCts += pC->dOutputFrameDuration; 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi offset = 0; 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* for h.264 stream do not read the 1st 4 bytes as they are header 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi indicators */ 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->pC1->pVideoStream->m_basicProperties.m_streamType 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4DA_StreamTypeVideoMpeg4Avc ) 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi offset = 4; 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.WriterVideoAU.size = pC->pC1->VideoAU.m_size - offset; 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->ewc.WriterVideoAU.size > pC->ewc.uiVideoMaxAuSize ) 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_2( 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: READ_WRITE: AU size greater than\ 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MaxAuSize (%d>%d)! returning M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE", 3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.WriterVideoAU.size, pC->ewc.uiVideoMaxAuSize); 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE; 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)pC->ewc.WriterVideoAU.dataAddress, 31432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)(pC->pC1->VideoAU.m_dataAddress + offset), 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pC->ewc.WriterVideoAU.size)); 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Update time info for the Counter Time System to be equal to the bit 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi -stream time*/ 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intUpdateTimeInfo(pC, &pC->ewc.WriterVideoAU); 3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_2("B ---- write : cts = %lu [ 0x%x ]", 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.WriterVideoAU.CTS, pC->ewc.WriterVideoAU.size); 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the AU */ 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pWriterDataFcts->pProcessAU( 3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.p3gpWriterContext, 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_WRITER_VIDEO_STREAM_ID, 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pC->ewc.WriterVideoAU); 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi file size is reached 3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi The editing is then finished, the warning M4VSS3GPP_WAR_EDITING_DONE 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi is returned*/ 3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4WAR_WRITER_STOP_REQ == err ) 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: File was cut to avoid oversize"); 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_WAR_EDITING_DONE; 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: READ_WRITE:\ 3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pWriterDataFcts->pProcessAU(Video) returns 0x%x!", 3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Read next AU for next step */ 3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->pC1->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( 3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->pReaderContext, 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pC->pC1->pVideoStream, 3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pC->pC1->VideoAU); 3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) ) 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: READ_WRITE:\ 3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pReaderDataIt->m_pFctGetNextAu returns 0x%x!", 3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_3("C .... read : cts = %.0f + %ld [ 0x%x ]", 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->VideoAU.m_CTS, pC->pC1->iVoffset, 3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->VideoAU.m_size); 3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Decide wether to read or to increment time increment */ 3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( pC->pC1->VideoAU.m_size == 0) 3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (pC->pC1->VideoAU.m_CTS >= iNextCts) ) 3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Increment time by the encoding period (NO_MORE_AU or reader in advance */ 3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.dInputVidCts += pC->dOutputFrameDuration; 3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Switch (from AFTER_CUT) to normal mode because time is 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi no more frozen */ 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* In other cases (reader late), just let the reader catch up 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.dVTo */ 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->pC1->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->pReaderContext, 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pC->pC1->pVideoStream, 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pC->pC1->VideoAU); 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) ) 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: READ_WRITE:\ 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pReaderDataIt->m_pFctGetNextAu returns 0x%x!", 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_3("D .... read : cts = %.0f + %ld [ 0x%x ]", 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->VideoAU.m_CTS, pC->pC1->iVoffset, 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->VideoAU.m_size); 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ____________________ */ 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| |*/ 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| DECODE_ENCODE MODE |*/ 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| BEGIN_CUT MODE |*/ 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*|____________________|*/ 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kEditVideoState_DECODE_ENCODE: 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kEditVideoState_BEGIN_CUT: 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo DECODE_ENCODE / BEGIN_CUT"); 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pC->pC1->pSettings->FileType == 4276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) && 4286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_FALSE == 4296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pSettings->ClipProperties.bSetImageData)) { 4306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 4316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intSetYuv420PlaneFromARGB888(pC, pC->pC1); 4326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if( M4NO_ERROR != err ) { 4336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1( 4346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ 4356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intSetYuv420PlaneFromARGB888 err=%x", err); 4366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 4376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 4386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Decode the video up to the target time 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (will jump to the previous RAP if needed ) */ 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intClipDecodeVideoUpToCts(pC->pC1, (M4OSA_Int32)pC->ewc.dInputVidCts); 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ 4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intDecodeVideoUpToCts returns err=0x%x", 4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If the decoding is not completed, do one more step with time frozen */ 4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC1->Vstatus ) 4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Reset the video pre-processing error before calling the encoder */ 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VppError = M4NO_ERROR; 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("E ++++ encode AU"); 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Encode the frame(rendering,filtering and writing will be done 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi in encoder callbacks)*/ 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->Vstate == M4VSS3GPP_kEditVideoState_BEGIN_CUT ) 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi FrameMode = M4ENCODER_kIFrame; 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi FrameMode = M4ENCODER_kNormalFrame; 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctEncode(pC->ewc.pEncContext, M4OSA_NULL, 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.dInputVidCts, FrameMode); 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check if we had a VPP error... */ 4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != pC->ewc.VppError ) 4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoEncoderGlobalFcts->pFctEncode, returning VppErr=0x%x", 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VppError); 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_SUPPORT_OMX_CODECS 4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4WAR_VIDEORENDERER_NO_NEW_FRAME != pC->ewc.VppError ) 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif //M4VSS_SUPPORT_OMX_CODECS 4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return pC->ewc.VppError; 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_SUPPORT_OMX_CODECS 4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif //M4VSS_SUPPORT_OMX_CODECS 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4NO_ERROR != err ) /**< ...or an encoder error */ 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ((M4OSA_UInt32)M4ERR_ALLOC) == err ) 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR"); 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR; 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output 5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi file size is reached 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi The editing is then finished, the warning M4VSS3GPP_WAR_EDITING_DONE 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi is returned*/ 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4WAR_WRITER_STOP_REQ == err ) 5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: File was cut to avoid oversize"); 5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_WAR_EDITING_DONE; 5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ 5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoEncoderGlobalFcts->pFctEncode returns 0x%x", 5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Increment time by the encoding period (for begin cut, do not increment to not 5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi loose P-frames) */ 5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kEditVideoState_DECODE_ENCODE == pC->Vstate ) 5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.dInputVidCts += pC->dOutputFrameDuration; 5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* _________________ */ 5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| |*/ 5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| TRANSITION MODE |*/ 5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*|_________________|*/ 5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kEditVideoState_TRANSITION: 5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intEditStepVideo TRANSITION"); 5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Don't decode more than needed */ 5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( !(( M4VSS3GPP_kClipStatus_DECODE_UP_TO != pC->pC1->Vstatus) 5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC2->Vstatus)) ) 5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Decode the clip1 video up to the target time 5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (will jump to the previous RAP if needed */ 5536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pC->pC1->pSettings->FileType == 5546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) && 5556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_FALSE == 5566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pSettings->ClipProperties.bSetImageData)) { 5576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 5586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intSetYuv420PlaneFromARGB888(pC, pC->pC1); 5596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if( M4NO_ERROR != err ) { 5606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1( 5616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury "M4VSS3GPP_intEditStepVideo: TRANSITION:\ 5626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intSetYuv420PlaneFromARGB888 err=%x", err); 5636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 5646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 5656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intClipDecodeVideoUpToCts(pC->pC1, 5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)pC->ewc.dInputVidCts); 5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: TRANSITION:\ 5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intDecodeVideoUpToCts(C1) returns err=0x%x", 5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If the decoding is not completed, do one more step with time frozen */ 5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC1->Vstatus ) 5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Don't decode more than needed */ 5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( !(( M4VSS3GPP_kClipStatus_DECODE_UP_TO != pC->pC2->Vstatus) 5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC1->Vstatus)) ) 5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Decode the clip2 video up to the target time 5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (will jump to the previous RAP if needed) */ 5926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pC->pC2->pSettings->FileType == 5936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) && 5946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_FALSE == 5956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC2->pSettings->ClipProperties.bSetImageData)) { 5966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 5976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intSetYuv420PlaneFromARGB888(pC, pC->pC2); 5986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if( M4NO_ERROR != err ) { 5996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1( 6006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury "M4VSS3GPP_intEditStepVideo: TRANSITION:\ 6016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intSetYuv420PlaneFromARGB888 err=%x", err); 6026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 6036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 6046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 6056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intClipDecodeVideoUpToCts(pC->pC2, 6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)pC->ewc.dInputVidCts); 6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: TRANSITION:\ 6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intDecodeVideoUpToCts(C2) returns err=0x%x", 6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If the decoding is not completed, do one more step with time frozen */ 6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC2->Vstatus ) 6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Reset the video pre-processing error before calling the encoder */ 6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VppError = M4NO_ERROR; 6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("F **** blend AUs"); 6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Encode the frame (rendering, filtering and writing will be done 6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi in encoder callbacks */ 6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctEncode(pC->ewc.pEncContext, M4OSA_NULL, 6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.dInputVidCts, M4ENCODER_kNormalFrame); 6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If encode returns a process frame error, it is likely to be a VPP error */ 6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != pC->ewc.VppError ) 6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: TRANSITION:\ 6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoEncoderGlobalFcts->pFctEncode, returning VppErr=0x%x", 6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VppError); 6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_SUPPORT_OMX_CODECS 6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4WAR_VIDEORENDERER_NO_NEW_FRAME != pC->ewc.VppError ) 6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif //M4VSS_SUPPORT_OMX_CODECS 6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return pC->ewc.VppError; 6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_SUPPORT_OMX_CODECS 6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif //M4VSS_SUPPORT_OMX_CODECS 6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4NO_ERROR != err ) /**< ...or an encoder error */ 6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ((M4OSA_UInt32)M4ERR_ALLOC) == err ) 6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: TRANSITION:\ 6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR"); 6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR; 6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output 6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi file size is reached 6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi The editing is then finished, the warning M4VSS3GPP_WAR_EDITING_DONE is 6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returned*/ 6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4WAR_WRITER_STOP_REQ == err ) 6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: File was cut to avoid oversize"); 6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_WAR_EDITING_DONE; 6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: TRANSITION:\ 6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoEncoderGlobalFcts->pFctEncode returns 0x%x", 6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Increment time by the encoding period */ 6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.dInputVidCts += pC->dOutputFrameDuration; 6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ____________ */ 6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| |*/ 6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*| ERROR CASE |*/ 7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*|____________|*/ 7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intEditStepVideo: invalid internal state (0x%x),\ 7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_INTERNAL_STATE", 7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate); 7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_INTERNAL_STATE; 7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with no error */ 7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intEditStepVideo: returning M4NO_ERROR"); 7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intCheckVideoMode() 7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Check which video process mode we must use, depending on the output CTS. 7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pC (IN/OUT) Internal edit context 7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intCheckVideoMode( 7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_InternalEditContext *pC ) 7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const M4OSA_Int32 t = (M4OSA_Int32)pC->ewc.dInputVidCts; 7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Transition duration */ 7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const M4OSA_Int32 TD = pC->pTransitionList[pC->uiCurrentClip].uiTransitionDuration; 7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 iTmp; 7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const M4VSS3GPP_EditVideoState previousVstate = pC->Vstate; 7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check if Clip1 is on its begin cut, or in an effect zone */ 7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intCheckVideoEffects(pC, 1); 7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check if we are in the transition with next clip */ 7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( TD > 0) && (( t - pC->pC1->iVoffset) >= (pC->pC1->iEndTime - TD)) ) 7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We are in a transition */ 7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_TRANSITION; 7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->bTransitionEffect = M4OSA_TRUE; 7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Open second clip for transition, if not yet opened */ 7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pC->pC2 ) 7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->bGetYuvDataFromDecoder = M4OSA_TRUE; 7546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intOpenClip(pC, &pC->pC2, 7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pC->pClipList[pC->uiCurrentClip + 1]); 7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCheckVideoMode: M4VSS3GPP_editOpenClip returns 0x%x!", 7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Add current video output CTS to the clip offset 7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (audio output CTS is not yet at the transition, so audio 7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * offset can't be updated yet). */ 7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC2->iVoffset += (M4OSA_UInt32)pC->ewc.dInputVidCts; 7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 2005-03-24: BugFix for audio-video synchro: 7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Update transition duration due to the actual video transition beginning time. 7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * It will avoid desynchronization when doing the audio transition. */ 7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iTmp = ((M4OSA_Int32)pC->ewc.dInputVidCts)\ 7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - (pC->pC1->iEndTime - TD + pC->pC1->iVoffset); 7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (iTmp < (M4OSA_Int32)pC->pTransitionList[pC->uiCurrentClip].uiTransitionDuration) 7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Test in case of a very short transition */ 7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pTransitionList[pC-> 7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCurrentClip].uiTransitionDuration -= iTmp; 7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Don't forget to also correct the total duration used for the progress bar 7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (it was computed with the original transition duration). */ 7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.iOutputDuration += iTmp; 7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< No "else" here because it's hard predict the effect of 0 duration transition...*/ 7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check effects for clip2 */ 7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intCheckVideoEffects(pC, 2); 7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We are not in a transition */ 8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->bTransitionEffect = M4OSA_FALSE; 8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If there is an effect we go to decode/encode mode */ 8056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if((pC->nbActiveEffects > 0) || (pC->nbActiveEffects1 > 0) || 8066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->pC1->pSettings->FileType == 8076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) || 8086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->pC1->pSettings->bTranscodingRequired == M4OSA_TRUE)) { 8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_DECODE_ENCODE; 8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* We do a begin cut, except if already done (time is not progressing because we want 8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi to catch all P-frames after the cut) */ 8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4OSA_TRUE == pC->bClip1AtBeginCut ) 8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 815ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes if(pC->pC1->pSettings->ClipProperties.VideoStreamType == M4VIDEOEDITING_kH264) { 816ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes pC->Vstate = M4VSS3GPP_kEditVideoState_DECODE_ENCODE; 817ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes pC->bEncodeTillEoF = M4OSA_TRUE; 818ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes } else if( ( M4VSS3GPP_kEditVideoState_BEGIN_CUT == previousVstate) 819ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes || (M4VSS3GPP_kEditVideoState_AFTER_CUT == previousVstate) ) { 8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_AFTER_CUT; 821ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes } else { 8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_BEGIN_CUT; 823ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes } 8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Else we are in default copy/paste mode */ 8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4VSS3GPP_kEditVideoState_BEGIN_CUT == previousVstate) 8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kEditVideoState_AFTER_CUT == previousVstate) ) 8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_AFTER_CUT; 8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( pC->bIsMMS == M4OSA_TRUE ) 8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 currentBitrate; 8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Do we need to reencode the video to downgrade the bitrate or not ? */ 8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Let's compute the cirrent bitrate of the current edited clip */ 8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->pC1->ShellAPI.m_pReader->m_pFctGetOption( 8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->pReaderContext, 8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4READER_kOptionID_Bitrate, ¤tBitrate); 8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( err != M4NO_ERROR ) 8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCheckVideoMode:\ 8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Error when getting next bitrate of edited clip: 0x%x", 8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Remove audio bitrate */ 8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi currentBitrate -= 12200; 8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Test if we go into copy/paste mode or into decode/encode mode */ 8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( currentBitrate > pC->uiMMSVideoBitrate ) 8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_DECODE_ENCODE; 8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; 8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 866bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava else if(!((pC->m_bClipExternalHasStarted == M4OSA_TRUE) && 867ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes (pC->Vstate == M4VSS3GPP_kEditVideoState_DECODE_ENCODE)) && 868ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes pC->bEncodeTillEoF == M4OSA_FALSE) 8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 870bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava /** 871bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * Test if we go into copy/paste mode or into decode/encode mode 872bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * If an external effect has been applied on the current clip 873bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * then continue to be in decode/encode mode till end of 874bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * clip to avoid H.264 distortion. 875bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava */ 8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; 8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check if we create an encoder */ 8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( ( M4VSS3GPP_kEditVideoState_READ_WRITE == previousVstate) 8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kEditVideoState_AFTER_CUT 8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == previousVstate)) /**< read mode */ 8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (( M4VSS3GPP_kEditVideoState_DECODE_ENCODE == pC->Vstate) 8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kEditVideoState_BEGIN_CUT == pC->Vstate) 8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kEditVideoState_TRANSITION 8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pC->Vstate)) /**< encode mode */ 8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && pC->bIsMMS == M4OSA_FALSE ) 8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 893276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury * Create the encoder, if not created already*/ 894276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury if (pC->ewc.encoderState == M4VSS3GPP_kNoEncoder) { 895276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury err = M4VSS3GPP_intCreateVideoEncoder(pC); 8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 897276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury if( M4NO_ERROR != err ) 898276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury { 899276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury M4OSA_TRACE1_1( 900276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury "M4VSS3GPP_intCheckVideoMode: M4VSS3GPP_intCreateVideoEncoder \ 901276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury returns 0x%x!", err); 902276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury return err; 903276adbc8cab51c5cd60906fdbff9c7d5345ad0a6Rajneesh Chowdury } 9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( pC->bIsMMS == M4OSA_TRUE && pC->ewc.pEncContext == M4OSA_NULL ) 9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Create the encoder */ 9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intCreateVideoEncoder(pC); 9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCheckVideoMode: M4VSS3GPP_intCreateVideoEncoder returns 0x%x!", 9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * When we go from filtering to read/write, we must act like a begin cut, 9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * because the last filtered image may be different than the original image. */ 9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( ( ( M4VSS3GPP_kEditVideoState_DECODE_ENCODE == previousVstate) 9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kEditVideoState_TRANSITION 9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == previousVstate)) /**< encode mode */ 9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (M4VSS3GPP_kEditVideoState_READ_WRITE == pC->Vstate) /**< read mode */ 928ac9dde5945fd00a6fb882bd171ee8a42a091fb86Danny Fernandes && (pC->bEncodeTillEoF == M4OSA_FALSE) ) 9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->Vstate = M4VSS3GPP_kEditVideoState_BEGIN_CUT; 9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check if we destroy an encoder */ 9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( ( ( M4VSS3GPP_kEditVideoState_DECODE_ENCODE == previousVstate) 9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kEditVideoState_BEGIN_CUT == previousVstate) 9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kEditVideoState_TRANSITION 9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == previousVstate)) /**< encode mode */ 9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (( M4VSS3GPP_kEditVideoState_READ_WRITE == pC->Vstate) 9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VSS3GPP_kEditVideoState_AFTER_CUT 9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pC->Vstate)) /**< read mode */ 9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && pC->bIsMMS == M4OSA_FALSE ) 9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Destroy the previously created encoder */ 9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intDestroyVideoEncoder(pC); 9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCheckVideoMode: M4VSS3GPP_intDestroyVideoEncoder returns 0x%x!", 9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with no error */ 9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intCheckVideoMode: returning M4NO_ERROR"); 9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************************************************************************** 9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intStartAU() 9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief StartAU writer-like interface used for the VSS 3GPP only 9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pContext: (IN) It is the VSS 3GPP context in our case 9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param streamID: (IN) Id of the stream to which the Access Unit is related. 9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pAU: (IN/OUT) Access Unit to be prepared. 9707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: there is no error 9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intStartAU( M4WRITER_Context pContext, 9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamID streamID, M4SYS_AccessUnit *pAU ) 9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiMaxAuSize; 9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Given context is actually the VSS3GPP context */ 9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_InternalEditContext *pC = 9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4VSS3GPP_InternalEditContext *)pContext; 9837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Get the output AU to write into */ 9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext, 9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_WRITER_VIDEO_STREAM_ID, pAU); 9887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intStartAU: pWriterDataFcts->pStartAU(Video) returns 0x%x!", 9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 9947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return */ 9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intStartAU: returning M4NO_ERROR"); 10007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 10027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************************************************************************** 10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intProcessAU() 10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief ProcessAU writer-like interface used for the VSS 3GPP only 10067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pContext: (IN) It is the VSS 3GPP context in our case 10087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param streamID: (IN) Id of the stream to which the Access Unit is related. 10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pAU: (IN/OUT) Access Unit to be written 10107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: there is no error 10117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intProcessAU( M4WRITER_Context pContext, 10147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamID streamID, M4SYS_AccessUnit *pAU ) 10157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 10167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Given context is actually the VSS3GPP context */ 10207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_InternalEditContext *pC = 10217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4VSS3GPP_InternalEditContext *)pContext; 10227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Fix the encoded AU time */ 10257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 10267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.dOutputVidCts = pAU->CTS; 10277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Update time info for the Counter Time System to be equal to the bit-stream time */ 10297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intUpdateTimeInfo(pC, pAU); 10307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the AU */ 10337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext, 10347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_WRITER_VIDEO_STREAM_ID, pAU); 10357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 10377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intProcessAU: pWriterDataFcts->pProcessAU(Video) returns 0x%x!", 10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 10417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return */ 10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intProcessAU: returning M4NO_ERROR"); 10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 10487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 10517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 10527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intVPP() 10537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief We implement our own VideoPreProcessing function 10547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note It is called by the video encoder 10557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pContext (IN) VPP context, which actually is the VSS 3GPP context in our case 10567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pPlaneIn (IN) 10577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pPlaneOut (IN/OUT) Pointer to an array of 3 planes that will contain the output 10587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * YUV420 image 10597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 10607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 10617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 10627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intVPP( M4VPP_Context pContext, M4VIFI_ImagePlane *pPlaneIn, 10637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane *pPlaneOut ) 10647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 10656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 10666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4_MediaTime ts; 10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane *pTmp = M4OSA_NULL; 10686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pLastDecodedFrame = M4OSA_NULL ; 10696e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pDecoderRenderFrame = M4OSA_NULL; 10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane pTemp1[3],pTemp2[3]; 10716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane pTempPlaneClip1[3],pTempPlaneClip2[3]; 1072e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_UInt32 i = 0, yuvFrameWidth = 0, yuvFrameHeight = 0; 1073eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_Bool bSkipFrameEffect = M4OSA_FALSE; 10747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * VPP context is actually the VSS3GPP context */ 10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_InternalEditContext *pC = 10777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4VSS3GPP_InternalEditContext *)pContext; 10786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 10796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pTemp1, 0, 3*sizeof(M4VIFI_ImagePlane)); 10806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pTemp2, 0, 3*sizeof(M4VIFI_ImagePlane)); 10816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pTempPlaneClip1, 0, 3*sizeof(M4VIFI_ImagePlane)); 10826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pTempPlaneClip2, 0, 3*sizeof(M4VIFI_ImagePlane)); 10836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 10847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Reset VPP error remembered in context */ 10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VppError = M4NO_ERROR; 10877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * At the end of the editing, we may be called when no more clip is loaded. 10907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (because to close the encoder properly it must be stepped one or twice...) */ 10917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pC->pC1 ) 10927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We must fill the input of the encoder with a dummy image, because 10957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * encoding noise leads to a huge video AU, and thus a writer buffer overflow. */ 109632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memset((void *)pPlaneOut[0].pac_data,0, 109732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu pPlaneOut[0].u_stride * pPlaneOut[0].u_height); 109832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memset((void *)pPlaneOut[1].pac_data,0, 109932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu pPlaneOut[1].u_stride * pPlaneOut[1].u_height); 110032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memset((void *)pPlaneOut[2].pac_data,0, 110132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu pPlaneOut[2].u_stride * pPlaneOut[2].u_height); 11027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intVPP: returning M4NO_ERROR (abort)"); 11047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 11057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 11087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **************** Transition case ****************/ 11097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_TRUE == pC->bTransitionEffect ) 11107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1111eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1112eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp1, pC->ewc.uiVideoWidth, 1113eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoHeight); 1114eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) 11157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1116eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(1) returns 0x%x, \ 1117eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng returning M4NO_ERROR", err); 1118eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1119eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; /**< Return no error to the encoder core 1120eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng (else it may leak in some situations...) */ 11217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1122eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1123eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp2, pC->ewc.uiVideoWidth, 1124eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoHeight); 1125eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) 11267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1127eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(2) returns 0x%x, \ 1128eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng returning M4NO_ERROR", err); 1129eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1130eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; /**< Return no error to the encoder core 1131eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng (else it may leak in some situations...) */ 11327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1134eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pC->yuv1, pC->ewc.uiVideoWidth, 1135eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoHeight); 1136eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if( M4NO_ERROR != err ) 1137eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng { 1138eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1( 1139eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng "M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(3) returns 0x%x,\ 1140eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng returning M4NO_ERROR", 1141eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err); 1142eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1143eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return 1144eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4NO_ERROR; /**< Return no error to the encoder core 1145eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng (else it may leak in some situations...) */ 11467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1148eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pC->yuv2, pC->ewc.uiVideoWidth, 1149eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoHeight); 1150eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if( M4NO_ERROR != err ) 11517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1152eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1( 1153eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng "M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(4) returns 0x%x,\ 1154eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng returning M4NO_ERROR", 1155eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err); 1156eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1157eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return 1158eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4NO_ERROR; /**< Return no error to the encoder core 1159eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng (else it may leak in some situations...) */ 11607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1162eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pC->yuv3, pC->ewc.uiVideoWidth, 1163eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoHeight); 1164eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if( M4NO_ERROR != err ) 11657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1166eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1( 1167eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng "M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(3) returns 0x%x,\ 1168eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng returning M4NO_ERROR", 1169eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err); 1170eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1171eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return 1172eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4NO_ERROR; /**< Return no error to the encoder core 1173eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng (else it may leak in some situations...) */ 11747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 11776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Compute the time in the clip1 base: ts = to - Offset */ 11787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 11796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury ts = pC->ewc.dInputVidCts - pC->pC1->iVoffset; 11807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 11827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Render Clip1 */ 11837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->pC1->isRenderDup == M4OSA_FALSE ) 11847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1185d125366181feab7e45905a8051c94ab5a845e503Chih-Chung Chang err = M4VSS3GPP_intRenderFrameWithEffect(pC, pC->pC1, ts, M4OSA_TRUE, 11866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTempPlaneClip1, pTemp1, 11876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneOut); 11886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((M4NO_ERROR != err) && 11896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4WAR_VIDEORENDERER_NO_NEW_FRAME != err)) { 11906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 11916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intRenderFrameWithEffect returns 0x%x", err); 11926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 11936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** Return no error to the encoder core 11946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * else it may leak in some situations.*/ 11956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 11967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pC->pC1->isRenderDup == M4OSA_TRUE) || 11996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4WAR_VIDEORENDERER_NO_NEW_FRAME == err)) { 12006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTmp = pC->yuv1; 12013e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong if (pC->pC1->lastDecodedPlane != M4OSA_NULL) { 12026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /* Copy last decoded plane to output plane */ 12036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pTmp[0].pac_data, 12046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (void *)pC->pC1->lastDecodedPlane[0].pac_data, 12056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pTmp[0].u_height * pTmp[0].u_width)); 12066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pTmp[1].pac_data, 12076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (void *)pC->pC1->lastDecodedPlane[1].pac_data, 12086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pTmp[1].u_height * pTmp[1].u_width)); 12096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pTmp[2].pac_data, 12106e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (void *)pC->pC1->lastDecodedPlane[2].pac_data, 12116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pTmp[2].u_height * pTmp[2].u_width)); 12123e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong } else { 12133e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong err = M4VSS3GPP_ERR_NO_VALID_VID_FRAME; 12143e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong M4OSA_TRACE1_3("Can not find an input frame. Set error 0x%x in %s (%d)", 12153e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong err, __FILE__, __LINE__); 12163e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pC->ewc.VppError = err; 12173e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong return M4NO_ERROR; 12186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 12197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->lastDecodedPlane = pTmp; 12207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 12236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Compute the time in the clip2 base: ts = to - Offset */ 12247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 12256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury ts = pC->ewc.dInputVidCts - pC->pC2->iVoffset; 12267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 12277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Render Clip2 */ 12287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->pC2->isRenderDup == M4OSA_FALSE ) 12297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1231d125366181feab7e45905a8051c94ab5a845e503Chih-Chung Chang err = M4VSS3GPP_intRenderFrameWithEffect(pC, pC->pC2, ts, M4OSA_FALSE, 12326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTempPlaneClip2, pTemp2, 12336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneOut); 12346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((M4NO_ERROR != err) && 12356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4WAR_VIDEORENDERER_NO_NEW_FRAME != err)) { 12366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 12376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intRenderFrameWithEffect returns 0x%x", err); 12386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 12396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** Return no error to the encoder core 12406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * else it may leak in some situations.*/ 12416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 12427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pC->pC2->isRenderDup == M4OSA_TRUE) || 12456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4WAR_VIDEORENDERER_NO_NEW_FRAME == err)) { 12466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTmp = pC->yuv2; 12473e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong if (pC->pC2->lastDecodedPlane != M4OSA_NULL) { 12486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /* Copy last decoded plane to output plane */ 12496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pTmp[0].pac_data, 12506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (void *)pC->pC2->lastDecodedPlane[0].pac_data, 12516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pTmp[0].u_height * pTmp[0].u_width)); 12526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pTmp[1].pac_data, 12536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (void *)pC->pC2->lastDecodedPlane[1].pac_data, 12546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pTmp[1].u_height * pTmp[1].u_width)); 12556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pTmp[2].pac_data, 12566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (void *)pC->pC2->lastDecodedPlane[2].pac_data, 12576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pTmp[2].u_height * pTmp[2].u_width)); 12583e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong } else { 12593e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong err = M4VSS3GPP_ERR_NO_VALID_VID_FRAME; 12603e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong M4OSA_TRACE1_3("Can not find an input frame. Set error 0x%x in %s (%d)", 12613e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong err, __FILE__, __LINE__); 12623e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pC->ewc.VppError = err; 12633e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong return M4NO_ERROR; 12646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC2->lastDecodedPlane = pTmp; 12667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pTmp = pPlaneOut; 12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intVideoTransition(pC, pTmp); 12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 12737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intVPP: M4VSS3GPP_intVideoTransition returns 0x%x,\ 12767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4NO_ERROR", 12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VppError = err; 12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; /**< Return no error to the encoder core 12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (else it may leak in some situations...) */ 12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i=0; i < 3; i++) 12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pTempPlaneClip2[i].pac_data != M4OSA_NULL) { 12856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pTempPlaneClip2[i].pac_data); 12866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTempPlaneClip2[i].pac_data = M4OSA_NULL; 12876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 12886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 12896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pTempPlaneClip1[i].pac_data != M4OSA_NULL) { 12906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pTempPlaneClip1[i].pac_data); 12916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTempPlaneClip1[i].pac_data = M4OSA_NULL; 12926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 12936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 12946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pTemp2[i].pac_data != M4OSA_NULL) { 1295694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pTemp2[i].pac_data); 12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pTemp2[i].pac_data = M4OSA_NULL; 12977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pTemp1[i].pac_data != M4OSA_NULL) { 13006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pTemp1[i].pac_data); 13016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTemp1[i].pac_data = M4OSA_NULL; 13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 13067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **************** No Transition case ****************/ 13077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 13087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE3_0("M4VSS3GPP_intVPP: NO transition case"); 13107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 13116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Compute the time in the clip base: ts = to - Offset */ 13126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury ts = pC->ewc.dInputVidCts - pC->pC1->iVoffset; 1313eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->bIssecondClip = M4OSA_FALSE; 13146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 13156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Render */ 13166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pC->pC1->isRenderDup == M4OSA_FALSE) { 13176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE3_0("M4VSS3GPP_intVPP: renderdup false"); 13187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 13196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Check if resizing is needed */ 13206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4OSA_NULL != pC->pC1->m_pPreResizeFrame) { 13216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pC->pC1->pSettings->FileType == 13226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) && 13236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->nbActiveEffects == 0) && 13246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->pC1->bGetYuvDataFromDecoder == M4OSA_FALSE)) { 13256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 13266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pViDecCtxt, 13276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4DECODER_kOptionID_EnableYuvWithEffect, 13286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_DataOption)M4OSA_TRUE); 13296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR == err ) { 13306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctRender( 13316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pViDecCtxt, &ts, 13326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneOut, M4OSA_TRUE); 13336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 13346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 13356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pC->pC1->pSettings->FileType == 13366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) { 13376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 13386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pViDecCtxt, 13396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4DECODER_kOptionID_EnableYuvWithEffect, 13406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_DataOption)M4OSA_FALSE); 13416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 13426e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR == err) { 13436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctRender( 13446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pViDecCtxt, &ts, 13456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->m_pPreResizeFrame, M4OSA_TRUE); 13466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 13476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 13486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 13496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 13506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury m_pFctRender() returns error 0x%x", err); 13516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 13526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 13536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 1354e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (pC->pC1->pSettings->FileType != 1355e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) { 1356e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (0 != pC->pC1->pSettings->ClipProperties.videoRotationDegrees) { 1357e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // Save width and height of un-rotated frame 1358e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury yuvFrameWidth = pC->pC1->m_pPreResizeFrame[0].u_width; 1359e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury yuvFrameHeight = pC->pC1->m_pPreResizeFrame[0].u_height; 1360e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury err = M4VSS3GPP_intRotateVideo(pC->pC1->m_pPreResizeFrame, 1361e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pC->pC1->pSettings->ClipProperties.videoRotationDegrees); 1362e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (M4NO_ERROR != err) { 1363e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 1364e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury rotateVideo() returns error 0x%x", err); 1365e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pC->ewc.VppError = err; 1366e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4NO_ERROR; 1367e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 1368e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 1369e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 13706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 13716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pC->nbActiveEffects > 0) { 13726e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->bGetYuvDataFromDecoder = M4OSA_TRUE; 13736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 13746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * If we do modify the image, we need an intermediate 13756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * image plane */ 1376eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp1, 1377eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->pC1->m_pPreResizeFrame[0].u_width, 1378eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->pC1->m_pPreResizeFrame[0].u_height); 1379eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 1380eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 1381eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_intAllocateYUV420 error 0x%x", err); 1382eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1383eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 13846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 1385eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* If video frame need to be resized, then apply the overlay after 1386eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * the frame was rendered with rendering mode. 1387eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * Here skip the framing(overlay) effect when applying video Effect. */ 1388eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng bSkipFrameEffect = M4OSA_TRUE; 13896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intApplyVideoEffect(pC, 1390eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->pC1->m_pPreResizeFrame, pTemp1, bSkipFrameEffect); 13916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 13926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 13936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intApplyVideoEffect() error 0x%x", err); 13946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 13956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 13966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 13976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame= pTemp1; 13986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 13996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 14006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame = pC->pC1->m_pPreResizeFrame; 14016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 1402eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Prepare overlay temporary buffer if overlay exist */ 1403eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bClip1ActiveFramingEffect) { 1404eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp2, 1405eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlaneOut[0].u_width, pPlaneOut[0].u_height); 1406eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 1407eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420 \ 1408eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng returns 0x%x, returning M4NO_ERROR", err); 1409eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1410eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 1411eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1412eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pTemp2; 1413eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } else { 1414eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pPlaneOut; 1415eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 14166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 1417eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Do rendering mode. */ 14186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pC->pC1->bGetYuvDataFromDecoder == M4OSA_TRUE) || 14196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->pC1->pSettings->FileType != 14206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888)) { 14216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 14226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intApplyRenderingMode(pC, 14236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pSettings->xVSS.MediaRendering, 14246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame, pTmp); 14256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 14266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 14276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intApplyRenderingMode) error 0x%x ", err); 14286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 14296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 14306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 14316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 14326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 1433eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Apply overlay if overlay is exist */ 1434eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bClip1ActiveFramingEffect) { 1435eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pDecoderRenderFrame = pTmp; 1436eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pPlaneOut; 1437eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intApplyVideoOverlay(pC, 1438eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pDecoderRenderFrame, pTmp); 1439eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 1440eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 1441eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_intApplyVideoOverlay) error 0x%x ", err); 1442eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1443eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 1444eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1445eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1446eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 14476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pC->pC1->pSettings->FileType == 14486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) && 14496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->nbActiveEffects == 0) && 14506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->pC1->bGetYuvDataFromDecoder == M4OSA_TRUE)) { 14516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 14526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 14536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pViDecCtxt, 14546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4DECODER_kOptionID_YuvWithEffectNonContiguous, 14556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_DataOption)pTmp); 14566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 14576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 14586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 14596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 14606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->bGetYuvDataFromDecoder = M4OSA_FALSE; 14616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 1462e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 1463e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // Reset original width and height for resize frame plane 1464e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (0 != pC->pC1->pSettings->ClipProperties.videoRotationDegrees && 1465e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 180 != pC->pC1->pSettings->ClipProperties.videoRotationDegrees) { 1466e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 1467e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VSS3GPP_intSetYUV420Plane(pC->pC1->m_pPreResizeFrame, 1468e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury yuvFrameWidth, yuvFrameHeight); 1469e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 14706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 14716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury else 14727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE3_0("M4VSS3GPP_intVPP: NO resize required"); 1474eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->nbActiveEffects > 0) { 14756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** If we do modify the image, we need an 14766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * intermediate image plane */ 1477eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp1, 1478eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoWidth, 1479eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoHeight); 1480eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 1481eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1482eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 14836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 14846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame = pTemp1; 14856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 14866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury else { 14876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame = pPlaneOut; 14886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 14897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTmp = pPlaneOut; 14916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctRender( 14926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pViDecCtxt, &ts, 14936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame, M4OSA_TRUE); 14946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 14957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VppError = err; 14966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 14976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 14986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 14996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pC->nbActiveEffects > 0) { 1500eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Here we do not skip the overlay effect since 1501eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * overlay and video frame are both of same resolution */ 1502eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng bSkipFrameEffect = M4OSA_FALSE; 1503eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intApplyVideoEffect(pC, 1504eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pDecoderRenderFrame,pPlaneOut,bSkipFrameEffect); 1505e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 15066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 15076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 15086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 15096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 15107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->lastDecodedPlane = pTmp; 15126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->iVideoRenderCts = (M4OSA_Int32)ts; 15137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 15156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE3_0("M4VSS3GPP_intVPP: renderdup true"); 15167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4OSA_NULL != pC->pC1->m_pPreResizeFrame) { 15186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 15196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Copy last decoded plane to output plane */ 15203e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong if (pC->pC1->lastDecodedPlane != M4OSA_NULL) { 15213e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong 15223e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong memcpy((void *)pC->pC1->m_pPreResizeFrame[0].pac_data, 15233e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (void *)pC->pC1->lastDecodedPlane[0].pac_data, 15243e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (pC->pC1->m_pPreResizeFrame[0].u_height * \ 15253e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pC->pC1->m_pPreResizeFrame[0].u_width)); 15263e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong 15273e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong memcpy((void *)pC->pC1->m_pPreResizeFrame[1].pac_data, 15283e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (void *)pC->pC1->lastDecodedPlane[1].pac_data, 15293e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (pC->pC1->m_pPreResizeFrame[1].u_height * \ 15303e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pC->pC1->m_pPreResizeFrame[1].u_width)); 15313e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong 15323e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong memcpy((void *)pC->pC1->m_pPreResizeFrame[2].pac_data, 15333e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (void *)pC->pC1->lastDecodedPlane[2].pac_data, 15343e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (pC->pC1->m_pPreResizeFrame[2].u_height * \ 15353e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pC->pC1->m_pPreResizeFrame[2].u_width)); 15363e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong } else { 15373e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong err = M4VSS3GPP_ERR_NO_VALID_VID_FRAME; 15383e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong M4OSA_TRACE1_3("Can not find an input frame. Set error 0x%x in %s (%d)", 15393e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong err, __FILE__, __LINE__); 15403e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pC->ewc.VppError = err; 15413e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong return M4NO_ERROR; 15423e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong } 15436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 15446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pC->nbActiveEffects > 0) { 15456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 15466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * If we do modify the image, we need an 15476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * intermediate image plane */ 1548eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp1, 1549eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->pC1->m_pPreResizeFrame[0].u_width, 1550eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->pC1->m_pPreResizeFrame[0].u_height); 1551eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 1552eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1553eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 15546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 1555eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* If video frame need to be resized, then apply the overlay after 1556eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * the frame was rendered with rendering mode. 1557eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * Here skip the framing(overlay) effect when applying video Effect. */ 1558eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng bSkipFrameEffect = M4OSA_TRUE; 15596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intApplyVideoEffect(pC, 1560eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->pC1->m_pPreResizeFrame,pTemp1, bSkipFrameEffect); 15616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 15626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 15636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 15646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 15656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame= pTemp1; 15666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 15676e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame = pC->pC1->m_pPreResizeFrame; 15686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 1569eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Prepare overlay temporary buffer if overlay exist */ 1570eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bClip1ActiveFramingEffect) { 1571eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420( 1572eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTemp2, pC->ewc.uiVideoWidth, pC->ewc.uiVideoHeight); 1573eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 1574eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420 \ 1575eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng returns 0x%x, returning M4NO_ERROR", err); 1576eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1577eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 1578eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1579eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pTemp2; 1580eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } else { 1581eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pPlaneOut; 1582eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1583eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Do rendering mode */ 15846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intApplyRenderingMode(pC, 15856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pSettings->xVSS.MediaRendering, 15866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame, pTmp); 15876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 15886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 15896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 15906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 1591eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Apply overlay if overlay is exist */ 1592eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pPlaneOut; 1593eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bClip1ActiveFramingEffect) { 1594eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intApplyVideoOverlay(pC, 1595eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTemp2, pTmp); 15966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 1597eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 1598eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_intApplyRenderingMode) error 0x%x ", err); 15996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 16006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 16016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 16026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 1603eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } else { 1604eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1605eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp1, 1606eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoWidth, 1607eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.uiVideoHeight); 1608eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 1609eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 1610eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 1611eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 16126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 16136e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Copy last decoded plane to output plane */ 16143e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong if (pC->pC1->lastDecodedPlane != M4OSA_NULL && 16153e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pLastDecodedFrame != M4OSA_NULL) { 16163e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong memcpy((void *)pLastDecodedFrame[0].pac_data, 16173e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (void *)pC->pC1->lastDecodedPlane[0].pac_data, 16183e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (pLastDecodedFrame[0].u_height * pLastDecodedFrame[0].u_width)); 16193e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong 16203e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong memcpy((void *)pLastDecodedFrame[1].pac_data, 16213e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (void *)pC->pC1->lastDecodedPlane[1].pac_data, 16223e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (pLastDecodedFrame[1].u_height * pLastDecodedFrame[1].u_width)); 16233e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong 16243e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong memcpy((void *)pLastDecodedFrame[2].pac_data, 16253e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (void *)pC->pC1->lastDecodedPlane[2].pac_data, 16263e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong (pLastDecodedFrame[2].u_height * pLastDecodedFrame[2].u_width)); 16273e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong } else { 16283e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong err = M4VSS3GPP_ERR_NO_VALID_VID_FRAME; 16293e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong M4OSA_TRACE1_3("Can not find an input frame. Set error 0x%x in %s (%d)", 16303e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong err, __FILE__, __LINE__); 16313e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pC->ewc.VppError = err; 16323e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong return M4NO_ERROR; 16333e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong } 16346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 16356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTmp = pPlaneOut; 16366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 1637eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * Check if there is a effect */ 16386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pC->nbActiveEffects > 0) { 1639eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Here we do not skip the overlay effect since 1640eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * overlay and video are both of same resolution */ 1641eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng bSkipFrameEffect = M4OSA_FALSE; 16426e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intApplyVideoEffect(pC, 1643eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pLastDecodedFrame, pTmp,bSkipFrameEffect); 16446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 16456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.VppError = err; 16466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 16476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 16486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 16497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pC1->lastDecodedPlane = pTmp; 16517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE3_1("M4VSS3GPP_intVPP: Rendered at CTS %.3f", ts); 16547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1655eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng for (i=0; i<3; i++) { 1656eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pTemp1[i].pac_data != M4OSA_NULL) { 16576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pTemp1[i].pac_data); 16586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTemp1[i].pac_data = M4OSA_NULL; 16597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1661eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng for (i=0; i<3; i++) { 1662eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pTemp2[i].pac_data != M4OSA_NULL) { 1663eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng free(pTemp2[i].pac_data); 1664eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTemp2[i].pac_data = M4OSA_NULL; 1665eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1666eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 16677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return */ 16717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intVPP: returning M4NO_ERROR"); 16727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 16737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1674eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng/** 1675eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng ****************************************************************************** 1676eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * M4OSA_ERR M4VSS3GPP_intApplyVideoOverlay() 1677eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * @brief Apply video overlay from pPlaneIn to pPlaneOut 1678eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * @param pC (IN/OUT) Internal edit context 1679eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * @param pInputPlanes (IN) Input raw YUV420 image 1680eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * @param pOutputPlanes (IN/OUT) Output raw YUV420 image 1681eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * @return M4NO_ERROR: No error 1682eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng ****************************************************************************** 1683eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng */ 1684eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Tengstatic M4OSA_ERR 1685eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong TengM4VSS3GPP_intApplyVideoOverlay (M4VSS3GPP_InternalEditContext *pC, 1686eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut) { 1687eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1688eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_ClipContext *pClip; 1689eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_EffectSettings *pFx; 1690eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_ExternalProgress extProgress; 1691eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_Double VideoEffectTime; 1692eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_Double PercentageDone; 1693eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_UInt8 NumActiveEffects =0; 1694eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_UInt32 Cts = 0; 1695eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_Int32 nextEffectTime; 1696eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_Int32 tmp; 1697eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_UInt8 i; 1698eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_ERR err; 1699eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1700eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pClip = pC->pC1; 1701eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bIssecondClip == M4OSA_TRUE) { 1702eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng NumActiveEffects = pC->nbActiveEffects1; 1703eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } else { 1704eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng NumActiveEffects = pC->nbActiveEffects; 1705eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1706eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng for (i=0; i<NumActiveEffects; i++) { 1707eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bIssecondClip == M4OSA_TRUE) { 1708eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pFx = &(pC->pEffectsList[pC->pActiveEffectsList1[i]]); 1709eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Compute how far from the beginning of the effect we are, in clip-base time. */ 1710eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng // Decorrelate input and output encoding timestamp to handle encoder prefetch 1711eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng VideoEffectTime = ((M4OSA_Int32)pC->ewc.dInputVidCts) + 1712eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->pTransitionList[pC->uiCurrentClip].uiTransitionDuration - pFx->uiStartTime; 1713eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } else { 1714eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pFx = &(pC->pEffectsList[pC->pActiveEffectsList[i]]); 1715eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Compute how far from the beginning of the effect we are, in clip-base time. */ 1716eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng // Decorrelate input and output encoding timestamp to handle encoder prefetch 1717eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng VideoEffectTime = ((M4OSA_Int32)pC->ewc.dInputVidCts) - pFx->uiStartTime; 1718eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1719eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Do the framing(overlay) effect only, 1720eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * skip other color effect which had been applied */ 1721eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pFx->xVSS.pFramingBuffer == M4OSA_NULL) { 1722eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng continue; 1723eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1724eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1725eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* To calculate %, substract timeIncrement because effect should finish 1726eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * on the last frame which is presented from CTS = eof-timeIncrement till CTS = eof */ 1727eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng PercentageDone = VideoEffectTime / ((M4OSA_Float)pFx->uiDuration); 1728eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1729eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (PercentageDone < 0.0) { 1730eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng PercentageDone = 0.0; 1731eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1732eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (PercentageDone > 1.0) { 1733eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng PercentageDone = 1.0; 1734eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1735eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /** 1736eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * Compute where we are in the effect (scale is 0->1000) */ 1737eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng tmp = (M4OSA_Int32)(PercentageDone * 1000); 1738eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1739eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /** 1740eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * Set the progress info provided to the external function */ 1741eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng extProgress.uiProgress = (M4OSA_UInt32)tmp; 1742eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng // Decorrelate input and output encoding timestamp to handle encoder prefetch 1743eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng extProgress.uiOutputTime = (M4OSA_UInt32)pC->ewc.dInputVidCts; 1744eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng extProgress.uiClipTime = extProgress.uiOutputTime - pClip->iVoffset; 1745eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng extProgress.bIsLast = M4OSA_FALSE; 1746eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng // Decorrelate input and output encoding timestamp to handle encoder prefetch 1747eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng nextEffectTime = (M4OSA_Int32)(pC->ewc.dInputVidCts \ 1748eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng + pC->dOutputFrameDuration); 1749eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (nextEffectTime >= (M4OSA_Int32)(pFx->uiStartTime + pFx->uiDuration)) { 1750eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng extProgress.bIsLast = M4OSA_TRUE; 1751eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1752eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = pFx->ExtVideoEffectFct(pFx->pExtVideoEffectFctCtxt, 1753eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlaneIn, pPlaneOut, &extProgress, 1754eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pFx->VideoEffectType - M4VSS3GPP_kVideoEffectType_External); 17557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1756eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 1757eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1( 1758eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng "M4VSS3GPP_intApplyVideoOverlay: \ 1759eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng External video effect function returns 0x%x!", 1760eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err); 1761eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return err; 1762eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1763eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 1764eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 1765eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /** 1766eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * Return */ 1767eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE3_0("M4VSS3GPP_intApplyVideoOverlay: returning M4NO_ERROR"); 1768eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 1769eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng} 17707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 17717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 17727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intApplyVideoEffect() 17737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Apply video effect from pPlaneIn to pPlaneOut 17747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pC (IN/OUT) Internal edit context 17757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param uiClip1orClip2 (IN/OUT) 1 for first clip, 2 for second clip 17767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pInputPlanes (IN) Input raw YUV420 image 17777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pOutputPlanes (IN/OUT) Output raw YUV420 image 1778eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * @param bSkipFramingEffect (IN) skip framing effect flag 17797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 17807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 17817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 17827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR 1783eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong TengM4VSS3GPP_intApplyVideoEffect (M4VSS3GPP_InternalEditContext *pC, 1784eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut, 1785eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_Bool bSkipFramingEffect) { 1786eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 17877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 17887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipContext *pClip; 17907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_EffectSettings *pFx; 17917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ExternalProgress extProgress; 17927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double VideoEffectTime; 17947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double PercentageDone; 17957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 tmp; 17967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane *pPlaneTempIn; 17987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane *pPlaneTempOut; 17996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane pTempYuvPlane[3]; 18007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 i; 18017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 NumActiveEffects =0; 18027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClip = pC->pC1; 18057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pC->bIssecondClip == M4OSA_TRUE) 18067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi NumActiveEffects = pC->nbActiveEffects1; 18087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 18107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi NumActiveEffects = pC->nbActiveEffects; 18127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pTempYuvPlane, 0, 3*sizeof(M4VIFI_ImagePlane)); 18156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 18167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 18177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Allocate temporary plane if needed RC */ 1818eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (NumActiveEffects > 1) { 18196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intAllocateYUV420(pTempYuvPlane, pPlaneOut->u_width, 18206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneOut->u_height); 18217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 18237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 18257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intApplyVideoEffect: M4VSS3GPP_intAllocateYUV420(4) returns 0x%x,\ 18267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4NO_ERROR", 18277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 18287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VppError = err; 18297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 18307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4NO_ERROR; /**< Return no error to the encoder core 18317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (else it may leak in some situations...) */ 18327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (NumActiveEffects % 2 == 0) 18367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlaneTempIn = pPlaneIn; 18386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneTempOut = pTempYuvPlane; 18397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 18417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlaneTempIn = pPlaneIn; 18437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlaneTempOut = pPlaneOut; 18447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i=0; i<NumActiveEffects; i++) 18477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pC->bIssecondClip == M4OSA_TRUE) 18497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pFx = &(pC->pEffectsList[pC->pActiveEffectsList1[i]]); 18537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute how far from the beginning of the effect we are, in clip-base time. */ 18547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 18557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEffectTime = ((M4OSA_Int32)pC->ewc.dInputVidCts) + 18567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pTransitionList[pC->uiCurrentClip]. 18577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiTransitionDuration- pFx->uiStartTime; 18587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 18607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pFx = &(pC->pEffectsList[pC->pActiveEffectsList[i]]); 18627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute how far from the beginning of the effect we are, in clip-base time. */ 18637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 18647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEffectTime = ((M4OSA_Int32)pC->ewc.dInputVidCts) - pFx->uiStartTime; 18657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* To calculate %, substract timeIncrement because effect should finish on the last frame*/ 18707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* which is presented from CTS = eof-timeIncrement till CTS = eof */ 18717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi PercentageDone = VideoEffectTime 18727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / ((M4OSA_Float)pFx->uiDuration/*- pC->dOutputFrameDuration*/); 18737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( PercentageDone < 0.0 ) 18757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi PercentageDone = 0.0; 18767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( PercentageDone > 1.0 ) 18787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi PercentageDone = 1.0; 18797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pFx->VideoEffectType ) 18817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeFromBlack: 18837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 18847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Compute where we are in the effect (scale is 0->1024). */ 18857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmp = (M4OSA_Int32)(PercentageDone * 1024); 18867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 18887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Apply the darkening effect */ 18897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = 18907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VFL_modifyLumaWithScale((M4ViComImagePlane *)pPlaneTempIn, 18917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4ViComImagePlane *)pPlaneTempOut, tmp, M4OSA_NULL); 18927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 18947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 18967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intApplyVideoEffect:\ 18977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VFL_modifyLumaWithScale returns error 0x%x,\ 18987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_LUMA_FILTER_ERROR", 18997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 19007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_LUMA_FILTER_ERROR; 19017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 19037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeToBlack: 19057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 19067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Compute where we are in the effect (scale is 0->1024) */ 19077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmp = (M4OSA_Int32)(( 1.0 - PercentageDone) * 1024); 19087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 19107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Apply the darkening effect */ 19117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = 19127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VFL_modifyLumaWithScale((M4ViComImagePlane *)pPlaneTempIn, 19137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4ViComImagePlane *)pPlaneTempOut, tmp, M4OSA_NULL); 19147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 19167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 19187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intApplyVideoEffect:\ 19197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VFL_modifyLumaWithScale returns error 0x%x,\ 19207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_LUMA_FILTER_ERROR", 19217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 19227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_LUMA_FILTER_ERROR; 19237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 19257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 19277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pFx->VideoEffectType 19287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= M4VSS3GPP_kVideoEffectType_External ) 19297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 Cts = 0; 19317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 nextEffectTime; 19327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 19347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Compute where we are in the effect (scale is 0->1000) */ 19357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmp = (M4OSA_Int32)(PercentageDone * 1000); 19367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 19387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the progress info provided to the external function */ 19397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi extProgress.uiProgress = (M4OSA_UInt32)tmp; 19407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 19417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi extProgress.uiOutputTime = (M4OSA_UInt32)pC->ewc.dInputVidCts; 19427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi extProgress.uiClipTime = extProgress.uiOutputTime - pClip->iVoffset; 19437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi extProgress.bIsLast = M4OSA_FALSE; 19447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 19457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nextEffectTime = (M4OSA_Int32)(pC->ewc.dInputVidCts \ 19467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + pC->dOutputFrameDuration); 19477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(nextEffectTime >= (M4OSA_Int32)(pFx->uiStartTime + pFx->uiDuration)) 19487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi extProgress.bIsLast = M4OSA_TRUE; 19507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1951eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Here skip the framing effect, 1952eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * do the framing effect after apply rendering mode */ 1953eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if ((pFx->xVSS.pFramingBuffer != M4OSA_NULL) && 1954eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng bSkipFramingEffect == M4OSA_TRUE) { 1955eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng memcpy(pPlaneTempOut[0].pac_data, pPlaneTempIn[0].pac_data, 1956eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlaneTempIn[0].u_height * pPlaneTempIn[0].u_width); 1957eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng memcpy(pPlaneTempOut[1].pac_data, pPlaneTempIn[1].pac_data, 1958eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlaneTempIn[1].u_height * pPlaneTempIn[1].u_width); 1959eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng memcpy(pPlaneTempOut[2].pac_data, pPlaneTempIn[2].pac_data, 1960eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlaneTempIn[2].u_height * pPlaneTempIn[2].u_width); 19617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1962eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } else { 1963eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = pFx->ExtVideoEffectFct(pFx->pExtVideoEffectFctCtxt, 1964eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlaneTempIn, pPlaneTempOut, &extProgress, 1965eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pFx->VideoEffectType 1966eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng - M4VSS3GPP_kVideoEffectType_External); 1967eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 19687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 19697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 19717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intApplyVideoEffect: \ 19727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi External video effect function returns 0x%x!", 19737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 19747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 19757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 19777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 19797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 19817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intApplyVideoEffect: unknown effect type (0x%x),\ 19827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_INVALID_VIDEO_EFFECT_TYPE", 19837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pFx->VideoEffectType); 19847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_INVALID_VIDEO_EFFECT_TYPE; 19857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 19887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * RC Updates pTempPlaneIn and pTempPlaneOut depending on current effect */ 19897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (((i % 2 == 0) && (NumActiveEffects % 2 == 0)) 19907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || ((i % 2 != 0) && (NumActiveEffects % 2 != 0))) 19917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneTempIn = pTempYuvPlane; 19937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlaneTempOut = pPlaneOut; 19947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 19967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlaneTempIn = pPlaneOut; 19986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneTempOut = pTempYuvPlane; 19996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 20006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 20016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 20026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury for(i=0; i<3; i++) { 20036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pTempYuvPlane[i].pac_data != M4OSA_NULL) { 20046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pTempYuvPlane[i].pac_data); 20056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pTempYuvPlane[i].pac_data = M4OSA_NULL; 20067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 20107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return */ 20117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intApplyVideoEffect: returning M4NO_ERROR"); 20127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 20137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 20147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 20167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 20177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intVideoTransition() 20187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Apply video transition effect pC1+pC2->pPlaneOut 20197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pC (IN/OUT) Internal edit context 20207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pOutputPlanes (IN/OUT) Output raw YUV420 image 20217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 20227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 20237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 20247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR 20257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_intVideoTransition( M4VSS3GPP_InternalEditContext *pC, 20267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane *pPlaneOut ) 20277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 20287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 20297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 iProgress; 20307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ExternalProgress extProgress; 20317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane *pPlane; 20327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 i; 20337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const M4OSA_Int32 iDur = (M4OSA_Int32)pC-> 20347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pTransitionList[pC->uiCurrentClip].uiTransitionDuration; 20357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 20377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Compute how far from the end cut we are, in clip-base time. 20387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * It is done with integers because the offset and begin cut have been rounded already. */ 20397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 20407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = (M4OSA_Int32)((M4OSA_Double)pC->pC1->iEndTime) - pC->ewc.dInputVidCts + 20417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ((M4OSA_Double)pC->pC1->iVoffset); 20427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 20437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We must remove the duration of one frame, else we would almost never reach the end 20447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (It's kind of a "pile and intervals" issue). */ 20457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress -= (M4OSA_Int32)pC->dOutputFrameDuration; 20467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( iProgress < 0 ) /**< Sanity checks */ 20487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = 0; 20507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 20537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Compute where we are in the transition, on a base 1000 */ 20547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = ( ( iDur - iProgress) * 1000) / iDur; 20557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 20577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Sanity checks */ 20587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( iProgress < 0 ) 20597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = 0; 20617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( iProgress > 1000 ) 20637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = 1000; 20657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pC->pTransitionList[pC->uiCurrentClip].TransitionBehaviour ) 20687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_TransitionBehaviour_SpeedUp: 20707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = ( iProgress * iProgress) / 1000; 20717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 20727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_TransitionBehaviour_Linear: 20747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*do nothing*/ 20757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 20767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_TransitionBehaviour_SpeedDown: 20787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = (M4OSA_Int32)(sqrt(iProgress * 1000)); 20797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 20807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_TransitionBehaviour_SlowMiddle: 20827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( iProgress < 500 ) 20837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = (M4OSA_Int32)(sqrt(iProgress * 500)); 20857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 20877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = 20897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)(( ( ( iProgress - 500) * (iProgress - 500)) 20907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / 500) + 500); 20917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 20937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_TransitionBehaviour_FastMiddle: 20957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( iProgress < 500 ) 20967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = (M4OSA_Int32)(( iProgress * iProgress) / 500); 20987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 21007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iProgress = (M4OSA_Int32)(sqrt(( iProgress - 500) * 500) + 500); 21027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 21047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 21067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*do nothing*/ 21077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 21087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pC->pTransitionList[pC->uiCurrentClip].VideoTransitionType ) 21117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kVideoTransitionType_CrossFade: 21137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 21147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Apply the transition effect */ 21157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VIFI_ImageBlendingonYUV420(M4OSA_NULL, 21167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4ViComImagePlane *)pC->yuv1, 21177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4ViComImagePlane *)pC->yuv2, 21187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4ViComImagePlane *)pPlaneOut, iProgress); 21197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 21217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 21237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intVideoTransition:\ 21247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImageBlendingonYUV420 returns error 0x%x,\ 21257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_TRANSITION_FILTER_ERROR", 21267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 21277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_TRANSITION_FILTER_ERROR; 21287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 21307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VSS3GPP_kVideoTransitionType_None: 21327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 21337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * This is a stupid-non optimized version of the None transition... 21347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We copy the YUV frame */ 21357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( iProgress < 500 ) /**< first half of transition */ 21367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlane = pC->yuv1; 21387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /**< second half of transition */ 21407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlane = pC->yuv2; 21427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 21447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copy the input YUV frames */ 21457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i = 3; 21467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while( i-- > 0 ) 21487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 214932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)pPlaneOut[i].pac_data, 215032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)pPlane[i].pac_data, 21517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlaneOut[i].u_stride * pPlaneOut[i].u_height); 21527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 21547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 21567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->pTransitionList[pC->uiCurrentClip].VideoTransitionType 21577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= M4VSS3GPP_kVideoTransitionType_External ) 21587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 21607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the progress info provided to the external function */ 21617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi extProgress.uiProgress = (M4OSA_UInt32)iProgress; 21627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 21637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi extProgress.uiOutputTime = (M4OSA_UInt32)pC->ewc.dInputVidCts; 21647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi extProgress.uiClipTime = extProgress.uiOutputTime - pC->pC1->iVoffset; 21657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->pTransitionList[pC-> 21677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCurrentClip].ExtVideoTransitionFct( 21687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pTransitionList[pC-> 21697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCurrentClip].pExtVideoTransitionFctCtxt, 21707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->yuv1, pC->yuv2, pPlaneOut, &extProgress, 21717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pTransitionList[pC-> 21727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCurrentClip].VideoTransitionType 21737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - M4VSS3GPP_kVideoTransitionType_External); 21747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 21767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 21787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intVideoTransition:\ 21797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi External video transition function returns 0x%x!", 21807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 21817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 21827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 21847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 21867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 21887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intVideoTransition: unknown transition type (0x%x),\ 21897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_INVALID_VIDEO_TRANSITION_TYPE", 21907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pTransitionList[pC->uiCurrentClip].VideoTransitionType); 21917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_INVALID_VIDEO_TRANSITION_TYPE; 21927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 21967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return */ 21977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intVideoTransition: returning M4NO_ERROR"); 21987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 21997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 22007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 22027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 22037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_Void M4VSS3GPP_intUpdateTimeInfo() 22047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Update bit stream time info by Counter Time System to be compliant with 22057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * players using bit stream time info 22067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note H263 uses an absolute time counter unlike MPEG4 which uses Group Of Vops 22077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (GOV, see the standard) 22087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pC (IN/OUT) returns time updated video AU, 22097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * the offset between system and video time (MPEG4 only) 22107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * and the state of the current clip (MPEG4 only) 22117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return nothing 22127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 22137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 22147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void 22157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_intUpdateTimeInfo( M4VSS3GPP_InternalEditContext *pC, 22167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_AccessUnit *pAU ) 22177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 22187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiTmp; 22197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiCts = 0; 22207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_MemAddr8 pTmp; 22217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiAdd; 22227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiCurrGov; 22237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int8 iDiff; 22247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipContext *pClipCtxt = pC->pC1; 22267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 *pOffset = &(pC->ewc.iMpeg4GovOffset); 22277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 22297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set H263 time counter from system time */ 22307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4SYS_kH263 == pAU->stream->streamType ) 22317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiTmp = (M4OSA_UInt8)((M4OSA_UInt32)( ( pAU->CTS * 30) / 1001 + 0.5) 22337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi % M4VSS3GPP_EDIT_H263_MODULO_TIME); 22347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intSetH263TimeCounter((M4OSA_MemAddr8)(pAU->dataAddress), 22357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiTmp); 22367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 22377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 22387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set MPEG4 GOV time counter regarding video and system time */ 22397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4SYS_kMPEG_4 == pAU->stream->streamType ) 22407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 22427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If GOV. 22437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * beware of little/big endian! */ 22447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* correction: read 8 bits block instead of one 32 bits block */ 22457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 *temp8 = (M4OSA_UInt8 *)(pAU->dataAddress); 22467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 temp32 = 0; 22477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi temp32 = ( 0x000000ff & (M4OSA_UInt32)(*temp8)) 22497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + (0x0000ff00 & ((M4OSA_UInt32)(*(temp8 + 1))) << 8) 22507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + (0x00ff0000 & ((M4OSA_UInt32)(*(temp8 + 2))) << 16) 22517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + (0xff000000 & ((M4OSA_UInt32)(*(temp8 + 3))) << 24); 22527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_2("RC: Temp32: 0x%x, dataAddress: 0x%x\n", temp32, 22547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *(pAU->dataAddress)); 22557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_EDIT_GOV_HEADER == temp32 ) 22577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pTmp = 22597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)(pAU->dataAddress 22607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 1); /**< Jump to the time code (just after the 32 bits header) */ 22617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiAdd = (M4OSA_UInt32)(pAU->CTS)+( *pOffset); 22627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pClipCtxt->bMpeg4GovState ) 22647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4OSA_FALSE: /*< INIT */ 22667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* video time = ceil (system time + offset) */ 22687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCts = ( uiAdd + 999) / 1000; 22697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* offset update */ 22717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( *pOffset) += (( uiCts * 1000) - uiAdd); 22727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Save values */ 22747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiMpeg4PrevGovValueSet = uiCts; 22757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* State to 'first' */ 22777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->bMpeg4GovState = M4OSA_TRUE; 22787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 22797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 22807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4OSA_TRUE: /*< UPDATE */ 22827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get current Gov value */ 22847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intGetMPEG4Gov(pTmp, &uiCurrGov); 22857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* video time = floor or ceil (system time + offset) */ 22877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCts = (uiAdd / 1000); 22887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iDiff = (M4OSA_Int8)(uiCurrGov 22897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - pClipCtxt->uiMpeg4PrevGovValueGet - uiCts 22907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + pClipCtxt->uiMpeg4PrevGovValueSet); 22917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ceiling */ 22937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( iDiff > 0 ) 22947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCts += (M4OSA_UInt32)(iDiff); 22967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* offset update */ 22987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( *pOffset) += (( uiCts * 1000) - uiAdd); 22997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Save values */ 23027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiMpeg4PrevGovValueGet = uiCurrGov; 23037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiMpeg4PrevGovValueSet = uiCts; 23047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 23067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intSetMPEG4Gov(pTmp, uiCts); 23097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return; 23127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 23137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 23157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 23167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_Void M4VSS3GPP_intCheckVideoEffects() 23177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Check which video effect must be applied at the current time 23187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 23197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 23207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void 23217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_intCheckVideoEffects( M4VSS3GPP_InternalEditContext *pC, 23227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiClipNumber ) 23237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 23247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiClipIndex; 23257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiFxIndex, i; 23267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipContext *pClip; 23277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_EffectSettings *pFx; 23287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 Off, BC, EC; 23297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Decorrelate input and output encoding timestamp to handle encoder prefetch 23307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 t = (M4OSA_Int32)pC->ewc.dInputVidCts; 23317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiClipIndex = pC->uiCurrentClip; 23336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (uiClipNumber == 1) { 23346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClip = pC->pC1; 2335eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->bClip1ActiveFramingEffect = M4OSA_FALSE; 23366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 23376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClip = pC->pC2; 2338eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->bClip2ActiveFramingEffect = M4OSA_FALSE; 23396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 23407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 23417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Shortcuts for code readability */ 23427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Off = pClip->iVoffset; 23437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi BC = pClip->iActualVideoBeginCut; 23447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EC = pClip->iEndTime; 23457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i = 0; 23477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( uiFxIndex = 0; uiFxIndex < pC->nbEffects; uiFxIndex++ ) 23497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** Shortcut, reverse order because of priority between effects(EndEffect always clean )*/ 23517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pFx = &(pC->pEffectsList[pC->nbEffects - 1 - uiFxIndex]); 23527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kVideoEffectType_None != pFx->VideoEffectType ) 23547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 23567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check if there is actually a video effect */ 23577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(uiClipNumber ==1) 23597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2360f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes /**< Are we after the start time of the effect? 2361f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes * or Are we into the effect duration? 2362f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes */ 2363f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes if ( (t >= (M4OSA_Int32)(pFx->uiStartTime)) && 2364f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes (t <= (M4OSA_Int32)(pFx->uiStartTime + pFx->uiDuration)) ) { 2365bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava /** 2366bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * Set the active effect(s) */ 23677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pActiveEffectsList[i] = pC->nbEffects-1-uiFxIndex; 23687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2369bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava /** 2370bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * Update counter of active effects */ 23717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++; 2372eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pFx->xVSS.pFramingBuffer != M4OSA_NULL) { 2373eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->bClip1ActiveFramingEffect = M4OSA_TRUE; 2374eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 23757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2376bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava /** 2377bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * For all external effects set this flag to true. */ 2378bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava if(pFx->VideoEffectType > M4VSS3GPP_kVideoEffectType_External) 2379bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava { 2380bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava pC->m_bClipExternalHasStarted = M4OSA_TRUE; 2381bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava } 23827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 23847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 23867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2387f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes /**< Are we into the effect duration? */ 2388d67e9da63323d965760337913f86de28024531a4Basavapatna Dattaguru if ( ((M4OSA_Int32)(t + pC->pTransitionList[uiClipIndex].uiTransitionDuration) 2389f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes >= (M4OSA_Int32)(pFx->uiStartTime)) 2390d67e9da63323d965760337913f86de28024531a4Basavapatna Dattaguru && ( (M4OSA_Int32)(t + pC->pTransitionList[uiClipIndex].uiTransitionDuration) 2391f58e4c332ecf8c0cd6037b010256d0b4c56e6a17Danny Fernandes <= (M4OSA_Int32)(pFx->uiStartTime + pFx->uiDuration)) ) { 2392bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava /** 2393bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * Set the active effect(s) */ 23947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pActiveEffectsList1[i] = pC->nbEffects-1-uiFxIndex; 23957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2396bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava /** 2397bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * Update counter of active effects */ 23987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++; 2399eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pFx->xVSS.pFramingBuffer != M4OSA_NULL) { 2400eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->bClip2ActiveFramingEffect = M4OSA_TRUE; 2401eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 2402bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava /** 2403bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * For all external effects set this flag to true. */ 2404bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava if(pFx->VideoEffectType > M4VSS3GPP_kVideoEffectType_External) 2405bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava { 2406bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava pC->m_bClipExternalHasStarted = M4OSA_TRUE; 2407bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava } 24087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2409bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava /** 2410bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * The third effect has the highest priority, then the second one, then the first one. 2411bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava * Hence, as soon as we found an active effect, we can get out of this loop */ 2412bb337b471658b7c2264c6ff1bb613739db851baaSantosh Madhava } 24137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4VIDEOEDITING_kH264 != 24156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pC1->pSettings->ClipProperties.VideoStreamType) { 24166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 24176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury // For Mpeg4 and H263 clips, full decode encode not required 24186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->m_bClipExternalHasStarted = M4OSA_FALSE; 24196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 24207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(1==uiClipNumber) 24237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 24257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Save number of active effects */ 24267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->nbActiveEffects = i; 24277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 24297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->nbActiveEffects1 = i; 24317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 24347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Change the absolut time to clip related time */ 24357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi t -= Off; 24367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 24387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check if we are on the begin cut (for clip1 only) */ 24397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( 0 != BC) && (t == BC) && (1 == uiClipNumber) ) 24407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->bClip1AtBeginCut = M4OSA_TRUE; 24427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 24447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->bClip1AtBeginCut = M4OSA_FALSE; 24467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return; 24497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 24507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 24527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 24537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intCreateVideoEncoder() 24547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Creates the video encoder 24557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 24567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 24577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 24587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intCreateVideoEncoder( M4VSS3GPP_InternalEditContext *pC ) 24597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 24607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 24617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AdvancedParams EncParams; 24627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 24647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Simulate a writer interface with our specific function */ 24657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.OurWriterDataInterface.pProcessAU = 24667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intProcessAU; /**< This function is VSS 3GPP specific, 24677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi but it follow the writer interface */ 24687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.OurWriterDataInterface.pStartAU = 24697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intStartAU; /**< This function is VSS 3GPP specific, 24707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi but it follow the writer interface */ 24717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.OurWriterDataInterface.pWriterContext = 24727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4WRITER_Context) 24737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC; /**< We give the internal context as writer context */ 24747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 24767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Get the encoder interface, if not already done */ 24777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pC->ShellAPI.pVideoEncoderGlobalFcts ) 24787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_setCurrentVideoEncoder(&pC->ShellAPI, 24807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VideoStreamType); 24817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 24827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCreateVideoEncoder: setCurrentEncoder returns 0x%x", 24837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 24847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_RETURN(err); 24857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 24887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set encoder shell parameters according to VSS settings */ 24897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Common parameters */ 24917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.InputFormat = M4ENCODER_kIYUV420; 24927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.FrameWidth = pC->ewc.uiVideoWidth; 24937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.FrameHeight = pC->ewc.uiVideoHeight; 24947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiTimeScale = pC->ewc.uiVideoTimeScale; 24957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->bIsMMS == M4OSA_FALSE ) 24977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* No strict regulation in video editor */ 24997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Because of the effects and transitions we should allow more flexibility */ 25007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Also it prevents to drop important frames (with a bad result on sheduling and 25017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi block effetcs) */ 25027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bInternalRegulation = M4OSA_FALSE; 25037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Variable framerate is not supported by StageFright encoders 25047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.FrameRate = M4ENCODER_k30_FPS; 25057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 25077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* In case of MMS mode, we need to enable bitrate regulation to be sure */ 25097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* to reach the targeted output file size */ 25107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bInternalRegulation = M4OSA_TRUE; 25117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.FrameRate = pC->MMSvideoFramerate; 25127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 25157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Other encoder settings (defaults) */ 25167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiHorizontalSearchRange = 0; /* use default */ 25177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiVerticalSearchRange = 0; /* use default */ 25187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bErrorResilience = M4OSA_FALSE; /* no error resilience */ 25197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiIVopPeriod = 0; /* use default */ 25207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiMotionEstimationTools = 0; /* M4V_MOTION_EST_TOOLS_ALL */ 25217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bAcPrediction = M4OSA_TRUE; /* use AC prediction */ 25227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiStartingQuantizerValue = 10; /* initial QP = 10 */ 25237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bDataPartitioning = M4OSA_FALSE; /* no data partitioning */ 25247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25250a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury /** 25260a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury * Set the video profile and level */ 25270a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury EncParams.videoProfile = pC->ewc.outputVideoProfile; 25280a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury EncParams.videoLevel= pC->ewc.outputVideoLevel; 25290a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 25307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch ( pC->ewc.VideoStreamType ) 25317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kH263: 25337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.Format = M4ENCODER_kH263; 25357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiStartingQuantizerValue = 10; 25377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiRateFactor = 1; /* default */ 25387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bErrorResilience = M4OSA_FALSE; 25407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bDataPartitioning = M4OSA_FALSE; 25417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 25427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kMPEG_4: 25447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.Format = M4ENCODER_kMPEG4; 25467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiStartingQuantizerValue = 8; 25487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiRateFactor = (M4OSA_UInt8)(( pC->dOutputFrameDuration 25497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pC->ewc.uiVideoTimeScale) / 1000.0 + 0.5); 25507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( EncParams.uiRateFactor == 0 ) 25527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiRateFactor = 1; /* default */ 25537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_FALSE == pC->ewc.bVideoDataPartitioning ) 25557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bErrorResilience = M4OSA_FALSE; 25577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bDataPartitioning = M4OSA_FALSE; 25587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 25607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bErrorResilience = M4OSA_TRUE; 25627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bDataPartitioning = M4OSA_TRUE; 25637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 25657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kH264: 25677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4VSS3GPP_intCreateVideoEncoder: M4SYS_H264"); 25687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.Format = M4ENCODER_kH264; 25707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiStartingQuantizerValue = 10; 25727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiRateFactor = 1; /* default */ 25737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bErrorResilience = M4OSA_FALSE; 25757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.bDataPartitioning = M4OSA_FALSE; 25767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi //EncParams.FrameRate = M4VIDEOEDITING_k5_FPS; 25777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 25787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 25807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 25817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCreateVideoEncoder: Unknown videoStreamType 0x%x", 25827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.VideoStreamType); 25837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT; 25847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->bIsMMS == M4OSA_FALSE ) 25877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury EncParams.Bitrate = pC->xVSS.outputVideoBitrate; 25896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 25907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 25927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.Bitrate = pC->uiMMSVideoBitrate; /* RC */ 25947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi EncParams.uiTimeScale = 0; /* We let the encoder choose the timescale */ 25957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4VSS3GPP_intCreateVideoEncoder: calling encoder pFctInit"); 25987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 25997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Init the video encoder (advanced settings version of the encoder Open function) */ 26007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctInit(&pC->ewc.pEncContext, 26017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pC->ewc.OurWriterDataInterface, M4VSS3GPP_intVPP, pC, 26027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ShellAPI.pCurrentVideoEncoderExternalAPI, 26037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ShellAPI.pCurrentVideoEncoderUserData); 26047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 26067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 26087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCreateVideoEncoder: pVideoEncoderGlobalFcts->pFctInit returns 0x%x", 26097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 26107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 26117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.encoderState = M4VSS3GPP_kEncoderClosed; 26147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4VSS3GPP_intCreateVideoEncoder: calling encoder pFctOpen"); 26157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctOpen(pC->ewc.pEncContext, 26177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pC->ewc.WriterVideoAU, &EncParams); 26187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 26207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 26227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCreateVideoEncoder: pVideoEncoderGlobalFcts->pFctOpen returns 0x%x", 26237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 26247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 26257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.encoderState = M4VSS3GPP_kEncoderStopped; 26287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 26297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCreateVideoEncoder: calling encoder pFctStart"); 26307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStart ) 26327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStart( 26347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.pEncContext); 26357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 26377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 26397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intCreateVideoEncoder: pVideoEncoderGlobalFcts->pFctStart returns 0x%x", 26407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 26417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 26427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.encoderState = M4VSS3GPP_kEncoderRunning; 26467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 26487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return */ 26497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intCreateVideoEncoder: returning M4NO_ERROR"); 26507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 26517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 26527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 26547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 26557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intDestroyVideoEncoder() 26567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Destroy the video encoder 26577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 26587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 26597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 26607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intDestroyVideoEncoder( M4VSS3GPP_InternalEditContext *pC ) 26617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 26627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 26637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pC->ewc.pEncContext ) 26657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kEncoderRunning == pC->ewc.encoderState ) 26677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStop != M4OSA_NULL ) 26697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStop( 26717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.pEncContext); 26727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 26747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 26767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intDestroyVideoEncoder:\ 26777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoEncoderGlobalFcts->pFctStop returns 0x%x", 26787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 26797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Well... how the heck do you handle a failed cleanup? */ 26807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.encoderState = M4VSS3GPP_kEncoderStopped; 26847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Has the encoder actually been opened? Don't close it if that's not the case. */ 26877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kEncoderStopped == pC->ewc.encoderState ) 26887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctClose( 26907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.pEncContext); 26917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 26937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 26957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intDestroyVideoEncoder:\ 26967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoEncoderGlobalFcts->pFctClose returns 0x%x", 26977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 26987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Well... how the heck do you handle a failed cleanup? */ 26997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.encoderState = M4VSS3GPP_kEncoderClosed; 27027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctCleanup( 27057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.pEncContext); 27067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 27087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 27097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 27107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intDestroyVideoEncoder:\ 27117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoEncoderGlobalFcts->pFctCleanup returns 0x%x!", 27127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 27137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< We do not return the error here because we still have stuff to free */ 27147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.encoderState = M4VSS3GPP_kNoEncoder; 27177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 27187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Reset variable */ 27197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->ewc.pEncContext = M4OSA_NULL; 27207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1("M4VSS3GPP_intDestroyVideoEncoder: returning 0x%x", err); 27237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 27247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 27257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 27277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 27287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_Void M4VSS3GPP_intSetH263TimeCounter() 27297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Modify the time counter of the given H263 video AU 27307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 27317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pAuDataBuffer (IN/OUT) H263 Video AU to modify 27327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param uiCts (IN) New time counter value 27337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return nothing 27347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 27357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 27367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void M4VSS3GPP_intSetH263TimeCounter( M4OSA_MemAddr8 pAuDataBuffer, 27377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiCts ) 27387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 27397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 27407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * The H263 time counter is 8 bits located on the "x" below: 27417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 27427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * |--------|--------|--------|--------| 27437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ???????? ???????? ??????xx xxxxxx?? 27447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 27457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 27477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the 2 bits on the third byte */ 27487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAuDataBuffer[2] = ( pAuDataBuffer[2] & 0xFC) | (( uiCts >> 6) & 0x3); 27497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 27517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the 6 bits on the fourth byte */ 27527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAuDataBuffer[3] = ( ( uiCts << 2) & 0xFC) | (pAuDataBuffer[3] & 0x3); 27537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return; 27557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 27567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 27587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 27597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_Void M4VSS3GPP_intSetMPEG4Gov() 27607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Modify the time info from Group Of VOP video AU 27617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 27627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pAuDataBuffer (IN) MPEG4 Video AU to modify 27637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param uiCtsSec (IN) New GOV time info in second unit 27647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return nothing 27657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 27667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 27677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void M4VSS3GPP_intSetMPEG4Gov( M4OSA_MemAddr8 pAuDataBuffer, 27687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiCtsSec ) 27697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 27707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 27717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * The MPEG-4 time code length is 18 bits: 27727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 27737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * hh mm marker ss 27747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * xxxxx|xxx xxx 1 xxxx xx ?????? 27757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * |----- ---|--- - ----|-- ------| 27767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 27777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiHh; 27787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiMm; 27797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiSs; 27807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiTmp; 27817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 27837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the 2 last bits ss */ 27847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiSs = (M4OSA_UInt8)(uiCtsSec % 60); /**< modulo part */ 27857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAuDataBuffer[2] = (( ( uiSs & 0x03) << 6) | (pAuDataBuffer[2] & 0x3F)); 27867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( uiCtsSec < 60 ) 27887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 27897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 27907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the 3 last bits of mm, the marker bit (0x10 */ 27917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAuDataBuffer[1] = (( 0x10) | (uiSs >> 2)); 27927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 27947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the 5 bits of hh and 3 of mm (out of 6) */ 27957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAuDataBuffer[0] = 0; 27967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 27987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 27997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 28007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the 3 last bits of mm, the marker bit (0x10 */ 28017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiTmp = (M4OSA_UInt8)(uiCtsSec / 60); /**< integer part */ 28027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiMm = (M4OSA_UInt8)(uiTmp % 60); 28037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAuDataBuffer[1] = (( uiMm << 5) | (0x10) | (uiSs >> 2)); 28047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( uiTmp < 60 ) 28067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 28077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 28087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the 5 bits of hh and 3 of mm (out of 6) */ 28097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAuDataBuffer[0] = ((uiMm >> 3)); 28107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 28117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 28127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 28137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 28147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Write the 5 bits of hh and 3 of mm (out of 6) */ 28157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiHh = (M4OSA_UInt8)(uiTmp / 60); 28167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAuDataBuffer[0] = (( uiHh << 3) | (uiMm >> 3)); 28177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 28187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 28197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return; 28207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 28217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 28237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 28247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_Void M4VSS3GPP_intGetMPEG4Gov() 28257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Get the time info from Group Of VOP video AU 28267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 28277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pAuDataBuffer (IN) MPEG4 Video AU to modify 28287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pCtsSec (OUT) Current GOV time info in second unit 28297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return nothing 28307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 28317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 28327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Void M4VSS3GPP_intGetMPEG4Gov( M4OSA_MemAddr8 pAuDataBuffer, 28337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 *pCtsSec ) 28347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 28357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 28367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * The MPEG-4 time code length is 18 bits: 28377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 28387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * hh mm marker ss 28397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * xxxxx|xxx xxx 1 xxxx xx ?????? 28407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * |----- ---|--- - ----|-- ------| 28417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 28427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiHh; 28437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiMm; 28447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiSs; 28457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 uiTmp; 28467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiCtsSec; 28477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 28497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Read ss */ 28507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiSs = (( pAuDataBuffer[2] & 0xC0) >> 6); 28517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiTmp = (( pAuDataBuffer[1] & 0x0F) << 2); 28527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCtsSec = uiSs + uiTmp; 28537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 28557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Read mm */ 28567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiMm = (( pAuDataBuffer[1] & 0xE0) >> 5); 28577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiTmp = (( pAuDataBuffer[0] & 0x07) << 3); 28587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiMm = uiMm + uiTmp; 28597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCtsSec = ( uiMm * 60) + uiCtsSec; 28607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 28627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Read hh */ 28637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiHh = (( pAuDataBuffer[0] & 0xF8) >> 3); 28647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( uiHh ) 28667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 28677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uiCtsSec = ( uiHh * 3600) + uiCtsSec; 28687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 28697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 28717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * in sec */ 28727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pCtsSec = uiCtsSec; 28737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return; 28757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 28767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 28787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 28797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAllocateYUV420() 28807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Allocate the three YUV 4:2:0 planes 28817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 28827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pPlanes (IN/OUT) valid pointer to 3 M4VIFI_ImagePlane structures 28837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param uiWidth (IN) Image width 28847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param uiHeight(IN) Image height 28857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 28867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 28877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAllocateYUV420( M4VIFI_ImagePlane *pPlanes, 28887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiWidth, M4OSA_UInt32 uiHeight ) 28897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2890eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pPlanes == M4OSA_NULL) { 2891eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_0("M4VSS3GPP_intAllocateYUV420: Invalid pPlanes pointer"); 2892eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4ERR_PARAMETER; 2893eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 2894eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* if the buffer is not NULL and same size with target size, 2895eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * do not malloc again*/ 2896eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pPlanes[0].pac_data != M4OSA_NULL && 2897eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlanes[0].u_width == uiWidth && 2898eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlanes[0].u_height == uiHeight) { 2899eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 2900eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 29017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[0].u_width = uiWidth; 29037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[0].u_height = uiHeight; 29047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[0].u_stride = uiWidth; 29057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[0].u_topleft = 0; 2906eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng 2907eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pPlanes[0].pac_data != M4OSA_NULL) { 2908eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng free(pPlanes[0].pac_data); 2909eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlanes[0].pac_data = M4OSA_NULL; 2910eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 2911694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu pPlanes[0].pac_data = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pPlanes[0].u_stride 29127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pPlanes[0].u_height, M4VSS3GPP, (M4OSA_Char *)"pPlanes[0].pac_data"); 29137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pPlanes[0].pac_data ) 29157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 29177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intAllocateYUV420: unable to allocate pPlanes[0].pac_data,\ 29187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4ERR_ALLOC"); 29197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 29207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 29217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[1].u_width = pPlanes[0].u_width >> 1; 29237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[1].u_height = pPlanes[0].u_height >> 1; 29247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[1].u_stride = pPlanes[1].u_width; 29257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[1].u_topleft = 0; 2926eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pPlanes[1].pac_data != M4OSA_NULL) { 2927eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng free(pPlanes[1].pac_data); 2928eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlanes[1].pac_data = M4OSA_NULL; 2929eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 2930694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu pPlanes[1].pac_data = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pPlanes[1].u_stride 29317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pPlanes[1].u_height, M4VSS3GPP,(M4OSA_Char *) "pPlanes[1].pac_data"); 29327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pPlanes[1].pac_data ) 29347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 29367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intAllocateYUV420: unable to allocate pPlanes[1].pac_data,\ 29377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4ERR_ALLOC"); 29386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free((void *)pPlanes[0].pac_data); 29396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlanes[0].pac_data = M4OSA_NULL; 29407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 29417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 29427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[2].u_width = pPlanes[1].u_width; 29447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[2].u_height = pPlanes[1].u_height; 29457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[2].u_stride = pPlanes[2].u_width; 29467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pPlanes[2].u_topleft = 0; 2947eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pPlanes[2].pac_data != M4OSA_NULL) { 2948eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng free(pPlanes[2].pac_data); 2949eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlanes[2].pac_data = M4OSA_NULL; 2950eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 2951694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu pPlanes[2].pac_data = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pPlanes[2].u_stride 29527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pPlanes[2].u_height, M4VSS3GPP, (M4OSA_Char *)"pPlanes[2].pac_data"); 29537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pPlanes[2].pac_data ) 29557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 29577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intAllocateYUV420: unable to allocate pPlanes[2].pac_data,\ 29587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4ERR_ALLOC"); 29596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free((void *)pPlanes[0].pac_data); 29606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free((void *)pPlanes[1].pac_data); 29616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlanes[0].pac_data = M4OSA_NULL; 29626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlanes[1].pac_data = M4OSA_NULL; 29637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 29647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 29657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pPlanes[0].pac_data, 0, pPlanes[0].u_stride*pPlanes[0].u_height); 29676e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pPlanes[1].pac_data, 0, pPlanes[1].u_stride*pPlanes[1].u_height); 29686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pPlanes[2].pac_data, 0, pPlanes[2].u_stride*pPlanes[2].u_height); 29697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 29707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return */ 29717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intAllocateYUV420: returning M4NO_ERROR"); 29727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 29737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 29746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 29756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury/** 29766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury****************************************************************************** 29776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* M4OSA_ERR M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn, 29786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* M4OSA_FileReadPointer* pFileReadPtr, 29796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* M4VIFI_ImagePlane* pImagePlanes, 29806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* M4OSA_UInt32 width, 29816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* M4OSA_UInt32 height); 29826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @brief It Coverts and resizes a ARGB8888 image to YUV420 29836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @note 29846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @param pFileIn (IN) The ARGB888 input file 29856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @param pFileReadPtr (IN) Pointer on filesystem functions 29866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @param pImagePlanes (IN/OUT) Pointer on YUV420 output planes allocated by the user. 29876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* ARGB8888 image will be converted and resized to output 29886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* YUV420 plane size 29896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @param width (IN) width of the ARGB8888 29906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @param height (IN) height of the ARGB8888 29916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @return M4NO_ERROR: No error 29926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @return M4ERR_ALLOC: memory error 29936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury* @return M4ERR_PARAMETER: At least one of the function parameters is null 29946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury****************************************************************************** 29956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury*/ 29966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 29976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh ChowduryM4OSA_ERR M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn, 29986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_FileReadPointer* pFileReadPtr, 29996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane* pImagePlanes, 30006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt32 width,M4OSA_UInt32 height) { 30016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_Context pARGBIn; 30026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane rgbPlane1 ,rgbPlane2; 30036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt32 frameSize_argb = width * height * 4; 30046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt32 frameSize_rgb888 = width * height * 3; 30056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt32 i = 0,j= 0; 30066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 30076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt8 *pArgbPlane = 30096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb, 30106e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VS, (M4OSA_Char*)"argb data"); 30116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pArgbPlane == M4OSA_NULL) { 30126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_0("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420: \ 30136e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Failed to allocate memory for ARGB plane"); 30146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 30156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 30166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /* Get file size */ 30186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pFileReadPtr->openRead(&pARGBIn, pFileIn, M4OSA_kFileRead); 30196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (err != M4NO_ERROR) { 30206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_2("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 : \ 30216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Can not open input ARGB8888 file %s, error: 0x%x\n",pFileIn, err); 30226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pArgbPlane); 30236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pArgbPlane = M4OSA_NULL; 30246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury goto cleanup; 30256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 30266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pFileReadPtr->readData(pARGBIn,(M4OSA_MemAddr8)pArgbPlane, 30286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury &frameSize_argb); 30296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (err != M4NO_ERROR) { 30306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_2("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 \ 30316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Can not read ARGB8888 file %s, error: 0x%x\n",pFileIn, err); 30326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pFileReadPtr->closeRead(pARGBIn); 30336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pArgbPlane); 30346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pArgbPlane = M4OSA_NULL; 30356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury goto cleanup; 30366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 30376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pFileReadPtr->closeRead(pARGBIn); 30396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(err != M4NO_ERROR) { 30406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_2("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 \ 30416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Can not close ARGB8888 file %s, error: 0x%x\n",pFileIn, err); 30426e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pArgbPlane); 30436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pArgbPlane = M4OSA_NULL; 30446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury goto cleanup; 30456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 30466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane1.pac_data = 30486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize_rgb888, 30496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VS, (M4OSA_Char*)"RGB888 plane1"); 30506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(rgbPlane1.pac_data == M4OSA_NULL) { 30516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_0("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 \ 30526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Failed to allocate memory for rgb plane1"); 30536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pArgbPlane); 30546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 30556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 30566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane1.u_height = height; 30586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane1.u_width = width; 30596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane1.u_stride = width*3; 30606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane1.u_topleft = 0; 30616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** Remove the alpha channel */ 30646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury for (i=0, j = 0; i < frameSize_argb; i++) { 30656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((i % 4) == 0) continue; 30666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane1.pac_data[j] = pArgbPlane[i]; 30676e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury j++; 30686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 30696e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pArgbPlane); 30706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 30726e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Check if resizing is required with color conversion */ 30736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(width != pImagePlanes->u_width || height != pImagePlanes->u_height) { 30746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury frameSize_rgb888 = pImagePlanes->u_width * pImagePlanes->u_height * 3; 30766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane2.pac_data = 30776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize_rgb888, M4VS, 30786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_Char*)"rgb Plane2"); 30796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(rgbPlane2.pac_data == M4OSA_NULL) { 30806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_0("Failed to allocate memory for rgb plane2"); 30816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(rgbPlane1.pac_data); 30826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 30836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 30846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane2.u_height = pImagePlanes->u_height; 30856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane2.u_width = pImagePlanes->u_width; 30866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane2.u_stride = pImagePlanes->u_width*3; 30876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury rgbPlane2.u_topleft = 0; 30886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /* Resizing */ 30906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VIFI_ResizeBilinearRGB888toRGB888(M4OSA_NULL, 30916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury &rgbPlane1, &rgbPlane2); 30926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(rgbPlane1.pac_data); 30936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(err != M4NO_ERROR) { 30946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("error resizing RGB888 to RGB888: 0x%x\n", err); 30956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(rgbPlane2.pac_data); 30966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 30976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 30986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 30996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /*Converting Resized RGB888 to YUV420 */ 31006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane2, pImagePlanes); 31016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(rgbPlane2.pac_data); 31026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(err != M4NO_ERROR) { 31036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("error converting from RGB888 to YUV: 0x%x\n", err); 31046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 31056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 31066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 31076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane1, pImagePlanes); 31086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(err != M4NO_ERROR) { 31096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("error when converting from RGB to YUV: 0x%x\n", err); 31106e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 31116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(rgbPlane1.pac_data); 31126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 31136e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdurycleanup: 31146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE3_0("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 exit"); 31156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 31166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury} 31176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh ChowduryM4OSA_ERR M4VSS3GPP_intApplyRenderingMode(M4VSS3GPP_InternalEditContext *pC, 31196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4xVSS_MediaRendering renderingMode, 31206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane* pInplane, 31216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane* pOutplane) { 31226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 31246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4AIR_Params airParams; 31256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane pImagePlanesTemp[3]; 31266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt32 i = 0; 31276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (renderingMode == M4xVSS_kBlackBorders) { 31296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pOutplane[0].pac_data, Y_PLANE_BORDER_VALUE, 31306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pOutplane[0].u_height*pOutplane[0].u_stride)); 31316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pOutplane[1].pac_data, U_PLANE_BORDER_VALUE, 31326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pOutplane[1].u_height*pOutplane[1].u_stride)); 31336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pOutplane[2].pac_data, V_PLANE_BORDER_VALUE, 31346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pOutplane[2].u_height*pOutplane[2].u_stride)); 31356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 31366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (renderingMode == M4xVSS_kResizing) { 31386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 31396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Call the resize filter. 31406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * From the intermediate frame to the encoder image plane */ 31416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VIFI_ResizeBilinearYUV420toYUV420(M4OSA_NULL, 31426e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pInplane, pOutplane); 31436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 31446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intApplyRenderingMode: \ 31456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4ViFilResizeBilinearYUV420toYUV420 returns 0x%x!", err); 31466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 31476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 31486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 31496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane* pPlaneTemp = M4OSA_NULL; 31506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt8* pOutPlaneY = 31516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutplane[0].pac_data + pOutplane[0].u_topleft; 31526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt8* pOutPlaneU = 31536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutplane[1].pac_data + pOutplane[1].u_topleft; 31546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt8* pOutPlaneV = 31556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutplane[2].pac_data + pOutplane[2].u_topleft; 31566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt8* pInPlaneY = M4OSA_NULL; 31576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt8* pInPlaneU = M4OSA_NULL; 31586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt8* pInPlaneV = M4OSA_NULL; 31596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /* To keep media aspect ratio*/ 31616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /* Initialize AIR Params*/ 31626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputCoord.m_x = 0; 31636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputCoord.m_y = 0; 31646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_height = pInplane->u_height; 31656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_width = pInplane->u_width; 31666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_width = pOutplane->u_width; 31676e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height = pOutplane->u_height; 31686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_bOutputStripe = M4OSA_FALSE; 31696e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputOrientation = M4COMMON_kOrientationTopLeft; 31706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 31726e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Media rendering: Black borders*/ 31736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (renderingMode == M4xVSS_kBlackBorders) { 31746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_width = pOutplane[0].u_width; 31756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_height = pOutplane[0].u_height; 31766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_stride = pOutplane[0].u_width; 31776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_topleft = 0; 31786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_width = pOutplane[1].u_width; 31806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_height = pOutplane[1].u_height; 31816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_stride = pOutplane[1].u_width; 31826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_topleft = 0; 31836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_width = pOutplane[2].u_width; 31856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_height = pOutplane[2].u_height; 31866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_stride = pOutplane[2].u_width; 31876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_topleft = 0; 31886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 31896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 31906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Allocates plan in local image plane structure */ 31916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].pac_data = 31926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc( 31936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_width * pImagePlanesTemp[0].u_height, 31946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VS, (M4OSA_Char *)"pImagePlaneTemp Y") ; 31956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pImagePlanesTemp[0].pac_data == M4OSA_NULL) { 31966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_0("M4VSS3GPP_intApplyRenderingMode: Alloc Error"); 31976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 31986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 31996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].pac_data = 32006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc( 32016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_width * pImagePlanesTemp[1].u_height, 32026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VS, (M4OSA_Char *)"pImagePlaneTemp U") ; 32036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pImagePlanesTemp[1].pac_data == M4OSA_NULL) { 32046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_0("M4VSS3GPP_intApplyRenderingMode: Alloc Error"); 32056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pImagePlanesTemp[0].pac_data); 32066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 32076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 32086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].pac_data = 32096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc( 32106e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_width * pImagePlanesTemp[2].u_height, 32116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VS, (M4OSA_Char *)"pImagePlaneTemp V") ; 32126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pImagePlanesTemp[2].pac_data == M4OSA_NULL) { 32136e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_0("M4VSS3GPP_intApplyRenderingMode: Alloc Error"); 32146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pImagePlanesTemp[0].pac_data); 32156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pImagePlanesTemp[1].pac_data); 32166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 32176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 32186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 32196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pInPlaneY = pImagePlanesTemp[0].pac_data ; 32206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pInPlaneU = pImagePlanesTemp[1].pac_data ; 32216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pInPlaneV = pImagePlanesTemp[2].pac_data ; 32226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 32236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pImagePlanesTemp[0].pac_data, Y_PLANE_BORDER_VALUE, 32246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[0].u_height*pImagePlanesTemp[0].u_stride)); 32256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pImagePlanesTemp[1].pac_data, U_PLANE_BORDER_VALUE, 32266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[1].u_height*pImagePlanesTemp[1].u_stride)); 32276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memset((void *)pImagePlanesTemp[2].pac_data, V_PLANE_BORDER_VALUE, 32286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[2].u_height*pImagePlanesTemp[2].u_stride)); 32296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 32306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt32 height = 32316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pInplane->u_height * pOutplane->u_width) /pInplane->u_width; 32326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 32336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (height <= pOutplane->u_height) { 32346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 32356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Black borders will be on the top and the bottom side */ 32366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_width = pOutplane->u_width; 32376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height = height; 32386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 32396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Number of lines at the top */ 32406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_topleft = 32416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[0].u_height - 32426e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height)>>1)) * 32436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_stride; 32446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_height = airParams.m_outputSize.m_height; 32456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_topleft = 32466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[1].u_height - 32476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_outputSize.m_height>>1)))>>1) * 32486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_stride; 32496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_height = 32506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height>>1; 32516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_topleft = 32526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[2].u_height - 32536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_outputSize.m_height>>1)))>>1) * 32546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_stride; 32556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_height = 32566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height>>1; 32576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 32586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 32596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Black borders will be on the left and right side */ 32606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height = pOutplane->u_height; 32616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_width = 32626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_UInt32)((pInplane->u_width * pOutplane->u_height)/pInplane->u_height); 32636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 32646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_topleft = 32656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[0].u_width - 32666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_width)>>1)); 32676e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_width = airParams.m_outputSize.m_width; 32686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_topleft = 32696e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[1].u_width - 32706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_outputSize.m_width>>1)))>>1); 32716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_width = airParams.m_outputSize.m_width>>1; 32726e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_topleft = 32736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[2].u_width - 32746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_outputSize.m_width>>1)))>>1); 32756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_width = airParams.m_outputSize.m_width>>1; 32766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 32776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 32786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 32796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Width and height have to be even */ 32806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_width = 32816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_outputSize.m_width>>1)<<1; 32826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height = 32836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_outputSize.m_height>>1)<<1; 32846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_width = 32856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_inputSize.m_width>>1)<<1; 32866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_height = 32876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_inputSize.m_height>>1)<<1; 32886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_width = 32896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[0].u_width>>1)<<1; 32906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_width = 32916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[1].u_width>>1)<<1; 32926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_width = 32936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[2].u_width>>1)<<1; 32946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[0].u_height = 32956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[0].u_height>>1)<<1; 32966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[1].u_height = 32976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[1].u_height>>1)<<1; 32986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[2].u_height = 32996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pImagePlanesTemp[2].u_height>>1)<<1; 33006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 33016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 33026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Check that values are coherent */ 33036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (airParams.m_inputSize.m_height == 33046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height) { 33056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_width = 33066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_width; 33076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else if (airParams.m_inputSize.m_width == 33086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_width) { 33096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_height = 33106e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height; 33116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneTemp = pImagePlanesTemp; 33136e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 33156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 33166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Media rendering: Cropping*/ 33176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (renderingMode == M4xVSS_kCropping) { 33186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_height = pOutplane->u_height; 33196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_outputSize.m_width = pOutplane->u_width; 33206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((airParams.m_outputSize.m_height * 33216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_width)/airParams.m_outputSize.m_width < 33226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_height) { 33236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /* Height will be cropped */ 33246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_height = 33256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_UInt32)((airParams.m_outputSize.m_height * 33266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_width)/airParams.m_outputSize.m_width); 33276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_height = 33286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_inputSize.m_height>>1)<<1; 33296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputCoord.m_y = 33306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_Int32)((M4OSA_Int32)((pInplane->u_height - 33316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_height))>>1); 33326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 33336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /* Width will be cropped */ 33346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_width = 33356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_UInt32)((airParams.m_outputSize.m_width * 33366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_height)/airParams.m_outputSize.m_height); 33376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_width = 33386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (airParams.m_inputSize.m_width>>1)<<1; 33396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputCoord.m_x = 33406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_Int32)((M4OSA_Int32)((pInplane->u_width - 33416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury airParams.m_inputSize.m_width))>>1); 33426e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pPlaneTemp = pOutplane; 33446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 33466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * Call AIR functions */ 33476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4OSA_NULL == pC->m_air_context) { 33486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4AIR_create(&pC->m_air_context, M4AIR_kYUV420P); 33496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(err != M4NO_ERROR) { 33506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intApplyRenderingMode: \ 33516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4AIR_create returned error 0x%x", err); 33526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury goto cleanUp; 33536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 33566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4AIR_configure(pC->m_air_context, &airParams); 33576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (err != M4NO_ERROR) { 33586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intApplyRenderingMode: \ 33596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Error when configuring AIR: 0x%x", err); 33606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4AIR_cleanUp(pC->m_air_context); 33616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury goto cleanUp; 33626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 33646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4AIR_get(pC->m_air_context, pInplane, pPlaneTemp); 33656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (err != M4NO_ERROR) { 33666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intApplyRenderingMode: \ 33676e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Error when getting AIR plane: 0x%x", err); 33686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4AIR_cleanUp(pC->m_air_context); 33696e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury goto cleanUp; 33706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 33726e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (renderingMode == M4xVSS_kBlackBorders) { 33736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury for (i=0; i<pOutplane[0].u_height; i++) { 33746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pOutPlaneY, (void *)pInPlaneY, 33756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutplane[0].u_width); 33766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pInPlaneY += pOutplane[0].u_width; 33776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutPlaneY += pOutplane[0].u_stride; 33786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury for (i=0; i<pOutplane[1].u_height; i++) { 33806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pOutPlaneU, (void *)pInPlaneU, 33816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutplane[1].u_width); 33826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pInPlaneU += pOutplane[1].u_width; 33836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutPlaneU += pOutplane[1].u_stride; 33846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury for (i=0; i<pOutplane[2].u_height; i++) { 33866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury memcpy((void *)pOutPlaneV, (void *)pInPlaneV, 33876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutplane[2].u_width); 33886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pInPlaneV += pOutplane[2].u_width; 33896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pOutPlaneV += pOutplane[2].u_stride; 33906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 33936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh ChowdurycleanUp: 33946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (renderingMode == M4xVSS_kBlackBorders) { 33956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury for (i=0; i<3; i++) { 33966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pImagePlanesTemp[i].pac_data != M4OSA_NULL) { 33976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pImagePlanesTemp[i].pac_data); 33986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pImagePlanesTemp[i].pac_data = M4OSA_NULL; 33996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 34006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 34016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 34026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 34036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury} 34046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh ChowduryM4OSA_ERR M4VSS3GPP_intSetYuv420PlaneFromARGB888 ( 34066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_InternalEditContext *pC, 34076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_ClipContext* pClipCtxt) { 34086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_ERR err= M4NO_ERROR; 34106e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury // Allocate memory for YUV plane 34126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv = 34136e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc( 34146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 3*sizeof(M4VIFI_ImagePlane), M4VS, 34156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_Char*)"pPlaneYuv"); 34166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pClipCtxt->pPlaneYuv == M4OSA_NULL) { 34186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 34196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 34206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].u_height = 34226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pSettings->ClipProperties.uiStillPicHeight; 34236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].u_width = 34246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pSettings->ClipProperties.uiStillPicWidth; 34256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].u_stride = pClipCtxt->pPlaneYuv[0].u_width; 34266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].u_topleft = 0; 34276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].pac_data = 34296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc( 34306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].u_height * pClipCtxt->pPlaneYuv[0].u_width * 1.5, 34316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VS, (M4OSA_Char*)"imageClip YUV data"); 34326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pClipCtxt->pPlaneYuv[0].pac_data == M4OSA_NULL) { 34336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv); 34346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 34356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 34366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[1].u_height = pClipCtxt->pPlaneYuv[0].u_height >>1; 34386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[1].u_width = pClipCtxt->pPlaneYuv[0].u_width >> 1; 34396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[1].u_stride = pClipCtxt->pPlaneYuv[1].u_width; 34406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[1].u_topleft = 0; 34416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[1].pac_data = (M4VIFI_UInt8*)( 34426e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].pac_data + 34436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].u_height * pClipCtxt->pPlaneYuv[0].u_width); 34446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[2].u_height = pClipCtxt->pPlaneYuv[0].u_height >>1; 34466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[2].u_width = pClipCtxt->pPlaneYuv[0].u_width >> 1; 34476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[2].u_stride = pClipCtxt->pPlaneYuv[2].u_width; 34486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[2].u_topleft = 0; 34496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[2].pac_data = (M4VIFI_UInt8*)( 34506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[1].pac_data + 34516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[1].u_height * pClipCtxt->pPlaneYuv[1].u_width); 34526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 ( 34546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pSettings->pFile, 34556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->pOsaFileReadPtr, 34566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv, 34576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pSettings->ClipProperties.uiStillPicWidth, 34586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pSettings->ClipProperties.uiStillPicHeight); 34596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 34606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv[0].pac_data); 34616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv); 34626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 34636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 34646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury // Set the YUV data to the decoder using setoption 34666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption ( 34676e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, 34686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4DECODER_kOptionID_DecYuvData, 34696e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_DataOption)pClipCtxt->pPlaneYuv); 34706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 34716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv[0].pac_data); 34726e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv); 34736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 34746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 34756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pSettings->ClipProperties.bSetImageData = M4OSA_TRUE; 34776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury // Allocate Yuv plane with effect 34796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect = 34806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc( 34816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 3*sizeof(M4VIFI_ImagePlane), M4VS, 34826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_Char*)"pPlaneYuvWithEffect"); 34836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pClipCtxt->pPlaneYuvWithEffect == M4OSA_NULL) { 34846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv[0].pac_data); 34856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv); 34866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 34876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 34886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_height = pC->ewc.uiVideoHeight; 34906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_width = pC->ewc.uiVideoWidth; 34916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_stride = pC->ewc.uiVideoWidth; 34926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_topleft = 0; 34936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 34946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].pac_data = 34956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc( 34966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->ewc.uiVideoHeight * pC->ewc.uiVideoWidth * 1.5, 34976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VS, (M4OSA_Char*)"imageClip YUV data"); 34986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pClipCtxt->pPlaneYuvWithEffect[0].pac_data == M4OSA_NULL) { 34996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv[0].pac_data); 35006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv); 35016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuvWithEffect); 35026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4ERR_ALLOC; 35036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 35046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[1].u_height = 35066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_height >>1; 35076e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[1].u_width = 35086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_width >> 1; 35096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[1].u_stride = 35106e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[1].u_width; 35116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[1].u_topleft = 0; 35126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[1].pac_data = (M4VIFI_UInt8*)( 35136e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].pac_data + 35146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_height * pClipCtxt->pPlaneYuvWithEffect[0].u_width); 35156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[2].u_height = 35176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_height >>1; 35186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[2].u_width = 35196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].u_width >> 1; 35206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[2].u_stride = 35216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[2].u_width; 35226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[2].u_topleft = 0; 35236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[2].pac_data = (M4VIFI_UInt8*)( 35246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[1].pac_data + 35256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[1].u_height * pClipCtxt->pPlaneYuvWithEffect[1].u_width); 35266e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 35286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, M4DECODER_kOptionID_YuvWithEffectContiguous, 35296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_DataOption)pClipCtxt->pPlaneYuvWithEffect); 35306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 35316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv[0].pac_data); 35326e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv); 35336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuvWithEffect); 35346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 35356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 35366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 35386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury} 35396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh ChowduryM4OSA_ERR M4VSS3GPP_intRenderFrameWithEffect(M4VSS3GPP_InternalEditContext *pC, 35416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_ClipContext* pClipCtxt, 3542d125366181feab7e45905a8051c94ab5a845e503Chih-Chung Chang M4_MediaTime ts, 35436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_Bool bIsClip1, 35446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pResizePlane, 35456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pPlaneNoResize, 35466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pPlaneOut) { 35476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 35496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_UInt8 numEffects = 0; 35506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIFI_ImagePlane *pDecoderRenderFrame = M4OSA_NULL; 3551e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_UInt32 yuvFrameWidth = 0, yuvFrameHeight = 0; 3552e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_ImagePlane* pTmp = M4OSA_NULL; 3553e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_ImagePlane pTemp[3]; 3554eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_UInt8 i = 0; 3555eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_Bool bSkipFramingEffect = M4OSA_FALSE; 35566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 3557eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng memset((void *)pTemp, 0, 3*sizeof(M4VIFI_ImagePlane)); 3558eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Resize or rotate case */ 35596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4OSA_NULL != pClipCtxt->m_pPreResizeFrame) { 35606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury /** 35616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury * If we do modify the image, we need an intermediate image plane */ 3562eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pResizePlane, 3563eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pClipCtxt->m_pPreResizeFrame[0].u_width, 3564eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pClipCtxt->m_pPreResizeFrame[0].u_height); 3565eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 3566eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 3567eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_intAllocateYUV420 returns 0x%x", err); 3568eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return err; 35696e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 35706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pClipCtxt->pSettings->FileType == 35726e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) && 35736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->nbActiveEffects == 0) && 35746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pClipCtxt->bGetYuvDataFromDecoder == M4OSA_FALSE)) { 35756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 35776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, 35786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4DECODER_kOptionID_EnableYuvWithEffect, 35796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_DataOption)M4OSA_TRUE); 35806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR == err) { 35816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctRender( 35826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, &ts, 35836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect, M4OSA_TRUE); 35846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 35856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 35866e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 35876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (pClipCtxt->pSettings->FileType == 35886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) { 35896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 35906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, 35916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4DECODER_kOptionID_EnableYuvWithEffect, 35926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_DataOption)M4OSA_FALSE); 35936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 35946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR == err) { 35956e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctRender( 35966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, &ts, 35976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->m_pPreResizeFrame, M4OSA_TRUE); 3598d125366181feab7e45905a8051c94ab5a845e503Chih-Chung Chang } 35996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 36006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 36016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 36026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 36036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury returns error 0x%x", err); 36046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 36056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 36066e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 3607e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (pClipCtxt->pSettings->FileType != 3608e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) { 3609e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (0 != pClipCtxt->pSettings->ClipProperties.videoRotationDegrees) { 3610e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // Save width and height of un-rotated frame 3611e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury yuvFrameWidth = pClipCtxt->m_pPreResizeFrame[0].u_width; 3612e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury yuvFrameHeight = pClipCtxt->m_pPreResizeFrame[0].u_height; 3613e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury err = M4VSS3GPP_intRotateVideo(pClipCtxt->m_pPreResizeFrame, 3614e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pClipCtxt->pSettings->ClipProperties.videoRotationDegrees); 3615e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (M4NO_ERROR != err) { 3616e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 3617e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury rotateVideo() returns error 0x%x", err); 3618e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return err; 3619e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3620eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Set the new video size for temporary buffer */ 3621eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_intSetYUV420Plane(pResizePlane, 3622eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pClipCtxt->m_pPreResizeFrame[0].u_width, 3623eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pClipCtxt->m_pPreResizeFrame[0].u_height); 3624e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3625e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3626e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 36276e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (bIsClip1 == M4OSA_TRUE) { 3628ff65330bfdd2841110d8ff2a1aba3543b2cb3156James Dong pC->bIssecondClip = M4OSA_FALSE; 36296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury numEffects = pC->nbActiveEffects; 36306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 36316e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury numEffects = pC->nbActiveEffects1; 3632ff65330bfdd2841110d8ff2a1aba3543b2cb3156James Dong pC->bIssecondClip = M4OSA_TRUE; 36336e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 36346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 36356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ( numEffects > 0) { 36366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->bGetYuvDataFromDecoder = M4OSA_TRUE; 3637eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* If video frame need to be resized or rotated, 3638eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * then apply the overlay after the frame was rendered with rendering mode. 3639eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng * Here skip the framing(overlay) effect when applying video Effect. */ 3640eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng bSkipFramingEffect = M4OSA_TRUE; 36416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intApplyVideoEffect(pC, 3642eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pClipCtxt->m_pPreResizeFrame, pResizePlane, bSkipFramingEffect); 36436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 36446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 36456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intApplyVideoEffect() err 0x%x", err); 36466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 36476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 36486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame= pResizePlane; 36496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 36506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pDecoderRenderFrame = pClipCtxt->m_pPreResizeFrame; 36516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 3652eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Do rendering mode */ 36536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pClipCtxt->bGetYuvDataFromDecoder == M4OSA_TRUE) || 36546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pClipCtxt->pSettings->FileType != 36556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888)) { 36566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (bIsClip1 == M4OSA_TRUE) { 3657eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bClip1ActiveFramingEffect == M4OSA_TRUE) { 3658eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp, 3659eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlaneOut[0].u_width, pPlaneOut[0].u_height); 3660eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 3661eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 3662eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_intAllocateYUV420 error 0x%x", err); 3663eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 3664eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 3665eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 3666eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pTemp; 3667eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } else { 3668eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pC->yuv1; 3669eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 36706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intApplyRenderingMode (pC, 36716e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pSettings->xVSS.MediaRendering, 3672eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pDecoderRenderFrame,pTmp); 36736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 3674eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bClip2ActiveFramingEffect == M4OSA_TRUE) { 3675eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intAllocateYUV420(pTemp, 3676eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pPlaneOut[0].u_width, pPlaneOut[0].u_height); 3677eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 3678eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 3679eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_intAllocateYUV420 error 0x%x", err); 3680eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 3681eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 3682eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 3683eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pTemp; 3684eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } else { 3685eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTmp = pC->yuv2; 3686eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 36876e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_intApplyRenderingMode (pC, 36886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pSettings->xVSS.MediaRendering, 3689eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pDecoderRenderFrame,pTmp); 36906e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 36916e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 36926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 36936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intApplyRenderingMode error 0x%x ", err); 3694eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng for (i=0; i<3; i++) { 3695eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pTemp[i].pac_data != M4OSA_NULL) { 3696eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng free(pTemp[i].pac_data); 3697eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTemp[i].pac_data = M4OSA_NULL; 3698eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 3699eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 37006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 37016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 3702eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* Apply overlay if overlay exist*/ 37036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (bIsClip1 == M4OSA_TRUE) { 3704eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bClip1ActiveFramingEffect == M4OSA_TRUE) { 3705eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intApplyVideoOverlay(pC, 3706eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTemp, pC->yuv1); 3707eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 37086e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->lastDecodedPlane = pC->yuv1; 37096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 3710eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pC->bClip2ActiveFramingEffect == M4OSA_TRUE) { 3711eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intApplyVideoOverlay(pC, 3712eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTemp, pC->yuv2); 3713eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 37146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->lastDecodedPlane = pC->yuv2; 37156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 3716eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (M4NO_ERROR != err) { 3717eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ 3718eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng M4VSS3GPP_intApplyVideoOverlay) error 0x%x ", err); 3719eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->ewc.VppError = err; 3720eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng for (i=0; i<3; i++) { 3721eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pTemp[i].pac_data != M4OSA_NULL) { 3722eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng free(pTemp[i].pac_data); 3723eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTemp[i].pac_data = M4OSA_NULL; 3724eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 3725eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 3726eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng return M4NO_ERROR; 3727eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 37286e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 37296e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->lastDecodedPlane = pClipCtxt->pPlaneYuvWithEffect; 37306e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 3731eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng // free the temp buffer 3732eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng for (i=0; i<3; i++) { 3733eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (pTemp[i].pac_data != M4OSA_NULL) { 3734eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng free(pTemp[i].pac_data); 3735eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pTemp[i].pac_data = M4OSA_NULL; 3736eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 3737eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng } 37386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 37396e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if ((pClipCtxt->pSettings->FileType == 37406e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VIDEOEDITING_kFileType_ARGB8888) && 37416e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pC->nbActiveEffects == 0) && 37426e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (pClipCtxt->bGetYuvDataFromDecoder == M4OSA_TRUE)) { 37436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (bIsClip1 == M4OSA_TRUE) { 37446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 37456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, 37466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4DECODER_kOptionID_YuvWithEffectNonContiguous, 37476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury (M4OSA_DataOption)pC->yuv1); 37486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 37496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 37506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, 37516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4DECODER_kOptionID_YuvWithEffectNonContiguous, 3752816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng (M4OSA_DataOption)pC->yuv2); 37536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 37546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 37556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 37566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury null decoder setOption error 0x%x ", err); 37576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 37586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 37596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->bGetYuvDataFromDecoder = M4OSA_FALSE; 37606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 37616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 3762e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // Reset original width and height for resize frame plane 3763e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (0 != pClipCtxt->pSettings->ClipProperties.videoRotationDegrees && 3764e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 180 != pClipCtxt->pSettings->ClipProperties.videoRotationDegrees) { 3765e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3766e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VSS3GPP_intSetYUV420Plane(pClipCtxt->m_pPreResizeFrame, 3767e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury yuvFrameWidth, yuvFrameHeight); 3768e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3769e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 37706e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 3771eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng /* No rotate or no resize case*/ 37726e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (bIsClip1 == M4OSA_TRUE) { 37736e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury numEffects = pC->nbActiveEffects; 37746e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 37756e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury numEffects = pC->nbActiveEffects1; 37766e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 37776e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 37786e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(numEffects > 0) { 37796e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctRender( 37806e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pViDecCtxt, &ts, pPlaneNoResize, M4OSA_TRUE); 37816e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 37826e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 37836e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Render returns error 0x%x", err); 37846e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 37856e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 3786e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3787eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng bSkipFramingEffect = M4OSA_FALSE; 37886e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (bIsClip1 == M4OSA_TRUE) { 37896e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->bIssecondClip = M4OSA_FALSE; 3790eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intApplyVideoEffect(pC, pPlaneNoResize, 3791eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->yuv1, bSkipFramingEffect); 37926e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->lastDecodedPlane = pC->yuv1; 37936e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 37946e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pC->bIssecondClip = M4OSA_TRUE; 3795eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng err = M4VSS3GPP_intApplyVideoEffect(pC, pPlaneNoResize, 3796eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pC->yuv2, bSkipFramingEffect); 37976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->lastDecodedPlane = pC->yuv2; 37986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 37996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 38006e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 38016e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 38026e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4VSS3GPP_intApplyVideoEffect error 0x%x", err); 38036e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 38046e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 38056e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 3806e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3807eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng if (bIsClip1 == M4OSA_TRUE) { 3808e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pTmp = pC->yuv1; 38096e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } else { 3810e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pTmp = pC->yuv2; 38116e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 3812e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctRender( 3813e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pClipCtxt->pViDecCtxt, &ts, pTmp, M4OSA_TRUE); 38146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 38156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ 38166e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Render returns error 0x%x,", err); 38176e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 38186e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 3819eac28ab858dc4ecdfd25b6d8851219e6787d1222Hong Teng pClipCtxt->lastDecodedPlane = pTmp; 38206e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 38216e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->iVideoRenderCts = (M4OSA_Int32)ts; 38226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 38236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 38246e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 38256e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury} 3826e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3827e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4OSA_ERR M4VSS3GPP_intRotateVideo(M4VIFI_ImagePlane* pPlaneIn, 3828e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_UInt32 rotationDegree) { 3829e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3830e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 3831e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_ImagePlane outPlane[3]; 3832e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3833e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (rotationDegree != 180) { 3834e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // Swap width and height of in plane 3835e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[0].u_width = pPlaneIn[0].u_height; 3836e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[0].u_height = pPlaneIn[0].u_width; 3837e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[0].u_stride = outPlane[0].u_width; 3838e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[0].u_topleft = 0; 3839e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[0].pac_data = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc( 3840e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (outPlane[0].u_stride*outPlane[0].u_height), M4VS, 3841e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (M4OSA_Char*)("out Y plane for rotation")); 3842e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (outPlane[0].pac_data == M4OSA_NULL) { 3843e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4ERR_ALLOC; 3844e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3845e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3846e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[1].u_width = pPlaneIn[0].u_height/2; 3847e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[1].u_height = pPlaneIn[0].u_width/2; 3848e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[1].u_stride = outPlane[1].u_width; 3849e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[1].u_topleft = 0; 3850e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[1].pac_data = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc( 3851e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (outPlane[1].u_stride*outPlane[1].u_height), M4VS, 3852e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (M4OSA_Char*)("out U plane for rotation")); 3853e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (outPlane[1].pac_data == M4OSA_NULL) { 3854e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury free((void *)outPlane[0].pac_data); 3855e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4ERR_ALLOC; 3856e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3857e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3858e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[2].u_width = pPlaneIn[0].u_height/2; 3859e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[2].u_height = pPlaneIn[0].u_width/2; 3860e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[2].u_stride = outPlane[2].u_width; 3861e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[2].u_topleft = 0; 3862e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury outPlane[2].pac_data = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc( 3863e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (outPlane[2].u_stride*outPlane[2].u_height), M4VS, 3864e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (M4OSA_Char*)("out V plane for rotation")); 3865e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (outPlane[2].pac_data == M4OSA_NULL) { 3866e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury free((void *)outPlane[0].pac_data); 3867e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury free((void *)outPlane[1].pac_data); 3868e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4ERR_ALLOC; 3869e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3870e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3871e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3872e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury switch(rotationDegree) { 3873e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury case 90: 3874e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Rotate90RightYUV420toYUV420(M4OSA_NULL, pPlaneIn, outPlane); 3875e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury break; 3876e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3877e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury case 180: 3878e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // In plane rotation, so planeOut = planeIn 3879e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Rotate180YUV420toYUV420(M4OSA_NULL, pPlaneIn, pPlaneIn); 3880e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury break; 3881e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3882e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury case 270: 3883e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Rotate90LeftYUV420toYUV420(M4OSA_NULL, pPlaneIn, outPlane); 3884e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury break; 3885e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3886e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury default: 3887e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_TRACE1_1("invalid rotation param %d", (int)rotationDegree); 3888e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury err = M4ERR_PARAMETER; 3889e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury break; 3890e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3891e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3892e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (rotationDegree != 180) { 3893e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury memset((void *)pPlaneIn[0].pac_data, 0, 3894e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (pPlaneIn[0].u_width*pPlaneIn[0].u_height)); 3895e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury memset((void *)pPlaneIn[1].pac_data, 0, 3896e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (pPlaneIn[1].u_width*pPlaneIn[1].u_height)); 3897e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury memset((void *)pPlaneIn[2].pac_data, 0, 3898e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (pPlaneIn[2].u_width*pPlaneIn[2].u_height)); 3899e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // Copy Y, U and V planes 3900e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury memcpy((void *)pPlaneIn[0].pac_data, (void *)outPlane[0].pac_data, 3901e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (pPlaneIn[0].u_width*pPlaneIn[0].u_height)); 3902e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury memcpy((void *)pPlaneIn[1].pac_data, (void *)outPlane[1].pac_data, 3903e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (pPlaneIn[1].u_width*pPlaneIn[1].u_height)); 3904e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury memcpy((void *)pPlaneIn[2].pac_data, (void *)outPlane[2].pac_data, 3905e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (pPlaneIn[2].u_width*pPlaneIn[2].u_height)); 3906e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3907e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury free((void *)outPlane[0].pac_data); 3908e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury free((void *)outPlane[1].pac_data); 3909e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury free((void *)outPlane[2].pac_data); 3910e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3911e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // Swap the width and height of the in plane 3912e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury uint32_t temp = 0; 3913e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury temp = pPlaneIn[0].u_width; 3914e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[0].u_width = pPlaneIn[0].u_height; 3915e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[0].u_height = temp; 3916e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[0].u_stride = pPlaneIn[0].u_width; 3917e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3918e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury temp = pPlaneIn[1].u_width; 3919e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[1].u_width = pPlaneIn[1].u_height; 3920e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[1].u_height = temp; 3921e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[1].u_stride = pPlaneIn[1].u_width; 3922e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3923e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury temp = pPlaneIn[2].u_width; 3924e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[2].u_width = pPlaneIn[2].u_height; 3925e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[2].u_height = temp; 3926e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[2].u_stride = pPlaneIn[2].u_width; 3927e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3928e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3929e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return err; 3930e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury} 3931e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3932e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4OSA_ERR M4VSS3GPP_intSetYUV420Plane(M4VIFI_ImagePlane* planeIn, 3933e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_UInt32 width, M4OSA_UInt32 height) { 3934e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3935e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 3936e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3937e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (planeIn == M4OSA_NULL) { 3938e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_TRACE1_0("NULL in plane, error"); 3939e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4ERR_PARAMETER; 3940e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3941e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3942e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[0].u_width = width; 3943e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[0].u_height = height; 3944e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[0].u_stride = planeIn[0].u_width; 3945e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3946e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[1].u_width = width/2; 3947e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[1].u_height = height/2; 3948e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[1].u_stride = planeIn[1].u_width; 3949e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3950e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[2].u_width = width/2; 3951e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[2].u_height = height/2; 3952e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury planeIn[2].u_stride = planeIn[1].u_width; 3953e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3954e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return err; 3955e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury} 3956