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, &currentBitrate);
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